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