def test_kubernetes_resource_is_sas_resource_false(
        non_sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.is_sas_resource() returns the correct value for a non-SAS resource.

    :param non_sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object for testing.
    """
    assert non_sas_kubernetes_resource_obj.is_sas_resource() is False
def test_kubernetes_resource_get_metadata_value_missing(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_kind() returns None for an undefined metadata key.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get_metadata_value("foo") is None
def test_kubernetes_resource_get_label_missing(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_label() returns None for an undefined label on a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get_label("foo") is None
def test_kubernetes_resource_is_sas_resource_true(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.is_sas_resource() returns the correct value for a SAS resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.is_sas_resource() is True
def test_kubernetes_resource_get_resource_version(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_resource_version() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get_resource_version() == "17399617"
def test_kubernetes_resource_get_sas_version_non_sas_component(non_sas_kubernetes_resource_obj: KubernetesResource) \
        -> None:
    """
    This test verifies that KubernetesResource.get_kind() returns None for a defined non-SAS resource.

    :param non_sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object for testing.
    """
    assert non_sas_kubernetes_resource_obj.get_sas_version() is None
def test_kubernetes_resource_get_spec_value(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_spec_value() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get_spec_value("replicas") == 1
def sas_kubernetes_resource_obj() -> KubernetesResource:
    """
    This pytest fixture loads a KubernetesResource object representing a SAS resource as it might be returned from
    kubectl. With the "module" scope, this is only run once before the tests defined in this file are executed.

    :return: A KubernetesResource object loaded with a SAS resource for testing.
    """
    sas_resource_dict: Dict = load_test_data(_SAS_RESOURCE_TEST_DATA_)
    return KubernetesResource(sas_resource_dict)
def test_kubernetes_resource_get_self_link(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_self_link() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get_self_link(
    ) == "/apis/apps/v1/namespaces/test/deployments/sas-annotations"
Exemple #10
0
    def get_resource(self, k8s_api_resource: Text, resource_name: Text, raw: bool = False, ignore_errors: bool = False)\
            -> Union[AnyStr, KubernetesResource]:
        # if the resource name is None, raise a CalledProcessError
        if k8s_api_resource is None:
            raise CalledProcessError(
                1, f"kubectl get {k8s_api_resource} {resource_name} -o json")

        # raise a CalledProcessError if an unexpected namespace is given
        if self.namespace != self.Values.NAMESPACE:
            raise CalledProcessError(
                1,
                f"kubectl get -n {self.namespace} {k8s_api_resource.lower()} {resource_name} "
                "-o json")

        # throw an error if simulating an empty deployment
        if self.simulate_empty_deployment:
            raise CalledProcessError(
                1,
                f"kubectl get -n {self.namespace} {k8s_api_resource.lower()} {resource_name} "
                "-o json")

        # handle any ingress simulation
        # in the scenarios below, the kinds would be defined but no objects of that kind would be created, so trying
        # to get one by name would raise a CalledProcessError
        if (self.ingress_simulator == self.IngressSimulator.BOTH_RESOURCES_NGINX_USED and k8s_api_resource.lower() ==
            "virtualservices") or \
            (self.ingress_simulator == self.IngressSimulator.BOTH_RESOURCES_ISTIO_USED and k8s_api_resource.lower() ==
             "ingresses"):
            raise CalledProcessError(
                1,
                f"kubectl get {k8s_api_resource.lower()} {resource_name} -o json"
            )

        # handle non-namespaced resources
        if not self.include_non_namespaced_resources and (
                k8s_api_resource.lower() == "nodes"
                or k8s_api_resource.lower() == "namespaces"):
            raise CalledProcessError(
                1,
                f"kubectl get {k8s_api_resource.lower()} {resource_name} -o json"
            )

        # if the resource should not be represented as unavailable, load it from the file
        raw_resources_dict: Dict = KubectlTest._load_response_data(
            f"resources_{k8s_api_resource.lower()}.json")

        # iterate to find the requested resource
        for raw_resource in raw_resources_dict:
            resource: KubernetesResource = KubernetesResource(raw_resource)

            if resource.get_name() == resource_name:
                return resource

        # if the resource isn't found by name, raise a CalledProcessError
        raise CalledProcessError(
            1,
            f"kubectl get {k8s_api_resource.lower()} {resource_name} -o json")
def test_kubernetes_resource_get_uid(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_uid() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get_uid(
    ) == "ec191de7-44db-46d5-b3b8-5b7af4141a58"
def test_kubernetes_resource_get_label(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_label() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get_label(
        "sas.com/admin") == "namespace"
def test_kubernetes_resource_get_kind(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_kind() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get_kind(
    ) == KubernetesResource.Kinds.DEPLOYMENT
def test_kubernetes_resource_get_metadata_value(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_metadata_value() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get_metadata_value(
        KubernetesResource.Keys.NAME) == "sas-annotations"
def test_kubernetes_resource_get_creation_timestamp(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_creation_timestamp() returns the correct value for a defined
    resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get_creation_timestamp(
    ) == "2020-04-21T12:47:03Z"
def test_kubernetes_resource_get_sas_component_version(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_sas_component_version() returns the correct value for a defined SAS
    resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get_sas_component_version(
    ) == "2.2.20-20200420.1587366873499"
def test_kubernetes_resource_get_sas_component_name(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_sas_component_name() returns the correct value for a defined SAS
    resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get_sas_component_name(
    ) == "sas-annotations"
def test_kubernetes_resource_as_dict(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.as_dict() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    # convert the object
    converted_resource: Dict = sas_kubernetes_resource_obj.as_dict()

    # make sure it's the expected type
    assert isinstance(converted_resource, dict)
def test_kubernetes_resource_get(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get() returns the correct dictionary for a defined key. This tests the
    overridden __get__() method for the MutableMapping implementation.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    assert sas_kubernetes_resource_obj.get(
        KubernetesResource.Keys.KIND) == KubernetesResource.Kinds.DEPLOYMENT
    assert sas_kubernetes_resource_obj[
        KubernetesResource.Keys.KIND] == KubernetesResource.Kinds.DEPLOYMENT
def test_kubernetes_resource_get_status(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_status() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    # get the status dict
    status: Dict = sas_kubernetes_resource_obj.get_status()

    # make sure it's the expected length
    assert len(status) == 5

    # spot check for an expected status key
    assert "observedGeneration" in status
def test_kubernetes_resource_get_annotations(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_annotations() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    # get the annotations dict
    annotations: Dict = sas_kubernetes_resource_obj.get_annotations()

    # make sure it's the right size
    assert len(annotations) == 12

    # spot check than an expected annotation is defined
    assert KubernetesResource.Keys.ANNOTATION_COMPONENT_NAME in annotations
def test_kubernetes_resource_get_labels(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_labels() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    # get the labels dict
    labels: Dict = sas_kubernetes_resource_obj.get_labels()

    # make sure it's the expected length
    assert len(labels) == 4

    # spot check that it contains an expected label
    assert "sas.com/admin" in labels
Exemple #23
0
    def get_resource(
            self,
            k8s_api_resource: Text,
            resource_name: Text,
            raw: bool = False,
            ignore_errors: bool = False) -> Union[AnyStr, KubernetesResource]:
        # get the resource definition as a JSON str #
        resource_json: AnyStr = self.do(
            f"get {k8s_api_resource} {resource_name} -o json", ignore_errors)

        # return the raw response, if requested #
        if raw:
            return resource_json

        return KubernetesResource(resource_json.decode())
def test_kubernetes_resource_get_spec(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_spec() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    # get the spec dict
    spec: Dict = sas_kubernetes_resource_obj.get_spec()

    # make sure it's the right length
    assert len(spec) == 6

    # spot check for an expected key
    assert "progressDeadlineSeconds" in spec
Exemple #25
0
    def get_resources(
            self,
            k8s_api_resource: Text,
            raw: bool = False) -> Union[Dict, List[KubernetesResource]]:
        # if the resource name is None, raise a CalledProcessError
        if k8s_api_resource is None:
            raise CalledProcessError(
                1, f"kubectl get {k8s_api_resource} -o json")

        # if the expected namespace isn't set, raise a CalledProcessError
        if self.namespace != self.Values.NAMESPACE:
            raise CalledProcessError(
                1,
                f"kubectl -n {self.namespace} get {k8s_api_resource.lower()} -o json"
            )

        # return an empty list if simulating an empty deployment
        if self.simulate_empty_deployment:
            return list()

        # handle any ingress simulation
        # in the scenarios below, the resources would be defined but there wouldn't be any existing objects
        # so empty lists would be returned
        if (self.ingress_simulator == self.IngressSimulator.BOTH_RESOURCES_NGINX_USED and k8s_api_resource.lower() ==
            "virtualservices") or \
            (self.ingress_simulator == self.IngressSimulator.BOTH_RESOURCES_ISTIO_USED and k8s_api_resource.lower() ==
             "ingresses"):
            return list()

        # handle non-namespaced resources
        if not self.include_non_namespaced_resources and (
                k8s_api_resource.lower() == "nodes"
                or k8s_api_resource.lower() == "namespaces"):
            raise CalledProcessError(
                1, f"kubectl get {k8s_api_resource.lower()} -o json")

        # if the resource should not be represented as unavailable, load the response from the file
        resources_dict: Dict = KubectlTest._load_response_data(
            f"resources_{k8s_api_resource.lower()}.json")

        # convert the raw JSON to KubernetesResource objects
        resources: List[KubernetesResource] = list()
        for resource in resources_dict:
            resources.append(KubernetesResource(resource))

        return resources
def test_write_log_container_status_none() -> None:
    """
    This test verifies that an error is not raised when the _write_log() method is passed a pod with no
    container_status dictionary.
    """
    current_dir = os.path.dirname(os.path.abspath(__file__))
    poddata = os.path.join(current_dir, f"data{os.sep}pod_with_no_status.txt")

    with open(poddata) as f:
        pod_definition = f.read()

    # create the Kubernetes resource object
    pod: KubernetesResource = KubernetesResource(pod_definition)

    err_info = PodLogDownloader._write_log(
        kubectl=KubectlTest(),
        pod=pod,
        tail=1,
        output_dir="./no_container_status_test")
    assert not err_info[0][0]
def test_kubernetes_resource_iter(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that the correct iterator is returned for the KubernetesResource object. This tests the
    overridden __iter__() method in the MutableMapping implementation.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    # iterate over the object and collect the key values
    keys: List = list()
    for key in sas_kubernetes_resource_obj.keys():
        keys.append(key)

    # make sure the expected keys were iterated over
    assert len(keys) == 5
    assert keys == [
        KubernetesResource.Keys.API_VERSION, KubernetesResource.Keys.KIND,
        KubernetesResource.Keys.METADATA, KubernetesResource.Keys.SPEC,
        KubernetesResource.Keys.STATUS
    ]
def test_kubernetes_resource_get_metadata(
        sas_kubernetes_resource_obj: KubernetesResource) -> None:
    """
    This test verifies that KubernetesResource.get_kind() returns the correct value for a defined resource.

    :param sas_kubernetes_resource_obj: The pre-loaded SAS KubernetesResource object fixture for testing.
    """
    # get the metadata dict
    metadata: Dict = sas_kubernetes_resource_obj.get_metadata()

    # make sure it's the right type, length, and has the expected keys
    assert isinstance(metadata, dict)
    assert len(metadata) == 9
    assert KubernetesResource.Keys.ANNOTATIONS in metadata
    assert KubernetesResource.Keys.CREATION_TIMESTAMP in metadata
    assert KubernetesResource.Keys.GENERATION in metadata
    assert KubernetesResource.Keys.LABELS in metadata
    assert KubernetesResource.Keys.NAME in metadata
    assert KubernetesResource.Keys.NAMESPACE in metadata
    assert KubernetesResource.Keys.RESOURCE_VERSION in metadata
    assert KubernetesResource.Keys.SELF_LINK in metadata
    assert KubernetesResource.Keys.UID in metadata
Exemple #29
0
    def get_resources(
            self,
            k8s_api_resource: Text,
            raw: bool = False) -> Union[Dict, List[KubernetesResource]]:
        # get the JSON representation of all requested kubernetes API resources #
        resource_json: AnyStr = self.do(f"get {k8s_api_resource} -o json")

        # return the raw response, if requested #
        if raw:
            return json.loads(resource_json.decode())

        # convert json into python native list #
        resources_list: List = json.loads(resource_json.decode()).get(
            KubernetesResource.Keys.ITEMS)

        # iterate all dictionary definitions in the list and create Resource objects #
        resources: List[KubernetesResource] = list()
        for resource_dict in resources_list:
            resources.append(KubernetesResource(resource_dict))

        # return the list of Resource objects #
        return resources
def test_kubernetes_resource_get_uid_incomplete() -> None:
    """
    This test verifies that KubernetesResource.get_uid() returns None for an undefined resource.
    """
    assert KubernetesResource(dict()).get_uid() is None