Ejemplo n.º 1
0
def create_cron_job(api: client.BatchV1beta1Api, configmap: Resource,
                    cro_spec: ResourceChunk, ns: str, name_suffix: str,
                    cro_meta: ResourceChunk, pod_tpl: str):
    logger = logging.getLogger('kopf.objects')

    schedule_spec = cro_spec.get("schedule", {})
    schedule = schedule_spec.get("value")

    tpl = yaml.safe_load(configmap.data['chaostoolkit-cronjob.yaml'])
    set_ns(tpl, ns)
    set_cron_job_name(tpl, name_suffix=name_suffix)
    set_cron_job_schedule(tpl, schedule)
    set_cron_job_template_spec(tpl, pod_tpl.get("spec", {}))

    experiment_labels = cro_meta.get('labels', {})
    label(tpl, labels=experiment_labels)
    label(tpl["spec"]["jobTemplate"], labels=experiment_labels)
    label(tpl["spec"]["jobTemplate"]["spec"]["template"],
          labels=experiment_labels)

    logger.debug(f"Creating cron job with template:\n{tpl}")
    cron = api.create_namespaced_cron_job(body=tpl, namespace=ns)
    logger.info(f"Cron Job '{cron.metadata.self_link}' scheduled with "
                f"pattern '{schedule}' in ns '{ns}'")

    return tpl
Ejemplo n.º 2
0
def create_pod(api: client.CoreV1Api, configmap: Resource,
               cro_spec: ResourceChunk, ns: str, name_suffix: str,
               cro_meta: ResourceChunk):
    logger = logging.getLogger('kopf.objects')

    pod_spec = cro_spec.get("pod", {})

    # did the user supply their own pod spec?
    tpl = pod_spec.get("template")

    # if not, let's use the default one
    if not tpl:
        tpl = yaml.safe_load(configmap.data['chaostoolkit-pod.yaml'])
        image_name = pod_spec.get("image", "chaostoolkit/chaostoolkit")
        env_cm_name = pod_spec.get("env", {}).get(
            "configMapName", "chaostoolkit-env")
        env_cm_enabled = pod_spec.get("env", {}).get("enabled", True)
        settings_secret_enabled = pod_spec.get("settings", {}).get(
            "enabled", False)
        settings_secret_name = pod_spec.get("settings", {}).get(
            "secretName", "chaostoolkit-settings")
        experiment_as_file = pod_spec.get(
            "experiment", {}).get("asFile", True)
        experiment_config_map_name = pod_spec.get("experiment", {}).get(
            "configMapName", "chaostoolkit-experiment")
        cmd_args = pod_spec.get("chaosArgs", [])

        set_image_name(tpl, image_name)

        if not env_cm_enabled:
            logger.info("Removing default env configmap volume")
            remove_env_config_map(tpl)
        elif env_cm_name:
            logger.info(f"Env config map named '{env_cm_name}'")
            set_env_config_map_name(tpl, env_cm_name)

        if not settings_secret_enabled:
            logger.info("Removing default settings secret volume")
            remove_settings_secret(tpl)
        elif settings_secret_name:
            logger.info(
                f"Settings secret volume named '{settings_secret_name}'")
            set_settings_secret_name(tpl, settings_secret_name)

        if experiment_as_file:
            logger.info(
                f"Experiment config map named '{experiment_config_map_name}'")
            set_experiment_config_map_name(tpl, experiment_config_map_name)
        else:
            logger.info("Removing default experiment config map volume")
            remove_experiment_volume(tpl)
            remove_env_path_config_map(tpl)

        if cmd_args:
            logger.info(
                f"Override default chaos command arguments: "
                f"$ chaos {' '.join(cmd_args)}")
            set_chaos_cmd_args(tpl, cmd_args)

    set_ns(tpl, ns)
    set_pod_name(tpl, name_suffix=name_suffix)
    set_sa_name(tpl, name_suffix=name_suffix)
    label(tpl, labels=cro_meta.get('labels', {}))

    logger.debug(f"Creating pod with template:\n{tpl}")
    pod = api.create_namespaced_pod(body=tpl, namespace=ns)
    logger.info(f"Pod {pod.metadata.self_link} created in ns '{ns}'")

    return tpl
Ejemplo n.º 3
0
def create_pod(api: client.CoreV1Api,
               configmap: Resource,
               cro_spec: ResourceChunk,
               ns: str,
               name_suffix: str,
               cro_meta: ResourceChunk,
               *,
               apply: bool = True):
    logger = logging.getLogger('kopf.objects')

    pod_spec = cro_spec.get("pod", {})
    sa_name = cro_spec.get("serviceaccount", {}).get("name")

    # did the user supply their own pod spec?
    tpl = pod_spec.get("template")

    # if not, let's use the default one
    if not tpl:
        tpl = yaml.safe_load(configmap.data['chaostoolkit-pod.yaml'])
        image_name = pod_spec.get("image")
        env_cm_name = pod_spec.get("env", {}).get("configMapName",
                                                  "chaostoolkit-env")
        env_cm_enabled = pod_spec.get("env", {}).get("enabled", True)
        # optional support for loading secret keys as env. variables
        env_secret_name = pod_spec.get("env", {}).get("secretName")
        settings_secret_enabled = pod_spec.get("settings",
                                               {}).get("enabled", False)
        settings_secret_name = pod_spec.get("settings",
                                            {}).get("secretName",
                                                    "chaostoolkit-settings")
        experiment_as_file = pod_spec.get("experiment", {}).get("asFile", True)
        experiment_config_map_name = pod_spec.get("experiment", {}).get(
            "configMapName", "chaostoolkit-experiment")
        cmd_args = pod_spec.get("chaosArgs", [])

        # if image name is not given in CRO,
        # we keep the one defined by default in pod template from configmap
        if image_name:
            set_image_name(tpl, image_name)

        if not env_cm_enabled:
            logger.info("Removing default env configmap volume")
            remove_env_config_map(tpl)
        elif env_cm_name:
            logger.info(f"Env config map named '{env_cm_name}'")
            set_env_config_map_name(tpl, env_cm_name)

        if env_secret_name and env_cm_enabled:
            logger.info(f"Adding secret '{env_secret_name}' "
                        f"as environment variables")
            add_env_secret(tpl, env_secret_name)

        if not settings_secret_enabled:
            logger.info("Removing default settings secret volume")
            remove_settings_secret(tpl)
        elif settings_secret_name:
            logger.info(
                f"Settings secret volume named '{settings_secret_name}'")
            set_settings_secret_name(tpl, settings_secret_name)

        if experiment_as_file:
            logger.info(
                f"Experiment config map named '{experiment_config_map_name}'")
            set_experiment_config_map_name(tpl, experiment_config_map_name)
        else:
            logger.info("Removing default experiment config map volume")
            remove_experiment_volume(tpl)
            remove_env_path_config_map(tpl)
            set_chaos_cmd_args(tpl, ["run", "$(EXPERIMENT_URL)"])

        if cmd_args:
            # filter out empty values from command line arguments: None, ''
            cmd_args = list(filter(None, cmd_args))
            logger.info(f"Override default chaos command arguments: "
                        f"$ chaos {' '.join([str(arg) for arg in cmd_args])}")
            set_chaos_cmd_args(tpl, cmd_args)

    set_ns(tpl, ns)
    set_pod_name(tpl, name_suffix=name_suffix)
    set_sa_name(tpl, name=sa_name, name_suffix=name_suffix)
    label(tpl, labels=cro_meta.get('labels', {}))

    if apply:
        logger.debug(f"Creating pod with template:\n{tpl}")
        pod = api.create_namespaced_pod(body=tpl, namespace=ns)
        logger.info(f"Pod {pod.metadata.self_link} created in ns '{ns}'")

    return tpl