Răsfoiți Sursa

Add Router attach/detach methods.

Tests are still missing because need to decide how to filter (and auto-extract) a public/external network for OpenStack.
Enis Afgan 9 ani în urmă
părinte
comite
89f4bacda6

+ 30 - 0
cloudbridge/cloud/interfaces/resources.py

@@ -1076,6 +1076,13 @@ class Router(CloudResource):
         """
         pass
 
+    @abstractmethod
+    def refresh(self):
+        """
+        Update this object.
+        """
+        pass
+
     @abstractproperty
     def state(self):
         """
@@ -1106,6 +1113,29 @@ class Router(CloudResource):
         """
         pass
 
+    @abstractmethod
+    def attach(self, network_id):
+        """
+        Attach this router to a network.
+
+        :type network_id: ``str``
+        :param instance: The ID of a network to which to attach this router.
+
+        :rtype: ``bool``
+        :return: ``True`` if successful.
+        """
+        pass
+
+    @abstractmethod
+    def detach(self):
+        """
+        Detach this router from a network.
+
+        :rtype: ``bool``
+        :return: ``True`` if successful.
+        """
+        pass
+
 
 class AttachmentInfo(object):
     """

+ 12 - 0
cloudbridge/cloud/providers/aws/resources.py

@@ -1048,6 +1048,10 @@ class AWSRouter(BaseRouter):
         """
         self._router.add_tag('Name', value)
 
+    def refresh(self):
+        self._router = self._provider.vpc_conn.get_all_internet_gateways(
+            [self.id])[0]
+
     @property
     def state(self):
         if self._router.attachments and \
@@ -1064,6 +1068,14 @@ class AWSRouter(BaseRouter):
     def delete(self):
         return self._provider._vpc_conn.delete_internet_gateway(self.id)
 
+    def attach(self, network_id):
+        return self._provider.vpc_conn.attach_internet_gateway(
+            self.id, network_id)
+
+    def detach(self):
+        return self._provider.vpc_conn.detach_internet_gateway(
+            self.id, self.network_id)
+
 
 class AWSLaunchConfig(BaseLaunchConfig):
 

+ 17 - 0
cloudbridge/cloud/providers/openstack/resources.py

@@ -774,6 +774,9 @@ class OpenStackRouter(BaseRouter):
     def name(self):
         return self._router.get('name', None)
 
+    def refresh(self):
+        self._router = self._provider.neutron.show_router(self.id)['router']
+
     @property
     def state(self):
         if self._router.get('external_gateway_info'):
@@ -793,6 +796,20 @@ class OpenStackRouter(BaseRouter):
         if self.id not in str(self._provider.neutron.list_routers()):
             return True
 
+    def attach(self, network_id):
+        self._router = self._provider.neutron.add_gateway_router(
+            self.id, {'network_id': network_id}).get('router', self._router)
+        if self.network_id and self.network_id == network_id:
+            return True
+        return False
+
+    def detach(self):
+        self._router = self._provider.neutron.remove_gateway_router(
+            self.id).get('router', self._router)
+        if not self.network_id:
+            return True
+        return False
+
 
 class OpenStackKeyPair(BaseKeyPair):