20
20
NODEGROUPINTERFACE_MANAGEMENT,
21
21
NODEGROUPINTERFACE_MANAGEMENT_CHOICES_DICT,
23
from maasserver.models import NodeGroup
23
from maasserver.models import (
24
27
from maasserver.models.nodegroupinterface import MINIMUM_NETMASK_BITS
28
from maasserver.testing import reload_object
25
29
from maasserver.testing.factory import factory
26
30
from maasserver.testing.testcase import MAASServerTestCase
27
31
from maasserver.utils.network import make_network
44
48
interface = make_interface(network=network)
45
49
self.assertEqual(IPNetwork("10.0.0.0/24"), interface.network)
47
def test_network_is_defined_when_broadcast_and_mask_are(self):
51
def test_network_is_defined_when_netmask_is(self):
48
52
interface = make_interface()
49
interface.broadcast = "10.0.0.255"
53
interface.ip = "10.0.0.9"
50
54
interface.subnet_mask = "255.255.255.0"
51
55
self.assertIsInstance(interface.network, IPNetwork)
53
def test_network_is_undefined_when_broadcast_is_None(self):
57
def test_network_does_not_require_broadcast_address(self):
54
58
interface = make_interface()
55
59
interface.broadcast_ip = None
56
self.assertIsNone(interface.network)
60
self.assertIsInstance(interface.network, IPNetwork)
58
def test_network_is_undefined_when_broadcast_is_empty(self):
62
def test_network_does_not_require_nonempty_broadcast_address(self):
59
63
interface = make_interface()
60
64
interface.broadcast_ip = ""
61
self.assertIsNone(interface.network)
65
self.assertIsInstance(interface.network, IPNetwork)
63
67
def test_network_is_undefined_when_subnet_mask_is_None(self):
64
68
interface = make_interface()
65
69
interface.subnet_mask = None
66
70
self.assertIsNone(interface.network)
68
def test_network_is_undefined_subnet_mask_is_empty(self):
72
def test_network_is_undefined_when_subnet_mask_is_empty(self):
69
73
interface = make_interface()
70
74
interface.subnet_mask = ""
71
75
self.assertIsNone(interface.network)
87
92
for field in checked_fields:
88
93
nodegroup = factory.make_node_group(network=network)
89
94
[interface] = nodegroup.get_managed_interfaces()
91
setattr(interface, field, '192.168.2.1')
93
"%s not in the %s network" % (ip, '192.168.0.0/24'))
95
setattr(interface, field, ip_outside_network)
96
message = "%s not in the %s network" % (
94
100
exception = self.assertRaises(
95
101
ValidationError, interface.full_clean)
97
{field: [message]}, exception.message_dict)
102
self.assertEqual({field: [message]}, exception.message_dict)
99
104
def test_clean_network(self):
100
105
nodegroup = factory.make_node_group(
102
107
[interface] = nodegroup.get_managed_interfaces()
103
108
# Set a bogus subnet mask.
104
109
interface.subnet_mask = '0.9.0.4'
105
message = 'invalid IPNetwork 192.168.0.255/0.9.0.4'
110
message = "invalid IPNetwork %s/0.9.0.4" % interface.ip
106
111
exception = self.assertRaises(ValidationError, interface.full_clean)
107
112
self.assertEqual(
109
'subnet_mask': [message],
110
'broadcast_ip': [message],
113
{'subnet_mask': [message]},
112
114
exception.message_dict)
114
116
def test_clean_network_rejects_huge_network(self):
120
122
"This network is a /%d network." % (
121
123
MINIMUM_NETMASK_BITS, MINIMUM_NETMASK_BITS - 1))
122
124
self.assertEqual(
124
'subnet_mask': [message],
125
'broadcast_ip': [message],
125
{'subnet_mask': [message]},
127
126
exception.message_dict)
129
128
def test_clean_network_accepts_network_if_not_too_big(self):
160
158
"That field cannot be empty (unless that interface is "
162
160
self.assertEqual({field: [message]}, exception.message_dict)
162
def test_clean_network_config_sets_default_if_netmask_not_given(self):
163
network = factory.getRandomNetwork()
164
nodegroup = factory.make_node_group(
166
management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS)
167
[interface] = nodegroup.get_managed_interfaces()
168
interface.full_clean()
169
self.assertEqual(unicode(network.broadcast), interface.broadcast_ip)
171
def test_clean_network_config_sets_no_broadcast_without_netmask(self):
172
network = factory.getRandomNetwork()
173
nodegroup = factory.make_node_group(
175
management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED)
176
interface = NodeGroupInterface.objects.get(nodegroup=nodegroup)
177
interface.subnet_mask = None
178
interface.broadcast_ip = None
179
interface.full_clean()
180
self.assertIsNone(interface.broadcast_ip)
182
def test_default_broadcast_ip_saves_cleanly(self):
183
# When the default value for broadcast_ip was introduced, it broke
184
# the form but not tests. The reason: the default was an IPAddress,
185
# but GenericIPAddressValidation expects a string.
186
nodegroup = factory.make_node_group()
187
# Can't use the factory for this one; it may hide the problem.
188
interface = NodeGroupInterface(
189
nodegroup=nodegroup, ip='10.1.1.1', router_ip='10.1.1.254',
190
subnet_mask='255.255.255.0', ip_range_low='10.1.1.100',
191
ip_range_high='10.1.1.200', interface='eth99',
192
management=NODEGROUPINTERFACE_MANAGEMENT.DHCP)
194
self.assertEqual(interface, reload_object(interface))