Move add_relation logic from BundleHandler up into Model
authorTim Van Steenburgh <tvansteenburgh@gmail.com>
Tue, 18 Oct 2016 11:57:44 +0000 (07:57 -0400)
committerTim Van Steenburgh <tvansteenburgh@gmail.com>
Tue, 18 Oct 2016 11:57:44 +0000 (07:57 -0400)
juju/model.py

index 49f07a9..1ed5ecd 100644 (file)
@@ -461,7 +461,7 @@ class Model(object):
                 myfunc, entity_type='application', action='add', id_='ubuntu')
 
         For more complex filtering conditions, pass a predicate function. It
-        will called with a delta as it's only argument. If the predicate
+        will be called with a delta as its only argument. If the predicate
         function returns True, the callable_ will be called.
 
         """
@@ -594,7 +594,16 @@ class Model(object):
         log.debug(
             'Adding relation %s <-> %s', relation1, relation2)
 
-        result = await app_facade.AddRelation([relation1, relation2])
+        try:
+            result = await app_facade.AddRelation([relation1, relation2])
+        except JujuAPIError as e:
+            if 'relation already exists' not in e.message:
+                raise
+            log.debug(
+                'Relation %s <-> %s already exists', relation1, relation2)
+            # TODO: if relation already exists we should return the
+            # Relation ModelEntity here
+            return None
 
         def predicate(delta):
             endpoints = {}
@@ -1214,14 +1223,8 @@ class BundleHandler(object):
             parts = endpoints[i].split(':')
             parts[0] = self.resolve(parts[0])
             endpoints[i] = ':'.join(parts)
-        try:
-            await self.app_facade.AddRelation(endpoints)
-            log.debug('Added relation %s <-> %s', *endpoints)
-        except JujuAPIError as e:
-            if 'relation already exists' not in e.message:
-                raise
-            log.debug('Relation %s <-> %s already exists', *endpoints)
-        return None
+
+        return await self.model.add_relation(*endpoints)
 
     async def deploy(self, charm, series, application, options, constraints,
                      storage, endpoint_bindings, resources):