# Copyright 2014 Hewlett-Packard Development Company, L.P. # # Author: Graham Hayes # # 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. from designate.tests.test_api.test_v2 import ApiV2TestCase class ApiV2ZoneTransfersTest(ApiV2TestCase): def setUp(self): super().setUp() self.zone = self.create_zone() self.tenant_1_context = self.get_context(project_id=1) self.tenant_2_context = self.get_context(project_id=2) self.policy({'admin': '@'}) def test_create_zone_transfer_request(self): response = self.client.post_json( '/zones/%s/tasks/transfer_requests' % self.zone.id, {}) # Check the headers are what we expect self.assertEqual(201, response.status_int) self.assertEqual('application/json', response.content_type) # Check the body structure is what we expect self.assertIn('links', response.json) self.assertIn('self', response.json['links']) # Check the values returned are what we expect self.assertIn('id', response.json) self.assertIn('created_at', response.json) self.assertEqual('ACTIVE', response.json['status']) self.assertEqual( self.zone.name, response.json['zone_name']) self.assertEqual( self.zone.id, response.json['zone_id']) self.assertIsNone(response.json['updated_at']) def test_create_zone_transfer_request_scoped(self): response = self.client.post_json( '/zones/%s/tasks/transfer_requests' % self.zone.id, {'target_project_id': str(self.tenant_1_context.project_id)}) # Check the headers are what we expect self.assertEqual(201, response.status_int) self.assertEqual('application/json', response.content_type) # Check the body structure is what we expect self.assertIn('links', response.json) self.assertIn('self', response.json['links']) # Check the values returned are what we expect self.assertIn('id', response.json) self.assertIn('created_at', response.json) self.assertEqual('ACTIVE', response.json['status']) self.assertEqual( str(self.tenant_1_context.project_id), response.json['target_project_id']) self.assertEqual( self.zone.id, response.json['zone_id']) self.assertIsNone(response.json['updated_at']) def test_create_zone_transfer_request_empty_body(self): # Send an empty ("None") body response = self.client.post_json( '/zones/%s/tasks/transfer_requests' % self.zone.id, None) # Check the headers are what we expect self.assertEqual(201, response.status_int) self.assertEqual('application/json', response.content_type) def test_get_zone_transfer_request(self): initial = self.client.post_json( '/zones/%s/tasks/transfer_requests' % self.zone.id, {}) response = self.client.get( '/zones/tasks/transfer_requests/%s' % (initial.json['id'])) # Check the headers are what we expect self.assertEqual(200, response.status_int) self.assertEqual('application/json', response.content_type) # Check the body structure is what we expect self.assertIn('links', response.json) self.assertIn('self', response.json['links']) # Check the values returned are what we expect self.assertIn('id', response.json) self.assertIn('created_at', response.json) self.assertEqual('ACTIVE', response.json['status']) self.assertEqual( self.zone.id, response.json['zone_id']) self.assertIn('updated_at', response.json) def test_get_zone_transfer_requests(self): response = self.client.get( '/zones/tasks/transfer_requests') # Check the headers are what we expect self.assertEqual(200, response.status_int) self.assertEqual('application/json', response.content_type) # Check the body structure is what we expect self.assertIn('transfer_requests', response.json) self.assertIn('links', response.json) self.assertIn('self', response.json['links']) # We should start with 0 transfer accepts self.assertEqual(0, len(response.json['transfer_requests'])) self.client.post_json( '/zones/%s/tasks/transfer_requests' % self.zone.id, {}) data = self.client.get( '/zones/tasks/transfer_requests') self.assertEqual(1, len(data.json['transfer_requests'])) def test_update_zone_transfer_request(self): initial = self.client.post_json( '/zones/%s/tasks/transfer_requests' % self.zone.id, {}) response = self.client.patch_json( '/zones/tasks/transfer_requests/%s' % (initial.json['id']), {"description": "TEST"}) # Check the headers are what we expect self.assertEqual(200, response.status_int) self.assertEqual('application/json', response.content_type) # Check the body structure is what we expect self.assertIn('links', response.json) self.assertIn('self', response.json['links']) # Check the values returned are what we expect self.assertIn('id', response.json) self.assertIn('created_at', response.json) self.assertEqual('ACTIVE', response.json['status']) self.assertEqual( self.zone.id, response.json['zone_id']) self.assertEqual( 'TEST', response.json['description']) self.assertIn('updated_at', response.json) def test_update_zone_transfer_request_json_patch_not_implemented(self): self._assert_exception( 'unknown', 500, self.client.patch_json, '/zones/tasks/transfer_requests/' '5c0614e6-1a04-487d-818a-441c3971d401', {'description': 'Tester'}, content_type='application/json-patch+json' ) def test_delete_zone_transfer_request(self): initial = self.client.post_json( '/zones/%s/tasks/transfer_requests' % self.zone.id, {}) response = self.client.delete( '/zones/tasks/transfer_requests/%s' % (initial.json['id'])) # Check the headers are what we expect self.assertEqual(204, response.status_int) def test_create_zone_transfer_accept(self): initial = self.client.post_json( '/zones/%s/tasks/transfer_requests' % self.zone.id, {}) response = self.client.post_json( '/zones/tasks/transfer_accepts', { 'zone_transfer_request_id': initial.json['id'], 'key': initial.json['key'] }) new_ztr = self.client.get( '/zones/tasks/transfer_requests/%s' % (initial.json['id'])) # Check the headers are what we expect self.assertEqual(201, response.status_int) self.assertEqual('application/json', response.content_type) # Check the body structure is what we expect self.assertIn('links', response.json) self.assertIn('self', response.json['links']) self.assertIn('zone', response.json['links']) # Check the values returned are what we expect self.assertIn('id', response.json) self.assertEqual( 'COMPLETE', response.json['status']) self.assertEqual( 'COMPLETE', new_ztr.json['status']) def test_get_zone_transfer_accept(self): initial = self.client.post_json( '/zones/%s/tasks/transfer_requests' % self.zone.id, {}) transfer_accept = self.client.post_json( '/zones/tasks/transfer_accepts', { 'zone_transfer_request_id': initial.json['id'], 'key': initial.json['key'] }) response = self.client.get( '/zones/tasks/transfer_accepts/%s' % (transfer_accept.json['id'])) # Check the headers are what we expect self.assertEqual(200, response.status_int) self.assertEqual('application/json', response.content_type) # Check the body structure is what we expect self.assertIn('links', response.json) self.assertIn('self', response.json['links']) # Check the values returned are what we expect self.assertIn('id', response.json) self.assertIn('created_at', response.json) self.assertEqual('COMPLETE', response.json['status']) self.assertEqual( self.zone.id, response.json['zone_id']) self.assertIn('updated_at', response.json) self.assertIn('key', response.json) self.assertIn(initial.json['id'], response.json['zone_transfer_request_id']) def test_get_zone_transfer_accept_invalid_id(self): self._assert_invalid_uuid(self.client.get, '/zones/tasks/transfer_accepts/%s') def test_get_zone_transfer_accepts(self): response = self.client.get( '/zones/tasks/transfer_accepts') # Check the headers are what we expect self.assertEqual(200, response.status_int) self.assertEqual('application/json', response.content_type) # Check the body structure is what we expect self.assertIn('transfer_accepts', response.json) self.assertIn('links', response.json) self.assertIn('self', response.json['links']) self.assertIn('metadata', response.json) # We should start with 0 transfer accepts self.assertEqual(0, len(response.json['transfer_accepts'])) initial = self.client.post_json( '/zones/%s/tasks/transfer_requests' % self.zone.id, {}) self.client.post_json( '/zones/tasks/transfer_accepts', { 'zone_transfer_request_id': initial.json['id'], 'key': initial.json['key'] }) data = self.client.get( '/zones/tasks/transfer_accepts') self.assertEqual(1, len(data.json['transfer_accepts'])) def test_create_zone_transfer_request_deleting_zone(self): url = '/zones/%s/tasks/transfer_requests' % self.zone.id body = {} self.client.delete('/zones/%s' % self.zone['id'], status=202) self._assert_exception('bad_request', 400, self.client.post_json, url, body) def test_create_zone_transfer_accept_deleting_zone(self): url = '/zones/%s/tasks/transfer_requests' % self.zone.id body = {} self.client.delete('/zones/%s' % self.zone['id'], status=202) self._assert_exception('bad_request', 400, self.client.post_json, url, body) # Metadata tests def test_metadata_exists_zone_transfer_accepts(self): initial = self.client.post_json( '/zones/%s/tasks/transfer_requests' % self.zone.id, {}) self.client.post_json( '/zones/tasks/transfer_accepts', { 'zone_transfer_request_id': initial.json['id'], 'key': initial.json['key'] }) result = self.client.get( '/zones/tasks/transfer_accepts') # Make sure the fields exist self.assertIn('metadata', result.json) self.assertIn('total_count', result.json['metadata']) def test_total_count_zone_transfer_accepts(self): initial = self.client.post_json( '/zones/%s/tasks/transfer_requests' % self.zone.id, {}) self.client.post_json( '/zones/tasks/transfer_accepts', { 'zone_transfer_request_id': initial.json['id'], 'key': initial.json['key'] }) result = self.client.get( '/zones/tasks/transfer_accepts') # Make sure total_count picked it up self.assertEqual(1, result.json['metadata']['total_count'])