def test_build_with_password_and_file(self): """Build a server with a custom password and an injected file""" file_contents = 'testing' expected_server = { 'name': 'testserver', 'metadata': { 'key1': 'value1', 'key2': 'value2', }, 'personality': [ { 'path': '/etc/test.txt', 'contents': base64.b64encode(file_contents), }, ], 'imageRef': self.image_ref, 'flavorRef': self.flavor_ref, 'adminPass': '******', } post_body = json.dumps({'server': expected_server}) response, body = self.os.nova.request('POST', '/servers', body=post_body) self.assertEqual(response.status, 202) _body = json.loads(body) self.assertEqual(_body.keys(), ['server']) created_server = _body['server'] self.server_id = _body['server']['id'] admin_pass = created_server.pop('adminPass', None) self.assertEqual(expected_server['adminPass'], admin_pass) self._assert_server_entity(created_server) self.assertEqual(expected_server['name'], created_server['name']) self.assertEqual(expected_server['metadata'], created_server['metadata']) self.os.nova.wait_for_server_status(created_server['id'], 'ACTIVE', timeout=self.build_timeout) server = self.os.nova.get_server(created_server['id']) # Find IP of server try: (_, network) = server['addresses'].popitem() ip = network[0]['addr'] except KeyError: self.fail("Failed to retrieve IP address from server entity") # Assert injected file is on instance, also verifying password works if int(self.nova['ssh_timeout']) > 0: client = ssh.Client(ip, 'root', admin_pass, self.ssh_timeout) injected_file = client.exec_command('cat /etc/test.txt') self.assertEqual(injected_file, file_contents)
def test_build_update_delete(self): """Build and delete a server""" server_password = '******' expected_server = { 'name': 'testserver', 'imageRef': self.image_ref, 'flavorRef': self.flavor_ref, 'metadata': { 'testEntry': 'testValue' }, } post_body = json.dumps({'server': expected_server}) response, body = self.os.nova.request('POST', '/servers', body=post_body) # Ensure attributes were returned self.assertEqual(response.status, 202) _body = json.loads(body) self.assertEqual(_body.keys(), ['server']) created_server = _body['server'] admin_pass = created_server.pop('adminPass') self._assert_server_entity(created_server) self.assertEqual(expected_server['name'], created_server['name']) self.assertEqual(created_server['accessIPv4'], '') self.assertEqual(created_server['accessIPv6'], '') self.assertEqual(expected_server['metadata'], created_server['metadata']) self.server_id = created_server['id'] # Get server again and ensure attributes stuck server = self.os.nova.get_server(self.server_id) self._assert_server_entity(server) self.assertEqual(server['name'], expected_server['name']) self.assertEqual(server['accessIPv4'], '') self.assertEqual(server['accessIPv6'], '') self.assertEqual(server['metadata'], created_server['metadata']) # Parse last-updated time update_time = utils.load_isotime(server['created']) # Ensure server not returned with future changes-since future_time = utils.dump_isotime(update_time + datetime.timedelta(100)) params = 'changes-since=%s' % future_time response, body = self.os.nova.request('GET', '/servers?%s' % params) servers = json.loads(body)['servers'] self.assertTrue(len(servers) == 0) # Ensure server is returned with past changes-since future_time = utils.dump_isotime(update_time - datetime.timedelta(1)) params = 'changes-since=%s' % future_time response, body = self.os.nova.request('GET', '/servers?%s' % params) servers = json.loads(body)['servers'] server_ids = map(lambda x: x['id'], servers) self.assertTrue(self.server_id in server_ids) # Update name new_name = 'testserver2' new_server = {'name': new_name} put_body = json.dumps({'server': new_server}) url = '/servers/%s' % self.server_id resp, body = self.os.nova.request('PUT', url, body=put_body) # Output from update should be a full server self.assertEqual(resp.status, 200) data = json.loads(body) self.assertEqual(data.keys(), ['server']) self._assert_server_entity(data['server']) self.assertEqual(new_name, data['server']['name']) # Check that name was changed updated_server = self.os.nova.get_server(self.server_id) self._assert_server_entity(updated_server) self.assertEqual(new_name, updated_server['name']) # Update accessIPv4 new_server = {'accessIPv4': '192.168.0.200'} put_body = json.dumps({'server': new_server}) url = '/servers/%s' % self.server_id resp, body = self.os.nova.request('PUT', url, body=put_body) # Output from update should be a full server self.assertEqual(resp.status, 200) data = json.loads(body) self.assertEqual(data.keys(), ['server']) self._assert_server_entity(data['server']) self.assertEqual('192.168.0.200', data['server']['accessIPv4']) # Check that accessIPv4 was changed updated_server = self.os.nova.get_server(self.server_id) self._assert_server_entity(updated_server) self.assertEqual('192.168.0.200', updated_server['accessIPv4']) # Update accessIPv6 new_server = {'accessIPv6': 'feed::beef'} put_body = json.dumps({'server': new_server}) url = '/servers/%s' % self.server_id resp, body = self.os.nova.request('PUT', url, body=put_body) # Output from update should be a full server self.assertEqual(resp.status, 200) data = json.loads(body) self.assertEqual(data.keys(), ['server']) self._assert_server_entity(data['server']) self.assertEqual('feed::beef', data['server']['accessIPv6']) # Check that accessIPv6 was changed updated_server = self.os.nova.get_server(self.server_id) self._assert_server_entity(updated_server) self.assertEqual('feed::beef', updated_server['accessIPv6']) # Check metadata subresource url = '/servers/%s/metadata' % self.server_id response, body = self.os.nova.request('GET', url) self.assertEqual(200, response.status) result = json.loads(body) expected = {'metadata': {'testEntry': 'testValue'}} self.assertEqual(expected, result) # Ensure metadata container can be modified expected = { 'metadata': { 'new_meta1': 'new_value1', 'new_meta2': 'new_value2', }, } post_body = json.dumps(expected) url = '/servers/%s/metadata' % self.server_id response, body = self.os.nova.request('POST', url, body=post_body) self.assertEqual(200, response.status) result = json.loads(body) expected['metadata']['testEntry'] = 'testValue' self.assertEqual(expected, result) # Ensure values stick url = '/servers/%s/metadata' % self.server_id response, body = self.os.nova.request('GET', url) self.assertEqual(200, response.status) result = json.loads(body) self.assertEqual(expected, result) # Ensure metadata container can be overwritten expected = { 'metadata': { 'new_meta3': 'new_value3', 'new_meta4': 'new_value4', }, } url = '/servers/%s/metadata' % self.server_id post_body = json.dumps(expected) response, body = self.os.nova.request('PUT', url, body=post_body) self.assertEqual(200, response.status) result = json.loads(body) self.assertEqual(expected, result) # Ensure values stick url = '/servers/%s/metadata' % self.server_id response, body = self.os.nova.request('GET', url) self.assertEqual(200, response.status) result = json.loads(body) self.assertEqual(expected, result) # Set specific key expected_meta = {'meta': {'new_meta5': 'new_value5'}} put_body = json.dumps(expected_meta) url = '/servers/%s/metadata/new_meta5' % self.server_id response, body = self.os.nova.request('PUT', url, body=put_body) self.assertEqual(200, response.status) result = json.loads(body) self.assertDictEqual(expected_meta, result) # Ensure value sticks expected_metadata = { 'metadata': { 'new_meta3': 'new_value3', 'new_meta4': 'new_value4', 'new_meta5': 'new_value5', }, } url = '/servers/%s/metadata' % self.server_id response, body = self.os.nova.request('GET', url) result = json.loads(body) self.assertDictEqual(expected_metadata, result) # Update existing key expected_meta = {'meta': {'new_meta4': 'new_value6'}} put_body = json.dumps(expected_meta) url = '/servers/%s/metadata/new_meta4' % self.server_id response, body = self.os.nova.request('PUT', url, body=put_body) self.assertEqual(200, response.status) result = json.loads(body) self.assertEqual(expected_meta, result) # Ensure value sticks expected_metadata = { 'metadata': { 'new_meta3': 'new_value3', 'new_meta4': 'new_value6', 'new_meta5': 'new_value5', }, } url = '/servers/%s/metadata' % self.server_id response, body = self.os.nova.request('GET', url) result = json.loads(body) self.assertDictEqual(expected_metadata, result) # Delete a certain key url = '/servers/%s/metadata/new_meta3' % self.server_id response, body = self.os.nova.request('DELETE', url) self.assertEquals(204, response.status) # Make sure the key is gone url = '/servers/%s/metadata/new_meta3' % self.server_id response, body = self.os.nova.request('GET', url) self.assertEquals(404, response.status) # Delete a nonexistant key url = '/servers/%s/metadata/new_meta3' % self.server_id response, body = self.os.nova.request('DELETE', url) self.assertEquals(404, response.status) # Wait for instance to boot self.os.nova.wait_for_server_status(self.server_id, 'ACTIVE', timeout=self.build_timeout) # Look for 'addresses' attribute on server url = '/servers/%s' % self.server_id response, body = self.os.nova.request('GET', url) self.assertEqual(response.status, 200) body = json.loads(body) self.assertTrue('addresses' in body['server'].keys()) server_addresses = body['server']['addresses'] # Addresses should be available from subresource url = '/servers/%s/ips' % self.server_id response, body = self.os.nova.request('GET', url) self.assertEqual(response.status, 200) body = json.loads(body) self.assertEqual(body.keys(), ['addresses']) ips_addresses = body['addresses'] # Ensure both resources return identical information self.assertEqual(server_addresses, ips_addresses) # Validate entities within network containers for (network, network_data) in ips_addresses.items(): url = '/servers/%s/ips/%s' % (self.server_id, network) response, body = self.os.nova.request('GET', url) self.assertEqual(response.status, 200) body = json.loads(body) self.assertEqual(body.keys(), [network]) self.assertEqual(body[network], network_data) # Check each IP entity for ip_data in network_data: self.assertEqual(set(ip_data.keys()), set(['addr', 'version'])) # Find IP of server try: (_, network) = server_addresses.items()[0] ip = network[0]['addr'] except KeyError: self.fail("Failed to retrieve IP address from server entity") # Assert password works if int(self.nova['ssh_timeout']) > 0: client = ssh.Client(ip, 'root', admin_pass, self.ssh_timeout) self.assertTrue(client.test_connection_auth()) self.os.nova.delete_server(self.server_id) # Poll server until deleted try: url = '/servers/%s' % self.server_id self.os.nova.poll_request_status('GET', url, 404) except exceptions.TimeoutException: self.fail("Server deletion timed out")
def _get_ssh_client(self, password): return ssh.Client(self.access_ip, 'root', password, self.ssh_timeout)