Merge ~newell-jensen/maas:2.6-lp1831147 into maas:2.6

Proposed by Newell Jensen
Status: Merged
Approved by: Newell Jensen
Approved revision: 1a400b86c7b49a48722b80d17616baee89ce8747
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~newell-jensen/maas:2.6-lp1831147
Merge into: maas:2.6
Diff against target: 298 lines (+49/-34)
4 files modified
src/metadataserver/api.py (+8/-3)
src/metadataserver/tests/test_api.py (+1/-1)
src/metadataserver/tests/test_vendor_data.py (+30/-24)
src/metadataserver/vendor_data.py (+10/-6)
Reviewer Review Type Date Requested Status
Newell Jensen (community) Approve
Review via email: mp+368356@code.launchpad.net

Commit message

backport of bc4fa9387e14cf40d002f8b1f6c24e877320abb1

LP: #1831147 -- set the proxy for snapd so that the maas snap can be installed when configuring a rack controller on a deploying node.

To post a comment you must log in.
Revision history for this message
Newell Jensen (newell-jensen) wrote :

Self approved backport

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/metadataserver/api.py b/src/metadataserver/api.py
2index ff79192..2a1f0e1 100644
3--- a/src/metadataserver/api.py
4+++ b/src/metadataserver/api.py
5@@ -44,6 +44,7 @@ from maasserver.api.utils import (
6 get_mandatory_param,
7 get_optional_param,
8 )
9+from maasserver.compose_preseed import get_apt_proxy
10 from maasserver.enum import (
11 NODE_STATUS,
12 NODE_STATUS_CHOICES_DICT,
13@@ -849,7 +850,11 @@ class MetaDataHandler(VersionIndexHandler):
14 return make_list_response(sorted(subfields))
15
16 producer = self.get_attribute_producer(item)
17- return producer(node, version, item)
18+ if producer == self.vendor_data:
19+ proxy = get_apt_proxy(request, node=node)
20+ return producer(node, version, item, proxy)
21+ else:
22+ return producer(node, version, item)
23
24 def local_hostname(self, node, version, item):
25 """Produce local-hostname attribute."""
26@@ -859,9 +864,9 @@ class MetaDataHandler(VersionIndexHandler):
27 """Produce instance-id attribute."""
28 return make_text_response(node.system_id)
29
30- def vendor_data(self, node, version, item):
31+ def vendor_data(self, node, version, item, proxy):
32 vendor_data = {"cloud-init": "#cloud-config\n%s" % yaml.safe_dump(
33- get_vendor_data(node)
34+ get_vendor_data(node, proxy)
35 )}
36 vendor_data_dump = yaml.safe_dump(
37 vendor_data, encoding="utf-8", default_flow_style=False)
38diff --git a/src/metadataserver/tests/test_api.py b/src/metadataserver/tests/test_api.py
39index f93f02b..45a8361 100644
40--- a/src/metadataserver/tests/test_api.py
41+++ b/src/metadataserver/tests/test_api.py
42@@ -901,7 +901,7 @@ class TestMetadataCommon(MAASServerTestCase):
43 yaml.safe_load(content['cloud-init']),
44 Equals(get_vendor_data.return_value))
45 self.assertThat(
46- get_vendor_data, MockCalledOnceWith(node))
47+ get_vendor_data, MockCalledOnceWith(node, ANY))
48
49
50 class TestMetadataUserData(MAASServerTestCase):
51diff --git a/src/metadataserver/tests/test_vendor_data.py b/src/metadataserver/tests/test_vendor_data.py
52index 7d7a350..a5db4fc 100644
53--- a/src/metadataserver/tests/test_vendor_data.py
54+++ b/src/metadataserver/tests/test_vendor_data.py
55@@ -42,17 +42,17 @@ class TestGetVendorData(MAASServerTestCase):
56
57 def test_returns_dict(self):
58 node = factory.make_Node()
59- self.assertThat(get_vendor_data(node), IsInstance(dict))
60+ self.assertThat(get_vendor_data(node, None), IsInstance(dict))
61
62 def test_includes_no_system_information_if_no_default_user(self):
63 node = factory.make_Node(owner=factory.make_User())
64- vendor_data = get_vendor_data(node)
65+ vendor_data = get_vendor_data(node, None)
66 self.assertThat(vendor_data, Not(Contains('system_info')))
67
68 def test_includes_system_information_if_default_user(self):
69 owner = factory.make_User()
70 node = factory.make_Node(owner=owner, default_user=owner)
71- vendor_data = get_vendor_data(node)
72+ vendor_data = get_vendor_data(node, None)
73 self.assertThat(vendor_data, ContainsDict({
74 "system_info": MatchesDict({
75 "default_user": KeysEqual("name", "gecos"),
76@@ -63,7 +63,7 @@ class TestGetVendorData(MAASServerTestCase):
77 Config.objects.set_config("ntp_external_only", True)
78 Config.objects.set_config("ntp_servers", "foo bar")
79 node = factory.make_Node()
80- vendor_data = get_vendor_data(node)
81+ vendor_data = get_vendor_data(node, None)
82 self.assertThat(vendor_data, ContainsDict({
83 "ntp": Equals({
84 "servers": [],
85@@ -175,22 +175,24 @@ class TestGenerateRackControllerConfiguration(MAASServerTestCase):
86
87 def test_yields_nothing_when_node_is_not_netboot_disabled(self):
88 configuration = generate_rack_controller_configuration(
89- node=factory.make_Node(osystem='ubuntu'))
90+ node=factory.make_Node(osystem='ubuntu'),
91+ proxy="http://proxy.example.com/")
92 self.assertThat(dict(configuration), Equals({}))
93
94 def test_yields_nothing_when_node_is_not_ubuntu(self):
95 tag = factory.make_Tag(name='switch')
96 node = factory.make_Node(osystem='centos', netboot=False)
97 node.tags.add(tag)
98- configuration = generate_rack_controller_configuration(node)
99+ configuration = generate_rack_controller_configuration(
100+ node, proxy="http://proxy.example.com/")
101 self.assertThat(dict(configuration), Equals({}))
102
103 def test_yields_configuration_with_ubuntu(self):
104 tag = factory.make_Tag(name='wedge100')
105 node = factory.make_Node(osystem='ubuntu', netboot=False)
106 node.tags.add(tag)
107- configuration = generate_rack_controller_configuration(node)
108-
109+ configuration = generate_rack_controller_configuration(
110+ node, proxy="http://proxy.example.com/")
111 secret = '1234'
112 Config.objects.set_config("rpc_shared_secret", secret)
113 channel = version.get_maas_version_track_channel()
114@@ -208,14 +210,16 @@ class TestGenerateRackControllerConfiguration(MAASServerTestCase):
115 def test_yields_nothing_when_machine_install_rackd_false(self):
116 node = factory.make_Node(osystem='ubuntu', netboot=False)
117 node.install_rackd = False
118- configuration = generate_rack_controller_configuration(node)
119+ configuration = generate_rack_controller_configuration(
120+ node, proxy="http://proxy.example.com/")
121 self.assertThat(dict(configuration), Equals({}))
122
123 def test_yields_configuration_when_machine_install_rackd_true(self):
124 node = factory.make_Node(osystem='ubuntu', netboot=False)
125 node.install_rackd = True
126- configuration = generate_rack_controller_configuration(node)
127-
128+ proxy = "http://proxy.example.com/"
129+ configuration = generate_rack_controller_configuration(
130+ node, proxy=proxy)
131 secret = '1234'
132 Config.objects.set_config("rpc_shared_secret", secret)
133 channel = version.get_maas_version_track_channel()
134@@ -225,6 +229,8 @@ class TestGenerateRackControllerConfiguration(MAASServerTestCase):
135
136 self.assertThat(dict(configuration), KeysEqual({
137 "runcmd": [
138+ "snap set system proxy.http=%s proxy.https=%s" % (
139+ proxy, proxy),
140 "snap install maas --devmode --channel=%s" % channel,
141 "%s --maas-url %s --secret %s" % (cmd, maas_url, secret),
142 ]
143@@ -233,7 +239,7 @@ class TestGenerateRackControllerConfiguration(MAASServerTestCase):
144 def test_yields_configuration_when_machine_install_kvm_true(self):
145 node = factory.make_Node(osystem='ubuntu', netboot=False)
146 node.install_kvm = True
147- configuration = get_vendor_data(node)
148+ configuration = get_vendor_data(node, None)
149 config = str(dict(configuration))
150 self.assertThat(config, Contains("virsh"))
151 self.assertThat(config, Contains("ssh_pwauth"))
152@@ -251,7 +257,7 @@ class TestGenerateRackControllerConfiguration(MAASServerTestCase):
153 node = factory.make_Node(
154 osystem='ubuntu', netboot=False, architecture='amd64/generic')
155 node.install_kvm = True
156- configuration = get_vendor_data(node)
157+ configuration = get_vendor_data(node, None)
158 config = dict(configuration)
159 self.assertThat(config['packages'], Contains("qemu-efi"))
160
161@@ -259,7 +265,7 @@ class TestGenerateRackControllerConfiguration(MAASServerTestCase):
162 node = factory.make_Node(
163 osystem='ubuntu', netboot=False, architecture='arm64/generic')
164 node.install_kvm = True
165- configuration = get_vendor_data(node)
166+ configuration = get_vendor_data(node, None)
167 config = dict(configuration)
168 self.assertThat(config['packages'], Contains("qemu-efi"))
169
170@@ -267,7 +273,7 @@ class TestGenerateRackControllerConfiguration(MAASServerTestCase):
171 node = factory.make_Node(
172 osystem='ubuntu', netboot=False, architecture='ppc64el/generic')
173 node.install_kvm = True
174- configuration = get_vendor_data(node)
175+ configuration = get_vendor_data(node, None)
176 config = dict(configuration)
177 self.assertThat(
178 config['runcmd'], Contains([
179@@ -293,7 +299,7 @@ class TestGenerateEphemeralDeploymentNetworkConfiguration(MAASServerTestCase):
180
181 def test_yields_configuration_when_node_is_ephemeral_deployment(self):
182 node = factory.make_Node(with_boot_disk=False)
183- configuration = get_vendor_data(node)
184+ configuration = get_vendor_data(node, None)
185 config = dict(configuration)
186 self.assertThat(
187 config['write_files'][0]['path'],
188@@ -307,14 +313,14 @@ class TestGenerateVcenterConfiguration(MAASServerTestCase):
189 def test_does_nothing_if_not_vmware(self):
190 mock_get_configs = self.patch(Config.objects, 'get_configs')
191 node = factory.make_Node(owner=factory.make_admin())
192- config = get_vendor_data(node)
193+ config = get_vendor_data(node, None)
194 self.assertThat(mock_get_configs, MockNotCalled())
195 self.assertDictEqual({}, config)
196
197 def test_returns_nothing_if_no_values_set(self):
198 node = factory.make_Node(osystem='esxi', owner=factory.make_admin())
199 node.nodemetadata_set.create(key='vcenter_registration', value='True')
200- config = get_vendor_data(node)
201+ config = get_vendor_data(node, None)
202 self.assertDictEqual({}, config)
203
204 def test_returns_vcenter_yaml(self):
205@@ -328,7 +334,7 @@ class TestGenerateVcenterConfiguration(MAASServerTestCase):
206 }
207 for key, value in vcenter.items():
208 Config.objects.set_config(key, value)
209- config = get_vendor_data(node)
210+ config = get_vendor_data(node, None)
211 self.assertDictEqual(
212 {'write_files': [{
213 'content': yaml.safe_dump(vcenter),
214@@ -349,7 +355,7 @@ class TestGenerateVcenterConfiguration(MAASServerTestCase):
215 }
216 for key, value in vcenter.items():
217 Config.objects.set_config(key, value)
218- config = get_vendor_data(node)
219+ config = get_vendor_data(node, None)
220 self.assertDictEqual(
221 {'write_files': [{
222 'content': yaml.safe_dump(vcenter),
223@@ -370,7 +376,7 @@ class TestGenerateVcenterConfiguration(MAASServerTestCase):
224 }
225 for key, value in vcenter.items():
226 Config.objects.set_config(key, value)
227- config = get_vendor_data(node)
228+ config = get_vendor_data(node, None)
229 self.assertDictEqual({}, config)
230
231 def test_returns_nothing_if_no_user(self):
232@@ -378,7 +384,7 @@ class TestGenerateVcenterConfiguration(MAASServerTestCase):
233 for i in ['server', 'username', 'password', 'datacenter']:
234 key = 'vcenter_%s' % i
235 Config.objects.set_config(key, factory.make_name(key))
236- config = get_vendor_data(node)
237+ config = get_vendor_data(node, None)
238 self.assertDictEqual({}, config)
239
240 def test_returns_nothing_if_user(self):
241@@ -386,7 +392,7 @@ class TestGenerateVcenterConfiguration(MAASServerTestCase):
242 for i in ['server', 'username', 'password', 'datacenter']:
243 key = 'vcenter_%s' % i
244 Config.objects.set_config(key, factory.make_name(key))
245- config = get_vendor_data(node)
246+ config = get_vendor_data(node, None)
247 self.assertDictEqual({}, config)
248
249 def test_returns_nothing_if_vcenter_registration_not_set(self):
250@@ -394,5 +400,5 @@ class TestGenerateVcenterConfiguration(MAASServerTestCase):
251 for i in ['server', 'username', 'password', 'datacenter']:
252 key = 'vcenter_%s' % i
253 Config.objects.set_config(key, factory.make_name(key))
254- config = get_vendor_data(node)
255+ config = get_vendor_data(node, None)
256 self.assertDictEqual({}, config)
257diff --git a/src/metadataserver/vendor_data.py b/src/metadataserver/vendor_data.py
258index 5010302..b4c7adf 100644
259--- a/src/metadataserver/vendor_data.py
260+++ b/src/metadataserver/vendor_data.py
261@@ -28,11 +28,11 @@ from provisioningserver.utils.version import get_maas_version_track_channel
262 import yaml
263
264
265-def get_vendor_data(node):
266+def get_vendor_data(node, proxy):
267 return dict(chain(
268 generate_system_info(node),
269 generate_ntp_configuration(node),
270- generate_rack_controller_configuration(node),
271+ generate_rack_controller_configuration(node, proxy),
272 generate_kvm_pod_configuration(node),
273 generate_ephemeral_deployment_network_configuration(node),
274 generate_vcenter_configuration(node),
275@@ -80,7 +80,7 @@ def generate_ntp_configuration(node):
276 yield "ntp", {"servers": servers, "pools": pools}
277
278
279-def generate_rack_controller_configuration(node):
280+def generate_rack_controller_configuration(node, proxy):
281 """Generate cloud-init configuration to install the rack controller."""
282
283 # FIXME: For now, we are using a tag ('switch') to deploy the rack
284@@ -100,9 +100,13 @@ def generate_rack_controller_configuration(node):
285 secret = Config.objects.get_config("rpc_shared_secret")
286 source = get_maas_version_track_channel()
287 yield "runcmd", [
288- "snap install maas --devmode --channel=%s" % source,
289- "/snap/bin/maas init --mode rack --maas-url %s --secret %s" % (
290- maas_url, secret)
291+ ['snap', 'set', 'system', 'proxy.http=%s' % proxy,
292+ 'proxy.https=%s' % proxy],
293+ ['snap', 'install', 'maas', '--devmode', '--channel=%s' % source],
294+ ['systemctl', 'restart', 'snapd'],
295+ ['export', 'PATH=$PATH'],
296+ ['/snap/bin/maas', 'init', '--mode', 'rack', '--maas-url',
297+ '%s' % maas_url, '--secret', '%s' % secret]
298 ]
299
300

Subscribers

People subscribed via source and target branches