Beispiel #1
0
    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'])
Beispiel #2
0
 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)
Beispiel #3
0
 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'])
Beispiel #4
0
 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"],
     )
Beispiel #7
0
 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"])
Beispiel #8
0
 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)
Beispiel #9
0
 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"],
     )
Beispiel #10
0
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,
    }
Beispiel #11
0
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,
    }
Beispiel #12
0
    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)
Beispiel #13
0
 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'])
Beispiel #14
0
 def test_compose_preseed_includes_metadata_url(self):
     node = factory.make_node(status=NODE_STATUS.READY)
     self.assertIn(absolute_reverse('metadata'), compose_preseed(node))
Beispiel #15
0
 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"))