diff options
author | Joshua Harlow <harlowja@yahoo-inc.com> | 2012-08-31 15:44:50 -0400 |
---|---|---|
committer | Scott Moser <smoser@ubuntu.com> | 2012-08-31 15:44:50 -0400 |
commit | 27118e7406237510ca56e969aa1b6d9152c8afbf (patch) | |
tree | 781517557785592eb8dbe40fd52a0752af774ced /cloudinit/sources | |
parent | c6e4c646287e26d15b8d2402527e1f77e21113cd (diff) | |
parent | ff60020fa3d8e457cf9d1d543af9193376bf598c (diff) | |
download | vyos-cloud-init-27118e7406237510ca56e969aa1b6d9152c8afbf.tar.gz vyos-cloud-init-27118e7406237510ca56e969aa1b6d9152c8afbf.zip |
support launch index specific user-data
EC2 and openstack provide 'launch_index' in their metadata. This allows
the user to specify cloud-config or multipart mime data that includes the
'Launch-Index' header.
If launch index is available in the metadata service, then:
* any part that contains a launch index other than the current launch-index
of this instance will be ignored.
* any part that does not contain a launch index will be considered as
for this instance.
If there is no such header, or launch_index is not available in the metadata
service, then no such filtering will be done.
LP: #1023177
Diffstat (limited to 'cloudinit/sources')
-rw-r--r-- | cloudinit/sources/DataSourceEc2.py | 6 | ||||
-rw-r--r-- | cloudinit/sources/__init__.py | 28 |
2 files changed, 31 insertions, 3 deletions
diff --git a/cloudinit/sources/DataSourceEc2.py b/cloudinit/sources/DataSourceEc2.py index 7e845571..c7ad6d54 100644 --- a/cloudinit/sources/DataSourceEc2.py +++ b/cloudinit/sources/DataSourceEc2.py @@ -77,6 +77,12 @@ class DataSourceEc2(sources.DataSource): self.metadata_address) return False + @property + def launch_index(self): + if not self.metadata: + return None + return self.metadata.get('ami-launch-index') + def get_instance_id(self): return self.metadata['instance-id'] diff --git a/cloudinit/sources/__init__.py b/cloudinit/sources/__init__.py index 4719d254..3f611d44 100644 --- a/cloudinit/sources/__init__.py +++ b/cloudinit/sources/__init__.py @@ -20,6 +20,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. +from email.mime.multipart import MIMEMultipart + import abc from cloudinit import importer @@ -27,6 +29,8 @@ from cloudinit import log as logging from cloudinit import user_data as ud from cloudinit import util +from cloudinit.filters import launch_index + DEP_FILESYSTEM = "FILESYSTEM" DEP_NETWORK = "NETWORK" DS_PREFIX = 'DataSource' @@ -59,13 +63,31 @@ class DataSource(object): else: self.ud_proc = ud_proc - def get_userdata(self): + def get_userdata(self, apply_filter=False): if self.userdata is None: - raw_data = self.get_userdata_raw() - self.userdata = self.ud_proc.process(raw_data) + self.userdata = self.ud_proc.process(self.get_userdata_raw()) + if apply_filter: + return self._filter_userdata(self.userdata) return self.userdata @property + def launch_index(self): + if not self.metadata: + return None + if 'launch-index' in self.metadata: + return self.metadata['launch-index'] + return None + + def _filter_userdata(self, processed_ud): + filters = [ + launch_index.Filter(util.safe_int(self.launch_index)), + ] + new_ud = processed_ud + for f in filters: + new_ud = f.apply(new_ud) + return new_ud + + @property def is_disconnected(self): return False |