From 0247b1be0ae3d1bc913b5e368dadf22e26b54b86 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Sun, 19 Aug 2012 22:28:14 -0700 Subject: Add a 'none' datasource as a last resort fallback 1. This will allow a basically empty datasource to be activated (as the last datasource) when no other datasources work. This allows modules to still run (if they can, new function added to the datasource if modules want to check if cloud-init is in this 'disconnected' state). --- cloudinit/settings.py | 4 ++- cloudinit/sources/DataSourceNone.py | 59 +++++++++++++++++++++++++++++++++++++ cloudinit/sources/__init__.py | 4 +++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 cloudinit/sources/DataSourceNone.py (limited to 'cloudinit') diff --git a/cloudinit/settings.py b/cloudinit/settings.py index cdfc31ae..8cc9e3b4 100644 --- a/cloudinit/settings.py +++ b/cloudinit/settings.py @@ -35,7 +35,9 @@ CFG_BUILTIN = { 'OVF', 'MAAS', 'Ec2', - 'CloudStack' + 'CloudStack', + # At the end to act as a 'catch' when none of the above work... + 'None', ], 'def_log_file': '/var/log/cloud-init.log', 'log_cfgs': [], diff --git a/cloudinit/sources/DataSourceNone.py b/cloudinit/sources/DataSourceNone.py new file mode 100644 index 00000000..e53eb280 --- /dev/null +++ b/cloudinit/sources/DataSourceNone.py @@ -0,0 +1,59 @@ +# vi: ts=4 expandtab +# +# Copyright (C) 2012 Yahoo! Inc. +# +# Author: Joshua Harlow +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 3, as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from cloudinit import log as logging +from cloudinit import sources +from cloudinit import util + +LOG = logging.getLogger(__name__) + +NONE_IID = 'iid-datasource-none' + + +class DataSourceNone(sources.DataSource): + def __init__(self, sys_cfg, distro, paths, ud_proc=None): + sources.DataSource.__init__(self, sys_cfg, distro, paths, ud_proc) + self.userdata = {} + self.metadata = {} + self.userdata_raw = '' + + def get_data(self): + return True + + def get_instance_id(self): + return NONE_IID + + def __str__(self): + return util.obj_name(self) + + @property + def is_disconnected(self): + return True + + +# Used to match classes to dependencies (this will always match) +datasources = [ + (DataSourceNone, (sources.DEP_FILESYSTEM, sources.DEP_NETWORK)), + (DataSourceNone, (sources.DEP_FILESYSTEM,)), + (DataSourceNone, []), +] + + +# Return a list of data sources that match this set of dependencies +def get_datasource_list(depends): + return sources.list_from_depends(depends, datasources) diff --git a/cloudinit/sources/__init__.py b/cloudinit/sources/__init__.py index b25724a5..ca9f58e5 100644 --- a/cloudinit/sources/__init__.py +++ b/cloudinit/sources/__init__.py @@ -65,6 +65,10 @@ class DataSource(object): self.userdata = self.ud_proc.process(raw_data) return self.userdata + @property + def is_disconnected(self): + return False + def get_userdata_raw(self): return self.userdata_raw -- cgit v1.2.3 From c1d2bc7ff9824b967cca21ed0254e4ee47168b10 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Mon, 20 Aug 2012 12:20:26 -0700 Subject: Remove the matching of the filesystem dep and add in the ability to use any fallback userdata or metadata found in the datasource config (if provided). --- cloudinit/sources/DataSourceNone.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'cloudinit') diff --git a/cloudinit/sources/DataSourceNone.py b/cloudinit/sources/DataSourceNone.py index e53eb280..b186113c 100644 --- a/cloudinit/sources/DataSourceNone.py +++ b/cloudinit/sources/DataSourceNone.py @@ -22,8 +22,6 @@ from cloudinit import util LOG = logging.getLogger(__name__) -NONE_IID = 'iid-datasource-none' - class DataSourceNone(sources.DataSource): def __init__(self, sys_cfg, distro, paths, ud_proc=None): @@ -33,10 +31,17 @@ class DataSourceNone(sources.DataSource): self.userdata_raw = '' def get_data(self): + # If the datasource config has any provided 'fallback' + # userdata or metadata, use it... + if 'userdata' in self.ds_cfg: + self.userdata = self.ds_cfg['userdata'] + self.userdata_raw = util.yaml_dumps(self.userdata) + if 'metadata' in self.ds_cfg: + self.metadata = self.ds_cfg['metadata'] return True def get_instance_id(self): - return NONE_IID + return 'iid-datasource-none' def __str__(self): return util.obj_name(self) @@ -46,10 +51,9 @@ class DataSourceNone(sources.DataSource): return True -# Used to match classes to dependencies (this will always match) +# Used to match classes to dependencies datasources = [ (DataSourceNone, (sources.DEP_FILESYSTEM, sources.DEP_NETWORK)), - (DataSourceNone, (sources.DEP_FILESYSTEM,)), (DataSourceNone, []), ] -- cgit v1.2.3