def _delete_reservation(name, namespace, requester): def _err_handler(err): msg = f"reservation deletion failed: {str(err)}" _error(msg) try: res = get_reservation(name, namespace, requester) if res: _warn_before_delete() res_name = res["metadata"]["name"] log.info("deleting reservation '%s'", res_name) oc("delete", "reservation", res_name) log.info("reservation '%s' deleted", res_name) else: raise FatalError("Reservation lookup failed") except KeyboardInterrupt as err: log.error("aborted by keyboard interrupt!") _err_handler(err) except TimedOutError as err: log.error("hit timeout error: %s", err) _err_handler(err) except FatalError as err: log.error("hit fatal error: %s", err) _err_handler(err) except Exception as err: log.exception("hit unexpected error!") _err_handler(err)
def _import_secret(secret_name, secret_data): # get existing secret in the ns (if it exists) current_secret = get_json("secret", secret_name) or {} # avoid race conditions when running multiple processes by comparing the data if current_secret.get("data") != secret_data.get("data"): log.info("replacing secret '%s' using local copy", secret_name) # delete from dst ns so that applying 'null' values will work oc("delete", "--ignore-not-found", "secret", secret_name, _silent=True) oc("apply", "-f", "-", _silent=True, _in=json.dumps(secret_data))
def _create_conf_secret(namespace): env_parser = EnvParser(namespace) conf_data = _build_test_conf(env_parser) encoded_conf = base64.b64encode(yaml.dump(conf_data).encode()).decode() secret = { "apiVersion": "v1", "kind": "Secret", "metadata": {"name": SECRET_NAME}, "data": {"settings.local.yaml": encoded_conf,}, } oc("create", f="-", n=namespace, _in=json.dumps(secret))
def _create_pod(namespace, pod_name, env): pod = _get_base_pod_cfg() pod["metadata"]["name"] = pod_name env_vars = split_equals(env, allow_null=True) if env_vars: pod_env_vars = pod["spec"]["containers"][0]["env"] for key, val in env_vars.items(): if val: pod_env_vars.append({"name": key, "value": val}) oc("create", f="-", n=namespace, _in=json.dumps(pod))
def update(self): patch = [] if self._initialize_labels: # prevent 'The "" is invalid' error due to missing 'labels' path patch.append({ "op": "add", "path": "/metadata/labels", "value": {} }) patch.extend([ { "op": "replace", "path": f"/metadata/labels/{NS_RESERVED}", "value": str(self.reserved).lower(), }, { "op": "replace", "path": f"/metadata/labels/{NS_READY}", "value": str(self.ready).lower(), }, { "op": "replace", "path": f"/metadata/labels/{NS_REQUESTER}", "value": str(self.requester) if self.requester else None, }, { "op": "replace", "path": f"/metadata/labels/{NS_DURATION}", "value": str(self.duration) if self.duration else None, }, { "op": "replace", "path": f"/metadata/labels/{NS_EXPIRES}", # convert time format to one that can be used in a label "value": _fmt_time(self.expires), }, { "op": "replace", "path": f"/metadata/labels/{NS_REQUESTER_NAME}", "value": str(self.requester_name) if self.requester_name else None, }, ]) oc("patch", "namespace", self.name, type="json", p=json.dumps(patch))
def add_base_resources(namespace, secret_names): copy_namespace_secrets(conf.BASE_NAMESPACE_NAME, namespace, secret_names) with open(conf.EPHEMERAL_CLUSTER_CLOWDENV_TEMPLATE) as fp: template_data = yaml.safe_load(fp) processed_template = process_template( template_data, params={ "ENV_NAME": conf.ENV_NAME_FORMAT.format(namespace=namespace), "NAMESPACE": namespace, }, ) oc("apply", f="-", _in=json.dumps(processed_template)) # wait for any deployed base resources to become 'ready' wait_for_all_resources(namespace, timeout=conf.RECONCILE_TIMEOUT)
def _delete_resources(namespace): # installation of certain operators on the cluster may break 'oc delete all' # oc("delete", "all", "--all", n=namespace) # delete the ClowdApps in this namespace oc("delete", "clowdapp", "--all", n=namespace) # delete the ClowdEnvironment for this namespace if get_json("clowdenvironment", conf.ENV_NAME_FORMAT.format(namespace=namespace)): oc( "delete", "clowdenvironment", conf.ENV_NAME_FORMAT.format(namespace=namespace), ) # delete other specific resource types from the namespace resources_to_delete = [ "secret", "configmap", "pvc", "pod", "deployment", "deploymentconfig", "statefulset", "daemonset", "replicaset", "cronjob", "job", "service", "route", ] for resource in resources_to_delete: oc("delete", resource, "--all", n=namespace)
def _list_reservations(mine, requester): def _err_handler(err): msg = f"reservation listing failed: {str(err)}" _error(msg) try: if mine: try: requester = whoami() except Exception: log.info( "whoami returned an error - getting reservations for 'bonfire'" ) # minikube requester = "bonfire" oc("get", "reservation", "--selector", f"requester={requester}") else: if requester: oc("get", "reservation", "--selector", f"requester={requester}") else: oc("get", "reservation") except KeyboardInterrupt as err: log.error("aborted by keyboard interrupt!") _err_handler(err) except TimedOutError as err: log.error("hit timeout error: %s", err) _err_handler(err) except FatalError as err: log.error("hit fatal error: %s", err) _err_handler(err) except Exception as err: log.exception("hit unexpected error!") _err_handler(err)
def _delete_resources(namespace): # delete some of our own operator resources first resources_to_delete = [ "cyndipipelines", # delete this first to prevent hanging "xjoinpipelines", "clowdjobinvocations", "clowdapps", ] for resource in resources_to_delete: oc("delete", resource, "--all", n=namespace, timeout="60s") # delete the ClowdEnvironment for this namespace if get_json("clowdenvironment", conf.ENV_NAME_FORMAT.format(namespace=namespace)): oc( "delete", "clowdenvironment", conf.ENV_NAME_FORMAT.format(namespace=namespace), timeout="60s", ) # delete any other lingering specific resource types from the namespace resources_to_delete = [ "elasticsearches", "horizontalpodautoscalers", "kafkabridges", "kafkaconnectors", "kafkaconnects", "kafkaconnects2is", "kafkamirrormaker2s", "kafkamirrormakers", "kafkarebalances", "kafkas", "kafkatopics", "kafkausers", "deployments", "deploymentconfigs", "statefulsets", "daemonsets", "replicasets", "cronjobs", "jobs", "services", "routes", "pods", "secrets", "configmaps", "persistentvolumeclaims", ] for resource in resources_to_delete: oc("delete", resource, "--all", n=namespace, timeout="60s")
def _delete_resources(namespace): # installation of certain operators on the cluster may break 'oc delete all' # oc("delete", "all", "--all", n=namespace) # delete the ClowdApps in this namespace oc("delete", "clowdapp", "--all", n=namespace) # delete the ClowdEnvironment for this namespace if get_json("clowdenvironment", conf.ENV_NAME_FORMAT.format(namespace=namespace)): oc( "delete", "clowdenvironment", conf.ENV_NAME_FORMAT.format(namespace=namespace), ) # delete other specific resource types from the namespace resources_to_delete = [ "clowdapps", "clowdjobinvocations", "cyndipipelines", "kafkabridges", "kafkaconnectors", "kafkaconnects", "kafkaconnects2is", "kafkamirrormaker2s", "kafkamirrormakers", "kafkarebalances", "kafkas", "kafkatopics", "kafkausers", "deployments", "deploymentconfigs", "statefulsets", "daemonsets", "replicasets", "cronjobs", "jobs", "services", "routes", "pods", "secrets", "configmaps", "persistentvolumeclaims", ] for resource in resources_to_delete: oc("delete", resource, "--all", n=namespace)
def reset_namespace(namespace): release_namespace(namespace) oc("label", "--overwrite", "namespace", namespace, f"{NS_READY}=false")
def release_namespace(namespace): oc("label", "--overwrite", "namespace", namespace, f"{NS_RESERVED}=false")