Convert v3 config drive plugin to v2.1
This patch changes v3 config drive plugin to v2.1 and makes v2 unit tests share between v2 and v2.1. The differences between v2 and v3 are described on the wiki page https://wiki.openstack.org/wiki/NovaAPIv2tov3. Partially implements blueprint v2-on-v3-api Change-Id: Ieed7619f3cb310b25d157ebb07f24468aea1af9d
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"server": {
|
||||
"os-config-drive:config_drive": "%(cdrive)s",
|
||||
"config_drive": "%(cdrive)s",
|
||||
"addresses": {
|
||||
"private": [
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"servers": [
|
||||
{
|
||||
"os-config-drive:config_drive": "%(cdrive)s",
|
||||
"config_drive": "%(cdrive)s",
|
||||
"addresses": {
|
||||
"private": [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user