blob: 11a3fa5a7fdd9135ec99bd5d2d44e2703cb9d777 [file] [log] [blame]
Oleksiy Petrenkoa5eb0602018-07-26 15:12:25 +03001import logging
Oleksiy Petrenko897ec232019-02-06 13:00:41 +02002try:
3 import os_client_config
4except ImportError:
5 os_client_config = None
6from salt import exceptions
Oleksiy Petrenkoa5eb0602018-07-26 15:12:25 +03007
8log = logging.getLogger(__name__)
9
10IRONIC_VERSION_HEADER = 'X-OpenStack-Ironic-API-Version'
11ADAPTER_VERSION = '1.0'
12
13
14class IronicException(Exception):
15
16 _msg = "Ironic module exception occurred."
17
18 def __init__(self, message=None, **kwargs):
19 super(IronicException, self).__init__(message or self._msg)
20
21
22class NoIronicEndpoint(IronicException):
23 _msg = "Ironic endpoint not found in keystone catalog."
24
25
26class NoAuthPluginConfigured(IronicException):
27 _msg = ("You are using keystoneauth auth plugin that does not support "
28 "fetching endpoint list from token (noauth or admin_token).")
29
30
31class NoCredentials(IronicException):
32 _msg = "Please provide cloud name present in clouds.yaml."
33
34
35def _get_raw_client(cloud_name):
Oleksiy Petrenko897ec232019-02-06 13:00:41 +020036 if not os_client_config:
37 raise exceptions.SaltInvocationError(
38 "Cannot load os-client-config. Please check your environment "
39 "configuration.")
Oleksiy Petrenkoa5eb0602018-07-26 15:12:25 +030040 service_type = 'baremetal'
41 config = os_client_config.OpenStackConfig()
42 cloud = config.get_one_cloud(cloud_name)
43 adapter = cloud.get_session_client(service_type)
44 adapter.version = ADAPTER_VERSION
45 try:
46 access_info = adapter.session.auth.get_access(adapter.session)
47 access_info.service_catalog.get_endpoints()
48 except (AttributeError, ValueError):
49 e = NoAuthPluginConfigured()
50 log.exception('%s' % e)
51 raise e
52 return adapter
53
54
55def send(method):
56 def wrap(func):
57 def wrapped_f(*args, **kwargs):
58 cloud_name = kwargs.pop('cloud_name')
59 if not cloud_name:
60 e = NoCredentials()
61 log.error('%s' % e)
62 raise e
63 adapter = _get_raw_client(cloud_name)
64 # Remove salt internal kwargs
65 kwarg_keys = list(kwargs.keys())
66 for k in kwarg_keys:
67 if k.startswith('__'):
68 kwargs.pop(k)
69 microversion = kwargs.pop('microversion', None)
70 url, request_kwargs = func(*args, **kwargs)
71 if microversion:
72 if 'headers' not in request_kwargs:
73 request_kwargs['headers'] = {}
74 request_kwargs['headers'][IRONIC_VERSION_HEADER] = \
75 microversion
76 response = getattr(adapter, method)(url, **request_kwargs)
77 if not response.content:
78 return {}
79 try:
80 resp = response.json()
81 except ValueError:
82 resp = response.content
83 return resp
84 return wrapped_f
85 return wrap