Added ext_net_name into template substitution variable.
[snaps.git] / snaps / openstack / os_credentials.py
index 17f65e6..cff2dd8 100644 (file)
@@ -13,9 +13,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 from neutronclient.common.utils import str2bool
 # See the License for the specific language governing permissions and
 # limitations under the License.
 from neutronclient.common.utils import str2bool
-
+import numbers
 from snaps import file_utils
 from snaps import file_utils
-from snaps.openstack.utils import glance_utils, keystone_utils
+from snaps.openstack.utils import glance_utils, keystone_utils, cinder_utils
 
 __author__ = 'spisarski'
 
 
 __author__ = 'spisarski'
 
@@ -42,8 +42,12 @@ class OSCreds:
                                     clients
         :param heat_api_version: The OpenStack's API version to use for Heat
                                     clients
                                     clients
         :param heat_api_version: The OpenStack's API version to use for Heat
                                     clients
-        :param user_domain_id: Used for v3 APIs
-        :param project_domain_id: Used for v3 APIs
+        :param volume_api_version: The OpenStack's API version to use
+                                   for Cinder clients
+        :param user_domain_id: Used for v3 APIs (default='default')
+        :param user_domain_name: Used for v3 APIs (default='Default')
+        :param project_domain_id: Used for v3 APIs (default='default')
+        :param project_domain_name: Used for v3 APIs (default='Default')
         :param interface: Used to specify the endpoint type for keystone as
                           public, admin, internal
         :param proxy_settings: instance of os_credentials.ProxySettings class
         :param interface: Used to specify the endpoint type for keystone as
                           public, admin, internal
         :param proxy_settings: instance of os_credentials.ProxySettings class
@@ -51,6 +55,7 @@ class OSCreds:
                        is specified for https verification, or set to be False
                        to disable server certificate verification without cert
                        file
                        is specified for https verification, or set to be False
                        to disable server certificate verification without cert
                        file
+        :param region_name: the region (optional default = None)
         """
         self.username = kwargs.get('username')
         self.password = kwargs.get('password')
         """
         self.username = kwargs.get('username')
         self.password = kwargs.get('password')
@@ -82,27 +87,42 @@ class OSCreds:
         else:
             self.heat_api_version = float(kwargs['heat_api_version'])
 
         else:
             self.heat_api_version = float(kwargs['heat_api_version'])
 
-        if kwargs.get('user_domain_id') is None:
-            self.user_domain_id = 'default'
+        if kwargs.get('volume_api_version') is None:
+            self.volume_api_version = cinder_utils.VERSION_2
         else:
         else:
-            self.user_domain_id = kwargs['user_domain_id']
+            self.volume_api_version = float(
+                kwargs['volume_api_version'])
+
+        self.user_domain_id = kwargs.get('user_domain_id', 'default')
 
 
-        if kwargs.get('project_domain_id') is None:
-            self.project_domain_id = 'default'
+        if kwargs.get('user_domain_name') is None:
+            self.user_domain_name = 'Default'
         else:
         else:
-            self.project_domain_id = kwargs['project_domain_id']
+            self.user_domain_name = kwargs['user_domain_name']
+
+        self.project_domain_id = kwargs.get('project_domain_id', 'default')
+
+        if kwargs.get('project_domain_name') is None:
+            self.project_domain_name = 'Default'
+        else:
+            self.project_domain_name = kwargs['project_domain_name']
 
         if kwargs.get('interface') is None:
 
         if kwargs.get('interface') is None:
-            self.interface = 'admin'
+            self.interface = 'public'
         else:
             self.interface = kwargs['interface']
 
         else:
             self.interface = kwargs['interface']
 
-        self.cacert = kwargs.get('cacert', True)
-        if isinstance(kwargs.get('cacert'), str):
-            if file_utils.file_exists(kwargs['cacert']):
-                self.cacert = kwargs['cacert']
+        self.region_name = kwargs.get('region_name', None)
+
+        self.cacert = False
+        if kwargs.get('cacert') is not None:
+            if isinstance(kwargs.get('cacert'), str):
+                if file_utils.file_exists(kwargs['cacert']):
+                    self.cacert = kwargs['cacert']
+                else:
+                    self.cacert = str2bool(kwargs['cacert'])
             else:
             else:
-                self.cacert = str2bool(self.cacert)
+                self.cacert = kwargs['cacert']
 
         if isinstance(kwargs.get('proxy_settings'), ProxySettings):
             self.proxy_settings = kwargs.get('proxy_settings')
 
         if isinstance(kwargs.get('proxy_settings'), ProxySettings):
             self.proxy_settings = kwargs.get('proxy_settings')
@@ -116,13 +136,34 @@ class OSCreds:
             raise OSCredsError('username, password, auth_url, and project_name'
                                ' are required')
 
             raise OSCredsError('username, password, auth_url, and project_name'
                                ' are required')
 
-        auth_url_tokens = self.auth_url.split('/')
+        self.auth_url = self.__scrub_auth_url()
+
+    def __scrub_auth_url(self):
+        """
+        As the Python APIs are have more stringent requirements around how the
+        auth_url is formed than the CLI, this method will scrub any version
+        from the end of
+        :return:
+        """
+        auth_url_tokens = self.auth_url.rstrip('/').split('/')
         last_token = auth_url_tokens[len(auth_url_tokens) - 1]
         last_token = auth_url_tokens[len(auth_url_tokens) - 1]
-        if len(last_token) == 0:
-            last_token = auth_url_tokens[len(auth_url_tokens) - 2]
+        token_iters = len(auth_url_tokens)
+        if last_token.startswith('v'):
+            token_iters -= 1
+        if self.identity_api_version == keystone_utils.V2_VERSION_NUM:
+            last_token = keystone_utils.V2_VERSION_STR
+        else:
+            last_token = 'v' + str(int(self.identity_api_version))
+
+        new_url = None
+        for ctr in range(0, token_iters):
+            if new_url:
+                new_url += '/' + auth_url_tokens[ctr]
+            else:
+                new_url = auth_url_tokens[ctr]
+        new_url += '/' + last_token
 
 
-        if not last_token.startswith('v'):
-            raise OSCredsError('auth_url last toke must start with \'v\'')
+        return new_url
 
     @property
     def __str__(self):
 
     @property
     def __str__(self):
@@ -135,8 +176,13 @@ class OSCreds:
                 ', image_api_version=' + str(self.image_api_version) +
                 ', network_api_version=' + str(self.network_api_version) +
                 ', compute_api_version=' + str(self.compute_api_version) +
                 ', image_api_version=' + str(self.image_api_version) +
                 ', network_api_version=' + str(self.network_api_version) +
                 ', compute_api_version=' + str(self.compute_api_version) +
+                ', heat_api_version=' + str(self.heat_api_version) +
                 ', user_domain_id=' + str(self.user_domain_id) +
                 ', user_domain_id=' + str(self.user_domain_id) +
+                ', user_domain_name=' + str(self.user_domain_name) +
+                ', project_domain_id=' + str(self.project_domain_id) +
+                ', project_domain_name=' + str(self.project_domain_name) +
                 ', interface=' + str(self.interface) +
                 ', interface=' + str(self.interface) +
+                ', region_name=' + str(self.region_name) +
                 ', proxy_settings=' + str(self.proxy_settings) +
                 ', cacert=' + str(self.cacert))
 
                 ', proxy_settings=' + str(self.proxy_settings) +
                 ', cacert=' + str(self.cacert))
 
@@ -159,9 +205,13 @@ class ProxySettings:
         """
         self.host = kwargs.get('host')
         self.port = kwargs.get('port')
         """
         self.host = kwargs.get('host')
         self.port = kwargs.get('port')
+        if self.port and isinstance(self.port, numbers.Number):
+            self.port = str(self.port)
 
         self.https_host = kwargs.get('https_host', self.host)
         self.https_port = kwargs.get('https_port', self.port)
 
         self.https_host = kwargs.get('https_host', self.host)
         self.https_port = kwargs.get('https_port', self.port)
+        if self.https_port and isinstance(self.https_port, numbers.Number):
+            self.https_port = str(self.https_port)
 
         self.ssh_proxy_cmd = kwargs.get('ssh_proxy_cmd')
 
 
         self.ssh_proxy_cmd = kwargs.get('ssh_proxy_cmd')