2 # Copyright 2020 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
23 from typing
import NoReturn
29 class TestPodSpec(unittest
.TestCase
):
30 """Pod spec unit tests."""
32 def test_make_pod_ports(self
) -> NoReturn
:
33 """Testing make pod ports."""
39 "containerPort": port
,
44 pod_ports
= pod_spec
._make
_pod
_ports
(port
)
46 self
.assertListEqual(expected_result
, pod_ports
)
48 def test_make_pod_envconfig_without_keystone(self
) -> NoReturn
:
49 """Teting make pod envconfig without Keystone."""
52 "database_commonkey": "commonkey",
54 "auth_backend": "internal",
57 "message_host": "kafka",
59 "database_uri": "mongodb://mongo",
60 "prometheus_host": "prometheus",
61 "prometheus_port": 9082,
65 "ALLOW_ANONYMOUS_LOGIN": "yes",
66 "OSMNBI_SERVER_ENABLE_TEST": config
["enable_test"],
67 "OSMNBI_STATIC_DIR": "/app/osm_nbi/html_public",
68 "OSMNBI_MESSAGE_HOST": relation_state
["message_host"],
69 "OSMNBI_MESSAGE_DRIVER": "kafka",
70 "OSMNBI_MESSAGE_PORT": relation_state
["message_port"],
71 "OSMNBI_DATABASE_DRIVER": "mongo",
72 "OSMNBI_DATABASE_URI": relation_state
["database_uri"],
73 "OSMNBI_DATABASE_COMMONKEY": config
["database_commonkey"],
74 "OSMNBI_STORAGE_DRIVER": "mongo",
75 "OSMNBI_STORAGE_PATH": "/app/storage",
76 "OSMNBI_STORAGE_COLLECTION": "files",
77 "OSMNBI_STORAGE_URI": relation_state
["database_uri"],
78 "OSMNBI_PROMETHEUS_HOST": relation_state
["prometheus_host"],
79 "OSMNBI_PROMETHEUS_PORT": relation_state
["prometheus_port"],
80 "OSMNBI_LOG_LEVEL": config
["log_level"],
81 "OSMNBI_AUTHENTICATION_BACKEND": config
["auth_backend"],
84 pod_envconfig
= pod_spec
._make
_pod
_envconfig
(config
, relation_state
)
86 self
.assertDictEqual(expected_result
, pod_envconfig
)
88 def test_make_pod_envconfig_with_keystone(self
) -> NoReturn
:
89 """Teting make pod envconfig with Keystone."""
92 "database_commonkey": "commonkey",
94 "auth_backend": "keystone",
97 "message_host": "kafka",
99 "database_uri": "mongodb://mongo",
100 "prometheus_host": "prometheus",
101 "prometheus_port": 9082,
102 "keystone_host": "keystone",
103 "keystone_port": 5000,
104 "keystone_user_domain_name": "user_domain",
105 "keystone_project_domain_name": "project_domain",
106 "keystone_username": "username",
107 "keystone_password": "password",
108 "keystone_service": "service",
112 "ALLOW_ANONYMOUS_LOGIN": "yes",
113 "OSMNBI_SERVER_ENABLE_TEST": config
["enable_test"],
114 "OSMNBI_STATIC_DIR": "/app/osm_nbi/html_public",
115 "OSMNBI_MESSAGE_HOST": relation_state
["message_host"],
116 "OSMNBI_MESSAGE_DRIVER": "kafka",
117 "OSMNBI_MESSAGE_PORT": relation_state
["message_port"],
118 "OSMNBI_DATABASE_DRIVER": "mongo",
119 "OSMNBI_DATABASE_URI": relation_state
["database_uri"],
120 "OSMNBI_DATABASE_COMMONKEY": config
["database_commonkey"],
121 "OSMNBI_STORAGE_DRIVER": "mongo",
122 "OSMNBI_STORAGE_PATH": "/app/storage",
123 "OSMNBI_STORAGE_COLLECTION": "files",
124 "OSMNBI_STORAGE_URI": relation_state
["database_uri"],
125 "OSMNBI_PROMETHEUS_HOST": relation_state
["prometheus_host"],
126 "OSMNBI_PROMETHEUS_PORT": relation_state
["prometheus_port"],
127 "OSMNBI_LOG_LEVEL": config
["log_level"],
128 "OSMNBI_AUTHENTICATION_BACKEND": config
["auth_backend"],
129 "OSMNBI_AUTHENTICATION_AUTH_URL": relation_state
["keystone_host"],
130 "OSMNBI_AUTHENTICATION_AUTH_PORT": relation_state
["keystone_port"],
131 "OSMNBI_AUTHENTICATION_USER_DOMAIN_NAME": relation_state
[
132 "keystone_user_domain_name"
134 "OSMNBI_AUTHENTICATION_PROJECT_DOMAIN_NAME": relation_state
[
135 "keystone_project_domain_name"
137 "OSMNBI_AUTHENTICATION_SERVICE_USERNAME": relation_state
[
140 "OSMNBI_AUTHENTICATION_SERVICE_PASSWORD": relation_state
[
143 "OSMNBI_AUTHENTICATION_SERVICE_PROJECT": relation_state
["keystone_service"],
146 pod_envconfig
= pod_spec
._make
_pod
_envconfig
(config
, relation_state
)
148 self
.assertDictEqual(expected_result
, pod_envconfig
)
150 def test_make_pod_envconfig_wrong_auth_backend(self
) -> NoReturn
:
151 """Teting make pod envconfig with wrong auth_backend."""
153 "enable_test": False,
154 "database_commonkey": "commonkey",
155 "log_level": "DEBUG",
156 "auth_backend": "kerberos",
159 "message_host": "kafka",
160 "message_port": 9090,
161 "database_uri": "mongodb://mongo",
162 "prometheus_host": "prometheus",
163 "prometheus_port": 9082,
164 "keystone_host": "keystone",
165 "keystone_port": 5000,
166 "keystone_user_domain_name": "user_domain",
167 "keystone_project_domain_name": "project_domain",
168 "keystone_username": "username",
169 "keystone_password": "password",
170 "keystone_service": "service",
173 with self
.assertRaises(ValueError) as exc
:
174 pod_spec
._make
_pod
_envconfig
(config
, relation_state
)
177 "auth_backend needs to be either internal or keystone" in str(exc
.exception
)
180 def test_make_pod_ingress_resources_without_site_url(self
) -> NoReturn
:
181 """Testing make pod ingress resources without site_url."""
182 config
= {"site_url": ""}
186 pod_ingress_resources
= pod_spec
._make
_pod
_ingress
_resources
(
187 config
, app_name
, port
190 self
.assertIsNone(pod_ingress_resources
)
192 def test_make_pod_ingress_resources(self
) -> NoReturn
:
193 """Testing make pod ingress resources."""
195 "site_url": "http://nbi",
197 "ingress_whitelist_source_range": "",
204 "name": f
"{app_name}-ingress",
206 "nginx.ingress.kubernetes.io/proxy-body-size": f
"{config['max_file_size']}",
207 "nginx.ingress.kubernetes.io/backend-protocol": "HTTPS",
208 "nginx.ingress.kubernetes.io/ssl-redirect": "false",
219 "serviceName": app_name
,
231 pod_ingress_resources
= pod_spec
._make
_pod
_ingress
_resources
(
232 config
, app_name
, port
235 self
.assertListEqual(expected_result
, pod_ingress_resources
)
237 def test_make_pod_ingress_resources_with_whitelist_source_range(self
) -> NoReturn
:
238 """Testing make pod ingress resources with whitelist_source_range."""
240 "site_url": "http://nbi",
242 "ingress_whitelist_source_range": "0.0.0.0/0",
249 "name": f
"{app_name}-ingress",
251 "nginx.ingress.kubernetes.io/proxy-body-size": f
"{config['max_file_size']}",
252 "nginx.ingress.kubernetes.io/backend-protocol": "HTTPS",
253 "nginx.ingress.kubernetes.io/ssl-redirect": "false",
254 "nginx.ingress.kubernetes.io/whitelist-source-range": config
[
255 "ingress_whitelist_source_range"
267 "serviceName": app_name
,
279 pod_ingress_resources
= pod_spec
._make
_pod
_ingress
_resources
(
280 config
, app_name
, port
283 self
.assertListEqual(expected_result
, pod_ingress_resources
)
285 def test_make_pod_ingress_resources_with_https(self
) -> NoReturn
:
286 """Testing make pod ingress resources with HTTPs."""
288 "site_url": "https://nbi",
290 "ingress_whitelist_source_range": "",
291 "tls_secret_name": "",
298 "name": f
"{app_name}-ingress",
300 "nginx.ingress.kubernetes.io/proxy-body-size": f
"{config['max_file_size']}",
301 "nginx.ingress.kubernetes.io/backend-protocol": "HTTPS",
312 "serviceName": app_name
,
320 "tls": [{"hosts": [app_name
]}],
325 pod_ingress_resources
= pod_spec
._make
_pod
_ingress
_resources
(
326 config
, app_name
, port
329 self
.assertListEqual(expected_result
, pod_ingress_resources
)
331 def test_make_pod_ingress_resources_with_https_tls_secret_name(self
) -> NoReturn
:
332 """Testing make pod ingress resources with HTTPs and TLS secret name."""
334 "site_url": "https://nbi",
336 "ingress_whitelist_source_range": "",
337 "tls_secret_name": "secret_name",
344 "name": f
"{app_name}-ingress",
346 "nginx.ingress.kubernetes.io/proxy-body-size": f
"{config['max_file_size']}",
347 "nginx.ingress.kubernetes.io/backend-protocol": "HTTPS",
358 "serviceName": app_name
,
367 {"hosts": [app_name
], "secretName": config
["tls_secret_name"]}
373 pod_ingress_resources
= pod_spec
._make
_pod
_ingress
_resources
(
374 config
, app_name
, port
377 self
.assertListEqual(expected_result
, pod_ingress_resources
)
379 def test_make_startup_probe(self
) -> NoReturn
:
380 """Testing make startup probe."""
382 "exec": {"command": ["/usr/bin/pgrep python3"]},
383 "initialDelaySeconds": 60,
387 startup_probe
= pod_spec
._make
_startup
_probe
()
389 self
.assertDictEqual(expected_result
, startup_probe
)
391 def test_make_readiness_probe(self
) -> NoReturn
:
392 """Testing make readiness probe."""
400 "initialDelaySeconds": 45,
404 readiness_probe
= pod_spec
._make
_readiness
_probe
(port
)
406 self
.assertDictEqual(expected_result
, readiness_probe
)
408 def test_make_liveness_probe(self
) -> NoReturn
:
409 """Testing make liveness probe."""
417 "initialDelaySeconds": 45,
421 liveness_probe
= pod_spec
._make
_liveness
_probe
(port
)
423 self
.assertDictEqual(expected_result
, liveness_probe
)
425 def test_make_pod_spec_without_image_info(self
) -> NoReturn
:
426 """Testing make pod spec without image_info."""
429 "enable_test": False,
430 "database_commonkey": "commonkey",
431 "log_level": "DEBUG",
432 "auth_backend": "internal",
436 "message_host": "kafka",
437 "message_port": 9090,
438 "database_uri": "mongodb://mongo",
439 "prometheus_host": "prometheus",
440 "prometheus_port": 9082,
445 spec
= pod_spec
.make_pod_spec(
446 image_info
, config
, relation_state
, app_name
, port
449 self
.assertIsNone(spec
)
451 def test_make_pod_spec_without_config(self
) -> NoReturn
:
452 """Testing make pod spec without config."""
453 image_info
= {"upstream-source": "opensourcemano/nbi:8"}
456 "message_host": "kafka",
457 "message_port": 9090,
458 "database_uri": "mongodb://mongo",
459 "prometheus_host": "prometheus",
460 "prometheus_port": 9082,
465 with self
.assertRaises(ValueError):
466 pod_spec
.make_pod_spec(image_info
, config
, relation_state
, app_name
, port
)
468 def test_make_pod_spec_without_relation_state(self
) -> NoReturn
:
469 """Testing make pod spec without relation_state."""
470 image_info
= {"upstream-source": "opensourcemano/nbi:8"}
472 "enable_test": False,
473 "database_commonkey": "commonkey",
474 "log_level": "DEBUG",
475 "auth_backend": "internal",
482 with self
.assertRaises(ValueError):
483 pod_spec
.make_pod_spec(image_info
, config
, relation_state
, app_name
, port
)
485 def test_make_pod_spec(self
) -> NoReturn
:
486 """Testing make pod spec."""
487 image_info
= {"upstream-source": "opensourcemano/nbi:8"}
489 "enable_test": False,
490 "database_commonkey": "commonkey",
491 "log_level": "DEBUG",
492 "auth_backend": "internal",
496 "message_host": "kafka",
497 "message_port": 9090,
498 "database_uri": "mongodb://mongo",
499 "prometheus_host": "prometheus",
500 "prometheus_port": 9082,
510 "imageDetails": image_info
,
511 "imagePullPolicy": "Always",
515 "containerPort": port
,
520 "ALLOW_ANONYMOUS_LOGIN": "yes",
521 "OSMNBI_SERVER_ENABLE_TEST": config
["enable_test"],
522 "OSMNBI_STATIC_DIR": "/app/osm_nbi/html_public",
523 "OSMNBI_MESSAGE_HOST": relation_state
["message_host"],
524 "OSMNBI_MESSAGE_DRIVER": "kafka",
525 "OSMNBI_MESSAGE_PORT": relation_state
["message_port"],
526 "OSMNBI_DATABASE_DRIVER": "mongo",
527 "OSMNBI_DATABASE_URI": relation_state
["database_uri"],
528 "OSMNBI_DATABASE_COMMONKEY": config
["database_commonkey"],
529 "OSMNBI_STORAGE_DRIVER": "mongo",
530 "OSMNBI_STORAGE_PATH": "/app/storage",
531 "OSMNBI_STORAGE_COLLECTION": "files",
532 "OSMNBI_STORAGE_URI": relation_state
["database_uri"],
533 "OSMNBI_PROMETHEUS_HOST": relation_state
["prometheus_host"],
534 "OSMNBI_PROMETHEUS_PORT": relation_state
["prometheus_port"],
535 "OSMNBI_LOG_LEVEL": config
["log_level"],
536 "OSMNBI_AUTHENTICATION_BACKEND": config
["auth_backend"],
540 "kubernetesResources": {
541 "ingressResources": [],
545 spec
= pod_spec
.make_pod_spec(
546 image_info
, config
, relation_state
, app_name
, port
549 self
.assertDictEqual(expected_result
, spec
)
551 def test_make_pod_spec_with_keystone(self
) -> NoReturn
:
552 """Testing make pod spec with keystone."""
553 image_info
= {"upstream-source": "opensourcemano/nbi:8"}
555 "enable_test": False,
556 "database_commonkey": "commonkey",
557 "log_level": "DEBUG",
558 "auth_backend": "keystone",
562 "message_host": "kafka",
563 "message_port": 9090,
564 "database_uri": "mongodb://mongo",
565 "prometheus_host": "prometheus",
566 "prometheus_port": 9082,
567 "keystone_host": "keystone",
568 "keystone_port": 5000,
569 "keystone_user_domain_name": "user_domain",
570 "keystone_project_domain_name": "project_domain",
571 "keystone_username": "username",
572 "keystone_password": "password",
573 "keystone_service": "service",
583 "imageDetails": image_info
,
584 "imagePullPolicy": "Always",
588 "containerPort": port
,
593 "ALLOW_ANONYMOUS_LOGIN": "yes",
594 "OSMNBI_SERVER_ENABLE_TEST": config
["enable_test"],
595 "OSMNBI_STATIC_DIR": "/app/osm_nbi/html_public",
596 "OSMNBI_MESSAGE_HOST": relation_state
["message_host"],
597 "OSMNBI_MESSAGE_DRIVER": "kafka",
598 "OSMNBI_MESSAGE_PORT": relation_state
["message_port"],
599 "OSMNBI_DATABASE_DRIVER": "mongo",
600 "OSMNBI_DATABASE_URI": relation_state
["database_uri"],
601 "OSMNBI_DATABASE_COMMONKEY": config
["database_commonkey"],
602 "OSMNBI_STORAGE_DRIVER": "mongo",
603 "OSMNBI_STORAGE_PATH": "/app/storage",
604 "OSMNBI_STORAGE_COLLECTION": "files",
605 "OSMNBI_STORAGE_URI": relation_state
["database_uri"],
606 "OSMNBI_PROMETHEUS_HOST": relation_state
["prometheus_host"],
607 "OSMNBI_PROMETHEUS_PORT": relation_state
["prometheus_port"],
608 "OSMNBI_LOG_LEVEL": config
["log_level"],
609 "OSMNBI_AUTHENTICATION_BACKEND": config
["auth_backend"],
610 "OSMNBI_AUTHENTICATION_AUTH_URL": relation_state
[
613 "OSMNBI_AUTHENTICATION_AUTH_PORT": relation_state
[
616 "OSMNBI_AUTHENTICATION_USER_DOMAIN_NAME": relation_state
[
617 "keystone_user_domain_name"
619 "OSMNBI_AUTHENTICATION_PROJECT_DOMAIN_NAME": relation_state
[
620 "keystone_project_domain_name"
622 "OSMNBI_AUTHENTICATION_SERVICE_USERNAME": relation_state
[
625 "OSMNBI_AUTHENTICATION_SERVICE_PASSWORD": relation_state
[
628 "OSMNBI_AUTHENTICATION_SERVICE_PROJECT": relation_state
[
634 "kubernetesResources": {
635 "ingressResources": [],
639 spec
= pod_spec
.make_pod_spec(
640 image_info
, config
, relation_state
, app_name
, port
643 self
.assertDictEqual(expected_result
, spec
)
646 if __name__
== "__main__":