Merge "Improve OpenstackProvider"

This commit is contained in:
Jenkins
2014-03-24 14:04:32 +00:00
committed by Gerrit Code Review
3 changed files with 56 additions and 43 deletions

View File

@@ -6,6 +6,7 @@
"user": "admin",
"tenant": "admin",
"flavor_id": "2",
"nics": [{"net-id": "97936015-128a-42f1-a3f2-1868ceeeeb6f"}],
"password": "admin",
"auth_url": "http://example.net:5000/v2.0",
"amount": 1,

View File

@@ -65,6 +65,7 @@ class OpenStackProvider(provider.ProviderFactory):
'deployment_name': {'type': 'string'},
'amount': {'type': 'integer'},
'user': {'type': 'string'},
'nics': {'type': 'array'},
'password': {'type': 'string'},
'tenant': {'type': 'string'},
'auth_url': {'type': 'string'},
@@ -160,27 +161,40 @@ class OpenStackProvider(provider.ProviderFactory):
userdata = open(userdata, 'r')
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):
"""Create VMs with chosen image."""
image_uuid = self.get_image_uuid()
userdata = self.get_userdata()
flavor = self.config['flavor_id']
nics = self.get_nics()
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'
keypair = self.nova.keypairs.create(key_name, public_key)
self.resources.create({'id': keypair.id}, type=KEYPAIR_TYPE)
keypair, public_key_path = self.create_keypair()
os_servers = []
for i in range(self.config.get('amount', 1)):
name = "%s-%d" % (self.config['deployment_name'], i)
server = self.nova.servers.create(name, image_uuid, flavor,
nics=nics,
key_name=keypair.name,
userdata=userdata)
os_servers.append(server)
self.resources.create({'id': server.id}, type=SERVER_TYPE)
@@ -193,7 +207,6 @@ class OpenStackProvider(provider.ProviderFactory):
for os_server in os_servers:
benchmark_utils.wait_for(os_server, **kwargs)
servers = [provider.Server(host=s.addresses.values()[0][0]['addr'],
user='root',
key=public_key_path)

View File

@@ -60,10 +60,6 @@ class OpenStackProviderTestCase(test.TestCase):
'flavor_id': '22'}
def _init_mock_clients(self):
def g():
raise Exception('ooke')
self.clients = mock.MagicMock()
self.image = mock.MagicMock()
@@ -82,8 +78,7 @@ class OpenStackProviderTestCase(test.TestCase):
self.nova_client.servers.create = mock.MagicMock(
return_value=self.instance)
self.clients.nova = mock.MagicMock(
return_value=self.nova_client)
self.clients.nova = mock.MagicMock(return_value=self.nova_client)
@mock.patch("rally.deploy.serverprovider.providers.openstack.osclients")
def test_openstack_provider_init(self, os_cli):
@@ -94,7 +89,7 @@ class OpenStackProviderTestCase(test.TestCase):
self.assertEqual('glance', os_provider.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')
cfg = self._get_valid_config()
provider = OSProvider(mock.MagicMock(), cfg)
@@ -151,33 +146,38 @@ class OpenStackProviderTestCase(test.TestCase):
cfg['image'] = dict(checksum="checksum")
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')
def test_openstack_provider_create_servers(self, mock_sleep, get, g,
provider, clients):
get.return_value = lambda r: r
self._init_mock_clients()
clients.Clients = mock.MagicMock(return_value=self.clients)
provider.Server = mock.MagicMock()
prov = OSProvider(mock.MagicMock(), self._get_valid_config())
prov.get_image_uuid = mock.Mock()
prov.nova.keypairs.create.return_value = mock.Mock(id='keypair_id',
name='keypair_name')
self.instance.id = 'instance_id'
prov.create_servers()
self.assertEqual(['keypairs.create', 'servers.create'],
[call[0] for call in self.nova_client.mock_calls])
prov.resources.create.assert_has_calls([
mock.call({'id': 'keypair_id'}, type='keypair'),
mock.call({'id': 'instance_id'}, type='server'),
])
@mock.patch(MOD_NAME + '.provider.Server')
@mock.patch(MOD_NAME + '.osclients')
@mock.patch(MOD_NAME + '.benchmark_utils')
def test_create_servers(self, bmutils, oscl, m_Server, m_sleep):
fake_keypair = mock.Mock()
fake_keypair.name = 'fake_key_name'
provider = OSProvider(mock.Mock(), self._get_valid_config())
provider.nova = mock.Mock()
provider.get_image_uuid = mock.Mock(return_value='fake_image_uuid')
provider.get_userdata = mock.Mock(return_value='fake_userdata')
provider.get_nics = mock.Mock(return_value='fake_nics')
provider.create_keypair = mock.Mock(return_value=(fake_keypair,
'fake_path'))
m_Server.return_value = fake_server = mock.Mock()
provider.nova.servers.create.return_value = fake_instance = mock.Mock()
fake_instance.addresses.values = mock.Mock(
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 + '.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()
oscl.Clients = mock.MagicMock(return_value=self.clients)
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 + '.urllib2')
def test_openstack_provider_get_image_download(self, u, oscl):
def test_get_image_download(self, u, oscl):
self._init_mock_clients()
self.glance_client.images.list = mock.Mock(return_value=[])
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.patch(MOD_NAME + '.osclients')
def test_openstack_provider_get_image_no_glance_exception(
def test_get_image_no_glance_exception(
self, mock_osclients):
prov = OSProvider(mock.MagicMock(), self._get_valid_config())
prov.glance = None
@@ -205,8 +205,7 @@ class OpenStackProviderTestCase(test.TestCase):
prov.get_image_uuid)
@mock.patch(MOD_NAME + '.osclients')
def test_openstack_provider_get_image_from_uuid_no_glance(
self, mock_osclients):
def test_get_image_from_uuid_no_glance(self, mock_osclients):
conf = self._get_valid_config()
conf['image']['uuid'] = "EC7A1DB7-C5BD-49A2-8066-613809CB22F5"
prov = OSProvider(mock.MagicMock(), conf)
@@ -214,7 +213,7 @@ class OpenStackProviderTestCase(test.TestCase):
self.assertEqual(conf['image']['uuid'], prov.get_image_uuid())
@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.resources.get_all.side_effect = [
[fakes.FakeResource(