From ddc18073384d14ce00b7e1e7b45ce7cf26c95bc6 Mon Sep 17 00:00:00 2001 From: Thomas Maddox Date: Sun, 26 Feb 2017 15:03:03 +0000 Subject: [PATCH] Require region_id and cloud_id for POST /networks This patch corrects the schema to include requirements for region_id and cloud_id when creating a network. Change-Id: I0edbf5efa51a55c425051cbe8d7a60c6ed0a2232 Closes-Bug: 1661761 --- craton/api/v1/schemas.py | 4 + craton/tests/functional/test_network_calls.py | 106 ++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 craton/tests/functional/test_network_calls.py diff --git a/craton/api/v1/schemas.py b/craton/api/v1/schemas.py index 7ae7aca..632ee51 100644 --- a/craton/api/v1/schemas.py +++ b/craton/api/v1/schemas.py @@ -484,6 +484,8 @@ DefinitionNetwork = { "cidr", "gateway", "netmask", + "cloud_id", + "region_id", ], "type": "object", "additionalProperties": False, @@ -502,6 +504,8 @@ DefinitionNetworkCreate = { "cidr", "gateway", "netmask", + "cloud_id", + "region_id", ], "type": "object", "additionalProperties": False, diff --git a/craton/tests/functional/test_network_calls.py b/craton/tests/functional/test_network_calls.py new file mode 100644 index 0000000..4a085b6 --- /dev/null +++ b/craton/tests/functional/test_network_calls.py @@ -0,0 +1,106 @@ +from craton.tests.functional import TestCase + + +class APIV1NetworkSchemaTest(TestCase): + + def setUp(self): + super(APIV1NetworkSchemaTest, self).setUp() + self.cloud = self.create_cloud(name='cloud-1') + self.region = self.create_region(name='region-1', cloud=self.cloud) + self.networks_url = self.url + '/v1/networks' + self.cidr = '192.168.0.0/24' + self.netmask = '255.255.255.0' + self.gateway = '192.168.0.1' + + def test_network_create_with_required_works(self): + payload = { + 'cloud_id': self.cloud['id'], + 'region_id': self.region['id'], + 'name': 'a', + 'cidr': self.cidr, + 'netmask': self.netmask, + 'gateway': self.gateway, + } + resp = self.post(self.networks_url, data=payload) + self.assertEqual(201, resp.status_code) + + network = resp.json() + self.assertEqual('a', network['name']) + self.assertEqual(self.cloud['id'], network['cloud_id']) + self.assertEqual(self.region['id'], network['region_id']) + self.assertEqual(self.cidr, network['cidr']) + self.assertEqual(self.gateway, network['gateway']) + self.assertEqual(self.netmask, network['netmask']) + + def test_network_create_without_region_id_fails(self): + payload = { + 'cloud_id': self.cloud['id'], + 'name': 'a', + 'cidr': self.cidr, + 'netmask': self.netmask, + 'gateway': self.gateway, + } + network = self.post(self.networks_url, data=payload) + self.assertEqual(400, network.status_code) + msg = ["'region_id' is a required property"] + self.assertEqual(network.json()['errors'], msg) + + def test_network_create_without_cloud_id_fails(self): + payload = { + 'region_id': self.region['id'], + 'name': 'a', + 'cidr': self.cidr, + 'netmask': self.netmask, + 'gateway': self.gateway, + } + network = self.post(self.networks_url, data=payload) + self.assertEqual(400, network.status_code) + msg = ["'cloud_id' is a required property"] + self.assertEqual(network.json()['errors'], msg) + + def test_network_create_with_extra_id_property_fails(self): + payload = { + 'region_id': self.region['id'], + 'cloud_id': self.cloud['id'], + 'name': 'a', + 'cidr': self.cidr, + 'netmask': self.netmask, + 'gateway': self.gateway, + 'id': 3 + } + network = self.post(self.networks_url, data=payload) + self.assertEqual(400, network.status_code) + msg = ["Additional properties are not allowed ('id' was unexpected)"] + self.assertEqual(network.json()['errors'], msg) + + def test_network_create_with_extra_created_at_property_fails(self): + payload = { + 'region_id': self.region['id'], + 'cloud_id': self.cloud['id'], + 'name': 'a', + 'cidr': self.cidr, + 'netmask': self.netmask, + 'gateway': self.gateway, + 'created_at': 'This should not work' + } + network = self.post(self.networks_url, data=payload) + self.assertEqual(400, network.status_code) + msg = ["Additional properties are not allowed ('created_at' was " + "unexpected)"] + self.assertEqual(network.json()['errors'], msg) + + def test_network_create_with_extra_updated_at_property_fails(self): + payload = { + 'region_id': self.region['id'], + 'cloud_id': self.cloud['id'], + 'name': 'a', + 'cidr': self.cidr, + 'netmask': self.netmask, + 'gateway': self.gateway, + 'updated_at': 'This should not work' + } + network = self.post(self.networks_url, data=payload) + self.assertEqual(400, network.status_code) + msg = ["Additional properties are not allowed ('updated_at' was " + "unexpected)"] + self.assertEqual(network.json()['errors'], msg)