107
107
self.assertRaises(UnknownMetadataVersion, check_version, '1.0')
109
109
def test_get_node_for_request_finds_node(self):
110
node = factory.make_node()
110
node = factory.make_Node()
111
111
token = NodeKey.objects.get_token_for_node(node)
112
112
request = self.fake_request(
113
113
HTTP_AUTHORIZATION=factory.make_oauth_header(
129
129
MAASAPINotFound, get_node_for_mac, factory.getRandomMACAddress())
131
131
def test_get_node_for_mac_finds_node_by_mac(self):
132
mac = factory.make_mac_address()
132
mac = factory.make_MACAddress()
133
133
self.assertEqual(mac.node, get_node_for_mac(mac.mac_address))
135
135
def test_get_queried_node_looks_up_by_mac_if_given(self):
136
mac = factory.make_mac_address()
136
mac = factory.make_MACAddress()
137
137
self.assertEqual(
139
139
get_queried_node(object(), for_mac=mac.mac_address))
141
141
def test_get_queried_node_looks_up_oauth_key_by_default(self):
142
node = factory.make_node()
142
node = factory.make_Node()
143
143
token = NodeKey.objects.get_token_for_node(node)
144
144
request = self.fake_request(
145
145
HTTP_AUTHORIZATION=factory.make_oauth_header(
150
150
def make_node_client(node=None):
151
151
"""Create a test client logged in as if it were `node`."""
153
node = factory.make_node()
153
node = factory.make_Node()
154
154
token = NodeKey.objects.get_token_for_node(node)
155
155
return OAuthAuthenticatedClient(get_node_init_user(), token)
241
241
self.assertNotIn('user-data', items)
243
243
def test_version_index_shows_user_data_if_available(self):
244
node = factory.make_node()
244
node = factory.make_Node()
245
245
NodeUserData.objects.set_user_data(node, b"User data for node")
246
246
client = make_node_client(node)
247
247
view_name = self.get_metadata_name('-version')
252
252
def test_meta_data_view_lists_fields(self):
253
253
# Some fields only are returned if there is data related to them.
254
254
user, _ = factory.make_user_with_keys(n_keys=2, username='my-user')
255
node = factory.make_node(owner=user)
255
node = factory.make_Node(owner=user)
256
256
client = make_node_client(node=node)
257
257
view_name = self.get_metadata_name('-meta-data')
258
258
url = reverse(view_name, args=['latest', ''])
282
282
self.assertNotIn(None, producers)
284
284
def test_meta_data_local_hostname_returns_fqdn(self):
285
nodegroup = factory.make_node_group(
285
nodegroup = factory.make_NodeGroup(
286
286
status=NODEGROUP_STATUS.ACCEPTED,
287
287
management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS)
288
288
hostname = factory.make_string()
289
289
domain = factory.make_string()
290
node = factory.make_node(
290
node = factory.make_Node(
291
291
hostname='%s.%s' % (hostname, domain), nodegroup=nodegroup)
292
292
client = make_node_client(node)
293
293
view_name = self.get_metadata_name('-meta-data')
299
299
self.assertIn('text/plain', response['Content-Type'])
301
301
def test_meta_data_instance_id_returns_system_id(self):
302
node = factory.make_node()
302
node = factory.make_Node()
303
303
client = make_node_client(node)
304
304
view_name = self.get_metadata_name('-meta-data')
305
305
url = reverse(view_name, args=['latest', 'instance-id'])
320
320
def test_public_keys_listed_for_node_with_public_keys(self):
321
321
user, _ = factory.make_user_with_keys(n_keys=2, username='my-user')
322
node = factory.make_node(owner=user)
322
node = factory.make_Node(owner=user)
323
323
view_name = self.get_metadata_name('-meta-data')
324
324
url = reverse(view_name, args=['latest', ''])
325
325
client = make_node_client(node=node)
339
339
def test_public_keys_for_node_returns_list_of_keys(self):
340
340
user, _ = factory.make_user_with_keys(n_keys=2, username='my-user')
341
node = factory.make_node(owner=user)
341
node = factory.make_Node(owner=user)
342
342
view_name = self.get_metadata_name('-meta-data')
343
343
url = reverse(view_name, args=['latest', 'public-keys'])
344
344
client = make_node_client(node=node)
355
355
# The metadata service also accepts urls with any number of additional
356
356
# slashes after 'metadata': e.g. http://host/metadata///rest-of-url.
357
357
user, _ = factory.make_user_with_keys(n_keys=2, username='my-user')
358
node = factory.make_node(owner=user)
358
node = factory.make_Node(owner=user)
359
359
view_name = self.get_metadata_name('-meta-data')
360
360
url = reverse(view_name, args=['latest', 'public-keys'])
361
361
# Insert additional slashes.
372
372
"""Tests for the metadata user-data API endpoint."""
374
374
def test_user_data_view_returns_binary_data(self):
375
node = factory.make_node()
375
node = factory.make_Node()
376
376
NodeUserData.objects.set_user_data(node, sample_binary_data)
377
377
client = make_node_client(node)
378
378
response = client.get(reverse('metadata-user-data', args=['latest']))
394
394
def test_request_does_not_cause_status_change_if_not_deploying(self):
395
395
status = factory.pick_enum(
396
396
NODE_STATUS, but_not=[NODE_STATUS.DEPLOYING])
397
node = factory.make_node(status=status)
397
node = factory.make_Node(status=status)
398
398
NodeUserData.objects.set_user_data(node, sample_binary_data)
399
399
client = make_node_client(node)
400
400
response = client.get(reverse('metadata-user-data', args=['latest']))
402
402
self.assertEqual(status, reload_object(node).status)
404
404
def test_request_causes_status_change_if_deploying(self):
405
node = factory.make_node(status=NODE_STATUS.DEPLOYING)
405
node = factory.make_Node(status=NODE_STATUS.DEPLOYING)
406
406
NodeUserData.objects.set_user_data(node, sample_binary_data)
407
407
client = make_node_client(node)
408
408
response = client.get(reverse('metadata-user-data', args=['latest']))
414
414
"""Tests for the curtin-metadata user-data API endpoint."""
416
416
def test_curtin_user_data_view_returns_curtin_data(self):
417
node = factory.make_node(nodegroup=self.rpc_nodegroup)
418
factory.make_node_group_interface(
417
node = factory.make_Node(nodegroup=self.rpc_nodegroup)
418
factory.make_NodeGroupInterface(
419
419
node.nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP)
420
420
arch, subarch = node.architecture.split('/')
421
factory.make_boot_image(
421
factory.make_BootImage(
422
422
osystem=node.get_osystem(),
423
423
architecture=arch, subarchitecture=subarch,
424
424
release=node.get_distro_series(), purpose='xinstall',
435
435
class TestInstallingAPI(MAASServerTestCase):
437
437
def test_other_user_than_node_cannot_signal_installing_result(self):
438
node = factory.make_node(status=NODE_STATUS.DEPLOYING)
439
client = OAuthAuthenticatedClient(factory.make_user())
438
node = factory.make_Node(status=NODE_STATUS.DEPLOYING)
439
client = OAuthAuthenticatedClient(factory.make_User())
440
440
response = call_signal(client)
441
441
self.assertEqual(httplib.FORBIDDEN, response.status_code)
442
442
self.assertEqual(
443
443
NODE_STATUS.DEPLOYING, reload_object(node).status)
445
445
def test_signaling_installing_result_does_not_affect_other_node(self):
446
node = factory.make_node(status=NODE_STATUS.DEPLOYING)
446
node = factory.make_Node(status=NODE_STATUS.DEPLOYING)
447
447
client = make_node_client(
448
node=factory.make_node(status=NODE_STATUS.DEPLOYING))
448
node=factory.make_Node(status=NODE_STATUS.DEPLOYING))
449
449
response = call_signal(client, status='OK')
450
450
self.assertEqual(httplib.OK, response.status_code)
451
451
self.assertEqual(
452
452
NODE_STATUS.DEPLOYING, reload_object(node).status)
454
454
def test_signaling_installing_success_leaves_node_deploying(self):
455
node = factory.make_node(status=NODE_STATUS.DEPLOYING)
455
node = factory.make_Node(status=NODE_STATUS.DEPLOYING)
456
456
client = make_node_client(node=node)
457
457
response = call_signal(client, status='OK')
458
458
self.assertEqual(httplib.OK, response.status_code)
459
459
self.assertEqual(NODE_STATUS.DEPLOYING, reload_object(node).status)
461
461
def test_signaling_installing_success_is_idempotent(self):
462
node = factory.make_node(status=NODE_STATUS.DEPLOYING)
462
node = factory.make_Node(status=NODE_STATUS.DEPLOYING)
463
463
client = make_node_client(node=node)
464
464
call_signal(client, status='OK')
465
465
response = call_signal(client, status='OK')
467
467
self.assertEqual(NODE_STATUS.DEPLOYING, reload_object(node).status)
469
469
def test_signaling_installing_success_does_not_clear_owner(self):
470
node = factory.make_node(
471
status=NODE_STATUS.DEPLOYING, owner=factory.make_user())
470
node = factory.make_Node(
471
status=NODE_STATUS.DEPLOYING, owner=factory.make_User())
472
472
client = make_node_client(node=node)
473
473
response = call_signal(client, status='OK')
474
474
self.assertEqual(httplib.OK, response.status_code)
475
475
self.assertEqual(node.owner, reload_object(node).owner)
477
477
def test_signaling_installing_failure_makes_node_failed(self):
478
node = factory.make_node(
479
status=NODE_STATUS.DEPLOYING, owner=factory.make_user())
478
node = factory.make_Node(
479
status=NODE_STATUS.DEPLOYING, owner=factory.make_User())
480
480
client = make_node_client(node=node)
481
481
response = call_signal(client, status='FAILED')
482
482
self.assertEqual(httplib.OK, response.status_code)
484
484
NODE_STATUS.FAILED_DEPLOYMENT, reload_object(node).status)
486
486
def test_signaling_installing_failure_is_idempotent(self):
487
node = factory.make_node(
488
status=NODE_STATUS.DEPLOYING, owner=factory.make_user())
487
node = factory.make_Node(
488
status=NODE_STATUS.DEPLOYING, owner=factory.make_User())
489
489
client = make_node_client(node=node)
490
490
call_signal(client, status='FAILED')
491
491
response = call_signal(client, status='FAILED')
497
497
class TestCommissioningAPI(MAASServerTestCase):
499
499
def test_commissioning_scripts(self):
500
script = factory.make_commissioning_script()
500
script = factory.make_CommissioningScript()
501
501
response = make_node_client().get(
502
502
reverse('commissioning-scripts', args=['latest']))
503
503
self.assertEqual(
518
518
archive.getnames())
520
520
def test_other_user_than_node_cannot_signal_commissioning_result(self):
521
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
522
client = OAuthAuthenticatedClient(factory.make_user())
521
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
522
client = OAuthAuthenticatedClient(factory.make_User())
523
523
response = call_signal(client)
524
524
self.assertEqual(httplib.FORBIDDEN, response.status_code)
525
525
self.assertEqual(
526
526
NODE_STATUS.COMMISSIONING, reload_object(node).status)
528
528
def test_signaling_commissioning_result_does_not_affect_other_node(self):
529
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
529
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
530
530
client = make_node_client(
531
node=factory.make_node(status=NODE_STATUS.COMMISSIONING))
531
node=factory.make_Node(status=NODE_STATUS.COMMISSIONING))
532
532
response = call_signal(client, status='OK')
533
533
self.assertEqual(httplib.OK, response.status_code)
534
534
self.assertEqual(
537
537
def test_signaling_commissioning_OK_repopulates_tags(self):
538
538
populate_tags_for_single_node = self.patch(
539
539
api, "populate_tags_for_single_node")
540
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
540
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
541
541
client = make_node_client(node)
542
542
response = call_signal(client, status='OK', script_result='0')
543
543
self.assertEqual(httplib.OK, response.status_code)
547
547
MockCalledOnceWith(ANY, node))
549
549
def test_signaling_requires_status_code(self):
550
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
550
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
551
551
client = make_node_client(node=node)
552
552
url = reverse('metadata-version', args=['latest'])
553
553
response = client.post(url, {'op': 'signal'})
558
558
self.assertEqual(httplib.BAD_REQUEST, response.status_code)
560
560
def test_signaling_refuses_if_node_in_unexpected_state(self):
561
node = factory.make_node(status=NODE_STATUS.NEW)
561
node = factory.make_Node(status=NODE_STATUS.NEW)
562
562
client = make_node_client(node=node)
563
563
response = call_signal(client)
564
564
self.assertEqual(
569
569
(response.status_code, response.content))
571
571
def test_signaling_accepts_WORKING_status(self):
572
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
572
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
573
573
client = make_node_client(node=node)
574
574
response = call_signal(client, status='WORKING')
575
575
self.assertEqual(httplib.OK, response.status_code)
577
577
NODE_STATUS.COMMISSIONING, reload_object(node).status)
579
579
def test_signaling_stores_script_result(self):
580
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
580
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
581
581
client = make_node_client(node=node)
582
582
script_result = random.randint(0, 10)
583
583
filename = factory.make_string()
589
589
self.assertEqual(script_result, result.script_result)
591
591
def test_signaling_stores_empty_script_result(self):
592
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
592
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
593
593
client = make_node_client(node=node)
594
594
response = call_signal(
595
595
client, script_result=random.randint(0, 10),
599
599
self.assertEqual('', result.data)
601
601
def test_signaling_WORKING_keeps_owner(self):
602
user = factory.make_user()
603
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
602
user = factory.make_User()
603
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
604
604
node.owner = user
606
606
client = make_node_client(node=node)
609
609
self.assertEqual(user, reload_object(node).owner)
611
611
def test_signaling_commissioning_success_makes_node_Ready(self):
612
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
612
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
613
613
client = make_node_client(node=node)
614
614
response = call_signal(client, status='OK')
615
615
self.assertEqual(httplib.OK, response.status_code)
616
616
self.assertEqual(NODE_STATUS.READY, reload_object(node).status)
618
618
def test_signaling_commissioning_success_is_idempotent(self):
619
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
619
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
620
620
client = make_node_client(node=node)
621
621
call_signal(client, status='OK')
622
622
response = call_signal(client, status='OK')
624
624
self.assertEqual(NODE_STATUS.READY, reload_object(node).status)
626
626
def test_signaling_commissioning_success_clears_owner(self):
627
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
628
node.owner = factory.make_user()
627
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
628
node.owner = factory.make_User()
630
630
client = make_node_client(node=node)
631
631
response = call_signal(client, status='OK')
633
633
self.assertEqual(None, reload_object(node).owner)
635
635
def test_signaling_commissioning_failure_makes_node_Failed_Tests(self):
636
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
636
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
637
637
client = make_node_client(node=node)
638
638
response = call_signal(client, status='FAILED')
639
639
self.assertEqual(httplib.OK, response.status_code)
641
641
NODE_STATUS.FAILED_COMMISSIONING, reload_object(node).status)
643
643
def test_signaling_commissioning_failure_is_idempotent(self):
644
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
644
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
645
645
client = make_node_client(node=node)
646
646
call_signal(client, status='FAILED')
647
647
response = call_signal(client, status='FAILED')
650
650
NODE_STATUS.FAILED_COMMISSIONING, reload_object(node).status)
652
652
def test_signaling_commissioning_failure_sets_node_error(self):
653
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
653
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
654
654
client = make_node_client(node=node)
655
655
error_text = factory.make_string()
656
656
response = call_signal(client, status='FAILED', error=error_text)
658
658
self.assertEqual(error_text, reload_object(node).error)
660
660
def test_signaling_commissioning_failure_clears_owner(self):
661
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
662
node.owner = factory.make_user()
661
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
662
node.owner = factory.make_User()
664
664
client = make_node_client(node=node)
665
665
response = call_signal(client, status='FAILED')
667
667
self.assertEqual(None, reload_object(node).owner)
669
669
def test_signaling_no_error_clears_existing_error(self):
670
node = factory.make_node(
670
node = factory.make_Node(
671
671
status=NODE_STATUS.COMMISSIONING, error=factory.make_string())
672
672
client = make_node_client(node=node)
673
673
response = call_signal(client)
678
678
statuses = ['WORKING', 'OK', 'FAILED']
679
679
filename = factory.make_string()
681
status: factory.make_node(status=NODE_STATUS.COMMISSIONING)
681
status: factory.make_Node(status=NODE_STATUS.COMMISSIONING)
682
682
for status in statuses}
683
683
for status, node in nodes.items():
684
684
client = make_node_client(node=node)
694
694
for status, node in nodes.items()})
696
696
def test_signal_stores_file_contents(self):
697
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
697
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
698
698
client = make_node_client(node=node)
699
699
text = factory.make_string().encode('ascii')
700
700
script_result = random.randint(0, 10)
707
707
def test_signal_stores_binary(self):
708
708
unicode_text = '<\u2621>'
709
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
709
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
710
710
client = make_node_client(node=node)
711
711
script_result = random.randint(0, 10)
712
712
response = call_signal(
722
722
factory.make_string(): factory.make_string().encode('ascii')
723
723
for counter in range(3)}
724
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
724
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
725
725
client = make_node_client(node=node)
726
726
script_result = random.randint(0, 10)
727
727
response = call_signal(
740
740
# anybody's business, but files up to this size should work.
741
741
size_limit = 2 ** 20
742
742
contents = factory.make_string(size_limit, spaces=True)
743
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
743
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
744
744
client = make_node_client(node=node)
745
745
script_result = random.randint(0, 10)
746
746
response = call_signal(
752
752
self.assertEqual(size_limit, len(stored_data))
754
754
def test_signal_stores_virtual_tag_on_node_if_virtual(self):
755
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
755
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
756
756
client = make_node_client(node=node)
757
757
content = 'virtual'.encode('utf-8')
758
758
response = call_signal(
764
764
["virtual"], [each_tag.name for each_tag in node.tags.all()])
766
766
def test_signal_removes_virtual_tag_on_node_if_not_virtual(self):
767
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
767
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
768
768
tag, _ = Tag.objects.get_or_create(name='virtual')
769
769
node.tags.add(tag)
770
770
client = make_node_client(node=node)
778
778
[], [each_tag.name for each_tag in node.tags.all()])
780
780
def test_signal_leaves_untagged_physical_node_unaltered(self):
781
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
781
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
782
782
client = make_node_client(node=node)
783
783
content = 'notvirtual'.encode('utf-8')
784
784
response = call_signal(
789
789
self.assertEqual(0, len(node.tags.all()))
791
791
def test_signal_refuses_bad_power_type(self):
792
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
792
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
793
793
client = make_node_client(node=node)
794
794
response = call_signal(client, power_type="foo")
795
795
self.assertEqual(
797
797
(response.status_code, response.content))
799
799
def test_signal_power_type_stores_params(self):
800
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
800
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
801
801
client = make_node_client(node=node)
803
803
power_address=factory.make_string(),
811
811
self.assertEqual(params, node.power_parameters)
813
813
def test_signal_power_type_lower_case_works(self):
814
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
814
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
815
815
client = make_node_client(node=node)
817
817
power_address=factory.make_string(),
825
825
params, node.power_parameters)
827
827
def test_signal_invalid_power_parameters(self):
828
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
828
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
829
829
client = make_node_client(node=node)
830
830
response = call_signal(
831
831
client, power_type="ipmi", power_parameters="badjson")
837
837
class TestByMACMetadataAPI(DjangoTestCase):
839
839
def test_api_retrieves_node_metadata_by_mac(self):
840
mac = factory.make_mac_address()
840
mac = factory.make_MACAddress()
842
842
'metadata-meta-data-by-mac',
843
843
args=['latest', mac.mac_address, 'instance-id'])
847
847
(response.status_code, response.content))
849
849
def test_api_retrieves_node_userdata_by_mac(self):
850
mac = factory.make_mac_address()
850
mac = factory.make_MACAddress()
851
851
user_data = factory.make_string().encode('ascii')
852
852
NodeUserData.objects.set_user_data(mac.node, user_data)
860
860
def test_api_normally_disallows_anonymous_node_metadata_access(self):
861
861
self.patch(settings, 'ALLOW_UNSAFE_METADATA_ACCESS', False)
862
mac = factory.make_mac_address()
862
mac = factory.make_MACAddress()
864
864
'metadata-meta-data-by-mac',
865
865
args=['latest', mac.mac_address, 'instance-id'])
870
870
class TestNetbootOperationAPI(DjangoTestCase):
872
872
def test_netboot_off(self):
873
node = factory.make_node(netboot=True)
873
node = factory.make_Node(netboot=True)
874
874
client = make_node_client(node=node)
875
875
url = reverse('metadata-version', args=['latest'])
876
876
response = client.post(url, {'op': 'netboot_off'})
878
878
self.assertFalse(node.netboot, response)
880
880
def test_netboot_on(self):
881
node = factory.make_node(netboot=False)
881
node = factory.make_Node(netboot=False)
882
882
client = make_node_client(node=node)
883
883
url = reverse('metadata-version', args=['latest'])
884
884
response = client.post(url, {'op': 'netboot_on'})
889
889
class TestAnonymousAPI(DjangoTestCase):
891
891
def test_anonymous_netboot_off(self):
892
node = factory.make_node(netboot=True)
892
node = factory.make_Node(netboot=True)
893
893
anon_netboot_off_url = reverse(
894
894
'metadata-node-by-id', args=['latest', node.system_id])
895
895
response = self.client.post(
922
922
ng_url = 'http://%s' % factory.make_name('host')
923
923
network = IPNetwork("10.1.1/24")
924
924
ip = factory.pick_ip_in_network(network)
925
factory.make_node_group(
925
factory.make_NodeGroup(
926
926
maas_url=ng_url, network=network,
927
927
management=NODEGROUPINTERFACE_MANAGEMENT.DHCP)
928
928
anon_enlist_preseed_url = reverse(
935
935
def test_anonymous_get_preseed(self):
936
936
# The preseed for a node can be obtained anonymously.
937
node = factory.make_node()
937
node = factory.make_Node()
938
938
anon_node_url = reverse(
939
939
'metadata-node-by-id',
940
940
args=['latest', node.system_id])
1014
1014
self.patch(settings, 'DEFAULT_MAAS_URL', maas_url)
1015
1015
network = IPNetwork("10.1.1/24")
1016
1016
ip = factory.pick_ip_in_network(network)
1017
factory.make_node_group(
1017
factory.make_NodeGroup(
1018
1018
maas_url=nodegroup_url, network=network,
1019
1019
management=NODEGROUPINTERFACE_MANAGEMENT.DHCP)
1020
1020
url = reverse('enlist-metadata-user-data', args=['latest'])