Compare commits

...

54 Commits

Author SHA256 Message Date
47bdcb200c Merge pull request 'feat: Bump c-v to 0.1.1' (#258) from eminguez/suse-edge-factory:c-v-0.1.1 into main
Reviewed-on: #258
Reviewed-by: Nicolas Belouin <nbelouin@noreply.src.opensuse.org>
2025-09-04 15:39:56 +02:00
e-minguez
bf869dec4e feat: Bump c-v to 0.1.1
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 5s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 6s
2025-09-04 14:35:32 +02:00
92f49dbbfc Merge pull request 'Port multi-arch support patches to Factory' (#221) from nbelouin/Factory:ironic-arch into main
Reviewed-on: #221
Reviewed-by: Steven Hardy <steven.hardy@noreply.src.opensuse.org>
Reviewed-by: Marco Chiappero <mchiappero@noreply.src.opensuse.org>
2025-09-04 14:01:28 +02:00
96320cc7f2 kubevirt-dashboard-extension-chart: fix chart tag
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 10s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 18s
2025-09-04 12:17:23 +02:00
7be5f59e4f Bump metal3 versions
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 10s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 12s
Signed-off-by: Nicolas Belouin <nicolas.belouin@suse.com>
2025-09-04 12:00:39 +02:00
bb4ab90787 Add multi-arch related patches for BMO
Signed-off-by: Nicolas Belouin <nicolas.belouin@suse.com>
2025-09-03 16:07:13 +02:00
6c05726947 Port ironic-image and ipa-downloader-image PRs to Factory, and adapt chart accordingly
Signed-off-by: Nicolas Belouin <nicolas.belouin@suse.com>
2025-09-03 16:07:13 +02:00
9a87f37674 Merge pull request 'Bump prefered cargo to 1.89' (#256) from nbelouin/Factory:update-cargo into main
All checks were successful
Synchronize Project Config / Update prjconf in OBS (push) Successful in 5s
Synchronize Project Metadata / sync-prj-meta (push) Successful in 7s
Reviewed-on: #256
Reviewed-by: Denislav Prodanov <dprodanov@noreply.src.opensuse.org>
2025-09-03 15:38:14 +02:00
6d50385ec3 Merge pull request 'fix: Allow helm chart metadata icon to be file' (#255) from eminguez/suse-edge-factory:pyhelm3-icon-allow-file into main
Reviewed-on: #255
2025-09-03 13:47:25 +02:00
e-minguez
b94d722028 fix: Allow helm chart metadata icon to be file
Some checks failed
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 3s
Build PR in OBS / Build PR in OBS (pull_request_target) Failing after 31s
2025-09-03 13:47:08 +02:00
35054ff64b akri-dashboard-extension-chart: Update to 304.0.3+up1.3.1 2025-09-03 11:24:50 +02:00
e5f6b76d8b kubevirt-dashboard-extension-chart: Update to 304.0.3+up1.3.2 2025-09-03 11:24:35 +02:00
4e32759250 Bump prefered cargo to 1.89
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 15s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 6s
Signed-off-by: Nicolas Belouin <nicolas.belouin@suse.com>
2025-09-03 08:25:07 +02:00
59fd3c1a8b Merge pull request 'feat: Add suse-edge-components-versions' (#222) from eminguez/suse-edge-factory:components-versions into main
All checks were successful
Synchronize Project Config / Update prjconf in OBS (push) Successful in 4s
Synchronize Project Metadata / sync-prj-meta (push) Successful in 14s
Reviewed-on: #222
Reviewed-by: Nicolas Belouin <nbelouin@noreply.src.opensuse.org>
2025-09-02 15:40:44 +02:00
e-minguez
5b167e10ab feat: Add suse-edge-components-versions
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 10s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 8s
2025-09-02 13:44:12 +02:00
9cbf868ba7 Bump the metal3-chart and BMO subchart version
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 9s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 11s
Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-09-01 12:51:30 +00:00
7e04a91e72 Allow to set IRONIC_EXTERNAL_URL_V6 to Metal3 BMO
Whenever a BMC only has an IPv6 address, the Baremetal Operator will
change the "external_http_url" in the driver to an IPv6 contained in
IRONIC_EXTERNAL_URL_V6, if set.

Introduce 'externalHttpIPv6' in values for the BMO, in order to generate
such environment variable in configmap-ironic.yaml.

Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-09-01 12:34:14 +00:00
e9554a4399 Merge pull request 'Revert the removal of repo' (#252) from dprodanov/Factory:fix-rm into main
Reviewed-on: #252
Reviewed-by: Nicolas Belouin <nbelouin@noreply.src.opensuse.org>
2025-08-29 13:25:11 +02:00
45cd7fbc36 Revert the removal of repo
Some checks failed
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 8s
Build PR in OBS / Build PR in OBS (pull_request_target) Failing after 1m2s
2025-08-29 14:24:06 +03:00
05f49fec7b Merge pull request 'Update rancher prime version to the GA' (#251) from dprodanov/Factory:update-rancher into main
Reviewed-on: #251
Reviewed-by: Kristian Zhelyazkov <kzhelyazkov@noreply.src.opensuse.org>
2025-08-29 13:20:46 +02:00
d1cb632801 Update Rancher prime version to GA
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 9s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 11s
2025-08-29 14:16:57 +03:00
a1ba635f5d Merge pull request 'upgrade-kubevirt' (#247) from dprodanov/Factory:upgrade-kubevirt into main
Reviewed-on: #247
Reviewed-by: Nicolas Belouin <nbelouin@noreply.src.opensuse.org>
2025-08-29 11:38:48 +02:00
0295819a86 bump chart version as well
Some checks failed
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 8s
Build PR in OBS / Build PR in OBS (pull_request_target) Failing after 2m8s
2025-08-29 12:36:47 +03:00
6875eea67f Merge pull request 'changed the entry point for pre-commit to call the script from the venv' (#248) from dprodanov/Factory:fix-pre-commit into main
All checks were successful
Synchronize Project Metadata / sync-prj-meta (push) Successful in 12s
Reviewed-on: #248
Reviewed-by: Nicolas Belouin <nbelouin@noreply.src.opensuse.org>
2025-08-29 10:53:39 +02:00
3652c43179 changed the entry point for pre-commit to call the script from the venv
Some checks failed
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 21s
Build PR in OBS / Build PR in OBS (pull_request_target) Failing after 1m43s
2025-08-29 11:51:53 +03:00
8403958d39 Update release manifest
Some checks failed
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 20s
Build PR in OBS / Build PR in OBS (pull_request_target) Failing after 53m16s
2025-08-29 11:09:09 +03:00
b77a565a57 Upgrade Kubevirt to 1.5.2 2025-08-29 11:07:13 +03:00
a0180aa25a Upgrade CDI to 1.62.0 2025-08-29 11:03:39 +03:00
2a852b4266 Add release URL (#246)
Reviewed-on: #246
Reviewed-by: Denislav Prodanov <dprodanov@noreply.src.opensuse.org>
2025-08-27 01:09:53 +02:00
1b112a8727 Merge pull request '[3.4.0] - updates to release-manifest' (#245) from dprodanov/Factory:3-4-0-release-manifest into main
Reviewed-on: #245
Reviewed-by: Nicolas Belouin <nbelouin@noreply.src.opensuse.org>
2025-08-26 13:29:03 +02:00
411e9ab220 [3.4.0] - updates to release-manifest
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 23s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 13s
2025-08-26 12:28:51 +03:00
9227c1bbeb Merge pull request 'Bump BMO to 0.10.2' (#217) from nbelouin/Factory:bmo-upgrade into main
Reviewed-on: #217
Reviewed-by: Marco Chiappero <mchiappero@noreply.src.opensuse.org>
Reviewed-by: Steven Hardy <steven.hardy@noreply.src.opensuse.org>
2025-08-22 15:27:10 +02:00
994273a2a3 Adding nessie to factory (#244)
Adding nessie to factory.
This aims to test the theory of conflict if there's same package and branch name, as was the case in #243

Authored-by: George <george_agriogiannis@yahoo.com>
Reviewed-on: #244
Reviewed-by: Nicolas Belouin <nbelouin@noreply.src.opensuse.org>
2025-08-22 09:25:32 +02:00
ec829ba559 Bump BMO to 0.10.2
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in -13s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 11s
Signed-off-by: Nicolas Belouin <nicolas.belouin@suse.com>
2025-08-21 09:04:32 +02:00
9821dab715 Pin to latest commit for EIB (#228)
Reviewed-on: #228
Reviewed-by: Denislav Prodanov <dprodanov@noreply.src.opensuse.org>
Co-authored-by: dbw7 <danial.bekhit@suse.com>
Co-committed-by: dbw7 <danial.bekhit@suse.com>
2025-08-20 08:36:43 +02:00
0eec81256f Merge pull request 'bump kubectl image in upgrade controller and turtles' (#239) from dprodanov/Factory:bump-kubectl-image into main
Reviewed-on: #239
Reviewed-by: Nicolas Belouin <nbelouin@noreply.src.opensuse.org>
2025-08-19 08:38:59 +02:00
0fd2e6472a bump kubectl image in upgrade controller and turtles
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in -23s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in -9s
2025-08-18 16:29:53 +03:00
d648a17268 Merge pull request 'kubectl-image' (#238) from dprodanov/Factory:kubectl-image into main
Reviewed-on: #238
Reviewed-by: Nicolas Belouin <nbelouin@noreply.src.opensuse.org>
2025-08-18 15:24:38 +02:00
d056b82800 merge upstream
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 9s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in -21s
2025-08-18 13:56:30 +02:00
e935c18527 Merge pull request 'updated 3.4.0 release manifest versions' (#236) from dprodanov/Factory:update-rm into main
Reviewed-on: #236
Reviewed-by: Nicolas Belouin <nbelouin@noreply.src.opensuse.org>
2025-08-18 13:49:03 +02:00
d1dcfadea6 update kubectl image to 1.33.4
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in -24s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in -21s
2025-08-18 13:15:40 +03:00
594a388a50 updated 3.4.0 release manifest versions
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in -11s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 10s
2025-08-18 13:06:57 +03:00
a8a7b3a542 Bump metal3-chart due to ironicIP
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 19s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 39s
Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-08-15 08:28:33 +00:00
6059a859a1 Bring IRONIC_IP back and give provisioningIP higher priority
Revert the change that translated ironicIP into provisioningIP, as well
as the messages on deprecation. This is to allow for the use with Metal
LB in SV.

Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-08-14 15:54:57 +00:00
8da51ba73f Allow the use of IRONIC_IP again in ironic-image
Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-08-14 15:54:56 +00:00
5bf3812659 Let every media download go through HTTPS if set up
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in -18s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in -18s
Update some URLs to leverage HTTPs whenever VMEDIA_TLS_PORT is set.

Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-08-14 15:54:56 +00:00
a11bb47c19 Always generate IRONIC_EXTERNAL_HTTP_URL
Commit 03d7a39 introduced the possibility to externally configure
IRONIC_EXTERNAL_HTTP_URL, while removing also the value when the host
was not user provided.

Revert this last behaviour, by always adding the variable in the ironic
ConfigMap even if the host is not set in values, leveraging either
ironicIP or provisioningIP. This is required to fix the use of VMedia
TLS.

Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-08-14 06:28:18 +00:00
d18aef225e Clear IRONIC_IP when PROVISIONING_IP is IPv6
Make sure that only IRONIC_IPV6 is set with a valid value when
PROVISIONING_IP is an IPv6 address by also clearing IRONIC_IP

Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-08-13 15:05:13 +00:00
8d1f677931 Align TLS HTTPD with HTTP
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in -18s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 24s
Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-08-12 14:19:56 +00:00
d0bbc1d844 Update a few httpd config files
Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-08-12 14:17:29 +00:00
47df258e97 Bump the metal3-chart versions after PR #223
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in -16s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in -15s
Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-08-12 09:14:00 +00:00
5ece6cd64e Temporarily grant access to anything on HTTPS
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 22s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 13s
Unfortuantely, likely due to some conflicts in the Apache, access cannot
be granted to /images/ only, so allow anyone for now.

Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-08-08 15:30:56 +00:00
0da5de1c06 Use Apache 2.4 syntax for access control on TLS HTTP server
Migrate the access rules for files in the HTTPS media server instance
to the newer 2.4 syntax, matching the HTTP media server in httpd.conf
2025-08-08 10:31:26 +00:00
27af056dce Fix a few ShellCheck reported warnings from PR #213
All checks were successful
Check Release Manifest Local Charts Versions / Check Release Manifest Local Charts Versions (pull_request) Successful in 10s
Build PR in OBS / Build PR in OBS (pull_request_target) Successful in 25s
The checks on the upstream project have reported some warnings to the
code accepted in PR #213, fix them in this commit.

Signed-off-by: Marco Chiappero <marco.chiappero@suse.com>
2025-08-07 20:20:09 +00:00
81 changed files with 1639 additions and 218 deletions

24
.gitmodules vendored
View File

@@ -13,3 +13,27 @@
[submodule "autoconf"]
path = autoconf
url = https://src.opensuse.org/SLFO-pool/autoconf.git
[submodule "python-pydantic"]
path = python-pydantic
url = https://src.opensuse.org/SLFO-pool/python-pydantic
[submodule "python-pydantic-core"]
path = python-pydantic-core
url = https://src.opensuse.org/SLFO-pool/python-pydantic-core
[submodule "python-inline-snapshot"]
path = python-inline-snapshot
url = https://src.opensuse.org/SLFO-pool/python-inline-snapshot
[submodule "python-executing"]
path = python-executing
url = https://src.opensuse.org/SLFO-pool/python-executing
[submodule "python-typing-inspection"]
path = python-typing-inspection
url = https://src.opensuse.org/SLFO-pool/python-typing-inspection
[submodule "python-annotated-types"]
path = python-annotated-types
url = https://src.opensuse.org/SLFO-pool/python-annotated-types
[submodule "python-typing_extensions"]
path = python-typing_extensions
url = https://src.opensuse.org/SLFO-pool/python-typing_extensions
[submodule "python-flit-core"]
path = python-flit-core
url = https://src.opensuse.org/SLFO-pool/python-flit-core

View File

@@ -3,7 +3,7 @@ repos:
hooks:
- id: check-manifest
name: "Check release-manifest"
entry: .obs/manifest-check.py
entry: python3 .obs/manifest-check.py
language: python
additional_dependencies: ['ruamel.yaml']
pass_filenames: false

11
_config
View File

@@ -1,5 +1,5 @@
Prefer: -libqpid-proton10 -python311-urllib3_1
Prefer: -cargo1.58 -cargo1.57 cargo1.88
Prefer: -cargo1.58 -cargo1.57 cargo1.89
Macros:
%__python3 /usr/bin/python3.11
@@ -50,6 +50,15 @@ Macros:
BuildFlags: excludebuild:autoconf:el
BuildFlags: excludebuild:autoconf:testsuite
# Missing deps for python packages related to suse-edge-components-versions
BuildFlags: excludebuild:python-pydantic:test
BuildFlags: excludebuild:python-pydantic-core:test
BuildFlags: excludebuild:python-inline-snapshot:test
BuildFlags: excludebuild:python-executing:test
BuildFlags: excludebuild:python-annotated-types:test
BuildFlags: excludebuild:python-typing-inspection:test
BuildFlags: excludebuild:python-typing_extensions:test
# Only build manifest embedding images here
%if "%_repository" == "test_manifest_images"
BuildFlags: onlybuild:edge-image-builder-image

View File

@@ -1,5 +1,5 @@
#!BuildTag: %%CHART_PREFIX%%akri-dashboard-extension:%%CHART_MAJOR%%.0.2_up1.3.1
#!BuildTag: %%CHART_PREFIX%%akri-dashboard-extension:%%CHART_MAJOR%%.0.2_up1.3.1-%RELEASE%
#!BuildTag: %%CHART_PREFIX%%akri-dashboard-extension:%%CHART_MAJOR%%.0.3_up1.3.1
#!BuildTag: %%CHART_PREFIX%%akri-dashboard-extension:%%CHART_MAJOR%%.0.3_up1.3.1-%RELEASE%
annotations:
catalog.cattle.io/certified: rancher
catalog.cattle.io/namespace: cattle-ui-plugin-system
@@ -12,10 +12,10 @@ annotations:
catalog.cattle.io/ui-extensions-version: '>= 3.0.2 < 4.0.0'
catalog.cattle.io/kube-version: '>= v1.26.0-0'
apiVersion: v2
appVersion: 303.0.2+up1.3.1
appVersion: 304.0.3+up1.3.1
description: 'SUSE Edge: Akri extension for Rancher Dashboard'
name: akri-dashboard-extension
type: application
version: "%%CHART_MAJOR%%.0.2+up1.3.1"
version: "%%CHART_MAJOR%%.0.3+up1.3.1"
icon: >-
https://raw.githubusercontent.com/cncf/artwork/main/projects/akri/icon/color/akri-icon-color.svg

View File

@@ -8,7 +8,7 @@ spec:
plugin:
name: {{ include "extension-server.fullname" . }}
version: {{ (semver (default .Chart.AppVersion .Values.plugin.versionOverride)).Original }}
endpoint: https://raw.githubusercontent.com/suse-edge/dashboard-extensions/gh-pages/extensions/akri-dashboard-extension/303.0.2+up1.3.1
endpoint: https://raw.githubusercontent.com/suse-edge/dashboard-extensions/gh-pages/extensions/akri-dashboard-extension/304.0.3+up1.3.1
noCache: {{ .Values.plugin.noCache }}
noAuth: {{ .Values.plugin.noAuth }}
metadata: {{ include "extension-server.pluginMetadata" . | indent 6 }}

View File

@@ -0,0 +1,163 @@
From f8c1ba1696fd8555e8e94246ec5afa38536fa8bd Mon Sep 17 00:00:00 2001
From: erjavaskivuori <erja.vaskivuori@est.tech>
Date: Thu, 5 Jun 2025 09:49:47 +0000
Subject: [PATCH 1/5] Enable exhaustive linter
Enable exhaustive linter to check exhaustiveness of switch statements of enum-like
constants.
Signed-off-by: erjavaskivuori <erja.vaskivuori@est.tech>
(cherry picked from commit a5a81b8717c9e6642ae626ea97933e3615fe11c0)
---
.golangci.yaml | 4 ++-
.../metal3.io/v1alpha1/baremetalhost_types.go | 1 +
.../metal3.io/baremetalhost_controller.go | 2 ++
.../metal3.io/host_state_machine.go | 4 +++
pkg/provisioner/ironic/ironic.go | 26 +++++++++----------
5 files changed, 22 insertions(+), 15 deletions(-)
diff --git a/.golangci.yaml b/.golangci.yaml
index 58e54b31..c758b93c 100644
--- a/.golangci.yaml
+++ b/.golangci.yaml
@@ -21,7 +21,7 @@ linters:
- errchkjson
#- errname
#- errorlint
- #- exhaustive
+ - exhaustive
- exptostd
- fatcontext
#- forbidigo
@@ -78,6 +78,8 @@ linters:
# Run with --fast=false for more extensive checks
fast: true
linters-settings:
+ exhaustive:
+ default-signifies-exhaustive: true
gosec:
severity: medium
confidence: medium
diff --git a/apis/metal3.io/v1alpha1/baremetalhost_types.go b/apis/metal3.io/v1alpha1/baremetalhost_types.go
index ba1b4333..426a7a89 100644
--- a/apis/metal3.io/v1alpha1/baremetalhost_types.go
+++ b/apis/metal3.io/v1alpha1/baremetalhost_types.go
@@ -1113,6 +1113,7 @@ func (host *BareMetalHost) OperationMetricForState(operation ProvisioningState)
metric = &history.Provision
case StateDeprovisioning:
metric = &history.Deprovision
+ default:
}
return
}
diff --git a/internal/controller/metal3.io/baremetalhost_controller.go b/internal/controller/metal3.io/baremetalhost_controller.go
index 33310bf7..1998627e 100644
--- a/internal/controller/metal3.io/baremetalhost_controller.go
+++ b/internal/controller/metal3.io/baremetalhost_controller.go
@@ -586,6 +586,7 @@ func getCurrentImage(host *metal3api.BareMetalHost) *metal3api.Image {
if host.Spec.Image != nil && host.Spec.Image.URL != "" {
return host.Spec.Image.DeepCopy()
}
+ default:
}
return nil
}
@@ -816,6 +817,7 @@ func (r *BareMetalHostReconciler) registerHost(prov provisioner.Provisioner, inf
if info.host.Spec.AutomatedCleaningMode == metal3api.CleaningModeDisabled {
preprovImgFormats = nil
}
+ default:
}
preprovImg, err := r.getPreprovImage(info, preprovImgFormats)
diff --git a/internal/controller/metal3.io/host_state_machine.go b/internal/controller/metal3.io/host_state_machine.go
index 8b382553..6d88591b 100644
--- a/internal/controller/metal3.io/host_state_machine.go
+++ b/internal/controller/metal3.io/host_state_machine.go
@@ -107,6 +107,7 @@ func (hsm *hostStateMachine) updateHostStateFrom(initialState metal3api.Provisio
if actionRes := hsm.ensureCapacity(info, hsm.NextState); actionRes != nil {
return actionRes
}
+ default:
}
info.log.Info("changing provisioning state",
@@ -137,6 +138,7 @@ func (hsm *hostStateMachine) updateHostStateFrom(initialState metal3api.Provisio
info.log.Info("saving boot mode",
"new mode", hsm.Host.Status.Provisioning.BootMode)
}
+ default:
}
}
@@ -163,6 +165,7 @@ func (hsm *hostStateMachine) checkDelayedHost(info *reconcileInfo) actionResult
if actionRes := hsm.ensureCapacity(info, info.host.Status.Provisioning.State); actionRes != nil {
return actionRes
}
+ default:
}
return nil
@@ -299,6 +302,7 @@ func (hsm *hostStateMachine) checkDetachedHost(info *reconcileInfo) (result acti
switch info.host.Status.Provisioning.State {
case metal3api.StateProvisioned, metal3api.StateExternallyProvisioned, metal3api.StateReady, metal3api.StateAvailable:
return hsm.Reconciler.detachHost(hsm.Provisioner, info)
+ default:
}
}
if info.host.Status.ErrorType == metal3api.DetachError {
diff --git a/pkg/provisioner/ironic/ironic.go b/pkg/provisioner/ironic/ironic.go
index 9a4b4589..4c4923ad 100644
--- a/pkg/provisioner/ironic/ironic.go
+++ b/pkg/provisioner/ironic/ironic.go
@@ -335,21 +335,17 @@ func (p *ironicProvisioner) configureImages(data provisioner.ManagementAccessDat
return result, err
}
+ if data.State == metal3api.StateProvisioning && data.CurrentImage.IsLiveISO() {
+ // Live ISO doesn't need pre-provisioning image
+ return result, nil
+ }
+
+ if data.State == metal3api.StateDeprovisioning && data.AutomatedCleaningMode == metal3api.CleaningModeDisabled {
+ // No need for pre-provisioning image if cleaning disabled
+ return result, nil
+ }
+
switch data.State {
- case metal3api.StateProvisioning,
- metal3api.StateDeprovisioning:
- if data.State == metal3api.StateProvisioning {
- if data.CurrentImage.IsLiveISO() {
- // Live ISO doesn't need pre-provisioning image
- return result, nil
- }
- } else {
- if data.AutomatedCleaningMode == metal3api.CleaningModeDisabled {
- // No need for pre-provisioning image if cleaning disabled
- return result, nil
- }
- }
- fallthrough
case metal3api.StateInspecting,
metal3api.StatePreparing:
if deployImageInfo == nil {
@@ -360,6 +356,7 @@ func (p *ironicProvisioner) configureImages(data provisioner.ManagementAccessDat
}
return result, err
}
+ default:
}
return result, nil
@@ -1724,6 +1721,7 @@ func (p *ironicProvisioner) loadBusyHosts() (hosts map[string]struct{}, err erro
if !strings.Contains(node.BootInterface, "virtual-media") {
hosts[node.Name] = struct{}{}
}
+ default:
}
}
--
2.50.1

View File

@@ -0,0 +1,91 @@
From 509ba92a8ed7303a418c5277f7544db2765c3802 Mon Sep 17 00:00:00 2001
From: Dmitry Tantsur <dtantsur@protonmail.com>
Date: Wed, 2 Jul 2025 17:33:46 +0200
Subject: [PATCH 2/5] Stop requiring DEPLOY_KERNEL/RAMDISK
Ironic has global configuration that allows specifying them, even
depending on the architecture. Our ironic-image supports that when
IPA downloader is used (and should start supporting explicit variables
too).
Signed-off-by: Dmitry Tantsur <dtantsur@protonmail.com>
(cherry picked from commit 0f1ef6cbeb8815f19d853ba5eab1e70c7d85e2ec)
---
pkg/provisioner/ironic/factory.go | 6 ++----
pkg/provisioner/ironic/factory_test.go | 9 ++-------
pkg/provisioner/ironic/ironic.go | 10 +++-------
3 files changed, 7 insertions(+), 18 deletions(-)
diff --git a/pkg/provisioner/ironic/factory.go b/pkg/provisioner/ironic/factory.go
index 19571eb0..15f636b3 100644
--- a/pkg/provisioner/ironic/factory.go
+++ b/pkg/provisioner/ironic/factory.go
@@ -114,10 +114,8 @@ func loadConfigFromEnv(havePreprovImgBuilder bool) (ironicConfig, error) {
c.deployRamdiskURL = os.Getenv("DEPLOY_RAMDISK_URL")
c.deployISOURL = os.Getenv("DEPLOY_ISO_URL")
if !havePreprovImgBuilder {
- if c.deployISOURL == "" &&
- (c.deployKernelURL == "" || c.deployRamdiskURL == "") {
- return c, errors.New("either DEPLOY_KERNEL_URL and DEPLOY_RAMDISK_URL or DEPLOY_ISO_URL must be set")
- }
+ // NOTE(dtantsur): with a PreprovisioningImage controller, it makes sense to set only the kernel.
+ // Without it, either both or neither must be set.
if (c.deployKernelURL == "" && c.deployRamdiskURL != "") ||
(c.deployKernelURL != "" && c.deployRamdiskURL == "") {
return c, errors.New("DEPLOY_KERNEL_URL and DEPLOY_RAMDISK_URL can only be set together")
diff --git a/pkg/provisioner/ironic/factory_test.go b/pkg/provisioner/ironic/factory_test.go
index db47d8b2..0d32eccb 100644
--- a/pkg/provisioner/ironic/factory_test.go
+++ b/pkg/provisioner/ironic/factory_test.go
@@ -98,24 +98,19 @@ func TestLoadConfigFromEnv(t *testing.T) {
ramdiskURL: "http://ramdisk",
},
},
- {
- name: "no deploy info",
- env: EnvFixture{},
- expectedError: "either DEPLOY_KERNEL_URL and DEPLOY_RAMDISK_URL or DEPLOY_ISO_URL must be set",
- },
{
name: "only kernel",
env: EnvFixture{
kernelURL: "http://kernel",
},
- expectedError: "either DEPLOY_KERNEL_URL and DEPLOY_RAMDISK_URL or DEPLOY_ISO_URL must be set",
+ expectedError: "DEPLOY_KERNEL_URL and DEPLOY_RAMDISK_URL can only be set together",
},
{
name: "only ramdisk",
env: EnvFixture{
ramdiskURL: "http://ramdisk",
},
- expectedError: "either DEPLOY_KERNEL_URL and DEPLOY_RAMDISK_URL or DEPLOY_ISO_URL must be set",
+ expectedError: "DEPLOY_KERNEL_URL and DEPLOY_RAMDISK_URL can only be set together",
expectedImgBuildError: "DEPLOY_RAMDISK_URL requires DEPLOY_KERNEL_URL to be set also",
},
{
diff --git a/pkg/provisioner/ironic/ironic.go b/pkg/provisioner/ironic/ironic.go
index 4c4923ad..48db865a 100644
--- a/pkg/provisioner/ironic/ironic.go
+++ b/pkg/provisioner/ironic/ironic.go
@@ -348,14 +348,10 @@ func (p *ironicProvisioner) configureImages(data provisioner.ManagementAccessDat
switch data.State {
case metal3api.StateInspecting,
metal3api.StatePreparing:
- if deployImageInfo == nil {
- if p.config.havePreprovImgBuilder {
- result, err = transientError(provisioner.ErrNeedsPreprovisioningImage)
- } else {
- result, err = operationFailed("no preprovisioning image available")
- }
- return result, err
+ if deployImageInfo == nil && p.config.havePreprovImgBuilder {
+ result, err = transientError(provisioner.ErrNeedsPreprovisioningImage)
}
+ return result, err
default:
}
--
2.50.1

View File

@@ -0,0 +1,49 @@
From ea10df866f0fc491cac15ba5005f3b820e1ccecb Mon Sep 17 00:00:00 2001
From: Dmitry Tantsur <dtantsur@protonmail.com>
Date: Wed, 2 Jul 2025 17:55:48 +0200
Subject: [PATCH 3/5] Remove DEPLOY_KERNEL_URL from deployment scripts for main
Signed-off-by: Dmitry Tantsur <dtantsur@protonmail.com>
(cherry picked from commit ddcf3d915819b6344f79fbcec3e28250b217a597)
---
config/default/ironic.env | 2 --
config/overlays/e2e/ironic.env | 2 --
config/render/capm3.yaml | 2 --
3 files changed, 6 deletions(-)
diff --git a/config/default/ironic.env b/config/default/ironic.env
index e72cb3c3..3fe36d25 100644
--- a/config/default/ironic.env
+++ b/config/default/ironic.env
@@ -1,7 +1,5 @@
HTTP_PORT=6180
PROVISIONING_INTERFACE=eth2
DHCP_RANGE=172.22.0.10,172.22.0.100
-DEPLOY_KERNEL_URL=http://172.22.0.2:6180/images/ironic-python-agent.kernel
-DEPLOY_RAMDISK_URL=http://172.22.0.2:6180/images/ironic-python-agent.initramfs
IRONIC_ENDPOINT=http://172.22.0.2:6385/v1/
CACHEURL=http://172.22.0.1/images
diff --git a/config/overlays/e2e/ironic.env b/config/overlays/e2e/ironic.env
index 44147ae0..6f200720 100644
--- a/config/overlays/e2e/ironic.env
+++ b/config/overlays/e2e/ironic.env
@@ -1,3 +1 @@
-DEPLOY_KERNEL_URL=http://192.168.222.1:6180/images/ironic-python-agent.kernel
-DEPLOY_RAMDISK_URL=http://192.168.222.1:6180/images/ironic-python-agent.initramfs
IRONIC_ENDPOINT=https://192.168.222.1:6385/v1/
diff --git a/config/render/capm3.yaml b/config/render/capm3.yaml
index 42283193..7568288f 100644
--- a/config/render/capm3.yaml
+++ b/config/render/capm3.yaml
@@ -2510,8 +2510,6 @@ subjects:
apiVersion: v1
data:
CACHEURL: http://172.22.0.1/images
- DEPLOY_KERNEL_URL: http://172.22.0.2:6180/images/ironic-python-agent.kernel
- DEPLOY_RAMDISK_URL: http://172.22.0.2:6180/images/ironic-python-agent.initramfs
DHCP_RANGE: 172.22.0.10,172.22.0.100
HTTP_PORT: "6180"
IRONIC_ENDPOINT: http://172.22.0.2:6385/v1/
--
2.50.1

View File

@@ -0,0 +1,422 @@
From b2e8a1a42c95a3338c9c83a4781ba4744da5ff6a Mon Sep 17 00:00:00 2001
From: Dmitry Tantsur <dtantsur@protonmail.com>
Date: Tue, 24 Jun 2025 18:53:42 +0200
Subject: [PATCH 4/5] Refactor setting various Ironic properties
Currently, Ironic instance_info and properties fields are populated at
random either in most states or before deployment. While potentially
convenient, it makes it very hard to reason about the code.
Now, the logic is split into two parts:
1. configureNode (renamed from configureImages) writes fields that are
considered properties of the node itself: CPU architecture, deploy
images, capabilities, etc.
2. getInstanceUpdateOpts (merge of getImageUpdateOptsForNode and
getUpdateOptsForNode) writes fields that are required for deployment
and thus are properties of instance. This includes images, checksums,
runtime capabilities. As an exception, root device hints fall under
this category and thus are now set in instance_info, not properties.
Signed-off-by: Dmitry Tantsur <dtantsur@protonmail.com>
(cherry picked from commit 0c70cba38c926c474f4fa129a7e99ef9827d6ce9)
---
.../metal3.io/baremetalhost_controller.go | 2 +-
pkg/provisioner/ironic/ironic.go | 49 +++++-------
pkg/provisioner/ironic/provision_test.go | 27 +++----
pkg/provisioner/ironic/register.go | 3 +-
pkg/provisioner/ironic/register_test.go | 78 +------------------
pkg/provisioner/provisioner.go | 2 +-
6 files changed, 40 insertions(+), 121 deletions(-)
diff --git a/internal/controller/metal3.io/baremetalhost_controller.go b/internal/controller/metal3.io/baremetalhost_controller.go
index 1998627e..0d0c9562 100644
--- a/internal/controller/metal3.io/baremetalhost_controller.go
+++ b/internal/controller/metal3.io/baremetalhost_controller.go
@@ -848,6 +848,7 @@ func (r *BareMetalHostReconciler) registerHost(prov provisioner.Provisioner, inf
PreprovisioningNetworkData: preprovisioningNetworkData,
HasCustomDeploy: hasCustomDeploy(info.host),
DisablePowerOff: info.host.Spec.DisablePowerOff,
+ CPUArchitecture: getHostArchitecture(info.host),
},
credsChanged,
info.host.Status.ErrorType == metal3api.RegistrationError)
@@ -1271,7 +1272,6 @@ func (r *BareMetalHostReconciler) actionProvisioning(prov provisioner.Provisione
BootMode: info.host.Status.Provisioning.BootMode,
HardwareProfile: hwProf,
RootDeviceHints: info.host.Status.Provisioning.RootDeviceHints.DeepCopy(),
- CPUArchitecture: getHostArchitecture(info.host),
}, forceReboot)
if err != nil {
return actionError{errors.Wrap(err, "failed to provision")}
diff --git a/pkg/provisioner/ironic/ironic.go b/pkg/provisioner/ironic/ironic.go
index 48db865a..b8e6d72b 100644
--- a/pkg/provisioner/ironic/ironic.go
+++ b/pkg/provisioner/ironic/ironic.go
@@ -311,20 +311,24 @@ func (p *ironicProvisioner) createPXEEnabledNodePort(uuid, macAddress string) er
return nil
}
-func (p *ironicProvisioner) configureImages(data provisioner.ManagementAccessData, ironicNode *nodes.Node, bmcAccess bmc.AccessDetails) (result provisioner.Result, err error) {
+func (p *ironicProvisioner) configureNode(data provisioner.ManagementAccessData, ironicNode *nodes.Node, bmcAccess bmc.AccessDetails) (result provisioner.Result, err error) {
updater := clients.UpdateOptsBuilder(p.log)
deployImageInfo := setDeployImage(p.config, bmcAccess, data.PreprovisioningImage)
updater.SetDriverInfoOpts(deployImageInfo, ironicNode)
- // NOTE(dtantsur): It is risky to update image information for active nodes since it may affect the ability to clean up.
- if (data.CurrentImage != nil || data.HasCustomDeploy) && ironicNode.ProvisionState != string(nodes.Active) {
- p.getImageUpdateOptsForNode(ironicNode, data.CurrentImage, data.BootMode, data.HasCustomDeploy, updater)
- }
updater.SetTopLevelOpt("automated_clean",
data.AutomatedCleaningMode != metal3api.CleaningModeDisabled,
ironicNode.AutomatedClean)
+ opts := clients.UpdateOptsData{
+ "capabilities": buildCapabilitiesValue(ironicNode, data.BootMode),
+ }
+ if data.CPUArchitecture != "" {
+ opts["cpu_arch"] = data.CPUArchitecture
+ }
+ updater.SetPropertiesOpts(opts, ironicNode)
+
_, success, result, err := p.tryUpdateNode(ironicNode, updater)
if !success {
return result, err
@@ -656,40 +660,29 @@ func (p *ironicProvisioner) setCustomDeployUpdateOptsForNode(ironicNode *nodes.N
SetTopLevelOpt("deploy_interface", "custom-agent", ironicNode.DeployInterface)
}
-func (p *ironicProvisioner) getImageUpdateOptsForNode(ironicNode *nodes.Node, imageData *metal3api.Image, bootMode metal3api.BootMode, hasCustomDeploy bool, updater *clients.NodeUpdater) {
+func (p *ironicProvisioner) getInstanceUpdateOpts(ironicNode *nodes.Node, data provisioner.ProvisionData) *clients.NodeUpdater {
+ updater := clients.UpdateOptsBuilder(p.log)
+
+ hasCustomDeploy := data.CustomDeploy != nil && data.CustomDeploy.Method != ""
+
// instance_uuid
updater.SetTopLevelOpt("instance_uuid", string(p.objectMeta.UID), ironicNode.InstanceUUID)
updater.SetInstanceInfoOpts(clients.UpdateOptsData{
- "capabilities": buildInstanceInfoCapabilities(bootMode),
+ "capabilities": buildInstanceInfoCapabilities(data.BootMode),
+ "root_device": devicehints.MakeHintMap(data.RootDeviceHints),
}, ironicNode)
if hasCustomDeploy {
// Custom deploy process
- p.setCustomDeployUpdateOptsForNode(ironicNode, imageData, updater)
- } else if imageData.IsLiveISO() {
+ p.setCustomDeployUpdateOptsForNode(ironicNode, &data.Image, updater)
+ } else if data.Image.IsLiveISO() {
// Set live-iso format options
- p.setLiveIsoUpdateOptsForNode(ironicNode, imageData, updater)
+ p.setLiveIsoUpdateOptsForNode(ironicNode, &data.Image, updater)
} else {
// Set deploy_interface direct options when not booting a live-iso
- p.setDirectDeployUpdateOptsForNode(ironicNode, imageData, updater)
+ p.setDirectDeployUpdateOptsForNode(ironicNode, &data.Image, updater)
}
-}
-
-func (p *ironicProvisioner) getUpdateOptsForNode(ironicNode *nodes.Node, data provisioner.ProvisionData) *clients.NodeUpdater {
- updater := clients.UpdateOptsBuilder(p.log)
-
- hasCustomDeploy := data.CustomDeploy != nil && data.CustomDeploy.Method != ""
- p.getImageUpdateOptsForNode(ironicNode, &data.Image, data.BootMode, hasCustomDeploy, updater)
-
- opts := clients.UpdateOptsData{
- "root_device": devicehints.MakeHintMap(data.RootDeviceHints),
- "capabilities": buildCapabilitiesValue(ironicNode, data.BootMode),
- }
- if data.CPUArchitecture != "" {
- opts["cpu_arch"] = data.CPUArchitecture
- }
- updater.SetPropertiesOpts(opts, ironicNode)
return updater
}
@@ -792,7 +785,7 @@ func (p *ironicProvisioner) setUpForProvisioning(ironicNode *nodes.Node, data pr
p.log.Info("starting provisioning", "node properties", ironicNode.Properties)
ironicNode, success, result, err := p.tryUpdateNode(ironicNode,
- p.getUpdateOptsForNode(ironicNode, data))
+ p.getInstanceUpdateOpts(ironicNode, data))
if !success {
return result, err
}
diff --git a/pkg/provisioner/ironic/provision_test.go b/pkg/provisioner/ironic/provision_test.go
index 72ee57b7..40c714e9 100644
--- a/pkg/provisioner/ironic/provision_test.go
+++ b/pkg/provisioner/ironic/provision_test.go
@@ -713,7 +713,7 @@ func TestGetUpdateOptsForNodeWithRootHints(t *testing.T) {
BootMode: metal3api.DefaultBootMode,
RootDeviceHints: host.Status.Provisioning.RootDeviceHints,
}
- patches := prov.getUpdateOptsForNode(ironicNode, provData).Updates
+ patches := prov.getInstanceUpdateOpts(ironicNode, provData).Updates
t.Logf("patches: %v", patches)
@@ -723,7 +723,7 @@ func TestGetUpdateOptsForNodeWithRootHints(t *testing.T) {
Value interface{} // the value being passed to ironic (or value associated with the key)
}{
{
- Path: "/properties/root_device",
+ Path: "/instance_info/root_device",
Value: "userdefined_devicename",
Map: map[string]string{
"name": "s== userd_devicename",
@@ -807,7 +807,7 @@ func TestGetUpdateOptsForNodeVirtual(t *testing.T) {
BootMode: metal3api.DefaultBootMode,
HardwareProfile: hwProf,
}
- patches := prov.getUpdateOptsForNode(ironicNode, provData).Updates
+ patches := prov.getInstanceUpdateOpts(ironicNode, provData).Updates
t.Logf("patches: %v", patches)
@@ -903,9 +903,8 @@ func TestGetUpdateOptsForNodeDell(t *testing.T) {
Image: *host.Spec.Image,
BootMode: metal3api.DefaultBootMode,
HardwareProfile: hwProf,
- CPUArchitecture: "x86_64",
}
- patches := prov.getUpdateOptsForNode(ironicNode, provData).Updates
+ patches := prov.getInstanceUpdateOpts(ironicNode, provData).Updates
t.Logf("patches: %v", patches)
@@ -930,10 +929,6 @@ func TestGetUpdateOptsForNodeDell(t *testing.T) {
Path: "/instance_uuid",
Value: "27720611-e5d1-45d3-ba3a-222dcfaa4ca2",
},
- {
- Path: "/properties/cpu_arch",
- Value: "x86_64",
- },
}
for _, e := range expected {
@@ -971,7 +966,7 @@ func TestGetUpdateOptsForNodeLiveIso(t *testing.T) {
Image: *host.Spec.Image,
BootMode: metal3api.DefaultBootMode,
}
- patches := prov.getUpdateOptsForNode(ironicNode, provData).Updates
+ patches := prov.getInstanceUpdateOpts(ironicNode, provData).Updates
t.Logf("patches: %v", patches)
@@ -1038,7 +1033,7 @@ func TestGetUpdateOptsForNodeImageToLiveIso(t *testing.T) {
Image: *host.Spec.Image,
BootMode: metal3api.DefaultBootMode,
}
- patches := prov.getUpdateOptsForNode(ironicNode, provData).Updates
+ patches := prov.getInstanceUpdateOpts(ironicNode, provData).Updates
t.Logf("patches: %v", patches)
@@ -1116,7 +1111,7 @@ func TestGetUpdateOptsForNodeLiveIsoToImage(t *testing.T) {
Image: *host.Spec.Image,
BootMode: metal3api.DefaultBootMode,
}
- patches := prov.getUpdateOptsForNode(ironicNode, provData).Updates
+ patches := prov.getInstanceUpdateOpts(ironicNode, provData).Updates
t.Logf("patches: %v", patches)
@@ -1188,7 +1183,7 @@ func TestGetUpdateOptsForNodeCustomDeploy(t *testing.T) {
BootMode: metal3api.DefaultBootMode,
CustomDeploy: host.Spec.CustomDeploy,
}
- patches := prov.getUpdateOptsForNode(ironicNode, provData).Updates
+ patches := prov.getInstanceUpdateOpts(ironicNode, provData).Updates
t.Logf("patches: %v", patches)
@@ -1245,7 +1240,7 @@ func TestGetUpdateOptsForNodeCustomDeployWithImage(t *testing.T) {
BootMode: metal3api.DefaultBootMode,
CustomDeploy: host.Spec.CustomDeploy,
}
- patches := prov.getUpdateOptsForNode(ironicNode, provData).Updates
+ patches := prov.getInstanceUpdateOpts(ironicNode, provData).Updates
t.Logf("patches: %v", patches)
@@ -1312,7 +1307,7 @@ func TestGetUpdateOptsForNodeImageToCustomDeploy(t *testing.T) {
BootMode: metal3api.DefaultBootMode,
CustomDeploy: host.Spec.CustomDeploy,
}
- patches := prov.getUpdateOptsForNode(ironicNode, provData).Updates
+ patches := prov.getInstanceUpdateOpts(ironicNode, provData).Updates
t.Logf("patches: %v", patches)
@@ -1405,7 +1400,7 @@ func TestGetUpdateOptsForNodeSecureBoot(t *testing.T) {
BootMode: metal3api.UEFISecureBoot,
HardwareProfile: hwProf,
}
- patches := prov.getUpdateOptsForNode(ironicNode, provData).Updates
+ patches := prov.getInstanceUpdateOpts(ironicNode, provData).Updates
t.Logf("patches: %v", patches)
diff --git a/pkg/provisioner/ironic/register.go b/pkg/provisioner/ironic/register.go
index 390e463f..9a600189 100644
--- a/pkg/provisioner/ironic/register.go
+++ b/pkg/provisioner/ironic/register.go
@@ -220,7 +220,7 @@ func (p *ironicProvisioner) Register(data provisioner.ManagementAccessData, cred
fallthrough
default:
- result, err = p.configureImages(data, ironicNode, bmcAccess)
+ result, err = p.configureNode(data, ironicNode, bmcAccess)
return result, provID, err
}
}
@@ -246,6 +246,7 @@ func (p *ironicProvisioner) enrollNode(data provisioner.ManagementAccessData, bm
DisablePowerOff: &data.DisablePowerOff,
Properties: map[string]interface{}{
"capabilities": buildCapabilitiesValue(nil, data.BootMode),
+ "cpu_arch": data.CPUArchitecture,
},
}
diff --git a/pkg/provisioner/ironic/register_test.go b/pkg/provisioner/ironic/register_test.go
index e6c302b5..8e524dad 100644
--- a/pkg/provisioner/ironic/register_test.go
+++ b/pkg/provisioner/ironic/register_test.go
@@ -72,7 +72,7 @@ func TestRegisterMACOptional(t *testing.T) {
assert.Equal(t, "", result.ErrorMessage)
}
-func TestRegisterCreateNodeNoImage(t *testing.T) {
+func TestRegisterCreateNode(t *testing.T) {
// Create a host without a bootMACAddress and with a BMC that
// does not require one.
host := makeHost()
@@ -146,79 +146,6 @@ func TestRegisterCreateNodeOldInspection(t *testing.T) {
assert.Equal(t, "inspector", createdNode.InspectInterface)
}
-func TestRegisterCreateWithImage(t *testing.T) {
- // Create a host with Image specified in the Spec
- host := makeHost()
- host.Status.Provisioning.ID = "" // so we don't lookup by uuid
- host.Spec.Image.URL = "theimagefoo"
- host.Spec.Image.Checksum = "thechecksumxyz"
- host.Spec.Image.ChecksumType = "auto"
-
- var createdNode *nodes.Node
-
- createCallback := func(node nodes.Node) {
- createdNode = &node
- }
-
- ironic := testserver.NewIronic(t).WithDrivers().CreateNodes(createCallback).NoNode(host.Namespace + nameSeparator + host.Name).NoNode(host.Name)
- ironic.AddDefaultResponse("/v1/nodes/node-0", "PATCH", http.StatusOK, "{}")
- ironic.Start()
- defer ironic.Stop()
-
- auth := clients.AuthConfig{Type: clients.NoAuth}
- prov, err := newProvisionerWithSettings(host, bmc.Credentials{}, nullEventPublisher, ironic.Endpoint(), auth)
- if err != nil {
- t.Fatalf("could not create provisioner: %s", err)
- }
-
- result, provID, err := prov.Register(provisioner.ManagementAccessData{CurrentImage: host.Spec.Image.DeepCopy()}, false, false)
- if err != nil {
- t.Fatalf("error from Register: %s", err)
- }
- assert.Equal(t, "", result.ErrorMessage)
- assert.Equal(t, createdNode.UUID, provID)
- assert.Equal(t, "", createdNode.DeployInterface)
- updates, _ := ironic.GetLastRequestFor("/v1/nodes/node-0", http.MethodPatch)
- assert.Contains(t, updates, "/instance_info/image_source")
- assert.Contains(t, updates, host.Spec.Image.URL)
- assert.Contains(t, updates, "/instance_info/image_checksum")
- assert.Contains(t, updates, host.Spec.Image.Checksum)
-}
-
-func TestRegisterCreateWithLiveIso(t *testing.T) {
- // Create a host with Image specified in the Spec
- host := makeHostLiveIso()
- host.Status.Provisioning.ID = "" // so we don't lookup by uuid
-
- var createdNode *nodes.Node
-
- createCallback := func(node nodes.Node) {
- createdNode = &node
- }
-
- ironic := testserver.NewIronic(t).WithDrivers().CreateNodes(createCallback).NoNode(host.Namespace + nameSeparator + host.Name).NoNode(host.Name)
- ironic.AddDefaultResponse("/v1/nodes/node-0", "PATCH", http.StatusOK, "{}")
- ironic.Start()
- defer ironic.Stop()
-
- auth := clients.AuthConfig{Type: clients.NoAuth}
- prov, err := newProvisionerWithSettings(host, bmc.Credentials{}, nullEventPublisher, ironic.Endpoint(), auth)
- if err != nil {
- t.Fatalf("could not create provisioner: %s", err)
- }
-
- result, provID, err := prov.Register(provisioner.ManagementAccessData{CurrentImage: host.Spec.Image.DeepCopy()}, false, false)
- if err != nil {
- t.Fatalf("error from Register: %s", err)
- }
- assert.Equal(t, "", result.ErrorMessage)
- assert.Equal(t, createdNode.UUID, provID)
- assert.Equal(t, "ramdisk", createdNode.DeployInterface)
- updates, _ := ironic.GetLastRequestFor("/v1/nodes/node-0", http.MethodPatch)
- assert.Contains(t, updates, "/instance_info/boot_iso")
- assert.Contains(t, updates, host.Spec.Image.URL)
-}
-
func TestRegisterExistingNode(t *testing.T) {
// Create a host without a bootMACAddress and with a BMC that
// does not require one.
@@ -342,6 +269,7 @@ func TestRegisterExistingNodeContinue(t *testing.T) {
"test_password": "******", // ironic returns a placeholder
"test_port": "42",
},
+ Properties: map[string]interface{}{"capabilities": ""},
}).NodeUpdate(nodes.Node{
UUID: "uuid",
})
@@ -521,6 +449,7 @@ func TestRegisterExistingSteadyStateNoUpdate(t *testing.T) {
DeployInterface: imageType.DeployInterface,
InstanceInfo: imageType.InstanceInfo,
DriverInfo: imageType.DriverInfo,
+ Properties: map[string]interface{}{"capabilities": ""},
}).NodeUpdate(nodes.Node{
UUID: "uuid",
})
@@ -577,6 +506,7 @@ func TestRegisterExistingNodeWaiting(t *testing.T) {
"test_password": "******", // ironic returns a placeholder
"test_port": "42",
},
+ Properties: map[string]interface{}{"capabilities": ""},
}
ironic := testserver.NewIronic(t).CreateNodes(createCallback).Node(node).NodeUpdate(nodes.Node{
UUID: "uuid",
diff --git a/pkg/provisioner/provisioner.go b/pkg/provisioner/provisioner.go
index faddd0fd..e2018e63 100644
--- a/pkg/provisioner/provisioner.go
+++ b/pkg/provisioner/provisioner.go
@@ -82,6 +82,7 @@ type ManagementAccessData struct {
PreprovisioningNetworkData string
HasCustomDeploy bool
DisablePowerOff bool
+ CPUArchitecture string
}
type AdoptData struct {
@@ -122,7 +123,6 @@ type ProvisionData struct {
HardwareProfile profile.Profile
RootDeviceHints *metal3api.RootDeviceHints
CustomDeploy *metal3api.CustomDeploy
- CPUArchitecture string
}
type HTTPHeaders []map[string]string
--
2.50.1

View File

@@ -0,0 +1,46 @@
From 5419f8d95306efed8667936156d8081c21e068ed Mon Sep 17 00:00:00 2001
From: Dmitry Tantsur <dtantsur@protonmail.com>
Date: Wed, 9 Jul 2025 14:02:23 +0200
Subject: [PATCH 5/5] Provide inline docs for node configuration calls
Signed-off-by: Dmitry Tantsur <dtantsur@protonmail.com>
(cherry picked from commit 778d9342747aefc8079f1ccaa6a14f83b26f28ff)
---
pkg/provisioner/ironic/ironic.go | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/pkg/provisioner/ironic/ironic.go b/pkg/provisioner/ironic/ironic.go
index b8e6d72b..166d929c 100644
--- a/pkg/provisioner/ironic/ironic.go
+++ b/pkg/provisioner/ironic/ironic.go
@@ -311,6 +311,10 @@ func (p *ironicProvisioner) createPXEEnabledNodePort(uuid, macAddress string) er
return nil
}
+// configureNode configures Node properties that are not related to any specific provisioning phase.
+// It populates the AutomatedClean field, as well as capabilities and architecture in Properties.
+// It also calls setDeployImage to populate IPA parameters in DriverInfo and
+// checks if the required PreprovisioningImage is provided and ready.
func (p *ironicProvisioner) configureNode(data provisioner.ManagementAccessData, ironicNode *nodes.Node, bmcAccess bmc.AccessDetails) (result provisioner.Result, err error) {
updater := clients.UpdateOptsBuilder(p.log)
@@ -426,6 +430,8 @@ func setExternalURL(p *ironicProvisioner, driverInfo map[string]interface{}) map
return driverInfo
}
+// setDeployImage configures the IPA ramdisk parameters in the Node's DriverInfo.
+// It can use either the provided PreprovisioningImage or the global configuration from ironicConfig.
func setDeployImage(config ironicConfig, accessDetails bmc.AccessDetails, hostImage *provisioner.PreprovisioningImage) clients.UpdateOptsData {
deployImageInfo := clients.UpdateOptsData{
deployKernelKey: nil,
@@ -660,6 +666,7 @@ func (p *ironicProvisioner) setCustomDeployUpdateOptsForNode(ironicNode *nodes.N
SetTopLevelOpt("deploy_interface", "custom-agent", ironicNode.DeployInterface)
}
+// getInstanceUpdateOpts constructs InstanceInfo options required to provision a Node in Ironic.
func (p *ironicProvisioner) getInstanceUpdateOpts(ironicNode *nodes.Node, data provisioner.ProvisionData) *clients.NodeUpdater {
updater := clients.UpdateOptsBuilder(p.log)
--
2.50.1

View File

@@ -2,7 +2,7 @@
<service name="obs_scm">
<param name="url">https://github.com/metal3-io/baremetal-operator</param>
<param name="scm">git</param>
<param name="revision">v0.9.1</param>
<param name="revision">v0.10.2</param>
<param name="version">_auto_</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="changesgenerate">enable</param>

View File

@@ -17,14 +17,21 @@
Name: baremetal-operator
Version: 0.9.1
Version: 0.10.2
Release: 0
Summary: Implements a Kubernetes API for managing bare metal hosts
License: Apache-2.0
URL: https://github.com/metal3-io/baremetal-operator
Source: baremetal-operator-%{version}.tar
Source1: vendor.tar.gz
BuildRequires: golang(API) = 1.23
# Patches related to multi-architecture support, upstream PRs #2506 #2559 #2537
Patch0: 0001-Enable-exhaustive-linter.patch
Patch1: 0002-Stop-requiring-DEPLOY_KERNEL-RAMDISK.patch
Patch2: 0003-Remove-DEPLOY_KERNEL_URL-from-deployment-scripts-for.patch
Patch3: 0004-Refactor-setting-various-Ironic-properties.patch
Patch4: 0005-Provide-inline-docs-for-node-configuration-calls.patch
BuildRequires: golang(API) = 1.24
ExcludeArch: s390
ExcludeArch: %{ix86}

View File

@@ -1,9 +1,9 @@
#!BuildTag: %%CHART_PREFIX%%cdi:%%CHART_MAJOR%%.0.0_up0.5.0
#!BuildTag: %%CHART_PREFIX%%cdi:%%CHART_MAJOR%%.0.0_up0.5.0-%RELEASE%
#!BuildTag: %%CHART_PREFIX%%cdi:%%CHART_MAJOR%%.0.1_up0.6.0
#!BuildTag: %%CHART_PREFIX%%cdi:%%CHART_MAJOR%%.0.1_up0.6.0-%RELEASE%
apiVersion: v2
appVersion: 1.61.0
appVersion: 1.62.0
description: A Helm chart for Containerized Data Importer (CDI)
icon: https://raw.githubusercontent.com/cncf/artwork/main/projects/kubevirt/icon/color/kubevirt-icon-color.svg
name: cdi
type: application
version: "%%CHART_MAJOR%%.0.0+up0.5.0"
version: "%%CHART_MAJOR%%.0.1+up0.6.0"

View File

@@ -109,9 +109,9 @@ spec:
description: CDIConfig at CDI level
properties:
dataVolumeTTLSeconds:
description: DataVolumeTTLSeconds is the time in seconds after
DataVolume completion it can be garbage collected. Disabled
by default.
description: |-
DataVolumeTTLSeconds is the time in seconds after DataVolume completion it can be garbage collected. Disabled by default.
Deprecated: Removed in v1.62.
format: int32
type: integer
featureGates:
@@ -2641,9 +2641,9 @@ spec:
description: CDIConfig at CDI level
properties:
dataVolumeTTLSeconds:
description: DataVolumeTTLSeconds is the time in seconds after
DataVolume completion it can be garbage collected. Disabled
by default.
description: |-
DataVolumeTTLSeconds is the time in seconds after DataVolume completion it can be garbage collected. Disabled by default.
Deprecated: Removed in v1.62.
format: int32
type: integer
featureGates:

View File

@@ -599,6 +599,8 @@ spec:
strategy: {}
template:
metadata:
annotations:
openshift.io/required-scc: restricted-v2
labels:
cdi.kubevirt.io: cdi-operator
name: cdi-operator

View File

@@ -18,4 +18,8 @@ spec:
{{- with .Values.cdi.workload }}
workload:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
{{- with .Values.cdi.customizeComponents }}
customizeComponents:
{{- toYaml . | nindent 4 }}
{{- end }}

View File

@@ -1,12 +1,12 @@
deployment:
version: 1.61.0-150600.3.12.1
operatorImage: registry.suse.com/suse/sles/15.6/cdi-operator
controllerImage: registry.suse.com/suse/sles/15.6/cdi-controller
importerImage: registry.suse.com/suse/sles/15.6/cdi-importer
clonerImage: registry.suse.com/suse/sles/15.6/cdi-cloner
apiserverImage: registry.suse.com/suse/sles/15.6/cdi-apiserver
uploadserverImage: registry.suse.com/suse/sles/15.6/cdi-uploadserver
uploadproxyImage: registry.suse.com/suse/sles/15.6/cdi-uploadproxy
version: 1.62.0-150700.9.3.1
operatorImage: registry.suse.com/suse/sles/15.7/cdi-operator
controllerImage: registry.suse.com/suse/sles/15.7/cdi-controller
importerImage: registry.suse.com/suse/sles/15.7/cdi-importer
clonerImage: registry.suse.com/suse/sles/15.7/cdi-cloner
apiserverImage: registry.suse.com/suse/sles/15.7/cdi-apiserver
uploadserverImage: registry.suse.com/suse/sles/15.7/cdi-uploadserver
uploadproxyImage: registry.suse.com/suse/sles/15.7/cdi-uploadproxy
pullPolicy: IfNotPresent
affinity:
podAffinity:
@@ -30,6 +30,7 @@ cdi:
featureGates:
- HonorWaitForFirstConsumer
imagePullPolicy: "IfNotPresent"
customizeComponents: {}
infra:
nodeSelector:
kubernetes.io/os: linux
@@ -41,7 +42,7 @@ cdi:
nodeSelector:
kubernetes.io/os: linux
hookImage: registry.rancher.com/rancher/kubectl:v1.30.10
hookImage: registry.rancher.com/rancher/kubectl:v1.33.1
hookRestartPolicy: OnFailure
hookSecurityContext:
seccompProfile:

View File

@@ -1,5 +1,5 @@
#!BuildTag: %%IMG_PREFIX%%edge-image-builder:1.2.1
#!BuildTag: %%IMG_PREFIX%%edge-image-builder:1.2.1-%RELEASE%
#!BuildTag: %%IMG_PREFIX%%edge-image-builder:latest
#!BuildTag: %%IMG_PREFIX%%edge-image-builder:latest-%RELEASE%
ARG SLE_VERSION
FROM registry.suse.com/bci/bci-base:$SLE_VERSION
MAINTAINER SUSE LLC (https://www.suse.com/)
@@ -14,11 +14,11 @@ RUN zypper --non-interactive install --no-recommends edge-image-builder qemu-x86
LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)"
LABEL org.opencontainers.image.title="SLE edge-image-builder Container Image"
LABEL org.opencontainers.image.description="edge-image-builder based on the SLE Base Container Image."
LABEL org.opencontainers.image.version="1.2.1"
LABEL org.opencontainers.image.version="latest"
LABEL org.opencontainers.image.url="https://www.suse.com/products/server/"
LABEL org.opencontainers.image.created="%BUILDTIME%"
LABEL org.opencontainers.image.vendor="SUSE LLC"
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%edge-image-builder:1.2.1-%RELEASE%"
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%edge-image-builder:latest-%RELEASE%"
LABEL org.openbuildservice.disturl="%DISTURL%"
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
LABEL com.suse.eula="SUSE Combined EULA February 2024"

View File

@@ -10,6 +10,8 @@ kubernetes:
k3s:
selinuxPackage: k3s-selinux-1.6-1.slemicro.noarch
selinuxRepository: https://rpm.rancher.io/k3s/stable/common/slemicro/noarch
releaseURL: https://github.com/k3s-io/k3s/releases/download/
rke2:
selinuxPackage: rke2-selinux
selinuxRepository: https://rpm.rancher.io/rke2/stable/common/slemicro/noarch
releaseURL: https://github.com/rancher/rke2/releases/download/

View File

@@ -3,11 +3,11 @@
<param name="url">https://github.com/suse-edge/edge-image-builder.git</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
<param name="revision">v1.2.1</param>
<param name="revision">1bfee6bb5bd0dc1ed18e2d09820750f9987c96c9</param>
<!-- Uncomment and set this For Pre-Release Version -->
<!-- <param name="version">1.2.0~rc1</param> -->
<!-- Uncomment and this for regular version -->
<param name="versionformat">@PARENT_TAG@</param>
<param name="versionformat">%h</param>
<param name="versionrewrite-pattern">v(\d+).(\d+).(\d+)</param>
<param name="versionrewrite-replacement">\1.\2.\3</param>
<param name="changesgenerate">enable</param>

View File

@@ -17,7 +17,7 @@
Name: edge-image-builder
Version: 1.2.1
Version: latest
Release: 0
Summary: Edge Image Builder
License: Apache-2.0

View File

@@ -1,6 +1,6 @@
# SPDX-License-Identifier: Apache-2.0
#!BuildTag: %%IMG_PREFIX%%ironic:29.0.4.0
#!BuildTag: %%IMG_PREFIX%%ironic:29.0.4.0-%RELEASE%
#!BuildTag: %%IMG_PREFIX%%ironic:29.0.4.2
#!BuildTag: %%IMG_PREFIX%%ironic:29.0.4.2-%RELEASE%
ARG SLE_VERSION
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
@@ -41,8 +41,8 @@ LABEL org.opencontainers.image.description="Openstack Ironic based on the SLE Ba
LABEL org.opencontainers.image.url="https://www.suse.com/products/server/"
LABEL org.opencontainers.image.created="%BUILDTIME%"
LABEL org.opencontainers.image.vendor="SUSE LLC"
LABEL org.opencontainers.image.version="29.0.4.0"
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic:29.0.4.0-%RELEASE%"
LABEL org.opencontainers.image.version="29.0.4.2"
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic:29.0.4.2-%RELEASE%"
LABEL org.openbuildservice.disturl="%DISTURL%"
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
LABEL com.suse.eula="SUSE Combined EULA February 2024"
@@ -88,8 +88,7 @@ RUN if [ "$(uname -m)" = "aarch64" ]; then\
cp /usr/share/ipxe/snp-arm64.efi /tftpboot/ipxe.efi; cp /usr/share/ipxe/snp-arm64.efi /tftpboot/snp-arm64.efi; cp /usr/share/ipxe/snp-arm64.efi /tftpboot/snp.efi ;\
fi
COPY --from=base /tmp/esp-x86_64.img /tmp/uefi_esp-x86_64.img
COPY --from=base /tmp/esp-aarch64.img /tmp/uefi_esp-arm64.img
COPY --from=base /tmp/uefi_esp_*.img /templates/
COPY ironic-config/ironic.conf.j2 ironic-config/network-data-schema-empty.json /etc/ironic/

View File

@@ -45,10 +45,10 @@ chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /run
# ironic and httpd related changes
mkdir -p /etc/httpd/conf.d
chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /etc/ironic /etc/httpd/conf /etc/httpd/conf.d
chmod 2775 /etc/ironic /etc/httpd/conf /etc/httpd/conf.d
chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /etc/ironic /etc/httpd/conf /etc/httpd/conf.d /etc/httpd/conf.modules.d/
chmod 2775 /etc/ironic /etc/httpd/conf /etc/httpd/conf.d /etc/httpd/conf.modules.d/
#chmod 664 /etc/ironic/* /etc/httpd/conf/* /etc/httpd/conf.d/*
chmod 664 /etc/ironic/* /etc/httpd/conf/*
chmod 664 /etc/ironic/* /etc/httpd/conf/* /etc/httpd/conf.modules.d/*
chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /var/lib/ironic
chmod 2775 /var/lib/ironic

View File

@@ -11,13 +11,15 @@ Listen [::]:{{ env.VMEDIA_TLS_PORT }}
SSLCertificateFile {{ env.IRONIC_VMEDIA_CERT_FILE }}
SSLCertificateKeyFile {{ env.IRONIC_VMEDIA_KEY_FILE }}
<Directory ~ "/shared/html">
Order deny,allow
deny from all
<Directory "/shared/html/">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<Directory ~ "/shared/html/(redfish|ilo)/">
Order allow,deny
allow from all
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

View File

@@ -17,4 +17,4 @@ LoadModule authn_core_module /usr/lib64/apache2/mod_authn_core.so
LoadModule auth_basic_module /usr/lib64/apache2/mod_auth_basic.so
LoadModule authn_file_module /usr/lib64/apache2/mod_authn_file.so
LoadModule authz_user_module /usr/lib64/apache2/mod_authz_user.so
LoadModule access_compat_module /usr/lib64/apache2/mod_access_compat.so
#LoadModule access_compat_module /usr/lib64/apache2/mod_access_compat.so

View File

@@ -91,17 +91,23 @@ send_sensor_data = {{ env.SEND_SENSOR_DATA }}
# Power state is checked every 60 seconds and BMC activity should
# be avoided more often than once every sixty seconds.
send_sensor_data_interval = 160
bootloader = {{ env.IRONIC_HTTP_URL }}/uefi_esp-{{ env.DEPLOY_ARCHITECTURE }}.img
bootloader_by_arch = {{ env.BOOTLOADER_BY_ARCH }}
verify_step_priority_override = management.clear_job_queue:90
# We don't use this feature, and it creates an additional load on the database
node_history = False
# Provide for a timeout longer than 60 seconds for certain vendor's hardware
power_state_change_timeout = 120
{% if env.IRONIC_DEFAULT_KERNEL is defined %}
deploy_kernel = file://{{ env.IRONIC_DEFAULT_KERNEL }}
{% if env.DEPLOY_KERNEL_URL is defined %}
deploy_kernel = {{ env.DEPLOY_KERNEL_URL }}
{% endif %}
{% if env.IRONIC_DEFAULT_RAMDISK is defined %}
deploy_ramdisk = file://{{ env.IRONIC_DEFAULT_RAMDISK }}
{% if env.DEPLOY_KERNEL_BY_ARCH is defined %}
deploy_kernel_by_arch = {{ env.DEPLOY_KERNEL_BY_ARCH }}
{% endif %}
{% if env.DEPLOY_RAMDISK_URL is defined %}
deploy_ramdisk = {{ env.DEPLOY_RAMDISK_URL }}
{% endif %}
{% if env.DEPLOY_RAMDISK_BY_ARCH is defined %}
deploy_ramdisk_by_arch = {{ env.DEPLOY_RAMDISK_BY_ARCH }}
{% endif %}
{% if env.DISABLE_DEEP_IMAGE_INSPECTION | lower == "true" %}
disable_deep_image_inspection = True
@@ -123,15 +129,15 @@ default_boot_option = local
erase_devices_metadata_priority = 10
erase_devices_priority = 0
http_root = /shared/html/
http_url = {{ env.IRONIC_HTTP_URL }}
http_url = {% if env.VMEDIA_TLS_PORT %}{{ env.IRONIC_HTTPS_VMEDIA_URL }}{% else %}{{ env.IRONIC_HTTP_URL }}{% endif %}
fast_track = {{ env.IRONIC_FAST_TRACK }}
{% if env.IRONIC_BOOT_ISO_SOURCE %}
ramdisk_image_download_source = {{ env.IRONIC_BOOT_ISO_SOURCE }}
{% endif %}
{% if env.IRONIC_EXTERNAL_HTTP_URL %}
external_http_url = {{ env.IRONIC_EXTERNAL_HTTP_URL }}
{% elif env.IRONIC_VMEDIA_TLS_SETUP == "true" %}
external_http_url = https://{{ env.IRONIC_URL_HOST }}:{{ env.VMEDIA_TLS_PORT }}
{% elif env.VMEDIA_TLS_PORT %}
external_http_url = {{ env.IRONIC_HTTPS_VMEDIA_URL }}
{% endif %}
{% if env.IRONIC_EXTERNAL_CALLBACK_URL %}
external_callback_url = {{ env.IRONIC_EXTERNAL_CALLBACK_URL }}

View File

@@ -9,7 +9,7 @@ declare -A efi_arch=(
for arch in "${!efi_arch[@]}"; do
DEST=/tmp/esp-${arch}.img
DEST=/tmp/uefi_esp_${arch}.img
dd bs=1024 count=6400 if=/dev/zero of=$DEST
mkfs.msdos -F 12 -n 'ESP_IMAGE' $DEST

View File

@@ -3,6 +3,7 @@
set -euxo pipefail
IRONIC_EXTERNAL_IP="${IRONIC_EXTERNAL_IP:-}"
export VMEDIA_TLS_PORT="${VMEDIA_TLS_PORT:-}"
# Define the VLAN interfaces to be included in introspection report, e.g.
# all - all VLANs on all interfaces using LLDP information
@@ -53,12 +54,16 @@ wait_for_interface_or_ip
if [[ "$(echo "$LISTEN_ALL_INTERFACES" | tr '[:upper:]' '[:lower:]')" == "true" ]]; then
export IRONIC_HOST_IP="::"
elif [[ -n env.ENABLE_IPV6 ]]; then
elif [[ -n "${ENABLE_IPV6}" ]]; then
export IRONIC_HOST_IP="$IRONIC_IPV6"
else
export IRONIC_HOST_IP="$IRONIC_IP"
fi
if [[ "${VMEDIA_TLS_PORT}" ]]; then
export IRONIC_HTTPS_VMEDIA_URL="https://${IRONIC_URL_HOST}:${VMEDIA_TLS_PORT}"
fi
# Hostname to use for the current conductor instance.
export IRONIC_CONDUCTOR_HOST=${IRONIC_CONDUCTOR_HOST:-${IRONIC_URL_HOST}}
@@ -71,10 +76,41 @@ if [[ -n "$IRONIC_EXTERNAL_IP" ]]; then
fi
fi
IMAGE_CACHE_PREFIX="/shared/html/images/ironic-python-agent-${DEPLOY_ARCHITECTURE}"
if [[ -f "${IMAGE_CACHE_PREFIX}.kernel" ]] && [[ -f "${IMAGE_CACHE_PREFIX}.initramfs" ]]; then
export IRONIC_DEFAULT_KERNEL="${IMAGE_CACHE_PREFIX}.kernel"
export IRONIC_DEFAULT_RAMDISK="${IMAGE_CACHE_PREFIX}.initramfs"
IMAGE_CACHE_PREFIX="/shared/html/images/ironic-python-agent"
if [[ -z "${DEPLOY_KERNEL_URL:-}" ]] && [[ -z "${DEPLOY_RAMDISK_URL:-}" ]] && \
[[ -f "${IMAGE_CACHE_PREFIX}.kernel" ]] && [[ -f "${IMAGE_CACHE_PREFIX}.initramfs" ]]; then
export DEPLOY_KERNEL_URL="file://${IMAGE_CACHE_PREFIX}.kernel"
export DEPLOY_RAMDISK_URL="file://${IMAGE_CACHE_PREFIX}.initramfs"
fi
declare -A detected_arch
for var_arch in "${!DEPLOY_KERNEL_URL_@}"; do
IPA_ARCH="${var_arch#DEPLOY_KERNEL_URL}"
detected_arch["${IPA_ARCH,,}"]=1
done
for file_arch in "${IMAGE_CACHE_PREFIX}"_*.kernel; do
if [[ -f "${file_arch}" ]]; then
IPA_ARCH="$(basename "${file_arch#"${IMAGE_CACHE_PREFIX}"_}" .kernel)"
detected_arch["${IPA_ARCH}"]=1
fi
done
DEPLOY_KERNEL_BY_ARCH=""
DEPLOY_RAMDISK_BY_ARCH=""
for IPA_ARCH in "${!detected_arch[@]}"; do
kernel_var="DEPLOY_KERNEL_URL_${IPA_ARCH^^}"
ramdisk_var="DEPLOY_RAMDISK_URL_${IPA_ARCH^^}"
if [[ -z "${!kernel_var:-}" ]] && [[ -z "${!ramdisk_var:-}" ]] && \
[[ -f "${IMAGE_CACHE_PREFIX}_${IPA_ARCH}.kernel" ]] && [[ -f "${IMAGE_CACHE_PREFIX}_${IPA_ARCH}.initramfs" ]]; then
export "${kernel_var}"="file://${IMAGE_CACHE_PREFIX}_${IPA_ARCH}.kernel"
export "${ramdisk_var}"="file://${IMAGE_CACHE_PREFIX}_${IPA_ARCH}.initramfs"
fi
DEPLOY_KERNEL_BY_ARCH+="${!kernel_var:+${IPA_ARCH}:${!kernel_var},}"
DEPLOY_RAMDISK_BY_ARCH+="${!ramdisk_var:+${IPA_ARCH}:${!ramdisk_var},}"
done
if [[ -n "${DEPLOY_KERNEL_BY_ARCH}" ]] && [[ -n "${DEPLOY_RAMDISK_BY_ARCH}" ]]; then
export DEPLOY_KERNEL_BY_ARCH="${DEPLOY_KERNEL_BY_ARCH%?}"
export DEPLOY_RAMDISK_BY_ARCH="${DEPLOY_RAMDISK_BY_ARCH%?}"
fi
if [[ -f "${IRONIC_CONF_DIR}/ironic.conf" ]]; then
@@ -82,6 +118,13 @@ if [[ -f "${IRONIC_CONF_DIR}/ironic.conf" ]]; then
cp "${IRONIC_CONF_DIR}/ironic.conf" "${IRONIC_CONF_DIR}/ironic.conf.orig"
fi
BOOTLOADER_BY_ARCH=""
for bootloader in /templates/uefi_esp_*.img; do
BOOTLOADER_ARCH="$(basename "${bootloader#/templates/uefi_esp_}" .img)"
BOOTLOADER_BY_ARCH+="${BOOTLOADER_ARCH}:file://${bootloader},"
done
export BOOTLOADER_BY_ARCH="${BOOTLOADER_BY_ARCH%?}"
# oslo.config also supports Config Opts From Environment, log them to stdout
echo 'Options set from Environment variables'
env | grep "^OS_" || true

View File

@@ -5,7 +5,7 @@ set -euxo pipefail
# Export IRONIC_IP to avoid needing to lean on IRONIC_URL_HOST for consumption in
# e.g. dnsmasq configuration
export IRONIC_IP="${IRONIC_IP:-}"
export IRONIC_IPV6="${IRONIC_IPV6:-}"
IRONIC_IPV6="${IRONIC_IPV6:-}"
PROVISIONING_INTERFACE="${PROVISIONING_INTERFACE:-}"
PROVISIONING_IP="${PROVISIONING_IP:-}"
PROVISIONING_MACS="${PROVISIONING_MACS:-}"
@@ -55,7 +55,7 @@ get_ip_of_hostname()
local HOSTNAME=$1
echo "$(nslookup -type=${QUERY} $HOSTNAME | tail -n2 | grep -w "Address:" | cut -d " " -f2)"
echo $(nslookup -type=${QUERY} "${HOSTNAME}" | tail -n2 | grep -w "Address:" | cut -d " " -f2)
}
get_interface_of_ip()
@@ -85,7 +85,7 @@ get_interface_of_ip()
# For IPv6 addresses, this will give the short-form address
IP_ADDR="$(ipcalc "${IP_ADDR}" | grep "^Address:" | awk '{print $2}')"
echo "$(ip $IP_VERS -br addr show scope global | grep -i " ${IP_ADDR}/" | cut -f 1 -d ' ' | cut -f 1 -d '@')"
echo $(ip ${IP_VERS} -br addr show scope global | grep -i " ${IP_ADDR}/" | cut -f 1 -d ' ' | cut -f 1 -d '@')
}
get_ip_of_interface()
@@ -111,7 +111,7 @@ get_ip_of_interface()
local IFACE=$1
echo "$(ip $IP_VERS -br addr show scope global up dev $IFACE | awk '{print $3}' | sed -e 's%/.*%%' | head -n 1)"
echo $(ip ${IP_VERS} -br addr show scope global up dev ${IFACE} | awk '{print $3}' | sed -e 's%/.*%%' | head -n 1)
}
get_provisioning_interface()
@@ -150,7 +150,7 @@ wait_for_interface_or_ip()
until [[ -n "$IFACE_OF_IP" ]]; do
echo "Waiting for ${PROVISIONING_IP} to be configured on an interface..."
IFACE_OF_IP="$(get_interface_of_ip $PROVISIONING_IP)"
IFACE_OF_IP="$(get_interface_of_ip "${PROVISIONING_IP}")"
sleep 1
done
@@ -160,25 +160,33 @@ wait_for_interface_or_ip()
# If the IP contains a colon, then it's an IPv6 address
if [[ "$PROVISIONING_IP" =~ .*:.* ]]; then
export IRONIC_IPV6="$PROVISIONING_IP"
export IRONIC_IP=""
else
export IRONIC_IP="$PROVISIONING_IP"
fi
elif [[ -n "${IRONIC_IP}" ]]; then
if [[ "$IRONIC_IP" =~ .*:.* ]]; then
export IRONIC_IPV6="$IRONIC_IP"
export IRONIC_IP=""
fi
elif [[ -n "${PROVISIONING_INTERFACE}" ]]; then
until [[ -n "$IRONIC_IPV6" ]] || [[ -n "$IRONIC_IP" ]]; do
echo "Waiting for ${PROVISIONING_INTERFACE} interface to be configured..."
export IRONIC_IPV6="$(get_ip_of_interface $PROVISIONING_INTERFACE 6)"
IRONIC_IPV6="$(get_ip_of_interface "${PROVISIONING_INTERFACE}" 6)"
sleep 1
export IRONIC_IP="$(get_ip_of_interface $PROVISIONING_INTERFACE 4)"
IRONIC_IP="$(get_ip_of_interface "${PROVISIONING_INTERFACE}" 4)"
sleep 1
done
if [[ -n "$IRONIC_IPV6" ]]; then
echo "Found $IRONIC_IPV6 on interface \"${PROVISIONING_INTERFACE}\"!"
export IRONIC_IPV6
fi
if [[ -n "$IRONIC_IP" ]]; then
echo "Found $IRONIC_IP on interface \"${PROVISIONING_INTERFACE}\"!"
export IRONIC_IP
fi
elif [[ -n "$IRONIC_URL_HOSTNAME" ]]; then
local IPV6_IFACE=""
@@ -189,21 +197,21 @@ wait_for_interface_or_ip()
local IPV6_RECORD=""
local IPV4_RECORD=""
IPV6_RECORD="$(get_ip_of_hostname $IRONIC_URL_HOSTNAME 6)"
IPV4_RECORD="$(get_ip_of_hostname $IRONIC_URL_HOSTNAME 4)"
IPV6_RECORD="$(get_ip_of_hostname "${IRONIC_URL_HOSTNAME}" 6)"
IPV4_RECORD="$(get_ip_of_hostname "${IRONIC_URL_HOSTNAME}" 4)"
# We couldn't get any IP
if [[ -z "$IPV4_RECORD" ]] && [[ -z "$IPV6_RECORD" ]]; then
echo "${FUNCNAME}: no valid IP found for hostname $IRONIC_URL_HOSTNAME" >&2
echo "${FUNCNAME}: no valid IP found for hostname ${IRONIC_URL_HOSTNAME}" >&2
return 1
fi
echo "Waiting for ${IPV6_RECORD} to be configured on an interface"
IPV6_IFACE="$(get_interface_of_ip $IPV6_RECORD 6)"
IPV6_IFACE="$(get_interface_of_ip "${IPV6_RECORD}" 6)"
sleep 1
echo "Waiting for ${IPV4_RECORD} to be configured on an interface"
IPV4_IFACE="$(get_interface_of_ip $IPV4_RECORD 4)"
IPV4_IFACE="$(get_interface_of_ip "${IPV4_RECORD}" 4)"
sleep 1
done
@@ -236,7 +244,7 @@ wait_for_interface_or_ip()
fi
if [[ -n "$IRONIC_IPV6" ]]; then
export ENABLE_IPV6=yes
export IRONIC_URL_HOST="[$IRONIC_IPV6]" # The HTTP host needs surrounding with brackets
export IRONIC_URL_HOST="[${IRONIC_IPV6}]" # The HTTP host needs surrounding with brackets
fi
# Once determined if we have IPv4 and/or IPv6, override the hostname if provided

View File

@@ -37,7 +37,6 @@ export INSPECTOR_EXTRA_ARGS
# Copy files to shared mount
render_j2_config /tmp/inspector.ipxe.j2 /shared/html/inspector.ipxe
cp /tmp/uefi_esp*.img /shared/html/
# cp -r /etc/httpd/* "${HTTPD_DIR}"
if [[ -f "${HTTPD_CONF_DIR}/httpd.conf" ]]; then
mv "${HTTPD_CONF_DIR}/httpd.conf" "${HTTPD_CONF_DIR}/httpd.conf.example"

View File

@@ -1,6 +1,6 @@
# SPDX-License-Identifier: Apache-2.0
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.8
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.8-%RELEASE%
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.9
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.9-%RELEASE%
ARG SLE_VERSION
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
@@ -18,11 +18,11 @@ FROM micro AS final
LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)"
LABEL org.opencontainers.image.title="SLE Based Ironic IPA Downloader Container Image"
LABEL org.opencontainers.image.description="ironic-ipa-downloader based on the SLE Base Container Image."
LABEL org.opencontainers.image.version="3.0.8"
LABEL org.opencontainers.image.version="3.0.9"
LABEL org.opencontainers.image.url="https://www.suse.com/solutions/edge-computing/"
LABEL org.opencontainers.image.created="%BUILDTIME%"
LABEL org.opencontainers.image.vendor="SUSE LLC"
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic-ipa-downloader:3.0.8-%RELEASE%"
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic-ipa-downloader:3.0.9-%RELEASE%"
LABEL org.openbuildservice.disturl="%DISTURL%"
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
LABEL com.suse.eula="SUSE Combined EULA February 2024"

View File

@@ -29,13 +29,12 @@ if [ -z "${IPA_BASEURI}" ]; then
# SLES BASED IPA - ironic-ipa-ramdisk-x86_64 and ironic-ipa-ramdisk-aarch64 packages
mkdir -p /shared/html/images
if [ -f ${IMAGES_BASE_PATH}/initrd-x86_64.zst ]; then
cp ${IMAGES_BASE_PATH}/initrd-x86_64.zst /shared/html/images/ironic-python-agent-x86_64.initramfs
cp ${IMAGES_BASE_PATH}/openstack-ironic-image.x86_64*.kernel /shared/html/images/ironic-python-agent-x86_64.kernel
cp ${IMAGES_BASE_PATH}/initrd-x86_64.zst /shared/html/images/ironic-python-agent_x86_64.initramfs
cp ${IMAGES_BASE_PATH}/openstack-ironic-image.x86_64*.kernel /shared/html/images/ironic-python-agent_x86_64.kernel
fi
# Use arm64 as destination for iPXE compatibility
if [ -f ${IMAGES_BASE_PATH}/initrd-aarch64.zst ]; then
cp ${IMAGES_BASE_PATH}/initrd-aarch64.zst /shared/html/images/ironic-python-agent-arm64.initramfs
cp ${IMAGES_BASE_PATH}/openstack-ironic-image.aarch64*.kernel /shared/html/images/ironic-python-agent-arm64.kernel
cp ${IMAGES_BASE_PATH}/initrd-aarch64.zst /shared/html/images/ironic-python-agent_aarch64.initramfs
cp ${IMAGES_BASE_PATH}/openstack-ironic-image.aarch64*.kernel /shared/html/images/ironic-python-agent_aarch64.kernel
fi
cp /tmp/images.sha256 /shared/images.sha256
@@ -87,8 +86,8 @@ else
chmod 755 "$TMPDIR"
mv "$TMPDIR" "$FILENAME-$ETAG"
ln -sf "$FILENAME-$ETAG/$FFILENAME.headers" "$FFILENAME.headers"
ln -sf "$FILENAME-$ETAG/$FILENAME.initramfs" "$FILENAME-${ARCH,,}.initramfs"
ln -sf "$FILENAME-$ETAG/$FILENAME.kernel" "$FILENAME-${ARCH,,}.kernel"
ln -sf "$FILENAME-$ETAG/$FILENAME.initramfs" "${FILENAME}_${ARCH,,}.initramfs"
ln -sf "$FILENAME-$ETAG/$FILENAME.kernel" "${FILENAME}_${ARCH,,}.kernel"
IMAGE_CHANGED=1
else
@@ -100,7 +99,7 @@ if [ "${CERTS_CHANGED:-0}" = "1" ] || [ "${IMAGE_CHANGED:-0}" = "1" ]; then
mkdir -p /tmp/ca/tmp-initrd && cd /tmp/ca/tmp-initrd
mkdir -p etc/ironic-python-agent.d/ca-certs
cp /tmp/ironic-certificates/* etc/ironic-python-agent.d/ca-certs/
for initramfs in /shared/html/images/ironic-python-agent-*.initramfs; do
for initramfs in /shared/html/images/ironic-python-agent_*.initramfs; do
find . | cpio -o -H newc --reproducible | zstd -c >> "${initramfs}"
done
cp /tmp/certificates.sha256 /shared/certificates.sha256

View File

@@ -1,6 +1,6 @@
# SPDX-License-Identifier: Apache-2.0
#!BuildTag: %%IMG_PREFIX%%kubectl:1.32.4
#!BuildTag: %%IMG_PREFIX%%kubectl:1.32.4-%RELEASE%
#!BuildTag: %%IMG_PREFIX%%kubectl:1.33.4
#!BuildTag: %%IMG_PREFIX%%kubectl:1.33.4-%RELEASE%
ARG SLE_VERSION
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
@@ -15,11 +15,11 @@ FROM micro AS final
LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)"
LABEL org.opencontainers.image.title="SLE kubectl image"
LABEL org.opencontainers.image.description="kubectl on the SLE Base Container Image."
LABEL org.opencontainers.image.version="1.32.4"
LABEL org.opencontainers.image.version="1.33.4"
LABEL org.opencontainers.image.url="https://www.suse.com/solutions/edge-computing/"
LABEL org.opencontainers.image.created="%BUILDTIME%"
LABEL org.opencontainers.image.vendor="SUSE LLC"
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%kubectl:1.32.4-%RELEASE%"
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%kubectl:1.33.4-%RELEASE%"
LABEL org.openbuildservice.disturl="%DISTURL%"
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
LABEL com.suse.eula="SUSE Combined EULA February 2024"

View File

@@ -1,7 +1,7 @@
%global debug_package %{nil}
Name: kubectl
Version: 1.32.4
Version: 1.33.4
Release: 0
Summary: Command-line utility for interacting with a Kubernetes cluster

BIN
kubectl/kubectl_1.32.4.orig.tar.gz (Stored with Git LFS)

Binary file not shown.

BIN
kubectl/kubectl_1.33.4.orig.tar.gz (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -1,9 +1,9 @@
#!BuildTag: %%CHART_PREFIX%%kubevirt:%%CHART_MAJOR%%.0.0_up0.5.0-%RELEASE%
#!BuildTag: %%CHART_PREFIX%%kubevirt:%%CHART_MAJOR%%.0.0_up0.5.0
#!BuildTag: %%CHART_PREFIX%%kubevirt:%%CHART_MAJOR%%.0.1_up0.6.0-%RELEASE%
#!BuildTag: %%CHART_PREFIX%%kubevirt:%%CHART_MAJOR%%.0.1_up0.6.0
apiVersion: v2
appVersion: 1.4.0
appVersion: 1.5.2
description: A Helm chart for KubeVirt
icon: https://raw.githubusercontent.com/cncf/artwork/main/projects/kubevirt/icon/color/kubevirt-icon-color.svg
name: kubevirt
type: application
version: "%%CHART_MAJOR%%.0.0+up0.5.0"
version: "%%CHART_MAJOR%%.0.1+up0.6.0"

View File

@@ -593,6 +593,13 @@ spec:
If set to true, migrations will still start in pre-copy, but switch to post-copy when
CompletionTimeoutPerGiB triggers. Defaults to false
type: boolean
allowWorkloadDisruption:
description: |-
AllowWorkloadDisruption indicates that the migration shouldn't be
canceled after acceptableCompletionTime is exceeded. Instead, if
permitted, migration will be switched to post-copy or the VMI will be
paused to allow the migration to complete
type: boolean
bandwidthPerMigration:
anyOf:
- type: integer
@@ -605,8 +612,8 @@ spec:
completionTimeoutPerGiB:
description: |-
CompletionTimeoutPerGiB is the maximum number of seconds per GiB a migration is allowed to take.
If a live-migration takes longer to migrate than this value multiplied by the size of the VMI,
the migration will be cancelled, unless AllowPostCopy is true. Defaults to 150
If the timeout is reached, the migration will be either paused, switched
to post-copy or cancelled depending on other settings. Defaults to 150
format: int64
type: integer
disableTLS:
@@ -964,17 +971,17 @@ spec:
type: object
type: object
vmRolloutStrategy:
description: VMRolloutStrategy defines how changes to a VM object
propagate to its VMI
description: |-
VMRolloutStrategy defines how live-updatable fields, like CPU sockets, memory,
tolerations, and affinity, are propagated from a VM to its VMI.
enum:
- Stage
- LiveUpdate
nullable: true
type: string
vmStateStorageClass:
description: |-
VMStateStorageClass is the name of the storage class to use for the PVCs created to preserve VM state, like TPM.
The storage class must support RWX in filesystem mode.
description: VMStateStorageClass is the name of the storage class
to use for the PVCs created to preserve VM state, like TPM.
type: string
webhookConfiguration:
description: |-
@@ -3850,6 +3857,13 @@ spec:
If set to true, migrations will still start in pre-copy, but switch to post-copy when
CompletionTimeoutPerGiB triggers. Defaults to false
type: boolean
allowWorkloadDisruption:
description: |-
AllowWorkloadDisruption indicates that the migration shouldn't be
canceled after acceptableCompletionTime is exceeded. Instead, if
permitted, migration will be switched to post-copy or the VMI will be
paused to allow the migration to complete
type: boolean
bandwidthPerMigration:
anyOf:
- type: integer
@@ -3862,8 +3876,8 @@ spec:
completionTimeoutPerGiB:
description: |-
CompletionTimeoutPerGiB is the maximum number of seconds per GiB a migration is allowed to take.
If a live-migration takes longer to migrate than this value multiplied by the size of the VMI,
the migration will be cancelled, unless AllowPostCopy is true. Defaults to 150
If the timeout is reached, the migration will be either paused, switched
to post-copy or cancelled depending on other settings. Defaults to 150
format: int64
type: integer
disableTLS:
@@ -4221,17 +4235,17 @@ spec:
type: object
type: object
vmRolloutStrategy:
description: VMRolloutStrategy defines how changes to a VM object
propagate to its VMI
description: |-
VMRolloutStrategy defines how live-updatable fields, like CPU sockets, memory,
tolerations, and affinity, are propagated from a VM to its VMI.
enum:
- Stage
- LiveUpdate
nullable: true
type: string
vmStateStorageClass:
description: |-
VMStateStorageClass is the name of the storage class to use for the PVCs created to preserve VM state, like TPM.
The storage class must support RWX in filesystem mode.
description: VMStateStorageClass is the name of the storage class
to use for the PVCs created to preserve VM state, like TPM.
type: string
webhookConfiguration:
description: |-

View File

@@ -608,6 +608,7 @@ rules:
resources:
- virtualmachinesnapshots
- virtualmachinesnapshots/status
- virtualmachinesnapshots/finalizers
- virtualmachinesnapshotcontents
- virtualmachinesnapshotcontents/status
- virtualmachinesnapshotcontents/finalizers
@@ -660,15 +661,18 @@ rules:
- kubevirt.io
resources:
- virtualmachines/finalizers
- virtualmachineinstances/finalizers
verbs:
- update
- apiGroups:
- subresources.kubevirt.io
resources:
- virtualmachines/stop
- virtualmachineinstances/addvolume
- virtualmachineinstances/removevolume
- virtualmachineinstances/freeze
- virtualmachineinstances/unfreeze
- virtualmachineinstances/reset
- virtualmachineinstances/softreboot
- virtualmachineinstances/sev/setupsession
- virtualmachineinstances/sev/injectlaunchsecret
@@ -772,6 +776,14 @@ rules:
verbs:
- list
- watch
- apiGroups:
- batch
resources:
- jobs
verbs:
- create
- get
- delete
- apiGroups:
- kubevirt.io
resources:
@@ -883,6 +895,7 @@ rules:
- virtualmachineinstances/freeze
- virtualmachineinstances/unfreeze
- virtualmachineinstances/softreboot
- virtualmachineinstances/reset
- virtualmachineinstances/sev/setupsession
- virtualmachineinstances/sev/injectlaunchsecret
verbs:
@@ -902,7 +915,6 @@ rules:
- virtualmachines/restart
- virtualmachines/addvolume
- virtualmachines/removevolume
- virtualmachines/migrate
- virtualmachines/memorydump
verbs:
- update
@@ -919,7 +931,6 @@ rules:
- virtualmachineinstances
- virtualmachineinstancepresets
- virtualmachineinstancereplicasets
- virtualmachineinstancemigrations
verbs:
- get
- delete
@@ -929,6 +940,14 @@ rules:
- list
- watch
- deletecollection
- apiGroups:
- kubevirt.io
resources:
- virtualmachineinstancemigrations
verbs:
- get
- list
- watch
- apiGroups:
- snapshot.kubevirt.io
resources:
@@ -1032,6 +1051,7 @@ rules:
- virtualmachineinstances/freeze
- virtualmachineinstances/unfreeze
- virtualmachineinstances/softreboot
- virtualmachineinstances/reset
- virtualmachineinstances/sev/setupsession
- virtualmachineinstances/sev/injectlaunchsecret
verbs:
@@ -1051,7 +1071,6 @@ rules:
- virtualmachines/restart
- virtualmachines/addvolume
- virtualmachines/removevolume
- virtualmachines/migrate
- virtualmachines/memorydump
verbs:
- update
@@ -1068,7 +1087,6 @@ rules:
- virtualmachineinstances
- virtualmachineinstancepresets
- virtualmachineinstancereplicasets
- virtualmachineinstancemigrations
verbs:
- get
- delete
@@ -1077,6 +1095,14 @@ rules:
- patch
- list
- watch
- apiGroups:
- kubevirt.io
resources:
- virtualmachineinstancemigrations
verbs:
- get
- list
- watch
- apiGroups:
- snapshot.kubevirt.io
resources:
@@ -1255,6 +1281,25 @@ rules:
- get
- list
- watch
- apiGroups:
- subresources.kubevirt.io
resources:
- virtualmachines/migrate
verbs:
- update
- apiGroups:
- kubevirt.io
resources:
- virtualmachineinstancemigrations
verbs:
- get
- delete
- create
- update
- patch
- list
- watch
- deletecollection
- apiGroups:
- authentication.k8s.io
resources:
@@ -1300,6 +1345,8 @@ spec:
type: RollingUpdate
template:
metadata:
annotations:
openshift.io/required-scc: restricted-v2
labels:
kubevirt.io: virt-operator
name: virt-operator

View File

@@ -1,6 +1,6 @@
operator:
image: registry.suse.com/suse/sles/15.6/virt-operator
version: 1.4.0-150600.5.15.1
image: registry.suse.com/suse/sles/15.7/virt-operator
version: 1.5.2-150700.3.5.2
replicas: 2
pullPolicy: IfNotPresent
affinity:
@@ -40,7 +40,7 @@ kubevirt:
monitorAccount: ""
monitorNamespace: ""
hookImage: registry.rancher.com/rancher/kubectl:v1.30.10
hookImage: registry.rancher.com/rancher/kubectl:v1.33.1
hookRestartPolicy: OnFailure
hookSecurityContext:
seccompProfile:

View File

@@ -1,5 +1,5 @@
#!BuildTag: %%CHART_PREFIX%%kubevirt-dashboard-extension:%%CHART_MAJOR%%.0.2_up1.3.2
#!BuildTag: %%CHART_PREFIX%%kubevirt-dashboard-extension:%%CHART_MAJOR%%.0.2_up1.3.2-%RELEASE%
#!BuildTag: %%CHART_PREFIX%%kubevirt-dashboard-extension:%%CHART_MAJOR%%.0.3_up1.3.2
#!BuildTag: %%CHART_PREFIX%%kubevirt-dashboard-extension:%%CHART_MAJOR%%.0.3_up1.3.2-%RELEASE%
annotations:
catalog.cattle.io/certified: rancher
catalog.cattle.io/namespace: cattle-ui-plugin-system
@@ -12,10 +12,10 @@ annotations:
catalog.cattle.io/ui-extensions-version: '>= 3.0.2 < 4.0.0'
catalog.cattle.io/kube-version: '>= v1.26.0-0'
apiVersion: v2
appVersion: 303.0.2+up1.3.2
appVersion: 304.0.3+up1.3.2
description: 'SUSE Edge: KubeVirt extension for Rancher Dashboard'
name: kubevirt-dashboard-extension
type: application
version: "%%CHART_MAJOR%%.0.2+up1.3.2"
version: "%%CHART_MAJOR%%.0.3+up1.3.2"
icon: >-
https://raw.githubusercontent.com/cncf/artwork/master/projects/kubevirt/icon/color/kubevirt-icon-color.svg

View File

@@ -8,7 +8,7 @@ spec:
plugin:
name: {{ include "extension-server.fullname" . }}
version: {{ (semver (default .Chart.AppVersion .Values.plugin.versionOverride)).Original }}
endpoint: https://raw.githubusercontent.com/suse-edge/dashboard-extensions/gh-pages/extensions/kubevirt-dashboard-extension/303.0.2+up1.3.2
endpoint: https://raw.githubusercontent.com/suse-edge/dashboard-extensions/gh-pages/extensions/kubevirt-dashboard-extension/304.0.3+up1.3.2
noCache: {{ .Values.plugin.noCache }}
noAuth: {{ .Values.plugin.noAuth }}
metadata: {{ include "extension-server.pluginMetadata" . | indent 6 }}

View File

@@ -1,28 +1,28 @@
#!BuildTag: %%CHART_PREFIX%%metal3:%%CHART_MAJOR%%.0.10_up0.12.0
#!BuildTag: %%CHART_PREFIX%%metal3:%%CHART_MAJOR%%.0.10_up0.12.0-%RELEASE%
#!BuildTag: %%CHART_PREFIX%%metal3:%%CHART_MAJOR%%.0.15_up0.12.5
#!BuildTag: %%CHART_PREFIX%%metal3:%%CHART_MAJOR%%.0.15_up0.12.5-%RELEASE%
apiVersion: v2
appVersion: 0.12.0
appVersion: 0.12.5
dependencies:
- alias: metal3-baremetal-operator
name: baremetal-operator
repository: file://./charts/baremetal-operator
version: 0.9.2
version: 0.10.4
- alias: metal3-ironic
name: ironic
repository: file://./charts/ironic
version: 0.11.0
version: 0.11.3
- alias: metal3-mariadb
condition: global.enable_mariadb
name: mariadb
repository: file://./charts/mariadb
version: 0.6.0
version: 0.6.1
- alias: metal3-media
condition: global.enable_metal3_media_server
name: media
repository: file://./charts/media
version: 0.6.4
version: 0.6.6
description: A Helm chart that installs all of the dependencies needed for Metal3
icon: https://github.com/cncf/artwork/raw/master/projects/metal3/icon/color/metal3-icon-color.svg
name: metal3
type: application
version: "%%CHART_MAJOR%%.0.10+up0.12.0"
version: "%%CHART_MAJOR%%.0.15+up0.12.5"

View File

@@ -1,6 +1,6 @@
apiVersion: v2
appVersion: 0.9.1
appVersion: 0.10.2
description: A Helm chart for baremetal-operator, used by Metal3
name: baremetal-operator
type: application
version: 0.9.2
version: 0.10.4

View File

@@ -202,6 +202,11 @@ spec:
description: Description is a human-entered text used to help identify
the host.
type: string
disablePowerOff:
description: |-
When set to true, power off of the node will be disabled,
instead, a reboot will be used in place of power on/off
type: boolean
externallyProvisioned:
description: |-
ExternallyProvisioned means something else has provisioned the

View File

@@ -66,14 +66,14 @@ Create the name of the service account to use
Create the URL to use for connecting to the Ironic servers (e.g. API, cache)
*/}}
{{- define "baremetal-operator.ironicHttpHost" -}}
{{- $ironicIP := include "metal3.provisioningIP" . -}}
{{- $hostIP := include "metal3.hostIP" . -}}
{{- with .Values.global }}
{{- if .provisioningHostname }}
{{- .provisioningHostname }}
{{- else if regexMatch ".*:.*" $ironicIP}}
{{- print "[" $ironicIP "]" }}
{{- else if regexMatch ".*:.*" $hostIP}}
{{- print "[" $hostIP "]" }}
{{- else }}
{{- $ironicIP }}
{{- $hostIP }}
{{- end }}
{{- end }}
{{- end }}

View File

@@ -5,7 +5,6 @@
{{- $ironicApiHost := print $ironicHost ":6385" }}
{{- $ironicBootHost := print $ironicHost ":6180" }}
{{- $ironicCacheHost := print $ironicHost ":6180" }}
{{- $deployArch := .Values.global.deployArchitecture }}
apiVersion: v1
data:
@@ -21,9 +20,10 @@ data:
RESTART_CONTAINER_CERTIFICATE_UPDATED: "false"
{{- end }}
CACHEURL: "{{ $protocol }}://{{ $ironicCacheHost }}/images"
DEPLOY_KERNEL_URL: "{{ $protocol }}://{{ $ironicBootHost }}/images/ironic-python-agent-{{ $deployArch }}.kernel"
DEPLOY_RAMDISK_URL: "{{ $protocol }}://{{ $ironicBootHost }}/images/ironic-python-agent-{{ $deployArch }}.initramfs"
DEPLOY_ARCHITECTURE: "{{ $deployArch }}"
{{- if .Values.baremetaloperator.externalHttpIPv6 }}
{{- $port := ternary .Values.global.vmediaTLSPort .Values.baremetaloperator.httpPort $enableVMediaTLS }}
IRONIC_EXTERNAL_URL_V6: "{{ $protocol }}://[{{ .Values.baremetaloperator.externalHttpIPv6 }}]:{{ $port }}"
{{- end }}
kind: ConfigMap
metadata:
name: baremetal-operator-ironic

View File

@@ -28,7 +28,7 @@ images:
baremetalOperator:
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/baremetal-operator
pullPolicy: IfNotPresent
tag: "0.9.1.1"
tag: "0.10.2.1"
imagePullSecrets: []
nameOverride: "manger"
@@ -84,3 +84,8 @@ affinity: {}
baremetaloperator:
httpPort: "6180"
# IPv6 used for accessing the Ironic HTTP server for BMCs with an IPv6 only address.
# It should not be used in conjunction with 'provisioningHostname' unless BMCs do not
# support hostnames.
externalHttpIPv6: ""

View File

@@ -3,4 +3,4 @@ appVersion: 29.0.4
description: A Helm chart for Ironic, used by Metal3
name: ironic
type: application
version: 0.11.0
version: 0.11.3

View File

@@ -85,16 +85,20 @@ Get ironic CA volumeMounts
{{- end }}
{{/*
Get the formatted "External" hostname or IP address
Get the formatted "External" hostname or IP based URL
*/}}
{{- define "ironic.externalHttpHost" }}
{{- with .Values.global }}
{{- if regexMatch ".*:.*" .externalHttpHost }}
{{- print "[" .externalHttpHost "]" }}
{{- else }}
{{- .externalHttpHost }}
{{- define "ironic.externalHttpUrl" }}
{{- $host := ternary (include "metal3.hostIP" .) .Values.global.externalHttpHost (empty .Values.global.externalHttpHost) }}
{{- if regexMatch ".*:.*" $host }}
{{- $host = print "[" $host "]" }}
{{- end }}
{{- $protocol := "http" }}
{{- $port := "6180" }}
{{- if .Values.global.enable_vmedia_tls }}
{{- $protocol = "https" }}
{{- $port = .Values.global.vmediaTLSPort | default "6185" }}
{{- end }}
{{- print $protocol "://" $host ":" $port }}
{{- end }}
{{/*
@@ -103,7 +107,7 @@ Get the command to use for Liveness and Readiness probes
{{- define "ironic.probeCommand" }}
{{- $host := "127.0.0.1" }}
{{- if eq .Values.listenOnAll false }}
{{- $host = coalesce .Values.global.ironicIP .Values.global.provisioningIP .Values.global.provisioningHostname }}
{{- $host = coalesce .Values.global.provisioningIP .Values.global.ironicIP .Values.global.provisioningHostname }}
{{- if regexMatch ".*:.*" $host }}
{{- $host = print "[" $host "]" }}
{{- end }}
@@ -122,7 +126,7 @@ dnsNames:
{{- end -}}
{{- if or .ironicIP .provisioningIP }}
ipAddresses:
- {{ coalesce .ironicIP .provisioningIP }}
- {{ coalesce .provisioningIP .ironicIP }}
{{- end }}
{{- end }}
{{- end }}

View File

@@ -5,11 +5,6 @@ metadata:
labels:
{{- include "ironic.labels" . | nindent 4 }}
data:
{{- $enableTLS := .Values.global.enable_tls }}
{{- $enableVMediaTLS := .Values.global.enable_vmedia_tls }}
{{- $protocol := ternary "https" "http" $enableTLS }}
{{- $deployArch := .Values.global.deployArchitecture }}
{{- if ( .Values.global.enable_dnsmasq ) }}
DNSMASQ_DNS_SERVER_ADDRESS: {{ .Values.global.dnsmasqDNSServer }}
DNSMASQ_DEFAULT_ROUTER: {{ .Values.global.dnsmasqDefaultRouter }}
@@ -20,22 +15,15 @@ data:
{{- end }}
HTTP_PORT: "6180"
PREDICTABLE_NIC_NAMES: "{{ .Values.global.predictableNicNames }}"
# Switch VMedia to HTTP if enable_vmedia_tls is false
{{- if and $enableTLS $enableVMediaTLS }}
{{- $protocol = "https" }}
{{- else }}
{{- $protocol = "http" }}
{{- end }}
{{- if .Values.global.externalHttpHost }}
IRONIC_EXTERNAL_HTTP_URL: {{ $protocol }}://{{ include "ironic.externalHttpHost" . }}:6385
{{- end }}
DEPLOY_ARCHITECTURE: {{ $deployArch }}
IRONIC_EXTERNAL_HTTP_URL: {{ include "ironic.externalHttpUrl" . }}
ENABLE_PXE_BOOT: "{{ .Values.global.enable_pxe_boot }}"
{{- if .Values.global.provisioningInterface }}
PROVISIONING_INTERFACE: {{ .Values.global.provisioningInterface }}
{{- end }}
{{- if or .Values.global.ironicIP .Values.global.provisioningIP }}
PROVISIONING_IP: {{ include "metal3.provisioningIP" . }}
{{- if .Values.global.provisioningIP }}
PROVISIONING_IP: {{ include "metal3.hostIP" . }}
{{- else if .Values.global.ironicIP }}
IRONIC_IP: {{ include "metal3.hostIP" . }}
{{- else if .Values.global.provisioningHostname }}
IRONIC_URL_HOSTNAME: {{ .Values.global.provisioningHostname }}
{{- end }}

View File

@@ -64,11 +64,11 @@ images:
ironic:
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic
pullPolicy: IfNotPresent
tag: 29.0.4.0
tag: 29.0.4.2
ironicIPADownloader:
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic-ipa-downloader
pullPolicy: IfNotPresent
tag: 3.0.8
tag: 3.0.9
nameOverride: ""
fullnameOverride: ""

View File

@@ -3,4 +3,4 @@ appVersion: "10.11"
description: A Helm chart for MariaDB, used by Metal3
name: mariadb
type: application
version: 0.6.0
version: 0.6.1

View File

@@ -3,4 +3,4 @@ appVersion: 1.16.0
description: A Helm chart for Media, used by Metal3
name: media
type: application
version: 0.6.4
version: 0.6.6

View File

@@ -24,7 +24,7 @@ replicaCount: 1
image:
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic
pullPolicy: IfNotPresent
tag: 29.0.4.0
tag: 29.0.4.2
imagePullSecrets: []
nameOverride: ""

View File

@@ -64,14 +64,14 @@ Create the name of the service account to use
{{/*
Produce the correct IP or hostname for Ironic provisioning
*/}}
{{- define "metal3.provisioningIP" -}}
{{- define "metal3.hostIP" -}}
{{- with .Values.global }}
{{- if and .provisioningHostname (or .provisioningIP .ironicIP) }}
{{ fail "Please provide either provisioningHostname or provisioningIP (note: ironic IP is deprecated)" }}
{{ fail "Please provide either provisioningHostname or provisioningIP or ironicIP" }}
{{- end }}
{{- if and .provisioningIP .ironicIP }}
{{ fail "Please provide either ironicIP or provisioningIP (note: ironicIP is deprecated)" }}
{{ fail "Please provide either ironicIP or provisioningIP" }}
{{- end }}
{{- coalesce .ironicIP .provisioningIP }}
{{- coalesce .provisioningIP .ironicIP }}
{{- end }}
{{- end }}

View File

@@ -72,9 +72,6 @@ global:
# Name for the MariaDB service
databaseServiceName: metal3-mariadb
# Architecture for deployed nodes (either x86_64 or arm64)
deployArchitecture: x86_64
# In a multi-node cluster use the node selector to ensure the pods
# all run on the same host where the dnsmasqDNSServer and provisioningIP
# and /opt/media exist. Uncomment the nodeSelector and update the

31
nessie-image/Dockerfile Normal file
View File

@@ -0,0 +1,31 @@
# SPDX-License-Identifier: Apache-2.0
#!BuildTag: %%IMG_PREFIX%%nessie:%%nessie_version%%
#!BuildTag: %%IMG_PREFIX%%nessie:%%nessie_version%%-%RELEASE%
ARG SLE_VERSION
FROM registry.suse.com/bci/bci-base:$SLE_VERSION
# labelprefix=com.suse.application.nessie
LABEL org.opencontainers.image.title="nessie"
LABEL org.opencontainers.image.description="Nessie diagnostic tool for SUSE Kubernetes environments"
LABEL org.opencontainers.image.version="%%nessie_version%%"
LABEL org.opencontainers.image.authors="George Agriogiannis <george.agriogiannis2@suse.com>"
LABEL org.opencontainers.image.url="https://github.com/suse-edge/support-tools/tree/main/nessie"
LABEL org.opencontainers.image.vendor="SUSE LLC"
LABEL org.opencontainers.image.created="%BUILDTIME%"
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%nessie:%%nessie_version%%-%RELEASE%"
LABEL org.openbuildservice.disturl="%DISTURL%"
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
LABEL com.suse.eula="SUSE Combined EULA February 2024"
LABEL com.suse.lifecycle-url="https://www.suse.com/lifecycle"
LABEL com.suse.image-type="application"
LABEL com.suse.release-stage="released"
# endlabelprefix
RUN zypper --non-interactive refresh && \
zypper --non-interactive install --no-recommends nessie && \
zypper clean
WORKDIR /tmp
ENTRYPOINT ["/usr/bin/nessie"]

19
nessie-image/_service Normal file
View File

@@ -0,0 +1,19 @@
<services>
<service mode="buildtime" name="kiwi_metainfo_helper"/>
<service mode="buildtime" name="docker_label_helper"/>
<service name="replace_using_package_version" mode="buildtime">
<param name="file">Dockerfile</param>
<param name="regex">%%nessie_version%%</param>
<param name="package">nessie</param>
<param name="parse-version">patch</param>
</service>
<service name="replace_using_env" mode="buildtime">
<param name="file">Dockerfile</param>
<param name="eval">IMG_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?img_prefix})</param>
<param name="var">IMG_PREFIX</param>
<param name="eval">IMG_REPO=$(rpm --macros=/root/.rpmmacros -E %img_repo)</param>
<param name="var">IMG_REPO</param>
<param name="eval">SUPPORT_LEVEL=$(rpm --macros=/root/.rpmmacros -E %support_level)</param>
<param name="var">SUPPORT_LEVEL</param>
</service>
</services>

26
nessie/_service Normal file
View File

@@ -0,0 +1,26 @@
<services>
<service name="obs_scm">
<param name="url">https://github.com/suse-edge/support-tools</param>
<param name="scm">git</param>
<param name="revision">nessie-v1.0.0</param>
<param name="version">_auto_</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="changesgenerate">enable</param>
<param name="changesauthor">george.agriogiannis2@suse.com</param>
<param name="match-tag">nessie-v*</param>
<param name="versionrewrite-pattern">nessie-v(\d+\.\d+\.\d+)</param>
<param name="versionrewrite-replacement">\1</param>
<param name="subdir">nessie</param>
<param name="exclude">.git</param>
<param name="without-version">yes</param>
<param name="filename">nessie</param>
</service>
<service mode="buildtime" name="tar">
<param name="obsinfo">nessie.obsinfo</param>
</service>
<service mode="buildtime" name="recompress">
<param name="file">*.tar</param>
<param name="compression">gz</param>
</service>
<service mode="buildtime" name="set_version" />
</services>

80
nessie/nessie.spec Normal file
View File

@@ -0,0 +1,80 @@
#
# spec file for package nessie
#
# Copyright (c) 2024 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
Name: nessie
# Version will be set automatically by factory's set_version service
Version: 1.0.0
Release: 0
Summary: Node Environment Support Script for Inspection and Export
License: Apache-2.0
Group: System/Management
URL: https://github.com/suse-edge/support-tools/tree/main/nessie
Source0: %{name}-%{version}.tar.gz
BuildArch: noarch
# Build dependencies
BuildRequires: python3-devel
# Runtime dependencies
Requires: python3
Requires: python3-kubernetes
Requires: python3-PyYAML
Requires: helm
Requires: systemd
# Optional dependencies for enhanced functionality
Recommends: util-linux
%description
Nessie (Node Environment Support Script for Inspection and Export) is a
comprehensive diagnostic tool for SUSE Kubernetes environments. It collects
logs, configurations, and system information from Kubernetes clusters for
troubleshooting and support purposes.
Key features:
- Collects system service logs and Kubernetes pod logs
- Gathers cluster configurations and Helm releases
- Retrieves node metrics and component versions
- Supports RKE2 and K3s environments
- Fault-tolerant with configurable options
- Can be run directly or as a container
The tool is designed specifically for SUSE Edge environments and integrates
well with SUSE Linux Micro, RKE2, and K3s distributions.
%prep
%autosetup
%build
# Validate Python syntax
python3 -m py_compile nessie.py
%install
# Install the main script
install -D -m 0755 nessie.py %{buildroot}%{_bindir}/nessie
# Install documentation files
install -D -m 0644 README.md %{buildroot}%{_docdir}/%{name}/README.md
install -D -m 0644 LICENSE %{buildroot}%{_docdir}/%{name}/LICENSE
%files
%{_bindir}/nessie
%dir %{_docdir}/%{name}
%doc %{_docdir}/%{name}/README.md
%license %{_docdir}/%{name}/LICENSE
%changelog

1
python-executing Submodule

Submodule python-executing added at ac466db0b5

1
python-flit-core Submodule

Submodule python-flit-core added at 4362b05ea3

1
python-pydantic Submodule

Submodule python-pydantic added at f19a5a780f

1
python-pydantic-core Submodule

Submodule python-pydantic-core added at 00355d0825

View File

@@ -0,0 +1,39 @@
From 2e89940b44d4be1d115aed987b4c610ed7173d66 Mon Sep 17 00:00:00 2001
From: e-minguez <e.minguez@gmail.com>
Date: Tue, 2 Sep 2025 18:03:50 +0200
Subject: [PATCH] fix: Allow icon metadata to be file
Fix #34
---
pyhelm3/models.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/pyhelm3/models.py b/pyhelm3/models.py
index d03fdc6..adb2c88 100644
--- a/pyhelm3/models.py
+++ b/pyhelm3/models.py
@@ -14,6 +14,7 @@
FilePath,
AnyUrl as PydanticAnyUrl,
HttpUrl as PydanticHttpUrl,
+ FileUrl as PydanticFileUrl,
constr,
field_validator
)
@@ -65,6 +66,7 @@ def validate_str_as(validate_type):
#: Annotated string types for URLs
AnyUrl = t.Annotated[str, AfterValidator(validate_str_as(PydanticAnyUrl))]
HttpUrl = t.Annotated[str, AfterValidator(validate_str_as(PydanticHttpUrl))]
+FileUrl = t.Annotated[str, AfterValidator(validate_str_as(PydanticFileUrl))]
class ChartDependency(BaseModel):
@@ -173,7 +175,7 @@ class ChartMetadata(BaseModel):
default_factory = list,
description = "List of maintainers for the chart."
)
- icon: t.Optional[HttpUrl] = Field(
+ icon: t.Optional[HttpUrl | FileUrl] = Field(
None,
description = "URL to an SVG or PNG image to be used as an icon."
)

View File

@@ -16,12 +16,15 @@
Name: python-pyhelm3
Version: 0.4.0
Release: 0
Release: 1
Summary: Python library for managing Helm releases using Helm 3
License: Apache-2.0
URL: https://github.com/azimuth-cloud/pyhelm3
#!RemoteAsset
Source: https://files.pythonhosted.org/packages/source/p/pyhelm3/pyhelm3-%{version}.tar.gz
# Allow icon metadata to be file:// as well as http/https://
# https://github.com/azimuth-cloud/pyhelm3/pull/35
Patch: 0001-icon-metadata-allow-fileurl.patch
BuildRequires: python-rpm-macros
BuildRequires: %{python_module pip}
BuildRequires: %{python_module setuptools >= 42}

3
python-rich/_service Normal file
View File

@@ -0,0 +1,3 @@
<services>
<service name="download_assets"></service>
</services>

View File

@@ -0,0 +1,45 @@
From 08be21dadfd2ce9e96e41e366ab38bd8d7cd0e39 Mon Sep 17 00:00:00 2001
From: Dan Lazin <dlazin@users.noreply.github.com>
Date: Tue, 7 Jan 2025 16:04:56 -0500
Subject: [PATCH] Fix test that changed with Pygments 2.19.
---
tests/test_markdown.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: rich-13.9.4/tests/test_markdown.py
===================================================================
--- rich-13.9.4.orig/tests/test_markdown.py
+++ rich-13.9.4/tests/test_markdown.py
@@ -110,7 +110,7 @@ def test_inline_code():
inline_code_theme="emacs",
)
result = render(markdown)
- expected = "inline \x1b[1;38;2;170;34;255;48;2;248;248;248mimport\x1b[0m\x1b[38;2;0;0;0;48;2;248;248;248m \x1b[0m\x1b[1;38;2;0;0;255;48;2;248;248;248mthis\x1b[0m code \n"
+ expected = "inline \x1b[1;38;2;170;34;255;48;2;248;248;248mimport\x1b[0m\x1b[38;2;187;187;187;48;2;248;248;248m \x1b[0m\x1b[1;38;2;0;0;255;48;2;248;248;248mthis\x1b[0m code \n"
print(result)
print(repr(result))
assert result == expected
Index: rich-13.9.4/tests/test_syntax.py
===================================================================
--- rich-13.9.4.orig/tests/test_syntax.py
+++ rich-13.9.4/tests/test_syntax.py
@@ -53,7 +53,7 @@ def test_blank_lines():
print(repr(result))
assert (
result
- == "\x1b[1;38;2;24;24;24;48;2;248;248;248m \x1b[0m\x1b[38;2;173;173;173;48;2;248;248;248m1 \x1b[0m\x1b[48;2;248;248;248m \x1b[0m\n\x1b[1;38;2;24;24;24;48;2;248;248;248m \x1b[0m\x1b[38;2;173;173;173;48;2;248;248;248m2 \x1b[0m\x1b[48;2;248;248;248m \x1b[0m\n\x1b[1;38;2;24;24;24;48;2;248;248;248m \x1b[0m\x1b[38;2;173;173;173;48;2;248;248;248m3 \x1b[0m\x1b[1;38;2;0;128;0;48;2;248;248;248mimport\x1b[0m\x1b[38;2;0;0;0;48;2;248;248;248m \x1b[0m\x1b[1;38;2;0;0;255;48;2;248;248;248mthis\x1b[0m\x1b[48;2;248;248;248m \x1b[0m\n\x1b[1;38;2;24;24;24;48;2;248;248;248m \x1b[0m\x1b[38;2;173;173;173;48;2;248;248;248m4 \x1b[0m\x1b[48;2;248;248;248m \x1b[0m\n\x1b[1;38;2;24;24;24;48;2;248;248;248m \x1b[0m\x1b[38;2;173;173;173;48;2;248;248;248m5 \x1b[0m\x1b[48;2;248;248;248m \x1b[0m\n"
+ == "\x1b[1;38;2;24;24;24;48;2;248;248;248m \x1b[0m\x1b[38;2;173;173;173;48;2;248;248;248m1 \x1b[0m\x1b[48;2;248;248;248m \x1b[0m\n\x1b[1;38;2;24;24;24;48;2;248;248;248m \x1b[0m\x1b[38;2;173;173;173;48;2;248;248;248m2 \x1b[0m\x1b[48;2;248;248;248m \x1b[0m\n\x1b[1;38;2;24;24;24;48;2;248;248;248m \x1b[0m\x1b[38;2;173;173;173;48;2;248;248;248m3 \x1b[0m\x1b[1;38;2;0;128;0;48;2;248;248;248mimport\x1b[0m\x1b[38;2;187;187;187;48;2;248;248;248m \x1b[0m\x1b[1;38;2;0;0;255;48;2;248;248;248mthis\x1b[0m\x1b[48;2;248;248;248m \x1b[0m\n\x1b[1;38;2;24;24;24;48;2;248;248;248m \x1b[0m\x1b[38;2;173;173;173;48;2;248;248;248m4 \x1b[0m\x1b[48;2;248;248;248m \x1b[0m\n\x1b[1;38;2;24;24;24;48;2;248;248;248m \x1b[0m\x1b[38;2;173;173;173;48;2;248;248;248m5 \x1b[0m\x1b[48;2;248;248;248m \x1b[0m\n"
)
@@ -119,7 +119,7 @@ def test_python_render_simple_indent_gui
)
rendered_syntax = render(syntax)
print(repr(rendered_syntax))
- expected = '\x1b[34mdef\x1b[0m \x1b[32mloop_first_last\x1b[0m(values: Iterable[T]) -> Iterable[Tuple[\x1b[36mb\x1b[0m\n\x1b[2;37m│ \x1b[0m\x1b[33m"""Iterate and generate a tuple with a flag for first an\x1b[0m\n\x1b[2m│ \x1b[0miter_values = \x1b[36miter\x1b[0m(values)\n\x1b[2m│ \x1b[0m\x1b[34mtry\x1b[0m:\n\x1b[2m│ │ \x1b[0mprevious_value = \x1b[36mnext\x1b[0m(iter_values)\n\x1b[2m│ \x1b[0m\x1b[34mexcept\x1b[0m \x1b[36mStopIteration\x1b[0m:\n\x1b[2m│ │ \x1b[0m\x1b[34mreturn\x1b[0m\n\x1b[2m│ \x1b[0mfirst = \x1b[34mTrue\x1b[0m\n\x1b[2m│ \x1b[0m\x1b[34mfor\x1b[0m value \x1b[35min\x1b[0m iter_values:\n\x1b[2m│ │ \x1b[0m\x1b[34myield\x1b[0m first, \x1b[34mFalse\x1b[0m, previous_value\n\x1b[2m│ │ \x1b[0mfirst = \x1b[34mFalse\x1b[0m\n\x1b[2m│ │ \x1b[0mprevious_value = value\n\x1b[2m│ \x1b[0m\x1b[34myield\x1b[0m first, \x1b[34mTrue\x1b[0m, previous_value\n'
+ expected = '\x1b[34mdef\x1b[0m\x1b[37m \x1b[0m\x1b[32mloop_first_last\x1b[0m(values: Iterable[T]) -> Iterable[Tuple[\x1b[36mb\x1b[0m\n\x1b[2;37m│ \x1b[0m\x1b[33m"""Iterate and generate a tuple with a flag for first an\x1b[0m\n\x1b[2m│ \x1b[0miter_values = \x1b[36miter\x1b[0m(values)\n\x1b[2m│ \x1b[0m\x1b[34mtry\x1b[0m:\n\x1b[2m│ │ \x1b[0mprevious_value = \x1b[36mnext\x1b[0m(iter_values)\n\x1b[2m│ \x1b[0m\x1b[34mexcept\x1b[0m \x1b[36mStopIteration\x1b[0m:\n\x1b[2m│ │ \x1b[0m\x1b[34mreturn\x1b[0m\n\x1b[2m│ \x1b[0mfirst = \x1b[34mTrue\x1b[0m\n\x1b[2m│ \x1b[0m\x1b[34mfor\x1b[0m value \x1b[35min\x1b[0m iter_values:\n\x1b[2m│ │ \x1b[0m\x1b[34myield\x1b[0m first, \x1b[34mFalse\x1b[0m, previous_value\n\x1b[2m│ │ \x1b[0mfirst = \x1b[34mFalse\x1b[0m\n\x1b[2m│ │ \x1b[0mprevious_value = value\n\x1b[2m│ \x1b[0m\x1b[34myield\x1b[0m first, \x1b[34mTrue\x1b[0m, previous_value\n'
assert rendered_syntax == expected

View File

@@ -0,0 +1,66 @@
#
# spec file for package python-rich
#
# Copyright (c) 2025 SUSE LLC
# Copyright (c) 2020-2021, Martin Hauke <mardnh@gmx.de>
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
%{?sle15_python_module_pythons}
Name: python-rich
Version: 14.0.0
Release: 0
Summary: A Python library for rich text and beautiful formatting in the terminal
License: MIT
URL: https://github.com/Textualize/rich
#!RemoteAsset: https://github.com/Textualize/rich/archive/refs/tags/v%{version}.tar.gz rich-%{version}.tar.gz
Source: rich-%{version}.tar.gz
# PATCH-FIX-UPSTREAM https://github.com/Textualize/rich/pull/3604 Fix test that changed with Pygments 2.19.
# and https://github.com/Textualize/rich/pull/3608 fix remaining tests with Pygments 2.19 #3604 did not fix
Patch: pygments.patch
BuildRequires: %{python_module base >= 3.8}
BuildRequires: %{python_module markdown-it-py >= 2.2.0}
BuildRequires: %{python_module pip}
BuildRequires: %{python_module poetry-core}
BuildRequires: %{python_module pygments >= 2.13.0}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
Requires: python-markdown-it-py >= 2.2.0
Requires: python-pygments >= 2.13.0
Suggests: python-ipywidgets >= 7.5.1
BuildArch: noarch
# TODO(edu): Disabled all tests
%python_subpackages
%description
Render rich text, tables, progress bars, syntax highlighting,
markdown and more to the terminal.
%prep
%autosetup -p1 -n rich-%{version}
%build
%pyproject_wheel
%install
%pyproject_install
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%files %{python_files}
%license LICENSE
%doc README.md
%{python_sitelib}/rich
%{python_sitelib}/rich-%{version}.dist-info
%changelog

View File

@@ -0,0 +1,3 @@
<services>
<service name="download_assets"></service>
</services>

View File

@@ -0,0 +1,98 @@
#
# spec file for package python-suse-edge-components-versions
#
# Copyright (c) 2025 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
%global mod_name suse-edge-components-versions
%global pythons %{primary_python}
%if 0%{?suse_version} == 1500
%sle15_python_module_pythons
%endif
Name: python-suse-edge-components-versions
Version: 0.1.1
Release: 0%{?dist}
Summary: A tool to gather and display component versions for SUSE Edge products.
License: Apache-2.0
URL: https://github.com/suse-edge/support-tools/tree/main/components-versions
#!RemoteAsset: https://github.com/suse-edge/support-tools/archive/refs/tags/components-versions-v%{version}.tar.gz
Source: components-versions-v%{version}.tar.gz
BuildArch: noarch
BuildRequires: python-rpm-macros
BuildRequires: %{python_module pip}
BuildRequires: %{python_module setuptools}
BuildRequires: %{python_module setuptools_scm}
BuildRequires: %{python_module wheel}
# Requires:
Requires: %{python_module kubernetes}
Requires: %{python_module pyhelm3}
Requires: %{python_module tabulate}
Requires: %{python_module pydantic >= 2.0}
Requires: helm
# This macro automatically creates subpackages for each Python version
# (e.g., python311-suse-edge-components-versions, python312-suse-edge-components-versions).
%python_subpackages
%description
This tool provides functionality to gather and display component versions
for various SUSE Edge products. It helps in understanding the exact versions
of software components used in different product releases and ensures
consistency across deployments.
%prep
# Unpack the source tarball.
# The tarball extracts into 'support-tools-components-versions-v%{version}'.
%setup -q -n support-tools-components-versions-v%{version}
%build
# The actual Python project (containing pyproject.toml and the source code)
# is nested inside the 'components-versions' directory within the extracted tarball.
# We need to change into this directory before building.
cd components-versions
%pyproject_wheel .
cd ..
%install
cd components-versions
%pyproject_install
# Rename the main executable from 'components-versions' to 'suse-edge-components-versions'
mv %{buildroot}%{_bindir}/components-versions %{buildroot}%{_bindir}/suse-edge-components-versions
%python_clone -a %{buildroot}%{_bindir}/suse-edge-components-versions
cd ..
# Move the json files to /usr/share/suse-edge-components-versions instead
mkdir -p %{buildroot}/usr/share/suse-edge-components-versions/
mv %{buildroot}%{python_sitelib}/components_versions/data/*.json %{buildroot}/usr/share/suse-edge-components-versions/
rmdir %{buildroot}%{python_sitelib}/components_versions/data/
%post
%python_install_alternative suse-edge-components-versions
%postun
%python_uninstall_alternative suse-edge-components-versions
%files %{python_files}
%license LICENSE
%{python_sitelib}/components_versions
# Include the Python package metadata (e.g., .dist-info or .egg-info).
# The .dist-info name is based on the 'name' field in pyproject.toml.
%{python_sitelib}/suse_edge_components_versions-%{version}*.dist-info
# Include the main executable with its new name.
%python_alternative %{_bindir}/suse-edge-components-versions
# Include the json files
/usr/share/suse-edge-components-versions/
%changelog

View File

@@ -22,7 +22,7 @@ rancherTurtles:
# rancherInstalled: True if Rancher already installed is in the cluster, this is the preferred installation way.
rancherInstalled: false
# kubectlImage: Image for kubectl tasks.
kubectlImage: "%%IMG_REPO%%/%%IMG_PREFIX%%kubectl:1.32.4"
kubectlImage: "%%IMG_REPO%%/%%IMG_PREFIX%%kubectl:1.33.4"
# features: Optional and experimental features.
features:
# day2operations: Alpha feature.

View File

@@ -7,7 +7,7 @@ spec:
components:
kubernetes:
k3s:
version: v1.32.4+k3s1
version: v1.33.3+k3s1
coreComponents:
- name: traefik-crd
version: 34.2.1+up34.2.0
@@ -31,46 +31,46 @@ spec:
image: rancher/mirrored-metrics-server:v0.7.2
type: Deployment
rke2:
version: v1.32.4+rke2r1
version: v1.33.3+rke2r1
coreComponents:
- name: rke2-cilium
version: 1.17.300
version: 1.17.600
type: HelmChart
- name: rke2-canal
version: v3.29.3-build2025040801
version: v3.30.2-build2025071100
type: HelmChart
- name: rke2-calico-crd
version: v3.29.101
version: v3.30.100
type: HelmChart
- name: rke2-calico
version: v3.29.300
version: v3.30.100
type: HelmChart
- name: rke2-coredns
version: 1.39.201
version: 1.42.302
type: HelmChart
- name: rke2-ingress-nginx
version: 4.12.101
version: 4.12.401
type: HelmChart
- name: rke2-metrics-server
version: 3.12.200
version: 3.12.203
type: HelmChart
- name: rancher-vsphere-csi
version: 3.3.1-rancher900
version: 3.3.1-rancher1000
type: HelmChart
- name: rancher-vsphere-cpi
version: 1.10.000
version: 1.11.000
type: HelmChart
- name: harvester-cloud-provider
version: 0.2.900
version: 0.2.1000
type: HelmChart
- name: harvester-csi-driver
version: 0.1.2300
version: 0.1.2400
type: HelmChart
- name: rke2-snapshot-controller-crd
version: 4.0.002
version: 4.0.003
type: HelmChart
- name: rke2-snapshot-controller
version: 4.0.002
version: 4.0.003
type: HelmChart
# Deprecated this empty chart addon can be removed in v1.34
- name: rke2-snapshot-validation-webhook
@@ -89,7 +89,7 @@ spec:
- prettyName: Rancher
releaseName: rancher
chart: rancher
version: 2.11.2
version: 2.12.1
repository: https://charts.rancher.com/server-charts/prime
values:
postDelete:
@@ -97,12 +97,12 @@ spec:
- prettyName: Longhorn
releaseName: longhorn
chart: longhorn
version: 106.2.0+up1.8.1
version: 107.0.0+up1.9.1
repository: https://charts.rancher.io
dependencyCharts:
- releaseName: longhorn-crd
chart: longhorn-crd
version: 106.2.0+up1.8.1
version: 107.0.0+up1.9.1
repository: https://charts.rancher.io
- prettyName: MetalLB
releaseName: metallb
@@ -111,24 +111,24 @@ spec:
- prettyName: CDI
releaseName: cdi
chart: '%%CHART_REPO%%/%%CHART_PREFIX%%cdi'
version: '%%CHART_MAJOR%%.0.0+up0.5.0'
version: '%%CHART_MAJOR%%.0.1+up0.6.0'
- prettyName: KubeVirt
releaseName: kubevirt
chart: '%%CHART_REPO%%/%%CHART_PREFIX%%kubevirt'
version: '%%CHART_MAJOR%%.0.0+up0.5.0'
version: '%%CHART_MAJOR%%.0.1+up0.6.0'
addonCharts:
- releaseName: kubevirt-dashboard-extension
chart: '%%CHART_REPO%%/%%CHART_PREFIX%%kubevirt-dashboard-extension'
version: '%%CHART_MAJOR%%.0.2+up1.3.2'
version: '%%CHART_MAJOR%%.0.3+up1.3.2'
- prettyName: NeuVector
releaseName: neuvector
chart: neuvector
version: 106.0.1+up2.8.6
version: 107.0.0+up2.8.7
repository: https://charts.rancher.io
dependencyCharts:
- releaseName: neuvector-crd
chart: neuvector-crd
version: 106.0.1+up2.8.6
version: 107.0.0+up2.8.7
repository: https://charts.rancher.io
addonCharts:
- releaseName: neuvector-ui-ext
@@ -142,11 +142,11 @@ spec:
- prettyName: Elemental
releaseName: elemental-operator
chart: oci://registry.suse.com/rancher/elemental-operator-chart
version: 1.6.8
version: 1.7.3
dependencyCharts:
- releaseName: elemental-operator-crds
chart: oci://registry.suse.com/rancher/elemental-operator-crds-chart
version: 1.6.8
version: 1.7.3
addonCharts:
- releaseName: elemental
chart: elemental
@@ -167,11 +167,11 @@ spec:
addonCharts:
- releaseName: akri-dashboard-extension
chart: '%%CHART_REPO%%/%%CHART_PREFIX%%akri-dashboard-extension'
version: '%%CHART_MAJOR%%.0.2+up1.3.1'
version: '%%CHART_MAJOR%%.0.3+up1.3.1'
- prettyName: Metal3
releaseName: metal3
chart: '%%CHART_REPO%%/%%CHART_PREFIX%%metal3'
version: '%%CHART_MAJOR%%.0.10+up0.12.0'
version: '%%CHART_MAJOR%%.0.15+up0.12.5'
- prettyName: RancherTurtles
releaseName: rancher-turtles
chart: '%%CHART_REPO%%/%%CHART_PREFIX%%rancher-turtles'

View File

@@ -0,0 +1,52 @@
# SPDX-License-Identifier: Apache-2.0
#!BuildTag: %%IMG_PREFIX%%suse-edge-components-versions:0.1.1
#!BuildTag: %%IMG_PREFIX%%suse-edge-components-versions:0.1.1-%RELEASE%
ARG SLE_VERSION
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
FROM registry.suse.com/bci/bci-base:$SLE_VERSION AS base
COPY --from=micro / /installroot/
RUN sed -i -e 's%^# rpm.install.excludedocs = no.*%rpm.install.excludedocs = yes%g' /etc/zypp/zypp.conf
RUN zypper --installroot /installroot --non-interactive install --no-recommends python311-suse-edge-components-versions
# https://opensource.suse.com/bci-docs/guides/adding-users/
ARG USERNAME=suse
ARG USER_UID=1000
ARG USER_GID=$USER_UID
# Create the user
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME
# build actual image
FROM micro AS final
MAINTAINER SUSE LLC (https://www.suse.com/)
# Define labels according to https://en.opensuse.org/Building_derived_containers
LABEL org.opencontainers.image.title="SUSE Edge components-versions Container Image"
LABEL org.opencontainers.image.description="Gather and display component versions for various SUSE Edge products"
LABEL org.opencontainers.image.url="https://github.com/suse-edge/support-tools/tree/main/components-versions"
LABEL org.opencontainers.image.created="%BUILDTIME%"
LABEL org.opencontainers.image.vendor="SUSE LLC"
LABEL org.opencontainers.image.version="0.1.1"
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%suse-edge-components-versions:0.1.1-%RELEASE%"
LABEL org.openbuildservice.disturl="%DISTURL%"
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
LABEL com.suse.eula="SUSE Combined EULA February 2024"
LABEL com.suse.lifecycle-url="https://www.suse.com/lifecycle"
LABEL com.suse.image-type="application"
LABEL com.suse.release-stage="released"
# endlabelprefix
COPY --from=base /installroot /
# https://opensource.suse.com/bci-docs/guides/adding-users/
COPY --from=base /etc/passwd /etc/passwd
COPY --from=base /etc/group /etc/group
COPY --from=base /etc/shadow /etc/shadow
COPY --from=base /home/$USERNAME /home/$USERNAME
USER ${USERNAME}
ENTRYPOINT ["/usr/bin/suse-edge-components-versions"]

View File

@@ -0,0 +1,12 @@
<services>
<service mode="buildtime" name="kiwi_metainfo_helper"/>
<service name="replace_using_env" mode="buildtime">
<param name="file">Dockerfile</param>
<param name="eval">IMG_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?img_prefix})</param>
<param name="var">IMG_PREFIX</param>
<param name="eval">IMG_REPO=$(rpm --macros=/root/.rpmmacros -E %img_repo)</param>
<param name="var">IMG_REPO</param>
<param name="eval">SUPPORT_LEVEL=$(rpm --macros=/root/.rpmmacros -E %support_level)</param>
<param name="var">SUPPORT_LEVEL</param>
</service>
</services>

View File

@@ -15,7 +15,7 @@ env:
image: %%MANIFEST_REPO%%/%%IMG_PREFIX%%release-manifest
kubectl:
image: %%IMG_REPO%%/%%IMG_PREFIX%%kubectl
version: 1.32.4
version: 1.33.4
imagePullSecrets: []
nameOverride: ""