示例#1
0
    def test_package_templates_seeded_plan(self):
        # Setup
        self.seed_store.create(MASTER_SEED_NAME, TEST_SEED)
        self.registry_store.create(RESOURCE_REGISTRY_NAME, RESOURCE_REGISTRY)
        # more setup (this is normally called in load_roles)
        self.registry_mapping_store.create('required_file.yaml',
                                           'some fake template data')

        test_role = self._add_test_role()
        test_plan = self.plans_manager.create_plan('p1', 'd1')
        self.plans_manager.add_role_to_plan(test_plan.uuid, test_role.uuid)

        # Test
        templates = self.plans_manager.package_templates(test_plan.uuid)

        # Verify
        self.assertTrue(isinstance(templates, dict))
        self.assertEqual(4, len(templates))

        self.assertTrue('plan.yaml' in templates)
        parsed_plan = parser.parse_template(templates['plan.yaml'])
        self.assertEqual(parsed_plan.description, 'd1')

        self.assertTrue('environment.yaml' in templates)
        self.assertTrue('required_file.yaml' in templates)
        parsed_env = parser.parse_environment(templates['environment.yaml'])
        self.assertEqual(2, len(parsed_env.registry_entries))

        role_filename = name_utils.role_template_filename('r1', '1', None)
        self.assertTrue(role_filename in templates)
        parsed_role = parser.parse_template(templates[role_filename])
        self.assertEqual(parsed_role.description, 'Test provider resource foo')
示例#2
0
    def test_package_templates_seeded_plan(self):
        # Setup
        self.seed_store.create(MASTER_SEED_NAME, TEST_SEED)
        self.registry_store.create(RESOURCE_REGISTRY_NAME, RESOURCE_REGISTRY)
        # more setup (this is normally called in load_roles)
        self.registry_mapping_store.create('required_file.yaml',
                                           'some fake template data')

        test_role = self._add_test_role()
        test_plan = self.plans_manager.create_plan('p1', 'd1')
        self.plans_manager.add_role_to_plan(test_plan.uuid, test_role.uuid)

        # Test
        templates = self.plans_manager.package_templates(test_plan.uuid)

        # Verify
        self.assertTrue(isinstance(templates, dict))
        self.assertEqual(4, len(templates))

        self.assertTrue('plan.yaml' in templates)
        parsed_plan = parser.parse_template(templates['plan.yaml'])
        self.assertEqual(parsed_plan.description, 'd1')

        self.assertTrue('environment.yaml' in templates)
        self.assertTrue('required_file.yaml' in templates)
        parsed_env = parser.parse_environment(templates['environment.yaml'])
        self.assertEqual(2, len(parsed_env.registry_entries))

        role_filename = name_utils.role_template_filename('r1', '1', None)
        self.assertTrue(role_filename in templates)
        parsed_role = parser.parse_template(templates[role_filename])
        self.assertEqual(parsed_role.description, 'Test provider resource foo')
示例#3
0
    def test_package_templates(self):
        # Setup
        test_role = self._add_test_role()
        test_plan = self.plans_manager.create_plan('p1', 'd1')
        self.plans_manager.add_role_to_plan(test_plan.uuid, test_role.uuid)

        # Test
        templates = self.plans_manager.package_templates(test_plan.uuid)

        # Verify
        self.assertTrue(isinstance(templates, dict))
        self.assertEqual(3, len(templates))

        self.assertTrue('plan.yaml' in templates)
        parsed_plan = parser.parse_template(templates['plan.yaml'])
        self.assertEqual(parsed_plan.description, 'd1')

        self.assertTrue('environment.yaml' in templates)
        parsed_env = parser.parse_environment(templates['environment.yaml'])
        self.assertEqual(1, len(parsed_env.registry_entries))

        role_filename = name_utils.role_template_filename('r1', '1', None)
        self.assertTrue(role_filename in templates)
        parsed_role = parser.parse_template(templates[role_filename])
        self.assertEqual(parsed_role.description, 'Test provider resource foo')
示例#4
0
    def setUp(self):
        super(TemplateSeedTests, self).setUp()

        self.seed_template = parser.parse_template(SEED_TEMPLATE)
        self.role_template = parser.parse_template(ROLE_TEMPLATE)
        self.destination_template = heat.Template()
        self.environment = heat.Environment()
示例#5
0
    def test_package_templates(self):
        # Setup
        test_role = self._add_test_role()
        test_plan = self.plans_manager.create_plan('p1', 'd1')
        self.plans_manager.add_role_to_plan(test_plan.uuid, test_role.uuid)

        # Test
        templates = self.plans_manager.package_templates(test_plan.uuid)

        # Verify
        self.assertTrue(isinstance(templates, dict))
        self.assertEqual(3, len(templates))

        self.assertTrue('plan.yaml' in templates)
        parsed_plan = parser.parse_template(templates['plan.yaml'])
        self.assertEqual(parsed_plan.description, 'd1')

        self.assertTrue('environment.yaml' in templates)
        parsed_env = parser.parse_environment(templates['environment.yaml'])
        self.assertEqual(1, len(parsed_env.registry_entries))

        role_filename = name_utils.role_template_filename('r1', '1', None)
        self.assertTrue(role_filename in templates)
        parsed_role = parser.parse_template(templates[role_filename])
        self.assertEqual(parsed_role.description, 'Test provider resource foo')
示例#6
0
    def retrieve_plan(self, plan_uuid):
        """Loads the given plan.

        :type plan_uuid: str
        :rtype: tuskar.manager.models.DeploymentPlan
        :raises tuskar.storage.exceptions.UnknownUUID: if there is no plan
                with the given UUID
        """

        # Load the plan from the database.
        db_plan = self.plan_store.retrieve(plan_uuid)

        # Parse the plan into the template model.
        master_template = parser.parse_template(
            db_plan.master_template.contents)
        environment = parser.parse_environment(
            db_plan.environment_file.contents)

        # Create the Tuskar model for the plan.
        deployment_plan = models.DeploymentPlan(
            plan_uuid,
            db_plan.name,
            master_template.description,
            created_at=db_plan.created_at,
            updated_at=db_plan.updated_at,
        )

        roles = self._find_roles(environment)
        deployment_plan.add_roles(*roles)

        params = self._find_parameters(master_template, environment)
        deployment_plan.add_parameters(*params)

        return deployment_plan
示例#7
0
    def test_add_role_to_seeded_plan(self):
        # Setup
        self.seed_store.create(MASTER_SEED_NAME, TEST_SEED)
        self.registry_store.create(RESOURCE_REGISTRY_NAME, RESOURCE_REGISTRY)
        test_role = self._add_test_role()
        test_plan = self.plans_manager.create_plan('p1', 'd1')

        # Test
        self.plans_manager.add_role_to_plan(test_plan.uuid, test_role.uuid)

        # Verify
        db_plan = self.plan_store.retrieve(test_plan.uuid)
        parsed_plan = parser.parse_template(db_plan.master_template.contents)
        self.assertEqual(2, len(parsed_plan.resources))

        # The role generated in the plan has a different name:
        my_role = parsed_plan.find_resource_by_id('r1-1-servers')
        self.assertIsNot(my_role, None)

        # The reference to the role in some_config should be updated:
        some_config = parsed_plan.find_resource_by_id('some_config')
        self.assertIsNot(some_config, None)
        config_property = some_config.find_property_by_name('config')
        self.assertIsNot(config_property, None)
        self.assertEqual(
            config_property.value,
            {'ip_addresses': {
                'get_attr': ['r1-1-servers', 'foo_ip']
            }})
示例#8
0
 def _plan_to_template_object(db_plan):
     master_template = parser.parse_template(
         db_plan.master_template.contents)
     environment = parser.parse_environment(
         db_plan.environment_file.contents)
     deployment_plan = plan.DeploymentPlan(master_template=master_template,
                                           environment=environment)
     return deployment_plan
示例#9
0
 def _plan_to_template_object(db_plan):
     master_template = parser.parse_template(
         db_plan.master_template.contents
     )
     environment = parser.parse_environment(
         db_plan.environment_file.contents
     )
     deployment_plan = plan.DeploymentPlan(master_template=master_template,
                                           environment=environment)
     return deployment_plan
示例#10
0
    def test_add_role_to_plan(self):
        # Setup
        test_role = self._add_test_role()
        test_plan = self.plans_manager.create_plan('p1', 'd1')

        # Test
        self.plans_manager.add_role_to_plan(test_plan.uuid, test_role.uuid)

        # Verify
        db_plan = self.plan_store.retrieve(test_plan.uuid)
        parsed_plan = parser.parse_template(db_plan.master_template.contents)
        self.assertEqual(1, len(parsed_plan.resources))
示例#11
0
    def test_add_role_to_plan(self):
        # Setup
        test_role = self._add_test_role()
        test_plan = self.plans_manager.create_plan('p1', 'd1')

        # Test
        self.plans_manager.add_role_to_plan(test_plan.uuid, test_role.uuid)

        # Verify
        db_plan = self.plan_store.retrieve(test_plan.uuid)
        parsed_plan = parser.parse_template(db_plan.master_template.contents)
        self.assertEqual(1, len(parsed_plan.resources))
示例#12
0
    def package_templates(self, plan_uuid):
        """Packages and returns all of the templates related to the given plan.
        The returned dictionary is keyed by filename and contains the contents
        of that file (a template or an environment file).

        :type plan_uuid: str

        :return: mapping of filename to contents for each file in the plan
        :rtype:  dict

        :raises tuskar.storage.exceptions.UnknownUUID: if there is no plan
                with the given UUID
        """

        # Load and parse the plan.
        db_plan = self.plan_store.retrieve(plan_uuid)
        master_template = parser.parse_template(
            db_plan.master_template.contents
        )
        environment = parser.parse_environment(
            db_plan.environment_file.contents
        )

        # Compose the plan files and all plan roles and package them into
        # a single dictionary.
        plan_contents = composer.compose_template(master_template)
        env_contents = composer.compose_environment(environment)

        files_dict = {
            'plan.yaml': plan_contents,
            'environment.yaml': env_contents,
        }

        plan_roles = self._find_roles(environment)

        for role in plan_roles:
            contents = composer.compose_template(role.template)
            filename = name_utils.role_template_filename(role.name,
                                                         role.version)
            files_dict[filename] = contents

        return files_dict
示例#13
0
文件: plan.py 项目: marios/tuskar-1
    def package_templates(self, plan_uuid):
        """Packages and returns all of the templates related to the given plan.
        The returned dictionary is keyed by filename and contains the contents
        of that file (a template or an environment file).

        :type plan_uuid: str

        :return: mapping of filename to contents for each file in the plan
        :rtype:  dict

        :raises tuskar.storage.exceptions.UnknownUUID: if there is no plan
                with the given UUID
        """

        # Load and parse the plan.
        db_plan = self.plan_store.retrieve(plan_uuid)
        master_template = parser.parse_template(
            db_plan.master_template.contents
        )
        environment = parser.parse_environment(
            db_plan.environment_file.contents
        )

        # Compose the plan files and all plan roles and package them into
        # a single dictionary.
        plan_contents = composer.compose_template(master_template)
        env_contents = composer.compose_environment(environment)

        files_dict = {
            'plan.yaml': plan_contents,
            'environment.yaml': env_contents,
        }

        plan_roles = self._find_roles(environment)

        for role in plan_roles:
            contents = composer.compose_template(role.template)
            filename = name_utils.role_template_filename(role.name,
                                                         role.version)
            files_dict[filename] = contents

        return files_dict
示例#14
0
    def test_add_role_to_seeded_plan(self):
        # Setup
        self.seed_store.create(MASTER_SEED_NAME, TEST_SEED)
        self.registry_store.create(RESOURCE_REGISTRY_NAME, RESOURCE_REGISTRY)
        # more setup (this is normally called in load_roles)
        self.registry_mapping_store.create('required_file.yaml',
                                           'some fake template data')
        test_role = self._add_test_role()
        test_plan = self.plans_manager.create_plan('p1', 'd1')

        # Test
        self.plans_manager.add_role_to_plan(test_plan.uuid, test_role.uuid)

        # Verify
        db_plan = self.plan_store.retrieve(test_plan.uuid)
        parsed_plan = parser.parse_template(db_plan.master_template.contents)
        self.assertEqual(2, len(parsed_plan.resources))

        # The role generated in the plan has a different name:
        my_role = parsed_plan.find_resource_by_id('r1')
        self.assertIsNot(my_role, None)

        # The reference to the role in some_config should be updated:
        some_config = parsed_plan.find_resource_by_id('some_config')
        self.assertIsNot(some_config, None)
        config_property = some_config.find_property_by_name('config')
        self.assertIsNot(config_property, None)
        self.assertEqual(config_property.value,
                         {'ip_addresses': {
                             'get_attr': ['r1', 'foo_ip']
                         }})

        # verify both entries are present from RESOURCE_REGISTRY
        parsed_env = parser.parse_environment(
            db_plan.environment_file.contents)
        self.assertEqual(2, len(parsed_env.registry_entries))
示例#15
0
    def retrieve_plan(self, plan_uuid):
        """Loads the given plan.

        :type plan_uuid: str
        :rtype: tuskar.manager.models.DeploymentPlan
        :raises tuskar.storage.exceptions.UnknownUUID: if there is no plan
                with the given UUID
        """

        # Load the plan from the database.
        db_plan = self.plan_store.retrieve(plan_uuid)

        # Parse the plan into the template model.
        master_template = parser.parse_template(
            db_plan.master_template.contents
        )
        environment = parser.parse_environment(
            db_plan.environment_file.contents
        )

        # Create the Tuskar model for the plan.
        deployment_plan = models.DeploymentPlan(
            plan_uuid,
            db_plan.name,
            master_template.description,
            created_at=db_plan.created_at,
            updated_at=db_plan.updated_at,
        )

        roles = self._find_roles(environment)
        deployment_plan.add_roles(*roles)

        params = self._find_parameters(master_template, environment)
        deployment_plan.add_parameters(*params)

        return deployment_plan
示例#16
0
    def test_add_role_to_seeded_plan(self):
        # Setup
        self.seed_store.create(MASTER_SEED_NAME, TEST_SEED)
        self.registry_store.create(RESOURCE_REGISTRY_NAME, RESOURCE_REGISTRY)
        # more setup (this is normally called in load_roles)
        self.registry_mapping_store.create('required_file.yaml',
                                           'some fake template data')
        test_role = self._add_test_role()
        test_plan = self.plans_manager.create_plan('p1', 'd1')

        # Test
        self.plans_manager.add_role_to_plan(test_plan.uuid, test_role.uuid)

        # Verify
        db_plan = self.plan_store.retrieve(test_plan.uuid)
        parsed_plan = parser.parse_template(db_plan.master_template.contents)
        self.assertEqual(2, len(parsed_plan.resources))

        # The role generated in the plan has a different name:
        my_role = parsed_plan.find_resource_by_id('r1')
        self.assertIsNot(my_role, None)

        # The reference to the role in some_config should be updated:
        some_config = parsed_plan.find_resource_by_id('some_config')
        self.assertIsNot(some_config, None)
        config_property = some_config.find_property_by_name('config')
        self.assertIsNot(config_property, None)
        self.assertEqual(config_property.value,
                         {'ip_addresses':
                          {'get_attr': ['r1', 'foo_ip']}})

        # verify both entries are present from RESOURCE_REGISTRY
        parsed_env = parser.parse_environment(
            db_plan.environment_file.contents
        )
        self.assertEqual(2, len(parsed_env.registry_entries))
示例#17
0
    def package_templates(self, plan_uuid):
        """Packages and returns all of the templates related to the given plan.
        The returned dictionary is keyed by filename and contains the contents
        of that file (a template or an environment file).

        :type plan_uuid: str

        :return: mapping of filename to contents for each file in the plan
        :rtype:  dict

        :raises tuskar.storage.exceptions.UnknownUUID: if there is no plan
                with the given UUID
        """

        # Load and parse the plan.
        db_plan = self.plan_store.retrieve(plan_uuid)
        master_template = parser.parse_template(
            db_plan.master_template.contents
        )
        environment = parser.parse_environment(
            db_plan.environment_file.contents
        )

        # Compose the plan files and all plan roles and package them into
        # a single dictionary.
        plan_contents = composer.compose_template(master_template)
        env_contents = composer.compose_environment(environment)

        files_dict = {
            'plan.yaml': plan_contents,
            'environment.yaml': env_contents,
        }

        plan_roles = self._find_roles(environment)
        manager = RoleManager()
        for role in plan_roles:
            contents = composer.compose_template(role.template)
            filename = name_utils.role_template_filename(role.name,
                                                         role.version,
                                                         role.relative_path)
            files_dict[filename] = contents

        def _add_template_extra_data_for(templates, template_store):
            template_extra_data = manager.retrieve_db_role_extra()
            for template in templates:
                db_template = template_store.retrieve_by_name(template.name)
                prefix = os_path.split(db_template.name)[0]
                template_extra_paths = utils.resolve_template_extra_data(
                    db_template, template_extra_data)
                extra_data_output = manager.template_extra_data_for_output(
                    template_extra_paths, prefix)
                files_dict.update(extra_data_output)

        # also grab any extradata files for the role
        _add_template_extra_data_for(plan_roles, self.template_store)

        # in addition to provider roles above, return non-role template files
        reg_mapping = self.registry_mapping_store.list()
        for entry in reg_mapping:
            if os_path.splitext(entry.name)[1] in ('.yaml', '.yml'):
                # if entry is an alias, don't include it
                files_dict[entry.name] = entry.contents

        # similarly, also grab extradata files for the non role templates
        _add_template_extra_data_for(reg_mapping, self.registry_mapping_store)

        return files_dict
示例#18
0
    def add_role_to_plan(self, plan_uuid, role_uuid):
        """Adds a role to the given plan, storing the changes in Tuskar's
        storage.

        :type plan_uuid: str
        :type role_uuid: str
        :return: updated plan model instance
        :rtype: tuskar.manager.models.DeploymentPlan
        :raises tuskar.storage.exceptions.UnknownUUID: if either the plan
                or the role cannot be found
        """
        # Load the plan and role from storage
        db_plan = self.plan_store.retrieve(plan_uuid)
        db_role = self.template_store.retrieve(role_uuid)

        # Parse the plan and role template into template objects.
        deployment_plan = self._plan_to_template_object(db_plan)
        role_template = self._role_to_template_object(db_role)

        # See if a master seed template has been set.
        try:
            db_master_seed = self.seed_store.retrieve_by_name(MASTER_SEED_NAME)
            master_seed = parser.parse_template(db_master_seed.contents)
        except UnknownName:
            master_seed = None
            special_properties = None

        def _find_role_type(registry):
            for path in registry.keys():
                if path in db_role.registry_path:
                    return registry[path]

        if master_seed is not None:
            try:
                db_registry_env = self.registry_store.retrieve_by_name(
                    RESOURCE_REGISTRY_NAME).contents
            except UnknownName:
                LOG.error("Could not load resource_registry. Make sure you "
                          "pass --resource-registry to tuskar-load-roles.")
                raise

            parsed_registry_env = parser.parse_environment(db_registry_env)
            registry = dict((e.filename, e.alias)
                            for e in parsed_registry_env.registry_entries)
            role_type = _find_role_type(registry)
            special_properties = template_seed.get_property_map_for_role(
                master_seed, role_type)

        # Use the combination logic to perform the addition.
        role_namespace = name_utils.generate_role_namespace(db_role.name,
                                                            db_role.version)
        template_filename = (
            name_utils.role_template_filename(db_role.name, db_role.version,
                                              db_role.relative_path))
        deployment_plan.add_template(role_namespace, role_template,
                                     template_filename,
                                     override_properties=special_properties)

        # If there is a master seed, add its top-level elements to the plan.
        # These calls are idempotent, so it's safe to call each time a role
        # is added.
        if master_seed is not None:
            template_seed.add_top_level_parameters(
                master_seed,
                deployment_plan.master_template,
                deployment_plan.environment)
            template_seed.add_top_level_resources(
                master_seed, deployment_plan.master_template)
            template_seed.add_top_level_outputs(
                master_seed, deployment_plan.master_template)

            if role_type is None:
                LOG.error(
                    "Role '%s' not found in seed template." % db_role.name)
                raise ValueError(db_role.name)
            seed_role = template_seed.find_role_from_type(
                master_seed.resources, role_type)
            if seed_role is None:
                LOG.error(
                    "Role '%s' of type '%s' not found in seed template." %
                    (db_role.name, role_type))
                raise ValueError(db_role.name)

            # These calls are idempotent, but must be called on each role as
            # new references may have been added.
            template_seed.update_role_resource_references(
                deployment_plan.master_template,
                seed_role,
                db_role.name)

            template_seed.update_role_property_references(
                deployment_plan.master_template,
                seed_role,
                role_namespace)

            # Update environment file to add top level mappings, which is made
            # up of all non-role files present in the resource registry, plus
            # required aliases
            reg_mapping = self.registry_mapping_store.list()

            environment = deployment_plan.environment
            for entry in parsed_registry_env.registry_entries:
                # check if registry_mapping is in database, if so add to
                # environment (later will become environment.yaml)
                if any(x.name == entry.filename for x in reg_mapping):
                    additem = RegistryEntry(entry.alias, entry.filename)
                    environment.add_registry_entry(additem, unique=True)

        # Save the updated plan.
        updated = self._save_updated_plan(plan_uuid, deployment_plan)

        return updated
示例#19
0
    def test_parse_template(self):
        # Test
        t = parser.parse_template(TEST_TEMPLATE)

        # Verify
        self.assertTrue(isinstance(t, heat.Template))
        self.assertEqual(t.version, datetime.date(2013, 5, 23))
        self.assertEqual(t.description, 'Test provider resource foo')

        self.assertEqual(3, len(t.parameters))
        ordered_params = sorted(t.parameters, key=lambda x: x.name)

        # Image ID Parameter
        self.assertEqual('image_id', ordered_params[0].name)
        self.assertEqual('string', ordered_params[0].param_type)
        self.assertEqual('ID of the image to use',
                         ordered_params[0].description)
        self.assertEqual('3e6270da-fbf7-4aef-bc78-6d0cfc3ad11b',
                         ordered_params[0].default)
        self.assertEqual(None, ordered_params[0].hidden)
        self.assertEqual(None, ordered_params[0].label)
        self.assertEqual(0, len(ordered_params[0].constraints))

        # Instance Type Parameter
        self.assertEqual('instance_type', ordered_params[1].name)
        self.assertEqual('string', ordered_params[1].param_type)
        self.assertEqual('Instance type', ordered_params[1].description)
        self.assertEqual('m1.small', ordered_params[1].default)
        self.assertEqual(None, ordered_params[1].hidden)
        self.assertEqual(None, ordered_params[1].label)
        self.assertEqual(1, len(ordered_params[1].constraints))
        c = ordered_params[1].constraints[0]
        self.assertEqual('instance_type must be one of m1.small or m1.medium',
                         c.description)
        self.assertEqual('allowed_values', c.constraint_type)
        self.assertEqual(['m1.small', 'm1.medium', 'm1.large'], c.definition)

        # Key Name Parameter
        self.assertEqual('key_name', ordered_params[2].name)
        self.assertEqual('string', ordered_params[2].param_type)
        self.assertEqual('Name of a KeyPair', ordered_params[2].description)
        self.assertEqual(None, ordered_params[2].default)
        self.assertEqual(True, ordered_params[2].hidden)
        self.assertEqual('Key', ordered_params[2].label)
        self.assertEqual(0, len(ordered_params[2].constraints))

        # Parameter Groups
        self.assertEqual(2, len(t.parameter_groups))
        self.assertEqual('group-1', t.parameter_groups[0].label)
        self.assertEqual('first group', t.parameter_groups[0].description)
        self.assertEqual(sorted(('key_name', 'instance_type')),
                         sorted(t.parameter_groups[0].parameter_names))
        self.assertEqual('group-2', t.parameter_groups[1].label)
        self.assertEqual('second group', t.parameter_groups[1].description)
        self.assertEqual(('image_id', ), t.parameter_groups[1].parameter_names)

        # Resources
        self.assertEqual(1, len(t.resources))
        self.assertEqual('foo_instance', t.resources[0].resource_id)
        self.assertEqual('OS::Nova::Server', t.resources[0].resource_type)
        self.assertEqual(3, len(t.resources[0].properties))

        resource_props = sorted(t.resources[0].properties,
                                key=lambda x: x.name)
        self.assertEqual('flavor', resource_props[0].name)
        self.assertEqual({'get_param': 'instance_type'},
                         resource_props[0].value)
        self.assertEqual('image', resource_props[1].name)
        self.assertEqual({'get_param': 'image_id'}, resource_props[1].value)
        self.assertEqual('key_name', resource_props[2].name)
        self.assertEqual({'get_param': 'key_name'}, resource_props[2].value)

        # Outputs
        self.assertEqual(1, len(t.outputs))
        self.assertEqual('foo_ip', t.outputs[0].name)
        self.assertEqual({'get_attr': ['foo_instance', 'first_address']},
                         t.outputs[0].value)
示例#20
0
    def package_templates(self, plan_uuid):
        """Packages and returns all of the templates related to the given plan.
        The returned dictionary is keyed by filename and contains the contents
        of that file (a template or an environment file).

        :type plan_uuid: str

        :return: mapping of filename to contents for each file in the plan
        :rtype:  dict

        :raises tuskar.storage.exceptions.UnknownUUID: if there is no plan
                with the given UUID
        """

        # Load and parse the plan.
        db_plan = self.plan_store.retrieve(plan_uuid)
        master_template = parser.parse_template(
            db_plan.master_template.contents)
        environment = parser.parse_environment(
            db_plan.environment_file.contents)

        # Compose the plan files and all plan roles and package them into
        # a single dictionary.
        plan_contents = composer.compose_template(master_template)
        env_contents = composer.compose_environment(environment)

        files_dict = {
            'plan.yaml': plan_contents,
            'environment.yaml': env_contents,
        }

        plan_roles = self._find_roles(environment)
        manager = RoleManager()
        for role in plan_roles:
            contents = composer.compose_template(role.template)
            filename = name_utils.role_template_filename(
                role.name, role.version, role.relative_path)
            files_dict[filename] = contents

        def _add_template_extra_data_for(templates, template_store):
            template_extra_data = manager.retrieve_db_role_extra()
            for template in templates:
                db_template = template_store.retrieve_by_name(template.name)
                prefix = os_path.split(db_template.name)[0]
                template_extra_paths = utils.resolve_template_extra_data(
                    db_template, template_extra_data)
                extra_data_output = manager.template_extra_data_for_output(
                    template_extra_paths, prefix)
                files_dict.update(extra_data_output)

        # also grab any extradata files for the role
        _add_template_extra_data_for(plan_roles, self.template_store)

        # in addition to provider roles above, return non-role template files
        reg_mapping = self.registry_mapping_store.list()
        for entry in reg_mapping:
            if os_path.splitext(entry.name)[1] in ('.yaml', '.yml'):
                # if entry is an alias, don't include it
                files_dict[entry.name] = entry.contents

        # similarly, also grab extradata files for the non role templates
        _add_template_extra_data_for(reg_mapping, self.registry_mapping_store)

        return files_dict
示例#21
0
    def test_parse_template(self):
        # Test
        t = parser.parse_template(TEST_TEMPLATE)

        # Verify
        self.assertTrue(isinstance(t, heat.Template))
        self.assertEqual(t.version, datetime.date(2013, 5, 23))
        self.assertEqual(t.description, 'Test provider resource foo')

        self.assertEqual(3, len(t.parameters))
        ordered_params = sorted(t.parameters, key=lambda x: x.name)

        # Image ID Parameter
        self.assertEqual('image_id', ordered_params[0].name)
        self.assertEqual('string', ordered_params[0].param_type)
        self.assertEqual('ID of the image to use',
                         ordered_params[0].description)
        self.assertEqual('3e6270da-fbf7-4aef-bc78-6d0cfc3ad11b',
                         ordered_params[0].default)
        self.assertEqual(None, ordered_params[0].hidden)
        self.assertEqual(None, ordered_params[0].label)
        self.assertEqual(0, len(ordered_params[0].constraints))

        # Instance Type Parameter
        self.assertEqual('instance_type', ordered_params[1].name)
        self.assertEqual('string', ordered_params[1].param_type)
        self.assertEqual('Instance type', ordered_params[1].description)
        self.assertEqual('m1.small', ordered_params[1].default)
        self.assertEqual(None, ordered_params[1].hidden)
        self.assertEqual(None, ordered_params[1].label)
        self.assertEqual(1, len(ordered_params[1].constraints))
        c = ordered_params[1].constraints[0]
        self.assertEqual('instance_type must be one of m1.small or m1.medium',
                         c.description)
        self.assertEqual('allowed_values', c.constraint_type)
        self.assertEqual(['m1.small', 'm1.medium', 'm1.large'], c.definition)

        # Key Name Parameter
        self.assertEqual('key_name', ordered_params[2].name)
        self.assertEqual('string', ordered_params[2].param_type)
        self.assertEqual('Name of a KeyPair', ordered_params[2].description)
        self.assertEqual(None, ordered_params[2].default)
        self.assertEqual(True, ordered_params[2].hidden)
        self.assertEqual('Key', ordered_params[2].label)
        self.assertEqual(0, len(ordered_params[2].constraints))

        # Parameter Groups
        self.assertEqual(2, len(t.parameter_groups))
        self.assertEqual('group-1', t.parameter_groups[0].label)
        self.assertEqual('first group',
                         t.parameter_groups[0].description)
        self.assertEqual(sorted(('key_name', 'instance_type')),
                         sorted(t.parameter_groups[0].parameter_names))
        self.assertEqual('group-2', t.parameter_groups[1].label)
        self.assertEqual('second group',
                         t.parameter_groups[1].description)
        self.assertEqual(('image_id',),
                         t.parameter_groups[1].parameter_names)

        # Resources
        self.assertEqual(1, len(t.resources))
        self.assertEqual('foo_instance', t.resources[0].resource_id)
        self.assertEqual('OS::Nova::Server', t.resources[0].resource_type)
        self.assertEqual(3, len(t.resources[0].properties))

        resource_props = sorted(t.resources[0].properties,
                                key=lambda x: x.name)
        self.assertEqual('flavor', resource_props[0].name)
        self.assertEqual({'get_param': 'instance_type'},
                         resource_props[0].value)
        self.assertEqual('image', resource_props[1].name)
        self.assertEqual({'get_param': 'image_id'},
                         resource_props[1].value)
        self.assertEqual('key_name', resource_props[2].name)
        self.assertEqual({'get_param': 'key_name'},
                         resource_props[2].value)

        # Outputs
        self.assertEqual(1, len(t.outputs))
        self.assertEqual('foo_ip', t.outputs[0].name)
        self.assertEqual({'get_attr': ['foo_instance', 'first_address']},
                         t.outputs[0].value)
示例#22
0
 def _role_to_tuskar_object(db_role):
     parsed = parser.parse_template(db_role.contents)
     role = models.Role(db_role.uuid, db_role.name, db_role.version,
                        parsed.description, parsed)
     return role
示例#23
0
文件: plan.py 项目: marios/tuskar-1
    def add_role_to_plan(self, plan_uuid, role_uuid):
        """Adds a role to the given plan, storing the changes in Tuskar's
        storage.

        :type plan_uuid: str
        :type role_uuid: str
        :return: updated plan model instance
        :rtype: tuskar.manager.models.DeploymentPlan
        :raises tuskar.storage.exceptions.UnknownUUID: if either the plan
                or the role cannot be found
        """

        # Load the plan and role from storage
        db_plan = self.plan_store.retrieve(plan_uuid)
        db_role = self.template_store.retrieve(role_uuid)

        # Parse the plan and role template into template objects.
        deployment_plan = self._plan_to_template_object(db_plan)
        role_template = self._role_to_template_object(db_role)

        # See if a master seed template has been set.
        try:
            db_master_seed = self.seed_store.retrieve_by_name(MASTER_SEED_NAME)
            master_seed = parser.parse_template(db_master_seed.contents)
        except UnknownName:
            master_seed = None
            special_properties = None

        if master_seed is not None:
            try:
                db_registry_env = self.registry_store.retrieve_by_name(
                    RESOURCE_REGISTRY_NAME).contents
            except UnknownName:
                LOG.error("Could not load resource_registry. Make sure you "
                          "pass --resource-registry to tuskar-load-roles.")
                raise
            parsed_registry_env = parser.parse_environment(db_registry_env)
            registry = dict((role_name_from_path(e.filename), e.alias)
                            for e in parsed_registry_env.registry_entries)
            special_properties = template_seed.get_property_map_for_role(
                master_seed, registry[db_role.name])

        # Use the combination logic to perform the addition.
        role_namespace = name_utils.generate_role_namespace(db_role.name,
                                                            db_role.version)
        template_filename = name_utils.role_template_filename(db_role.name,
                                                              db_role.version)
        deployment_plan.add_template(role_namespace, role_template,
                                     template_filename,
                                     override_properties=special_properties)

        # If there is a master seed, add its top-level elements to the plan.
        # These calls are idempotent, so it's safe to call each time a role
        # is added.
        if master_seed is not None:
            template_seed.add_top_level_parameters(
                master_seed,
                deployment_plan.master_template,
                deployment_plan.environment)
            template_seed.add_top_level_resources(
                master_seed, deployment_plan.master_template)
            template_seed.add_top_level_outputs(
                master_seed, deployment_plan.master_template)

            try:
                role_type = registry[db_role.name]
            except KeyError:
                LOG.error(
                    "Role '%s' not found in seed template." % db_role.name)
                raise
            seed_role = template_seed.find_role_from_type(
                master_seed.resources, role_type)
            if seed_role is None:
                LOG.error(
                    "Role '%s' of type '%s' not found in seed template." %
                    (db_role.name, role_type))
                raise ValueError(db_role.name)

            # These calls are idempotent, but must be called on each role as
            # new references may have been added.
            template_seed.update_role_resource_references(
                deployment_plan.master_template,
                seed_role,
                plan.generate_group_id(role_namespace))

            template_seed.update_role_property_references(
                deployment_plan.master_template,
                seed_role,
                role_namespace)

        # Save the updated plan.
        updated = self._save_updated_plan(plan_uuid, deployment_plan)

        return updated
示例#24
0
文件: plan.py 项目: marios/tuskar-1
 def _role_to_template_object(db_role):
     role_template = parser.parse_template(db_role.contents)
     return role_template
示例#25
0
 def _role_to_template_object(db_role):
     role_template = parser.parse_template(db_role.contents)
     return role_template
示例#26
0
文件: role.py 项目: marios/tuskar-1
 def _role_to_tuskar_object(db_role):
     parsed = parser.parse_template(db_role.contents)
     role = models.Role(db_role.uuid, db_role.name, db_role.version,
                        parsed.description, parsed)
     return role
示例#27
0
    def add_role_to_plan(self, plan_uuid, role_uuid):
        """Adds a role to the given plan, storing the changes in Tuskar's
        storage.

        :type plan_uuid: str
        :type role_uuid: str
        :return: updated plan model instance
        :rtype: tuskar.manager.models.DeploymentPlan
        :raises tuskar.storage.exceptions.UnknownUUID: if either the plan
                or the role cannot be found
        """
        # Load the plan and role from storage
        db_plan = self.plan_store.retrieve(plan_uuid)
        db_role = self.template_store.retrieve(role_uuid)

        # Parse the plan and role template into template objects.
        deployment_plan = self._plan_to_template_object(db_plan)
        role_template = self._role_to_template_object(db_role)

        # See if a master seed template has been set.
        try:
            db_master_seed = self.seed_store.retrieve_by_name(MASTER_SEED_NAME)
            master_seed = parser.parse_template(db_master_seed.contents)
        except UnknownName:
            master_seed = None
            special_properties = None

        def _find_role_type(registry):
            for path in registry.keys():
                if path in db_role.registry_path:
                    return registry[path]

        if master_seed is not None:
            try:
                db_registry_env = self.registry_store.retrieve_by_name(
                    RESOURCE_REGISTRY_NAME).contents
            except UnknownName:
                LOG.error("Could not load resource_registry. Make sure you "
                          "pass --resource-registry to tuskar-load-roles.")
                raise

            parsed_registry_env = parser.parse_environment(db_registry_env)
            registry = dict((e.filename, e.alias)
                            for e in parsed_registry_env.registry_entries)
            role_type = _find_role_type(registry)
            special_properties = template_seed.get_property_map_for_role(
                master_seed, role_type)

        # Use the combination logic to perform the addition.
        role_namespace = name_utils.generate_role_namespace(
            db_role.name, db_role.version)
        template_filename = (name_utils.role_template_filename(
            db_role.name, db_role.version, db_role.relative_path))
        deployment_plan.add_template(role_namespace,
                                     role_template,
                                     template_filename,
                                     override_properties=special_properties)

        # If there is a master seed, add its top-level elements to the plan.
        # These calls are idempotent, so it's safe to call each time a role
        # is added.
        if master_seed is not None:
            template_seed.add_top_level_parameters(
                master_seed, deployment_plan.master_template,
                deployment_plan.environment)
            template_seed.add_top_level_resources(
                master_seed, deployment_plan.master_template)
            template_seed.add_top_level_outputs(
                master_seed, deployment_plan.master_template)

            if role_type is None:
                LOG.error("Role '%s' not found in seed template." %
                          db_role.name)
                raise ValueError(db_role.name)
            seed_role = template_seed.find_role_from_type(
                master_seed.resources, role_type)
            if seed_role is None:
                LOG.error(
                    "Role '%s' of type '%s' not found in seed template." %
                    (db_role.name, role_type))
                raise ValueError(db_role.name)

            # These calls are idempotent, but must be called on each role as
            # new references may have been added.
            template_seed.update_role_resource_references(
                deployment_plan.master_template, seed_role, db_role.name)

            template_seed.update_role_property_references(
                deployment_plan.master_template, seed_role, role_namespace)

            # Update environment file to add top level mappings, which is made
            # up of all non-role files present in the resource registry, plus
            # required aliases
            reg_mapping = self.registry_mapping_store.list()

            environment = deployment_plan.environment
            for entry in parsed_registry_env.registry_entries:
                # check if registry_mapping is in database, if so add to
                # environment (later will become environment.yaml)
                if any(x.name == entry.filename for x in reg_mapping):
                    additem = RegistryEntry(entry.alias, entry.filename)
                    environment.add_registry_entry(additem, unique=True)

        # Save the updated plan.
        updated = self._save_updated_plan(plan_uuid, deployment_plan)

        return updated