Merge ~smoser/cloud-init:bug/1717598-fix-gce-user-data into cloud-init:master

Proposed by Scott Moser
Status: Merged
Approved by: Scott Moser
Approved revision: c174e78699f883d96189fe449041c6d76d846d96
Merged at revision: 10f067d87a2d48092c593862e686c517c57b987c
Proposed branch: ~smoser/cloud-init:bug/1717598-fix-gce-user-data
Merge into: cloud-init:master
Diff against target: 71 lines (+21/-8)
2 files modified
cloudinit/sources/DataSourceGCE.py (+19/-7)
tests/unittests/test_datasource/test_gce.py (+2/-1)
Reviewer Review Type Date Requested Status
Server Team CI bot continuous-integration Needs Fixing
Chad Smith Approve
Dan Watkins Approve
Review via email: mp+330880@code.launchpad.net

Commit message

GCE: Fix usage of user-data.

This regressed in the rework of GCE datasource to have a main.
The fix really just stores the user-data read as userdata_raw, which is
correct and consistent with other datasources.

The main is updated to address the fact that user-data is binary.

LP: #1717598

To post a comment you must log in.
Revision history for this message
Server Team CI bot (server-team-bot) wrote :

PASSED: Continuous integration, rev:d8a6ff62e6c33443da69ff2f53acd4823445ef62
https://jenkins.ubuntu.com/server/job/cloud-init-ci/317/
Executed test runs:
    SUCCESS: Checkout
    SUCCESS: Unit & Style Tests
    SUCCESS: Ubuntu LTS: Build
    SUCCESS: Ubuntu LTS: Integration
    SUCCESS: MAAS Compatability Testing
    IN_PROGRESS: Declarative: Post Actions

Click here to trigger a rebuild:
https://jenkins.ubuntu.com/server/job/cloud-init-ci/317/rebuild

review: Approve (continuous-integration)
Revision history for this message
Chad Smith (chad.smith) :
Revision history for this message
Scott Moser (smoser) wrote :

addressed Chad's comment. (thanks chad).

Revision history for this message
Server Team CI bot (server-team-bot) wrote :

PASSED: Continuous integration, rev:ea3818a26e866cf12d9b64dbd405de1aa12eec31
https://jenkins.ubuntu.com/server/job/cloud-init-ci/318/
Executed test runs:
    SUCCESS: Checkout
    SUCCESS: Unit & Style Tests
    SUCCESS: Ubuntu LTS: Build
    SUCCESS: Ubuntu LTS: Integration
    SUCCESS: MAAS Compatability Testing
    IN_PROGRESS: Declarative: Post Actions

Click here to trigger a rebuild:
https://jenkins.ubuntu.com/server/job/cloud-init-ci/318/rebuild

review: Approve (continuous-integration)
Revision history for this message
Dan Watkins (oddbloke) :
review: Approve
Revision history for this message
Server Team CI bot (server-team-bot) wrote :

PASSED: Continuous integration, rev:dbfa3e879044329797fbb20fb329144e225f6456
https://jenkins.ubuntu.com/server/job/cloud-init-ci/320/
Executed test runs:
    SUCCESS: Checkout
    SUCCESS: Unit & Style Tests
    SUCCESS: Ubuntu LTS: Build
    SUCCESS: Ubuntu LTS: Integration
    SUCCESS: MAAS Compatability Testing
    IN_PROGRESS: Declarative: Post Actions

Click here to trigger a rebuild:
https://jenkins.ubuntu.com/server/job/cloud-init-ci/320/rebuild

review: Approve (continuous-integration)
Revision history for this message
Chad Smith (chad.smith) :
Revision history for this message
Server Team CI bot (server-team-bot) wrote :

FAILED: Continuous integration, rev:bc110e1ca1f4505cbb636121f02d7f2fc26105ee
https://jenkins.ubuntu.com/server/job/cloud-init-ci/321/
Executed test runs:
    SUCCESS: Checkout
    FAILED: Unit & Style Tests

Click here to trigger a rebuild:
https://jenkins.ubuntu.com/server/job/cloud-init-ci/321/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Chad Smith (chad.smith) wrote :

You've got a couple of flake/pylint issues w/ the b64encode import

Also you can apply this patch to the existing unit tests which would have raised a unit test error on the branch previous to this due to decoding issues.
http://paste.ubuntu.com/25567020/

Revision history for this message
Chad Smith (chad.smith) :
review: Approve
Revision history for this message
Server Team CI bot (server-team-bot) wrote :

PASSED: Continuous integration, rev:7376ff391ecfab182c0405a81b4369b92c661add
https://jenkins.ubuntu.com/server/job/cloud-init-ci/322/
Executed test runs:
    SUCCESS: Checkout
    SUCCESS: Unit & Style Tests
    SUCCESS: Ubuntu LTS: Build
    SUCCESS: Ubuntu LTS: Integration
    SUCCESS: MAAS Compatability Testing
    IN_PROGRESS: Declarative: Post Actions

Click here to trigger a rebuild:
https://jenkins.ubuntu.com/server/job/cloud-init-ci/322/rebuild

review: Approve (continuous-integration)
Revision history for this message
Server Team CI bot (server-team-bot) wrote :

FAILED: Continuous integration, rev:c174e78699f883d96189fe449041c6d76d846d96
https://jenkins.ubuntu.com/server/job/cloud-init-ci/324/
Executed test runs:
    SUCCESS: Checkout
    SUCCESS: Unit & Style Tests
    FAILED: Ubuntu LTS: Build

Click here to trigger a rebuild:
https://jenkins.ubuntu.com/server/job/cloud-init-ci/324/rebuild

review: Needs Fixing (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/cloudinit/sources/DataSourceGCE.py b/cloudinit/sources/DataSourceGCE.py
2index 94484d6..ccae420 100644
3--- a/cloudinit/sources/DataSourceGCE.py
4+++ b/cloudinit/sources/DataSourceGCE.py
5@@ -62,7 +62,7 @@ class DataSourceGCE(sources.DataSource):
6 LOG.debug(ret['reason'])
7 return False
8 self.metadata = ret['meta-data']
9- self.userdata = ret['user-data']
10+ self.userdata_raw = ret['user-data']
11 return True
12
13 @property
14@@ -80,9 +80,6 @@ class DataSourceGCE(sources.DataSource):
15 # GCE has long FDQN's and has asked for short hostnames
16 return self.metadata['local-hostname'].split('.')[0]
17
18- def get_userdata_raw(self):
19- return self.userdata
20-
21 @property
22 def availability_zone(self):
23 return self.metadata['availability-zone']
24@@ -202,6 +199,9 @@ def get_datasource_list(depends):
25 if __name__ == "__main__":
26 import argparse
27 import json
28+ import sys
29+
30+ from base64 import b64encode
31
32 parser = argparse.ArgumentParser(description='Query GCE Metadata Service')
33 parser.add_argument("--endpoint", metavar="URL",
34@@ -211,8 +211,20 @@ if __name__ == "__main__":
35 help="Ignore smbios platform check",
36 action='store_false', default=True)
37 args = parser.parse_args()
38- print(json.dumps(
39- read_md(address=args.endpoint, platform_check=args.platform_check),
40- indent=1, sort_keys=True, separators=(',', ': ')))
41+ data = read_md(address=args.endpoint, platform_check=args.platform_check)
42+ if 'user-data' in data:
43+ # user-data is bytes not string like other things. Handle it specially.
44+ # if it can be represented as utf-8 then do so. Otherwise print base64
45+ # encoded value in the key user-data-b64.
46+ try:
47+ data['user-data'] = data['user-data'].decode()
48+ except UnicodeDecodeError:
49+ sys.stderr.write("User-data cannot be decoded. "
50+ "Writing as base64\n")
51+ del data['user-data']
52+ # b64encode returns a bytes value. decode to get the string.
53+ data['user-data-b64'] = b64encode(data['user-data']).decode()
54+
55+ print(json.dumps(data, indent=1, sort_keys=True, separators=(',', ': ')))
56
57 # vi: ts=4 expandtab
58diff --git a/tests/unittests/test_datasource/test_gce.py b/tests/unittests/test_datasource/test_gce.py
59index 50e49a1..d399ae7 100644
60--- a/tests/unittests/test_datasource/test_gce.py
61+++ b/tests/unittests/test_datasource/test_gce.py
62@@ -23,7 +23,8 @@ GCE_META = {
63 'instance/zone': 'foo/bar',
64 'project/attributes/sshKeys': 'user:ssh-rsa AA2..+aRD0fyVw== root@server',
65 'instance/hostname': 'server.project-foo.local',
66- 'instance/attributes/user-data': b'/bin/echo foo\n',
67+ # UnicodeDecodeError below if set to ds.userdata instead of userdata_raw
68+ 'instance/attributes/user-data': b'/bin/echo \xff\n',
69 }
70
71 GCE_META_PARTIAL = {

Subscribers

People subscribed via source and target branches