| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 1 | #    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 Salkeld | 70c2f28 | 2014-11-21 08:51:41 +1000 | [diff] [blame] | 13 | import os | 
 | 14 |  | 
| Rabi Mishra | e9dffe5 | 2016-02-05 14:36:58 +0530 | [diff] [blame] | 15 | from ceilometerclient import client as ceilometer_client | 
 | 16 | from cinderclient import client as cinder_client | 
| Peter Razumovsky | 2810bb5 | 2016-03-03 15:36:12 +0300 | [diff] [blame] | 17 | from heat.common.i18n import _ | 
| Rabi Mishra | e9dffe5 | 2016-02-05 14:36:58 +0530 | [diff] [blame] | 18 | from heatclient import client as heat_client | 
| Ethan Lynn | 07fac1f | 2016-05-10 23:09:51 +0800 | [diff] [blame] | 19 | from keystoneauth1 import exceptions as kc_exceptions | 
 | 20 | from keystoneauth1.identity.generic import password | 
 | 21 | from keystoneauth1 import session | 
| Rabi Mishra | e9dffe5 | 2016-02-05 14:36:58 +0530 | [diff] [blame] | 22 | from neutronclient.v2_0 import client as neutron_client | 
 | 23 | from novaclient import client as nova_client | 
 | 24 | from swiftclient import client as swift_client | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 25 |  | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 26 |  | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 27 | class KeystoneWrapperClient(object): | 
 | 28 |     """Wrapper object for keystone client | 
 | 29 |  | 
| Rabi Mishra | e9dffe5 | 2016-02-05 14:36:58 +0530 | [diff] [blame] | 30 |     This wraps keystone client, so we can encpasulate certain | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 31 |     added properties like auth_token, project_id etc. | 
 | 32 |     """ | 
 | 33 |     def __init__(self, auth_plugin, verify=True): | 
 | 34 |         self.auth_plugin = auth_plugin | 
 | 35 |         self.session = session.Session( | 
 | 36 |             auth=auth_plugin, | 
 | 37 |             verify=verify) | 
 | 38 |  | 
 | 39 |     @property | 
 | 40 |     def auth_token(self): | 
 | 41 |         return self.auth_plugin.get_token(self.session) | 
 | 42 |  | 
 | 43 |     @property | 
 | 44 |     def auth_ref(self): | 
 | 45 |         return self.auth_plugin.get_access(self.session) | 
 | 46 |  | 
 | 47 |     @property | 
 | 48 |     def project_id(self): | 
 | 49 |         return self.auth_plugin.get_project_id(self.session) | 
 | 50 |  | 
 | 51 |     def get_endpoint_url(self, service_type, region=None): | 
 | 52 |         kwargs = { | 
 | 53 |             'service_type': service_type, | 
| Ethan Lynn | 07fac1f | 2016-05-10 23:09:51 +0800 | [diff] [blame] | 54 |             'region_name': region} | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 55 |         return self.auth_ref.service_catalog.url_for(**kwargs) | 
 | 56 |  | 
 | 57 |  | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 58 | class ClientManager(object): | 
| Peter Razumovsky | f0ac958 | 2015-09-24 16:49:03 +0300 | [diff] [blame] | 59 |     """Provides access to the official python clients for calling various APIs. | 
 | 60 |  | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 61 |     Manager that provides access to the official python clients for | 
 | 62 |     calling various OpenStack APIs. | 
 | 63 |     """ | 
 | 64 |  | 
| Rabi Mishra | a30ac12 | 2015-09-29 11:47:52 +0530 | [diff] [blame] | 65 |     CINDERCLIENT_VERSION = '2' | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 66 |     HEATCLIENT_VERSION = '1' | 
| huangtianhua | 15ad532 | 2016-06-02 14:39:13 +0800 | [diff] [blame^] | 67 |     NOVA_API_VERSION = '2.1' | 
| Angus Salkeld | 406bbd5 | 2015-05-13 14:24:04 +1000 | [diff] [blame] | 68 |     CEILOMETER_VERSION = '2' | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 69 |  | 
 | 70 |     def __init__(self, conf): | 
 | 71 |         self.conf = conf | 
| Peter Razumovsky | 2810bb5 | 2016-03-03 15:36:12 +0300 | [diff] [blame] | 72 |         if self.conf.auth_url.find('/v'): | 
 | 73 |             self.v2_auth_url = self.conf.auth_url.replace('/v3', '/v2.0') | 
 | 74 |             self.auth_version = self.conf.auth_url.split('/v')[1] | 
 | 75 |         else: | 
 | 76 |             raise ValueError(_('Incorrectly specified auth_url config: no ' | 
 | 77 |                                'version found.')) | 
 | 78 |  | 
| tyagi | 39aa11a | 2016-03-07 04:47:00 -0800 | [diff] [blame] | 79 |         self.insecure = self.conf.disable_ssl_certificate_validation | 
 | 80 |         self.ca_file = self.conf.ca_file | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 81 |         self.identity_client = self._get_identity_client() | 
 | 82 |         self.orchestration_client = self._get_orchestration_client() | 
 | 83 |         self.compute_client = self._get_compute_client() | 
 | 84 |         self.network_client = self._get_network_client() | 
 | 85 |         self.volume_client = self._get_volume_client() | 
| Angus Salkeld | 4408da3 | 2015-02-03 18:53:30 +1000 | [diff] [blame] | 86 |         self.object_client = self._get_object_client() | 
| Angus Salkeld | 406bbd5 | 2015-05-13 14:24:04 +1000 | [diff] [blame] | 87 |         self.metering_client = self._get_metering_client() | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 88 |  | 
 | 89 |     def _get_orchestration_client(self): | 
| Angus Salkeld | 70c2f28 | 2014-11-21 08:51:41 +1000 | [diff] [blame] | 90 |         endpoint = os.environ.get('HEAT_URL') | 
 | 91 |         if os.environ.get('OS_NO_CLIENT_AUTH') == 'True': | 
 | 92 |             token = None | 
 | 93 |         else: | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 94 |             token = self.identity_client.auth_token | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 95 |         try: | 
| Angus Salkeld | 70c2f28 | 2014-11-21 08:51:41 +1000 | [diff] [blame] | 96 |             if endpoint is None: | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 97 |                 endpoint = self.identity_client.get_endpoint_url( | 
 | 98 |                     'orchestration', self.conf.region) | 
| Rabi Mishra | e9dffe5 | 2016-02-05 14:36:58 +0530 | [diff] [blame] | 99 |         except kc_exceptions.EndpointNotFound: | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 100 |             return None | 
 | 101 |         else: | 
| Rabi Mishra | e9dffe5 | 2016-02-05 14:36:58 +0530 | [diff] [blame] | 102 |             return heat_client.Client( | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 103 |                 self.HEATCLIENT_VERSION, | 
 | 104 |                 endpoint, | 
 | 105 |                 token=token, | 
 | 106 |                 username=self.conf.username, | 
 | 107 |                 password=self.conf.password) | 
 | 108 |  | 
 | 109 |     def _get_identity_client(self): | 
| Rabi Mishra | 1d53874 | 2016-03-21 21:09:20 +0530 | [diff] [blame] | 110 |         user_domain_name = self.conf.user_domain_name | 
 | 111 |         project_domain_name = self.conf.project_domain_name | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 112 |         kwargs = { | 
 | 113 |             'username': self.conf.username, | 
 | 114 |             'password': self.conf.password, | 
 | 115 |             'tenant_name': self.conf.tenant_name, | 
 | 116 |             'auth_url': self.conf.auth_url | 
 | 117 |         } | 
 | 118 |         # keystone v2 can't ignore domain details | 
 | 119 |         if self.auth_version == '3': | 
 | 120 |             kwargs.update({ | 
| Rabi Mishra | 1d53874 | 2016-03-21 21:09:20 +0530 | [diff] [blame] | 121 |                 'user_domain_name': user_domain_name, | 
 | 122 |                 'project_domain_name': project_domain_name}) | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 123 |         auth = password.Password(**kwargs) | 
| tyagi | 39aa11a | 2016-03-07 04:47:00 -0800 | [diff] [blame] | 124 |         if self.insecure: | 
 | 125 |             verify_cert = False | 
 | 126 |         else: | 
 | 127 |             verify_cert = self.ca_file or True | 
 | 128 |  | 
 | 129 |         return KeystoneWrapperClient(auth, verify_cert) | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 130 |  | 
 | 131 |     def _get_compute_client(self): | 
 | 132 |  | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 133 |         region = self.conf.region | 
 | 134 |  | 
 | 135 |         client_args = ( | 
 | 136 |             self.conf.username, | 
 | 137 |             self.conf.password, | 
 | 138 |             self.conf.tenant_name, | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 139 |             # novaclient can not use v3 url | 
 | 140 |             self.v2_auth_url | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 141 |         ) | 
 | 142 |  | 
 | 143 |         # Create our default Nova client to use in testing | 
| Rabi Mishra | e9dffe5 | 2016-02-05 14:36:58 +0530 | [diff] [blame] | 144 |         return nova_client.Client( | 
| huangtianhua | 15ad532 | 2016-06-02 14:39:13 +0800 | [diff] [blame^] | 145 |             self.NOVA_API_VERSION, | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 146 |             *client_args, | 
 | 147 |             service_type='compute', | 
 | 148 |             endpoint_type='publicURL', | 
 | 149 |             region_name=region, | 
 | 150 |             no_cache=True, | 
| tyagi | 39aa11a | 2016-03-07 04:47:00 -0800 | [diff] [blame] | 151 |             insecure=self.insecure, | 
 | 152 |             cacert=self.ca_file, | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 153 |             http_log_debug=True) | 
 | 154 |  | 
 | 155 |     def _get_network_client(self): | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 156 |  | 
| Rabi Mishra | e9dffe5 | 2016-02-05 14:36:58 +0530 | [diff] [blame] | 157 |         return neutron_client.Client( | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 158 |             username=self.conf.username, | 
 | 159 |             password=self.conf.password, | 
 | 160 |             tenant_name=self.conf.tenant_name, | 
 | 161 |             endpoint_type='publicURL', | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 162 |             # neutronclient can not use v3 url | 
 | 163 |             auth_url=self.v2_auth_url, | 
| tyagi | 39aa11a | 2016-03-07 04:47:00 -0800 | [diff] [blame] | 164 |             insecure=self.insecure, | 
 | 165 |             ca_cert=self.ca_file) | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 166 |  | 
 | 167 |     def _get_volume_client(self): | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 168 |         region = self.conf.region | 
 | 169 |         endpoint_type = 'publicURL' | 
| Rabi Mishra | e9dffe5 | 2016-02-05 14:36:58 +0530 | [diff] [blame] | 170 |         return cinder_client.Client( | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 171 |             self.CINDERCLIENT_VERSION, | 
 | 172 |             self.conf.username, | 
 | 173 |             self.conf.password, | 
 | 174 |             self.conf.tenant_name, | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 175 |             # cinderclient can not use v3 url | 
 | 176 |             self.v2_auth_url, | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 177 |             region_name=region, | 
 | 178 |             endpoint_type=endpoint_type, | 
| tyagi | 39aa11a | 2016-03-07 04:47:00 -0800 | [diff] [blame] | 179 |             insecure=self.insecure, | 
 | 180 |             cacert=self.ca_file, | 
| Steve Baker | 450aa7f | 2014-08-25 10:37:27 +1200 | [diff] [blame] | 181 |             http_log_debug=True) | 
| Angus Salkeld | 4408da3 | 2015-02-03 18:53:30 +1000 | [diff] [blame] | 182 |  | 
 | 183 |     def _get_object_client(self): | 
| Angus Salkeld | 4408da3 | 2015-02-03 18:53:30 +1000 | [diff] [blame] | 184 |         args = { | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 185 |             'auth_version': self.auth_version, | 
| Angus Salkeld | 4408da3 | 2015-02-03 18:53:30 +1000 | [diff] [blame] | 186 |             'tenant_name': self.conf.tenant_name, | 
 | 187 |             'user': self.conf.username, | 
 | 188 |             'key': self.conf.password, | 
 | 189 |             'authurl': self.conf.auth_url, | 
 | 190 |             'os_options': {'endpoint_type': 'publicURL'}, | 
| tyagi | 39aa11a | 2016-03-07 04:47:00 -0800 | [diff] [blame] | 191 |             'insecure': self.insecure, | 
 | 192 |             'cacert': self.ca_file, | 
| Angus Salkeld | 4408da3 | 2015-02-03 18:53:30 +1000 | [diff] [blame] | 193 |         } | 
| Rabi Mishra | e9dffe5 | 2016-02-05 14:36:58 +0530 | [diff] [blame] | 194 |         return swift_client.Connection(**args) | 
| Angus Salkeld | 406bbd5 | 2015-05-13 14:24:04 +1000 | [diff] [blame] | 195 |  | 
 | 196 |     def _get_metering_client(self): | 
| Rabi Mishra | 1d53874 | 2016-03-21 21:09:20 +0530 | [diff] [blame] | 197 |         user_domain_name = self.conf.user_domain_name | 
 | 198 |         project_domain_name = self.conf.project_domain_name | 
| Steve Baker | 5e4d5f4 | 2015-05-26 13:28:28 +1200 | [diff] [blame] | 199 |         try: | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 200 |             endpoint = self.identity_client.get_endpoint_url('metering', | 
 | 201 |                                                              self.conf.region) | 
| Rabi Mishra | e9dffe5 | 2016-02-05 14:36:58 +0530 | [diff] [blame] | 202 |         except kc_exceptions.EndpointNotFound: | 
| Steve Baker | 5e4d5f4 | 2015-05-26 13:28:28 +1200 | [diff] [blame] | 203 |             return None | 
 | 204 |         else: | 
 | 205 |             args = { | 
 | 206 |                 'username': self.conf.username, | 
 | 207 |                 'password': self.conf.password, | 
 | 208 |                 'tenant_name': self.conf.tenant_name, | 
 | 209 |                 'auth_url': self.conf.auth_url, | 
| tyagi | 39aa11a | 2016-03-07 04:47:00 -0800 | [diff] [blame] | 210 |                 'insecure': self.insecure, | 
 | 211 |                 'cacert': self.ca_file, | 
| Steve Baker | 5e4d5f4 | 2015-05-26 13:28:28 +1200 | [diff] [blame] | 212 |                 'region_name': self.conf.region, | 
 | 213 |                 'endpoint_type': 'publicURL', | 
 | 214 |                 'service_type': 'metering', | 
 | 215 |             } | 
| Rabi Mishra | 65493fb | 2016-01-29 22:23:21 +0530 | [diff] [blame] | 216 |             # ceilometerclient can't ignore domain details for | 
 | 217 |             # v2 auth_url | 
 | 218 |             if self.auth_version == '3': | 
 | 219 |                 args.update( | 
| Rabi Mishra | 1d53874 | 2016-03-21 21:09:20 +0530 | [diff] [blame] | 220 |                     {'user_domain_name': user_domain_name, | 
 | 221 |                      'project_domain_name': project_domain_name}) | 
| Angus Salkeld | 406bbd5 | 2015-05-13 14:24:04 +1000 | [diff] [blame] | 222 |  | 
| Rabi Mishra | e9dffe5 | 2016-02-05 14:36:58 +0530 | [diff] [blame] | 223 |             return ceilometer_client.Client(self.CEILOMETER_VERSION, | 
 | 224 |                                             endpoint, **args) |