def build(service_name, version, root_config_dir, tags): '''Build Step''' service_class = ServiceDefinition.get_service_class(service_name) service = service_class(version, tags) default_configs = service.default_configs() # Create all of the directories that we need. # Go one-by-one to improve error reporting. # e.g. ./default_configs if not os.path.exists(root_config_dir): logger.debug('creating root path: %s', root_config_dir) os.mkdir(root_config_dir) # e.g. ./default_configs/scala=2.11-distribution=kafka/ if tags != {}: tag_root = _tag_path(root_config_dir, tags) if not os.path.exists(tag_root): logger.debug('creating tags root path %s', tag_root) os.mkdir(tag_root) service_parent_root = tag_root else: service_parent_root = root_config_dir # e.g. ./default_configs/kafka # e.g. ./default/configs/scala=2.11-distribution=apache/kafka service_root = _service_path(service_parent_root, service_name) if not os.path.exists(service_root): logger.debug('creating service root path: %s', service_root) os.mkdir(service_root) # e.g. ./default_configs/redis/3.0.1 # e.g. ./default/configs/scala=2.11-distribution=apache/kafka/2.8.0.2 version_root = _version_path(service_root, version) if not os.path.exists(version_root): logger.debug('creating version root path %s', version_root) os.mkdir(version_root) default_paths = {} for name, get_content in default_configs.items(): path = os.path.join(version_root, name) logger.debug('considering default config file %s', path) if not os.path.exists(path): logger.debug('downloading default config file %s to %s', name, path) content = get_content() with open(path, 'w') as f: f.write(content) else: logger.debug('file exists, not downloaded') default_paths[name] = path return True
def _inject_service(service_name, version, config_dir, tags): logger.debug('injecting configs for service %s version %s', service_name, version) # Load the service class and instantiate it. service_class = ServiceDefinition.get_service_class(service_name) service = service_class(version, tags) # Determine which configuration files to inject by overriding # defaults defined by the service with arguments supplied in the # ENV_INJECT variable env_prefix = service_name.upper() default_filenames = list(service.default_configs().keys()) builtin = service.config_mapping() logger.debug('considering default injectable configs %s', builtin) env_inject_string = os.environ.get(ENV_INJECT_KEY) if env_inject_string is None: env_inject = {} env_overriden = set() else: env_inject, env_overriden = _inject_string_to_dict(env_inject_string, default_filenames) not_overriden = dict((k, v) for k, v in builtin.items() if k not in env_overriden) configs_to_inject = dict(not_overriden, **env_inject) logger.debug('resolved to inject configs %s', configs_to_inject) # Collect injectable configs from all environment variables # beginning with the service prefix. # e.g. REDIS_FOO=1 => {'foo': '1'} injectables = {} blacklist = service.ignore_env_names() for env_name, env_value in os.environ.items(): if env_name in blacklist: logger.debug('env variable %s ignore because it is in the service blacklist') continue if env_name == ENV_INJECT_KEY: logger.debug('env variable %s ignored because it is the injection key') continue if env_name.startswith(env_prefix): logger.debug('found injectable env variable %s') start = env_name.find('_') + 1 config_part = env_name[start:] config_filename, config_part = service.config_multiplex(config_part) config_name = service.convert_name(config_part) config_value = service.convert_value(env_value) logger.debug('found potential inject (name: %s, value: %s) into %s', config_name, config_value, config_filename) injectables[config_name] = (config_filename, config_value) processor = service.Processor( service=service, config_dir=config_dir, configs_to_inject=configs_to_inject, injectables=injectables, ) processor.process() return True
def _inject_service(service_name, version, config_dir, tags): logger.debug('injecting configs for service %s version %s', service_name, version) # Load the service class and instantiate it. service_class = ServiceDefinition.get_service_class(service_name) service = service_class(version, tags) # Determine which configuration files to inject by overriding # defaults defined by the service with arguments supplied in the # ENV_INJECT variable env_prefix = service_name.upper() default_filenames = list(service.default_configs().keys()) builtin = service.config_mapping() logger.debug('considering default injectable configs %s', builtin) env_inject_string = os.environ.get(ENV_INJECT_KEY) if env_inject_string is None: env_inject = {} env_overriden = set() else: env_inject, env_overriden = _inject_string_to_dict( env_inject_string, default_filenames) not_overriden = dict( (k, v) for k, v in builtin.items() if k not in env_overriden) configs_to_inject = dict(not_overriden, **env_inject) logger.debug('resolved to inject configs %s', configs_to_inject) # Collect injectable configs from all environment variables # beginning with the service prefix. # e.g. REDIS_FOO=1 => {'foo': '1'} injectables = {} blacklist = service.ignore_env_names() for env_name, env_value in os.environ.items(): if env_name in blacklist: logger.debug( 'env variable %s ignore because it is in the service blacklist' ) continue if env_name == ENV_INJECT_KEY: logger.debug( 'env variable %s ignored because it is the injection key') continue if env_name.startswith(env_prefix): logger.debug('found injectable env variable %s') start = env_name.find('_') + 1 config_part = env_name[start:] config_filename, config_part = service.config_multiplex( config_part) config_name = service.convert_name(config_part) config_value = service.convert_value(env_value) logger.debug( 'found potential inject (name: %s, value: %s) into %s', config_name, config_value, config_filename) injectables[config_name] = (config_filename, config_value) processor = service.Processor( service=service, config_dir=config_dir, configs_to_inject=configs_to_inject, injectables=injectables, ) processor.process() return True