Changes required for running CI tests (Pike pod).
[snaps.git] / snaps / openstack / os_credentials.py
1 # Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs")
2 #                    and others.  All rights reserved.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
7 #
8 #     http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 from neutronclient.common.utils import str2bool
16
17 from snaps import file_utils
18 from snaps.openstack.utils import glance_utils, keystone_utils
19
20 __author__ = 'spisarski'
21
22
23 class OSCreds:
24     """
25     Represents the credentials required to connect with OpenStack servers
26     """
27
28     def __init__(self, **kwargs):
29         """
30         Constructor
31         :param username: The user (required)
32         :param password: The user's password (required)
33         :param auth_url: The OpenStack cloud's authorization URL (required)
34         :param project_name: The project/tenant name
35         :param identity_api_version: The OpenStack's API version to use for
36                                      Keystone clients
37         :param image_api_version: The OpenStack's API version to use for Glance
38                                   clients
39         :param network_api_version: The OpenStack's API version to use for
40                                     Neutron clients
41         :param compute_api_version: The OpenStack's API version to use for Nova
42                                     clients
43         :param heat_api_version: The OpenStack's API version to use for Heat
44                                     clients
45         :param user_domain_id: Used for v3 APIs
46         :param project_domain_id: Used for v3 APIs
47         :param interface: Used to specify the endpoint type for keystone as
48                           public, admin, internal
49         :param proxy_settings: instance of os_credentials.ProxySettings class
50         :param cacert: Default to be True for http, or the certification file
51                        is specified for https verification, or set to be False
52                        to disable server certificate verification without cert
53                        file
54         """
55         self.username = kwargs.get('username')
56         self.password = kwargs.get('password')
57         self.auth_url = kwargs.get('auth_url')
58         self.project_name = kwargs.get('project_name')
59
60         if kwargs.get('identity_api_version') is None:
61             self.identity_api_version = keystone_utils.V2_VERSION_NUM
62         else:
63             self.identity_api_version = float(kwargs['identity_api_version'])
64
65         if kwargs.get('image_api_version') is None:
66             self.image_api_version = glance_utils.VERSION_2
67         else:
68             self.image_api_version = float(kwargs['image_api_version'])
69
70         if kwargs.get('network_api_version') is None:
71             self.network_api_version = 2
72         else:
73             self.network_api_version = float(kwargs['network_api_version'])
74
75         if kwargs.get('compute_api_version') is None:
76             self.compute_api_version = 2
77         else:
78             self.compute_api_version = float(kwargs['compute_api_version'])
79
80         if kwargs.get('heat_api_version') is None:
81             self.heat_api_version = 1
82         else:
83             self.heat_api_version = float(kwargs['heat_api_version'])
84
85         if kwargs.get('user_domain_id') is None:
86             self.user_domain_id = 'default'
87         else:
88             self.user_domain_id = kwargs['user_domain_id']
89
90         if kwargs.get('project_domain_id') is None:
91             self.project_domain_id = 'default'
92         else:
93             self.project_domain_id = kwargs['project_domain_id']
94
95         if kwargs.get('interface') is None:
96             self.interface = 'admin'
97         else:
98             self.interface = kwargs['interface']
99
100         self.cacert = kwargs.get('cacert', True)
101         if isinstance(kwargs.get('cacert'), str):
102             if file_utils.file_exists(kwargs['cacert']):
103                 self.cacert = kwargs['cacert']
104             else:
105                 self.cacert = str2bool(self.cacert)
106
107         if isinstance(kwargs.get('proxy_settings'), ProxySettings):
108             self.proxy_settings = kwargs.get('proxy_settings')
109         elif isinstance(kwargs.get('proxy_settings'), dict):
110             self.proxy_settings = ProxySettings(**kwargs.get('proxy_settings'))
111         else:
112             self.proxy_settings = None
113
114         if (not self.username or not self.password or not self.auth_url
115                 or not self.project_name):
116             raise OSCredsError('username, password, auth_url, and project_name'
117                                ' are required')
118
119         auth_url_tokens = self.auth_url.split('/')
120         last_token = auth_url_tokens[len(auth_url_tokens) - 1]
121         if len(last_token) == 0:
122             last_token = auth_url_tokens[len(auth_url_tokens) - 2]
123
124         if not last_token.startswith('v'):
125             raise OSCredsError('auth_url last toke must start with \'v\'')
126
127     @property
128     def __str__(self):
129         """Converts object to a string"""
130         return ('OSCreds - username=' + str(self.username) +
131                 ', password=' + str(self.password) +
132                 ', auth_url=' + str(self.auth_url) +
133                 ', project_name=' + str(self.project_name) +
134                 ', identity_api_version=' + str(self.identity_api_version) +
135                 ', image_api_version=' + str(self.image_api_version) +
136                 ', network_api_version=' + str(self.network_api_version) +
137                 ', compute_api_version=' + str(self.compute_api_version) +
138                 ', user_domain_id=' + str(self.user_domain_id) +
139                 ', interface=' + str(self.interface) +
140                 ', proxy_settings=' + str(self.proxy_settings) +
141                 ', cacert=' + str(self.cacert))
142
143
144 class ProxySettings:
145     """
146     Represents the information required for sending traffic (HTTP & SSH)
147     through a proxy
148     """
149
150     def __init__(self, **kwargs):
151         """
152         Constructor
153         :param host: the HTTP proxy host
154         :param port: the HTTP proxy port
155         :param https_host: the HTTPS proxy host (defaults to host)
156         :param https_port: the HTTPS proxy port (defaults to port)
157         :param port: the HTTP proxy port
158         :param ssh_proxy_cmd: the SSH proxy command string (optional)
159         """
160         self.host = kwargs.get('host')
161         self.port = kwargs.get('port')
162
163         self.https_host = kwargs.get('https_host', self.host)
164         self.https_port = kwargs.get('https_port', self.port)
165
166         self.ssh_proxy_cmd = kwargs.get('ssh_proxy_cmd')
167
168         if not self.host or not self.port:
169             raise ProxySettingsError('host & port are required')
170
171     def __str__(self):
172         """Converts object to a string"""
173         return 'ProxySettings - host=' + str(self.host) + \
174                ', port=' + str(self.port) + \
175                ', ssh_proxy_cmd=' + str(self.ssh_proxy_cmd)
176
177
178 class ProxySettingsError(Exception):
179     """
180     Exception to be thrown when an OSCred are invalid
181     """
182
183
184 class OSCredsError(Exception):
185     """
186     Exception to be thrown when an OSCred are invalid
187     """