Skip to content

Commit c52b723

Browse files
committed
Fix bundle deploy add relation idempotency
1 parent 9aaa2ca commit c52b723

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

juju/bundle.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,11 @@ async def run(self, context):
583583
ep1 = context.resolveRelation(self.endpoint1)
584584
ep2 = context.resolveRelation(self.endpoint2)
585585

586+
existing = [rel for rel in context.model.relations if rel.matches(ep1, ep2)]
587+
if existing:
588+
log.info('Skipping %s <-> %s; already related', ep1, ep2)
589+
return existing[0]
590+
586591
log.info('Relating %s <-> %s', ep1, ep2)
587592
return await context.model.add_relation(ep1, ep2)
588593

tests/unit/test_bundle.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,19 +416,32 @@ async def test_run(self, event_loop):
416416
change = AddRelationChange(1, [], params={"endpoint1": "endpoint1",
417417
"endpoint2": "endpoint2"})
418418

419+
rel1 = mock.Mock(name="rel1", **{"matches.return_value": False})
420+
rel2 = mock.Mock(name="rel2", **{"matches.return_value": True})
421+
419422
model = mock.Mock()
420-
model.add_relation = base.AsyncMock(return_value="relation1")
423+
model.add_relation = base.AsyncMock(return_value=rel2)
421424

422425
context = mock.Mock()
423426
context.resolveRelation = mock.Mock(side_effect=['endpoint_1', 'endpoint_2'])
424427
context.model = model
428+
model.relations = [rel1]
425429

426430
result = await change.run(context)
427-
assert result == "relation1"
431+
assert result is rel2
428432

429433
model.add_relation.assert_called_once()
430434
model.add_relation.assert_called_with("endpoint_1", "endpoint_2")
431435

436+
# confirm that it's idempotent
437+
context.resolveRelation.side_effect = ['endpoint_1', 'endpoint_2']
438+
model.add_relation.reset_mock()
439+
model.add_relation.return_value = None
440+
model.relations = [rel1, rel2]
441+
result = await change.run(context)
442+
assert result is rel2
443+
assert not model.add_relation.called
444+
432445

433446
class TestAddUnitChange(unittest.TestCase):
434447

0 commit comments

Comments
 (0)