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
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
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
def yaml_ingester(): ingester = Ingester() ingester.enable_plugin( 'drydock_provisioner.ingester.plugins.yaml.YamlIngester') return ingester
def deckhand_ingester(): ingester = Ingester() ingester.enable_plugin( 'drydock_provisioner.ingester.plugins.deckhand.DeckhandIngester') return ingester
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