Exemple #1
0
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)
Exemple #2
0
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))
Exemple #3
0
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))
Exemple #4
0
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))
Exemple #5
0
    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))
Exemple #6
0
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)
Exemple #7
0
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)
Exemple #8
0
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)
Exemple #9
0
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")
Exemple #10
0
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)
Exemple #11
0
def reset_namespace(namespace):
    release_namespace(namespace)
    oc("label", "--overwrite", "namespace", namespace, f"{NS_READY}=false")
Exemple #12
0
def release_namespace(namespace):
    oc("label", "--overwrite", "namespace", namespace, f"{NS_RESERVED}=false")