Merge lp:~smoser/maas/preserve-sources-list into lp:maas/trunk

Proposed by Scott Moser on 2012-10-03
Status: Merged
Merged at revision: 1172
Proposed branch: lp:~smoser/maas/preserve-sources-list
Merge into: lp:maas/trunk
Diff against target: 87 lines (+36/-4)
4 files modified
contrib/preseeds_v2/commissioning (+0/-1)
contrib/preseeds_v2/generic (+0/-1)
src/maasserver/compose_preseed.py (+10/-2)
src/maasserver/tests/test_compose_preseed.py (+26/-0)
To merge this branch: bzr merge lp:~smoser/maas/preserve-sources-list
Reviewer Review Type Date Requested Status
Robie Basak qa Approve on 2012-10-04
MAAS Maintainers 2012-10-03 Pending
Review via email: mp+127825@code.launchpad.net

Commit Message

specify 'preserve_sources_list' to cloud-init in install preseed

This moves the cloud-init/local-cloud-config out of the preseed explicitly
and instead renders it in compose_cloud_init_preseed.

We now put 2 items in this debconf escaped yaml, essentially feeding
cloud-init this yaml:
  manage_etc_hosts: localhost
  preserve_source_list: true

preserve_sources_list is required so cloud-init on first boot does not:
 a.) break arm mirrors (12.04 arm installs)
 b.) override a local mirror that was specified somewhere else.

In the future this will make adding other cloud-init config simpler.

Also, remove incorrect and useless [ignored] string in commissioning user-data.

Description of the Change

specify 'preserve_sources_list' to cloud-init in install preseed

This moves the cloud-init/local-cloud-config out of the preseed explicitly
and instead renders it in compose_cloud_init_preseed.

We now put 2 items in this debconf escaped yaml, essentially feeding
cloud-init this yaml:
  manage_etc_hosts: localhost
  preserve_source_list: true

preserve_sources_list is required so cloud-init on first boot does not:
 a.) break arm mirrors (12.04 arm installs)
 b.) override a local mirror that was specified somewhere else.

In the future this will make adding other cloud-init config simpler.

Also, remove incorrect and useless [ignored] string in commissioning user-data.

To post a comment you must log in.
Julian Edwards (julian-edwards) wrote :

On Wednesday 03 October 2012 16:43:24 you wrote:
> The proposal to merge lp:~smoser/maas/preserve-sources-list into lp:maas has
> been updated.
>
> Status: Needs review => Work in progress
>
> For more details, see:
> https://code.launchpad.net/~smoser/maas/preserve-sources-list/+merge/127825

FWIW you don't need to do this if you open up the green expander at the bottom
of the MP creation page and untick "ready for review".

Robie Basak (racb) wrote :

This doesn't break anything, but after deployment sources.list is still wrong on ARM. Enlistment and commissioning work fine as they did before.

Robie Basak (racb) wrote :

It works now. Deploying Precise on highbank from MAAS trunk on a Quantal machine using a Precise ephemeral image, sources.list is now correct after deployment and "apt-get update" Just Works.

Thanks, Scott!

Robie Basak (racb) :
review: Approve (qa)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'contrib/preseeds_v2/commissioning'
2--- contrib/preseeds_v2/commissioning 2012-06-19 16:01:07 +0000
3+++ contrib/preseeds_v2/commissioning 2012-10-04 14:03:22 +0000
4@@ -1,2 +1,1 @@
5 {{preseed_data}}
6-cloud-init cloud-init/local-cloud-config string manage_etc_hosts: localhost
7
8=== modified file 'contrib/preseeds_v2/generic'
9--- contrib/preseeds_v2/generic 2012-10-02 19:08:05 +0000
10+++ contrib/preseeds_v2/generic 2012-10-04 14:03:22 +0000
11@@ -27,7 +27,6 @@
12
13 {{def preseed}}
14 {{preseed_data}}
15-cloud-init cloud-init/local-cloud-config string manage_etc_hosts: localhost
16 {{enddef}}
17
18 {{def post_scripts}}
19
20=== modified file 'src/maasserver/compose_preseed.py'
21--- src/maasserver/compose_preseed.py 2012-08-16 13:38:51 +0000
22+++ src/maasserver/compose_preseed.py 2012-10-04 14:03:22 +0000
23@@ -29,12 +29,20 @@
24 'oauth_token_secret': token.secret,
25 })
26
27+ local_config_yaml = yaml.safe_dump({
28+ "manage_etc_hosts": "localhost",
29+ "apt_preserve_sources_list": True,
30+ })
31+ # this is debconf escaping
32+ local_config = local_config_yaml.replace("\\", "\\\\").replace("\n", "\\n")
33+
34 # Preseed data to send to cloud-init. We set this as MAAS_PRESEED in
35 # ks_meta, and it gets fed straight into debconf.
36- metadata_preseed_items = [
37+ preseed_items = [
38 ('datasources', 'multiselect', 'MAAS'),
39 ('maas-metadata-url', 'string', absolute_reverse('metadata')),
40 ('maas-metadata-credentials', 'string', credentials),
41+ ('local-cloud-config', 'string', local_config)
42 ]
43
44 return '\n'.join(
45@@ -43,7 +51,7 @@
46 item_type,
47 item_value,
48 )
49- for item_name, item_type, item_value in metadata_preseed_items)
50+ for item_name, item_type, item_value in preseed_items)
51
52
53 def compose_commissioning_preseed(token):
54
55=== modified file 'src/maasserver/tests/test_compose_preseed.py'
56--- src/maasserver/tests/test_compose_preseed.py 2012-08-16 13:57:02 +0000
57+++ src/maasserver/tests/test_compose_preseed.py 2012-10-04 14:03:22 +0000
58@@ -68,3 +68,29 @@
59 self.assertEqual(token.consumer.key, maas_dict['consumer_key'])
60 self.assertEqual(token.key, maas_dict['token_key'])
61 self.assertEqual(token.secret, maas_dict['token_secret'])
62+
63+ def test_compose_preseed_valid_local_cloud_config(self):
64+ node = factory.make_node(status=NODE_STATUS.READY)
65+ preseed = compose_preseed(node)
66+ token = NodeKey.objects.get_token_for_node(node)
67+
68+ keyname = "cloud-init/local-cloud-config"
69+ self.assertIn(keyname, preseed)
70+
71+ # expected input is 'cloud-init/local-cloud-config string VALUE'
72+ # where one or more spaces in between tokens, and VALUE ending at newline
73+ value = preseed[preseed.find(keyname) + len(keyname):]
74+ value = value[value.find("string") + len("string"):].lstrip()
75+ if "\n" in value:
76+ value = value[:value.find("\n")]
77+
78+ # now debconf-unescape it
79+ value = value.replace("\\n", "\n").replace("\\\\", "\\")
80+
81+ # at this point it should be valid yaml
82+ data = yaml.safe_load(value)
83+
84+ self.assertIn("manage_etc_hosts", data)
85+ self.assertEqual(data["manage_etc_hosts"], "localhost")
86+ self.assertIn("apt_preserve_sources_list", data)
87+ self.assertEqual(data["apt_preserve_sources_list"], True)