diff --git a/heat/engine/resources/openstack/neutron/quota.py b/heat/engine/resources/openstack/neutron/quota.py index 0c2c1d45dd..bf8c6b960e 100644 --- a/heat/engine/resources/openstack/neutron/quota.py +++ b/heat/engine/resources/openstack/neutron/quota.py @@ -33,6 +33,8 @@ class NeutronQuota(neutron.NeutronResource): - security_group - router - port + - subnetpool + - rbac_policy Note that default neutron security policy usage of this resource is limited to being used by administrators only. Administrators should be @@ -46,10 +48,10 @@ class NeutronQuota(neutron.NeutronResource): PROPERTIES = ( PROJECT, SUBNET, NETWORK, FLOATINGIP, SECURITY_GROUP_RULE, - SECURITY_GROUP, ROUTER, PORT + SECURITY_GROUP, ROUTER, PORT, SUBNETPOOL, RBAC_POLICY ) = ( 'project', 'subnet', 'network', 'floatingip', 'security_group_rule', - 'security_group', 'router', 'port' + 'security_group', 'router', 'port', 'subnetpool', 'rbac_policy' ) properties_schema = { @@ -109,6 +111,22 @@ class NeutronQuota(neutron.NeutronResource): 'Setting -1 means unlimited.'), constraints=[constraints.Range(min=-1)], update_allowed=True + ), + SUBNETPOOL: properties.Schema( + properties.Schema.INTEGER, + _('Quota for the number of subnet pools. ' + 'Setting -1 means unlimited.'), + constraints=[constraints.Range(min=-1)], + update_allowed=True, + support_status=support.SupportStatus(version='12.0.0') + ), + RBAC_POLICY: properties.Schema( + properties.Schema.INTEGER, + _('Quota for the number of rbac policies. ' + 'Setting -1 means unlimited.'), + constraints=[constraints.Range(min=-1)], + update_allowed=True, + support_status=support.SupportStatus(version='12.0.0') ) } diff --git a/heat/tests/openstack/neutron/test_quota.py b/heat/tests/openstack/neutron/test_quota.py index c77797e274..d5fab0b737 100644 --- a/heat/tests/openstack/neutron/test_quota.py +++ b/heat/tests/openstack/neutron/test_quota.py @@ -40,11 +40,13 @@ resources: security_group: 5 router: 5 port: 5 + subnetpool: 5 + rbac_policy: 5 ''' valid_properties = [ 'subnet', 'network', 'floatingip', 'security_group_rule', - 'security_group', 'router', 'port' + 'security_group', 'router', 'port', 'subnetpool', 'rbac_policy' ] @@ -90,8 +92,9 @@ class NeutronQuotaTest(common.HeatTestCase): my_quota.reparse() msg = ('At least one of the following properties must be specified: ' - 'floatingip, network, port, router, ' - 'security_group, security_group_rule, subnet.') + 'floatingip, network, port, rbac_policy, router, ' + 'security_group, security_group_rule, subnet, ' + 'subnetpool.') self.assertRaisesRegex(exception.PropertyUnspecifiedError, msg, my_quota.validate) @@ -108,7 +111,9 @@ class NeutronQuotaTest(common.HeatTestCase): 'security_group_rule': 5, 'security_group': 5, 'router': 5, - 'port': 5 + 'port': 5, + 'subnetpool': 5, + 'rbac_policy': 5 } } self.update_quota.assert_called_once_with( @@ -121,7 +126,7 @@ class NeutronQuotaTest(common.HeatTestCase): tmpl_diff = mock.MagicMock() prop_diff = mock.MagicMock() props = {'project': 'some_project_id', 'floatingip': 1, - 'security_group': 4} + 'security_group': 4, 'rbac_policy': 8} json_snippet = rsrc_defn.ResourceDefinition( self.my_quota.name, 'OS::Neutron::Quota', @@ -131,7 +136,8 @@ class NeutronQuotaTest(common.HeatTestCase): body = { "quota": { 'floatingip': 1, - 'security_group': 4 + 'security_group': 4, + 'rbac_policy': 8 } } self.update_quota.assert_called_once_with( diff --git a/releasenotes/notes/add-subnetpool-rbacpolicy-quota-resource-945a74b57e2198a3.yaml b/releasenotes/notes/add-subnetpool-rbacpolicy-quota-resource-945a74b57e2198a3.yaml new file mode 100644 index 0000000000..9359d66f86 --- /dev/null +++ b/releasenotes/notes/add-subnetpool-rbacpolicy-quota-resource-945a74b57e2198a3.yaml @@ -0,0 +1,3 @@ +--- +features: + - Add rbac_policy and subnetpool support for OS::Neutron::Quota resource.