def test_compose_preseed_with_curtin_installer(self): node = factory.make_node(status=NODE_STATUS.READY) node.use_fastpath_installer() preseed = compose_preseed(node) preseed = yaml.safe_load(compose_preseed(node)) self.assertIn('datasource', preseed) self.assertIn('MAAS', preseed['datasource']) self.assertThat( preseed['datasource']['MAAS'], KeysEqual( 'metadata_url', 'consumer_key', 'token_key', 'token_secret')) self.assertEqual( absolute_reverse('curtin-metadata'), preseed['datasource']['MAAS']['metadata_url'])
def test_compose_preseed_includes_node_oauth_token(self): node = factory.make_node(status=NODE_STATUS.READY) preseed = compose_preseed(node) token = NodeKey.objects.get_token_for_node(node) self.assertIn('oauth_consumer_key=%s' % token.consumer.key, preseed) self.assertIn('oauth_token_key=%s' % token.key, preseed) self.assertIn('oauth_token_secret=%s' % token.secret, preseed)
def test_compose_preseed_for_commissioning_includes_auth_token(self): node = factory.make_node(status=NODE_STATUS.COMMISSIONING) preseed = yaml.safe_load(compose_preseed(node)) maas_dict = preseed['datasource']['MAAS'] token = NodeKey.objects.get_token_for_node(node) self.assertEqual(token.consumer.key, maas_dict['consumer_key']) self.assertEqual(token.key, maas_dict['token_key']) self.assertEqual(token.secret, maas_dict['token_secret'])
def test_compose_preseed_for_commissioning_node_produces_yaml(self): node = factory.make_node(status=NODE_STATUS.COMMISSIONING) preseed = yaml.safe_load(compose_preseed(node)) self.assertIn('datasource', preseed) self.assertIn('MAAS', preseed['datasource']) self.assertThat( preseed['datasource']['MAAS'], KeysEqual( 'metadata_url', 'consumer_key', 'token_key', 'token_secret'))
def test_compose_preseed_for_commissioning_node_manages_etc_hosts(self): # Regression test for LP:1670444 rack_controller = factory.make_RackController() node = factory.make_Node( interface=True, status=random.choice([ NODE_STATUS.COMMISSIONING, NODE_STATUS.TESTING, NODE_STATUS.RESCUE_MODE, ]), with_empty_script_sets=True, ) nic = node.get_boot_interface() nic.vlan.dhcp_on = True nic.vlan.primary_rack = rack_controller nic.vlan.save() request = make_HttpRequest() preseed = yaml.safe_load( compose_preseed(request, PRESEED_TYPE.COMMISSIONING, node)) self.assertTrue(preseed["manage_etc_hosts"])
def test_compose_preseed_uses_request_build_absolute_uri(self): rack_controller = factory.make_RackController(url="") node = factory.make_Node(interface=True, status=NODE_STATUS.COMMISSIONING) nic = node.get_boot_interface() nic.vlan.dhcp_on = True nic.vlan.primary_rack = rack_controller nic.vlan.save() request = make_HttpRequest() preseed = yaml.safe_load( compose_preseed(request, PRESEED_TYPE.COMMISSIONING, node)) self.assertEqual( request.build_absolute_uri(reverse("metadata")), preseed["datasource"]["MAAS"]["metadata_url"], ) self.assertEqual( request.build_absolute_uri( reverse("metadata-status", args=[node.system_id])), preseed["reporting"]["maas"]["endpoint"], )
def test_compose_preseed_for_commissioning_includes_auth_tokens(self): rack_controller = factory.make_RackController() node = factory.make_Node(interface=True, status=NODE_STATUS.COMMISSIONING) nic = node.get_boot_interface() nic.vlan.dhcp_on = True nic.vlan.primary_rack = rack_controller nic.vlan.save() request = make_HttpRequest() preseed = yaml.safe_load( compose_preseed(request, PRESEED_TYPE.COMMISSIONING, node)) maas_dict = preseed["datasource"]["MAAS"] reporting_dict = preseed["reporting"]["maas"] token = NodeKey.objects.get_token_for_node(node) self.assertEqual(token.consumer.key, maas_dict["consumer_key"]) self.assertEqual(token.key, maas_dict["token_key"]) self.assertEqual(token.secret, maas_dict["token_secret"]) self.assertEqual(token.consumer.key, reporting_dict["consumer_key"]) self.assertEqual(token.key, reporting_dict["token_key"]) self.assertEqual(token.secret, reporting_dict["token_secret"])
def test_compose_preseed_for_enable_ssh_ignored_unsupported_states(self): rack_controller = factory.make_RackController() for status, status_name in NODE_STATUS_CHOICES: if status in { NODE_STATUS.COMMISSIONING, NODE_STATUS.TESTING, NODE_STATUS.ENTERING_RESCUE_MODE, }: continue node = factory.make_Node(interface=True, status=status, enable_ssh=True) nic = node.get_boot_interface() nic.vlan.dhcp_on = True nic.vlan.primary_rack = rack_controller nic.vlan.save() request = make_HttpRequest() preseed = yaml.safe_load( compose_preseed(request, PRESEED_TYPE.COMMISSIONING, node)) self.assertIn("power_state", preseed, status_name)
def test_compose_preseed_uses_maas_syslog_port(self): syslog_port = factory.pick_port() Config.objects.set_config("maas_syslog_port", syslog_port) rack_controller = factory.make_RackController(url="") node = factory.make_Node(interface=True, status=NODE_STATUS.COMMISSIONING) nic = node.get_boot_interface() nic.vlan.dhcp_on = True nic.vlan.primary_rack = rack_controller nic.vlan.save() ip_address = factory.make_ipv4_address() node.boot_cluster_ip = ip_address node.save() request = make_HttpRequest() preseed = yaml.safe_load( compose_preseed(request, PRESEED_TYPE.COMMISSIONING, node)) self.assertEqual( "%s:%d" % (ip_address, syslog_port), preseed["rsyslog"]["remotes"]["maas"], )
def get_node_preseed_context(node, release=''): """Return the node-dependent context dictionary to be used to render preseed templates. :param node: See `get_preseed_filenames`. :param release: See `get_preseed_filenames`. :return: The context dictionary. :rtype: dict. """ # Create the url and the url-data (POST parameters) used to turn off # PXE booting once the install of the node is finished. node_disable_pxe_url = absolute_reverse('metadata-node-by-id', args=['latest', node.system_id], base_url=node.nodegroup.maas_url) node_disable_pxe_data = urlencode({'op': 'netboot_off'}) return { 'node': node, 'preseed_data': compose_preseed(node), 'node_disable_pxe_url': node_disable_pxe_url, 'node_disable_pxe_data': node_disable_pxe_data, }
def get_node_preseed_context(node, release=''): """Return the node-dependent context dictionary to be used to render preseed templates. :param node: See `get_preseed_filenames`. :param release: See `get_preseed_filenames`. :return: The context dictionary. :rtype: dict. """ # Create the url and the url-data (POST parameters) used to turn off # PXE booting once the install of the node is finished. node_disable_pxe_url = absolute_reverse( 'metadata-node-by-id', args=['latest', node.system_id], base_url=node.nodegroup.maas_url) node_disable_pxe_data = urlencode({'op': 'netboot_off'}) return { 'node': node, 'preseed_data': compose_preseed(node), 'node_disable_pxe_url': node_disable_pxe_url, 'node_disable_pxe_data': node_disable_pxe_data, }
def test_compose_preseed_valid_local_cloud_config(self): node = factory.make_node(status=NODE_STATUS.READY) preseed = compose_preseed(node) keyname = "cloud-init/local-cloud-config" self.assertIn(keyname, preseed) # Expected input is 'cloud-init/local-cloud-config string VALUE' # where one or more spaces in between tokens, and VALUE ending # at newline. config = preseed[preseed.find(keyname) + len(keyname):] value = config.lstrip().split("string")[1].lstrip() # Now debconf-unescape it. value = value.replace("\\n", "\n").replace("\\\\", "\\") # At this point it should be valid yaml. data = yaml.safe_load(value) self.assertIn("manage_etc_hosts", data) self.assertEqual(data["manage_etc_hosts"], "localhost") self.assertIn("apt_preserve_sources_list", data) self.assertEqual(data["apt_preserve_sources_list"], True)
def test_compose_preseed_for_commissioning_includes_metadata_url(self): node = factory.make_node(status=NODE_STATUS.COMMISSIONING) preseed = yaml.safe_load(compose_preseed(node)) self.assertEqual( absolute_reverse('metadata'), preseed['datasource']['MAAS']['metadata_url'])
def test_compose_preseed_includes_metadata_url(self): node = factory.make_node(status=NODE_STATUS.READY) self.assertIn(absolute_reverse('metadata'), compose_preseed(node))
def test_compose_preseed_for_commissioning_node_has_header(self): node = factory.make_node(status=NODE_STATUS.COMMISSIONING) self.assertThat(compose_preseed(node), StartsWith("#cloud-config\n"))