Compare commits
114 Commits
dprodanov-
...
main
Author | SHA256 | Date | |
---|---|---|---|
5ece6cd64e
|
|||
0da5de1c06
|
|||
27af056dce
|
|||
e233adfec2
|
|||
8617c36789
|
|||
aa56c231d4
|
|||
29dd8dda17
|
|||
6012f480b0
|
|||
110a7b1f7c
|
|||
343fcd24b7
|
|||
03d7a39ead
|
|||
e2d38a867c
|
|||
eecd30e90d
|
|||
fc0cfda2c0
|
|||
582aaaa424
|
|||
a94cde2a35
|
|||
ad01fecc4f
|
|||
d59126b517
|
|||
19394a8b03
|
|||
ca7da400d0
|
|||
c69044ff2b
|
|||
60f0bdd5f0
|
|||
4e4f9e591a
|
|||
|
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 |
@@ -17,7 +17,7 @@ jobs:
|
|||||||
object-format: 'sha256'
|
object-format: 'sha256'
|
||||||
- name: Setup dependencies
|
- name: Setup dependencies
|
||||||
run: |
|
run: |
|
||||||
zypper in -y python3-PyYAML
|
zypper in -y python3-ruamel.yaml
|
||||||
- name: Check release manifest
|
- name: Check release manifest
|
||||||
run: |
|
run: |
|
||||||
python3 .obs/manifest-check.py
|
python3 .obs/manifest-check.py --check
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
*/.osc
|
*/.osc
|
||||||
*/__pycache__
|
*/__pycache__
|
||||||
.venv/
|
.venv/
|
||||||
|
.idea/
|
@@ -1,3 +1,3 @@
|
|||||||
PROJECT = "isv:SUSE:Edge:3.3"
|
PROJECT = "isv:SUSE:Edge:Factory"
|
||||||
REPOSITORY = "https://src.opensuse.org/suse-edge/Factory"
|
REPOSITORY = "https://src.opensuse.org/suse-edge/Factory"
|
||||||
BRANCH = "3.3"
|
BRANCH = "main"
|
||||||
|
51
.obs/manifest-check.py
Normal file → Executable file
51
.obs/manifest-check.py
Normal file → Executable file
@@ -1,11 +1,15 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
import yaml
|
import ruamel.yaml
|
||||||
|
import pathlib
|
||||||
|
import argparse
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
yaml = ruamel.yaml.YAML()
|
||||||
|
|
||||||
def get_chart_version(chart_name: str) -> str:
|
def get_chart_version(chart_name: str) -> str:
|
||||||
with open(f"./{chart_name}-chart/Chart.yaml") as f:
|
with open(f"./{chart_name}-chart/Chart.yaml") as f:
|
||||||
chart = yaml.safe_load(f)
|
chart = yaml.load(f)
|
||||||
return chart["version"]
|
return chart["version"]
|
||||||
|
|
||||||
def get_charts(chart):
|
def get_charts(chart):
|
||||||
@@ -21,22 +25,57 @@ def get_charts(chart):
|
|||||||
|
|
||||||
def get_charts_list():
|
def get_charts_list():
|
||||||
with open("./release-manifest-image/release_manifest.yaml") as f:
|
with open("./release-manifest-image/release_manifest.yaml") as f:
|
||||||
manifest = yaml.safe_load(f)
|
manifest = yaml.load(f)
|
||||||
charts = {}
|
charts = {}
|
||||||
for chart in manifest["spec"]["components"]["workloads"]["helm"]:
|
for chart in manifest["spec"]["components"]["workloads"]["helm"]:
|
||||||
charts.update(get_charts(chart))
|
charts.update(get_charts(chart))
|
||||||
return charts
|
return charts
|
||||||
|
|
||||||
def main():
|
def check_charts(fix: bool) -> bool:
|
||||||
print("Checking charts versions in release manifest")
|
|
||||||
success = True
|
success = True
|
||||||
charts = get_charts_list()
|
charts = get_charts_list()
|
||||||
|
to_fix = {}
|
||||||
for chart in charts:
|
for chart in charts:
|
||||||
expected_version = get_chart_version(chart)
|
expected_version = get_chart_version(chart)
|
||||||
if expected_version != charts[chart]:
|
if expected_version != charts[chart]:
|
||||||
success = False
|
success = False
|
||||||
|
to_fix[f'%%CHART_REPO%%/%%CHART_PREFIX%%{chart}'] = expected_version
|
||||||
print(f"{chart}: Expected: {expected_version}, Got: {charts[chart]}")
|
print(f"{chart}: Expected: {expected_version}, Got: {charts[chart]}")
|
||||||
if not success:
|
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)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
print("All local charts in release manifest are using the right version")
|
print("All local charts in release manifest are using the right version")
|
||||||
|
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
|
8
_config
8
_config
@@ -1,4 +1,5 @@
|
|||||||
Prefer: -libqpid-proton10 -python311-urllib3_1
|
Prefer: -libqpid-proton10 -python311-urllib3_1
|
||||||
|
Prefer: -cargo1.58 -cargo1.57 cargo1.88
|
||||||
|
|
||||||
Macros:
|
Macros:
|
||||||
%__python3 /usr/bin/python3.11
|
%__python3 /usr/bin/python3.11
|
||||||
@@ -60,6 +61,7 @@ BuildFlags: onlybuild:release-manifest-image
|
|||||||
BuildFlags: excludebuild:endpoint-copier-operator-image
|
BuildFlags: excludebuild:endpoint-copier-operator-image
|
||||||
BuildFlags: excludebuild:ironic-image
|
BuildFlags: excludebuild:ironic-image
|
||||||
BuildFlags: excludebuild:ironic-ipa-downloader-image
|
BuildFlags: excludebuild:ironic-ipa-downloader-image
|
||||||
|
BuildFlags: excludebuild:kiwi-builder-image
|
||||||
BuildFlags: excludebuild:kubectl-image
|
BuildFlags: excludebuild:kubectl-image
|
||||||
BuildFlags: excludebuild:kube-rbac-proxy-image
|
BuildFlags: excludebuild:kube-rbac-proxy-image
|
||||||
BuildFlags: excludebuild:metallb-controller-image
|
BuildFlags: excludebuild:metallb-controller-image
|
||||||
@@ -104,7 +106,7 @@ BuildFlags: onlybuild:release-manifest-image
|
|||||||
Patterntype: none
|
Patterntype: none
|
||||||
BuildEngine: podman
|
BuildEngine: podman
|
||||||
Prefer: sles-release
|
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
|
# Publish multi-arch container images only once all archs have been built
|
||||||
PublishFlags: archsync
|
PublishFlags: archsync
|
||||||
@@ -149,6 +151,10 @@ BuildFlags: onlybuild:release-manifest-image
|
|||||||
%else
|
%else
|
||||||
%if "%{sub %{reverse %_project} 1 7}" != "%{reverse :ToTest}" && "%{sub %{reverse %_project} 1 9}" != "%{reverse :Snapshot}"
|
%if "%{sub %{reverse %_project} 1 7}" != "%{reverse :ToTest}" && "%{sub %{reverse %_project} 1 9}" != "%{reverse :Snapshot}"
|
||||||
BuildFlags: excludebuild:kiwi-builder-image
|
BuildFlags: excludebuild:kiwi-builder-image
|
||||||
|
%else
|
||||||
|
%ifarch aarch64
|
||||||
|
BuildFlags: onlybuild:kiwi-builder-image
|
||||||
|
%endif
|
||||||
%endif
|
%endif
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
6
_meta
6
_meta
@@ -45,7 +45,7 @@
|
|||||||
<path project="SUSE:SLFO:Products:SLES:16.0" repository="standard"/>
|
<path project="SUSE:SLFO:Products:SLES:16.0" repository="standard"/>
|
||||||
<path project="SUSE:SLFO:Main:Build" repository="standard"/>
|
<path project="SUSE:SLFO:Main:Build" repository="standard"/>
|
||||||
{%- else %}
|
{%- else %}
|
||||||
<path project="SUSE:CA" repository="SLE_15_SP6"/>
|
<path project="SUSE:CA" repository="SLE_15_SP7"/>
|
||||||
<path project="{{ project }}" repository="standard"/>
|
<path project="{{ project }}" repository="standard"/>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
<arch>x86_64</arch>
|
<arch>x86_64</arch>
|
||||||
@@ -56,8 +56,8 @@
|
|||||||
{%- if release_project is defined and not for_release %}
|
{%- if release_project is defined and not for_release %}
|
||||||
<releasetarget project="{{ release_project }}" repository="standard" trigger="manual"/>
|
<releasetarget project="{{ release_project }}" repository="standard" trigger="manual"/>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
<path project="{{ ironic_base }}:2024.2" repository="15.6"/>
|
<path project="{{ ironic_base }}:2025.1" repository="15.7"/>
|
||||||
<path project="SUSE:SLE-15-SP6:Update" repository="standard"/>
|
<path project="SUSE:SLE-15-SP7:Update" repository="standard"/>
|
||||||
<arch>x86_64</arch>
|
<arch>x86_64</arch>
|
||||||
<arch>aarch64</arch>
|
<arch>aarch64</arch>
|
||||||
</repository>
|
</repository>
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
#!BuildTag: %%CHART_PREFIX%%akri-dashboard-extension:%%CHART_MAJOR%%.0.2
|
|
||||||
#!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
|
||||||
#!BuildTag: %%CHART_PREFIX%%akri-dashboard-extension:%%CHART_MAJOR%%.0.2_up1.3.1-%RELEASE%
|
#!BuildTag: %%CHART_PREFIX%%akri-dashboard-extension:%%CHART_MAJOR%%.0.2_up1.3.1-%RELEASE%
|
||||||
annotations:
|
annotations:
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#!BuildTag: %%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%.1
|
#!BuildTag: %%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%.1
|
||||||
#!BuildTag: %%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%.1-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%.1-%RELEASE%
|
||||||
#!BuildVersion: 15.6
|
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||||
|
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
#!BuildTag: %%IMG_PREFIX%%edge-image-builder:1.2.1
|
#!BuildTag: %%IMG_PREFIX%%edge-image-builder:1.2.1
|
||||||
#!BuildTag: %%IMG_PREFIX%%edge-image-builder:1.2.1-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%edge-image-builder:1.2.1-%RELEASE%
|
||||||
#!BuildVersion: 15.6
|
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-base:$SLE_VERSION
|
FROM registry.suse.com/bci/bci-base:$SLE_VERSION
|
||||||
MAINTAINER SUSE LLC (https://www.suse.com/)
|
MAINTAINER SUSE LLC (https://www.suse.com/)
|
||||||
|
@@ -5,7 +5,7 @@ metallb:
|
|||||||
endpoint-copier-operator:
|
endpoint-copier-operator:
|
||||||
chart: endpoint-copier-operator
|
chart: endpoint-copier-operator
|
||||||
repository: "%%CHART_REPO%%/%%CHART_PREFIX%%"
|
repository: "%%CHART_REPO%%/%%CHART_PREFIX%%"
|
||||||
version: "%%CHART_MAJOR%%.0.0+up0.2.1"
|
version: "%%CHART_MAJOR%%.0.1+up0.3.0"
|
||||||
kubernetes:
|
kubernetes:
|
||||||
k3s:
|
k3s:
|
||||||
selinuxPackage: k3s-selinux-1.6-1.slemicro.noarch
|
selinuxPackage: k3s-selinux-1.6-1.slemicro.noarch
|
||||||
|
@@ -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.1_up0.3.0
|
||||||
#!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-%RELEASE%
|
||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
appVersion: v0.2.0
|
appVersion: v0.3.0
|
||||||
description: A Helm chart for Kubernetes
|
description: A Helm chart for Kubernetes
|
||||||
name: endpoint-copier-operator
|
name: endpoint-copier-operator
|
||||||
type: application
|
type: application
|
||||||
version: "%%CHART_MAJOR%%.0.0+up0.2.1"
|
version: "%%CHART_MAJOR%%.0.1+up0.3.0"
|
||||||
|
@@ -20,8 +20,23 @@ spec:
|
|||||||
labels:
|
labels:
|
||||||
{{- include "endpoint-copier-operator.selectorLabels" . | nindent 8 }}
|
{{- include "endpoint-copier-operator.selectorLabels" . | nindent 8 }}
|
||||||
spec:
|
spec:
|
||||||
|
{{- if .Values.priorityClassName }}
|
||||||
|
priorityClassName: {{ .Values.priorityClassName }}
|
||||||
|
{{- end }}
|
||||||
securityContext:
|
securityContext:
|
||||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
{{- 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:
|
containers:
|
||||||
- command:
|
- command:
|
||||||
- /manager
|
- /manager
|
||||||
|
@@ -7,9 +7,9 @@ metadata:
|
|||||||
name: {{ include "endpoint-copier-operator.fullname" . }}
|
name: {{ include "endpoint-copier-operator.fullname" . }}
|
||||||
rules:
|
rules:
|
||||||
- apiGroups:
|
- apiGroups:
|
||||||
- ""
|
- "discovery.k8s.io"
|
||||||
resources:
|
resources:
|
||||||
- endpoints
|
- endpointslices
|
||||||
verbs:
|
verbs:
|
||||||
- create
|
- create
|
||||||
- delete
|
- delete
|
||||||
|
@@ -8,7 +8,7 @@ image:
|
|||||||
repository: %%IMG_REPO%%/%%IMG_PREFIX%%endpoint-copier-operator
|
repository: %%IMG_REPO%%/%%IMG_PREFIX%%endpoint-copier-operator
|
||||||
pullPolicy: IfNotPresent
|
pullPolicy: IfNotPresent
|
||||||
# Overrides the image tag whose default is the chart appVersion.
|
# Overrides the image tag whose default is the chart appVersion.
|
||||||
tag: "0.2.0"
|
tag: "0.3.0"
|
||||||
|
|
||||||
nameOverride: "endpoint-copier-operator"
|
nameOverride: "endpoint-copier-operator"
|
||||||
fullnameOverride: "endpoint-copier-operator"
|
fullnameOverride: "endpoint-copier-operator"
|
||||||
@@ -29,6 +29,8 @@ podSecurityContext:
|
|||||||
seccompProfile:
|
seccompProfile:
|
||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
|
|
||||||
|
priorityClassName: "system-cluster-critical"
|
||||||
|
|
||||||
securityContext:
|
securityContext:
|
||||||
allowPrivilegeEscalation: false
|
allowPrivilegeEscalation: false
|
||||||
capabilities:
|
capabilities:
|
||||||
@@ -37,11 +39,11 @@ securityContext:
|
|||||||
|
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
cpu: 500m
|
cpu: 100m
|
||||||
memory: 128Mi
|
|
||||||
requests:
|
|
||||||
cpu: 10m
|
|
||||||
memory: 64Mi
|
memory: 64Mi
|
||||||
|
requests:
|
||||||
|
cpu: 5m
|
||||||
|
memory: 32Mi
|
||||||
|
|
||||||
autoscaling:
|
autoscaling:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# 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%%
|
||||||
#!BuildTag: %%IMG_PREFIX%%endpoint-copier-operator:%%endpoint-copier-operator_version%%-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%endpoint-copier-operator:%%endpoint-copier-operator_version%%-%RELEASE%
|
||||||
#!BuildVersion: 15.6
|
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
<service name="obs_scm">
|
<service name="obs_scm">
|
||||||
<param name="url">https://github.com/suse-edge/endpoint-copier-operator</param>
|
<param name="url">https://github.com/suse-edge/endpoint-copier-operator</param>
|
||||||
<param name="scm">git</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="version">_auto_</param>
|
||||||
<param name="versionformat">@PARENT_TAG@</param>
|
<param name="versionformat">@PARENT_TAG@</param>
|
||||||
<param name="changesgenerate">enable</param>
|
<param name="changesgenerate">enable</param>
|
||||||
|
@@ -17,14 +17,14 @@
|
|||||||
|
|
||||||
|
|
||||||
Name: endpoint-copier-operator
|
Name: endpoint-copier-operator
|
||||||
Version: 0.2.0
|
Version: 0.3.0
|
||||||
Release: 0.2.0
|
Release: 0.3.0
|
||||||
Summary: Implements a Kubernetes API for copying endpoint resources
|
Summary: Implements a Kubernetes API for copying endpoint resources
|
||||||
License: Apache-2.0
|
License: Apache-2.0
|
||||||
URL: https://github.com/suse-edge/endpoint-copier-operator
|
URL: https://github.com/suse-edge/endpoint-copier-operator
|
||||||
Source: endpoint-copier-operator-%{version}.tar
|
Source: endpoint-copier-operator-%{version}.tar
|
||||||
Source1: vendor.tar.gz
|
Source1: vendor.tar.gz
|
||||||
BuildRequires: golang(API) = 1.20
|
BuildRequires: golang(API) = 1.24
|
||||||
ExcludeArch: s390
|
ExcludeArch: s390
|
||||||
ExcludeArch: %{ix86}
|
ExcludeArch: %{ix86}
|
||||||
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
# SPDX-License-Identifier: MIT
|
||||||
#!BuildTag: %%IMG_PREFIX%%frr:8.5.6
|
#!BuildTag: %%IMG_PREFIX%%frr:8.5.6
|
||||||
#!BuildTag: %%IMG_PREFIX%%frr:8.5.6-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%frr:8.5.6-%RELEASE%
|
||||||
#!BuildVersion: 15.6
|
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||||
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#!BuildTag: %%IMG_PREFIX%%frr-k8s:v%%frr-k8s_version%%
|
#!BuildTag: %%IMG_PREFIX%%frr-k8s:v%%frr-k8s_version%%
|
||||||
#!BuildTag: %%IMG_PREFIX%%frr-k8s:v%%frr-k8s_version%%-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%frr-k8s:v%%frr-k8s_version%%-%RELEASE%
|
||||||
#!BuildVersion: 15.6
|
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||||
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#!BuildTag: %%IMG_PREFIX%%ironic:26.1.2.4
|
#!BuildTag: %%IMG_PREFIX%%ironic:29.0.4.0
|
||||||
#!BuildTag: %%IMG_PREFIX%%ironic:26.1.2.4-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%ironic:29.0.4.0-%RELEASE%
|
||||||
#!BuildVersion: 15.6
|
|
||||||
|
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
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
|
#!ArchExclusiveLine: x86_64
|
||||||
RUN if [ "$(uname -m)" = "x86_64" ];then \
|
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 bind-utils procps qemu-tools sqlite3 util-linux xorriso tftp ipxe-bootimgs python311-sushy-tools crudini openstack-ironic; \
|
||||||
fi
|
fi
|
||||||
#!ArchExclusiveLine: aarch64
|
#!ArchExclusiveLine: aarch64
|
||||||
RUN if [ "$(uname -m)" = "aarch64" ];then \
|
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 bind-utils procps qemu-tools sqlite3 util-linux xorriso tftp ipxe-bootimgs python311-sushy-tools crudini openstack-ironic; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# DATABASE
|
# 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" && \
|
/installroot/usr/bin/sqlite3 /installroot/var/lib/ironic/ironic.sqlite "pragma journal_mode=wal" && \
|
||||||
zypper --installroot /installroot --non-interactive remove sqlite3
|
zypper --installroot /installroot --non-interactive remove sqlite3
|
||||||
|
|
||||||
|
# build actual image
|
||||||
FROM micro AS final
|
FROM micro AS final
|
||||||
|
|
||||||
MAINTAINER SUSE LLC (https://www.suse.com/)
|
MAINTAINER SUSE LLC (https://www.suse.com/)
|
||||||
# Define labels according to https://en.opensuse.org/Building_derived_containers
|
# Define labels according to https://en.opensuse.org/Building_derived_containers
|
||||||
LABEL org.opencontainers.image.title="SLE Openstack Ironic Container Image"
|
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.url="https://www.suse.com/products/server/"
|
||||||
LABEL org.opencontainers.image.created="%BUILDTIME%"
|
LABEL org.opencontainers.image.created="%BUILDTIME%"
|
||||||
LABEL org.opencontainers.image.vendor="SUSE LLC"
|
LABEL org.opencontainers.image.vendor="SUSE LLC"
|
||||||
LABEL org.opencontainers.image.version="26.1.2.4"
|
LABEL org.opencontainers.image.version="29.0.4.0"
|
||||||
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic:26.1.2.4-%RELEASE%"
|
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic:29.0.4.0-%RELEASE%"
|
||||||
LABEL org.openbuildservice.disturl="%DISTURL%"
|
LABEL org.openbuildservice.disturl="%DISTURL%"
|
||||||
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
||||||
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
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
|
COPY mkisofs_wrapper /usr/bin/mkisofs
|
||||||
RUN set -euo pipefail; chmod +x /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 /tftpboot
|
||||||
RUN mkdir -p $GRUB_DIR
|
RUN mkdir -p $GRUB_DIR
|
||||||
|
|
||||||
# No need to support the Legacy BIOS boot
|
COPY scripts/ /bin/
|
||||||
#RUN cp /usr/share/syslinux/pxelinux.0 /tftpboot
|
COPY configure-nonroot.sh /bin/
|
||||||
#RUN cp /usr/share/syslinux/chain.c32 /tftpboot/
|
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 #
|
# IRONIC #
|
||||||
RUN cp /usr/share/ipxe/undionly.kpxe /tftpboot/undionly.kpxe
|
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 \
|
RUN if [ "$(uname -m)" = "x86_64" ];then \
|
||||||
cp /usr/share/ipxe/ipxe-x86_64.efi /tftpboot/ipxe.efi ;\
|
cp /usr/share/ipxe/ipxe-x86_64.efi /tftpboot/ipxe.efi ;\
|
||||||
fi
|
fi
|
||||||
#!ArchExclusiveLine: x86_64
|
#!ArchExclusiveLine: aarch64
|
||||||
RUN if [ "$(uname -m)" = "aarch64" ]; then\
|
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
|
fi
|
||||||
|
|
||||||
COPY --from=base /tmp/esp-x86_64.img /tmp/uefi_esp-x86_64.img
|
COPY --from=base /tmp/esp-x86_64.img /tmp/uefi_esp-x86_64.img
|
||||||
COPY --from=base /tmp/esp-aarch64.img /tmp/uefi_esp-arm64.img
|
COPY --from=base /tmp/esp-aarch64.img /tmp/uefi_esp-arm64.img
|
||||||
|
|
||||||
COPY ironic.conf.j2 /etc/ironic/
|
COPY ironic-config/ironic.conf.j2 ironic-config/network-data-schema-empty.json /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
|
|
||||||
|
|
||||||
# Workaround
|
# Workaround
|
||||||
# Removing the 010-ironic.conf file that comes with the package
|
# Removing the 010-ironic.conf file that comes with the package
|
||||||
RUN rm /etc/ironic/ironic.conf.d/010-ironic.conf
|
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
|
# configure non-root user and set relevant permissions
|
||||||
RUN configure-nonroot.sh && \
|
RUN configure-nonroot.sh && rm -f /bin/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
|
#!/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_UID=10475
|
||||||
NONROOT_GID=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} \
|
useradd -r -g ${NONROOT_GID} \
|
||||||
-u ${NONROOT_UID} \
|
-u ${NONROOT_UID} \
|
||||||
-d /var/lib/ironic \
|
-d /var/lib/ironic \
|
||||||
-s /sbin/nologin \
|
-s /sbin/nologin \
|
||||||
${USER}
|
${IRONIC_USER}
|
||||||
|
|
||||||
# create ironic's http_root directory
|
# most containers mount /shared but dnsmasq can live without it
|
||||||
mkdir -p /shared/html
|
mkdir -p /shared
|
||||||
chown "${NONROOT_UID}":"${NONROOT_GID}" /shared/html
|
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
|
# we'll bind mount shared ca and ironic certificate dirs here
|
||||||
# that need to have correct ownership as the entire ironic in BMO
|
# that need to have correct ownership as the entire ironic in BMO
|
||||||
# deployment shares a single fsGroup in manifest's securityContext
|
# deployment shares a single fsGroup in manifest's securityContext
|
||||||
mkdir -p /certs/ca
|
mkdir -p /certs/ca
|
||||||
chown "${NONROOT_UID}":"${NONROOT_GID}" /certs{,/ca}
|
chown "${IRONIC_USER}":"${IRONIC_GROUP}" /certs{,/ca}
|
||||||
chmod 2775 /certs{,/ca}
|
chmod 2775 /certs{,/ca}
|
||||||
|
|
||||||
# apache2 permission changes
|
# apache2 permission changes
|
||||||
chown -R "${NONROOT_UID}":"${NONROOT_GID}" /etc/apache2
|
chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /etc/apache2
|
||||||
chown -R "${NONROOT_UID}":"${NONROOT_GID}" /run
|
chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /run
|
||||||
|
|
||||||
# ironic and httpd related changes
|
# ironic and httpd related changes
|
||||||
mkdir -p /etc/httpd/conf.d
|
mkdir -p /etc/httpd/conf.d
|
||||||
chown -R "${NONROOT_UID}":"${NONROOT_GID}" /etc/ironic /etc/httpd /etc/httpd
|
chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /etc/ironic /etc/httpd/conf /etc/httpd/conf.d
|
||||||
chown -R "${NONROOT_UID}":"${NONROOT_GID}" /var/log
|
|
||||||
chmod 2775 /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
|
chmod 664 /var/lib/ironic/ironic.sqlite
|
||||||
|
|
||||||
# dnsmasq, and the capabilities required to run it as non-root user
|
# dnsmasq, and the capabilities required to run it as non-root user
|
||||||
chown -R "${NONROOT_UID}":"${NONROOT_GID}" /etc/dnsmasq.conf /var/lib/dnsmasq
|
chown -R "${IRONIC_USER}":"${IRONIC_GROUP}" /etc/dnsmasq.conf
|
||||||
chmod 2775 /var/lib/dnsmasq
|
#handled at chart level
|
||||||
touch /var/lib/dnsmasq/dnsmasq.leases
|
#setcap "cap_net_raw,cap_net_admin,cap_net_bind_service=+eip" /usr/sbin/dnsmasq
|
||||||
chmod 664 /etc/dnsmasq.conf /var/lib/dnsmasq/dnsmasq.leases
|
|
||||||
|
|
||||||
# ca-certificates permission changes
|
# ca-certificates permission changes
|
||||||
touch /var/lib/ca-certificates/ca-bundle.pem.new
|
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/
|
chmod -R +w /var/lib/ca-certificates/
|
||||||
|
|
||||||
# probes that are created before start
|
# probes that are created before start
|
||||||
touch /bin/ironic-{readi,live}ness
|
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
|
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
|
|
@@ -1,107 +0,0 @@
|
|||||||
#!/usr/bin/bash
|
|
||||||
|
|
||||||
set -euxo pipefail
|
|
||||||
|
|
||||||
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}"
|
|
||||||
|
|
||||||
get_provisioning_interface()
|
|
||||||
{
|
|
||||||
if [[ -n "$PROVISIONING_INTERFACE" ]]; then
|
|
||||||
# don't override the PROVISIONING_INTERFACE if one is provided
|
|
||||||
echo "$PROVISIONING_INTERFACE"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
local interface="provisioning"
|
|
||||||
|
|
||||||
if [[ -n "${PROVISIONING_IP}" ]]; then
|
|
||||||
if ip -br addr show | grep -qi " ${PROVISIONING_IP}/"; 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
|
|
||||||
interface="$(ip -br link show up | grep -i "$mac" | cut -f 1 -d ' ' | cut -f 1 -d '@')"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "$interface"
|
|
||||||
}
|
|
||||||
|
|
||||||
PROVISIONING_INTERFACE="$(get_provisioning_interface)"
|
|
||||||
export PROVISIONING_INTERFACE
|
|
||||||
|
|
||||||
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
|
|
||||||
IRONIC_IP="$(ipcalc "${PROVISIONING_IP}" | grep "^Address:" | awk '{print $2}')"
|
|
||||||
export IRONIC_IP
|
|
||||||
until grep -F " ${IRONIC_IP}/" <(ip -br addr show); do
|
|
||||||
echo "Waiting for ${IRONIC_IP} to be configured on an interface"
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
else
|
|
||||||
until [[ -n "$IRONIC_IP" ]]; do
|
|
||||||
echo "Waiting for ${PROVISIONING_INTERFACE} interface to be configured"
|
|
||||||
IRONIC_IP="$(ip -br add show scope global up dev "${PROVISIONING_INTERFACE}" | awk '{print $3}' | sed -e 's%/.*%%' | head -n 1)"
|
|
||||||
export IRONIC_IP
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If the IP contains a colon, then it's an IPv6 address, and the HTTP
|
|
||||||
# host needs surrounding with brackets
|
|
||||||
if [[ "$IRONIC_IP" =~ .*:.* ]]; then
|
|
||||||
export IPV=6
|
|
||||||
export IRONIC_URL_HOST="[$IRONIC_IP]"
|
|
||||||
else
|
|
||||||
export IPV=4
|
|
||||||
export IRONIC_URL_HOST="$IRONIC_IP"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
run_ironic_dbsync()
|
|
||||||
{
|
|
||||||
if [[ "${IRONIC_USE_MARIADB:-true}" == "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
|
|
||||||
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)"
|
|
||||||
if [[ "${DB_VERSION}" == "None" ]]; then
|
|
||||||
ironic-dbsync --config-file /etc/ironic/ironic.conf create_schema
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Use the special value "unix" for unix sockets
|
|
||||||
export IRONIC_PRIVATE_PORT=${IRONIC_PRIVATE_PORT:-unix}
|
|
||||||
|
|
||||||
export IRONIC_ACCESS_PORT=${IRONIC_ACCESS_PORT:-6385}
|
|
||||||
export IRONIC_LISTEN_PORT=${IRONIC_LISTEN_PORT:-$IRONIC_ACCESS_PORT}
|
|
||||||
|
|
||||||
export IRONIC_ENABLE_DISCOVERY=${IRONIC_ENABLE_DISCOVERY:-${IRONIC_INSPECTOR_ENABLE_DISCOVERY:-false}}
|
|
@@ -1,4 +1,5 @@
|
|||||||
Listen {{ env.IPXE_TLS_PORT }}
|
Listen 0.0.0.0:{{ env.IPXE_TLS_PORT }}
|
||||||
|
Listen [::]:{{ env.IPXE_TLS_PORT }}
|
||||||
|
|
||||||
<VirtualHost *:{{ env.IPXE_TLS_PORT }}>
|
<VirtualHost *:{{ env.IPXE_TLS_PORT }}>
|
||||||
ErrorLog /dev/stderr
|
ErrorLog /dev/stderr
|
@@ -1,4 +1,5 @@
|
|||||||
Listen {{ env.VMEDIA_TLS_PORT }}
|
Listen 0.0.0.0:{{ env.VMEDIA_TLS_PORT }}
|
||||||
|
Listen [::]:{{ env.VMEDIA_TLS_PORT }}
|
||||||
|
|
||||||
<VirtualHost *:{{ env.VMEDIA_TLS_PORT }}>
|
<VirtualHost *:{{ env.VMEDIA_TLS_PORT }}>
|
||||||
ErrorLog /dev/stderr
|
ErrorLog /dev/stderr
|
||||||
@@ -10,14 +11,10 @@ Listen {{ env.VMEDIA_TLS_PORT }}
|
|||||||
SSLCertificateFile {{ env.IRONIC_VMEDIA_CERT_FILE }}
|
SSLCertificateFile {{ env.IRONIC_VMEDIA_CERT_FILE }}
|
||||||
SSLCertificateKeyFile {{ env.IRONIC_VMEDIA_KEY_FILE }}
|
SSLCertificateKeyFile {{ env.IRONIC_VMEDIA_KEY_FILE }}
|
||||||
|
|
||||||
<Directory "/shared">
|
<Directory "/shared/html/">
|
||||||
AllowOverride None
|
|
||||||
Require all granted
|
Require all granted
|
||||||
</Directory>
|
</Directory>
|
||||||
|
<Directory ~ "/shared/html/(redfish|ilo)/">
|
||||||
<Directory "/shared/html">
|
|
||||||
Options Indexes FollowSymLinks
|
|
||||||
AllowOverride None
|
|
||||||
Require all granted
|
Require all granted
|
||||||
</Directory>
|
</Directory>
|
||||||
</VirtualHost>
|
</VirtualHost>
|
@@ -3,6 +3,7 @@ bind-dynamic
|
|||||||
enable-tftp
|
enable-tftp
|
||||||
tftp-root=/shared/tftpboot
|
tftp-root=/shared/tftpboot
|
||||||
log-queries
|
log-queries
|
||||||
|
dhcp-leasefile=/data/dnsmasq/dnsmasq.leases
|
||||||
|
|
||||||
# Configure listening for DNS (0 disables DNS)
|
# Configure listening for DNS (0 disables DNS)
|
||||||
port={{ env.DNS_PORT }}
|
port={{ env.DNS_PORT }}
|
||||||
@@ -31,11 +32,11 @@ dhcp-match=ipxe,175
|
|||||||
# Client is already running iPXE; move to next stage of chainloading
|
# Client is already running iPXE; move to next stage of chainloading
|
||||||
{%- if env.IPXE_TLS_SETUP == "true" %}
|
{%- if env.IPXE_TLS_SETUP == "true" %}
|
||||||
# iPXE with (U)EFI
|
# 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
|
# 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 %}
|
{% 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 %}
|
{% endif %}
|
||||||
|
|
||||||
# Note: Need to test EFI booting
|
# 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-vendorclass=set:pxe6,enterprise:343,PXEClient
|
||||||
dhcp-userclass=set:ipxe6,iPXE
|
dhcp-userclass=set:ipxe6,iPXE
|
||||||
dhcp-option=tag:pxe6,option6:bootfile-url,tftp://{{ env.IRONIC_URL_HOST }}/snponly.efi
|
dhcp-option=tag:pxe6,option6:bootfile-url,{{ env.IRONIC_TFTP_URL }}/snponly.efi
|
||||||
dhcp-option=tag:ipxe6,option6:bootfile-url,http://{{ env.IRONIC_URL_HOST }}:{{ env.HTTP_PORT }}/boot.ipxe
|
dhcp-option=tag:ipxe6,option6:bootfile-url,{{ env.IRONIC_HTTP_URL }}/boot.ipxe
|
||||||
|
|
||||||
# It can be used when setting DNS or GW variables.
|
# It can be used when setting DNS or GW variables.
|
||||||
{%- if env["GATEWAY_IP"] is undefined %}
|
{%- if env["GATEWAY_IP"] is undefined %}
|
@@ -12,11 +12,21 @@
|
|||||||
|
|
||||||
|
|
||||||
{% if env.LISTEN_ALL_INTERFACES | lower == "true" %}
|
{% if env.LISTEN_ALL_INTERFACES | lower == "true" %}
|
||||||
Listen {{ env.IRONIC_LISTEN_PORT }}
|
Listen 0.0.0.0:{{ env.IRONIC_LISTEN_PORT }}
|
||||||
|
Listen [::]:{{ env.IRONIC_LISTEN_PORT }}
|
||||||
<VirtualHost *:{{ env.IRONIC_LISTEN_PORT }}>
|
<VirtualHost *:{{ env.IRONIC_LISTEN_PORT }}>
|
||||||
{% else %}
|
{% else %}
|
||||||
Listen {{ env.IRONIC_URL_HOST }}:{{ env.IRONIC_LISTEN_PORT }}
|
{% if env.ENABLE_IPV4 %}
|
||||||
<VirtualHost {{ env.IRONIC_URL_HOST }}:{{ env.IRONIC_LISTEN_PORT }}>
|
Listen {{ env.IRONIC_IP }}:{{ env.IRONIC_LISTEN_PORT }}
|
||||||
|
{% endif %}
|
||||||
|
{% if env.ENABLE_IPV6 %}
|
||||||
|
Listen [{{ env.IRONIC_IPV6 }}]:{{ env.IRONIC_LISTEN_PORT }}
|
||||||
|
{% endif %}
|
||||||
|
{% if env.IRONIC_URL_HOSTNAME is defined and env.IRONIC_URL_HOSTNAME|length %}
|
||||||
|
<VirtualHost {{ env.IRONIC_URL_HOSTNAME }}:{{ env.IRONIC_LISTEN_PORT }}>
|
||||||
|
{% else %}
|
||||||
|
<VirtualHost {% if env.ENABLE_IPV4 %}{{ env.IRONIC_IP }}:{{ env.IRONIC_LISTEN_PORT }}{% endif %} {% if env.ENABLE_IPV6 %}[{{ env.IRONIC_IPV6 }}]:{{ env.IRONIC_LISTEN_PORT }}{% endif %}>
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if env.IRONIC_PRIVATE_PORT == "unix" %}
|
{% if env.IRONIC_PRIVATE_PORT == "unix" %}
|
||||||
@@ -45,7 +55,7 @@ Listen {{ env.IRONIC_URL_HOST }}:{{ env.IRONIC_LISTEN_PORT }}
|
|||||||
{% if "IRONIC_HTPASSWD" in env and env.IRONIC_HTPASSWD | length %}
|
{% if "IRONIC_HTPASSWD" in env and env.IRONIC_HTPASSWD | length %}
|
||||||
AuthType Basic
|
AuthType Basic
|
||||||
AuthName "Restricted area"
|
AuthName "Restricted area"
|
||||||
AuthUserFile "/etc/ironic/htpasswd"
|
AuthUserFile {{ env.HTPASSWD_FILE }}
|
||||||
Require valid-user
|
Require valid-user
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</Location>
|
</Location>
|
@@ -1,10 +1,16 @@
|
|||||||
ServerRoot "/etc/httpd"
|
ServerRoot {{ env.HTTPD_DIR }}
|
||||||
{%- if env.LISTEN_ALL_INTERFACES | lower == "true" %}
|
{%- if env.LISTEN_ALL_INTERFACES | lower == "true" %}
|
||||||
Listen {{ env.HTTP_PORT }}
|
Listen 0.0.0.0:{{ env.HTTP_PORT }}
|
||||||
|
Listen [::]:{{ env.HTTP_PORT }}
|
||||||
{% else %}
|
{% else %}
|
||||||
Listen {{ env.IRONIC_URL_HOST }}:{{ env.HTTP_PORT }}
|
{% if env.ENABLE_IPV4 %}
|
||||||
|
Listen {{ env.IRONIC_IP }}:{{ env.HTTP_PORT }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
Include conf.modules.d/*.conf
|
{% if env.ENABLE_IPV6 %}
|
||||||
|
Listen [{{ env.IRONIC_IPV6 }}]:{{ env.HTTP_PORT }}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
Include /etc/httpd/conf.modules.d/*.conf
|
||||||
User ironic-suse
|
User ironic-suse
|
||||||
Group 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
|
@@ -25,8 +25,15 @@ rpc_transport = none
|
|||||||
use_stderr = true
|
use_stderr = true
|
||||||
# NOTE(dtantsur): the default md5 is not compatible with FIPS mode
|
# NOTE(dtantsur): the default md5 is not compatible with FIPS mode
|
||||||
hash_ring_algorithm = sha256
|
hash_ring_algorithm = sha256
|
||||||
|
{% if env.ENABLE_IPV4 %}
|
||||||
my_ip = {{ env.IRONIC_IP }}
|
my_ip = {{ env.IRONIC_IP }}
|
||||||
|
{% endif %}
|
||||||
|
{% if env.ENABLE_IPV6 %}
|
||||||
|
my_ipv6 = {{ env.IRONIC_IPV6 }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
host = {{ env.IRONIC_CONDUCTOR_HOST }}
|
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 a path to a certificate is defined, use that first for webserver
|
||||||
{% if env.WEBSERVER_CACERT_FILE %}
|
{% if env.WEBSERVER_CACERT_FILE %}
|
||||||
@@ -49,6 +56,7 @@ deploy_logs_local_path = /shared/log/ironic/deploy
|
|||||||
# retries here works around such problems without affecting the normal path.
|
# retries here works around such problems without affecting the normal path.
|
||||||
# See https://bugzilla.redhat.com/show_bug.cgi?id=1822763
|
# See https://bugzilla.redhat.com/show_bug.cgi?id=1822763
|
||||||
max_command_attempts = 30
|
max_command_attempts = 30
|
||||||
|
certificates_path = {{ env.IRONIC_GEN_CERT_DIR }}
|
||||||
|
|
||||||
[api]
|
[api]
|
||||||
{% if env.IRONIC_REVERSE_PROXY_SETUP == "true" %}
|
{% if env.IRONIC_REVERSE_PROXY_SETUP == "true" %}
|
||||||
@@ -63,7 +71,7 @@ port = {{ env.IRONIC_PRIVATE_PORT }}
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
public_endpoint = {{ env.IRONIC_BASE_URL }}
|
public_endpoint = {{ env.IRONIC_BASE_URL }}
|
||||||
{% else %}
|
{% else %}
|
||||||
host_ip = {% if env.LISTEN_ALL_INTERFACES | lower == "true" %}::{% else %}{{ env.IRONIC_IP }}{% endif %}
|
host_ip = {{ env.IRONIC_HOST_IP }}
|
||||||
port = {{ env.IRONIC_LISTEN_PORT }}
|
port = {{ env.IRONIC_LISTEN_PORT }}
|
||||||
{% if env.IRONIC_TLS_SETUP == "true" %}
|
{% if env.IRONIC_TLS_SETUP == "true" %}
|
||||||
enable_ssl_api = true
|
enable_ssl_api = true
|
||||||
@@ -83,7 +91,7 @@ send_sensor_data = {{ env.SEND_SENSOR_DATA }}
|
|||||||
# Power state is checked every 60 seconds and BMC activity should
|
# Power state is checked every 60 seconds and BMC activity should
|
||||||
# be avoided more often than once every sixty seconds.
|
# be avoided more often than once every sixty seconds.
|
||||||
send_sensor_data_interval = 160
|
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
|
verify_step_priority_override = management.clear_job_queue:90
|
||||||
# We don't use this feature, and it creates an additional load on the database
|
# We don't use this feature, and it creates an additional load on the database
|
||||||
node_history = False
|
node_history = False
|
||||||
@@ -95,16 +103,19 @@ deploy_kernel = file://{{ env.IRONIC_DEFAULT_KERNEL }}
|
|||||||
{% if env.IRONIC_DEFAULT_RAMDISK is defined %}
|
{% if env.IRONIC_DEFAULT_RAMDISK is defined %}
|
||||||
deploy_ramdisk = file://{{ env.IRONIC_DEFAULT_RAMDISK }}
|
deploy_ramdisk = file://{{ env.IRONIC_DEFAULT_RAMDISK }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if env.DISABLE_DEEP_IMAGE_INSPECTION | lower == "true" %}
|
||||||
|
disable_deep_image_inspection = True
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
[database]
|
[database]
|
||||||
{% if env.IRONIC_USE_MARIADB | lower == "false" %}
|
{% if env.IRONIC_USE_MARIADB | lower == "true" %}
|
||||||
connection = sqlite:////var/lib/ironic/ironic.sqlite
|
connection = {{ env.MARIADB_CONNECTION }}
|
||||||
|
{% else %}
|
||||||
|
connection = {{ env.LOCAL_DB_URI }}
|
||||||
# Synchronous mode is required for data integrity in case of operating system
|
# 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
|
# crash. In our case we restart the container from scratch, so we can save some
|
||||||
# IO by not doing syncs all the time.
|
# IO by not doing syncs all the time.
|
||||||
sqlite_synchronous = False
|
sqlite_synchronous = False
|
||||||
{% else %}
|
|
||||||
connection = {{ env.MARIADB_CONNECTION }}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
[deploy]
|
[deploy]
|
||||||
@@ -112,7 +123,7 @@ default_boot_option = local
|
|||||||
erase_devices_metadata_priority = 10
|
erase_devices_metadata_priority = 10
|
||||||
erase_devices_priority = 0
|
erase_devices_priority = 0
|
||||||
http_root = /shared/html/
|
http_root = /shared/html/
|
||||||
http_url = {{ env.IRONIC_BOOT_BASE_URL }}
|
http_url = {{ env.IRONIC_HTTP_URL }}
|
||||||
fast_track = {{ env.IRONIC_FAST_TRACK }}
|
fast_track = {{ env.IRONIC_FAST_TRACK }}
|
||||||
{% if env.IRONIC_BOOT_ISO_SOURCE %}
|
{% if env.IRONIC_BOOT_ISO_SOURCE %}
|
||||||
ramdisk_image_download_source = {{ env.IRONIC_BOOT_ISO_SOURCE }}
|
ramdisk_image_download_source = {{ env.IRONIC_BOOT_ISO_SOURCE }}
|
||||||
@@ -175,8 +186,8 @@ cipher_suite_versions = 3,17
|
|||||||
# unauthenticated connections from other processes in the same host since the
|
# unauthenticated connections from other processes in the same host since the
|
||||||
# containers are in host networking.
|
# containers are in host networking.
|
||||||
auth_strategy = http_basic
|
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 %}
|
host_ip = {{ env.IRONIC_HOST_IP }}
|
||||||
{% if env.IRONIC_TLS_SETUP == "true" %}
|
{% if env.IRONIC_TLS_SETUP == "true" %}
|
||||||
use_ssl = true
|
use_ssl = true
|
||||||
cafile = {{ env.IRONIC_CACERT_FILE }}
|
cafile = {{ env.IRONIC_CACERT_FILE }}
|
||||||
@@ -187,11 +198,6 @@ insecure = {{ env.IRONIC_INSECURE }}
|
|||||||
[nova]
|
[nova]
|
||||||
send_power_notifications = false
|
send_power_notifications = false
|
||||||
|
|
||||||
[oslo_messaging_notifications]
|
|
||||||
driver = prometheus_exporter
|
|
||||||
location = /shared/ironic_prometheus_exporter
|
|
||||||
transport_url = fake://
|
|
||||||
|
|
||||||
[pxe]
|
[pxe]
|
||||||
# NOTE(dtantsur): keep this value at least 3x lower than
|
# NOTE(dtantsur): keep this value at least 3x lower than
|
||||||
# [conductor]deploy_callback_timeout so that at least some retries happen.
|
# [conductor]deploy_callback_timeout so that at least some retries happen.
|
||||||
@@ -201,7 +207,7 @@ images_path = /shared/html/tmp
|
|||||||
instance_master_path = /shared/html/master_images
|
instance_master_path = /shared/html/master_images
|
||||||
tftp_master_path = /shared/tftpboot/master_images
|
tftp_master_path = /shared/tftpboot/master_images
|
||||||
tftp_root = /shared/tftpboot
|
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
|
# This makes networking boot templates generated even for nodes using local
|
||||||
# boot (the default), ensuring that they boot correctly even if they start
|
# boot (the default), ensuring that they boot correctly even if they start
|
||||||
# netbooting for some reason (e.g. with the noop management interface).
|
# netbooting for some reason (e.g. with the noop management interface).
|
||||||
@@ -214,14 +220,14 @@ ipxe_config_template = /tmp/ipxe_config.template
|
|||||||
|
|
||||||
[redfish]
|
[redfish]
|
||||||
use_swift = false
|
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]
|
[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
|
use_web_server_for_images = true
|
||||||
|
|
||||||
[irmc]
|
[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]
|
[service_catalog]
|
||||||
endpoint_override = {{ env.IRONIC_BASE_URL }}
|
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
|
||||||
|
}
|
63
ironic-image/configure-ironic.sh → ironic-image/scripts/configure-ironic.sh
Normal file → Executable file
63
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 HTTP_PORT=${HTTP_PORT:-80}
|
||||||
|
|
||||||
export IRONIC_USE_MARIADB=${IRONIC_USE_MARIADB:-true}
|
if [[ "${IRONIC_USE_MARIADB}" == true ]]; then
|
||||||
|
if [[ -z "${MARIADB_PASSWORD:-}" ]]; then
|
||||||
if [[ "$IRONIC_USE_MARIADB" == "true" ]]; then
|
echo "FATAL: IRONIC_USE_MARIADB requires password, mount a secret under /auth/mariadb"
|
||||||
MARIADB_PASSWORD=${MARIADB_PASSWORD}
|
exit 1
|
||||||
|
fi
|
||||||
MARIADB_DATABASE=${MARIADB_DATABASE:-ironic}
|
MARIADB_DATABASE=${MARIADB_DATABASE:-ironic}
|
||||||
MARIADB_USER=${MARIADB_USER:-ironic}
|
MARIADB_USER=${MARIADB_USER:-ironic}
|
||||||
MARIADB_HOST=${MARIADB_HOST:-127.0.0.1}
|
MARIADB_HOST=${MARIADB_HOST:-127.0.0.1}
|
||||||
@@ -32,13 +33,9 @@ if [[ "$IRONIC_USE_MARIADB" == "true" ]]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# TODO(dtantsur): remove the explicit default once we get
|
# zero makes it do cpu number detection on Ironic side
|
||||||
# https://review.opendev.org/761185 in the repositories
|
export NUMWORKERS=${NUMWORKERS:-0}
|
||||||
NUMPROC="$(grep -c "^processor" /proc/cpuinfo)"
|
|
||||||
if [[ "$NUMPROC" -lt 4 ]]; then
|
|
||||||
NUMPROC=4
|
|
||||||
fi
|
|
||||||
export NUMWORKERS=${NUMWORKERS:-$NUMPROC}
|
|
||||||
|
|
||||||
# Whether to enable fast_track provisioning or not
|
# Whether to enable fast_track provisioning or not
|
||||||
export IRONIC_FAST_TRACK=${IRONIC_FAST_TRACK:-true}
|
export IRONIC_FAST_TRACK=${IRONIC_FAST_TRACK:-true}
|
||||||
@@ -54,11 +51,17 @@ export IRONIC_IPA_COLLECTORS=${IRONIC_IPA_COLLECTORS:-default,logs}
|
|||||||
|
|
||||||
wait_for_interface_or_ip
|
wait_for_interface_or_ip
|
||||||
|
|
||||||
|
if [[ "$(echo "$LISTEN_ALL_INTERFACES" | tr '[:upper:]' '[:lower:]')" == "true" ]]; then
|
||||||
|
export IRONIC_HOST_IP="::"
|
||||||
|
elif [[ -n "${ENABLE_IPV6}" ]]; then
|
||||||
|
export IRONIC_HOST_IP="$IRONIC_IPV6"
|
||||||
|
else
|
||||||
|
export IRONIC_HOST_IP="$IRONIC_IP"
|
||||||
|
fi
|
||||||
|
|
||||||
# Hostname to use for the current conductor instance.
|
# Hostname to use for the current conductor instance.
|
||||||
export IRONIC_CONDUCTOR_HOST=${IRONIC_CONDUCTOR_HOST:-${IRONIC_URL_HOST}}
|
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
|
if [[ -n "$IRONIC_EXTERNAL_IP" ]]; then
|
||||||
export IRONIC_EXTERNAL_CALLBACK_URL=${IRONIC_EXTERNAL_CALLBACK_URL:-"${IRONIC_SCHEME}://${IRONIC_EXTERNAL_IP}:${IRONIC_ACCESS_PORT}"}
|
export IRONIC_EXTERNAL_CALLBACK_URL=${IRONIC_EXTERNAL_CALLBACK_URL:-"${IRONIC_SCHEME}://${IRONIC_EXTERNAL_IP}:${IRONIC_ACCESS_PORT}"}
|
||||||
if [[ "$IRONIC_VMEDIA_TLS_SETUP" == "true" ]]; then
|
if [[ "$IRONIC_VMEDIA_TLS_SETUP" == "true" ]]; then
|
||||||
@@ -74,9 +77,9 @@ if [[ -f "${IMAGE_CACHE_PREFIX}.kernel" ]] && [[ -f "${IMAGE_CACHE_PREFIX}.initr
|
|||||||
export IRONIC_DEFAULT_RAMDISK="${IMAGE_CACHE_PREFIX}.initramfs"
|
export IRONIC_DEFAULT_RAMDISK="${IMAGE_CACHE_PREFIX}.initramfs"
|
||||||
fi
|
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
|
# 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
|
fi
|
||||||
|
|
||||||
# oslo.config also supports Config Opts From Environment, log them to stdout
|
# oslo.config also supports Config Opts From Environment, log them to stdout
|
||||||
@@ -84,9 +87,6 @@ echo 'Options set from Environment variables'
|
|||||||
env | grep "^OS_" || true
|
env | grep "^OS_" || true
|
||||||
|
|
||||||
mkdir -p /shared/html
|
mkdir -p /shared/html
|
||||||
mkdir -p /shared/ironic_prometheus_exporter
|
|
||||||
|
|
||||||
configure_json_rpc_auth
|
|
||||||
|
|
||||||
if [[ -f /proc/sys/crypto/fips_enabled ]]; then
|
if [[ -f /proc/sys/crypto/fips_enabled ]]; then
|
||||||
ENABLE_FIPS_IPA=$(cat /proc/sys/crypto/fips_enabled)
|
ENABLE_FIPS_IPA=$(cat /proc/sys/crypto/fips_enabled)
|
||||||
@@ -94,26 +94,17 @@ if [[ -f /proc/sys/crypto/fips_enabled ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# The original ironic.conf is empty, and can be found in ironic.conf_orig
|
# 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
|
# Make sure ironic traffic bypasses any proxies
|
||||||
export NO_PROXY="${NO_PROXY:-},$IRONIC_IP"
|
export NO_PROXY="${NO_PROXY:-}"
|
||||||
|
|
||||||
PROBE_CURL_ARGS=
|
if [[ -n "$IRONIC_IPV6" ]]; then
|
||||||
if [[ "${IRONIC_REVERSE_PROXY_SETUP}" == "true" ]]; then
|
export NO_PROXY="${NO_PROXY},${IRONIC_IPV6}"
|
||||||
if [[ "${IRONIC_PRIVATE_PORT}" == "unix" ]]; then
|
fi
|
||||||
PROBE_URL="http://127.0.0.1:6385"
|
if [[ -n "$IRONIC_IP" ]]; then
|
||||||
PROBE_CURL_ARGS="--unix-socket /shared/ironic.sock"
|
export NO_PROXY="${NO_PROXY},${IRONIC_IP}"
|
||||||
else
|
|
||||||
PROBE_URL="http://127.0.0.1:${IRONIC_PRIVATE_PORT}"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
PROBE_URL="${IRONIC_BASE_URL}"
|
|
||||||
fi
|
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
|
|
289
ironic-image/scripts/ironic-common.sh
Normal file
289
ironic-image/scripts/ironic-common.sh
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
#!/usr/bin/bash
|
||||||
|
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
# Export IRONIC_IP to avoid needing to lean on IRONIC_URL_HOST for consumption in
|
||||||
|
# e.g. dnsmasq configuration
|
||||||
|
export IRONIC_IP="${IRONIC_IP:-}"
|
||||||
|
export IRONIC_IPV6="${IRONIC_IPV6:-}"
|
||||||
|
PROVISIONING_INTERFACE="${PROVISIONING_INTERFACE:-}"
|
||||||
|
PROVISIONING_IP="${PROVISIONING_IP:-}"
|
||||||
|
PROVISIONING_MACS="${PROVISIONING_MACS:-}"
|
||||||
|
IRONIC_URL_HOSTNAME="${IRONIC_URL_HOSTNAME:-}"
|
||||||
|
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_ip_of_hostname()
|
||||||
|
{
|
||||||
|
if [[ "$#" -ne 2 ]]; then
|
||||||
|
echo "${FUNCNAME}: two parameters required, $# provided" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $2 in
|
||||||
|
4)
|
||||||
|
QUERY="a";;
|
||||||
|
6)
|
||||||
|
QUERY="aaaa";;
|
||||||
|
*)
|
||||||
|
echo "${FUNCNAME}: the second parameter should be [a|aaaa] for A and AAAA records"
|
||||||
|
return 1;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
local HOSTNAME=$1
|
||||||
|
|
||||||
|
echo $(nslookup -type=${QUERY} "${HOSTNAME}" | tail -n2 | grep -w "Address:" | cut -d " " -f2)
|
||||||
|
}
|
||||||
|
|
||||||
|
get_interface_of_ip()
|
||||||
|
{
|
||||||
|
local IP_VERS=""
|
||||||
|
|
||||||
|
if [[ "$#" -gt 2 ]]; then
|
||||||
|
echo "${FUNCNAME}: too many parameters" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$#" -eq 2 ]]; then
|
||||||
|
case $2 in
|
||||||
|
4|6)
|
||||||
|
local IP_VERS="-${2}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "${FUNCNAME}: the second parameter should be [4|6] (or missing for both)" >&2
|
||||||
|
return 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
local IP_ADDR=$1
|
||||||
|
|
||||||
|
# Convert the address using ipcalc which strips out the subnet.
|
||||||
|
# For IPv6 addresses, this will give the short-form address
|
||||||
|
IP_ADDR="$(ipcalc "${IP_ADDR}" | grep "^Address:" | awk '{print $2}')"
|
||||||
|
|
||||||
|
echo $(ip ${IP_VERS} -br addr show scope global | grep -i " ${IP_ADDR}/" | cut -f 1 -d ' ' | cut -f 1 -d '@')
|
||||||
|
}
|
||||||
|
|
||||||
|
get_ip_of_interface()
|
||||||
|
{
|
||||||
|
local IP_VERS=""
|
||||||
|
|
||||||
|
if [[ "$#" -gt 2 ]]; then
|
||||||
|
echo "${FUNCNAME}: too many parameters" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$#" -eq 2 ]]; then
|
||||||
|
case $2 in
|
||||||
|
4|6)
|
||||||
|
local IP_VERS="-${2}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "${FUNCNAME}: the second parameter should be [4|6] (or missing for both)" >&2
|
||||||
|
return 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
local IFACE=$1
|
||||||
|
|
||||||
|
echo $(ip ${IP_VERS} -br addr show scope global up dev ${IFACE} | awk '{print $3}' | sed -e 's%/.*%%' | head -n 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
get_provisioning_interface()
|
||||||
|
{
|
||||||
|
if [[ -n "$PROVISIONING_INTERFACE" ]]; then
|
||||||
|
# don't override the PROVISIONING_INTERFACE if one is provided
|
||||||
|
echo "$PROVISIONING_INTERFACE"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local interface=""
|
||||||
|
|
||||||
|
for mac in ${PROVISIONING_MACS//,/ }; do
|
||||||
|
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
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "$interface"
|
||||||
|
}
|
||||||
|
|
||||||
|
PROVISIONING_INTERFACE="$(get_provisioning_interface)"
|
||||||
|
export PROVISIONING_INTERFACE
|
||||||
|
|
||||||
|
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
|
||||||
|
local IFACE_OF_IP=""
|
||||||
|
|
||||||
|
until [[ -n "$IFACE_OF_IP" ]]; do
|
||||||
|
echo "Waiting for ${PROVISIONING_IP} to be configured on an interface..."
|
||||||
|
IFACE_OF_IP="$(get_interface_of_ip "${PROVISIONING_IP}")"
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Found $PROVISIONING_IP on interface \"${IFACE_OF_IP}\"!"
|
||||||
|
|
||||||
|
export PROVISIONING_INTERFACE="$IFACE_OF_IP"
|
||||||
|
# If the IP contains a colon, then it's an IPv6 address
|
||||||
|
if [[ "$PROVISIONING_IP" =~ .*:.* ]]; then
|
||||||
|
export IRONIC_IPV6="$PROVISIONING_IP"
|
||||||
|
else
|
||||||
|
export IRONIC_IP="$PROVISIONING_IP"
|
||||||
|
fi
|
||||||
|
elif [[ -n "${PROVISIONING_INTERFACE}" ]]; then
|
||||||
|
until [[ -n "$IRONIC_IPV6" ]] || [[ -n "$IRONIC_IP" ]]; do
|
||||||
|
echo "Waiting for ${PROVISIONING_INTERFACE} interface to be configured..."
|
||||||
|
|
||||||
|
IRONIC_IPV6="$(get_ip_of_interface "${PROVISIONING_INTERFACE}" 6)"
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
IRONIC_IP="$(get_ip_of_interface "${PROVISIONING_INTERFACE}" 4)"
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -n "$IRONIC_IPV6" ]]; then
|
||||||
|
echo "Found $IRONIC_IPV6 on interface \"${PROVISIONING_INTERFACE}\"!"
|
||||||
|
export IRONIC_IPV6
|
||||||
|
fi
|
||||||
|
if [[ -n "$IRONIC_IP" ]]; then
|
||||||
|
echo "Found $IRONIC_IP on interface \"${PROVISIONING_INTERFACE}\"!"
|
||||||
|
export IRONIC_IP
|
||||||
|
fi
|
||||||
|
elif [[ -n "$IRONIC_URL_HOSTNAME" ]]; then
|
||||||
|
local IPV6_IFACE=""
|
||||||
|
local IPV4_IFACE=""
|
||||||
|
|
||||||
|
# we should get at least one IP address
|
||||||
|
until [[ -n "$IPV6_IFACE" ]] || [[ -n "$IPV4_IFACE" ]]; do
|
||||||
|
local IPV6_RECORD=""
|
||||||
|
local IPV4_RECORD=""
|
||||||
|
|
||||||
|
IPV6_RECORD="$(get_ip_of_hostname "${IRONIC_URL_HOSTNAME}" 6)"
|
||||||
|
IPV4_RECORD="$(get_ip_of_hostname "${IRONIC_URL_HOSTNAME}" 4)"
|
||||||
|
|
||||||
|
# We couldn't get any IP
|
||||||
|
if [[ -z "$IPV4_RECORD" ]] && [[ -z "$IPV6_RECORD" ]]; then
|
||||||
|
echo "${FUNCNAME}: no valid IP found for hostname ${IRONIC_URL_HOSTNAME}" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Waiting for ${IPV6_RECORD} to be configured on an interface"
|
||||||
|
IPV6_IFACE="$(get_interface_of_ip "${IPV6_RECORD}" 6)"
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
echo "Waiting for ${IPV4_RECORD} to be configured on an interface"
|
||||||
|
IPV4_IFACE="$(get_interface_of_ip "${IPV4_RECORD}" 4)"
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
# Add some debugging output
|
||||||
|
if [[ -n "$IPV6_IFACE" ]]; then
|
||||||
|
echo "Found $IPV6_RECORD on interface \"${IPV6_IFACE}\"!"
|
||||||
|
export IRONIC_IPV6="$IPV6_RECORD"
|
||||||
|
fi
|
||||||
|
if [[ -n "$IPV4_IFACE" ]]; then
|
||||||
|
echo "Found $IPV4_RECORD on interface \"${IPV4_IFACE}\"!"
|
||||||
|
export IRONIC_IP="$IPV4_RECORD"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure both IPs are asigned to the same interface
|
||||||
|
if [[ -n "$IPV6_IFACE" ]] && [[ -n "$IPV4_IFACE" ]] && [[ "$IPV6_IFACE" != "$IPV4_IFACE" ]]; then
|
||||||
|
echo "Warning, the IPv4 and IPv6 addresses from \"${HOSTNAME}\" are assigned to different " \
|
||||||
|
"interfaces (\"${IPV6_IFACE}\" and \"${IPV4_IFACE}\")" >&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
echo "Cannot determine an interface or an IP for binding and creating URLs"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Define the URLs based on the what we have found,
|
||||||
|
# prioritize IPv6 for IRONIC_URL_HOST
|
||||||
|
if [[ -n "$IRONIC_IP" ]]; then
|
||||||
|
export ENABLE_IPV4=yes
|
||||||
|
export IRONIC_URL_HOST="$IRONIC_IP"
|
||||||
|
fi
|
||||||
|
if [[ -n "$IRONIC_IPV6" ]]; then
|
||||||
|
export ENABLE_IPV6=yes
|
||||||
|
export IRONIC_URL_HOST="[${IRONIC_IPV6}]" # The HTTP host needs surrounding with brackets
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Once determined if we have IPv4 and/or IPv6, override the hostname if provided
|
||||||
|
if [[ -n "$IRONIC_URL_HOSTNAME" ]]; then
|
||||||
|
IRONIC_URL_HOST=$IRONIC_URL_HOSTNAME
|
||||||
|
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()
|
||||||
|
{
|
||||||
|
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" ]]; then
|
||||||
|
# It's possible for the dbsync to fail if mariadb is not up yet, so
|
||||||
|
# retry until success
|
||||||
|
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
|
||||||
|
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 "${IRONIC_CONF_DIR}/ironic.conf" create_schema
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Use the special value "unix" for unix sockets
|
||||||
|
export IRONIC_PRIVATE_PORT=${IRONIC_PRIVATE_PORT:-unix}
|
||||||
|
|
||||||
|
export IRONIC_ACCESS_PORT=${IRONIC_ACCESS_PORT:-6385}
|
||||||
|
export IRONIC_LISTEN_PORT=${IRONIC_LISTEN_PORT:-$IRONIC_ACCESS_PORT}
|
||||||
|
|
||||||
|
export IRONIC_ENABLE_DISCOVERY=${IRONIC_ENABLE_DISCOVERY:-${IRONIC_INSPECTOR_ENABLE_DISCOVERY:-false}}
|
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
|
wait_for_interface_or_ip
|
||||||
if [[ "${DNS_IP:-}" == "provisioning" ]]; then
|
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
|
fi
|
||||||
|
|
||||||
mkdir -p /shared/tftpboot
|
mkdir -p /shared/tftpboot
|
||||||
@@ -32,12 +36,12 @@ fi
|
|||||||
# Template and write dnsmasq.conf
|
# Template and write dnsmasq.conf
|
||||||
# we template via /tmp as sed otherwise creates temp files in /etc directory
|
# we template via /tmp as sed otherwise creates temp files in /etc directory
|
||||||
# where we can't write
|
# 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
|
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
|
done
|
||||||
cat /tmp/dnsmasq.conf > /etc/dnsmasq.conf
|
cat "${DNSMASQ_TEMP_DIR}/dnsmasq_temp.conf" > "${DNSMASQ_CONF_DIR}/dnsmasq.conf"
|
||||||
rm /tmp/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
|
mkdir -p /shared/html
|
||||||
chmod 0777 /shared/html
|
chmod 0777 /shared/html
|
||||||
|
|
||||||
IRONIC_BASE_URL="${IRONIC_SCHEME}://${IRONIC_URL_HOST}"
|
INSPECTOR_EXTRA_ARGS=" ipa-inspection-callback-url=${IRONIC_BASE_URL}/v1/continue_inspection"
|
||||||
|
|
||||||
INSPECTOR_EXTRA_ARGS=" ipa-inspection-callback-url=${IRONIC_BASE_URL}:${IRONIC_ACCESS_PORT}/v1/continue_inspection"
|
|
||||||
|
|
||||||
if [[ "$IRONIC_FAST_TRACK" == "true" ]]; then
|
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
|
fi
|
||||||
export INSPECTOR_EXTRA_ARGS
|
export INSPECTOR_EXTRA_ARGS
|
||||||
|
|
||||||
# Copy files to shared mount
|
# Copy files to shared mount
|
||||||
render_j2_config /tmp/inspector.ipxe.j2 /shared/html/inspector.ipxe
|
render_j2_config /tmp/inspector.ipxe.j2 /shared/html/inspector.ipxe
|
||||||
cp /tmp/uefi_esp*.img /shared/html/
|
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 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_TLS_SETUP" == "true" ]]; then
|
||||||
if [[ "${IRONIC_REVERSE_PROXY_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
|
fi
|
||||||
else
|
else
|
||||||
export IRONIC_REVERSE_PROXY_SETUP="false" # If TLS is not used, we have no reason to use the reverse proxy
|
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>
|
# Render httpd TLS configuration for /shared/html/<redifsh;ilo>
|
||||||
if [[ "$IRONIC_VMEDIA_TLS_SETUP" == "true" ]]; then
|
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
|
fi
|
||||||
|
|
||||||
# Render httpd TLS configuration for /shared/html
|
# Render httpd TLS configuration for /shared/html
|
||||||
if [[ "$IPXE_TLS_SETUP" == "true" ]]; then
|
if [[ "$IPXE_TLS_SETUP" == "true" ]]; then
|
||||||
mkdir -p /shared/html/custom-ipxe
|
mkdir -p /shared/html/custom-ipxe
|
||||||
chmod 0777 /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" \
|
cp "${IPXE_CUSTOM_FIRMWARE_DIR}/undionly.kpxe" \
|
||||||
"${IPXE_CUSTOM_FIRMWARE_DIR}/snponly.efi" \
|
"${IPXE_CUSTOM_FIRMWARE_DIR}/snponly.efi" \
|
||||||
"/shared/html/custom-ipxe"
|
"/shared/html/custom-ipxe"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Set up inotify to kill the container (restart) whenever cert files for ironic api change
|
# 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
|
configure_restart_on_certificate_update "${IRONIC_TLS_SETUP}" httpd "${IRONIC_CERT_FILE}"
|
||||||
# shellcheck disable=SC2034
|
|
||||||
inotifywait -m -e delete_self "${IRONIC_CERT_FILE}" | while read -r file event; do
|
|
||||||
kill -WINCH $(pgrep httpd)
|
|
||||||
done &
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Set up inotify to kill the container (restart) whenever cert of httpd for /shared/html/<redifsh;ilo> path change
|
# 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
|
configure_restart_on_certificate_update "${IRONIC_VMEDIA_TLS_SETUP}" httpd "${IRONIC_VMEDIA_CERT_FILE}"
|
||||||
# shellcheck disable=SC2034
|
|
||||||
inotifywait -m -e delete_self "${IRONIC_VMEDIA_CERT_FILE}" | while read -r file event; do
|
|
||||||
kill -WINCH $(pgrep httpd)
|
|
||||||
done &
|
|
||||||
fi
|
|
||||||
|
|
||||||
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
|
else
|
||||||
export MARIADB_TLS_ENABLED="false"
|
export MARIADB_TLS_ENABLED="false"
|
||||||
fi
|
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,6 +1,6 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.7
|
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.8
|
||||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.7-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.8-%RELEASE%
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||||
|
|
||||||
@@ -18,11 +18,11 @@ FROM micro AS final
|
|||||||
LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)"
|
LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)"
|
||||||
LABEL org.opencontainers.image.title="SLE Based Ironic IPA Downloader Container Image"
|
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.description="ironic-ipa-downloader based on the SLE Base Container Image."
|
||||||
LABEL org.opencontainers.image.version="3.0.6"
|
LABEL org.opencontainers.image.version="3.0.8"
|
||||||
LABEL org.opencontainers.image.url="https://www.suse.com/solutions/edge-computing/"
|
LABEL org.opencontainers.image.url="https://www.suse.com/solutions/edge-computing/"
|
||||||
LABEL org.opencontainers.image.created="%BUILDTIME%"
|
LABEL org.opencontainers.image.created="%BUILDTIME%"
|
||||||
LABEL org.opencontainers.image.vendor="SUSE LLC"
|
LABEL org.opencontainers.image.vendor="SUSE LLC"
|
||||||
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic-ipa-downloader:3.0.7-%RELEASE%"
|
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic-ipa-downloader:3.0.8-%RELEASE%"
|
||||||
LABEL org.openbuildservice.disturl="%DISTURL%"
|
LABEL org.openbuildservice.disturl="%DISTURL%"
|
||||||
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
||||||
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
||||||
@@ -33,8 +33,6 @@ LABEL com.suse.release-stage="released"
|
|||||||
|
|
||||||
COPY --from=base /installroot /
|
COPY --from=base /installroot /
|
||||||
RUN cp /getopt /usr/bin/
|
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
|
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
|
# configure non-root user
|
||||||
COPY configure-nonroot.sh /bin/
|
COPY configure-nonroot.sh /bin/
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader-aarch64:3.0.7
|
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader-aarch64:3.0.8
|
||||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader-aarch64:3.0.7-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader-aarch64:3.0.8-%RELEASE%
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||||
|
|
||||||
@@ -18,11 +18,11 @@ FROM micro AS final
|
|||||||
LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)"
|
LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)"
|
||||||
LABEL org.opencontainers.image.title="SLE Based Ironic IPA Downloader Container Image"
|
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.description="ironic-ipa-downloader based on the SLE Base Container Image."
|
||||||
LABEL org.opencontainers.image.version="3.0.6"
|
LABEL org.opencontainers.image.version="3.0.8"
|
||||||
LABEL org.opencontainers.image.url="https://www.suse.com/solutions/edge-computing/"
|
LABEL org.opencontainers.image.url="https://www.suse.com/solutions/edge-computing/"
|
||||||
LABEL org.opencontainers.image.created="%BUILDTIME%"
|
LABEL org.opencontainers.image.created="%BUILDTIME%"
|
||||||
LABEL org.opencontainers.image.vendor="SUSE LLC"
|
LABEL org.opencontainers.image.vendor="SUSE LLC"
|
||||||
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic-ipa-downloader:3.0.7-%RELEASE%"
|
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic-ipa-downloader:3.0.8-%RELEASE%"
|
||||||
LABEL org.openbuildservice.disturl="%DISTURL%"
|
LABEL org.openbuildservice.disturl="%DISTURL%"
|
||||||
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
||||||
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
||||||
@@ -33,8 +33,6 @@ LABEL com.suse.release-stage="released"
|
|||||||
|
|
||||||
COPY --from=base /installroot /
|
COPY --from=base /installroot /
|
||||||
RUN cp /getopt /usr/bin/
|
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
|
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
|
# configure non-root user
|
||||||
COPY configure-nonroot.sh /bin/
|
COPY configure-nonroot.sh /bin/
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader-x86_64:3.0.7
|
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader-x86_64:3.0.8
|
||||||
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader-x86_64:3.0.7-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader-x86_64:3.0.8-%RELEASE%
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||||
|
|
||||||
@@ -18,11 +18,11 @@ FROM micro AS final
|
|||||||
LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)"
|
LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)"
|
||||||
LABEL org.opencontainers.image.title="SLE Based Ironic IPA Downloader Container Image"
|
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.description="ironic-ipa-downloader based on the SLE Base Container Image."
|
||||||
LABEL org.opencontainers.image.version="3.0.6"
|
LABEL org.opencontainers.image.version="3.0.8"
|
||||||
LABEL org.opencontainers.image.url="https://www.suse.com/solutions/edge-computing/"
|
LABEL org.opencontainers.image.url="https://www.suse.com/solutions/edge-computing/"
|
||||||
LABEL org.opencontainers.image.created="%BUILDTIME%"
|
LABEL org.opencontainers.image.created="%BUILDTIME%"
|
||||||
LABEL org.opencontainers.image.vendor="SUSE LLC"
|
LABEL org.opencontainers.image.vendor="SUSE LLC"
|
||||||
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic-ipa-downloader:3.0.7-%RELEASE%"
|
LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic-ipa-downloader:3.0.8-%RELEASE%"
|
||||||
LABEL org.openbuildservice.disturl="%DISTURL%"
|
LABEL org.openbuildservice.disturl="%DISTURL%"
|
||||||
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
||||||
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
||||||
@@ -33,8 +33,6 @@ LABEL com.suse.release-stage="released"
|
|||||||
|
|
||||||
COPY --from=base /installroot /
|
COPY --from=base /installroot /
|
||||||
RUN cp /getopt /usr/bin/
|
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
|
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
|
# configure non-root user
|
||||||
COPY configure-nonroot.sh /bin/
|
COPY configure-nonroot.sh /bin/
|
||||||
|
@@ -6,6 +6,8 @@ export http_proxy=${http_proxy:-$HTTP_PROXY}
|
|||||||
export https_proxy=${https_proxy:-$HTTPS_PROXY}
|
export https_proxy=${https_proxy:-$HTTPS_PROXY}
|
||||||
export no_proxy=${no_proxy:-$NO_PROXY}
|
export no_proxy=${no_proxy:-$NO_PROXY}
|
||||||
|
|
||||||
|
IMAGES_BASE_PATH="/srv/tftpboot/openstack-ironic-image"
|
||||||
|
|
||||||
if [ -d "/tmp/ironic-certificates" ]; then
|
if [ -d "/tmp/ironic-certificates" ]; then
|
||||||
sha256sum /tmp/ironic-certificates/* > /tmp/certificates.sha256
|
sha256sum /tmp/ironic-certificates/* > /tmp/certificates.sha256
|
||||||
if cmp "/shared/certificates.sha256" "/tmp/certificates.sha256"; then
|
if cmp "/shared/certificates.sha256" "/tmp/certificates.sha256"; then
|
||||||
@@ -26,14 +28,14 @@ if [ -z "${IPA_BASEURI}" ]; then
|
|||||||
IMAGE_CHANGED=1
|
IMAGE_CHANGED=1
|
||||||
# SLES BASED IPA - ironic-ipa-ramdisk-x86_64 and ironic-ipa-ramdisk-aarch64 packages
|
# SLES BASED IPA - ironic-ipa-ramdisk-x86_64 and ironic-ipa-ramdisk-aarch64 packages
|
||||||
mkdir -p /shared/html/images
|
mkdir -p /shared/html/images
|
||||||
if [ -f /tmp/initrd-x86_64.zst ]; then
|
if [ -f ${IMAGES_BASE_PATH}/initrd-x86_64.zst ]; then
|
||||||
cp /tmp/initrd-x86_64.zst /shared/html/images/ironic-python-agent-x86_64.initramfs
|
cp ${IMAGES_BASE_PATH}/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
|
cp ${IMAGES_BASE_PATH}/openstack-ironic-image.x86_64*.kernel /shared/html/images/ironic-python-agent-x86_64.kernel
|
||||||
fi
|
fi
|
||||||
# Use arm64 as destination for iPXE compatibility
|
# Use arm64 as destination for iPXE compatibility
|
||||||
if [ -f /tmp/initrd-aarch64.zst ]; then
|
if [ -f ${IMAGES_BASE_PATH}/initrd-aarch64.zst ]; then
|
||||||
cp /tmp/initrd-aarch64.zst /shared/html/images/ironic-python-agent-arm64.initramfs
|
cp ${IMAGES_BASE_PATH}/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
|
cp ${IMAGES_BASE_PATH}/openstack-ironic-image.aarch64*.kernel /shared/html/images/ironic-python-agent-arm64.kernel
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cp /tmp/images.sha256 /shared/images.sha256
|
cp /tmp/images.sha256 /shared/images.sha256
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
#!BuildTag: %%IMG_PREFIX%%kiwi-builder:%%kiwi_version%%.0-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%kiwi-builder:10.2.12.0-%RELEASE%
|
||||||
#!BuildTag: %%IMG_PREFIX%%kiwi-builder:%%kiwi_version%%.0
|
#!BuildTag: %%IMG_PREFIX%%kiwi-builder:10.2.12.0
|
||||||
|
|
||||||
|
# Base image version, should match the tag above
|
||||||
ARG KIWIVERSION="10.2.12"
|
ARG KIWIVERSION="10.2.12"
|
||||||
FROM registry.suse.com/bci/kiwi:${KIWIVERSION}
|
FROM registry.suse.com/bci/kiwi:${KIWIVERSION}
|
||||||
ARG KIWIVERSION
|
ARG KIWIVERSION
|
||||||
@@ -10,11 +11,11 @@ ARG KIWIVERSION
|
|||||||
LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)"
|
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.title="SLE Kiwi Builder Container Image"
|
||||||
LABEL org.opencontainers.image.description="kiwi-builder based on the SLE Base 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.url="https://www.suse.com/solutions/edge-computing/"
|
||||||
LABEL org.opencontainers.image.created="%BUILDTIME%"
|
LABEL org.opencontainers.image.created="%BUILDTIME%"
|
||||||
LABEL org.opencontainers.image.vendor="SUSE LLC"
|
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 org.openbuildservice.disturl="%DISTURL%"
|
||||||
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%"
|
||||||
LABEL com.suse.eula="SUSE Combined EULA February 2024"
|
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"
|
LABEL com.suse.release-stage="released"
|
||||||
# endlabelprefix
|
# 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
|
# Copy build script into image and make it executable
|
||||||
ADD build-image.sh /usr/bin/build-image
|
ADD build-image.sh /usr/bin/build-image
|
||||||
RUN chmod a+x /usr/bin/build-image
|
RUN chmod a+x /usr/bin/build-image
|
||||||
|
@@ -1,15 +1,9 @@
|
|||||||
<services>
|
<services>
|
||||||
<service mode="buildtime" name="kiwi_metainfo_helper"/>
|
<service mode="buildtime" name="kiwi_metainfo_helper"/>
|
||||||
<service name="docker_label_helper" mode="buildtime"/>
|
<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">
|
<service name="replace_using_env" mode="buildtime">
|
||||||
<param name="file">Dockerfile</param>
|
<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="eval">IMG_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?img_prefix})</param>
|
||||||
<param name="var">IMG_PREFIX</param>
|
<param name="var">IMG_PREFIX</param>
|
||||||
<param name="eval">IMG_REPO=$(rpm --macros=/root/.rpmmacros -E %img_repo)</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="eval">SUPPORT_LEVEL=$(rpm --macros=/root/.rpmmacros -E %support_level)</param>
|
||||||
<param name="var">SUPPORT_LEVEL</param>
|
<param name="var">SUPPORT_LEVEL</param>
|
||||||
</service>
|
</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>
|
</services>
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# 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%%
|
||||||
#!BuildTag: %%IMG_PREFIX%%kube-rbac-proxy:%%kube-rbac-proxy_version%%-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%kube-rbac-proxy:%%kube-rbac-proxy_version%%-%RELEASE%
|
||||||
#!BuildVersion: 15.6
|
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||||
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#!BuildTag: %%IMG_PREFIX%%kubectl:1.32.4
|
#!BuildTag: %%IMG_PREFIX%%kubectl:1.32.4
|
||||||
#!BuildTag: %%IMG_PREFIX%%kubectl:1.32.4-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%kubectl:1.32.4-%RELEASE%
|
||||||
#!BuildVersion: 15.6
|
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||||
|
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
#!BuildTag: %%CHART_PREFIX%%kubevirt-dashboard-extension:%%CHART_MAJOR%%.0.2
|
|
||||||
#!BuildTag: %%CHART_PREFIX%%kubevirt-dashboard-extension:%%CHART_MAJOR%%.0.2_up1.3.2
|
#!BuildTag: %%CHART_PREFIX%%kubevirt-dashboard-extension:%%CHART_MAJOR%%.0.2_up1.3.2
|
||||||
#!BuildTag: %%CHART_PREFIX%%kubevirt-dashboard-extension:%%CHART_MAJOR%%.0.2_up1.3.2-%RELEASE%
|
#!BuildTag: %%CHART_PREFIX%%kubevirt-dashboard-extension:%%CHART_MAJOR%%.0.2_up1.3.2-%RELEASE%
|
||||||
annotations:
|
annotations:
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
#!BuildTag: %%CHART_PREFIX%%metal3:%%CHART_MAJOR%%.0.7_up0.11.5
|
#!BuildTag: %%CHART_PREFIX%%metal3:%%CHART_MAJOR%%.0.10_up0.12.0
|
||||||
#!BuildTag: %%CHART_PREFIX%%metal3:%%CHART_MAJOR%%.0.7_up0.11.5-%RELEASE%
|
#!BuildTag: %%CHART_PREFIX%%metal3:%%CHART_MAJOR%%.0.10_up0.12.0-%RELEASE%
|
||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
appVersion: 0.11.5
|
appVersion: 0.12.0
|
||||||
dependencies:
|
dependencies:
|
||||||
- alias: metal3-baremetal-operator
|
- alias: metal3-baremetal-operator
|
||||||
name: baremetal-operator
|
name: baremetal-operator
|
||||||
@@ -10,19 +10,19 @@ dependencies:
|
|||||||
- alias: metal3-ironic
|
- alias: metal3-ironic
|
||||||
name: ironic
|
name: ironic
|
||||||
repository: file://./charts/ironic
|
repository: file://./charts/ironic
|
||||||
version: 0.10.5
|
version: 0.11.0
|
||||||
- alias: metal3-mariadb
|
- alias: metal3-mariadb
|
||||||
condition: global.enable_mariadb
|
condition: global.enable_mariadb
|
||||||
name: mariadb
|
name: mariadb
|
||||||
repository: file://./charts/mariadb
|
repository: file://./charts/mariadb
|
||||||
version: 0.5.4
|
version: 0.6.0
|
||||||
- alias: metal3-media
|
- alias: metal3-media
|
||||||
condition: global.enable_metal3_media_server
|
condition: global.enable_metal3_media_server
|
||||||
name: media
|
name: media
|
||||||
repository: file://./charts/media
|
repository: file://./charts/media
|
||||||
version: 0.6.2
|
version: 0.6.4
|
||||||
description: A Helm chart that installs all of the dependencies needed for Metal3
|
description: A Helm chart that installs all of the dependencies needed for Metal3
|
||||||
icon: https://github.com/cncf/artwork/raw/master/projects/metal3/icon/color/metal3-icon-color.svg
|
icon: https://github.com/cncf/artwork/raw/master/projects/metal3/icon/color/metal3-icon-color.svg
|
||||||
name: metal3
|
name: metal3
|
||||||
type: application
|
type: application
|
||||||
version: "%%CHART_MAJOR%%.0.7+up0.11.5"
|
version: "%%CHART_MAJOR%%.0.10+up0.12.0"
|
||||||
|
@@ -61,3 +61,19 @@ Create the name of the service account to use
|
|||||||
{{- default "default" .Values.serviceAccount.name }}
|
{{- default "default" .Values.serviceAccount.name }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create the URL to use for connecting to the Ironic servers (e.g. API, cache)
|
||||||
|
*/}}
|
||||||
|
{{- define "baremetal-operator.ironicHttpHost" -}}
|
||||||
|
{{- $ironicIP := include "metal3.provisioningIP" . -}}
|
||||||
|
{{- with .Values.global }}
|
||||||
|
{{- if .provisioningHostname }}
|
||||||
|
{{- .provisioningHostname }}
|
||||||
|
{{- else if regexMatch ".*:.*" $ironicIP}}
|
||||||
|
{{- print "[" $ironicIP "]" }}
|
||||||
|
{{- else }}
|
||||||
|
{{- $ironicIP }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
{{- $enableTLS := .Values.global.enable_tls }}
|
{{- $enableTLS := .Values.global.enable_tls }}
|
||||||
{{- $enableVMediaTLS := .Values.global.enable_vmedia_tls }}
|
{{- $enableVMediaTLS := .Values.global.enable_vmedia_tls }}
|
||||||
{{- $protocol := ternary "https" "http" $enableTLS }}
|
{{- $protocol := ternary "https" "http" $enableTLS }}
|
||||||
{{- $ironicIP := .Values.global.ironicIP | default "" }}
|
{{- $ironicHost := include "baremetal-operator.ironicHttpHost" . | required "Missing host information for BMO to connect to Ironic" }}
|
||||||
{{- $ironicApiHost := print $ironicIP ":6385" }}
|
{{- $ironicApiHost := print $ironicHost ":6385" }}
|
||||||
{{- $ironicBootHost := print $ironicIP ":6180" }}
|
{{- $ironicBootHost := print $ironicHost ":6180" }}
|
||||||
{{- $ironicCacheHost := print $ironicIP ":6180" }}
|
{{- $ironicCacheHost := print $ironicHost ":6180" }}
|
||||||
{{- $deployArch := .Values.global.deployArchitecture }}
|
{{- $deployArch := .Values.global.deployArchitecture }}
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
@@ -12,8 +12,8 @@ data:
|
|||||||
IRONIC_ENDPOINT: "{{ $protocol }}://{{ $ironicApiHost }}/v1/"
|
IRONIC_ENDPOINT: "{{ $protocol }}://{{ $ironicApiHost }}/v1/"
|
||||||
# Switch VMedia to HTTP if enable_vmedia_tls is false
|
# Switch VMedia to HTTP if enable_vmedia_tls is false
|
||||||
{{- if and $enableTLS $enableVMediaTLS }}
|
{{- if and $enableTLS $enableVMediaTLS }}
|
||||||
{{- $ironicBootHost = print $ironicIP ":" .Values.global.vmediaTLSPort }}
|
{{- $ironicBootHost = print $ironicHost ":" .Values.global.vmediaTLSPort }}
|
||||||
{{- $ironicCacheHost = print $ironicIP ":" .Values.global.vmediaTLSPort }}
|
{{- $ironicCacheHost = print $ironicHost ":" .Values.global.vmediaTLSPort }}
|
||||||
{{- $protocol = "https" }}
|
{{- $protocol = "https" }}
|
||||||
RESTART_CONTAINER_CERTIFICATE_UPDATED: "true"
|
RESTART_CONTAINER_CERTIFICATE_UPDATED: "true"
|
||||||
{{- else }}
|
{{- else }}
|
||||||
|
@@ -6,6 +6,7 @@ metadata:
|
|||||||
control-plane: controller-manager
|
control-plane: controller-manager
|
||||||
name: {{ include "baremetal-operator.fullname" . }}-controller-manager-metrics-service
|
name: {{ include "baremetal-operator.fullname" . }}-controller-manager-metrics-service
|
||||||
spec:
|
spec:
|
||||||
|
ipFamilyPolicy: PreferDualStack
|
||||||
ports:
|
ports:
|
||||||
- name: https
|
- name: https
|
||||||
port: 8443
|
port: 8443
|
||||||
|
@@ -5,6 +5,7 @@ metadata:
|
|||||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||||
name: {{ include "baremetal-operator.fullname" . }}-webhook-service
|
name: {{ include "baremetal-operator.fullname" . }}-webhook-service
|
||||||
spec:
|
spec:
|
||||||
|
ipFamilyPolicy: PreferDualStack
|
||||||
ports:
|
ports:
|
||||||
- port: 443
|
- port: 443
|
||||||
targetPort: 9443
|
targetPort: 9443
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
appVersion: 26.1.2
|
appVersion: 29.0.4
|
||||||
description: A Helm chart for Ironic, used by Metal3
|
description: A Helm chart for Ironic, used by Metal3
|
||||||
name: ironic
|
name: ironic
|
||||||
type: application
|
type: application
|
||||||
version: 0.10.5
|
version: 0.11.0
|
||||||
|
@@ -83,3 +83,46 @@ Get ironic CA volumeMounts
|
|||||||
readOnly: true
|
readOnly: true
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the formatted "External" hostname or IP address
|
||||||
|
*/}}
|
||||||
|
{{- define "ironic.externalHttpHost" }}
|
||||||
|
{{- with .Values.global }}
|
||||||
|
{{- if regexMatch ".*:.*" .externalHttpHost }}
|
||||||
|
{{- print "[" .externalHttpHost "]" }}
|
||||||
|
{{- else }}
|
||||||
|
{{- .externalHttpHost }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Get the command to use for Liveness and Readiness probes
|
||||||
|
*/}}
|
||||||
|
{{- define "ironic.probeCommand" }}
|
||||||
|
{{- $host := "127.0.0.1" }}
|
||||||
|
{{- if eq .Values.listenOnAll false }}
|
||||||
|
{{- $host = coalesce .Values.global.ironicIP .Values.global.provisioningIP .Values.global.provisioningHostname }}
|
||||||
|
{{- if regexMatch ".*:.*" $host }}
|
||||||
|
{{- $host = print "[" $host "]" }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- print "curl -sSfk https://" $host ":6385" }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create the subjectAltNames section to be set on the Certificate
|
||||||
|
*/}}
|
||||||
|
{{- define "ironic.subjectAltNames" -}}
|
||||||
|
{{- with .Values.global }}
|
||||||
|
{{- if .provisioningHostname }}
|
||||||
|
dnsNames:
|
||||||
|
- {{ .provisioningHostname }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- if or .ironicIP .provisioningIP }}
|
||||||
|
ipAddresses:
|
||||||
|
- {{ coalesce .ironicIP .provisioningIP }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
@@ -6,8 +6,7 @@ metadata:
|
|||||||
spec:
|
spec:
|
||||||
commonName: ironic-ca
|
commonName: ironic-ca
|
||||||
isCA: true
|
isCA: true
|
||||||
ipAddresses:
|
{{- include "ironic.subjectAltNames" . | indent 2 }}
|
||||||
- {{ .Values.global.ironicIP }}
|
|
||||||
issuerRef:
|
issuerRef:
|
||||||
kind: Issuer
|
kind: Issuer
|
||||||
name: selfsigned-issuer
|
name: selfsigned-issuer
|
||||||
@@ -19,8 +18,7 @@ metadata:
|
|||||||
name: ironic-cert
|
name: ironic-cert
|
||||||
spec:
|
spec:
|
||||||
commonName: ironic-cert
|
commonName: ironic-cert
|
||||||
ipAddresses:
|
{{- include "ironic.subjectAltNames" . | indent 2 }}
|
||||||
- {{ .Values.global.ironicIP }}
|
|
||||||
issuerRef:
|
issuerRef:
|
||||||
kind: Issuer
|
kind: Issuer
|
||||||
name: ca-issuer
|
name: ca-issuer
|
||||||
@@ -33,8 +31,7 @@ metadata:
|
|||||||
name: ironic-vmedia-cert
|
name: ironic-vmedia-cert
|
||||||
spec:
|
spec:
|
||||||
commonName: ironic-vmedia-cert
|
commonName: ironic-vmedia-cert
|
||||||
ipAddresses:
|
{{- include "ironic.subjectAltNames" . | indent 2 }}
|
||||||
- {{ .Values.global.ironicIP }}
|
|
||||||
issuerRef:
|
issuerRef:
|
||||||
kind: Issuer
|
kind: Issuer
|
||||||
name: ca-issuer
|
name: ca-issuer
|
||||||
|
@@ -1,21 +1,16 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
name: ironic-bmo
|
name: ironic
|
||||||
labels:
|
labels:
|
||||||
{{- include "ironic.labels" . | nindent 4 }}
|
{{- include "ironic.labels" . | nindent 4 }}
|
||||||
data:
|
data:
|
||||||
{{- $enableTLS := .Values.global.enable_tls }}
|
{{- $enableTLS := .Values.global.enable_tls }}
|
||||||
{{- $enableVMediaTLS := .Values.global.enable_vmedia_tls }}
|
{{- $enableVMediaTLS := .Values.global.enable_vmedia_tls }}
|
||||||
{{- $protocol := ternary "https" "http" $enableTLS }}
|
{{- $protocol := ternary "https" "http" $enableTLS }}
|
||||||
{{- $ironicIP := .Values.global.ironicIP | default "" }}
|
|
||||||
{{- $ironicApiHost := print $ironicIP ":6385" }}
|
|
||||||
{{- $ironicBootHost := print $ironicIP ":6180" }}
|
|
||||||
{{- $ironicCacheHost := print $ironicIP ":6180" }}
|
|
||||||
{{- $deployArch := .Values.global.deployArchitecture }}
|
{{- $deployArch := .Values.global.deployArchitecture }}
|
||||||
|
|
||||||
{{- if ( .Values.global.enable_dnsmasq ) }}
|
{{- if ( .Values.global.enable_dnsmasq ) }}
|
||||||
DNSMASQ_BOOT_SERVER_ADDRESS: {{ $ironicBootHost }}
|
|
||||||
DNSMASQ_DNS_SERVER_ADDRESS: {{ .Values.global.dnsmasqDNSServer }}
|
DNSMASQ_DNS_SERVER_ADDRESS: {{ .Values.global.dnsmasqDNSServer }}
|
||||||
DNSMASQ_DEFAULT_ROUTER: {{ .Values.global.dnsmasqDefaultRouter }}
|
DNSMASQ_DEFAULT_ROUTER: {{ .Values.global.dnsmasqDefaultRouter }}
|
||||||
DHCP_RANGE: {{ .Values.global.dhcpRange }}
|
DHCP_RANGE: {{ .Values.global.dhcpRange }}
|
||||||
@@ -25,40 +20,27 @@ data:
|
|||||||
{{- end }}
|
{{- end }}
|
||||||
HTTP_PORT: "6180"
|
HTTP_PORT: "6180"
|
||||||
PREDICTABLE_NIC_NAMES: "{{ .Values.global.predictableNicNames }}"
|
PREDICTABLE_NIC_NAMES: "{{ .Values.global.predictableNicNames }}"
|
||||||
USE_IRONIC_INSPECTOR: "false"
|
|
||||||
IRONIC_API_BASE_URL: {{ $protocol }}://{{ $ironicApiHost }}
|
|
||||||
IRONIC_API_HOST: {{ $ironicApiHost }}
|
|
||||||
IRONIC_API_HTTPD_SERVER_NAME: {{ $ironicApiHost }}
|
|
||||||
IRONIC_ENDPOINT: {{ $protocol }}://{{ $ironicApiHost }}/v1/
|
|
||||||
# Switch VMedia to HTTP if enable_vmedia_tls is false
|
# Switch VMedia to HTTP if enable_vmedia_tls is false
|
||||||
{{- if and $enableTLS $enableVMediaTLS }}
|
{{- if and $enableTLS $enableVMediaTLS }}
|
||||||
{{- $ironicBootHost = print $ironicIP ":" .Values.global.vmediaTLSPort }}
|
|
||||||
{{- $ironicCacheHost = print $ironicIP ":" .Values.global.vmediaTLSPort }}
|
|
||||||
{{- $protocol = "https" }}
|
{{- $protocol = "https" }}
|
||||||
{{- else }}
|
{{- else }}
|
||||||
{{- $protocol = "http" }}
|
{{- $protocol = "http" }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
IRONIC_EXTERNAL_HTTP_URL: {{ $protocol }}://{{ $ironicCacheHost }}
|
{{- if .Values.global.externalHttpHost }}
|
||||||
CACHEURL: {{ $protocol }}://{{ $ironicCacheHost }}/images
|
IRONIC_EXTERNAL_HTTP_URL: {{ $protocol }}://{{ include "ironic.externalHttpHost" . }}:6385
|
||||||
DEPLOY_KERNEL_URL: {{ $protocol }}://{{ $ironicBootHost }}/images/ironic-python-agent-{{ $deployArch }}.kernel
|
{{- end }}
|
||||||
DEPLOY_RAMDISK_URL: {{ $protocol }}://{{ $ironicBootHost }}/images/ironic-python-agent-{{ $deployArch }}.initramfs
|
|
||||||
DEPLOY_ARCHITECTURE: {{ $deployArch }}
|
DEPLOY_ARCHITECTURE: {{ $deployArch }}
|
||||||
IRONIC_BOOT_BASE_URL: {{ $protocol }}://{{ $ironicBootHost }}
|
|
||||||
IRONIC_VMEDIA_HTTPD_SERVER_NAME: {{ $ironicBootHost }}
|
|
||||||
ENABLE_PXE_BOOT: "{{ .Values.global.enable_pxe_boot }}"
|
ENABLE_PXE_BOOT: "{{ .Values.global.enable_pxe_boot }}"
|
||||||
{{- if .Values.global.provisioningInterface }}
|
{{- if .Values.global.provisioningInterface }}
|
||||||
PROVISIONING_INTERFACE: {{ .Values.global.provisioningInterface }}
|
PROVISIONING_INTERFACE: {{ .Values.global.provisioningInterface }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- if .Values.global.provisioningIP }}
|
{{- if or .Values.global.ironicIP .Values.global.provisioningIP }}
|
||||||
PROVISIONING_IP: {{ .Values.global.provisioningIP }}
|
PROVISIONING_IP: {{ include "metal3.provisioningIP" . }}
|
||||||
|
{{- else if .Values.global.provisioningHostname }}
|
||||||
|
IRONIC_URL_HOSTNAME: {{ .Values.global.provisioningHostname }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
IRONIC_ILO_USE_SWIFT: "false"
|
|
||||||
IRONIC_ILO_USE_WEB_SERVER_FOR_IMAGES: "true"
|
|
||||||
IRONIC_FAST_TRACK: "true"
|
IRONIC_FAST_TRACK: "true"
|
||||||
LISTEN_ALL_INTERFACES: "true"
|
LISTEN_ALL_INTERFACES: "{{ .Values.listenOnAll }}"
|
||||||
{{- if .Values.global.ironicIP }}
|
|
||||||
IRONIC_IP: {{ .Values.global.ironicIP }}
|
|
||||||
{{- end }}
|
|
||||||
{{- if ( .Values.global.enable_tls ) }}
|
{{- if ( .Values.global.enable_tls ) }}
|
||||||
RESTART_CONTAINER_CERTIFICATE_UPDATED: "true"
|
RESTART_CONTAINER_CERTIFICATE_UPDATED: "true"
|
||||||
IRONIC_KERNEL_PARAMS: {{ .Values.global.ironicKernelParams }} tls.enabled=true
|
IRONIC_KERNEL_PARAMS: {{ .Values.global.ironicKernelParams }} tls.enabled=true
|
||||||
|
@@ -39,10 +39,10 @@ spec:
|
|||||||
- /bin/runhttpd
|
- /bin/runhttpd
|
||||||
envFrom:
|
envFrom:
|
||||||
- configMapRef:
|
- configMapRef:
|
||||||
name: ironic-bmo
|
name: ironic
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
exec:
|
exec:
|
||||||
command: ["sh", "-c", "curl -sSfk https://127.0.0.1:6385"]
|
command: ["sh", "-c", "{{ include "ironic.probeCommand" . }}"]
|
||||||
failureThreshold: 10
|
failureThreshold: 10
|
||||||
initialDelaySeconds: 30
|
initialDelaySeconds: 30
|
||||||
periodSeconds: 30
|
periodSeconds: 30
|
||||||
@@ -60,7 +60,7 @@ spec:
|
|||||||
{{- end }}
|
{{- end }}
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command: ["sh", "-c", "curl -sSfk https://127.0.0.1:6385"]
|
command: ["sh", "-c", "{{ include "ironic.probeCommand" . }}"]
|
||||||
failureThreshold: 10
|
failureThreshold: 10
|
||||||
initialDelaySeconds: 30
|
initialDelaySeconds: 30
|
||||||
periodSeconds: 30
|
periodSeconds: 30
|
||||||
@@ -97,7 +97,7 @@ spec:
|
|||||||
- /bin/runironic
|
- /bin/runironic
|
||||||
envFrom:
|
envFrom:
|
||||||
- configMapRef:
|
- configMapRef:
|
||||||
name: ironic-bmo
|
name: ironic
|
||||||
env:
|
env:
|
||||||
{{- if .Values.global.enable_basicAuth }}
|
{{- if .Values.global.enable_basicAuth }}
|
||||||
- name: IRONIC_HTPASSWD
|
- name: IRONIC_HTPASSWD
|
||||||
@@ -170,7 +170,7 @@ spec:
|
|||||||
- /bin/rundnsmasq
|
- /bin/rundnsmasq
|
||||||
envFrom:
|
envFrom:
|
||||||
- configMapRef:
|
- configMapRef:
|
||||||
name: ironic-bmo
|
name: ironic
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
|
@@ -10,6 +10,7 @@ metadata:
|
|||||||
{{- end }}
|
{{- end }}
|
||||||
spec:
|
spec:
|
||||||
type: {{ .Values.service.type }}
|
type: {{ .Values.service.type }}
|
||||||
|
ipFamilyPolicy: PreferDualStack
|
||||||
ports:
|
ports:
|
||||||
{{- $enableTLS := .Values.global.enable_tls }}
|
{{- $enableTLS := .Values.global.enable_tls }}
|
||||||
{{- $enableVMediaTLS := .Values.global.enable_vmedia_tls }}
|
{{- $enableVMediaTLS := .Values.global.enable_vmedia_tls }}
|
||||||
|
@@ -32,6 +32,12 @@ global:
|
|||||||
# IP Address assigned to network interface on provisioning network
|
# IP Address assigned to network interface on provisioning network
|
||||||
provisioningIP: ""
|
provisioningIP: ""
|
||||||
|
|
||||||
|
# Fully Qualified Domain Name used by Ironic for both binding (to the
|
||||||
|
# associated IPv4 and/or IPv6 addresses) and exposing the API, dnsmask and
|
||||||
|
# media, also used by BMO. Note, this is the only way to enable a fully
|
||||||
|
# working dual-stack configuration.
|
||||||
|
provisioningHostname: ""
|
||||||
|
|
||||||
# Whether the NIC names should be predictable or not
|
# Whether the NIC names should be predictable or not
|
||||||
predictableNicNames: "true"
|
predictableNicNames: "true"
|
||||||
|
|
||||||
@@ -52,15 +58,17 @@ global:
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
|
listenOnAll: true
|
||||||
|
|
||||||
images:
|
images:
|
||||||
ironic:
|
ironic:
|
||||||
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic
|
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic
|
||||||
pullPolicy: IfNotPresent
|
pullPolicy: IfNotPresent
|
||||||
tag: 26.1.2.4
|
tag: 29.0.4.0
|
||||||
ironicIPADownloader:
|
ironicIPADownloader:
|
||||||
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic-ipa-downloader
|
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic-ipa-downloader
|
||||||
pullPolicy: IfNotPresent
|
pullPolicy: IfNotPresent
|
||||||
tag: 3.0.7
|
tag: 3.0.8
|
||||||
|
|
||||||
nameOverride: ""
|
nameOverride: ""
|
||||||
fullnameOverride: ""
|
fullnameOverride: ""
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
appVersion: 10.6.7
|
appVersion: "10.11"
|
||||||
description: A Helm chart for MariaDB, used by Metal3
|
description: A Helm chart for MariaDB, used by Metal3
|
||||||
name: mariadb
|
name: mariadb
|
||||||
type: application
|
type: application
|
||||||
version: 0.5.4
|
version: 0.6.0
|
||||||
|
13
metal3-chart/charts/mariadb/templates/configmap-mariadb.yaml
Normal file
13
metal3-chart/charts/mariadb/templates/configmap-mariadb.yaml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: mariadb-config
|
||||||
|
labels:
|
||||||
|
{{- include "mariadb.labels" . | nindent 4 }}
|
||||||
|
data:
|
||||||
|
ironic.conf: |
|
||||||
|
[mariadb]
|
||||||
|
max_connections 64
|
||||||
|
max_heap_table_size 1M
|
||||||
|
innodb_buffer_pool_size 5M
|
||||||
|
innodb_log_buffer_size 512K
|
@@ -5,4 +5,7 @@ metadata:
|
|||||||
labels:
|
labels:
|
||||||
{{- include "mariadb.labels" . | nindent 4 }}
|
{{- include "mariadb.labels" . | nindent 4 }}
|
||||||
data:
|
data:
|
||||||
RESTART_CONTAINER_CERTIFICATE_UPDATED: "false"
|
MARIADB_USER: ironic
|
||||||
|
MARIADB_RANDOM_ROOT_PASSWORD: "yes"
|
||||||
|
MARIADB_DATABASE: ironic
|
||||||
|
MARIADB_AUTO_UPGRADE: "yes"
|
@@ -25,23 +25,50 @@ spec:
|
|||||||
serviceAccountName: {{ include "mariadb.serviceAccountName" . }}
|
serviceAccountName: {{ include "mariadb.serviceAccountName" . }}
|
||||||
securityContext:
|
securityContext:
|
||||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||||
|
initContainers:
|
||||||
|
# This would run during entrypoint if run as root
|
||||||
|
- name: set-volume-owners
|
||||||
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||||
|
securityContext:
|
||||||
|
runAsUser: 0
|
||||||
|
allowPrivilegeEscalation: true
|
||||||
|
capabilities:
|
||||||
|
drop:
|
||||||
|
- ALL
|
||||||
|
add:
|
||||||
|
- CHOWN
|
||||||
|
- FOWNER
|
||||||
|
- DAC_OVERRIDE
|
||||||
|
seccompProfile:
|
||||||
|
type: RuntimeDefault
|
||||||
|
volumeMounts:
|
||||||
|
- name: mariadb-conf
|
||||||
|
mountPath: /etc/mysql/conf.d
|
||||||
|
- name: mariadb-run
|
||||||
|
mountPath: /run/mysql
|
||||||
|
{{- $volmounts }}
|
||||||
|
command: ['bash', '-c', 'source /usr/local/bin/docker-entrypoint.sh && docker_create_db_directories']
|
||||||
|
env:
|
||||||
|
- name: DATADIR
|
||||||
|
value: /var/lib/mysql
|
||||||
|
- name: SOCKET
|
||||||
|
value: /run/mysql/mysql.sock
|
||||||
containers:
|
containers:
|
||||||
- name: mariadb
|
- name: mariadb
|
||||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
||||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||||
securityContext:
|
securityContext:
|
||||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||||
|
envFrom:
|
||||||
|
- configMapRef:
|
||||||
|
name: mariadb-cm
|
||||||
env:
|
env:
|
||||||
- name: MARIADB_PASSWORD
|
- name: MARIADB_PASSWORD
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
key: password
|
key: password
|
||||||
name: ironic-mariadb
|
name: ironic-mariadb
|
||||||
- name: RESTART_CONTAINER_CERTIFICATE_UPDATED
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: mariadb-cm
|
|
||||||
key: RESTART_CONTAINER_CERTIFICATE_UPDATED
|
|
||||||
lifecycle:
|
lifecycle:
|
||||||
preStop:
|
preStop:
|
||||||
exec:
|
exec:
|
||||||
@@ -52,9 +79,9 @@ spec:
|
|||||||
livenessProbe:
|
livenessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
- sh
|
- healthcheck.sh
|
||||||
- -c
|
- --connect
|
||||||
- mysqladmin status -uironic -p$(printenv MARIADB_PASSWORD)
|
- --innodb_initialized
|
||||||
failureThreshold: 10
|
failureThreshold: 10
|
||||||
initialDelaySeconds: 30
|
initialDelaySeconds: 30
|
||||||
periodSeconds: 30
|
periodSeconds: 30
|
||||||
@@ -67,19 +94,29 @@ spec:
|
|||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
- sh
|
- healthcheck.sh
|
||||||
- -c
|
- --connect
|
||||||
- mysqladmin status -uironic -p$(printenv MARIADB_PASSWORD)
|
- --innodb_initialized
|
||||||
failureThreshold: 10
|
failureThreshold: 10
|
||||||
initialDelaySeconds: 30
|
initialDelaySeconds: 30
|
||||||
periodSeconds: 30
|
periodSeconds: 30
|
||||||
successThreshold: 1
|
successThreshold: 1
|
||||||
timeoutSeconds: 10
|
timeoutSeconds: 10
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
|
- name: mariadb-conf
|
||||||
|
mountPath: /etc/mysql/conf.d
|
||||||
|
- name: mariadb-run
|
||||||
|
mountPath: /run/mysql
|
||||||
{{- $volmounts }}
|
{{- $volmounts }}
|
||||||
{{- with .Values.global.nodeSelector }}
|
{{- with .Values.global.nodeSelector }}
|
||||||
nodeSelector:
|
nodeSelector:
|
||||||
{{- toYaml . | nindent 8 }}
|
{{- toYaml . | nindent 8 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
volumes:
|
volumes:
|
||||||
|
- name: mariadb-conf
|
||||||
|
configMap:
|
||||||
|
name: mariadb-config
|
||||||
|
- name: mariadb-run
|
||||||
|
emptyDir:
|
||||||
|
sizeLimit: 20Mi
|
||||||
{{- $volumes }}
|
{{- $volumes }}
|
||||||
|
@@ -5,10 +5,11 @@ metadata:
|
|||||||
labels:
|
labels:
|
||||||
{{- include "mariadb.labels" . | nindent 4 }}
|
{{- include "mariadb.labels" . | nindent 4 }}
|
||||||
spec:
|
spec:
|
||||||
|
ipFamilyPolicy: PreferDualStack
|
||||||
type: {{ .Values.service.type }}
|
type: {{ .Values.service.type }}
|
||||||
selector:
|
selector:
|
||||||
{{- include "mariadb.selectorLabels" . | nindent 4 }}
|
{{- include "mariadb.selectorLabels" . | nindent 4 }}
|
||||||
ports:
|
ports:
|
||||||
{{- with .Values.service.ports }}
|
{{- with .Values.service.ports }}
|
||||||
{{- toYaml . | nindent 2 }}
|
{{- toYaml . | nindent 2 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
@@ -12,9 +12,9 @@ service:
|
|||||||
targetPort: 3306
|
targetPort: 3306
|
||||||
|
|
||||||
image:
|
image:
|
||||||
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/suse/mariadb
|
repository: registry.suse.com/suse/mariadb
|
||||||
pullPolicy: IfNotPresent
|
pullPolicy: IfNotPresent
|
||||||
tag: 10.6.15.1
|
tag: 10.11
|
||||||
|
|
||||||
nameOverride: ""
|
nameOverride: ""
|
||||||
fullnameOverride: ""
|
fullnameOverride: ""
|
||||||
@@ -31,8 +31,8 @@ serviceAccount:
|
|||||||
podAnnotations: {}
|
podAnnotations: {}
|
||||||
|
|
||||||
podSecurityContext:
|
podSecurityContext:
|
||||||
runAsUser: 10060
|
runAsUser: 60
|
||||||
fsGroup: 10060
|
fsGroup: 60
|
||||||
|
|
||||||
securityContext:
|
securityContext:
|
||||||
allowPrivilegeEscalation: false
|
allowPrivilegeEscalation: false
|
||||||
@@ -60,6 +60,7 @@ persistence:
|
|||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: mariadb-data-volume
|
- name: mariadb-data-volume
|
||||||
mountPath: /var/lib/mysql
|
mountPath: /var/lib/mysql
|
||||||
|
subPath: data
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- name: mariadb-data-volume
|
- name: mariadb-data-volume
|
||||||
|
@@ -3,4 +3,4 @@ appVersion: 1.16.0
|
|||||||
description: A Helm chart for Media, used by Metal3
|
description: A Helm chart for Media, used by Metal3
|
||||||
name: media
|
name: media
|
||||||
type: application
|
type: application
|
||||||
version: 0.6.2
|
version: 0.6.4
|
||||||
|
@@ -5,6 +5,7 @@ metadata:
|
|||||||
labels:
|
labels:
|
||||||
{{- include "media.labels" . | nindent 4 }}
|
{{- include "media.labels" . | nindent 4 }}
|
||||||
spec:
|
spec:
|
||||||
|
ipFamilyPolicy: PreferDualStack
|
||||||
type: {{ .Values.service.type }}
|
type: {{ .Values.service.type }}
|
||||||
ports:
|
ports:
|
||||||
- port: {{ .Values.service.port }}
|
- port: {{ .Values.service.port }}
|
||||||
|
@@ -24,7 +24,7 @@ replicaCount: 1
|
|||||||
image:
|
image:
|
||||||
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic
|
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic
|
||||||
pullPolicy: IfNotPresent
|
pullPolicy: IfNotPresent
|
||||||
tag: 26.1.2.4
|
tag: 29.0.4.0
|
||||||
|
|
||||||
imagePullSecrets: []
|
imagePullSecrets: []
|
||||||
nameOverride: ""
|
nameOverride: ""
|
||||||
|
@@ -60,3 +60,18 @@ Create the name of the service account to use
|
|||||||
{{- default "default" .Values.serviceAccount.name }}
|
{{- default "default" .Values.serviceAccount.name }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Produce the correct IP or hostname for Ironic provisioning
|
||||||
|
*/}}
|
||||||
|
{{- define "metal3.provisioningIP" -}}
|
||||||
|
{{- with .Values.global }}
|
||||||
|
{{- if and .provisioningHostname (or .provisioningIP .ironicIP) }}
|
||||||
|
{{ fail "Please provide either provisioningHostname or provisioningIP (note: ironic IP is deprecated)" }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .provisioningIP .ironicIP }}
|
||||||
|
{{ fail "Please provide either ironicIP or provisioningIP (note: ironicIP is deprecated)" }}
|
||||||
|
{{- end }}
|
||||||
|
{{- coalesce .ironicIP .provisioningIP }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
@@ -60,6 +60,15 @@ global:
|
|||||||
# IP Address assigned to network interface on provisioning network
|
# IP Address assigned to network interface on provisioning network
|
||||||
provisioningIP: ""
|
provisioningIP: ""
|
||||||
|
|
||||||
|
# Fully Qualified Domain Name used by Ironic for both binding (to the
|
||||||
|
# associated IPv4 and/or IPv6 addresses) and exposing the API, dnsmask and
|
||||||
|
# media, also used by BMO. Note, this is the only way to enable a fully
|
||||||
|
# working dual-stack configuration.
|
||||||
|
provisioningHostname: ""
|
||||||
|
|
||||||
|
# Hostname or IP for accessing the Ironic API server from a non-provisioning network
|
||||||
|
externalHttpHost: ""
|
||||||
|
|
||||||
# Name for the MariaDB service
|
# Name for the MariaDB service
|
||||||
databaseServiceName: metal3-mariadb
|
databaseServiceName: metal3-mariadb
|
||||||
|
|
||||||
@@ -115,8 +124,8 @@ metal3-mariadb:
|
|||||||
persistence:
|
persistence:
|
||||||
storageClass: ""
|
storageClass: ""
|
||||||
image:
|
image:
|
||||||
repository: "registry.suse.com/edge/mariadb"
|
repository: "registry.suse.com/suse/mariadb"
|
||||||
tag: "10.6.15.1"
|
tag: "10.11"
|
||||||
|
|
||||||
#
|
#
|
||||||
# Baremetal Operator
|
# Baremetal Operator
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#!BuildTag: %%IMG_PREFIX%%metallb-controller:v%%metallb-controller_version%%
|
#!BuildTag: %%IMG_PREFIX%%metallb-controller:v%%metallb-controller_version%%
|
||||||
#!BuildTag: %%IMG_PREFIX%%metallb-controller:v%%metallb-controller_version%%-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%metallb-controller:v%%metallb-controller_version%%-%RELEASE%
|
||||||
#!BuildVersion: 15.6
|
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||||
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#!BuildTag: %%IMG_PREFIX%%metallb-speaker:v%%metallb-speaker_version%%
|
#!BuildTag: %%IMG_PREFIX%%metallb-speaker:v%%metallb-speaker_version%%
|
||||||
#!BuildTag: %%IMG_PREFIX%%metallb-speaker:v%%metallb-speaker_version%%-%RELEASE%
|
#!BuildTag: %%IMG_PREFIX%%metallb-speaker:v%%metallb-speaker_version%%-%RELEASE%
|
||||||
#!BuildVersion: 15.6
|
|
||||||
ARG SLE_VERSION
|
ARG SLE_VERSION
|
||||||
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro
|
||||||
|
|
||||||
|
3
python-pyhelm3/_service
Normal file
3
python-pyhelm3/_service
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<services>
|
||||||
|
<service name="download_assets"></service>
|
||||||
|
</services>
|
55
python-pyhelm3/pyhelm3.spec
Normal file
55
python-pyhelm3/pyhelm3.spec
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#
|
||||||
|
# spec file for package python-pyhelm3
|
||||||
|
#
|
||||||
|
# Copyright (c) 2025 SUSE LLC
|
||||||
|
#
|
||||||
|
# All modifications and additions to the file contributed by third parties
|
||||||
|
# remain the property of their copyright owners, unless otherwise agreed
|
||||||
|
# upon. The license for this file, and modifications and additions to the
|
||||||
|
# file, is the same license as for the pristine package itself (unless the
|
||||||
|
# license for the pristine package is not an Open Source License, in which
|
||||||
|
# case the license is the MIT License). An "Open Source License" is a
|
||||||
|
# license that conforms to the Open Source Definition (Version 1.9)
|
||||||
|
# published by the Open Source Initiative.
|
||||||
|
|
||||||
|
# Please submit bugfixes or comments via https://bugs.opensuse.org/
|
||||||
|
|
||||||
|
Name: python-pyhelm3
|
||||||
|
Version: 0.4.0
|
||||||
|
Release: 0
|
||||||
|
Summary: Python library for managing Helm releases using Helm 3
|
||||||
|
License: Apache-2.0
|
||||||
|
URL: https://github.com/azimuth-cloud/pyhelm3
|
||||||
|
#!RemoteAsset
|
||||||
|
Source: https://files.pythonhosted.org/packages/source/p/pyhelm3/pyhelm3-%{version}.tar.gz
|
||||||
|
BuildRequires: python-rpm-macros
|
||||||
|
BuildRequires: %{python_module pip}
|
||||||
|
BuildRequires: %{python_module setuptools >= 42}
|
||||||
|
BuildRequires: %{python_module setuptools_scm >= 3.4}
|
||||||
|
BuildRequires: %{python_module wheel}
|
||||||
|
BuildRequires: fdupes
|
||||||
|
Requires: %{python_module pydantic}
|
||||||
|
Requires: %{python_module PyYAML}
|
||||||
|
BuildArch: noarch
|
||||||
|
%python_subpackages
|
||||||
|
|
||||||
|
%description
|
||||||
|
Python library for managing Helm releases using Helm 3.
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1 -n pyhelm3-%{version}
|
||||||
|
|
||||||
|
%build
|
||||||
|
%pyproject_wheel
|
||||||
|
|
||||||
|
%install
|
||||||
|
%pyproject_install
|
||||||
|
%python_expand %fdupes %{buildroot}%{$python_sitelib}
|
||||||
|
|
||||||
|
%files %{python_files}
|
||||||
|
%doc README.md
|
||||||
|
%license LICENSE
|
||||||
|
%{python_sitelib}/pyhelm3
|
||||||
|
%{python_sitelib}/pyhelm3-%{version}.dist-info
|
||||||
|
|
||||||
|
%changelog
|
@@ -1,10 +1,10 @@
|
|||||||
#!BuildTag: %%CHART_PREFIX%%rancher-turtles-airgap-resources:%%CHART_MAJOR%%.0.4_up0.20.0
|
#!BuildTag: %%CHART_PREFIX%%rancher-turtles-airgap-resources:%%CHART_MAJOR%%.0.5_up0.21.0
|
||||||
#!BuildTag: %%CHART_PREFIX%%rancher-turtles-airgap-resources:%%CHART_MAJOR%%.0.4_up0.20.0-%RELEASE%
|
#!BuildTag: %%CHART_PREFIX%%rancher-turtles-airgap-resources:%%CHART_MAJOR%%.0.5_up0.21.0-%RELEASE%
|
||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
appVersion: 0.20.0
|
appVersion: 0.21.0
|
||||||
description: Rancher Turtles utility chart for airgap scenarios
|
description: Rancher Turtles utility chart for airgap scenarios
|
||||||
home: https://github.com/rancher/turtles/
|
home: https://github.com/rancher/turtles/
|
||||||
icon: https://raw.githubusercontent.com/rancher/turtles/main/logos/capi.svg
|
icon: https://raw.githubusercontent.com/rancher/turtles/main/logos/capi.svg
|
||||||
name: rancher-turtles-airgap-resources
|
name: rancher-turtles-airgap-resources
|
||||||
type: application
|
type: application
|
||||||
version: "%%CHART_MAJOR%%.0.4+up0.20.0"
|
version: "%%CHART_MAJOR%%.0.5+up0.21.0"
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -656,12 +656,8 @@ data:
|
|||||||
- list
|
- list
|
||||||
- get
|
- get
|
||||||
- watch
|
- watch
|
||||||
- apiGroups:
|
|
||||||
- ""
|
|
||||||
resources:
|
|
||||||
- namespaces
|
|
||||||
verbs:
|
|
||||||
- create
|
- create
|
||||||
|
- patch
|
||||||
- apiGroups:
|
- apiGroups:
|
||||||
- events.k8s.io
|
- events.k8s.io
|
||||||
resources:
|
resources:
|
||||||
@@ -817,7 +813,7 @@ data:
|
|||||||
control-plane: controller-manager
|
control-plane: controller-manager
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- image: ghcr.io/rancher-sandbox/cluster-api-addon-provider-fleet:v0.10.0
|
- image: ghcr.io/rancher-sandbox/cluster-api-addon-provider-fleet:v0.11.0
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
name: manager
|
name: manager
|
||||||
ports:
|
ports:
|
||||||
@@ -839,7 +835,7 @@ data:
|
|||||||
memory: 100Mi
|
memory: 100Mi
|
||||||
- args:
|
- args:
|
||||||
- --helm-install
|
- --helm-install
|
||||||
image: ghcr.io/rancher-sandbox/cluster-api-addon-provider-fleet:v0.10.0
|
image: ghcr.io/rancher-sandbox/cluster-api-addon-provider-fleet:v0.11.0
|
||||||
name: helm-manager
|
name: helm-manager
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
@@ -891,10 +887,13 @@ data:
|
|||||||
- major: 0
|
- major: 0
|
||||||
minor: 10
|
minor: 10
|
||||||
contract: v1beta1
|
contract: v1beta1
|
||||||
|
- major: 0
|
||||||
|
minor: 11
|
||||||
|
contract: v1beta1
|
||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
creationTimestamp: null
|
creationTimestamp: null
|
||||||
name: v0.10.0
|
name: v0.11.0
|
||||||
namespace: rancher-turtles-system
|
namespace: rancher-turtles-system
|
||||||
labels:
|
labels:
|
||||||
provider-components: fleet
|
provider-components: fleet
|
||||||
|
@@ -3734,7 +3734,7 @@ data:
|
|||||||
envFrom:
|
envFrom:
|
||||||
- configMapRef:
|
- configMapRef:
|
||||||
name: capm3-capm3fasttrack-configmap
|
name: capm3-capm3fasttrack-configmap
|
||||||
image: registry.rancher.com/rancher/cluster-api-provider-metal3:v1.9.3
|
image: registry.rancher.com/rancher/cluster-api-provider-metal3:v1.9.4
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
@@ -3820,7 +3820,7 @@ data:
|
|||||||
valueFrom:
|
valueFrom:
|
||||||
fieldRef:
|
fieldRef:
|
||||||
fieldPath: metadata.namespace
|
fieldPath: metadata.namespace
|
||||||
image: quay.io/metal3-io/ip-address-manager:v1.9.4
|
image: quay.io/metal3-io/ip-address-manager:v1.9.5
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
@@ -4524,7 +4524,7 @@ data:
|
|||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
creationTimestamp: null
|
creationTimestamp: null
|
||||||
name: v1.9.3
|
name: v1.9.4
|
||||||
namespace: capm3-system
|
namespace: capm3-system
|
||||||
labels:
|
labels:
|
||||||
provider-components: metal3
|
provider-components: metal3
|
||||||
|
@@ -985,6 +985,9 @@ data:
|
|||||||
- path
|
- path
|
||||||
type: object
|
type: object
|
||||||
type: array
|
type: array
|
||||||
|
gzipUserData:
|
||||||
|
description: GzipUserData specifies if the user data should be gzipped.
|
||||||
|
type: boolean
|
||||||
postRKE2Commands:
|
postRKE2Commands:
|
||||||
description: PostRKE2Commands specifies extra commands to run after
|
description: PostRKE2Commands specifies extra commands to run after
|
||||||
rke2 setup runs.
|
rke2 setup runs.
|
||||||
@@ -2164,6 +2167,10 @@ data:
|
|||||||
- path
|
- path
|
||||||
type: object
|
type: object
|
||||||
type: array
|
type: array
|
||||||
|
gzipUserData:
|
||||||
|
description: GzipUserData specifies if the user data should
|
||||||
|
be gzipped.
|
||||||
|
type: boolean
|
||||||
postRKE2Commands:
|
postRKE2Commands:
|
||||||
description: PostRKE2Commands specifies extra commands to
|
description: PostRKE2Commands specifies extra commands to
|
||||||
run after rke2 setup runs.
|
run after rke2 setup runs.
|
||||||
@@ -2525,11 +2532,12 @@ data:
|
|||||||
- --leader-elect
|
- --leader-elect
|
||||||
- --diagnostics-address=${CAPRKE2_DIAGNOSTICS_ADDRESS:=:8443}
|
- --diagnostics-address=${CAPRKE2_DIAGNOSTICS_ADDRESS:=:8443}
|
||||||
- --insecure-diagnostics=${CAPRKE2_INSECURE_DIAGNOSTICS:=false}
|
- --insecure-diagnostics=${CAPRKE2_INSECURE_DIAGNOSTICS:=false}
|
||||||
- --feature-gates=MachinePool=${EXP_MACHINE_POOL:=true}
|
|
||||||
- --v=${CAPRKE2_DEBUG_LEVEL:=0}
|
- --v=${CAPRKE2_DEBUG_LEVEL:=0}
|
||||||
|
- --feature-gates=MachinePool=${EXP_MACHINE_POOL:=true},ClusterTopology=${CLUSTER_TOPOLOGY:=true}
|
||||||
|
- --concurrency=${CONCURRENCY_NUMBER:=10}
|
||||||
command:
|
command:
|
||||||
- /manager
|
- /manager
|
||||||
image: ghcr.io/rancher/cluster-api-provider-rke2-bootstrap:v0.16.1
|
image: ghcr.io/rancher/cluster-api-provider-rke2-bootstrap:v0.18.0
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
@@ -2764,10 +2772,16 @@ data:
|
|||||||
- major: 0
|
- major: 0
|
||||||
minor: 16
|
minor: 16
|
||||||
contract: v1beta1
|
contract: v1beta1
|
||||||
|
- major: 0
|
||||||
|
minor: 17
|
||||||
|
contract: v1beta1
|
||||||
|
- major: 0
|
||||||
|
minor: 18
|
||||||
|
contract: v1beta1
|
||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
creationTimestamp: null
|
creationTimestamp: null
|
||||||
name: v0.16.1
|
name: v0.18.0
|
||||||
namespace: rke2-bootstrap-system
|
namespace: rke2-bootstrap-system
|
||||||
labels:
|
labels:
|
||||||
provider-components: rke2-bootstrap
|
provider-components: rke2-bootstrap
|
||||||
|
@@ -1624,6 +1624,9 @@ data:
|
|||||||
- path
|
- path
|
||||||
type: object
|
type: object
|
||||||
type: array
|
type: array
|
||||||
|
gzipUserData:
|
||||||
|
description: GzipUserData specifies if the user data should be gzipped.
|
||||||
|
type: boolean
|
||||||
infrastructureRef:
|
infrastructureRef:
|
||||||
description: |-
|
description: |-
|
||||||
InfrastructureRef is a required reference to a custom resource
|
InfrastructureRef is a required reference to a custom resource
|
||||||
@@ -2434,6 +2437,51 @@ data:
|
|||||||
if value is false, ETCD metrics will NOT be exposed
|
if value is false, ETCD metrics will NOT be exposed
|
||||||
type: boolean
|
type: boolean
|
||||||
type: object
|
type: object
|
||||||
|
externalDatastoreSecret:
|
||||||
|
description: |-
|
||||||
|
ExternalDatastoreSecret is a reference to a Secret that contains configuration about connecting to an external datastore.
|
||||||
|
The secret must contain a key named "endpoint" that contains the connection string for the external datastore.
|
||||||
|
properties:
|
||||||
|
apiVersion:
|
||||||
|
description: API version of the referent.
|
||||||
|
type: string
|
||||||
|
fieldPath:
|
||||||
|
description: |-
|
||||||
|
If referring to a piece of an object instead of an entire object, this string
|
||||||
|
should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2].
|
||||||
|
For example, if the object reference is to a container within a pod, this would take on a value like:
|
||||||
|
"spec.containers{name}" (where "name" refers to the name of the container that triggered
|
||||||
|
the event) or if no container name is specified "spec.containers[2]" (container with
|
||||||
|
index 2 in this pod). This syntax is chosen only to have some well-defined way of
|
||||||
|
referencing a part of an object.
|
||||||
|
type: string
|
||||||
|
kind:
|
||||||
|
description: |-
|
||||||
|
Kind of the referent.
|
||||||
|
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
||||||
|
type: string
|
||||||
|
name:
|
||||||
|
description: |-
|
||||||
|
Name of the referent.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||||
|
type: string
|
||||||
|
namespace:
|
||||||
|
description: |-
|
||||||
|
Namespace of the referent.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/
|
||||||
|
type: string
|
||||||
|
resourceVersion:
|
||||||
|
description: |-
|
||||||
|
Specific resourceVersion to which this reference is made, if any.
|
||||||
|
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency
|
||||||
|
type: string
|
||||||
|
uid:
|
||||||
|
description: |-
|
||||||
|
UID of the referent.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
|
x-kubernetes-map-type: atomic
|
||||||
kubeAPIServer:
|
kubeAPIServer:
|
||||||
description: KubeAPIServer defines optional custom configuration
|
description: KubeAPIServer defines optional custom configuration
|
||||||
of the Kube API Server.
|
of the Kube API Server.
|
||||||
@@ -3125,6 +3173,10 @@ data:
|
|||||||
- path
|
- path
|
||||||
type: object
|
type: object
|
||||||
type: array
|
type: array
|
||||||
|
gzipUserData:
|
||||||
|
description: GzipUserData specifies if the user data should
|
||||||
|
be gzipped.
|
||||||
|
type: boolean
|
||||||
infrastructureRef:
|
infrastructureRef:
|
||||||
description: |-
|
description: |-
|
||||||
InfrastructureRef is a required reference to a custom resource
|
InfrastructureRef is a required reference to a custom resource
|
||||||
@@ -3950,6 +4002,51 @@ data:
|
|||||||
if value is false, ETCD metrics will NOT be exposed
|
if value is false, ETCD metrics will NOT be exposed
|
||||||
type: boolean
|
type: boolean
|
||||||
type: object
|
type: object
|
||||||
|
externalDatastoreSecret:
|
||||||
|
description: |-
|
||||||
|
ExternalDatastoreSecret is a reference to a Secret that contains configuration about connecting to an external datastore.
|
||||||
|
The secret must contain a key named "endpoint" that contains the connection string for the external datastore.
|
||||||
|
properties:
|
||||||
|
apiVersion:
|
||||||
|
description: API version of the referent.
|
||||||
|
type: string
|
||||||
|
fieldPath:
|
||||||
|
description: |-
|
||||||
|
If referring to a piece of an object instead of an entire object, this string
|
||||||
|
should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2].
|
||||||
|
For example, if the object reference is to a container within a pod, this would take on a value like:
|
||||||
|
"spec.containers{name}" (where "name" refers to the name of the container that triggered
|
||||||
|
the event) or if no container name is specified "spec.containers[2]" (container with
|
||||||
|
index 2 in this pod). This syntax is chosen only to have some well-defined way of
|
||||||
|
referencing a part of an object.
|
||||||
|
type: string
|
||||||
|
kind:
|
||||||
|
description: |-
|
||||||
|
Kind of the referent.
|
||||||
|
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
||||||
|
type: string
|
||||||
|
name:
|
||||||
|
description: |-
|
||||||
|
Name of the referent.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||||
|
type: string
|
||||||
|
namespace:
|
||||||
|
description: |-
|
||||||
|
Namespace of the referent.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/
|
||||||
|
type: string
|
||||||
|
resourceVersion:
|
||||||
|
description: |-
|
||||||
|
Specific resourceVersion to which this reference is made, if any.
|
||||||
|
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency
|
||||||
|
type: string
|
||||||
|
uid:
|
||||||
|
description: |-
|
||||||
|
UID of the referent.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
|
x-kubernetes-map-type: atomic
|
||||||
kubeAPIServer:
|
kubeAPIServer:
|
||||||
description: KubeAPIServer defines optional custom configuration
|
description: KubeAPIServer defines optional custom configuration
|
||||||
of the Kube API Server.
|
of the Kube API Server.
|
||||||
@@ -4446,6 +4543,7 @@ data:
|
|||||||
- --diagnostics-address=${CAPRKE2_DIAGNOSTICS_ADDRESS:=:8443}
|
- --diagnostics-address=${CAPRKE2_DIAGNOSTICS_ADDRESS:=:8443}
|
||||||
- --insecure-diagnostics=${CAPRKE2_INSECURE_DIAGNOSTICS:=false}
|
- --insecure-diagnostics=${CAPRKE2_INSECURE_DIAGNOSTICS:=false}
|
||||||
- --v=${CAPRKE2_DEBUG_LEVEL:=0}
|
- --v=${CAPRKE2_DEBUG_LEVEL:=0}
|
||||||
|
- --concurrency=${CONCURRENCY_NUMBER:=10}
|
||||||
command:
|
command:
|
||||||
- /manager
|
- /manager
|
||||||
env:
|
env:
|
||||||
@@ -4461,7 +4559,7 @@ data:
|
|||||||
valueFrom:
|
valueFrom:
|
||||||
fieldRef:
|
fieldRef:
|
||||||
fieldPath: metadata.uid
|
fieldPath: metadata.uid
|
||||||
image: ghcr.io/rancher/cluster-api-provider-rke2-controlplane:v0.16.1
|
image: ghcr.io/rancher/cluster-api-provider-rke2-controlplane:v0.18.0
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
@@ -4703,10 +4801,16 @@ data:
|
|||||||
- major: 0
|
- major: 0
|
||||||
minor: 16
|
minor: 16
|
||||||
contract: v1beta1
|
contract: v1beta1
|
||||||
|
- major: 0
|
||||||
|
minor: 17
|
||||||
|
contract: v1beta1
|
||||||
|
- major: 0
|
||||||
|
minor: 18
|
||||||
|
contract: v1beta1
|
||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
creationTimestamp: null
|
creationTimestamp: null
|
||||||
name: v0.16.1
|
name: v0.18.0
|
||||||
namespace: rke2-control-plane-system
|
namespace: rke2-control-plane-system
|
||||||
labels:
|
labels:
|
||||||
provider-components: rke2-control-plane
|
provider-components: rke2-control-plane
|
||||||
|
@@ -3,4 +3,4 @@ dependencies:
|
|||||||
repository: https://kubernetes-sigs.github.io/cluster-api-operator
|
repository: https://kubernetes-sigs.github.io/cluster-api-operator
|
||||||
version: 0.18.1
|
version: 0.18.1
|
||||||
digest: sha256:7ad59ce8888c32723b4ef1ae5f334fdff00a8aba87e6f1de76d605f134bff354
|
digest: sha256:7ad59ce8888c32723b4ef1ae5f334fdff00a8aba87e6f1de76d605f134bff354
|
||||||
generated: "2025-05-29T09:13:16.863770955Z"
|
generated: "2025-06-30T13:10:01.066923702Z"
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
#!BuildTag: %%CHART_PREFIX%%rancher-turtles:%%CHART_MAJOR%%.0.4_up0.20.0
|
#!BuildTag: %%CHART_PREFIX%%rancher-turtles:%%CHART_MAJOR%%.0.5_up0.21.0
|
||||||
#!BuildTag: %%CHART_PREFIX%%rancher-turtles:%%CHART_MAJOR%%.0.4_up0.20.0-%RELEASE%
|
#!BuildTag: %%CHART_PREFIX%%rancher-turtles:%%CHART_MAJOR%%.0.5_up0.21.0-%RELEASE%
|
||||||
annotations:
|
annotations:
|
||||||
catalog.cattle.io/certified: rancher
|
catalog.cattle.io/certified: rancher
|
||||||
catalog.cattle.io/display-name: Rancher Turtles - the Cluster API Extension
|
catalog.cattle.io/display-name: Rancher Turtles - the Cluster API Extension
|
||||||
@@ -12,12 +12,12 @@ annotations:
|
|||||||
catalog.cattle.io/scope: management
|
catalog.cattle.io/scope: management
|
||||||
catalog.cattle.io/type: cluster-tool
|
catalog.cattle.io/type: cluster-tool
|
||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
appVersion: 0.20.0
|
appVersion: 0.21.0
|
||||||
dependencies:
|
dependencies:
|
||||||
- condition: cluster-api-operator.enabled
|
- condition: cluster-api-operator.enabled
|
||||||
name: cluster-api-operator
|
name: cluster-api-operator
|
||||||
repository: file://./charts/cluster-api-operator
|
repository: file://./charts/cluster-api-operator
|
||||||
version: 0.17.0
|
version: 0.18.1
|
||||||
description: Rancher Turtles is an extension to Rancher that brings full Cluster API
|
description: Rancher Turtles is an extension to Rancher that brings full Cluster API
|
||||||
integration to Rancher.
|
integration to Rancher.
|
||||||
home: https://github.com/rancher/turtles/
|
home: https://github.com/rancher/turtles/
|
||||||
@@ -29,4 +29,4 @@ keywords:
|
|||||||
- provisioning
|
- provisioning
|
||||||
name: rancher-turtles
|
name: rancher-turtles
|
||||||
type: application
|
type: application
|
||||||
version: "%%CHART_MAJOR%%.0.4+up0.20.0"
|
version: "%%CHART_MAJOR%%.0.5+up0.21.0"
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
## Changes since v0.20.0-rc.0
|
## Changes since examples/v0.21.0
|
||||||
---
|
---
|
||||||
## :chart_with_upwards_trend: Overview
|
## :chart_with_upwards_trend: Overview
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user