+# #!/usr/bin/env python3
+# # Copyright 2021 Canonical Ltd.
+# #
+# # Licensed under the Apache License, Version 2.0 (the "License"); you may
+# # not use this file except in compliance with the License. You may obtain
+# # a copy of the License at
+# #
+# # http://www.apache.org/licenses/LICENSE-2.0
+# #
+# # Unless required by applicable law or agreed to in writing, software
+# # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# # License for the specific language governing permissions and limitations
+# # under the License.
+# #
+# # For those usages not covered by the Apache License, Version 2.0 please
+# # contact: legal@canonical.com
+# #
+# # To get in touch with the maintainers, please contact:
+# # osm-charmers@lists.launchpad.net
+# ##
+
+# from typing import NoReturn
+# import unittest
+
+# import pod_spec
+
+
+# class TestPodSpec(unittest.TestCase):
+# """Pod spec unit tests."""
+
+# def test_make_pod_ports(self) -> NoReturn:
+# """Testing make pod ports."""
+# port = 3000
+
+# expected_result = [
+# {
+# "name": "grafana",
+# "containerPort": port,
+# "protocol": "TCP",
+# }
+# ]
+
+# pod_ports = pod_spec._make_pod_ports(port)
+
+# self.assertListEqual(expected_result, pod_ports)
+
+# def test_make_pod_envconfig(self) -> NoReturn:
+# """Teting make pod envconfig."""
+# config = {}
+# relation_state = {
+# "prometheus_hostname": "prometheus",
+# "prometheus_port": "9090",
+# }
+
+# expected_result = {}
+
+# pod_envconfig = pod_spec._make_pod_envconfig(config, relation_state)
+
+# self.assertDictEqual(expected_result, pod_envconfig)
+
+# def test_make_pod_ingress_resources_without_site_url(self) -> NoReturn:
+# """Testing make pod ingress resources without site_url."""
+# config = {"site_url": ""}
+# app_name = "grafana"
+# port = 3000
+
+# pod_ingress_resources = pod_spec._make_pod_ingress_resources(
+# config, app_name, port
+# )
+
+# self.assertIsNone(pod_ingress_resources)
+
+# def test_make_pod_ingress_resources(self) -> NoReturn:
+# """Testing make pod ingress resources."""
+# config = {
+# "site_url": "http://grafana",
+# "max_file_size": 0,
+# "ingress_whitelist_source_range": "",
+# }
+# app_name = "grafana"
+# port = 3000
+
+# expected_result = [
+# {
+# "name": f"{app_name}-ingress",
+# "annotations": {
+# "nginx.ingress.kubernetes.io/proxy-body-size": f"{config['max_file_size']}",
+# "nginx.ingress.kubernetes.io/ssl-redirect": "false",
+# },
+# "spec": {
+# "rules": [
+# {
+# "host": app_name,
+# "http": {
+# "paths": [
+# {
+# "path": "/",
+# "backend": {
+# "serviceName": app_name,
+# "servicePort": port,
+# },
+# }
+# ]
+# },
+# }
+# ]
+# },
+# }
+# ]
+
+# pod_ingress_resources = pod_spec._make_pod_ingress_resources(
+# config, app_name, port
+# )
+
+# self.assertListEqual(expected_result, pod_ingress_resources)
+
+# def test_make_pod_ingress_resources_with_whitelist_source_range(self) -> NoReturn:
+# """Testing make pod ingress resources with whitelist_source_range."""
+# config = {
+# "site_url": "http://grafana",
+# "max_file_size": 0,
+# "ingress_whitelist_source_range": "0.0.0.0/0",
+# }
+# app_name = "grafana"
+# port = 3000
+
+# expected_result = [
+# {
+# "name": f"{app_name}-ingress",
+# "annotations": {
+# "nginx.ingress.kubernetes.io/proxy-body-size": f"{config['max_file_size']}",
+# "nginx.ingress.kubernetes.io/ssl-redirect": "false",
+# "nginx.ingress.kubernetes.io/whitelist-source-range": config[
+# "ingress_whitelist_source_range"
+# ],
+# },
+# "spec": {
+# "rules": [
+# {
+# "host": app_name,
+# "http": {
+# "paths": [
+# {
+# "path": "/",
+# "backend": {
+# "serviceName": app_name,
+# "servicePort": port,
+# },
+# }
+# ]
+# },
+# }
+# ]
+# },
+# }
+# ]
+
+# pod_ingress_resources = pod_spec._make_pod_ingress_resources(
+# config, app_name, port
+# )
+
+# self.assertListEqual(expected_result, pod_ingress_resources)
+
+# def test_make_pod_ingress_resources_with_https(self) -> NoReturn:
+# """Testing make pod ingress resources with HTTPs."""
+# config = {
+# "site_url": "https://grafana",
+# "max_file_size": 0,
+# "ingress_whitelist_source_range": "",
+# "tls_secret_name": "",
+# }
+# app_name = "grafana"
+# port = 3000
+
+# expected_result = [
+# {
+# "name": f"{app_name}-ingress",
+# "annotations": {
+# "nginx.ingress.kubernetes.io/proxy-body-size": f"{config['max_file_size']}",
+# },
+# "spec": {
+# "rules": [
+# {
+# "host": app_name,
+# "http": {
+# "paths": [
+# {
+# "path": "/",
+# "backend": {
+# "serviceName": app_name,
+# "servicePort": port,
+# },
+# }
+# ]
+# },
+# }
+# ],
+# "tls": [{"hosts": [app_name]}],
+# },
+# }
+# ]
+
+# pod_ingress_resources = pod_spec._make_pod_ingress_resources(
+# config, app_name, port
+# )
+
+# self.assertListEqual(expected_result, pod_ingress_resources)
+
+# def test_make_pod_ingress_resources_with_https_tls_secret_name(self) -> NoReturn:
+# """Testing make pod ingress resources with HTTPs and TLS secret name."""
+# config = {
+# "site_url": "https://grafana",
+# "max_file_size": 0,
+# "ingress_whitelist_source_range": "",
+# "tls_secret_name": "secret_name",
+# }
+# app_name = "grafana"
+# port = 3000
+
+# expected_result = [
+# {
+# "name": f"{app_name}-ingress",
+# "annotations": {
+# "nginx.ingress.kubernetes.io/proxy-body-size": f"{config['max_file_size']}",
+# },
+# "spec": {
+# "rules": [
+# {
+# "host": app_name,
+# "http": {
+# "paths": [
+# {
+# "path": "/",
+# "backend": {
+# "serviceName": app_name,
+# "servicePort": port,
+# },
+# }
+# ]
+# },
+# }
+# ],
+# "tls": [
+# {"hosts": [app_name], "secretName": config["tls_secret_name"]}
+# ],
+# },
+# }
+# ]
+
+# pod_ingress_resources = pod_spec._make_pod_ingress_resources(
+# config, app_name, port
+# )
+
+# self.assertListEqual(expected_result, pod_ingress_resources)
+
+# def test_make_pod_files(self) -> NoReturn:
+# """Testing make pod files."""
+# config = {"osm_dashboards": False}
+# relation_state = {
+# "prometheus_hostname": "prometheus",
+# "prometheus_port": "9090",
+# }
+
+# expected_result = [
+# {
+# "name": "dashboards",
+# "mountPath": "/etc/grafana/provisioning/dashboards/",
+# "files": [
+# {
+# "path": "dashboard-osm.yml",
+# "content": (
+# "apiVersion: 1\n"
+# "providers:\n"
+# " - name: 'osm'\n"
+# " orgId: 1\n"
+# " folder: ''\n"
+# " type: file\n"
+# " options:\n"
+# " path: /etc/grafana/provisioning/dashboards/\n"
+# ),
+# }
+# ],
+# },
+# {
+# "name": "datasources",
+# "mountPath": "/etc/grafana/provisioning/datasources/",
+# "files": [
+# {
+# "path": "datasource-prometheus.yml",
+# "content": (
+# "datasources:\n"
+# " - access: proxy\n"
+# " editable: true\n"
+# " is_default: true\n"
+# " name: osm_prometheus\n"
+# " orgId: 1\n"
+# " type: prometheus\n"
+# " version: 1\n"
+# " url: http://{}:{}\n".format(
+# relation_state.get("prometheus_hostname"),
+# relation_state.get("prometheus_port"),
+# )
+# ),
+# }
+# ],
+# },
+# ]
+
+# pod_envconfig = pod_spec._make_pod_files(config, relation_state)
+# self.assertListEqual(expected_result, pod_envconfig)
+
+# def test_make_readiness_probe(self) -> NoReturn:
+# """Testing make readiness probe."""
+# port = 3000
+
+# expected_result = {
+# "httpGet": {
+# "path": "/api/health",
+# "port": port,
+# },
+# "initialDelaySeconds": 10,
+# "periodSeconds": 10,
+# "timeoutSeconds": 5,
+# "successThreshold": 1,
+# "failureThreshold": 3,
+# }
+
+# readiness_probe = pod_spec._make_readiness_probe(port)
+
+# self.assertDictEqual(expected_result, readiness_probe)
+
+# def test_make_liveness_probe(self) -> NoReturn:
+# """Testing make liveness probe."""
+# port = 3000
+
+# expected_result = {
+# "httpGet": {
+# "path": "/api/health",
+# "port": port,
+# },
+# "initialDelaySeconds": 60,
+# "timeoutSeconds": 30,
+# "failureThreshold": 10,
+# }
+
+# liveness_probe = pod_spec._make_liveness_probe(port)
+
+# self.assertDictEqual(expected_result, liveness_probe)
+
+# def test_make_pod_spec(self) -> NoReturn:
+# """Testing make pod spec."""
+# image_info = {"upstream-source": "ubuntu/grafana:latest"}
+# config = {
+# "site_url": "",
+# }
+# relation_state = {
+# "prometheus_hostname": "prometheus",
+# "prometheus_port": "9090",
+# }
+# app_name = "grafana"
+# port = 3000
+
+# expected_result = {
+# "version": 3,
+# "containers": [
+# {
+# "name": app_name,
+# "imageDetails": image_info,
+# "imagePullPolicy": "Always",
+# "ports": [
+# {
+# "name": app_name,
+# "containerPort": port,
+# "protocol": "TCP",
+# }
+# ],
+# "envConfig": {},
+# "volumeConfig": [
+# {
+# "name": "dashboards",
+# "mountPath": "/etc/grafana/provisioning/dashboards/",
+# "files": [
+# {
+# "path": "dashboard-osm.yml",
+# "content": (
+# "apiVersion: 1\n"
+# "providers:\n"
+# " - name: 'osm'\n"
+# " orgId: 1\n"
+# " folder: ''\n"
+# " type: file\n"
+# " options:\n"
+# " path: /etc/grafana/provisioning/dashboards/\n"
+# ),
+# }
+# ],
+# },
+# {
+# "name": "datasources",
+# "mountPath": "/etc/grafana/provisioning/datasources/",
+# "files": [
+# {
+# "path": "datasource-prometheus.yml",
+# "content": (
+# "datasources:\n"
+# " - access: proxy\n"
+# " editable: true\n"
+# " is_default: true\n"
+# " name: osm_prometheus\n"
+# " orgId: 1\n"
+# " type: prometheus\n"
+# " version: 1\n"
+# " url: http://{}:{}\n".format(
+# relation_state.get("prometheus_hostname"),
+# relation_state.get("prometheus_port"),
+# )
+# ),
+# }
+# ],
+# },
+# ],
+# "kubernetes": {
+# "readinessProbe": {
+# "httpGet": {
+# "path": "/api/health",
+# "port": port,
+# },
+# "initialDelaySeconds": 10,
+# "periodSeconds": 10,
+# "timeoutSeconds": 5,
+# "successThreshold": 1,
+# "failureThreshold": 3,
+# },
+# "livenessProbe": {
+# "httpGet": {
+# "path": "/api/health",
+# "port": port,
+# },
+# "initialDelaySeconds": 60,
+# "timeoutSeconds": 30,
+# "failureThreshold": 10,
+# },
+# },
+# }
+# ],
+# "kubernetesResources": {"ingressResources": []},
+# }
+
+# spec = pod_spec.make_pod_spec(
+# image_info, config, relation_state, app_name, port
+# )
+
+# self.assertDictEqual(expected_result, spec)
+
+# def test_make_pod_spec_with_ingress(self) -> NoReturn:
+# """Testing make pod spec."""
+# image_info = {"upstream-source": "ubuntu/grafana:latest"}
+# config = {
+# "site_url": "https://grafana",
+# "tls_secret_name": "grafana",
+# "max_file_size": 0,
+# "ingress_whitelist_source_range": "0.0.0.0/0",
+# }
+# relation_state = {
+# "prometheus_hostname": "prometheus",
+# "prometheus_port": "9090",
+# }
+# app_name = "grafana"
+# port = 3000
+
+# expected_result = {
+# "version": 3,
+# "containers": [
+# {
+# "name": app_name,
+# "imageDetails": image_info,
+# "imagePullPolicy": "Always",
+# "ports": [
+# {
+# "name": app_name,
+# "containerPort": port,
+# "protocol": "TCP",
+# }
+# ],
+# "envConfig": {},
+# "volumeConfig": [
+# {
+# "name": "dashboards",
+# "mountPath": "/etc/grafana/provisioning/dashboards/",
+# "files": [
+# {
+# "path": "dashboard-osm.yml",
+# "content": (
+# "apiVersion: 1\n"
+# "providers:\n"
+# " - name: 'osm'\n"
+# " orgId: 1\n"
+# " folder: ''\n"
+# " type: file\n"
+# " options:\n"
+# " path: /etc/grafana/provisioning/dashboards/\n"
+# ),
+# }
+# ],
+# },
+# {
+# "name": "datasources",
+# "mountPath": "/etc/grafana/provisioning/datasources/",
+# "files": [
+# {
+# "path": "datasource-prometheus.yml",
+# "content": (
+# "datasources:\n"
+# " - access: proxy\n"
+# " editable: true\n"
+# " is_default: true\n"
+# " name: osm_prometheus\n"
+# " orgId: 1\n"
+# " type: prometheus\n"
+# " version: 1\n"
+# " url: http://{}:{}\n".format(
+# relation_state.get("prometheus_hostname"),
+# relation_state.get("prometheus_port"),
+# )
+# ),
+# }
+# ],
+# },
+# ],
+# "kubernetes": {
+# "readinessProbe": {
+# "httpGet": {
+# "path": "/api/health",
+# "port": port,
+# },
+# "initialDelaySeconds": 10,
+# "periodSeconds": 10,
+# "timeoutSeconds": 5,
+# "successThreshold": 1,
+# "failureThreshold": 3,
+# },
+# "livenessProbe": {
+# "httpGet": {
+# "path": "/api/health",
+# "port": port,
+# },
+# "initialDelaySeconds": 60,
+# "timeoutSeconds": 30,
+# "failureThreshold": 10,
+# },
+# },
+# }
+# ],
+# "kubernetesResources": {
+# "ingressResources": [
+# {
+# "name": "{}-ingress".format(app_name),
+# "annotations": {
+# "nginx.ingress.kubernetes.io/proxy-body-size": str(
+# config.get("max_file_size")
+# ),
+# "nginx.ingress.kubernetes.io/whitelist-source-range": config.get(
+# "ingress_whitelist_source_range"
+# ),
+# },
+# "spec": {
+# "rules": [
+# {
+# "host": app_name,
+# "http": {
+# "paths": [
+# {
+# "path": "/",
+# "backend": {
+# "serviceName": app_name,
+# "servicePort": port,
+# },
+# }
+# ]
+# },
+# }
+# ],
+# "tls": [
+# {
+# "hosts": [app_name],
+# "secretName": config.get("tls_secret_name"),
+# }
+# ],
+# },
+# }
+# ],
+# },
+# }
+
+# spec = pod_spec.make_pod_spec(
+# image_info, config, relation_state, app_name, port
+# )
+
+# self.assertDictEqual(expected_result, spec)
+
+# def test_make_pod_spec_without_image_info(self) -> NoReturn:
+# """Testing make pod spec without image_info."""
+# image_info = None
+# config = {
+# "site_url": "",
+# }
+# relation_state = {
+# "prometheus_hostname": "prometheus",
+# "prometheus_port": "9090",
+# }
+# app_name = "grafana"
+# port = 3000
+
+# spec = pod_spec.make_pod_spec(
+# image_info, config, relation_state, app_name, port
+# )
+
+# self.assertIsNone(spec)
+
+# def test_make_pod_spec_without_relation_state(self) -> NoReturn:
+# """Testing make pod spec without relation_state."""
+# image_info = {"upstream-source": "ubuntu/grafana:latest"}
+# config = {
+# "site_url": "",
+# }
+# relation_state = {}
+# app_name = "grafana"
+# port = 3000
+
+# with self.assertRaises(ValueError):
+# pod_spec.make_pod_spec(image_info, config, relation_state, app_name, port)
+
+
+# if __name__ == "__main__":
+# unittest.main()