mirror of
https://github.com/saltstack/salt.git
synced 2025-04-16 09:40:20 +00:00

Since "pchanges" was never supported in the state compiler, and "changes" is what these reqs always used, replacing "pchanges" with "changes" will allow those requisites to work in test mode. Conflicts: - salt/states/file.py - salt/states/linux_acl.py - salt/utils/napalm.py - tests/integration/modules/test_state.py - tests/unit/states/test_file.py
184 lines
4.8 KiB
Python
184 lines
4.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
'''
|
|
Management of OpenStack Keystone Endpoints
|
|
==========================================
|
|
|
|
.. versionadded:: 2018.3.0
|
|
|
|
:depends: shade
|
|
:configuration: see :py:mod:`salt.modules.keystoneng` for setup instructions
|
|
|
|
Example States
|
|
|
|
.. code-block:: yaml
|
|
|
|
create endpoint:
|
|
keystone_endpoint.present:
|
|
- name: public
|
|
- url: https://example.org:9292
|
|
- region: RegionOne
|
|
- service_name: glance
|
|
|
|
destroy endpoint:
|
|
keystone_endpoint.absent:
|
|
- name: public
|
|
- url: https://example.org:9292
|
|
- region: RegionOne
|
|
- service_name: glance
|
|
|
|
create multiple endpoints:
|
|
keystone_endpoint.absent:
|
|
- names:
|
|
- public
|
|
- admin
|
|
- internal
|
|
- url: https://example.org:9292
|
|
- region: RegionOne
|
|
- service_name: glance
|
|
'''
|
|
|
|
from __future__ import absolute_import, unicode_literals, print_function
|
|
|
|
__virtualname__ = 'keystone_endpoint'
|
|
|
|
|
|
def __virtual__():
|
|
if 'keystoneng.endpoint_get' in __salt__:
|
|
return __virtualname__
|
|
return (False, 'The keystoneng execution module failed to load: shade python module is not available')
|
|
|
|
|
|
def _common(ret, name, service_name, kwargs):
|
|
'''
|
|
Returns: tuple whose first element is a bool indicating success or failure
|
|
and the second element is either a ret dict for salt or an object
|
|
'''
|
|
if 'interface' not in kwargs and 'public_url' not in kwargs:
|
|
kwargs['interface'] = name
|
|
service = __salt__['keystoneng.service_get'](name_or_id=service_name)
|
|
|
|
if not service:
|
|
ret['comment'] = 'Cannot find service'
|
|
ret['result'] = False
|
|
return (False, ret)
|
|
|
|
filters = kwargs.copy()
|
|
filters.pop('enabled', None)
|
|
filters.pop('url', None)
|
|
filters['service_id'] = service.id
|
|
kwargs['service_name_or_id'] = service.id
|
|
endpoints = __salt__['keystoneng.endpoint_search'](filters=filters)
|
|
|
|
if len(endpoints) > 1:
|
|
ret['comment'] = "Multiple endpoints match criteria"
|
|
ret['result'] = False
|
|
return ret
|
|
endpoint = endpoints[0] if endpoints else None
|
|
return (True, endpoint)
|
|
|
|
|
|
def present(name, service_name, auth=None, **kwargs):
|
|
'''
|
|
Ensure an endpoint exists and is up-to-date
|
|
|
|
name
|
|
Interface name
|
|
|
|
url
|
|
URL of the endpoint
|
|
|
|
service_name
|
|
Service name or ID
|
|
|
|
region
|
|
The region name to assign the endpoint
|
|
|
|
enabled
|
|
Boolean to control if endpoint is enabled
|
|
'''
|
|
ret = {'name': name,
|
|
'changes': {},
|
|
'result': True,
|
|
'comment': ''}
|
|
|
|
kwargs = __utils__['args.clean_kwargs'](**kwargs)
|
|
|
|
__salt__['keystoneng.setup_clouds'](auth)
|
|
|
|
success, val = _, endpoint = _common(ret, name, service_name, kwargs)
|
|
if not success:
|
|
return val
|
|
|
|
if not endpoint:
|
|
if __opts__['test'] is True:
|
|
ret['result'] = None
|
|
ret['changes'] = kwargs
|
|
ret['comment'] = 'Endpoint will be created.'
|
|
return ret
|
|
|
|
# NOTE(SamYaple): Endpoints are returned as a list which can contain
|
|
# several items depending on the options passed
|
|
endpoints = __salt__['keystoneng.endpoint_create'](**kwargs)
|
|
if len(endpoints) == 1:
|
|
ret['changes'] = endpoints[0]
|
|
else:
|
|
for i, endpoint in enumerate(endpoints):
|
|
ret['changes'][i] = endpoint
|
|
ret['comment'] = 'Created endpoint'
|
|
return ret
|
|
|
|
changes = __salt__['keystoneng.compare_changes'](endpoint, **kwargs)
|
|
if changes:
|
|
if __opts__['test'] is True:
|
|
ret['result'] = None
|
|
ret['changes'] = changes
|
|
ret['comment'] = 'Endpoint will be updated.'
|
|
return ret
|
|
|
|
kwargs['endpoint_id'] = endpoint.id
|
|
__salt__['keystoneng.endpoint_update'](**kwargs)
|
|
ret['changes'].update(changes)
|
|
ret['comment'] = 'Updated endpoint'
|
|
|
|
return ret
|
|
|
|
|
|
def absent(name, service_name, auth=None, **kwargs):
|
|
'''
|
|
Ensure an endpoint does not exists
|
|
|
|
name
|
|
Interface name
|
|
|
|
url
|
|
URL of the endpoint
|
|
|
|
service_name
|
|
Service name or ID
|
|
|
|
region
|
|
The region name to assign the endpoint
|
|
'''
|
|
ret = {'name': name,
|
|
'changes': {},
|
|
'result': True,
|
|
'comment': ''}
|
|
|
|
__salt__['keystoneng.setup_clouds'](auth)
|
|
|
|
success, val = _, endpoint = _common(ret, name, service_name, kwargs)
|
|
if not success:
|
|
return val
|
|
|
|
if endpoint:
|
|
if __opts__['test'] is True:
|
|
ret['result'] = None
|
|
ret['changes'] = {'id': endpoint.id}
|
|
ret['comment'] = 'Endpoint will be deleted.'
|
|
return ret
|
|
|
|
__salt__['keystoneng.endpoint_delete'](id=endpoint.id)
|
|
ret['changes']['id'] = endpoint.id
|
|
ret['comment'] = 'Deleted endpoint'
|
|
|
|
return ret
|