Create neutronv2 module for ports
Co-Authored-By: Oleg Bondarev <obondarev@mirantis.com>
Change-Id: I605a50e92331cc6e7bb18ffb3b7a79d0aeae0880
diff --git a/_states/neutronv2.py b/_states/neutronv2.py
index b4fd30d..81c8fa4 100644
--- a/_states/neutronv2.py
+++ b/_states/neutronv2.py
@@ -12,7 +12,7 @@
return __salt__['neutronv2.{}'.format(fname)](*args, **kwargs)
-def _resource_present(resource, name, changeable_params, cloud_name, **kwargs):
+def _try_get_resource(resource, name, cloud_name):
try:
method_name = '{}_get_details'.format(resource)
exact_resource = _neutronv2_call(
@@ -20,35 +20,58 @@
)[resource]
except Exception as e:
if 'ResourceNotFound' in repr(e):
- try:
- method_name = '{}_create'.format(resource)
- resp = _neutronv2_call(
- method_name, name=name, cloud_name=cloud_name, **kwargs
- )
- except Exception as e:
- log.exception('Neutron {0} create failed with {1}'.
- format(resource, e))
- return _failed('create', name, resource)
- return _succeeded('create', name, resource, resp)
- elif 'MultipleResourcesFound' in repr(e):
- return _failed('find', name, resource)
+ return None
else:
raise
+ return exact_resource
+
+def _resource_present(resource, resource_name, changeable_params, cloud_name,
+ **kwargs):
+ exact_resource = None
+ try:
+ exact_resource = _try_get_resource(resource, resource_name, cloud_name)
+ if exact_resource is None:
+ # in case of rename - check if resource was already renamed
+ if kwargs.get('name') is not None and kwargs.get(
+ 'name') != resource_name:
+ exact_resource = _try_get_resource(resource,
+ kwargs.get('name'),
+ cloud_name)
+ except Exception as e:
+ if 'MultipleResourcesFound' in repr(e):
+ return _failed('find', resource_name, resource)
+ else:
+ raise
+ if exact_resource is None:
+ try:
+ method_name = '{}_create'.format(resource)
+ exact_resource_name = kwargs.pop('name', resource_name)
+ resp = _neutronv2_call(
+ method_name, name=exact_resource_name,
+ cloud_name=cloud_name, **kwargs)
+ except Exception as e:
+ log.exception('Neutron {0} create failed with {1}'.
+ format(resource, e))
+ return _failed('create', exact_resource_name, resource)
+ return _succeeded('create', exact_resource_name, resource, resp)
to_update = {}
for key in kwargs:
if key in changeable_params and (key not in exact_resource
or kwargs[key] != exact_resource[key]):
to_update[key] = kwargs[key]
- try:
- method_name = '{}_update'.format(resource)
- resp = _neutronv2_call(
- method_name, name, cloud_name=cloud_name, **to_update
- )
- except Exception as e:
- log.exception('Neutron {0} update failed with {1}'.format(resource, e))
- return _failed('update', name, resource)
- return _succeeded('update', name, resource, resp)
+ if to_update:
+ try:
+ method_name = '{}_update'.format(resource)
+ resp = _neutronv2_call(
+ method_name, resource_name, cloud_name=cloud_name, **to_update
+ )
+ except Exception as e:
+ log.exception('Neutron {0} update failed with {1}'.format(resource, e))
+ return _failed('update', resource_name, resource)
+ return _succeeded('update', resource_name, resource, resp)
+ else:
+ return _succeeded('no_changes', resource_name, resource)
def _resource_absent(resource, name, cloud_name):
@@ -237,6 +260,17 @@
return _succeeded('resources_moved', name, 'L3 agent')
+def port_present(port_name, cloud_name, **kwargs):
+ changeable = (
+ 'name', 'description', 'device_id', 'qos_policy',
+ 'allowed_address_pair', 'fixed_ip',
+ 'device_owner', 'admin_state_up', 'security_group', 'extra_dhcp_opt',
+ )
+
+ return _resource_present('port', port_name, changeable,
+ cloud_name, **kwargs)
+
+
def _succeeded(op, name, resource, changes=None):
msg_map = {
'create': '{0} {1} created',