def update_server(self, context, server_id, values): server = self._find_servers(context, {'id': server_id}, one=True) server.update(values) try: server.save(self.session) except exceptions.Duplicate: raise exceptions.DuplicateServer() return dict(server)
def create_server(self, context, values): server = models.Server() server.update(values) try: server.save(self.session) except exceptions.Duplicate: raise exceptions.DuplicateServer() return dict(server)
def create_server(self, context, server): storage_server = models.Server() storage_server.update(server) try: storage_server.save(self.session) except exceptions.Duplicate: raise exceptions.DuplicateServer() return objects.Server.from_sqla(storage_server)
def create_server(): context = flask.request.environ.get('context') values = flask.request.json central_api = central_rpcapi.CentralAPI.get_instance() # Validate against the original server schema server_schema.validate(values) # Create a PoolNsRecord object pns_values = { 'priority': 10, 'hostname': values['name'] } ns_record = objects.PoolNsRecord.from_dict(pns_values) # Get the default pool pool = central_api.get_pool(context, default_pool_id) # Add the new PoolAttribute to the pool as a nameserver pool.ns_records.append(ns_record) try: # Update the pool updated_pool = central_api.update_pool(context, pool) except exceptions.DuplicatePoolAttribute: raise exceptions.DuplicateServer() # Go through the pool.ns_records to find the right one to get the ID for ns in updated_pool.ns_records: if ns.hostname == pns_values['hostname']: created_ns_record = ns break # Convert the PoolAttribute to a Server so we can validate with the # original schema and display server = _pool_ns_record_to_server(created_ns_record) response = flask.jsonify(server_schema.filter(server)) response.status_int = 201 response.location = flask.url_for('.get_server', server_id=server['id']) return response
class ApiV1ServersTest(ApiV1Test): __test__ = True def test_create_server(self): # Create a server fixture = self.get_server_fixture(0) response = self.post('servers', data=fixture) self.assertIn('id', response.json) self.assertIn('name', response.json) self.assertEqual(response.json['name'], fixture['name']) @patch.object(central_service.Service, 'create_server') def test_create_server_trailing_slash(self, mock): # Create a server with a trailing slash self.post('servers/', data=self.get_server_fixture(0)) # verify that the central service is called self.assertTrue(mock.called) def test_create_server_junk(self): # Create a server fixture = self.get_server_fixture(0) # Add a junk property fixture['junk'] = 'Junk Field' # Ensure it fails with a 400 self.post('servers', data=fixture, status_code=400) @patch.object(central_service.Service, 'create_server', side_effect=rpc_common.Timeout()) def test_create_server_timeout(self, _): # Create a server fixture = self.get_server_fixture(0) self.post('servers', data=fixture, status_code=504) @patch.object(central_service.Service, 'create_server', side_effect=exceptions.DuplicateServer()) def test_create_server_duplicate(self, _): # Create a server fixture = self.get_server_fixture(0) self.post('servers', data=fixture, status_code=409) def test_get_servers(self): response = self.get('servers') self.assertIn('servers', response.json) self.assertEqual(0, len(response.json['servers'])) # Create a server self.create_server() response = self.get('servers') self.assertIn('servers', response.json) self.assertEqual(1, len(response.json['servers'])) # Create a second server self.create_server(fixture=1) response = self.get('servers') self.assertIn('servers', response.json) self.assertEqual(2, len(response.json['servers'])) @patch.object(central_service.Service, 'find_servers') def test_get_servers_trailing_slash(self, mock): self.get('servers/') # verify that the central service is called self.assertTrue(mock.called) @patch.object(central_service.Service, 'find_servers', side_effect=rpc_common.Timeout()) def test_get_servers_timeout(self, _): self.get('servers', status_code=504) def test_get_server(self): # Create a server server = self.create_server() response = self.get('servers/%s' % server['id']) self.assertIn('id', response.json) self.assertEqual(response.json['id'], server['id']) @patch.object(central_service.Service, 'get_server') def test_get_server_trailing_slash(self, mock): # Create a server server = self.create_server() self.get('servers/%s/' % server['id']) # verify that the central service is called self.assertTrue(mock.called) @patch.object(central_service.Service, 'get_server', side_effect=rpc_common.Timeout()) def test_get_server_timeout(self, _): # Create a server server = self.create_server() self.get('servers/%s' % server['id'], status_code=504) def test_get_server_missing(self): self.get('servers/2fdadfb1-cf96-4259-ac6b-bb7b6d2ff980', status_code=404) def test_update_server(self): # Create a server server = self.create_server() data = {'name': 'test.example.org.'} response = self.put('servers/%s' % server['id'], data=data) self.assertIn('id', response.json) self.assertEqual(response.json['id'], server['id']) self.assertIn('name', response.json) self.assertEqual(response.json['name'], 'test.example.org.') @patch.object(central_service.Service, 'update_server') def test_update_server_trailing_slash(self, mock): # Create a server server = self.create_server() data = {'name': 'test.example.org.'} self.put('servers/%s/' % server['id'], data=data) # verify that the central service is called self.assertTrue(mock.called) def test_update_server_junk(self): # Create a server server = self.create_server() data = {'name': 'test.example.org.', 'junk': 'Junk Field'} self.put('servers/%s' % server['id'], data=data, status_code=400) @patch.object(central_service.Service, 'update_server', side_effect=rpc_common.Timeout()) def test_update_server_timeout(self, _): # Create a server server = self.create_server() data = {'name': 'test.example.org.'} self.put('servers/%s' % server['id'], data=data, status_code=504) @patch.object(central_service.Service, 'update_server', side_effect=exceptions.DuplicateServer()) def test_update_server_duplicate(self, _): server = self.create_server() data = {'name': 'test.example.org.'} self.put('servers/%s' % server['id'], data=data, status_code=409) def test_update_server_missing(self): data = {'name': 'test.example.org.'} self.get('servers/2fdadfb1-cf96-4259-ac6b-bb7b6d2ff980', data=data, status_code=404) def test_delete_server(self): # Create a server server = self.create_server() # Create a second server so that we can delete the first # because the last remaining server is not allowed to be deleted server2 = self.create_server(fixture=1) # Now delete the server self.delete('servers/%s' % server['id']) # Ensure we can no longer fetch the deleted server self.get('servers/%s' % server['id'], status_code=404) # Also, verify we cannot delete last remaining server self.delete('servers/%s' % server2['id'], status_code=400) @patch.object(central_service.Service, 'delete_server') def test_delete_server_trailing_slash(self, mock): # Create a server server = self.create_server() self.delete('servers/%s/' % server['id']) # verify that the central service is called self.assertTrue(mock.called) @patch.object(central_service.Service, 'delete_server', side_effect=rpc_common.Timeout()) def test_delete_server_timeout(self, _): # Create a server server = self.create_server() self.delete('servers/%s' % server['id'], status_code=504) def test_delete_server_missing(self): self.delete('servers/9fdadfb1-cf96-4259-ac6b-bb7b6d2ff980', status_code=404)
class ApiV1ServersTest(ApiV1Test): def setUp(self): super(ApiV1ServersTest, self).setUp() # All Server Checks should be performed as an admin, so.. # Override to policy to make everyone an admin. self.policy({'admin': '@'}) def test_create_server(self): # Create a server fixture = self.get_server_fixture(0) response = self.post('servers', data=fixture) self.assertIn('id', response.json) self.assertIn('name', response.json) self.assertEqual(response.json['name'], fixture['name']) def test_create_server_junk(self): # Create a server fixture = self.get_server_fixture(0) # Add a junk property fixture['junk'] = 'Junk Field' # Ensure it fails with a 400 self.post('servers', data=fixture, status_code=400) def test_create_server_with_invalid_name(self): # Create a server fixture = self.get_server_fixture(0) # Add a invalid name fixture['name'] = '$#$%^^' # Ensure it fails with a 400 self.post('servers', data=fixture, status_code=400) @patch.object(central_service.Service, 'update_pool', side_effect=messaging.MessagingTimeout()) def test_create_server_timeout(self, _): # Create a server fixture = self.get_server_fixture(0) self.post('servers', data=fixture, status_code=504) @patch.object(central_service.Service, 'update_pool', side_effect=exceptions.DuplicateServer()) def test_create_server_duplicate(self, _): # Create a server fixture = self.get_server_fixture(0) self.post('servers', data=fixture, status_code=409) def test_get_servers(self): # Fetch the default pool pool = self.storage.get_pool(self.admin_context, default_pool_id) # Fetch the list of servers response = self.get('servers') self.assertIn('servers', response.json) self.assertEqual(len(pool.ns_records), len(response.json['servers'])) # Add a new NS record to the pool pool.ns_records.append( objects.PoolNsRecord(priority=0, hostname='new-ns1.example.org.')) # Save the pool to add a new nameserver self.storage.update_pool(self.admin_context, pool) # Fetch the list of servers response = self.get('servers') self.assertIn('servers', response.json) self.assertEqual(len(pool.ns_records), len(response.json['servers'])) # Add a new NS record to the pool pool.ns_records.append( objects.PoolNsRecord(priority=0, hostname='new-ns2.example.org.')) # Save the pool to add a new nameserver self.storage.update_pool(self.admin_context, pool) response = self.get('servers') self.assertIn('servers', response.json) self.assertEqual(len(pool.ns_records), len(response.json['servers'])) @patch.object(central_service.Service, 'get_pool', side_effect=messaging.MessagingTimeout()) def test_get_servers_timeout(self, _): self.get('servers', status_code=504) def test_get_server(self): # Fetch the default pool pool = self.storage.get_pool(self.admin_context, default_pool_id) # Fetch the Server from the pool response = self.get('servers/%s' % pool.ns_records[0].id) self.assertIn('id', response.json) self.assertEqual(response.json['id'], pool.ns_records[0]['id']) @patch.object(central_service.Service, 'get_pool', side_effect=messaging.MessagingTimeout()) def test_get_server_timeout(self, _): # Fetch the default pool pool = self.storage.get_pool(self.admin_context, default_pool_id) self.get('servers/%s' % pool.ns_records[0].id, status_code=504) def test_get_server_with_invalid_id(self): self.get('servers/2fdadfb1-cf96-4259-ac6b-bb7b6d2ff98GH', status_code=404) def test_get_server_missing(self): self.get('servers/2fdadfb1-cf96-4259-ac6b-bb7b6d2ff980', status_code=404) def test_update_server(self): # Fetch the default pool pool = self.storage.get_pool(self.admin_context, default_pool_id) data = {'name': 'new-ns1.example.org.'} response = self.put('servers/%s' % pool.ns_records[0].id, data=data) self.assertIn('id', response.json) self.assertEqual(response.json['id'], pool.ns_records[0].id) self.assertIn('name', response.json) self.assertEqual(response.json['name'], 'new-ns1.example.org.') def test_update_server_missing(self): data = {'name': 'test.example.org.'} self.put('servers/2fdadfb1-cf96-4259-ac6b-bb7b6d2ff980', data=data, status_code=404) def test_update_server_junk(self): # Fetch the default pool pool = self.storage.get_pool(self.admin_context, default_pool_id) data = {'name': 'test.example.org.', 'junk': 'Junk Field'} self.put('servers/%s' % pool.ns_records[0].id, data=data, status_code=400) def test_delete_server(self): # Fetch the default pool pool = self.storage.get_pool(self.admin_context, default_pool_id) # Create a second server so that we can delete the first # because the last remaining server is not allowed to be deleted # Add a new NS record to the pool pool.ns_records.append( objects.PoolNsRecord(priority=0, hostname='new-ns2.example.org.')) # Save the pool to add a new nameserver self.storage.update_pool(self.admin_context, pool) # Now delete the server self.delete('servers/%s' % pool.ns_records[1].id) # Ensure we can no longer fetch the deleted server self.get('servers/%s' % pool.ns_records[1].id, status_code=404) # Also, verify we cannot delete last remaining server self.delete('servers/%s' % pool.ns_records[0].id, status_code=400) def test_delete_server_with_invalid_id(self): self.delete('servers/9fdadfb1-cf96-4259-ac6b-bb7b6d2ff98GH', status_code=404) def test_delete_server_missing(self): self.delete('servers/9fdadfb1-cf96-4259-ac6b-bb7b6d2ff980', status_code=404)