From f72e9deffb055b484a9e563caadfd8fe35f91ae1 Mon Sep 17 00:00:00 2001
From: Joshua Harlow <harlowja@yahoo-inc.com>
Date: Mon, 26 Mar 2012 16:58:22 -0700
Subject: [PATCH] Updating so that we don't write config files to the checked
 out code

---
 devstack/component.py           |  6 ++++--
 devstack/components/glance.py   | 14 +++++--------
 devstack/components/horizon.py  |  1 +
 devstack/components/keystone.py | 11 +++-------
 devstack/components/melange.py  | 14 +++++--------
 devstack/components/nova.py     | 16 +++++---------
 devstack/components/quantum.py  | 37 +++++++++------------------------
 devstack/components/swift.py    |  4 ----
 devstack/distros/fedora16.py    |  2 --
 devstack/distros/rhel6.py       |  2 +-
 10 files changed, 34 insertions(+), 73 deletions(-)

diff --git a/devstack/component.py b/devstack/component.py
index 5546085f..7c911084 100644
--- a/devstack/component.py
+++ b/devstack/component.py
@@ -512,7 +512,10 @@ class ProgramRuntime(ComponentBase):
 
     def _get_param_map(self, app_name):
         return {
-            'ROOT': self.app_dir,
+            'COMPONENT_DIR': self.component_dir,
+            'APP_DIR': self.app_dir,
+            'CONFIG_DIR': self.cfg_dir,
+            'TRACE_DIR': self.trace_dir,
         }
 
     def pre_start(self):
@@ -582,7 +585,6 @@ class ProgramRuntime(ComponentBase):
                 if cmd == settings.RUN_TYPE_TYPE and action:
                     killcls = RUNNER_CLS_MAPPING.get(action)
                     break
-
             # Did we find a class that can do it?
             if killcls:
                 if killcls in killer_instances:
diff --git a/devstack/components/glance.py b/devstack/components/glance.py
index cf24965c..aff28747 100644
--- a/devstack/components/glance.py
+++ b/devstack/components/glance.py
@@ -54,9 +54,9 @@ DB_NAME = "glance"
 
 # What applications to start
 APP_OPTIONS = {
-    'glance-api': ['--config-file', sh.joinpths('%ROOT%', "etc", API_CONF)],
-    'glance-registry': ['--config-file', sh.joinpths('%ROOT%', "etc", REG_CONF)],
-    'glance-scrubber': ['--config-file', sh.joinpths('%ROOT%', "etc", REG_CONF)],
+    'glance-api': ['--config-file', sh.joinpths('%CONFIG_DIR%', API_CONF)],
+    'glance-registry': ['--config-file', sh.joinpths('%CONFIG_DIR%', REG_CONF)],
+    'glance-scrubber': ['--config-file', sh.joinpths('%CONFIG_DIR%', REG_CONF)],
 }
 
 # How the subcompoent small name translates to an actual app
@@ -67,14 +67,12 @@ SUB_TO_APP = {
 }
 
 # Subdirs of the downloaded (we are overriding the original)
-CONFIG_DIR = 'etc'
 BIN_DIR = 'bin'
 
 
 class GlanceUninstaller(comp.PythonUninstallComponent):
     def __init__(self, *args, **kargs):
         comp.PythonUninstallComponent.__init__(self, *args, **kargs)
-        self.cfg_dir = sh.joinpths(self.app_dir, CONFIG_DIR)
 
     def known_subsystems(self):
         return SUB_TO_APP.keys()
@@ -83,7 +81,6 @@ class GlanceUninstaller(comp.PythonUninstallComponent):
 class GlanceInstaller(comp.PythonInstallComponent):
     def __init__(self, *args, **kargs):
         comp.PythonInstallComponent.__init__(self, *args, **kargs)
-        self.cfg_dir = sh.joinpths(self.app_dir, CONFIG_DIR)
 
     def _get_download_locations(self):
         places = list()
@@ -110,11 +107,11 @@ class GlanceInstaller(comp.PythonInstallComponent):
 
     def _get_source_config(self, config_fn):
         if config_fn == POLICY_JSON:
-            fn = sh.joinpths(self.cfg_dir, POLICY_JSON)
+            fn = sh.joinpths(self.app_dir, 'etc', POLICY_JSON)
             contents = sh.load_file(fn)
             return (fn, contents)
         elif config_fn == LOGGING_CONF:
-            fn = sh.joinpths(self.cfg_dir, LOGGING_SOURCE_FN)
+            fn = sh.joinpths(self.app_dir, 'etc', LOGGING_SOURCE_FN)
             contents = sh.load_file(fn)
             return (fn, contents)
         return comp.PythonInstallComponent._get_source_config(self, config_fn)
@@ -181,7 +178,6 @@ class GlanceInstaller(comp.PythonInstallComponent):
 class GlanceRuntime(comp.PythonRuntime):
     def __init__(self, *args, **kargs):
         comp.PythonRuntime.__init__(self, *args, **kargs)
-        self.cfg_dir = sh.joinpths(self.app_dir, CONFIG_DIR)
         self.bin_dir = sh.joinpths(self.app_dir, BIN_DIR)
         self.wait_time = max(self.cfg.getint('default', 'service_wait_seconds'), 1)
 
diff --git a/devstack/components/horizon.py b/devstack/components/horizon.py
index 26f0b021..5e1898da 100644
--- a/devstack/components/horizon.py
+++ b/devstack/components/horizon.py
@@ -104,6 +104,7 @@ class HorizonInstaller(comp.PythonInstallComponent):
 
     def _get_target_config_name(self, config_name):
         if config_name == HORIZON_PY_CONF:
+            # FIXME don't write to checked out locations...
             return sh.joinpths(self.dash_dir, *HORIZON_PY_CONF_TGT)
         else:
             return comp.PythonInstallComponent._get_target_config_name(self, config_name)
diff --git a/devstack/components/keystone.py b/devstack/components/keystone.py
index 1e3ff077..e45f5fa9 100644
--- a/devstack/components/keystone.py
+++ b/devstack/components/keystone.py
@@ -33,7 +33,6 @@ DB_NAME = "keystone"
 
 # Subdirs of the git checkout
 BIN_DIR = "bin"
-CONFIG_DIR = "etc"
 
 # Simple confs
 ROOT_CONF = "keystone.conf"
@@ -56,9 +55,9 @@ SYNC_DB_CMD = [sh.joinpths('%BINDIR%', MANAGE_APP_NAME), 'db_sync']
 # What to start
 APP_NAME = 'keystone-all'
 APP_OPTIONS = {
-    APP_NAME: ['--config-file', sh.joinpths('%ROOT%', CONFIG_DIR, ROOT_CONF),
+    APP_NAME: ['--config-file', sh.joinpths('%CONFIG_DIR%', ROOT_CONF),
                 "--debug", '-d',
-                '--log-config=' + sh.joinpths('%ROOT%', CONFIG_DIR, 'logging.cnf')]
+                '--log-config=' + sh.joinpths('%CONFIG_DIR%', LOGGING_CONF)]
 }
 
 
@@ -81,14 +80,11 @@ QUANTUM_TEMPL_ADDS = ['catalog.RegionOne.network.publicURL = http://%SERVICE_HOS
 class KeystoneUninstaller(comp.PythonUninstallComponent):
     def __init__(self, *args, **kargs):
         comp.PythonUninstallComponent.__init__(self, *args, **kargs)
-        self.cfg_dir = sh.joinpths(self.app_dir, CONFIG_DIR)
-        self.bin_dir = sh.joinpths(self.app_dir, BIN_DIR)
 
 
 class KeystoneInstaller(comp.PythonInstallComponent):
     def __init__(self, *args, **kargs):
         comp.PythonInstallComponent.__init__(self, *args, **kargs)
-        self.cfg_dir = sh.joinpths(self.app_dir, CONFIG_DIR)
         self.bin_dir = sh.joinpths(self.app_dir, BIN_DIR)
 
     def _get_download_locations(self):
@@ -172,7 +168,7 @@ class KeystoneInstaller(comp.PythonInstallComponent):
 
     def _get_source_config(self, config_fn):
         if config_fn == LOGGING_CONF:
-            fn = sh.joinpths(self.cfg_dir, LOGGING_SOURCE_FN)
+            fn = sh.joinpths(self.app_dir, 'etc', LOGGING_SOURCE_FN)
             contents = sh.load_file(fn)
             return (fn, contents)
         return comp.PythonInstallComponent._get_source_config(self, config_fn)
@@ -200,7 +196,6 @@ class KeystoneInstaller(comp.PythonInstallComponent):
 class KeystoneRuntime(comp.PythonRuntime):
     def __init__(self, *args, **kargs):
         comp.PythonRuntime.__init__(self, *args, **kargs)
-        self.cfg_dir = sh.joinpths(self.app_dir, CONFIG_DIR)
         self.bin_dir = sh.joinpths(self.app_dir, BIN_DIR)
         self.wait_time = max(self.cfg.getint('default', 'service_wait_seconds'), 1)
 
diff --git a/devstack/components/melange.py b/devstack/components/melange.py
index fdbf63a2..3a1a7ce2 100644
--- a/devstack/components/melange.py
+++ b/devstack/components/melange.py
@@ -36,7 +36,6 @@ BIN_DIR = 'bin'
 ROOT_CONF = 'melange.conf.sample'
 ROOT_CONF_REAL_NAME = 'melange.conf'
 CONFIGS = [ROOT_CONF]
-CFG_LOC = ['etc', 'melange']
 
 # Sensible defaults
 DEF_CIDR_RANGE = 'FE-EE-DD-00-00-00/24'
@@ -53,7 +52,7 @@ CIDR_CREATE_CMD = [
 
 # What to start
 APP_OPTIONS = {
-    'melange-server': ['--config-file', '%CFG_FILE%'],
+    'melange-server': ['--config-file=%CFG_FILE%'],
 }
 
 
@@ -66,7 +65,6 @@ class MelangeInstaller(comp.PythonInstallComponent):
     def __init__(self, *args, **kargs):
         comp.PythonInstallComponent.__init__(self, *args, **kargs)
         self.bin_dir = sh.joinpths(self.app_dir, BIN_DIR)
-        self.cfg_dir = sh.joinpths(self.app_dir, *CFG_LOC)
 
     def _get_download_locations(self):
         places = list()
@@ -115,11 +113,10 @@ class MelangeInstaller(comp.PythonInstallComponent):
 
     def _get_source_config(self, config_fn):
         if config_fn == ROOT_CONF:
-            srcfn = sh.joinpths(self.cfg_dir, config_fn)
-            contents = sh.load_file(srcfn)
-            return (srcfn, contents)
-        else:
-            return comp.PythonInstallComponent._get_source_config(self, config_fn)
+            fn = sh.joinpths(self.app_dir, 'etc', 'melange', config_fn)
+            contents = sh.load_file(fn)
+            return (fn, contents)
+        return comp.PythonInstallComponent._get_source_config(self, config_fn)
 
     def _get_target_config_name(self, config_fn):
         if config_fn == ROOT_CONF:
@@ -132,7 +129,6 @@ class MelangeRuntime(comp.PythonRuntime):
     def __init__(self, *args, **kargs):
         comp.PythonRuntime.__init__(self, *args, **kargs)
         self.bin_dir = sh.joinpths(self.app_dir, BIN_DIR)
-        self.cfg_dir = sh.joinpths(self.app_dir, *CFG_LOC)
         self.wait_time = max(self.cfg.getint('default', 'service_wait_seconds'), 1)
 
     def _get_apps_to_start(self):
diff --git a/devstack/components/nova.py b/devstack/components/nova.py
index 3d98909b..4bad5a99 100644
--- a/devstack/components/nova.py
+++ b/devstack/components/nova.py
@@ -122,7 +122,6 @@ SUB_COMPONENT_NAME_MAP = {
 
 # Subdirs of the checkout/download
 BIN_DIR = 'bin'
-CONFIG_DIR = "etc"
 
 # Network class/driver/manager templs
 QUANTUM_MANAGER = 'nova.network.quantum.manager.QuantumManager'
@@ -201,7 +200,6 @@ class NovaUninstaller(comp.PythonUninstallComponent):
     def __init__(self, *args, **kargs):
         comp.PythonUninstallComponent.__init__(self, *args, **kargs)
         self.bin_dir = sh.joinpths(self.app_dir, BIN_DIR)
-        self.cfg_dir = sh.joinpths(self.app_dir, CONFIG_DIR)
         self.virsh = lv.Virsh(self.cfg, self.distro)
 
     def known_subsystems(self):
@@ -236,7 +234,6 @@ class NovaInstaller(comp.PythonInstallComponent):
     def __init__(self, *args, **kargs):
         comp.PythonInstallComponent.__init__(self, *args, **kargs)
         self.bin_dir = sh.joinpths(self.app_dir, BIN_DIR)
-        self.cfg_dir = sh.joinpths(self.app_dir, CONFIG_DIR)
         self.paste_conf_fn = self._get_target_config_name(PASTE_CONF)
         self.volumes_enabled = False
         if NVOL in self.desired_subsystems:
@@ -329,15 +326,13 @@ class NovaInstaller(comp.PythonInstallComponent):
         self.tracewriter.cfg_file_written(sh.write_file(conf_fn, nova_conf_contents))
 
     def _get_source_config(self, config_fn):
-        name = config_fn
         if config_fn == PASTE_CONF:
-            # Return the paste api template
             return comp.PythonInstallComponent._get_source_config(self, PASTE_SOURCE_FN)
-        elif config_fn == LOGGING_CONF:
-            name = LOGGING_SOURCE_FN
-        srcfn = sh.joinpths(self.cfg_dir, "nova", name)
-        contents = sh.load_file(srcfn)
-        return (srcfn, contents)
+        if config_fn == LOGGING_CONF:
+            config_fn = LOGGING_SOURCE_FN
+        fn = sh.joinpths(self.app_dir, 'etc', "nova", config_fn)
+        contents = sh.load_file(fn)
+        return (fn, contents)
 
     def _get_param_map(self, config_fn):
         mp = dict()
@@ -363,7 +358,6 @@ class NovaInstaller(comp.PythonInstallComponent):
 class NovaRuntime(comp.PythonRuntime):
     def __init__(self, *args, **kargs):
         comp.PythonRuntime.__init__(self, *args, **kargs)
-        self.cfg_dir = sh.joinpths(self.app_dir, CONFIG_DIR)
         self.bin_dir = sh.joinpths(self.app_dir, BIN_DIR)
         self.wait_time = max(self.cfg.getint('default', 'service_wait_seconds'), 1)
         self.virsh = lv.Virsh(self.cfg, self.distro)
diff --git a/devstack/components/quantum.py b/devstack/components/quantum.py
index 7261f6bf..5d5ed480 100644
--- a/devstack/components/quantum.py
+++ b/devstack/components/quantum.py
@@ -35,7 +35,6 @@ PLUGIN_CONF = "plugins.ini"
 QUANTUM_CONF = 'quantum.conf'
 PLUGIN_LOC = ['etc']
 AGENT_CONF = 'ovs_quantum_plugin.ini'
-AGENT_LOC = ["etc", "quantum", "plugins", "openvswitch"]
 AGENT_BIN_LOC = ["quantum", "plugins", "openvswitch", 'agent']
 CONFIG_FILES = [PLUGIN_CONF, AGENT_CONF]
 
@@ -48,10 +47,6 @@ OVS_BRIDGE_ADD = ['ovs-vsctl', '--no-wait', 'add-br', '%OVS_BRIDGE%']
 OVS_BRIDGE_EXTERN_ID = ['ovs-vsctl', '--no-wait', 'br-set-external-id', '%OVS_BRIDGE%', 'bridge-id', '%OVS_EXTERNAL_ID%']
 OVS_BRIDGE_CMDS = [OVS_BRIDGE_DEL, OVS_BRIDGE_ADD, OVS_BRIDGE_EXTERN_ID]
 
-# Subdirs of the downloaded
-CONFIG_DIR = 'etc'
-BIN_DIR = 'bin'
-
 # What to start (only if openvswitch enabled)
 APP_Q_SERVER = 'quantum-server'
 APP_Q_AGENT = 'ovs_quantum_agent.py'
@@ -60,6 +55,7 @@ APP_OPTIONS = {
     APP_Q_AGENT: ["%OVS_CONFIG_FILE%", "-v"],
 }
 
+
 class QuantumMixin(object):
 
     def known_options(self):
@@ -96,16 +92,6 @@ class QuantumInstaller(QuantumMixin, comp.PkgInstallComponent):
             self.q_vswitch_agent = True
             self.q_vswitch_service = True
 
-    def _get_target_config_name(self, config_fn):
-        if config_fn == PLUGIN_CONF:
-            tgt_loc = [self.app_dir] + PLUGIN_LOC + [config_fn]
-            return sh.joinpths(*tgt_loc)
-        elif config_fn == AGENT_CONF:
-            tgt_loc = [self.app_dir] + AGENT_LOC + [config_fn]
-            return sh.joinpths(*tgt_loc)
-        else:
-            return comp.PkgInstallComponent._get_target_config_name(self, config_fn)
-
     def _config_adjust(self, contents, config_fn):
         if config_fn == PLUGIN_CONF and self.q_vswitch_service:
             # Need to fix the "Quantum plugin provider module"
@@ -173,13 +159,11 @@ class QuantumInstaller(QuantumMixin, comp.PkgInstallComponent):
 
     def _get_source_config(self, config_fn):
         if config_fn == PLUGIN_CONF:
-            srcloc = [self.app_dir] + PLUGIN_LOC + [config_fn]
-            srcfn = sh.joinpths(*srcloc)
+            srcfn = sh.joinpths(self.app_dir, 'etc', config_fn)
             contents = sh.load_file(srcfn)
             return (srcfn, contents)
         elif config_fn == AGENT_CONF:
-            srcloc = [self.app_dir] + AGENT_LOC + [config_fn]
-            srcfn = sh.joinpths(*srcloc)
+            srcfn = sh.joinpths(self.app_dir, 'etc', 'quantum', 'plugins', 'openvswitch', config_fn)
             contents = sh.load_file(srcfn)
             return (srcfn, contents)
         else:
@@ -201,14 +185,14 @@ class QuantumRuntime(QuantumMixin, comp.ProgramRuntime):
         app_list = comp.ProgramRuntime._get_apps_to_start(self)
         if self.q_vswitch_service:
             app_list.append({
-                    'name': APP_Q_SERVER,
-                    'path': sh.joinpths(self.app_dir, BIN_DIR, APP_Q_SERVER),
+                'name': APP_Q_SERVER,
+                'path': sh.joinpths(self.app_dir, 'bin', APP_Q_SERVER),
             })
         if self.q_vswitch_agent:
-            full_pth = [self.app_dir] + AGENT_BIN_LOC + [APP_Q_AGENT]
             app_list.append({
-                    'name': APP_Q_AGENT,
-                    'path': sh.joinpths(*full_pth)
+                'name': APP_Q_AGENT,
+                # WHY U SO BURIED....
+                'path': sh.joinpths(self.app_dir, "quantum", "plugins", "openvswitch", 'agent', APP_Q_AGENT)
             })
         return app_list
 
@@ -218,8 +202,7 @@ class QuantumRuntime(QuantumMixin, comp.ProgramRuntime):
     def _get_param_map(self, app_name):
         param_dict = comp.ProgramRuntime._get_param_map(self, app_name)
         if app_name == APP_Q_AGENT:
-            tgt_loc = [self.app_dir] + AGENT_LOC + [AGENT_CONF]
-            param_dict['OVS_CONFIG_FILE'] = sh.joinpths(*tgt_loc)
+            param_dict['OVS_CONFIG_FILE'] = sh.joinpths(self.cfg_dir, AGENT_CONF)
         elif app_name == APP_Q_SERVER:
-            param_dict['QUANTUM_CONFIG_FILE'] = sh.joinpths(self.app_dir, CONFIG_DIR, QUANTUM_CONF)
+            param_dict['QUANTUM_CONFIG_FILE'] = sh.joinpths(self.cfg_dir, QUANTUM_CONF)
         return param_dict
diff --git a/devstack/components/swift.py b/devstack/components/swift.py
index acdd7dba..710bd375 100644
--- a/devstack/components/swift.py
+++ b/devstack/components/swift.py
@@ -60,7 +60,6 @@ FS_TYPE = "xfs"
 
 # Subdirs of the git checkout
 BIN_DIR = 'bin'
-CONFIG_DIR = 'etc'
 LOG_DIR = 'logs'
 
 # Config keys we warm up so u won't be prompted later
@@ -72,7 +71,6 @@ class SwiftUninstaller(comp.PythonUninstallComponent):
     def __init__(self, *args, **kargs):
         comp.PythonUninstallComponent.__init__(self, *args, **kargs)
         self.datadir = sh.joinpths(self.app_dir, self.cfg.getdefaulted('swift', 'data_location', 'data'))
-        self.cfg_dir = sh.joinpths(self.app_dir, CONFIG_DIR)
         self.bin_dir = sh.joinpths(self.app_dir, BIN_DIR)
         self.logdir = sh.joinpths(self.datadir, LOG_DIR)
 
@@ -88,7 +86,6 @@ class SwiftUninstaller(comp.PythonUninstallComponent):
 class SwiftInstaller(comp.PythonInstallComponent):
     def __init__(self, *args, **kargs):
         comp.PythonInstallComponent.__init__(self, *args, **kargs)
-        self.cfg_dir = sh.joinpths(self.app_dir, CONFIG_DIR)
         self.bin_dir = sh.joinpths(self.app_dir, BIN_DIR)
         self.datadir = sh.joinpths(self.app_dir, self.cfg.getdefaulted('swift', 'data_location', 'data'))
         self.logdir = sh.joinpths(self.datadir, LOG_DIR)
@@ -203,7 +200,6 @@ class SwiftRuntime(comp.PythonRuntime):
     def __init__(self, *args, **kargs):
         comp.PythonRuntime.__init__(self, *args, **kargs)
         self.datadir = sh.joinpths(self.app_dir, self.cfg.getdefaulted('swift', 'data_location', 'data'))
-        self.cfg_dir = sh.joinpths(self.app_dir, CONFIG_DIR)
         self.bin_dir = sh.joinpths(self.app_dir, BIN_DIR)
         self.logdir = sh.joinpths(self.datadir, LOG_DIR)
 
diff --git a/devstack/distros/fedora16.py b/devstack/distros/fedora16.py
index e075040b..2fa52c19 100644
--- a/devstack/distros/fedora16.py
+++ b/devstack/distros/fedora16.py
@@ -26,8 +26,6 @@ from devstack.components import db
 from devstack.components import horizon
 from devstack.components import nova
 
-from devstack.packaging import yum
-
 LOG = logging.getLogger(__name__)
 
 SOCKET_CONF = "/etc/httpd/conf.d/wsgi-socket-prefix.conf"
diff --git a/devstack/distros/rhel6.py b/devstack/distros/rhel6.py
index 0edc6b56..545c1e03 100644
--- a/devstack/distros/rhel6.py
+++ b/devstack/distros/rhel6.py
@@ -111,7 +111,7 @@ class YumPackagerWithRelinks(yum.YumPackager):
         if response:
             options = pkg.get('packager_options', {})
             links = options.get('links', [])
-            for src, tgt in links:
+            for (_, tgt) in links:
                 if sh.islink(tgt):
                     sh.unlink(tgt)
         return response