Compare commits
129 Commits
Author | SHA256 | Date | |
---|---|---|---|
|
51b082a3f1 | ||
d45c9764a4 | |||
efd8bf1075 | |||
892400cea7 | |||
ff1b390d09 | |||
c3f1be5640 | |||
e021cfa92f | |||
5f0d0b019e | |||
dc254aa461 | |||
62f9faf144
|
|||
8164b5f125
|
|||
5f6e0185f5
|
|||
57dca6f0a4
|
|||
54bf2edf7b
|
|||
9c60855914
|
|||
bc1d924cc6
|
|||
2f4f94238f
|
|||
dae0b33326
|
|||
4e4231b39e
|
|||
c9f13a514a
|
|||
f8f730087f
|
|||
7c0423ee04
|
|||
0358093370
|
|||
a69e54a6df
|
|||
65201fd575
|
|||
2adc97e581 | |||
ed4448d7a6 | |||
6251d8b670 | |||
3a98fe8f00 | |||
f9df52a457 | |||
9bcffd112d | |||
83b660285a | |||
f23003c01f
|
|||
4b9928ccdf
|
|||
df55d2abd4 | |||
214a65f2db | |||
d00b6ece5f
|
|||
67f63aadc7
|
|||
f88e75a724
|
|||
ef6989b0d8
|
|||
b2ca623d14
|
|||
53c16ce7c9
|
|||
e55bf1ab63 | |||
4f71473b0a
|
|||
e20624cf98
|
|||
afba5dedef | |||
5cbf832b02 | |||
7cf1b8ea26 | |||
83b44c9bc7 | |||
a7cb23a9c1 | |||
07505665e4 | |||
13b18090d0 | |||
22947d9847 | |||
3d087070a7 | |||
9bc3066279 | |||
ec4c51d003 | |||
70ff1fdd31 | |||
ce6519f470 | |||
0ccade5817 | |||
87f163939c | |||
f0d7ede6e0 | |||
aa677745a8 | |||
08797b0030 | |||
8b37096c3a | |||
6ca1cc0ded | |||
fc24747ee5 | |||
9c2d445b06 | |||
e5de658ae9 | |||
8cc06f4ccb | |||
9dc5ba4c52
|
|||
f92f3600e6 | |||
e379d5df4e | |||
346d6137fe | |||
1f36228510 | |||
ec7da715f4 | |||
1ad6c99257 | |||
12e91c2102
|
|||
6fb80441cd | |||
93a5f6813d | |||
bdaa422813 | |||
c25bf622bc | |||
fa57d15ff9 | |||
1a29da28ca | |||
f2d39a7025 | |||
629e96dded | |||
c190a1c800 | |||
be87fb0fc6 | |||
01dfdc5fd9 | |||
90ce8e165c | |||
ad68a91755 | |||
c37782e077 | |||
71257047ed | |||
477a4e15eb
|
|||
be0d25d8f7
|
|||
70a42948aa
|
|||
fb0f99ee20 | |||
cc8d3fe431 | |||
4ee8e8c6f2 | |||
79268b8e71 | |||
d5e487518a | |||
a7d128b8c4 | |||
d97b554f8c | |||
1ca6ea51ea | |||
c9b9e2223b | |||
027df1b35c | |||
e7448eeb1c | |||
fb4d399f0f | |||
f47b6df822 | |||
4e3f1b61fd | |||
df60bb2ed3 | |||
3a654b9826
|
|||
15e4de98a7 | |||
fe8d0ba120
|
|||
0b431c75e2 | |||
a59e253ecd | |||
b28f7a5817 | |||
c6b78eb569
|
|||
8f7747415c
|
|||
e5ba38d02f | |||
f221cf4b37 | |||
f42ac11716 | |||
08ef2fe86f | |||
ad221cd94e | |||
81a856e586 | |||
3c9ebbd7ef | |||
03018e5cd1 | |||
e91096e13e | |||
93f3abfeb5 | |||
2c4991cb24
|
23
.gitea/workflows/check_manifest.yaml
Normal file
23
.gitea/workflows/check_manifest.yaml
Normal file
@@ -0,0 +1,23 @@
|
||||
name: Check Release Manifest Local Charts Versions
|
||||
on:
|
||||
pull_request:
|
||||
branches-ignore:
|
||||
- "devel"
|
||||
|
||||
|
||||
jobs:
|
||||
sync-pr-project:
|
||||
name: "Check Release Manifest Local Charts Versions"
|
||||
runs-on: tumbleweed
|
||||
steps:
|
||||
# Waiting on PR to get merged for support in upstream action/checkout action
|
||||
- uses: 'https://github.com/yangskyboxlabs/action-checkout@sha256'
|
||||
name: Checkout repository
|
||||
with:
|
||||
object-format: 'sha256'
|
||||
- name: Setup dependencies
|
||||
run: |
|
||||
zypper in -y python3-ruamel.yaml
|
||||
- name: Check release manifest
|
||||
run: |
|
||||
python3 .obs/manifest-check.py --check
|
@@ -1,3 +1,3 @@
|
||||
PROJECT = "isv:SUSE:Edge:Factory:Devel"
|
||||
PROJECT = "isv:SUSE:Edge:Factory"
|
||||
REPOSITORY = "https://src.opensuse.org/suse-edge/Factory"
|
||||
BRANCH = "devel"
|
||||
BRANCH = "main"
|
||||
|
84
.obs/manifest-check.py
Executable file
84
.obs/manifest-check.py
Executable file
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import ruamel.yaml
|
||||
import pathlib
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
yaml = ruamel.yaml.YAML()
|
||||
|
||||
def get_chart_version(chart_name: str) -> str:
|
||||
with open(f"./{chart_name}-chart/Chart.yaml") as f:
|
||||
chart = yaml.load(f)
|
||||
return chart["version"]
|
||||
|
||||
def get_charts(chart):
|
||||
if not chart["chart"].startswith("%%CHART_REPO%%"):
|
||||
# Not a locally managed chart
|
||||
return {}
|
||||
|
||||
chart_name = chart["chart"][len("%%CHART_REPO%%/%%CHART_PREFIX%%"):]
|
||||
charts = { chart_name: chart["version"] }
|
||||
for child_chart in chart.get("dependencyCharts", []) + chart.get("addonCharts", []):
|
||||
charts.update(get_charts(child_chart))
|
||||
return charts
|
||||
|
||||
def get_charts_list():
|
||||
with open("./release-manifest-image/release_manifest.yaml") as f:
|
||||
manifest = yaml.load(f)
|
||||
charts = {}
|
||||
for chart in manifest["spec"]["components"]["workloads"]["helm"]:
|
||||
charts.update(get_charts(chart))
|
||||
return charts
|
||||
|
||||
def check_charts(fix: bool) -> bool:
|
||||
success = True
|
||||
charts = get_charts_list()
|
||||
to_fix = {}
|
||||
for chart in charts:
|
||||
expected_version = get_chart_version(chart)
|
||||
if expected_version != charts[chart]:
|
||||
success = False
|
||||
to_fix[f'%%CHART_REPO%%/%%CHART_PREFIX%%{chart}'] = expected_version
|
||||
print(f"{chart}: Expected: {expected_version}, Got: {charts[chart]}")
|
||||
if fix and not success:
|
||||
fix_charts(to_fix)
|
||||
return True
|
||||
return success
|
||||
|
||||
def fix_charts(to_fix):
|
||||
manifest_path = pathlib.Path("./release-manifest-image/release_manifest.yaml")
|
||||
manifest = yaml.load(manifest_path)
|
||||
yaml.indent(mapping=2, sequence=4, offset=2)
|
||||
yaml.width = 4096
|
||||
for chart_index, chart in enumerate(manifest["spec"]["components"]["workloads"]["helm"]):
|
||||
changed = False
|
||||
if chart["chart"] in to_fix.keys():
|
||||
changed = True
|
||||
chart["version"] = to_fix[chart["chart"]]
|
||||
for subchart_index, subchart in enumerate(chart.get("addonCharts", [])):
|
||||
if subchart["chart"] in to_fix.keys():
|
||||
changed = True
|
||||
subchart["version"] = to_fix[subchart["chart"]]
|
||||
chart["addonCharts"][subchart_index] = subchart
|
||||
for subchart_index, subchart in enumerate(chart.get("dependencyCharts", [])):
|
||||
if subchart["chart"] in to_fix.keys():
|
||||
changed = True
|
||||
subchart["version"] = to_fix[subchart["chart"]]
|
||||
chart["dependencyCharts"][subchart_index] = subchart
|
||||
if changed:
|
||||
manifest["spec"]["components"]["workloads"]["helm"][chart_index] = chart
|
||||
yaml.dump(manifest, manifest_path)
|
||||
|
||||
def main():
|
||||
print("Checking charts versions in release manifest")
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('-c', '--check', action='store_true')
|
||||
args = parser.parse_args()
|
||||
if not check_charts(not args.check):
|
||||
sys.exit(1)
|
||||
else:
|
||||
print("All local charts in release manifest are using the right version")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
@@ -1,65 +0,0 @@
|
||||
import xml.etree.ElementTree as ET
|
||||
import subprocess
|
||||
|
||||
from sync_packages import get_local_packages
|
||||
from common import PROJECT
|
||||
|
||||
def get_service_repo(package):
|
||||
with open(f"{package}/_service") as service:
|
||||
root = ET.parse(service).getroot()
|
||||
for service in root.findall("service"):
|
||||
if service.get("mode") in ["manual", "disabled"]:
|
||||
continue
|
||||
if service.get("name") not in ["obs_scm", "tar_scm"]:
|
||||
continue
|
||||
ref = service.find("param[@name='revision']").text
|
||||
repo = service.find("param[@name='url']").text
|
||||
return (repo, ref)
|
||||
return None
|
||||
|
||||
|
||||
def get_remote_ref(project, package):
|
||||
files = subprocess.run(["osc", "ls", "-e", project, package], encoding='utf-8' , capture_output=True).stdout.splitlines()
|
||||
for filename in files:
|
||||
if filename.startswith("_service") and filename.endswith(".obsinfo"):
|
||||
obsinfo = subprocess.run(["osc", "cat", project, package, filename], encoding='utf-8' , capture_output=True).stdout.splitlines()
|
||||
for line in obsinfo:
|
||||
if line.startswith("commit:"):
|
||||
return line.split(':')[-1].strip()
|
||||
|
||||
def get_upstream_ref(repo, ref):
|
||||
refs = subprocess.run(["git", "ls-remote", repo, ref, f"{ref}^{{}}"], encoding='utf-8' , capture_output=True).stdout.splitlines()
|
||||
refpath = ref.split('/')
|
||||
best = None
|
||||
for rref in refs:
|
||||
value = rref.split('\t')
|
||||
(sha, name) = (value[0].strip(), value[1].strip())
|
||||
namepath = name.split('/')
|
||||
if len(namepath) == len(refpath) or len(namepath) - 2 == len(refpath):
|
||||
if name.endswith(ref) and best is None:
|
||||
best = sha
|
||||
if name.endswith("^{}"):
|
||||
best = sha
|
||||
return best
|
||||
|
||||
def trigger_service(project, package):
|
||||
subprocess.run(["osc", "service", "remoterun", project, package], encoding="utf-8",check=True)
|
||||
|
||||
def main():
|
||||
packages = get_local_packages()
|
||||
for package in packages:
|
||||
try:
|
||||
(repo, ref) = get_service_repo(package)
|
||||
print(f"{package} uses {repo} at {ref}")
|
||||
except: # Package is not using server side scm service
|
||||
continue
|
||||
remote_ref = get_remote_ref(PROJECT, package)
|
||||
upstream_ref = get_upstream_ref(repo, ref)
|
||||
if upstream_ref != remote_ref:
|
||||
print(f"\t{package} needs a refresh")
|
||||
print(f"\tOBS ref is {remote_ref}")
|
||||
print(f"\tgit ref is {upstream_ref}")
|
||||
trigger_service(PROJECT, package)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
10
.pre-commit-config.yaml
Normal file
10
.pre-commit-config.yaml
Normal file
@@ -0,0 +1,10 @@
|
||||
repos:
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: check-manifest
|
||||
name: "Check release-manifest"
|
||||
entry: .obs/manifest-check.py
|
||||
language: python
|
||||
additional_dependencies: ['ruamel.yaml']
|
||||
pass_filenames: false
|
||||
always_run: true
|
19
_config
19
_config
@@ -1,4 +1,5 @@
|
||||
Prefer: -libqpid-proton10 -python311-urllib3_1
|
||||
Prefer: -cargo1.58 -cargo1.57 cargo1.88
|
||||
|
||||
Macros:
|
||||
%__python3 /usr/bin/python3.11
|
||||
@@ -60,6 +61,7 @@ BuildFlags: onlybuild:release-manifest-image
|
||||
BuildFlags: excludebuild:endpoint-copier-operator-image
|
||||
BuildFlags: excludebuild:ironic-image
|
||||
BuildFlags: excludebuild:ironic-ipa-downloader-image
|
||||
BuildFlags: excludebuild:kiwi-builder-image
|
||||
BuildFlags: excludebuild:kubectl-image
|
||||
BuildFlags: excludebuild:kube-rbac-proxy-image
|
||||
BuildFlags: excludebuild:metallb-controller-image
|
||||
@@ -104,11 +106,16 @@ BuildFlags: onlybuild:release-manifest-image
|
||||
Patterntype: none
|
||||
BuildEngine: podman
|
||||
Prefer: sles-release
|
||||
BuildFlags: dockerarg:SLE_VERSION=15.6
|
||||
BuildFlags: dockerarg:SLE_VERSION=15.7
|
||||
|
||||
# Publish multi-arch container images only once all archs have been built
|
||||
PublishFlags: archsync
|
||||
|
||||
# skopeo and umoci are used by build scripts to list packages
|
||||
Substitute: system-packages:podman podman buildah createrepo_c release-compare skopeo umoci
|
||||
%endif
|
||||
|
||||
%if "%_repository" == "images"
|
||||
# skopeo and umoci are used by build scripts to list packages
|
||||
Substitute: system-packages:podman podman buildah createrepo_c release-compare edge-build-checks skopeo umoci
|
||||
|
||||
@@ -122,6 +129,8 @@ BuildFlags: onlybuild:release-manifest-image
|
||||
Patterntype: none
|
||||
BuildFlags: dockerarg:SLE_VERSION=16.0
|
||||
BuildFlags: onlybuild:kiwi-builder-image
|
||||
|
||||
Substitute: system-packages:podman podman buildah createrepo_c release-compare skopeo umoci
|
||||
|
||||
# Publish multi-arch container images only once all archs have been built
|
||||
PublishFlags: archsync
|
||||
@@ -140,7 +149,13 @@ BuildFlags: onlybuild:release-manifest-image
|
||||
%endif
|
||||
|
||||
%else
|
||||
BuildFlags: excludebuild:kiwi-builder-image
|
||||
%if "%{sub %{reverse %_project} 1 7}" != "%{reverse :ToTest}" && "%{sub %{reverse %_project} 1 9}" != "%{reverse :Snapshot}"
|
||||
BuildFlags: excludebuild:kiwi-builder-image
|
||||
%else
|
||||
%ifarch aarch64
|
||||
BuildFlags: onlybuild:kiwi-builder-image
|
||||
%endif
|
||||
%endif
|
||||
%endif
|
||||
|
||||
|
||||
|
9
_meta
9
_meta
@@ -23,6 +23,9 @@
|
||||
<disable/>
|
||||
<enable repository="charts"/>
|
||||
<enable repository="test_manifest_images"/>
|
||||
{%- if for_release %}
|
||||
<enable repository="releasecharts"/>
|
||||
{%- endif %}
|
||||
</build>
|
||||
<publish>
|
||||
<disable repository="phantomcharts"/>
|
||||
@@ -42,7 +45,7 @@
|
||||
<path project="SUSE:SLFO:Products:SLES:16.0" repository="standard"/>
|
||||
<path project="SUSE:SLFO:Main:Build" repository="standard"/>
|
||||
{%- else %}
|
||||
<path project="SUSE:CA" repository="SLE_15_SP6"/>
|
||||
<path project="SUSE:CA" repository="SLE_15_SP7"/>
|
||||
<path project="{{ project }}" repository="standard"/>
|
||||
{%- endif %}
|
||||
<arch>x86_64</arch>
|
||||
@@ -53,8 +56,8 @@
|
||||
{%- if release_project is defined and not for_release %}
|
||||
<releasetarget project="{{ release_project }}" repository="standard" trigger="manual"/>
|
||||
{%- endif %}
|
||||
<path project="{{ ironic_base }}:2024.2" repository="15.6"/>
|
||||
<path project="SUSE:SLE-15-SP6:Update" repository="standard"/>
|
||||
<path project="{{ ironic_base }}:2025.1" repository="15.7"/>
|
||||
<path project="SUSE:SLE-15-SP7:Update" repository="standard"/>
|
||||
<arch>x86_64</arch>
|
||||
<arch>aarch64</arch>
|
||||
</repository>
|
||||
|
@@ -1,6 +1,5 @@
|
||||
#!BuildTag: %%CHART_PREFIX%%akri-dashboard-extension:%%CHART_MAJOR%%.0.1
|
||||
#!BuildTag: %%CHART_PREFIX%%akri-dashboard-extension:%%CHART_MAJOR%%.0.1_up1.3.0
|
||||
#!BuildTag: %%CHART_PREFIX%%akri-dashboard-extension:%%CHART_MAJOR%%.0.1_up1.3.0-%RELEASE%
|
||||
#!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%
|
||||
annotations:
|
||||
catalog.cattle.io/certified: rancher
|
||||
catalog.cattle.io/namespace: cattle-ui-plugin-system
|
||||
@@ -10,13 +9,13 @@ annotations:
|
||||
catalog.cattle.io/ui-component: plugins
|
||||
catalog.cattle.io/display-name: Akri
|
||||
catalog.cattle.io/rancher-version: '>= 2.11.0-0'
|
||||
catalog.cattle.io/ui-extensions-version: '>= 3.0.4 < 4.0.0'
|
||||
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.1+up1.3.0
|
||||
appVersion: 303.0.2+up1.3.1
|
||||
description: 'SUSE Edge: Akri extension for Rancher Dashboard'
|
||||
name: akri-dashboard-extension
|
||||
type: application
|
||||
version: "%%CHART_MAJOR%%.0.1+up1.3.0"
|
||||
version: "%%CHART_MAJOR%%.0.2+up1.3.1"
|
||||
icon: >-
|
||||
https://raw.githubusercontent.com/cncf/artwork/main/projects/akri/icon/color/akri-icon-color.svg
|
||||
|
@@ -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.1+up1.3.0
|
||||
endpoint: https://raw.githubusercontent.com/suse-edge/dashboard-extensions/gh-pages/extensions/akri-dashboard-extension/303.0.2+up1.3.1
|
||||
noCache: {{ .Values.plugin.noCache }}
|
||||
noAuth: {{ .Values.plugin.noAuth }}
|
||||
metadata: {{ include "extension-server.pluginMetadata" . | indent 6 }}
|
||||
|
@@ -8,5 +8,5 @@ plugin:
|
||||
metadata:
|
||||
catalog.cattle.io/display-name: Akri
|
||||
catalog.cattle.io/rancher-version: ">= 2.11.0-0"
|
||||
catalog.cattle.io/ui-extensions-version: ">= 3.0.4 < 4.0.0"
|
||||
catalog.cattle.io/ui-extensions-version: ">= 3.0.2 < 4.0.0"
|
||||
catalog.cattle.io/kube-version: ">= v1.26.0-0"
|
||||
|
@@ -1,13 +1,12 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#!BuildTag: %%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%
|
||||
#!BuildTag: %%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%-%RELEASE%
|
||||
#!BuildVersion: 15.6
|
||||
#!BuildTag: %%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%.1
|
||||
#!BuildTag: %%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%.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 zypper --installroot /installroot --non-interactive install --no-recommends baremetal-operator iproute2 bind-utils vim shadow; zypper -n clean; rm -rf /var/log/*
|
||||
RUN zypper --installroot /installroot --non-interactive install --no-recommends baremetal-operator inotify-tools procps iproute2 bind-utils vim shadow; zypper -n clean; rm -rf /var/log/*
|
||||
|
||||
FROM micro AS final
|
||||
# Define labels according to https://en.opensuse.org/Building_derived_containers
|
||||
@@ -19,7 +18,7 @@ LABEL org.opencontainers.image.version="%%baremetal-operator_version%%"
|
||||
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%%baremetal-operator:%%baremetal-operator_version%%-%RELEASE%"
|
||||
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%.1-%RELEASE%"
|
||||
LABEL org.openbuildservice.disturl="%DISTURL%"
|
||||
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
||||
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
||||
@@ -29,6 +28,8 @@ LABEL com.suse.release-stage="released"
|
||||
# endlabelprefix
|
||||
|
||||
COPY --from=base /installroot /
|
||||
COPY bmo-run /usr/bin/bmo-run
|
||||
RUN chmod +x /usr/bin/bmo-run
|
||||
RUN groupadd -r -g 11000 bmo
|
||||
RUN useradd -u 11000 -g 11000 bmo
|
||||
ENTRYPOINT [ "/usr/bin/baremetal-operator" ]
|
||||
ENTRYPOINT [ "/usr/bin/bmo-run" ]
|
||||
|
12
baremetal-operator-image/bmo-run
Normal file
12
baremetal-operator-image/bmo-run
Normal file
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
export RESTART_CONTAINER_CERTIFICATE_UPDATED=${RESTART_CONTAINER_CERTIFICATE_UPDATED:-"false"}
|
||||
export IRONIC_CACERT_FILE=${IRONIC_CACERT_FILE:-"/opt/metal3/certs/ca/tls.crt"}
|
||||
|
||||
if [[ "${RESTART_CONTAINER_CERTIFICATE_UPDATED}" == "true" ]]; then
|
||||
# shellcheck disable=SC2034
|
||||
inotifywait -m -e delete_self "${IRONIC_CACERT_FILE}" | while read -r file event; do
|
||||
kill $(pgrep baremetal-opera)
|
||||
done &
|
||||
fi
|
||||
|
||||
exec /usr/bin/baremetal-operator $@
|
@@ -1,9 +1,9 @@
|
||||
#!BuildTag: %%CHART_PREFIX%%cdi:%%CHART_MAJOR%%.0.0_up0.4.0
|
||||
#!BuildTag: %%CHART_PREFIX%%cdi:%%CHART_MAJOR%%.0.0_up0.4.0-%RELEASE%
|
||||
#!BuildTag: %%CHART_PREFIX%%cdi:%%CHART_MAJOR%%.0.0_up0.5.0
|
||||
#!BuildTag: %%CHART_PREFIX%%cdi:%%CHART_MAJOR%%.0.0_up0.5.0-%RELEASE%
|
||||
apiVersion: v2
|
||||
appVersion: 1.60.1
|
||||
appVersion: 1.61.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.4.0"
|
||||
version: "%%CHART_MAJOR%%.0.0+up0.5.0"
|
||||
|
@@ -5079,4 +5079,4 @@ spec:
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
subresources: {}
|
||||
subresources: {}
|
@@ -1,2 +1,2 @@
|
||||
Verify that all CDI components are installed correctly:
|
||||
kubectl get all -n {{ .Release.Namespace }}
|
||||
kubectl get all -n {{ .Release.Namespace }}
|
@@ -59,4 +59,4 @@ Create the name of the service account to use
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
@@ -44,4 +44,4 @@
|
||||
{{/* CRD uninstalling hook name */}}
|
||||
{{- define "cdi.crdUninstallHook.name" -}}
|
||||
{{ include "cdi.fullname" . }}-crd-uninstall
|
||||
{{- end }}
|
||||
{{- end }}
|
@@ -606,17 +606,7 @@ spec:
|
||||
prometheus.cdi.kubevirt.io: "true"
|
||||
spec:
|
||||
affinity:
|
||||
podAffinity:
|
||||
preferredDuringSchedulingIgnoredDuringExecution:
|
||||
- podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
- key: cdi.kubevirt.io
|
||||
operator: In
|
||||
values:
|
||||
- cdi-operator
|
||||
topologyKey: kubernetes.io/hostname
|
||||
weight: 1
|
||||
{{- .Values.deployment.affinity | toYaml | nindent 8 }}
|
||||
containers:
|
||||
- env:
|
||||
- name: DEPLOY_CLUSTER_RESOURCES
|
||||
@@ -650,9 +640,7 @@ spec:
|
||||
name: metrics
|
||||
protocol: TCP
|
||||
resources:
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 150Mi
|
||||
{{- .Values.deployment.resources | toYaml | nindent 12 }}
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
@@ -661,6 +649,8 @@ spec:
|
||||
runAsNonRoot: true
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
terminationMessagePath: /dev/termination-log
|
||||
terminationMessagePolicy: File
|
||||
nodeSelector:
|
||||
kubernetes.io/os: linux
|
||||
securityContext:
|
||||
@@ -668,4 +658,4 @@ spec:
|
||||
serviceAccountName: cdi-operator
|
||||
tolerations:
|
||||
- key: CriticalAddonsOnly
|
||||
operator: Exists
|
||||
operator: Exists
|
@@ -66,4 +66,4 @@ spec:
|
||||
- deployments/cdi-apiserver
|
||||
- deployments/cdi-deployment
|
||||
- deployments/cdi-uploadproxy
|
||||
- --timeout=60s
|
||||
- --timeout=60s
|
@@ -18,4 +18,4 @@ spec:
|
||||
{{- with .Values.cdi.workload }}
|
||||
workload:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
@@ -52,4 +52,4 @@ spec:
|
||||
- customresourcedefinitions
|
||||
- cdis.cdi.kubevirt.io
|
||||
securityContext:
|
||||
{{- toYaml .Values.hookSecurityContext | nindent 12 }}
|
||||
{{- toYaml .Values.hookSecurityContext | nindent 12 }}
|
@@ -77,4 +77,4 @@ spec:
|
||||
name: cdi-crd-manifest
|
||||
items:
|
||||
- key: crd
|
||||
path: crd.yaml
|
||||
path: crd.yaml
|
@@ -53,4 +53,4 @@ spec:
|
||||
- label
|
||||
- namespace
|
||||
- {{ .Release.Namespace }}
|
||||
- cdi.kubevirt.io=
|
||||
- cdi.kubevirt.io=
|
@@ -1,5 +1,5 @@
|
||||
deployment:
|
||||
version: 1.60.1-150600.3.9.1
|
||||
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
|
||||
@@ -8,6 +8,22 @@ deployment:
|
||||
uploadserverImage: registry.suse.com/suse/sles/15.6/cdi-uploadserver
|
||||
uploadproxyImage: registry.suse.com/suse/sles/15.6/cdi-uploadproxy
|
||||
pullPolicy: IfNotPresent
|
||||
affinity:
|
||||
podAffinity:
|
||||
preferredDuringSchedulingIgnoredDuringExecution:
|
||||
- podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
- key: cdi.kubevirt.io
|
||||
operator: In
|
||||
values:
|
||||
- cdi-operator
|
||||
topologyKey: kubernetes.io/hostname
|
||||
weight: 1
|
||||
resources:
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 150Mi
|
||||
|
||||
cdi:
|
||||
config:
|
||||
@@ -35,4 +51,4 @@ hookSecurityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
- ALL
|
@@ -8,6 +8,7 @@ import pprint
|
||||
|
||||
AUTHORIZED_REPOS = [
|
||||
"registry.suse.com/suse/sles/",
|
||||
"registry.suse.com/rancher",
|
||||
"registry.rancher.com",
|
||||
]
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
#!BuildTag: %%IMG_PREFIX%%edge-image-builder:%PACKAGE_VERSION%
|
||||
#!BuildTag: %%IMG_PREFIX%%edge-image-builder:%PACKAGE_VERSION%-%RELEASE%
|
||||
#!BuildVersion: 15.6
|
||||
#!BuildTag: %%IMG_PREFIX%%edge-image-builder:1.2.1
|
||||
#!BuildTag: %%IMG_PREFIX%%edge-image-builder:1.2.1-%RELEASE%
|
||||
ARG SLE_VERSION
|
||||
FROM registry.suse.com/bci/bci-base:$SLE_VERSION
|
||||
MAINTAINER SUSE LLC (https://www.suse.com/)
|
||||
@@ -15,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="%PACKAGE_VERSION%"
|
||||
LABEL org.opencontainers.image.version="1.2.1"
|
||||
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:%PACKAGE_VERSION%-%RELEASE%"
|
||||
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%edge-image-builder:1.2.1-%RELEASE%"
|
||||
LABEL org.openbuildservice.disturl="%DISTURL%"
|
||||
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
||||
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
||||
|
@@ -1,10 +1,5 @@
|
||||
<services>
|
||||
<service mode="buildtime" name="kiwi_metainfo_helper"/>
|
||||
<service name="replace_using_package_version" mode="buildtime">
|
||||
<param name="file">Dockerfile</param>
|
||||
<param name="regex">%PACKAGE_VERSION%</param>
|
||||
<param name="package">edge-image-builder</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>
|
||||
|
@@ -5,7 +5,7 @@ metallb:
|
||||
endpoint-copier-operator:
|
||||
chart: endpoint-copier-operator
|
||||
repository: "%%CHART_REPO%%/%%CHART_PREFIX%%"
|
||||
version: "%%CHART_MAJOR%%.0.0+up0.2.1"
|
||||
version: "%%CHART_MAJOR%%.0.1+up0.3.0"
|
||||
kubernetes:
|
||||
k3s:
|
||||
selinuxPackage: k3s-selinux-1.6-1.slemicro.noarch
|
||||
|
@@ -1,12 +1,15 @@
|
||||
<services>
|
||||
<service name="obs_scm">
|
||||
<param name="url">https://github.com/suse-edge/edge-image-builder.git</param>
|
||||
<param name="versionformat">@PARENT_TAG@_%h.%ad</param>
|
||||
<param name="scm">git</param>
|
||||
<param name="exclude">.git</param>
|
||||
<param name="revision">main</param>
|
||||
<param name="versionrewrite-pattern">v(.*)</param>
|
||||
<param name="versionrewrite-replacement">\1</param>
|
||||
<param name="revision">v1.2.1</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="versionrewrite-pattern">v(\d+).(\d+).(\d+)</param>
|
||||
<param name="versionrewrite-replacement">\1.\2.\3</param>
|
||||
<param name="changesgenerate">enable</param>
|
||||
</service>
|
||||
<service mode="buildtime" name="tar">
|
||||
|
@@ -17,7 +17,7 @@
|
||||
|
||||
|
||||
Name: edge-image-builder
|
||||
Version: 0
|
||||
Version: 1.2.1
|
||||
Release: 0
|
||||
Summary: Edge Image Builder
|
||||
License: Apache-2.0
|
||||
|
@@ -1,8 +1,8 @@
|
||||
#!BuildTag: %%CHART_PREFIX%%endpoint-copier-operator:%%CHART_MAJOR%%.0.0_up0.2.1
|
||||
#!BuildTag: %%CHART_PREFIX%%endpoint-copier-operator:%%CHART_MAJOR%%.0.0_up0.2.1-%RELEASE%
|
||||
#!BuildTag: %%CHART_PREFIX%%endpoint-copier-operator:%%CHART_MAJOR%%.0.1_up0.3.0
|
||||
#!BuildTag: %%CHART_PREFIX%%endpoint-copier-operator:%%CHART_MAJOR%%.0.1_up0.3.0-%RELEASE%
|
||||
apiVersion: v2
|
||||
appVersion: v0.2.0
|
||||
appVersion: v0.3.0
|
||||
description: A Helm chart for Kubernetes
|
||||
name: endpoint-copier-operator
|
||||
type: application
|
||||
version: "%%CHART_MAJOR%%.0.0+up0.2.1"
|
||||
version: "%%CHART_MAJOR%%.0.1+up0.3.0"
|
||||
|
@@ -20,8 +20,23 @@ spec:
|
||||
labels:
|
||||
{{- include "endpoint-copier-operator.selectorLabels" . | nindent 8 }}
|
||||
spec:
|
||||
{{- if .Values.priorityClassName }}
|
||||
priorityClassName: {{ .Values.priorityClassName }}
|
||||
{{- end }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- command:
|
||||
- /manager
|
||||
|
@@ -7,9 +7,9 @@ metadata:
|
||||
name: {{ include "endpoint-copier-operator.fullname" . }}
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
- "discovery.k8s.io"
|
||||
resources:
|
||||
- endpoints
|
||||
- endpointslices
|
||||
verbs:
|
||||
- create
|
||||
- delete
|
||||
|
@@ -8,7 +8,7 @@ image:
|
||||
repository: %%IMG_REPO%%/%%IMG_PREFIX%%endpoint-copier-operator
|
||||
pullPolicy: IfNotPresent
|
||||
# Overrides the image tag whose default is the chart appVersion.
|
||||
tag: "0.2.0"
|
||||
tag: "0.3.0"
|
||||
|
||||
nameOverride: "endpoint-copier-operator"
|
||||
fullnameOverride: "endpoint-copier-operator"
|
||||
@@ -29,6 +29,8 @@ podSecurityContext:
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
priorityClassName: "system-cluster-critical"
|
||||
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
@@ -37,11 +39,11 @@ securityContext:
|
||||
|
||||
resources:
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 128Mi
|
||||
requests:
|
||||
cpu: 10m
|
||||
cpu: 100m
|
||||
memory: 64Mi
|
||||
requests:
|
||||
cpu: 5m
|
||||
memory: 32Mi
|
||||
|
||||
autoscaling:
|
||||
enabled: false
|
||||
|
@@ -1,7 +1,6 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#!BuildTag: %%IMG_PREFIX%%endpoint-copier-operator:%%endpoint-copier-operator_version%%
|
||||
#!BuildTag: %%IMG_PREFIX%%endpoint-copier-operator:%%endpoint-copier-operator_version%%-%RELEASE%
|
||||
#!BuildVersion: 15.6
|
||||
ARG SLE_VERSION
|
||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||
|
||||
|
@@ -2,7 +2,7 @@
|
||||
<service name="obs_scm">
|
||||
<param name="url">https://github.com/suse-edge/endpoint-copier-operator</param>
|
||||
<param name="scm">git</param>
|
||||
<param name="revision">v0.2.0</param>
|
||||
<param name="revision">v0.3.0</param>
|
||||
<param name="version">_auto_</param>
|
||||
<param name="versionformat">@PARENT_TAG@</param>
|
||||
<param name="changesgenerate">enable</param>
|
||||
|
@@ -17,14 +17,14 @@
|
||||
|
||||
|
||||
Name: endpoint-copier-operator
|
||||
Version: 0.2.0
|
||||
Release: 0.2.0
|
||||
Version: 0.3.0
|
||||
Release: 0.3.0
|
||||
Summary: Implements a Kubernetes API for copying endpoint resources
|
||||
License: Apache-2.0
|
||||
URL: https://github.com/suse-edge/endpoint-copier-operator
|
||||
Source: endpoint-copier-operator-%{version}.tar
|
||||
Source1: vendor.tar.gz
|
||||
BuildRequires: golang(API) = 1.20
|
||||
BuildRequires: golang(API) = 1.24
|
||||
ExcludeArch: s390
|
||||
ExcludeArch: %{ix86}
|
||||
|
||||
|
@@ -1,7 +1,6 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
#!BuildTag: %%IMG_PREFIX%%frr:8.5.6
|
||||
#!BuildTag: %%IMG_PREFIX%%frr:8.5.6-%RELEASE%
|
||||
#!BuildVersion: 15.6
|
||||
ARG SLE_VERSION
|
||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||
|
||||
|
@@ -1,7 +1,6 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#!BuildTag: %%IMG_PREFIX%%frr-k8s:v%%frr-k8s_version%%
|
||||
#!BuildTag: %%IMG_PREFIX%%frr-k8s:v%%frr-k8s_version%%-%RELEASE%
|
||||
#!BuildVersion: 15.6
|
||||
ARG SLE_VERSION
|
||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||
|
||||
|
@@ -1,7 +1,6 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#!BuildTag: %%IMG_PREFIX%%ironic:26.1.2.4
|
||||
#!BuildTag: %%IMG_PREFIX%%ironic:26.1.2.4-%RELEASE%
|
||||
#!BuildVersion: 15.6
|
||||
#!BuildTag: %%IMG_PREFIX%%ironic:29.0.4.0
|
||||
#!BuildTag: %%IMG_PREFIX%%ironic:29.0.4.0-%RELEASE%
|
||||
|
||||
ARG SLE_VERSION
|
||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||
@@ -20,11 +19,11 @@ RUN sed -i -e 's%^# rpm.install.excludedocs = no.*%rpm.install.excludedocs = yes
|
||||
|
||||
#!ArchExclusiveLine: x86_64
|
||||
RUN if [ "$(uname -m)" = "x86_64" ];then \
|
||||
zypper --installroot /installroot --non-interactive install --no-recommends syslinux python311-devel python311 python311-pip python-dracclient python311-sushy-oem-idrac python311-proliantutils python311-sushy python3-ironicclient git curl sles-release tar gzip vim gawk dnsmasq dosfstools apache2 apache2-mod_wsgi inotify-tools ipcalc ipmitool iproute2 procps qemu-tools sqlite3 util-linux xorriso tftp ipxe-bootimgs python311-sushy-tools crudini openstack-ironic openstack-ironic-inspector-api; \
|
||||
zypper --installroot /installroot --non-interactive install --no-recommends syslinux python311-devel python311 python311-pip python311-sushy-oem-idrac python311-proliantutils python311-sushy python311-pyinotify python3-ironicclient git curl sles-release tar gzip vim gawk dnsmasq dosfstools apache2 apache2-mod_wsgi ipcalc ipmitool iproute2 procps qemu-tools sqlite3 util-linux xorriso tftp ipxe-bootimgs python311-sushy-tools crudini openstack-ironic; \
|
||||
fi
|
||||
#!ArchExclusiveLine: aarch64
|
||||
RUN if [ "$(uname -m)" = "aarch64" ];then \
|
||||
zypper --installroot /installroot --non-interactive install --no-recommends python311-devel python311 python311-pip python-dracclient python311-sushy-oem-idrac python311-proliantutils python311-sushy python3-ironicclient git curl sles-release tar gzip vim gawk dnsmasq dosfstools apache2 apache2-mod_wsgi inotify-tools ipcalc ipmitool iproute2 procps qemu-tools sqlite3 util-linux xorriso tftp ipxe-bootimgs python311-sushy-tools crudini openstack-ironic openstack-ironic-inspector-api; \
|
||||
zypper --installroot /installroot --non-interactive install --no-recommends python311-devel python311 python311-pip python311-sushy-oem-idrac python311-proliantutils python311-sushy python311-pyinotify python3-ironicclient git curl sles-release tar gzip vim gawk dnsmasq dosfstools apache2 apache2-mod_wsgi ipcalc ipmitool iproute2 procps qemu-tools sqlite3 util-linux xorriso tftp ipxe-bootimgs python311-sushy-tools crudini openstack-ironic; \
|
||||
fi
|
||||
|
||||
# DATABASE
|
||||
@@ -32,7 +31,9 @@ RUN mkdir -p /installroot/var/lib/ironic && \
|
||||
/installroot/usr/bin/sqlite3 /installroot/var/lib/ironic/ironic.sqlite "pragma journal_mode=wal" && \
|
||||
zypper --installroot /installroot --non-interactive remove sqlite3
|
||||
|
||||
# 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="SLE Openstack Ironic Container Image"
|
||||
@@ -40,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="26.1.2.4"
|
||||
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic:26.1.2.4-%RELEASE%"
|
||||
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.openbuildservice.disturl="%DISTURL%"
|
||||
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
||||
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
||||
@@ -62,14 +63,19 @@ RUN echo 'alias mkisofs="xorriso -as mkisofs"' >> ~/.bashrc
|
||||
COPY mkisofs_wrapper /usr/bin/mkisofs
|
||||
RUN set -euo pipefail; chmod +x /usr/bin/mkisofs
|
||||
|
||||
COPY auth-common.sh configure-ironic.sh ironic-common.sh rundnsmasq runhttpd runironic runlogwatch.sh tls-common.sh configure-nonroot.sh ironic-probe.j2 /bin/
|
||||
RUN set -euo pipefail; chmod +x /bin/auth-common.sh; chmod +x /bin/configure-ironic.sh; chmod +x /bin/ironic-common.sh; chmod +x /bin/rundnsmasq; chmod +x /bin/runhttpd; chmod +x /bin/runironic; chmod +x /bin/runlogwatch.sh; chmod +x /bin/tls-common.sh; chmod +x /bin/configure-nonroot.sh;
|
||||
RUN mkdir -p /tftpboot
|
||||
RUN mkdir -p $GRUB_DIR
|
||||
|
||||
# No need to support the Legacy BIOS boot
|
||||
#RUN cp /usr/share/syslinux/pxelinux.0 /tftpboot
|
||||
#RUN cp /usr/share/syslinux/chain.c32 /tftpboot/
|
||||
COPY scripts/ /bin/
|
||||
COPY configure-nonroot.sh /bin/
|
||||
RUN set -euo pipefail; chmod +x /bin/configure-ironic.sh /bin/ironic-probe.sh /bin/rundatabase-upgrade /bin/rundnsmasq /bin/runhttpd /bin/runironic /bin/runlogwatch.sh /bin/runonline-data-migrations /bin/configure-nonroot.sh
|
||||
|
||||
RUN mv /bin/ironic-probe.sh /bin/ironic-readiness
|
||||
RUN cp /bin/ironic-readiness /bin/ironic-liveness
|
||||
|
||||
COPY ironic-config/inspector.ipxe.j2 ironic-config/httpd-ironic-api.conf.j2 \
|
||||
ironic-config/ipxe_config.template ironic-config/dnsmasq.conf.j2 \
|
||||
/tmp/
|
||||
|
||||
# IRONIC #
|
||||
RUN cp /usr/share/ipxe/undionly.kpxe /tftpboot/undionly.kpxe
|
||||
@@ -77,31 +83,25 @@ RUN cp /usr/share/ipxe/undionly.kpxe /tftpboot/undionly.kpxe
|
||||
RUN if [ "$(uname -m)" = "x86_64" ];then \
|
||||
cp /usr/share/ipxe/ipxe-x86_64.efi /tftpboot/ipxe.efi ;\
|
||||
fi
|
||||
#!ArchExclusiveLine: x86_64
|
||||
#!ArchExclusiveLine: aarch64
|
||||
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 ;\
|
||||
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 ironic.conf.j2 /etc/ironic/
|
||||
COPY inspector.ipxe.j2 httpd-ironic-api.conf.j2 ipxe_config.template /tmp/
|
||||
COPY network-data-schema-empty.json /etc/ironic/
|
||||
|
||||
# DNSMASQ
|
||||
COPY dnsmasq.conf.j2 /etc/
|
||||
|
||||
# Custom httpd config, removes all but the bare minimum needed modules
|
||||
COPY httpd.conf.j2 /etc/httpd/conf/
|
||||
COPY httpd-modules.conf /etc/httpd/conf.modules.d/
|
||||
COPY apache2-vmedia.conf.j2 /etc/httpd-vmedia.conf.j2
|
||||
COPY apache2-ipxe.conf.j2 /etc/httpd-ipxe.conf.j2
|
||||
COPY ironic-config/ironic.conf.j2 ironic-config/network-data-schema-empty.json /etc/ironic/
|
||||
|
||||
# Workaround
|
||||
# Removing the 010-ironic.conf file that comes with the package
|
||||
RUN rm /etc/ironic/ironic.conf.d/010-ironic.conf
|
||||
|
||||
# Custom httpd config, removes all but the bare minimum needed modules
|
||||
COPY ironic-config/httpd.conf.j2 /etc/httpd/conf/
|
||||
COPY ironic-config/httpd-modules.conf /etc/httpd/conf.modules.d/
|
||||
COPY ironic-config/apache2-vmedia.conf.j2 /tmp/httpd-vmedia.conf.j2
|
||||
COPY ironic-config/apache2-ipxe.conf.j2 /tmp/httpd-ipxe.conf.j2
|
||||
|
||||
# configure non-root user and set relevant permissions
|
||||
RUN configure-nonroot.sh && \
|
||||
rm -f /bin/configure-nonroot.sh
|
||||
RUN configure-nonroot.sh && rm -f /bin/configure-nonroot.sh
|
||||
|
@@ -1,59 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
export IRONIC_REVERSE_PROXY_SETUP=${IRONIC_REVERSE_PROXY_SETUP:-false}
|
||||
|
||||
# Backward compatibility
|
||||
if [[ "${IRONIC_DEPLOYMENT:-}" == "Conductor" ]]; then
|
||||
export IRONIC_EXPOSE_JSON_RPC=true
|
||||
else
|
||||
export IRONIC_EXPOSE_JSON_RPC="${IRONIC_EXPOSE_JSON_RPC:-false}"
|
||||
fi
|
||||
|
||||
IRONIC_HTPASSWD_FILE=/etc/ironic/htpasswd
|
||||
if [[ -f "/auth/ironic/htpasswd" ]]; then
|
||||
IRONIC_HTPASSWD=$(</auth/ironic/htpasswd)
|
||||
fi
|
||||
export IRONIC_HTPASSWD=${IRONIC_HTPASSWD:-${HTTP_BASIC_HTPASSWD:-}}
|
||||
|
||||
configure_client_basic_auth()
|
||||
{
|
||||
local auth_config_file="/auth/$1/auth-config"
|
||||
local dest="${2:-/etc/ironic/ironic.conf}"
|
||||
if [[ -f "${auth_config_file}" ]]; then
|
||||
# Merge configurations in the "auth" directory into the default ironic configuration file
|
||||
crudini --merge "${dest}" < "${auth_config_file}"
|
||||
fi
|
||||
}
|
||||
|
||||
configure_json_rpc_auth()
|
||||
{
|
||||
if [[ "${IRONIC_EXPOSE_JSON_RPC}" == "true" ]]; then
|
||||
if [[ -z "${IRONIC_HTPASSWD}" ]]; then
|
||||
echo "FATAL: enabling JSON RPC requires authentication"
|
||||
exit 1
|
||||
fi
|
||||
printf "%s\n" "${IRONIC_HTPASSWD}" > "${IRONIC_HTPASSWD_FILE}-rpc"
|
||||
fi
|
||||
}
|
||||
|
||||
configure_ironic_auth()
|
||||
{
|
||||
local config=/etc/ironic/ironic.conf
|
||||
# Configure HTTP basic auth for API server
|
||||
if [[ -n "${IRONIC_HTPASSWD}" ]]; then
|
||||
printf "%s\n" "${IRONIC_HTPASSWD}" > "${IRONIC_HTPASSWD_FILE}"
|
||||
if [[ "${IRONIC_REVERSE_PROXY_SETUP}" == "false" ]]; then
|
||||
crudini --set "${config}" DEFAULT auth_strategy http_basic
|
||||
crudini --set "${config}" DEFAULT http_basic_auth_user_file "${IRONIC_HTPASSWD_FILE}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
write_htpasswd_files()
|
||||
{
|
||||
if [[ -n "${IRONIC_HTPASSWD:-}" ]]; then
|
||||
printf "%s\n" "${IRONIC_HTPASSWD}" > "${IRONIC_HTPASSWD_FILE}"
|
||||
fi
|
||||
}
|
55
ironic-image/configure-nonroot.sh
Normal file → Executable file
55
ironic-image/configure-nonroot.sh
Normal file → Executable file
@@ -1,53 +1,70 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
# This script changes permissions to allow Ironic container to run as non-root
|
||||
# user. As the same image is used to run ironic, ironic-httpd, ironic-dsnmasq,
|
||||
# and ironic-log-watch via BMO's ironic k8s manifest, it has
|
||||
# to be configured to work with multiple different users and groups, while they
|
||||
# share files via bind mounts (/shared, /certs/*), which can only get one
|
||||
# group id as "fsGroup". Additionally, dnsmasq needs three capabilities to run
|
||||
# which we provide via "setcap", and "allowPrivilegeEscalation: true" in
|
||||
# manifest.
|
||||
|
||||
set -eux
|
||||
|
||||
# user and group are from ironic rpms (uid 997, gid 994)
|
||||
NONROOT_UID=10475
|
||||
NONROOT_GID=10475
|
||||
USER="ironic-suse"
|
||||
IRONIC_USER="ironic-suse"
|
||||
IRONIC_GROUP="ironic-suse"
|
||||
|
||||
groupadd -r -g ${NONROOT_GID} ${USER}
|
||||
groupadd -r -g ${NONROOT_GID} ${IRONIC_GROUP}
|
||||
useradd -r -g ${NONROOT_GID} \
|
||||
-u ${NONROOT_UID} \
|
||||
-d /var/lib/ironic \
|
||||
-s /sbin/nologin \
|
||||
${USER}
|
||||
${IRONIC_USER}
|
||||
|
||||
# create ironic's http_root directory
|
||||
mkdir -p /shared/html
|
||||
chown "${NONROOT_UID}":"${NONROOT_GID}" /shared/html
|
||||
# most containers mount /shared but dnsmasq can live without it
|
||||
mkdir -p /shared
|
||||
mkdir -p /data
|
||||
mkdir -p /conf
|
||||
chown "${IRONIC_USER}":"${IRONIC_GROUP}" /shared
|
||||
chown "${IRONIC_USER}":"${IRONIC_GROUP}" /data
|
||||
chown "${IRONIC_USER}":"${IRONIC_GROUP}" /conf
|
||||
|
||||
# we'll bind mount shared ca and ironic certificate dirs here
|
||||
# that need to have correct ownership as the entire ironic in BMO
|
||||
# deployment shares a single fsGroup in manifest's securityContext
|
||||
mkdir -p /certs/ca
|
||||
chown "${NONROOT_UID}":"${NONROOT_GID}" /certs{,/ca}
|
||||
chown "${IRONIC_USER}":"${IRONIC_GROUP}" /certs{,/ca}
|
||||
chmod 2775 /certs{,/ca}
|
||||
|
||||
# apache2 permission changes
|
||||
chown -R "${NONROOT_UID}":"${NONROOT_GID}" /etc/apache2
|
||||
chown -R "${NONROOT_UID}":"${NONROOT_GID}" /run
|
||||
chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /etc/apache2
|
||||
chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /run
|
||||
|
||||
# ironic and httpd related changes
|
||||
mkdir -p /etc/httpd/conf.d
|
||||
chown -R "${NONROOT_UID}":"${NONROOT_GID}" /etc/ironic /etc/httpd /etc/httpd
|
||||
chown -R "${NONROOT_UID}":"${NONROOT_GID}" /var/log
|
||||
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
|
||||
chmod 664 /etc/ironic/* /etc/httpd/conf/* /etc/httpd/conf.d/*
|
||||
#chmod 664 /etc/ironic/* /etc/httpd/conf/* /etc/httpd/conf.d/*
|
||||
chmod 664 /etc/ironic/* /etc/httpd/conf/*
|
||||
|
||||
chown -R "${NONROOT_UID}":"${NONROOT_GID}" /var/lib/ironic
|
||||
chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /var/lib/ironic
|
||||
chmod 2775 /var/lib/ironic
|
||||
chmod 664 /var/lib/ironic/ironic.sqlite
|
||||
|
||||
# dnsmasq, and the capabilities required to run it as non-root user
|
||||
chown -R "${NONROOT_UID}":"${NONROOT_GID}" /etc/dnsmasq.conf /var/lib/dnsmasq
|
||||
chmod 2775 /var/lib/dnsmasq
|
||||
touch /var/lib/dnsmasq/dnsmasq.leases
|
||||
chmod 664 /etc/dnsmasq.conf /var/lib/dnsmasq/dnsmasq.leases
|
||||
chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /etc/dnsmasq.conf
|
||||
#handled at chart level
|
||||
#setcap "cap_net_raw,cap_net_admin,cap_net_bind_service=+eip" /usr/sbin/dnsmasq
|
||||
|
||||
# ca-certificates permission changes
|
||||
touch /var/lib/ca-certificates/ca-bundle.pem.new
|
||||
chown -R "${NONROOT_UID}":"${NONROOT_GID}" /var/lib/ca-certificates/
|
||||
chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /var/lib/ca-certificates/
|
||||
chmod -R +w /var/lib/ca-certificates/
|
||||
|
||||
# probes that are created before start
|
||||
touch /bin/ironic-{readi,live}ness
|
||||
chown root:"${NONROOT_GID}" /bin/ironic-{readi,live}ness
|
||||
chown root:"${IRONIC_GROUP}" /bin/ironic-{readi,live}ness
|
||||
chmod 775 /bin/ironic-{readi,live}ness
|
||||
|
@@ -1,57 +0,0 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
|
||||
{% if env.LISTEN_ALL_INTERFACES | lower == "true" %}
|
||||
Listen {{ env.IRONIC_INSPECTOR_LISTEN_PORT }}
|
||||
<VirtualHost *:{{ env.IRONIC_INSPECTOR_LISTEN_PORT }}>
|
||||
{% else %}
|
||||
Listen {{ env.IRONIC_URL_HOST }}:{{ env.IRONIC_INSPECTOR_LISTEN_PORT }}
|
||||
<VirtualHost {{ env.IRONIC_URL_HOST }}:{{ env.IRONIC_INSPECTOR_LISTEN_PORT }}>
|
||||
{% endif %}
|
||||
{% if env.IRONIC_INSPECTOR_PRIVATE_PORT == "unix" %}
|
||||
ProxyPass "/" "unix:/shared/inspector.sock|http://127.0.0.1/"
|
||||
ProxyPassReverse "/" "unix:/shared/inspector.sock|http://127.0.0.1/"
|
||||
{% else %}
|
||||
ProxyPass "/" "http://127.0.0.1:{{ env.IRONIC_INSPECTOR_PRIVATE_PORT }}/"
|
||||
ProxyPassReverse "/" "http://127.0.0.1:{{ env.IRONIC_INSPECTOR_PRIVATE_PORT }}/"
|
||||
{% endif %}
|
||||
|
||||
SetEnv APACHE_RUN_USER ironic-suse
|
||||
SetEnv APACHE_RUN_GROUP ironic-suse
|
||||
|
||||
ErrorLog /dev/stdout
|
||||
LogLevel debug
|
||||
CustomLog /dev/stdout combined
|
||||
|
||||
SSLEngine On
|
||||
SSLProtocol {{ env.IRONIC_SSL_PROTOCOL }}
|
||||
SSLCertificateFile {{ env.IRONIC_INSPECTOR_CERT_FILE }}
|
||||
SSLCertificateKeyFile {{ env.IRONIC_INSPECTOR_KEY_FILE }}
|
||||
|
||||
{% if "INSPECTOR_HTPASSWD" in env and env.INSPECTOR_HTPASSWD | length %}
|
||||
<Location / >
|
||||
AuthType Basic
|
||||
AuthName "Restricted area"
|
||||
AuthUserFile "/etc/ironic-inspector/htpasswd"
|
||||
Require valid-user
|
||||
</Location>
|
||||
|
||||
<Location ~ "^/(v1/?)?$" >
|
||||
Require all granted
|
||||
</Location>
|
||||
|
||||
<Location /v1/continue >
|
||||
Require all granted
|
||||
</Location>
|
||||
{% endif %}
|
||||
</VirtualHost>
|
@@ -1,10 +0,0 @@
|
||||
#!ipxe
|
||||
|
||||
:retry_boot
|
||||
echo In inspector.ipxe
|
||||
imgfree
|
||||
# NOTE(dtantsur): keep inspection kernel params in [mdns]params in
|
||||
# ironic-inspector-image and configuration in configure-ironic.sh
|
||||
kernel --timeout 60000 http://{{ env.IRONIC_URL_HOST }}:{{ env.HTTP_PORT }}/images/ironic-python-agent-${buildarch}.kernel ipa-insecure=1 ipa-inspection-collectors={{ env.IRONIC_IPA_COLLECTORS }} systemd.journald.forward_to_console=yes BOOTIF=${mac} ipa-debug=1 ipa-enable-vlan-interfaces={{ env.IRONIC_ENABLE_VLAN_INTERFACES }} ipa-inspection-dhcp-all-interfaces=1 ipa-collect-lldp=1 {{ env.INSPECTOR_EXTRA_ARGS }} initrd=ironic-python-agent.initramfs {% if env.IRONIC_RAMDISK_SSH_KEY %}sshkey="{{ env.IRONIC_RAMDISK_SSH_KEY|trim }}"{% endif %} {{ env.IRONIC_KERNEL_PARAMS|trim }} || goto retry_boot
|
||||
initrd --timeout 60000 http://{{ env.IRONIC_URL_HOST }}:{{ env.HTTP_PORT }}/images/ironic-python-agent-${buildarch}.initramfs || goto retry_boot
|
||||
boot
|
@@ -10,15 +10,13 @@ Listen {{ env.VMEDIA_TLS_PORT }}
|
||||
SSLCertificateFile {{ env.IRONIC_VMEDIA_CERT_FILE }}
|
||||
SSLCertificateKeyFile {{ env.IRONIC_VMEDIA_KEY_FILE }}
|
||||
|
||||
<Directory "/shared">
|
||||
AllowOverride None
|
||||
Require all granted
|
||||
<Directory ~ "/shared/html">
|
||||
Order deny,allow
|
||||
deny from all
|
||||
</Directory>
|
||||
|
||||
<Directory "/shared/html">
|
||||
Options Indexes FollowSymLinks
|
||||
AllowOverride None
|
||||
Require all granted
|
||||
<Directory ~ "/shared/html/(redfish|ilo)/">
|
||||
Order allow,deny
|
||||
allow from all
|
||||
</Directory>
|
||||
</VirtualHost>
|
||||
|
@@ -3,6 +3,7 @@ bind-dynamic
|
||||
enable-tftp
|
||||
tftp-root=/shared/tftpboot
|
||||
log-queries
|
||||
dhcp-leasefile=/data/dnsmasq/dnsmasq.leases
|
||||
|
||||
# Configure listening for DNS (0 disables DNS)
|
||||
port={{ env.DNS_PORT }}
|
||||
@@ -31,11 +32,11 @@ dhcp-match=ipxe,175
|
||||
# Client is already running iPXE; move to next stage of chainloading
|
||||
{%- if env.IPXE_TLS_SETUP == "true" %}
|
||||
# iPXE with (U)EFI
|
||||
dhcp-boot=tag:efi,tag:ipxe,http://{{ env.IRONIC_URL_HOST }}:{{ env.HTTP_PORT }}/custom-ipxe/snponly.efi
|
||||
dhcp-boot=tag:efi,tag:ipxe,{{ env.IRONIC_HTTP_URL }}/custom-ipxe/snponly.efi
|
||||
# iPXE with BIOS
|
||||
dhcp-boot=tag:ipxe,http://{{ env.IRONIC_URL_HOST }}:{{ env.HTTP_PORT }}/custom-ipxe/undionly.kpxe
|
||||
dhcp-boot=tag:ipxe,{{ env.IRONIC_HTTP_URL }}/custom-ipxe/undionly.kpxe
|
||||
{% else %}
|
||||
dhcp-boot=tag:ipxe,http://{{ env.IRONIC_URL_HOST }}:{{ env.HTTP_PORT }}/boot.ipxe
|
||||
dhcp-boot=tag:ipxe,{{ env.IRONIC_HTTP_URL }}/boot.ipxe
|
||||
{% endif %}
|
||||
|
||||
# Note: Need to test EFI booting
|
||||
@@ -59,8 +60,8 @@ ra-param={{ env.PROVISIONING_INTERFACE }},0,0
|
||||
|
||||
dhcp-vendorclass=set:pxe6,enterprise:343,PXEClient
|
||||
dhcp-userclass=set:ipxe6,iPXE
|
||||
dhcp-option=tag:pxe6,option6:bootfile-url,tftp://{{ env.IRONIC_URL_HOST }}/snponly.efi
|
||||
dhcp-option=tag:ipxe6,option6:bootfile-url,http://{{ env.IRONIC_URL_HOST }}:{{ env.HTTP_PORT }}/boot.ipxe
|
||||
dhcp-option=tag:pxe6,option6:bootfile-url,{{ env.IRONIC_TFTP_URL }}/snponly.efi
|
||||
dhcp-option=tag:ipxe6,option6:bootfile-url,{{ env.IRONIC_HTTP_URL }}/boot.ipxe
|
||||
|
||||
# It can be used when setting DNS or GW variables.
|
||||
{%- if env["GATEWAY_IP"] is undefined %}
|
@@ -45,7 +45,7 @@ Listen {{ env.IRONIC_URL_HOST }}:{{ env.IRONIC_LISTEN_PORT }}
|
||||
{% if "IRONIC_HTPASSWD" in env and env.IRONIC_HTPASSWD | length %}
|
||||
AuthType Basic
|
||||
AuthName "Restricted area"
|
||||
AuthUserFile "/etc/ironic/htpasswd"
|
||||
AuthUserFile {{ env.HTPASSWD_FILE }}
|
||||
Require valid-user
|
||||
{% endif %}
|
||||
</Location>
|
@@ -1,10 +1,10 @@
|
||||
ServerRoot "/etc/httpd"
|
||||
ServerRoot {{ env.HTTPD_DIR }}
|
||||
{%- if env.LISTEN_ALL_INTERFACES | lower == "true" %}
|
||||
Listen {{ env.HTTP_PORT }}
|
||||
{% else %}
|
||||
Listen {{ env.IRONIC_URL_HOST }}:{{ env.HTTP_PORT }}
|
||||
{% endif %}
|
||||
Include conf.modules.d/*.conf
|
||||
Include /etc/httpd/conf.modules.d/*.conf
|
||||
User ironic-suse
|
||||
Group ironic-suse
|
||||
|
10
ironic-image/ironic-config/inspector.ipxe.j2
Normal file
10
ironic-image/ironic-config/inspector.ipxe.j2
Normal file
@@ -0,0 +1,10 @@
|
||||
#!ipxe
|
||||
|
||||
:retry_boot
|
||||
echo In inspector.ipxe
|
||||
imgfree
|
||||
# NOTE(dtantsur): keep inspection kernel params in [mdns]params in
|
||||
# ironic-inspector-image and configuration in configure-ironic.sh
|
||||
kernel --timeout 60000 {{ env.IRONIC_HTTP_URL }}/images/ironic-python-agent-${buildarch}.kernel ipa-insecure={{ env.IPA_INSECURE }} ipa-inspection-collectors={{ env.IRONIC_IPA_COLLECTORS }} systemd.journald.forward_to_console=yes BOOTIF=${mac} ipa-debug=1 ipa-enable-vlan-interfaces={{ env.IRONIC_ENABLE_VLAN_INTERFACES }} ipa-inspection-dhcp-all-interfaces=1 ipa-collect-lldp=1 {{ env.INSPECTOR_EXTRA_ARGS }} initrd=ironic-python-agent-${buildarch}.initramfs {% if env.IRONIC_RAMDISK_SSH_KEY %}sshkey="{{ env.IRONIC_RAMDISK_SSH_KEY|trim }}"{% endif %} {{ env.IRONIC_KERNEL_PARAMS|trim }} || goto retry_boot
|
||||
initrd --timeout 60000 {{ env.IRONIC_HTTP_URL }}/images/ironic-python-agent-${buildarch}.initramfs || goto retry_boot
|
||||
boot
|
@@ -27,6 +27,7 @@ use_stderr = true
|
||||
hash_ring_algorithm = sha256
|
||||
my_ip = {{ env.IRONIC_IP }}
|
||||
host = {{ env.IRONIC_CONDUCTOR_HOST }}
|
||||
tempdir = {{ env.IRONIC_TMP_DATA_DIR }}
|
||||
|
||||
# If a path to a certificate is defined, use that first for webserver
|
||||
{% if env.WEBSERVER_CACERT_FILE %}
|
||||
@@ -49,6 +50,7 @@ deploy_logs_local_path = /shared/log/ironic/deploy
|
||||
# retries here works around such problems without affecting the normal path.
|
||||
# See https://bugzilla.redhat.com/show_bug.cgi?id=1822763
|
||||
max_command_attempts = 30
|
||||
certificates_path = {{ env.IRONIC_GEN_CERT_DIR }}
|
||||
|
||||
[api]
|
||||
{% if env.IRONIC_REVERSE_PROXY_SETUP == "true" %}
|
||||
@@ -83,7 +85,7 @@ 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_BOOT_BASE_URL }}/uefi_esp-{{ env.DEPLOY_ARCHITECTURE }}.img
|
||||
bootloader = {{ env.IRONIC_HTTP_URL }}/uefi_esp-{{ env.DEPLOY_ARCHITECTURE }}.img
|
||||
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
|
||||
@@ -95,16 +97,19 @@ deploy_kernel = file://{{ env.IRONIC_DEFAULT_KERNEL }}
|
||||
{% if env.IRONIC_DEFAULT_RAMDISK is defined %}
|
||||
deploy_ramdisk = file://{{ env.IRONIC_DEFAULT_RAMDISK }}
|
||||
{% endif %}
|
||||
{% if env.DISABLE_DEEP_IMAGE_INSPECTION | lower == "true" %}
|
||||
disable_deep_image_inspection = True
|
||||
{% endif %}
|
||||
|
||||
[database]
|
||||
{% if env.IRONIC_USE_MARIADB | lower == "false" %}
|
||||
connection = sqlite:////var/lib/ironic/ironic.sqlite
|
||||
{% if env.IRONIC_USE_MARIADB | lower == "true" %}
|
||||
connection = {{ env.MARIADB_CONNECTION }}
|
||||
{% else %}
|
||||
connection = {{ env.LOCAL_DB_URI }}
|
||||
# Synchronous mode is required for data integrity in case of operating system
|
||||
# crash. In our case we restart the container from scratch, so we can save some
|
||||
# IO by not doing syncs all the time.
|
||||
sqlite_synchronous = False
|
||||
{% else %}
|
||||
connection = {{ env.MARIADB_CONNECTION }}
|
||||
{% endif %}
|
||||
|
||||
[deploy]
|
||||
@@ -112,7 +117,7 @@ default_boot_option = local
|
||||
erase_devices_metadata_priority = 10
|
||||
erase_devices_priority = 0
|
||||
http_root = /shared/html/
|
||||
http_url = {{ env.IRONIC_BOOT_BASE_URL }}
|
||||
http_url = {{ env.IRONIC_HTTP_URL }}
|
||||
fast_track = {{ env.IRONIC_FAST_TRACK }}
|
||||
{% if env.IRONIC_BOOT_ISO_SOURCE %}
|
||||
ramdisk_image_download_source = {{ env.IRONIC_BOOT_ISO_SOURCE }}
|
||||
@@ -175,7 +180,7 @@ cipher_suite_versions = 3,17
|
||||
# unauthenticated connections from other processes in the same host since the
|
||||
# containers are in host networking.
|
||||
auth_strategy = http_basic
|
||||
http_basic_auth_user_file = /etc/ironic/htpasswd-rpc
|
||||
http_basic_auth_user_file = {{ env.IRONIC_RPC_HTPASSWD_FILE }}
|
||||
host_ip = {% if env.LISTEN_ALL_INTERFACES | lower == "true" %}::{% else %}{{ env.IRONIC_IP }}{% endif %}
|
||||
{% if env.IRONIC_TLS_SETUP == "true" %}
|
||||
use_ssl = true
|
||||
@@ -187,11 +192,6 @@ insecure = {{ env.IRONIC_INSECURE }}
|
||||
[nova]
|
||||
send_power_notifications = false
|
||||
|
||||
[oslo_messaging_notifications]
|
||||
driver = prometheus_exporter
|
||||
location = /shared/ironic_prometheus_exporter
|
||||
transport_url = fake://
|
||||
|
||||
[pxe]
|
||||
# NOTE(dtantsur): keep this value at least 3x lower than
|
||||
# [conductor]deploy_callback_timeout so that at least some retries happen.
|
||||
@@ -201,7 +201,7 @@ images_path = /shared/html/tmp
|
||||
instance_master_path = /shared/html/master_images
|
||||
tftp_master_path = /shared/tftpboot/master_images
|
||||
tftp_root = /shared/tftpboot
|
||||
kernel_append_params = nofb nomodeset vga=normal ipa-insecure={{ env.IPA_INSECURE }} {% if env.ENABLE_FIPS_IPA %}fips={{ env.ENABLE_FIPS_IPA|trim }}{% endif %} {% if env.IRONIC_RAMDISK_SSH_KEY %}sshkey="{{ env.IRONIC_RAMDISK_SSH_KEY|trim }}"{% endif %} {{ env.IRONIC_KERNEL_PARAMS|trim }} systemd.journald.forward_to_console=yes net.ifnames={{ '0' if env.PREDICTABLE_NIC_NAMES == 'false' else '1' }}
|
||||
kernel_append_params = nofb nomodeset vga=normal ipa-insecure={{ env.IPA_INSECURE }} {% if env.ENABLE_FIPS_IPA %}fips={{ env.ENABLE_FIPS_IPA|trim }}{% endif %} {% if env.IRONIC_RAMDISK_SSH_KEY %}sshkey="{{ env.IRONIC_RAMDISK_SSH_KEY|trim }}"{% endif %} {{ env.IRONIC_KERNEL_PARAMS|trim }} systemd.journald.forward_to_console=yes
|
||||
# This makes networking boot templates generated even for nodes using local
|
||||
# boot (the default), ensuring that they boot correctly even if they start
|
||||
# netbooting for some reason (e.g. with the noop management interface).
|
||||
@@ -214,14 +214,14 @@ ipxe_config_template = /tmp/ipxe_config.template
|
||||
|
||||
[redfish]
|
||||
use_swift = false
|
||||
kernel_append_params = nofb nomodeset vga=normal ipa-insecure={{ env.IPA_INSECURE }} {% if env.ENABLE_FIPS_IPA %}fips={{ env.ENABLE_FIPS_IPA|trim }}{% endif %} {% if env.IRONIC_RAMDISK_SSH_KEY %}sshkey="{{ env.IRONIC_RAMDISK_SSH_KEY|trim }}"{% endif %} {{ env.IRONIC_KERNEL_PARAMS|trim }} systemd.journald.forward_to_console=yes net.ifnames={{ '0' if env.PREDICTABLE_NIC_NAMES == 'false' else '1' }}
|
||||
kernel_append_params = nofb nomodeset vga=normal ipa-insecure={{ env.IPA_INSECURE }} {% if env.ENABLE_FIPS_IPA %}fips={{ env.ENABLE_FIPS_IPA|trim }}{% endif %} {% if env.IRONIC_RAMDISK_SSH_KEY %}sshkey="{{ env.IRONIC_RAMDISK_SSH_KEY|trim }}"{% endif %} {{ env.IRONIC_KERNEL_PARAMS|trim }} systemd.journald.forward_to_console=yes
|
||||
|
||||
[ilo]
|
||||
kernel_append_params = nofb nomodeset vga=normal ipa-insecure={{ env.IPA_INSECURE }} {% if env.ENABLE_FIPS_IPA %}fips={{ env.ENABLE_FIPS_IPA|trim }}{% endif %} {% if env.IRONIC_RAMDISK_SSH_KEY %}sshkey="{{ env.IRONIC_RAMDISK_SSH_KEY|trim }}"{% endif %} {{ env.IRONIC_KERNEL_PARAMS|trim }} systemd.journald.forward_to_console=yes net.ifnames={{ '0' if env.PREDICTABLE_NIC_NAMES == 'false' else '1' }}
|
||||
kernel_append_params = nofb nomodeset vga=normal ipa-insecure={{ env.IPA_INSECURE }} {% if env.ENABLE_FIPS_IPA %}fips={{ env.ENABLE_FIPS_IPA|trim }}{% endif %} {% if env.IRONIC_RAMDISK_SSH_KEY %}sshkey="{{ env.IRONIC_RAMDISK_SSH_KEY|trim }}"{% endif %} {{ env.IRONIC_KERNEL_PARAMS|trim }} systemd.journald.forward_to_console=yes
|
||||
use_web_server_for_images = true
|
||||
|
||||
[irmc]
|
||||
kernel_append_params = nofb nomodeset vga=normal ipa-insecure={{ env.IPA_INSECURE }} {% if env.ENABLE_FIPS_IPA %}fips={{ env.ENABLE_FIPS_IPA|trim }}{% endif %} {% if env.IRONIC_RAMDISK_SSH_KEY %}sshkey="{{ env.IRONIC_RAMDISK_SSH_KEY|trim }}"{% endif %} {{ env.IRONIC_KERNEL_PARAMS|trim }} systemd.journald.forward_to_console=yes net.ifnames={{ '0' if env.PREDICTABLE_NIC_NAMES == 'false' else '1' }}
|
||||
kernel_append_params = nofb nomodeset vga=normal ipa-insecure={{ env.IPA_INSECURE }} {% if env.ENABLE_FIPS_IPA %}fips={{ env.ENABLE_FIPS_IPA|trim }}{% endif %} {% if env.IRONIC_RAMDISK_SSH_KEY %}sshkey="{{ env.IRONIC_RAMDISK_SSH_KEY|trim }}"{% endif %} {{ env.IRONIC_KERNEL_PARAMS|trim }} systemd.journald.forward_to_console=yes
|
||||
|
||||
[service_catalog]
|
||||
endpoint_override = {{ env.IRONIC_BASE_URL }}
|
@@ -1,68 +0,0 @@
|
||||
[DEFAULT]
|
||||
auth_strategy = noauth
|
||||
debug = true
|
||||
transport_url = fake://
|
||||
use_stderr = true
|
||||
{% if env.INSPECTOR_REVERSE_PROXY_SETUP == "true" %}
|
||||
{% if env.IRONIC_INSPECTOR_PRIVATE_PORT == "unix" %}
|
||||
listen_unix_socket = /shared/inspector.sock
|
||||
# NOTE(dtantsur): this is not ideal, but since the socket is accessed from
|
||||
# another container, we need to make it world-writeable.
|
||||
listen_unix_socket_mode = 0666
|
||||
{% else %}
|
||||
listen_port = {{ env.IRONIC_INSPECTOR_PRIVATE_PORT }}
|
||||
listen_address = 127.0.0.1
|
||||
{% endif %}
|
||||
{% elif env.LISTEN_ALL_INTERFACES | lower == "true" %}
|
||||
listen_port = {{ env.IRONIC_INSPECTOR_LISTEN_PORT }}
|
||||
listen_address = ::
|
||||
{% else %}
|
||||
listen_port = {{ env.IRONIC_INSPECTOR_LISTEN_PORT }}
|
||||
listen_address = {{ env.IRONIC_IP }}
|
||||
{% endif %}
|
||||
host = {{ env.IRONIC_IP }}
|
||||
{% if env.IRONIC_INSPECTOR_TLS_SETUP == "true" and env.INSPECTOR_REVERSE_PROXY_SETUP == "false" %}
|
||||
use_ssl = true
|
||||
{% endif %}
|
||||
|
||||
[database]
|
||||
connection = sqlite:////var/lib/ironic-inspector/ironic-inspector.db
|
||||
|
||||
{% if env.IRONIC_INSPECTOR_ENABLE_DISCOVERY == "true" %}
|
||||
[discovery]
|
||||
enroll_node_driver = ipmi
|
||||
{% endif %}
|
||||
|
||||
[ironic]
|
||||
auth_type = none
|
||||
endpoint_override = {{ env.IRONIC_BASE_URL }}
|
||||
{% if env.IRONIC_TLS_SETUP == "true" %}
|
||||
cafile = {{ env.IRONIC_CACERT_FILE }}
|
||||
insecure = {{ env.IRONIC_INSECURE }}
|
||||
{% endif %}
|
||||
|
||||
[processing]
|
||||
add_ports = all
|
||||
always_store_ramdisk_logs = true
|
||||
keep_ports = present
|
||||
{% if env.IRONIC_INSPECTOR_ENABLE_DISCOVERY == "true" %}
|
||||
node_not_found_hook = enroll
|
||||
{% endif %}
|
||||
permit_active_introspection = true
|
||||
power_off = false
|
||||
processing_hooks = $default_processing_hooks,lldp_basic
|
||||
ramdisk_logs_dir = /shared/log/ironic-inspector/ramdisk
|
||||
store_data = database
|
||||
|
||||
[pxe_filter]
|
||||
driver = noop
|
||||
|
||||
[service_catalog]
|
||||
auth_type = none
|
||||
endpoint_override = {{ env.IRONIC_INSPECTOR_BASE_URL }}
|
||||
|
||||
{% if env.IRONIC_INSPECTOR_TLS_SETUP == "true" and env.INSPECTOR_REVERSE_PROXY_SETUP == "false" %}
|
||||
[ssl]
|
||||
cert_file = {{ env.IRONIC_INSPECTOR_CERT_FILE }}
|
||||
key_file = {{ env.IRONIC_INSPECTOR_KEY_FILE }}
|
||||
{% endif %}
|
@@ -1,9 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eu -o pipefail
|
||||
|
||||
curl -sSf {{ env.PROBE_CURL_ARGS }} "{{ env.PROBE_URL }}"
|
||||
|
||||
# TODO(dtantsur): when PROBE_KIND==readiness, try the conductor and driver API
|
||||
# to make sure the conductor is ready. This requires having access to secrets
|
||||
# since these endpoints are authenticated.
|
@@ -1,23 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
# This setting must go before configure-ironic since it has different defaults.
|
||||
export IRONIC_USE_MARIADB=${IRONIC_USE_MARIADB:-false}
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/configure-ironic.sh
|
||||
|
||||
# Ramdisk logs
|
||||
mkdir -p /shared/log/ironic/deploy
|
||||
|
||||
run_ironic_dbsync
|
||||
|
||||
if [[ "$IRONIC_TLS_SETUP" == "true" ]] && [[ "${RESTART_CONTAINER_CERTIFICATE_UPDATED}" == "true" ]]; then
|
||||
# shellcheck disable=SC2034
|
||||
inotifywait -m -e delete_self "${IRONIC_CERT_FILE}" | while read -r file event; do
|
||||
kill $(pgrep ironic)
|
||||
done &
|
||||
fi
|
||||
|
||||
configure_ironic_auth
|
||||
|
||||
exec /usr/bin/ironic
|
@@ -1,13 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
export IRONIC_DEPLOYMENT="API"
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/configure-ironic.sh
|
||||
|
||||
export IRONIC_REVERSE_PROXY_SETUP=false
|
||||
|
||||
python3 -c 'import os; import sys; import jinja2; sys.stdout.write(jinja2.Template(sys.stdin.read()).render(env=os.environ))' < /tmp/httpd-ironic-api.conf.j2 > /etc/httpd/conf.d/ironic.conf
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/runhttpd
|
@@ -1,20 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
export IRONIC_DEPLOYMENT="Conductor"
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/configure-ironic.sh
|
||||
|
||||
# Ramdisk logs
|
||||
mkdir -p /shared/log/ironic/deploy
|
||||
|
||||
run_ironic_dbsync
|
||||
|
||||
if [[ "$IRONIC_TLS_SETUP" == "true" ]] && [[ "${RESTART_CONTAINER_CERTIFICATE_UPDATED}" == "true" ]]; then
|
||||
# shellcheck disable=SC2034
|
||||
inotifywait -m -e delete_self "${IRONIC_CERT_FILE}" | while read -r file event; do
|
||||
kill $(pgrep ironic)
|
||||
done &
|
||||
fi
|
||||
|
||||
exec /usr/bin/ironic-conductor
|
@@ -1,12 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/configure-ironic.sh
|
||||
|
||||
FLASK_RUN_HOST=${FLASK_RUN_HOST:-0.0.0.0}
|
||||
FLASK_RUN_PORT=${FLASK_RUN_PORT:-9608}
|
||||
|
||||
export IRONIC_CONFIG="/etc/ironic/ironic.conf"
|
||||
|
||||
exec gunicorn -b "${FLASK_RUN_HOST}:${FLASK_RUN_PORT}" -w 4 \
|
||||
ironic_prometheus_exporter.app.wsgi:application
|
@@ -1,62 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
CONFIG=/etc/ironic-inspector/ironic-inspector.conf
|
||||
|
||||
export IRONIC_INSPECTOR_ENABLE_DISCOVERY=${IRONIC_INSPECTOR_ENABLE_DISCOVERY:-false}
|
||||
export INSPECTOR_REVERSE_PROXY_SETUP=${INSPECTOR_REVERSE_PROXY_SETUP:-false}
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/tls-common.sh
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/ironic-common.sh
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/auth-common.sh
|
||||
|
||||
if [[ "$USE_IRONIC_INSPECTOR" == "false" ]]; then
|
||||
echo "FATAL: ironic-inspector is disabled via USE_IRONIC_INSPECTOR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
wait_for_interface_or_ip
|
||||
|
||||
IRONIC_INSPECTOR_PORT=${IRONIC_INSPECTOR_ACCESS_PORT}
|
||||
if [[ "$IRONIC_INSPECTOR_TLS_SETUP" == "true" ]]; then
|
||||
if [[ "${INSPECTOR_REVERSE_PROXY_SETUP}" == "true" ]] && [[ "${IRONIC_INSPECTOR_PRIVATE_PORT}" != "unix" ]]; then
|
||||
IRONIC_INSPECTOR_PORT=$IRONIC_INSPECTOR_PRIVATE_PORT
|
||||
fi
|
||||
else
|
||||
export INSPECTOR_REVERSE_PROXY_SETUP="false" # If TLS is not used, we have no reason to use the reverse proxy
|
||||
fi
|
||||
|
||||
export IRONIC_INSPECTOR_BASE_URL="${IRONIC_INSPECTOR_SCHEME}://${IRONIC_URL_HOST}:${IRONIC_INSPECTOR_PORT}"
|
||||
export IRONIC_BASE_URL="${IRONIC_SCHEME}://${IRONIC_URL_HOST}:${IRONIC_ACCESS_PORT}"
|
||||
|
||||
build_j2_config()
|
||||
{
|
||||
local CONFIG_FILE="$1"
|
||||
python3 -c 'import os; import sys; import jinja2; sys.stdout.write(jinja2.Template(sys.stdin.read()).render(env=os.environ))' < "$CONFIG_FILE.j2"
|
||||
}
|
||||
|
||||
# Merge with the original configuration file from the package.
|
||||
build_j2_config "$CONFIG" | crudini --merge "$CONFIG"
|
||||
|
||||
configure_inspector_auth
|
||||
|
||||
configure_client_basic_auth ironic "${CONFIG}"
|
||||
|
||||
ironic-inspector-dbsync --config-file "${CONFIG}" upgrade
|
||||
|
||||
if [[ "$INSPECTOR_REVERSE_PROXY_SETUP" == "false" ]] && [[ "${RESTART_CONTAINER_CERTIFICATE_UPDATED}" == "true" ]]; then
|
||||
# shellcheck disable=SC2034
|
||||
inotifywait -m -e delete_self "${IRONIC_INSPECTOR_CERT_FILE}" | while read -r file event; do
|
||||
kill $(pgrep ironic)
|
||||
done &
|
||||
fi
|
||||
|
||||
# Make sure ironic traffic bypasses any proxies
|
||||
export NO_PROXY="${NO_PROXY:-},$IRONIC_IP"
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
exec /usr/bin/ironic-inspector
|
@@ -1,19 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
# Ramdisk logs path
|
||||
LOG_DIR="/shared/log/ironic/deploy"
|
||||
|
||||
# The ironic container creates the directory, wait for
|
||||
# it to exist before running inotifywait or it can fail causing
|
||||
# a spurious restart
|
||||
while [ ! -d "${LOG_DIR}" ]; do
|
||||
echo "Waiting for ${LOG_DIR}"
|
||||
sleep 5
|
||||
done
|
||||
|
||||
inotifywait -m "${LOG_DIR}" -e close_write |
|
||||
while read -r path _action file; do
|
||||
echo "************ Contents of ${path}/${file} ramdisk log file bundle **************"
|
||||
tar -xOzvvf "${path}/${file}" | sed -e "s/^/${file}: /"
|
||||
rm -f "${path}/${file}"
|
||||
done
|
97
ironic-image/scripts/auth-common.sh
Normal file
97
ironic-image/scripts/auth-common.sh
Normal file
@@ -0,0 +1,97 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
export IRONIC_REVERSE_PROXY_SETUP=${IRONIC_REVERSE_PROXY_SETUP:-false}
|
||||
|
||||
# CUSTOM_CONFIG_DIR is also managed in the ironic-common.sh, in order to
|
||||
# keep auth-common and ironic-common separate (to stay consistent with the
|
||||
# architecture) part of the ironic-common logic had to be duplicated
|
||||
CUSTOM_CONFIG_DIR="${CUSTOM_CONFIG_DIR:-/conf}"
|
||||
IRONIC_CONF_DIR="${CUSTOM_CONFIG_DIR}/ironic"
|
||||
|
||||
# Backward compatibility
|
||||
if [[ "${IRONIC_DEPLOYMENT:-}" == "Conductor" ]]; then
|
||||
export IRONIC_EXPOSE_JSON_RPC=true
|
||||
else
|
||||
export IRONIC_EXPOSE_JSON_RPC="${IRONIC_EXPOSE_JSON_RPC:-false}"
|
||||
fi
|
||||
|
||||
IRONIC_HTPASSWD_FILE="${IRONIC_CONF_DIR}/htpasswd"
|
||||
export IRONIC_RPC_HTPASSWD_FILE="${IRONIC_HTPASSWD_FILE}-rpc"
|
||||
if [[ -f "/auth/ironic/htpasswd" ]]; then
|
||||
IRONIC_HTPASSWD=$(</auth/ironic/htpasswd)
|
||||
fi
|
||||
if [[ -f "/auth/ironic-rpc/htpasswd" ]]; then
|
||||
IRONIC_RPC_HTPASSWD=$(</auth/ironic-rpc/htpasswd)
|
||||
fi
|
||||
export IRONIC_HTPASSWD=${IRONIC_HTPASSWD:-${HTTP_BASIC_HTPASSWD:-}}
|
||||
export IRONIC_RPC_HTPASSWD=${IRONIC_RPC_HTPASSWD:-${IRONIC_HTPASSWD}}
|
||||
|
||||
if [[ -n "${MARIADB_PASSWORD:-}" ]]; then
|
||||
echo "WARNING: passing MARIADB_PASSWORD is deprecated, mount a secret under /auth/mariadb instead"
|
||||
elif [[ -f /auth/mariadb/password ]]; then
|
||||
MARIADB_PASSWORD=$(</auth/mariadb/password)
|
||||
fi
|
||||
|
||||
if [[ -z "${MARIADB_USER:-}" ]] && [[ -f /auth/mariadb/username ]]; then
|
||||
MARIADB_USER=$(</auth/mariadb/username)
|
||||
fi
|
||||
|
||||
IRONIC_CONFIG="${IRONIC_CONF_DIR}/ironic.conf"
|
||||
|
||||
configure_json_rpc_auth()
|
||||
{
|
||||
if [[ "${IRONIC_EXPOSE_JSON_RPC}" != "true" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
local auth_config_file="/auth/ironic-rpc/auth-config"
|
||||
local username_file="/auth/ironic-rpc/username"
|
||||
local password_file="/auth/ironic-rpc/password"
|
||||
if [[ -f "${username_file}" ]] && [[ -f "${password_file}" ]]; then
|
||||
crudini --set "${IRONIC_CONFIG}" json_rpc username "$(<${username_file})"
|
||||
set +x
|
||||
crudini --set "${IRONIC_CONFIG}" json_rpc password "$(<${password_file})"
|
||||
set -x
|
||||
elif [[ -f "${auth_config_file}" ]]; then
|
||||
echo "WARNING: using auth-config is deprecated, mount a secret directly"
|
||||
# Merge configurations in the "auth" directory into the default ironic configuration file
|
||||
crudini --merge "${IRONIC_CONFIG}" < "${auth_config_file}"
|
||||
else
|
||||
echo "FATAL: no client-side credentials provided for JSON RPC"
|
||||
echo "HINT: mount a secret with username and password fields under /auth/ironic-rpc"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -z "${IRONIC_RPC_HTPASSWD}" ]]; then
|
||||
if [[ -f "${username_file}" ]] && [[ -f "${password_file}" ]]; then
|
||||
htpasswd -c -i -B "${IRONIC_RPC_HTPASSWD_FILE}" "$(<${username_file})" <"${password_file}"
|
||||
else
|
||||
echo "FATAL: enabling JSON RPC requires authentication"
|
||||
echo "HINT: mount a secret with either username and password or htpasswd under /auth/ironic-rpc"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
printf "%s\n" "${IRONIC_RPC_HTPASSWD}" > "${IRONIC_RPC_HTPASSWD_FILE}"
|
||||
fi
|
||||
}
|
||||
|
||||
configure_ironic_auth()
|
||||
{
|
||||
# Configure HTTP basic auth for API server
|
||||
if [[ -n "${IRONIC_HTPASSWD}" ]]; then
|
||||
printf "%s\n" "${IRONIC_HTPASSWD}" > "${IRONIC_HTPASSWD_FILE}"
|
||||
if [[ "${IRONIC_REVERSE_PROXY_SETUP}" == "false" ]]; then
|
||||
crudini --set "${IRONIC_CONFIG}" DEFAULT auth_strategy http_basic
|
||||
crudini --set "${IRONIC_CONFIG}" DEFAULT http_basic_auth_user_file "${IRONIC_HTPASSWD_FILE}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
write_htpasswd_files()
|
||||
{
|
||||
if [[ -n "${IRONIC_HTPASSWD:-}" ]]; then
|
||||
printf "%s\n" "${IRONIC_HTPASSWD}" > "${IRONIC_HTPASSWD_FILE}"
|
||||
fi
|
||||
}
|
50
ironic-image/configure-ironic.sh → ironic-image/scripts/configure-ironic.sh
Normal file → Executable file
50
ironic-image/configure-ironic.sh → ironic-image/scripts/configure-ironic.sh
Normal file → Executable file
@@ -19,10 +19,11 @@ export IRONIC_ENABLE_VLAN_INTERFACES=${IRONIC_ENABLE_VLAN_INTERFACES:-${IRONIC_I
|
||||
|
||||
export HTTP_PORT=${HTTP_PORT:-80}
|
||||
|
||||
export IRONIC_USE_MARIADB=${IRONIC_USE_MARIADB:-true}
|
||||
|
||||
if [[ "$IRONIC_USE_MARIADB" == "true" ]]; then
|
||||
MARIADB_PASSWORD=${MARIADB_PASSWORD}
|
||||
if [[ "${IRONIC_USE_MARIADB}" == true ]]; then
|
||||
if [[ -z "${MARIADB_PASSWORD:-}" ]]; then
|
||||
echo "FATAL: IRONIC_USE_MARIADB requires password, mount a secret under /auth/mariadb"
|
||||
exit 1
|
||||
fi
|
||||
MARIADB_DATABASE=${MARIADB_DATABASE:-ironic}
|
||||
MARIADB_USER=${MARIADB_USER:-ironic}
|
||||
MARIADB_HOST=${MARIADB_HOST:-127.0.0.1}
|
||||
@@ -32,13 +33,9 @@ if [[ "$IRONIC_USE_MARIADB" == "true" ]]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
# TODO(dtantsur): remove the explicit default once we get
|
||||
# https://review.opendev.org/761185 in the repositories
|
||||
NUMPROC="$(grep -c "^processor" /proc/cpuinfo)"
|
||||
if [[ "$NUMPROC" -lt 4 ]]; then
|
||||
NUMPROC=4
|
||||
fi
|
||||
export NUMWORKERS=${NUMWORKERS:-$NUMPROC}
|
||||
# zero makes it do cpu number detection on Ironic side
|
||||
export NUMWORKERS=${NUMWORKERS:-0}
|
||||
|
||||
|
||||
# Whether to enable fast_track provisioning or not
|
||||
export IRONIC_FAST_TRACK=${IRONIC_FAST_TRACK:-true}
|
||||
@@ -57,8 +54,6 @@ wait_for_interface_or_ip
|
||||
# Hostname to use for the current conductor instance.
|
||||
export IRONIC_CONDUCTOR_HOST=${IRONIC_CONDUCTOR_HOST:-${IRONIC_URL_HOST}}
|
||||
|
||||
export IRONIC_BASE_URL=${IRONIC_BASE_URL:-"${IRONIC_SCHEME}://${IRONIC_URL_HOST}:${IRONIC_ACCESS_PORT}"}
|
||||
|
||||
if [[ -n "$IRONIC_EXTERNAL_IP" ]]; then
|
||||
export IRONIC_EXTERNAL_CALLBACK_URL=${IRONIC_EXTERNAL_CALLBACK_URL:-"${IRONIC_SCHEME}://${IRONIC_EXTERNAL_IP}:${IRONIC_ACCESS_PORT}"}
|
||||
if [[ "$IRONIC_VMEDIA_TLS_SETUP" == "true" ]]; then
|
||||
@@ -74,9 +69,9 @@ if [[ -f "${IMAGE_CACHE_PREFIX}.kernel" ]] && [[ -f "${IMAGE_CACHE_PREFIX}.initr
|
||||
export IRONIC_DEFAULT_RAMDISK="${IMAGE_CACHE_PREFIX}.initramfs"
|
||||
fi
|
||||
|
||||
if [[ -f /etc/ironic/ironic.conf ]]; then
|
||||
if [[ -f "${IRONIC_CONF_DIR}/ironic.conf" ]]; then
|
||||
# Make a copy of the original supposed empty configuration file
|
||||
cp /etc/ironic/ironic.conf /etc/ironic/ironic.conf_orig
|
||||
cp "${IRONIC_CONF_DIR}/ironic.conf" "${IRONIC_CONF_DIR}/ironic.conf.orig"
|
||||
fi
|
||||
|
||||
# oslo.config also supports Config Opts From Environment, log them to stdout
|
||||
@@ -84,9 +79,6 @@ echo 'Options set from Environment variables'
|
||||
env | grep "^OS_" || true
|
||||
|
||||
mkdir -p /shared/html
|
||||
mkdir -p /shared/ironic_prometheus_exporter
|
||||
|
||||
configure_json_rpc_auth
|
||||
|
||||
if [[ -f /proc/sys/crypto/fips_enabled ]]; then
|
||||
ENABLE_FIPS_IPA=$(cat /proc/sys/crypto/fips_enabled)
|
||||
@@ -94,26 +86,10 @@ if [[ -f /proc/sys/crypto/fips_enabled ]]; then
|
||||
fi
|
||||
|
||||
# The original ironic.conf is empty, and can be found in ironic.conf_orig
|
||||
render_j2_config /etc/ironic/ironic.conf.j2 /etc/ironic/ironic.conf
|
||||
render_j2_config "/etc/ironic/ironic.conf.j2" \
|
||||
"${IRONIC_CONF_DIR}/ironic.conf"
|
||||
|
||||
configure_client_basic_auth ironic-rpc
|
||||
configure_json_rpc_auth
|
||||
|
||||
# Make sure ironic traffic bypasses any proxies
|
||||
export NO_PROXY="${NO_PROXY:-},$IRONIC_IP"
|
||||
|
||||
PROBE_CURL_ARGS=
|
||||
if [[ "${IRONIC_REVERSE_PROXY_SETUP}" == "true" ]]; then
|
||||
if [[ "${IRONIC_PRIVATE_PORT}" == "unix" ]]; then
|
||||
PROBE_URL="http://127.0.0.1:6385"
|
||||
PROBE_CURL_ARGS="--unix-socket /shared/ironic.sock"
|
||||
else
|
||||
PROBE_URL="http://127.0.0.1:${IRONIC_PRIVATE_PORT}"
|
||||
fi
|
||||
else
|
||||
PROBE_URL="${IRONIC_BASE_URL}"
|
||||
fi
|
||||
export PROBE_CURL_ARGS
|
||||
export PROBE_URL
|
||||
|
||||
PROBE_KIND=readiness render_j2_config /bin/ironic-probe.j2 /bin/ironic-readiness
|
||||
PROBE_KIND=liveness render_j2_config /bin/ironic-probe.j2 /bin/ironic-liveness
|
@@ -2,11 +2,36 @@
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
IRONIC_IP="${IRONIC_IP:-}"
|
||||
# Export IRONIC_IP to avoid needing to lean on IRONIC_URL_HOST for consumption in
|
||||
# e.g. dnsmasq configuration
|
||||
export IRONIC_IP="${IRONIC_IP:-}"
|
||||
PROVISIONING_INTERFACE="${PROVISIONING_INTERFACE:-}"
|
||||
PROVISIONING_IP="${PROVISIONING_IP:-}"
|
||||
PROVISIONING_MACS="${PROVISIONING_MACS:-}"
|
||||
IPXE_CUSTOM_FIRMWARE_DIR="${IPXE_CUSTOM_FIRMWARE_DIR:-/shared/custom_ipxe_firmware}"
|
||||
CUSTOM_CONFIG_DIR="${CUSTOM_CONFIG_DIR:-/conf}"
|
||||
CUSTOM_DATA_DIR="${CUSTOM_DATA_DIR:-/data}"
|
||||
export DNSMASQ_CONF_DIR="${CUSTOM_CONFIG_DIR}/dnsmasq"
|
||||
export DNSMASQ_DATA_DIR="${CUSTOM_DATA_DIR}/dnsmasq"
|
||||
export DNSMASQ_TEMP_DIR="${CUSTOM_CONFIG_DIR}/dnsmasq"
|
||||
export HTTPD_DIR="${CUSTOM_CONFIG_DIR}/httpd"
|
||||
export HTTPD_CONF_DIR="${HTTPD_DIR}/conf"
|
||||
export HTTPD_CONF_DIR_D="${HTTPD_DIR}/conf.d"
|
||||
export IRONIC_CONF_DIR="${CUSTOM_CONFIG_DIR}/ironic"
|
||||
export IRONIC_DB_DIR="${CUSTOM_DATA_DIR}/db"
|
||||
export IRONIC_GEN_CERT_DIR="${CUSTOM_DATA_DIR}/auto_gen_certs"
|
||||
export IRONIC_TMP_DATA_DIR="${CUSTOM_DATA_DIR}/tmp"
|
||||
export PROBE_CONF_DIR="${CUSTOM_CONFIG_DIR}/probes"
|
||||
|
||||
mkdir -p "${IRONIC_CONF_DIR}" "${PROBE_CONF_DIR}" "${HTTPD_CONF_DIR}" \
|
||||
"${HTTPD_CONF_DIR_D}" "${DNSMASQ_CONF_DIR}" "${DNSMASQ_TEMP_DIR}" \
|
||||
"${IRONIC_DB_DIR}" "${IRONIC_GEN_CERT_DIR}" "${DNSMASQ_DATA_DIR}" \
|
||||
"${IRONIC_TMP_DATA_DIR}"
|
||||
|
||||
export HTPASSWD_FILE="${IRONIC_CONF_DIR}/htpasswd"
|
||||
export LOCAL_DB_URI="sqlite:///${IRONIC_DB_DIR}/ironic.sqlite"
|
||||
|
||||
export IRONIC_USE_MARIADB=${IRONIC_USE_MARIADB:-false}
|
||||
|
||||
get_provisioning_interface()
|
||||
{
|
||||
@@ -19,13 +44,13 @@ get_provisioning_interface()
|
||||
local interface="provisioning"
|
||||
|
||||
if [[ -n "${PROVISIONING_IP}" ]]; then
|
||||
if ip -br addr show | grep -qi " ${PROVISIONING_IP}/"; then
|
||||
if ip -br addr show | grep -i " ${PROVISIONING_IP}/" &>/dev/null; then
|
||||
interface="$(ip -br addr show | grep -i " ${PROVISIONING_IP}/" | cut -f 1 -d ' ' | cut -f 1 -d '@')"
|
||||
fi
|
||||
fi
|
||||
|
||||
for mac in ${PROVISIONING_MACS//,/ }; do
|
||||
if ip -br link show up | grep -qi "$mac"; then
|
||||
if ip -br link show up | grep -i "$mac" &>/dev/null; then
|
||||
interface="$(ip -br link show up | grep -i "$mac" | cut -f 1 -d ' ' | cut -f 1 -d '@')"
|
||||
break
|
||||
fi
|
||||
@@ -42,9 +67,12 @@ export LISTEN_ALL_INTERFACES="${LISTEN_ALL_INTERFACES:-true}"
|
||||
# Wait for the interface or IP to be up, sets $IRONIC_IP
|
||||
wait_for_interface_or_ip()
|
||||
{
|
||||
# If $PROVISIONING_IP is specified, then we wait for that to become available on an interface, otherwise we look at $PROVISIONING_INTERFACE for an IP
|
||||
if [[ -n "$PROVISIONING_IP" ]]; then
|
||||
# Convert the address using ipcalc which strips out the subnet. For IPv6 addresses, this will give the short-form address
|
||||
# If $PROVISIONING_IP is specified, then we wait for that to become
|
||||
# available on an interface, otherwise we look at $PROVISIONING_INTERFACE
|
||||
# for an IP
|
||||
if [[ -n "${PROVISIONING_IP}" ]]; then
|
||||
# Convert the address using ipcalc which strips out the subnet.
|
||||
# For IPv6 addresses, this will give the short-form address
|
||||
IRONIC_IP="$(ipcalc "${PROVISIONING_IP}" | grep "^Address:" | awk '{print $2}')"
|
||||
export IRONIC_IP
|
||||
until grep -F " ${IRONIC_IP}/" <(ip -br addr show); do
|
||||
@@ -69,31 +97,37 @@ wait_for_interface_or_ip()
|
||||
export IPV=4
|
||||
export IRONIC_URL_HOST="$IRONIC_IP"
|
||||
fi
|
||||
|
||||
# Avoid having to construct full URL multiple times while allowing
|
||||
# the override of IRONIC_HTTP_URL for environments in which IRONIC_IP
|
||||
# is unreachable from hosts being provisioned.
|
||||
export IRONIC_HTTP_URL="${IRONIC_HTTP_URL:-http://${IRONIC_URL_HOST}:${HTTP_PORT}}"
|
||||
export IRONIC_TFTP_URL="${IRONIC_TFTP_URL:-tftp://${IRONIC_URL_HOST}}"
|
||||
export IRONIC_BASE_URL=${IRONIC_BASE_URL:-"${IRONIC_SCHEME}://${IRONIC_URL_HOST}:${IRONIC_ACCESS_PORT}"}
|
||||
}
|
||||
|
||||
render_j2_config()
|
||||
{
|
||||
ls $1 # DEBUG
|
||||
python3 -c 'import os; import sys; import jinja2; sys.stdout.write(jinja2.Template(sys.stdin.read()).render(env=os.environ))' < "$1"
|
||||
python3 -c 'import os; import sys; import jinja2; sys.stdout.write(jinja2.Template(sys.stdin.read()).render(env=os.environ))' < "$1" > "$2"
|
||||
ls $2 # DEBUG
|
||||
python3.11 -c 'import os; import sys; import jinja2; sys.stdout.write(jinja2.Template(sys.stdin.read()).render(env=os.environ))' < "$1" > "$2"
|
||||
}
|
||||
|
||||
run_ironic_dbsync()
|
||||
{
|
||||
if [[ "${IRONIC_USE_MARIADB:-true}" == "true" ]]; then
|
||||
if [[ "${IRONIC_USE_MARIADB}" == "true" ]]; then
|
||||
# It's possible for the dbsync to fail if mariadb is not up yet, so
|
||||
# retry until success
|
||||
until ironic-dbsync --config-file /etc/ironic/ironic.conf upgrade; do
|
||||
until ironic-dbsync --config-file "${IRONIC_CONF_DIR}/ironic.conf" upgrade; do
|
||||
echo "WARNING: ironic-dbsync failed, retrying"
|
||||
sleep 1
|
||||
done
|
||||
else
|
||||
# SQLite does not support some statements. Fortunately, we can just create
|
||||
# the schema in one go if not already created, instead of going through an upgrade
|
||||
DB_VERSION="$(ironic-dbsync --config-file /etc/ironic/ironic.conf version)"
|
||||
# SQLite does not support some statements. Fortunately, we can just
|
||||
# create the schema in one go if not already created, instead of going
|
||||
# through an upgrade
|
||||
cp "/var/lib/ironic/ironic.sqlite" "${IRONIC_DB_DIR}/ironic.sqlite"
|
||||
DB_VERSION="$(ironic-dbsync --config-file "${IRONIC_CONF_DIR}/ironic.conf" version)"
|
||||
if [[ "${DB_VERSION}" == "None" ]]; then
|
||||
ironic-dbsync --config-file /etc/ironic/ironic.conf create_schema
|
||||
ironic-dbsync --config-file "${IRONIC_CONF_DIR}/ironic.conf" create_schema
|
||||
fi
|
||||
fi
|
||||
}
|
23
ironic-image/scripts/ironic-probe.sh
Executable file
23
ironic-image/scripts/ironic-probe.sh
Executable file
@@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eu -o pipefail
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/ironic-common.sh
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/auth-common.sh
|
||||
|
||||
PROBE_CURL_ARGS=
|
||||
if [[ "${IRONIC_REVERSE_PROXY_SETUP}" == "true" ]]; then
|
||||
if [[ "${IRONIC_PRIVATE_PORT}" == "unix" ]]; then
|
||||
PROBE_URL="http://127.0.0.1:6385"
|
||||
PROBE_CURL_ARGS="--unix-socket /shared/ironic.sock"
|
||||
else
|
||||
PROBE_URL="http://127.0.0.1:${IRONIC_PRIVATE_PORT}"
|
||||
fi
|
||||
else
|
||||
PROBE_URL="${IRONIC_BASE_URL}"
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
curl -sSf ${PROBE_CURL_ARGS} "${PROBE_URL}"
|
10
ironic-image/scripts/rundatabase-upgrade
Executable file
10
ironic-image/scripts/rundatabase-upgrade
Executable file
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/configure-ironic.sh
|
||||
|
||||
# NOTE(dtantsur): no retries here: this script is supposed to be run as a Job
|
||||
# that is retried on failure.
|
||||
exec ironic-dbsync --config-file "${IRONIC_CONF_DIR}/ironic.conf" upgrade
|
16
ironic-image/rundnsmasq → ironic-image/scripts/rundnsmasq
Normal file → Executable file
16
ironic-image/rundnsmasq → ironic-image/scripts/rundnsmasq
Normal file → Executable file
@@ -13,7 +13,11 @@ export DNS_PORT=${DNS_PORT:-0}
|
||||
|
||||
wait_for_interface_or_ip
|
||||
if [[ "${DNS_IP:-}" == "provisioning" ]]; then
|
||||
export DNS_IP="$IRONIC_URL_HOST"
|
||||
if [[ "${IPV}" == "4" ]]; then
|
||||
export DNS_IP="${IRONIC_IP}"
|
||||
else
|
||||
export DNS_IP="[${IRONIC_IP}]"
|
||||
fi
|
||||
fi
|
||||
|
||||
mkdir -p /shared/tftpboot
|
||||
@@ -32,12 +36,12 @@ fi
|
||||
# Template and write dnsmasq.conf
|
||||
# we template via /tmp as sed otherwise creates temp files in /etc directory
|
||||
# where we can't write
|
||||
python3 -c 'import os; import sys; import jinja2; sys.stdout.write(jinja2.Template(sys.stdin.read()).render(env=os.environ))' </etc/dnsmasq.conf.j2 >/tmp/dnsmasq.conf
|
||||
python3.11 -c 'import os; import sys; import jinja2; sys.stdout.write(jinja2.Template(sys.stdin.read()).render(env=os.environ))' <"/tmp/dnsmasq.conf.j2" >"${DNSMASQ_TEMP_DIR}/dnsmasq_temp.conf"
|
||||
|
||||
for iface in $(echo "$DNSMASQ_EXCEPT_INTERFACE" | tr ',' ' '); do
|
||||
sed -i -e "/^interface=.*/ a\except-interface=${iface}" /tmp/dnsmasq.conf
|
||||
sed -i -e "/^interface=.*/ a\except-interface=${iface}" "${DNSMASQ_TEMP_DIR}/dnsmasq_temp.conf"
|
||||
done
|
||||
cat /tmp/dnsmasq.conf > /etc/dnsmasq.conf
|
||||
rm /tmp/dnsmasq.conf
|
||||
cat "${DNSMASQ_TEMP_DIR}/dnsmasq_temp.conf" > "${DNSMASQ_CONF_DIR}/dnsmasq.conf"
|
||||
rm "${DNSMASQ_TEMP_DIR}/dnsmasq_temp.conf"
|
||||
|
||||
exec /usr/sbin/dnsmasq -d -q -C /etc/dnsmasq.conf
|
||||
exec /usr/sbin/dnsmasq -d -q -C "${DNSMASQ_CONF_DIR}/dnsmasq.conf"
|
37
ironic-image/runhttpd → ironic-image/scripts/runhttpd
Normal file → Executable file
37
ironic-image/runhttpd → ironic-image/scripts/runhttpd
Normal file → Executable file
@@ -28,25 +28,29 @@ wait_for_interface_or_ip
|
||||
mkdir -p /shared/html
|
||||
chmod 0777 /shared/html
|
||||
|
||||
IRONIC_BASE_URL="${IRONIC_SCHEME}://${IRONIC_URL_HOST}"
|
||||
|
||||
INSPECTOR_EXTRA_ARGS=" ipa-inspection-callback-url=${IRONIC_BASE_URL}:${IRONIC_ACCESS_PORT}/v1/continue_inspection"
|
||||
INSPECTOR_EXTRA_ARGS=" ipa-inspection-callback-url=${IRONIC_BASE_URL}/v1/continue_inspection"
|
||||
|
||||
if [[ "$IRONIC_FAST_TRACK" == "true" ]]; then
|
||||
INSPECTOR_EXTRA_ARGS+=" ipa-api-url=${IRONIC_BASE_URL}:${IRONIC_ACCESS_PORT}"
|
||||
INSPECTOR_EXTRA_ARGS+=" ipa-api-url=${IRONIC_BASE_URL}"
|
||||
fi
|
||||
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"
|
||||
fi
|
||||
|
||||
# Render the core httpd config
|
||||
render_j2_config /etc/httpd/conf/httpd.conf.j2 /etc/httpd/conf/httpd.conf
|
||||
render_j2_config "/etc/httpd/conf/httpd.conf.j2" \
|
||||
"${HTTPD_CONF_DIR}/httpd.conf"
|
||||
|
||||
if [[ "$IRONIC_TLS_SETUP" == "true" ]]; then
|
||||
if [[ "${IRONIC_REVERSE_PROXY_SETUP}" == "true" ]]; then
|
||||
render_j2_config /tmp/httpd-ironic-api.conf.j2 /etc/httpd/conf.d/ironic.conf
|
||||
render_j2_config "/tmp/httpd-ironic-api.conf.j2" \
|
||||
"${HTTPD_CONF_DIR_D}/ironic.conf"
|
||||
fi
|
||||
else
|
||||
export IRONIC_REVERSE_PROXY_SETUP="false" # If TLS is not used, we have no reason to use the reverse proxy
|
||||
@@ -56,33 +60,24 @@ write_htpasswd_files
|
||||
|
||||
# Render httpd TLS configuration for /shared/html/<redifsh;ilo>
|
||||
if [[ "$IRONIC_VMEDIA_TLS_SETUP" == "true" ]]; then
|
||||
render_j2_config /etc/httpd-vmedia.conf.j2 /etc/httpd/conf.d/vmedia.conf
|
||||
render_j2_config "/tmp/httpd-vmedia.conf.j2" \
|
||||
"${HTTPD_CONF_DIR_D}/vmedia.conf"
|
||||
fi
|
||||
|
||||
# Render httpd TLS configuration for /shared/html
|
||||
if [[ "$IPXE_TLS_SETUP" == "true" ]]; then
|
||||
mkdir -p /shared/html/custom-ipxe
|
||||
chmod 0777 /shared/html/custom-ipxe
|
||||
render_j2_config "/etc/httpd-ipxe.conf.j2" "/etc/httpd/conf.d/ipxe.conf"
|
||||
render_j2_config "/tmp/httpd-ipxe.conf.j2" "${HTTPD_CONF_DIR_D}/ipxe.conf"
|
||||
cp "${IPXE_CUSTOM_FIRMWARE_DIR}/undionly.kpxe" \
|
||||
"${IPXE_CUSTOM_FIRMWARE_DIR}/snponly.efi" \
|
||||
"/shared/html/custom-ipxe"
|
||||
fi
|
||||
|
||||
# Set up inotify to kill the container (restart) whenever cert files for ironic api change
|
||||
if [[ "$IRONIC_TLS_SETUP" == "true" ]] && [[ "${RESTART_CONTAINER_CERTIFICATE_UPDATED}" == "true" ]]; then
|
||||
# shellcheck disable=SC2034
|
||||
inotifywait -m -e delete_self "${IRONIC_CERT_FILE}" | while read -r file event; do
|
||||
kill -WINCH $(pgrep httpd)
|
||||
done &
|
||||
fi
|
||||
configure_restart_on_certificate_update "${IRONIC_TLS_SETUP}" httpd "${IRONIC_CERT_FILE}"
|
||||
|
||||
# Set up inotify to kill the container (restart) whenever cert of httpd for /shared/html/<redifsh;ilo> path change
|
||||
if [[ "$IRONIC_VMEDIA_TLS_SETUP" == "true" ]] && [[ "${RESTART_CONTAINER_CERTIFICATE_UPDATED}" == "true" ]]; then
|
||||
# shellcheck disable=SC2034
|
||||
inotifywait -m -e delete_self "${IRONIC_VMEDIA_CERT_FILE}" | while read -r file event; do
|
||||
kill -WINCH $(pgrep httpd)
|
||||
done &
|
||||
fi
|
||||
configure_restart_on_certificate_update "${IRONIC_VMEDIA_TLS_SETUP}" httpd "${IRONIC_VMEDIA_CERT_FILE}"
|
||||
|
||||
exec /usr/sbin/httpd -DFOREGROUND -f /etc/httpd/conf/httpd.conf
|
||||
exec /usr/sbin/httpd -DFOREGROUND -f "${HTTPD_CONF_DIR}/httpd.conf"
|
18
ironic-image/scripts/runironic
Executable file
18
ironic-image/scripts/runironic
Executable file
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/configure-ironic.sh
|
||||
|
||||
# Ramdisk logs
|
||||
mkdir -p /shared/log/ironic/deploy
|
||||
|
||||
# Allows skipping dbsync if it's done by an external job
|
||||
if [[ "${IRONIC_SKIP_DBSYNC:-false}" != true ]]; then
|
||||
run_ironic_dbsync
|
||||
fi
|
||||
|
||||
configure_restart_on_certificate_update "${IRONIC_TLS_SETUP}" ironic "${IRONIC_CERT_FILE}"
|
||||
|
||||
configure_ironic_auth
|
||||
|
||||
exec /usr/bin/ironic --config-dir "${IRONIC_CONF_DIR}"
|
17
ironic-image/scripts/runlogwatch.sh
Executable file
17
ironic-image/scripts/runlogwatch.sh
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
# Ramdisk logs path
|
||||
LOG_DIR="/shared/log/ironic/deploy"
|
||||
|
||||
mkdir -p "${LOG_DIR}"
|
||||
|
||||
# shellcheck disable=SC2034
|
||||
python3.11 -m pyinotify --raw-format -e IN_CLOSE_WRITE -v "${LOG_DIR}" |
|
||||
while read -r event dir mask maskname filename filepath pathname wd; do
|
||||
#NOTE(elfosardo): a pyinotify event looks like this:
|
||||
# <Event dir=False mask=0x8 maskname=IN_CLOSE_WRITE name=mylogs.gzip path=/shared/log/ironic/deploy pathname=/shared/log/ironic/deploy/mylogs.gzip wd=1 >
|
||||
FILENAME=$(echo "${filename}" | cut -d'=' -f2-)
|
||||
echo "************ Contents of ${LOG_DIR}/${FILENAME} ramdisk log file bundle **************"
|
||||
tar -xOzvvf "${LOG_DIR}/${FILENAME}" | sed -e "s/^/${FILENAME}: /"
|
||||
rm -f "${LOG_DIR}/${FILENAME}"
|
||||
done
|
10
ironic-image/scripts/runonline-data-migrations
Executable file
10
ironic-image/scripts/runonline-data-migrations
Executable file
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
. /bin/configure-ironic.sh
|
||||
|
||||
# NOTE(dtantsur): no retries here: this script is supposed to be run as a Job
|
||||
# that is retried on failure.
|
||||
exec ironic-dbsync --config-file "${IRONIC_CONF_DIR}/ironic.conf" online_data_migrations
|
@@ -95,3 +95,21 @@ if [[ -f "$MARIADB_CACERT_FILE" ]]; then
|
||||
else
|
||||
export MARIADB_TLS_ENABLED="false"
|
||||
fi
|
||||
|
||||
configure_restart_on_certificate_update()
|
||||
{
|
||||
local enabled="$1"
|
||||
local service="$2"
|
||||
local cert_file="$3"
|
||||
local signal="TERM"
|
||||
|
||||
if [[ "${enabled}" == "true" ]] && [[ "${RESTART_CONTAINER_CERTIFICATE_UPDATED}" == "true" ]]; then
|
||||
if [[ "${service}" == httpd ]]; then
|
||||
signal="WINCH"
|
||||
fi
|
||||
python3 -m pyinotify --raw-format -e IN_DELETE_SELF -v "${cert_file}" |
|
||||
while read -r; do
|
||||
pkill "-${signal}" "${service}"
|
||||
done &
|
||||
fi
|
||||
}
|
@@ -1,7 +1,6 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.3
|
||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.3-%RELEASE%
|
||||
#!BuildVersion: 15.6
|
||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.8
|
||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.8-%RELEASE%
|
||||
ARG SLE_VERSION
|
||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||
|
||||
@@ -19,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.3"
|
||||
LABEL org.opencontainers.image.version="3.0.8"
|
||||
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.3-%RELEASE%"
|
||||
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic-ipa-downloader:3.0.8-%RELEASE%"
|
||||
LABEL org.openbuildservice.disturl="%DISTURL%"
|
||||
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
||||
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
||||
@@ -34,8 +33,6 @@ LABEL com.suse.release-stage="released"
|
||||
|
||||
COPY --from=base /installroot /
|
||||
RUN cp /getopt /usr/bin/
|
||||
RUN cp /srv/tftpboot/openstack-ironic-image/initrd*.zst /tmp
|
||||
RUN cp /srv/tftpboot/openstack-ironic-image/openstack-ironic-image*.kernel /tmp
|
||||
RUN sha256sum /srv/tftpboot/openstack-ironic-image/initrd*.zst /srv/tftpboot/openstack-ironic-image/openstack-ironic-image*.kernel > /tmp/images.sha256
|
||||
# configure non-root user
|
||||
COPY configure-nonroot.sh /bin/
|
||||
|
43
ironic-ipa-downloader-image/Dockerfile.aarch64
Normal file
43
ironic-ipa-downloader-image/Dockerfile.aarch64
Normal file
@@ -0,0 +1,43 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader-aarch64:3.0.8
|
||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader-aarch64:3.0.8-%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 ironic-ipa-ramdisk-aarch64 tar gawk curl xz zstd shadow cpio findutils
|
||||
|
||||
RUN cp /usr/bin/getopt /installroot/
|
||||
|
||||
FROM micro AS final
|
||||
|
||||
# Define labels according to https://en.opensuse.org/Building_derived_containers
|
||||
# labelprefix=com.suse.application.ironic
|
||||
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.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.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 /
|
||||
RUN cp /getopt /usr/bin/
|
||||
RUN sha256sum /srv/tftpboot/openstack-ironic-image/initrd*.zst /srv/tftpboot/openstack-ironic-image/openstack-ironic-image*.kernel > /tmp/images.sha256
|
||||
# configure non-root user
|
||||
COPY configure-nonroot.sh /bin/
|
||||
RUN set -euo pipefail; chmod +x /bin/configure-nonroot.sh
|
||||
RUN set -euo pipefail; /bin/configure-nonroot.sh && rm -f /bin/configure-nonroot.sh
|
||||
COPY get-resource.sh /usr/local/bin/get-resource.sh
|
||||
|
||||
RUN set -euo pipefail; chmod +x /usr/local/bin/get-resource.sh
|
43
ironic-ipa-downloader-image/Dockerfile.x86_64
Normal file
43
ironic-ipa-downloader-image/Dockerfile.x86_64
Normal file
@@ -0,0 +1,43 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader-x86_64:3.0.8
|
||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader-x86_64:3.0.8-%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 ironic-ipa-ramdisk-x86_64 tar gawk curl xz zstd shadow cpio findutils
|
||||
|
||||
RUN cp /usr/bin/getopt /installroot/
|
||||
|
||||
FROM micro AS final
|
||||
|
||||
# Define labels according to https://en.opensuse.org/Building_derived_containers
|
||||
# labelprefix=com.suse.application.ironic
|
||||
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.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.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 /
|
||||
RUN cp /getopt /usr/bin/
|
||||
RUN sha256sum /srv/tftpboot/openstack-ironic-image/initrd*.zst /srv/tftpboot/openstack-ironic-image/openstack-ironic-image*.kernel > /tmp/images.sha256
|
||||
# configure non-root user
|
||||
COPY configure-nonroot.sh /bin/
|
||||
RUN set -euo pipefail; chmod +x /bin/configure-nonroot.sh
|
||||
RUN set -euo pipefail; /bin/configure-nonroot.sh && rm -f /bin/configure-nonroot.sh
|
||||
COPY get-resource.sh /usr/local/bin/get-resource.sh
|
||||
|
||||
RUN set -euo pipefail; chmod +x /usr/local/bin/get-resource.sh
|
4
ironic-ipa-downloader-image/_multibuild
Normal file
4
ironic-ipa-downloader-image/_multibuild
Normal file
@@ -0,0 +1,4 @@
|
||||
<multibuild>
|
||||
<flavor>x86_64</flavor>
|
||||
<flavor>aarch64</flavor>
|
||||
</multibuild>
|
@@ -2,6 +2,8 @@
|
||||
<service mode="buildtime" name="kiwi_metainfo_helper"/>
|
||||
<service mode="buildtime" name="docker_label_helper"/>
|
||||
<service name="replace_using_env" mode="buildtime">
|
||||
<param name="file">Dockerfile.aarch64</param>
|
||||
<param name="file">Dockerfile.x86_64</param>
|
||||
<param name="file">Dockerfile</param>
|
||||
<param name="eval">IMG_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?img_prefix})</param>
|
||||
<param name="var">IMG_PREFIX</param>
|
||||
|
@@ -6,6 +6,8 @@ export http_proxy=${http_proxy:-$HTTP_PROXY}
|
||||
export https_proxy=${https_proxy:-$HTTPS_PROXY}
|
||||
export no_proxy=${no_proxy:-$NO_PROXY}
|
||||
|
||||
IMAGES_BASE_PATH="/srv/tftpboot/openstack-ironic-image"
|
||||
|
||||
if [ -d "/tmp/ironic-certificates" ]; then
|
||||
sha256sum /tmp/ironic-certificates/* > /tmp/certificates.sha256
|
||||
if cmp "/shared/certificates.sha256" "/tmp/certificates.sha256"; then
|
||||
@@ -26,11 +28,15 @@ if [ -z "${IPA_BASEURI}" ]; then
|
||||
IMAGE_CHANGED=1
|
||||
# SLES BASED IPA - ironic-ipa-ramdisk-x86_64 and ironic-ipa-ramdisk-aarch64 packages
|
||||
mkdir -p /shared/html/images
|
||||
cp /tmp/initrd-x86_64.zst /shared/html/images/ironic-python-agent-x86_64.initramfs
|
||||
cp /tmp/openstack-ironic-image.x86_64*.kernel /shared/html/images/ironic-python-agent-x86_64.kernel
|
||||
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
|
||||
fi
|
||||
# Use arm64 as destination for iPXE compatibility
|
||||
cp /tmp/initrd-aarch64.zst /shared/html/images/ironic-python-agent-arm64.initramfs
|
||||
cp /tmp/openstack-ironic-image.aarch64*.kernel /shared/html/images/ironic-python-agent-arm64.kernel
|
||||
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
|
||||
fi
|
||||
|
||||
cp /tmp/images.sha256 /shared/images.sha256
|
||||
else
|
||||
|
@@ -13,11 +13,6 @@ echo "Configure image: [$kiwi_iname]..."
|
||||
#------------------------------------------
|
||||
baseSetupBuildDay
|
||||
|
||||
#======================================
|
||||
# Mount system filesystems
|
||||
#--------------------------------------
|
||||
#baseMount
|
||||
|
||||
#==========================================
|
||||
# remove unneded kernel files
|
||||
#------------------------------------------
|
||||
@@ -39,12 +34,8 @@ suseImportBuildKey
|
||||
#--------------------------------------
|
||||
baseInsertService openstack-ironic-python-agent
|
||||
baseInsertService suse-ironic-image-setup
|
||||
baseInsertService suse-network-setup
|
||||
baseInsertService sshd
|
||||
baseInsertService NetworkManager
|
||||
#suseInsertService sshd
|
||||
#suseInsertService openstack-ironic-python-agent
|
||||
#suseInsertService suse-ironic-image-setup
|
||||
|
||||
echo 'DEFAULT_TIMEZONE="UTC"' >> /etc/sysconfig/clock
|
||||
baseUpdateSysConfig /etc/sysconfig/clock HWCLOCK "-u"
|
||||
@@ -64,42 +55,7 @@ sed -E 's/^(ExecStart=.*\/agetty).*(--noclear.*)/\1 \2 --autologin root/' /usr/l
|
||||
#------------------------------------------
|
||||
echo 'tmpfs /tmp tmpfs size=3G 0 0' >> /etc/fstab
|
||||
|
||||
#==========================================
|
||||
# remove package docs and manuals
|
||||
#------------------------------------------
|
||||
#baseStripDocs
|
||||
#baseStripMans
|
||||
#baseStripInfos
|
||||
|
||||
#======================================
|
||||
# only basic version of vim is
|
||||
# installed; no syntax highlighting
|
||||
#--------------------------------------
|
||||
sed -i -e's/^syntax on/" syntax on/' /etc/vimrc
|
||||
|
||||
#======================================
|
||||
# Remove yast if not in use
|
||||
#--------------------------------------
|
||||
#suseRemoveYaST
|
||||
|
||||
#======================================
|
||||
# Remove package manager
|
||||
#--------------------------------------
|
||||
#suseStripPackager
|
||||
|
||||
#rm -f usr/lib/perl5/*/*/auto/Encode/??/??.so # 9MB
|
||||
|
||||
#======================================
|
||||
# Umount kernel filesystems
|
||||
#--------------------------------------
|
||||
#baseCleanMount
|
||||
|
||||
ln -s /sbin/init /init
|
||||
|
||||
#==========================================
|
||||
# umount
|
||||
#------------------------------------------
|
||||
umount /proc >/dev/null 2>&1
|
||||
|
||||
exit 0
|
||||
|
||||
|
@@ -12,6 +12,7 @@
|
||||
<locale>en_US</locale>
|
||||
<packagemanager>zypper</packagemanager>
|
||||
<rpm-check-signatures>false</rpm-check-signatures>
|
||||
<rpm-excludedocs>true</rpm-excludedocs>
|
||||
<timezone>UTC</timezone>
|
||||
<version>1.0.0</version>
|
||||
</preferences>
|
||||
@@ -102,64 +103,25 @@
|
||||
<package name="libxcb-render0"/>
|
||||
<package name="libxcb-shm0"/>
|
||||
<package name="libxcb1"/>
|
||||
<package name="plymouth"/>
|
||||
<package name="plymouth-branding-SLE"/>
|
||||
<package name="kernel-firmware-amdgpu"/>
|
||||
<package name="kernel-firmware-ath10k"/>
|
||||
<package name="kernel-firmware-ath11k"/>
|
||||
<package name="kernel-firmware-ath12k"/>
|
||||
<package name="kernel-firmware-atheros"/>
|
||||
<package name="kernel-firmware-bluetooth"/>
|
||||
<package name="kernel-firmware-brcm"/>
|
||||
<package name="kernel-firmware-i915"/>
|
||||
<package name="kernel-firmware-iwlwifi"/>
|
||||
<package name="kernel-firmware-media"/>
|
||||
<package name="kernel-firmware-nvidia"/>
|
||||
<package name="kernel-firmware-qcom"/>
|
||||
<package name="kernel-firmware-radeon"/>
|
||||
<package name="kernel-firmware-realtek"/>
|
||||
<package name="kernel-firmware-sound"/>
|
||||
<package name="kernel-firmware-ti"/>
|
||||
<package name="kernel-firmware-ueagle"/>
|
||||
</packages>
|
||||
|
||||
<packages type="image">
|
||||
<package name="checkmedia"/>
|
||||
<package name="plymouth-branding-SLE"/>
|
||||
<package name="plymouth-dracut"/>
|
||||
<package name="plymouth-theme-bgrt"/>
|
||||
<package name="grub2-branding-SLE"/>
|
||||
<package name="iputils"/>
|
||||
<package name="vim"/>
|
||||
<package name="grub2"/>
|
||||
<package name="grub2-x86_64-efi" arch="x86_64"/>
|
||||
<package name="grub2-arm64-efi" arch="aarch64"/>
|
||||
<package name="grub2-i386-pc" arch="x86_64"/>
|
||||
<package name="syslinux" arch="x86_64"/>
|
||||
<package name="lvm2"/>
|
||||
<package name="plymouth"/>
|
||||
<package name="fontconfig"/>
|
||||
<package name="fonts-config"/>
|
||||
<package name="openssh"/>
|
||||
<package name="iproute2"/>
|
||||
<package name="which"/>
|
||||
<package name="kernel-firmware"/>
|
||||
<package name="kernel-default"/>
|
||||
<package name="NetworkManager"/>
|
||||
<package name="nm-configurator"/>
|
||||
<package name="timezone"/>
|
||||
<package name="haveged"/>
|
||||
<!-- ironic-python-agent specific -->
|
||||
<package name="openstack-ironic-python-agent"/>
|
||||
<package name="hdparm"/>
|
||||
<package name="qemu-tools"/>
|
||||
<package name="python311-proliantutils"/>
|
||||
<package name="lshw"/>
|
||||
<package name="dmidecode"/>
|
||||
<package name="efibootmgr"/>
|
||||
<package name="gptfdisk"/>
|
||||
<package name="open-iscsi"/>
|
||||
<package name="hwinfo"/>
|
||||
<package name="ipmitool"/>
|
||||
<package name="iputils"/>
|
||||
<package name="lvm2"/>
|
||||
<package name="net-tools"/>
|
||||
<package name="ntp"/>
|
||||
<package name="parted"/>
|
||||
<package name="psmisc"/>
|
||||
<package name="timezone"/>
|
||||
<package name="which"/>
|
||||
<package name="kbd"/>
|
||||
</packages>
|
||||
|
||||
<packages type="kis">
|
||||
<package name="dracut-kiwi-oem-repart"/>
|
||||
<package name="dracut-kiwi-oem-dump"/>
|
||||
</packages>
|
||||
|
||||
<packages type="bootstrap">
|
||||
<package name="glibc-locale"/>
|
||||
<package name="udev"/>
|
||||
@@ -167,5 +129,50 @@
|
||||
<package name="cracklib-dict-full"/>
|
||||
<package name="ca-certificates"/>
|
||||
<package name="sles-release"/>
|
||||
|
||||
<package name="checkmedia"/>
|
||||
<package name="fontconfig"/>
|
||||
<package name="fonts-config"/>
|
||||
<package name="grub2-arm64-efi" arch="aarch64"/>
|
||||
<package name="grub2-branding-SLE"/>
|
||||
<package name="grub2-i386-pc" arch="x86_64"/>
|
||||
<package name="grub2-x86_64-efi" arch="x86_64"/>
|
||||
<package name="grub2"/>
|
||||
<package name="iproute2"/>
|
||||
<package name="iputils"/>
|
||||
<package name="kernel-default"/>
|
||||
<package name="kernel-firmware-all"/>
|
||||
<package name="lvm2"/>
|
||||
<package name="NetworkManager"/>
|
||||
<package name="nm-configurator"/>
|
||||
<package name="openssh"/>
|
||||
<package name="timezone"/>
|
||||
<package name="which"/>
|
||||
<!-- ironic-python-agent specific -->
|
||||
<package name="dmidecode"/>
|
||||
<package name="efibootmgr"/>
|
||||
<package name="gptfdisk"/>
|
||||
<package name="hdparm"/>
|
||||
<package name="hwinfo"/>
|
||||
<package name="ipmitool"/>
|
||||
<package name="iputils"/>
|
||||
<package name="kbd"/>
|
||||
<package name="lshw"/>
|
||||
<package name="lvm2"/>
|
||||
<package name="net-tools"/>
|
||||
<package name="ntp"/>
|
||||
<package name="open-iscsi"/>
|
||||
<package name="openstack-ironic-python-agent"/>
|
||||
<package name="parted"/>
|
||||
<package name="psmisc"/>
|
||||
<package name="python311-proliantutils"/>
|
||||
<package name="qemu-tools"/>
|
||||
<package name="timezone"/>
|
||||
<package name="which"/>
|
||||
</packages>
|
||||
|
||||
<packages type="kis">
|
||||
<package name="dracut-kiwi-oem-repart"/>
|
||||
<package name="dracut-kiwi-oem-dump"/>
|
||||
</packages>
|
||||
</image>
|
||||
|
@@ -19,7 +19,7 @@
|
||||
|
||||
|
||||
Name: ironic-ipa-ramdisk
|
||||
Version: 3.0.3
|
||||
Version: 3.0.7
|
||||
Release: 0
|
||||
Summary: Kernel and ramdisk image for OpenStack Ironic
|
||||
License: SUSE-EULA
|
||||
@@ -27,7 +27,7 @@ Group: System/Management
|
||||
URL: https://github.com/SUSE-Cloud/
|
||||
Source0: config.sh
|
||||
Source10: ironic-ipa-ramdisk.kiwi
|
||||
Source20: root.tar.bz2
|
||||
Source20: root
|
||||
|
||||
BuildRequires: -post-build-checks
|
||||
BuildRequires: bash
|
||||
@@ -38,7 +38,7 @@ BuildArch: noarch
|
||||
|
||||
BuildRequires: checkmedia
|
||||
BuildRequires: acl
|
||||
BuildRequires: ca-certificates
|
||||
BuildRequires: ca-certificates-mozilla-prebuilt
|
||||
BuildRequires: cracklib-dict-full
|
||||
BuildRequires: cron
|
||||
BuildRequires: dbus-1
|
||||
@@ -62,7 +62,7 @@ BuildRequires: ipmitool
|
||||
BuildRequires: iproute2
|
||||
BuildRequires: iputils
|
||||
BuildRequires: kernel-default
|
||||
BuildRequires: kernel-firmware
|
||||
BuildRequires: kernel-firmware-all
|
||||
BuildRequires: lvm2
|
||||
BuildRequires: net-tools
|
||||
BuildRequires: ntp
|
||||
@@ -123,13 +123,13 @@ Kernel and ramdisk image for use with Metal3
|
||||
For %{_arch}
|
||||
|
||||
%prep
|
||||
mkdir -p /tmp/openstack-ironic-image/build /tmp/openstack-ironic-image/root /tmp/openstack-ironic-image/img
|
||||
mkdir -p /tmp/openstack-ironic-image/build /tmp/openstack-ironic-image/img
|
||||
|
||||
cp -a %{SOURCE0} /tmp/openstack-ironic-image/config.sh
|
||||
|
||||
cp -a %{SOURCE10} /tmp/openstack-ironic-image/config.kiwi
|
||||
|
||||
tar -xC /tmp/openstack-ironic-image/root -f %{SOURCE20}
|
||||
cp -ar %{SOURCE20} /tmp/openstack-ironic-image/root
|
||||
|
||||
%build
|
||||
if ! which kiwi; then
|
||||
|
BIN
ironic-ipa-ramdisk/root.tar.bz2
(Stored with Git LFS)
BIN
ironic-ipa-ramdisk/root.tar.bz2
(Stored with Git LFS)
Binary file not shown.
@@ -0,0 +1,24 @@
|
||||
# WARNING: This file has been modified by the diskimage-builder
|
||||
# dhcp-all-interfaces element as this machine is likely running
|
||||
# a ramdisk or needs to attempt auto-configuration on all interfaces.
|
||||
[main]
|
||||
# This makes sense even with dhcp on all interfaces in the event
|
||||
# that the configuration has been or is being supplied via external means.
|
||||
ignore-carrier=*
|
||||
# Use dhclient as was done previously to the Centos8/RHEL8 RPM defaults.
|
||||
# This is because dhclient shuts the interface down after a retry attempt
|
||||
# which allows the link state to reset with some switches, which may be
|
||||
# important for the ramdisk to recover networking.
|
||||
dhcp=dhclient
|
||||
|
||||
[connection]
|
||||
# Keep retrying, this is important for this important espescialy for
|
||||
# ramdisks in environments where varying switch configurations may
|
||||
# cause traffic to be blocked or intermittent connectivity failures
|
||||
# such as those at an edge site may cause issues.
|
||||
autoconnect-retries=-1
|
||||
# Set the timeout. Diskimage-builder dhcp-all-interfaces has a 30
|
||||
# second default. NetworkManager, by default, is 45 seconds.
|
||||
# In some cases where ramdisks are in use, 60 seconds is advisable.
|
||||
ipv4.dhcp-timeout=30
|
||||
ipv6.dhcp-timeout=30
|
1
ironic-ipa-ramdisk/root/etc/ironic-python-agent.conf.d
Symbolic link
1
ironic-ipa-ramdisk/root/etc/ironic-python-agent.conf.d
Symbolic link
@@ -0,0 +1 @@
|
||||
ironic-python-agent/ironic-python-agent.conf.d
|
1
ironic-ipa-ramdisk/root/etc/issue
Normal file
1
ironic-ipa-ramdisk/root/etc/issue
Normal file
@@ -0,0 +1 @@
|
||||
SUSE Ironic Python Agent Ramdisk - terminal \l
|
2
ironic-ipa-ramdisk/root/etc/sysctl.d/98-rp_filter.conf
Normal file
2
ironic-ipa-ramdisk/root/etc/sysctl.d/98-rp_filter.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
# avoid problems with multiple network interfaces
|
||||
net.ipv4.conf.all.rp_filter=0
|
@@ -0,0 +1,7 @@
|
||||
[Unit]
|
||||
#WantsMountsFor=/mnt/ipa
|
||||
After=mnt-ipa.mount
|
||||
Wants=mnt-ipa.mount
|
||||
|
||||
[Service]
|
||||
ExecStartPre=-/usr/local/bin/suse-network-setup.sh
|
7
ironic-ipa-ramdisk/root/etc/systemd/system/mnt-ipa.mount
Normal file
7
ironic-ipa-ramdisk/root/etc/systemd/system/mnt-ipa.mount
Normal file
@@ -0,0 +1,7 @@
|
||||
[Unit]
|
||||
Description=config-2 rom consumed by IPA for networking configuration
|
||||
|
||||
[Mount]
|
||||
What=/dev/ipa
|
||||
Where=/mnt/ipa
|
||||
TimeoutSec=30
|
@@ -0,0 +1,12 @@
|
||||
[Unit]
|
||||
Description=Setup ironic-python-agent image
|
||||
After=getty.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/local/bin/suse-ironic-image-setup.sh
|
||||
StandardOutput=journal+console
|
||||
RemainAfterExit=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
@@ -0,0 +1,3 @@
|
||||
[Unit]
|
||||
Before=local-fs.target
|
||||
WantedBy=local-fs.target
|
@@ -0,0 +1 @@
|
||||
ACTION=="add|change", SUBSYSTEM=="block", ENV{ID_FS_LABEL}=="config-2", ENV{ID_FS_PUBLISHER_ID}=="?*", PROGRAM="/usr/local/bin/suse-test-config-2.sh", SYMLINK+="ipa"
|
52
ironic-ipa-ramdisk/root/usr/local/bin/suse-ironic-image-setup.sh
Executable file
52
ironic-ipa-ramdisk/root/usr/local/bin/suse-ironic-image-setup.sh
Executable file
@@ -0,0 +1,52 @@
|
||||
#!/bin/sh
|
||||
PARAMS=$(</proc/cmdline)
|
||||
# find vfloppy device (based on IPA code)
|
||||
VMEDIA_DEVICE=$(find /dev/disk/by-label -iname ir-vfd-dev)
|
||||
# read params from vmedia and prepend them to params from kernel cmdline
|
||||
if [[ -b "$VMEDIA_DEVICE" ]]; then
|
||||
VMEDIA_MOUNT=$(mktemp -d)
|
||||
if mount -o loop $VMEDIA_DEVICE $VMEDIA_MOUNT; then
|
||||
# parameters.txt has one param per line, reformat to match cmdline
|
||||
VMEDIA_PARAMS=$(cat $VMEDIA_MOUNT/parameters.txt | tr '\n' ' ')
|
||||
umount $VMEDIA_MOUNT
|
||||
PARAMS="$VMEDIA_PARAMS $PARAMS"
|
||||
fi
|
||||
rmdir $VMEDIA_MOUNT
|
||||
fi
|
||||
|
||||
# resize /tmp
|
||||
if [[ $PARAMS =~ suse.tmpsize=([^ ]+) ]]; then
|
||||
echo "Resizing /tmp to ${BASH_REMATCH[1]}..."
|
||||
mount -o remount,size=${BASH_REMATCH[1]} /tmp
|
||||
fi
|
||||
# deploy authorized sshkey from kernel command line
|
||||
if [[ $PARAMS =~ sshkey=\"([^\"]+)\" ]]; then
|
||||
echo "Adding authorized SSH key..."
|
||||
(umask 077 ; mkdir -p /root/.ssh)
|
||||
echo "${BASH_REMATCH[1]}" >> /root/.ssh/authorized_keys
|
||||
fi
|
||||
# Inject certs
|
||||
if [[ $PARAMS =~ tls.enabled=(true|True) ]]; then
|
||||
cp /etc/ironic-python-agent.d/ca-certs/* /etc/pki/trust/anchors/
|
||||
cp /etc/ironic-python-agent.d/ca-certs/* /usr/share/pki/trust/anchors/
|
||||
update-ca-certificates
|
||||
fi
|
||||
# autologin root on given console (default tty1) if suse.autologin or coreos.autologin is enabled
|
||||
if [[ $PARAMS =~ (suse|coreos)\.autologin=?([^ ]*) ]]; then
|
||||
tty="${BASH_REMATCH[2]:-tty1}"
|
||||
echo "Enabling autologin on $tty..."
|
||||
systemctl stop getty@$tty
|
||||
systemctl disable getty@$tty
|
||||
systemctl start autologin@$tty
|
||||
fi
|
||||
|
||||
# Append to /etc/hosts
|
||||
# hosts.append=1.2.3.4_foo,4.5.6.7_foo2
|
||||
if [[ $PARAMS =~ hosts.append=([^ ]+) ]]; then
|
||||
HOSTS=${BASH_REMATCH[1]}
|
||||
echo "Appending to hosts ${HOSTS}..."
|
||||
for h in ${HOSTS/,/ }; do
|
||||
echo "${h/_/ }" >> /etc/hosts
|
||||
done
|
||||
cat /etc/hosts
|
||||
fi
|
24
ironic-ipa-ramdisk/root/usr/local/bin/suse-network-setup.sh
Executable file
24
ironic-ipa-ramdisk/root/usr/local/bin/suse-network-setup.sh
Executable file
@@ -0,0 +1,24 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eux
|
||||
|
||||
# Inspired by/based on glean-early.sh
|
||||
# https://opendev.org/opendev/glean/src/branch/master/glean/init/glean-early.sh
|
||||
|
||||
# NOTE(TheJulia): We care about iso images, and would expect lower case as a
|
||||
# result. In the case of VFAT partitions, they would be upper case.
|
||||
|
||||
PATH=/bin:/usr/bin:/sbin:/usr/sbin
|
||||
NETWORK_DATA_FILE="/mnt/ipa/openstack/latest/network_data.json"
|
||||
|
||||
|
||||
if [ ! -f "${NETWORK_DATA_FILE}" ]; then
|
||||
echo "No network_data.json found, skipping network configuration"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p /tmp/nmc/{desired,generated}
|
||||
cp ${NETWORK_DATA_FILE} /tmp/nmc/desired/_all.yaml
|
||||
|
||||
nmc generate --config-dir /tmp/nmc/desired --output-dir /tmp/nmc/generated
|
||||
nmc apply --config-dir /tmp/nmc/generated
|
23
ironic-ipa-ramdisk/root/usr/local/bin/suse-test-config-2.sh
Executable file
23
ironic-ipa-ramdisk/root/usr/local/bin/suse-test-config-2.sh
Executable file
@@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eux
|
||||
|
||||
PATH=/bin:/usr/bin:/sbin:/usr/sbin
|
||||
|
||||
# Transform the ID from the drive being considered to lower case
|
||||
device_publisher_id=$(echo ${ID_FS_PUBLISHER_ID} | tr '[A-Z]' '[a-z]')
|
||||
|
||||
# Retrieve the publisher ID from the command line and convert to lower case
|
||||
cmdline_publisher_id=""
|
||||
if grep -q "ir_pub_id" /proc/cmdline; then
|
||||
cmdline_publisher_id=$(cat /proc/cmdline | sed -e 's/^.*ir_pub_id=//' -e 's/ .*$//')
|
||||
fi
|
||||
|
||||
# Is this the filesystem we are looking for?
|
||||
if [[ "${cmdline_publisher_id}" == "${device_publisher_id}" ]]; then
|
||||
# It is the device we are looking for, return success
|
||||
exit 0
|
||||
else
|
||||
# Not a match, return failure
|
||||
exit 1
|
||||
fi
|
@@ -1,6 +1,7 @@
|
||||
#!BuildTag: %%IMG_PREFIX%%kiwi-builder:%%kiwi_version%%.0-%RELEASE%
|
||||
#!BuildTag: %%IMG_PREFIX%%kiwi-builder:%%kiwi_version%%.0
|
||||
#!BuildTag: %%IMG_PREFIX%%kiwi-builder:10.2.12.0-%RELEASE%
|
||||
#!BuildTag: %%IMG_PREFIX%%kiwi-builder:10.2.12.0
|
||||
|
||||
# Base image version, should match the tag above
|
||||
ARG KIWIVERSION="10.2.12"
|
||||
FROM registry.suse.com/bci/kiwi:${KIWIVERSION}
|
||||
ARG KIWIVERSION
|
||||
@@ -10,11 +11,11 @@ ARG KIWIVERSION
|
||||
LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)"
|
||||
LABEL org.opencontainers.image.title="SLE Kiwi Builder Container Image"
|
||||
LABEL org.opencontainers.image.description="kiwi-builder based on the SLE Base Container Image."
|
||||
LABEL org.opencontainers.image.version="%%kiwi_version%%"
|
||||
LABEL org.opencontainers.image.version="${KIWIVERSION}"
|
||||
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%%kiwi-builder:%%kiwi_version%%.0-%RELEASE%"
|
||||
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%kiwi-builder:${KIWIVERSION}.0-%RELEASE%"
|
||||
LABEL org.openbuildservice.disturl="%DISTURL%"
|
||||
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
||||
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
||||
@@ -23,9 +24,6 @@ LABEL com.suse.image-type="application"
|
||||
LABEL com.suse.release-stage="released"
|
||||
# endlabelprefix
|
||||
|
||||
# help the build service understand the need for python3-kiwi
|
||||
RUN zypper -n install -d -D python3-kiwi; [ "%%kiwi_version%%" = "${KIWIVERSION}" ] || { echo "expected kiwi version ${KIWIVERSION}: version mismatch"; exit 1; }
|
||||
|
||||
# Copy build script into image and make it executable
|
||||
ADD build-image.sh /usr/bin/build-image
|
||||
RUN chmod a+x /usr/bin/build-image
|
||||
|
@@ -1,15 +1,9 @@
|
||||
<services>
|
||||
<service mode="buildtime" name="kiwi_metainfo_helper"/>
|
||||
<service name="docker_label_helper" mode="buildtime"/>
|
||||
<service name="replace_using_env" mode="buildtime">
|
||||
<param name="file">README</param>
|
||||
<param name="eval">IMG_REPO=$(rpm --macros=/root/.rpmmacros -E %img_repo)</param>
|
||||
<param name="var">IMG_REPO</param>
|
||||
<param name="eval">IMG_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?img_prefix})</param>
|
||||
<param name="var">IMG_PREFIX</param>
|
||||
</service>
|
||||
<service name="replace_using_env" mode="buildtime">
|
||||
<param name="file">Dockerfile</param>
|
||||
<param name="file">README</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>
|
||||
@@ -17,14 +11,4 @@
|
||||
<param name="eval">SUPPORT_LEVEL=$(rpm --macros=/root/.rpmmacros -E %support_level)</param>
|
||||
<param name="var">SUPPORT_LEVEL</param>
|
||||
</service>
|
||||
<service mode="buildtime" name="replace_using_package_version">
|
||||
<param name="file">Dockerfile</param>
|
||||
<param name="regex">%%kiwi_version%%</param>
|
||||
<param name="package">python3-kiwi</param>
|
||||
</service>
|
||||
<service mode="buildtime" name="replace_using_package_version">
|
||||
<param name="file">README</param>
|
||||
<param name="regex">%%kiwi_version%%</param>
|
||||
<param name="package">python3-kiwi</param>
|
||||
</service>
|
||||
</services>
|
||||
|
@@ -1,7 +1,6 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#!BuildTag: %%IMG_PREFIX%%kube-rbac-proxy:%%kube-rbac-proxy_version%%
|
||||
#!BuildTag: %%IMG_PREFIX%%kube-rbac-proxy:%%kube-rbac-proxy_version%%-%RELEASE%
|
||||
#!BuildVersion: 15.6
|
||||
ARG SLE_VERSION
|
||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||
|
||||
|
@@ -1,7 +1,6 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#!BuildTag: %%IMG_PREFIX%%kubectl:1.30.3
|
||||
#!BuildTag: %%IMG_PREFIX%%kubectl:1.30.3-%RELEASE%
|
||||
#!BuildVersion: 15.6
|
||||
#!BuildTag: %%IMG_PREFIX%%kubectl:1.32.4
|
||||
#!BuildTag: %%IMG_PREFIX%%kubectl:1.32.4-%RELEASE%
|
||||
ARG SLE_VERSION
|
||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||
|
||||
@@ -16,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.30.3"
|
||||
LABEL org.opencontainers.image.version="1.32.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.30.3-%RELEASE%"
|
||||
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%kubectl:1.32.4-%RELEASE%"
|
||||
LABEL org.openbuildservice.disturl="%DISTURL%"
|
||||
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
||||
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
||||
|
@@ -1,7 +1,7 @@
|
||||
%global debug_package %{nil}
|
||||
|
||||
Name: kubectl
|
||||
Version: 1.30.3
|
||||
Version: 1.32.4
|
||||
Release: 0
|
||||
Summary: Command-line utility for interacting with a Kubernetes cluster
|
||||
|
||||
@@ -12,7 +12,7 @@ Group: admin
|
||||
Packager: Kubernetes Authors <dev@kubernetes.io>
|
||||
License: Apache-2.0
|
||||
URL: https://kubernetes.io
|
||||
Source0: kubectl_%{version}.orig.tar.gz
|
||||
Source0: %{name}_%{version}.orig.tar.gz
|
||||
|
||||
%description
|
||||
%{summary}.
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user