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:
@@ -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.
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user