~smoser/ubuntu/quantal/cloud-init/sru

« back to all changes in this revision

Viewing changes to debian/patches/lp-1076811-fix-userdata-update-to-distro-config.patch

  • Committer: Scott Moser
  • Date: 2012-12-05 22:05:48 UTC
  • Revision ID: smoser@ubuntu.com-20121205220548-ibqx29a3rveacuay
update lp-1076811-fix-userdata-update-to-distro-config.patch

The previous patch for this was not complete, as it left the
DataSourceNone without a distro.  I saw this inadvertantly when
testing the package.  To reproduce the issue, I did:

 * launch instance
 * echo "datasource_list: [ None ]" |
    sudo tee /etc/cloud/cloud.cfg.d/99-nocloud.cfg
 * sudo rm -Rf /var/lib/cloud
 * sudo cloud-init init --local ; sudo cloud-init init
   # the above will find the DataSourceNone
 * sudo cloud-init single --name=apt-configure --frequency=always
   # in 12.10 and prior:
   # sudo cloud-init single --name=apt-update-upgrade --frequency=always

This would have left cloud-init broken for using the DataSourceNone path
which is actually relied upon in some cases. (Ie, if you had no DataSource,
but had a runcmd in /etc/cloud.cfg.d you still want that to run.)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
Author: Scott Moser <smoser@ubuntu.com>
2
2
Bug: https://launchpad.net/bugs/1080985
3
 
Applied-Upstream: revno 703
 
3
Applied-Upstream: revno 703, 720, 722
4
4
Description: fix updates to distro config via user-data
5
5
 distro config changes were not being updated via user-data.
6
6
 This bug was exposed when trying to update mirrors from
13
13
 b.) touch empty files for tests/unittests/__init__.py
14
14
     and tests/__init__.py to get imports working correctly
15
15
     in unit tests.
 
16
 .
 
17
 This also pulls in upstream commits 720 and 722.
16
18
=== modified file 'cloudinit/stages.py'
17
19
--- a/cloudinit/stages.py
18
20
+++ b/cloudinit/stages.py
25
27
 from cloudinit import cloud
26
28
 from cloudinit import config
27
29
 from cloudinit import distros
28
 
@@ -58,8 +60,16 @@ class Init(object):
 
30
@@ -47,6 +49,8 @@ from cloudinit import util
 
31
 
 
32
 LOG = logging.getLogger(__name__)
 
33
 
 
34
+NULL_DATA_SOURCE = None
 
35
+
 
36
 
 
37
 class Init(object):
 
38
     def __init__(self, ds_deps=None):
 
39
@@ -58,8 +62,16 @@ class Init(object):
29
40
         self._cfg = None
30
41
         self._paths = None
31
42
         self._distro = None
32
43
-        # Created only when a fetch occurs
33
44
-        self.datasource = None
34
45
+        # Changed only when a fetch occurs
35
 
+        self.datasource = DataSourceNone.DataSourceNone({}, None, None)
 
46
+        self.datasource = NULL_DATA_SOURCE
36
47
+
37
48
+    def _reset(self, ds=False):
38
49
+        # Recreated on access
40
51
+        self._paths = None
41
52
+        self._distro = None
42
53
+        if ds:
43
 
+            self.datasource = DataSourceNone.DataSourceNone({}, None, None)
 
54
+            self.datasource = NULL_DATA_SOURCE
44
55
 
45
56
     @property
46
57
     def distro(self):
47
 
@@ -236,7 +246,7 @@ class Init(object):
 
58
@@ -191,7 +203,7 @@ class Init(object):
 
59
             return None
 
60
 
 
61
     def _write_to_cache(self):
 
62
-        if not self.datasource:
 
63
+        if self.datasource is NULL_DATA_SOURCE:
 
64
             return False
 
65
         pickled_fn = self.paths.get_ipath_cur("obj_pkl")
 
66
         try:
 
67
@@ -217,7 +229,7 @@ class Init(object):
 
68
         return (cfg_list, pkg_list)
 
69
 
 
70
     def _get_data_source(self):
 
71
-        if self.datasource:
 
72
+        if self.datasource is not NULL_DATA_SOURCE:
 
73
             return self.datasource
 
74
         ds = self._restore_from_cache()
 
75
         if ds:
 
76
@@ -236,7 +248,7 @@ class Init(object):
48
77
         self.datasource = ds
49
78
         # Ensure we adjust our path members datasource
50
79
         # now that we have one (thus allowing ipath to be used)
53
82
         return ds
54
83
 
55
84
     def _get_instance_subdirs(self):
56
 
@@ -296,6 +306,10 @@ class Init(object):
 
85
@@ -296,6 +308,10 @@ class Init(object):
57
86
         util.write_file(iid_fn, "%s\n" % iid)
58
87
         util.write_file(os.path.join(dp, 'previous-instance-id'),
59
88
                         "%s\n" % (previous_iid))
64
93
         return iid
65
94
 
66
95
     def fetch(self):
67
 
@@ -409,6 +423,17 @@ class Init(object):
 
96
@@ -409,6 +425,17 @@ class Init(object):
68
97
             handlers.call_end(mod, data, frequency)
69
98
             called.append(mod)
70
99