Fixed bug with regards to subnet lookups.
[snaps.git] / snaps / openstack / create_router.py
index bf68347..260fc03 100644 (file)
@@ -14,7 +14,7 @@
 # limitations under the License.
 import logging
 
-from neutronclient.common.exceptions import NotFound
+from neutronclient.common.exceptions import NotFound, Unauthorized
 
 from snaps.config.router import RouterConfig
 from snaps.openstack.openstack_creator import OpenStackNetworkObject
@@ -61,23 +61,30 @@ class OpenStackRouter(OpenStackNetworkObject):
         """
         super(self.__class__, self).initialize()
 
-        self.__router = neutron_utils.get_router(
-            self._neutron, router_settings=self.router_settings)
+        try:
+            self.__router = neutron_utils.get_router(
+                self._neutron, self._keystone,
+                router_settings=self.router_settings,
+                project_name=self._os_creds.project_name)
+        except Unauthorized as e:
+            logger.warn('Unable to lookup router with name %s - %s',
+                        self.router_settings.name, e)
 
-        for internal_subnet_name in self.router_settings.internal_subnets:
-            internal_subnet = neutron_utils.get_subnet(
-                self._neutron, subnet_name=internal_subnet_name)
-            if internal_subnet:
-                self.__internal_subnets.append(internal_subnet)
-            else:
-                raise RouterCreationError(
-                    'Subnet not found with name ' + internal_subnet_name)
+        if self.__router:
+            for sub_config in self.router_settings.internal_subnets:
+                internal_subnet = self.__get_internal_subnet(sub_config)
+                if internal_subnet:
+                    self.__internal_subnets.append(internal_subnet)
+                else:
+                    raise RouterCreationError(
+                        'Subnet not found with name ' + internal_subnet.name)
 
-        for port_setting in self.router_settings.port_settings:
-            port = neutron_utils.get_port(
-                self._neutron, port_settings=port_setting)
-            if port:
-                self.__ports.append(port)
+            for port_setting in self.router_settings.port_settings:
+                port = neutron_utils.get_port(
+                    self._neutron, self._keystone, port_settings=port_setting,
+                    project_name=self._os_creds.project_name)
+                if port:
+                    self.__ports.append(port)
 
         return self.__router
 
@@ -92,9 +99,8 @@ class OpenStackRouter(OpenStackNetworkObject):
             self.__router = neutron_utils.create_router(
                 self._neutron, self._os_creds, self.router_settings)
 
-            for internal_subnet_name in self.router_settings.internal_subnets:
-                internal_subnet = neutron_utils.get_subnet(
-                    self._neutron, subnet_name=internal_subnet_name)
+            for sub_config in self.router_settings.internal_subnets:
+                internal_subnet = self.__get_internal_subnet(sub_config)
                 if internal_subnet:
                     self.__internal_subnets.append(internal_subnet)
                     if internal_subnet:
@@ -105,11 +111,12 @@ class OpenStackRouter(OpenStackNetworkObject):
                         self.__internal_router_interface = router_intf
                 else:
                     raise RouterCreationError(
-                        'Subnet not found with name ' + internal_subnet_name)
+                        'Subnet not found with name ' + internal_subnet.name)
 
             for port_setting in self.router_settings.port_settings:
                 port = neutron_utils.get_port(
-                    self._neutron, port_settings=port_setting)
+                    self._neutron, self._keystone, port_settings=port_setting,
+                    project_name=self._os_creds.project_name)
                 logger.info(
                     'Retrieved port %s for router - %s', port_setting.name,
                     self.router_settings.name)
@@ -125,9 +132,8 @@ class OpenStackRouter(OpenStackNetworkObject):
                             port_setting.name,
                             self.router_settings.name)
                         self.__ports.append(port)
-                        neutron_utils.add_interface_router(self._neutron,
-                                                           self.__router,
-                                                           port=port)
+                        neutron_utils.add_interface_router(
+                            self._neutron, self.__router, port=port)
                     else:
                         raise RouterCreationError(
                             'Error creating port with name - '
@@ -137,6 +143,27 @@ class OpenStackRouter(OpenStackNetworkObject):
             self._neutron, self.__router.id)
         return self.__router
 
+    def __get_internal_subnet(self, sub_config):
+        """
+        returns the Subnet domain object from the subnet configurator
+        :param sub_config:
+        :return:
+        """
+        if isinstance(sub_config, str):
+            return neutron_utils.get_subnet_by_name(
+                self._neutron, self._keystone,
+                subnet_name=sub_config)
+        if isinstance(sub_config, dict):
+            sub_dict = sub_config['subnet']
+            network = neutron_utils.get_network(
+                self._neutron, self._keystone,
+                network_name=sub_dict['network_name'],
+                project_name=sub_dict['project_name'])
+            if network:
+                return neutron_utils.get_subnet(
+                    self._neutron, network,
+                    subnet_name=sub_dict['subnet_name'])
+
     def clean(self):
         """
         Removes and deletes all items created in reverse order.
@@ -172,6 +199,8 @@ class OpenStackRouter(OpenStackNetworkObject):
                 pass
             self.__router = None
 
+        super(self.__class__, self).clean()
+
     def get_router(self):
         """
         Returns the OpenStack router object