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
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
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
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