summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSoren Hansen <soren.hansen@rackspace.com>2010-11-29 21:19:16 +0000
committerTarmac <>2010-11-29 21:19:16 +0000
commit4112e432c6a7b0e82bfc72fac0ceae8eca8bba49 (patch)
treebf8c7cd44d28ccb6b8bf26d374e757041fcb60a1
parent50db779e891244d5de9c4c67c8758c2d440aac16 (diff)
parent03deb0dde48a0b9c7c6c52689ecf8a70e1fa7b7e (diff)
downloadnova-4112e432c6a7b0e82bfc72fac0ceae8eca8bba49.tar.gz
nova-4112e432c6a7b0e82bfc72fac0ceae8eca8bba49.tar.xz
nova-4112e432c6a7b0e82bfc72fac0ceae8eca8bba49.zip
Add a templating mechanism in the flag parsing.
Add a state_path flag that will be used as the top-level dir for all other state (such as images, instances, buckets, networks, etc). This way you only need to change one flag to put all your state in e.g. /var/lib/nova. This simplifies packaging quite a bit.
-rw-r--r--nova/compute/manager.py2
-rw-r--r--nova/compute/monitor.py2
-rw-r--r--nova/crypto.py4
-rw-r--r--nova/flags.py33
-rw-r--r--nova/network/linux_net.py2
-rw-r--r--nova/objectstore/bucket.py2
-rw-r--r--nova/objectstore/image.py4
7 files changed, 37 insertions, 12 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 890d79fba..50a9d316b 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -47,7 +47,7 @@ from nova.compute import power_state
FLAGS = flags.FLAGS
-flags.DEFINE_string('instances_path', utils.abspath('../instances'),
+flags.DEFINE_string('instances_path', '$state_path/instances',
'where instances are stored on disk')
flags.DEFINE_string('compute_driver', 'nova.virt.connection.get_connection',
'Driver to use for volume creation')
diff --git a/nova/compute/monitor.py b/nova/compute/monitor.py
index ce45b14f6..22653113a 100644
--- a/nova/compute/monitor.py
+++ b/nova/compute/monitor.py
@@ -46,7 +46,7 @@ flags.DEFINE_integer('monitoring_instances_delay', 5,
'Sleep time between updates')
flags.DEFINE_integer('monitoring_instances_step', 300,
'Interval of RRD updates')
-flags.DEFINE_string('monitoring_rrd_path', '/var/nova/monitor/instances',
+flags.DEFINE_string('monitoring_rrd_path', '$state_path/monitor/instances',
'Location of RRD files')
diff --git a/nova/crypto.py b/nova/crypto.py
index d73559587..aacc50b17 100644
--- a/nova/crypto.py
+++ b/nova/crypto.py
@@ -40,9 +40,9 @@ from nova import flags
FLAGS = flags.FLAGS
flags.DEFINE_string('ca_file', 'cacert.pem', 'Filename of root CA')
-flags.DEFINE_string('keys_path', utils.abspath('../keys'),
+flags.DEFINE_string('keys_path', '$state_path/keys',
'Where we keep our keys')
-flags.DEFINE_string('ca_path', utils.abspath('../CA'),
+flags.DEFINE_string('ca_path', '$state_path/CA',
'Where we keep our root CA')
flags.DEFINE_boolean('use_intermediate_ca', False,
'Should we use intermediate CAs for each project?')
diff --git a/nova/flags.py b/nova/flags.py
index f7ae26050..cb9fa105b 100644
--- a/nova/flags.py
+++ b/nova/flags.py
@@ -24,6 +24,7 @@ where they're used.
import getopt
import os
import socket
+import string
import sys
import gflags
@@ -38,11 +39,12 @@ class FlagValues(gflags.FlagValues):
"""
- def __init__(self):
+ def __init__(self, extra_context=None):
gflags.FlagValues.__init__(self)
self.__dict__['__dirty'] = []
self.__dict__['__was_already_parsed'] = False
self.__dict__['__stored_argv'] = []
+ self.__dict__['__extra_context'] = extra_context
def __call__(self, argv):
# We're doing some hacky stuff here so that we don't have to copy
@@ -112,7 +114,7 @@ class FlagValues(gflags.FlagValues):
def ParseNewFlags(self):
if '__stored_argv' not in self.__dict__:
return
- new_flags = FlagValues()
+ new_flags = FlagValues(self)
for k in self.__dict__['__dirty']:
new_flags[k] = gflags.FlagValues.__getitem__(self, k)
@@ -134,9 +136,29 @@ class FlagValues(gflags.FlagValues):
def __getattr__(self, name):
if self.IsDirty(name):
self.ParseNewFlags()
- return gflags.FlagValues.__getattr__(self, name)
+ val = gflags.FlagValues.__getattr__(self, name)
+ if type(val) is str:
+ tmpl = string.Template(val)
+ context = [self, self.__dict__['__extra_context']]
+ return tmpl.substitute(StrWrapper(context))
+ return val
+class StrWrapper(object):
+ """Wrapper around FlagValues objects
+
+ Wraps FlagValues objects for string.Template so that we're
+ sure to return strings."""
+ def __init__(self, context_objs):
+ self.context_objs = context_objs
+
+ def __getitem__(self, name):
+ for context in self.context_objs:
+ val = getattr(context, name, False)
+ if val:
+ return str(val)
+ raise KeyError(name)
+
FLAGS = FlagValues()
gflags.FLAGS = FLAGS
gflags.DEFINE_flag(gflags.HelpFlag(), FLAGS)
@@ -222,8 +244,11 @@ DEFINE_string('vpn_key_suffix',
DEFINE_integer('auth_token_ttl', 3600, 'Seconds for auth tokens to linger')
+DEFINE_string('state_path', os.path.join(os.path.dirname(__file__), '../'),
+ "Top-level directory for maintaining nova's state")
+
DEFINE_string('sql_connection',
- 'sqlite:///%s/nova.sqlite' % os.path.abspath("./"),
+ 'sqlite:///$state_path/nova.sqlite',
'connection string for sql database')
DEFINE_string('compute_manager', 'nova.compute.manager.ComputeManager',
diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py
index 391abfb76..7b00e65d4 100644
--- a/nova/network/linux_net.py
+++ b/nova/network/linux_net.py
@@ -38,7 +38,7 @@ flags.DEFINE_string('dhcpbridge_flagfile',
'/etc/nova/nova-dhcpbridge.conf',
'location of flagfile for dhcpbridge')
-flags.DEFINE_string('networks_path', utils.abspath('../networks'),
+flags.DEFINE_string('networks_path', '$state_path/networks',
'Location to keep network config files')
flags.DEFINE_string('public_interface', 'vlan1',
'Interface for public IP addresses')
diff --git a/nova/objectstore/bucket.py b/nova/objectstore/bucket.py
index 697982538..82767e52f 100644
--- a/nova/objectstore/bucket.py
+++ b/nova/objectstore/bucket.py
@@ -33,7 +33,7 @@ from nova.objectstore import stored
FLAGS = flags.FLAGS
-flags.DEFINE_string('buckets_path', utils.abspath('../buckets'),
+flags.DEFINE_string('buckets_path', '$state_path/buckets',
'path to s3 buckets')
diff --git a/nova/objectstore/image.py b/nova/objectstore/image.py
index 4554444fa..7292dbab8 100644
--- a/nova/objectstore/image.py
+++ b/nova/objectstore/image.py
@@ -39,8 +39,8 @@ from nova.objectstore import bucket
FLAGS = flags.FLAGS
-flags.DEFINE_string('images_path', utils.abspath('../images'),
- 'path to decrypted images')
+flags.DEFINE_string('images_path', '$state_path/images',
+ 'path to decrypted images')
class Image(object):