Beispiel #1
0
 def get_deployment(self,
                    resource_name,
                    volume_mounts,
                    volumes,
                    labels,
                    env_vars=None,
                    command=None,
                    args=None,
                    ports=None,
                    persistence_outputs=None,
                    persistence_data=None,
                    outputs_refs_jobs=None,
                    outputs_refs_experiments=None,
                    secret_refs=None,
                    configmap_refs=None,
                    resources=None,
                    ephemeral_token=None,
                    node_selector=None,
                    affinity=None,
                    tolerations=None,
                    restart_policy=None,
                    replicas=1):
     deployment_spec = self.get_deployment_spec(
         resource_name=resource_name,
         volume_mounts=volume_mounts,
         volumes=volumes,
         labels=labels,
         env_vars=env_vars,
         command=command,
         args=args,
         ports=ports,
         persistence_outputs=persistence_outputs,
         persistence_data=persistence_data,
         outputs_refs_jobs=outputs_refs_jobs,
         outputs_refs_experiments=outputs_refs_experiments,
         secret_refs=secret_refs,
         configmap_refs=configmap_refs,
         resources=resources,
         ephemeral_token=ephemeral_token,
         node_selector=node_selector,
         affinity=affinity,
         tolerations=tolerations,
         restart_policy=restart_policy,
         replicas=replicas,
     )
     metadata = client.V1ObjectMeta(name=resource_name, labels=labels, namespace=self.namespace)
     return client.AppsV1beta1Deployment(api_version=k8s_constants.K8S_API_VERSION_V1_BETA1,
                                         kind=k8s_constants.K8S_DEPLOYMENT_KIND,
                                         metadata=metadata,
                                         spec=deployment_spec)
Beispiel #2
0
def create_deployment_skeleton(namespace, name, replicas):
    # Create and configurate a spec section
    template = client.V1PodTemplateSpec()
    # Create the specification of deployment
    spec = client.AppsV1beta1DeploymentSpec(replicas=replicas, template=template)

    # Instantiate the deployment object
    deployment = client.AppsV1beta1Deployment(
        api_version="extensions/v1beta1",
        kind="Deployment",
        metadata=client.V1ObjectMeta(name=name),
        spec=spec,
    )

    return deployment
    def test_service_and_deploy_not_cached_yet_update_exception(
            self, mock_list_cluster_memcached_object,
            mock_read_namespaced_service, mock_create_service,
            mock_cache_version, mock_is_version_cached, mock_update_service,
            mock_read_namespaced_deployment, mock_create_mcrouter_deployment,
            mock_create_memcached_deployment, mock_update_mcrouter_deployment,
            mock_update_memcached_deployment):
        # Mock list memcached call with 0 items
        mock_list_cluster_memcached_object.return_value = self.base_list_result

        check_existing()

        mock_list_cluster_memcached_object.assert_called_once_with()

        read_namespaced_service_calls = [
            call(self.name, self.namespace),
            call('{}-backend'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_service.assert_has_calls(
            read_namespaced_service_calls)
        assert mock_create_service.called is False

        assert mock_cache_version.called is False

        is_version_cached_calls = [
            call(client.V1Service()),
            call(client.AppsV1beta1Deployment())
        ]
        mock_is_version_cached.assert_has_calls(is_version_cached_calls)

        update_service_calls = [
            call(get_mcrouter_service_object(self.cluster_object)),
            call(get_memcached_service_object(self.cluster_object))
        ]
        mock_update_service.assert_has_calls(update_service_calls)
        read_namespaced_deployment_calls = [
            call(self.name, self.namespace),
            call('{}-router'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_deployment.assert_has_calls(
            read_namespaced_deployment_calls)
        assert mock_create_memcached_deployment.called is False
        assert mock_create_mcrouter_deployment.called is False
        mock_update_memcached_deployment.assert_called_once_with(
            self.cluster_object)
        mock_update_mcrouter_deployment.assert_called_once_with(
            self.cluster_object)
Beispiel #4
0
def get_deployment(namespace,
                   app,
                   name,
                   project_name,
                   project_uuid,
                   volume_mounts,
                   volumes,
                   image,
                   command,
                   args,
                   ports,
                   container_name,
                   resources=None,
                   node_selector=None,
                   role=None,
                   type=None,  # pylint:disable=redefined-builtin
                   replicas=1):
    labels = get_labels(app=app,
                        project_name=project_name,
                        project_uuid=project_uuid,
                        role=role,
                        type=type)
    metadata = client.V1ObjectMeta(
        name=constants.DEPLOYMENT_NAME.format(project_uuid=project_uuid, name=name),
        labels=labels,
        namespace=namespace)
    spec = get_deployment_spec(namespace=namespace,
                               app=app,
                               name=name,
                               project_name=project_name,
                               project_uuid=project_uuid,
                               volume_mounts=volume_mounts,
                               volumes=volumes,
                               image=image,
                               command=command,
                               args=args,
                               ports=ports,
                               container_name=container_name,
                               resources=resources,
                               node_selector=node_selector,
                               role=role,
                               type=type,
                               replicas=replicas)
    return client.AppsV1beta1Deployment(api_version=k8s_constants.K8S_API_VERSION_V1_BETA1,
                                        kind=k8s_constants.K8S_DEPLOYMENT_KIND,
                                        metadata=metadata,
                                        spec=spec)
Beispiel #5
0
def create_deployment(parameters):
    image_name = parameters['image_name']
    deployment_name = image_name
    if '_' in image_name:
        deployment_name = image_name.replace('_', '')
    image_tag = parameters['image_tag']
    body = client.AppsV1beta1Deployment()
    body.metadata = {
        "name": deployment_name,
        "labels": {
            "app": deployment_name
        }
    }

    body.spec = {
        "template": {
            "metadata": {
                "labels": {
                    "app": deployment_name
                }
            },
            "spec": {
                "containers": [{
                    "name":
                    deployment_name,
                    "image":
                    "urvil38/{}:{}".format(image_name, image_tag)
                }]
            }
        }
    }

    speech = ""
    try:
        response = k8_client.create_namespaced_deployment(namespace, body)
        speech = "Deploying {} {} into the {} cluster.".format(
            image_name, image_tag, node_name[0])
    except ApiException as e:
        print(
            "Exception when calling AppsV1beta1Api->create_namespaced_deployment: %s\n"
            % e)
        speech = "There was an error while creating the {} deployment".format(
            image_name)

    return {"speech": speech, "displayText": speech}
class TestCreateMcrouterDeployment():
    def setUp(self):
        self.cluster_object = DEPLOYMENT_CLUSTER_OBJECT
        self.name = self.cluster_object['metadata']['name']
        self.namespace = self.cluster_object['metadata']['namespace']
        self.replicas = self.cluster_object['mcrouter']['replicas']

    @patch('memcached_operator.memcached_operator.kubernetes_helpers.logging')
    @patch('kubernetes.client.AppsV1beta1Api.create_namespaced_deployment',
           return_value=client.AppsV1beta1Deployment())
    def test_success(self, mock_create_namespaced_deployment, mock_logging):
        deployment = create_mcrouter_deployment(self.cluster_object)

        body = get_mcrouter_deployment_object(self.cluster_object)
        mock_create_namespaced_deployment.assert_called_once_with(
            self.namespace, body)
        mock_logging.info.assert_called_once_with(
            'created deploy/{}-router in ns/{}'.format(self.name,
                                                       self.namespace))
        assert isinstance(deployment, client.AppsV1beta1Deployment)

    @patch('memcached_operator.memcached_operator.kubernetes_helpers.logging')
    @patch('kubernetes.client.AppsV1beta1Api.create_namespaced_deployment',
           side_effect=client.rest.ApiException(status=409))
    def test_already_exists(self, mock_create_namespaced_deployment,
                            mock_logging):
        deployment = create_mcrouter_deployment(self.cluster_object)

        mock_logging.debug.assert_called_once_with(
            'deploy/{}-router in ns/{} already exists'.format(
                self.name, self.namespace))
        assert deployment is False

    @patch('memcached_operator.memcached_operator.kubernetes_helpers.logging')
    @patch('kubernetes.client.AppsV1beta1Api.create_namespaced_deployment',
           side_effect=client.rest.ApiException(status=500))
    def test_other_rest_exception(self, mock_create_namespaced_deployment,
                                  mock_logging):
        deployment = create_mcrouter_deployment(self.cluster_object)

        assert mock_logging.exception.called is True
        assert deployment is False
Beispiel #7
0
def create_deployment_object():
    # Configureate Pod template container
    container = client.V1Container(
        name="nginx",
        image="nginx:1.15.4",
        ports=[client.V1ContainerPort(container_port=80)])
    # Create and configurate a spec section
    template = client.V1PodTemplateSpec(
        metadata=client.V1ObjectMeta(labels={"app": "nginx"}),
        spec=client.V1PodSpec(containers=[container]))
    # Create the specification of deployment
    spec = client.AppsV1beta1DeploymentSpec(replicas=3, template=template)
    # Instantiate the deployment object
    deployment = client.AppsV1beta1Deployment(
        api_version="apps/v1beta1",
        kind="Deployment",
        metadata=client.V1ObjectMeta(name=DEPLOYMENT_NAME),
        spec=spec)

    return deployment
Beispiel #8
0
 def deployment_definition(self):
     return client.AppsV1beta1Deployment(
         metadata=client.V1ObjectMeta(
             name=self.kube_name,
             namespace=settings.kube_namespace,
             labels={'pycroservice': settings.kube_namespace},
         ),
         spec=client.AppsV1beta1DeploymentSpec(
             replicas=1,
             selector=client.V1LabelSelector(
                 match_labels={'microservice': self.kube_name},
             ),
             template=client.V1PodTemplateSpec(
                 metadata=client.V1ObjectMeta(
                     labels={'microservice': self.kube_name},
                 ),
                 spec=self.pod_spec,
             ),
         )
     )
Beispiel #9
0
    def create_deployment(self,
                          namespace='default',
                          name=None,
                          metadata=None,
                          spec=None):
        '''
        Returns AppsV1beta1Deployment object
        '''
        if metadata is None: metadata = {}
        if spec is None: spec = {}
        metadata_obj = self._get_metadata(metadata)
        if name:
            metadata_obj.name = name

        spec_obj = self._get_deployment_spec(spec)
        body = client.AppsV1beta1Deployment(metadata=metadata_obj,
                                            spec=spec_obj)
        self.logger.info('Creating Deployment %s' % (metadata_obj.name))
        resp = self.apps_v1_beta1_h.create_namespaced_deployment(
            namespace, body)
        return resp
Beispiel #10
0
def scale_deployment(parameters):
    deployment_name = parameters['deployment_name']
    replica_count = int(parameters['replica_count'])

    body = client.AppsV1beta1Deployment()
    body.spec = {"replicas": replica_count}

    speech = ""

    try:
        response = k8_client.patch_namespaced_deployment(
            deployment_name, namespace, body)
        speech = "Scaling the {} deployment to {}".format(
            deployment_name, replica_count)
    except ApiException as e:
        print(
            "Exception when calling AppsV1beta1Api->patch_namespaced_deployment: %s\n"
            % e)
        speech = "There was an error when scaling {} deployment".format(
            deployment_name)

    return {"speech": speech, "displayText": speech}
Beispiel #11
0
def get_memcached_deployment_object(cluster_object):
    name = cluster_object['metadata']['name']
    namespace = cluster_object['metadata']['namespace']

    try:
        replicas = cluster_object['spec']['memcached']['replicas']
    except KeyError:
        replicas = 2

    try:
        memcached_limit_cpu = \
            cluster_object['spec']['memcached']['memcached_limit_cpu']
    except KeyError:
        memcached_limit_cpu = '100m'

    try:
        memcached_limit_memory = \
            cluster_object['spec']['memcached']['memcached_limit_memory']
    except KeyError:
        memcached_limit_memory = '64Mi'

    deployment = client.AppsV1beta1Deployment()

    # Metadata
    deployment.metadata = client.V1ObjectMeta(
        name=name, namespace=namespace, labels=get_default_labels(name=name))
    deployment.metadata.labels['service-type'] = 'memcached'

    # Spec
    deployment.spec = client.AppsV1beta1DeploymentSpec(
        replicas=replicas, template=client.V1PodTemplateSpec())

    deployment.spec.template.metadata = client.V1ObjectMeta(
        labels=deployment.metadata.labels)
    deployment.spec.template.spec = client.V1PodSpec(containers=[])

    # Memcached container
    memcached_port = client.V1ContainerPort(name='memcached',
                                            container_port=11211,
                                            protocol='TCP')
    memcached_resources = client.V1ResourceRequirements(
        limits={
            'cpu': memcached_limit_cpu,
            'memory': memcached_limit_memory
        },
        requests={
            'cpu': memcached_limit_cpu,
            'memory': memcached_limit_memory
        })
    memcached_container = client.V1Container(
        name='memcached',
        command=['memcached', '-p', '11211'],
        image='memcached:1.4.33',
        ports=[memcached_port],
        resources=memcached_resources)

    # Metrics container
    metrics_port = client.V1ContainerPort(name='metrics',
                                          container_port=9150,
                                          protocol='TCP')
    metrics_resources = client.V1ResourceRequirements(limits={
        'cpu': '50m',
        'memory': '16Mi'
    },
                                                      requests={
                                                          'cpu': '50m',
                                                          'memory': '16Mi'
                                                      })
    metrics_container = client.V1Container(
        name='prometheus-exporter',
        image='prom/memcached-exporter:v0.3.0',
        ports=[metrics_port],
        resources=metrics_resources)

    deployment.spec.template.spec.containers = [
        memcached_container, metrics_container
    ]
    return deployment
Beispiel #12
0
def get_mcrouter_deployment_object(cluster_object):
    name = cluster_object['metadata']['name']
    namespace = cluster_object['metadata']['namespace']

    try:
        replicas = cluster_object['spec']['mcrouter']['replicas']
    except KeyError:
        replicas = 1

    try:
        mcrouter_limit_cpu = \
            cluster_object['spec']['mcrouter']['mcrouter_limit_cpu']
    except KeyError:
        mcrouter_limit_cpu = '50m'

    try:
        mcrouter_limit_memory = \
            cluster_object['spec']['mcrouter']['mcrouter_limit_memory']
    except KeyError:
        mcrouter_limit_memory = '32Mi'

    deployment = client.AppsV1beta1Deployment()

    # Metadata
    deployment.metadata = client.V1ObjectMeta(
        name="{}-router".format(name),
        namespace=namespace,
        labels=get_default_labels(name=name))
    deployment.metadata.labels['service-type'] = 'mcrouter'

    # Spec
    deployment.spec = client.AppsV1beta1DeploymentSpec(
        replicas=replicas, template=client.V1PodTemplateSpec())

    deployment.spec.template = client.V1PodTemplateSpec()
    deployment.spec.template.metadata = client.V1ObjectMeta(
        labels=deployment.metadata.labels)
    deployment.spec.template.spec = client.V1PodSpec(containers=[])

    # Mcrouter container
    mcrouter_config_volumemount = client.V1VolumeMount(
        name='mcrouter-config', read_only=False, mount_path='/etc/mcrouter')

    mcrouter_port = client.V1ContainerPort(name='mcrouter',
                                           container_port=11211,
                                           protocol='TCP')
    mcrouter_resources = client.V1ResourceRequirements(
        limits={
            'cpu': mcrouter_limit_cpu,
            'memory': mcrouter_limit_memory
        },
        requests={
            'cpu': mcrouter_limit_cpu,
            'memory': mcrouter_limit_memory
        })
    mcrouter_container = client.V1Container(
        name='mcrouter',
        command=[
            'mcrouter', '-p', '11211', '-f', '/etc/mcrouter/mcrouter.conf'
        ],
        image='kubestack/mcrouter:v0.36.0-kbst1',
        ports=[mcrouter_port],
        volume_mounts=[mcrouter_config_volumemount],
        resources=mcrouter_resources)

    # Mcrouter config sidecar
    sidecar_resources = client.V1ResourceRequirements(limits={
        'cpu': '25m',
        'memory': '8Mi'
    },
                                                      requests={
                                                          'cpu': '25m',
                                                          'memory': '8Mi'
                                                      })
    sidecar_config_volumemount = client.V1VolumeMount(
        name='mcrouter-config', read_only=True, mount_path='/etc/mcrouter')
    sidecar_container = client.V1Container(
        name='config-sidecar',
        args=[
            "--debug", "--output=/etc/mcrouter/mcrouter.conf",
            "{}-backend.{}.svc.cluster.local".format(name, namespace)
        ],
        image='kubestack/mcrouter_sidecar:v0.1.0',
        volume_mounts=[mcrouter_config_volumemount],
        resources=sidecar_resources)

    # Config Map Volume
    mcrouter_config_volume = client.V1Volume(
        name='mcrouter-config', empty_dir=client.V1EmptyDirVolumeSource())
    deployment.spec.template.spec.volumes = [mcrouter_config_volume]

    # Metrics container
    metrics_port = client.V1ContainerPort(name='metrics',
                                          container_port=9150,
                                          protocol='TCP')
    metrics_resources = client.V1ResourceRequirements(limits={
        'cpu': '50m',
        'memory': '16Mi'
    },
                                                      requests={
                                                          'cpu': '50m',
                                                          'memory': '16Mi'
                                                      })
    metrics_container = client.V1Container(
        name='prometheus-exporter',
        image='kubestack/mcrouter_exporter:v0.0.1',
        args=[
            '-mcrouter.address', 'localhost:11211', '-web.listen-address',
            ':9150'
        ],
        ports=[metrics_port],
        resources=metrics_resources)

    deployment.spec.template.spec.containers = [
        mcrouter_container, sidecar_container, metrics_container
    ]
    return deployment
class TestCheckExisting():
    def setUp(self):
        self.name = 'testname123'
        self.namespace = 'testnamespace456'
        self.cluster_object = {
            'metadata': {
                'name': self.name,
                'namespace': self.namespace
            }
        }
        self.base_list_result = {'items': [self.cluster_object]}

    @patch('memcached_operator.memcached_operator.periodical.logging')
    @patch(
        'memcached_operator.memcached_operator.periodical.list_cluster_memcached_object',
        side_effect=client.rest.ApiException())
    def test_list_memcached_exception(self, mock_list_cluster_memcached_object,
                                      mock_logging):
        result = check_existing()

        assert mock_logging.exception.called is True
        assert result is False

    @patch(
        'memcached_operator.memcached_operator.periodical.update_memcached_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.update_mcrouter_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.create_memcached_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.create_mcrouter_deployment'
    )
    @patch('kubernetes.client.AppsV1beta1Api.read_namespaced_deployment')
    @patch('memcached_operator.memcached_operator.periodical.update_service')
    @patch('memcached_operator.memcached_operator.periodical.is_version_cached'
           )
    @patch('memcached_operator.memcached_operator.periodical.cache_version')
    @patch('memcached_operator.memcached_operator.periodical.create_service')
    @patch('kubernetes.client.CoreV1Api.read_namespaced_service')
    @patch(
        'memcached_operator.memcached_operator.periodical.list_cluster_memcached_object'
    )
    def test_no_memcached_tprs(
            self, mock_list_cluster_memcached_object,
            mock_read_namespaced_service, mock_create_service,
            mock_cache_version, mock_is_version_cached, mock_update_service,
            mock_read_namespaced_deployment, mock_create_mcrouter_deployment,
            mock_create_memcached_deployment, mock_update_mcrouter_deployment,
            mock_update_memcached_deployment):
        # Mock list memcached call with 0 items
        no_item_result = deepcopy(self.base_list_result)
        no_item_result['items'] = []
        mock_list_cluster_memcached_object.return_value = no_item_result

        check_existing()

        mock_list_cluster_memcached_object.assert_called_once_with()
        assert mock_read_namespaced_service.called is False
        assert mock_create_service.called is False
        assert mock_cache_version.called is False
        assert mock_is_version_cached.called is False
        assert mock_update_service.called is False
        assert mock_read_namespaced_deployment.called is False
        assert mock_create_memcached_deployment.called is False
        assert mock_create_mcrouter_deployment.called is False
        assert mock_update_memcached_deployment.called is False
        assert mock_update_memcached_deployment.called is False

    @patch(
        'memcached_operator.memcached_operator.periodical.update_memcached_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.update_mcrouter_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.create_memcached_deployment',
        return_value=client.AppsV1beta1Deployment())
    @patch(
        'memcached_operator.memcached_operator.periodical.create_mcrouter_deployment',
        return_value=client.AppsV1beta1Deployment())
    @patch('kubernetes.client.AppsV1beta1Api.read_namespaced_deployment',
           side_effect=client.rest.ApiException(status=404))
    @patch('memcached_operator.memcached_operator.periodical.update_service')
    @patch(
        'memcached_operator.memcached_operator.periodical.is_version_cached',
        return_value=True)
    @patch('memcached_operator.memcached_operator.periodical.cache_version')
    @patch('memcached_operator.memcached_operator.periodical.create_service',
           return_value=client.V1Service())
    @patch('kubernetes.client.CoreV1Api.read_namespaced_service',
           side_effect=client.rest.ApiException(status=404))
    @patch(
        'memcached_operator.memcached_operator.periodical.list_cluster_memcached_object'
    )
    def test_service_and_deploy_404(
            self, mock_list_cluster_memcached_object,
            mock_read_namespaced_service, mock_create_service,
            mock_cache_version, mock_is_version_cached, mock_update_service,
            mock_read_namespaced_deployment, mock_create_mcrouter_deployment,
            mock_create_memcached_deployment, mock_update_mcrouter_deployment,
            mock_update_memcached_deployment):
        # Mock list memcached call with 0 items
        mock_list_cluster_memcached_object.return_value = self.base_list_result

        check_existing()

        mock_list_cluster_memcached_object.assert_called_once_with()

        service_calls = [
            call(self.name, self.namespace),
            call('{}-backend'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_service.assert_has_calls(service_calls)

        create_service_calls = [
            call(get_mcrouter_service_object(self.cluster_object)),
            call(get_memcached_service_object(self.cluster_object))
        ]
        mock_create_service.assert_has_calls(create_service_calls)

        cache_version_calls = [
            call(client.V1Service()),
            call(client.AppsV1beta1Deployment())
        ]
        mock_cache_version.assert_has_calls(cache_version_calls)

        assert mock_is_version_cached.called is False
        assert mock_update_service.called is False
        read_namespaced_deployment_calls = [
            call(self.name, self.namespace),
            call('{}-router'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_deployment.assert_has_calls(
            read_namespaced_deployment_calls)
        mock_create_memcached_deployment.assert_called_once_with(
            self.cluster_object)
        mock_create_mcrouter_deployment.assert_called_once_with(
            self.cluster_object)
        assert mock_update_memcached_deployment.called is False
        assert mock_update_mcrouter_deployment.called is False

    @patch(
        'memcached_operator.memcached_operator.periodical.update_memcached_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.update_mcrouter_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.create_memcached_deployment',
        return_value=False)
    @patch(
        'memcached_operator.memcached_operator.periodical.create_mcrouter_deployment',
        return_value=False)
    @patch('kubernetes.client.AppsV1beta1Api.read_namespaced_deployment',
           side_effect=client.rest.ApiException(status=404))
    @patch('memcached_operator.memcached_operator.periodical.update_service')
    @patch(
        'memcached_operator.memcached_operator.periodical.is_version_cached',
        return_value=True)
    @patch('memcached_operator.memcached_operator.periodical.cache_version')
    @patch('memcached_operator.memcached_operator.periodical.create_service',
           return_value=False)
    @patch('kubernetes.client.CoreV1Api.read_namespaced_service',
           side_effect=client.rest.ApiException(status=404))
    @patch(
        'memcached_operator.memcached_operator.periodical.list_cluster_memcached_object'
    )
    def test_service_and_deploy_404_yet_create_false(
            self, mock_list_cluster_memcached_object,
            mock_read_namespaced_service, mock_create_service,
            mock_cache_version, mock_is_version_cached, mock_update_service,
            mock_read_namespaced_deployment, mock_create_mcrouter_deployment,
            mock_create_memcached_deployment, mock_update_mcrouter_deployment,
            mock_update_memcached_deployment):
        # Mock list memcached call with 0 items
        mock_list_cluster_memcached_object.return_value = self.base_list_result

        check_existing()

        mock_list_cluster_memcached_object.assert_called_once_with()

        read_service_calls = [
            call(self.name, self.namespace),
            call('{}-backend'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_service.assert_has_calls(read_service_calls)

        create_service_calls = [
            call(get_mcrouter_service_object(self.cluster_object)),
            call(get_memcached_service_object(self.cluster_object))
        ]
        mock_create_service.assert_has_calls(create_service_calls)

        assert mock_cache_version.called is False

        assert mock_is_version_cached.called is False
        assert mock_update_service.called is False
        read_namespaced_deployment_calls = [
            call(self.name, self.namespace),
            call('{}-router'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_deployment.assert_has_calls(
            read_namespaced_deployment_calls)
        mock_create_memcached_deployment.assert_called_once_with(
            self.cluster_object)
        mock_create_mcrouter_deployment.assert_called_once_with(
            self.cluster_object)
        assert mock_update_memcached_deployment.called is False
        assert mock_update_mcrouter_deployment.called is False

    @patch('memcached_operator.memcached_operator.periodical.logging')
    @patch(
        'memcached_operator.memcached_operator.periodical.update_memcached_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.update_mcrouter_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.create_memcached_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.create_mcrouter_deployment'
    )
    @patch('kubernetes.client.AppsV1beta1Api.read_namespaced_deployment',
           side_effect=client.rest.ApiException(status=500))
    @patch('memcached_operator.memcached_operator.periodical.update_service')
    @patch('memcached_operator.memcached_operator.periodical.is_version_cached'
           )
    @patch('memcached_operator.memcached_operator.periodical.cache_version')
    @patch('memcached_operator.memcached_operator.periodical.create_service')
    @patch('kubernetes.client.CoreV1Api.read_namespaced_service',
           side_effect=client.rest.ApiException(status=500))
    @patch(
        'memcached_operator.memcached_operator.periodical.list_cluster_memcached_object'
    )
    def test_service_and_deploy_500(
            self, mock_list_cluster_memcached_object,
            mock_read_namespaced_service, mock_create_service,
            mock_cache_version, mock_is_version_cached, mock_update_service,
            mock_read_namespaced_deployment, mock_create_mcrouter_deployment,
            mock_create_memcached_deployment, mock_update_mcrouter_deployment,
            mock_update_memcached_deployment, mock_logging):
        # Mock list memcached call
        mock_list_cluster_memcached_object.return_value = self.base_list_result

        check_existing()

        mock_list_cluster_memcached_object.assert_called_once_with()
        read_namespaced_service_calls = [
            call(self.name, self.namespace),
            call('{}-backend'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_service.assert_has_calls(
            read_namespaced_service_calls)
        assert mock_create_service.called is False
        assert mock_cache_version.called is False
        assert mock_is_version_cached.called is False
        assert mock_update_service.called is False
        read_namespaced_deployment_calls = [
            call(self.name, self.namespace),
            call('{}-router'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_deployment.assert_has_calls(
            read_namespaced_deployment_calls)
        assert mock_create_memcached_deployment.called is False
        assert mock_create_mcrouter_deployment.called is False
        assert mock_update_memcached_deployment.called is False
        assert mock_update_mcrouter_deployment.called is False
        mock_logging.exception.call_count == 2

    @patch(
        'memcached_operator.memcached_operator.periodical.update_memcached_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.update_mcrouter_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.create_memcached_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.create_mcrouter_deployment'
    )
    @patch('kubernetes.client.AppsV1beta1Api.read_namespaced_deployment',
           return_value=client.AppsV1beta1Deployment())
    @patch('memcached_operator.memcached_operator.periodical.update_service')
    @patch(
        'memcached_operator.memcached_operator.periodical.is_version_cached',
        return_value=True)
    @patch('memcached_operator.memcached_operator.periodical.cache_version')
    @patch('memcached_operator.memcached_operator.periodical.create_service')
    @patch('kubernetes.client.CoreV1Api.read_namespaced_service',
           return_value=client.V1Service())
    @patch(
        'memcached_operator.memcached_operator.periodical.list_cluster_memcached_object'
    )
    def test_service_and_deploy_cached(
            self, mock_list_cluster_memcached_object,
            mock_read_namespaced_service, mock_create_service,
            mock_cache_version, mock_is_version_cached, mock_update_service,
            mock_read_namespaced_deployment, mock_create_mcrouter_deployment,
            mock_create_memcached_deployment, mock_update_mcrouter_deployment,
            mock_update_memcached_deployment):
        # Mock list memcached call with 0 items
        mock_list_cluster_memcached_object.return_value = self.base_list_result

        check_existing()

        mock_list_cluster_memcached_object.assert_called_once_with()
        read_namespaced_service_calls = [
            call(self.name, self.namespace),
            call('{}-backend'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_service.assert_has_calls(
            read_namespaced_service_calls)
        assert mock_create_service.called is False
        assert mock_cache_version.called is False

        is_version_cached_calls = [
            call(client.V1Service()),
            call(client.AppsV1beta1Deployment())
        ]
        mock_is_version_cached.assert_has_calls(is_version_cached_calls)

        assert mock_update_service.called is False
        read_namespaced_deployment_calls = [
            call(self.name, self.namespace),
            call('{}-router'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_deployment.assert_has_calls(
            read_namespaced_deployment_calls)
        assert mock_create_memcached_deployment.called is False
        assert mock_create_mcrouter_deployment.called is False
        assert mock_update_memcached_deployment.called is False
        assert mock_update_mcrouter_deployment.called is False

    @patch(
        'memcached_operator.memcached_operator.periodical.update_memcached_deployment',
        return_value=client.AppsV1beta1Deployment())
    @patch(
        'memcached_operator.memcached_operator.periodical.update_mcrouter_deployment',
        return_value=client.AppsV1beta1Deployment())
    @patch(
        'memcached_operator.memcached_operator.periodical.create_memcached_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.create_mcrouter_deployment'
    )
    @patch('kubernetes.client.AppsV1beta1Api.read_namespaced_deployment',
           return_value=client.AppsV1beta1Deployment())
    @patch('memcached_operator.memcached_operator.periodical.update_service',
           return_value=client.V1Service())
    @patch(
        'memcached_operator.memcached_operator.periodical.is_version_cached',
        return_value=False)
    @patch('memcached_operator.memcached_operator.periodical.cache_version')
    @patch('memcached_operator.memcached_operator.periodical.create_service')
    @patch('kubernetes.client.CoreV1Api.read_namespaced_service',
           return_value=client.V1Service())
    @patch(
        'memcached_operator.memcached_operator.periodical.list_cluster_memcached_object'
    )
    def test_service_and_deploy_not_cached(
            self, mock_list_cluster_memcached_object,
            mock_read_namespaced_service, mock_create_service,
            mock_cache_version, mock_is_version_cached, mock_update_service,
            mock_read_namespaced_deployment, mock_create_mcrouter_deployment,
            mock_create_memcached_deployment, mock_update_mcrouter_deployment,
            mock_update_memcached_deployment):
        # Mock list memcached call with 0 items
        mock_list_cluster_memcached_object.return_value = self.base_list_result

        check_existing()

        mock_list_cluster_memcached_object.assert_called_once_with()

        read_namespaced_service_calls = [
            call(self.name, self.namespace),
            call('{}-backend'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_service.assert_has_calls(
            read_namespaced_service_calls)
        assert mock_create_service.called is False

        cache_version_calls = [
            call(client.V1Service()),
            call(client.AppsV1beta1Deployment())
        ]
        mock_cache_version.assert_has_calls(cache_version_calls)

        is_version_cached_calls = [
            call(client.V1Service()),
            call(client.AppsV1beta1Deployment())
        ]
        mock_is_version_cached.assert_has_calls(is_version_cached_calls)

        update_service_calls = [
            call(get_mcrouter_service_object(self.cluster_object)),
            call(get_memcached_service_object(self.cluster_object))
        ]
        mock_update_service.assert_has_calls(update_service_calls)
        read_namespaced_deployment_calls = [
            call(self.name, self.namespace),
            call('{}-router'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_deployment.assert_has_calls(
            read_namespaced_deployment_calls)
        assert mock_create_memcached_deployment.called is False
        assert mock_create_mcrouter_deployment.called is False
        mock_update_memcached_deployment.assert_called_once_with(
            self.cluster_object)
        mock_update_mcrouter_deployment.assert_called_once_with(
            self.cluster_object)

    @patch(
        'memcached_operator.memcached_operator.periodical.update_memcached_deployment',
        return_value=False)
    @patch(
        'memcached_operator.memcached_operator.periodical.update_mcrouter_deployment',
        return_value=False)
    @patch(
        'memcached_operator.memcached_operator.periodical.create_memcached_deployment'
    )
    @patch(
        'memcached_operator.memcached_operator.periodical.create_mcrouter_deployment'
    )
    @patch('kubernetes.client.AppsV1beta1Api.read_namespaced_deployment',
           return_value=client.AppsV1beta1Deployment())
    @patch('memcached_operator.memcached_operator.periodical.update_service',
           return_value=False)
    @patch(
        'memcached_operator.memcached_operator.periodical.is_version_cached',
        return_value=False)
    @patch('memcached_operator.memcached_operator.periodical.cache_version')
    @patch('memcached_operator.memcached_operator.periodical.create_service')
    @patch('kubernetes.client.CoreV1Api.read_namespaced_service',
           return_value=client.V1Service())
    @patch(
        'memcached_operator.memcached_operator.periodical.list_cluster_memcached_object'
    )
    def test_service_and_deploy_not_cached_yet_update_exception(
            self, mock_list_cluster_memcached_object,
            mock_read_namespaced_service, mock_create_service,
            mock_cache_version, mock_is_version_cached, mock_update_service,
            mock_read_namespaced_deployment, mock_create_mcrouter_deployment,
            mock_create_memcached_deployment, mock_update_mcrouter_deployment,
            mock_update_memcached_deployment):
        # Mock list memcached call with 0 items
        mock_list_cluster_memcached_object.return_value = self.base_list_result

        check_existing()

        mock_list_cluster_memcached_object.assert_called_once_with()

        read_namespaced_service_calls = [
            call(self.name, self.namespace),
            call('{}-backend'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_service.assert_has_calls(
            read_namespaced_service_calls)
        assert mock_create_service.called is False

        assert mock_cache_version.called is False

        is_version_cached_calls = [
            call(client.V1Service()),
            call(client.AppsV1beta1Deployment())
        ]
        mock_is_version_cached.assert_has_calls(is_version_cached_calls)

        update_service_calls = [
            call(get_mcrouter_service_object(self.cluster_object)),
            call(get_memcached_service_object(self.cluster_object))
        ]
        mock_update_service.assert_has_calls(update_service_calls)
        read_namespaced_deployment_calls = [
            call(self.name, self.namespace),
            call('{}-router'.format(self.name), self.namespace)
        ]
        mock_read_namespaced_deployment.assert_has_calls(
            read_namespaced_deployment_calls)
        assert mock_create_memcached_deployment.called is False
        assert mock_create_mcrouter_deployment.called is False
        mock_update_memcached_deployment.assert_called_once_with(
            self.cluster_object)
        mock_update_mcrouter_deployment.assert_called_once_with(
            self.cluster_object)
Beispiel #14
0
def get_deployment(
        namespace,
        app,
        name,
        project_name,
        project_uuid,
        job_name,
        job_uuid,
        volume_mounts,
        volumes,
        image,
        command,
        args,
        ports,
        container_name,
        env_vars=None,
        env_from=None,
        resources=None,
        node_selector=None,
        affinity=None,
        tolerations=None,
        role=None,
        type=None,  # pylint:disable=redefined-builtin
        replicas=1,
        service_account_name=None):
    labels = get_labels(app=app,
                        project_name=project_name,
                        project_uuid=project_uuid,
                        job_name=job_name,
                        job_uuid=job_uuid,
                        role=role,
                        type=type)
    metadata = client.V1ObjectMeta(name=JOB_NAME_FORMAT.format(
        name=name, job_uuid=job_uuid),
                                   labels=labels,
                                   namespace=namespace)
    spec = get_deployment_spec(namespace=namespace,
                               app=app,
                               name=name,
                               project_name=project_name,
                               project_uuid=project_uuid,
                               job_name=job_name,
                               job_uuid=job_uuid,
                               volume_mounts=volume_mounts,
                               volumes=volumes,
                               image=image,
                               command=command,
                               args=args,
                               ports=ports,
                               env_vars=env_vars,
                               env_from=env_from,
                               container_name=container_name,
                               resources=resources,
                               node_selector=node_selector,
                               affinity=affinity,
                               tolerations=tolerations,
                               role=role,
                               type=type,
                               replicas=replicas,
                               service_account_name=service_account_name)
    return client.AppsV1beta1Deployment(
        api_version=k8s_constants.K8S_API_VERSION_EXTENSIONS_V1_BETA1,
        kind=k8s_constants.K8S_DEPLOYMENT_KIND,
        metadata=metadata,
        spec=spec)
Beispiel #15
0
logging.getLogger().setLevel('DEBUG')

konfig.load_incluster_config()
cl = klient.AppsV1beta1Api()

# READ DEPLOYMENT:

depl = cl.read_namespaced_deployment(
    name='pynsider',
    namespace='default',
    pretty='yeshh',
)
logging.info(depl.metadata)

# UPDATE DEPLOYMENT:

nd = klient.AppsV1beta1Deployment()
nd.api_version = depl.api_version
nd.kind = depl.kind
nd.metadata = depl.metadata
nd.metadata.annotations['CHRISTOULAS'] = '42 re malakes'
nd.spec = depl.spec

new_depl = cl.replace_namespaced_deployment(
    name='pynsider',
    namespace='default',
    body=nd,
    pretty='yup',
)
Beispiel #16
0
 def get_deployment(self,
                    resource_name,
                    volume_mounts,
                    volumes,
                    labels,
                    env_vars=None,
                    command=None,
                    args=None,
                    init_command=None,
                    init_args=None,
                    init_env_vars=None,
                    ports=None,
                    persistence_outputs=None,
                    persistence_data=None,
                    outputs_refs_jobs=None,
                    outputs_refs_experiments=None,
                    secret_refs=None,
                    config_map_refs=None,
                    resources=None,
                    annotations=None,
                    ephemeral_token=None,
                    node_selector=None,
                    affinity=None,
                    tolerations=None,
                    max_restarts=None,
                    restart_policy=None,
                    reconcile_url=None,
                    init_context_mounts=None,
                    sidecar_context_mounts=None,
                    replicas=1):
     template_spec = self.get_pod_template_spec(
         resource_name=resource_name,
         volume_mounts=volume_mounts,
         volumes=volumes,
         labels=labels,
         env_vars=env_vars,
         command=command,
         args=args,
         init_command=init_command,
         init_args=init_args,
         init_env_vars=init_env_vars,
         ports=ports,
         persistence_outputs=persistence_outputs,
         persistence_data=persistence_data,
         outputs_refs_jobs=outputs_refs_jobs,
         outputs_refs_experiments=outputs_refs_experiments,
         secret_refs=secret_refs,
         config_map_refs=config_map_refs,
         resources=resources,
         annotations=annotations,
         ephemeral_token=ephemeral_token,
         node_selector=node_selector,
         affinity=affinity,
         tolerations=tolerations,
         max_restarts=max_restarts,
         restart_policy=restart_policy,
         reconcile_url=reconcile_url,
         init_context_mounts=init_context_mounts,
         sidecar_context_mounts=sidecar_context_mounts,
     )
     deployment_spec = client.AppsV1beta1DeploymentSpec(
         replicas=replicas, template=template_spec)
     metadata = client.V1ObjectMeta(name=resource_name,
                                    labels=labels,
                                    namespace=self.namespace)
     return client.AppsV1beta1Deployment(
         api_version=k8s_constants.K8S_API_VERSION_APPS_V1,
         kind=k8s_constants.K8S_DEPLOYMENT_KIND,
         metadata=metadata,
         spec=deployment_spec)