summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-08-11 03:08:49 +0000
committerGerrit Code Review <review@openstack.org>2012-08-11 03:08:49 +0000
commitc2fd0866e2053b308180c259e412ea6b1bd39982 (patch)
treee67b89515df7b706c39cc15b5673230b6372c54a /nova/api
parent649d3cea2a3c6a704612087e5ccca7cbe11ae0b3 (diff)
parentd507bd9f186c45b51d635e26070aef7280b6c175 (diff)
Merge "Config drive v2"
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/metadata/base.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/nova/api/metadata/base.py b/nova/api/metadata/base.py
index 61bc9cad0..78ebdd821 100644
--- a/nova/api/metadata/base.py
+++ b/nova/api/metadata/base.py
@@ -19,6 +19,7 @@
"""Instance Metadata information."""
import base64
+import json
import os
from nova.api.ec2 import ec2utils
@@ -27,9 +28,21 @@ from nova import context
from nova import db
from nova import flags
from nova import network
+from nova.openstack.common import cfg
+
+
+metadata_opts = [
+ cfg.StrOpt('config_drive_skip_versions',
+ default=('1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 '
+ '2007-12-15 2008-02-01 2008-09-01'),
+ help=('List of metadata versions to skip placing into the '
+ 'config drive')),
+ ]
FLAGS = flags.FLAGS
flags.DECLARE('dhcp_domain', 'nova.network.manager')
+FLAGS.register_opts(metadata_opts)
+
_DEFAULT_MAPPINGS = {'ami': 'sda1',
'ephemeral0': 'sda2',
@@ -205,6 +218,39 @@ class InstanceMetadata():
return data
+ def metadata_for_config_drive(self, injected_files):
+ """Yields (path, value) tuples for metadata elements."""
+ # EC2 style metadata
+ for version in VERSIONS:
+ if version in FLAGS.config_drive_skip_versions.split(' '):
+ continue
+
+ data = self.get_ec2_metadata(version)
+ if 'user-data' in data:
+ filepath = os.path.join('ec2', version, 'userdata.raw')
+ yield (filepath, data['user-data'])
+ del data['user-data']
+
+ try:
+ del data['public-keys']['0']['_name']
+ except KeyError:
+ pass
+
+ filepath = os.path.join('ec2', version, 'metadata.json')
+ yield (filepath, json.dumps(data['meta-data']))
+
+ filepath = os.path.join('ec2', 'latest', 'metadata.json')
+ yield (filepath, json.dumps(data['meta-data']))
+
+ # Openstack style metadata
+ # TODO(mikal): refactor this later
+ files = []
+ for path in injected_files:
+ files.append({'path': path,
+ 'content': injected_files[path]})
+ yield ('openstack/2012-08-10/files.json', json.dumps(files))
+ yield ('openstack/latest/files.json', json.dumps(files))
+
def get_metadata_by_address(address):
ctxt = context.get_admin_context()