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

Proposed by Tom Haddon
Status: Work in progress
Proposed branch: ~mthaddon/charm-k8s-ingress/+git/charm-k8s-ingress:relation-interfaces
Merge into: charm-k8s-ingress:master
Diff against target: 104 lines (+44/-3)
2 files modified
lib/charms/nginx_ingress_integrator/v0/ingress.py (+34/-2)
src/charm.py (+10/-1)
Reviewer Review Type Date Requested Status
ingress-charmers Pending
Review via email: mp+425326@code.launchpad.net

Commit message

Conform to charm-relation-interfaces for ingress

Description of the change

Conform to charm-relation-interfaces for ingress

To post a comment you must log in.
867586d... by Tom Haddon

Correct field name and variable names

Unmerged commits

867586d... by Tom Haddon

Correct field name and variable names

71ec359... by Tom Haddon

Reply to relation with URL of app

ea1b325... by Tom Haddon

Set relation data to conform to charm-relation-interfaces

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/charms/nginx_ingress_integrator/v0/ingress.py b/lib/charms/nginx_ingress_integrator/v0/ingress.py
2index fea2e50..20bc238 100644
3--- a/lib/charms/nginx_ingress_integrator/v0/ingress.py
4+++ b/lib/charms/nginx_ingress_integrator/v0/ingress.py
5@@ -66,7 +66,7 @@ LIBAPI = 0
6
7 # Increment this PATCH version before using `charmcraft publish-lib` or reset
8 # to 0 if you are raising the major API version
9-LIBPATCH = 10
10+LIBPATCH = 11
11
12 logger = logging.getLogger(__name__)
13
14@@ -91,6 +91,13 @@ OPTIONAL_INGRESS_RELATION_FIELDS = {
15 "tls-secret-name",
16 }
17
18+RELATION_INTERFACES_MAPPINGS = {
19+ "service-hostname": "host",
20+ "service-name": "name",
21+ "service-port": "port",
22+ "service-namespace": "model",
23+}
24+
25
26 class IngressAvailableEvent(EventBase):
27 pass
28@@ -119,6 +126,19 @@ class IngressRequires(Object):
29
30 self.framework.observe(charm.on["ingress"].relation_changed, self._on_relation_changed)
31
32+ # Set default values.
33+ DEFAULT_RELATION_FIELDS = {
34+ "service-namespace": self.model.name,
35+ }
36+ for k, v in DEFAULT_RELATION_FIELDS.items():
37+ if k not in config_dict or not config_dict[k]:
38+ config_dict[k] = v
39+
40+ # And now populate data for conformity with charm-relation-interfaces.
41+ for k, v in RELATION_INTERFACES_MAPPINGS.items():
42+ if k in config_dict and config_dict[k]:
43+ config_dict[v] = config_dict[k]
44+
45 self.config_dict = config_dict
46
47 def _config_dict_errors(self, update_only=False):
48@@ -127,7 +147,10 @@ class IngressRequires(Object):
49 unknown = [
50 x
51 for x in self.config_dict
52- if x not in REQUIRED_INGRESS_RELATION_FIELDS | OPTIONAL_INGRESS_RELATION_FIELDS
53+ if x
54+ not in REQUIRED_INGRESS_RELATION_FIELDS
55+ | OPTIONAL_INGRESS_RELATION_FIELDS
56+ | {v for v in RELATION_INTERFACES_MAPPINGS.values()}
57 ]
58 if unknown:
59 logger.error(
60@@ -214,6 +237,15 @@ class IngressProvides(Object):
61 "Missing fields for ingress: {}".format(", ".join(missing_fields))
62 )
63
64+ # Conform to charm-relation-interfaces.
65+ if "name" in ingress_data and "port" in ingress_data:
66+ name = ingress_data["name"]
67+ port = ingress_data["port"]
68+ else:
69+ name = ingress_data["service-name"]
70+ port = ingress_data["service-port"]
71+ event.relation.data[self.model.app]["url"] = "http://{}:{}/".format(name, port)
72+
73 # Create an event that our charm can use to decide it's okay to
74 # configure the ingress.
75 self.charm.on.ingress_available.emit()
76diff --git a/src/charm.py b/src/charm.py
77index d580aff..e27acd4 100755
78--- a/src/charm.py
79+++ b/src/charm.py
80@@ -10,6 +10,7 @@ import kubernetes.client
81 from charms.nginx_ingress_integrator.v0.ingress import (
82 IngressCharmEvents,
83 IngressProvides,
84+ RELATION_INTERFACES_MAPPINGS,
85 REQUIRED_INGRESS_RELATION_FIELDS,
86 )
87 from ops.charm import CharmBase
88@@ -75,7 +76,15 @@ class _ConfigOrRelation(object):
89 """Helper method to get data from the relation, if any."""
90 if self.relation:
91 try:
92- return self.relation.data[self.relation.app][field]
93+ # We want to prioritise relation-interfaces data if we have it.
94+ if field in RELATION_INTERFACES_MAPPINGS.values():
95+ new_field = RELATION_INTERFACES_MAPPINGS[field]
96+ try:
97+ return self.relation.data[self.relation.app][new_field]
98+ except KeyError:
99+ return self.relation.data[self.relation.app][field]
100+ else:
101+ return self.relation.data[self.relation.app][field]
102 except KeyError:
103 # Our relation isn't passing the information we're querying.
104 return None

Subscribers

People subscribed via source and target branches

to all changes: