224
224
NODE_TRANSITIONS[None] = valid_initial_states
226
def make_node(self, mac=False, hostname=None, status=None,
226
def make_Node(self, mac=False, hostname=None, status=None,
227
227
architecture="i386/generic", updated=None,
228
228
created=None, nodegroup=None, routers=None, zone=None,
229
229
power_type=None, networks=None, sortable_name=False,
277
277
Node.objects.filter(id=node.id).update(created=created)
278
278
return reload_object(node)
280
make_node = make_Node # DEPRECATED
280
282
def get_interface_fields(self, name=None, ip=None, router_ip=None,
281
283
network=None, subnet_mask=None, broadcast_ip=None,
282
284
ip_range_low=None, ip_range_high=None,
346
348
management=management,
347
349
interface=interface)
349
def make_node_group(self, name=None, uuid=None, cluster_name=None,
350
dhcp_key=None, ip=None, router_ip=None, network=None,
351
subnet_mask=None, broadcast_ip=None, ip_range_low=None,
352
ip_range_high=None, interface=None, management=None,
353
status=None, maas_url='', static_ip_range_low=None,
354
static_ip_range_high=None, **kwargs):
351
def make_NodeGroup(self, name=None, uuid=None, cluster_name=None,
352
dhcp_key=None, ip=None, router_ip=None, network=None,
353
subnet_mask=None, broadcast_ip=None, ip_range_low=None,
354
ip_range_high=None, interface=None, management=None,
355
status=None, maas_url='', static_ip_range_low=None,
356
static_ip_range_high=None, **kwargs):
355
357
"""Create a :class:`NodeGroup`.
357
359
If `management` is set (to a `NODEGROUPINTERFACE_MANAGEMENT` value),
385
387
static_ip_range_low=static_ip_range_low,
386
388
static_ip_range_high=static_ip_range_high)
387
389
interface_settings.update(kwargs)
388
self.make_node_group_interface(cluster, **interface_settings)
390
self.make_NodeGroupInterface(cluster, **interface_settings)
391
def make_unrenamable_nodegroup_with_node(self):
393
make_node_group = make_NodeGroup # DEPRECATED
395
def make_unrenamable_NodeGroup_with_Node(self):
392
396
"""Create a `NodeGroup` that can't be renamed, and `Node`.
394
398
Node groups can't be renamed while they are in an accepted state, have
400
404
:return: tuple: (`NodeGroup`, `Node`).
402
406
name = self.make_name('original-name')
403
nodegroup = self.make_node_group(
407
nodegroup = self.make_NodeGroup(
404
408
name=name, status=NODEGROUP_STATUS.ACCEPTED)
405
factory.make_node_group_interface(
409
factory.make_NodeGroupInterface(
406
410
nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS)
407
node = self.make_node(
411
node = self.make_Node(
408
412
nodegroup=nodegroup, status=NODE_STATUS.ALLOCATED)
409
413
return nodegroup, node
411
def make_node_group_interface(self, nodegroup, name=None, ip=None,
412
router_ip=None, network=None,
413
subnet_mask=None, broadcast_ip=None,
414
ip_range_low=None, ip_range_high=None,
415
interface=None, management=None,
416
static_ip_range_low=None,
417
static_ip_range_high=None, **kwargs):
415
make_unrenamable_nodegroup_with_node = (
416
make_unrenamable_NodeGroup_with_Node) # DEPRECATED
418
def make_NodeGroupInterface(self, nodegroup, name=None, ip=None,
419
router_ip=None, network=None,
420
subnet_mask=None, broadcast_ip=None,
421
ip_range_low=None, ip_range_high=None,
422
interface=None, management=None,
423
static_ip_range_low=None,
424
static_ip_range_high=None, **kwargs):
418
425
interface_settings = self.get_interface_fields(
419
426
name=name, ip=ip, router_ip=router_ip, network=network,
420
427
subnet_mask=subnet_mask, broadcast_ip=broadcast_ip,
431
def make_node_commission_result(self, node=None, name=None,
432
script_result=None, data=None):
438
make_node_group_interface = make_NodeGroupInterface # DEPRECATED
440
def make_NodeResult_for_commissioning(
441
self, node=None, name=None, script_result=None, data=None):
442
"""Create a `NodeResult` as one would see from commissioning a node."""
434
node = self.make_node()
444
node = self.make_Node()
436
446
name = "ncrname-" + self.make_string(92)
447
def make_node_install_result(self, node=None, name=None,
448
script_result=None, data=None):
457
make_node_commission_result = (
458
make_NodeResult_for_commissioning) # DEPRECATED
460
def make_NodeResult_for_installing(
461
self, node=None, name=None, script_result=None, data=None):
462
"""Create a `NodeResult` as one would see from installing a node."""
450
node = self.make_node()
464
node = self.make_Node()
452
466
name = "ncrname-" + self.make_string(92)
477
make_node_install_result = (
478
make_NodeResult_for_installing) # DEPRECATED
463
480
def make_MAC(self):
464
481
"""Generate a random MAC address, in the form of a MAC object."""
465
482
return MAC(self.getRandomMACAddress())
467
def make_mac_address(self, address=None, node=None, networks=None,
469
"""Create a MACAddress model object."""
484
def make_MACAddress(self, address=None, node=None, networks=None,
486
"""Create a `MACAddress` model object."""
471
node = self.make_node()
488
node = self.make_Node()
472
489
if address is None:
473
490
address = self.getRandomMACAddress()
474
491
mac = MACAddress(mac_address=MAC(address), node=node, **kwargs)
477
494
mac.networks.add(*networks)
497
make_mac_address = make_MACAddress # DEPRECATED
480
499
def make_node_with_mac_attached_to_nodegroupinterface(
481
500
self, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
482
501
network=None, disable_ipv4=False, **kwargs):
488
507
nodegroup = kwargs.pop("nodegroup", None)
489
508
if nodegroup is None:
490
nodegroup = self.make_node_group()
491
node = self.make_node(
509
nodegroup = self.make_NodeGroup()
510
node = self.make_Node(
492
511
mac=True, nodegroup=nodegroup, disable_ipv4=disable_ipv4, **kwargs)
493
ngi = self.make_node_group_interface(
512
ngi = self.make_NodeGroupInterface(
494
513
nodegroup, network=network, management=management)
495
514
mac = node.get_primary_mac()
496
515
mac.cluster_interface = ngi
500
def make_staticipaddress(self, ip=None, alloc_type=IPADDRESS_TYPE.AUTO,
519
def make_StaticIPAddress(self, ip=None, alloc_type=IPADDRESS_TYPE.AUTO,
501
520
mac=None, user=None):
502
521
"""Create and return a StaticIPAddress model object.
513
532
mac_address=mac, ip_address=ipaddress).save()
516
def make_dhcp_lease(self, nodegroup=None, ip=None, mac=None):
535
make_staticipaddress = make_StaticIPAddress # DEPRECATED
537
def make_DHCPLease(self, nodegroup=None, ip=None, mac=None):
517
538
"""Create a :class:`DHCPLease`."""
518
539
if nodegroup is None:
519
nodegroup = self.make_node_group()
540
nodegroup = self.make_NodeGroup()
521
542
ip = self.getRandomIPAddress()
549
make_dhcp_lease = make_DHCPLease # DEPRECATED
528
551
def make_email(self):
529
552
return '%s@example.com' % self.make_string(10)
531
def make_user(self, username=None, password='test', email=None):
554
def make_User(self, username=None, password='test', email=None):
532
555
if username is None:
533
556
username = self.make_username()
534
557
if email is None:
536
559
return User.objects.create_user(
537
560
username=username, password=password, email=email)
539
def make_sshkey(self, user, key_string=None):
562
make_user = make_User # DEPRECATED
564
def make_SSHKey(self, user, key_string=None):
540
565
if key_string is None:
541
566
key_string = get_data('data/test_rsa0.pub')
542
567
key = SSHKey(key=key_string, user=user)
546
def make_tag(self, name=None, definition=None, comment='',
571
make_sshkey = make_SSHKey # DEPRECATED
573
def make_Tag(self, name=None, definition=None, comment='',
547
574
kernel_opts=None, created=None, updated=None):
549
576
name = self.make_name('tag')
562
589
Tag.objects.filter(id=tag.id).update(created=created)
563
590
return reload_object(tag)
592
make_tag = make_Tag # DEPRECATED
565
594
def make_user_with_keys(self, n_keys=2, user=None, **kwargs):
566
595
"""Create a user with n `SSHKey`. If user is not None, use this user
567
596
instead of creating one.
614
643
return User.objects.create_superuser(
615
644
username, password=password, email=email)
617
def make_file_storage(self, filename=None, content=None, owner=None):
646
def make_FileStorage(self, filename=None, content=None, owner=None):
618
647
fake_file = self.make_file_upload(filename, content)
619
648
return FileStorage.objects.save_file(fake_file.name, fake_file, owner)
650
make_file_storage = make_FileStorage # DEPRECATED
621
652
def make_oauth_header(self, **kwargs):
622
653
"""Fake an OAuth authorization header.
638
669
return "OAuth " + ", ".join([
639
670
'%s="%s"' % (key, value) for key, value in items.items()])
641
def make_boot_image(self, osystem=None, architecture=None,
642
subarchitecture=None, release=None, purpose=None,
643
nodegroup=None, label=None, supported_subarches=None,
644
xinstall_path=None, xinstall_type=None):
672
def make_BootImage(self, osystem=None, architecture=None,
673
subarchitecture=None, release=None, purpose=None,
674
nodegroup=None, label=None, supported_subarches=None,
675
xinstall_path=None, xinstall_type=None):
645
676
if osystem is None:
646
677
osystem = self.make_name('os')
647
678
if architecture is None:
675
706
xinstall_type=xinstall_type,
709
make_boot_image = make_BootImage # DEPRECATED
678
711
def make_boot_images_for_node_with_purposes(self, node, purposes):
679
712
osystem = node.get_osystem()
680
713
series = node.get_distro_series()
688
721
xinstall_path = None
689
722
xinstall_type = None
691
self.make_boot_image(
692
725
osystem=osystem, architecture=arch,
693
726
subarchitecture=subarch, release=series, purpose=purpose,
694
727
nodegroup=node.nodegroup, xinstall_path=xinstall_path,
695
728
xinstall_type=xinstall_type))
698
def make_commissioning_script(self, name=None, content=None):
731
def make_CommissioningScript(self, name=None, content=None):
700
733
name = self.make_name('script')
701
734
if content is None:
703
736
return CommissioningScript.objects.create(
704
737
name=name, content=Bin(content))
706
def make_download_progress(self, nodegroup=None, filename=None,
707
size=NO_VALUE, bytes_downloaded=NO_VALUE,
739
make_commissioning_script = make_CommissioningScript # DEPRECATED
741
def make_DownloadProgress(self, nodegroup=None, filename=None,
742
size=NO_VALUE, bytes_downloaded=NO_VALUE,
709
744
"""Create a `DownloadProgress` in some poorly-defined state.
711
746
If you have specific wishes about the object's state, you'll want to
712
use one of the specialized `make_download_progress_*` methods instead.
747
use one of the specialized `make_DownloadProgress_*` methods instead.
714
749
Pass a `size` of `None` to indicate that total file size is not yet
715
750
known. The default picks either a random number, or None.
717
752
if nodegroup is None:
718
nodegroup = self.make_node_group()
753
nodegroup = self.make_NodeGroup()
719
754
if filename is None:
720
755
filename = self.make_name('download')
721
756
if size is NO_VALUE:
741
776
nodegroup=nodegroup, filename=filename, size=size,
742
777
bytes_downloaded=bytes_downloaded)
744
def make_download_progress_initial(self, nodegroup=None, filename=None,
779
make_download_progress = make_DownloadProgress # DEPRECATED
781
def make_DownloadProgress_initial(self, nodegroup=None, filename=None,
746
783
"""Create a `DownloadProgress` as reported before a download."""
747
return self.make_download_progress(
784
return self.make_DownloadProgress(
748
785
nodegroup=nodegroup, filename=filename, size=size,
749
786
bytes_downloaded=None, error='')
751
def make_download_progress_success(self, nodegroup=None, filename=None,
788
def make_DownloadProgress_success(self, nodegroup=None, filename=None,
753
790
"""Create a `DownloadProgress` indicating success."""
755
792
size = random.randint(0, 1000000000)
756
return self.make_download_progress(
793
return self.make_DownloadProgress(
757
794
nodegroup=nodegroup, filename=filename, size=size,
758
795
bytes_downloaded=size, error='')
760
def make_download_progress_incomplete(self, nodegroup=None, filename=None,
762
bytes_downloaded=None):
797
def make_DownloadProgress_incomplete(self, nodegroup=None, filename=None,
799
bytes_downloaded=None):
763
800
"""Create a `DownloadProgress` that's not done yet."""
764
801
if size is NO_VALUE:
765
802
if self.pick_bool():
775
812
bytes_downloaded = random.randint(0, max_size - 1)
776
return self.make_download_progress(
813
return self.make_DownloadProgress(
777
814
nodegroup=nodegroup, filename=filename, size=size,
778
815
bytes_downloaded=bytes_downloaded, error='')
780
def make_download_progress_failure(self, nodegroup=None, filename=None,
782
bytes_downloaded=NO_VALUE, error=None):
817
def make_DownloadProgress_failure(self, nodegroup=None, filename=None,
819
bytes_downloaded=NO_VALUE, error=None):
783
820
"""Create a `DownloadProgress` indicating failure."""
784
821
if error is None:
785
822
error = self.make_string()
786
return self.make_download_progress_incomplete(
823
return self.make_DownloadProgress_incomplete(
787
824
nodegroup=nodegroup, filename=filename, size=size,
788
825
bytes_downloaded=bytes_downloaded, error=error)
790
def make_zone(self, name=None, description=None, nodes=None,
827
def make_Zone(self, name=None, description=None, nodes=None,
791
828
sortable_name=False):
792
829
"""Create a physical `Zone`.
832
871
raise maastesting.factory.TooManyRandomRetries(
833
872
"Could not find an available VLAN tag.")
835
def make_network(self, name=None, network=None, vlan_tag=NO_VALUE,
874
def make_Network(self, name=None, network=None, vlan_tag=NO_VALUE,
836
875
description=None, sortable_name=False,
876
disjoint_from=None, default_gateway=None,
838
878
"""Create a `Network`.
840
880
:param network: An `IPNetwork`. If given, the `ip` and `netmask`
868
908
if network is None:
869
909
network = self.getRandomNetwork(disjoint_from=disjoint_from)
910
if default_gateway is None and self.pick_bool():
911
default_gateway = self.pick_ip_in_network(network)
912
if dns_servers is None and self.pick_bool():
913
dns_servers = " ".join(
914
self.getRandomIPAddress()
915
for _ in range(random.choice((1, 2))))
870
916
ip = unicode(network.ip)
871
917
netmask = unicode(network.netmask)
872
918
if description is None:
875
921
vlan_tag = self.make_vlan_tag()
876
922
network = Network(
877
923
name=name, ip=ip, netmask=netmask, vlan_tag=vlan_tag,
878
description=description)
924
description=description, default_gateway=default_gateway,
925
dns_servers=dns_servers)
882
def make_networks(self, number, with_vlans=True, **kwargs):
929
make_network = make_Network # DEPRECATED
931
def make_Networks(self, number, with_vlans=True, **kwargs):
883
932
"""Create multiple networks.
885
934
This avoids accidentally clashing VLAN tags.
904
953
for tag in vlan_tags:
907
956
vlan_tag=tag, disjoint_from=networks, **kwargs))
910
def make_boot_source(self, url=None, keyring_filename=None,
959
make_networks = make_Networks # DEPRECATED
961
def make_BootSource(self, url=None, keyring_filename=None,
912
963
"""Create a new `BootSource`."""
914
965
url = "http://%s.com" % self.make_name('source-url')
925
976
boot_source.save()
926
977
return boot_source
928
def make_boot_source_selection(self, boot_source=None, os=None,
929
release=None, arches=None, subarches=None,
979
make_boot_source = make_BootSource # DEPRECATED
981
def make_BootSourceSelection(self, boot_source=None, os=None,
982
release=None, arches=None, subarches=None,
931
984
"""Create a `BootSourceSelection`."""
932
985
if boot_source is None:
933
boot_source = self.make_boot_source()
986
boot_source = self.make_BootSource()
935
988
os = self.make_name('os')
936
989
if release is None:
953
1006
boot_source_selection.save()
954
1007
return boot_source_selection
956
def make_license_key(self, osystem=None, distro_series=None,
1009
make_boot_source_selection = make_BootSourceSelection # DEPRECATED
1011
def make_LicenseKey(self, osystem=None, distro_series=None,
958
1013
if osystem is None:
959
1014
osystem = factory.make_name('osystem')
960
1015
if distro_series is None:
966
1021
distro_series=distro_series,
967
1022
license_key=license_key)
969
def make_event_type(self, name=None, level=None, description=None):
1024
make_license_key = make_LicenseKey # DEPRECATED
1026
def make_EventType(self, name=None, level=None, description=None):
970
1027
if name is None:
971
1028
name = self.make_name('name', size=20)
972
1029
if description is None:
977
1034
return EventType.objects.create(
978
1035
name=name, description=description, level=level)
980
def make_event(self, node=None, type=None):
1037
make_event_type = make_EventType # DEPRECATED
1039
def make_Event(self, node=None, type=None):
981
1040
if node is None:
982
node = self.make_node()
1041
node = self.make_Node()
983
1042
if type is None:
984
type = self.make_event_type()
1043
type = self.make_EventType()
985
1044
return Event.objects.create(node=node, type=type)
987
def make_large_file(self, content=None, size=512):
1046
make_event = make_Event # DEPRECATED
1048
def make_LargeFile(self, content=None, size=512):
988
1049
"""Create `LargeFile`.
990
1051
:param content: Data to store in large file object.
1004
1065
return LargeFile.objects.create(
1005
1066
sha256=sha256, total_size=size, content=largeobject)
1007
def make_boot_resource(self, rtype=None, name=None, architecture=None,
1068
make_large_file = make_LargeFile # DEPRECATED
1070
def make_BootResource(self, rtype=None, name=None, architecture=None,
1009
1072
if rtype is None:
1010
1073
rtype = self.pick_enum(BOOT_RESOURCE_TYPE)
1011
1074
if name is None:
1027
1090
return BootResource.objects.create(
1028
1091
rtype=rtype, name=name, architecture=architecture, extra=extra)
1030
def make_boot_resource_set(self, resource, version=None, label=None):
1093
make_boot_resource = make_BootResource # DEPRECATED
1095
def make_BootResourceSet(self, resource, version=None, label=None):
1031
1096
if version is None:
1032
1097
version = self.make_name('version')
1033
1098
if label is None:
1035
1100
return BootResourceSet.objects.create(
1036
1101
resource=resource, version=version, label=label)
1038
def make_boot_resource_file(self, resource_set, largefile, filename=None,
1039
filetype=None, extra=None):
1103
make_boot_resource_set = make_BootResourceSet # DEPRECATED
1105
def make_BootResourceFile(self, resource_set, largefile, filename=None,
1106
filetype=None, extra=None):
1040
1107
if filename is None:
1041
1108
filename = self.make_name('name')
1042
1109
if filetype is None:
1050
1117
resource_set=resource_set, largefile=largefile, filename=filename,
1051
1118
filetype=filetype, extra=extra)
1120
make_boot_resource_file = make_BootResourceFile # DEPRECATED
1053
1122
def make_boot_resource_file_with_content(
1054
1123
self, resource_set, filename=None, filetype=None, extra=None,
1055
1124
content=None, size=512):
1056
largefile = self.make_large_file(content=content, size=size)
1057
return self.make_boot_resource_file(
1125
largefile = self.make_LargeFile(content=content, size=size)
1126
return self.make_BootResourceFile(
1058
1127
resource_set, largefile, filename=filename, filetype=filetype,
1061
1130
def make_usable_boot_resource(
1062
1131
self, rtype=None, name=None, architecture=None,
1063
1132
extra=None, version=None, label=None):
1064
resource = self.make_boot_resource(
1133
resource = self.make_BootResource(
1065
1134
rtype=rtype, name=name, architecture=architecture, extra=extra)
1066
resource_set = self.make_boot_resource_set(
1135
resource_set = self.make_BootResourceSet(
1067
1136
resource, version=version, label=label)
1068
1137
filetypes = COMMISSIONABLE_SET.union(INSTALL_SET)
1069
1138
filetypes.add(random.choice(XINSTALL_TYPES))