2 # Copyright 2021 Canonical Ltd.
4 # Licensed under the Apache License, Version 2.0 (the "License"); you may
5 # not use this file except in compliance with the License. You may obtain
6 # a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 # License for the specific language governing permissions and limitations
16 # For those usages not covered by the Apache License, Version 2.0 please
17 # contact: legal@canonical.com
19 # To get in touch with the maintainers, please contact:
20 # osm-charmers@lists.launchpad.net
24 from typing
import NoReturn
27 from charm
import PolCharm
28 from ops
.model
import ActiveStatus
, BlockedStatus
29 from ops
.testing
import Harness
32 class TestCharm(unittest
.TestCase
):
33 """Pol Charm unit tests."""
35 def setUp(self
) -> NoReturn
:
37 self
.image_info
= sys
.modules
["oci_image"].OCIImageResource().fetch()
38 self
.harness
= Harness(PolCharm
)
39 self
.harness
.set_leader(is_leader
=True)
45 self
.harness
.update_config(self
.config
)
47 def test_config_changed_no_relations(
50 """Test ingress resources without HTTP."""
52 self
.harness
.charm
.on
.config_changed
.emit()
55 self
.assertIsInstance(self
.harness
.charm
.unit
.status
, BlockedStatus
)
58 relation
in self
.harness
.charm
.unit
.status
.message
59 for relation
in ["mongodb", "kafka"]
63 def test_config_changed_non_leader(
66 """Test ingress resources without HTTP."""
67 self
.harness
.set_leader(is_leader
=False)
68 self
.harness
.charm
.on
.config_changed
.emit()
71 self
.assertIsInstance(self
.harness
.charm
.unit
.status
, ActiveStatus
)
73 def test_with_relations_and_mongodb_config(
76 "Test with relations and mongodb config (internal)"
77 self
.initialize_mysql_relation()
78 self
.initialize_kafka_relation()
79 self
.initialize_mongo_config()
81 self
.assertNotIsInstance(self
.harness
.charm
.unit
.status
, BlockedStatus
)
83 def test_with_relations(
86 "Test with relations (internal)"
87 self
.initialize_kafka_relation()
88 self
.initialize_mongo_relation()
89 self
.initialize_mysql_relation()
91 self
.assertNotIsInstance(self
.harness
.charm
.unit
.status
, BlockedStatus
)
93 def test_exception_mongodb_relation_and_config(
96 "Test with relation and config for Mongodb. Must fail"
97 self
.initialize_mongo_relation()
98 self
.initialize_mongo_config()
100 self
.assertIsInstance(self
.harness
.charm
.unit
.status
, BlockedStatus
)
102 def test_mysql_config_success(self
):
103 self
.initialize_kafka_relation()
104 self
.initialize_mongo_relation()
105 self
.initialize_mysql_config()
107 self
.assertNotIsInstance(self
.harness
.charm
.unit
.status
, BlockedStatus
)
109 def test_mysql_config_wrong_value(self
):
110 self
.initialize_kafka_relation()
111 self
.initialize_mongo_relation()
112 self
.initialize_mysql_config(uri
="wrong_uri")
114 self
.assertIsInstance(self
.harness
.charm
.unit
.status
, BlockedStatus
)
116 "mysql_uri is not properly formed",
117 self
.harness
.charm
.unit
.status
.message
,
120 def test_mysql_config_and_relation(self
):
121 self
.initialize_mysql_relation()
122 self
.initialize_mysql_config()
124 self
.assertIsInstance(self
.harness
.charm
.unit
.status
, BlockedStatus
)
125 # import pdb; pdb.set_trace()
127 "Mysql data cannot be provided via config and relation",
128 self
.harness
.charm
.unit
.status
.message
,
131 def initialize_kafka_relation(self
):
132 kafka_relation_id
= self
.harness
.add_relation("kafka", "kafka")
133 self
.harness
.add_relation_unit(kafka_relation_id
, "kafka/0")
134 self
.harness
.update_relation_data(
135 kafka_relation_id
, "kafka/0", {"host": "kafka", "port": 9092}
138 def initialize_mongo_config(self
):
139 self
.harness
.update_config({"mongodb_uri": "mongodb://mongo:27017"})
141 def initialize_mongo_relation(self
):
142 mongodb_relation_id
= self
.harness
.add_relation("mongodb", "mongodb")
143 self
.harness
.add_relation_unit(mongodb_relation_id
, "mongodb/0")
144 self
.harness
.update_relation_data(
147 {"connection_string": "mongodb://mongo:27017"},
150 def initialize_mysql_config(self
, uri
=None):
151 self
.harness
.update_config(
152 {"mysql_uri": uri
or "mysql://user:pass@mysql-host:3306/database"}
155 def initialize_mysql_relation(self
):
156 mongodb_relation_id
= self
.harness
.add_relation("mysql", "mysql")
157 self
.harness
.add_relation_unit(mongodb_relation_id
, "mysql/0")
158 self
.harness
.update_relation_data(
167 "root_password": "root_password",
172 if __name__
== "__main__":
176 # class TestCharm(unittest.TestCase):
177 # """POL Charm unit tests."""
179 # def setUp(self) -> NoReturn:
181 # self.harness = Harness(PolCharm)
182 # self.harness.set_leader(is_leader=True)
183 # self.harness.begin()
185 # def test_on_start_without_relations(self) -> NoReturn:
186 # """Test installation without any relation."""
187 # self.harness.charm.on.start.emit()
190 # self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
192 # # Verifying status message
193 # self.assertGreater(len(self.harness.charm.unit.status.message), 0)
195 # self.harness.charm.unit.status.message.startswith("Waiting for ")
197 # self.assertIn("kafka", self.harness.charm.unit.status.message)
198 # self.assertIn("mongodb", self.harness.charm.unit.status.message)
199 # self.assertTrue(self.harness.charm.unit.status.message.endswith(" relations"))
201 # def test_on_start_with_relations(self) -> NoReturn:
202 # """Test deployment without keystone."""
203 # expected_result = {
208 # "imageDetails": self.harness.charm.image.fetch(),
209 # "imagePullPolicy": "Always",
213 # "containerPort": 80,
218 # "ALLOW_ANONYMOUS_LOGIN": "yes",
219 # "OSMPOL_GLOBAL_LOGLEVEL": "INFO",
220 # "OSMPOL_MESSAGE_HOST": "kafka",
221 # "OSMPOL_MESSAGE_DRIVER": "kafka",
222 # "OSMPOL_MESSAGE_PORT": 9092,
223 # "OSMPOL_DATABASE_DRIVER": "mongo",
224 # "OSMPOL_DATABASE_URI": "mongodb://mongo:27017",
228 # "kubernetesResources": {"ingressResources": []},
231 # self.harness.charm.on.start.emit()
233 # # Check if kafka datastore is initialized
234 # self.assertIsNone(self.harness.charm.state.message_host)
235 # self.assertIsNone(self.harness.charm.state.message_port)
237 # # Check if mongodb datastore is initialized
238 # self.assertIsNone(self.harness.charm.state.database_uri)
240 # # Initializing the kafka relation
241 # kafka_relation_id = self.harness.add_relation("kafka", "kafka")
242 # self.harness.add_relation_unit(kafka_relation_id, "kafka/0")
243 # self.harness.update_relation_data(
244 # kafka_relation_id, "kafka/0", {"host": "kafka", "port": 9092}
247 # # Initializing the mongo relation
248 # mongodb_relation_id = self.harness.add_relation("mongodb", "mongodb")
249 # self.harness.add_relation_unit(mongodb_relation_id, "mongodb/0")
250 # self.harness.update_relation_data(
251 # mongodb_relation_id,
253 # {"connection_string": "mongodb://mongo:27017"},
256 # # Checking if kafka data is stored
257 # self.assertEqual(self.harness.charm.state.message_host, "kafka")
258 # self.assertEqual(self.harness.charm.state.message_port, 9092)
260 # # Checking if mongodb data is stored
261 # self.assertEqual(self.harness.charm.state.database_uri, "mongodb://mongo:27017")
264 # self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus)
266 # pod_spec, _ = self.harness.get_pod_spec()
268 # self.assertDictEqual(expected_result, pod_spec)
270 # def test_on_kafka_unit_relation_changed(self) -> NoReturn:
271 # """Test to see if kafka relation is updated."""
272 # self.harness.charm.on.start.emit()
274 # self.assertIsNone(self.harness.charm.state.message_host)
275 # self.assertIsNone(self.harness.charm.state.message_port)
277 # relation_id = self.harness.add_relation("kafka", "kafka")
278 # self.harness.add_relation_unit(relation_id, "kafka/0")
279 # self.harness.update_relation_data(
280 # relation_id, "kafka/0", {"host": "kafka", "port": 9092}
283 # self.assertEqual(self.harness.charm.state.message_host, "kafka")
284 # self.assertEqual(self.harness.charm.state.message_port, 9092)
287 # self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
289 # # Verifying status message
290 # self.assertGreater(len(self.harness.charm.unit.status.message), 0)
292 # self.harness.charm.unit.status.message.startswith("Waiting for ")
294 # self.assertNotIn("kafka", self.harness.charm.unit.status.message)
295 # self.assertIn("mongodb", self.harness.charm.unit.status.message)
296 # self.assertTrue(self.harness.charm.unit.status.message.endswith(" relation"))
298 # def test_on_mongodb_unit_relation_changed(self) -> NoReturn:
299 # """Test to see if mongodb relation is updated."""
300 # self.harness.charm.on.start.emit()
302 # self.assertIsNone(self.harness.charm.state.database_uri)
304 # relation_id = self.harness.add_relation("mongodb", "mongodb")
305 # self.harness.add_relation_unit(relation_id, "mongodb/0")
306 # self.harness.update_relation_data(
307 # relation_id, "mongodb/0", {"connection_string": "mongodb://mongo:27017"}
310 # self.assertEqual(self.harness.charm.state.database_uri, "mongodb://mongo:27017")
313 # self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
315 # # Verifying status message
316 # self.assertGreater(len(self.harness.charm.unit.status.message), 0)
318 # self.harness.charm.unit.status.message.startswith("Waiting for ")
320 # self.assertIn("kafka", self.harness.charm.unit.status.message)
321 # self.assertNotIn("mongodb", self.harness.charm.unit.status.message)
322 # self.assertTrue(self.harness.charm.unit.status.message.endswith(" relation"))
325 # if __name__ == "__main__":