Adding manual external DB URI config
[osm/devops.git] / installers / charm / pol / tests / test_charm.py
1 #!/usr/bin/env python3
2 # Copyright 2021 Canonical Ltd.
3 #
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
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
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
14 # under the License.
15 #
16 # For those usages not covered by the Apache License, Version 2.0 please
17 # contact: legal@canonical.com
18 #
19 # To get in touch with the maintainers, please contact:
20 # osm-charmers@lists.launchpad.net
21 ##
22
23 import sys
24 from typing import NoReturn
25 import unittest
26
27 from charm import PolCharm
28 from ops.model import ActiveStatus, BlockedStatus
29 from ops.testing import Harness
30
31
32 class TestCharm(unittest.TestCase):
33 """Pol Charm unit tests."""
34
35 def setUp(self) -> NoReturn:
36 """Test setup"""
37 self.image_info = sys.modules["oci_image"].OCIImageResource().fetch()
38 self.harness = Harness(PolCharm)
39 self.harness.set_leader(is_leader=True)
40 self.harness.begin()
41 self.config = {
42 "log_level": "INFO",
43 "mongodb_uri": "",
44 }
45 self.harness.update_config(self.config)
46
47 def test_config_changed_no_relations(
48 self,
49 ) -> NoReturn:
50 """Test ingress resources without HTTP."""
51
52 self.harness.charm.on.config_changed.emit()
53
54 # Assertions
55 self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
56 self.assertTrue(
57 all(
58 relation in self.harness.charm.unit.status.message
59 for relation in ["mongodb", "kafka"]
60 )
61 )
62
63 def test_config_changed_non_leader(
64 self,
65 ) -> NoReturn:
66 """Test ingress resources without HTTP."""
67 self.harness.set_leader(is_leader=False)
68 self.harness.charm.on.config_changed.emit()
69
70 # Assertions
71 self.assertIsInstance(self.harness.charm.unit.status, ActiveStatus)
72
73 def test_with_relations_and_mongodb_config(
74 self,
75 ) -> NoReturn:
76 "Test with relations and mongodb config (internal)"
77 self.initialize_kafka_relation()
78 self.initialize_mongo_config()
79 # Verifying status
80 self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus)
81
82 def test_with_relations(
83 self,
84 ) -> NoReturn:
85 "Test with relations (internal)"
86 self.initialize_kafka_relation()
87 self.initialize_mongo_relation()
88 # Verifying status
89 self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus)
90
91 def test_exception_mongodb_relation_and_config(
92 self,
93 ) -> NoReturn:
94 "Test with relation and config for Mongodb. Must fail"
95 self.initialize_mongo_relation()
96 self.initialize_mongo_config()
97 # Verifying status
98 self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
99
100 def initialize_kafka_relation(self):
101 kafka_relation_id = self.harness.add_relation("kafka", "kafka")
102 self.harness.add_relation_unit(kafka_relation_id, "kafka/0")
103 self.harness.update_relation_data(
104 kafka_relation_id, "kafka/0", {"host": "kafka", "port": 9092}
105 )
106
107 def initialize_mongo_config(self):
108 self.harness.update_config({"mongodb_uri": "mongodb://mongo:27017"})
109
110 def initialize_mongo_relation(self):
111 mongodb_relation_id = self.harness.add_relation("mongodb", "mongodb")
112 self.harness.add_relation_unit(mongodb_relation_id, "mongodb/0")
113 self.harness.update_relation_data(
114 mongodb_relation_id,
115 "mongodb/0",
116 {"connection_string": "mongodb://mongo:27017"},
117 )
118
119
120 if __name__ == "__main__":
121 unittest.main()
122
123
124 # class TestCharm(unittest.TestCase):
125 # """POL Charm unit tests."""
126
127 # def setUp(self) -> NoReturn:
128 # """Test setup"""
129 # self.harness = Harness(PolCharm)
130 # self.harness.set_leader(is_leader=True)
131 # self.harness.begin()
132
133 # def test_on_start_without_relations(self) -> NoReturn:
134 # """Test installation without any relation."""
135 # self.harness.charm.on.start.emit()
136
137 # # Verifying status
138 # self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
139
140 # # Verifying status message
141 # self.assertGreater(len(self.harness.charm.unit.status.message), 0)
142 # self.assertTrue(
143 # self.harness.charm.unit.status.message.startswith("Waiting for ")
144 # )
145 # self.assertIn("kafka", self.harness.charm.unit.status.message)
146 # self.assertIn("mongodb", self.harness.charm.unit.status.message)
147 # self.assertTrue(self.harness.charm.unit.status.message.endswith(" relations"))
148
149 # def test_on_start_with_relations(self) -> NoReturn:
150 # """Test deployment without keystone."""
151 # expected_result = {
152 # "version": 3,
153 # "containers": [
154 # {
155 # "name": "pol",
156 # "imageDetails": self.harness.charm.image.fetch(),
157 # "imagePullPolicy": "Always",
158 # "ports": [
159 # {
160 # "name": "pol",
161 # "containerPort": 80,
162 # "protocol": "TCP",
163 # }
164 # ],
165 # "envConfig": {
166 # "ALLOW_ANONYMOUS_LOGIN": "yes",
167 # "OSMPOL_GLOBAL_LOGLEVEL": "INFO",
168 # "OSMPOL_MESSAGE_HOST": "kafka",
169 # "OSMPOL_MESSAGE_DRIVER": "kafka",
170 # "OSMPOL_MESSAGE_PORT": 9092,
171 # "OSMPOL_DATABASE_DRIVER": "mongo",
172 # "OSMPOL_DATABASE_URI": "mongodb://mongo:27017",
173 # },
174 # }
175 # ],
176 # "kubernetesResources": {"ingressResources": []},
177 # }
178
179 # self.harness.charm.on.start.emit()
180
181 # # Check if kafka datastore is initialized
182 # self.assertIsNone(self.harness.charm.state.message_host)
183 # self.assertIsNone(self.harness.charm.state.message_port)
184
185 # # Check if mongodb datastore is initialized
186 # self.assertIsNone(self.harness.charm.state.database_uri)
187
188 # # Initializing the kafka relation
189 # kafka_relation_id = self.harness.add_relation("kafka", "kafka")
190 # self.harness.add_relation_unit(kafka_relation_id, "kafka/0")
191 # self.harness.update_relation_data(
192 # kafka_relation_id, "kafka/0", {"host": "kafka", "port": 9092}
193 # )
194
195 # # Initializing the mongo relation
196 # mongodb_relation_id = self.harness.add_relation("mongodb", "mongodb")
197 # self.harness.add_relation_unit(mongodb_relation_id, "mongodb/0")
198 # self.harness.update_relation_data(
199 # mongodb_relation_id,
200 # "mongodb/0",
201 # {"connection_string": "mongodb://mongo:27017"},
202 # )
203
204 # # Checking if kafka data is stored
205 # self.assertEqual(self.harness.charm.state.message_host, "kafka")
206 # self.assertEqual(self.harness.charm.state.message_port, 9092)
207
208 # # Checking if mongodb data is stored
209 # self.assertEqual(self.harness.charm.state.database_uri, "mongodb://mongo:27017")
210
211 # # Verifying status
212 # self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus)
213
214 # pod_spec, _ = self.harness.get_pod_spec()
215
216 # self.assertDictEqual(expected_result, pod_spec)
217
218 # def test_on_kafka_unit_relation_changed(self) -> NoReturn:
219 # """Test to see if kafka relation is updated."""
220 # self.harness.charm.on.start.emit()
221
222 # self.assertIsNone(self.harness.charm.state.message_host)
223 # self.assertIsNone(self.harness.charm.state.message_port)
224
225 # relation_id = self.harness.add_relation("kafka", "kafka")
226 # self.harness.add_relation_unit(relation_id, "kafka/0")
227 # self.harness.update_relation_data(
228 # relation_id, "kafka/0", {"host": "kafka", "port": 9092}
229 # )
230
231 # self.assertEqual(self.harness.charm.state.message_host, "kafka")
232 # self.assertEqual(self.harness.charm.state.message_port, 9092)
233
234 # # Verifying status
235 # self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
236
237 # # Verifying status message
238 # self.assertGreater(len(self.harness.charm.unit.status.message), 0)
239 # self.assertTrue(
240 # self.harness.charm.unit.status.message.startswith("Waiting for ")
241 # )
242 # self.assertNotIn("kafka", self.harness.charm.unit.status.message)
243 # self.assertIn("mongodb", self.harness.charm.unit.status.message)
244 # self.assertTrue(self.harness.charm.unit.status.message.endswith(" relation"))
245
246 # def test_on_mongodb_unit_relation_changed(self) -> NoReturn:
247 # """Test to see if mongodb relation is updated."""
248 # self.harness.charm.on.start.emit()
249
250 # self.assertIsNone(self.harness.charm.state.database_uri)
251
252 # relation_id = self.harness.add_relation("mongodb", "mongodb")
253 # self.harness.add_relation_unit(relation_id, "mongodb/0")
254 # self.harness.update_relation_data(
255 # relation_id, "mongodb/0", {"connection_string": "mongodb://mongo:27017"}
256 # )
257
258 # self.assertEqual(self.harness.charm.state.database_uri, "mongodb://mongo:27017")
259
260 # # Verifying status
261 # self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
262
263 # # Verifying status message
264 # self.assertGreater(len(self.harness.charm.unit.status.message), 0)
265 # self.assertTrue(
266 # self.harness.charm.unit.status.message.startswith("Waiting for ")
267 # )
268 # self.assertIn("kafka", self.harness.charm.unit.status.message)
269 # self.assertNotIn("mongodb", self.harness.charm.unit.status.message)
270 # self.assertTrue(self.harness.charm.unit.status.message.endswith(" relation"))
271
272
273 # if __name__ == "__main__":
274 # unittest.main()