forked from suse-edge/Factory
		
	Compare commits
	
		
			302 Commits
		
	
	
		
			3.2
			...
			kube-rbac-
		
	
	| Author | SHA256 | Date | |
|---|---|---|---|
| 86065a61ae | |||
| a8a7b3a542 | |||
| 6059a859a1 | |||
| 8da51ba73f | |||
| 5bf3812659 | |||
| a11bb47c19 | |||
| d18aef225e | |||
| 8d1f677931 | |||
| d0bbc1d844 | |||
| 47df258e97 | |||
| 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 | |||
| e5da642203 | |||
| 13b18090d0 | |||
| 22947d9847 | |||
| 3d087070a7 | |||
| 9bc3066279 | |||
| ec4c51d003 | |||
| 70ff1fdd31 | |||
| ce6519f470 | |||
| 0ccade5817 | |||
| 87f163939c | |||
| f0d7ede6e0 | |||
| aa677745a8 | |||
| 08797b0030 | |||
| 8b37096c3a | |||
| 6ca1cc0ded | |||
| fc24747ee5 | |||
| 9c2d445b06 | |||
| e5de658ae9 | |||
| 8cc06f4ccb | |||
| 9dc5ba4c52 | |||
| f92f3600e6 | |||
| e379d5df4e | |||
| 346d6137fe | |||
| 1f36228510 | |||
| ec7da715f4 | |||
| 1ad6c99257 | |||
| 12e91c2102 | |||
| 6fb80441cd | |||
| 93a5f6813d | |||
| bdaa422813 | |||
| c25bf622bc | |||
| fa57d15ff9 | |||
| 1a29da28ca | |||
| f2d39a7025 | |||
| 629e96dded | |||
| c190a1c800 | |||
| be87fb0fc6 | |||
| 01dfdc5fd9 | |||
| 90ce8e165c | |||
| ad68a91755 | |||
| c37782e077 | |||
| 71257047ed | |||
| 477a4e15eb | |||
| be0d25d8f7 | |||
| 70a42948aa | |||
| fb0f99ee20 | |||
| cc8d3fe431 | |||
| 4ee8e8c6f2 | |||
| 79268b8e71 | |||
| d5e487518a | |||
| a7d128b8c4 | |||
| d97b554f8c | |||
| 1ca6ea51ea | |||
| c9b9e2223b | |||
| 027df1b35c | |||
| e7448eeb1c | |||
| fb4d399f0f | |||
| f47b6df822 | |||
| 4e3f1b61fd | |||
| df60bb2ed3 | |||
| 3a654b9826 | |||
| 15e4de98a7 | |||
| fe8d0ba120 | |||
| 0b431c75e2 | |||
| a59e253ecd | |||
| b28f7a5817 | |||
| c6b78eb569 | |||
| 8f7747415c | |||
| e5ba38d02f | |||
| f221cf4b37 | |||
| f42ac11716 | |||
| 08ef2fe86f | |||
| ad221cd94e | |||
| 81a856e586 | |||
| 3c9ebbd7ef | |||
| 03018e5cd1 | |||
| e91096e13e | |||
| 93f3abfeb5 | |||
| 2c4991cb24 | |||
| e71339ae00 | |||
| f32718b5e4 | |||
| c81f5057ce | |||
| 6b8109c772 | |||
| 8b383c15fa | |||
| 2013caec19 | |||
| 4259b167fd | |||
| 652fc553b9 | |||
| 1048591769 | |||
| 8a9717c266 | |||
| 49405f41f9 | |||
| be29dbba41 | |||
| a2c817259f | |||
| dfe4892f4c | |||
| ef68dbfd92 | |||
| 6c1db68da8 | |||
| 376ec896fe | |||
| a473d935f9 | |||
| 27aa096244 | |||
| 3f968b0a06 | |||
| 481d7e90b4 | |||
|  | cb70d25886 | ||
|  | 04937b90b7 | ||
|  | ef256bc1d7 | ||
|  | 437b0fdc41 | ||
|  | 0dbc0f8b52 | ||
|  | 3adc816d98 | ||
| 5883bf7549 | |||
| ba5ed09bd8 | |||
| b91c34b6c3 | |||
| b2e4b5e259 | |||
| e3f36b74d9 | |||
| 2b020e9bd7 | |||
| 98fa8835f7 | |||
| 5f52392aa3 | |||
| 083c753a0d | |||
| 48472176f2 | |||
| 53f09dd00f | |||
| c610436551 | |||
| 3d1a70e87a | |||
| e439f489ca | |||
| 8e56e1edd3 | |||
| 2a3c37b31d | |||
| eacabe4d71 | |||
| d57078f9d9 | |||
| fef712e4e8 | |||
| 2b194211ee | |||
| a3fda4c5c0 | |||
| 3c08af8a28 | |||
| a1583230bd | |||
| c8c20ce47a | |||
| b30ece6b61 | |||
| 54c0850acf | |||
| ab92525cbe | |||
| 75ae14da78 | |||
| 20de7cd994 | |||
| ca510a470a | |||
| c68c882d35 | |||
| e83a9cea3c | |||
| ea8a9c590a | |||
| fb896ffe62 | |||
| dc19c71706 | |||
| 5db4c3bc79 | |||
| 389f19f7b9 | |||
| 78a681a3a3 | |||
| da3b39573b | |||
| 6531575f1b | |||
| d59f3540a2 | |||
| 43c764e69c | |||
| 0b306a3e7a | |||
| c744e56218 | |||
| ddabc54ac8 | |||
| 0cb039a9df | |||
| eff9a9b0c5 | |||
| 8d336f380b | |||
| 5947d531ab | |||
| 15362e9536 | |||
| 8f20b3433e | |||
| 704eec6875 | |||
| 98c4be017d | |||
| dccf206a98 | |||
| 9e41ee25d9 | |||
| d97e434fce | |||
| 3dea69443d | |||
| 331f08255c | |||
| 4a99805fde | |||
| 6b8a623372 | |||
| 34687fb5e9 | |||
| 5a73d61002 | |||
| 4c6d7dea17 | |||
| 531bb91d27 | |||
| 0d3c83fca1 | |||
| 4d824b71cc | |||
| 7f93226cd3 | |||
| d6d501ad99 | |||
| f61bb1e0e6 | |||
| a510134ed4 | |||
| 54e0941879 | |||
| c04b2af72b | |||
| c57aa3344d | |||
| c86d724e92 | |||
| 9d97e8a56d | |||
| b912f9d68a | |||
| 45443d5b5f | |||
| ac32110ac1 | |||
| 5d20bc38e3 | |||
| e085a97d98 | |||
| 58c8be887a | |||
| 0d59ad920e | |||
| 74133c22f6 | |||
| e85da96001 | |||
| dab7f36e0b | |||
| 5490ffcde2 | |||
| 04b9c07dd5 | |||
| 25de5df782 | |||
| 3f9b8c9e22 | |||
| 2a993e342e | |||
| cab6fe1bcb | |||
| fde506f9ef | |||
| f49e6be155 | |||
| e820e98a2f | |||
| 8c31073506 | |||
| 4bba5fd3f2 | |||
| 383705e9a3 | |||
| a752a25191 | |||
| 83fec09683 | |||
| 32519595dc | |||
| 87c7e1be88 | |||
| 568d5d1590 | |||
| fbd596290a | |||
| ec6c4745ea | |||
| 856ec2ac8e | |||
| 7721c66ab0 | |||
| cf6abb24fb | |||
| 602249c98d | |||
| 8a93aae7c5 | |||
| aba448b275 | |||
| 09954e5818 | |||
| 636493adba | 
							
								
								
									
										31
									
								
								.gitea/workflows/trigger_devel.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								.gitea/workflows/trigger_devel.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | name: Trigger Devel Packages | ||||||
|  | on: | ||||||
|  |   # NOTE (fdegir): Cron is set to run midday every weekday | ||||||
|  |   schedule: | ||||||
|  |     - cron: "0 12 * * 1-5 | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   sync-pr-project: | ||||||
|  |     name: "Trigger source services for devel packages that changed" | ||||||
|  |     runs-on: tumbleweed | ||||||
|  |     steps: | ||||||
|  |       - name: Setup OSC | ||||||
|  |         run: | | ||||||
|  |           mkdir -p ~/.config/osc | ||||||
|  |           cat >~/.config/osc/oscrc <<'EOF' | ||||||
|  |           [general] | ||||||
|  |           apiurl = https://api.opensuse.org | ||||||
|  |  | ||||||
|  |           [https://api.opensuse.org] | ||||||
|  |           user=${{ vars.OBS_USERNAME }} | ||||||
|  |           pass=${{ secrets.OBS_PASSWORD }} | ||||||
|  |           EOF | ||||||
|  |     # Waiting on PR to get merged for support in upstream action/checkout action | ||||||
|  |       - uses: 'https://github.com/yangskyboxlabs/action-checkout@sha256' | ||||||
|  |         name: Checkout repository | ||||||
|  |         with: | ||||||
|  |           object-format: 'sha256' | ||||||
|  |           ref: 'devel' | ||||||
|  |       - name: "Trigger packages" | ||||||
|  |         run: | | ||||||
|  |           python3 .obs/trigger_package.py | ||||||
							
								
								
									
										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.2" | PROJECT = "isv:SUSE:Edge:Factory" | ||||||
| REPOSITORY = "https://src.opensuse.org/suse-edge/Factory" | REPOSITORY = "https://src.opensuse.org/suse-edge/Factory" | ||||||
| BRANCH = "3.2" | BRANCH = "main" | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ import sys | |||||||
| yaml = ruamel.yaml.YAML() | 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.yaml") as f: |     with open(f"./{chart_name}-chart/Chart.yaml") as f: | ||||||
|         chart = yaml.load(f) |         chart = yaml.load(f) | ||||||
|         return chart["version"] |         return chart["version"] | ||||||
|  |  | ||||||
| @@ -17,7 +17,7 @@ def get_charts(chart): | |||||||
|         # Not a locally managed chart |         # Not a locally managed chart | ||||||
|         return {} |         return {} | ||||||
|  |  | ||||||
|     chart_name = chart["chart"][len("%%CHART_REPO%%/%%IMG_PREFIX%%"):] |     chart_name = chart["chart"][len("%%CHART_REPO%%/%%CHART_PREFIX%%"):] | ||||||
|     charts = { chart_name: chart["version"] } |     charts = { chart_name: chart["version"] } | ||||||
|     for child_chart in chart.get("dependencyCharts", []) + chart.get("addonCharts", []): |     for child_chart in chart.get("dependencyCharts", []) + chart.get("addonCharts", []): | ||||||
|         charts.update(get_charts(child_chart)) |         charts.update(get_charts(child_chart)) | ||||||
| @@ -39,7 +39,7 @@ def check_charts(fix: bool) -> bool: | |||||||
|         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%%/%%IMG_PREFIX%%{chart}'] = expected_version |             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 fix and not success: |     if fix and not success: | ||||||
|         fix_charts(to_fix) |         fix_charts(to_fix) | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ def render(base_project, subproject, internal, scm_url=None): | |||||||
|     context = { |     context = { | ||||||
|         "base_project": subproject == "", |         "base_project": subproject == "", | ||||||
|         "title": f"SUSE Edge {version} {subproject}".rstrip(), |         "title": f"SUSE Edge {version} {subproject}".rstrip(), | ||||||
|  |         "ironic_base": "ISV:SUSE:Edge:Ironic" if internal else "Cloud:OpenStack", | ||||||
|     } |     } | ||||||
|     if subproject == "ToTest": |     if subproject == "ToTest": | ||||||
|         context["project"] = f"{base_project}:ToTest" |         context["project"] = f"{base_project}:ToTest" | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ repos: | |||||||
|     hooks: |     hooks: | ||||||
|       - id: check-manifest |       - id: check-manifest | ||||||
|         name: "Check release-manifest" |         name: "Check release-manifest" | ||||||
|         entry: python3 .obs/manifest-check.py |         entry: .obs/manifest-check.py | ||||||
|         language: python |         language: python | ||||||
|         additional_dependencies: ['ruamel.yaml'] |         additional_dependencies: ['ruamel.yaml'] | ||||||
|         pass_filenames: false |         pass_filenames: false | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								_config
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								_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 | ||||||
| @@ -23,6 +24,7 @@ Macros: | |||||||
| Macros: | Macros: | ||||||
| %img_repo registry.suse.com/edge | %img_repo registry.suse.com/edge | ||||||
| %chart_repo oci://registry.suse.com/edge | %chart_repo oci://registry.suse.com/edge | ||||||
|  | %chart_prefix charts/ | ||||||
| %manifest_repo registry.suse.com/edge | %manifest_repo registry.suse.com/edge | ||||||
| %support_level l3 | %support_level l3 | ||||||
| :Macros | :Macros | ||||||
| @@ -40,6 +42,7 @@ Macros: | |||||||
| %img_repo %(echo %{registry_url}:%{_project}:images | tr ":" "/" | tr '[:upper:]' '[:lower:]') | %img_repo %(echo %{registry_url}:%{_project}:images | tr ":" "/" | tr '[:upper:]' '[:lower:]') | ||||||
| %manifest_repo %(echo %{registry_url}:%{_project}:test_manifest_images | tr ":" "/" | tr '[:upper:]' '[:lower:]') | %manifest_repo %(echo %{registry_url}:%{_project}:test_manifest_images | tr ":" "/" | tr '[:upper:]' '[:lower:]') | ||||||
| %chart_repo oci://%(echo %{registry_url}:%{_project}:charts | tr ":" "/" | tr '[:upper:]' '[:lower:]') | %chart_repo oci://%(echo %{registry_url}:%{_project}:charts | tr ":" "/" | tr '[:upper:]' '[:lower:]') | ||||||
|  | %chart_prefix %(echo "") | ||||||
| :Macros | :Macros | ||||||
| %endif | %endif | ||||||
|  |  | ||||||
| @@ -58,6 +61,8 @@ 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:kube-rbac-proxy-image |     BuildFlags: excludebuild:kube-rbac-proxy-image | ||||||
|     BuildFlags: excludebuild:metallb-controller-image |     BuildFlags: excludebuild:metallb-controller-image | ||||||
|     BuildFlags: excludebuild:metallb-speaker-image |     BuildFlags: excludebuild:metallb-speaker-image | ||||||
| @@ -69,8 +74,9 @@ BuildFlags: onlybuild:release-manifest-image | |||||||
|     BuildFlags: onlybuild:baremetal-operator |     BuildFlags: onlybuild:baremetal-operator | ||||||
|     BuildFlags: onlybuild:baremetal-operator-image |     BuildFlags: onlybuild:baremetal-operator-image | ||||||
|     BuildFlags: onlybuild:ca-certificates-suse |     BuildFlags: onlybuild:ca-certificates-suse | ||||||
|     BuildFlags: onlybuild:cosign |     BuildFlags: onlybuild:container-build-checks | ||||||
|     BuildFlags: onlybuild:crudini |     BuildFlags: onlybuild:crudini | ||||||
|  |     BuildFlags: onlybuild:edge-build-checks | ||||||
|     BuildFlags: onlybuild:edge-image-builder |     BuildFlags: onlybuild:edge-image-builder | ||||||
|     BuildFlags: onlybuild:edge-image-builder-image |     BuildFlags: onlybuild:edge-image-builder-image | ||||||
|     BuildFlags: onlybuild:endpoint-copier-operator |     BuildFlags: onlybuild:endpoint-copier-operator | ||||||
| @@ -81,12 +87,15 @@ BuildFlags: onlybuild:release-manifest-image | |||||||
|     BuildFlags: onlybuild:ironic-image |     BuildFlags: onlybuild:ironic-image | ||||||
|     BuildFlags: onlybuild:ironic-ipa-downloader-image |     BuildFlags: onlybuild:ironic-ipa-downloader-image | ||||||
|     BuildFlags: onlybuild:ironic-ipa-ramdisk |     BuildFlags: onlybuild:ironic-ipa-ramdisk | ||||||
|  |     BuildFlags: onlybuild:kubectl | ||||||
|  |     BuildFlags: onlybuild:kubectl-image | ||||||
|     BuildFlags: onlybuild:kube-rbac-proxy |     BuildFlags: onlybuild:kube-rbac-proxy | ||||||
|     BuildFlags: onlybuild:kube-rbac-proxy-image |     BuildFlags: onlybuild:kube-rbac-proxy-image | ||||||
|     BuildFlags: onlybuild:metallb |     BuildFlags: onlybuild:metallb | ||||||
|     BuildFlags: onlybuild:metallb-controller-image |     BuildFlags: onlybuild:metallb-controller-image | ||||||
|     BuildFlags: onlybuild:metallb-speaker-image |     BuildFlags: onlybuild:metallb-speaker-image | ||||||
|     BuildFlags: onlybuild:nm-configurator |     BuildFlags: onlybuild:nm-configurator | ||||||
|  |     BuildFlags: onlybuild:shim-noarch | ||||||
|   %endif |   %endif | ||||||
| %endif | %endif | ||||||
|  |  | ||||||
| @@ -97,13 +106,22 @@ 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 | ||||||
|  |      | ||||||
|  |     # skopeo and umoci are used by build scripts to list packages | ||||||
|  |     Substitute: system-packages:podman podman buildah createrepo_c release-compare skopeo umoci | ||||||
| %endif | %endif | ||||||
|  |  | ||||||
| %if "%_repository" == "images_6.0" | %if "%_repository" == "images" | ||||||
|  |     # skopeo and umoci are used by build scripts to list packages | ||||||
|  |     Substitute: system-packages:podman podman buildah createrepo_c release-compare edge-build-checks skopeo umoci | ||||||
|  |  | ||||||
|  | %endif | ||||||
|  |  | ||||||
|  | %if "%_repository" == "images_16.0" | ||||||
|     Prefer: container:sles15-image |     Prefer: container:sles15-image | ||||||
|     Type: docker |     Type: docker | ||||||
|     BuildEngine: podman |     BuildEngine: podman | ||||||
| @@ -111,6 +129,8 @@ BuildFlags: onlybuild:release-manifest-image | |||||||
|     Patterntype: none |     Patterntype: none | ||||||
|     BuildFlags: dockerarg:SLE_VERSION=16.0 |     BuildFlags: dockerarg:SLE_VERSION=16.0 | ||||||
|     BuildFlags: onlybuild:kiwi-builder-image |     BuildFlags: onlybuild:kiwi-builder-image | ||||||
|  |      | ||||||
|  |     Substitute: system-packages:podman podman buildah createrepo_c release-compare skopeo umoci | ||||||
|  |  | ||||||
|     # Publish multi-arch container images only once all archs have been built |     # Publish multi-arch container images only once all archs have been built | ||||||
|     PublishFlags: archsync |     PublishFlags: archsync | ||||||
| @@ -122,13 +142,20 @@ 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:kubectl-image | ||||||
|       BuildFlags: excludebuild:kube-rbac-proxy-image |       BuildFlags: excludebuild:kube-rbac-proxy-image | ||||||
|       BuildFlags: excludebuild:metallb-controller-image |       BuildFlags: excludebuild:metallb-controller-image | ||||||
|       BuildFlags: excludebuild:metallb-speaker-image |       BuildFlags: excludebuild:metallb-speaker-image | ||||||
|     %endif |     %endif | ||||||
|  |  | ||||||
| %else | %else | ||||||
|     BuildFlags: excludebuild:kiwi-builder-image |     %if "%{sub %{reverse %_project} 1 7}" != "%{reverse :ToTest}" && "%{sub %{reverse %_project} 1 9}" != "%{reverse :Snapshot}" | ||||||
|  |       BuildFlags: excludebuild:kiwi-builder-image | ||||||
|  |     %else | ||||||
|  |       %ifarch aarch64 | ||||||
|  |         BuildFlags: onlybuild:kiwi-builder-image | ||||||
|  |       %endif | ||||||
|  |     %endif | ||||||
| %endif | %endif | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -138,11 +165,17 @@ BuildFlags: onlybuild:release-manifest-image | |||||||
|     Repotype: helm |     Repotype: helm | ||||||
|     Patterntype: none |     Patterntype: none | ||||||
|     Required: perl-YAML-LibYAML |     Required: perl-YAML-LibYAML | ||||||
|  |  | ||||||
|  |     # include edge-build-checks here | ||||||
|  |     Support: edge-build-checks | ||||||
| %endif | %endif | ||||||
|  |  | ||||||
| %if "%_repository" == "standard" | %if "%_repository" == "standard" | ||||||
|     # for build openstack-ironic-image |     # for build openstack-ironic-image | ||||||
|     BuildFlags: allowrootforbuild |     BuildFlags: allowrootforbuild | ||||||
|  |  | ||||||
|  |     # ironic-ipa-ramdisk are noarch packages that need to be availble to both archs | ||||||
|  |     ExportFilter: ^ironic-ipa-ramdisk-.*\.noarch\.rpm$ aarch64 x86_64 | ||||||
| %endif | %endif | ||||||
|  |  | ||||||
| # Enable reproducible builds | # Enable reproducible builds | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								_meta
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								_meta
									
									
									
									
									
								
							| @@ -23,6 +23,9 @@ | |||||||
|     <disable/> |     <disable/> | ||||||
|     <enable repository="charts"/> |     <enable repository="charts"/> | ||||||
|     <enable repository="test_manifest_images"/> |     <enable repository="test_manifest_images"/> | ||||||
|  |     {%- if for_release %} | ||||||
|  |     <enable repository="releasecharts"/> | ||||||
|  |     {%- endif %} | ||||||
|   </build> |   </build> | ||||||
|   <publish> |   <publish> | ||||||
|     <disable repository="phantomcharts"/> |     <disable repository="phantomcharts"/> | ||||||
| @@ -31,17 +34,18 @@ | |||||||
|     <arch>x86_64</arch> |     <arch>x86_64</arch> | ||||||
|   </repository> |   </repository> | ||||||
| {%- endif %} | {%- endif %} | ||||||
| {%- for repository in ["images", "images_6.0", "test_manifest_images"] %} | {%- for repository in ["images", "images_16.0", "test_manifest_images"] %} | ||||||
|   <repository name="{{ repository }}"> |   <repository name="{{ repository }}"> | ||||||
|     {%- if release_project is defined and repository != "test_manifest_images" %} |     {%- if release_project is defined and repository != "test_manifest_images" %} | ||||||
|     <releasetarget project="{{ release_project }}" repository="images" trigger="manual"/> |     <releasetarget project="{{ release_project }}" repository="images" trigger="manual"/> | ||||||
|     {%- endif %} |     {%- endif %} | ||||||
|     <path project="SUSE:Registry" repository="standard"/> |     <path project="SUSE:Registry" repository="standard"/> | ||||||
|     {%- if repository == "images_6.0" %} |     {%- if repository == "images_16.0" %} | ||||||
|       <path project="SUSE:CA" repository="16.0"/> |       <path project="SUSE:CA" repository="16.0"/> | ||||||
|       <path project="SUSE:ALP:Products:Marble:6.0" repository="standard"/> |       <path project="SUSE:SLFO:Products:SLES:16.0" 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> | ||||||
| @@ -52,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="Cloud:OpenStack: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,5 +1,5 @@ | |||||||
| #!BuildTag: %%IMG_PREFIX%%akri-chart:%%CHART_MAJOR%%.0.0_up0.12.20 | #!BuildTag: %%CHART_PREFIX%%akri:%%CHART_MAJOR%%.0.0_up0.12.20 | ||||||
| #!BuildTag: %%IMG_PREFIX%%akri-chart:%%CHART_MAJOR%%.0.0_up0.12.20-%RELEASE% | #!BuildTag: %%CHART_PREFIX%%akri:%%CHART_MAJOR%%.0.0_up0.12.20-%RELEASE% | ||||||
| annotations: | annotations: | ||||||
|   catalog.cattle.io/display-name: Akri |   catalog.cattle.io/display-name: Akri | ||||||
| apiVersion: v2 | apiVersion: v2 | ||||||
|   | |||||||
| @@ -9,8 +9,8 @@ | |||||||
|   </service> |   </service> | ||||||
|   <service name="replace_using_env" mode="buildtime"> |   <service name="replace_using_env" mode="buildtime"> | ||||||
|     <param name="file">Chart.yaml</param> |     <param name="file">Chart.yaml</param> | ||||||
|     <param name="eval">IMG_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?img_prefix})</param> |     <param name="eval">CHART_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?chart_prefix})</param> | ||||||
|     <param name="var">IMG_PREFIX</param> |     <param name="var">CHART_PREFIX</param> | ||||||
|     <param name="eval">CHART_MAJOR=$(rpm --macros=/root/.rpmmacros -E %{?chart_major})</param> |     <param name="eval">CHART_MAJOR=$(rpm --macros=/root/.rpmmacros -E %{?chart_major})</param> | ||||||
|     <param name="var">CHART_MAJOR</param> |     <param name="var">CHART_MAJOR</param> | ||||||
|   </service> |   </service> | ||||||
|   | |||||||
| @@ -853,7 +853,7 @@ webhookConfiguration: | |||||||
|     pullPolicy: Always |     pullPolicy: Always | ||||||
|   certImage: |   certImage: | ||||||
|     # reference is the webhook-certgen image reference |     # reference is the webhook-certgen image reference | ||||||
|     reference: registry.k8s.io/ingress-nginx/kube-webhook-certgen |     reference: registry.rancher.com/rancher/mirrored-ingress-nginx-kube-webhook-certgen | ||||||
|     # tag is the webhook-certgen image tag |     # tag is the webhook-certgen image tag | ||||||
|     tag: v1.1.1 |     tag: v1.1.1 | ||||||
|     # pullPolicy is the webhook-certgen pull policy |     # pullPolicy is the webhook-certgen pull policy | ||||||
|   | |||||||
| @@ -1,21 +1,21 @@ | |||||||
| #!BuildTag: %%IMG_PREFIX%%akri-dashboard-extension-chart:%%CHART_MAJOR%%.0.0 | #!BuildTag: %%CHART_PREFIX%%akri-dashboard-extension:%%CHART_MAJOR%%.0.2_up1.3.1 | ||||||
| #!BuildTag: %%IMG_PREFIX%%akri-dashboard-extension-chart:%%CHART_MAJOR%%.0.0_up1.2.1 | #!BuildTag: %%CHART_PREFIX%%akri-dashboard-extension:%%CHART_MAJOR%%.0.2_up1.3.1-%RELEASE% | ||||||
| #!BuildTag: %%IMG_PREFIX%%akri-dashboard-extension-chart:%%CHART_MAJOR%%.0.0_up1.2.1-%RELEASE% |  | ||||||
| annotations: | annotations: | ||||||
|   catalog.cattle.io/certified: rancher |   catalog.cattle.io/certified: rancher | ||||||
|   catalog.cattle.io/display-name: Akri |  | ||||||
|   catalog.cattle.io/kube-version: ">= v1.26.0-0" |  | ||||||
|   catalog.cattle.io/namespace: cattle-ui-plugin-system |   catalog.cattle.io/namespace: cattle-ui-plugin-system | ||||||
|   catalog.cattle.io/os: linux |   catalog.cattle.io/os: linux | ||||||
|   catalog.cattle.io/permits-os: linux, windows |   catalog.cattle.io/permits-os: linux, windows | ||||||
|   catalog.cattle.io/rancher-version: ">= 2.10.0-0" |  | ||||||
|   catalog.cattle.io/scope: management |   catalog.cattle.io/scope: management | ||||||
|   catalog.cattle.io/ui-component: plugins |   catalog.cattle.io/ui-component: plugins | ||||||
|   catalog.cattle.io/ui-extensions-version: ">= 3.0.0 < 4.0.0" |   catalog.cattle.io/display-name: Akri | ||||||
|  |   catalog.cattle.io/rancher-version: '>= 2.11.0-0' | ||||||
|  |   catalog.cattle.io/ui-extensions-version: '>= 3.0.2 < 4.0.0' | ||||||
|  |   catalog.cattle.io/kube-version: '>= v1.26.0-0' | ||||||
| apiVersion: v2 | apiVersion: v2 | ||||||
| appVersion: 302.0.0+up1.2.1 | appVersion: 303.0.2+up1.3.1 | ||||||
| description: 'SUSE Edge: Akri extension for Rancher Dashboard' | description: 'SUSE Edge: Akri extension for Rancher Dashboard' | ||||||
| name: akri-dashboard-extension | name: akri-dashboard-extension | ||||||
| type: application | type: application | ||||||
| version: "%%CHART_MAJOR%%.0.0+up1.2.1" | version: "%%CHART_MAJOR%%.0.2+up1.3.1" | ||||||
| icon: https://raw.githubusercontent.com/cncf/artwork/main/projects/akri/icon/color/akri-icon-color.svg | icon: >- | ||||||
|  |   https://raw.githubusercontent.com/cncf/artwork/main/projects/akri/icon/color/akri-icon-color.svg | ||||||
|   | |||||||
| @@ -9,8 +9,8 @@ | |||||||
|   </service> |   </service> | ||||||
|   <service name="replace_using_env" mode="buildtime"> |   <service name="replace_using_env" mode="buildtime"> | ||||||
|     <param name="file">Chart.yaml</param> |     <param name="file">Chart.yaml</param> | ||||||
|     <param name="eval">IMG_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?img_prefix})</param> |     <param name="eval">CHART_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?chart_prefix})</param> | ||||||
|     <param name="var">IMG_PREFIX</param> |     <param name="var">CHART_PREFIX</param> | ||||||
|     <param name="eval">CHART_MAJOR=$(rpm --macros=/root/.rpmmacros -E %{?chart_major})</param> |     <param name="eval">CHART_MAJOR=$(rpm --macros=/root/.rpmmacros -E %{?chart_major})</param> | ||||||
|     <param name="var">CHART_MAJOR</param> |     <param name="var">CHART_MAJOR</param> | ||||||
|   </service> |   </service> | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ spec: | |||||||
|   plugin: |   plugin: | ||||||
|     name: {{ include "extension-server.fullname" . }} |     name: {{ include "extension-server.fullname" . }} | ||||||
|     version: {{ (semver (default .Chart.AppVersion .Values.plugin.versionOverride)).Original }} |     version: {{ (semver (default .Chart.AppVersion .Values.plugin.versionOverride)).Original }} | ||||||
|     endpoint: https://raw.githubusercontent.com/suse-edge/dashboard-extensions/gh-pages/extensions/akri-dashboard-extension/302.0.0+up1.2.1 |     endpoint: https://raw.githubusercontent.com/suse-edge/dashboard-extensions/gh-pages/extensions/akri-dashboard-extension/303.0.2+up1.3.1 | ||||||
|     noCache: {{ .Values.plugin.noCache }} |     noCache: {{ .Values.plugin.noCache }} | ||||||
|     noAuth: {{ .Values.plugin.noAuth }} |     noAuth: {{ .Values.plugin.noAuth }} | ||||||
|     metadata: {{ include "extension-server.pluginMetadata" . | indent 6 }} |     metadata: {{ include "extension-server.pluginMetadata" . | indent 6 }} | ||||||
|   | |||||||
| @@ -7,6 +7,6 @@ plugin: | |||||||
|   noAuth: false |   noAuth: false | ||||||
|   metadata: |   metadata: | ||||||
|     catalog.cattle.io/display-name: Akri |     catalog.cattle.io/display-name: Akri | ||||||
|     catalog.cattle.io/rancher-version: ">= 2.10.0-0" |     catalog.cattle.io/rancher-version: ">= 2.11.0-0" | ||||||
|     catalog.cattle.io/ui-extensions-version: ">= 3.0.0 < 4.0.0" |     catalog.cattle.io/ui-extensions-version: ">= 3.0.2 < 4.0.0" | ||||||
|     catalog.cattle.io/kube-version: ">= v1.26.0-0" |     catalog.cattle.io/kube-version: ">= v1.26.0-0" | ||||||
|   | |||||||
| @@ -1,13 +1,12 @@ | |||||||
| # SPDX-License-Identifier: Apache-2.0 | # SPDX-License-Identifier: Apache-2.0 | ||||||
| #!BuildTag: %%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%% | #!BuildTag: %%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%.1 | ||||||
| #!BuildTag: %%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%-%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 | ||||||
|  |  | ||||||
| FROM registry.suse.com/bci/bci-base:$SLE_VERSION AS base | FROM registry.suse.com/bci/bci-base:$SLE_VERSION AS base | ||||||
| COPY --from=micro / /installroot/ | COPY --from=micro / /installroot/ | ||||||
| RUN zypper --installroot /installroot --non-interactive install --no-recommends baremetal-operator iproute2 bind-utils vim shadow; zypper -n clean; rm -rf /var/log/* | RUN zypper --installroot /installroot --non-interactive install --no-recommends baremetal-operator inotify-tools procps iproute2 bind-utils vim shadow; zypper -n clean; rm -rf /var/log/* | ||||||
|  |  | ||||||
| FROM micro AS final | FROM micro AS final | ||||||
| # Define labels according to https://en.opensuse.org/Building_derived_containers | # Define labels according to https://en.opensuse.org/Building_derived_containers | ||||||
| @@ -19,7 +18,7 @@ LABEL org.opencontainers.image.version="%%baremetal-operator_version%%" | |||||||
| LABEL org.opencontainers.image.url="https://www.suse.com/products/server/" | LABEL org.opencontainers.image.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.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%-%RELEASE%" | LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%baremetal-operator:%%baremetal-operator_version%%.1-%RELEASE%" | ||||||
| LABEL org.openbuildservice.disturl="%DISTURL%" | LABEL 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" | ||||||
| @@ -29,6 +28,8 @@ LABEL com.suse.release-stage="released" | |||||||
| # endlabelprefix | # endlabelprefix | ||||||
|  |  | ||||||
| COPY --from=base /installroot / | COPY --from=base /installroot / | ||||||
|  | COPY bmo-run /usr/bin/bmo-run | ||||||
|  | RUN chmod +x /usr/bin/bmo-run | ||||||
| RUN groupadd -r -g 11000 bmo | RUN groupadd -r -g 11000 bmo | ||||||
| RUN useradd -u 11000 -g 11000 bmo | RUN useradd -u 11000 -g 11000 bmo | ||||||
| ENTRYPOINT [ "/usr/bin/baremetal-operator" ] | ENTRYPOINT [ "/usr/bin/bmo-run" ] | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								baremetal-operator-image/bmo-run
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								baremetal-operator-image/bmo-run
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | export RESTART_CONTAINER_CERTIFICATE_UPDATED=${RESTART_CONTAINER_CERTIFICATE_UPDATED:-"false"} | ||||||
|  | export IRONIC_CACERT_FILE=${IRONIC_CACERT_FILE:-"/opt/metal3/certs/ca/tls.crt"} | ||||||
|  |  | ||||||
|  | if [[ "${RESTART_CONTAINER_CERTIFICATE_UPDATED}" == "true" ]]; then | ||||||
|  |     # shellcheck disable=SC2034 | ||||||
|  |     inotifywait -m -e delete_self "${IRONIC_CACERT_FILE}" | while read -r file event; do | ||||||
|  |         kill $(pgrep baremetal-opera) | ||||||
|  |     done & | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | exec /usr/bin/baremetal-operator $@ | ||||||
| @@ -2,7 +2,7 @@ | |||||||
|  <service name="obs_scm"> |  <service name="obs_scm"> | ||||||
|     <param name="url">https://github.com/metal3-io/baremetal-operator</param> |     <param name="url">https://github.com/metal3-io/baremetal-operator</param> | ||||||
|     <param name="scm">git</param> |     <param name="scm">git</param> | ||||||
|     <param name="revision">v0.8.0</param> |     <param name="revision">v0.9.1</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:           baremetal-operator | Name:           baremetal-operator | ||||||
| Version:        0.8.0 | Version:        0.9.1 | ||||||
| Release:        0.8.0 | Release:        0 | ||||||
| Summary:        Implements a Kubernetes API for managing bare metal hosts | Summary:        Implements a Kubernetes API for managing bare metal hosts | ||||||
| License:        Apache-2.0 | License:        Apache-2.0 | ||||||
| URL:            https://github.com/metal3-io/baremetal-operator | URL:            https://github.com/metal3-io/baremetal-operator | ||||||
| Source:         baremetal-operator-%{version}.tar | Source:         baremetal-operator-%{version}.tar | ||||||
| Source1:        vendor.tar.gz | Source1:        vendor.tar.gz | ||||||
| BuildRequires:  golang(API) = 1.22 | BuildRequires:  golang(API) = 1.23 | ||||||
| ExcludeArch:    s390 | ExcludeArch:    s390 | ||||||
| ExcludeArch:    %{ix86} | ExcludeArch:    %{ix86} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,9 +1,9 @@ | |||||||
| #!BuildTag: %%IMG_PREFIX%%cdi-chart:%%CHART_MAJOR%%.0.0_up0.4.0 | #!BuildTag: %%CHART_PREFIX%%cdi:%%CHART_MAJOR%%.0.0_up0.5.0 | ||||||
| #!BuildTag: %%IMG_PREFIX%%cdi-chart:%%CHART_MAJOR%%.0.0_up0.4.0-%RELEASE% | #!BuildTag: %%CHART_PREFIX%%cdi:%%CHART_MAJOR%%.0.0_up0.5.0-%RELEASE% | ||||||
| apiVersion: v2 | apiVersion: v2 | ||||||
| appVersion: 1.60.1 | appVersion: 1.61.0 | ||||||
| description: A Helm chart for Containerized Data Importer (CDI) | description: A Helm chart for Containerized Data Importer (CDI) | ||||||
| icon: https://raw.githubusercontent.com/cncf/artwork/main/projects/kubevirt/icon/color/kubevirt-icon-color.svg | icon: https://raw.githubusercontent.com/cncf/artwork/main/projects/kubevirt/icon/color/kubevirt-icon-color.svg | ||||||
| name: cdi | name: cdi | ||||||
| type: application | type: application | ||||||
| version: "%%CHART_MAJOR%%.0.0+up0.4.0" | version: "%%CHART_MAJOR%%.0.0+up0.5.0" | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ | |||||||
|   <service mode="buildtime" name="kiwi_metainfo_helper"/> |   <service mode="buildtime" name="kiwi_metainfo_helper"/> | ||||||
|   <service name="replace_using_env" mode="buildtime"> |   <service name="replace_using_env" mode="buildtime"> | ||||||
|     <param name="file">Chart.yaml</param> |     <param name="file">Chart.yaml</param> | ||||||
|     <param name="eval">IMG_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?img_prefix})</param> |     <param name="eval">CHART_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?chart_prefix})</param> | ||||||
|     <param name="var">IMG_PREFIX</param> |     <param name="var">CHART_PREFIX</param> | ||||||
|     <param name="eval">CHART_MAJOR=$(rpm --macros=/root/.rpmmacros -E %{?chart_major})</param> |     <param name="eval">CHART_MAJOR=$(rpm --macros=/root/.rpmmacros -E %{?chart_major})</param> | ||||||
|     <param name="var">CHART_MAJOR</param> |     <param name="var">CHART_MAJOR</param> | ||||||
|   </service> |   </service> | ||||||
|   | |||||||
| @@ -5079,4 +5079,4 @@ spec: | |||||||
|           type: object |           type: object | ||||||
|       served: true |       served: true | ||||||
|       storage: true |       storage: true | ||||||
|       subresources: {} |       subresources: {} | ||||||
| @@ -1,2 +1,2 @@ | |||||||
| Verify that all CDI components are installed correctly: | Verify that all CDI components are installed correctly: | ||||||
|   kubectl get all -n {{ .Release.Namespace }} |   kubectl get all -n {{ .Release.Namespace }} | ||||||
| @@ -59,4 +59,4 @@ Create the name of the service account to use | |||||||
| {{- else }} | {{- else }} | ||||||
| {{- default "default" .Values.serviceAccount.name }} | {{- default "default" .Values.serviceAccount.name }} | ||||||
| {{- end }} | {{- end }} | ||||||
| {{- end }} | {{- end }} | ||||||
| @@ -44,4 +44,4 @@ | |||||||
| {{/* CRD uninstalling hook name */}} | {{/* CRD uninstalling hook name */}} | ||||||
| {{- define "cdi.crdUninstallHook.name" -}} | {{- define "cdi.crdUninstallHook.name" -}} | ||||||
| {{ include "cdi.fullname" . }}-crd-uninstall | {{ include "cdi.fullname" . }}-crd-uninstall | ||||||
| {{- end }} | {{- end }} | ||||||
| @@ -606,17 +606,7 @@ spec: | |||||||
|         prometheus.cdi.kubevirt.io: "true" |         prometheus.cdi.kubevirt.io: "true" | ||||||
|     spec: |     spec: | ||||||
|       affinity: |       affinity: | ||||||
|         podAffinity: | {{- .Values.deployment.affinity | toYaml | nindent 8 }} | ||||||
|           preferredDuringSchedulingIgnoredDuringExecution: |  | ||||||
|             - podAffinityTerm: |  | ||||||
|                 labelSelector: |  | ||||||
|                   matchExpressions: |  | ||||||
|                     - key: cdi.kubevirt.io |  | ||||||
|                       operator: In |  | ||||||
|                       values: |  | ||||||
|                         - cdi-operator |  | ||||||
|                 topologyKey: kubernetes.io/hostname |  | ||||||
|               weight: 1 |  | ||||||
|       containers: |       containers: | ||||||
|         - env: |         - env: | ||||||
|             - name: DEPLOY_CLUSTER_RESOURCES |             - name: DEPLOY_CLUSTER_RESOURCES | ||||||
| @@ -650,9 +640,7 @@ spec: | |||||||
|               name: metrics |               name: metrics | ||||||
|               protocol: TCP |               protocol: TCP | ||||||
|           resources: |           resources: | ||||||
|             requests: | {{- .Values.deployment.resources | toYaml | nindent 12 }} | ||||||
|               cpu: 100m |  | ||||||
|               memory: 150Mi |  | ||||||
|           securityContext: |           securityContext: | ||||||
|             allowPrivilegeEscalation: false |             allowPrivilegeEscalation: false | ||||||
|             capabilities: |             capabilities: | ||||||
| @@ -661,6 +649,8 @@ spec: | |||||||
|             runAsNonRoot: true |             runAsNonRoot: true | ||||||
|             seccompProfile: |             seccompProfile: | ||||||
|               type: RuntimeDefault |               type: RuntimeDefault | ||||||
|  |           terminationMessagePath: /dev/termination-log | ||||||
|  |           terminationMessagePolicy: File | ||||||
|       nodeSelector: |       nodeSelector: | ||||||
|         kubernetes.io/os: linux |         kubernetes.io/os: linux | ||||||
|       securityContext: |       securityContext: | ||||||
| @@ -668,4 +658,4 @@ spec: | |||||||
|       serviceAccountName: cdi-operator |       serviceAccountName: cdi-operator | ||||||
|       tolerations: |       tolerations: | ||||||
|         - key: CriticalAddonsOnly |         - key: CriticalAddonsOnly | ||||||
|           operator: Exists |           operator: Exists | ||||||
| @@ -66,4 +66,4 @@ spec: | |||||||
|             - deployments/cdi-apiserver |             - deployments/cdi-apiserver | ||||||
|             - deployments/cdi-deployment |             - deployments/cdi-deployment | ||||||
|             - deployments/cdi-uploadproxy |             - deployments/cdi-uploadproxy | ||||||
|             - --timeout=60s |             - --timeout=60s | ||||||
| @@ -18,4 +18,4 @@ spec: | |||||||
|   {{- with .Values.cdi.workload }} |   {{- with .Values.cdi.workload }} | ||||||
|   workload: |   workload: | ||||||
|   {{- toYaml . | nindent 4 }} |   {{- toYaml . | nindent 4 }} | ||||||
|   {{- end }} |   {{- end }} | ||||||
| @@ -52,4 +52,4 @@ spec: | |||||||
|             - customresourcedefinitions |             - customresourcedefinitions | ||||||
|             - cdis.cdi.kubevirt.io |             - cdis.cdi.kubevirt.io | ||||||
|           securityContext: |           securityContext: | ||||||
|             {{- toYaml .Values.hookSecurityContext | nindent 12 }} |             {{- toYaml .Values.hookSecurityContext | nindent 12 }} | ||||||
| @@ -77,4 +77,4 @@ spec: | |||||||
|             name: cdi-crd-manifest |             name: cdi-crd-manifest | ||||||
|             items: |             items: | ||||||
|               - key: crd |               - key: crd | ||||||
|                 path: crd.yaml |                 path: crd.yaml | ||||||
| @@ -53,4 +53,4 @@ spec: | |||||||
|             - label |             - label | ||||||
|             - namespace |             - namespace | ||||||
|             - {{ .Release.Namespace }} |             - {{ .Release.Namespace }} | ||||||
|             - cdi.kubevirt.io= |             - cdi.kubevirt.io= | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| deployment: | deployment: | ||||||
|   version: 1.60.1-150600.3.9.1 |   version: 1.61.0-150600.3.12.1 | ||||||
|   operatorImage: registry.suse.com/suse/sles/15.6/cdi-operator |   operatorImage: registry.suse.com/suse/sles/15.6/cdi-operator | ||||||
|   controllerImage: registry.suse.com/suse/sles/15.6/cdi-controller |   controllerImage: registry.suse.com/suse/sles/15.6/cdi-controller | ||||||
|   importerImage: registry.suse.com/suse/sles/15.6/cdi-importer |   importerImage: registry.suse.com/suse/sles/15.6/cdi-importer | ||||||
| @@ -8,6 +8,22 @@ deployment: | |||||||
|   uploadserverImage: registry.suse.com/suse/sles/15.6/cdi-uploadserver |   uploadserverImage: registry.suse.com/suse/sles/15.6/cdi-uploadserver | ||||||
|   uploadproxyImage: registry.suse.com/suse/sles/15.6/cdi-uploadproxy |   uploadproxyImage: registry.suse.com/suse/sles/15.6/cdi-uploadproxy | ||||||
|   pullPolicy: IfNotPresent |   pullPolicy: IfNotPresent | ||||||
|  |   affinity: | ||||||
|  |     podAffinity: | ||||||
|  |       preferredDuringSchedulingIgnoredDuringExecution: | ||||||
|  |         - podAffinityTerm: | ||||||
|  |             labelSelector: | ||||||
|  |               matchExpressions: | ||||||
|  |                 - key: cdi.kubevirt.io | ||||||
|  |                   operator: In | ||||||
|  |                   values: | ||||||
|  |                     - cdi-operator | ||||||
|  |             topologyKey: kubernetes.io/hostname | ||||||
|  |           weight: 1 | ||||||
|  |   resources: | ||||||
|  |     requests: | ||||||
|  |       cpu: 100m | ||||||
|  |       memory: 150Mi | ||||||
|  |  | ||||||
| cdi: | cdi: | ||||||
|   config: |   config: | ||||||
| @@ -25,7 +41,7 @@ cdi: | |||||||
|     nodeSelector: |     nodeSelector: | ||||||
|       kubernetes.io/os: linux |       kubernetes.io/os: linux | ||||||
|  |  | ||||||
| hookImage: rancher/kubectl:v1.30.2 | hookImage: registry.rancher.com/rancher/kubectl:v1.30.10 | ||||||
| hookRestartPolicy: OnFailure | hookRestartPolicy: OnFailure | ||||||
| hookSecurityContext: | hookSecurityContext: | ||||||
|   seccompProfile: |   seccompProfile: | ||||||
| @@ -35,4 +51,4 @@ hookSecurityContext: | |||||||
|   allowPrivilegeEscalation: false |   allowPrivilegeEscalation: false | ||||||
|   capabilities: |   capabilities: | ||||||
|     drop: |     drop: | ||||||
|       - ALL |       - ALL | ||||||
							
								
								
									
										23
									
								
								container-build-checks/.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								container-build-checks/.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | ## Default LFS | ||||||
|  | *.7z filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.bsp filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.bz2 filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.gem filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.gz filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.jar filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.lz filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.lzma filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.obscpio filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.oxt filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.pdf filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.png filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.rpm filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.tbz filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.tbz2 filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.tgz filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.ttf filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.txz filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.whl filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.xz filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.zip filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.zst filter=lfs diff=lfs merge=lfs -text | ||||||
| @@ -0,0 +1,39 @@ | |||||||
|  | From 982cfa8500250c9704448880a779ade06cc8f976 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Nicolas Belouin <nicolas.belouin@suse.com> | ||||||
|  | Date: Thu, 3 Apr 2025 16:53:49 +0200 | ||||||
|  | Subject: [PATCH] Allow slash prefixes in registry | ||||||
|  |  | ||||||
|  | Signed-off-by: Nicolas Belouin <nicolas.belouin@suse.com> | ||||||
|  | --- | ||||||
|  |  container-build-checks.py | 12 ++++++++---- | ||||||
|  |  1 file changed, 8 insertions(+), 4 deletions(-) | ||||||
|  |  | ||||||
|  | diff --git a/container-build-checks.py b/container-build-checks.py | ||||||
|  | index b8c873c..d862f33 100755 | ||||||
|  | --- a/container-build-checks.py | ||||||
|  | +++ b/container-build-checks.py | ||||||
|  | @@ -82,13 +82,17 @@ def verify_reference(image, result, value): | ||||||
|  |          return | ||||||
|  |   | ||||||
|  |      (registry, repo, tag) = reference_match.groups() | ||||||
|  | -    allowed_registries: list[str] = config["General"].getlist("Registry") | ||||||
|  | -    if len(allowed_registries) and registry not in allowed_registries: | ||||||
|  | +    raw_allowed_registries: list[str] = config["General"].getlist("Registry") | ||||||
|  | +    allowed_registries: dict[str, str] = {v[0]: v[2] for v in map(lambda a: a.partition("/"), raw_allowed_registries)} | ||||||
|  | + | ||||||
|  | +    if len(allowed_registries) and (registry not in allowed_registries.keys() or not repo.startswith(allowed_registries[registry])): | ||||||
|  |          result.warn( | ||||||
|  |              f"The org.opensuse.reference label ({value}) does not use an " | ||||||
|  | -            f"allowed registry: {','.join(allowed_registries)}") | ||||||
|  | +            f"allowed registry: {','.join(raw_allowed_registries)}") | ||||||
|  | + | ||||||
|  | +    prefix = allowed_registries[registry] | ||||||
|  |   | ||||||
|  | -    if f"{repo}:{tag}" not in image.containerinfo["tags"]: | ||||||
|  | +    if f"{repo[len(prefix)+1:]}:{tag}" not in image.containerinfo["tags"]: | ||||||
|  |          tags = ", ".join(image.containerinfo["tags"]) | ||||||
|  |          result.warn(f"The org.opensuse.reference label ({value}) does not refer to an existing tag ({tags})") | ||||||
|  |      elif "release" in image.containerinfo and image.containerinfo["release"] not in tag: | ||||||
|  | --  | ||||||
|  | 2.49.0 | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								container-build-checks/SUSE.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								container-build-checks/SUSE.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | [General] | ||||||
|  | Vendor=com.suse | ||||||
|  | Registry=registry.suse.com | ||||||
|  | Registry+=dp.apps.rancher.io | ||||||
							
								
								
									
										15
									
								
								container-build-checks/_service
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								container-build-checks/_service
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | <services> | ||||||
|  |   <service mode="manual" name="obs_scm"> | ||||||
|  |     <param name="url">https://github.com/openSUSE/container-build-checks.git</param> | ||||||
|  |     <param name="scm">git</param> | ||||||
|  |     <param name="changesgenerate">enable</param> | ||||||
|  |   </service> | ||||||
|  |   <service mode="manual" name="set_version" /> | ||||||
|  |   <service mode="buildtime" name="tar"> | ||||||
|  |     <param name="obsinfo">container-build-checks.obsinfo</param> | ||||||
|  |   </service> | ||||||
|  |   <service mode="buildtime" name="recompress"> | ||||||
|  |     <param name="file">*.tar</param> | ||||||
|  |     <param name="compression">xz</param> | ||||||
|  |   </service> | ||||||
|  | </services> | ||||||
							
								
								
									
										4
									
								
								container-build-checks/_servicedata
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								container-build-checks/_servicedata
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | <servicedata> | ||||||
|  | <service name="tar_scm"> | ||||||
|  |                 <param name="url">https://github.com/openSUSE/container-build-checks.git</param> | ||||||
|  |               <param name="changesrevision">412e7f60c08221a549b0f00dfcc4bee7694193ab</param></service></servicedata> | ||||||
							
								
								
									
										
											BIN
										
									
								
								container-build-checks/container-build-checks-1723452932.412e7f6.obscpio
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								container-build-checks/container-build-checks-1723452932.412e7f6.obscpio
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										101
									
								
								container-build-checks/container-build-checks.changes
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								container-build-checks/container-build-checks.changes
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | |||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Mon Aug 12 11:33:57 UTC 2024 - Fabian Vogt <fvogt@suse.com> | ||||||
|  |  | ||||||
|  | - Update to version 1723452932.412e7f6: | ||||||
|  |   * add test for missing substitutions | ||||||
|  |   * Reject labels that are missing a substitution | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Mon Jul 22 13:43:57 UTC 2024 - Dirk Müller <dmueller@suse.com> | ||||||
|  |  | ||||||
|  | - update SUSE.conf: allow dp.rancher.apps.io | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Mon Jul 22 13:08:23 UTC 2024 - Fabian Vogt <fvogt@suse.com> | ||||||
|  |  | ||||||
|  | - Switch _service to mode="manual" | ||||||
|  | - Update to version 1721653643.19092fe: | ||||||
|  |   * Use generic name for the python setup step | ||||||
|  |   * Allow specifying more than one registry | ||||||
|  |   * Use Pathlib for resolving containerinfo | ||||||
|  |   * Switch to test Python 3.11 | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Fri Apr 28 09:23:53 UTC 2023 - Fabian Vogt <fvogt@suse.com> | ||||||
|  |  | ||||||
|  | - Update to version 1682595397.5ce6d2f: | ||||||
|  |   * Handle OCI style images as well | ||||||
|  |   * Makefile: Add missing dependency of broken-derived on proper-base | ||||||
|  |   * GitHub workflow: Update action versions | ||||||
|  |   * GitHub workflow: Test python 3.6 and 3.10 | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Mon Aug  8 11:37:19 UTC 2022 - Fabian Vogt <fvogt@suse.com> | ||||||
|  |  | ||||||
|  | - Make the URL point to GitHub | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Thu Jul  7 13:42:05 UTC 2022 - Fabian Vogt <fvogt@suse.com> | ||||||
|  |  | ||||||
|  | - openSUSE.conf: Allow bci/* as prefix | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Wed Apr 20 14:26:26 UTC 2022 - Fabian Vogt <fvogt@suse.com> | ||||||
|  |  | ||||||
|  | - Update to version 1650464301.a198cf9: | ||||||
|  |   * Detect and treat local builds specially | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Mon Mar  7 09:23:46 UTC 2022 - Silvio Moioli <moio@suse.com> | ||||||
|  |  | ||||||
|  | - Adding Uyuni prefix for https://www.uyuni-project.org/ | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Thu Feb 03 07:44:23 UTC 2022 - fvogt@suse.com | ||||||
|  |  | ||||||
|  | - Update to version 1643874076.3d0e13c: | ||||||
|  |   * Avoid crash on local builds | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Tue Dec 14 13:49:12 UTC 2021 - fvogt@suse.com | ||||||
|  |  | ||||||
|  | - Update to version 1639489705.a4c5a3ab2a75: | ||||||
|  |   * Don't error out when the release field is empty | ||||||
|  |   * Add simple gitpod configuration | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Tue Jun  1 09:06:12 UTC 2021 - Fabian Vogt <fvogt@suse.com> | ||||||
|  |  | ||||||
|  | - Drop obsolete Requires: grep jq | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Fri May 28 13:57:34 UTC 2021 - Fabian Vogt <fvogt@suse.com> | ||||||
|  |  | ||||||
|  | - Update to version 1622209785.4616f4f: | ||||||
|  |   * README.md: Point badge to new location | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Fri May 28 12:47:42 UTC 2021 - Fabian Vogt <fvogt@suse.com> | ||||||
|  |  | ||||||
|  | - Update to version 1622204213.c8ecb9f: | ||||||
|  |   * Add options to allow and block specific tags | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Thu May 27 15:09:59 UTC 2021 - Fabian Vogt <fvogt@suse.com> | ||||||
|  |  | ||||||
|  | - Update to version 1622127842.b548dd8: | ||||||
|  |   * Update README.md | ||||||
|  |   * Add README.md | ||||||
|  |   * Add broken-derived test | ||||||
|  |   * Verify prefix of the image specific label prefix | ||||||
|  |   * Add some comments in the Makefile | ||||||
|  |   * Always check the tag used in org.opensuse.reference | ||||||
|  |   * Add github workflow | ||||||
|  |   * Use bash explicitly | ||||||
|  |   * Make lint | ||||||
|  |   * Less noise in Makefile | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Fri Apr 30 10:04:09 UTC 2021 - Fabian Vogt <fvogt@suse.com> | ||||||
|  |  | ||||||
|  | - Initial commit | ||||||
							
								
								
									
										4
									
								
								container-build-checks/container-build-checks.obsinfo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								container-build-checks/container-build-checks.obsinfo
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | name: container-build-checks | ||||||
|  | version: 1723452932.412e7f6 | ||||||
|  | mtime: 1723452932 | ||||||
|  | commit: 412e7f60c08221a549b0f00dfcc4bee7694193ab | ||||||
							
								
								
									
										95
									
								
								container-build-checks/container-build-checks.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								container-build-checks/container-build-checks.spec
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | |||||||
|  | # | ||||||
|  | # spec file for package container-build-checks | ||||||
|  | # | ||||||
|  | # Copyright (c) 2024 SUSE LLC | ||||||
|  | # | ||||||
|  | # All modifications and additions to the file contributed by third parties | ||||||
|  | # remain the property of their copyright owners, unless otherwise agreed | ||||||
|  | # upon. The license for this file, and modifications and additions to the | ||||||
|  | # file, is the same license as for the pristine package itself (unless the | ||||||
|  | # license for the pristine package is not an Open Source License, in which | ||||||
|  | # case the license is the MIT License). An "Open Source License" is a | ||||||
|  | # license that conforms to the Open Source Definition (Version 1.9) | ||||||
|  | # published by the Open Source Initiative. | ||||||
|  |  | ||||||
|  | # Please submit bugfixes or comments via https://bugs.opensuse.org/ | ||||||
|  | # | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Name:           container-build-checks | ||||||
|  | Version:        1723452932.412e7f6 | ||||||
|  | Release:        0 | ||||||
|  | Summary:        Scripts to validate built container images | ||||||
|  | License:        GPL-2.0-or-later | ||||||
|  | Group:          Development/Tools/Building | ||||||
|  | URL:            https://github.com/openSUSE/container-build-checks | ||||||
|  | Patch0:         0001-Allow-slash-prefixes-in-registry.patch | ||||||
|  | Source0:        %{name}-%{version}.tar.xz | ||||||
|  | Source1:        openSUSE.conf | ||||||
|  | Source2:        SUSE.conf | ||||||
|  | Requires:       %{name}-vendor | ||||||
|  | BuildArch:      noarch | ||||||
|  |  | ||||||
|  | %package vendor-openSUSE | ||||||
|  | Summary:        openSUSE configuration for %{name} | ||||||
|  | Group:          Development/Tools/Building | ||||||
|  | Requires:       %{name} = %{version} | ||||||
|  | Provides:       %{name}-vendor | ||||||
|  | Conflicts:      %{name}-vendor | ||||||
|  |  | ||||||
|  | %description vendor-openSUSE | ||||||
|  | openSUSE configuration for %{name} | ||||||
|  |  | ||||||
|  | %package vendor-SUSE | ||||||
|  | Summary:        SUSE configuration for %{name} | ||||||
|  | Group:          Development/Tools/Building | ||||||
|  | Requires:       %{name} = %{version} | ||||||
|  | Provides:       %{name}-vendor | ||||||
|  | Conflicts:      %{name}-vendor | ||||||
|  |  | ||||||
|  | %description vendor-SUSE | ||||||
|  | SUSE configuration for %{name} | ||||||
|  |  | ||||||
|  | %package strict | ||||||
|  | Summary:        Strict configuration for %{name} | ||||||
|  | Group:          Development/Tools/Building | ||||||
|  |  | ||||||
|  | %description strict | ||||||
|  | Strict configuration for %{name} | ||||||
|  |  | ||||||
|  | %description | ||||||
|  | This tool checks that built container images conform to the openSUSE container | ||||||
|  | image policies (https://en.opensuse.org/Building_derived_containers). | ||||||
|  |  | ||||||
|  | %prep | ||||||
|  | %autosetup -p1 | ||||||
|  |  | ||||||
|  | %build | ||||||
|  | %make_build | ||||||
|  |  | ||||||
|  | %install | ||||||
|  | %make_install | ||||||
|  |  | ||||||
|  | mkdir -p %{buildroot}%{_datadir}/container-build-checks/ | ||||||
|  | install -m0644 %{SOURCE1} %{buildroot}%{_datadir}/container-build-checks/openSUSE.conf | ||||||
|  | install -m0644 %{SOURCE2} %{buildroot}%{_datadir}/container-build-checks/SUSE.conf | ||||||
|  | echo -e "[General]\nFatalWarnings=true" > %{buildroot}%{_datadir}/container-build-checks/strict.conf | ||||||
|  |  | ||||||
|  | %files | ||||||
|  | #%doc README | ||||||
|  | %license LICENSE | ||||||
|  | %dir %{_datadir}/container-build-checks | ||||||
|  | %dir %{_prefix}/lib/build/ | ||||||
|  | %dir %{_prefix}/lib/build/post-build-checks/ | ||||||
|  | %{_prefix}/lib/build/post-build-checks/container-build-checks | ||||||
|  |  | ||||||
|  | %files vendor-openSUSE | ||||||
|  | %{_datadir}/container-build-checks/openSUSE.conf | ||||||
|  |  | ||||||
|  | %files vendor-SUSE | ||||||
|  | %{_datadir}/container-build-checks/SUSE.conf | ||||||
|  |  | ||||||
|  | %files strict | ||||||
|  | %{_datadir}/container-build-checks/strict.conf | ||||||
|  |  | ||||||
|  | %changelog | ||||||
							
								
								
									
										10
									
								
								container-build-checks/openSUSE.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								container-build-checks/openSUSE.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | [General] | ||||||
|  | Vendor=org.opensuse | ||||||
|  | Registry=registry.opensuse.org | ||||||
|  |  | ||||||
|  | [Tags] | ||||||
|  | # To avoid conflicts with other stuff on the registry and | ||||||
|  | # avoid ambiguities with images on other registries. | ||||||
|  | Allowed+=opensuse/*,kubic/*,kubevirt/*,uyuni/*,bci/* | ||||||
|  | # Those are images, not available as namespaces | ||||||
|  | Blocked+=opensuse/tumbleweed/*,opensuse/leap/* | ||||||
| @@ -1,18 +0,0 @@ | |||||||
| <services> |  | ||||||
|   <service name="obs_scm"> |  | ||||||
|     <param name="url">https://github.com/rancher-government-carbide/cosign.git</param> |  | ||||||
|     <param name="versionformat">@PARENT_TAG@</param> |  | ||||||
|     <param name="scm">git</param> |  | ||||||
|     <param name="exclude">.get</param> |  | ||||||
|     <param name="revision">v2.2.3+carbide.2</param> |  | ||||||
|     <param name="versionrewrite-pattern">v(.*)</param> |  | ||||||
|     <param name="changesgenerate">enable</param> |  | ||||||
|   </service> |  | ||||||
|   <service mode="buildtime" name="tar"> |  | ||||||
|     <param name="obsinfo">cosign.obsinfo</param> |  | ||||||
|   </service> |  | ||||||
|   <service mode="buildtime" name="set_version" /> |  | ||||||
|   <service name="go_modules"> |  | ||||||
|      <param name="compression">gz</param> |  | ||||||
|   </service> |  | ||||||
| </services> |  | ||||||
| @@ -1,55 +0,0 @@ | |||||||
| # |  | ||||||
| # spec file for package cosign-rgs |  | ||||||
| # |  | ||||||
| # Copyright (c) 2024 SUSE LLC |  | ||||||
| # |  | ||||||
| # All modifications and additions to the file contributed by third parties |  | ||||||
| # remain the property of their copyright owners, unless otherwise agreed |  | ||||||
| # upon. The license for this file, and modifications and additions to the |  | ||||||
| # file, is the same license as for the pristine package itself (unless the |  | ||||||
| # license for the pristine package is not an Open Source License, in which |  | ||||||
| # case the license is the MIT License). An "Open Source License" is a |  | ||||||
| # license that conforms to the Open Source Definition (Version 1.9) |  | ||||||
| # published by the Open Source Initiative. |  | ||||||
|  |  | ||||||
| # Please submit bugfixes or comments via https://bugs.opensuse.org/ |  | ||||||
| # |  | ||||||
|  |  | ||||||
| %define project https://github.com/hauler-dev/cosign |  | ||||||
| %define revision 49542360ffb5de63f9d2f5856b658651d5538e40  |  | ||||||
|  |  | ||||||
| Name:           cosign |  | ||||||
| Version:        0 |  | ||||||
| Release:        0 |  | ||||||
| Summary:        Container Signing, Verification and Storage in an OCI registry |  | ||||||
| License:        Apache-2.0 |  | ||||||
| URL:            https://github.com/rancher-government-carbide/cosign |  | ||||||
| Source:         cosign-%{version}.tar |  | ||||||
| Source1:        vendor.tar.gz          |  | ||||||
| BuildRequires:  golang-packaging |  | ||||||
|  |  | ||||||
| %description |  | ||||||
|  |  | ||||||
| %prep |  | ||||||
| %setup -q -a1 -n cosign-%{version} |  | ||||||
|  |  | ||||||
| %build |  | ||||||
| %goprep %{project} |  | ||||||
|  |  | ||||||
| DATE_FMT="+%%Y-%%m-%%dT%%H:%%M:%%SZ" |  | ||||||
| BUILD_DATE=$(date -u -d "@${SOURCE_DATE_EPOCH}" "${DATE_FMT}" 2>/dev/null || date -u -r "${SOURCE_DATE_EPOCH}" "${DATE_FMT}" 2>/dev/null || date -u "${DATE_FMT}") |  | ||||||
|  |  | ||||||
| CLI_PKG=sigs.k8s.io/release-utils/version |  | ||||||
| CLI_LDFLAGS="-X ${CLI_PKG}.gitVersion=%{version} -X ${CLI_PKG}.gitCommit=%{revision} -X ${CLI_PKG}.gitTreeState=release -X ${CLI_PKG}.buildDate=${BUILD_DATE}" |  | ||||||
|  |  | ||||||
| CGO_ENABLED=0 go build -mod=vendor -buildmode=pie -trimpath -ldflags "${CLI_LDFLAGS}" -o cosign ./cmd/cosign |  | ||||||
|  |  | ||||||
| %install |  | ||||||
| install -D -m 0755 cosign %{buildroot}%{_bindir}/cosign |  | ||||||
|  |  | ||||||
| %files |  | ||||||
| %license LICENSE |  | ||||||
| %doc *.md |  | ||||||
| %{_bindir}/cosign |  | ||||||
|  |  | ||||||
| %changelog |  | ||||||
							
								
								
									
										12
									
								
								edge-build-checks/10-helm-lint
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								edge-build-checks/10-helm-lint
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | #!/bin/bash | ||||||
|  |  | ||||||
|  | HELM="/usr/bin/helm" | ||||||
|  | TOPDIR=/usr/src/packages/HELM | ||||||
|  | failed=0 | ||||||
|  |  | ||||||
|  | if [ -x $HELM ]; then | ||||||
|  |     $HELM lint "$TOPDIR"/*.tgz | ||||||
|  |     failed=$? | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | exit $failed | ||||||
							
								
								
									
										159
									
								
								edge-build-checks/20-helm-images
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								edge-build-checks/20-helm-images
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,159 @@ | |||||||
|  | #!/usr/bin/python3 | ||||||
|  | import os | ||||||
|  | import glob | ||||||
|  | import subprocess | ||||||
|  | import yaml | ||||||
|  | import sys | ||||||
|  | import pprint | ||||||
|  |  | ||||||
|  | AUTHORIZED_REPOS = [ | ||||||
|  |     "registry.suse.com/suse/sles/", | ||||||
|  |     "registry.suse.com/rancher", | ||||||
|  |     "registry.rancher.com", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | EXTRA_CONFIG = None | ||||||
|  |  | ||||||
|  | class CheckResult: | ||||||
|  |     """Class to track count of issues""" | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self.hints = 0 | ||||||
|  |         self.warnings = 0 | ||||||
|  |         self.errors = 0 | ||||||
|  |  | ||||||
|  |     def hint(self, msg): | ||||||
|  |         print(f"Hint: {msg}") | ||||||
|  |         self.hints += 1 | ||||||
|  |  | ||||||
|  |     def warn(self, msg): | ||||||
|  |         print(f"Warning: {msg}") | ||||||
|  |         self.warnings += 1 | ||||||
|  |  | ||||||
|  |     def error(self, msg): | ||||||
|  |         print(f"Error: {msg}") | ||||||
|  |         self.errors += 1 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def tarballs(): | ||||||
|  |     """Return a list of .helminfo files to check.""" | ||||||
|  |     if "BUILD_ROOT" not in os.environ: | ||||||
|  |         # Not running in an OBS build container | ||||||
|  |         return glob.glob("*.tgz") | ||||||
|  |  | ||||||
|  |     # Running in an OBS build container | ||||||
|  |     buildroot = os.environ["BUILD_ROOT"] | ||||||
|  |     topdir = "/usr/src/packages" | ||||||
|  |     if os.path.isdir(buildroot + "/.build.packages"): | ||||||
|  |         topdir = "/.build.packages" | ||||||
|  |     if os.path.islink(buildroot + "/.build.packages"): | ||||||
|  |         topdir = "/" + os.readlink(buildroot + "/.build.packages") | ||||||
|  |  | ||||||
|  |     return glob.glob(f"{buildroot}{topdir}/HELM/*.tgz") | ||||||
|  |  | ||||||
|  | def get_extra_config(): | ||||||
|  |     global EXTRA_CONFIG | ||||||
|  |     if EXTRA_CONFIG is not None: | ||||||
|  |         return EXTRA_CONFIG | ||||||
|  |      | ||||||
|  |     if "BUILD_ROOT" not in os.environ: | ||||||
|  |         file_path = "./.checks_helm.yaml" | ||||||
|  |     else: | ||||||
|  |         buildroot = os.environ["BUILD_ROOT"] | ||||||
|  |         topdir = "/usr/src/packages" | ||||||
|  |         file_path = f"{buildroot}{topdir}/SOURCES/.checks_helm.yaml" | ||||||
|  |     try: | ||||||
|  |         with open(file_path) as config_file: | ||||||
|  |             EXTRA_CONFIG = yaml.safe_load(config_file) | ||||||
|  |             if EXTRA_CONFIG is None:  # No document in stream | ||||||
|  |                 EXTRA_CONFIG = {} | ||||||
|  |     except OSError: | ||||||
|  |         EXTRA_CONFIG = {} | ||||||
|  |     return EXTRA_CONFIG | ||||||
|  |  | ||||||
|  | def get_extra_params(): | ||||||
|  |     config = get_extra_config() | ||||||
|  |     args = [] | ||||||
|  |     for api in config.get('extra_apis', []): | ||||||
|  |         args.extend(['-a', api]) | ||||||
|  |     return args | ||||||
|  |  | ||||||
|  | def is_exception(image): | ||||||
|  |     config = get_extra_config() | ||||||
|  |     exceptions = config.get('image_exceptions', []) | ||||||
|  |     (namespace, _, _) = image.partition(':') | ||||||
|  |     return namespace in exceptions | ||||||
|  |  | ||||||
|  | def get_template(tarball_path): | ||||||
|  |     raw_templates = subprocess.check_output( | ||||||
|  |         [ | ||||||
|  |             "helm", | ||||||
|  |             "template", | ||||||
|  |             tarball_path, | ||||||
|  |         ] + get_extra_params() | ||||||
|  |     ).decode() | ||||||
|  |     return yaml.safe_load_all(raw_templates) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def extract_key(key, var): | ||||||
|  |     if hasattr(var, "items"):  # hasattr(var,'items') for python 3 | ||||||
|  |         for k, v in var.items():  # var.items() for python 3 | ||||||
|  |             if k == key: | ||||||
|  |                 yield v | ||||||
|  |             if isinstance(v, dict): | ||||||
|  |                 for result in extract_key(key, v): | ||||||
|  |                     yield result | ||||||
|  |             elif isinstance(v, list): | ||||||
|  |                 for d in v: | ||||||
|  |                     for result in extract_key(key, d): | ||||||
|  |                         yield result | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def check_template(result, template): | ||||||
|  |     if template["kind"] not in [ | ||||||
|  |         "Pod", | ||||||
|  |         "Deployment", | ||||||
|  |         "StatefulSet", | ||||||
|  |         "DaemonSet", | ||||||
|  |         "ReplicaSet", | ||||||
|  |         "Job", | ||||||
|  |         "CronJob", | ||||||
|  |     ]: | ||||||
|  |         return | ||||||
|  |     for image in extract_key("image", template): | ||||||
|  |         if not image.startswith(tuple(AUTHORIZED_REPOS)) and not is_exception(image): | ||||||
|  |             result.error(f"{image} is not from authorized source") | ||||||
|  |     pass | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     result = CheckResult() | ||||||
|  |     img_repo = subprocess.check_output( | ||||||
|  |         [ | ||||||
|  |             "rpm", | ||||||
|  |             "--macros=/root/.rpmmacros", | ||||||
|  |             "-E", | ||||||
|  |             "%{?img_repo}", | ||||||
|  |         ] | ||||||
|  |     ).strip() | ||||||
|  |     if img_repo: | ||||||
|  |         result.hint(f"Adding '{img_repo.decode()}' to authorized repo") | ||||||
|  |         AUTHORIZED_REPOS.append(img_repo.decode()) | ||||||
|  |     else: | ||||||
|  |         result.warn("img_repo macro not defined, will not add extra authorized repo") | ||||||
|  |     for tarball in tarballs(): | ||||||
|  |         print(f"Looking at {tarball}") | ||||||
|  |         for template in get_template(tarball): | ||||||
|  |             if template:  # Exclude empty templates | ||||||
|  |                 check_template(result, template) | ||||||
|  |  | ||||||
|  |     ret = 0 | ||||||
|  |     if result.errors > 0: | ||||||
|  |         print("Fatal errors found.") | ||||||
|  |         ret = 1 | ||||||
|  |  | ||||||
|  |     sys.exit(ret) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     main() | ||||||
							
								
								
									
										92
									
								
								edge-build-checks/20-helm-tags
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								edge-build-checks/20-helm-tags
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | |||||||
|  | #!/usr/bin/python3 | ||||||
|  | import json | ||||||
|  | import os | ||||||
|  | import glob | ||||||
|  | import sys | ||||||
|  | import re | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class CheckResult: | ||||||
|  |     """Class to track count of issues""" | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self.hints = 0 | ||||||
|  |         self.warnings = 0 | ||||||
|  |         self.errors = 0 | ||||||
|  |  | ||||||
|  |     def hint(self, msg): | ||||||
|  |         print(f"Hint: {msg}") | ||||||
|  |         self.hints += 1 | ||||||
|  |  | ||||||
|  |     def warn(self, msg): | ||||||
|  |         print(f"Warning: {msg}") | ||||||
|  |         self.warnings += 1 | ||||||
|  |  | ||||||
|  |     def error(self, msg): | ||||||
|  |         print(f"Error: {msg}") | ||||||
|  |         self.errors += 1 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | TAG_RE = re.compile(r"(.*\/)?([^:]+):([^:]+)") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def check_tags(helminfo, result): | ||||||
|  |     release_tag_found = False | ||||||
|  |     version_tag_found = False | ||||||
|  |     for tag in helminfo["tags"]: | ||||||
|  |         (tag_prefix, tag_name, tag_version) = TAG_RE.fullmatch(tag).groups() | ||||||
|  |         if tag_name != helminfo.get("name"): | ||||||
|  |             result.warn( | ||||||
|  |                 f"Tag ({tag}) doesn't use the chart name ({helminfo.get('name')})" | ||||||
|  |             ) | ||||||
|  |         if "release" in helminfo and helminfo["release"] in tag_version: | ||||||
|  |             release_tag_found = True | ||||||
|  |         if tag_version.replace("_", "+") == helminfo["version"]: | ||||||
|  |             version_tag_found = True | ||||||
|  |     if not release_tag_found: | ||||||
|  |         result.error( | ||||||
|  |             "None of the tags are unique to a specific build of the image.\n" | ||||||
|  |             + "Make sure that at least one tag contains the release." | ||||||
|  |         ) | ||||||
|  |     if not version_tag_found: | ||||||
|  |         result.error( | ||||||
|  |             "None of the tags is the equivalent of the chart's version.\n" | ||||||
|  |             + "Make sure that one of the tag is the chart version." | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def helminfos(): | ||||||
|  |     """Return a list of .helminfo files to check.""" | ||||||
|  |     if "BUILD_ROOT" not in os.environ: | ||||||
|  |         # Not running in an OBS build container | ||||||
|  |         return glob.glob("*.helminfo") | ||||||
|  |  | ||||||
|  |     # Running in an OBS build container | ||||||
|  |     buildroot = os.environ["BUILD_ROOT"] | ||||||
|  |     topdir = "/usr/src/packages" | ||||||
|  |     if os.path.isdir(buildroot + "/.build.packages"): | ||||||
|  |         topdir = "/.build.packages" | ||||||
|  |     if os.path.islink(buildroot + "/.build.packages"): | ||||||
|  |         topdir = "/" + os.readlink(buildroot + "/.build.packages") | ||||||
|  |  | ||||||
|  |     return glob.glob(f"{buildroot}{topdir}/HELM/*.helminfo") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     result = CheckResult() | ||||||
|  |     for helminfo in helminfos(): | ||||||
|  |         print(f"Looking at {helminfo}") | ||||||
|  |         with open(helminfo, "rb") as cifile: | ||||||
|  |             ci_dict = json.load(cifile) | ||||||
|  |             check_tags(ci_dict, result) | ||||||
|  |  | ||||||
|  |     ret = 0 | ||||||
|  |     if result.errors > 0: | ||||||
|  |         print("Fatal errors found.") | ||||||
|  |         ret = 1 | ||||||
|  |  | ||||||
|  |     sys.exit(ret) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     main() | ||||||
							
								
								
									
										340
									
								
								edge-build-checks/COPYING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										340
									
								
								edge-build-checks/COPYING
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,340 @@ | |||||||
|  | 		    GNU GENERAL PUBLIC LICENSE | ||||||
|  | 		       Version 2, June 1991 | ||||||
|  |  | ||||||
|  |  Copyright (C) 1989, 1991 Free Software Foundation, Inc. | ||||||
|  |                        59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||||
|  |  Everyone is permitted to copy and distribute verbatim copies | ||||||
|  |  of this license document, but changing it is not allowed. | ||||||
|  |  | ||||||
|  | 			    Preamble | ||||||
|  |  | ||||||
|  |   The licenses for most software are designed to take away your | ||||||
|  | freedom to share and change it.  By contrast, the GNU General Public | ||||||
|  | License is intended to guarantee your freedom to share and change free | ||||||
|  | software--to make sure the software is free for all its users.  This | ||||||
|  | General Public License applies to most of the Free Software | ||||||
|  | Foundation's software and to any other program whose authors commit to | ||||||
|  | using it.  (Some other Free Software Foundation software is covered by | ||||||
|  | the GNU Library General Public License instead.)  You can apply it to | ||||||
|  | your programs, too. | ||||||
|  |  | ||||||
|  |   When we speak of free software, we are referring to freedom, not | ||||||
|  | price.  Our General Public Licenses are designed to make sure that you | ||||||
|  | have the freedom to distribute copies of free software (and charge for | ||||||
|  | this service if you wish), that you receive source code or can get it | ||||||
|  | if you want it, that you can change the software or use pieces of it | ||||||
|  | in new free programs; and that you know you can do these things. | ||||||
|  |  | ||||||
|  |   To protect your rights, we need to make restrictions that forbid | ||||||
|  | anyone to deny you these rights or to ask you to surrender the rights. | ||||||
|  | These restrictions translate to certain responsibilities for you if you | ||||||
|  | distribute copies of the software, or if you modify it. | ||||||
|  |  | ||||||
|  |   For example, if you distribute copies of such a program, whether | ||||||
|  | gratis or for a fee, you must give the recipients all the rights that | ||||||
|  | you have.  You must make sure that they, too, receive or can get the | ||||||
|  | source code.  And you must show them these terms so they know their | ||||||
|  | rights. | ||||||
|  |  | ||||||
|  |   We protect your rights with two steps: (1) copyright the software, and | ||||||
|  | (2) offer you this license which gives you legal permission to copy, | ||||||
|  | distribute and/or modify the software. | ||||||
|  |  | ||||||
|  |   Also, for each author's protection and ours, we want to make certain | ||||||
|  | that everyone understands that there is no warranty for this free | ||||||
|  | software.  If the software is modified by someone else and passed on, we | ||||||
|  | want its recipients to know that what they have is not the original, so | ||||||
|  | that any problems introduced by others will not reflect on the original | ||||||
|  | authors' reputations. | ||||||
|  |  | ||||||
|  |   Finally, any free program is threatened constantly by software | ||||||
|  | patents.  We wish to avoid the danger that redistributors of a free | ||||||
|  | program will individually obtain patent licenses, in effect making the | ||||||
|  | program proprietary.  To prevent this, we have made it clear that any | ||||||
|  | patent must be licensed for everyone's free use or not licensed at all. | ||||||
|  |  | ||||||
|  |   The precise terms and conditions for copying, distribution and | ||||||
|  | modification follow. | ||||||
|  |  | ||||||
|  | 		    GNU GENERAL PUBLIC LICENSE | ||||||
|  |    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||||||
|  |  | ||||||
|  |   0. This License applies to any program or other work which contains | ||||||
|  | a notice placed by the copyright holder saying it may be distributed | ||||||
|  | under the terms of this General Public License.  The "Program", below, | ||||||
|  | refers to any such program or work, and a "work based on the Program" | ||||||
|  | means either the Program or any derivative work under copyright law: | ||||||
|  | that is to say, a work containing the Program or a portion of it, | ||||||
|  | either verbatim or with modifications and/or translated into another | ||||||
|  | language.  (Hereinafter, translation is included without limitation in | ||||||
|  | the term "modification".)  Each licensee is addressed as "you". | ||||||
|  |  | ||||||
|  | Activities other than copying, distribution and modification are not | ||||||
|  | covered by this License; they are outside its scope.  The act of | ||||||
|  | running the Program is not restricted, and the output from the Program | ||||||
|  | is covered only if its contents constitute a work based on the | ||||||
|  | Program (independent of having been made by running the Program). | ||||||
|  | Whether that is true depends on what the Program does. | ||||||
|  |  | ||||||
|  |   1. You may copy and distribute verbatim copies of the Program's | ||||||
|  | source code as you receive it, in any medium, provided that you | ||||||
|  | conspicuously and appropriately publish on each copy an appropriate | ||||||
|  | copyright notice and disclaimer of warranty; keep intact all the | ||||||
|  | notices that refer to this License and to the absence of any warranty; | ||||||
|  | and give any other recipients of the Program a copy of this License | ||||||
|  | along with the Program. | ||||||
|  |  | ||||||
|  | You may charge a fee for the physical act of transferring a copy, and | ||||||
|  | you may at your option offer warranty protection in exchange for a fee. | ||||||
|  |  | ||||||
|  |   2. You may modify your copy or copies of the Program or any portion | ||||||
|  | of it, thus forming a work based on the Program, and copy and | ||||||
|  | distribute such modifications or work under the terms of Section 1 | ||||||
|  | above, provided that you also meet all of these conditions: | ||||||
|  |  | ||||||
|  |     a) You must cause the modified files to carry prominent notices | ||||||
|  |     stating that you changed the files and the date of any change. | ||||||
|  |  | ||||||
|  |     b) You must cause any work that you distribute or publish, that in | ||||||
|  |     whole or in part contains or is derived from the Program or any | ||||||
|  |     part thereof, to be licensed as a whole at no charge to all third | ||||||
|  |     parties under the terms of this License. | ||||||
|  |  | ||||||
|  |     c) If the modified program normally reads commands interactively | ||||||
|  |     when run, you must cause it, when started running for such | ||||||
|  |     interactive use in the most ordinary way, to print or display an | ||||||
|  |     announcement including an appropriate copyright notice and a | ||||||
|  |     notice that there is no warranty (or else, saying that you provide | ||||||
|  |     a warranty) and that users may redistribute the program under | ||||||
|  |     these conditions, and telling the user how to view a copy of this | ||||||
|  |     License.  (Exception: if the Program itself is interactive but | ||||||
|  |     does not normally print such an announcement, your work based on | ||||||
|  |     the Program is not required to print an announcement.) | ||||||
|  |  | ||||||
|  | These requirements apply to the modified work as a whole.  If | ||||||
|  | identifiable sections of that work are not derived from the Program, | ||||||
|  | and can be reasonably considered independent and separate works in | ||||||
|  | themselves, then this License, and its terms, do not apply to those | ||||||
|  | sections when you distribute them as separate works.  But when you | ||||||
|  | distribute the same sections as part of a whole which is a work based | ||||||
|  | on the Program, the distribution of the whole must be on the terms of | ||||||
|  | this License, whose permissions for other licensees extend to the | ||||||
|  | entire whole, and thus to each and every part regardless of who wrote it. | ||||||
|  |  | ||||||
|  | Thus, it is not the intent of this section to claim rights or contest | ||||||
|  | your rights to work written entirely by you; rather, the intent is to | ||||||
|  | exercise the right to control the distribution of derivative or | ||||||
|  | collective works based on the Program. | ||||||
|  |  | ||||||
|  | In addition, mere aggregation of another work not based on the Program | ||||||
|  | with the Program (or with a work based on the Program) on a volume of | ||||||
|  | a storage or distribution medium does not bring the other work under | ||||||
|  | the scope of this License. | ||||||
|  |  | ||||||
|  |   3. You may copy and distribute the Program (or a work based on it, | ||||||
|  | under Section 2) in object code or executable form under the terms of | ||||||
|  | Sections 1 and 2 above provided that you also do one of the following: | ||||||
|  |  | ||||||
|  |     a) Accompany it with the complete corresponding machine-readable | ||||||
|  |     source code, which must be distributed under the terms of Sections | ||||||
|  |     1 and 2 above on a medium customarily used for software interchange; or, | ||||||
|  |  | ||||||
|  |     b) Accompany it with a written offer, valid for at least three | ||||||
|  |     years, to give any third party, for a charge no more than your | ||||||
|  |     cost of physically performing source distribution, a complete | ||||||
|  |     machine-readable copy of the corresponding source code, to be | ||||||
|  |     distributed under the terms of Sections 1 and 2 above on a medium | ||||||
|  |     customarily used for software interchange; or, | ||||||
|  |  | ||||||
|  |     c) Accompany it with the information you received as to the offer | ||||||
|  |     to distribute corresponding source code.  (This alternative is | ||||||
|  |     allowed only for noncommercial distribution and only if you | ||||||
|  |     received the program in object code or executable form with such | ||||||
|  |     an offer, in accord with Subsection b above.) | ||||||
|  |  | ||||||
|  | The source code for a work means the preferred form of the work for | ||||||
|  | making modifications to it.  For an executable work, complete source | ||||||
|  | code means all the source code for all modules it contains, plus any | ||||||
|  | associated interface definition files, plus the scripts used to | ||||||
|  | control compilation and installation of the executable.  However, as a | ||||||
|  | special exception, the source code distributed need not include | ||||||
|  | anything that is normally distributed (in either source or binary | ||||||
|  | form) with the major components (compiler, kernel, and so on) of the | ||||||
|  | operating system on which the executable runs, unless that component | ||||||
|  | itself accompanies the executable. | ||||||
|  |  | ||||||
|  | If distribution of executable or object code is made by offering | ||||||
|  | access to copy from a designated place, then offering equivalent | ||||||
|  | access to copy the source code from the same place counts as | ||||||
|  | distribution of the source code, even though third parties are not | ||||||
|  | compelled to copy the source along with the object code. | ||||||
|  |  | ||||||
|  |   4. You may not copy, modify, sublicense, or distribute the Program | ||||||
|  | except as expressly provided under this License.  Any attempt | ||||||
|  | otherwise to copy, modify, sublicense or distribute the Program is | ||||||
|  | void, and will automatically terminate your rights under this License. | ||||||
|  | However, parties who have received copies, or rights, from you under | ||||||
|  | this License will not have their licenses terminated so long as such | ||||||
|  | parties remain in full compliance. | ||||||
|  |  | ||||||
|  |   5. You are not required to accept this License, since you have not | ||||||
|  | signed it.  However, nothing else grants you permission to modify or | ||||||
|  | distribute the Program or its derivative works.  These actions are | ||||||
|  | prohibited by law if you do not accept this License.  Therefore, by | ||||||
|  | modifying or distributing the Program (or any work based on the | ||||||
|  | Program), you indicate your acceptance of this License to do so, and | ||||||
|  | all its terms and conditions for copying, distributing or modifying | ||||||
|  | the Program or works based on it. | ||||||
|  |  | ||||||
|  |   6. Each time you redistribute the Program (or any work based on the | ||||||
|  | Program), the recipient automatically receives a license from the | ||||||
|  | original licensor to copy, distribute or modify the Program subject to | ||||||
|  | these terms and conditions.  You may not impose any further | ||||||
|  | restrictions on the recipients' exercise of the rights granted herein. | ||||||
|  | You are not responsible for enforcing compliance by third parties to | ||||||
|  | this License. | ||||||
|  |  | ||||||
|  |   7. If, as a consequence of a court judgment or allegation of patent | ||||||
|  | infringement or for any other reason (not limited to patent issues), | ||||||
|  | conditions are imposed on you (whether by court order, agreement or | ||||||
|  | otherwise) that contradict the conditions of this License, they do not | ||||||
|  | excuse you from the conditions of this License.  If you cannot | ||||||
|  | distribute so as to satisfy simultaneously your obligations under this | ||||||
|  | License and any other pertinent obligations, then as a consequence you | ||||||
|  | may not distribute the Program at all.  For example, if a patent | ||||||
|  | license would not permit royalty-free redistribution of the Program by | ||||||
|  | all those who receive copies directly or indirectly through you, then | ||||||
|  | the only way you could satisfy both it and this License would be to | ||||||
|  | refrain entirely from distribution of the Program. | ||||||
|  |  | ||||||
|  | If any portion of this section is held invalid or unenforceable under | ||||||
|  | any particular circumstance, the balance of the section is intended to | ||||||
|  | apply and the section as a whole is intended to apply in other | ||||||
|  | circumstances. | ||||||
|  |  | ||||||
|  | It is not the purpose of this section to induce you to infringe any | ||||||
|  | patents or other property right claims or to contest validity of any | ||||||
|  | such claims; this section has the sole purpose of protecting the | ||||||
|  | integrity of the free software distribution system, which is | ||||||
|  | implemented by public license practices.  Many people have made | ||||||
|  | generous contributions to the wide range of software distributed | ||||||
|  | through that system in reliance on consistent application of that | ||||||
|  | system; it is up to the author/donor to decide if he or she is willing | ||||||
|  | to distribute software through any other system and a licensee cannot | ||||||
|  | impose that choice. | ||||||
|  |  | ||||||
|  | This section is intended to make thoroughly clear what is believed to | ||||||
|  | be a consequence of the rest of this License. | ||||||
|  |  | ||||||
|  |   8. If the distribution and/or use of the Program is restricted in | ||||||
|  | certain countries either by patents or by copyrighted interfaces, the | ||||||
|  | original copyright holder who places the Program under this License | ||||||
|  | may add an explicit geographical distribution limitation excluding | ||||||
|  | those countries, so that distribution is permitted only in or among | ||||||
|  | countries not thus excluded.  In such case, this License incorporates | ||||||
|  | the limitation as if written in the body of this License. | ||||||
|  |  | ||||||
|  |   9. The Free Software Foundation may publish revised and/or new versions | ||||||
|  | of the General Public License from time to time.  Such new versions will | ||||||
|  | be similar in spirit to the present version, but may differ in detail to | ||||||
|  | address new problems or concerns. | ||||||
|  |  | ||||||
|  | Each version is given a distinguishing version number.  If the Program | ||||||
|  | specifies a version number of this License which applies to it and "any | ||||||
|  | later version", you have the option of following the terms and conditions | ||||||
|  | either of that version or of any later version published by the Free | ||||||
|  | Software Foundation.  If the Program does not specify a version number of | ||||||
|  | this License, you may choose any version ever published by the Free Software | ||||||
|  | Foundation. | ||||||
|  |  | ||||||
|  |   10. If you wish to incorporate parts of the Program into other free | ||||||
|  | programs whose distribution conditions are different, write to the author | ||||||
|  | to ask for permission.  For software which is copyrighted by the Free | ||||||
|  | Software Foundation, write to the Free Software Foundation; we sometimes | ||||||
|  | make exceptions for this.  Our decision will be guided by the two goals | ||||||
|  | of preserving the free status of all derivatives of our free software and | ||||||
|  | of promoting the sharing and reuse of software generally. | ||||||
|  |  | ||||||
|  | 			    NO WARRANTY | ||||||
|  |  | ||||||
|  |   11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | ||||||
|  | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN | ||||||
|  | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | ||||||
|  | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | ||||||
|  | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||||||
|  | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS | ||||||
|  | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE | ||||||
|  | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | ||||||
|  | REPAIR OR CORRECTION. | ||||||
|  |  | ||||||
|  |   12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||||
|  | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | ||||||
|  | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | ||||||
|  | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | ||||||
|  | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | ||||||
|  | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | ||||||
|  | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | ||||||
|  | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | ||||||
|  | POSSIBILITY OF SUCH DAMAGES. | ||||||
|  |  | ||||||
|  | 		     END OF TERMS AND CONDITIONS | ||||||
|  |  | ||||||
|  | 	    How to Apply These Terms to Your New Programs | ||||||
|  |  | ||||||
|  |   If you develop a new program, and you want it to be of the greatest | ||||||
|  | possible use to the public, the best way to achieve this is to make it | ||||||
|  | free software which everyone can redistribute and change under these terms. | ||||||
|  |  | ||||||
|  |   To do so, attach the following notices to the program.  It is safest | ||||||
|  | to attach them to the start of each source file to most effectively | ||||||
|  | convey the exclusion of warranty; and each file should have at least | ||||||
|  | the "copyright" line and a pointer to where the full notice is found. | ||||||
|  |  | ||||||
|  |     <one line to give the program's name and a brief idea of what it does.> | ||||||
|  |     Copyright (C) <year>  <name of author> | ||||||
|  |  | ||||||
|  |     This program is free software; you can redistribute it and/or modify | ||||||
|  |     it under the terms of the GNU General Public License as published by | ||||||
|  |     the Free Software Foundation; either version 2 of the License, or | ||||||
|  |     (at your option) any later version. | ||||||
|  |  | ||||||
|  |     This program is distributed in the hope that it will be useful, | ||||||
|  |     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |     GNU General Public License for more details. | ||||||
|  |  | ||||||
|  |     You should have received a copy of the GNU General Public License | ||||||
|  |     along with this program; if not, write to the Free Software | ||||||
|  |     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Also add information on how to contact you by electronic and paper mail. | ||||||
|  |  | ||||||
|  | If the program is interactive, make it output a short notice like this | ||||||
|  | when it starts in an interactive mode: | ||||||
|  |  | ||||||
|  |     Gnomovision version 69, Copyright (C) year name of author | ||||||
|  |     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | ||||||
|  |     This is free software, and you are welcome to redistribute it | ||||||
|  |     under certain conditions; type `show c' for details. | ||||||
|  |  | ||||||
|  | The hypothetical commands `show w' and `show c' should show the appropriate | ||||||
|  | parts of the General Public License.  Of course, the commands you use may | ||||||
|  | be called something other than `show w' and `show c'; they could even be | ||||||
|  | mouse-clicks or menu items--whatever suits your program. | ||||||
|  |  | ||||||
|  | You should also get your employer (if you work as a programmer) or your | ||||||
|  | school, if any, to sign a "copyright disclaimer" for the program, if | ||||||
|  | necessary.  Here is a sample; alter the names: | ||||||
|  |  | ||||||
|  |   Yoyodyne, Inc., hereby disclaims all copyright interest in the program | ||||||
|  |   `Gnomovision' (which makes passes at compilers) written by James Hacker. | ||||||
|  |  | ||||||
|  |   <signature of Ty Coon>, 1 April 1989 | ||||||
|  |   Ty Coon, President of Vice | ||||||
|  |  | ||||||
|  | This General Public License does not permit incorporating your program into | ||||||
|  | proprietary programs.  If your program is a subroutine library, you may | ||||||
|  | consider it more useful to permit linking proprietary applications with the | ||||||
|  | library.  If this is what you want to do, use the GNU Library General | ||||||
|  | Public License instead of this License. | ||||||
							
								
								
									
										6
									
								
								edge-build-checks/SUSE-Edge.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								edge-build-checks/SUSE-Edge.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | [General] | ||||||
|  | Vendor=com.suse | ||||||
|  | Registry=%%IMG_REPO%% | ||||||
|  |  | ||||||
|  | [Tags] | ||||||
|  | Allowed=%%IMG_PREFIX%%* | ||||||
							
								
								
									
										9
									
								
								edge-build-checks/_service
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								edge-build-checks/_service
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | <services> | ||||||
|  |   <service name="replace_using_env" mode="buildtime"> | ||||||
|  |     <param name="file">SUSE-Edge.conf</param> | ||||||
|  |     <param name="eval">IMG_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?img_prefix})</param> | ||||||
|  |     <param name="var">IMG_PREFIX</param> | ||||||
|  |     <param name="eval">IMG_REPO=$(rpm --macros=/root/.rpmmacros -E %img_repo)</param> | ||||||
|  |     <param name="var">IMG_REPO</param> | ||||||
|  |   </service> | ||||||
|  | </services> | ||||||
							
								
								
									
										59
									
								
								edge-build-checks/edge-build-checks.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								edge-build-checks/edge-build-checks.spec
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | |||||||
|  | # | ||||||
|  | # spec file for package edge-build-checks | ||||||
|  | # | ||||||
|  | # Copyright (c) 2024 SUSE LLC | ||||||
|  | # | ||||||
|  | # All modifications and additions to the file contributed by third parties | ||||||
|  | # remain the property of their copyright owners, unless otherwise agreed | ||||||
|  | # upon. The license for this file, and modifications and additions to the | ||||||
|  | # file, is the same license as for the pristine package itself (unless the | ||||||
|  | # license for the pristine package is not an Open Source License, in which | ||||||
|  | # case the license is the MIT License). An "Open Source License" is a | ||||||
|  | # license that conforms to the Open Source Definition (Version 1.9) | ||||||
|  | # published by the Open Source Initiative. | ||||||
|  |  | ||||||
|  | # Please submit bugfixes or comments via https://bugs.opensuse.org/ | ||||||
|  | # | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Name:           edge-build-checks | ||||||
|  | Summary:        post checks for build after charts and images are created | ||||||
|  | License:        GPL-2.0-or-later | ||||||
|  | Group:          Development/Tools/Building | ||||||
|  | Version:        0.0.1 | ||||||
|  | Release:        0 | ||||||
|  | Source0:        COPYING | ||||||
|  | Source1:        20-helm-images | ||||||
|  | Source2:        10-helm-lint | ||||||
|  | Source3:        SUSE-Edge.conf | ||||||
|  | Source4:        20-helm-tags | ||||||
|  | BuildArch:      noarch | ||||||
|  | Requires:       container-build-checks | ||||||
|  | Requires:       python3-PyYAML | ||||||
|  | Provides:       container-build-checks-vendor | ||||||
|  |  | ||||||
|  | %description | ||||||
|  | some scripts to check for problems in edge related helm charts and images after their creation | ||||||
|  | in OBS. | ||||||
|  |  | ||||||
|  | %prep | ||||||
|  | cp %{SOURCE0} . | ||||||
|  |  | ||||||
|  | %build | ||||||
|  | %define _lto_cflags %{nil} | ||||||
|  | # nothing to do | ||||||
|  |  | ||||||
|  | %install | ||||||
|  | install -d $RPM_BUILD_ROOT/usr/lib/build/post-build-checks | ||||||
|  | install -m 755 %{SOURCE1} $RPM_BUILD_ROOT/usr/lib/build/post-build-checks | ||||||
|  | install -m 755 %{SOURCE2} $RPM_BUILD_ROOT/usr/lib/build/post-build-checks | ||||||
|  | install -m 755 %{SOURCE4} $RPM_BUILD_ROOT/usr/lib/build/post-build-checks | ||||||
|  | install -d %{buildroot}%{_datadir}/container-build-checks | ||||||
|  | install -m 644 %{SOURCE3} %{buildroot}%{_datadir}/container-build-checks/SUSE-Edge.conf | ||||||
|  |  | ||||||
|  | %files | ||||||
|  | %license COPYING | ||||||
|  | %{_datadir}/container-build-checks | ||||||
|  | /usr/lib/build | ||||||
|  |  | ||||||
|  | %changelog | ||||||
| @@ -1,6 +1,5 @@ | |||||||
| #!BuildTag: %%IMG_PREFIX%%edge-image-builder:1.1.2-rc1 | #!BuildTag: %%IMG_PREFIX%%edge-image-builder:1.2.1 | ||||||
| #!BuildTag: %%IMG_PREFIX%%edge-image-builder:1.1.2-rc1-%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/) | ||||||
| @@ -15,11 +14,11 @@ RUN zypper --non-interactive install --no-recommends edge-image-builder qemu-x86 | |||||||
| LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)" | LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)" | ||||||
| LABEL org.opencontainers.image.title="SLE edge-image-builder Container Image" | LABEL org.opencontainers.image.title="SLE edge-image-builder Container Image" | ||||||
| LABEL org.opencontainers.image.description="edge-image-builder based on the SLE Base Container Image." | LABEL org.opencontainers.image.description="edge-image-builder based on the SLE Base Container Image." | ||||||
| LABEL org.opencontainers.image.version="1.1.2-rc1" | LABEL org.opencontainers.image.version="1.2.1" | ||||||
| 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.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%edge-image-builder:1.1.2-rc1-%RELEASE%" | LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%edge-image-builder:1.2.1-%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" | ||||||
|   | |||||||
| @@ -7,8 +7,8 @@ | |||||||
|     <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> | ||||||
|     <param name="var">IMG_REPO</param> |     <param name="var">IMG_REPO</param> | ||||||
|     <param name="file">artifacts.yaml</param> |     <param name="file">artifacts.yaml</param> | ||||||
|     <param name="eval">IMG_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?img_prefix})</param> |     <param name="eval">CHART_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?chart_prefix})</param> | ||||||
|     <param name="var">IMG_PREFIX</param> |     <param name="var">CHART_PREFIX</param> | ||||||
|     <param name="eval">CHART_REPO=$(rpm --macros=/root/.rpmmacros -E %chart_repo)</param> |     <param name="eval">CHART_REPO=$(rpm --macros=/root/.rpmmacros -E %chart_repo)</param> | ||||||
|     <param name="var">CHART_REPO</param> |     <param name="var">CHART_REPO</param> | ||||||
|     <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> | ||||||
| @@ -17,4 +17,3 @@ | |||||||
|     <param name="var">CHART_MAJOR</param> |     <param name="var">CHART_MAJOR</param> | ||||||
|   </service> |   </service> | ||||||
| </services> | </services> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,11 +1,11 @@ | |||||||
| metallb: | metallb: | ||||||
|   chart: metallb-chart |   chart: metallb | ||||||
|   repository: "%%CHART_REPO%%/%%IMG_PREFIX%%" |   repository: "%%CHART_REPO%%/%%CHART_PREFIX%%" | ||||||
|   version: "%%CHART_MAJOR%%.0.1+up0.14.9" |   version: "%%CHART_MAJOR%%.0.0+up0.14.9" | ||||||
| endpoint-copier-operator: | endpoint-copier-operator: | ||||||
|   chart: endpoint-copier-operator-chart |   chart: endpoint-copier-operator | ||||||
|   repository: "%%CHART_REPO%%/%%IMG_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 | ||||||
|   | |||||||
| @@ -3,11 +3,11 @@ | |||||||
|     <param name="url">https://github.com/suse-edge/edge-image-builder.git</param> |     <param name="url">https://github.com/suse-edge/edge-image-builder.git</param> | ||||||
|     <param name="scm">git</param> |     <param name="scm">git</param> | ||||||
|     <param name="exclude">.git</param> |     <param name="exclude">.git</param> | ||||||
|     <param name="revision">v1.1.2-rc1</param> |     <param name="revision">v1.2.1</param> | ||||||
|     <!-- Uncomment and set this For Pre-Release Version --> |     <!-- Uncomment and set this For Pre-Release Version --> | ||||||
|     <param name="version">1.1.2~rc0</param> |     <!-- <param name="version">1.2.0~rc1</param> --> | ||||||
|     <!-- Uncomment and this for regular version --> |     <!-- Uncomment and this for regular version --> | ||||||
|     <!-- <param name="versionformat">@PARENT_TAG@</param> --> |     <param name="versionformat">@PARENT_TAG@</param> | ||||||
|     <param name="versionrewrite-pattern">v(\d+).(\d+).(\d+)</param> |     <param name="versionrewrite-pattern">v(\d+).(\d+).(\d+)</param> | ||||||
|     <param name="versionrewrite-replacement">\1.\2.\3</param> |     <param name="versionrewrite-replacement">\1.\2.\3</param> | ||||||
|     <param name="changesgenerate">enable</param> |     <param name="changesgenerate">enable</param> | ||||||
|   | |||||||
| @@ -17,14 +17,14 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| Name:           edge-image-builder | Name:           edge-image-builder | ||||||
| Version:        1.1.2~rc1 | Version:        1.2.1 | ||||||
| Release:        0 | Release:        0 | ||||||
| Summary:        Edge Image Builder | Summary:        Edge Image Builder | ||||||
| License:        Apache-2.0 | License:        Apache-2.0 | ||||||
| URL:            https://github.com/suse-edge/edge-image-builder | URL:            https://github.com/suse-edge/edge-image-builder | ||||||
| Source:         edge-image-builder-%{version}.tar | Source:         edge-image-builder-%{version}.tar | ||||||
| Source1:        vendor.tar.gz | Source1:        vendor.tar.gz | ||||||
| BuildRequires:  golang(API) go1.22 | BuildRequires:  golang(API) go1.24 | ||||||
| BuildRequires:  golang-packaging | BuildRequires:  golang-packaging | ||||||
| BuildRequires:  gpgme-devel | BuildRequires:  gpgme-devel | ||||||
| BuildRequires:  device-mapper-devel | BuildRequires:  device-mapper-devel | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| #!BuildTag: %%IMG_PREFIX%%endpoint-copier-operator-chart:%%CHART_MAJOR%%.0.0_up0.2.1 | #!BuildTag: %%CHART_PREFIX%%endpoint-copier-operator:%%CHART_MAJOR%%.0.1_up0.3.0 | ||||||
| #!BuildTag: %%IMG_PREFIX%%endpoint-copier-operator-chart:%%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" | ||||||
|   | |||||||
| @@ -9,8 +9,8 @@ | |||||||
|   </service> |   </service> | ||||||
|   <service name="replace_using_env" mode="buildtime"> |   <service name="replace_using_env" mode="buildtime"> | ||||||
|     <param name="file">Chart.yaml</param> |     <param name="file">Chart.yaml</param> | ||||||
|     <param name="eval">IMG_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?img_prefix})</param> |     <param name="eval">CHART_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?chart_prefix})</param> | ||||||
|     <param name="var">IMG_PREFIX</param> |     <param name="var">CHART_PREFIX</param> | ||||||
|     <param name="eval">CHART_MAJOR=$(rpm --macros=/root/.rpmmacros -E %{?chart_major})</param> |     <param name="eval">CHART_MAJOR=$(rpm --macros=/root/.rpmmacros -E %{?chart_major})</param> | ||||||
|     <param name="var">CHART_MAJOR</param> |     <param name="var">CHART_MAJOR</param> | ||||||
|   </service> |   </service> | ||||||
|   | |||||||
| @@ -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.4 | #!BuildTag: %%IMG_PREFIX%%frr:8.5.6 | ||||||
| #!BuildTag: %%IMG_PREFIX%%frr:8.4-%RELEASE% | #!BuildTag: %%IMG_PREFIX%%frr:8.5.6-%RELEASE% | ||||||
| #!BuildVersion: 15.5 |  | ||||||
| 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 | ||||||
|  |  | ||||||
| @@ -15,11 +14,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="FRR Container Image" | LABEL org.opencontainers.image.title="FRR Container Image" | ||||||
| LABEL org.opencontainers.image.description="frr based on the SLE Base Container Image." | LABEL org.opencontainers.image.description="frr based on the SLE Base Container Image." | ||||||
| LABEL org.opencontainers.image.version="8.4" | LABEL org.opencontainers.image.version="8.5.6" | ||||||
| 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.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%frr:8.4-%RELEASE%" | LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%frr:8.5.6-%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" | ||||||
|   | |||||||
| @@ -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 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  <service name="obs_scm"> |  <service name="obs_scm"> | ||||||
|     <param name="url">https://github.com/metallb/frr-k8s</param> |     <param name="url">https://github.com/metallb/frr-k8s</param> | ||||||
|     <param name="scm">git</param> |     <param name="scm">git</param> | ||||||
|     <param name="revision">v0.0.14</param> |     <param name="revision">v0.0.16</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,8 +17,8 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| Name:           frr-k8s | Name:           frr-k8s | ||||||
| Version:        0.0.14 | Version:        0.0.16 | ||||||
| Release:        0.0.14 | Release:        0.0.16 | ||||||
| Summary:        A kubernetes based daemonset that exposes a subset of the FRR API in a kubernetes compliant manner. | Summary:        A kubernetes based daemonset that exposes a subset of the FRR API in a kubernetes compliant manner. | ||||||
| License:        Apache-2.0 | License:        Apache-2.0 | ||||||
| URL:            https://github.com/metallb/frr-k8s | URL:            https://github.com/metallb/frr-k8s | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
|     <param name="versionformat">@PARENT_TAG@</param> |     <param name="versionformat">@PARENT_TAG@</param> | ||||||
|     <param name="scm">git</param> |     <param name="scm">git</param> | ||||||
|     <param name="exclude">.get</param> |     <param name="exclude">.get</param> | ||||||
|     <param name="revision">v1.0.7</param> |     <param name="revision">v1.2.1</param> | ||||||
|     <param name="versionrewrite-pattern">v(.*)</param> |     <param name="versionrewrite-pattern">v(.*)</param> | ||||||
|     <param name="changesgenerate">enable</param> |     <param name="changesgenerate">enable</param> | ||||||
|   </service> |   </service> | ||||||
| @@ -15,4 +15,13 @@ | |||||||
|   <service name="go_modules"> |   <service name="go_modules"> | ||||||
|      <param name="compression">gz</param> |      <param name="compression">gz</param> | ||||||
|   </service> |   </service> | ||||||
|  |   <service mode="buildtime" name="replace_using_env"> | ||||||
|  |     <param name="file">hauler.spec</param> | ||||||
|  |     <param name="var">SOURCE_COMMIT</param> | ||||||
|  |     <param name="eval"> | ||||||
|  |       SOURCE_COMMIT=$(grep commit hauler.obsinfo | cut -d" " -f2) | ||||||
|  |     </param> | ||||||
|  |     <param name="verbose">1</param> | ||||||
|  |   </service> | ||||||
|  |   <service mode="buildtime" name="set_version" /> | ||||||
| </services> | </services> | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ | |||||||
| %define project github.com/hauler-dev/hauler | %define project github.com/hauler-dev/hauler | ||||||
|  |  | ||||||
| Name:           hauler | Name:           hauler | ||||||
| Version:        1.0.7 | Version:        1.2.1 | ||||||
| Release:        0 | Release:        0 | ||||||
| Summary:        Airgap Swiss Army Knife | Summary:        Airgap Swiss Army Knife | ||||||
| License:        Apache-2.0 | License:        Apache-2.0 | ||||||
| @@ -26,7 +26,6 @@ URL:            https://github.com/hauler-dev/hauler | |||||||
| Source:         hauler-%{version}.tar | Source:         hauler-%{version}.tar | ||||||
| Source1:        vendor.tar.gz | Source1:        vendor.tar.gz | ||||||
| BuildRequires:  golang-packaging | BuildRequires:  golang-packaging | ||||||
| BuildRequires:  cosign |  | ||||||
|  |  | ||||||
| %description | %description | ||||||
|  |  | ||||||
| @@ -38,10 +37,18 @@ BuildRequires:  cosign | |||||||
|  |  | ||||||
| tar -xf %{SOURCE1} | tar -xf %{SOURCE1} | ||||||
|  |  | ||||||
| mkdir cmd/hauler/binaries | MODULE=hauler.dev/go/hauler | ||||||
| cp `which cosign` cmd/hauler/binaries/cosign-linux-%{go_arch} | %define buildtime %(date +%%Y-%%m-%%dT%%H:%%M:%%S%%z) | ||||||
|  | %define buildcommit %%SOURCE_COMMIT%% | ||||||
|  |  | ||||||
| go build -mod=vendor -buildmode=pie -o hauler ./cmd/hauler |  | ||||||
|  | go build \ | ||||||
|  | -mod=vendor \ | ||||||
|  | -buildmode=pie \ | ||||||
|  | -o hauler \ | ||||||
|  | -ldflags \ | ||||||
|  | "-X $MODULE/internal/version.gitVersion=v%{version} -X $MODULE/internal/version.gitCommit=%{buildcommit} -X $MODULE/internal/version.buildDate=%{buildtime}" \ | ||||||
|  | ./cmd/hauler | ||||||
|  |  | ||||||
| %install | %install | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,21 +1,14 @@ | |||||||
| # SPDX-License-Identifier: Apache-2.0 | # SPDX-License-Identifier: Apache-2.0 | ||||||
| #!BuildTag: %%IMG_PREFIX%%ironic:26.1.2.3 | #!BuildTag: %%IMG_PREFIX%%ironic:29.0.4.1 | ||||||
| #!BuildTag: %%IMG_PREFIX%%ironic:26.1.2.3-%RELEASE% | #!BuildTag: %%IMG_PREFIX%%ironic:29.0.4.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 | ||||||
|  |  | ||||||
| FROM registry.suse.com/bci/bci-base:$SLE_VERSION AS base | FROM registry.suse.com/bci/bci-base:$SLE_VERSION AS base | ||||||
|  |  | ||||||
| #!ArchExclusiveLine: x86_64 | RUN zypper -n in --no-recommends shim-x86_64 shim-aarch64 grub2-x86_64-efi grub2-arm64-efi dosfstools mtools | ||||||
| RUN if [ "$(uname -m)" = "x86_64" ];then \ |  | ||||||
|       zypper -n  in --no-recommends gcc git make xz-devel shim dosfstools mtools glibc-extra grub2-x86_64-efi grub2; zypper -n clean; rm -rf /var/log/*; \ |  | ||||||
|     fi |  | ||||||
| #!ArchExclusiveLine: aarch64 |  | ||||||
| RUN if [ "$(uname -m)" = "aarch64" ];then \ |  | ||||||
|       zypper -n rm kubic-locale-archive-2.31-10.36.noarch openssl-1_1-1.1.1l-150500.17.37.1.aarch64; zypper -n in --no-recommends gcc git make xz-devel openssl-3 mokutil shim dosfstools mtools glibc glibc-extra grub2 grub2-arm64-efi; zypper -n clean; rm -rf /var/log/* ;\ |  | ||||||
|     fi |  | ||||||
| WORKDIR /tmp | WORKDIR /tmp | ||||||
| COPY prepare-efi.sh /bin/ | COPY prepare-efi.sh /bin/ | ||||||
| RUN set -euo pipefail; chmod +x /bin/prepare-efi.sh | RUN set -euo pipefail; chmod +x /bin/prepare-efi.sh | ||||||
| @@ -26,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 | ||||||
| @@ -38,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" | ||||||
| @@ -46,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.3" | LABEL org.opencontainers.image.version="29.0.4.1" | ||||||
| LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic:26.1.2.3-%RELEASE%" | LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic:29.0.4.1-%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" | ||||||
| @@ -68,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 | ||||||
| @@ -83,30 +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.img /tmp/uefi_esp.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 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 |  | ||||||
| } |  | ||||||
							
								
								
									
										57
									
								
								ironic-image/configure-nonroot.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										57
									
								
								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 /etc/httpd/conf.modules.d/ | ||||||
| chown -R "${NONROOT_UID}":"${NONROOT_GID}" /var/log | chmod 2775 /etc/ironic /etc/httpd/conf /etc/httpd/conf.d /etc/httpd/conf.modules.d/ | ||||||
| chmod 2775 /etc/ironic /etc/httpd/conf /etc/httpd/conf.d | #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/* /etc/httpd/conf.modules.d/* | ||||||
|  |  | ||||||
| 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.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.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,12 +11,12 @@ 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/"> | ||||||
|  |         Options Indexes FollowSymLinks | ||||||
|         AllowOverride None |         AllowOverride None | ||||||
|         Require all granted |         Require all granted | ||||||
|     </Directory> |     </Directory> | ||||||
| 
 |     <Directory ~ "/shared/html/(redfish|ilo)/"> | ||||||
|     <Directory "/shared/html"> |  | ||||||
|         Options Indexes FollowSymLinks |         Options Indexes FollowSymLinks | ||||||
|         AllowOverride None |         AllowOverride None | ||||||
|         Require all granted |         Require all granted | ||||||
| @@ -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> | ||||||
| @@ -17,4 +17,4 @@ LoadModule authn_core_module /usr/lib64/apache2/mod_authn_core.so | |||||||
| LoadModule auth_basic_module /usr/lib64/apache2/mod_auth_basic.so | LoadModule auth_basic_module /usr/lib64/apache2/mod_auth_basic.so | ||||||
| LoadModule authn_file_module /usr/lib64/apache2/mod_authn_file.so | LoadModule authn_file_module /usr/lib64/apache2/mod_authn_file.so | ||||||
| LoadModule authz_user_module /usr/lib64/apache2/mod_authz_user.so | LoadModule authz_user_module /usr/lib64/apache2/mod_authz_user.so | ||||||
| LoadModule access_compat_module /usr/lib64/apache2/mod_access_compat.so | #LoadModule access_compat_module /usr/lib64/apache2/mod_access_compat.so | ||||||
| @@ -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,11 @@ 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.img | {% if env.VMEDIA_TLS_PORT %} | ||||||
|  | bootloader = {{ env.IRONIC_HTTPS_VMEDIA_URL }}/uefi_esp-{{ env.DEPLOY_ARCHITECTURE }}.img | ||||||
|  | {% else %} | ||||||
|  | bootloader = {{ env.IRONIC_HTTP_URL }}/uefi_esp-{{ env.DEPLOY_ARCHITECTURE }}.img | ||||||
|  | {% endif %} | ||||||
| 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 +107,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,15 +127,15 @@ 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 = {% if env.VMEDIA_TLS_PORT %}{{ env.IRONIC_HTTPS_VMEDIA_URL }}{% else %}{{ env.IRONIC_HTTP_URL }}{% endif %} | ||||||
| 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 }} | ||||||
| {% endif %} | {% endif %} | ||||||
| {% if env.IRONIC_EXTERNAL_HTTP_URL %} | {% if env.IRONIC_EXTERNAL_HTTP_URL %} | ||||||
| external_http_url = {{ env.IRONIC_EXTERNAL_HTTP_URL }} | external_http_url = {{ env.IRONIC_EXTERNAL_HTTP_URL }} | ||||||
| {% elif env.IRONIC_VMEDIA_TLS_SETUP == "true" %} | {% elif env.VMEDIA_TLS_PORT %} | ||||||
| external_http_url = https://{{ env.IRONIC_URL_HOST }}:{{ env.VMEDIA_TLS_PORT }} | external_http_url = {{ env.IRONIC_HTTPS_VMEDIA_URL }} | ||||||
| {% endif %} | {% endif %} | ||||||
| {% if env.IRONIC_EXTERNAL_CALLBACK_URL %} | {% if env.IRONIC_EXTERNAL_CALLBACK_URL %} | ||||||
| external_callback_url = {{ env.IRONIC_EXTERNAL_CALLBACK_URL }} | external_callback_url = {{ env.IRONIC_EXTERNAL_CALLBACK_URL }} | ||||||
| @@ -175,8 +190,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 +202,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 +211,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 +224,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. |  | ||||||
| @@ -2,41 +2,26 @@ | |||||||
|  |  | ||||||
| set -euxo pipefail | set -euxo pipefail | ||||||
|  |  | ||||||
| ARCH=$(uname -m) | declare -A efi_arch=( | ||||||
| DEST=${2:-/tmp/esp.img} |   ["x86_64"]="X64" | ||||||
| OS=${1:-sles} |   ["aarch64"]="AA64" | ||||||
|  |   ) | ||||||
|  |  | ||||||
| if [ $ARCH = "aarch64" ]; then | for arch in "${!efi_arch[@]}"; do | ||||||
|   BOOTEFI=BOOTAA64.EFI |    | ||||||
|   GRUBEFI=grubaa64.efi |   DEST=/tmp/esp-${arch}.img | ||||||
| else |  | ||||||
|   BOOTEFI=BOOTX64.efi |  | ||||||
|   GRUBEFI=grubx64.efi |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| dd bs=1024 count=6400 if=/dev/zero of=$DEST |   dd bs=1024 count=6400 if=/dev/zero of=$DEST | ||||||
| mkfs.msdos -F 12 -n 'ESP_IMAGE' $DEST |   mkfs.msdos -F 12 -n 'ESP_IMAGE' $DEST | ||||||
|  |  | ||||||
|  |   mmd -i $DEST EFI | ||||||
|  |   mmd -i $DEST EFI/BOOT | ||||||
|  |  | ||||||
|  |   mcopy -i $DEST -v /usr/share/efi/${arch}/shim.efi ::EFI/BOOT/BOOT${efi_arch[$arch]}.EFI | ||||||
|  |   mcopy -i $DEST -v /usr/share/efi/${arch}/grub.efi ::EFI/BOOT/GRUB.EFI | ||||||
|  |  | ||||||
|  |   mdir -i $DEST ::EFI/BOOT; | ||||||
|  | done | ||||||
|  |  | ||||||
| mkdir -p /boot/efi/EFI/BOOT |  | ||||||
| mkdir -p /boot/efi/EFI/$OS |  | ||||||
| if [ $ARCH = "aarch64" ]; then |  | ||||||
|   cp -L /usr/share/efi/aarch64/shim.efi /boot/efi/EFI/BOOT/$BOOTEFI |  | ||||||
|   cp -L /usr/share/efi/aarch64/grub.efi /boot/efi/EFI/BOOT/grub.efi |  | ||||||
|   cp /usr/share/grub2/arm64-efi/grub.efi /boot/efi/EFI/$OS/grubaa64.efi |  | ||||||
| else |  | ||||||
|   cp -L /usr/lib64/efi/shim.efi /boot/efi/EFI/BOOT/$BOOTEFI |  | ||||||
|   #cp /usr/share/grub2/x86_64-efi/grub.efi /boot/efi/EFI/$OS/$GRUBEFI |  | ||||||
|   cp /usr/share/grub2/x86_64-efi/grub.efi /boot/efi/EFI/$OS/grub.efi |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| mmd -i $DEST EFI |  | ||||||
| mmd -i $DEST EFI/BOOT |  | ||||||
| mcopy -i $DEST -v /boot/efi/EFI/BOOT/$BOOTEFI ::EFI/BOOT |  | ||||||
| if [ $ARCH = "aarch64" ]; then |  | ||||||
|   mcopy -i $DEST -v /boot/efi/EFI/BOOT/grub.efi ::EFI/BOOT |  | ||||||
|   mcopy -i $DEST -v /boot/efi/EFI/$OS/$GRUBEFI ::EFI/BOOT |  | ||||||
| else |  | ||||||
|   mcopy -i $DEST -v /boot/efi/EFI/$OS/grub.efi ::EFI/BOOT |  | ||||||
| fi  |  | ||||||
| mdir -i $DEST ::EFI/BOOT; |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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 | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								ironic-image/configure-ironic.sh → ironic-image/scripts/configure-ironic.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										70
									
								
								ironic-image/configure-ironic.sh → ironic-image/scripts/configure-ironic.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -3,6 +3,7 @@ | |||||||
| set -euxo pipefail | set -euxo pipefail | ||||||
| 
 | 
 | ||||||
| IRONIC_EXTERNAL_IP="${IRONIC_EXTERNAL_IP:-}" | IRONIC_EXTERNAL_IP="${IRONIC_EXTERNAL_IP:-}" | ||||||
|  | export VMEDIA_TLS_PORT="${VMEDIA_TLS_PORT:-}" | ||||||
| 
 | 
 | ||||||
| # Define the VLAN interfaces to be included in introspection report, e.g. | # Define the VLAN interfaces to be included in introspection report, e.g. | ||||||
| #   all - all VLANs on all interfaces using LLDP information | #   all - all VLANs on all interfaces using LLDP information | ||||||
| @@ -19,10 +20,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 +34,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 +52,21 @@ 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 | ||||||
|  | 
 | ||||||
|  | if [[ "${VMEDIA_TLS_PORT}" ]]; then | ||||||
|  |    export IRONIC_HTTPS_VMEDIA_URL="https://${IRONIC_URL_HOST}:${VMEDIA_TLS_PORT}" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
| # Hostname to use for the current conductor instance. | # 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 | ||||||
| @@ -68,15 +76,15 @@ if [[ -n "$IRONIC_EXTERNAL_IP" ]]; then | |||||||
|     fi |     fi | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| IMAGE_CACHE_PREFIX=/shared/html/images/ironic-python-agent | IMAGE_CACHE_PREFIX="/shared/html/images/ironic-python-agent-${DEPLOY_ARCHITECTURE}" | ||||||
| if [[ -f "${IMAGE_CACHE_PREFIX}.kernel" ]] && [[ -f "${IMAGE_CACHE_PREFIX}.initramfs" ]]; then | if [[ -f "${IMAGE_CACHE_PREFIX}.kernel" ]] && [[ -f "${IMAGE_CACHE_PREFIX}.initramfs" ]]; then | ||||||
|     export IRONIC_DEFAULT_KERNEL="${IMAGE_CACHE_PREFIX}.kernel" |     export IRONIC_DEFAULT_KERNEL="${IMAGE_CACHE_PREFIX}.kernel" | ||||||
|     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 +92,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 +99,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 |  | ||||||
							
								
								
									
										295
									
								
								ironic-image/scripts/ironic-common.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										295
									
								
								ironic-image/scripts/ironic-common.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,295 @@ | |||||||
|  | #!/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:-}" | ||||||
|  | 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" | ||||||
|  |             export IRONIC_IP="" | ||||||
|  |         else | ||||||
|  |             export IRONIC_IP="$PROVISIONING_IP" | ||||||
|  |         fi | ||||||
|  |     elif [[ -n "${IRONIC_IP}" ]]; then | ||||||
|  |         if [[ "$IRONIC_IP" =~ .*:.* ]]; then | ||||||
|  |             export IRONIC_IPV6="$IRONIC_IP" | ||||||
|  |             export IRONIC_IP="" | ||||||
|  |         fi | ||||||
|  |     elif [[ -n "${PROVISIONING_INTERFACE}" ]]; then | ||||||
|  |         until [[ -n "$IRONIC_IPV6" ]] || [[ -n "$IRONIC_IP" ]]; do | ||||||
|  |             echo "Waiting for ${PROVISIONING_INTERFACE} interface to be configured..." | ||||||
|  |  | ||||||
|  |             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 | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user