Merge lp:~blake-rouse/maas/cloud-init-apt-proxy into lp:~maas-committers/maas/trunk

Proposed by Blake Rouse
Status: Merged
Approved by: Blake Rouse
Approved revision: no longer in the source branch.
Merged at revision: 4285
Proposed branch: lp:~blake-rouse/maas/cloud-init-apt-proxy
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 199 lines (+47/-25)
4 files modified
etc/maas/templates/commissioning-user-data/user_data_config.template (+0/-6)
src/maasserver/compose_preseed.py (+34/-15)
src/maasserver/preseed.py (+1/-1)
src/maasserver/tests/test_compose_preseed.py (+12/-3)
To merge this branch: bzr merge lp:~blake-rouse/maas/cloud-init-apt-proxy
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+271691@code.launchpad.net

Commit message

Pass apt_proxy to cloud-init during commissioning and deployment.

To post a comment you must log in.
Revision history for this message
Blake Rouse (blake-rouse) wrote :

I have QA'd this in the CI and locally using an HTTP proxy. Everything works now as expected.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'etc/maas/templates/commissioning-user-data/user_data_config.template'
2--- etc/maas/templates/commissioning-user-data/user_data_config.template 2015-09-14 20:00:03 +0000
3+++ etc/maas/templates/commissioning-user-data/user_data_config.template 2015-09-18 18:51:23 +0000
4@@ -1,10 +1,4 @@
5 #cloud-config
6-{{if http_proxy}}
7-apt_proxy: {{http_proxy}}
8-{{elif server_host}}
9-apt_proxy: http://{{server_host}}:8000/
10-{{endif}}
11-
12 system_info:
13 package_mirrors:
14 - arches: [i386, amd64]
15
16=== modified file 'src/maasserver/compose_preseed.py'
17--- src/maasserver/compose_preseed.py 2015-09-07 22:00:21 +0000
18+++ src/maasserver/compose_preseed.py 2015-09-18 18:51:23 +0000
19@@ -20,6 +20,8 @@
20
21 from maasserver.clusterrpc.osystems import get_preseed_data
22 from maasserver.enum import PRESEED_TYPE
23+from maasserver.models.config import Config
24+from maasserver.server_address import get_maas_facing_server_host
25 from maasserver.utils import absolute_reverse
26 from provisioningserver.rpc.exceptions import (
27 NoConnectionsAvailable,
28@@ -28,7 +30,16 @@
29 import yaml
30
31
32-def compose_cloud_init_preseed(token, base_url=''):
33+def get_apt_proxy_for_node(node):
34+ """Return the APT proxy for the `node`."""
35+ http_proxy = Config.objects.get_config("http_proxy")
36+ if http_proxy:
37+ return http_proxy
38+ else:
39+ return "http://%s:8000/" % get_maas_facing_server_host(node.nodegroup)
40+
41+
42+def compose_cloud_init_preseed(node, token, base_url=''):
43 """Compose the preseed value for a node in any state but Commissioning."""
44 credentials = urlencode({
45 'oauth_consumer_key': token.consumer.key,
46@@ -43,6 +54,7 @@
47 # See bug 1087183 for details.
48 "manage_etc_hosts": False,
49 "apt_preserve_sources_list": True,
50+ "apt_proxy": get_apt_proxy_for_node(node),
51 })
52 # this is debconf escaping
53 local_config = local_config_yaml.replace("\\", "\\\\").replace("\n", "\\n")
54@@ -66,20 +78,24 @@
55 for item_name, item_type, item_value in preseed_items)
56
57
58-def compose_commissioning_preseed(token, base_url=''):
59+def compose_commissioning_preseed(node, token, base_url=''):
60 """Compose the preseed value for a Commissioning node."""
61+ apt_proxy = get_apt_proxy_for_node(node)
62 metadata_url = absolute_reverse('metadata', base_url=base_url)
63- return _compose_cloud_init_preseed(token, metadata_url)
64-
65-
66-def compose_curtin_preseed(token, base_url=''):
67+ return _compose_cloud_init_preseed(
68+ token, metadata_url, apt_proxy=apt_proxy)
69+
70+
71+def compose_curtin_preseed(node, token, base_url=''):
72 """Compose the preseed value for a node being installed with curtin."""
73+ apt_proxy = get_apt_proxy_for_node(node)
74 metadata_url = absolute_reverse('curtin-metadata', base_url=base_url)
75- return _compose_cloud_init_preseed(token, metadata_url)
76-
77-
78-def _compose_cloud_init_preseed(token, metadata_url):
79- return "#cloud-config\n%s" % yaml.safe_dump({
80+ return _compose_cloud_init_preseed(
81+ token, metadata_url, apt_proxy=apt_proxy)
82+
83+
84+def _compose_cloud_init_preseed(token, metadata_url, apt_proxy=None):
85+ cloud_config = {
86 'datasource': {
87 'MAAS': {
88 'metadata_url': metadata_url,
89@@ -88,7 +104,10 @@
90 'token_secret': token.secret,
91 }
92 }
93- })
94+ }
95+ if apt_proxy:
96+ cloud_config['apt_proxy'] = apt_proxy
97+ return "#cloud-config\n%s" % yaml.safe_dump(cloud_config)
98
99
100 def _get_metadata_url(preseed_type, base_url):
101@@ -118,7 +137,7 @@
102 base_url = node.nodegroup.maas_url
103
104 if preseed_type == PRESEED_TYPE.COMMISSIONING:
105- return compose_commissioning_preseed(token, base_url)
106+ return compose_commissioning_preseed(node, token, base_url)
107 else:
108 metadata_url = _get_metadata_url(preseed_type, base_url)
109
110@@ -148,6 +167,6 @@
111
112 # There is no OS-specific preseed data.
113 if preseed_type == PRESEED_TYPE.CURTIN:
114- return compose_curtin_preseed(token, base_url)
115+ return compose_curtin_preseed(node, token, base_url)
116 else:
117- return compose_cloud_init_preseed(token, base_url)
118+ return compose_cloud_init_preseed(node, token, base_url)
119
120=== modified file 'src/maasserver/preseed.py'
121--- src/maasserver/preseed.py 2015-09-10 23:27:25 +0000
122+++ src/maasserver/preseed.py 2015-09-18 18:51:23 +0000
123@@ -331,7 +331,7 @@
124 token = NodeKey.objects.get_token_for_node(node)
125 base_url = node.nodegroup.maas_url
126 return {
127- 'curtin_preseed': compose_cloud_init_preseed(token, base_url)
128+ 'curtin_preseed': compose_cloud_init_preseed(node, token, base_url)
129 }
130
131
132
133=== modified file 'src/maasserver/tests/test_compose_preseed.py'
134--- src/maasserver/tests/test_compose_preseed.py 2015-05-07 18:14:38 +0000
135+++ src/maasserver/tests/test_compose_preseed.py 2015-09-18 18:51:23 +0000
136@@ -14,7 +14,10 @@
137 __metaclass__ = type
138 __all__ = []
139
140-from maasserver.compose_preseed import compose_preseed
141+from maasserver.compose_preseed import (
142+ compose_preseed,
143+ get_apt_proxy_for_node,
144+)
145 from maasserver.enum import (
146 NODE_BOOT,
147 NODE_STATUS,
148@@ -44,6 +47,7 @@
149
150 def test_compose_preseed_for_commissioning_node_produces_yaml(self):
151 node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
152+ apt_proxy = get_apt_proxy_for_node(node)
153 preseed = yaml.safe_load(
154 compose_preseed(PRESEED_TYPE.COMMISSIONING, node))
155 self.assertIn('datasource', preseed)
156@@ -52,6 +56,7 @@
157 preseed['datasource']['MAAS'],
158 KeysEqual(
159 'metadata_url', 'consumer_key', 'token_key', 'token_secret'))
160+ self.assertEquals(apt_proxy, preseed['apt_proxy'])
161
162 def test_compose_preseed_for_commissioning_node_has_header(self):
163 node = factory.make_Node(status=NODE_STATUS.COMMISSIONING)
164@@ -97,6 +102,7 @@
165 node = factory.make_Node(status=NODE_STATUS.READY)
166 node.nodegroup.accept()
167 self.useFixture(RunningClusterRPCFixture())
168+ apt_proxy = get_apt_proxy_for_node(node)
169 preseed = compose_preseed(PRESEED_TYPE.DEFAULT, node)
170
171 keyname = "cloud-init/local-cloud-config"
172@@ -115,15 +121,17 @@
173 data = yaml.safe_load(value)
174
175 self.assertIn("manage_etc_hosts", data)
176- self.assertEqual(data["manage_etc_hosts"], False)
177+ self.assertFalse(data["manage_etc_hosts"])
178 self.assertIn("apt_preserve_sources_list", data)
179- self.assertEqual(data["apt_preserve_sources_list"], True)
180+ self.assertTrue(data["apt_preserve_sources_list"])
181+ self.assertEqual(apt_proxy, data["apt_proxy"])
182
183 def test_compose_preseed_with_curtin_installer(self):
184 node = factory.make_Node(
185 status=NODE_STATUS.READY, boot_type=NODE_BOOT.FASTPATH)
186 node.nodegroup.accept()
187 self.useFixture(RunningClusterRPCFixture())
188+ apt_proxy = get_apt_proxy_for_node(node)
189 preseed = yaml.safe_load(
190 compose_preseed(PRESEED_TYPE.CURTIN, node))
191
192@@ -136,6 +144,7 @@
193 self.assertEqual(
194 absolute_reverse('curtin-metadata'),
195 preseed['datasource']['MAAS']['metadata_url'])
196+ self.assertEqual(apt_proxy, preseed['apt_proxy'])
197
198 def test_compose_preseed_with_osystem_compose_preseed(self):
199 os_name = factory.make_name('os')