Merge lp:~jtv/maas/use-compose-curtin-network-preseed into lp:~maas-committers/maas/trunk
- use-compose-curtin-network-preseed
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Jeroen T. Vermeulen |
Approved revision: | no longer in the source branch. |
Merged at revision: | 3178 |
Proposed branch: | lp:~jtv/maas/use-compose-curtin-network-preseed |
Merge into: | lp:~maas-committers/maas/trunk |
Diff against target: |
209 lines (+92/-5) 5 files modified
src/maasserver/networking_preseed.py (+20/-0) src/maasserver/preseed.py (+3/-1) src/maasserver/rpc/testing/mixins.py (+10/-3) src/maasserver/tests/test_networking_preseed.py (+51/-0) src/maasserver/tests/test_preseed.py (+8/-1) |
To merge this branch: | bzr merge lp:~jtv/maas/use-compose-curtin-network-preseed |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Graham Binns (community) | Approve | ||
Review via email: mp+236824@code.launchpad.net |
Commit message
Configure networking on a node (when using Curtin) by asking the operating system driver on the cluster controller to generate configuration from scratch.
For now, that means “on Ubuntu generate /etc/network/
Description of the change
Jeroen T. Vermeulen (jtv) wrote : | # |
Removed the pointless exception transformations. Thanks for figuring that out.
Jeroen T. Vermeulen (jtv) wrote : | # |
Yay! It comes through the CI and it can deploy nodes. Still working to get a node without IPv4 set up though.
MAAS Lander (maas-lander) wrote : | # |
There are additional revisions which have not been approved in review. Please seek review and approval of these new revisions.
MAAS Lander (maas-lander) wrote : | # |
The attempt to merge lp:~jtv/maas/use-compose-curtin-network-preseed into lp:maas failed. Below is the output from the failed tests.
Ign http://
Get:1 http://
Ign http://
Get:2 http://
Ign http://
Hit http://
Get:3 http://
Hit http://
Get:4 http://
Get:5 http://
Hit http://
Get:6 http://
Hit http://
Get:7 http://
Hit http://
Hit http://
Hit http://
Hit http://
Get:8 http://
Hit http://
Hit http://
Ign http://
Ign http://
Get:9 http://
Get:10 http://
Get:11 http://
Get:12 http://
Hit http://
Hit http://
Fetched 1,130 kB in 0s (1,886 kB/s)
Reading package lists...
sudo DEBIAN_
--
Jeroen T. Vermeulen (jtv) wrote : | # |
Lint from review change: imports became unused!
Preview Diff
1 | === modified file 'src/maasserver/networking_preseed.py' | |||
2 | --- src/maasserver/networking_preseed.py 2014-10-02 04:14:09 +0000 | |||
3 | +++ src/maasserver/networking_preseed.py 2014-10-02 13:17:35 +0000 | |||
4 | @@ -25,10 +25,14 @@ | |||
5 | 25 | 25 | ||
6 | 26 | __metaclass__ = type | 26 | __metaclass__ = type |
7 | 27 | __all__ = [ | 27 | __all__ = [ |
8 | 28 | 'compose_curtin_network_preseed_for', | ||
9 | 28 | 'generate_networking_config', | 29 | 'generate_networking_config', |
10 | 29 | ] | 30 | ] |
11 | 30 | 31 | ||
12 | 32 | import json | ||
13 | 33 | |||
14 | 31 | from lxml import etree | 34 | from lxml import etree |
15 | 35 | from maasserver.clusterrpc.osystems import compose_curtin_network_preseed | ||
16 | 32 | from maasserver.dns.zonegenerator import get_dns_server_address | 36 | from maasserver.dns.zonegenerator import get_dns_server_address |
17 | 33 | from maasserver.exceptions import UnresolvableHost | 37 | from maasserver.exceptions import UnresolvableHost |
18 | 34 | from maasserver.models.nodeprobeddetails import get_probed_details | 38 | from maasserver.models.nodeprobeddetails import get_probed_details |
19 | @@ -317,3 +321,19 @@ | |||
20 | 317 | if len(macs) == 0: | 321 | if len(macs) == 0: |
21 | 318 | macs = node.macaddress_set.all() | 322 | macs = node.macaddress_set.all() |
22 | 319 | return [normalise_mac(unicode(mac.mac_address)) for mac in macs] | 323 | return [normalise_mac(unicode(mac.mac_address)) for mac in macs] |
23 | 324 | |||
24 | 325 | |||
25 | 326 | def compose_curtin_network_preseed_for(node): | ||
26 | 327 | """Compose OS-dependent preseed for configuring networking on `node`. | ||
27 | 328 | |||
28 | 329 | :param node: A `Node`. | ||
29 | 330 | :return: A list of preseed strings. | ||
30 | 331 | """ | ||
31 | 332 | config = { | ||
32 | 333 | 'interfaces': extract_network_interfaces(node), | ||
33 | 334 | 'auto_interfaces': find_macs_for_automatic_interfaces(node), | ||
34 | 335 | 'ips_mapping': map_static_ips(node), | ||
35 | 336 | 'gateways_mapping': map_gateways(node), | ||
36 | 337 | } | ||
37 | 338 | preseed = compose_curtin_network_preseed(node, config) | ||
38 | 339 | return [json.dumps(item) for item in preseed] | ||
39 | 320 | 340 | ||
40 | === modified file 'src/maasserver/preseed.py' | |||
41 | --- src/maasserver/preseed.py 2014-10-01 16:50:53 +0000 | |||
42 | +++ src/maasserver/preseed.py 2014-10-02 13:17:35 +0000 | |||
43 | @@ -52,6 +52,7 @@ | |||
44 | 52 | Config, | 52 | Config, |
45 | 53 | DHCPLease, | 53 | DHCPLease, |
46 | 54 | ) | 54 | ) |
47 | 55 | from maasserver.networking_preseed import compose_curtin_network_preseed_for | ||
48 | 55 | from maasserver.node_status import COMMISSIONING_LIKE_STATUSES | 56 | from maasserver.node_status import COMMISSIONING_LIKE_STATUSES |
49 | 56 | from maasserver.server_address import get_maas_facing_server_host | 57 | from maasserver.server_address import get_maas_facing_server_host |
50 | 57 | from maasserver.third_party_drivers import get_third_party_driver | 58 | from maasserver.third_party_drivers import get_third_party_driver |
51 | @@ -135,6 +136,7 @@ | |||
52 | 135 | return [yaml.safe_dump(reporter)] | 136 | return [yaml.safe_dump(reporter)] |
53 | 136 | 137 | ||
54 | 137 | 138 | ||
55 | 139 | # This function is being replaced with compose_curtin_network_preseed_for. | ||
56 | 138 | def compose_curtin_network_preseed(node): | 140 | def compose_curtin_network_preseed(node): |
57 | 139 | """Return a list of curtin preseeds for configuring a node's networking. | 141 | """Return a list of curtin preseeds for configuring a node's networking. |
58 | 140 | 142 | ||
59 | @@ -205,7 +207,7 @@ | |||
60 | 205 | installer_url = get_curtin_installer_url(node) | 207 | installer_url = get_curtin_installer_url(node) |
61 | 206 | main_config = get_curtin_config(node) | 208 | main_config = get_curtin_config(node) |
62 | 207 | reporter_config = compose_curtin_maas_reporter(node) | 209 | reporter_config = compose_curtin_maas_reporter(node) |
64 | 208 | network_config = compose_curtin_network_preseed(node) | 210 | network_config = compose_curtin_network_preseed_for(node) |
65 | 209 | return pack_install( | 211 | return pack_install( |
66 | 210 | configs=[main_config] + reporter_config + network_config, | 212 | configs=[main_config] + reporter_config + network_config, |
67 | 211 | args=[installer_url]) | 213 | args=[installer_url]) |
68 | 212 | 214 | ||
69 | === modified file 'src/maasserver/rpc/testing/mixins.py' | |||
70 | --- src/maasserver/rpc/testing/mixins.py 2014-09-10 16:20:31 +0000 | |||
71 | +++ src/maasserver/rpc/testing/mixins.py 2014-10-02 13:17:35 +0000 | |||
72 | @@ -22,14 +22,19 @@ | |||
73 | 22 | RunningEventLoopFixture, | 22 | RunningEventLoopFixture, |
74 | 23 | ) | 23 | ) |
75 | 24 | from maasserver.testing.factory import factory | 24 | from maasserver.testing.factory import factory |
77 | 25 | from provisioningserver.rpc.cluster import GetPreseedData | 25 | from provisioningserver.rpc.cluster import ( |
78 | 26 | ComposeCurtinNetworkPreseed, | ||
79 | 27 | GetPreseedData, | ||
80 | 28 | ) | ||
81 | 29 | from provisioningserver.rpc.testing import always_succeed_with | ||
82 | 26 | 30 | ||
83 | 27 | 31 | ||
84 | 28 | class PreseedRPCMixin: | 32 | class PreseedRPCMixin: |
85 | 29 | """Set-up a live RPC environment for testing. | 33 | """Set-up a live RPC environment for testing. |
86 | 30 | 34 | ||
87 | 31 | It creates a cluster connected by RPC that responds to the | 35 | It creates a cluster connected by RPC that responds to the |
89 | 32 | `GetPreseedData` call with a simple `NotImplementedError`. | 36 | `GetPreseedData` call with a simple `NotImplementedError`. The |
90 | 37 | `ComposeCurtinNetworkPreseed` call returns an empty list. | ||
91 | 33 | 38 | ||
92 | 34 | Tests that mix this in can use their ``rpc_cluster`` attribute (an | 39 | Tests that mix this in can use their ``rpc_cluster`` attribute (an |
93 | 35 | instance of :py:class:`MockLiveRegionToClusterRPCFixture`) to control the | 40 | instance of :py:class:`MockLiveRegionToClusterRPCFixture`) to control the |
94 | @@ -48,6 +53,8 @@ | |||
95 | 48 | # GetPreseedData call with a simple NotImplementedError. | 53 | # GetPreseedData call with a simple NotImplementedError. |
96 | 49 | self.rpc_nodegroup = factory.make_NodeGroup() | 54 | self.rpc_nodegroup = factory.make_NodeGroup() |
97 | 50 | self.rpc_cluster = self.rpc_fixture.makeCluster( | 55 | self.rpc_cluster = self.rpc_fixture.makeCluster( |
99 | 51 | self.rpc_nodegroup, GetPreseedData) | 56 | self.rpc_nodegroup, GetPreseedData, ComposeCurtinNetworkPreseed) |
100 | 52 | self.rpc_cluster.GetPreseedData.side_effect = ( | 57 | self.rpc_cluster.GetPreseedData.side_effect = ( |
101 | 53 | NotImplementedError()) | 58 | NotImplementedError()) |
102 | 59 | self.rpc_cluster.ComposeCurtinNetworkPreseed.side_effect = ( | ||
103 | 60 | always_succeed_with({'data': []})) | ||
104 | 54 | 61 | ||
105 | === modified file 'src/maasserver/tests/test_networking_preseed.py' | |||
106 | --- src/maasserver/tests/test_networking_preseed.py 2014-10-02 04:12:31 +0000 | |||
107 | +++ src/maasserver/tests/test_networking_preseed.py 2014-10-02 13:17:35 +0000 | |||
108 | @@ -15,6 +15,7 @@ | |||
109 | 15 | __all__ = [ | 15 | __all__ = [ |
110 | 16 | ] | 16 | ] |
111 | 17 | 17 | ||
112 | 18 | import json | ||
113 | 18 | from random import randint | 19 | from random import randint |
114 | 19 | 20 | ||
115 | 20 | from maasserver import networking_preseed | 21 | from maasserver import networking_preseed |
116 | @@ -26,6 +27,7 @@ | |||
117 | 26 | from maasserver.exceptions import UnresolvableHost | 27 | from maasserver.exceptions import UnresolvableHost |
118 | 27 | from maasserver.networking_preseed import ( | 28 | from maasserver.networking_preseed import ( |
119 | 28 | add_ip_to_mapping, | 29 | add_ip_to_mapping, |
120 | 30 | compose_curtin_network_preseed_for, | ||
121 | 29 | extract_mac_string, | 31 | extract_mac_string, |
122 | 30 | extract_network_interfaces, | 32 | extract_network_interfaces, |
123 | 31 | find_macs_for_automatic_interfaces, | 33 | find_macs_for_automatic_interfaces, |
124 | @@ -43,6 +45,7 @@ | |||
125 | 43 | from maasserver.testing.factory import factory | 45 | from maasserver.testing.factory import factory |
126 | 44 | from maasserver.testing.testcase import MAASServerTestCase | 46 | from maasserver.testing.testcase import MAASServerTestCase |
127 | 45 | from maastesting.matchers import MockCalledOnceWith | 47 | from maastesting.matchers import MockCalledOnceWith |
128 | 48 | from netaddr import IPAddress | ||
129 | 46 | from testtools.matchers import HasLength | 49 | from testtools.matchers import HasLength |
130 | 47 | 50 | ||
131 | 48 | 51 | ||
132 | @@ -754,3 +757,51 @@ | |||
133 | 754 | self.assertItemsEqual( | 757 | self.assertItemsEqual( |
134 | 755 | [normalise_mac(unicode(mac1)), normalise_mac(unicode(mac2))], | 758 | [normalise_mac(unicode(mac1)), normalise_mac(unicode(mac2))], |
135 | 756 | find_macs_for_automatic_interfaces(node)) | 759 | find_macs_for_automatic_interfaces(node)) |
136 | 760 | |||
137 | 761 | |||
138 | 762 | class TestComposeCurtinNetworkPreseedFor(MAASServerTestCase): | ||
139 | 763 | |||
140 | 764 | def test__composes_config(self): | ||
141 | 765 | fake = self.patch_autospec( | ||
142 | 766 | networking_preseed, 'compose_curtin_network_preseed') | ||
143 | 767 | fake.return_value = [] | ||
144 | 768 | node = factory.make_Node() | ||
145 | 769 | node.nodegroup.accept() | ||
146 | 770 | network = factory.make_ipv4_network(slash=24) | ||
147 | 771 | router = factory.pick_ip_in_network(network) | ||
148 | 772 | static_low = unicode(IPAddress(network.first + 1)) | ||
149 | 773 | static_high = unicode(IPAddress(network.first + 2)) | ||
150 | 774 | dyn_low = unicode(IPAddress(network.first + 3)) | ||
151 | 775 | dyn_high = unicode(IPAddress(network.first + 4)) | ||
152 | 776 | interface = factory.make_NodeGroupInterface( | ||
153 | 777 | node.nodegroup, network=network, router_ip=router, | ||
154 | 778 | static_ip_range_low=static_low, static_ip_range_high=static_high, | ||
155 | 779 | ip_range_low=dyn_low, ip_range_high=dyn_high, | ||
156 | 780 | management=NODEGROUPINTERFACE_MANAGEMENT.DHCP) | ||
157 | 781 | mac = factory.make_MACAddress(node=node, cluster_interface=interface) | ||
158 | 782 | extract_interfaces = self.patch_autospec( | ||
159 | 783 | networking_preseed, 'extract_network_interfaces') | ||
160 | 784 | extract_interfaces.return_value = [mac.mac_address] | ||
161 | 785 | |||
162 | 786 | compose_curtin_network_preseed_for(node) | ||
163 | 787 | |||
164 | 788 | expected_config = { | ||
165 | 789 | 'interfaces': [mac.mac_address], | ||
166 | 790 | 'auto_interfaces': [mac.mac_address], | ||
167 | 791 | 'ips_mapping': {}, | ||
168 | 792 | 'gateways_mapping': {mac.mac_address: [router]}, | ||
169 | 793 | } | ||
170 | 794 | self.assertThat(fake, MockCalledOnceWith(node, expected_config)) | ||
171 | 795 | |||
172 | 796 | def test__returns_preseeds_as_list_of_text(self): | ||
173 | 797 | fake = self.patch_autospec( | ||
174 | 798 | networking_preseed, 'compose_curtin_network_preseed') | ||
175 | 799 | preseed_data = {factory.make_name('key'): factory.make_name('value')} | ||
176 | 800 | fake.return_value = [preseed_data] | ||
177 | 801 | node = factory.make_Node() | ||
178 | 802 | |||
179 | 803 | preseed = compose_curtin_network_preseed_for(node) | ||
180 | 804 | |||
181 | 805 | self.assertIsInstance(preseed, list) | ||
182 | 806 | [data] = preseed | ||
183 | 807 | self.assertEqual(preseed_data, json.loads(data)) | ||
184 | 757 | 808 | ||
185 | === modified file 'src/maasserver/tests/test_preseed.py' | |||
186 | --- src/maasserver/tests/test_preseed.py 2014-09-25 19:38:57 +0000 | |||
187 | +++ src/maasserver/tests/test_preseed.py 2014-10-02 13:17:35 +0000 | |||
188 | @@ -74,6 +74,7 @@ | |||
189 | 74 | from maasserver.utils import absolute_reverse | 74 | from maasserver.utils import absolute_reverse |
190 | 75 | from maastesting.matchers import MockCalledOnceWith | 75 | from maastesting.matchers import MockCalledOnceWith |
191 | 76 | from metadataserver.models import NodeKey | 76 | from metadataserver.models import NodeKey |
192 | 77 | from mock import ANY | ||
193 | 77 | from provisioningserver.rpc.exceptions import NoConnectionsAvailable | 78 | from provisioningserver.rpc.exceptions import NoConnectionsAvailable |
194 | 78 | from provisioningserver.utils import locate_config | 79 | from provisioningserver.utils import locate_config |
195 | 79 | from provisioningserver.utils.enum import map_enum | 80 | from provisioningserver.utils.enum import map_enum |
196 | @@ -885,8 +886,14 @@ | |||
197 | 885 | node.nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP) | 886 | node.nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP) |
198 | 886 | arch, subarch = node.architecture.split('/') | 887 | arch, subarch = node.architecture.split('/') |
199 | 887 | self.configure_get_boot_images_for_node(node, 'xinstall') | 888 | self.configure_get_boot_images_for_node(node, 'xinstall') |
200 | 889 | |||
201 | 888 | user_data = get_curtin_userdata(node) | 890 | user_data = get_curtin_userdata(node) |
203 | 889 | # Just check that the user data looks good. | 891 | |
204 | 892 | self.expectThat( | ||
205 | 893 | self.rpc_cluster.ComposeCurtinNetworkPreseed, | ||
206 | 894 | MockCalledOnceWith( | ||
207 | 895 | ANY, osystem=node.get_osystem(), config=ANY, | ||
208 | 896 | disable_ipv4=node.disable_ipv4)) | ||
209 | 890 | self.assertIn("PREFIX='curtin'", user_data) | 897 | self.assertIn("PREFIX='curtin'", user_data) |
210 | 891 | 898 | ||
211 | 892 | 899 |
Approved, with comments; something needs to change w.r.t exception handling, but there are a couple of ways you can do it, so I'll leave it up to you.