Adds support for multiple instances

Saves plugins data in a per-instance section. This is
useful in case an instance is snapshotted and new instances
are booted from the new image.
This commit is contained in:
Alessandro Pilotti
2014-02-19 00:34:50 +02:00
parent bad73c7abe
commit 198065f2ca
4 changed files with 25 additions and 9 deletions

View File

@@ -41,18 +41,24 @@ LOG = logging.getLogger(__name__)
class InitManager(object):
_PLUGINS_CONFIG_SECTION = 'Plugins'
def _get_plugin_status(self, osutils, plugin_name):
def _get_plugins_section(self, instance_id):
if not instance_id:
return self._PLUGINS_CONFIG_SECTION
else:
return instance_id + "/" + self._PLUGINS_CONFIG_SECTION
def _get_plugin_status(self, osutils, instance_id, plugin_name):
return osutils.get_config_value(plugin_name,
self._PLUGINS_CONFIG_SECTION)
self._get_plugins_section(instance_id))
def _set_plugin_status(self, osutils, plugin_name, status):
def _set_plugin_status(self, osutils, instance_id, plugin_name, status):
osutils.set_config_value(plugin_name, status,
self._PLUGINS_CONFIG_SECTION)
self._get_plugins_section(instance_id))
def _exec_plugin(self, osutils, service, plugin, shared_data):
def _exec_plugin(self, osutils, service, plugin, instance_id, shared_data):
plugin_name = plugin.get_name()
status = self._get_plugin_status(osutils, plugin_name)
status = self._get_plugin_status(osutils, instance_id, plugin_name)
if status == plugins_base.PLUGIN_EXECUTION_DONE:
LOG.debug('Plugin \'%(plugin_name)s\' execution already done, '
'skipping' % locals())
@@ -62,7 +68,8 @@ class InitManager(object):
try:
(status, reboot_required) = plugin.execute(service,
shared_data)
self._set_plugin_status(osutils, plugin_name, status)
self._set_plugin_status(osutils, instance_id, plugin_name,
status)
return reboot_required
except Exception, ex:
LOG.error('plugin \'%(plugin_name)s\' failed '
@@ -98,6 +105,9 @@ class InitManager(object):
LOG.info('Metadata service loaded: \'%s\'' %
service.get_name())
instance_id = service.get_instance_id()
LOG.debug('Instance id: %s', instance_id)
plugins = plugins_factory.PluginFactory().load_plugins()
plugins_shared_data = {}
@@ -107,7 +117,7 @@ class InitManager(object):
for plugin in plugins:
if self._check_plugin_os_requirements(osutils, plugin):
if self._exec_plugin(osutils, service, plugin,
plugins_shared_data):
instance_id, plugins_shared_data):
reboot_required = True
if CONF.allow_reboot:
break