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"
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
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
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
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