def on_post(self, req, resp): try: json_data = self.req_json(req) design = None if json_data is not None: base_design = json_data.get('base_design_id', None) if base_design is not None: base_design = uuid.UUID(base_design) design = hd_objects.SiteDesign( base_design_id=base_design_uuid) else: design = hd_objects.SiteDesign() design.assign_id() design.create(req.context, self.state_manager) resp.body = json.dumps(design.obj_to_simple()) resp.status = falcon.HTTP_201 except errors.StateError as stex: self.error(req.context, "Error updating persistence") self.return_error(resp, falcon.HTTP_500, message="Error updating persistence", retry=True) except errors.InvalidFormat as fex: self.error(req.context, str(fex)) self.return_error(resp, falcon.HTTP_400, message=str(fex), retry=False)
def test_ingest_federated_design(self, input_files): objects.register_all() profiles_file = input_files.join("fullsite_profiles.yaml") networks_file = input_files.join("fullsite_networks.yaml") nodes_file = input_files.join("fullsite_nodes.yaml") design_state = DesignState() design_data = objects.SiteDesign() design_id = design_data.assign_id() design_state.post_design(design_data) ingester = Ingester() ingester.enable_plugins( ['drydock_provisioner.ingester.plugins.yaml.YamlIngester']) ingester.ingest_data(plugin_name='yaml', design_state=design_state, design_id=design_id, filenames=[ str(profiles_file), str(networks_file), str(nodes_file) ]) design_data = design_state.get_design(design_id) assert len(design_data.host_profiles) == 2
def test_orch_preparesite(self, input_files): objects.register_all() input_file = input_files.join("fullsite.yaml") design_state = statemgmt.DesignState() design_data = objects.SiteDesign() design_id = design_data.assign_id() design_state.post_design(design_data) ingester = Ingester() ingester.enable_plugins([drydock_provisioner.ingester.plugins.yaml.YamlIngester]) ingester.ingest_data(plugin_name='yaml', design_state=design_state, filenames=[str(input_file)], design_id=design_id) design_data = design_state.get_design(design_id) orchestrator = orch.Orchestrator(state_manager=design_state, enabled_drivers={'node': 'drydock_provisioner.drivers.node.maasdriver.driver.MaasNodeDriver'}) orch_task = orchestrator.create_task(task.OrchestratorTask, site='sitename', design_id=design_id, action=hd_fields.OrchestratorAction.PrepareSite) orchestrator.execute_task(orch_task.get_id()) orch_task = design_state.get_task(orch_task.get_id()) assert orch_task.result == hd_fields.ActionResult.Success
def loaded_design(self, input_files): objects.register_all() input_file = input_files.join("oob.yaml") design_state = statemgmt.DesignState() design_data = objects.SiteDesign(id=self.design_id) design_state.post_design(design_data) ingester = Ingester() ingester.enable_plugins([yaml_ingester.YamlIngester]) ingester.ingest_data(plugin_name='yaml', design_state=design_state, design_id=self.design_id, filenames=[str(input_file)]) return design_state
def test_ingest_full_site(self, input_files): objects.register_all() input_file = input_files.join("fullsite.yaml") design_state = DesignState() design_data = objects.SiteDesign() design_id = design_data.assign_id() design_state.post_design(design_data) ingester = Ingester() ingester.enable_plugins( ['drydock_provisioner.ingester.plugins.yaml.YamlIngester']) ingester.ingest_data(plugin_name='yaml', design_state=design_state, filenames=[str(input_file)], design_id=design_id) design_data = design_state.get_design(design_id) assert len(design_data.host_profiles) == 2 assert len(design_data.baremetal_nodes) == 2
def test_rack_not_found(self, input_files): objects.register_all() input_file = input_files.join("fullsite.yaml") design_state = DesignState() design_data = objects.SiteDesign() design_id = design_data.assign_id() design_state.post_design(design_data) ingester = Ingester() ingester.enable_plugins( ['drydock_provisioner.ingester.plugins.yaml.YamlIngester']) ingester.ingest_data(plugin_name='yaml', design_state=design_state, filenames=[str(input_file)], design_id=design_id) design_data = design_state.get_design(design_id) with pytest.raises(errors.DesignError): rack = design_data.get_rack('foo')
def test_sitedesign_post(self): objects.register_all() state_manager = statemgmt.DesignState() design_data = objects.SiteDesign() design_id = design_data.assign_id() initial_site = objects.Site() initial_site.name = 'testsite' net_a = objects.Network() net_a.name = 'net_a' net_a.region = 'testsite' net_a.cidr = '172.16.0.0/24' design_data.set_site(initial_site) design_data.add_network(net_a) state_manager.post_design(design_data) my_design = state_manager.get_design(design_id) assert design_data.obj_to_primitive() == my_design.obj_to_primitive()
def test_rack_parse(self, input_files): objects.register_all() input_file = input_files.join("fullsite.yaml") design_state = DesignState() design_data = objects.SiteDesign() design_id = design_data.assign_id() design_state.post_design(design_data) ingester = Ingester() ingester.enable_plugins( ['drydock_provisioner.ingester.plugins.yaml.YamlIngester']) ingester.ingest_data(plugin_name='yaml', design_state=design_state, filenames=[str(input_file)], design_id=design_id) design_data = design_state.get_design(design_id) rack = design_data.get_rack('rack1') assert rack.location.get('grid') == 'EG12'
def ingest_data(self, design_state=None, design_ref=None, context=None, **kwargs): """Execute a data ingestion of the design reference. Return a tuple of the processing status and a instance of objects.SiteDesign populated with all the processed design parts. :param design_state: - An instance of statemgmt.state.DrydockState :param design_ref: - The design reference to source design data from :param context: - Context of the request requesting ingestion :param kwargs: - Keywork arguments to pass to the ingester plugin """ if design_state is None: self.logger.error( "Ingester:ingest_data called without valid DrydockState handler" ) raise ValueError("Invalid design_state handler") # If no design_id is specified, instantiate a new one if 'design_ref' is None: self.logger.error( "Ingester:ingest_data required kwarg 'design_ref' missing") raise ValueError( "Ingester:ingest_data required kwarg 'design_ref' missing") self.logger.debug( "Ingester:ingest_data ingesting design parts for design %s" % design_ref) design_blob = design_state.get_design_documents(design_ref) self.logger.debug("Ingesting design data of %d bytes." % len(design_blob)) try: status, design_items = self.registered_plugin.ingest_data( content=design_blob, **kwargs) except errors.IngesterError as vex: self.logger.warn( "Ingester:ingest_data - Unexpected error processing data - %s" % (str(vex))) return None, None self.logger.debug("Ingester:ingest_data parsed %s design parts" % str(len(design_items))) design_data = objects.SiteDesign() for m in design_items: if context is not None: m.set_create_fields(context) if type(m) is site.Site: design_data.set_site(m) elif type(m) is network.Network: design_data.add_network(m) elif type(m) is network.NetworkLink: design_data.add_network_link(m) elif type(m) is hostprofile.HostProfile: design_data.add_host_profile(m) elif type(m) is hwprofile.HardwareProfile: design_data.add_hardware_profile(m) elif type(m) is node.BaremetalNode: design_data.add_baremetal_node(m) elif type(m) is prom.PromenadeConfig: design_data.add_promenade_config(m) elif type(m) is rack.Rack: design_data.add_rack(m) elif type(m) is bootaction.BootAction: design_data.add_bootaction(m) return status, design_data