Beispiel #1
0
 def read(self, request, version, mac=None):
     check_version(version)
     node = get_queried_node(request, for_mac=mac)
     try:
         # When a node is deploying, cloud-init's request
         # for user-data is when MAAS hands the node
         # off to a user.
         if node.status == NODE_STATUS.DEPLOYING:
             if node.install_kvm:
                 # Rather than ending deployment here, note that we're
                 # installing a KVM pod.
                 node.agent_name = "maas-kvm-pod"
                 node.save()
             else:
                 # MAAS currently considers a machine "Deployed" when the
                 # cloud-init user data is requested. Note that this doesn't
                 # mean the machine is ready for use yet; cloud-init will
                 # also send a 'finish' event for the 'modules-final'
                 # activity name. However, that check is ambiguous because
                 # it occurs both when curtin is installing, and when
                 # the machine reboots to finish its deployment.
                 node.end_deployment()
         # If this node is supposed to be powered off, serve the
         # 'poweroff' userdata.
         if node.get_boot_purpose() == 'poweroff':
             user_data = generate_user_data_for_poweroff(node=node,
                                                         request=request)
         else:
             user_data = NodeUserData.objects.get_user_data(node)
         return HttpResponse(user_data,
                             content_type='application/octet-stream')
     except NodeUserData.DoesNotExist:
         logger.info("No user data registered for node named %s" %
                     node.hostname)
         return HttpResponse(status=int(http.client.NOT_FOUND))
Beispiel #2
0
    def test_generate_user_data_produces_poweroff_script(self):
        node = factory.make_Node()
        user_data = generate_user_data_for_poweroff(node)
        parsed_data = email.message_from_string(user_data.decode("utf-8"))
        self.assertTrue(parsed_data.is_multipart())

        user_data_script = parsed_data.get_payload()[0]
        self.assertEquals('text/x-shellscript; charset="utf-8"',
                          user_data_script['Content-Type'])
        self.assertEquals('base64',
                          user_data_script['Content-Transfer-Encoding'])
        self.assertEquals('attachment; filename="user_data.sh"',
                          user_data_script['Content-Disposition'])
        self.assertThat(base64.b64decode(user_data_script.get_payload()),
                        ContainsAll({
                            b'Powering node off.',
                        }))
Beispiel #3
0
 def read(self, request, version, mac=None):
     check_version(version)
     node = get_queried_node(request, for_mac=mac)
     try:
         # When a node is deploying, cloud-init's request
         # for user-data is when MAAS hands the node
         # off to a user.
         if node.status == NODE_STATUS.DEPLOYING:
             node.end_deployment()
         # If this node is supposed to be powered off, serve the
         # 'poweroff' userdata.
         if node.get_boot_purpose() == 'poweroff':
             user_data = generate_user_data_for_poweroff(node=node)
         else:
             user_data = NodeUserData.objects.get_user_data(node)
         return HttpResponse(user_data,
                             content_type='application/octet-stream')
     except NodeUserData.DoesNotExist:
         logger.info("No user data registered for node named %s" %
                     node.hostname)
         return HttpResponse(status=int(http.client.NOT_FOUND))