def _ensureConfigMaps(self, action): assert action in Service.VALID_ACTIONS nsname = 'kolla_kubernetes_namespace' cmd = ("kubectl {} configmap {} --namespace={}".format( action, self.getName(), KollaKubernetesResources.GetJinjaDict()[nsname])) # For the create action, add some more arguments if action == 'create': for f in PathFinder.find_config_files(self.getName()): cmd += ' --from-file={}={}'.format( os.path.basename(f).replace("_", "-"), f) # Execute the command ExecUtils.exec_command(cmd)
def take_action(self, args, skip_and_return=False): # Validate input arguments self.validate_args(args) multi = len(args.resource_name) != 1 multidoc = {'apiVersion': 'v1', 'kind': 'List', 'items': []} for resource_name in args.resource_name: service_name = KKR.getServiceNameByResourceTypeName( args.resource_type, resource_name) service = KKR.getServiceByName(service_name) rt = service.getResourceTemplateByTypeAndName( args.resource_type, resource_name) tmpargs = copy.deepcopy(vars(args)) tmpargs['resource_name'] = resource_name variables = KKR.GetJinjaDict(service_name, tmpargs, args.print_jinja_keys_regex) # Merge the template vars with the jinja vars before processing variables['kolla_kubernetes'].update( {"template": { "vars": rt.getVars() }}) # handle the debug option --print-jinja-vars if args.print_jinja_vars is True: print(YamlUtils.yaml_dict_to_string(variables), file=sys.stderr) if args.resource_type == 'configmap' and \ rt.getTemplate() == 'auto': nsname = 'kolla_kubernetes_namespace' cmd = "kubectl create configmap {} -o yaml --dry-run" cmd = cmd.format(resource_name) for f in PathFinder.find_config_files(resource_name): cmd += ' --from-file={}={}'.format( os.path.basename(f).replace("_", "-"), f) # Execute the command out, err = ExecUtils.exec_command(cmd) y = yaml.load(out) y['metadata']['namespace'] = variables[nsname] res = y else: # process the template raw_doc = JinjaUtils.render_jinja( variables, FileUtils.read_string_from_file(rt.getTemplatePath())) res = yaml.load(raw_doc) if args.debug_container is not None: y = res kind = y['kind'] if kind not in ('PetSet', 'Deployment', 'Job', 'DaemonSet', 'ReplicationController', 'Pod'): raise Exception("Template doesn't have containers.") pod = y if kind != 'Pod': pod = y['spec']['template'] alpha_init_containers = None annotation = 'pod.alpha.kubernetes.io/init-containers' if 'metadata' in pod and 'annotations' in pod['metadata'] and \ annotation in pod['metadata']['annotations']: j = json.loads(pod['metadata']['annotations'][annotation]) alpha_init_containers = {} for c in j: alpha_init_containers[c['name']] = c containers = {} for c in pod['spec']['containers']: containers[c['name']] = c for c in args.debug_container: found = False warn_msg = "WARNING: container [{}] already has a" + \ " command override." warn_msg = warn_msg.format(c) if alpha_init_containers and c in alpha_init_containers: if 'command' in alpha_init_containers[c]: print(warn_msg, file=sys.stderr) if 'args' in alpha_init_containers[c]: del alpha_init_containers[c]['args'] alpha_init_containers[c]['command'] = \ ['/bin/bash', '-c', 'while true; do sleep 1000; done'] found = True if c in containers: if 'command' in containers[c]: print(warn_msg, file=sys.stderr) if 'args' in containers[c]: del containers[c]['args'] containers[c]['command'] = \ ['/bin/bash', '-c', 'while true; do sleep 1000; done'] found = True if not found: raise Exception("Failed to find container: %s" % c) if alpha_init_containers: annotation = 'pod.alpha.kubernetes.io/init-containers' v = alpha_init_containers.values() pod['metadata']['annotations'][annotation] = json.dumps(v) multidoc['items'].append(res) if skip_and_return: if multi: return yaml.safe_dump(multidoc) else: return yaml.safe_dump(res) if args.output == 'json': if multi: print(json.dumps(multidoc, indent=4), end="") else: print(json.dumps(res, indent=4), end="") elif multi: print(yaml.safe_dump(multidoc)) else: if args.debug_container is not None: print(yaml.safe_dump(res), end="") else: print(raw_doc, end="")