diff --git a/src-docs/charm.py.md b/src-docs/charm.py.md index 44d3f51f..3623e8c9 100644 --- a/src-docs/charm.py.md +++ b/src-docs/charm.py.md @@ -10,7 +10,6 @@ Charm for Discourse on kubernetes. - **DEFAULT_RELATION_NAME** - **DATABASE_NAME** - **DISCOURSE_PATH** -- **THROTTLE_LEVELS** - **LOG_PATHS** - **PROMETHEUS_PORT** - **REQUIRED_S3_SETTINGS** diff --git a/src/charm.py b/src/charm.py index 57e9390f..52228db7 100755 --- a/src/charm.py +++ b/src/charm.py @@ -390,16 +390,22 @@ def _get_redis_relation_data(self) -> typing.Tuple[str, int]: Raises: MissingRedisRelationDataError if the some of redis relation data is malformed/missing """ - relation_data = self.redis.relation_data - if not relation_data: + relation = self.model.get_relation(self.redis.relation_name) + if not relation: raise MissingRedisRelationDataError("No redis relation data") + relation_app_data = relation.data[relation.app] + relation_unit_data = self.redis.relation_data try: - redis_hostname = str(relation_data["hostname"]) - redis_port = int(relation_data["port"]) + redis_hostname = str( + relation_app_data["leader-host"] + if relation_app_data.get("leader-host") + else relation_unit_data["hostname"] + ) + redis_port = int(relation_unit_data["port"]) except (KeyError, ValueError) as exc: raise MissingRedisRelationDataError( - "Wrong hostname or port in Redis relation" + "Either 'leader-host' or 'hostname' and 'ports' are mandatory" ) from exc logger.debug( diff --git a/tests/unit/helpers.py b/tests/unit/helpers.py index 1d352ae2..72b86d15 100644 --- a/tests/unit/helpers.py +++ b/tests/unit/helpers.py @@ -109,7 +109,7 @@ def add_postgres_relation(harness): ) -def add_redis_relation(harness, relation_data=None): +def add_redis_relation(harness, relation_data=None, app_data=None): """Add redis relation and relation data to the charm. Args: @@ -117,7 +117,11 @@ def add_redis_relation(harness, relation_data=None): Returns: the same harness instance with an added relation """ - redis_relation_id = harness.add_relation("redis", "redis") + redis_relation_id = harness.add_relation( + "redis", + "redis", + app_data={"leader-host": "redis-host"} if app_data is None else app_data, + ) harness.add_relation_unit(redis_relation_id, "redis/0") # We need to bypass protected access to inject the relation data # pylint: disable=protected-access diff --git a/tests/unit/test_charm.py b/tests/unit/test_charm.py index b9486b09..4bba490c 100644 --- a/tests/unit/test_charm.py +++ b/tests/unit/test_charm.py @@ -694,46 +694,58 @@ def test_is_database_relation_ready(relation_data, should_be_ready): @pytest.mark.parametrize( - "relation_data, should_be_ready", + "relation_data, app_data, should_be_ready", [ ( {"hostname": "redis-host", "port": "1010"}, + {"leader-host": "redis-host"}, + True, + ), + ( + {"hostname": "redis-host", "port": "1010"}, + {}, True, ), ( {"hostname": "redis-host", "port": "0"}, + {"leader-host": ""}, False, ), ( {"hostname": "", "port": "1010"}, + {"leader-host": ""}, False, ), ( {"hostname": "redis-host"}, + {}, False, ), ( + {}, {}, False, ), ( {"port": "6379"}, + {}, False, ), ( {"hostname": "redis-port"}, + {}, False, ), ], ) -def test_is_redis_relation_ready(relation_data, should_be_ready): +def test_is_redis_relation_ready(relation_data, app_data, should_be_ready): """ arrange: given a deployed discourse charm and some relation data act: add the redis relation to the charm assert: the charm should wait for some correct relation data """ harness = helpers.start_harness(with_postgres=True, with_redis=False) - helpers.add_redis_relation(harness, relation_data) + helpers.add_redis_relation(harness, relation_data, app_data) assert should_be_ready == harness.charm._are_relations_ready() diff --git a/tox.ini b/tox.ini index 84555769..18595763 100644 --- a/tox.ini +++ b/tox.ini @@ -33,6 +33,7 @@ commands = [testenv:lint] description = Check code against coding style standards +basepython = py310 deps = black boto3