Example #1
0
    def test_design_inheritance(self, input_files, setup):
        input_file = input_files.join("fullsite.yaml")

        design_state = DrydockState()
        design_ref = "file://%s" % str(input_file)

        ingester = Ingester()
        ingester.enable_plugin(
            'drydock_provisioner.ingester.plugins.yaml.YamlIngester')

        orchestrator = Orchestrator(
            state_manager=design_state, ingester=ingester)

        design_status, design_data = orchestrator.get_effective_site(
            design_ref)

        assert len(design_data.baremetal_nodes) == 2

        node = design_data.get_baremetal_node("controller01")

        assert node.hardware_profile == 'HPGen9v3'

        iface = node.get_applied_interface('bond0')

        assert len(iface.get_hw_slaves()) == 2

        iface = node.get_applied_interface('pxe')

        assert len(iface.get_hw_slaves()) == 1
    def test_routedomain_omit_source_subnet(self, input_files, setup):
        input_file = input_files.join("deckhand_routedomain.yaml")

        design_state = DrydockState()
        design_ref = "file://%s" % str(input_file)

        ingester = Ingester()
        ingester.enable_plugin(
            'drydock_provisioner.ingester.plugins.deckhand.DeckhandIngester')

        orchestrator = Orchestrator(state_manager=design_state,
                                    ingester=ingester)

        design_status, design_data = orchestrator.get_effective_site(
            design_ref)

        assert design_status.status == hd_fields.ValidationResult.Success

        net_rack3 = design_data.get_network('storage_rack3')

        route_cidrs = list()
        for r in net_rack3.routes:
            if 'subnet' in r and r.get('subnet') is not None:
                route_cidrs.append(r.get('subnet'))

        assert '172.16.3.0/24' not in route_cidrs
    def test_node_filter_dict(self, input_files, setup, test_orchestrator):
        input_file = input_files.join("fullsite.yaml")

        design_state = DrydockState()
        design_ref = "file://%s" % str(input_file)

        ingester = Ingester()
        ingester.enable_plugin(
            'drydock_provisioner.ingester.plugins.yaml.YamlIngester')
        design_status, design_data = ingester.ingest_data(
            design_state=design_state, design_ref=design_ref)

        nfs = {
            'filter_set_type':
            'intersection',
            'filter_set': [
                {
                    'filter_type': 'intersection',
                    'node_names': 'compute01',
                },
            ],
        }

        node_list = test_orchestrator.process_node_filter(nfs, design_data)

        assert len(node_list) == 1
Example #4
0
    def test_task_termination(self, setup, blank_state):
        ingester = Ingester()
        ingester.enable_plugin(
            'drydock_provisioner.ingester.plugins.yaml.YamlIngester')

        orchestrator = orch.Orchestrator(state_manager=blank_state,
                                         ingester=ingester)
        orch_task = orchestrator.create_task(
            action=hd_fields.OrchestratorAction.Noop)

        orch_task.set_status(hd_fields.TaskStatus.Queued)
        orch_task.save()

        orch_thread = threading.Thread(target=orchestrator.watch_for_tasks)
        orch_thread.start()

        try:
            time.sleep(2)
            orchestrator.terminate_task(orch_task)

            time.sleep(10)
            orch_task = blank_state.get_task(orch_task.get_id())
            assert orch_task.get_status() == hd_fields.TaskStatus.Terminated
        finally:
            orchestrator.stop_orchestrator()
            orch_thread.join(10)
    def test_bootaction_tarbuilder(self, input_files, setup):
        objects.register_all()

        input_file = input_files.join("fullsite.yaml")

        design_state = DrydockState()
        design_ref = "file://%s" % str(input_file)

        ingester = Ingester()
        ingester.enable_plugin(
            'drydock_provisioner.ingester.plugins.yaml.YamlIngester')
        design_status, design_data = ingester.ingest_data(
            design_state=design_state, design_ref=design_ref)

        target_host = 'compute01'

        ba = design_data.get_bootaction('helloworld')
        action_id = ulid2.generate_binary_ulid()
        assets = ba.render_assets(target_host, design_data, action_id)

        assert len(assets) > 0

        tarbytes = BootactionUtils.tarbuilder(assets)

        assert tarbytes is not None

        fileobj = io.BytesIO(tarbytes)
        tarball = tarfile.open(mode='r:gz', fileobj=fileobj)

        tarasset = tarball.getmember('/var/tmp/hello.sh')

        assert tarasset.mode == 0o555
Example #6
0
    def test_ingest_full_site(self, input_files, setup):
        objects.register_all()

        input_file = input_files.join("fullsite.yaml")

        design_state = DrydockState()
        design_ref = "file://%s" % str(input_file)

        ingester = Ingester()
        ingester.enable_plugin(
            'drydock_provisioner.ingester.plugins.yaml.YamlIngester')
        design_status, design_data = ingester.ingest_data(
            design_state=design_state, design_ref=design_ref)

        assert len(design_data.host_profiles) == 2
        assert len(design_data.baremetal_nodes) == 2
    def test_rack_not_found(self, input_files, setup):
        objects.register_all()

        input_file = input_files.join("fullsite.yaml")

        design_state = DrydockState()
        design_ref = "file://%s" % str(input_file)

        ingester = Ingester()
        ingester.enable_plugin(
            'drydock_provisioner.ingester.plugins.yaml.YamlIngester')
        design_status, design_data = ingester.ingest_data(
            design_state=design_state, design_ref=design_ref)

        with pytest.raises(errors.DesignError):
            design_data.get_rack('foo')
    def test_bootaction_parse(self, input_files, setup):
        objects.register_all()

        input_file = input_files.join("bootaction.yaml")

        design_state = DrydockState()
        design_ref = "file://%s" % str(input_file)

        ingester = Ingester()
        ingester.enable_plugin(
            'drydock_provisioner.ingester.plugins.yaml.YamlIngester')
        design_status, design_data = ingester.ingest_data(
            design_state=design_state, design_ref=design_ref)

        ba = design_data.get_bootaction('helloworld')

        assert len(ba.asset_list) == 2
    def test_rack_parse(self, input_files, setup):
        objects.register_all()

        input_file = input_files.join("fullsite.yaml")

        design_state = DrydockState()
        design_ref = "file://%s" % str(input_file)

        ingester = Ingester()
        ingester.enable_plugin(
            'drydock_provisioner.ingester.plugins.yaml.YamlIngester')
        design_status, design_data = ingester.ingest_data(
            design_state=design_state, design_ref=design_ref)

        rack = design_data.get_rack('rack1')

        assert rack.location.get('grid') == 'EG12'
    def test_bootaction_render(self, input_files, setup):
        objects.register_all()

        input_file = input_files.join("fullsite.yaml")

        design_state = DrydockState()
        design_ref = "file://%s" % str(input_file)

        ingester = Ingester()
        ingester.enable_plugin(
            'drydock_provisioner.ingester.plugins.yaml.YamlIngester')
        design_status, design_data = ingester.ingest_data(
            design_state=design_state, design_ref=design_ref)

        ba = design_data.get_bootaction('helloworld')
        action_id = ulid2.generate_binary_ulid()
        assets = ba.render_assets('compute01', design_data, action_id)

        assert 'compute01' in assets[0].rendered_bytes.decode('utf-8')
    def test_node_filter_obj(self, input_files, setup, test_orchestrator):
        input_file = input_files.join("fullsite.yaml")

        design_state = DrydockState()
        design_ref = "file://%s" % str(input_file)

        ingester = Ingester()
        ingester.enable_plugin(
            'drydock_provisioner.ingester.plugins.yaml.YamlIngester')
        design_status, design_data = ingester.ingest_data(
            design_state=design_state, design_ref=design_ref)

        nf = objects.NodeFilter()
        nf.filter_type = 'intersection'
        nf.node_names = ['compute01']
        nfs = objects.NodeFilterSet(filter_set_type='intersection',
                                    filter_set=[nf])

        node_list = test_orchestrator.process_node_filter(nfs, design_data)

        assert len(node_list) == 1
Example #12
0
def yaml_ingester():
    ingester = Ingester()
    ingester.enable_plugin(
        'drydock_provisioner.ingester.plugins.yaml.YamlIngester')
    return ingester
Example #13
0
def deckhand_ingester():
    ingester = Ingester()
    ingester.enable_plugin(
        'drydock_provisioner.ingester.plugins.deckhand.DeckhandIngester')
    return ingester
Example #14
0
def start_drydock(enable_keystone=True):
    objects.register_all()

    # Setup configuration parsing
    cli_options = [
        cfg.BoolOpt('debug',
                    short='d',
                    default=False,
                    help='Enable debug logging'),
    ]

    config.config_mgr.conf.register_cli_opts(cli_options)
    config.config_mgr.register_options(enable_keystone=enable_keystone)
    config.config_mgr.conf(sys.argv[1:])

    if config.config_mgr.conf.debug:
        config.config_mgr.conf.set_override(name='log_level',
                                            override='DEBUG',
                                            group='logging')

    # Setup root logger
    logger = logging.getLogger(
        config.config_mgr.conf.logging.global_logger_name)

    logger.setLevel(config.config_mgr.conf.logging.log_level)
    ch = logging.StreamHandler()
    formatter = logging.Formatter(
        '%(asctime)s - %(levelname)s - %(filename)s:%(funcName)s - %(message)s'
    )
    ch.setFormatter(formatter)
    logger.addHandler(ch)

    # Specalized format for API logging
    logger = logging.getLogger(
        config.config_mgr.conf.logging.control_logger_name)
    logger.propagate = False
    formatter = logging.Formatter(
        '%(asctime)s - %(levelname)s - %(user)s - %(req_id)s - %(external_ctx)s - %(message)s'
    )

    ch = logging.StreamHandler()
    ch.setFormatter(formatter)
    logger.addHandler(ch)

    state = DrydockState()
    state.connect_db()

    input_ingester = Ingester()
    input_ingester.enable_plugin(config.config_mgr.conf.plugins.ingester)

    orchestrator = Orchestrator(enabled_drivers=config.config_mgr.conf.plugins,
                                state_manager=state,
                                ingester=input_ingester)

    orch_thread = threading.Thread(target=orchestrator.watch_for_tasks)
    orch_thread.start()

    # Check if we have an API key in the environment
    # Hack around until we move MaaS configs to the YAML schema
    if 'MAAS_API_KEY' in os.environ:
        config.config_mgr.conf.set_override(
            name='maas_api_key',
            override=os.environ['MAAS_API_KEY'],
            group='maasdriver')

    # Setup the RBAC policy enforcer
    policy.policy_engine = policy.DrydockPolicy()
    policy.policy_engine.register_policy()

    # Ensure that the policy_engine is initialized before starting the API
    wsgi_callable = api.start_api(state_manager=state,
                                  ingester=input_ingester,
                                  orchestrator=orchestrator)

    # Now that loggers are configured, log the effective config
    config.config_mgr.conf.log_opt_values(
        logging.getLogger(config.config_mgr.conf.logging.global_logger_name),
        logging.DEBUG)

    return wsgi_callable