def create_pod(api: client.CoreV1Api, configmap: Resource,
               cro_spec: ResourceChunk, ns: str, name_suffix: str):
    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", {}).get(
            "name", "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")

        set_image_name(tpl, image_name)

        if not env_cm_enabled:
            remove_env_config_map(tpl)
        elif env_cm_name:
            set_env_config_map_name(tpl, env_cm_name)

        if not settings_secret_enabled:
            remove_settings_secret(tpl)
        elif settings_secret_name:
            set_settings_secret_name(tpl, settings_secret_name)

    set_ns(tpl, ns)
    set_pod_name(tpl, name_suffix=name_suffix)
    set_sa_name(tpl, name_suffix=name_suffix)

    api.create_namespaced_pod(body=tpl, namespace=ns)
    return tpl
Example #2
0
    def test_pod_apis(self, k8s: client.CoreV1Api):
        name = 'test-' + str(uuid.uuid4())

        pod_manifest = {'apiVersion': 'v1',
                        'kind': 'Pod',
                        'metadata': {'color': 'blue', 'name': name},
                        'spec': {'containers': [{'image': 'alpine',
                                                 'name': 'test'}]}}

        resp = k8s.create_namespaced_pod(body=pod_manifest,
                                         namespace='default')
        assert name == resp.metadata.name
        assert resp.status.phase == 'Pending'

        resp = k8s.read_namespaced_pod(name=name,
                                       namespace='default')
        assert name == resp.metadata.name
        assert resp.status.phase == 'Pending'

        number_of_pods = len(k8s.list_pod_for_all_namespaces().items)
        assert number_of_pods > 0
Example #3
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
Example #4
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