diff --git a/.github/workflows/coverage-badge.yaml b/.github/workflows/coverage-badge.yaml
index bae1212d..af273ce9 100644
--- a/.github/workflows/coverage-badge.yaml
+++ b/.github/workflows/coverage-badge.yaml
@@ -26,7 +26,7 @@ jobs:
         poetry install --with test
     - name: Generate coverage report
       run: |
-        coverage run -m pytest
+        coverage run --omit="src/**/test_*.py,src/codeflare_sdk/common/utils/unit_test_support.py" -m pytest
 
     - name: Coverage Badge
       uses: tj-actions/coverage-badge-py@v2
diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml
index 267e1a6c..51934628 100755
--- a/.github/workflows/unit-tests.yml
+++ b/.github/workflows/unit-tests.yml
@@ -26,7 +26,7 @@ jobs:
           poetry install --with test
       - name: Test with pytest and check coverage
         run: |
-          coverage run -m pytest
+          coverage run --omit="src/**/test_*.py,src/codeflare_sdk/common/utils/unit_test_support.py" -m pytest
           coverage=$(coverage report -m | tail -1 | tail -c 4 | head -c 2)
           if (( $coverage < 90 )); then echo "Coverage failed at ${coverage}%"; exit 1; else echo "Coverage passed, ${coverage}%"; fi
       - name: Upload to Codecov
diff --git a/poetry.lock b/poetry.lock
index 413122c1..2c9b713e 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand.
 
 [[package]]
 name = "aiohappyeyeballs"
@@ -880,6 +880,17 @@ files = [
     {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"},
 ]
 
+[[package]]
+name = "durationpy"
+version = "0.9"
+description = "Module for converting between datetime.timedelta and Go's Duration strings."
+optional = false
+python-versions = "*"
+files = [
+    {file = "durationpy-0.9-py3-none-any.whl", hash = "sha256:e65359a7af5cedad07fb77a2dd3f390f8eb0b74cb845589fa6c057086834dd38"},
+    {file = "durationpy-0.9.tar.gz", hash = "sha256:fd3feb0a69a0057d582ef643c355c40d2fa1c942191f914d12203b1a01ac722a"},
+]
+
 [[package]]
 name = "exceptiongroup"
 version = "1.2.2"
@@ -1749,23 +1760,24 @@ files = [
 
 [[package]]
 name = "kubernetes"
-version = "26.1.0"
+version = "31.0.0"
 description = "Kubernetes python client"
 optional = false
 python-versions = ">=3.6"
 files = [
-    {file = "kubernetes-26.1.0-py2.py3-none-any.whl", hash = "sha256:e3db6800abf7e36c38d2629b5cb6b74d10988ee0cba6fba45595a7cbe60c0042"},
-    {file = "kubernetes-26.1.0.tar.gz", hash = "sha256:5854b0c508e8d217ca205591384ab58389abdae608576f9c9afc35a3c76a366c"},
+    {file = "kubernetes-31.0.0-py2.py3-none-any.whl", hash = "sha256:bf141e2d380c8520eada8b351f4e319ffee9636328c137aa432bc486ca1200e1"},
+    {file = "kubernetes-31.0.0.tar.gz", hash = "sha256:28945de906c8c259c1ebe62703b56a03b714049372196f854105afe4e6d014c0"},
 ]
 
 [package.dependencies]
 certifi = ">=14.05.14"
+durationpy = ">=0.7"
 google-auth = ">=1.0.1"
+oauthlib = ">=3.2.2"
 python-dateutil = ">=2.5.3"
 pyyaml = ">=5.4.1"
 requests = "*"
 requests-oauthlib = "*"
-setuptools = ">=21.0.0"
 six = ">=1.9.0"
 urllib3 = ">=1.24.2"
 websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0"
@@ -4212,4 +4224,4 @@ type = ["pytest-mypy"]
 [metadata]
 lock-version = "2.0"
 python-versions = "^3.9"
-content-hash = "a8bc47ba5ed0d0d30a52b50bf986b85da8cdc8b85f9dbe47ebae32dab695e95f"
+content-hash = "6e5e74183be00c02f89e0da419aec0b032025410f8d2ae8685263fb5bc38b911"
diff --git a/pyproject.toml b/pyproject.toml
index ef88b255..d31ea2e1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -24,7 +24,7 @@ python = "^3.9"
 openshift-client = "1.0.18"
 rich = ">=12.5,<14.0"
 ray = {version = "2.35.0", extras = ["data", "default"]}
-kubernetes = ">= 25.3.0, < 27"
+kubernetes = ">= 27.2.0"
 cryptography = "43.0.3"
 executing = "1.2.0"
 pydantic = "< 2"
diff --git a/src/codeflare_sdk/common/utils/unit_test_support.py b/src/codeflare_sdk/common/utils/unit_test_support.py
index 9345fbc3..8e034378 100644
--- a/src/codeflare_sdk/common/utils/unit_test_support.py
+++ b/src/codeflare_sdk/common/utils/unit_test_support.py
@@ -55,7 +55,7 @@ def createClusterWrongType():
     config = ClusterConfiguration(
         name="unit-test-cluster",
         namespace="ns",
-        num_workers=2,
+        num_workers=True,
         worker_cpu_requests=[],
         worker_cpu_limits=4,
         worker_memory_requests=5,
diff --git a/src/codeflare_sdk/ray/cluster/config.py b/src/codeflare_sdk/ray/cluster/config.py
index f321c278..b8b097f8 100644
--- a/src/codeflare_sdk/ray/cluster/config.py
+++ b/src/codeflare_sdk/ray/cluster/config.py
@@ -242,13 +242,15 @@ def _memory_to_resource(self):
 
     def _validate_types(self):
         """Validate the types of all fields in the ClusterConfiguration dataclass."""
+        errors = []
         for field_info in fields(self):
             value = getattr(self, field_info.name)
             expected_type = field_info.type
             if not self._is_type(value, expected_type):
-                raise TypeError(
-                    f"'{field_info.name}' should be of type {expected_type}"
-                )
+                errors.append(f"'{field_info.name}' should be of type {expected_type}.")
+
+        if errors:
+            raise TypeError("Type validation failed:\n" + "\n".join(errors))
 
     @staticmethod
     def _is_type(value, expected_type):
@@ -268,6 +270,10 @@ def check_type(value, expected_type):
                 )
             if origin_type is tuple:
                 return all(check_type(elem, etype) for elem, etype in zip(value, args))
+            if expected_type is int:
+                return isinstance(value, int) and not isinstance(value, bool)
+            if expected_type is bool:
+                return isinstance(value, bool)
             return isinstance(value, expected_type)
 
         return check_type(value, expected_type)
diff --git a/src/codeflare_sdk/ray/cluster/test_config.py b/src/codeflare_sdk/ray/cluster/test_config.py
index 1423fc2b..3416fc28 100644
--- a/src/codeflare_sdk/ray/cluster/test_config.py
+++ b/src/codeflare_sdk/ray/cluster/test_config.py
@@ -108,9 +108,11 @@ def test_all_config_params_aw(mocker):
 
 
 def test_config_creation_wrong_type():
-    with pytest.raises(TypeError):
+    with pytest.raises(TypeError) as error_info:
         createClusterWrongType()
 
+    assert len(str(error_info.value).splitlines()) == 4
+
 
 def test_cluster_config_deprecation_conversion(mocker):
     config = ClusterConfiguration(
diff --git a/tests/e2e/mnist_raycluster_sdk_aw_kind_test.py b/tests/e2e/mnist_raycluster_sdk_aw_kind_test.py
index 4623a9e5..b94fe252 100644
--- a/tests/e2e/mnist_raycluster_sdk_aw_kind_test.py
+++ b/tests/e2e/mnist_raycluster_sdk_aw_kind_test.py
@@ -2,7 +2,7 @@
 
 from time import sleep
 
-from codeflare_sdk import Cluster, ClusterConfiguration, TokenAuthentication
+from codeflare_sdk import Cluster, ClusterConfiguration
 from codeflare_sdk.ray.client import RayJobClient
 
 import pytest
@@ -68,6 +68,9 @@ def run_mnist_raycluster_sdk_kind(
         cluster.details()
 
         self.assert_jobsubmit_withoutlogin_kind(cluster, accelerator, number_of_gpus)
+        assert_get_cluster_and_jobsubmit(
+            self, "mnist", accelerator="gpu", number_of_gpus=1
+        )
 
     # Assertions
 
@@ -106,8 +109,6 @@ def assert_jobsubmit_withoutlogin_kind(self, cluster, accelerator, number_of_gpu
 
         client.delete_job(submission_id)
 
-        cluster.down()
-
     def assert_job_completion(self, status):
         if status == "SUCCEEDED":
             print(f"Job has completed: '{status}'")
diff --git a/tests/e2e/mnist_raycluster_sdk_kind_test.py b/tests/e2e/mnist_raycluster_sdk_kind_test.py
index 6bfb19af..42d0c46b 100644
--- a/tests/e2e/mnist_raycluster_sdk_kind_test.py
+++ b/tests/e2e/mnist_raycluster_sdk_kind_test.py
@@ -2,7 +2,7 @@
 
 from time import sleep
 
-from codeflare_sdk import Cluster, ClusterConfiguration, TokenAuthentication
+from codeflare_sdk import Cluster, ClusterConfiguration
 from codeflare_sdk.ray.client import RayJobClient
 
 import pytest
@@ -44,8 +44,6 @@ def run_mnist_raycluster_sdk_kind(
                 num_workers=1,
                 head_cpu_requests="500m",
                 head_cpu_limits="500m",
-                head_memory_requests=2,
-                head_memory_limits=2,
                 worker_cpu_requests="500m",
                 worker_cpu_limits=1,
                 worker_memory_requests=1,
@@ -68,6 +66,10 @@ def run_mnist_raycluster_sdk_kind(
 
         self.assert_jobsubmit_withoutlogin_kind(cluster, accelerator, number_of_gpus)
 
+        assert_get_cluster_and_jobsubmit(
+            self, "mnist", accelerator="gpu", number_of_gpus=1
+        )
+
     # Assertions
 
     def assert_jobsubmit_withoutlogin_kind(self, cluster, accelerator, number_of_gpus):
@@ -105,8 +107,6 @@ def assert_jobsubmit_withoutlogin_kind(self, cluster, accelerator, number_of_gpu
 
         client.delete_job(submission_id)
 
-        cluster.down()
-
     def assert_job_completion(self, status):
         if status == "SUCCEEDED":
             print(f"Job has completed: '{status}'")
diff --git a/tests/e2e/mnist_raycluster_sdk_oauth_test.py b/tests/e2e/mnist_raycluster_sdk_oauth_test.py
index d3e69868..212c9784 100644
--- a/tests/e2e/mnist_raycluster_sdk_oauth_test.py
+++ b/tests/e2e/mnist_raycluster_sdk_oauth_test.py
@@ -2,7 +2,11 @@
 
 from time import sleep
 
-from codeflare_sdk import Cluster, ClusterConfiguration, TokenAuthentication
+from codeflare_sdk import (
+    Cluster,
+    ClusterConfiguration,
+    TokenAuthentication,
+)
 from codeflare_sdk.ray.client import RayJobClient
 
 import pytest
@@ -44,8 +48,6 @@ def run_mnist_raycluster_sdk_oauth(self):
                 num_workers=1,
                 head_cpu_requests="500m",
                 head_cpu_limits="500m",
-                head_memory_requests=4,
-                head_memory_limits=4,
                 worker_cpu_requests=1,
                 worker_cpu_limits=1,
                 worker_memory_requests=1,
@@ -68,6 +70,7 @@ def run_mnist_raycluster_sdk_oauth(self):
 
         self.assert_jobsubmit_withoutLogin(cluster)
         self.assert_jobsubmit_withlogin(cluster)
+        assert_get_cluster_and_jobsubmit(self, "mnist")
 
     # Assertions
 
@@ -132,8 +135,6 @@ def assert_jobsubmit_withlogin(self, cluster):
 
         client.delete_job(submission_id)
 
-        cluster.down()
-
     def assert_job_completion(self, status):
         if status == "SUCCEEDED":
             print(f"Job has completed: '{status}'")
diff --git a/tests/e2e/support.py b/tests/e2e/support.py
index d76b460c..2ff33e91 100644
--- a/tests/e2e/support.py
+++ b/tests/e2e/support.py
@@ -3,6 +3,7 @@
 import random
 import string
 import subprocess
+from codeflare_sdk import get_cluster
 from kubernetes import client, config
 import kubernetes.client
 from codeflare_sdk.common.kubernetes_cluster.kube_api_helpers import (
@@ -348,3 +349,45 @@ def get_nodes_by_label(self, node_labels):
     label_selector = ",".join(f"{k}={v}" for k, v in node_labels.items())
     nodes = self.api_instance.list_node(label_selector=label_selector)
     return [node.metadata.name for node in nodes.items]
+
+
+def assert_get_cluster_and_jobsubmit(
+    self, cluster_name, accelerator=None, number_of_gpus=None
+):
+    # Retrieve the cluster
+    cluster = get_cluster(cluster_name, self.namespace, False)
+
+    cluster.details()
+
+    # Initialize the job client
+    client = cluster.job_client
+
+    # Submit a job and get the submission ID
+    env_vars = (
+        get_setup_env_variables(ACCELERATOR=accelerator)
+        if accelerator
+        else get_setup_env_variables()
+    )
+    submission_id = client.submit_job(
+        entrypoint="python mnist.py",
+        runtime_env={
+            "working_dir": "./tests/e2e/",
+            "pip": "./tests/e2e/mnist_pip_requirements.txt",
+            "env_vars": env_vars,
+        },
+        entrypoint_num_cpus=1 if number_of_gpus is None else None,
+        entrypoint_num_gpus=number_of_gpus,
+    )
+    print(f"Submitted job with ID: {submission_id}")
+
+    # Fetch the list of jobs and validate
+    job_list = client.list_jobs()
+    print(f"List of Jobs: {job_list}")
+
+    # Validate the number of jobs in the list
+    assert len(job_list) == 1
+
+    # Validate the submission ID matches
+    assert job_list[0].submission_id == submission_id
+
+    cluster.down()
diff --git a/ui-tests/tests/widget_notebook_example.test.ts b/ui-tests/tests/widget_notebook_example.test.ts
index d37c225c..3360ba83 100644
--- a/ui-tests/tests/widget_notebook_example.test.ts
+++ b/ui-tests/tests/widget_notebook_example.test.ts
@@ -81,8 +81,8 @@ test.describe("Visual Regression", () => {
 
     await interactWithWidget(page, upDownWidgetCellIndex, 'button:has-text("Cluster Down")', async (button) => {
       await button.click();
-      const clusterDownMessage = await page.waitForSelector('text=No instances found, nothing to be done.', { timeout: 5000 });
-      expect(clusterDownMessage).not.toBeNull();
+      const clusterDownMessage = await page.waitForSelector('text=The requested resource could not be located.', { timeout: 5000 });
+      expect(await clusterDownMessage.innerText()).toContain('The requested resource could not be located.');
     });
 
     await interactWithWidget(page, upDownWidgetCellIndex, 'button:has-text("Cluster Up")', async (button) => {
diff --git a/ui-tests/yarn.lock b/ui-tests/yarn.lock
index cf0b5b0c..bf9629eb 100644
--- a/ui-tests/yarn.lock
+++ b/ui-tests/yarn.lock
@@ -2059,9 +2059,9 @@ ms@2.0.0:
   integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
 
 nanoid@^3.3.7:
-  version "3.3.7"
-  resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
-  integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+  version "3.3.8"
+  resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
+  integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
 
 node-fetch@^2.6.7:
   version "2.7.0"
