use /etc/invirt/conf.d/ too in invirt.config
authorGreg Price <price@mit.edu>
Wed, 29 Oct 2008 04:44:45 +0000 (00:44 -0400)
committerGreg Price <price@mit.edu>
Wed, 29 Oct 2008 04:44:45 +0000 (00:44 -0400)
svn path=/trunk/packages/invirt-base/; revision=1422

debian/changelog
python/invirt/config.py

index fc2a696..e09b46e 100644 (file)
@@ -1,7 +1,8 @@
 invirt-base (0.0.2) unstable; urgency=low
 
   * eliminate choice of source and cache files for invirt.config.load and
-    invirt-getconf, so we can make it more complex
+    invirt-getconf, so we can do what follows
+  * look in /etc/invirt/conf.d/ as well as /etc/invirt/master.yaml
 
  -- Greg Price <price@mit.edu>  Tue, 28 Oct 2008 21:16:14 -0400
 
index 7c2b805..cd0dd06 100644 (file)
@@ -2,6 +2,7 @@ from __future__ import with_statement
 
 import json
 from invirt.common import *
+import os
 from os import rename
 from os.path import getmtime
 from contextlib import closing
@@ -10,16 +11,43 @@ import yaml
 try:    loader = yaml.CSafeLoader
 except: loader = yaml.SafeLoader
 
-src_path   = '/etc/invirt/master.yaml'
-cache_path = '/var/lib/invirt/cache.json'
-lock_path  = '/var/lib/invirt/cache.lock'
+src_path    = '/etc/invirt/master.yaml'
+src_dirpath = '/etc/invirt/conf.d'
+cache_path  = '/var/lib/invirt/cache.json'
+lock_path   = '/var/lib/invirt/cache.lock'
+
+def augment(d1, d2):
+    """Splice dict-tree d2 into d1.  Return d1.
+
+    Example:
+    >>> d = {'a': {'b': 1}, 'c': 2}
+    >>> augment(d, {'a': {'d': 3}})
+    {'a': {'b', 1, 'd': 3}, 'c': 2}
+    >>> d
+    {'a': {'b', 1, 'd': 3}, 'c': 2}
+    """
+    for k in d2:
+        if k in d1 and isinstance(d1[k], dict):
+            augment(d1[k], d2[k])
+        else:
+            d1[k] = d2[k]
+    return d1
+
+def list_files():
+    yield src_path
+    for name in os.listdir(src_dirpath):
+        yield os.path.join(src_dirpath, name)
 
 def load_master():
-    with closing(file(src_path)) as f:
-        return yaml.load(f, loader)
+    config = dict()
+    for filename in list_files():
+        with closing(file(filename)) as f:
+            augment(config, yaml.load(f, loader))
+    return config
 
 def get_src_mtime():
-    return getmtime(src_path)
+    return max(max(getmtime(filename) for filename in list_files()),
+               getmtime(src_dirpath))
 
 def load(force_refresh = False):
     """