feat: upgrade to bobcat (#887)

diff --git a/images/horizon/Earthfile b/images/horizon/Earthfile
index 6ff9199..fe9ac5f 100644
--- a/images/horizon/Earthfile
+++ b/images/horizon/Earthfile
@@ -1,18 +1,37 @@
 VERSION 0.7
 
+ARG --global PROJECT=horizon
+ARG --global RELEASE=2023.2
+ARG --global PROJECT_REF=3c6029cd94846235e25058b71522c13556f41f58
+
+build.plugin:
+  ARG PLUGIN
+  FROM ../openstack-service+builder --RELEASE=${RELEASE}
+  DO ../openstack-service+GIT_CHECKOUT \
+    --PROJECT=${PLUGIN} \
+    --PROJECT_REF=stable/${RELEASE}
+  SAVE ARTIFACT /src
+
+build:
+  FROM ../openstack-service+builder --RELEASE=${RELEASE}
+  COPY (+build.plugin/src --PLUGIN=designate-dashboard) /designate-dashboard
+  COPY (+build.plugin/src --PLUGIN=heat-dashboard) /heat-dashboard
+  COPY (+build.plugin/src --PLUGIN=ironic-ui) /ironic-ui
+  COPY (+build.plugin/src --PLUGIN=magnum-ui) /magnum-ui
+  COPY (+build.plugin/src --PLUGIN=manila-ui) /manila-ui
+  COPY (+build.plugin/src --PLUGIN=neutron-vpnaas-dashboard) /neutron-vpnaas-dashboard
+  COPY (+build.plugin/src --PLUGIN=octavia-dashboard) /octavia-dashboard
+  COPY (+build.plugin/src --PLUGIN=senlin-dashboard) /senlin-dashboard
+  DO ../openstack-service+BUILD_VENV \
+    --PROJECT=${PROJECT} \
+    --PROJECT_REF=${PROJECT_REF} \
+    --PIP_PACKAGES "/designate-dashboard /heat-dashboard /ironic-ui /magnum-ui /neutron-vpnaas-dashboard /octavia-dashboard /senlin-dashboard /manila-ui"
+
 image:
-  ARG PROJECT=horizon
-  ARG RELEASE=2023.2
-  ARG REF=3c6029cd94846235e25058b71522c13556f41f58
-  FROM ../openstack-service+image \
-    --PROJECT ${PROJECT} \
-    --RELEASE ${RELEASE} \
-    --PROJECT_REF ${REF} \
-    --PIP_PACKAGES "git+https://github.com/openstack/designate-dashboard.git@stable/${RELEASE} git+https://github.com/openstack/heat-dashboard.git@stable/${RELEASE} git+https://github.com/openstack/ironic-ui.git@stable/${RELEASE} git+https://github.com/openstack/magnum-ui.git@stable/${RELEASE} git+https://github.com/openstack/neutron-vpnaas-dashboard.git@stable/${RELEASE} git+https://github.com/openstack/octavia-dashboard.git@stable/${RELEASE} git+https://github.com/openstack/senlin-dashboard.git@stable/${RELEASE} git+https://github.com/openstack/manila-ui.git@stable/${RELEASE}"
-  DO \
-    ../+APT_INSTALL \
+  FROM ../openstack-service+image --RELEASE ${RELEASE} --PROJECT ${PROJECT}
+  COPY +build/venv /var/lib/openstack
+  DO ../+APT_INSTALL \
     --PACKAGES "apache2 gettext libapache2-mod-wsgi-py3"
-  DO ../+APPLY_PATCHES
   SAVE IMAGE --push \
     ghcr.io/vexxhost/atmosphere/${PROJECT}:${RELEASE} \
-    ghcr.io/vexxhost/atmosphere/${PROJECT}:${REF}
+    ghcr.io/vexxhost/atmosphere/${PROJECT}:${PROJECT_REF}
diff --git a/images/horizon/patches/0000-fix-ignore-errors-when-flavors-are-deleted.patch b/images/horizon/patches/horizon/0000-fix-ignore-errors-when-flavors-are-deleted.patch
similarity index 88%
rename from images/horizon/patches/0000-fix-ignore-errors-when-flavors-are-deleted.patch
rename to images/horizon/patches/horizon/0000-fix-ignore-errors-when-flavors-are-deleted.patch
index 50d68c9..211d055 100644
--- a/images/horizon/patches/0000-fix-ignore-errors-when-flavors-are-deleted.patch
+++ b/images/horizon/patches/horizon/0000-fix-ignore-errors-when-flavors-are-deleted.patch
@@ -1,4 +1,4 @@
-From c62527488bfeab588c4abbc8426688e4feef87a4 Mon Sep 17 00:00:00 2001
+From aa21f4baa38fc70549b1c7341361519de6362d9b Mon Sep 17 00:00:00 2001
 From: okozachenko <okozachenko1203@gmail.com>
 Date: Thu, 2 Nov 2023 01:27:20 +1100
 Subject: [PATCH] fix: ignore errors when flavors are deleted
@@ -13,7 +13,6 @@
 
 Closes-Bug: #2042362
 Change-Id: I37cc02102285b1e83ec1343b710a57fb5ac4ba15
-(cherry picked from commit 40759aa9cdb9b2162b3f50df751c500db94943b3)
 ---
  .../dashboards/admin/instances/tests.py         |  4 ----
  .../dashboards/admin/instances/views.py         | 17 +++++------------
@@ -22,10 +21,10 @@
  4 files changed, 9 insertions(+), 24 deletions(-)
 
 diff --git a/openstack_dashboard/dashboards/admin/instances/tests.py b/openstack_dashboard/dashboards/admin/instances/tests.py
-index 3630cb79ade..c6cf65e5dab 100644
+index 3630cb79a..c6cf65e5d 100644
 --- a/openstack_dashboard/dashboards/admin/instances/tests.py
 +++ b/openstack_dashboard/dashboards/admin/instances/tests.py
-@@ -133,10 +133,6 @@ def test_index_flavor_get_exception(self):
+@@ -133,10 +133,6 @@ class InstanceViewTest(test.BaseAdminViewTests):
          res = self.client.get(INDEX_URL)
          instances = res.context['table'].data
          self.assertTemplateUsed(res, INDEX_TEMPLATE)
@@ -37,10 +36,10 @@
  
          self.assertEqual(self.mock_image_list_detailed.call_count, 4)
 diff --git a/openstack_dashboard/dashboards/admin/instances/views.py b/openstack_dashboard/dashboards/admin/instances/views.py
-index c35527fe465..efa28dd763e 100644
+index c35527fe4..efa28dd76 100644
 --- a/openstack_dashboard/dashboards/admin/instances/views.py
 +++ b/openstack_dashboard/dashboards/admin/instances/views.py
-@@ -33,6 +33,8 @@
+@@ -33,6 +33,8 @@ from openstack_dashboard.dashboards.admin.instances \
  from openstack_dashboard.dashboards.admin.instances \
      import tables as project_tables
  from openstack_dashboard.dashboards.admin.instances import tabs
@@ -49,7 +48,7 @@
  from openstack_dashboard.dashboards.project.instances import views
  from openstack_dashboard.dashboards.project.instances.workflows \
      import update_instance
-@@ -215,18 +217,9 @@ def get_data(self):
+@@ -215,18 +217,9 @@ class AdminIndexView(tables.PagedTableMixin, tables.DataTableView):
                  else:
                      inst.image['name'] = _("-")
  
@@ -72,10 +71,10 @@
              inst.tenant_name = getattr(tenant, "name", None)
          return instances
 diff --git a/openstack_dashboard/dashboards/project/instances/tests.py b/openstack_dashboard/dashboards/project/instances/tests.py
-index 70d32bc4b3c..c44dedd5b5a 100644
+index 5ab1b4a48..fe2f58c46 100644
 --- a/openstack_dashboard/dashboards/project/instances/tests.py
 +++ b/openstack_dashboard/dashboards/project/instances/tests.py
-@@ -316,6 +316,7 @@ def test_index_flavor_list_exception(self):
+@@ -316,6 +316,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
          self.mock_is_feature_available.return_value = True
          self.mock_server_list_paged.return_value = [servers, False, False]
          self.mock_servers_update_addresses.return_value = None
@@ -84,10 +83,10 @@
          self.mock_image_list_detailed.return_value = (self.images.list(),
                                                        False, False)
 diff --git a/openstack_dashboard/dashboards/project/instances/views.py b/openstack_dashboard/dashboards/project/instances/views.py
-index badf540b830..b848f6fffd9 100644
+index badf540b8..b848f6fff 100644
 --- a/openstack_dashboard/dashboards/project/instances/views.py
 +++ b/openstack_dashboard/dashboards/project/instances/views.py
-@@ -171,14 +171,9 @@ def get_data(self):
+@@ -171,14 +171,9 @@ class IndexView(tables.PagedTableMixin, tables.DataTableView):
          for instance in instances:
              self._populate_image_info(instance, image_dict, volume_dict)
  
@@ -105,3 +104,6 @@
  
          return instances
  
+-- 
+2.34.1
+
diff --git a/images/horizon/patches/horizon/0001-Fixing-Incorrect-URL-when-browsing-Swift-containers.patch b/images/horizon/patches/horizon/0001-Fixing-Incorrect-URL-when-browsing-Swift-containers.patch
new file mode 100644
index 0000000..2e5b936
--- /dev/null
+++ b/images/horizon/patches/horizon/0001-Fixing-Incorrect-URL-when-browsing-Swift-containers.patch
@@ -0,0 +1,40 @@
+From 4aa347fe196b7b18ff0bf5f4d4f076a6c14cf12e Mon Sep 17 00:00:00 2001
+From: jeremy-boyle <jeremyboylet@gmail.com>
+Date: Sat, 24 Jun 2023 16:59:11 +0000
+Subject: [PATCH] Fixing Incorrect URL when browsing Swift containers
+
+This patch fixes a bug identified in the code that generates the URL for
+the Swift container object. The bug caused the forward slashes (/) in the
+folder parameter to be encoded as %2F instead of being included as '/' in the
+resulting URL.
+
+To resolve this issue, the code has been updated by adding a replace() method
+to replace the %2F sequences with forward slashes. The updated code ensures
+that the URL generated for the folder parameter contains the correct forward
+slash (/) representation.
+
+Closes-Bug: #2009724
+Signed-off-by: jeremy-boyle <jeremyboylet@gmail.com>
+
+Change-Id: I5837e74ddcc71cda6b4686e586dbb8b1386a9cd3
+---
+ .../static/dashboard/project/containers/objects.controller.js  | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/containers/objects.controller.js b/openstack_dashboard/dashboards/project/static/dashboard/project/containers/objects.controller.js
+index 55262a1fa..c14128cbf 100644
+--- a/openstack_dashboard/dashboards/project/static/dashboard/project/containers/objects.controller.js
++++ b/openstack_dashboard/dashboards/project/static/dashboard/project/containers/objects.controller.js
+@@ -60,7 +60,8 @@
+     ctrl.containerURL = containerRoute + encodeURIComponent($routeParams.container) +
+       ctrl.model.DELIMETER;
+     if (angular.isDefined($routeParams.folder)) {
+-      ctrl.currentURL = ctrl.containerURL + encodeURIComponent($routeParams.folder) +
++      ctrl.currentURL = ctrl.containerURL +
++        encodeURIComponent($routeParams.folder).replace(/%2F/g, '/') +
+         ctrl.model.DELIMETER;
+     } else {
+       ctrl.currentURL = ctrl.containerURL;
+-- 
+2.34.1
+
diff --git a/images/horizon/patches/0001-fix-disable-resizing-for-admins.patch b/images/horizon/patches/magnum-ui/0000-fix-disable-resizing-for-admins.patch
similarity index 88%
rename from images/horizon/patches/0001-fix-disable-resizing-for-admins.patch
rename to images/horizon/patches/magnum-ui/0000-fix-disable-resizing-for-admins.patch
index aaa5058..a64b453 100644
--- a/images/horizon/patches/0001-fix-disable-resizing-for-admins.patch
+++ b/images/horizon/patches/magnum-ui/0000-fix-disable-resizing-for-admins.patch
@@ -1,4 +1,4 @@
-From d3ac70fb12dc363a0fbed39bcfd3642e36f4515d Mon Sep 17 00:00:00 2001
+From a3671cc242adb85f792d1c8c57ccc7692f1ec251 Mon Sep 17 00:00:00 2001
 From: Mohammed Naser <mnaser@vexxhost.com>
 Date: Mon, 20 Feb 2023 00:55:14 +0000
 Subject: [PATCH] fix: disable resizing for admins
@@ -11,14 +11,13 @@
 project ID of the current user.
 
 Change-Id: If09c509abdd21a5a7b9bc374af52a06404fb0ff8
-(cherry picked from commit 345f853567d25f1b163025f0295c742582052748)
 ---
  .../clusters/resize/resize.service.js         |  9 ++++---
- .../clusters/resize/resize.service.spec.js    | 27 ++++++++++++++-----
- 2 files changed, 26 insertions(+), 10 deletions(-)
+ .../clusters/resize/resize.service.spec.js    | 25 +++++++++++++++----
+ 2 files changed, 25 insertions(+), 9 deletions(-)
 
 diff --git a/magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.js b/magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.js
-index ebc6a961..b86833a0 100644
+index ebc6a96..b86833a 100644
 --- a/magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.js
 +++ b/magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.js
 @@ -32,6 +32,7 @@
@@ -52,10 +51,10 @@
  
      function constructModalConfig(workerNodesList) {
 diff --git a/magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.spec.js b/magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.spec.js
-index 842df87d..27fa8064 100644
+index 842df87..645b149 100644
 --- a/magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.spec.js
 +++ b/magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.spec.js
-@@ -19,16 +19,17 @@
+@@ -19,9 +19,10 @@
  
    describe('horizon.dashboard.container-infra.clusters.resize.service', function() {
  
@@ -68,14 +67,6 @@
      };
      var modal = {
        open: function(config) {
-         deferred = $q.defer();
-         deferred.resolve(config);
-         modalConfig = config;
--
-+``
-         return deferred.promise;
-       }
-     };
 @@ -50,6 +51,7 @@
          'horizon.dashboard.container-infra.clusters.resize.service');
        magnum = $injector.get('horizon.app.core.openstack-service-api.magnum');
@@ -110,3 +101,6 @@
      });
  
      it('should open the modal, hide the loading spinner and check the form model',
+-- 
+2.34.1
+
diff --git a/images/horizon/patches/0002-capi-avoid-going-through-heat-for-worker-list.patch b/images/horizon/patches/magnum-ui/0001-capi-avoid-going-through-heat-for-worker-list.patch
similarity index 100%
rename from images/horizon/patches/0002-capi-avoid-going-through-heat-for-worker-list.patch
rename to images/horizon/patches/magnum-ui/0001-capi-avoid-going-through-heat-for-worker-list.patch