From 6e43e0905be46d5707b7518ecbb7ab99d645dd25 Mon Sep 17 00:00:00 2001
From: Pat O'Connor <paoconno@redhat.com>
Date: Tue, 1 Jul 2025 09:41:13 +0100
Subject: [PATCH 1/5] task(RHOAIENG-28599): Removed dep fields min_cpus
 max_cpus min_memory max_memory

Signed-off-by: Pat O'Connor <paoconno@redhat.com>
---
 .../user-docs/cluster-configuration.rst       |  8 -------
 src/codeflare_sdk/ray/cluster/config.py       | 24 -------------------
 src/codeflare_sdk/ray/cluster/test_config.py  | 10 +++-----
 3 files changed, 3 insertions(+), 39 deletions(-)

diff --git a/docs/sphinx/user-docs/cluster-configuration.rst b/docs/sphinx/user-docs/cluster-configuration.rst
index ad4e248e..18fceeac 100644
--- a/docs/sphinx/user-docs/cluster-configuration.rst
+++ b/docs/sphinx/user-docs/cluster-configuration.rst
@@ -172,11 +172,3 @@ deprecated.
      - ``head_cpu_requests``, ``head_cpu_limits``
    * - ``head_memory``
      - ``head_memory_requests``, ``head_memory_limits``
-   * - ``min_cpus``
-     - ``worker_cpu_requests``
-   * - ``max_cpus``
-     - ``worker_cpu_limits``
-   * - ``min_memory``
-     - ``worker_memory_requests``
-   * - ``max_memory``
-     - ``worker_memory_limits``
diff --git a/src/codeflare_sdk/ray/cluster/config.py b/src/codeflare_sdk/ray/cluster/config.py
index bce54c32..ec89924a 100644
--- a/src/codeflare_sdk/ray/cluster/config.py
+++ b/src/codeflare_sdk/ray/cluster/config.py
@@ -58,16 +58,8 @@ class ClusterConfiguration:
             A dictionary of extended resource requests for the head node. ex: {"nvidia.com/gpu": 1}
         head_tolerations:
             List of tolerations for head nodes.
-        min_cpus:
-            The minimum number of CPUs to allocate to each worker.
-        max_cpus:
-            The maximum number of CPUs to allocate to each worker.
         num_workers:
             The number of workers to create.
-        min_memory:
-            The minimum amount of memory to allocate to each worker.
-        max_memory:
-            The maximum amount of memory to allocate to each worker.
         worker_tolerations:
             List of tolerations for worker nodes.
         appwrapper:
@@ -122,13 +114,9 @@ class ClusterConfiguration:
     head_tolerations: Optional[List[V1Toleration]] = None
     worker_cpu_requests: Union[int, str] = 1
     worker_cpu_limits: Union[int, str] = 1
-    min_cpus: Optional[Union[int, str]] = None  # Deprecating
-    max_cpus: Optional[Union[int, str]] = None  # Deprecating
     num_workers: int = 1
     worker_memory_requests: Union[int, str] = 2
     worker_memory_limits: Union[int, str] = 2
-    min_memory: Optional[Union[int, str]] = None  # Deprecating
-    max_memory: Optional[Union[int, str]] = None  # Deprecating
     worker_tolerations: Optional[List[V1Toleration]] = None
     appwrapper: bool = False
     envs: Dict[str, str] = field(default_factory=dict)
@@ -250,12 +238,6 @@ def _cpu_to_resource(self):
                 "head_cpus is being deprecated, use head_cpu_requests and head_cpu_limits"
             )
             self.head_cpu_requests = self.head_cpu_limits = self.head_cpus
-        if self.min_cpus:
-            warnings.warn("min_cpus is being deprecated, use worker_cpu_requests")
-            self.worker_cpu_requests = self.min_cpus
-        if self.max_cpus:
-            warnings.warn("max_cpus is being deprecated, use worker_cpu_limits")
-            self.worker_cpu_limits = self.max_cpus
 
     def _memory_to_resource(self):
         if self.head_memory:
@@ -263,12 +245,6 @@ def _memory_to_resource(self):
                 "head_memory is being deprecated, use head_memory_requests and head_memory_limits"
             )
             self.head_memory_requests = self.head_memory_limits = self.head_memory
-        if self.min_memory:
-            warnings.warn("min_memory is being deprecated, use worker_memory_requests")
-            self.worker_memory_requests = f"{self.min_memory}G"
-        if self.max_memory:
-            warnings.warn("max_memory is being deprecated, use worker_memory_limits")
-            self.worker_memory_limits = f"{self.max_memory}G"
 
     def _validate_types(self):
         """Validate the types of all fields in the ClusterConfiguration dataclass."""
diff --git a/src/codeflare_sdk/ray/cluster/test_config.py b/src/codeflare_sdk/ray/cluster/test_config.py
index 23da97c3..6f002df1 100644
--- a/src/codeflare_sdk/ray/cluster/test_config.py
+++ b/src/codeflare_sdk/ray/cluster/test_config.py
@@ -141,19 +141,15 @@ def test_cluster_config_deprecation_conversion(mocker):
         name="test",
         head_cpus=3,
         head_memory=16,
-        min_memory=3,
-        max_memory=4,
-        min_cpus=1,
-        max_cpus=2,
     )
     assert config.head_cpu_requests == 3
     assert config.head_cpu_limits == 3
     assert config.head_memory_requests == "16G"
     assert config.head_memory_limits == "16G"
-    assert config.worker_memory_requests == "3G"
-    assert config.worker_memory_limits == "4G"
+    assert config.worker_memory_requests == "2G"
+    assert config.worker_memory_limits == "2G"
     assert config.worker_cpu_requests == 1
-    assert config.worker_cpu_limits == 2
+    assert config.worker_cpu_limits == 1
 
 
 def test_gcs_fault_tolerance_config_validation():

From 6e47ec94bbc8552aee099b82c4d9df9b789cc761 Mon Sep 17 00:00:00 2001
From: Pawel Paszki <ppaszki@redhat.com>
Date: Mon, 7 Jul 2025 12:48:49 +0100
Subject: [PATCH 2/5] test: increase limits to fix ray cluster issues in
 upgrade tests (#854)

---
 tests/upgrade/raycluster_sdk_upgrade_test.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/tests/upgrade/raycluster_sdk_upgrade_test.py b/tests/upgrade/raycluster_sdk_upgrade_test.py
index 7c8b2922..7a6d583e 100644
--- a/tests/upgrade/raycluster_sdk_upgrade_test.py
+++ b/tests/upgrade/raycluster_sdk_upgrade_test.py
@@ -50,12 +50,12 @@ def run_mnist_raycluster_sdk_oauth(self):
                 num_workers=1,
                 head_cpu_requests=1,
                 head_cpu_limits=1,
-                head_memory_requests=4,
-                head_memory_limits=4,
+                head_memory_requests=6,
+                head_memory_limits=8,
                 worker_cpu_requests=1,
                 worker_cpu_limits=1,
-                worker_memory_requests=4,
-                worker_memory_limits=4,
+                worker_memory_requests=6,
+                worker_memory_limits=8,
                 image=ray_image,
                 write_to_file=True,
                 verify_tls=False,

From fc6baa2482ff129264b9a312d146a5552f91e576 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com>
Date: Mon, 7 Jul 2025 11:49:44 +0000
Subject: [PATCH 3/5] Updated coverage.svg

---
 coverage.svg | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/coverage.svg b/coverage.svg
index 59d64b37..a8c7e72a 100644
--- a/coverage.svg
+++ b/coverage.svg
@@ -15,7 +15,7 @@
     <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
         <text x="31.5" y="15" fill="#010101" fill-opacity=".3">coverage</text>
         <text x="31.5" y="14">coverage</text>
-        <text x="80" y="15" fill="#010101" fill-opacity=".3">93%</text>
-        <text x="80" y="14">93%</text>
+        <text x="80" y="15" fill="#010101" fill-opacity=".3">92%</text>
+        <text x="80" y="14">92%</text>
     </g>
 </svg>

From 529e32d4766671ab81c2c4f036212afce9c355ae Mon Sep 17 00:00:00 2001
From: kryanbeane <bryankeane0@gmail.com>
Date: Fri, 4 Jul 2025 10:42:18 +0100
Subject: [PATCH 4/5] RHOAIENG-27828: Update Ray Version references

---
 .../additional-demos/local_interactive.ipynb  |   2 +-
 .../additional-demos/ray_job_client.ipynb     |   2 +-
 demo-notebooks/guided-demos/0_basic_ray.ipynb |   2 +-
 .../guided-demos/1_cluster_job_client.ipynb   |   2 +-
 .../guided-demos/2_basic_interactive.ipynb    |   2 +-
 .../guided-demos/3_widget_example.ipynb       |   2 +-
 .../1_cluster_job_client.ipynb                |   2 +-
 .../2_basic_interactive.ipynb                 |   2 +-
 .../notebook-ex-outputs/interactivetest.yaml  |   6 +-
 .../notebook-ex-outputs/jobtest.yaml          |   6 +-
 .../notebook-ex-outputs/raytest.yaml          |   6 +-
 .../preview_nbs/0_basic_ray.ipynb             |   2 +-
 .../preview_nbs/1_cluster_job_client.ipynb    |   2 +-
 .../preview_nbs/2_basic_interactive.ipynb     |   2 +-
 .../user-docs/cluster-configuration.rst       |   4 +-
 poetry.lock                                   | 196 +++++++++++++++---
 pyproject.toml                                |   2 +-
 src/codeflare_sdk/common/utils/constants.py   |   2 +-
 .../appwrapper/test-case-bad.yaml             |   2 +-
 .../appwrapper/unit-test-all-params.yaml      |   2 +-
 tests/test_cluster_yamls/kueue/aw_kueue.yaml  |   2 +-
 .../kueue/ray_cluster_kueue.yaml              |   2 +-
 .../ray/default-appwrapper.yaml               |   2 +-
 .../ray/default-ray-cluster.yaml              |   2 +-
 .../ray/unit-test-all-params.yaml             |   2 +-
 .../support_clusters/test-aw-a.yaml           |   2 +-
 .../support_clusters/test-aw-b.yaml           |   2 +-
 .../support_clusters/test-rc-a.yaml           |   2 +-
 .../support_clusters/test-rc-b.yaml           |   2 +-
 29 files changed, 197 insertions(+), 69 deletions(-)

diff --git a/demo-notebooks/additional-demos/local_interactive.ipynb b/demo-notebooks/additional-demos/local_interactive.ipynb
index be30ba40..a46e5d9f 100644
--- a/demo-notebooks/additional-demos/local_interactive.ipynb
+++ b/demo-notebooks/additional-demos/local_interactive.ipynb
@@ -37,7 +37,7 @@
     "\n",
     "NOTE: The default images used by the CodeFlare SDK for creating a RayCluster resource depend on the installed Python version:\n",
     "\n",
-    "- For Python 3.11: 'quay.io/modh/ray:2.46.0-py311-cu121'\n",
+    "- For Python 3.11: 'quay.io/modh/ray:2.47.1-py311-cu121'\n",
     "\n",
     "If you prefer to use a custom Ray image that better suits your needs, you can specify it in the image field to override the default."
    ]
diff --git a/demo-notebooks/additional-demos/ray_job_client.ipynb b/demo-notebooks/additional-demos/ray_job_client.ipynb
index 599b2425..99187b4a 100644
--- a/demo-notebooks/additional-demos/ray_job_client.ipynb
+++ b/demo-notebooks/additional-demos/ray_job_client.ipynb
@@ -43,7 +43,7 @@
     "\n",
     "NOTE: The default images used by the CodeFlare SDK for creating a RayCluster resource depend on the installed Python version:\n",
     "\n",
-    "- For Python 3.11: 'quay.io/modh/ray:2.46.0-py311-cu121'\n",
+    "- For Python 3.11: 'quay.io/modh/ray:2.47.1-py311-cu121'\n",
     "\n",
     "If you prefer to use a custom Ray image that better suits your needs, you can specify it in the image field to override the default."
    ]
diff --git a/demo-notebooks/guided-demos/0_basic_ray.ipynb b/demo-notebooks/guided-demos/0_basic_ray.ipynb
index 7e3bbd08..9a2ed8ca 100644
--- a/demo-notebooks/guided-demos/0_basic_ray.ipynb
+++ b/demo-notebooks/guided-demos/0_basic_ray.ipynb
@@ -49,7 +49,7 @@
     "\n",
     "NOTE: The default images used by the CodeFlare SDK for creating a RayCluster resource depend on the installed Python version:\n",
     "\n",
-    "- For Python 3.11: 'quay.io/modh/ray:2.46.0-py311-cu121'\n",
+    "- For Python 3.11: 'quay.io/modh/ray:2.47.1-py311-cu121'\n",
     "\n",
     "If you prefer to use a custom Ray image that better suits your needs, you can specify it in the image field to override the default."
    ]
diff --git a/demo-notebooks/guided-demos/1_cluster_job_client.ipynb b/demo-notebooks/guided-demos/1_cluster_job_client.ipynb
index 2aef3184..725866d7 100644
--- a/demo-notebooks/guided-demos/1_cluster_job_client.ipynb
+++ b/demo-notebooks/guided-demos/1_cluster_job_client.ipynb
@@ -43,7 +43,7 @@
     "\n",
     "NOTE: The default images used by the CodeFlare SDK for creating a RayCluster resource depend on the installed Python version:\n",
     "\n",
-    "- For Python 3.11: 'quay.io/modh/ray:2.46.0-py311-cu121'\n",
+    "- For Python 3.11: 'quay.io/modh/ray:2.47.1-py311-cu121'\n",
     "\n",
     "If you prefer to use a custom Ray image that better suits your needs, you can specify it in the image field to override the default."
    ]
diff --git a/demo-notebooks/guided-demos/2_basic_interactive.ipynb b/demo-notebooks/guided-demos/2_basic_interactive.ipynb
index df7728b3..890bdb47 100644
--- a/demo-notebooks/guided-demos/2_basic_interactive.ipynb
+++ b/demo-notebooks/guided-demos/2_basic_interactive.ipynb
@@ -46,7 +46,7 @@
     "\n",
     "NOTE: The default images used by the CodeFlare SDK for creating a RayCluster resource depend on the installed Python version:\n",
     "\n",
-    "- For Python 3.11: 'quay.io/modh/ray:2.46.0-py311-cu121'\n",
+    "- For Python 3.11: 'quay.io/modh/ray:2.47.1-py311-cu121'\n",
     "\n",
     "If you prefer to use a custom Ray image that better suits your needs, you can specify it in the image field to override the default."
    ]
diff --git a/demo-notebooks/guided-demos/3_widget_example.ipynb b/demo-notebooks/guided-demos/3_widget_example.ipynb
index 56bd0a5e..d09271c9 100644
--- a/demo-notebooks/guided-demos/3_widget_example.ipynb
+++ b/demo-notebooks/guided-demos/3_widget_example.ipynb
@@ -49,7 +49,7 @@
     "\n",
     "NOTE: The default images used by the CodeFlare SDK for creating a RayCluster resource depend on the installed Python version:\n",
     "\n",
-    "- For Python 3.11: 'quay.io/modh/ray:2.46.0-py311-cu121'\n",
+    "- For Python 3.11: 'quay.io/modh/ray:2.47.1-py311-cu121'\n",
     "\n",
     "If you prefer to use a custom Ray image that better suits your needs, you can specify it in the image field to override the default."
    ]
diff --git a/demo-notebooks/guided-demos/notebook-ex-outputs/1_cluster_job_client.ipynb b/demo-notebooks/guided-demos/notebook-ex-outputs/1_cluster_job_client.ipynb
index b1f0d5f6..6f5850ac 100644
--- a/demo-notebooks/guided-demos/notebook-ex-outputs/1_cluster_job_client.ipynb
+++ b/demo-notebooks/guided-demos/notebook-ex-outputs/1_cluster_job_client.ipynb
@@ -43,7 +43,7 @@
     "\n",
     "NOTE: The default images used by the CodeFlare SDK for creating a RayCluster resource depend on the installed Python version:\n",
     "\n",
-    "- For Python 3.11: 'quay.io/modh/ray:2.46.0-py311-cu121'\n",
+    "- For Python 3.11: 'quay.io/modh/ray:2.47.1-py311-cu121'\n",
     "\n",
     "If you prefer to use a custom Ray image that better suits your needs, you can specify it in the image field to override the default."
    ]
diff --git a/demo-notebooks/guided-demos/notebook-ex-outputs/2_basic_interactive.ipynb b/demo-notebooks/guided-demos/notebook-ex-outputs/2_basic_interactive.ipynb
index bf0b49de..58a6c9e2 100644
--- a/demo-notebooks/guided-demos/notebook-ex-outputs/2_basic_interactive.ipynb
+++ b/demo-notebooks/guided-demos/notebook-ex-outputs/2_basic_interactive.ipynb
@@ -46,7 +46,7 @@
     "\n",
     "NOTE: The default images used by the CodeFlare SDK for creating a RayCluster resource depend on the installed Python version:\n",
     "\n",
-    "- For Python 3.11: 'quay.io/modh/ray:2.46.0-py311-cu121'\n",
+    "- For Python 3.11: 'quay.io/modh/ray:2.47.1-py311-cu121'\n",
     "\n",
     "If you prefer to use a custom Ray image that better suits your needs, you can specify it in the image field to override the default."
    ]
diff --git a/demo-notebooks/guided-demos/notebook-ex-outputs/interactivetest.yaml b/demo-notebooks/guided-demos/notebook-ex-outputs/interactivetest.yaml
index 5182b92a..443da33c 100644
--- a/demo-notebooks/guided-demos/notebook-ex-outputs/interactivetest.yaml
+++ b/demo-notebooks/guided-demos/notebook-ex-outputs/interactivetest.yaml
@@ -81,7 +81,7 @@ spec:
                     value: /home/ray/workspace/tls/server.key
                   - name: RAY_TLS_CA_CERT
                     value: /home/ray/workspace/tls/ca.crt
-                  image: quay.io/modh/ray:2.46.0-py311-cu121
+                  image: quay.io/modh/ray:2.47.1-py311-cu121
                   imagePullPolicy: Always
                   lifecycle:
                     preStop:
@@ -108,7 +108,7 @@ spec:
                       memory: 8G
                       nvidia.com/gpu: 0
                 imagePullSecrets: []
-          rayVersion: 2.1.0
+          rayVersion: 2.47.1
           workerGroupSpecs:
           - groupName: small-group-interactivetest
             maxReplicas: 2
@@ -147,7 +147,7 @@ spec:
                     value: /home/ray/workspace/tls/server.key
                   - name: RAY_TLS_CA_CERT
                     value: /home/ray/workspace/tls/ca.crt
-                  image: quay.io/modh/ray:2.46.0-py311-cu121
+                  image: quay.io/modh/ray:2.47.1-py311-cu121
                   lifecycle:
                     preStop:
                       exec:
diff --git a/demo-notebooks/guided-demos/notebook-ex-outputs/jobtest.yaml b/demo-notebooks/guided-demos/notebook-ex-outputs/jobtest.yaml
index 5df084fd..5d5b0b0e 100644
--- a/demo-notebooks/guided-demos/notebook-ex-outputs/jobtest.yaml
+++ b/demo-notebooks/guided-demos/notebook-ex-outputs/jobtest.yaml
@@ -70,7 +70,7 @@ spec:
                     value: /home/ray/workspace/tls/server.key
                   - name: RAY_TLS_CA_CERT
                     value: /home/ray/workspace/tls/ca.crt
-                  image: quay.io/modh/ray:2.46.0-py311-cu121
+                  image: quay.io/modh/ray:2.47.1-py311-cu121
                   imagePullPolicy: Always
                   lifecycle:
                     preStop:
@@ -97,7 +97,7 @@ spec:
                       memory: 8G
                       nvidia.com/gpu: 0
                 imagePullSecrets: []
-          rayVersion: 2.1.0
+          rayVersion: 2.47.1
           workerGroupSpecs:
           - groupName: small-group-jobtest
             maxReplicas: 2
@@ -127,7 +127,7 @@ spec:
                     value: /home/ray/workspace/tls/server.key
                   - name: RAY_TLS_CA_CERT
                     value: /home/ray/workspace/tls/ca.crt
-                  image: quay.io/modh/ray:2.46.0-py311-cu121
+                  image: quay.io/modh/ray:2.47.1-py311-cu121
                   lifecycle:
                     preStop:
                       exec:
diff --git a/demo-notebooks/guided-demos/notebook-ex-outputs/raytest.yaml b/demo-notebooks/guided-demos/notebook-ex-outputs/raytest.yaml
index ae81b795..81796687 100644
--- a/demo-notebooks/guided-demos/notebook-ex-outputs/raytest.yaml
+++ b/demo-notebooks/guided-demos/notebook-ex-outputs/raytest.yaml
@@ -70,7 +70,7 @@ spec:
                     value: /home/ray/workspace/tls/server.key
                   - name: RAY_TLS_CA_CERT
                     value: /home/ray/workspace/tls/ca.crt
-                  image: quay.io/modh/ray:2.46.0-py311-cu121
+                  image: quay.io/modh/ray:2.47.1-py311-cu121
                   imagePullPolicy: Always
                   lifecycle:
                     preStop:
@@ -97,7 +97,7 @@ spec:
                       memory: 8G
                       nvidia.com/gpu: 0
                 imagePullSecrets: []
-          rayVersion: 2.1.0
+          rayVersion: 2.47.1
           workerGroupSpecs:
           - groupName: small-group-raytest
             maxReplicas: 2
@@ -127,7 +127,7 @@ spec:
                     value: /home/ray/workspace/tls/server.key
                   - name: RAY_TLS_CA_CERT
                     value: /home/ray/workspace/tls/ca.crt
-                  image: quay.io/modh/ray:2.46.0-py311-cu121
+                  image: quay.io/modh/ray:2.47.1-py311-cu121
                   lifecycle:
                     preStop:
                       exec:
diff --git a/demo-notebooks/guided-demos/preview_nbs/0_basic_ray.ipynb b/demo-notebooks/guided-demos/preview_nbs/0_basic_ray.ipynb
index 8d97751a..119d9ce6 100644
--- a/demo-notebooks/guided-demos/preview_nbs/0_basic_ray.ipynb
+++ b/demo-notebooks/guided-demos/preview_nbs/0_basic_ray.ipynb
@@ -49,7 +49,7 @@
     "\n",
     "NOTE: The default images used by the CodeFlare SDK for creating a RayCluster resource depend on the installed Python version:\n",
     "\n",
-    "- For Python 3.11: 'quay.io/modh/ray:2.46.0-py311-cu121'\n",
+    "- For Python 3.11: 'quay.io/modh/ray:2.47.1-py311-cu121'\n",
     "\n",
     "If you prefer to use a custom Ray image that better suits your needs, you can specify it in the image field to override the default."
    ]
diff --git a/demo-notebooks/guided-demos/preview_nbs/1_cluster_job_client.ipynb b/demo-notebooks/guided-demos/preview_nbs/1_cluster_job_client.ipynb
index 58cb4958..db574ceb 100644
--- a/demo-notebooks/guided-demos/preview_nbs/1_cluster_job_client.ipynb
+++ b/demo-notebooks/guided-demos/preview_nbs/1_cluster_job_client.ipynb
@@ -43,7 +43,7 @@
     "\n",
     "NOTE: The default images used by the CodeFlare SDK for creating a RayCluster resource depend on the installed Python version:\n",
     "\n",
-    "- For Python 3.11: 'quay.io/modh/ray:2.46.0-py311-cu121'\n",
+    "- For Python 3.11: 'quay.io/modh/ray:2.47.1-py311-cu121'\n",
     "\n",
     "If you prefer to use a custom Ray image that better suits your needs, you can specify it in the image field to override the default."
    ]
diff --git a/demo-notebooks/guided-demos/preview_nbs/2_basic_interactive.ipynb b/demo-notebooks/guided-demos/preview_nbs/2_basic_interactive.ipynb
index 4538c8d5..8f70f6c2 100644
--- a/demo-notebooks/guided-demos/preview_nbs/2_basic_interactive.ipynb
+++ b/demo-notebooks/guided-demos/preview_nbs/2_basic_interactive.ipynb
@@ -46,7 +46,7 @@
     "\n",
     "NOTE: The default images used by the CodeFlare SDK for creating a RayCluster resource depend on the installed Python version:\n",
     "\n",
-    "- For Python 3.11: 'quay.io/modh/ray:2.46.0-py311-cu121'\n",
+    "- For Python 3.11: 'quay.io/modh/ray:2.47.1-py311-cu121'\n",
     "\n",
     "If you prefer to use a custom Ray image that better suits your needs, you can specify it in the image field to override the default."
    ]
diff --git a/docs/sphinx/user-docs/cluster-configuration.rst b/docs/sphinx/user-docs/cluster-configuration.rst
index 18fceeac..c810148b 100644
--- a/docs/sphinx/user-docs/cluster-configuration.rst
+++ b/docs/sphinx/user-docs/cluster-configuration.rst
@@ -35,12 +35,12 @@ requirements for creating the Ray Cluster.
   The default images used by the CodeFlare SDK for creating
   a RayCluster resource depend on the installed Python version:
 
-  - For Python 3.11: `quay.io/modh/ray:2.46.0-py311-cu121`
+  - For Python 3.11: `quay.io/modh/ray:2.47.1-py311-cu121`
 
   If you prefer to use a custom Ray image that better suits your
   needs, you can specify it in the image field to override the default.
   If you are using ROCm compatible GPUs you
-  can use `quay.io/modh/ray:2.35.0-py311-rocm62`. You can also find
+  can use `quay.io/modh/ray:2.47.1-py311-rocm62`. You can also find
   documentation on building a custom image
   `here <https://github.com/opendatahub-io/distributed-workloads/tree/main/images/runtime/examples>`__.
 
diff --git a/poetry.lock b/poetry.lock
index 08d51b6f..89bca284 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1364,6 +1364,30 @@ files = [
     {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"},
 ]
 
+[[package]]
+name = "importlib-metadata"
+version = "8.7.0"
+description = "Read metadata from Python packages"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+    {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"},
+    {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"},
+]
+
+[package.dependencies]
+zipp = ">=3.20"
+
+[package.extras]
+check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""]
+cover = ["pytest-cov"]
+doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
+enabler = ["pytest-enabler (>=2.2)"]
+perf = ["ipython"]
+test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"]
+type = ["pytest-mypy"]
+
 [[package]]
 name = "iniconfig"
 version = "2.1.0"
@@ -2419,6 +2443,87 @@ paramiko = "*"
 pyyaml = "*"
 six = "*"
 
+[[package]]
+name = "opentelemetry-api"
+version = "1.34.1"
+description = "OpenTelemetry Python API"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+    {file = "opentelemetry_api-1.34.1-py3-none-any.whl", hash = "sha256:b7df4cb0830d5a6c29ad0c0691dbae874d8daefa934b8b1d642de48323d32a8c"},
+    {file = "opentelemetry_api-1.34.1.tar.gz", hash = "sha256:64f0bd06d42824843731d05beea88d4d4b6ae59f9fe347ff7dfa2cc14233bbb3"},
+]
+
+[package.dependencies]
+importlib-metadata = ">=6.0,<8.8.0"
+typing-extensions = ">=4.5.0"
+
+[[package]]
+name = "opentelemetry-exporter-prometheus"
+version = "0.55b1"
+description = "Prometheus Metric Exporter for OpenTelemetry"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+    {file = "opentelemetry_exporter_prometheus-0.55b1-py3-none-any.whl", hash = "sha256:f364fbbff9e5de37a112ff104d1185fb1d7e2046c5ab5911e5afebc7ab3ddf0e"},
+    {file = "opentelemetry_exporter_prometheus-0.55b1.tar.gz", hash = "sha256:d13ec0b22bf394113ff1ada5da98133a4b051779b803dae183188e26c4bd9ee0"},
+]
+
+[package.dependencies]
+opentelemetry-api = ">=1.12,<2.0"
+opentelemetry-sdk = ">=1.34.1,<1.35.0"
+prometheus-client = ">=0.5.0,<1.0.0"
+
+[[package]]
+name = "opentelemetry-proto"
+version = "1.11.1"
+description = "OpenTelemetry Python Proto"
+optional = false
+python-versions = ">=3.6"
+groups = ["main"]
+files = [
+    {file = "opentelemetry-proto-1.11.1.tar.gz", hash = "sha256:5df0ec69510a9e2414c0410d91a698ded5a04d3dd37f7d2a3e119e3c42a30647"},
+    {file = "opentelemetry_proto-1.11.1-py3-none-any.whl", hash = "sha256:4d4663123b4777823aa533f478c6cef3ecbcf696d8dc6ac7fd6a90f37a01eafd"},
+]
+
+[package.dependencies]
+protobuf = ">=3.13.0"
+
+[[package]]
+name = "opentelemetry-sdk"
+version = "1.34.1"
+description = "OpenTelemetry Python SDK"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+    {file = "opentelemetry_sdk-1.34.1-py3-none-any.whl", hash = "sha256:308effad4059562f1d92163c61c8141df649da24ce361827812c40abb2a1e96e"},
+    {file = "opentelemetry_sdk-1.34.1.tar.gz", hash = "sha256:8091db0d763fcd6098d4781bbc80ff0971f94e260739aa6afe6fd379cdf3aa4d"},
+]
+
+[package.dependencies]
+opentelemetry-api = "1.34.1"
+opentelemetry-semantic-conventions = "0.55b1"
+typing-extensions = ">=4.5.0"
+
+[[package]]
+name = "opentelemetry-semantic-conventions"
+version = "0.55b1"
+description = "OpenTelemetry Semantic Conventions"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+    {file = "opentelemetry_semantic_conventions-0.55b1-py3-none-any.whl", hash = "sha256:5da81dfdf7d52e3d37f8fe88d5e771e191de924cfff5f550ab0b8f7b2409baed"},
+    {file = "opentelemetry_semantic_conventions-0.55b1.tar.gz", hash = "sha256:ef95b1f009159c28d7a7849f5cbc71c4c34c845bb514d66adfdf1b3fff3598b3"},
+]
+
+[package.dependencies]
+opentelemetry-api = "1.34.1"
+typing-extensions = ">=4.5.0"
+
 [[package]]
 name = "overrides"
 version = "7.7.0"
@@ -3455,36 +3560,36 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""}
 
 [[package]]
 name = "ray"
-version = "2.46.0"
+version = "2.47.1"
 description = "Ray provides a simple, universal API for building distributed applications."
 optional = false
 python-versions = ">=3.9"
 groups = ["main"]
 files = [
-    {file = "ray-2.46.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:719244b84df79502e5f09497f256618d94d78d66fbaf229422008a0568d3a0ff"},
-    {file = "ray-2.46.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4378a86919e6643238a1094f711b87fa8dc1a18b998d4190f69ab33c64a22a8c"},
-    {file = "ray-2.46.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:396b912a4dbf64966e2fdfca9facbcafe57b792ca4842ac5ae17507fdbdfe89f"},
-    {file = "ray-2.46.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:c12850608c57c8afd9613a9f757d77663c50d4bd4e77ba2f181425052520c01a"},
-    {file = "ray-2.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:bc953aa4879c7a77893f921905df5cf65227cafd94fbc8273bec65ea393eacdd"},
-    {file = "ray-2.46.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:942ba51de6f9cd7fb2ed17618181af48ce6b9517743d3235d846ec32295eca76"},
-    {file = "ray-2.46.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af84f3ed0854bb6de28192ca9e0a3bfa1eb34d69f118ae6348522198896480c8"},
-    {file = "ray-2.46.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:81c8ce8b7ba33cb607ec78f5eb2555470e3046bb317732d8282e8189bb58ccbd"},
-    {file = "ray-2.46.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:d4ddedc3f4d48df564bcee7b131c98c9f898fef0a57483f4ba335f47f951a62f"},
-    {file = "ray-2.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:130415c4d231830156f37ce70acbdb5fdee10f6886adc4e85bdc4533d51c24c6"},
-    {file = "ray-2.46.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:d1f37ead29299637144726f809c2e0ff958dd9c0e75930ef614156d6a0a3a57f"},
-    {file = "ray-2.46.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7a064acfeee7f0677d9e3f25daef9c59593559faea764b44a3e2c5331d5d832"},
-    {file = "ray-2.46.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:006cbe1a8fdc37664114aa218773100ee891399785e256c202e48958d2dac167"},
-    {file = "ray-2.46.0-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:5cec1edda93f618ffd2301f81d5398037f03fa9b16825e7e4d8a00ae7a9a4381"},
-    {file = "ray-2.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:7d3160f8d187baaea91a86d16a9fd81136cf8607419c94b7a74d66fce774b5c2"},
-    {file = "ray-2.46.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:b2fc2c43ea0a37521193c61ef9a27b6fca8dbab116a58a52fd44344cd73e1ece"},
-    {file = "ray-2.46.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4296dd8c0174256a04ee4b54abe013b6802a45fb85fb7cfdb1375231965d6d4d"},
-    {file = "ray-2.46.0-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:808daece1f12bd8924b9c6382a0f98da6f5c6886cfb271ed8d89407a89413cd5"},
-    {file = "ray-2.46.0-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:a5a28c0a311d2c3221dcf729c40898a6df82466bb5af21e81be0453e09856adf"},
-    {file = "ray-2.46.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:e0ec198c16d0e9af7f03242ef7ad7d548eee37a918193917278a124ddd57410a"},
-    {file = "ray-2.46.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e31568818973efa4f8ce18b82bce03089395a62ac9fe639e94d755959f607fe9"},
-    {file = "ray-2.46.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7c44a98cb24f4905e898d05b787cbe9f267a9f66c1e1f8cda50814f8b3673be2"},
-    {file = "ray-2.46.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:91ea998a49578b1450cbef60705f6ece8622a262a3d764d5c99ba89b741de5d0"},
-    {file = "ray-2.46.0-cp39-cp39-win_amd64.whl", hash = "sha256:018e98c9745eae53b53ad14fef1ca1c43bb64c39c3cceb9e6d4517729396003b"},
+    {file = "ray-2.47.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:36a30930e8d265e708df96f37f6f1f5484f4b97090d505912f992e045a69d310"},
+    {file = "ray-2.47.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7c03a1e366d3a868a55f8c2f728f5ce35ac85ddf093ac81d0c1a35bf1c25c377"},
+    {file = "ray-2.47.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:6fc7df8657b8df684b77c2d1b643137ad745aa1c12ade34743f06cca79003df0"},
+    {file = "ray-2.47.1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:84a96b4720175a0000521a48eb7aa915f3b419bb5cd6172d8dee005c3f23b813"},
+    {file = "ray-2.47.1-cp310-cp310-win_amd64.whl", hash = "sha256:44900a1a72cb3bfb331db160a8975737c25945a97f376c70e72ccf35adf3b744"},
+    {file = "ray-2.47.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a640d447e0e6cf63f85b9220c883ec02bb2b8e40a9c1d84efa012795c769ba68"},
+    {file = "ray-2.47.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:feeba1e715cfd8737d3adcd2018d0cdabb7c6084fa4b093e638e6c7d42f3c956"},
+    {file = "ray-2.47.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:db5ff652e9035f03c65e1742a706b76519f6e8a6744cc005396053ac8766fc46"},
+    {file = "ray-2.47.1-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:48961229614b2b56a535be510c8abc76e99a9aa7fa195b5c949bd0c6c69af40a"},
+    {file = "ray-2.47.1-cp311-cp311-win_amd64.whl", hash = "sha256:bd1cba64070db06bbf79c0e075cdc4529193e2d0b19564f4f057b4193b29e912"},
+    {file = "ray-2.47.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:322049c4546cf67e5efdad90c371c5508acbb193e5aaaf4038103c6c5ce1f578"},
+    {file = "ray-2.47.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:e6d9c78e53ac89cabbc4056aecfec53c506c692e3132af9dae941d6180ef462f"},
+    {file = "ray-2.47.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:cd4e7eb475487364b5209963b17cefedcb7fbd3a816fdb6def7ea533ebd72424"},
+    {file = "ray-2.47.1-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:3eaeaeec3bbe2ca6493e530c30473d84b8580a7ac3256bb9183d8c63def5a92f"},
+    {file = "ray-2.47.1-cp312-cp312-win_amd64.whl", hash = "sha256:601f23ba89918b7b3ffebf967328f7bdb605deaf8c103aad7820dc2722fe450c"},
+    {file = "ray-2.47.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8cd625d469ce15391e5f1f44ddf8dd30b2380f917603fa0172661229acb0011f"},
+    {file = "ray-2.47.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:e578929f58b3f0c59c7544a96d864e26278238b755d13cd19ae798070c848e57"},
+    {file = "ray-2.47.1-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:d6ed6d182e25d6f77179dc77bc97a749c81765b13cb671a46db3203029389663"},
+    {file = "ray-2.47.1-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:252a471e8afb918b105cdbffb4cbebb0143baad75a06c8ffcde27ac317579ccb"},
+    {file = "ray-2.47.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c21720f283a3df360ddec002a592ddfbaf520faf4cb1b86562a7b7c196ad96a0"},
+    {file = "ray-2.47.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:6c7b4abe112c4d698243e30023bcbffe2c2c9a68416b95a6a0d50f9ca5725545"},
+    {file = "ray-2.47.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:21f2689c1bbc688f9cd31a18bae2c9582027e91b508073849441167bb5077816"},
+    {file = "ray-2.47.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:106817f80087d21d24e63f6e56ea5ab7c387a25105eb65e6b783551f569534ea"},
+    {file = "ray-2.47.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee02ba9b8cd45c4eadc457183f6d80f1701b85f966d02cdacd5b11867cb7375"},
 ]
 
 [package.dependencies]
@@ -3499,6 +3604,9 @@ jsonschema = "*"
 msgpack = ">=1.0.0,<2.0.0"
 numpy = {version = ">=1.20", optional = true, markers = "extra == \"data\""}
 opencensus = {version = "*", optional = true, markers = "extra == \"default\""}
+opentelemetry-exporter-prometheus = {version = "*", optional = true, markers = "extra == \"default\""}
+opentelemetry-proto = {version = "*", optional = true, markers = "extra == \"default\""}
+opentelemetry-sdk = {version = "*", optional = true, markers = "extra == \"default\""}
 packaging = "*"
 pandas = {version = ">=1.3", optional = true, markers = "extra == \"data\""}
 prometheus-client = {version = ">=0.7.1", optional = true, markers = "extra == \"default\""}
@@ -3519,19 +3627,19 @@ virtualenv = {version = ">=20.0.24,<20.21.1 || >20.21.1", optional = true, marke
 
 [package.extras]
 adag = ["cupy-cuda12x ; sys_platform != \"darwin\""]
-air = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "fastapi", "fsspec", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "numpy (>=1.20)", "opencensus", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"]
-all = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "cupy-cuda12x ; sys_platform != \"darwin\"", "dm-tree", "fastapi", "fsspec", "grpcio", "grpcio (!=1.56.0) ; sys_platform == \"darwin\"", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "gymnasium (==1.0.0)", "lz4", "memray ; sys_platform != \"win32\"", "numpy (>=1.20)", "opencensus", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk", "ormsgpack (==1.7.0)", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyOpenSSL", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "pyyaml", "requests", "scipy", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"]
-all-cpp = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "cupy-cuda12x ; sys_platform != \"darwin\"", "dm-tree", "fastapi", "fsspec", "grpcio", "grpcio (!=1.56.0) ; sys_platform == \"darwin\"", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "gymnasium (==1.0.0)", "lz4", "memray ; sys_platform != \"win32\"", "numpy (>=1.20)", "opencensus", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk", "ormsgpack (==1.7.0)", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyOpenSSL", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "pyyaml", "ray-cpp (==2.46.0)", "requests", "scipy", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"]
+air = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "fastapi", "fsspec", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "numpy (>=1.20)", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"]
+all = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "cupy-cuda12x ; sys_platform != \"darwin\"", "dm-tree", "fastapi", "fsspec", "grpcio", "grpcio (!=1.56.0) ; sys_platform == \"darwin\"", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "gymnasium (==1.0.0)", "lz4", "memray ; sys_platform != \"win32\"", "numpy (>=1.20)", "opencensus", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk", "ormsgpack (==1.7.0)", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyOpenSSL", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "pyyaml", "requests", "scipy", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"]
+all-cpp = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "cupy-cuda12x ; sys_platform != \"darwin\"", "dm-tree", "fastapi", "fsspec", "grpcio", "grpcio (!=1.56.0) ; sys_platform == \"darwin\"", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "gymnasium (==1.0.0)", "lz4", "memray ; sys_platform != \"win32\"", "numpy (>=1.20)", "opencensus", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk", "ormsgpack (==1.7.0)", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyOpenSSL", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "pyyaml", "ray-cpp (==2.47.1)", "requests", "scipy", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"]
 cgraph = ["cupy-cuda12x ; sys_platform != \"darwin\""]
 client = ["grpcio", "grpcio (!=1.56.0) ; sys_platform == \"darwin\""]
-cpp = ["ray-cpp (==2.46.0)"]
+cpp = ["ray-cpp (==2.47.1)"]
 data = ["fsspec", "numpy (>=1.20)", "pandas (>=1.3)", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)"]
-default = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "virtualenv (>=20.0.24,!=20.21.1)"]
-llm = ["aiohttp (>=3.7)", "aiohttp-cors", "async-timeout ; python_version < \"3.11\"", "colorful", "fastapi", "fsspec", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "jsonref (>=1.1.0)", "jsonschema", "ninja", "numpy (>=1.20)", "opencensus", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "typer", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "vllm (>=0.8.5)", "watchfiles"]
+default = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "virtualenv (>=20.0.24,!=20.21.1)"]
+llm = ["aiohttp (>=3.7)", "aiohttp-cors", "async-timeout ; python_version < \"3.11\"", "colorful", "fastapi", "fsspec", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "jsonref (>=1.1.0)", "jsonschema", "ninja", "numpy (>=1.20)", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "typer", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "vllm (>=0.8.5)", "watchfiles"]
 observability = ["memray ; sys_platform != \"win32\"", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk"]
 rllib = ["dm-tree", "fsspec", "gymnasium (==1.0.0)", "lz4", "ormsgpack (==1.7.0)", "pandas", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pyyaml", "requests", "scipy", "tensorboardX (>=1.9)"]
-serve = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "fastapi", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"]
-serve-grpc = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "fastapi", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyOpenSSL", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"]
+serve = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "fastapi", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"]
+serve-grpc = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "fastapi", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "opencensus", "opentelemetry-exporter-prometheus", "opentelemetry-proto", "opentelemetry-sdk", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyOpenSSL", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"]
 train = ["fsspec", "pandas", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "tensorboardX (>=1.9)"]
 tune = ["fsspec", "pandas", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "requests", "tensorboardX (>=1.9)"]
 
@@ -4525,7 +4633,27 @@ idna = ">=2.0"
 multidict = ">=4.0"
 propcache = ">=0.2.1"
 
+[[package]]
+name = "zipp"
+version = "3.23.0"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+    {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"},
+    {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"},
+]
+
+[package.extras]
+check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""]
+cover = ["pytest-cov"]
+doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
+enabler = ["pytest-enabler (>=2.2)"]
+test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
+type = ["pytest-mypy"]
+
 [metadata]
 lock-version = "2.1"
 python-versions = "^3.11"
-content-hash = "7cdd47cb60807e3032d9746b1c3ace156a10f9b6b430c740f0201a8aed7ac860"
+content-hash = "29175d71269b0c8a1a53eb7027e8d824ef150bf8b4aa4cea8a9ed75684aa6e43"
diff --git a/pyproject.toml b/pyproject.toml
index 03c390c3..8615f894 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -23,7 +23,7 @@ keywords = ['codeflare', 'python', 'sdk', 'client', 'batch', 'scale']
 python = "^3.11"
 openshift-client = "1.0.18"
 rich = ">=12.5,<14.0"
-ray = {version = "2.46.0", extras = ["data", "default"]}
+ray = {version = "2.47.1", extras = ["data", "default"]}
 kubernetes = ">= 27.2.0"
 cryptography = "43.0.3"
 executing = "1.2.0"
diff --git a/src/codeflare_sdk/common/utils/constants.py b/src/codeflare_sdk/common/utils/constants.py
index a10e3e0e..270d8d46 100644
--- a/src/codeflare_sdk/common/utils/constants.py
+++ b/src/codeflare_sdk/common/utils/constants.py
@@ -1 +1 @@
-RAY_VERSION = "2.46.0"
+RAY_VERSION = "2.47.1"
diff --git a/tests/test_cluster_yamls/appwrapper/test-case-bad.yaml b/tests/test_cluster_yamls/appwrapper/test-case-bad.yaml
index 4aa4d3dd..c6972565 100644
--- a/tests/test_cluster_yamls/appwrapper/test-case-bad.yaml
+++ b/tests/test_cluster_yamls/appwrapper/test-case-bad.yaml
@@ -66,7 +66,7 @@ spec:
                   requests:
                     cpu: 2
                     memory: 8G
-        rayVersion: 2.46.0
+        rayVersion: 2.47.1
         workerGroupSpecs:
         - groupName: small-group-unit-test-cluster
           maxReplicas: 2
diff --git a/tests/test_cluster_yamls/appwrapper/unit-test-all-params.yaml b/tests/test_cluster_yamls/appwrapper/unit-test-all-params.yaml
index bfe23893..aa097dd9 100644
--- a/tests/test_cluster_yamls/appwrapper/unit-test-all-params.yaml
+++ b/tests/test_cluster_yamls/appwrapper/unit-test-all-params.yaml
@@ -138,7 +138,7 @@ spec:
                   name: odh-trusted-ca-bundle
                   optional: true
                 name: odh-ca-cert
-        rayVersion: 2.46.0
+        rayVersion: 2.47.1
         workerGroupSpecs:
         - groupName: small-group-aw-all-params
           maxReplicas: 10
diff --git a/tests/test_cluster_yamls/kueue/aw_kueue.yaml b/tests/test_cluster_yamls/kueue/aw_kueue.yaml
index 08b6d5cf..f5f16406 100644
--- a/tests/test_cluster_yamls/kueue/aw_kueue.yaml
+++ b/tests/test_cluster_yamls/kueue/aw_kueue.yaml
@@ -93,7 +93,7 @@ spec:
                   name: odh-trusted-ca-bundle
                   optional: true
                 name: odh-ca-cert
-        rayVersion: 2.46.0
+        rayVersion: 2.47.1
         workerGroupSpecs:
         - groupName: small-group-unit-test-aw-kueue
           maxReplicas: 2
diff --git a/tests/test_cluster_yamls/kueue/ray_cluster_kueue.yaml b/tests/test_cluster_yamls/kueue/ray_cluster_kueue.yaml
index bb8e8494..d6db4f4a 100644
--- a/tests/test_cluster_yamls/kueue/ray_cluster_kueue.yaml
+++ b/tests/test_cluster_yamls/kueue/ray_cluster_kueue.yaml
@@ -93,7 +93,7 @@ spec:
                   name: odh-trusted-ca-bundle
                   optional: true
                 name: odh-ca-cert
-        rayVersion: 2.46.0
+        rayVersion: 2.47.1
         workerGroupSpecs:
         - groupName: small-group-unit-test-cluster-kueue
           maxReplicas: 2
diff --git a/tests/test_cluster_yamls/ray/default-appwrapper.yaml b/tests/test_cluster_yamls/ray/default-appwrapper.yaml
index 22fba282..27828163 100644
--- a/tests/test_cluster_yamls/ray/default-appwrapper.yaml
+++ b/tests/test_cluster_yamls/ray/default-appwrapper.yaml
@@ -91,7 +91,7 @@ spec:
                   name: odh-trusted-ca-bundle
                   optional: true
                 name: odh-ca-cert
-        rayVersion: 2.46.0
+        rayVersion: 2.47.1
         workerGroupSpecs:
         - groupName: small-group-default-appwrapper
           maxReplicas: 1
diff --git a/tests/test_cluster_yamls/ray/default-ray-cluster.yaml b/tests/test_cluster_yamls/ray/default-ray-cluster.yaml
index 75713321..d2e6b05a 100644
--- a/tests/test_cluster_yamls/ray/default-ray-cluster.yaml
+++ b/tests/test_cluster_yamls/ray/default-ray-cluster.yaml
@@ -83,7 +83,7 @@ spec:
             name: odh-trusted-ca-bundle
             optional: true
           name: odh-ca-cert
-  rayVersion: 2.46.0
+  rayVersion: 2.47.1
   workerGroupSpecs:
   - groupName: small-group-default-cluster
     maxReplicas: 1
diff --git a/tests/test_cluster_yamls/ray/unit-test-all-params.yaml b/tests/test_cluster_yamls/ray/unit-test-all-params.yaml
index 98da45b1..ee0878c1 100644
--- a/tests/test_cluster_yamls/ray/unit-test-all-params.yaml
+++ b/tests/test_cluster_yamls/ray/unit-test-all-params.yaml
@@ -129,7 +129,7 @@ spec:
             name: odh-trusted-ca-bundle
             optional: true
           name: odh-ca-cert
-  rayVersion: 2.46.0
+  rayVersion: 2.47.1
   workerGroupSpecs:
   - groupName: small-group-test-all-params
     maxReplicas: 10
diff --git a/tests/test_cluster_yamls/support_clusters/test-aw-a.yaml b/tests/test_cluster_yamls/support_clusters/test-aw-a.yaml
index 4ffbef98..00e8755d 100644
--- a/tests/test_cluster_yamls/support_clusters/test-aw-a.yaml
+++ b/tests/test_cluster_yamls/support_clusters/test-aw-a.yaml
@@ -91,7 +91,7 @@ spec:
                   name: odh-trusted-ca-bundle
                   optional: true
                 name: odh-ca-cert
-        rayVersion: 2.46.0
+        rayVersion: 2.47.1
         workerGroupSpecs:
         - groupName: small-group-test-cluster-a
           maxReplicas: 1
diff --git a/tests/test_cluster_yamls/support_clusters/test-aw-b.yaml b/tests/test_cluster_yamls/support_clusters/test-aw-b.yaml
index 56d2a8e2..be01e68b 100644
--- a/tests/test_cluster_yamls/support_clusters/test-aw-b.yaml
+++ b/tests/test_cluster_yamls/support_clusters/test-aw-b.yaml
@@ -91,7 +91,7 @@ spec:
                   name: odh-trusted-ca-bundle
                   optional: true
                 name: odh-ca-cert
-        rayVersion: 2.46.0
+        rayVersion: 2.47.1
         workerGroupSpecs:
         - groupName: small-group-test-cluster-b
           maxReplicas: 1
diff --git a/tests/test_cluster_yamls/support_clusters/test-rc-a.yaml b/tests/test_cluster_yamls/support_clusters/test-rc-a.yaml
index e504566a..553d285a 100644
--- a/tests/test_cluster_yamls/support_clusters/test-rc-a.yaml
+++ b/tests/test_cluster_yamls/support_clusters/test-rc-a.yaml
@@ -82,7 +82,7 @@ spec:
             name: odh-trusted-ca-bundle
             optional: true
           name: odh-ca-cert
-  rayVersion: 2.46.0
+  rayVersion: 2.47.1
   workerGroupSpecs:
   - groupName: small-group-test-cluster-a
     maxReplicas: 1
diff --git a/tests/test_cluster_yamls/support_clusters/test-rc-b.yaml b/tests/test_cluster_yamls/support_clusters/test-rc-b.yaml
index 22162295..1b84ee02 100644
--- a/tests/test_cluster_yamls/support_clusters/test-rc-b.yaml
+++ b/tests/test_cluster_yamls/support_clusters/test-rc-b.yaml
@@ -82,7 +82,7 @@ spec:
             name: odh-trusted-ca-bundle
             optional: true
           name: odh-ca-cert
-  rayVersion: 2.46.0
+  rayVersion: 2.47.1
   workerGroupSpecs:
   - groupName: small-group-test-rc-b
     maxReplicas: 1

From f9f86719e09e56995efa5ad03facb21846041574 Mon Sep 17 00:00:00 2001
From: kryanbeane <bryankeane0@gmail.com>
Date: Mon, 7 Jul 2025 13:14:04 +0100
Subject: [PATCH 5/5] RHOAIENG-27828: Template runtime image SHA

---
 .../notebook-ex-outputs/0_basic_ray.ipynb     |  2 +-
 src/codeflare_sdk/common/utils/constants.py   |  2 +
 .../common/utils/unit_test_support.py         | 52 +++++++++++++------
 .../ray/appwrapper/test_awload.py             |  9 +++-
 .../ray/cluster/build_ray_cluster.py          |  4 +-
 tests/e2e/support.py                          |  4 +-
 .../appwrapper/test-case-bad.yaml             |  4 +-
 .../support_clusters/test-aw-a.yaml           |  4 +-
 .../support_clusters/test-aw-b.yaml           |  4 +-
 .../support_clusters/test-rc-a.yaml           |  4 +-
 .../support_clusters/test-rc-b.yaml           |  4 +-
 11 files changed, 61 insertions(+), 32 deletions(-)

diff --git a/demo-notebooks/guided-demos/notebook-ex-outputs/0_basic_ray.ipynb b/demo-notebooks/guided-demos/notebook-ex-outputs/0_basic_ray.ipynb
index 8d97751a..119d9ce6 100644
--- a/demo-notebooks/guided-demos/notebook-ex-outputs/0_basic_ray.ipynb
+++ b/demo-notebooks/guided-demos/notebook-ex-outputs/0_basic_ray.ipynb
@@ -49,7 +49,7 @@
     "\n",
     "NOTE: The default images used by the CodeFlare SDK for creating a RayCluster resource depend on the installed Python version:\n",
     "\n",
-    "- For Python 3.11: 'quay.io/modh/ray:2.46.0-py311-cu121'\n",
+    "- For Python 3.11: 'quay.io/modh/ray:2.47.1-py311-cu121'\n",
     "\n",
     "If you prefer to use a custom Ray image that better suits your needs, you can specify it in the image field to override the default."
    ]
diff --git a/src/codeflare_sdk/common/utils/constants.py b/src/codeflare_sdk/common/utils/constants.py
index 270d8d46..9721ac85 100644
--- a/src/codeflare_sdk/common/utils/constants.py
+++ b/src/codeflare_sdk/common/utils/constants.py
@@ -1 +1,3 @@
 RAY_VERSION = "2.47.1"
+# Below references ray:2.47.1-py311-cu121
+CUDA_RUNTIME_IMAGE = "quay.io/modh/ray@sha256:6d076aeb38ab3c34a6a2ef0f58dc667089aa15826fa08a73273c629333e12f1e"
diff --git a/src/codeflare_sdk/common/utils/unit_test_support.py b/src/codeflare_sdk/common/utils/unit_test_support.py
index eee8d933..b382ec01 100644
--- a/src/codeflare_sdk/common/utils/unit_test_support.py
+++ b/src/codeflare_sdk/common/utils/unit_test_support.py
@@ -14,6 +14,7 @@
 
 import string
 import sys
+from codeflare_sdk.common.utils import constants
 from codeflare_sdk.ray.cluster.cluster import (
     Cluster,
     ClusterConfiguration,
@@ -68,7 +69,7 @@ def create_cluster_wrong_type():
         worker_extended_resource_requests={"nvidia.com/gpu": 7},
         appwrapper=True,
         image_pull_secrets=["unit-test-pull-secret"],
-        image="quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707",
+        image=constants.CUDA_RUNTIME_IMAGE,
         write_to_file=True,
         labels={1: 1},
     )
@@ -148,9 +149,14 @@ def get_cluster_object(file_a, file_b):
 
 def get_ray_obj(group, version, namespace, plural):
     # To be used for mocking list_namespaced_custom_object for Ray Clusters
-    rc_a_path = f"{parent}/tests/test_cluster_yamls/support_clusters/test-rc-a.yaml"
-    rc_b_path = f"{parent}/tests/test_cluster_yamls/support_clusters/test-rc-b.yaml"
-    rc_a, rc_b = get_cluster_object(rc_a_path, rc_b_path)
+    rc_a = apply_template(
+        f"{parent}/tests/test_cluster_yamls/support_clusters/test-rc-a.yaml",
+        get_template_variables(),
+    )
+    rc_b = apply_template(
+        f"{parent}/tests/test_cluster_yamls/support_clusters/test-rc-b.yaml",
+        get_template_variables(),
+    )
 
     rc_list = {"items": [rc_a, rc_b]}
     return rc_list
@@ -158,9 +164,14 @@ def get_ray_obj(group, version, namespace, plural):
 
 def get_ray_obj_with_status(group, version, namespace, plural):
     # To be used for mocking list_namespaced_custom_object for Ray Clusters with statuses
-    rc_a_path = f"{parent}/tests/test_cluster_yamls/support_clusters/test-rc-a.yaml"
-    rc_b_path = f"{parent}/tests/test_cluster_yamls/support_clusters/test-rc-b.yaml"
-    rc_a, rc_b = get_cluster_object(rc_a_path, rc_b_path)
+    rc_a = apply_template(
+        f"{parent}/tests/test_cluster_yamls/support_clusters/test-rc-a.yaml",
+        get_template_variables(),
+    )
+    rc_b = apply_template(
+        f"{parent}/tests/test_cluster_yamls/support_clusters/test-rc-b.yaml",
+        get_template_variables(),
+    )
 
     rc_a.update(
         {
@@ -205,9 +216,14 @@ def get_ray_obj_with_status(group, version, namespace, plural):
 
 def get_aw_obj(group, version, namespace, plural):
     # To be used for mocking list_namespaced_custom_object for AppWrappers
-    aw_a_path = f"{parent}/tests/test_cluster_yamls/support_clusters/test-aw-a.yaml"
-    aw_b_path = f"{parent}/tests/test_cluster_yamls/support_clusters/test-aw-b.yaml"
-    aw_a, aw_b = get_cluster_object(aw_a_path, aw_b_path)
+    aw_a = apply_template(
+        f"{parent}/tests/test_cluster_yamls/support_clusters/test-aw-a.yaml",
+        get_template_variables(),
+    )
+    aw_b = apply_template(
+        f"{parent}/tests/test_cluster_yamls/support_clusters/test-aw-b.yaml",
+        get_template_variables(),
+    )
 
     aw_list = {"items": [aw_a, aw_b]}
     return aw_list
@@ -215,9 +231,14 @@ def get_aw_obj(group, version, namespace, plural):
 
 def get_aw_obj_with_status(group, version, namespace, plural):
     # To be used for mocking list_namespaced_custom_object for AppWrappers with statuses
-    aw_a_path = f"{parent}/tests/test_cluster_yamls/support_clusters/test-aw-a.yaml"
-    aw_b_path = f"{parent}/tests/test_cluster_yamls/support_clusters/test-aw-b.yaml"
-    aw_a, aw_b = get_cluster_object(aw_a_path, aw_b_path)
+    aw_a = apply_template(
+        f"{parent}/tests/test_cluster_yamls/support_clusters/test-aw-a.yaml",
+        get_template_variables(),
+    )
+    aw_b = apply_template(
+        f"{parent}/tests/test_cluster_yamls/support_clusters/test-aw-b.yaml",
+        get_template_variables(),
+    )
 
     aw_a.update(
         {
@@ -273,9 +294,8 @@ def apply_template(yaml_file_path, variables):
 
 
 def get_expected_image():
-    # TODO: Add Python 3.12 support
-    python_version = sys.version_info
-    return "quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707"
+    # TODO: Select image based on Python version
+    return constants.CUDA_RUNTIME_IMAGE
 
 
 def get_template_variables():
diff --git a/src/codeflare_sdk/ray/appwrapper/test_awload.py b/src/codeflare_sdk/ray/appwrapper/test_awload.py
index 6909394b..3f45e1a5 100644
--- a/src/codeflare_sdk/ray/appwrapper/test_awload.py
+++ b/src/codeflare_sdk/ray/appwrapper/test_awload.py
@@ -12,8 +12,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 from codeflare_sdk.common.utils.unit_test_support import (
+    apply_template,
     arg_check_aw_apply_effect,
     arg_check_aw_del_effect,
+    get_template_variables,
 )
 from codeflare_sdk.ray.appwrapper import AWManager
 from codeflare_sdk.ray.cluster import Cluster, ClusterConfiguration
@@ -47,8 +49,11 @@ def test_AWManager_creation(mocker):
         assert type(e) == FileNotFoundError
         assert str(e) == "[Errno 2] No such file or directory: 'fake'"
     try:
-        testaw = AWManager(
-            f"{parent}/tests/test_cluster_yamls/appwrapper/test-case-bad.yaml"
+        testaw = apply_template(
+            AWManager(
+                f"{parent}/tests/test_cluster_yamls/appwrapper/test-case-bad.yaml"
+            ),
+            get_template_variables(),
         )
     except Exception as e:
         assert type(e) == ValueError
diff --git a/src/codeflare_sdk/ray/cluster/build_ray_cluster.py b/src/codeflare_sdk/ray/cluster/build_ray_cluster.py
index 11b10fc3..92cefef4 100644
--- a/src/codeflare_sdk/ray/cluster/build_ray_cluster.py
+++ b/src/codeflare_sdk/ray/cluster/build_ray_cluster.py
@@ -50,6 +50,8 @@
 import warnings
 import json
 
+from codeflare_sdk.common.utils import constants
+
 FORBIDDEN_CUSTOM_RESOURCE_TYPES = ["GPU", "CPU", "memory"]
 VOLUME_MOUNTS = [
     V1VolumeMount(
@@ -94,7 +96,7 @@
 ]
 
 SUPPORTED_PYTHON_VERSIONS = {
-    "3.11": "quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707",
+    "3.11": constants.CUDA_RUNTIME_IMAGE,
 }
 
 
diff --git a/tests/e2e/support.py b/tests/e2e/support.py
index c81f5b73..165a680b 100644
--- a/tests/e2e/support.py
+++ b/tests/e2e/support.py
@@ -7,6 +7,7 @@
 from codeflare_sdk.common.kubernetes_cluster.kube_api_helpers import (
     _kube_api_error_handling,
 )
+from codeflare_sdk.common.utils import constants
 
 
 def get_ray_cluster(cluster_name, namespace):
@@ -26,8 +27,7 @@ def get_ray_cluster(cluster_name, namespace):
 
 
 def get_ray_image():
-    default_ray_image = "quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707"
-    return os.getenv("RAY_IMAGE", default_ray_image)
+    return os.getenv("RAY_IMAGE", constants.CUDA_RUNTIME_IMAGE)
 
 
 def get_setup_env_variables(**kwargs):
diff --git a/tests/test_cluster_yamls/appwrapper/test-case-bad.yaml b/tests/test_cluster_yamls/appwrapper/test-case-bad.yaml
index c6972565..a5915820 100644
--- a/tests/test_cluster_yamls/appwrapper/test-case-bad.yaml
+++ b/tests/test_cluster_yamls/appwrapper/test-case-bad.yaml
@@ -42,7 +42,7 @@ spec:
                   valueFrom:
                     fieldRef:
                       fieldPath: status.podIP
-                image: quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707
+                image: "${image}"
                 imagePullPolicy: IfNotPresent
                 lifecycle:
                   preStop:
@@ -89,7 +89,7 @@ spec:
                   valueFrom:
                     fieldRef:
                       fieldPath: status.podIP
-                image: quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707
+                image: "${image}"
                 lifecycle:
                   preStop:
                     exec:
diff --git a/tests/test_cluster_yamls/support_clusters/test-aw-a.yaml b/tests/test_cluster_yamls/support_clusters/test-aw-a.yaml
index 00e8755d..49f2c38c 100644
--- a/tests/test_cluster_yamls/support_clusters/test-aw-a.yaml
+++ b/tests/test_cluster_yamls/support_clusters/test-aw-a.yaml
@@ -38,7 +38,7 @@ spec:
           template:
             spec:
               containers:
-              - image: quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707
+              - image: "${image}"
                 imagePullPolicy: IfNotPresent
                 lifecycle:
                   preStop:
@@ -109,7 +109,7 @@ spec:
                 key: value
             spec:
               containers:
-              - image: quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707
+              - image: "${image}"
                 lifecycle:
                   preStop:
                     exec:
diff --git a/tests/test_cluster_yamls/support_clusters/test-aw-b.yaml b/tests/test_cluster_yamls/support_clusters/test-aw-b.yaml
index be01e68b..aa6fad9c 100644
--- a/tests/test_cluster_yamls/support_clusters/test-aw-b.yaml
+++ b/tests/test_cluster_yamls/support_clusters/test-aw-b.yaml
@@ -38,7 +38,7 @@ spec:
           template:
             spec:
               containers:
-              - image: quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707
+              - image: "${image}"
                 imagePullPolicy: IfNotPresent
                 lifecycle:
                   preStop:
@@ -109,7 +109,7 @@ spec:
                 key: value
             spec:
               containers:
-              - image: quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707
+              - image: "${image}"
                 lifecycle:
                   preStop:
                     exec:
diff --git a/tests/test_cluster_yamls/support_clusters/test-rc-a.yaml b/tests/test_cluster_yamls/support_clusters/test-rc-a.yaml
index 553d285a..2bb13995 100644
--- a/tests/test_cluster_yamls/support_clusters/test-rc-a.yaml
+++ b/tests/test_cluster_yamls/support_clusters/test-rc-a.yaml
@@ -29,7 +29,7 @@ spec:
     template:
       spec:
         containers:
-        - image: quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707
+        - image: "${image}"
           imagePullPolicy: IfNotPresent
           lifecycle:
             preStop:
@@ -100,7 +100,7 @@ spec:
           key: value
       spec:
         containers:
-        - image: quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707
+        - image: "${image}"
           lifecycle:
             preStop:
               exec:
diff --git a/tests/test_cluster_yamls/support_clusters/test-rc-b.yaml b/tests/test_cluster_yamls/support_clusters/test-rc-b.yaml
index 1b84ee02..70f1d5bf 100644
--- a/tests/test_cluster_yamls/support_clusters/test-rc-b.yaml
+++ b/tests/test_cluster_yamls/support_clusters/test-rc-b.yaml
@@ -29,7 +29,7 @@ spec:
     template:
       spec:
         containers:
-        - image: quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707
+        - image: "${image}"
           imagePullPolicy: IfNotPresent
           lifecycle:
             preStop:
@@ -100,7 +100,7 @@ spec:
           key: value
       spec:
         containers:
-        - image: quay.io/modh/ray@sha256:a5b7c04a14f180d7ca6d06a5697f6bb684e40a26b95a0c872cac23b552741707
+        - image: "${image}"
           lifecycle:
             preStop:
               exec:
