52
57
from provisioningserver.enum import POWER_TYPE
53
58
from provisioningserver.power.poweraction import PowerAction
54
59
from testtools.matchers import (
70
class UtilitiesTest(DjangoLessTestCase):
72
def test_generate_hostname_does_not_contain_ambiguous_chars(self):
73
ambiguous_chars = 'ilousvz1250'
74
hostnames = [generate_hostname(5) for i in range(200)]
75
does_not_contain_chars_matcher = (
76
MatchesAll(*[Not(Contains(char)) for char in ambiguous_chars]))
78
hostnames, AllMatch(does_not_contain_chars_matcher))
80
def test_generate_hostname_uses_size(self):
82
random.randint(1, 10), random.randint(1, 10),
83
random.randint(1, 10)]
84
hostnames = [generate_hostname(size) for size in sizes]
85
self.assertEqual(sizes, [len(hostname) for hostname in hostnames])
61
88
class NodeTest(TestCase):
63
90
def test_system_id(self):
183
210
self.assertEqual(2, mocked_apply_async.call_count)
185
def test_set_mac_based_hostname_default_enlistment_domain(self):
186
# The enlistment domain defaults to `local`.
187
node = factory.make_node()
188
node.set_mac_based_hostname('AA:BB:CC:DD:EE:FF')
189
hostname = 'node-aabbccddeeff.local'
190
self.assertEqual(hostname, node.hostname)
192
def test_set_mac_based_hostname_alt_enlistment_domain(self):
193
# A non-default enlistment domain can be specified.
194
Config.objects.set_config("enlistment_domain", "example.com")
195
node = factory.make_node()
196
node.set_mac_based_hostname('AA:BB:CC:DD:EE:FF')
197
hostname = 'node-aabbccddeeff.example.com'
198
self.assertEqual(hostname, node.hostname)
200
def test_set_mac_based_hostname_cleaning_enlistment_domain(self):
201
# Leading and trailing dots and whitespace are cleaned from the
202
# configured enlistment domain before it's joined to the hostname.
203
Config.objects.set_config("enlistment_domain", " .example.com. ")
204
node = factory.make_node()
205
node.set_mac_based_hostname('AA:BB:CC:DD:EE:FF')
206
hostname = 'node-aabbccddeeff.example.com'
207
self.assertEqual(hostname, node.hostname)
209
def test_set_mac_based_hostname_no_enlistment_domain(self):
210
# The enlistment domain can be set to the empty string and
211
# set_mac_based_hostname sets a hostname with no domain.
212
Config.objects.set_config("enlistment_domain", "")
213
node = factory.make_node()
214
node.set_mac_based_hostname('AA:BB:CC:DD:EE:FF')
215
hostname = 'node-aabbccddeeff'
216
self.assertEqual(hostname, node.hostname)
212
def test_set_random_hostname_set_hostname(self):
213
# Blank out enlistment_domain.
214
Config.objects.set_config("enlistment_domain", '')
215
node = factory.make_node('test' * 10)
216
node.set_random_hostname()
217
self.assertEqual(5, len(node.hostname))
219
def test_set_random_hostname_checks_hostname_existence(self):
220
Config.objects.set_config("enlistment_domain", '')
221
existing_node = factory.make_node(hostname='hostname')
223
hostnames = [existing_node.hostname, "new_hostname"]
225
node_module, "generate_hostname",
226
lambda size: hostnames.pop(0))
228
node = factory.make_node()
229
node.set_random_hostname()
230
self.assertEqual('new_hostname', node.hostname)
218
232
def test_get_effective_power_type_defaults_to_config(self):
219
233
power_types = list(map_enum(POWER_TYPE).values())