コード例 #1
0
    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)
コード例 #2
0
    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)
コード例 #3
0
    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)
コード例 #4
0
    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)
コード例 #5
0
    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)
コード例 #6
0
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)
コード例 #7
0
    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)
コード例 #8
0
    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)