Merge "Improve OpenstackProvider"
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
"user": "admin",
|
"user": "admin",
|
||||||
"tenant": "admin",
|
"tenant": "admin",
|
||||||
"flavor_id": "2",
|
"flavor_id": "2",
|
||||||
|
"nics": [{"net-id": "97936015-128a-42f1-a3f2-1868ceeeeb6f"}],
|
||||||
"password": "admin",
|
"password": "admin",
|
||||||
"auth_url": "http://example.net:5000/v2.0",
|
"auth_url": "http://example.net:5000/v2.0",
|
||||||
"amount": 1,
|
"amount": 1,
|
||||||
|
@@ -65,6 +65,7 @@ class OpenStackProvider(provider.ProviderFactory):
|
|||||||
'deployment_name': {'type': 'string'},
|
'deployment_name': {'type': 'string'},
|
||||||
'amount': {'type': 'integer'},
|
'amount': {'type': 'integer'},
|
||||||
'user': {'type': 'string'},
|
'user': {'type': 'string'},
|
||||||
|
'nics': {'type': 'array'},
|
||||||
'password': {'type': 'string'},
|
'password': {'type': 'string'},
|
||||||
'tenant': {'type': 'string'},
|
'tenant': {'type': 'string'},
|
||||||
'auth_url': {'type': 'string'},
|
'auth_url': {'type': 'string'},
|
||||||
@@ -160,27 +161,40 @@ class OpenStackProvider(provider.ProviderFactory):
|
|||||||
userdata = open(userdata, 'r')
|
userdata = open(userdata, 'r')
|
||||||
return userdata
|
return userdata
|
||||||
|
|
||||||
|
def create_keypair(self):
|
||||||
|
public_key_path = self.config.get(
|
||||||
|
'ssh_public_key_file', os.path.expanduser('~/.ssh/id_rsa.pub'))
|
||||||
|
public_key = open(public_key_path, 'r').read().strip()
|
||||||
|
key_name = self.config['deployment_name'] + '-key'
|
||||||
|
try:
|
||||||
|
key = self.nova.keypairs.find(name=key_name)
|
||||||
|
self.nova.keypairs.delete(key.id)
|
||||||
|
except novaclient.exceptions.NotFound:
|
||||||
|
pass
|
||||||
|
keypair = self.nova.keypairs.create(key_name, public_key)
|
||||||
|
self.resources.create({'id': keypair.id}, type=KEYPAIR_TYPE)
|
||||||
|
return keypair, public_key_path
|
||||||
|
|
||||||
|
def get_nics(self):
|
||||||
|
return self.config.get("nics", None)
|
||||||
|
|
||||||
def create_servers(self):
|
def create_servers(self):
|
||||||
"""Create VMs with chosen image."""
|
"""Create VMs with chosen image."""
|
||||||
|
|
||||||
image_uuid = self.get_image_uuid()
|
image_uuid = self.get_image_uuid()
|
||||||
userdata = self.get_userdata()
|
userdata = self.get_userdata()
|
||||||
flavor = self.config['flavor_id']
|
flavor = self.config['flavor_id']
|
||||||
|
nics = self.get_nics()
|
||||||
|
|
||||||
public_key_path = self.config.get(
|
keypair, public_key_path = self.create_keypair()
|
||||||
'ssh_public_key_file', os.path.expanduser('~/.ssh/id_rsa.pub'))
|
|
||||||
public_key = open(public_key_path, 'r').read().strip()
|
|
||||||
key_name = self.config['deployment_name'] + '-key'
|
|
||||||
keypair = self.nova.keypairs.create(key_name, public_key)
|
|
||||||
self.resources.create({'id': keypair.id}, type=KEYPAIR_TYPE)
|
|
||||||
|
|
||||||
os_servers = []
|
os_servers = []
|
||||||
for i in range(self.config.get('amount', 1)):
|
for i in range(self.config.get('amount', 1)):
|
||||||
name = "%s-%d" % (self.config['deployment_name'], i)
|
name = "%s-%d" % (self.config['deployment_name'], i)
|
||||||
server = self.nova.servers.create(name, image_uuid, flavor,
|
server = self.nova.servers.create(name, image_uuid, flavor,
|
||||||
|
nics=nics,
|
||||||
key_name=keypair.name,
|
key_name=keypair.name,
|
||||||
userdata=userdata)
|
userdata=userdata)
|
||||||
|
|
||||||
os_servers.append(server)
|
os_servers.append(server)
|
||||||
self.resources.create({'id': server.id}, type=SERVER_TYPE)
|
self.resources.create({'id': server.id}, type=SERVER_TYPE)
|
||||||
|
|
||||||
@@ -193,7 +207,6 @@ class OpenStackProvider(provider.ProviderFactory):
|
|||||||
|
|
||||||
for os_server in os_servers:
|
for os_server in os_servers:
|
||||||
benchmark_utils.wait_for(os_server, **kwargs)
|
benchmark_utils.wait_for(os_server, **kwargs)
|
||||||
|
|
||||||
servers = [provider.Server(host=s.addresses.values()[0][0]['addr'],
|
servers = [provider.Server(host=s.addresses.values()[0][0]['addr'],
|
||||||
user='root',
|
user='root',
|
||||||
key=public_key_path)
|
key=public_key_path)
|
||||||
|
@@ -60,10 +60,6 @@ class OpenStackProviderTestCase(test.TestCase):
|
|||||||
'flavor_id': '22'}
|
'flavor_id': '22'}
|
||||||
|
|
||||||
def _init_mock_clients(self):
|
def _init_mock_clients(self):
|
||||||
|
|
||||||
def g():
|
|
||||||
raise Exception('ooke')
|
|
||||||
|
|
||||||
self.clients = mock.MagicMock()
|
self.clients = mock.MagicMock()
|
||||||
|
|
||||||
self.image = mock.MagicMock()
|
self.image = mock.MagicMock()
|
||||||
@@ -82,8 +78,7 @@ class OpenStackProviderTestCase(test.TestCase):
|
|||||||
self.nova_client.servers.create = mock.MagicMock(
|
self.nova_client.servers.create = mock.MagicMock(
|
||||||
return_value=self.instance)
|
return_value=self.instance)
|
||||||
|
|
||||||
self.clients.nova = mock.MagicMock(
|
self.clients.nova = mock.MagicMock(return_value=self.nova_client)
|
||||||
return_value=self.nova_client)
|
|
||||||
|
|
||||||
@mock.patch("rally.deploy.serverprovider.providers.openstack.osclients")
|
@mock.patch("rally.deploy.serverprovider.providers.openstack.osclients")
|
||||||
def test_openstack_provider_init(self, os_cli):
|
def test_openstack_provider_init(self, os_cli):
|
||||||
@@ -94,7 +89,7 @@ class OpenStackProviderTestCase(test.TestCase):
|
|||||||
self.assertEqual('glance', os_provider.glance)
|
self.assertEqual('glance', os_provider.glance)
|
||||||
|
|
||||||
@mock.patch('rally.osclients.Clients.glance')
|
@mock.patch('rally.osclients.Clients.glance')
|
||||||
def test_openstack_provider_init_no_glance(self, mock_glance):
|
def test_init_no_glance(self, mock_glance):
|
||||||
mock_glance.side_effect = KeyError('image')
|
mock_glance.side_effect = KeyError('image')
|
||||||
cfg = self._get_valid_config()
|
cfg = self._get_valid_config()
|
||||||
provider = OSProvider(mock.MagicMock(), cfg)
|
provider = OSProvider(mock.MagicMock(), cfg)
|
||||||
@@ -151,33 +146,38 @@ class OpenStackProviderTestCase(test.TestCase):
|
|||||||
cfg['image'] = dict(checksum="checksum")
|
cfg['image'] = dict(checksum="checksum")
|
||||||
OSProvider(mock.MagicMock(), cfg)
|
OSProvider(mock.MagicMock(), cfg)
|
||||||
|
|
||||||
@mock.patch(MOD_NAME + '.osclients')
|
|
||||||
@mock.patch(MOD_NAME + '.open', create=True)
|
|
||||||
@mock.patch(MOD_NAME + '.provider')
|
|
||||||
@mock.patch('rally.benchmark.utils.get_from_manager')
|
|
||||||
@mock.patch('time.sleep')
|
@mock.patch('time.sleep')
|
||||||
def test_openstack_provider_create_servers(self, mock_sleep, get, g,
|
@mock.patch(MOD_NAME + '.provider.Server')
|
||||||
provider, clients):
|
@mock.patch(MOD_NAME + '.osclients')
|
||||||
get.return_value = lambda r: r
|
@mock.patch(MOD_NAME + '.benchmark_utils')
|
||||||
self._init_mock_clients()
|
def test_create_servers(self, bmutils, oscl, m_Server, m_sleep):
|
||||||
clients.Clients = mock.MagicMock(return_value=self.clients)
|
fake_keypair = mock.Mock()
|
||||||
provider.Server = mock.MagicMock()
|
fake_keypair.name = 'fake_key_name'
|
||||||
prov = OSProvider(mock.MagicMock(), self._get_valid_config())
|
provider = OSProvider(mock.Mock(), self._get_valid_config())
|
||||||
prov.get_image_uuid = mock.Mock()
|
provider.nova = mock.Mock()
|
||||||
prov.nova.keypairs.create.return_value = mock.Mock(id='keypair_id',
|
provider.get_image_uuid = mock.Mock(return_value='fake_image_uuid')
|
||||||
name='keypair_name')
|
provider.get_userdata = mock.Mock(return_value='fake_userdata')
|
||||||
self.instance.id = 'instance_id'
|
provider.get_nics = mock.Mock(return_value='fake_nics')
|
||||||
prov.create_servers()
|
provider.create_keypair = mock.Mock(return_value=(fake_keypair,
|
||||||
self.assertEqual(['keypairs.create', 'servers.create'],
|
'fake_path'))
|
||||||
[call[0] for call in self.nova_client.mock_calls])
|
m_Server.return_value = fake_server = mock.Mock()
|
||||||
prov.resources.create.assert_has_calls([
|
provider.nova.servers.create.return_value = fake_instance = mock.Mock()
|
||||||
mock.call({'id': 'keypair_id'}, type='keypair'),
|
fake_instance.addresses.values = mock.Mock(
|
||||||
mock.call({'id': 'instance_id'}, type='server'),
|
return_value=[[{'addr': '1.2.3.4'}]])
|
||||||
])
|
|
||||||
|
servers = provider.create_servers()
|
||||||
|
|
||||||
|
m_Server.assert_called_once_with(host='1.2.3.4', user='root',
|
||||||
|
key='fake_path')
|
||||||
|
self.assertEqual([fake_server], servers)
|
||||||
|
fake_server.ssh.wait.assert_called_once()
|
||||||
|
provider.nova.servers.create.assert_called_once_with(
|
||||||
|
'rally-dep-1-0', 'fake_image_uuid', '22', userdata='fake_userdata',
|
||||||
|
nics='fake_nics', key_name='fake_key_name')
|
||||||
|
|
||||||
@mock.patch(MOD_NAME + '.osclients')
|
@mock.patch(MOD_NAME + '.osclients')
|
||||||
@mock.patch(MOD_NAME + '.urllib2')
|
@mock.patch(MOD_NAME + '.urllib2')
|
||||||
def test_openstack_provider_get_image_found_by_checksum(self, u, oscl):
|
def test_get_image_found_by_checksum(self, u, oscl):
|
||||||
self._init_mock_clients()
|
self._init_mock_clients()
|
||||||
oscl.Clients = mock.MagicMock(return_value=self.clients)
|
oscl.Clients = mock.MagicMock(return_value=self.clients)
|
||||||
prov = OSProvider(mock.MagicMock(), self._get_valid_config())
|
prov = OSProvider(mock.MagicMock(), self._get_valid_config())
|
||||||
@@ -186,7 +186,7 @@ class OpenStackProviderTestCase(test.TestCase):
|
|||||||
|
|
||||||
@mock.patch(MOD_NAME + '.osclients')
|
@mock.patch(MOD_NAME + '.osclients')
|
||||||
@mock.patch(MOD_NAME + '.urllib2')
|
@mock.patch(MOD_NAME + '.urllib2')
|
||||||
def test_openstack_provider_get_image_download(self, u, oscl):
|
def test_get_image_download(self, u, oscl):
|
||||||
self._init_mock_clients()
|
self._init_mock_clients()
|
||||||
self.glance_client.images.list = mock.Mock(return_value=[])
|
self.glance_client.images.list = mock.Mock(return_value=[])
|
||||||
oscl.Clients = mock.MagicMock(return_value=self.clients)
|
oscl.Clients = mock.MagicMock(return_value=self.clients)
|
||||||
@@ -197,7 +197,7 @@ class OpenStackProviderTestCase(test.TestCase):
|
|||||||
[mock.call.urlopen('http://example.net/img.qcow2')])
|
[mock.call.urlopen('http://example.net/img.qcow2')])
|
||||||
|
|
||||||
@mock.patch(MOD_NAME + '.osclients')
|
@mock.patch(MOD_NAME + '.osclients')
|
||||||
def test_openstack_provider_get_image_no_glance_exception(
|
def test_get_image_no_glance_exception(
|
||||||
self, mock_osclients):
|
self, mock_osclients):
|
||||||
prov = OSProvider(mock.MagicMock(), self._get_valid_config())
|
prov = OSProvider(mock.MagicMock(), self._get_valid_config())
|
||||||
prov.glance = None
|
prov.glance = None
|
||||||
@@ -205,8 +205,7 @@ class OpenStackProviderTestCase(test.TestCase):
|
|||||||
prov.get_image_uuid)
|
prov.get_image_uuid)
|
||||||
|
|
||||||
@mock.patch(MOD_NAME + '.osclients')
|
@mock.patch(MOD_NAME + '.osclients')
|
||||||
def test_openstack_provider_get_image_from_uuid_no_glance(
|
def test_get_image_from_uuid_no_glance(self, mock_osclients):
|
||||||
self, mock_osclients):
|
|
||||||
conf = self._get_valid_config()
|
conf = self._get_valid_config()
|
||||||
conf['image']['uuid'] = "EC7A1DB7-C5BD-49A2-8066-613809CB22F5"
|
conf['image']['uuid'] = "EC7A1DB7-C5BD-49A2-8066-613809CB22F5"
|
||||||
prov = OSProvider(mock.MagicMock(), conf)
|
prov = OSProvider(mock.MagicMock(), conf)
|
||||||
@@ -214,7 +213,7 @@ class OpenStackProviderTestCase(test.TestCase):
|
|||||||
self.assertEqual(conf['image']['uuid'], prov.get_image_uuid())
|
self.assertEqual(conf['image']['uuid'], prov.get_image_uuid())
|
||||||
|
|
||||||
@mock.patch(MOD_NAME + '.osclients')
|
@mock.patch(MOD_NAME + '.osclients')
|
||||||
def test_openstack_provider_destroy_servers(self, mock_osclients):
|
def test_destroy_servers(self, mock_osclients):
|
||||||
prov = OSProvider(mock.MagicMock(), self._get_valid_config())
|
prov = OSProvider(mock.MagicMock(), self._get_valid_config())
|
||||||
prov.resources.get_all.side_effect = [
|
prov.resources.get_all.side_effect = [
|
||||||
[fakes.FakeResource(
|
[fakes.FakeResource(
|
||||||
|
Reference in New Issue
Block a user