Merge ~mthaddon/charm-k8s-ingress/+git/charm-k8s-ingress:upgrade-charm-ingress into charm-k8s-ingress:master

Proposed by Tom Haddon
Status: Merged
Approved by: Jon Seager
Approved revision: 11c2fa9dc3ab722fd648e777bc36473cd3fdeb7f
Merged at revision: 7e9f59efe06e84a04883ff8f2f3124acd0781e22
Proposed branch: ~mthaddon/charm-k8s-ingress/+git/charm-k8s-ingress:upgrade-charm-ingress
Merge into: charm-k8s-ingress:master
Diff against target: 78 lines (+44/-9)
1 file modified
src/charm.py (+44/-9)
Reviewer Review Type Date Requested Status
🤖 prod-jenkaas-is (community) continuous-integration Approve
ingress-charmers Pending
Review via email: mp+400467@code.launchpad.net

Commit message

Handle the upgrade-charm event, get the data from the ingress relation again

To post a comment you must log in.
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote :

This merge proposal is being monitored by mergebot. Change the status to Approved to merge.

Revision history for this message
🤖 prod-jenkaas-is (prod-jenkaas-is) wrote :

A CI job is currently in progress. A follow up comment will be added when it completes.

Revision history for this message
🤖 prod-jenkaas-is (prod-jenkaas-is) wrote :

PASSED: Continuous integration, rev:11c2fa9dc3ab722fd648e777bc36473cd3fdeb7f
https://jenkins.canonical.com/is/job/lp-charm-k8s-ingress-ci/19/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/is/job/lp-charm-test/51/
    None: https://jenkins.canonical.com/is/job/lp-update-mp/61709/

Click here to trigger a rebuild:
https://jenkins.canonical.com/is/job/lp-charm-k8s-ingress-ci/19//rebuild

review: Approve (continuous-integration)
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote :

Change successfully merged at revision 7e9f59efe06e84a04883ff8f2f3124acd0781e22

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/charm.py b/src/charm.py
2index 7a8d5dc..aed79aa 100755
3--- a/src/charm.py
4+++ b/src/charm.py
5@@ -75,29 +75,64 @@ class CharmK8SIngressCharm(CharmBase):
6 # ingress relation handling.
7 self.framework.observe(self.on["ingress"].relation_changed, self._on_ingress_relation_changed)
8
9+ self.framework.observe(self.on.upgrade_charm, self._on_upgrade_charm)
10+
11 self._stored.set_default(ingress_relation_data=dict())
12
13+ def _ingress_relation_errors(self, ingress_data):
14+ """Confirm if we have any errors in our ingress relation.
15+
16+ Return True if we have errors, or False if we don't."""
17+ missing_fields = sorted(
18+ [field for field in REQUIRED_INGRESS_RELATION_FIELDS if ingress_data.get(field) is None]
19+ )
20+
21+ if missing_fields:
22+ logger.error("Missing required data fields for ingress relation: {}".format(", ".join(missing_fields)))
23+ self.unit.status = BlockedStatus("Missing fields for ingress: {}".format(", ".join(missing_fields)))
24+ return True
25+ return False
26+
27+ def _get_ingress_relation_data(self):
28+ """Get ingress relation data, and add to StoredState."""
29+ for relations in self.model.relations.values():
30+ if relations:
31+ relation = relations[0]
32+ if len(relations) > 1:
33+ logger.warning(
34+ 'Multiple relations of type "%s" detected,'
35+ ' using only the first one (id: %s) for relation data.',
36+ relation.name,
37+ relation.id,
38+ )
39+ if relation.name == "ingress":
40+ ingress_data = dict(relation.data[relation.app].items())
41+ if self._ingress_relation_errors(ingress_data):
42+ return
43+ self._stored.ingress_relation_data = ingress_data
44+
45+ def _on_upgrade_charm(self, event):
46+ """Handle upgrade charm event."""
47+ # StoredState gets reset, so we need to resync the ingress relation
48+ # data. A config-changed event will be triggered after the upgrade-charm
49+ # to progress from there.
50+ self._get_ingress_relation_data()
51+
52 def _on_ingress_relation_changed(self, event):
53 """Handle a change to the ingress relation."""
54 if not self.unit.is_leader():
55 return
56
57- ingress_fields = {
58+ ingress_data = {
59 field: event.relation.data[event.app].get(field)
60 for field in REQUIRED_INGRESS_RELATION_FIELDS | OPTIONAL_INGRESS_RELATION_FIELDS
61 }
62
63- missing_fields = sorted(
64- [field for field in REQUIRED_INGRESS_RELATION_FIELDS if ingress_fields.get(field) is None]
65- )
66-
67- if missing_fields:
68- logger.error("Missing required data fields for ingress relation: {}".format(", ".join(missing_fields)))
69- self.unit.status = BlockedStatus("Missing fields for ingress: {}".format(", ".join(missing_fields)))
70+ if self._ingress_relation_errors(ingress_data):
71 return
72
73 # Set our relation data to stored_state.
74- self._stored.ingress_relation_data = ingress_fields
75+ self._stored.ingress_relation_data = ingress_data
76
77 # Now trigger our config_changed handler.
78 self._on_config_changed(event)

Subscribers

People subscribed via source and target branches

to all changes: