Просмотр исходного кода

Update OpenStack Router svc and resource to use the OS SDK

xref #79
Enis Afgan 7 лет назад
Родитель
Сommit
85987227af

+ 25 - 28
cloudbridge/cloud/providers/openstack/resources.py

@@ -922,8 +922,8 @@ class OpenStackNetwork(BaseNetwork):
             # pylint:disable=protected-access
             self._network = network._network
         else:
-            # subnet no longer exists
-            self._network.state = NetworkState.UNKNOWN
+            # Network no longer exists
+            self._network = {}
 
     @property
     def gateways(self):
@@ -1065,7 +1065,7 @@ class OpenStackRouter(BaseRouter):
 
     @property
     def id(self):
-        return self._router.get('id', None)
+        return getattr(self._router, 'id', None)
 
     @property
     def name(self):
@@ -1073,7 +1073,7 @@ class OpenStackRouter(BaseRouter):
 
     @property
     def label(self):
-        return self._router.get('name', None)
+        return self._router.name
 
     @label.setter
     def label(self, value):  # pylint:disable=arguments-differ
@@ -1081,43 +1081,39 @@ class OpenStackRouter(BaseRouter):
         Set the router label.
         """
         self.assert_valid_resource_label(value)
-        self._provider.neutron.update_router(
-            self.id, {'router': {'name': value or ""}})
-        self.refresh()
+        self._router = self._provider.os_conn.update_router(self.id, value)
 
     def refresh(self):
-        self._router = self._provider.neutron.show_router(self.id)['router']
+        self._router = self._provider.os_conn.get_router(self.id)
 
     @property
     def state(self):
-        if self._router.get('external_gateway_info'):
+        if self._router.external_gateway_info:
             return RouterState.ATTACHED
         return RouterState.DETACHED
 
     @property
     def network_id(self):
-        ports = self._provider.neutron.list_ports(device_id=self.id)
-        if ports.get('ports'):
-            port = ports.get('ports')[0]
-            return port.get('network_id')
+        ports = self._provider.os_conn.list_ports(
+            filters={'device_id': self.id})
+        if ports:
+            return ports[0].network_id
         return None
 
     def delete(self):
-        self._provider.neutron.delete_router(self.id)
+        self._provider.os_conn.delete_router(self.id)
 
     def attach_subnet(self, subnet):
-        router_interface = {'subnet_id': subnet.id}
-        ret = self._provider.neutron.add_interface_router(
-            self.id, router_interface)
+        ret = self._provider.os_conn.add_router_interface(
+            self._router.toDict(), subnet.id)
         if subnet.id in ret.get('subnet_ids', ""):
             return True
         return False
 
     def detach_subnet(self, subnet):
-        router_interface = {'subnet_id': subnet.id}
-        ret = self._provider.neutron.remove_interface_router(
-            self.id, router_interface)
-        if subnet.id in ret.get('subnet_ids', ""):
+        ret = self._provider.os_conn.remove_router_interface(
+            self._router.toDict(), subnet.id)
+        if not ret or subnet.id not in ret.get('subnet_ids', ""):
             return True
         return False
 
@@ -1127,20 +1123,21 @@ class OpenStackRouter(BaseRouter):
         # associated with the current router to find a list of subnets
         # associated with it.
         subnets = []
-        for prt in self._provider.neutron.list_ports(
-                device_id=self.id).get('ports'):
-            for fixed_ip in prt.get('fixed_ips'):
+        for port in self._provider.os_conn.list_ports(
+                filters={'device_id': self.id}):
+            for fixed_ip in port.fixed_ips:
                 subnets.append(self._provider.networking.subnets.get(
                     fixed_ip.get('subnet_id')))
         return subnets
 
     def attach_gateway(self, gateway):
-        self._provider.neutron.add_gateway_router(
-            self.id, {'network_id': gateway.id})
+        self._provider.os_conn.update_router(
+            self.id, ext_gateway_net_id=gateway.id)
 
     def detach_gateway(self, gateway):
-        self._provider.neutron.remove_gateway_router(
-            self.id).get('router', self._router)
+        # TODO: OpenStack SDK Connection object doesn't appear to have a method
+        # for detaching/clearing the external gateway.
+        self._provider.neutron.remove_gateway_router(self.id)
 
 
 class OpenStackInternetGateway(BaseInternetGateway):

+ 6 - 14
cloudbridge/cloud/providers/openstack/services.py

@@ -905,11 +905,11 @@ class OpenStackRouterService(BaseRouterService):
 
     def get(self, router_id):
         log.debug("Getting OpenStack Router with the id: %s", router_id)
-        router = (r for r in self if r.id == router_id)
-        return next(router, None)
+        router = self.provider.os_conn.get_router(router_id)
+        return OpenStackRouter(self.provider, router) if router else None
 
     def list(self, limit=None, marker=None):
-        routers = self.provider.neutron.list_routers().get('routers')
+        routers = self.provider.os_conn.list_routers()
         os_routers = [OpenStackRouter(self.provider, r) for r in routers]
         return ClientPagedResultList(self.provider, os_routers, limit=limit,
                                      marker=marker)
@@ -921,16 +921,8 @@ class OpenStackRouterService(BaseRouterService):
         return ClientPagedResultList(self._provider, list(matches))
 
     def create(self, label, network):
-        """
-        ``network`` is not used by OpenStack.
-
-        However, the API seems to indicate it is a (required) param?!
-        https://developer.openstack.org/api-ref/networking/v2/
-            ?expanded=delete-router-detail,create-router-detail#create-router
-        """
+        """Parameter ``network`` is not used by OpenStack."""
         log.debug("Creating OpenStack Router with the label: %s", label)
         OpenStackRouter.assert_valid_resource_label(label)
-
-        body = {'router': {'name': label}} if label else None
-        router = self.provider.neutron.create_router(body)
-        return OpenStackRouter(self.provider, router.get('router'))
+        router = self.provider.os_conn.create_router(name=label)
+        return OpenStackRouter(self.provider, router)