Refactor neutron constraints

Add class NeutronContraint as base neutron constraint class, this class
has 3 new properties: resource_name, cmd_resource, extension.
The validation workflow will be:
 check extension available -> get resource id base on resource_name and cmd_resource

This patch also and a new function find_resourceid_by_name_or_id to
neutron client_plugin, which wrap find_resourceid_by_name_or_id from
neutronclient, so that we can avoid to import neutronclient in many places.

Change-Id: I9968444339e239ddf0b43ecf18c6aebe18fa5aea
This commit is contained in:
Ethan Lynn
2015-12-04 21:20:44 +08:00
parent ed22ac69f9
commit 390cdb9f2a
14 changed files with 245 additions and 180 deletions

View File

@@ -69,8 +69,13 @@ class NeutronClientPlugin(client_plugin.ClientPlugin):
return isinstance(ex, exceptions.NeutronClientNoUniqueMatch)
def find_neutron_resource(self, props, key, key_type):
return self.find_resourceid_by_name_or_id(
key_type, props.get(key))
def find_resourceid_by_name_or_id(self, resource, name_or_id,
cmd_resource=None):
return neutronV20.find_resourceid_by_name_or_id(
self.client(), key_type, props.get(key))
self.client(), resource, name_or_id, cmd_resource=cmd_resource)
@os_client.MEMOIZE
def _list_extensions(self):
@@ -110,8 +115,8 @@ class NeutronClientPlugin(client_plugin.ClientPlugin):
Args:
policy: ID or name of the policy.
"""
return neutronV20.find_resourceid_by_name_or_id(
self.client(), 'policy', policy, cmd_resource='qos_policy')
return self.find_resourceid_by_name_or_id(
'policy', policy, cmd_resource='qos_policy')
def get_secgroup_uuids(self, security_groups):
'''Returns a list of security group UUIDs.

View File

@@ -14,38 +14,22 @@
#
# Copyright 2015 IBM Corp.
from neutronclient.common import exceptions
from neutronclient.neutron import v2_0 as neutronV20
from heat.engine import constraints
from heat.engine.clients.os.neutron import neutron_constraints as nc
class LoadbalancerConstraint(constraints.BaseCustomConstraint):
expected_exceptions = (exceptions.NeutronClientException,)
def validate_with_client(self, client, value):
neutron_client = client.client('neutron')
neutronV20.find_resourceid_by_name_or_id(
neutron_client, 'loadbalancer', value)
class LoadbalancerConstraint(nc.NeutronConstraint):
resource_name = 'loadbalancer'
cmd_resource = 'lbaas_loadbalancer'
extension = 'lbaasv2'
class ListenerConstraint(constraints.BaseCustomConstraint):
expected_exceptions = (exceptions.NeutronClientException,)
def validate_with_client(self, client, value):
neutron_client = client.client('neutron')
neutronV20.find_resourceid_by_name_or_id(
neutron_client, 'listener', value)
class ListenerConstraint(nc.NeutronConstraint):
resource_name = 'listener'
extension = 'lbaasv2'
class PoolConstraint(constraints.BaseCustomConstraint):
expected_exceptions = (exceptions.NeutronClientException,)
def validate_with_client(self, client, value):
neutron_client = client.client('neutron')
# v2 pool is called lbaas_pool to differentiate from v1 pool
neutronV20.find_resourceid_by_name_or_id(
neutron_client, 'lbaas_pool', value)
class PoolConstraint(nc.NeutronConstraint):
# Pool constraint for lbaas v2
resource_name = 'pool'
cmd_resource = 'lbaas_pool'
extension = 'lbaasv2'

View File

@@ -13,8 +13,7 @@
#
# Copyright 2015 IBM Corp.
from neutronclient.common import exceptions
from neutronclient.neutron import v2_0 as neutronV20
from neutronclient.common import exceptions as qe
from heat.common import exception
from heat.engine import constraints
@@ -22,76 +21,62 @@ from heat.engine import constraints
class NetworkConstraint(constraints.BaseCustomConstraint):
expected_exceptions = (exceptions.NeutronClientException,
expected_exceptions = (qe.NeutronClientException,
exception.EntityNotFound,
exception.PhysicalResourceNameAmbiguity)
def validate_with_client(self, client, value):
try:
neutron_client = client.client('neutron')
client.client('neutron')
except Exception:
# is not using neutron
client.client_plugin('nova').get_nova_network_id(value)
else:
neutronV20.find_resourceid_by_name_or_id(
neutron_client, 'network', value)
neutron_plugin = client.client_plugin('neutron')
neutron_plugin.find_resourceid_by_name_or_id(
'network', value, cmd_resource=None)
class PortConstraint(constraints.BaseCustomConstraint):
class NeutronConstraint(constraints.BaseCustomConstraint):
expected_exceptions = (exceptions.NeutronClientException,)
expected_exceptions = (qe.NeutronClientException,
exception.EntityNotFound)
resource_name = None
cmd_resource = None
extension = None
def validate_with_client(self, client, value):
neutron_client = client.client('neutron')
neutronV20.find_resourceid_by_name_or_id(
neutron_client, 'port', value)
neutron_plugin = client.client_plugin('neutron')
if (self.extension and
not neutron_plugin.has_extension(self.extension)):
raise exception.EntityNotFound(entity='neutron extension',
name=self.extension)
neutron_plugin.find_resourceid_by_name_or_id(
self.resource_name, value, cmd_resource=self.cmd_resource)
class RouterConstraint(constraints.BaseCustomConstraint):
expected_exceptions = (exceptions.NeutronClientException,)
def validate_with_client(self, client, value):
neutron_client = client.client('neutron')
neutronV20.find_resourceid_by_name_or_id(
neutron_client, 'router', value)
class PortConstraint(NeutronConstraint):
resource_name = 'port'
class SubnetConstraint(constraints.BaseCustomConstraint):
expected_exceptions = (exceptions.NeutronClientException,)
def validate_with_client(self, client, value):
neutron_client = client.client('neutron')
neutronV20.find_resourceid_by_name_or_id(
neutron_client, 'subnet', value)
class RouterConstraint(NeutronConstraint):
resource_name = 'router'
class SubnetPoolConstraint(constraints.BaseCustomConstraint):
expected_exceptions = (exceptions.NeutronClientException,)
def validate_with_client(self, client, value):
neutron_client = client.client('neutron')
neutronV20.find_resourceid_by_name_or_id(
neutron_client, 'subnetpool', value)
class SubnetConstraint(NeutronConstraint):
resource_name = 'subnet'
class AddressScopeConstraint(constraints.BaseCustomConstraint):
expected_exceptions = (exceptions.NeutronClientException,)
def validate_with_client(self, client, value):
neutron_client = client.client('neutron')
neutronV20.find_resourceid_by_name_or_id(
neutron_client, 'address_scope', value)
class SubnetPoolConstraint(NeutronConstraint):
resource_name = 'subnetpool'
class QoSPolicyConstraint(constraints.BaseCustomConstraint):
class AddressScopeConstraint(NeutronConstraint):
resource_name = 'address_scope'
extension = 'address-scope'
expected_exceptions = (exceptions.NeutronClientException,)
def validate_with_client(self, client, value):
neutron_client = client.client('neutron')
neutronV20.find_resourceid_by_name_or_id(
neutron_client, 'policy', value, cmd_resource='qos_policy')
class QoSPolicyConstraint(NeutronConstraint):
resource_name = 'policy'
cmd_resource = 'qos_policy'
extension = 'qos'