diff --git a/paasta_tools/cli/cmds/spark_run.py b/paasta_tools/cli/cmds/spark_run.py index 568cbd45ba..9638cd0467 100644 --- a/paasta_tools/cli/cmds/spark_run.py +++ b/paasta_tools/cli/cmds/spark_run.py @@ -1203,7 +1203,7 @@ def paasta_spark_run(args): document = POD_TEMPLATE.format( spark_pod_label=limit_size_with_hash(f"exec-{app_base_name}"), ) - parsed_pod_template = yaml.load(document) + parsed_pod_template = yaml.safe_load(document) with open(pod_template_path, "w") as f: yaml.dump(parsed_pod_template, f) diff --git a/paasta_tools/kubernetes_tools.py b/paasta_tools/kubernetes_tools.py index 9801f699bf..694025f1ac 100644 --- a/paasta_tools/kubernetes_tools.py +++ b/paasta_tools/kubernetes_tools.py @@ -48,6 +48,7 @@ from kubernetes.client import V1Affinity from kubernetes.client import V1AWSElasticBlockStoreVolumeSource from kubernetes.client import V1beta1CustomResourceDefinition +from kubernetes.client import V1beta1CustomResourceDefinitionList from kubernetes.client import V1beta1PodDisruptionBudget from kubernetes.client import V1beta1PodDisruptionBudgetSpec from kubernetes.client import V1Capabilities @@ -3859,27 +3860,32 @@ def mode_to_int(mode: Optional[Union[str, int]]) -> Optional[int]: def update_crds( - apiextensions: Union[ - kube_client.ApiextensionsV1Api, kube_client.ApiextensionsV1beta1Api - ], + kube_client: KubeClient, desired_crds: Collection[ Union[V1CustomResourceDefinition, V1beta1CustomResourceDefinition] ], - existing_crds: V1CustomResourceDefinitionList, + existing_crds: Union[ + V1CustomResourceDefinitionList, V1beta1CustomResourceDefinitionList + ], ) -> bool: - success = True for desired_crd in desired_crds: existing_crd = None for crd in existing_crds.items: if crd.metadata.name == desired_crd.metadata["name"]: existing_crd = crd break - try: + + if "apiextensions.k8s.io/v1beta1" == desired_crd.api_version: + apiextensions = kube_client.apiextensions_v1_beta1 + else: + apiextensions = kube_client.apiextensions + if existing_crd: desired_crd.metadata[ "resourceVersion" ] = existing_crd.metadata.resource_version + apiextensions.replace_custom_resource_definition( name=desired_crd.metadata["name"], body=desired_crd ) @@ -3901,9 +3907,9 @@ def update_crds( f"status: {exc.status}, reason: {exc.reason}" ) log.debug(exc.body) - success = False + return False - return success + return True def sanitise_label_value(value: str) -> str: diff --git a/paasta_tools/setup_kubernetes_crd.py b/paasta_tools/setup_kubernetes_crd.py index 932917c2b9..eabc667c06 100644 --- a/paasta_tools/setup_kubernetes_crd.py +++ b/paasta_tools/setup_kubernetes_crd.py @@ -29,6 +29,7 @@ import service_configuration_lib from kubernetes.client import V1beta1CustomResourceDefinition from kubernetes.client import V1CustomResourceDefinition +from kubernetes.client.exceptions import ApiException from paasta_tools.kubernetes_tools import KubeClient from paasta_tools.kubernetes_tools import paasta_prefixed @@ -101,29 +102,50 @@ def setup_kube_crd( services: Sequence[str], soa_dir: str = DEFAULT_SOA_DIR, ) -> bool: - for apiextension, crd_class in [ - (kube_client.apiextensions, V1CustomResourceDefinition), - (kube_client.apiextensions_v1_beta1, V1beta1CustomResourceDefinition), - ]: - existing_crds = apiextension.list_custom_resource_definition( - label_selector=paasta_prefixed("service") + existing_crds = kube_client.apiextensions.list_custom_resource_definition( + label_selector=paasta_prefixed("service") + ) + + # This step can fail in k8s 1.22 since this version is not existing anymore + # we need to support this for the transition + try: + existing_crds_v1_beta1 = ( + kube_client.apiextensions_v1_beta1.list_custom_resource_definition( + label_selector=paasta_prefixed("service") + ) + ) + except ApiException: + existing_crds_v1_beta1 = [] + log.debug( + "Listing CRDs with apiextensions/v1beta1 not supported on this cluster, falling back to v1" ) - desired_crds = [] - for service in services: - crd_config = service_configuration_lib.read_extra_service_information( - service, f"crd-{cluster}", soa_dir=soa_dir + desired_crds = [] + desired_crds_v1_beta1 = [] + for service in services: + crd_config = service_configuration_lib.read_extra_service_information( + service, f"crd-{cluster}", soa_dir=soa_dir + ) + if not crd_config: + log.info("nothing to deploy") + continue + + metadata = crd_config.get("metadata", {}) + if "labels" not in metadata: + metadata["labels"] = {} + metadata["labels"]["yelp.com/paasta_service"] = service + metadata["labels"][paasta_prefixed("service")] = service + + if "apiextensions.k8s.io/v1beta1" == crd_config["apiVersion"]: + desired_crd = V1beta1CustomResourceDefinition( + api_version=crd_config.get("apiVersion"), + kind=crd_config.get("kind"), + metadata=metadata, + spec=crd_config.get("spec"), ) - if not crd_config: - log.info("nothing to deploy") - continue - - metadata = crd_config.get("metadata", {}) - if "labels" not in metadata: - metadata["labels"] = {} - metadata["labels"]["yelp.com/paasta_service"] = service - metadata["labels"][paasta_prefixed("service")] = service - desired_crd = crd_class( + desired_crds_v1_beta1.append(desired_crd) + else: + desired_crd = V1CustomResourceDefinition( api_version=crd_config.get("apiVersion"), kind=crd_config.get("kind"), metadata=metadata, @@ -131,13 +153,15 @@ def setup_kube_crd( ) desired_crds.append(desired_crd) - if update_crds( - apiextensions=apiextension, - desired_crds=desired_crds, - existing_crds=existing_crds, - ): - return True - return False + return update_crds( + kube_client=kube_client, + desired_crds=desired_crds, + existing_crds=existing_crds, + ) and update_crds( + kube_client=kube_client, + desired_crds=desired_crds_v1_beta1, + existing_crds=existing_crds_v1_beta1, + ) if __name__ == "__main__": diff --git a/paasta_tools/setup_kubernetes_internal_crd.py b/paasta_tools/setup_kubernetes_internal_crd.py index 6e95874b48..ae84e08e5d 100755 --- a/paasta_tools/setup_kubernetes_internal_crd.py +++ b/paasta_tools/setup_kubernetes_internal_crd.py @@ -140,20 +140,14 @@ def main() -> None: def setup_kube_internal_crd( kube_client: KubeClient, ) -> bool: - for apiextension in [ - kube_client.apiextensions, - kube_client.apiextensions_v1_beta1, - ]: - existing_crds = apiextension.list_custom_resource_definition( - label_selector=paasta_prefixed("internal") - ) - if update_crds( - apiextensions=apiextension, - desired_crds=INTERNAL_CRDS, - existing_crds=existing_crds, - ): - return True - return False + existing_crds = kube_client.apiextensions.list_custom_resource_definition( + label_selector=paasta_prefixed("internal") + ) + return update_crds( + kube_client=kube_client, + desired_crds=INTERNAL_CRDS, + existing_crds=existing_crds, + ) if __name__ == "__main__":