def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) if parsed_args.cleanup not in image_uploader.CLEANUP: raise oscexc.CommandError('--cleanup must be one of: %s' % ', '.join(image_uploader.CLEANUP)) if parsed_args.roles_file: roles_data = yaml.safe_load(open(parsed_args.roles_file).read()) else: roles_data = None env = utils.build_prepare_env(parsed_args.environment_files, parsed_args.environment_directories) params = kolla_builder.container_images_prepare_multi( env, roles_data, dry_run=parsed_args.dry_run, cleanup=parsed_args.cleanup) env_data = build_env_file(params, self.app.command_options) if parsed_args.output_env_file: with os.fdopen( os.open(parsed_args.output_env_file, os.O_CREAT | os.O_TRUNC | os.O_WRONLY, 0o666), 'w') as f: f.write(env_data) else: self.app.stdout.write(env_data)
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) if parsed_args.cleanup not in image_uploader.CLEANUP: raise oscexc.CommandError('--cleanup must be one of: %s' % ', '.join(image_uploader.CLEANUP)) roles_data = utils.fetch_roles_file(parsed_args.roles_file) env = utils.build_prepare_env( parsed_args.environment_files, parsed_args.environment_directories ) lock = processlock.ProcessLock() params = kolla_builder.container_images_prepare_multi( env, roles_data, dry_run=parsed_args.dry_run, cleanup=parsed_args.cleanup, lock=lock) env_data = build_env_file(params, self.app.command_options) if parsed_args.output_env_file: if os.path.exists(parsed_args.output_env_file): self.log.warning("Output env file exists, " "moving it to backup.") shutil.move(parsed_args.output_env_file, parsed_args.output_env_file + ".backup") utils.safe_write(parsed_args.output_env_file, env_data) else: self.app.stdout.write(env_data)
def run(self, context): self.context = context swift = self.get_object_client(context) try: plan_env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % ( self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) try: env_paths, temp_env_paths = plan_utils.build_env_paths( swift, self.container, plan_env) env_files, env = plan_utils.process_environments_and_files( swift, env_paths) # ensure every image parameter has a default value, even if prepare # didn't return it params = default_image_params() role_data = self._get_role_data(swift) image_params = kolla_builder.container_images_prepare_multi( env, role_data, dry_run=True) if image_params: params.update(image_params) except Exception as err: LOG.exception("Error occurred while processing plan files.") return actions.Result(error=six.text_type(err)) finally: # cleanup any local temp files for f in temp_env_paths: os.remove(f) try: swiftutils.put_object_string( swift, self.container, constants.CONTAINER_DEFAULTS_ENVIRONMENT, yaml.safe_dump( {'parameter_defaults': params}, default_flow_style=False ) ) except swiftexceptions.ClientException as err: err_msg = ("Error updating %s for plan %s: %s" % ( constants.CONTAINER_DEFAULTS_ENVIRONMENT, self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) environments = {constants.CONTAINER_DEFAULTS_ENVIRONMENT: True} update_action = heat_capabilities.UpdateCapabilitiesAction( environments, container=self.container) return update_action.run(context)
def run(self, context): self.context = context swift = self.get_object_client(context) try: plan_env = plan_utils.get_env(swift, self.container) except swiftexceptions.ClientException as err: err_msg = ("Error retrieving environment for plan %s: %s" % (self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) try: env_paths, temp_env_paths = plan_utils.build_env_paths( swift, self.container, plan_env) env_files, env = plan_utils.process_environments_and_files( swift, env_paths) # ensure every image parameter has a default value, even if prepare # didn't return it params = default_image_params() role_data = self._get_role_data(swift) image_params = kolla_builder.container_images_prepare_multi( env, role_data, dry_run=True) if image_params: params.update(image_params) except Exception as err: LOG.exception("Error occurred while processing plan files.") return actions.Result(error=six.text_type(err)) finally: # cleanup any local temp files for f in temp_env_paths: os.remove(f) try: swiftutils.put_object_string( swift, self.container, constants.CONTAINER_DEFAULTS_ENVIRONMENT, yaml.safe_dump({'parameter_defaults': params}, default_flow_style=False)) except swiftexceptions.ClientException as err: err_msg = ("Error updating %s for plan %s: %s" % (constants.CONTAINER_DEFAULTS_ENVIRONMENT, self.container, err)) LOG.exception(err_msg) return actions.Result(error=err_msg) environments = {constants.CONTAINER_DEFAULTS_ENVIRONMENT: True} update_action = heat_capabilities.UpdateCapabilitiesAction( environments, container=self.container) return update_action.run(context)
def _prepare_container_images(self, env): roles_data = self._get_roles_data() image_params = kolla_builder.container_images_prepare_multi( env, roles_data, dry_run=True) # use setdefault to ensure every needed image parameter is # populated without replacing user-set values if image_params: pd = env.get('parameter_defaults', {}) for k, v in image_params.items(): pd.setdefault(k, v)
def run_module(): result = dict(success=False, changed=False, error="", params={}) argument_spec = openstack_full_argument_spec( **yaml.safe_load(DOCUMENTATION)['options']) module = AnsibleModule(argument_spec, supports_check_mode=False, **openstack_module_kwargs()) log_file = module.params.get('log_file') debug = module.params.get('debug') if not module.no_log: log = setup_logging(log_file, debug) cleanup = module.params.get('cleanup') dry_run = module.params.get('dry_run') if cleanup not in image_uploader.CLEANUP: raise RuntimeError('--cleanup must be one of: %s' % ', '.join(image_uploader.CLEANUP)) roles_data = module.params.get('roles_data') env = module.params.get('environment') try: lock = processlock.ProcessLock() params = kolla_builder.container_images_prepare_multi(env, roles_data, cleanup=cleanup, dry_run=dry_run, lock=lock) if not module.no_log: output = yaml.safe_dump(params, default_flow_style=False) log.info(output) result['success'] = True result['changed'] = True result['params'] = {"parameter_defaults": params} except Exception as err: result['error'] = str(err) result['msg'] = ("Error running container image prepare: %s" % (err)) module.fail_json(**result) # in the event of a successful module execution, you will want to # simple AnsibleModule.exit_json(), passing the key/value results module.exit_json(**result)
def test_container_images_prepare_multi_dry_run(self, mock_im, mock_cip): mapping_args = { 'namespace': 't', 'name_prefix': '', 'name_suffix': '', 'tag': 'l', } env = { 'parameter_defaults': { 'ContainerImagePrepare': [{ 'set': mapping_args, 'tag_from_label': 'foo', }, { 'set': mapping_args, 'tag_from_label': 'bar', 'excludes': ['nova', 'neutron'], 'push_destination': '192.0.2.1:8787', 'modify_role': 'add-foo-plugin', 'modify_only_with_labels': ['kolla_version'], 'modify_vars': { 'foo_version': '1.0.1' }, 'modify_append_tag': 'modify-123' }] } } roles_data = [] mock_cip.side_effect = [ { 'image_params': { 'FooImage': 't/foo:latest', 'BarImage': 't/bar:latest', 'BazImage': 't/baz:latest', 'BinkImage': 't/bink:latest' }, 'upload_data': [] }, { 'image_params': { 'BarImage': 't/bar:1.0', 'BazImage': 't/baz:1.0' }, 'upload_data': [{ 'imagename': 't/bar:1.0', 'push_destination': '192.0.2.1:8787' }, { 'imagename': 't/baz:1.0', 'push_destination': '192.0.2.1:8787' }] }, ] image_params = kb.container_images_prepare_multi(env, roles_data, True) mock_cip.assert_has_calls([ mock.call(excludes=None, includes=None, mapping_args=mapping_args, output_env_file='image_params', output_images_file='upload_data', pull_source=None, push_destination=None, service_filter=None, tag_from_label='foo', append_tag=mock.ANY, modify_role=None, modify_only_with_labels=None, modify_vars=None), mock.call(excludes=['nova', 'neutron'], includes=None, mapping_args=mapping_args, output_env_file='image_params', output_images_file='upload_data', pull_source=None, push_destination='192.0.2.1:8787', service_filter=None, tag_from_label='bar', append_tag=mock.ANY, modify_role='add-foo-plugin', modify_only_with_labels=['kolla_version'], modify_vars={'foo_version': '1.0.1'}) ]) mock_im.assert_called_once_with(mock.ANY, dry_run=True, verbose=True, cleanup='full') self.assertEqual( { 'BarImage': 't/bar:1.0', 'BazImage': 't/baz:1.0', 'BinkImage': 't/bink:latest', 'FooImage': 't/foo:latest' }, image_params)
def test_container_images_prepare_multi(self, mock_im, mock_cip): mock_lock = mock.MagicMock() mapping_args = { 'namespace': 't', 'name_prefix': '', 'name_suffix': '', 'tag': 'l', } env = { 'parameter_defaults': { 'LocalContainerRegistry': '192.0.2.1', 'DockerRegistryMirror': 'http://192.0.2.2/reg/', 'ContainerImageRegistryCredentials': { 'docker.io': { 'my_username': '******' } }, 'ContainerImagePrepare': [{ 'set': mapping_args, 'tag_from_label': 'foo', 'includes': ['nova', 'neutron'], }, { 'set': mapping_args, 'tag_from_label': 'bar', 'excludes': ['nova', 'neutron'], 'push_destination': True, 'modify_role': 'add-foo-plugin', 'modify_only_with_labels': ['kolla_version'], 'modify_vars': { 'foo_version': '1.0.1' } }] } } roles_data = [] mock_cip.side_effect = [ { 'image_params': { 'FooImage': 't/foo:latest', 'BarImage': 't/bar:latest', 'BazImage': 't/baz:latest', 'BinkImage': 't/bink:latest' }, 'upload_data': [] }, { 'image_params': { 'BarImage': 't/bar:1.0', 'BazImage': 't/baz:1.0' }, 'upload_data': [{ 'imagename': 't/bar:1.0', 'push_destination': '192.0.2.1:8787' }, { 'imagename': 't/baz:1.0', 'push_destination': '192.0.2.1:8787' }] }, ] image_params = kb.container_images_prepare_multi(env, roles_data, lock=mock_lock) mock_cip.assert_has_calls([ mock.call(excludes=None, includes=['nova', 'neutron'], mapping_args=mapping_args, output_env_file='image_params', output_images_file='upload_data', pull_source=None, push_destination=None, service_filter=None, tag_from_label='foo', append_tag=mock.ANY, modify_role=None, modify_only_with_labels=None, modify_vars=None, mirrors={'docker.io': 'http://192.0.2.2/reg/'}, registry_credentials={ 'docker.io': { 'my_username': '******' } }, multi_arch=False, lock=mock_lock), mock.call(excludes=['nova', 'neutron'], includes=None, mapping_args=mapping_args, output_env_file='image_params', output_images_file='upload_data', pull_source=None, push_destination='192.0.2.1:8787', service_filter=None, tag_from_label='bar', append_tag=mock.ANY, modify_role='add-foo-plugin', modify_only_with_labels=['kolla_version'], modify_vars={'foo_version': '1.0.1'}, mirrors={'docker.io': 'http://192.0.2.2/reg/'}, registry_credentials={ 'docker.io': { 'my_username': '******' } }, multi_arch=False, lock=mock_lock) ]) mock_im.assert_called_once() self.assertEqual( { 'BarImage': 't/bar:1.0', 'BazImage': 't/baz:1.0', 'BinkImage': 't/bink:latest', 'FooImage': 't/foo:latest' }, image_params)