def test_update_role_property_references(self): # Setup dp = plan.DeploymentPlan() dp.add_template('ns1', self.role_template, 'foo.yaml') template_seed.add_top_level_resources(self.seed_template, dp.master_template) template_seed.add_top_level_resources(self.seed_template, dp.master_template) # Test seed_role = template_seed.find_role_from_type( self.seed_template.resources, 'OS::TripleO::Controller') template_seed.update_role_property_references( dp.master_template, seed_role, 'ns1') # Verify tlr2 = dp.master_template.find_resource_by_id('TopLevelResource2') self.assertTrue(tlr2 is not None) c3 = tlr2.find_property_by_name('config-3') sub2 = c3.value['sub-1']['sub-2'] self.assertTrue('get_param' in sub2) self.assertEqual('ns1::RoleParameter1', sub2['get_param'])
def test_add_top_level_resources_idempotency(self): # Test template_seed.add_top_level_resources(self.seed_template, self.destination_template) template_seed.add_top_level_resources(self.seed_template, self.destination_template) # Verify self.assertEqual(2, len(self.destination_template.resources))
def test_add_top_level_resources(self): # Test template_seed.add_top_level_resources(self.seed_template, self.destination_template) # Verify self.assertEqual(2, len(self.destination_template.resources)) added_resource_ids = [r.resource_id for r in self.destination_template.resources] self.assertEqual(['TopLevelResource1', 'TopLevelResource2'], sorted(added_resource_ids))
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
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
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