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))
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.', }))
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))