blob: ac3235de72ddad146a6ac19aac7938d3abcc214a [file] [log] [blame]
Steve Baker450aa7f2014-08-25 10:37:27 +12001# Licensed under the Apache License, Version 2.0 (the "License"); you may
2# not use this file except in compliance with the License. You may obtain
3# a copy of the License at
4#
5# http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10# License for the specific language governing permissions and limitations
11# under the License.
12
Angus Salkeld70c2f282014-11-21 08:51:41 +100013import os
14
Rabi Mishrae9dffe52016-02-05 14:36:58 +053015from cinderclient import client as cinder_client
rabid69f0312017-10-26 14:52:52 +053016from gnocchiclient import client as gnocchi_client
Rabi Mishrae9dffe52016-02-05 14:36:58 +053017from heatclient import client as heat_client
Ethan Lynn07fac1f2016-05-10 23:09:51 +080018from keystoneauth1.identity.generic import password
19from keystoneauth1 import session
Rabi Mishrae9dffe52016-02-05 14:36:58 +053020from neutronclient.v2_0 import client as neutron_client
21from novaclient import client as nova_client
22from swiftclient import client as swift_client
Steve Baker450aa7f2014-08-25 10:37:27 +120023
Steve Baker450aa7f2014-08-25 10:37:27 +120024
Rabi Mishra65493fb2016-01-29 22:23:21 +053025class KeystoneWrapperClient(object):
26 """Wrapper object for keystone client
27
Rabi Mishrae9dffe52016-02-05 14:36:58 +053028 This wraps keystone client, so we can encpasulate certain
Rabi Mishra65493fb2016-01-29 22:23:21 +053029 added properties like auth_token, project_id etc.
30 """
31 def __init__(self, auth_plugin, verify=True):
32 self.auth_plugin = auth_plugin
33 self.session = session.Session(
34 auth=auth_plugin,
35 verify=verify)
36
37 @property
38 def auth_token(self):
39 return self.auth_plugin.get_token(self.session)
40
41 @property
42 def auth_ref(self):
43 return self.auth_plugin.get_access(self.session)
44
45 @property
46 def project_id(self):
47 return self.auth_plugin.get_project_id(self.session)
48
Colleen Murphy30b1fd62017-12-29 12:43:53 +010049 def get_endpoint_url(self, service_type, region=None,
50 endpoint_type='public'):
Rabi Mishra65493fb2016-01-29 22:23:21 +053051 kwargs = {
52 'service_type': service_type,
Colleen Murphy30b1fd62017-12-29 12:43:53 +010053 'region_name': region,
54 'interface': endpoint_type}
Rabi Mishra65493fb2016-01-29 22:23:21 +053055 return self.auth_ref.service_catalog.url_for(**kwargs)
56
57
Steve Baker450aa7f2014-08-25 10:37:27 +120058class ClientManager(object):
Peter Razumovskyf0ac9582015-09-24 16:49:03 +030059 """Provides access to the official python clients for calling various APIs.
60
Steve Baker450aa7f2014-08-25 10:37:27 +120061 Manager that provides access to the official python clients for
62 calling various OpenStack APIs.
63 """
64
Takashi Kajinami7ecadfb2024-07-12 11:31:21 +090065 CINDER_API_VERSION = '3'
66 GNOCCHI_API_VERSION = '1'
67 HEAT_API_VERSION = '1'
68 KEYSTONE_API_VERSION = '3'
huangtianhua15ad5322016-06-02 14:39:13 +080069 NOVA_API_VERSION = '2.1'
Steve Baker450aa7f2014-08-25 10:37:27 +120070
Steve Bakerb752e912016-08-01 22:05:37 +000071 def __init__(self, conf, admin_credentials=False):
Steve Baker450aa7f2014-08-25 10:37:27 +120072 self.conf = conf
Steve Bakerb752e912016-08-01 22:05:37 +000073 self.admin_credentials = admin_credentials
74
tyagi39aa11a2016-03-07 04:47:00 -080075 self.insecure = self.conf.disable_ssl_certificate_validation
76 self.ca_file = self.conf.ca_file
Rabi Mishra17f41de2016-05-03 11:19:41 +053077
Steve Baker450aa7f2014-08-25 10:37:27 +120078 self.identity_client = self._get_identity_client()
79 self.orchestration_client = self._get_orchestration_client()
80 self.compute_client = self._get_compute_client()
81 self.network_client = self._get_network_client()
82 self.volume_client = self._get_volume_client()
Angus Salkeld4408da32015-02-03 18:53:30 +100083 self.object_client = self._get_object_client()
rabid69f0312017-10-26 14:52:52 +053084 self.metric_client = self._get_metric_client()
Steve Baker450aa7f2014-08-25 10:37:27 +120085
Steve Bakerb752e912016-08-01 22:05:37 +000086 def _username(self):
87 if self.admin_credentials:
88 return self.conf.admin_username
89 return self.conf.username
90
91 def _password(self):
92 if self.admin_credentials:
93 return self.conf.admin_password
94 return self.conf.password
95
rabibe38c302017-04-11 09:54:07 +053096 def _project_name(self):
Steve Bakerb752e912016-08-01 22:05:37 +000097 if self.admin_credentials:
rabibe38c302017-04-11 09:54:07 +053098 return self.conf.admin_project_name
99 return self.conf.project_name
Steve Bakerb752e912016-08-01 22:05:37 +0000100
Steve Baker450aa7f2014-08-25 10:37:27 +1200101 def _get_orchestration_client(self):
Angus Salkeld70c2f282014-11-21 08:51:41 +1000102 endpoint = os.environ.get('HEAT_URL')
103 if os.environ.get('OS_NO_CLIENT_AUTH') == 'True':
rabiff3fbd52017-02-18 13:02:20 +0530104 session = None
Angus Salkeld70c2f282014-11-21 08:51:41 +1000105 else:
rabiff3fbd52017-02-18 13:02:20 +0530106 session = self.identity_client.session
107
108 return heat_client.Client(
Takashi Kajinami7ecadfb2024-07-12 11:31:21 +0900109 self.HEAT_API_VERSION,
rabiff3fbd52017-02-18 13:02:20 +0530110 endpoint,
111 session=session,
Matthias Bastian092d8bd2018-07-12 12:16:30 +0200112 endpoint_type=self.conf.endpoint_type,
rabiff3fbd52017-02-18 13:02:20 +0530113 service_type='orchestration',
114 region_name=self.conf.region,
115 username=self._username(),
116 password=self._password())
Steve Baker450aa7f2014-08-25 10:37:27 +1200117
118 def _get_identity_client(self):
rabi133ee5f2016-12-01 09:54:37 +0530119 user_domain_id = self.conf.user_domain_id
120 project_domain_id = self.conf.project_domain_id
Rabi Mishra1d538742016-03-21 21:09:20 +0530121 user_domain_name = self.conf.user_domain_name
122 project_domain_name = self.conf.project_domain_name
Rabi Mishra65493fb2016-01-29 22:23:21 +0530123 kwargs = {
Steve Bakerb752e912016-08-01 22:05:37 +0000124 'username': self._username(),
125 'password': self._password(),
rabibe38c302017-04-11 09:54:07 +0530126 'project_name': self._project_name(),
Takashi Kajinami7ecadfb2024-07-12 11:31:21 +0900127 'auth_url': self.conf.auth_url,
128 'user_domain_id': user_domain_id,
129 'user_domain_name': user_domain_name,
130 'project_domain_id': project_domain_id,
131 'project_domain_name': project_domain_name
Rabi Mishra65493fb2016-01-29 22:23:21 +0530132 }
Rabi Mishra65493fb2016-01-29 22:23:21 +0530133 auth = password.Password(**kwargs)
tyagi39aa11a2016-03-07 04:47:00 -0800134 if self.insecure:
135 verify_cert = False
136 else:
137 verify_cert = self.ca_file or True
138
139 return KeystoneWrapperClient(auth, verify_cert)
Steve Baker450aa7f2014-08-25 10:37:27 +1200140
141 def _get_compute_client(self):
Steve Baker450aa7f2014-08-25 10:37:27 +1200142 # Create our default Nova client to use in testing
Rabi Mishrae9dffe52016-02-05 14:36:58 +0530143 return nova_client.Client(
huangtianhua15ad5322016-06-02 14:39:13 +0800144 self.NOVA_API_VERSION,
Rabi Mishra17f41de2016-05-03 11:19:41 +0530145 session=self.identity_client.session,
Steve Baker450aa7f2014-08-25 10:37:27 +1200146 service_type='compute',
Colleen Murphy30b1fd62017-12-29 12:43:53 +0100147 endpoint_type=self.conf.endpoint_type,
rabi613f8152017-02-14 18:59:15 +0530148 region_name=self.conf.region,
rabi530626f2017-01-20 07:53:38 +0530149 os_cache=False,
Steve Baker450aa7f2014-08-25 10:37:27 +1200150 http_log_debug=True)
151
152 def _get_network_client(self):
Steve Baker450aa7f2014-08-25 10:37:27 +1200153
Rabi Mishrae9dffe52016-02-05 14:36:58 +0530154 return neutron_client.Client(
Rabi Mishra17f41de2016-05-03 11:19:41 +0530155 session=self.identity_client.session,
rabi613f8152017-02-14 18:59:15 +0530156 service_type='network',
157 region_name=self.conf.region,
Colleen Murphy30b1fd62017-12-29 12:43:53 +0100158 endpoint_type=self.conf.endpoint_type)
Steve Baker450aa7f2014-08-25 10:37:27 +1200159
160 def _get_volume_client(self):
Rabi Mishrae9dffe52016-02-05 14:36:58 +0530161 return cinder_client.Client(
Takashi Kajinami7ecadfb2024-07-12 11:31:21 +0900162 self.CINDER_API_VERSION,
Rabi Mishra17f41de2016-05-03 11:19:41 +0530163 session=self.identity_client.session,
Colleen Murphy30b1fd62017-12-29 12:43:53 +0100164 endpoint_type=self.conf.endpoint_type,
rabi613f8152017-02-14 18:59:15 +0530165 region_name=self.conf.region,
Steve Baker450aa7f2014-08-25 10:37:27 +1200166 http_log_debug=True)
Angus Salkeld4408da32015-02-03 18:53:30 +1000167
168 def _get_object_client(self):
Angus Salkeld4408da32015-02-03 18:53:30 +1000169 args = {
Takashi Kajinami7ecadfb2024-07-12 11:31:21 +0900170 'auth_version': self.KEYSTONE_API_VERSION,
rabi613f8152017-02-14 18:59:15 +0530171 'session': self.identity_client.session,
Pavlo Shchelokovskyy01ba7fd2018-06-08 14:39:18 +0300172 'cacert': self.ca_file,
173 'insecure': self.insecure,
Colleen Murphy30b1fd62017-12-29 12:43:53 +0100174 'os_options': {'endpoint_type': self.conf.endpoint_type,
rabi613f8152017-02-14 18:59:15 +0530175 'region_name': self.conf.region,
176 'service_type': 'object-store'},
Angus Salkeld4408da32015-02-03 18:53:30 +1000177 }
Rabi Mishrae9dffe52016-02-05 14:36:58 +0530178 return swift_client.Connection(**args)
Angus Salkeld406bbd52015-05-13 14:24:04 +1000179
rabid69f0312017-10-26 14:52:52 +0530180 def _get_metric_client(self):
181
Colleen Murphy30b1fd62017-12-29 12:43:53 +0100182 adapter_options = {'interface': self.conf.endpoint_type,
rabid69f0312017-10-26 14:52:52 +0530183 'region_name': self.conf.region}
184 args = {
185 'session': self.identity_client.session,
186 'adapter_options': adapter_options
187 }
Takashi Kajinami7ecadfb2024-07-12 11:31:21 +0900188 return gnocchi_client.Client(version=self.GNOCCHI_API_VERSION,
rabid69f0312017-10-26 14:52:52 +0530189 **args)