summaryrefslogtreecommitdiff
path: root/cloudinit/handlers/cloud_config.py
diff options
context:
space:
mode:
authorJoshua Harlow <harlowja@gmail.com>2012-11-22 08:21:37 -0800
committerJoshua Harlow <harlowja@gmail.com>2012-11-22 08:21:37 -0800
commiteded09c1e260330107a19bd0b5a351686fe49e80 (patch)
tree91c459406cf87727f0ba78f6fe8af4178d9e61fb /cloudinit/handlers/cloud_config.py
parent8bc85abd97e06d964bbd26208eb732e80eb87c10 (diff)
downloadvyos-cloud-init-eded09c1e260330107a19bd0b5a351686fe49e80.tar.gz
vyos-cloud-init-eded09c1e260330107a19bd0b5a351686fe49e80.zip
Continue working on merging prototype.
Diffstat (limited to 'cloudinit/handlers/cloud_config.py')
-rw-r--r--cloudinit/handlers/cloud_config.py27
1 files changed, 21 insertions, 6 deletions
diff --git a/cloudinit/handlers/cloud_config.py b/cloudinit/handlers/cloud_config.py
index 86027187..22ced20d 100644
--- a/cloudinit/handlers/cloud_config.py
+++ b/cloudinit/handlers/cloud_config.py
@@ -29,6 +29,8 @@ from cloudinit.settings import (PER_ALWAYS)
LOG = logging.getLogger(__name__)
+DEF_MERGE_TYPE = "list+dict+str"
+
class CloudConfigPartHandler(handlers.Handler):
def __init__(self, paths, **_kwargs):
@@ -44,10 +46,25 @@ class CloudConfigPartHandler(handlers.Handler):
def _write_cloud_config(self, buf):
if not self.cloud_fn:
return
- payload = util.yaml_dumps(self.cloud_buf)
- util.write_file(self.cloud_fn, payload, 0600)
+ lines = ["#cloud-config", util.yaml_dumps(self.cloud_buf)]
+ util.write_file(self.cloud_fn, "\n".join(lines), 0600)
+
+ def _merge_part(self, payload, headers, filename):
+ merge_how = headers.get("Merge-Type")
+ try:
+ payload_y = util.load_yaml(payload)
+ if not merge_how:
+ merge_how = payload_y.pop("Merge-Type", '')
+ merge_how = merge_how.strip().lower()
+ if not merge_how:
+ merge_how = DEF_MERGE_TYPE
+ merger = mergers.construct(merge_how)
+ self.cloud_buf = merger.merge(self.cloud_buf, payload_y)
+ except:
+ util.logexc(LOG, "Failed at merging in cloud config part from %s",
+ filename)
- def handle_part(self, _data, ctype, filename, payload, _frequency, headers):
+ def handle_part(self, _data, ctype, filename, payload, _freq, headers):
if ctype == handlers.CONTENT_START:
self.cloud_buf = {}
return
@@ -55,6 +72,4 @@ class CloudConfigPartHandler(handlers.Handler):
self._write_cloud_config(self.cloud_buf)
self.cloud_buf = {}
return
- merge_how = headers.get("Merge-Type", 'list+dict+str')
- merger = mergers.construct(merge_how)
- self.cloud_buf = merger.merge(self.cloud_buf, util.load_yaml(payload))
+ self._merge_part(payload, headers, filename)