diff --git a/doc/v3/api_samples/all_extensions/server-get-resp.json b/doc/v3/api_samples/all_extensions/server-get-resp.json index 8826f360dc53..f9112ec14307 100644 --- a/doc/v3/api_samples/all_extensions/server-get-resp.json +++ b/doc/v3/api_samples/all_extensions/server-get-resp.json @@ -48,7 +48,7 @@ "name": "new-server-test", "os-access-ips:access_ip_v4": "", "os-access-ips:access_ip_v6": "", - "os-config-drive:config_drive": "", + "config_drive": "", "os-extended-availability-zone:availability_zone": "nova", "os-extended-server-attributes:host": "b8b357f7100d4391828f2177c922ef93", "os-extended-server-attributes:hypervisor_hostname": "fake-mini", diff --git a/doc/v3/api_samples/all_extensions/servers-details-resp.json b/doc/v3/api_samples/all_extensions/servers-details-resp.json index 9467fb4a401b..f200c99d0eba 100644 --- a/doc/v3/api_samples/all_extensions/servers-details-resp.json +++ b/doc/v3/api_samples/all_extensions/servers-details-resp.json @@ -49,7 +49,7 @@ "name": "new-server-test", "os-access-ips:access_ip_v4": "", "os-access-ips:access_ip_v6": "", - "os-config-drive:config_drive": "", + "config_drive": "", "os-extended-availability-zone:availability_zone": "nova", "os-extended-server-attributes:host": "c3f14e9812ad496baf92ccfb3c61e15f", "os-extended-server-attributes:hypervisor_hostname": "fake-mini", diff --git a/doc/v3/api_samples/os-config-drive/server-config-drive-get-resp.json b/doc/v3/api_samples/os-config-drive/server-config-drive-get-resp.json index d31c241f1a99..f6aa279e225d 100644 --- a/doc/v3/api_samples/os-config-drive/server-config-drive-get-resp.json +++ b/doc/v3/api_samples/os-config-drive/server-config-drive-get-resp.json @@ -46,11 +46,11 @@ "My Server Name": "Apache1" }, "name": "new-server-test", - "os-config-drive:config_drive": "", + "config_drive": "", "progress": 0, "status": "ACTIVE", "tenant_id": "openstack", "updated": "2013-09-22T02:33:25Z", "user_id": "fake" } -} \ No newline at end of file +} diff --git a/doc/v3/api_samples/os-config-drive/servers-config-drive-details-resp.json b/doc/v3/api_samples/os-config-drive/servers-config-drive-details-resp.json index 97b96e7a7dd1..4cd5efe43b42 100644 --- a/doc/v3/api_samples/os-config-drive/servers-config-drive-details-resp.json +++ b/doc/v3/api_samples/os-config-drive/servers-config-drive-details-resp.json @@ -47,7 +47,7 @@ "My Server Name": "Apache1" }, "name": "new-server-test", - "os-config-drive:config_drive": "", + "config_drive": "", "progress": 0, "status": "ACTIVE", "tenant_id": "openstack", @@ -55,4 +55,4 @@ "user_id": "fake" } ] -} \ No newline at end of file +} diff --git a/nova/api/openstack/compute/plugins/v3/config_drive.py b/nova/api/openstack/compute/plugins/v3/config_drive.py index 345c30f2d9f2..ea27b1834a7c 100644 --- a/nova/api/openstack/compute/plugins/v3/config_drive.py +++ b/nova/api/openstack/compute/plugins/v3/config_drive.py @@ -21,7 +21,7 @@ from nova.api.openstack import extensions from nova.api.openstack import wsgi ALIAS = "os-config-drive" -ATTRIBUTE_NAME = "%s:config_drive" % ALIAS +ATTRIBUTE_NAME = "config_drive" authorize = extensions.soft_extension_authorizer('compute', 'v3:' + ALIAS) diff --git a/nova/api/openstack/compute/schemas/v3/config_drive.py b/nova/api/openstack/compute/schemas/v3/config_drive.py index b67a9ead0d67..659423ea24c8 100644 --- a/nova/api/openstack/compute/schemas/v3/config_drive.py +++ b/nova/api/openstack/compute/schemas/v3/config_drive.py @@ -15,5 +15,5 @@ from nova.api.validation import parameter_types server_create = { - 'os-config-drive:config_drive': parameter_types.boolean, + 'config_drive': parameter_types.boolean, } diff --git a/nova/tests/api/openstack/compute/contrib/test_config_drive.py b/nova/tests/api/openstack/compute/contrib/test_config_drive.py index eec422c2cee0..a0242d7544f2 100644 --- a/nova/tests/api/openstack/compute/contrib/test_config_drive.py +++ b/nova/tests/api/openstack/compute/contrib/test_config_drive.py @@ -15,14 +15,20 @@ import datetime +from oslo.config import cfg import webob -from nova.api.openstack.compute.contrib import config_drive -from nova.api.openstack.compute import servers +from nova.api.openstack.compute.contrib import config_drive as config_drive_v2 +from nova.api.openstack.compute import plugins +from nova.api.openstack.compute.plugins.v3 import config_drive \ + as config_drive_v21 +from nova.api.openstack.compute.plugins.v3 import servers as servers_v21 +from nova.api.openstack.compute import servers as servers_v2 from nova.api.openstack import extensions from nova.compute import api as compute_api from nova.compute import flavors from nova import db +from nova import exception from nova.openstack.common import jsonutils from nova import test from nova.tests.api.openstack import fakes @@ -30,27 +36,34 @@ from nova.tests import fake_instance from nova.tests.image import fake -class ConfigDriveTest(test.TestCase): +CONF = cfg.CONF + + +class ConfigDriveTestV21(test.TestCase): + base_url = '/v3/servers/' + + def _setup_wsgi(self): + self.app = fakes.wsgi_app_v3(init_only=('servers', 'os-config-drive')) + + def _get_config_drive_controller(self): + return config_drive_v21.ConfigDriveController() def setUp(self): - super(ConfigDriveTest, self).setUp() - self.Controller = config_drive.Controller() + super(ConfigDriveTestV21, self).setUp() + self.Controller = self._get_config_drive_controller() fakes.stub_out_networking(self.stubs) fakes.stub_out_rate_limiting(self.stubs) fake.stub_out_image_service(self.stubs) - self.flags( - osapi_compute_extension=[ - 'nova.api.openstack.compute.contrib.select_extensions'], - osapi_compute_ext_list=['Config_drive']) + self._setup_wsgi() def test_show(self): self.stubs.Set(db, 'instance_get', fakes.fake_instance_get()) self.stubs.Set(db, 'instance_get_by_uuid', fakes.fake_instance_get()) - req = webob.Request.blank('/v2/fake/servers/1') + req = webob.Request.blank(self.base_url + '1') req.headers['Content-Type'] = 'application/json' - response = req.get_response(fakes.wsgi_app(init_only=('servers',))) + response = req.get_response(self.app) self.assertEqual(response.status_int, 200) res_dict = jsonutils.loads(response.body) self.assertIn('config_drive', res_dict['server']) @@ -58,25 +71,54 @@ class ConfigDriveTest(test.TestCase): def test_detail_servers(self): self.stubs.Set(db, 'instance_get_all_by_filters', fakes.fake_instance_get_all_by_filters()) - req = fakes.HTTPRequest.blank('/v2/fake/servers/detail') - res = req.get_response(fakes.wsgi_app(init_only=('servers,'))) + req = fakes.HTTPRequest.blank(self.base_url + 'detail') + res = req.get_response(self.app) server_dicts = jsonutils.loads(res.body)['servers'] self.assertNotEqual(len(server_dicts), 0) for server_dict in server_dicts: self.assertIn('config_drive', server_dict) -class ServersControllerCreateTest(test.TestCase): +class ConfigDriveTestV2(ConfigDriveTestV21): + base_url = '/v2/fake/servers/' + + def _get_config_drive_controller(self): + return config_drive_v2.Controller() + + def _setup_wsgi(self): + self.flags( + osapi_compute_extension=[ + 'nova.api.openstack.compute.contrib.select_extensions'], + osapi_compute_ext_list=['Config_drive']) + self.app = fakes.wsgi_app(init_only=('servers',)) + + +class ServersControllerCreateTestV21(test.TestCase): + base_url = '/v3/' + bad_request = exception.ValidationError + + def _set_up_controller(self): + ext_info = plugins.LoadedExtensionInfo() + self.controller = servers_v21.ServersController( + extension_info=ext_info) + CONF.set_override('extensions_blacklist', + 'os-config-drive', + 'osapi_v3') + self.no_config_drive_controller = servers_v21.ServersController( + extension_info=ext_info) + + def _verfiy_config_drive(self, **kwargs): + self.assertNotIn('config_drive', kwargs) + + def _initialize_extension(self): + pass def setUp(self): """Shared implementation for tests below that create instance.""" - super(ServersControllerCreateTest, self).setUp() + super(ServersControllerCreateTestV21, self).setUp() self.instance_cache_num = 0 - - self.ext_mgr = extensions.ExtensionManager() - self.ext_mgr.extensions = {} - self.controller = servers.Controller(self.ext_mgr) + self._set_up_controller() def instance_create(context, inst): inst_type = flavors.get_flavor_by_flavor_id(3) @@ -108,30 +150,34 @@ class ServersControllerCreateTest(test.TestCase): fake.stub_out_image_service(self.stubs) self.stubs.Set(db, 'instance_create', instance_create) - def _test_create_extra(self, params): + def _test_create_extra(self, params, override_controller): image_uuid = 'c905cedb-7281-47e4-8a62-f26bc5fc4c77' server = dict(name='server_test', imageRef=image_uuid, flavorRef=2) server.update(params) body = dict(server=server) - req = fakes.HTTPRequest.blank('/v2/fake/servers') + req = fakes.HTTPRequest.blank(self.base_url + 'servers') req.method = 'POST' req.body = jsonutils.dumps(body) req.headers["content-type"] = "application/json" - server = self.controller.create(req, body=body).obj['server'] + if override_controller is not None: + server = override_controller.create(req, body=body).obj['server'] + else: + server = self.controller.create(req, body=body).obj['server'] def test_create_instance_with_config_drive_disabled(self): params = {'config_drive': "False"} old_create = compute_api.API.create def create(*args, **kwargs): - self.assertIsNone(kwargs['config_drive']) + self._verfiy_config_drive(**kwargs) return old_create(*args, **kwargs) self.stubs.Set(compute_api.API, 'create', create) - self._test_create_extra(params) + self._test_create_extra(params, + override_controller=self.no_config_drive_controller) def _create_instance_body_of_config_drive(self, param): - self.ext_mgr.extensions = {'os-config-drive': 'fake'} + self._initialize_extension() def create(*args, **kwargs): self.assertIn('config_drive', kwargs) @@ -140,7 +186,7 @@ class ServersControllerCreateTest(test.TestCase): old_create = compute_api.API.create self.stubs.Set(compute_api.API, 'create', create) image_href = '76fa36fc-c930-4bf3-8c8a-ea2a2420deb6' - flavor_ref = 'http://localhost/v2/fake/flavors/3' + flavor_ref = ('http://localhost' + self.base_url + 'flavors/3') body = { 'server': { 'name': 'config_drive_test', @@ -150,7 +196,7 @@ class ServersControllerCreateTest(test.TestCase): }, } - req = fakes.HTTPRequest.blank('/v2/fake/servers') + req = fakes.HTTPRequest.blank(self.base_url + 'servers') req.method = 'POST' req.body = jsonutils.dumps(body) req.headers["content-type"] = "application/json" @@ -174,7 +220,7 @@ class ServersControllerCreateTest(test.TestCase): def test_create_instance_with_bad_config_drive(self): param = 12345 req, body = self._create_instance_body_of_config_drive(param) - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(self.bad_request, self.controller.create, req, body=body) def test_create_instance_without_config_drive(self): @@ -185,6 +231,29 @@ class ServersControllerCreateTest(test.TestCase): server = res['server'] self.assertEqual(fakes.FAKE_UUID, server['id']) + def test_create_instance_with_empty_config_drive(self): + param = '' + req, body = self._create_instance_body_of_config_drive(param) + self.assertRaises(exception.ValidationError, + self.controller.create, req, body=body) + + +class ServersControllerCreateTestV2(ServersControllerCreateTestV21): + base_url = '/v2/fake/' + bad_request = webob.exc.HTTPBadRequest + + def _set_up_controller(self): + self.ext_mgr = extensions.ExtensionManager() + self.ext_mgr.extensions = {} + self.controller = servers_v2.Controller(self.ext_mgr) + self.no_config_drive_controller = None + + def _verfiy_config_drive(self, **kwargs): + self.assertIsNone(kwargs['config_drive']) + + def _initialize_extension(self): + self.ext_mgr.extensions = {'os-config-drive': 'fake'} + def test_create_instance_with_empty_config_drive(self): param = '' req, body = self._create_instance_body_of_config_drive(param) diff --git a/nova/tests/api/openstack/compute/plugins/v3/test_config_drive.py b/nova/tests/api/openstack/compute/plugins/v3/test_config_drive.py deleted file mode 100644 index a0adb97e65bc..000000000000 --- a/nova/tests/api/openstack/compute/plugins/v3/test_config_drive.py +++ /dev/null @@ -1,267 +0,0 @@ -# Copyright 2012 OpenStack Foundation -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import datetime -import uuid - -from oslo.config import cfg -import webob - -from nova.api.openstack.compute import plugins -from nova.api.openstack.compute.plugins.v3 import config_drive -from nova.api.openstack.compute.plugins.v3 import servers -from nova.compute import api as compute_api -from nova.compute import flavors -from nova import db -from nova import exception -from nova.network import manager -from nova.openstack.common import jsonutils -from nova import test -from nova.tests.api.openstack import fakes -from nova.tests import fake_instance -from nova.tests.image import fake - - -CONF = cfg.CONF -FAKE_UUID = fakes.FAKE_UUID - - -def fake_gen_uuid(): - return FAKE_UUID - - -def return_security_group(context, instance_id, security_group_id): - pass - - -class ConfigDriveTest(test.TestCase): - - def setUp(self): - super(ConfigDriveTest, self).setUp() - fakes.stub_out_networking(self.stubs) - fakes.stub_out_rate_limiting(self.stubs) - fake.stub_out_image_service(self.stubs) - - def test_show(self): - self.stubs.Set(db, 'instance_get', - fakes.fake_instance_get()) - self.stubs.Set(db, 'instance_get_by_uuid', - fakes.fake_instance_get()) - req = webob.Request.blank('/v3/servers/1') - req.headers['Content-Type'] = 'application/json' - response = req.get_response(fakes.wsgi_app_v3( - init_only=('servers', 'os-config-drive'))) - self.assertEqual(response.status_int, 200) - res_dict = jsonutils.loads(response.body) - self.assertIn(config_drive.ATTRIBUTE_NAME, res_dict['server']) - - def test_detail_servers(self): - self.stubs.Set(db, 'instance_get_all_by_filters', - fakes.fake_instance_get_all_by_filters()) - self.stubs.Set(db, 'instance_get_by_uuid', - fakes.fake_instance_get()) - req = fakes.HTTPRequestV3.blank('/v3/servers/detail') - res = req.get_response(fakes.wsgi_app_v3( - init_only=('servers', 'os-config-drive'))) - server_dicts = jsonutils.loads(res.body)['servers'] - self.assertNotEqual(len(server_dicts), 0) - for server_dict in server_dicts: - self.assertIn(config_drive.ATTRIBUTE_NAME, server_dict) - - -class ServersControllerCreateTest(test.TestCase): - - def setUp(self): - """Shared implementation for tests below that create instance.""" - super(ServersControllerCreateTest, self).setUp() - - self.flags(verbose=True, - enable_instance_password=True) - self.instance_cache_num = 0 - self.instance_cache_by_id = {} - self.instance_cache_by_uuid = {} - - ext_info = plugins.LoadedExtensionInfo() - self.controller = servers.ServersController(extension_info=ext_info) - CONF.set_override('extensions_blacklist', 'os-config-drive', - 'osapi_v3') - self.no_config_drive_controller = servers.ServersController( - extension_info=ext_info) - - def instance_create(context, inst): - inst_type = flavors.get_flavor_by_flavor_id(3) - image_uuid = '76fa36fc-c930-4bf3-8c8a-ea2a2420deb6' - def_image_ref = 'http://localhost/images/%s' % image_uuid - self.instance_cache_num += 1 - instance = fake_instance.fake_db_instance(**{ - 'id': self.instance_cache_num, - 'display_name': inst['display_name'] or 'test', - 'uuid': FAKE_UUID, - 'instance_type': dict(inst_type), - 'access_ip_v4': '1.2.3.4', - 'access_ip_v6': 'fead::1234', - 'image_ref': inst.get('image_ref', def_image_ref), - 'user_id': 'fake', - 'project_id': 'fake', - 'reservation_id': inst['reservation_id'], - "created_at": datetime.datetime(2010, 10, 10, 12, 0, 0), - "updated_at": datetime.datetime(2010, 11, 11, 11, 0, 0), - "config_drive": None, - "progress": 0, - "fixed_ips": [], - "task_state": "", - "vm_state": "", - "root_device_name": inst.get('root_device_name', 'vda'), - }) - - self.instance_cache_by_id[instance['id']] = instance - self.instance_cache_by_uuid[instance['uuid']] = instance - return instance - - def instance_get(context, instance_id): - """Stub for compute/api create() pulling in instance after - scheduling - """ - return self.instance_cache_by_id[instance_id] - - def instance_update(context, uuid, values): - instance = self.instance_cache_by_uuid[uuid] - instance.update(values) - return instance - - def server_update(context, instance_uuid, params): - inst = self.instance_cache_by_uuid[instance_uuid] - inst.update(params) - return (inst, inst) - - def fake_method(*args, **kwargs): - pass - - def project_get_networks(context, user_id): - return dict(id='1', host='localhost') - - def queue_get_for(context, *args): - return 'network_topic' - - fakes.stub_out_rate_limiting(self.stubs) - fakes.stub_out_key_pair_funcs(self.stubs) - fake.stub_out_image_service(self.stubs) - fakes.stub_out_nw_api(self.stubs) - self.stubs.Set(uuid, 'uuid4', fake_gen_uuid) - self.stubs.Set(db, 'instance_add_security_group', - return_security_group) - self.stubs.Set(db, 'project_get_networks', - project_get_networks) - self.stubs.Set(db, 'instance_create', instance_create) - self.stubs.Set(db, 'instance_system_metadata_update', - fake_method) - self.stubs.Set(db, 'instance_get', instance_get) - self.stubs.Set(db, 'instance_update', instance_update) - self.stubs.Set(db, 'instance_update_and_get_original', - server_update) - self.stubs.Set(manager.VlanManager, 'allocate_fixed_ip', - fake_method) - - def _test_create_extra(self, params, no_image=False, - override_controller=None): - image_uuid = 'c905cedb-7281-47e4-8a62-f26bc5fc4c77' - server = dict(name='server_test', imageRef=image_uuid, flavorRef=2) - if no_image: - server.pop('imageRef', None) - server.update(params) - body = dict(server=server) - req = fakes.HTTPRequestV3.blank('/servers') - req.method = 'POST' - req.body = jsonutils.dumps(body) - req.headers["content-type"] = "application/json" - if override_controller: - server = override_controller.create(req, body=body).obj['server'] - else: - server = self.controller.create(req, body=body).obj['server'] - - def test_create_instance_with_config_drive_disabled(self): - params = {config_drive.ATTRIBUTE_NAME: "False"} - old_create = compute_api.API.create - - def create(*args, **kwargs): - self.assertNotIn('config_drive', kwargs) - return old_create(*args, **kwargs) - - self.stubs.Set(compute_api.API, 'create', create) - self._test_create_extra(params, - override_controller=self.no_config_drive_controller) - - def _create_instance_body_of_config_drive(self, param): - def create(*args, **kwargs): - self.assertIn('config_drive', kwargs) - return old_create(*args, **kwargs) - - old_create = compute_api.API.create - self.stubs.Set(compute_api.API, 'create', create) - image_href = '76fa36fc-c930-4bf3-8c8a-ea2a2420deb6' - flavor_ref = 'http://localhost/v3/flavors/3' - body = { - 'server': { - 'name': 'config_drive_test', - 'imageRef': image_href, - 'flavorRef': flavor_ref, - 'metadata': { - 'hello': 'world', - 'open': 'stack', - }, - config_drive.ATTRIBUTE_NAME: param, - }, - } - - req = fakes.HTTPRequestV3.blank('/servers') - req.method = 'POST' - req.body = jsonutils.dumps(body) - req.headers["content-type"] = "application/json" - - return req, body - - def test_create_instance_with_config_drive(self): - param = True - req, body = self._create_instance_body_of_config_drive(param) - res = self.controller.create(req, body=body).obj - server = res['server'] - self.assertEqual(FAKE_UUID, server['id']) - - def test_create_instance_with_config_drive_as_boolean_string(self): - param = 'false' - req, body = self._create_instance_body_of_config_drive(param) - res = self.controller.create(req, body=body).obj - server = res['server'] - self.assertEqual(FAKE_UUID, server['id']) - - def test_create_instance_with_bad_config_drive(self): - param = 12345 - req, body = self._create_instance_body_of_config_drive(param) - self.assertRaises(exception.ValidationError, - self.controller.create, req, body=body) - - def test_create_instance_without_config_drive(self): - param = True - req, body = self._create_instance_body_of_config_drive(param) - del body['server'][config_drive.ATTRIBUTE_NAME] - res = self.controller.create(req, body=body).obj - server = res['server'] - self.assertEqual(FAKE_UUID, server['id']) - - def test_create_instance_with_empty_config_drive(self): - param = '' - req, body = self._create_instance_body_of_config_drive(param) - self.assertRaises(exception.ValidationError, - self.controller.create, req, body=body) diff --git a/nova/tests/integrated/v3/api_samples/all_extensions/server-get-resp.json.tpl b/nova/tests/integrated/v3/api_samples/all_extensions/server-get-resp.json.tpl index e00029691071..d33b6b99a58d 100644 --- a/nova/tests/integrated/v3/api_samples/all_extensions/server-get-resp.json.tpl +++ b/nova/tests/integrated/v3/api_samples/all_extensions/server-get-resp.json.tpl @@ -48,7 +48,7 @@ "My Server Name": "Apache1" }, "name": "new-server-test", - "os-config-drive:config_drive": "", + "config_drive": "", "os-extended-availability-zone:availability_zone": "nova", "os-extended-server-attributes:host": "%(compute_host)s", "os-extended-server-attributes:hypervisor_hostname": "%(hypervisor_hostname)s", diff --git a/nova/tests/integrated/v3/api_samples/all_extensions/servers-details-resp.json.tpl b/nova/tests/integrated/v3/api_samples/all_extensions/servers-details-resp.json.tpl index 652714cf0f27..1d37aca1c127 100644 --- a/nova/tests/integrated/v3/api_samples/all_extensions/servers-details-resp.json.tpl +++ b/nova/tests/integrated/v3/api_samples/all_extensions/servers-details-resp.json.tpl @@ -49,7 +49,7 @@ "My Server Name": "Apache1" }, "name": "new-server-test", - "os-config-drive:config_drive": "", + "config_drive": "", "os-extended-availability-zone:availability_zone": "nova", "os-extended-server-attributes:host": "%(compute_host)s", "os-extended-server-attributes:hypervisor_hostname": "%(hypervisor_hostname)s", diff --git a/nova/tests/integrated/v3/api_samples/os-config-drive/server-config-drive-get-resp.json.tpl b/nova/tests/integrated/v3/api_samples/os-config-drive/server-config-drive-get-resp.json.tpl index 13f51f58753d..784d49416793 100644 --- a/nova/tests/integrated/v3/api_samples/os-config-drive/server-config-drive-get-resp.json.tpl +++ b/nova/tests/integrated/v3/api_samples/os-config-drive/server-config-drive-get-resp.json.tpl @@ -1,6 +1,6 @@ { "server": { - "os-config-drive:config_drive": "%(cdrive)s", + "config_drive": "%(cdrive)s", "addresses": { "private": [ { diff --git a/nova/tests/integrated/v3/api_samples/os-config-drive/servers-config-drive-details-resp.json.tpl b/nova/tests/integrated/v3/api_samples/os-config-drive/servers-config-drive-details-resp.json.tpl index cc7fe80d46f4..31b8a62b4d6f 100644 --- a/nova/tests/integrated/v3/api_samples/os-config-drive/servers-config-drive-details-resp.json.tpl +++ b/nova/tests/integrated/v3/api_samples/os-config-drive/servers-config-drive-details-resp.json.tpl @@ -1,7 +1,7 @@ { "servers": [ { - "os-config-drive:config_drive": "%(cdrive)s", + "config_drive": "%(cdrive)s", "addresses": { "private": [ {