258
258
def test_load_preseed_template_returns_PreseedTemplate(self):
259
259
name = factory.make_string()
260
260
self.create_template(self.location, name)
261
node = factory.make_node()
261
node = factory.make_Node()
262
262
template = load_preseed_template(node, name)
263
263
self.assertIsInstance(template, PreseedTemplate)
265
265
def test_load_preseed_template_raises_if_no_template(self):
266
node = factory.make_node()
266
node = factory.make_Node()
267
267
unknown_template_name = factory.make_string()
268
268
self.assertRaises(
269
269
TemplateNotFoundError, load_preseed_template, node,
300
300
# due to the presence of a more specific template.
301
301
self.create_template(self.location, GENERIC_FILENAME)
302
302
self.create_template(self.location, prefix)
303
node = factory.make_node(hostname=factory.make_string())
303
node = factory.make_Node(hostname=factory.make_string())
304
304
node_template_name = "%s_%s_%s_%s_%s" % (
305
305
prefix, osystem, node.architecture.replace('/', '_'),
306
306
release, node.hostname)
356
356
Other network settings are derived from the IP address.
358
358
network = make_network(ip, subnet_mask)
359
return factory.make_node_group_interface(
359
return factory.make_NodeGroupInterface(
360
360
nodegroup=nodegroup, management=mgt, network=network, ip=ip,
361
361
subnet_mask=subnet_mask)
363
363
def make_lease_for_node(self, node, ip=None):
364
364
"""Create a `MACAddress` and corresponding `DHCPLease` for `node`."""
365
mac = factory.make_mac_address(node=node).mac_address
366
factory.make_dhcp_lease(nodegroup=node.nodegroup, mac=mac, ip=ip)
365
mac = factory.make_MACAddress(node=node).mac_address
366
factory.make_DHCPLease(nodegroup=node.nodegroup, mac=mac, ip=ip)
368
368
def test_returns_only_interface(self):
369
node = factory.make_node()
370
interface = factory.make_node_group_interface(node.nodegroup)
369
node = factory.make_Node()
370
interface = factory.make_NodeGroupInterface(node.nodegroup)
372
372
address = pick_cluster_controller_address(node)
380
380
self.make_nodegroupinterface(nodegroup, '192.168.11.1')
381
381
self.make_nodegroupinterface(nodegroup, nearest_address)
382
382
self.make_nodegroupinterface(nodegroup, '192.168.22.1')
383
node = factory.make_node(nodegroup=nodegroup)
383
node = factory.make_Node(nodegroup=nodegroup)
384
384
self.make_lease_for_node(node, '192.168.33.101')
385
385
self.make_lease_for_node(node, '10.99.1.105')
386
386
self.make_lease_for_node(node, '192.168.44.101')
392
392
nodegroup, '10.100.100.1',
393
393
mgt=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS)
394
394
self.make_nodegroupinterface(nodegroup, '10.100.101.1')
395
node = factory.make_node(nodegroup=nodegroup)
395
node = factory.make_Node(nodegroup=nodegroup)
396
396
self.make_lease_for_node(node, '10.100.101.99')
397
397
self.assertEqual('10.100.101.1', pick_cluster_controller_address(node))
399
399
def test_prefers_managed_interface_over_unmanaged_interface(self):
400
400
nodegroup = self.make_bare_nodegroup()
401
factory.make_node_group_interface(
401
factory.make_NodeGroupInterface(
402
402
nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED)
403
best_interface = factory.make_node_group_interface(
403
best_interface = factory.make_NodeGroupInterface(
404
404
nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP)
405
factory.make_node_group_interface(
405
factory.make_NodeGroupInterface(
406
406
nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED)
408
408
address = pick_cluster_controller_address(
409
factory.make_node(nodegroup=nodegroup))
409
factory.make_Node(nodegroup=nodegroup))
411
411
self.assertIsNotNone(address)
412
412
self.assertEqual(best_interface.ip, address)
414
414
def test_prefers_dns_managed_interface_over_unmanaged_interface(self):
415
415
nodegroup = self.make_bare_nodegroup()
416
factory.make_node_group_interface(
416
factory.make_NodeGroupInterface(
417
417
nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED)
418
best_interface = factory.make_node_group_interface(
418
best_interface = factory.make_NodeGroupInterface(
419
419
nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS)
420
factory.make_node_group_interface(
420
factory.make_NodeGroupInterface(
421
421
nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED)
423
423
address = pick_cluster_controller_address(
424
factory.make_node(nodegroup=nodegroup))
424
factory.make_Node(nodegroup=nodegroup))
426
426
self.assertIsNotNone(address)
427
427
self.assertEqual(best_interface.ip, address)
429
429
def test_returns_None_if_no_interfaces(self):
430
nodegroup = factory.make_node_group()
430
nodegroup = factory.make_NodeGroup()
431
431
nodegroup.nodegroupinterface_set.all().delete()
432
432
self.assertIsNone(
433
433
pick_cluster_controller_address(
434
factory.make_node(nodegroup=nodegroup)))
434
factory.make_Node(nodegroup=nodegroup)))
436
436
def test_makes_consistent_choice(self):
437
437
# Not a very thorough test, but we want at least a little bit of
438
438
# predictability.
439
nodegroup = factory.make_node_group(
439
nodegroup = factory.make_NodeGroup(
440
440
NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED)
441
441
for _ in range(5):
442
factory.make_node_group_interface(
442
factory.make_NodeGroupInterface(
443
443
nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED)
444
node = factory.make_node(nodegroup=nodegroup)
444
node = factory.make_Node(nodegroup=nodegroup)
445
445
self.assertEqual(
446
446
pick_cluster_controller_address(node),
447
447
pick_cluster_controller_address(node))
468
468
ports_archive = factory.make_url(netloc="ports-archive.example.com")
469
469
Config.objects.set_config('main_archive', main_archive)
470
470
Config.objects.set_config('ports_archive', ports_archive)
471
nodegroup = factory.make_node_group(maas_url=factory.make_string())
472
context = get_preseed_context(factory.make_node(), nodegroup)
471
nodegroup = factory.make_NodeGroup(maas_url=factory.make_string())
472
context = get_preseed_context(factory.make_Node(), nodegroup)
473
473
parsed_main_archive = urlparse(main_archive)
474
474
parsed_ports_archive = urlparse(ports_archive)
475
475
self.assertEqual(
550
550
self.rpc_nodegroup.maas_url = ng_url
551
551
self.rpc_nodegroup.save()
552
552
maas_url = 'http://%s' % factory.make_hostname()
553
node = factory.make_node(
553
node = factory.make_Node(
554
554
nodegroup=self.rpc_nodegroup, status=NODE_STATUS.COMMISSIONING)
555
555
self.patch(settings, 'DEFAULT_MAAS_URL', maas_url)
556
556
preseed = render_preseed(node, self.preseed, "precise")
618
618
def test_render_preseed(self):
619
619
self.return_windows_specific_preseed_data()
620
node = factory.make_node(
620
node = factory.make_Node(
621
621
nodegroup=self.rpc_nodegroup, osystem='windows',
622
622
architecture='amd64/generic', distro_series=self.release)
623
factory.make_boot_image(
623
factory.make_BootImage(
624
624
osystem='windows', architecture='amd64', subarchitecture='generic',
625
625
release=self.release, purpose='install', nodegroup=node.nodegroup)
626
626
preseed = render_preseed(
634
634
"""Tests for `get_curtin_userdata`."""
636
636
def test_get_curtin_userdata(self):
637
node = factory.make_node(
637
node = factory.make_Node(
638
638
nodegroup=self.rpc_nodegroup, boot_type=NODE_BOOT.FASTPATH)
639
factory.make_node_group_interface(
639
factory.make_NodeGroupInterface(
640
640
node.nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP)
641
641
arch, subarch = node.architecture.split('/')
642
factory.make_boot_image(
642
factory.make_BootImage(
643
643
osystem=node.get_osystem(),
644
644
architecture=arch, subarchitecture=subarch,
645
645
release=node.get_distro_series(), purpose='xinstall',
662
662
def test_get_curtin_userdata(self):
663
node = factory.make_node(
663
node = factory.make_Node(
664
664
nodegroup=self.rpc_nodegroup, osystem=self.os_name,
665
665
boot_type=NODE_BOOT.FASTPATH)
666
factory.make_node_group_interface(
666
factory.make_NodeGroupInterface(
667
667
node.nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP)
668
668
arch, subarch = node.architecture.split('/')
669
factory.make_boot_image(
669
factory.make_BootImage(
670
670
osystem=node.get_osystem(),
671
671
architecture=arch, subarchitecture=subarch,
672
672
release=node.get_distro_series(), purpose='xinstall',
762
762
architecture = make_usable_architecture(self)
763
763
xinstall_path = factory.make_name('xi_path')
764
764
xinstall_type = factory.make_name('xi_type')
765
node = factory.make_node(
765
node = factory.make_Node(
766
766
nodegroup=self.rpc_nodegroup, osystem=osystem.name,
767
767
architecture=architecture, distro_series=series)
768
factory.make_node_group_interface(
768
factory.make_NodeGroupInterface(
769
769
node.nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP)
770
770
arch, subarch = architecture.split('/')
771
boot_image = factory.make_boot_image(
771
boot_image = factory.make_BootImage(
772
772
osystem=osystem.name, architecture=arch,
773
773
subarchitecture=subarch, release=series,
774
774
purpose='xinstall', xinstall_path=xinstall_path,
787
787
osystem = factory.pick_OS()
788
788
series = factory.pick_release(osystem)
789
789
architecture = make_usable_architecture(self)
790
node = factory.make_node(
790
node = factory.make_Node(
791
791
nodegroup=self.rpc_nodegroup, osystem=osystem.name,
792
792
architecture=architecture, distro_series=series)
793
793
# Generate a boot image with a different arch/subarch.
794
factory.make_boot_image(
794
factory.make_BootImage(
795
795
osystem=osystem.name,
796
796
architecture=factory.make_name('arch'),
797
797
subarchitecture=factory.make_name('subarch'), release=series,
817
817
architecture = make_usable_architecture(self)
818
818
xinstall_path = factory.make_name('xi_path')
819
819
xinstall_type = 'tgz'
820
node = factory.make_node(
820
node = factory.make_Node(
821
821
nodegroup=self.rpc_nodegroup, osystem=osystem.name,
822
822
architecture=architecture, distro_series=series)
823
factory.make_node_group_interface(
823
factory.make_NodeGroupInterface(
824
824
node.nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP)
825
825
arch, subarch = architecture.split('/')
826
boot_image = factory.make_boot_image(
826
boot_image = factory.make_BootImage(
827
827
osystem=osystem.name, architecture=arch,
828
828
subarchitecture=subarch, release=series,
829
829
purpose='xinstall', xinstall_path=xinstall_path,
841
841
def test_get_preseed_type_for_commissioning(self):
842
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
842
node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
843
843
self.assertEqual(
844
844
PRESEED_TYPE.COMMISSIONING, get_preseed_type_for(node))
846
846
def test_get_preseed_type_for_default(self):
847
node = factory.make_node(boot_type=NODE_BOOT.DEBIAN)
847
node = factory.make_Node(boot_type=NODE_BOOT.DEBIAN)
848
848
factory.make_boot_images_for_node_with_purposes(node, ['install'])
849
849
self.assertEqual(
850
850
PRESEED_TYPE.DEFAULT, get_preseed_type_for(node))
852
852
def test_get_preseed_type_for_curtin(self):
853
node = factory.make_node(boot_type=NODE_BOOT.FASTPATH)
853
node = factory.make_Node(boot_type=NODE_BOOT.FASTPATH)
854
854
factory.make_boot_images_for_node_with_purposes(node, ['xinstall'])
855
855
self.assertEqual(
856
856
PRESEED_TYPE.CURTIN, get_preseed_type_for(node))
858
858
def test_get_preseed_type_for_default_when_curtin_not_supported(self):
859
node = factory.make_node(boot_type=NODE_BOOT.FASTPATH)
859
node = factory.make_Node(boot_type=NODE_BOOT.FASTPATH)
860
860
factory.make_boot_images_for_node_with_purposes(node, ['install'])
861
861
self.assertEqual(
862
862
PRESEED_TYPE.DEFAULT, get_preseed_type_for(node))
864
864
def test_get_preseed_type_for_curtin_when_default_not_supported(self):
865
node = factory.make_node(boot_type=NODE_BOOT.DEBIAN)
865
node = factory.make_Node(boot_type=NODE_BOOT.DEBIAN)
866
866
factory.make_boot_images_for_node_with_purposes(node, ['xinstall'])
867
867
self.assertEqual(
868
868
PRESEED_TYPE.CURTIN, get_preseed_type_for(node))
874
874
def test_render_preseed_uses_default_archives_intel(self):
877
877
nodegroup=self.rpc_nodegroup,
878
878
architecture=make_usable_architecture(
879
879
self, arch_name="i386", subarch_name="generic")),
881
881
nodegroup=self.rpc_nodegroup,
882
882
architecture=make_usable_architecture(
883
883
self, arch_name="amd64", subarch_name="generic")),
938
938
def test_get_preseed_returns_default_preseed(self):
939
node = factory.make_node(
939
node = factory.make_Node(
940
940
nodegroup=self.rpc_nodegroup, boot_type=NODE_BOOT.DEBIAN)
941
941
factory.make_boot_images_for_node_with_purposes(node, ['install'])
942
942
preseed = get_preseed(node)
943
943
self.assertIn('preseed/late_command', preseed)
945
945
def test_get_preseed_returns_curtin_preseed(self):
946
node = factory.make_node(
946
node = factory.make_Node(
947
947
nodegroup=self.rpc_nodegroup, boot_type=NODE_BOOT.FASTPATH)
948
948
factory.make_boot_images_for_node_with_purposes(node, ['xinstall'])
949
949
preseed = get_preseed(node)