示例#1
0
    def execute_deploy_manifest_pipeline(self, pipeline_name):
        deployment_name = self.TEST_APP + '-deployment'
        configmap_name = self.TEST_APP + '-configmap'
        bindings = self.bindings
        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                'type': 'manual',
                'user': '******'
            }],
            description='Deploy manifest in ' + self.TEST_APP,
            application=self.TEST_APP)
        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (builder.new_clause_builder(
            'Deployment created', retryable_for_secs=60).get_resources(
                'deploy',
                extra_args=[
                    deployment_name, '--namespace', self.TEST_NAMESPACE
                ]).EXPECT(
                    self.mp.deployment_configmap_mounted_predicate(
                        configmap_name)))

        return st.OperationContract(self.new_post_operation(
            title='Deploy manifest',
            data=payload,
            path='pipelines/' + self.TEST_APP + '/' + pipeline_name),
                                    contract=builder.build())
示例#2
0
    def deploy_service(self):
        """Creates an OperationContract for deploying a service object

    To verify the operation, we just check that the service was created.
    """
        name = self.TEST_APP + '-service'
        account = self.bindings['SPINNAKER_KUBERNETES_V2_ACCOUNT']
        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                'cloudProvider': 'kubernetes',
                'moniker': {
                    'app': self.TEST_APP
                },
                'account': account,
                'source': 'text',
                'type': 'deployManifest',
                'user': '******',
                'manifests': [self.mf.service(name)],
            }],
            description='Deploy manifest',
            application=self.TEST_APP)

        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (builder.new_clause_builder(
            'Service created', retryable_for_secs=15).get_resources(
                'service',
                extra_args=[name, '--namespace', self.TEST_NAMESPACE]).EXPECT(
                    self.mp.service_selector_predicate('app', self.TEST_APP)))

        return st.OperationContract(self.new_post_operation(
            title='deploy_manifest', data=payload, path='tasks'),
                                    contract=builder.build())
示例#3
0
    def save_daemonset_pipeline(self):
        deploy_stage = self.make_deploy_stage_daemonset()
        job = dict(keepWaitingPipelines='false',
                   application=self.TEST_APP,
                   name='daemonset-pipeline',
                   lastModifiedBy='anonymous',
                   limitConcurrent='true',
                   parallel='true',
                   stages=[deploy_stage])
        payload = self.agent.make_json_payload_from_kwargs(**job)
        expect_match = {
            key: jp.EQUIVALENT(value)
            for key, value in job.items()
        }
        expect_match['stages'] = jp.LIST_MATCHES([
            jp.DICT_MATCHES({
                key: jp.EQUIVALENT(value)
                for key, value in deploy_stage.items()
            })
        ])

        builder = st.HttpContractBuilder(self.agent)
        (builder.new_clause_builder(
            'Has Pipeline', retryable_for_secs=15).get_url_path(
                'applications/{app}/pipelineConfigs'.format(
                    app=self.TEST_APP)).contains_match(expect_match))
        builder = kube.KubeContractBuilder(self.kube_observer)
        return st.OperationContract(self.new_post_operation(
            title='Save Daemonset',
            data=payload,
            path='pipelines',
            status_class=st.SynchronousHttpOperationStatus),
                                    contract=builder.build())
示例#4
0
    def delete_load_balancer(self):
        """Creates OperationContract for deleteLoadBalancer.

    To verify the operation, we just check that the Kubernetes resources
    created by upsert_load_balancer are no longer visible in the cluster.
    """
        bindings = self.bindings
        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                'type': 'deleteLoadBalancer',
                'cloudProvider': 'kubernetes',
                'loadBalancerName': self.__lb_name,
                'namespace': 'default',
                'account': bindings['SPINNAKER_KUBERNETES_ACCOUNT'],
                'credentials': bindings['SPINNAKER_KUBERNETES_ACCOUNT'],
                'regions': ['default'],
                'user': '******'
            }],
            description='Delete Load Balancer: {0} in {1}'.format(
                self.__lb_name, bindings['SPINNAKER_KUBERNETES_ACCOUNT']),
            application=self.TEST_APP)

        builder = kube.KubeContractBuilder(self.kube_observer)
        (builder.new_clause_builder('Service Removed',
                                    retryable_for_secs=15).get_resources(
                                        'svc', no_resource_ok=True))

        return st.OperationContract(self.new_post_operation(
            title='delete_load_balancer', data=payload, path='tasks'),
                                    contract=builder.build())
示例#5
0
 def execute_delete_statefulset_pipeline(self):
     bindings = self.bindings
     payload = self.agent.make_json_payload_from_kwargs(
         job=[{
             'type': 'manual',
             'user': '******'
         }],
         description='Delete StatefulSet in Application' + self.TEST_APP,
         application=self.TEST_APP)
     builder = kube.KubeContractBuilder(self.kube_observer)
     (builder.new_clause_builder(
         'StatefulSet Deleted', retryable_for_secs=15).get_resources(
             'statefulsets',
             extra_args=[
                 self.TEST_APP + self.POSTFIX_STATEFUL_DAEMONSET,
                 '--namespace', self.TEST_NAMESPACE
             ]).EXPECT(
                 ov_factory.value_list_path_contains(
                     'targetSize', jp.NUM_EQ(0))).OR(
                         self.__not_found_observation_predicate()))
     return st.OperationContract(self.new_post_operation(
         title='Delete_StatefulSet',
         data=payload,
         path='pipelines/' + self.TEST_APP + '/statefulset-delete-pipeline',
         status_class=st.SynchronousHttpOperationStatus),
                                 contract=builder.build())
示例#6
0
    def execute_bake_deploy_manifest_pipeline(self, image):
        name = self.TEST_APP + "-deployment"
        bindings = self.bindings
        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                "type": "manual",
                "user": "******",
            }],
            description="Deploy manifest in " + self.TEST_APP,
            application=self.TEST_APP,
        )
        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (builder.new_clause_builder(
            "Deployment deployed", retryable_for_secs=90).get_resources(
                "deploy",
                extra_args=[name, "--namespace", self.TEST_NAMESPACE]).EXPECT(
                    self.mp.deployment_image_predicate(image)))

        return st.OperationContract(
            self.new_post_operation(
                title="Deploy manifest",
                data=payload,
                path="pipelines/" + self.TEST_APP + "/bake-deploy-pipeline",
            ),
            contract=builder.build(),
        )
示例#7
0
    def undo_rollout_manifest(self, image):
        """Creates OperationContract for undoRolloutManifest.

    To verify the operation, we just check that the deployment has changed size
    """
        bindings = self.bindings
        name = self.TEST_APP + '-deployment'
        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                'cloudProvider': 'kubernetes',
                'account': bindings['SPINNAKER_KUBERNETES_V2_ACCOUNT'],
                'manifestName': 'deployment ' + name,
                'location': self.TEST_NAMESPACE,
                'type': 'undoRolloutManifest',
                'user': '******',
                'numRevisionsBack': 1
            }],
            description='Deploy manifest',
            application=self.TEST_APP)

        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (builder.new_clause_builder(
            'Deployment rolled back', retryable_for_secs=15).get_resources(
                'deploy',
                extra_args=[name, '--namespace', self.TEST_NAMESPACE]).EXPECT(
                    self.__deployment_image_predicate(image)))

        return st.OperationContract(self.new_post_operation(
            title='undo_rollout_manifest', data=payload, path='tasks'),
                                    contract=builder.build())
示例#8
0
    def scale_manifest(self):
        """Creates OperationContract for scaleManifest.

    To verify the operation, we just check that the deployment has changed size
    """
        bindings = self.bindings
        name = self.TEST_APP + '-deployment'
        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                'cloudProvider': 'kubernetes',
                'account': bindings['SPINNAKER_KUBERNETES_V2_ACCOUNT'],
                'manifestName': 'deployment ' + name,
                'location': self.TEST_NAMESPACE,
                'type': 'scaleManifest',
                'user': '******',
                'replicas': 2
            }],
            description='Deploy manifest',
            application=self.TEST_APP)

        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (builder.new_clause_builder(
            'Deployment scaled', retryable_for_secs=15).get_resources(
                'deploy',
                extra_args=[name, '--namespace', self.TEST_NAMESPACE]).EXPECT(
                    ov_factory.value_list_contains(
                        jp.DICT_MATCHES({
                            'spec':
                            jp.DICT_MATCHES({'replicas': jp.NUM_EQ(2)})
                        }))))

        return st.OperationContract(self.new_post_operation(
            title='scale_manifest', data=payload, path='tasks'),
                                    contract=builder.build())
  def run_find_image_pipeline(self):
    path = 'pipelines/{0}/{1}'.format(self.TEST_APP, self.pipeline_id)
    bindings = self.bindings
    group_name = frigga.Naming.server_group(
        app=self.TEST_APP,
        stack=bindings['TEST_STACK'],
        version='v001')

    payload = self.agent.make_json_payload_from_kwargs(
        type='manual',
        user='******')

    builder = kube.KubeContractBuilder(self.kube_observer)
    (builder.new_clause_builder('Replica Set Added',
                                retryable_for_secs=15)
     .get_resources(
         'rs', extra_args=[group_name, '--namespace', self.TEST_NAMESPACE])
     .contains_path_eq(
         'spec/template/spec/containers/image',
         self.__desired_image_id))

    return st.OperationContract(
        self.new_post_operation(
            title='run_find_image_pipeline', data=payload, path=path),
            builder.build())
示例#10
0
  def deploy_config_map(self, version):
    """Creates OperationContract for deploying a versioned configmap

    To verify the operation, we just check that the deployment was created with
    the correct image.
    """
    bindings = self.bindings
    name = self.TEST_APP + '-configmap'
    payload = self.agent.make_json_payload_from_kwargs(
        job=[{
            'cloudProvider': 'kubernetes',
            'moniker': {
                'app': self.TEST_APP
            },
            'account': bindings['SPINNAKER_KUBERNETES_V2_ACCOUNT'],
            'source': 'text',
            'type': 'deployManifest',
            'user': '******',
            'manifests': [self.mf.config_map(name, {'version': version})],
        }],
        description='Deploy manifest',
        application=self.TEST_APP)

    builder = kube.KubeContractBuilder(self.kube_v2_observer)
    (builder.new_clause_builder('ConfigMap created',
                                retryable_for_secs=15)
     .get_resources(
         'configmap',
         extra_args=[name + '-' + version, '--namespace', self.TEST_NAMESPACE])
     .EXPECT(self.mp.config_map_key_value_predicate('version', version)))

    return st.OperationContract(
        self.new_post_operation(
            title='deploy_manifest', data=payload, path='tasks'),
        contract=builder.build())
示例#11
0
  def create_server_group(self):
    """Creates OperationContract for createServerGroup.

    To verify the operation, we just check that the server group was created.
    """
    bindings = self.bindings

    # Spinnaker determines the group name created,
    # which will be the following:
    group_name = '{app}-{stack}-v000'.format(
        app=self.TEST_APP, stack=bindings['TEST_STACK'])

    payload = self.agent.make_json_payload_from_kwargs(
        job=[{
            'cloudProvider': 'kubernetes',
            'application': self.TEST_APP,
            'account': bindings['KUBE_CREDENTIALS'],
            'strategy':'',
            'targetSize': 2,
            'containers': [{
                'name': 'librarynginx',
                'imageDescription': {
                    'repository': 'library/nginx',
                    'tag': 'stable',
                    'imageId': 'index.docker.io/library/nginx:stable',
                    'registry': 'index.docker.io'
                },
                'requests': {'memory':None, 'cpu':None},
                'limits': {'memory':None, 'cpu':None},
                'ports':[{'name':'http', 'containerPort':80,
                          'protocol':'TCP', 'hostPort':None, 'hostIp':None}]
            }],
            'stack': bindings['TEST_STACK'],
            # TODO(ewiseblatt): 20160316
            # We cannot create a load balancer yet, so test without one.
            # 'loadBalancers': [self.__lb_name],
            'type': 'createServerGroup',
            'region': 'default',
            'user': '******'
        }],
        description='Create Server Group in ' + group_name,
        application=self.TEST_APP)

    builder = kube.KubeContractBuilder(self.kube_observer)
    (builder.new_clause_builder('Managed Instance Group Added',
                                retryable_for_secs=15)
     .get_resources('rc', extra_args=[group_name])
     .contains_path_eq('spec/replicas', 2))

    return st.OperationContract(
        self.new_post_operation(
            title='create_server_group', data=payload, path='tasks'),
        contract=builder.build())
示例#12
0
    def deploy_deployment_with_config_map(self, versioned):
        """Creates OperationContract for deploying a configmap along with a deployment
        mounting this configmap.

        To verify the operation, we just check that the deployment was created with
        the correct configmap mounted
        """
        deployment_name = self.TEST_APP + "-deployment"
        deployment = self.mf.deployment(deployment_name, "library/nginx")
        configmap_name = self.TEST_APP + "-configmap"
        configmap = self.mf.config_map(configmap_name, {"key": "value"})

        if not versioned:
            configmap["metadata"]["annotations"] = {
                "strategy.spinnaker.io/versioned": "false"
            }

        self.mf.add_configmap_volume(deployment, configmap_name)

        payload = self.agent.make_json_payload_from_kwargs(
            job=[
                {
                    "cloudProvider": "kubernetes",
                    "moniker": {"app": self.TEST_APP},
                    "account": self.bindings["SPINNAKER_KUBERNETES_V2_ACCOUNT"],
                    "source": "text",
                    "type": "deployManifest",
                    "user": "******",
                    "manifests": [deployment, configmap],
                }
            ],
            description="Deploy manifest",
            application=self.TEST_APP,
        )

        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (
            builder.new_clause_builder("Deployment created", retryable_for_secs=15)
            .get_resources(
                "deploy",
                extra_args=[deployment_name, "--namespace", self.TEST_NAMESPACE],
            )
            .EXPECT(self.mp.deployment_configmap_mounted_predicate(configmap_name))
        )

        return st.OperationContract(
            self.new_post_operation(
                title="deploy_manifest", data=payload, path="tasks"
            ),
            contract=builder.build(),
        )
  def patch_manifest(self):
    """Creates OperationContract for patchManifest.

    To verify the operation, we just check that the deployment was created.
    """
    bindings = self.bindings
    name = self.TEST_APP + '-deployment'
    test_label = 'patchedLabel'
    payload = self.agent.make_json_payload_from_kwargs(
        job=[{
          'account': bindings['SPINNAKER_KUBERNETES_V2_ACCOUNT'],
          'cloudProvider': 'kubernetes',
          'kind': 'deployment',
          'location': self.TEST_NAMESPACE,
          'manifestName': 'deployment ' + name,
          'type': 'patchManifest',
          'user': '******',
          'source': 'text',
          'patchBody': {
            'metadata': {
              'labels': {
                'testLabel': test_label,
              }
            }
          },
          'options': {
            'mergeStrategy': 'strategic',
            'record': True
          }
        }],
        description='Patch manifest',
        application=self.TEST_APP)

    builder = kube.KubeContractBuilder(self.kube_v2_observer)
    (builder.new_clause_builder('Deployment patched',
                                retryable_for_secs=15)
     .get_resources(
        'deploy',
        extra_args=[name, '--namespace', self.TEST_NAMESPACE])
     .EXPECT(ov_factory.value_list_contains(jp.DICT_MATCHES({
      'metadata': jp.DICT_MATCHES({
        'labels': jp.DICT_MATCHES({
          'testLabel': jp.STR_EQ(test_label)
        })
      })
    }))))

    return st.OperationContract(
        self.new_post_operation(
            title='patch_manifest', data=payload, path='tasks'),
        contract=builder.build())
示例#14
0
    def upsert_load_balancer(self):
        """Creates OperationContract for upsertLoadBalancer.

    Calls Spinnaker's upsertLoadBalancer with a configuration, then verifies
    that the expected resources and configurations are visible on Kubernetes.
    See the contract builder for more info on what the expectations are.
    """
        bindings = self.bindings
        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                'cloudProvider': 'kubernetes',
                'availabilityZones': {
                    self.TEST_NAMESPACE: [self.TEST_NAMESPACE]
                },
                'provider': 'kubernetes',
                'stack': bindings['TEST_STACK'],
                'detail': self.__lb_detail,
                'serviceType': 'ClusterIP',
                'account': bindings['SPINNAKER_KUBERNETES_ACCOUNT'],
                'namespace': self.TEST_NAMESPACE,
                'ports': [{
                    'protocol': 'TCP',
                    'port': 80,
                    'name': 'http'
                }],
                'externalIps': [],
                'sessionAffinity': 'None',
                'clusterIp': '',
                'loadBalancerIp': '',
                'name': self.__lb_name,
                'healthCheck': ':undefined',  # deck has this leading ':'
                'type': 'upsertLoadBalancer',
                'securityGroups': None,
                'user': '******'
            }],
            description='Create Load Balancer: ' + self.__lb_name,
            application=self.TEST_APP)

        builder = kube.KubeContractBuilder(self.kube_observer)
        (builder.new_clause_builder(
            'Service Added', retryable_for_secs=15).get_resources(
                'svc',
                extra_args=['--namespace', self.TEST_NAMESPACE
                            ]).contains_path_value('items/metadata/name',
                                                   self.__lb_name))

        return st.OperationContract(self.new_post_operation(
            title='upsert_load_balancer', data=payload, path='tasks'),
                                    contract=builder.build())
示例#15
0
    def deploy_spel_deployment_from_gcs(self, image):
        """Creates OperationContract for deploying and substituting one image into
        a Deployment object using a SpEL expression.

        To verify the operation, we just check that the deployment was created with
        the correct image.
        """
        bindings = self.bindings
        name = self.TEST_APP + "-deployment"
        manifest = self.mf.deployment(name, "${image}")
        manifest_artifact = self.__gcs_manifest_expected_artifact(
            json.dumps(manifest), "manifest-spel.yaml"
        )
        payload = self.agent.make_json_payload_from_kwargs(
            job=[
                {
                    "cloudProvider": "kubernetes",
                    "moniker": {"app": self.TEST_APP},
                    "account": bindings["SPINNAKER_KUBERNETES_V2_ACCOUNT"],
                    "source": "artifact",
                    "type": "deployManifest",
                    "user": "******",
                    "image": image,
                    "manifestArtifactAccount": self.ARTIFACT_ACCOUNT,
                    "manifestArtifactId": manifest_artifact["id"],
                    "resolvedExpectedArtifacts": [manifest_artifact],
                }
            ],
            description="Deploy manifest",
            application=self.TEST_APP,
        )

        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (
            builder.new_clause_builder("Deployment created", retryable_for_secs=15)
            .get_resources(
                "deploy", extra_args=[name, "--namespace", self.TEST_NAMESPACE]
            )
            .EXPECT(self.mp.deployment_image_predicate(image))
        )

        return st.OperationContract(
            self.new_post_operation(
                title="deploy_manifest", data=payload, path="tasks"
            ),
            contract=builder.build(),
        )
示例#16
0
    def deploy_deployment_with_config_map(self, versioned):
        """Creates OperationContract for deploying a configmap along with a deployment
    mounting this configmap.

    To verify the operation, we just check that the deployment was created with
    the correct configmap mounted
    """
        deployment_name = self.TEST_APP + '-deployment'
        deployment = self.mf.deployment(deployment_name, 'library/nginx')
        configmap_name = self.TEST_APP + '-configmap'
        configmap = self.mf.config_map(configmap_name, {'key': 'value'})

        if not versioned:
            configmap['metadata']['annotations'] = {
                'strategy.spinnaker.io/versioned': 'false'
            }

        self.mf.add_configmap_volume(deployment, configmap_name)

        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                'cloudProvider': 'kubernetes',
                'moniker': {
                    'app': self.TEST_APP
                },
                'account': self.bindings['SPINNAKER_KUBERNETES_V2_ACCOUNT'],
                'source': 'text',
                'type': 'deployManifest',
                'user': '******',
                'manifests': [deployment, configmap],
            }],
            description='Deploy manifest',
            application=self.TEST_APP)

        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (builder.new_clause_builder(
            'Deployment created', retryable_for_secs=15).get_resources(
                'deploy',
                extra_args=[
                    deployment_name, '--namespace', self.TEST_NAMESPACE
                ]).EXPECT(
                    self.mp.deployment_configmap_mounted_predicate(
                        configmap_name)))

        return st.OperationContract(self.new_post_operation(
            title='deploy_manifest', data=payload, path='tasks'),
                                    contract=builder.build())
示例#17
0
    def delete_kind(self, kind, version=None):
        """Creates OperationContract for deleteManifest

        To verify the operation, we just check that the Kubernetes deployment
        is no longer visible (or is in the process of terminating).
        """
        bindings = self.bindings
        name = self.TEST_APP + "-" + kind
        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                "cloudProvider": "kubernetes",
                "type": "deleteManifest",
                "account": bindings["SPINNAKER_KUBERNETES_V2_ACCOUNT"],
                "user": "******",
                "kinds": [kind],
                "location": self.TEST_NAMESPACE,
                "options": {},
                "labelSelectors": {
                    "selectors": [{
                        "kind": "EQUALS",
                        "key": "app",
                        "values": [self.TEST_APP]
                    }]
                },
            }],
            application=self.TEST_APP,
            description="Destroy Manifest",
        )

        if version is not None:
            name = name + "-" + version

        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (builder.new_clause_builder("Manifest Removed").get_resources(
            kind,
            extra_args=[name, "--namespace", self.TEST_NAMESPACE
                        ]).EXPECT(self.mp.not_found_observation_predicate()))

        return st.OperationContract(
            self.new_post_operation(title="delete_kind",
                                    data=payload,
                                    path="tasks"),
            contract=builder.build(),
        )
示例#18
0
    def deploy_deployment_with_docker_artifact(self, image):
        """Creates OperationContract for deploying and substituting one image into
        a Deployment object

        To verify the operation, we just check that the deployment was created with
        the correct image.
        """
        bindings = self.bindings
        name = self.TEST_APP + "-deployment"
        image_name = "placeholder"
        docker_artifact = self.__docker_image_artifact(image_name, image)
        payload = self.agent.make_json_payload_from_kwargs(
            job=[
                {
                    "cloudProvider": "kubernetes",
                    "moniker": {"app": self.TEST_APP},
                    "account": bindings["SPINNAKER_KUBERNETES_V2_ACCOUNT"],
                    "source": "text",
                    "type": "deployManifest",
                    "user": "******",
                    "manifests": [self.mf.deployment(name, image_name)],
                    "artifacts": [docker_artifact],
                }
            ],
            description="Deploy manifest",
            application=self.TEST_APP,
        )

        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (
            builder.new_clause_builder("Deployment created", retryable_for_secs=15)
            .get_resources(
                "deploy", extra_args=[name, "--namespace", self.TEST_NAMESPACE]
            )
            .EXPECT(self.mp.deployment_image_predicate(image))
        )

        return st.OperationContract(
            self.new_post_operation(
                title="deploy_manifest", data=payload, path="tasks"
            ),
            contract=builder.build(),
        )
示例#19
0
    def deploy_unversioned_config_map(self, value):
        """Creates OperationContract for deploying an unversioned configmap

        To verify the operation, we just check that the configmap was created with
        the correct 'value'.
        """
        name = self.TEST_APP + "-configmap"
        manifest = self.mf.config_map(name, {"value": value})
        manifest["metadata"]["annotations"] = {
            "strategy.spinnaker.io/versioned": "false"
        }

        payload = self.agent.make_json_payload_from_kwargs(
            job=[
                {
                    "cloudProvider": "kubernetes",
                    "moniker": {"app": self.TEST_APP},
                    "account": self.bindings["SPINNAKER_KUBERNETES_V2_ACCOUNT"],
                    "source": "text",
                    "type": "deployManifest",
                    "user": "******",
                    "manifests": [manifest],
                }
            ],
            description="Deploy manifest",
            application=self.TEST_APP,
        )

        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (
            builder.new_clause_builder("ConfigMap created", retryable_for_secs=15)
            .get_resources(
                "configmap", extra_args=[name, "--namespace", self.TEST_NAMESPACE]
            )
            .EXPECT(self.mp.config_map_key_value_predicate("value", value))
        )

        return st.OperationContract(
            self.new_post_operation(
                title="deploy_manifest", data=payload, path="tasks"
            ),
            contract=builder.build(),
        )
示例#20
0
  def delete_kind(self, kind, version=None):
    """Creates OperationContract for deleteManifest

    To verify the operation, we just check that the Kubernetes deployment
    is no longer visible (or is in the process of terminating).
    """
    bindings = self.bindings
    name = self.TEST_APP + '-' + kind
    payload = self.agent.make_json_payload_from_kwargs(
        job=[{
            'cloudProvider': 'kubernetes',
            'type': 'deleteManifest',
            'account': bindings['SPINNAKER_KUBERNETES_V2_ACCOUNT'],
            'user': '******',
            'kinds': [ kind ],
            'location': self.TEST_NAMESPACE,
            'options': { },
            'labelSelectors': {
                'selectors': [{
                    'kind': 'EQUALS',
                    'key': 'app',
                    'values': [ self.TEST_APP ]
                }]
            }
        }],
        application=self.TEST_APP,
        description='Destroy Manifest')

    if version is not None:
      name = name + '-' + version

    builder = kube.KubeContractBuilder(self.kube_v2_observer)
    (builder.new_clause_builder('Manifest Removed')
     .get_resources(
         kind,
         extra_args=[name, '--namespace', self.TEST_NAMESPACE])
     .EXPECT(self.mp.not_found_observation_predicate()))

    return st.OperationContract(
        self.new_post_operation(
            title='delete_kind', data=payload, path='tasks'),
        contract=builder.build())
示例#21
0
    def delete_server_group(self, version='v000'):
        """Creates OperationContract for deleteServerGroup.

    To verify the operation, we just check that the Kubernetes container
    is no longer visible (or is in the process of terminating).
    """
        bindings = self.bindings
        group_name = frigga.Naming.server_group(app=self.TEST_APP,
                                                stack=bindings['TEST_STACK'],
                                                version=version)

        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                'cloudProvider': 'kubernetes',
                'type': 'destroyServerGroup',
                'account': bindings['SPINNAKER_KUBERNETES_ACCOUNT'],
                'credentials': bindings['SPINNAKER_KUBERNETES_ACCOUNT'],
                'user': '******',
                'serverGroupName': group_name,
                'asgName': group_name,
                'regions': [self.TEST_NAMESPACE],
                'namespace': self.TEST_NAMESPACE,
                'region': self.TEST_NAMESPACE,
                'zones': [self.TEST_NAMESPACE],
                'interestingHealthProviderNames': ['KubernetesService']
            }],
            application=self.TEST_APP,
            description='Destroy Server Group: ' + group_name)

        builder = kube.KubeContractBuilder(self.kube_observer)
        (builder.new_clause_builder('Replica Set Removed').get_resources(
            'rs',
            extra_args=[group_name, '--namespace',
                        self.TEST_NAMESPACE]).EXPECT(
                            ov_factory.value_list_path_contains(
                                'targetSize', jp.NUM_EQ(0))).OR(
                                    self.__not_found_observation_predicate()))

        return st.OperationContract(self.new_post_operation(
            title='delete_server_group', data=payload, path='tasks'),
                                    contract=builder.build())
示例#22
0
  def deploy_spel_deployment_from_gcs(self, image):
    """Creates OperationContract for deploying and substituting one image into
    a Deployment object using a SpEL expression.

    To verify the operation, we just check that the deployment was created with
    the correct image.
    """
    bindings = self.bindings
    name = self.TEST_APP + '-deployment'
    manifest = self.mf.deployment(name, '${image}')
    manifest_artifact = self.__gcs_manifest_expected_artifact(json.dumps(manifest), 'manifest-spel.yaml')
    payload = self.agent.make_json_payload_from_kwargs(
        job=[{
            'cloudProvider': 'kubernetes',
            'moniker': {
                'app': self.TEST_APP
            },
            'account': bindings['SPINNAKER_KUBERNETES_V2_ACCOUNT'],
            'source': 'artifact',
            'type': 'deployManifest',
            'user': '******',
            'image': image,
            'manifestArtifactAccount': self.ARTIFACT_ACCOUNT,
            'manifestArtifactId': manifest_artifact['id'],
            'resolvedExpectedArtifacts': [manifest_artifact]
        }],
        description='Deploy manifest',
        application=self.TEST_APP)

    builder = kube.KubeContractBuilder(self.kube_v2_observer)
    (builder.new_clause_builder('Deployment created',
                                retryable_for_secs=15)
     .get_resources(
         'deploy',
         extra_args=[name, '--namespace', self.TEST_NAMESPACE])
     .EXPECT(self.mp.deployment_image_predicate(image)))

    return st.OperationContract(
        self.new_post_operation(
            title='deploy_manifest', data=payload, path='tasks'),
        contract=builder.build())
 def create_daemonset_pipeline(self):
     bindings = self.bindings
     payload = self.agent.make_json_payload_from_kwargs(
         job=[{
             'type': 'manual',
             'user': '******'
         }],
         description='Create Daemonset in Application' + self.TEST_APP,
         application=self.TEST_APP)
     builder = kube.KubeContractBuilder(self.kube_observer)
     (builder.new_clause_builder('Daemonset Added', retryable_for_secs=15)
      .get_resources(
         'daemonsets', extra_args=[self.TEST_APP + self.POSTFIX_STATEFUL_DAEMONSET,
                       '--namespace', self.TEST_NAMESPACE])
      .contains_path_value('kind', 'DaemonSet'))
     return st.OperationContract(
         self.new_post_operation(
             title='Create_daemonset', data=payload,
             path='pipelines/' + self.TEST_APP + '/daemonset-pipeline',
             status_class=st.SynchronousHttpOperationStatus),
         contract=builder.build())
示例#24
0
  def deploy_deployment_with_docker_artifact(self, image):
    """Creates OperationContract for deploying and substituting one image into
    a Deployment object

    To verify the operation, we just check that the deployment was created with
    the correct image.
    """
    bindings = self.bindings
    name = self.TEST_APP + '-deployment'
    image_name = 'placeholder'
    docker_artifact = self.__docker_image_artifact(image_name, image)
    payload = self.agent.make_json_payload_from_kwargs(
        job=[{
            'cloudProvider': 'kubernetes',
            'moniker': {
                'app': self.TEST_APP
            },
            'account': bindings['SPINNAKER_KUBERNETES_V2_ACCOUNT'],
            'source': 'text',
            'type': 'deployManifest',
            'user': '******',
            'manifests': [self.mf.deployment(name, image_name)],
            'artifacts': [docker_artifact]
        }],
        description='Deploy manifest',
        application=self.TEST_APP)

    builder = kube.KubeContractBuilder(self.kube_v2_observer)
    (builder.new_clause_builder('Deployment created',
                                retryable_for_secs=15)
     .get_resources(
         'deploy',
         extra_args=[name, '--namespace', self.TEST_NAMESPACE])
     .EXPECT(self.mp.deployment_image_predicate(image)))

    return st.OperationContract(
        self.new_post_operation(
            title='deploy_manifest', data=payload, path='tasks'),
        contract=builder.build())
示例#25
0
    def execute_deploy_manifest_pipeline(self, image):
        name = self.TEST_APP + '-deployment'
        bindings = self.bindings
        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                'type': 'manual',
                'user': '******'
            }],
            description='Deploy manifest in ' + self.TEST_APP,
            application=self.TEST_APP)
        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (builder.new_clause_builder(
            'Deployment deployed', retryable_for_secs=15).get_resources(
                'deploy',
                extra_args=[name, '--namespace', self.TEST_NAMESPACE]).EXPECT(
                    self.mp.deployment_image_predicate(image)))

        return st.OperationContract(self.new_post_operation(
            title='Deploy manifest',
            data=payload,
            path='pipelines/' + self.TEST_APP + '/deploy-manifest-pipeline',
            status_class=st.SynchronousHttpOperationStatus),
                                    contract=builder.build())
示例#26
0
    def delete_server_group(self, version='v000'):
        """Creates OperationContract for deleteServerGroup.

    To verify the operation, we just check that the Kubernetes container
    is no longer visible (or is in the process of terminating).
    """
        bindings = self.bindings
        group_name = frigga.Naming.server_group(app=self.TEST_APP,
                                                stack=bindings['TEST_STACK'],
                                                version=version)

        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                'cloudProvider': 'kubernetes',
                'type': 'destroyServerGroup',
                'account': bindings['KUBE_CREDENTIALS'],
                'credentials': bindings['KUBE_CREDENTIALS'],
                'user': '******',
                'serverGroupName': group_name,
                'asgName': group_name,
                'regions': ['default'],
                'region': 'default',
                'zones': ['default'],
                'interestingHealthProviderNames': ['KubernetesService']
            }],
            application=self.TEST_APP,
            description='Destroy Server Group: ' + group_name)

        builder = kube.KubeContractBuilder(self.kube_observer)
        (builder.new_clause_builder(
            'Replication Controller Removed').get_resources(
                'rc', extra_args=[group_name],
                no_resource_ok=True).contains_path_eq('targetSize', 0))

        return st.OperationContract(self.new_post_operation(
            title='delete_server_group', data=payload, path='tasks'),
                                    contract=builder.build())
示例#27
0
    def deploy_service(self):
        """Creates an OperationContract for deploying a service object

        To verify the operation, we just check that the service was created.
        """
        name = self.TEST_APP + "-service"
        account = self.bindings["SPINNAKER_KUBERNETES_V2_ACCOUNT"]
        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                "cloudProvider": "kubernetes",
                "moniker": {
                    "app": self.TEST_APP
                },
                "account": account,
                "source": "text",
                "type": "deployManifest",
                "user": "******",
                "manifests": [self.mf.service(name)],
            }],
            description="Deploy manifest",
            application=self.TEST_APP,
        )

        builder = kube.KubeContractBuilder(self.kube_v2_observer)
        (builder.new_clause_builder(
            "Service created", retryable_for_secs=15).get_resources(
                "service",
                extra_args=[name, "--namespace", self.TEST_NAMESPACE]).EXPECT(
                    self.mp.service_selector_predicate("app", self.TEST_APP)))

        return st.OperationContract(
            self.new_post_operation(title="deploy_manifest",
                                    data=payload,
                                    path="tasks"),
            contract=builder.build(),
        )
示例#28
0
    def create_server_group(self):
        """Creates OperationContract for createServerGroup.

    To verify the operation, we just check that the server group was created.
    """
        bindings = self.bindings

        # Spinnaker determines the group name created,
        # which will be the following:
        group_name = frigga.Naming.server_group(app=self.TEST_APP,
                                                stack=bindings['TEST_STACK'],
                                                version='v000')

        payload = self.agent.make_json_payload_from_kwargs(
            job=[{
                'cloudProvider':
                'kubernetes',
                'application':
                self.TEST_APP,
                'account':
                bindings['SPINNAKER_KUBERNETES_ACCOUNT'],
                'strategy':
                '',
                'targetSize':
                1,
                'containers': [{
                    'name':
                    'validated',
                    'imageDescription': {
                        'repository': self.__image_repository,
                        'tag': self.__desired_image_tag,
                        'imageId': self.__desired_image_id,
                        'registry': self.__image_registry
                    },
                    'requests': {
                        'memory': None,
                        'cpu': None
                    },
                    'limits': {
                        'memory': None,
                        'cpu': None
                    },
                    'ports': [{
                        'name': 'http',
                        'containerPort': 80,
                        'protocol': 'TCP',
                        'hostPort': None,
                        'hostIp': None
                    }]
                },
                               {
                                   'name':
                                   'broken',
                                   'imageDescription': {
                                       'repository': self.__image_repository,
                                       'tag': self.__undesired_image_tag,
                                       'imageId': self.__undesired_image_id,
                                       'registry': self.__image_registry
                                   },
                                   'requests': {
                                       'memory': None,
                                       'cpu': None
                                   },
                                   'limits': {
                                       'memory': None,
                                       'cpu': None
                                   },
                                   'ports': [{
                                       'name': 'http',
                                       'containerPort': 80,
                                       'protocol': 'TCP',
                                       'hostPort': None,
                                       'hostIp': None
                                   }]
                               }],
                'stack':
                bindings['TEST_STACK'],
                'loadBalancers': [self.__lb_name],
                'type':
                'createServerGroup',
                'region':
                'default',
                'user':
                '******'
            }],
            description='Create Server Group in ' + group_name,
            application=self.TEST_APP)

        builder = kube.KubeContractBuilder(self.kube_observer)
        (builder.new_clause_builder(
            'Replica Set Added', retryable_for_secs=15).get_resources(
                'rs',
                extra_args=[group_name]).contains_path_eq('spec/replicas', 1))

        return st.OperationContract(self.new_post_operation(
            title='create_server_group', data=payload, path='tasks'),
                                    contract=builder.build())