diff --git a/installers/charm/grafana/tests/__init__.py b/installers/charm/grafana/tests/__init__.py
new file mode 100644
index 0000000..4fd849a
--- /dev/null
+++ b/installers/charm/grafana/tests/__init__.py
@@ -0,0 +1,31 @@
+#!/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
+##
+
+"""Init mocking for unit tests."""
+
+import sys
+import mock
+
+sys.path.append("src")
+
+oci_image = mock.MagicMock()
+sys.modules["oci_image"] = oci_image
diff --git a/installers/charm/grafana/tests/test_charm.py b/installers/charm/grafana/tests/test_charm.py
new file mode 100644
index 0000000..5bbd15b
--- /dev/null
+++ b/installers/charm/grafana/tests/test_charm.py
@@ -0,0 +1,590 @@
+#!/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
+
+from ops.model import BlockedStatus
+from ops.testing import Harness
+
+from charm import GrafanaCharm
+
+
+class TestCharm(unittest.TestCase):
+    """Grafana Charm unit tests."""
+
+    def setUp(self) -> NoReturn:
+        """Test setup"""
+        self.harness = Harness(GrafanaCharm)
+        self.harness.set_leader(is_leader=True)
+        self.harness.begin()
+
+    def test_on_start_without_relations(self) -> NoReturn:
+        """Test installation without any relation."""
+        self.harness.charm.on.start.emit()
+
+        # Verifying status
+        self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
+
+        # Verifying status message
+        self.assertGreater(len(self.harness.charm.unit.status.message), 0)
+        self.assertTrue(
+            self.harness.charm.unit.status.message.startswith("Waiting for ")
+        )
+        self.assertIn("prometheus", self.harness.charm.unit.status.message)
+        self.assertTrue(self.harness.charm.unit.status.message.endswith(" relation"))
+
+    def test_on_start_with_relations_without_http(self) -> NoReturn:
+        """Test deployment."""
+        expected_result = {
+            "version": 3,
+            "containers": [
+                {
+                    "name": "grafana",
+                    "imageDetails": self.harness.charm.image.fetch(),
+                    "imagePullPolicy": "Always",
+                    "ports": [
+                        {
+                            "name": "grafana",
+                            "containerPort": 3000,
+                            "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://prometheus:9090\n"
+                                    ),
+                                },
+                            ],
+                        },
+                    ],
+                    "kubernetes": {
+                        "readinessProbe": {
+                            "httpGet": {
+                                "path": "/api/health",
+                                "port": 3000,
+                            },
+                            "initialDelaySeconds": 10,
+                            "periodSeconds": 10,
+                            "timeoutSeconds": 5,
+                            "successThreshold": 1,
+                            "failureThreshold": 3,
+                        },
+                        "livenessProbe": {
+                            "httpGet": {
+                                "path": "/api/health",
+                                "port": 3000,
+                            },
+                            "initialDelaySeconds": 60,
+                            "timeoutSeconds": 30,
+                            "failureThreshold": 10,
+                        },
+                    },
+                },
+            ],
+            "kubernetesResources": {"ingressResources": []},
+        }
+
+        self.harness.charm.on.start.emit()
+
+        # Initializing the prometheus relation
+        relation_id = self.harness.add_relation("prometheus", "prometheus")
+        self.harness.add_relation_unit(relation_id, "prometheus/0")
+        self.harness.update_relation_data(
+            relation_id,
+            "prometheus/0",
+            {
+                "host": "prometheus",
+                "port": "9090",
+            },
+        )
+
+        # Verifying status
+        self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus)
+
+        pod_spec, _ = self.harness.get_pod_spec()
+
+        self.assertDictEqual(expected_result, pod_spec)
+
+    def test_ingress_resources_with_http(self) -> NoReturn:
+        """Test ingress resources with HTTP."""
+        expected_result = {
+            "version": 3,
+            "containers": [
+                {
+                    "name": "grafana",
+                    "imageDetails": self.harness.charm.image.fetch(),
+                    "imagePullPolicy": "Always",
+                    "ports": [
+                        {
+                            "name": "grafana",
+                            "containerPort": 3000,
+                            "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://prometheus:9090\n"
+                                    ),
+                                },
+                            ],
+                        },
+                    ],
+                    "kubernetes": {
+                        "readinessProbe": {
+                            "httpGet": {
+                                "path": "/api/health",
+                                "port": 3000,
+                            },
+                            "initialDelaySeconds": 10,
+                            "periodSeconds": 10,
+                            "timeoutSeconds": 5,
+                            "successThreshold": 1,
+                            "failureThreshold": 3,
+                        },
+                        "livenessProbe": {
+                            "httpGet": {
+                                "path": "/api/health",
+                                "port": 3000,
+                            },
+                            "initialDelaySeconds": 60,
+                            "timeoutSeconds": 30,
+                            "failureThreshold": 10,
+                        },
+                    },
+                },
+            ],
+            "kubernetesResources": {
+                "ingressResources": [
+                    {
+                        "name": "grafana-ingress",
+                        "annotations": {
+                            "nginx.ingress.kubernetes.io/proxy-body-size": "0",
+                            "nginx.ingress.kubernetes.io/ssl-redirect": "false",
+                        },
+                        "spec": {
+                            "rules": [
+                                {
+                                    "host": "grafana",
+                                    "http": {
+                                        "paths": [
+                                            {
+                                                "path": "/",
+                                                "backend": {
+                                                    "serviceName": "grafana",
+                                                    "servicePort": 3000,
+                                                },
+                                            }
+                                        ]
+                                    },
+                                }
+                            ]
+                        },
+                    }
+                ],
+            },
+        }
+
+        self.harness.charm.on.start.emit()
+
+        # Initializing the prometheus relation
+        relation_id = self.harness.add_relation("prometheus", "prometheus")
+        self.harness.add_relation_unit(relation_id, "prometheus/0")
+        self.harness.update_relation_data(
+            relation_id,
+            "prometheus/0",
+            {
+                "host": "prometheus",
+                "port": "9090",
+            },
+        )
+
+        self.harness.update_config({"site_url": "http://grafana"})
+
+        pod_spec, _ = self.harness.get_pod_spec()
+
+        self.assertDictEqual(expected_result, pod_spec)
+
+    def test_ingress_resources_with_https(self) -> NoReturn:
+        """Test ingress resources with HTTPS."""
+        expected_result = {
+            "version": 3,
+            "containers": [
+                {
+                    "name": "grafana",
+                    "imageDetails": self.harness.charm.image.fetch(),
+                    "imagePullPolicy": "Always",
+                    "ports": [
+                        {
+                            "name": "grafana",
+                            "containerPort": 3000,
+                            "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://prometheus:9090\n"
+                                    ),
+                                },
+                            ],
+                        },
+                    ],
+                    "kubernetes": {
+                        "readinessProbe": {
+                            "httpGet": {
+                                "path": "/api/health",
+                                "port": 3000,
+                            },
+                            "initialDelaySeconds": 10,
+                            "periodSeconds": 10,
+                            "timeoutSeconds": 5,
+                            "successThreshold": 1,
+                            "failureThreshold": 3,
+                        },
+                        "livenessProbe": {
+                            "httpGet": {
+                                "path": "/api/health",
+                                "port": 3000,
+                            },
+                            "initialDelaySeconds": 60,
+                            "timeoutSeconds": 30,
+                            "failureThreshold": 10,
+                        },
+                    },
+                },
+            ],
+            "kubernetesResources": {
+                "ingressResources": [
+                    {
+                        "name": "grafana-ingress",
+                        "annotations": {
+                            "nginx.ingress.kubernetes.io/proxy-body-size": "0",
+                        },
+                        "spec": {
+                            "rules": [
+                                {
+                                    "host": "grafana",
+                                    "http": {
+                                        "paths": [
+                                            {
+                                                "path": "/",
+                                                "backend": {
+                                                    "serviceName": "grafana",
+                                                    "servicePort": 3000,
+                                                },
+                                            }
+                                        ]
+                                    },
+                                }
+                            ],
+                            "tls": [{"hosts": ["grafana"], "secretName": "grafana"}],
+                        },
+                    }
+                ],
+            },
+        }
+
+        self.harness.charm.on.start.emit()
+
+        # Initializing the prometheus relation
+        relation_id = self.harness.add_relation("prometheus", "prometheus")
+        self.harness.add_relation_unit(relation_id, "prometheus/0")
+        self.harness.update_relation_data(
+            relation_id,
+            "prometheus/0",
+            {
+                "host": "prometheus",
+                "port": "9090",
+            },
+        )
+
+        self.harness.update_config(
+            {"site_url": "https://grafana", "tls_secret_name": "grafana"}
+        )
+
+        pod_spec, _ = self.harness.get_pod_spec()
+
+        self.assertDictEqual(expected_result, pod_spec)
+
+    def test_ingress_resources_with_https_and_ingress_whitelist(self) -> NoReturn:
+        """Test ingress resources with HTTPS and ingress whitelist."""
+        expected_result = {
+            "version": 3,
+            "containers": [
+                {
+                    "name": "grafana",
+                    "imageDetails": self.harness.charm.image.fetch(),
+                    "imagePullPolicy": "Always",
+                    "ports": [
+                        {
+                            "name": "grafana",
+                            "containerPort": 3000,
+                            "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://prometheus:9090\n"
+                                    ),
+                                },
+                            ],
+                        },
+                    ],
+                    "kubernetes": {
+                        "readinessProbe": {
+                            "httpGet": {
+                                "path": "/api/health",
+                                "port": 3000,
+                            },
+                            "initialDelaySeconds": 10,
+                            "periodSeconds": 10,
+                            "timeoutSeconds": 5,
+                            "successThreshold": 1,
+                            "failureThreshold": 3,
+                        },
+                        "livenessProbe": {
+                            "httpGet": {
+                                "path": "/api/health",
+                                "port": 3000,
+                            },
+                            "initialDelaySeconds": 60,
+                            "timeoutSeconds": 30,
+                            "failureThreshold": 10,
+                        },
+                    },
+                },
+            ],
+            "kubernetesResources": {
+                "ingressResources": [
+                    {
+                        "name": "grafana-ingress",
+                        "annotations": {
+                            "nginx.ingress.kubernetes.io/proxy-body-size": "0",
+                            "nginx.ingress.kubernetes.io/whitelist-source-range": "0.0.0.0/0",
+                        },
+                        "spec": {
+                            "rules": [
+                                {
+                                    "host": "grafana",
+                                    "http": {
+                                        "paths": [
+                                            {
+                                                "path": "/",
+                                                "backend": {
+                                                    "serviceName": "grafana",
+                                                    "servicePort": 3000,
+                                                },
+                                            }
+                                        ]
+                                    },
+                                }
+                            ],
+                            "tls": [{"hosts": ["grafana"], "secretName": "grafana"}],
+                        },
+                    }
+                ],
+            },
+        }
+
+        self.harness.charm.on.start.emit()
+
+        # Initializing the prometheus relation
+        relation_id = self.harness.add_relation("prometheus", "prometheus")
+        self.harness.add_relation_unit(relation_id, "prometheus/0")
+        self.harness.update_relation_data(
+            relation_id,
+            "prometheus/0",
+            {
+                "host": "prometheus",
+                "port": "9090",
+            },
+        )
+
+        self.harness.update_config(
+            {
+                "site_url": "https://grafana",
+                "tls_secret_name": "grafana",
+                "ingress_whitelist_source_range": "0.0.0.0/0",
+            }
+        )
+
+        pod_spec, _ = self.harness.get_pod_spec()
+
+        self.assertDictEqual(expected_result, pod_spec)
+
+    def test_on_prometheus_unit_relation_changed(self) -> NoReturn:
+        """Test to see if prometheus relation is updated."""
+        self.harness.charm.on.start.emit()
+
+        relation_id = self.harness.add_relation("prometheus", "prometheus")
+        self.harness.add_relation_unit(relation_id, "prometheus/0")
+        self.harness.update_relation_data(
+            relation_id,
+            "prometheus/0",
+            {
+                "host": "prometheus",
+                "port": "9090",
+            },
+        )
+
+        # Verifying status
+        self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus)
+
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/installers/charm/grafana/tests/test_pod_spec.py b/installers/charm/grafana/tests/test_pod_spec.py
new file mode 100644
index 0000000..842769c
--- /dev/null
+++ b/installers/charm/grafana/tests/test_pod_spec.py
@@ -0,0 +1,636 @@
+#!/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_host": "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."""
+        relation_state = {
+            "prometheus_host": "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_host"),
+                                relation_state.get("prometheus_port"),
+                            )
+                        ),
+                    }
+                ],
+            },
+        ]
+
+        pod_envconfig = pod_spec._make_pod_files(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_host": "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_host"),
+                                            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_host": "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_host"),
+                                            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_host": "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()
