Пример #1
0
def requires_bootstrap(deployment_config):
    try:
        Deployment.get(name=deployment_config.name,
                       namespace=deployment_config.namespace)
        return False
    except NotFound:
        return True
    except Exception as e:
        LOG.warning(e, exc_info=True)
Пример #2
0
 def delete(self, app_spec):
     LOG.info("Deleting deployment for %s", app_spec.name)
     try:
         body = {
             "kind": "DeleteOptions",
             "apiVersion": "v1",
             "propagationPolicy": "Foreground"
         }
         Deployment.delete(app_spec.name, app_spec.namespace, body=body)
     except NotFound:
         pass
Пример #3
0
def _create_default_deployment():
    labels = {"test": "true"}
    object_meta = ObjectMeta(name=NAME, namespace=NAMESPACE, labels=labels)
    container_port = ContainerPort(name="http5000", containerPort=5000)
    http = HTTPGetAction(path="/", port="http5000")
    liveness = Probe(httpGet=http)
    tcp = TCPSocketAction(port=5000)
    readiness = Probe(tcpSocket=tcp)
    container = Container(name="container",
                          image="dummy_image",
                          ports=[container_port],
                          livenessProbe=liveness,
                          readinessProbe=readiness)
    image_pull_secret = LocalObjectReference(name="image_pull_secret")
    pod_spec = PodSpec(containers=[container],
                       imagePullSecrets=[image_pull_secret],
                       serviceAccountName="default")
    pod_template_spec = PodTemplateSpec(metadata=object_meta, spec=pod_spec)
    deployer_spec = DeploymentSpec(replicas=2,
                                   selector=LabelSelector(matchLabels=labels),
                                   template=pod_template_spec,
                                   revisionHistoryLimit=5)
    deployment = Deployment(metadata=object_meta, spec=deployer_spec)

    return deployment
Пример #4
0
 def _ready(self):
     try:
         dep = Deployment.get(self._app_spec.name, self._app_spec.namespace)
     except NotFound:
         return False
     return (dep.status.updatedReplicas >= dep.spec.replicas
             and dep.status.availableReplicas >= dep.spec.replicas)
Пример #5
0
 def _get_status(self, namespace=None):
     deployment_configs = self._cluster.find_deployment_configs(
         NAME, namespace=namespace)
     deployments = {
         d.metadata.namespace: d
         for d in Deployment.find(NAME, namespace=namespace)
     }
     applications = {
         d.metadata.namespace: d
         for d in self._application.find(NAME, namespace=namespace)
     }
     res = []
     for c in deployment_configs:
         dep = deployments.get(c.namespace)
         app = applications.get(c.namespace)
         version = _get_version(dep)
         status = _get_status(dep, app)
         res.append(
             DeploymentStatus(name=NAME,
                              namespace=c.namespace,
                              status=status.summary,
                              description=status.description,
                              version=version or '',
                              channel=c.tag or ''))
     return res
def deployment():
    main_container = Container(
        env=[EnvVar(name=CANARY_NAME, value=CANARY_VALUE)])
    pod_spec = PodSpec(containers=[main_container])
    pod_metadata = ObjectMeta(annotations={CANARY_NAME: CANARY_VALUE})
    pod_template_spec = PodTemplateSpec(spec=pod_spec, metadata=pod_metadata)
    deployment_spec = DeploymentSpec(template=pod_template_spec)
    return Deployment(spec=deployment_spec)
Пример #7
0
def _create_deployment(available_replicas, namespace, image):
    container = Container(image=image)
    pod_spec = PodSpec(containers=[container])
    pod_template_spec = PodTemplateSpec(spec=pod_spec)
    spec = DeploymentSpec(replicas=1, template=pod_template_spec)
    status = DeploymentStatus(availableReplicas=available_replicas)
    metadata = ObjectMeta(name=NAME, namespace=namespace)
    return Deployment(metadata=metadata, spec=spec, status=status)
Пример #8
0
 def _ready(self):
     try:
         dep = Deployment.get(self._app_spec.name, self._app_spec.namespace)
     except NotFound:
         return False
     return (dep.status.updatedReplicas == dep.spec.replicas
             and dep.status.replicas == dep.spec.replicas
             and dep.status.availableReplicas == dep.spec.replicas
             and dep.status.observedGeneration >= dep.metadata.generation)
Пример #9
0
    def action():
        for kind in kinds:
            assert kind.get(name)
        dep = Deployment.get(name)
        assert dep.spec.template.spec.containers[0].image == image
        svc = Service.get(name)
        assert svc.spec.type == service_type

        for kind, expected_dict in expected.items():
            actual = kind.get(name)
            assert_k8s_resource_matches(actual, expected_dict, image, service_type, deployment_id, strongbox_groups)
Пример #10
0
    def test_updated_if_exists(self, get, put):
        mock_response = _create_mock_response()
        get.return_value = mock_response
        deployment = _create_default_deployment()

        from_api = Deployment.get_or_create(metadata=deployment.metadata, spec=deployment.spec)
        assert not from_api._new
        assert from_api.spec.replicas == 2
        call_params = from_api.as_dict()

        from_api.save()
        pytest.helpers.assert_any_call(put, _uri(NAMESPACE, NAME), call_params)
Пример #11
0
 def deployment(self):
     main_container = Container(env=[EnvVar(name="DUMMY", value="CANARY")])
     pod_spec = PodSpec(containers=[main_container])
     pod_template_spec = PodTemplateSpec(spec=pod_spec)
     deployment_spec = DeploymentSpec(template=pod_template_spec)
     return Deployment(spec=deployment_spec)
Пример #12
0
 def deployment(self):
     metadata = ObjectMeta(annotations={"dummy": "annotations"})
     pod_template_spec = PodTemplateSpec(metadata=metadata)
     deployment_spec = DeploymentSpec(template=pod_template_spec)
     return Deployment(spec=deployment_spec)
Пример #13
0
    def deploy(self, app_spec, selector, labels, besteffort_qos_is_required):
        LOG.info("Creating new deployment for %s", app_spec.name)
        deployment_labels = merge_dicts(app_spec.labels.deployment, labels)
        metadata = ObjectMeta(name=app_spec.name,
                              namespace=app_spec.namespace,
                              labels=deployment_labels,
                              annotations=app_spec.annotations.deployment)
        container_ports = [
            ContainerPort(name=port_spec.name,
                          containerPort=port_spec.target_port)
            for port_spec in app_spec.ports
        ]
        env = self._make_env(app_spec)
        pull_policy = "IfNotPresent" if (":" in app_spec.image and ":latest"
                                         not in app_spec.image) else "Always"

        env_from = [
            EnvFromSource(configMapRef=ConfigMapEnvSource(name=app_spec.name,
                                                          optional=True))
        ]
        containers = [
            Container(
                name=app_spec.name,
                image=app_spec.image,
                ports=container_ports,
                env=env,
                envFrom=env_from,
                lifecycle=self._lifecycle,
                livenessProbe=_make_probe(app_spec.health_checks.liveness),
                readinessProbe=_make_probe(app_spec.health_checks.readiness),
                imagePullPolicy=pull_policy,
                volumeMounts=self._make_volume_mounts(app_spec),
                resources=_make_resource_requirements(app_spec.resources))
        ]

        automount_service_account_token = app_spec.admin_access
        init_containers = []
        service_account_name = "default"

        pod_spec = PodSpec(
            containers=containers,
            initContainers=init_containers,
            volumes=self._make_volumes(app_spec),
            serviceAccountName=service_account_name,
            automountServiceAccountToken=automount_service_account_token,
            terminationGracePeriodSeconds=self._grace_period)

        pod_labels = merge_dicts(app_spec.labels.pod,
                                 _add_status_label(labels))
        pod_metadata = ObjectMeta(name=app_spec.name,
                                  namespace=app_spec.namespace,
                                  labels=pod_labels,
                                  annotations=app_spec.annotations.pod)
        pod_template_spec = PodTemplateSpec(metadata=pod_metadata,
                                            spec=pod_spec)
        replicas = app_spec.replicas
        # we must avoid that the deployment scales up to app_spec.replicas if autoscaler has set another value
        if should_have_autoscaler(app_spec):
            try:
                deployment = Deployment.get(app_spec.name, app_spec.namespace)
                replicas = deployment.spec.replicas
            except NotFound:
                pass

        deployment_strategy = DeploymentStrategy(
            rollingUpdate=RollingUpdateDeployment(
                maxUnavailable=self._max_unavailable,
                maxSurge=self._max_surge))
        if app_spec.replicas == 1 and app_spec.singleton:
            deployment_strategy = DeploymentStrategy(
                rollingUpdate=RollingUpdateDeployment(maxUnavailable=1,
                                                      maxSurge=0))
        spec = DeploymentSpec(replicas=replicas,
                              selector=LabelSelector(matchLabels=selector),
                              template=pod_template_spec,
                              revisionHistoryLimit=5,
                              strategy=deployment_strategy)

        deployment = Deployment.get_or_create(metadata=metadata, spec=spec)
        _clear_pod_init_container_annotations(deployment)
        self._datadog.apply(deployment, app_spec, besteffort_qos_is_required)
        self._prometheus.apply(deployment, app_spec)
        self._secrets.apply(deployment, app_spec)
        deployment.save()
Пример #14
0
 def test_delete(self, delete):
     Deployment.delete(NAME, namespace=NAMESPACE)
     pytest.helpers.assert_any_call(delete, _uri(NAMESPACE, NAME))
Пример #15
0
 def test_create_blank_deployment(self):
     object_meta = ObjectMeta(name=NAME, namespace=NAMESPACE)
     deployment = Deployment(metadata=object_meta)
     assert deployment.as_dict()[u"metadata"][u"name"] == NAME
 def deployment(self):
     with mock.patch("k8s.models.deployment.Deployment.get") as m:
         deployment = mock.create_autospec(Deployment(), spec_set=True)
         deployment.spec.replicas.return_value = REPLICAS
         m.return_value = deployment
         return deployment