diff --git a/.gitea/workflows/pr_project.yaml b/.gitea/workflows/pr_project.yaml new file mode 100644 index 0000000..dd366c2 --- /dev/null +++ b/.gitea/workflows/pr_project.yaml @@ -0,0 +1,62 @@ +name: Build PR in OBS +on: + pull_request_target: + types: + - opened + - reopened + - synchronize + - closed + branches-ignore: + - "devel" + +concurrency: + group: ${{ gitea.workflow }}-${{ gitea.ref }} + cancel-in-progress: true + +jobs: + sync-pr-project: + name: "Build PR in OBS" + runs-on: tumbleweed + steps: + - name: Setup OSC + run: | + zypper in -y python3-jinja2 + 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' + - name: "[if PR is closed] Delete project in OBS" + run: | + if [ "${{ gitea.event.action }}" = "closed" ]; then + PROJECT="$(grep PROJECT .obs/common.py | sed 's/PROJECT = "\(.*\)"/\1/')" + osc rdelete -f -r -m "PR closed" "${PROJECT}:Staging:PR-${{ gitea.event.number }}" + fi + - name: "Setup PR project in OBS" + env: + SCM_URL: ${{ gitea.event.pull_request.head.repo.clone_url }}#${{ gitea.head_ref }} + run: | + if [ "${{ gitea.event.action }}" != "closed" ]; then + PROJECT="$(grep PROJECT .obs/common.py | sed 's/PROJECT = "\(.*\)"/\1/')" + python3 .obs/render_meta.py --pr ${{ gitea.event.number }} --scm-url "${SCM_URL}" | osc meta prj "${PROJECT}:Staging:PR-${{ gitea.event.number }}" -F - + echo "Project created ${PROJECT}:Staging:PR-${{ gitea.event.number }}" + echo "Follow build at: https://build.opensuse.org/project/monitor/${PROJECT}:Staging:PR-${{ gitea.event.number }}" + fi + - env: + GIT_SHA: ${{ gitea.event.pull_request.head.sha }} + name: "Wait for OBS to build the project" + run: | + if [ "${{ gitea.event.action }}" != "closed" ]; then + PROJECT="$(grep PROJECT .obs/common.py | sed 's/PROJECT = "\(.*\)"/\1/')" + export OBS_PROJECT="${PROJECT}:Staging:PR-${{ gitea.event.number }}" + python3 .obs/wait_obs.py + fi \ No newline at end of file diff --git a/.gitea/workflows/sync_config.yaml b/.gitea/workflows/sync_config.yaml new file mode 100644 index 0000000..dfa6c77 --- /dev/null +++ b/.gitea/workflows/sync_config.yaml @@ -0,0 +1,35 @@ +name: Synchronize Project Config +on: + push: + branches-ignore: + - "devel" + paths: + - "_config" + - ".gitea/workflows/sync_config.yaml" + +jobs: + sync-prjconf: + name: "Update prjconf in OBS" + 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' + - run: | + PROJECT="$(grep PROJECT .obs/common.py | sed 's/PROJECT = "\(.*\)"/\1/')" + if [ "$(osc meta prjconf "${PROJECT}" | sha256sum)" != "$(cat _config | sha256sum)" ] ; then + osc meta prjconf "${PROJECT}" -F _config + fi diff --git a/.gitea/workflows/sync_meta.yaml b/.gitea/workflows/sync_meta.yaml new file mode 100644 index 0000000..29eab1b --- /dev/null +++ b/.gitea/workflows/sync_meta.yaml @@ -0,0 +1,45 @@ +name: Synchronize Project Metadata +on: + push: + branches-ignore: + - "devel" + paths: + - "*" # Will trigger on new directories and changes to files in root of repository + - ".gitea/workflows/sync_meta.yaml" + - ".obs/common.py" + +jobs: + sync-prj-meta: + runs-on: tumbleweed + steps: + - name: Setup OSC + run: | + zypper in -y python3-jinja2 + 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' + - name: "Update or create OBS Project" + run: | + PROJECT="$(grep PROJECT .obs/common.py | sed 's/PROJECT = "\(.*\)"/\1/')" + set -o pipefail + if meta="$(osc meta prj "${PROJECT}" 2>/dev/null | sha256sum)"; then + new_meta="$(python3 .obs/render_meta.py)" + if [ "${meta}" != "$(echo "${new_meta}" | sha256sum)" ]; then + echo "${new_meta}" | osc meta prj "${PROJECT}" -F - + fi + python3 .obs/sync_packages.py + else + # Create the projects + bash .obs/create_projects.sh + fi diff --git a/.obs/add_package.py b/.obs/add_package.py index c2c6e21..67d913e 100755 --- a/.obs/add_package.py +++ b/.obs/add_package.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -import yaml import subprocess import argparse import os @@ -7,30 +6,6 @@ import os.path from common import PROJECT, REPOSITORY, BRANCH -def add_package_to_workflow(name: str): - modified = False - with open(".obs/workflows.yml", "r") as wf_file: - workflows = yaml.safe_load(wf_file) - if not any( - x - for x in workflows["staging_build"]["steps"] - if x["branch_package"]["source_package"] == name - ): - workflows["staging_build"]["steps"].append( - { - "branch_package": { - "source_project": PROJECT, - "target_project": f"{PROJECT}:Staging", - "source_package": name, - } - } - ) - modified = True - if modified: - with open(".obs/workflows.yml", "w") as wf_file: - yaml.dump(workflows, wf_file) - - def add_package_to_project(name: str): package_meta = f""" @@ -53,7 +28,6 @@ def add_package(package_name: str): os.exit(1) add_package_to_project(package_name) - add_package_to_workflow(package_name) def main(): @@ -65,7 +39,7 @@ def main(): add_package(args.package) - print("Package created in OBS, you can now push the modified workflow file") + print("Package created in OBS !") if __name__ == '__main__': diff --git a/.obs/create_projects.sh b/.obs/create_projects.sh new file mode 100644 index 0000000..514502f --- /dev/null +++ b/.obs/create_projects.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +show_help() { + echo "Usage: $(basename $0) [--internal]" + echo "options:" + echo "-h, --help display this help and exit" + echo "-i, --internal create project as internal" + exit 0 +} + +while [[ "$#" -gt 0 ]]; do + case $1 in + -h|--help) show_help;; + -i|--internal) internal="--internal" ;; + *) echo "Unknown parameter passed: $1";show_help ;; + esac + shift +done + +PROJECT="$(grep PROJECT .obs/common.py | sed 's/PROJECT = "\(.*\)"/\1/')" +EXTRA_OSC_ARGS="" +if [ -n "$internal" ]; then + PROJECT="ISV${PROJECT:3}" + EXTRA_OSC_ARGS="-A https://api.suse.de" + + python3 .obs/render_meta.py ${internal} Snapshot | osc ${EXTRA_OSC_ARGS} meta prj "${PROJECT}:Snapshot" -F - + osc ${EXTRA_OSC_ARGS} meta prjconf "${PROJECT}:Snapshot" -F _config +fi + +python3 .obs/render_meta.py ${internal} ToTest | osc ${EXTRA_OSC_ARGS} meta prj "${PROJECT}:ToTest" -F - +python3 .obs/render_meta.py ${internal} | osc ${EXTRA_OSC_ARGS} meta prj "${PROJECT}" -F - +osc ${EXTRA_OSC_ARGS} meta prjconf "${PROJECT}:ToTest" -F _config +osc ${EXTRA_OSC_ARGS} meta prjconf "${PROJECT}" -F _config + +if [ -z "$internal" ]; then + python3 .obs/sync_packages.py +fi \ No newline at end of file diff --git a/.obs/delete_package.py b/.obs/delete_package.py index 763219c..f529319 100755 --- a/.obs/delete_package.py +++ b/.obs/delete_package.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -import yaml import subprocess import argparse import os @@ -8,18 +7,6 @@ import os.path from common import PROJECT -def delete_package_from_workflow(name: str): - with open(".obs/workflows.yml", "r") as wf_file: - workflows = yaml.safe_load(wf_file) - workflows["staging_build"]["steps"] = [ - x - for x in workflows["staging_build"]["steps"] - if x["branch_package"]["source_package"] != name - ] - with open(".obs/workflows.yml", "w") as wf_file: - yaml.dump(workflows, wf_file) - - def delete_package_from_project(name: str): p = subprocess.run(["osc", "rdelete", PROJECT, name, "-m \"Deleted via delete_package.py\"" ], stdout=subprocess.PIPE) print(p.stdout) @@ -33,7 +20,6 @@ def delete_package(package_name: str): os.exit(1) delete_package_from_project(package_name) - delete_package_from_workflow(package_name) def main(): diff --git a/.obs/render_meta.py b/.obs/render_meta.py new file mode 100644 index 0000000..3ed31ec --- /dev/null +++ b/.obs/render_meta.py @@ -0,0 +1,62 @@ +import argparse + +from jinja2 import Template +from common import PROJECT + +def render(base_project, subproject, internal, scm_url=None): + version = base_project.rsplit(':', 1)[-1] + context = { + "base_project": subproject == "", + "title": f"SUSE Edge {version} {subproject}".rstrip(), + } + if subproject == "ToTest": + context["project"] = f"{base_project}:ToTest" + context["description"] = ( + f"This project doesn't build, it stores a snapshot of SUSE Edge {version} " + "project currently going through the automated test layer" + ) + if "Factory" in base_project or internal: + context["release_project"] = f"{base_project}:Snapshot" + elif subproject == "Snapshot": + context["project"] = f"{base_project}:Snapshot" + context["release_project"] = f"{base_project.rsplit(':', 1)[0]}:Containers" + context["for_release"] = True + context["description"] = ( + f"This project doesn't build, it stores a snapshot of SUSE Edge {version} " + "project that passed automated test layer" + ) + elif subproject == "": + context["project"] = base_project + context["release_project"] = f"{base_project}:ToTest" + else: # PR case direct python call + context["base_project"] = True + context["project"] = f"{base_project}:{subproject}" + if scm_url is not None: + context["scm_url"] = scm_url + + with open("_meta") as meta: + template = Template(meta.read()) + return template.render(context) + +def main(): + parser = argparse.ArgumentParser( + prog='ProgramName', + description='What the program does', + epilog='Text at the bottom of help') + parser.add_argument("subproject", default="", choices=["", "ToTest", "Snapshot"], nargs="?") + parser.add_argument("--internal", action="store_true") + parser.add_argument("--pr") + parser.add_argument("--scm-url") + args = parser.parse_args() + base_project = PROJECT.replace("isv", "ISV", 1) if args.internal else PROJECT + + print(render( + base_project=base_project, + subproject=args.subproject if args.pr is None else f"Staging:PR-{args.pr}", + internal=args.internal, + scm_url=args.scm_url, + )) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/.obs/sync_packages.py b/.obs/sync_packages.py index 1537f13..7f29088 100644 --- a/.obs/sync_packages.py +++ b/.obs/sync_packages.py @@ -9,7 +9,7 @@ from common import PROJECT def get_obs_packages() -> Set[str]: packages = subprocess.run(["osc", "ls", PROJECT], encoding='utf-8' , capture_output=True) - return set(packages.stdout.splitlines()) + return { p for p in packages.stdout.splitlines() if ":" not in p } def get_local_packages() -> Set[str]: p = pathlib.Path('.') diff --git a/.obs/wait_obs.py b/.obs/wait_obs.py new file mode 100644 index 0000000..5fe1501 --- /dev/null +++ b/.obs/wait_obs.py @@ -0,0 +1,83 @@ +import xml.etree.ElementTree as ET +import subprocess +import time +import os +import sys + +from collections import Counter + +def get_buildstatus(project: str) -> ET.Element: + for _ in range(5): + try: + output = subprocess.check_output(["osc", "pr", "--xml", project]) + return ET.fromstring(output) + except subprocess.CalledProcessError: + continue + print("Failed to get buildstatus from OBS") + +def do_wait(project:str, commit:str) -> ET.Element: + last_state = None + while True: + time.sleep(5) + status = get_buildstatus(project) + if last_state == status.get("state"): + continue + else: + last_state = status.get("state") + + scminfo = { e.text for e in status.findall(".//scminfo") } + if len(scminfo) != 1 or scminfo.pop() != commit: + print("Waiting for OBS to sync with SCM") + continue + + if not all([ e.get('state') == "published" and e.get('dirty') is None for e in status.findall("./result")]): + print("Waiting for OBS to finish building") + continue + + return status + +def print_results(status: ET.Element) -> bool: + results = {} + failed = [] + for e in status.findall("./result"): + repo = results.get(e.get("repository"), {}) + repo[e.get("arch")] = e + results[e.get("repository")] = repo + + for repo in results.keys(): + print(f"{repo}:") + depth=1 + for arch in results[repo].keys(): + counts = Counter() + if repo != "charts": + print(f"\t{arch}:") + depth=2 + for package in results[repo][arch].findall("./status"): + if package.get("code") in ["excluded", "disabled"]: + continue + if package.get("code") in ["failed", "unresolvable", "broken"]: + details = package.findtext("details") + if details: + failed.append(f"{package.get('package')} ({arch}): {details}") + else: + failed.append(f"{package.get('package')} ({arch})") + counts[package.get("code")] += 1 + for (code, count) in counts.items(): + print("\t"*depth, f"{code}: {count}") + + failed.sort() + if failed: + print("\nPackages failing: ") + for fail in failed: + print("\t", fail) + return len(failed) + +def main(): + project = os.environ.get("OBS_PROJECT") + sha = os.environ.get("GIT_SHA") + print(f"Waiting for OBS to build {project} for commit {sha}") + status = do_wait(project, sha) + sys.exit(print_results(status)) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/.obs/workflows.yml b/.obs/workflows.yml deleted file mode 100644 index 74f1ef0..0000000 --- a/.obs/workflows.yml +++ /dev/null @@ -1,216 +0,0 @@ -staging_build: - filters: - event: pull_request - steps: - - branch_package: - source_package: endpoint-copier-operator - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: endpoint-copier-operator-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: endpoint-copier-operator-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: akri - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: akri-agent-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: akri-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: akri-controller-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: akri-dashboard-extension-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: akri-debug-echo-discovery-handler-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: akri-onvif-discovery-handler-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: akri-opcua-discovery-handler-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: akri-udev-discovery-handler-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: akri-webhook-configuration-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: obs-service-set_version - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: cosign - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: frr-k8s - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: kubectl - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: upgrade-controller - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: nm-configurator - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: kube-rbac-proxy - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: edge-image-builder - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: metallb - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: hauler - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: baremetal-operator - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: cdi-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: metallb-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: sriov-crd-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: upgrade-controller-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: edge-image-builder-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: ironic-ipa-downloader-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: upgrade-controller-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: metal3-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: baremetal-operator-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: sriov-network-operator-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: metallb-controller-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: metallb-speaker-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: ironic-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: cri-tools - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: crudini - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: fakeroot - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: ipcalc - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: autoconf - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: rancher-turtles-airgap-resources-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: rancher-turtles-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: kube-rbac-proxy-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: ironic-ipa-ramdisk - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: kubevirt-dashboard-extension-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: kiwi-builder-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: kubevirt-chart - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: release-manifest-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: frr-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: kubectl-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging - - branch_package: - source_package: frr-k8s-image - source_project: isv:SUSE:Edge:Factory - target_project: isv:SUSE:Edge:Factory:Staging diff --git a/README.md b/README.md index 5cd009a..6becf8d 100644 --- a/README.md +++ b/README.md @@ -5,15 +5,6 @@ Contains the definition of the packages built on OBS for the SUSE Edge Solution This repository is linked to an OBS project: <https://build.opensuse.org/project/show/isv:SUSE:Edge:Factory> Every directory in this repository represents a package in that OBS project, those should be synced automatically from this repository. -## Adding a package - -To add a package, first create a directory with your package as you intend it in OBS. - -Then run the `.obs/add_package.py` script to create the package in the OBS project and add the required elements to the synchronization workflow. -This script is using the `osc` command behind the scenes, so ensure you have it installed and correctly configured, as well as you have the correct permissions to create a new package in the project. - -You will then get asked to push your changes. - ## Testing a fork or a development branch You can create a project in your home space in OBS, use the same prjconf as the one of "isv:SUSE:Edge:Factory", and copy the repositories part of the metadata (adjust self references). @@ -23,16 +14,14 @@ Then add a scmsync stanza to your metadata like this (adjust repository path and <scmsync>https://src.opensuse.org/suse-edge/Factory#main</scmsync> ``` +This is done automatically for any PR filed against this repository. + ## Cutting a release version branch 1. Do the appropriate git branch command 2. Change the project path in `.obs/common.py` file (e.g. from `isv:SUSE:Edge:Factory` to `isv:SUSE:Edge:3.2`) 3. Change the branch reference in `.obs/common.py` file (e.g. from `main` to `3.2`) -4. Edit the `.obs/workflows.yml` file to change the references to the correct projects 5. Commit those changes to the new branch and push the new branch -6. Create the base and to-test projects (e.g. `isv:SUSE:Edge:3.2` and `isv:SUSE:Edge:3.2:ToTest`), use the `isv:SUSE:Edge:Factory` projects as example for metadata part -7. Use the prjconf of Factory in all those projects -8. Run the `.obs/sync_packages.py` script to create all the packages in the base project 9. Go take a few cups of coffee/tea/mate/... while waiting for OBS to build everything 10. Once built do an `osc release` of the project for it to be copied over in the `ToTest` section 11. Hand over to QA to test whatever is in `ToTest`. (You can continue to work on the base branch if needed meanwhile) diff --git a/_config b/_config index 9f7486b..9de1f11 100644 --- a/_config +++ b/_config @@ -3,25 +3,37 @@ Prefer: -libqpid-proton10 -python311-urllib3_1 Macros: %__python3 /usr/bin/python3.11 %registry_url %(echo %{vendor} | cut -d '/' -f 3 | sed 's/build/registry/') -%chart_major 999 :Macros -# Doesn't work as is, needs more work -#%if "%registry_url" == "registry.opensuse.org" +%if "%{sub %{lower %_project} 1 14}" != "isv:suse:edge:" || "%{sub %_project 15 21}" == "Factory" + # Here we are in Factory like project so set chart major version to 999 +Macros: +%chart_major 999 +:Macros +%else + # Here we are in version branch, so set the image prefix and chart major accordingly +Macros: +%project_branch %(echo %{_project} | cut -d ':' -f 4) +%img_prefix %{project_branch}/ +%chart_major %(echo %{project_branch} | awk '{split($1,a,"."); print a[1]*100 + a[2]}') +:Macros +%endif + +%if %{sub %_project 1 3} == ISV +Macros: +%img_repo registry.suse.com/edge +%chart_repo oci://registry.suse.com/edge +%manifest_repo registry.suse.com/edge +%support_level l3 +:Macros +%else Macros: %img_repo registry.opensuse.org/isv/suse/edge/containers/images %manifest_repo registry.opensuse.org/isv/suse/edge/containers/images %chart_repo oci://registry.opensuse.org/isv/suse/edge/containers/charts %support_level techpreview :Macros -#%else -#Macros: -#%img_repo registry.suse.com/edge -#%chart_repo oci://registry.suse.com/edge -#%manifest_repo registry.suse.com/edge -#%support_level l3 -#:Macros -#%endif +%endif %if "%_repository" == "charts" || "%_repository" == "test_manifest_images" Macros: @@ -39,31 +51,68 @@ BuildFlags: excludebuild:autoconf:testsuite %if "%_repository" == "test_manifest_images" BuildFlags: onlybuild:edge-image-builder-image BuildFlags: onlybuild:release-manifest-image + # Exclude the images selected by the following section + # as the standard repository is a dependency + %ifarch aarch64 + BuildFlags: excludebuild:baremetal-operator-image + BuildFlags: excludebuild:endpoint-copier-operator-image + BuildFlags: excludebuild:ironic-image + BuildFlags: excludebuild:ironic-ipa-downloader-image + BuildFlags: excludebuild:kube-rbac-proxy-image + BuildFlags: excludebuild:metallb-controller-image + BuildFlags: excludebuild:metallb-speaker-image + %endif +%else +# Only a subset of stack is arm64 ready + %ifarch aarch64 + BuildFlags: onlybuild:autoconf + BuildFlags: onlybuild:baremetal-operator + BuildFlags: onlybuild:baremetal-operator-image + BuildFlags: onlybuild:ca-certificates-suse + BuildFlags: onlybuild:cosign + BuildFlags: onlybuild:crudini + BuildFlags: onlybuild:edge-image-builder + BuildFlags: onlybuild:edge-image-builder-image + BuildFlags: onlybuild:endpoint-copier-operator + BuildFlags: onlybuild:endpoint-copier-operator-image + BuildFlags: onlybuild:fakeroot + BuildFlags: onlybuild:hauler + BuildFlags: onlybuild:ipcalc + BuildFlags: onlybuild:ironic-image + BuildFlags: onlybuild:ironic-ipa-downloader-image + BuildFlags: onlybuild:ironic-ipa-ramdisk + BuildFlags: onlybuild:kube-rbac-proxy + BuildFlags: onlybuild:kube-rbac-proxy-image + BuildFlags: onlybuild:metallb + BuildFlags: onlybuild:metallb-controller-image + BuildFlags: onlybuild:metallb-speaker-image + BuildFlags: onlybuild:nm-configurator + %endif %endif %if "%_repository" == "images" || "%_repository" == "test_manifest_images" -Prefer: container:sles15-image -Type: docker -Repotype: none -Patterntype: none -BuildEngine: podman -Prefer: sles-release -BuildFlags: dockerarg:SLE_VERSION=15.6 + Prefer: container:sles15-image + Type: docker + Repotype: none + Patterntype: none + BuildEngine: podman + Prefer: sles-release + BuildFlags: dockerarg:SLE_VERSION=15.6 -# Publish multi-arch container images only once all archs have been built -PublishFlags: archsync + # Publish multi-arch container images only once all archs have been built + PublishFlags: archsync %endif %if "%_repository" == "charts" || "%_repository" == "phantomcharts" || "%_repository" == "releasecharts" -Type: helm -Repotype: helm -Patterntype: none -Required: perl-YAML-LibYAML + Type: helm + Repotype: helm + Patterntype: none + Required: perl-YAML-LibYAML %endif %if "%_repository" == "standard" -# for build openstack-ironic-image -BuildFlags: allowrootforbuild + # for build openstack-ironic-image + BuildFlags: allowrootforbuild %endif # Enable reproducible builds @@ -73,4 +122,4 @@ Macros: %clamp_mtime_to_source_date_epoch Y %use_source_date_epoch_as_buildtime Y %_buildhost reproducible -:Macros \ No newline at end of file +:Macros diff --git a/_meta b/_meta new file mode 100644 index 0000000..fa14c49 --- /dev/null +++ b/_meta @@ -0,0 +1,69 @@ +{#- + This template is rendered by the render_meta.py script + it is not automatically enforced by OBS +-#} +{%- set maintainers = [ + "edge-engineering", +] -%} +<project name="{{ project }}"> + <title>{{ title }} + {%- if description is defined %} + {{ description }} + {%- else %} + + {%- endif %} + {%- if scm_url is defined %} + {{ scm_url }} + {%- endif %} +{%- for maintainer in maintainers %} + +{%- endfor %} +{%- if not base_project %} + + + + + + + + + + x86_64 + +{%- endif %} +{%- for repository in ["images", "test_manifest_images"] %} + + {%- if release_project is defined and repository == "images" %} + + {%- endif %} + + + + x86_64 + aarch64 + +{%- endfor %} + + {%- if release_project is defined and not for_release %} + + {%- endif %} + + + x86_64 + aarch64 + + + {%- if release_project is defined and not for_release %} + + {%- endif %} + + x86_64 + + {%- if for_release %} + + + + x86_64 + + {%- endif %} + diff --git a/akri/_service b/akri/_service index e983bf4..c04162f 100644 --- a/akri/_service +++ b/akri/_service @@ -10,7 +10,9 @@ akri - + + akri.obsinfo + version.txt ^(.*)$ diff --git a/baremetal-operator/_service b/baremetal-operator/_service index 2628004..c45ecc3 100644 --- a/baremetal-operator/_service +++ b/baremetal-operator/_service @@ -12,10 +12,8 @@ yes \1 - - - *.tar - gz + + baremetal-operator.obsinfo @@ -23,7 +21,7 @@ baremetal-operator.spec SOURCE_COMMIT - SOURCE_COMMIT=$(grep commit *.obsinfo | cut -d" " -f2) + SOURCE_COMMIT=$(grep commit baremetal-operator.obsinfo | cut -d" " -f2) 1 diff --git a/baremetal-operator/baremetal-operator.spec b/baremetal-operator/baremetal-operator.spec index 66c6108..94d7ec5 100644 --- a/baremetal-operator/baremetal-operator.spec +++ b/baremetal-operator/baremetal-operator.spec @@ -22,7 +22,7 @@ Release: 0.8.0 Summary: Implements a Kubernetes API for managing bare metal hosts License: Apache-2.0 URL: https://github.com/metal3-io/baremetal-operator -Source: baremetal-operator-%{version}.tar.gz +Source: baremetal-operator-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang(API) = 1.22 ExcludeArch: s390 diff --git a/cosign/_service b/cosign/_service index 94a6556..1233d4a 100644 --- a/cosign/_service +++ b/cosign/_service @@ -8,10 +8,8 @@ v(.*) enable - - - *.tar - gz + + cosign.obsinfo diff --git a/cosign/cosign.spec b/cosign/cosign.spec index 753cb1b..850a003 100644 --- a/cosign/cosign.spec +++ b/cosign/cosign.spec @@ -24,7 +24,7 @@ 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.gz +Source: cosign-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang-packaging diff --git a/edge-image-builder/_service b/edge-image-builder/_service index e408566..0b1f5c1 100644 --- a/edge-image-builder/_service +++ b/edge-image-builder/_service @@ -9,10 +9,8 @@ \1 enable - - - *.tar - gz + + edge-image-builder.obsinfo diff --git a/edge-image-builder/edge-image-builder.spec b/edge-image-builder/edge-image-builder.spec index c3d8bc5..b5f438a 100644 --- a/edge-image-builder/edge-image-builder.spec +++ b/edge-image-builder/edge-image-builder.spec @@ -22,7 +22,7 @@ Release: 0 Summary: Edge Image Builder License: Apache-2.0 URL: https://github.com/suse-edge/edge-image-builder -Source: edge-image-builder-%{version}.tar.gz +Source: edge-image-builder-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang(API) go1.22 BuildRequires: golang-packaging diff --git a/endpoint-copier-operator/_service b/endpoint-copier-operator/_service index 81fb0fb..a6877c9 100644 --- a/endpoint-copier-operator/_service +++ b/endpoint-copier-operator/_service @@ -12,10 +12,8 @@ yes \1 - - - *.tar - gz + + endpoint-copier-operator.obsinfo diff --git a/endpoint-copier-operator/endpoint-copier-operator.spec b/endpoint-copier-operator/endpoint-copier-operator.spec index 0466fc1..b1f390e 100644 --- a/endpoint-copier-operator/endpoint-copier-operator.spec +++ b/endpoint-copier-operator/endpoint-copier-operator.spec @@ -22,7 +22,7 @@ Release: 0.2.0 Summary: Implements a Kubernetes API for copying endpoint resources License: Apache-2.0 URL: https://github.com/suse-edge/endpoint-copier-operator -Source: endpoint-copier-operator-%{version}.tar.gz +Source: endpoint-copier-operator-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang(API) = 1.20 ExcludeArch: s390 diff --git a/frr-k8s/_service b/frr-k8s/_service index 10c03d5..f83862b 100644 --- a/frr-k8s/_service +++ b/frr-k8s/_service @@ -12,10 +12,8 @@ yes \1 - - - *.tar - gz + + frr-k8s.obsinfo diff --git a/frr-k8s/frr-k8s.spec b/frr-k8s/frr-k8s.spec index 9342812..3d97a10 100644 --- a/frr-k8s/frr-k8s.spec +++ b/frr-k8s/frr-k8s.spec @@ -22,7 +22,7 @@ Release: 0.0.14 Summary: A kubernetes based daemonset that exposes a subset of the FRR API in a kubernetes compliant manner. License: Apache-2.0 URL: https://github.com/metallb/frr-k8s -Source: frr-k8s-%{version}.tar.gz +Source: frr-k8s-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang(API) = 1.22 ExcludeArch: s390 diff --git a/hauler/_service b/hauler/_service index 54563fb..a7d11ad 100644 --- a/hauler/_service +++ b/hauler/_service @@ -8,10 +8,8 @@ v(.*) enable - - - *.tar - gz + + hauler.obsinfo diff --git a/hauler/hauler.spec b/hauler/hauler.spec index cbee7c0..79b5052 100644 --- a/hauler/hauler.spec +++ b/hauler/hauler.spec @@ -23,7 +23,7 @@ Release: 0 Summary: Airgap Swiss Army Knife License: Apache-2.0 URL: https://github.com/hauler-dev/hauler -Source: hauler-%{version}.tar.gz +Source: hauler-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang-packaging BuildRequires: cosign diff --git a/ironic-image/Dockerfile b/ironic-image/Dockerfile index 1a7f66c..dc4995a 100644 --- a/ironic-image/Dockerfile +++ b/ironic-image/Dockerfile @@ -1,6 +1,6 @@ # SPDX-License-Identifier: Apache-2.0 -#!BuildTag: %%IMG_PREFIX%%ironic:26.1.2.0 -#!BuildTag: %%IMG_PREFIX%%ironic:26.1.2.0-%RELEASE% +#!BuildTag: %%IMG_PREFIX%%ironic:26.1.2.2 +#!BuildTag: %%IMG_PREFIX%%ironic:26.1.2.2-%RELEASE% #!BuildVersion: 15.6 ARG SLE_VERSION @@ -8,7 +8,14 @@ FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro FROM registry.suse.com/bci/bci-base:$SLE_VERSION AS base -RUN set -euo pipefail; 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/* +#!ArchExclusiveLine: x86_64 +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 COPY prepare-efi.sh /bin/ RUN set -euo pipefail; chmod +x /bin/prepare-efi.sh @@ -16,8 +23,16 @@ RUN /bin/prepare-efi.sh COPY --from=micro / /installroot/ RUN sed -i -e 's%^# rpm.install.excludedocs = no.*%rpm.install.excludedocs = yes%g' /etc/zypp/zypp.conf -RUN zypper --installroot /installroot --non-interactive install --no-recommends python311-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 inotify-tools ipcalc ipmitool iproute2 procps qemu-tools sqlite3 util-linux xorriso tftp syslinux ipxe-bootimgs crudini openstack-ironic +#!ArchExclusiveLine: x86_64 +RUN if [ "$(uname -m)" = "x86_64" ];then \ + zypper --installroot /installroot --non-interactive install --no-recommends syslinux python311-devel python311 python311-pip python-dracclient python311-sushy-oem-idrac python311-proliantutils python311-sushy python3-ironicclient git curl sles-release tar gzip vim gawk dnsmasq dosfstools apache2 apache2-mod_wsgi inotify-tools ipcalc ipmitool iproute2 procps qemu-tools sqlite3 util-linux xorriso tftp ipxe-bootimgs python311-sushy-tools crudini openstack-ironic openstack-ironic-inspector-api; \ + fi +#!ArchExclusiveLine: aarch64 +RUN if [ "$(uname -m)" = "aarch64" ];then \ + zypper --installroot /installroot --non-interactive install --no-recommends python311-devel python311 python311-pip python-dracclient python311-sushy-oem-idrac python311-proliantutils python311-sushy python3-ironicclient git curl sles-release tar gzip vim gawk dnsmasq dosfstools apache2 apache2-mod_wsgi inotify-tools ipcalc ipmitool iproute2 procps qemu-tools sqlite3 util-linux xorriso tftp ipxe-bootimgs python311-sushy-tools crudini openstack-ironic openstack-ironic-inspector-api; \ + fi + # DATABASE RUN mkdir -p /installroot/var/lib/ironic && \ /installroot/usr/bin/sqlite3 /installroot/var/lib/ironic/ironic.sqlite "pragma journal_mode=wal" && \ @@ -31,8 +46,8 @@ LABEL org.opencontainers.image.description="Openstack Ironic based on the SLE Ba LABEL org.opencontainers.image.url="https://www.suse.com/products/server/" LABEL org.opencontainers.image.created="%BUILDTIME%" LABEL org.opencontainers.image.vendor="SUSE LLC" -LABEL org.opencontainers.image.version="26.1.2.0" -LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic:26.1.2.0-%RELEASE%" +LABEL org.opencontainers.image.version="26.1.2.2" +LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic:26.1.2.2-%RELEASE%" LABEL org.openbuildservice.disturl="%DISTURL%" LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%" LABEL com.suse.eula="SUSE Combined EULA February 2024" @@ -64,7 +79,15 @@ RUN mkdir -p $GRUB_DIR # IRONIC # RUN cp /usr/share/ipxe/undionly.kpxe /tftpboot/undionly.kpxe -RUN cp /usr/share/ipxe/ipxe-x86_64.efi /tftpboot/ipxe.efi +#!ArchExclusiveLine: x86_64 +RUN if [ "$(uname -m)" = "x86_64" ];then \ + cp /usr/share/ipxe/ipxe-x86_64.efi /tftpboot/ipxe.efi ;\ + fi +#!ArchExclusiveLine: x86_64 +RUN if [ "$(uname -m)" = "aarch64" ]; then\ + cp /usr/share/ipxe/snp-arm64.efi /tftpboot/ipxe.efi; cp /usr/share/ipxe/snp-arm64.efi /tftpboot/snp-arm64.efi; cp /usr/share/ipxe/snp-arm64.efi /tftpboot/snp.efi ;\ + fi + COPY --from=base /tmp/esp.img /tmp/uefi_esp.img COPY ironic.conf.j2 /etc/ironic/ diff --git a/ironic-image/prepare-efi.sh b/ironic-image/prepare-efi.sh index 84e0808..a293187 100644 --- a/ironic-image/prepare-efi.sh +++ b/ironic-image/prepare-efi.sh @@ -6,22 +6,37 @@ ARCH=$(uname -m) DEST=${2:-/tmp/esp.img} OS=${1:-sles} -BOOTEFI=BOOTX64.efi -GRUBEFI=grubx64.efi +if [ $ARCH = "aarch64" ]; then + BOOTEFI=BOOTAA64.EFI + GRUBEFI=grubaa64.efi +else + BOOTEFI=BOOTX64.efi + GRUBEFI=grubx64.efi +fi dd bs=1024 count=6400 if=/dev/zero of=$DEST mkfs.msdos -F 12 -n 'ESP_IMAGE' $DEST mkdir -p /boot/efi/EFI/BOOT -cp -L /usr/lib64/efi/shim.efi /boot/efi/EFI/BOOT/$BOOTEFI mkdir -p /boot/efi/EFI/$OS -#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 +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 -#mcopy -i $DEST -v /boot/efi/EFI/$OS/$GRUBEFI ::EFI/BOOT -mcopy -i $DEST -v /boot/efi/EFI/$OS/grub.efi ::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; diff --git a/ironic-image/runlogwatch.sh b/ironic-image/runlogwatch.sh index 525cd7d..b5bcabb 100644 --- a/ironic-image/runlogwatch.sh +++ b/ironic-image/runlogwatch.sh @@ -3,6 +3,14 @@ # 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 **************" diff --git a/ironic-ipa-downloader-image/Dockerfile b/ironic-ipa-downloader-image/Dockerfile index 5470626..3a22750 100644 --- a/ironic-ipa-downloader-image/Dockerfile +++ b/ironic-ipa-downloader-image/Dockerfile @@ -1,6 +1,6 @@ # SPDX-License-Identifier: Apache-2.0 -#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.0 -#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.0-%RELEASE% +#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.1 +#!BuildTag: %%IMG_PREFIX%%ironic-ipa-downloader:3.0.1-%RELEASE% #!BuildVersion: 15.6 ARG SLE_VERSION FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro @@ -8,7 +8,14 @@ FROM registry.suse.com/bci/bci-micro:$SLE_VERSION AS micro FROM registry.suse.com/bci/bci-base:$SLE_VERSION AS base COPY --from=micro / /installroot/ RUN sed -i -e 's%^# rpm.install.excludedocs = no.*%rpm.install.excludedocs = yes%g' /etc/zypp/zypp.conf -RUN zypper --installroot /installroot --non-interactive install --no-recommends ironic-ipa-ramdisk-x86_64 python311-devel python311 python311-pip tar gawk git curl xz fakeroot shadow sed cpio; zypper -n clean; rm -rf /var/log/* +#!ArchExclusiveLine: x86_64 +RUN if [ "$(uname -m)" = "x86_64" ];then \ + zypper --installroot /installroot --non-interactive install --no-recommends ironic-ipa-ramdisk-x86_64 python311-devel python311 python311-pip tar gawk git curl xz fakeroot shadow sed cpio; zypper -n clean; rm -rf /var/log/*; \ + fi +#!ArchExclusiveLine: aarch64 +RUN if [ "$(uname -m)" = "aarch64" ];then \ + zypper --installroot /installroot --non-interactive install --no-recommends ironic-ipa-ramdisk-aarch64 python311-devel python311 python311-pip tar gawk git curl xz fakeroot shadow sed cpio; zypper -n clean; rm -rf /var/log/*; \ + fi #RUN zypper --installroot /installroot --non-interactive install --no-recommends sles-release; RUN cp /usr/bin/getopt /installroot/ @@ -19,11 +26,11 @@ FROM micro AS final LABEL org.opencontainers.image.authors="SUSE LLC (https://www.suse.com/)" LABEL org.opencontainers.image.title="SLE Based Ironic IPA Downloader Container Image" LABEL org.opencontainers.image.description="ironic-ipa-downloader based on the SLE Base Container Image." -LABEL org.opencontainers.image.version="3.0.0" +LABEL org.opencontainers.image.version="3.0.1" LABEL org.opencontainers.image.url="https://www.suse.com/solutions/edge-computing/" LABEL org.opencontainers.image.created="%BUILDTIME%" LABEL org.opencontainers.image.vendor="SUSE LLC" -LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic-ipa-downloader:3.0.0-%RELEASE%" +LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%ironic-ipa-downloader:3.0.1-%RELEASE%" LABEL org.openbuildservice.disturl="%DISTURL%" LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%" LABEL com.suse.eula="SUSE Combined EULA February 2024" diff --git a/ironic-ipa-downloader-image/_service b/ironic-ipa-downloader-image/_service index c8d3f38..355a193 100644 --- a/ironic-ipa-downloader-image/_service +++ b/ironic-ipa-downloader-image/_service @@ -1,12 +1,6 @@ - - Dockerfile - %%ironic-ipa-ramdisk-x86_64_version%% - ironic-ipa-ramdisk-x86_64 - patch - Dockerfile IMG_PREFIX=$(rpm --macros=/root/.rpmmacros -E %{?img_prefix}) diff --git a/ironic-ipa-downloader-image/get-resource.sh b/ironic-ipa-downloader-image/get-resource.sh index 373553f..2b11a24 100644 --- a/ironic-ipa-downloader-image/get-resource.sh +++ b/ironic-ipa-downloader-image/get-resource.sh @@ -8,10 +8,10 @@ export no_proxy=${no_proxy:-$NO_PROXY} # Which image should we use if [ -z "${IPA_BASEURI}" ]; then - # SLES BASED IPA - openstack-ironic-image-x86_64 package + # SLES BASED IPA - ironic-ipa-ramdisk-x86_64 package mkdir -p /shared/html/images cp /tmp/initrd.xz /shared/html/images/ironic-python-agent.initramfs - cp /tmp/openstack-ironic-image*.x86_64*.kernel /shared/html/images/ironic-python-agent.kernel + cp /tmp/openstack-ironic-image*.kernel /shared/html/images/ironic-python-agent.kernel else FILENAME=ironic-python-agent FILENAME_EXT=.tar @@ -68,4 +68,4 @@ if [ -d "/tmp/ironic-certificates" ]; then mkdir -p etc/ironic-python-agent.d/ca-certs cp /tmp/ironic-certificates/* etc/ironic-python-agent.d/ca-certs/ find . | fakeroot -i ../initrd.fakeroot cpio -o -H newc | xz --check=crc32 --x86 --lzma2 --fast > /shared/html/images/ironic-python-agent.initramfs -fi \ No newline at end of file +fi diff --git a/ironic-ipa-ramdisk/ironic-ipa-ramdisk.kiwi b/ironic-ipa-ramdisk/ironic-ipa-ramdisk.kiwi index 0670a37..686ba41 100644 --- a/ironic-ipa-ramdisk/ironic-ipa-ramdisk.kiwi +++ b/ironic-ipa-ramdisk/ironic-ipa-ramdisk.kiwi @@ -1,5 +1,5 @@ - + Cloud developers cloud-devel@suse.de @@ -116,8 +116,9 @@ - - + + + @@ -135,12 +136,10 @@ - + - - - - + + @@ -157,7 +156,6 @@ - diff --git a/ironic-ipa-ramdisk/ironic-ipa-ramdisk.spec b/ironic-ipa-ramdisk/ironic-ipa-ramdisk.spec index acd71b4..f52d842 100644 --- a/ironic-ipa-ramdisk/ironic-ipa-ramdisk.spec +++ b/ironic-ipa-ramdisk/ironic-ipa-ramdisk.spec @@ -19,7 +19,7 @@ Name: ironic-ipa-ramdisk -Version: 3.0.0 +Version: 3.0.1 Release: 0 Summary: Kernel and ramdisk image for OpenStack Ironic License: SUSE-EULA @@ -49,7 +49,12 @@ BuildRequires: fontconfig BuildRequires: fonts-config BuildRequires: gptfdisk BuildRequires: grub2 +%ifarch x86_64 BuildRequires: grub2-x86_64-efi +%endif +%ifarch aarch64 +BuildRequires: grub2-arm64-efi +%endif BuildRequires: haveged BuildRequires: hdparm BuildRequires: hwinfo @@ -93,19 +98,14 @@ BuildRequires: plymouth-dracut BuildRequires: plymouth-theme-bgrt BuildRequires: dracut-kiwi-oem-dump BuildRequires: dracut-kiwi-oem-repart -BuildRequires: gfxboot-branding-SLE BuildRequires: grub2-branding-SLE BuildRequires: open-iscsi BuildRequires: plymouth-branding-SLE BuildRequires: lshw BuildRequires: kbd -%ifarch aarch64 BuildRequires: dmidecode BuildRequires: efibootmgr -%endif %ifarch x86_64 -BuildRequires: dmidecode -BuildRequires: efibootmgr BuildRequires: syslinux %endif diff --git a/kiwi-builder-image/Dockerfile b/kiwi-builder-image/Dockerfile index 4ff28c9..1251741 100644 --- a/kiwi-builder-image/Dockerfile +++ b/kiwi-builder-image/Dockerfile @@ -1,5 +1,5 @@ -#!BuildTag: %%IMG_PREFIX%%kiwi-builder:10.1.16.0 -#!BuildTag: %%IMG_PREFIX%%kiwi-builder:10.1.16.0-%RELEASE% +#!BuildTag: %%IMG_PREFIX%%kiwi-builder:10.1.16.1 +#!BuildTag: %%IMG_PREFIX%%kiwi-builder:10.1.16.1-%RELEASE% FROM registry.suse.com/bci/kiwi:10.1.16 MAINTAINER SUSE LLC (https://www.suse.com/) @@ -12,7 +12,7 @@ LABEL org.opencontainers.image.version="%PACKAGE_VERSION%" LABEL org.opencontainers.image.url="https://www.suse.com/solutions/edge-computing/" LABEL org.opencontainers.image.created="%BUILDTIME%" LABEL org.opencontainers.image.vendor="SUSE LLC" -LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%kiwi-builder:10.1.16.0" +LABEL org.opensuse.reference="%%IMG_REPO%%/%%IMG_PREFIX%%kiwi-builder:10.1.16.1" LABEL org.openbuildservice.disturl="%DISTURL%" LABEL com.suse.supportlevel="%%SUPPORT_LEVEL%%" LABEL com.suse.eula="SUSE Combined EULA February 2024" diff --git a/kiwi-builder-image/README b/kiwi-builder-image/README index b74c156..684137f 100644 --- a/kiwi-builder-image/README +++ b/kiwi-builder-image/README @@ -2,13 +2,13 @@ Kiwi SDK Image Instructions ########################### -Please ensure that you're running this on a registered SLE Micro 6.0 system, and make sure that SELinux is disabled: +Please ensure that you're running this on a registered SUSE Linux Micro 6.1 system, and make sure that SELinux is disabled: # setenforce 0 Next, download the podman image: -# podman pull %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.0 +# podman pull %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.1 Make a local output directory (where the images will reside): @@ -16,40 +16,40 @@ Make a local output directory (where the images will reside): Then, to build a standard "Base" image, run the following in podman: -# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.0 build-image +# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.1 build-image To build a "Base" SelfInstall ISO, you can add additional flags, for example: -# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.0 build-image -p Base-SelfInstall +# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.1 build-image -p Base-SelfInstall Then, to build a standard "Default" image, run the following in podman: -# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.0 build-image -p Default +# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.1 build-image -p Default To build a "Default" SelfInstall ISO, you can add additional flags, for example: -# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.0 build-image -p Default-SelfInstall +# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.1 build-image -p Default-SelfInstall To build an image with a RealTime kernel, e.g. a RAW disk image ("Default"), use the following: -# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.0 build-image -p Base-RT +# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.1 build-image -p Base-RT To build an image that supports a large block/sectorsize (4096), use the "-b" flag, for example: -# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.0 build-image -p Default-SelfInstall -b +# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.1 build-image -p Default-SelfInstall -b # mkdir mydefs/ # cp /path/to/SL-Micro.kiwi mydefs/ # cp /path/to/config.sh mydefs/ -# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -v ./mydefs/:/micro-sdk/defs/ -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.0 build-image +# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ./output:/tmp/output -v ./mydefs/:/micro-sdk/defs/ -it %%IMG_REPO%%/%%IMG_PREFIXkiwi-builder:10.1.16.1 build-image All output will be in the local $(pwd)/output directory, for example: # ls -1 output/ -SLE-Micro.x86_64-6.0.changes -SLE-Micro.x86_64-6.0.packages -SLE-Micro.x86_64-6.0.raw -SLE-Micro.x86_64-6.0.verified +SLE-Micro.x86_64-6.1.changes +SLE-Micro.x86_64-6.1.packages +SLE-Micro.x86_64-6.1.raw +SLE-Micro.x86_64-6.1.verified build kiwi.result kiwi.result.json diff --git a/kiwi-builder-image/SL-Micro.kiwi b/kiwi-builder-image/SL-Micro.kiwi index 76a4290..f0a8a70 100644 --- a/kiwi-builder-image/SL-Micro.kiwi +++ b/kiwi-builder-image/SL-Micro.kiwi @@ -33,6 +33,12 @@ + + + + + + @@ -63,6 +69,21 @@ + + + + + + + + + + + + + + + @@ -140,6 +161,15 @@ + + + + + + + + + @@ -164,6 +194,14 @@ + + + + + + + + @@ -184,10 +222,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - 6.0 + 6.1 zypper SLE SLE @@ -198,7 +273,7 @@ initrd_system="dracut" filesystem="btrfs" firmware="uefi" - kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet net.ifnames=0" + kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0" bootpartition="false" bootkernel="custom" devicepersistency="by-uuid" @@ -211,7 +286,7 @@ luks_pbkdf="pbkdf2" > - @@ -230,7 +305,7 @@ - 6.0 + 6.1 zypper SLE SLE @@ -241,7 +316,7 @@ initrd_system="dracut" filesystem="btrfs" firmware="uefi" - kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet net.ifnames=0" + kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0" bootpartition="false" bootkernel="custom" devicepersistency="by-uuid" @@ -266,7 +341,7 @@ - 6.0 + 6.1 zypper SLE SLE @@ -276,11 +351,12 @@ image="oem" initrd_system="dracut" installiso="true" + installpxe="true" filesystem="btrfs" installboot="install" install_continue_on_timeout="false" firmware="uefi" - kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet net.ifnames=0" + kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0" bootpartition="false" bootkernel="custom" devicepersistency="by-uuid" @@ -304,8 +380,8 @@ - - 6.0 + + 6.1 zypper SLE SLE @@ -320,11 +396,11 @@ install_continue_on_timeout="false" fsmountoptions="noatime" firmware="uefi" - kernelcmdline="console=ttyS0,115200n8 console=tty0 security=selinux selinux=1 quiet net.ifnames=0" + kernelcmdline="security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0" bootpartition="false" devicepersistency="by-uuid" btrfs_root_is_snapshot="true" - efipartsize="128" + efipartsize="128" editbootinstall="editbootinstall_rpi.sh" btrfs_root_is_readonly_snapshot="true" btrfs_quota_groups="false" @@ -344,8 +420,8 @@ - - 6.0 + + 6.1 zypper SLE SLE @@ -355,12 +431,13 @@ image="oem" initrd_system="dracut" installiso="true" + installpxe="true" filesystem="btrfs" installboot="install" install_continue_on_timeout="false" firmware="uefi" - efipartsize="128" - kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet net.ifnames=0" + efipartsize="128" + kernelcmdline="security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0" bootpartition="false" bootkernel="custom" devicepersistency="by-uuid" @@ -385,22 +462,22 @@ - 6.0 + 6.1 zypper SLE SLE true en_US - + - 6.0 + 6.1 zypper SLE SLE @@ -434,9 +511,9 @@ filesystem="btrfs" bootpartition="true" bootpartsize="300" - bootfilesystem="ext2" + bootfilesystem="ext4" initrd_system="dracut" - kernelcmdline="hvc_iucv=8 TERM=dumb security=selinux selinux=1 quiet" + kernelcmdline="hvc_iucv=8 TERM=dumb security=selinux selinux=1 quiet systemd.show_status=1" devicepersistency="by-uuid" target_blocksize="4096" btrfs_root_is_snapshot="true" @@ -461,7 +538,7 @@ - 6.0 + 6.1 zypper SLE SLE @@ -472,9 +549,9 @@ filesystem="btrfs" bootpartition="true" bootpartsize="300" - bootfilesystem="ext2" + bootfilesystem="ext4" initrd_system="dracut" - kernelcmdline="hvc_iucv=8 TERM=dumb security=selinux selinux=1 quiet" + kernelcmdline="hvc_iucv=8 TERM=dumb security=selinux selinux=1 quiet systemd.show_status=1" devicepersistency="by-uuid" btrfs_root_is_snapshot="true" btrfs_root_is_readonly_snapshot="true" @@ -495,9 +572,47 @@ + + 6.1 + zypper + SLE + SLE + true + en_US + + + true + + + + + + + + + + + + + 5 + + - 6.0 + 6.1 zypper SLE SLE @@ -532,7 +647,7 @@ - 6.0 + 6.1 zypper SLE SLE @@ -543,7 +658,7 @@ format="qcow2" filesystem="btrfs" firmware="uefi" - kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet net.ifnames=0 ignition.platform.id=qemu" + kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0 ignition.platform.id=qemu" bootpartition="false" bootkernel="custom" devicepersistency="by-uuid" @@ -567,9 +682,9 @@ 32 - + - 6.0 + 6.1 zypper SLE SLE @@ -580,8 +695,8 @@ format="qcow2" filesystem="btrfs" firmware="uefi" - efipartsize="128" - kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet net.ifnames=0 ignition.platform.id=qemu" + efipartsize="128" + kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0 ignition.platform.id=qemu" bootpartition="false" bootkernel="custom" devicepersistency="by-uuid" @@ -592,7 +707,7 @@ - + @@ -603,6 +718,161 @@ + + 6.1 + zypper + SLE + SLE + true + en_US + + + + + + + + + + + + + + + + + 6.1 + zypper + SLE + SLE + true + en_US + + + + + + + + + + + + + + + + + + + 6.1 + zypper + SLE + SLE + true + en_US + + + + + + + + + + + + + + + + + + + + + + 6.1 + zypper + SLE + SLE + true + en_US + + + + + + + + + + + + + + + + + + + + + + + @@ -616,7 +886,7 @@ - + @@ -628,7 +898,6 @@ - @@ -647,9 +916,7 @@ - - - + @@ -703,7 +970,7 @@ - @@ -713,7 +980,8 @@ - + + @@ -721,46 +989,44 @@ --> - + - + - - + + - - + + - + + + + + - + - - - - + @@ -774,4 +1040,14 @@ + + + + + + + + + + diff --git a/kiwi-builder-image/SL-Micro.kiwi.4096 b/kiwi-builder-image/SL-Micro.kiwi.4096 index 33d84b0..4222f9e 100644 --- a/kiwi-builder-image/SL-Micro.kiwi.4096 +++ b/kiwi-builder-image/SL-Micro.kiwi.4096 @@ -33,6 +33,12 @@ + + + + + + @@ -63,6 +69,21 @@ + + + + + + + + + + + + + + + @@ -140,6 +161,15 @@ + + + + + + + + + @@ -164,6 +194,14 @@ + + + + + + + + @@ -184,10 +222,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - 6.0 + 6.1 zypper SLE SLE @@ -198,7 +273,7 @@ initrd_system="dracut" filesystem="btrfs" firmware="uefi" - kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet net.ifnames=0" + kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0" bootpartition="false" bootkernel="custom" devicepersistency="by-uuid" @@ -213,7 +288,7 @@ efipartsize="200" > - @@ -232,7 +307,7 @@ - 6.0 + 6.1 zypper SLE SLE @@ -243,7 +318,7 @@ initrd_system="dracut" filesystem="btrfs" firmware="uefi" - kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet net.ifnames=0" + kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0" bootpartition="false" bootkernel="custom" devicepersistency="by-uuid" @@ -270,7 +345,7 @@ - 6.0 + 6.1 zypper SLE SLE @@ -280,11 +355,12 @@ image="oem" initrd_system="dracut" installiso="true" + installpxe="true" filesystem="btrfs" installboot="install" install_continue_on_timeout="false" firmware="uefi" - kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet net.ifnames=0" + kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0" bootpartition="false" bootkernel="custom" devicepersistency="by-uuid" @@ -310,8 +386,8 @@ - - 6.0 + + 6.1 zypper SLE SLE @@ -326,7 +402,7 @@ install_continue_on_timeout="false" fsmountoptions="noatime" firmware="uefi" - kernelcmdline="console=ttyS0,115200n8 console=tty0 security=selinux selinux=1 quiet net.ifnames=0" + kernelcmdline="security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0" bootpartition="false" devicepersistency="by-uuid" btrfs_root_is_snapshot="true" @@ -350,8 +426,8 @@ - - 6.0 + + 6.1 zypper SLE SLE @@ -361,12 +437,13 @@ image="oem" initrd_system="dracut" installiso="true" + installpxe="true" filesystem="btrfs" installboot="install" install_continue_on_timeout="false" firmware="uefi" efipartsize="128" - kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet net.ifnames=0" + kernelcmdline="security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0" bootpartition="false" bootkernel="custom" devicepersistency="by-uuid" @@ -391,22 +468,22 @@ - 6.0 + 6.1 zypper SLE SLE true en_US - + - 6.0 + 6.1 zypper SLE SLE @@ -440,9 +517,9 @@ filesystem="btrfs" bootpartition="true" bootpartsize="300" - bootfilesystem="ext2" + bootfilesystem="ext4" initrd_system="dracut" - kernelcmdline="hvc_iucv=8 TERM=dumb security=selinux selinux=1 quiet" + kernelcmdline="hvc_iucv=8 TERM=dumb security=selinux selinux=1 quiet systemd.show_status=1" devicepersistency="by-uuid" target_blocksize="4096" btrfs_root_is_snapshot="true" @@ -467,7 +544,7 @@ - 6.0 + 6.1 zypper SLE SLE @@ -478,9 +555,9 @@ filesystem="btrfs" bootpartition="true" bootpartsize="300" - bootfilesystem="ext2" + bootfilesystem="ext4" initrd_system="dracut" - kernelcmdline="hvc_iucv=8 TERM=dumb security=selinux selinux=1 quiet" + kernelcmdline="hvc_iucv=8 TERM=dumb security=selinux selinux=1 quiet systemd.show_status=1" devicepersistency="by-uuid" btrfs_root_is_snapshot="true" btrfs_root_is_readonly_snapshot="true" @@ -501,9 +578,47 @@ + + 6.1 + zypper + SLE + SLE + true + en_US + + + true + + + + + + + + + + + + + 5 + + - 6.0 + 6.1 zypper SLE SLE @@ -538,7 +653,7 @@ - 6.0 + 6.1 zypper SLE SLE @@ -549,7 +664,7 @@ format="qcow2" filesystem="btrfs" firmware="uefi" - kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet net.ifnames=0 ignition.platform.id=qemu" + kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0 ignition.platform.id=qemu" bootpartition="false" bootkernel="custom" devicepersistency="by-uuid" @@ -577,7 +692,7 @@ - 6.0 + 6.1 zypper SLE SLE @@ -589,7 +704,7 @@ filesystem="btrfs" firmware="uefi" efipartsize="128" - kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet net.ifnames=0 ignition.platform.id=qemu" + kernelcmdline="console=ttyS0,115200 console=tty0 security=selinux selinux=1 quiet systemd.show_status=1 net.ifnames=0 ignition.platform.id=qemu" bootpartition="false" bootkernel="custom" devicepersistency="by-uuid" @@ -600,7 +715,7 @@ - + @@ -611,6 +726,161 @@ + + 6.1 + zypper + SLE + SLE + true + en_US + + + + + + + + + + + + + + + + + 6.1 + zypper + SLE + SLE + true + en_US + + + + + + + + + + + + + + + + + + + 6.1 + zypper + SLE + SLE + true + en_US + + + + + + + + + + + + + + + + + + + + + + 6.1 + zypper + SLE + SLE + true + en_US + + + + + + + + + + + + + + + + + + + + + + + @@ -655,8 +925,6 @@ - - @@ -720,7 +988,8 @@ - + + @@ -728,46 +997,44 @@ --> - + - + - + + --> - - + + - + + + + + - + - - - - + @@ -781,4 +1048,14 @@ - \ No newline at end of file + + + + + + + + + + + diff --git a/kiwi-builder-image/build-image.sh b/kiwi-builder-image/build-image.sh index b0df0ba..5873380 100644 --- a/kiwi-builder-image/build-image.sh +++ b/kiwi-builder-image/build-image.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2025 SUSE LLC # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -27,9 +27,9 @@ LARGEBLOCK=false # Print usage usage(){ cat <<-EOF - ============================== - SLE Micro 6.0 Kiwi SDK Builder - ============================== + ===================================== + SUSE Linux Micro 6.1 Kiwi SDK Builder + ===================================== Usage: ${0} [-p ] [-b] diff --git a/kiwi-builder-image/config.sh b/kiwi-builder-image/config.sh index 3214755..cc9f1b0 100644 --- a/kiwi-builder-image/config.sh +++ b/kiwi-builder-image/config.sh @@ -35,14 +35,6 @@ mkdir /var/lib/misc/reconfig_system #-------------------------------------- echo "Configure image: [$kiwi_iname]-[$kiwi_profiles]..." -#====================================== -# This is a workaround - someone, -# somewhere needs to load the xts crypto -# module, otherwise luksOpen will fail while -# creating the image. -#-------------------------------------- -modprobe xts || true - #====================================== # add missing fonts #-------------------------------------- @@ -139,9 +131,6 @@ for i in /usr/lib/rpm/gnupg/keys/gpg-pubkey*asc; do rpm --import $i || true done -# Temporary workaround for bsc#1212187 -echo "techpreview.ZYPP_MEDIANETWORK=1" >> /etc/zypp/zypp.conf - #====================================== # Enable kubelet if installed #-------------------------------------- @@ -170,8 +159,18 @@ if [ "${kiwi_btrfs_root_is_snapshot-false}" = 'true' ]; then sed -i'' 's/^NUMBER_LIMIT_IMPORTANT=.*$/NUMBER_LIMIT_IMPORTANT="4-10"/g' /etc/snapper/configs/root fi -# Enable jeos-firstboot if installed, disabled by combustion/ignition -if rpm -q --whatprovides jeos-firstboot >/dev/null; then +# Enable multipathd for MP images +if [ "${kiwi_oemmultipath_scan-false}" = 'true' ]; then + systemctl enable multipathd.service +fi + +# On those s390 targets the console is not capable of running jeos-firstboot, +# use systemd-firstboot as minimal alternative. +if [[ "$kiwi_profiles" =~ s390-(dasd|fba|fcp) ]]; then + systemctl enable systemd-firstboot + # Enable prompting for the root password + echo 'root:!unprovisioned' | chpasswd -e +elif rpm -q --whatprovides jeos-firstboot >/dev/null; then mkdir -p /var/lib/YaST2 touch /var/lib/YaST2/reconfig_system systemctl enable jeos-firstboot.service @@ -281,7 +280,7 @@ if [[ "$kiwi_profiles" == *"RaspberryPi"* ]]; then options smsc95xx turbo_mode=N EOF - cat > /usr/lib/sysctl.d/50-rpi3.conf <<-EOF + cat > /etc/sysctl.d/50-rpi3.conf <<-EOF # Avoid running out of DMA pages for smsc95xx (bsc#1012449) vm.min_free_kbytes = 2048 EOF diff --git a/kube-rbac-proxy/_service b/kube-rbac-proxy/_service index 99268e7..40083f2 100644 --- a/kube-rbac-proxy/_service +++ b/kube-rbac-proxy/_service @@ -12,10 +12,8 @@ yes \1 - - - *.tar - gz + + kube-rbac-proxy.obsinfo diff --git a/kube-rbac-proxy/kube-rbac-proxy.spec b/kube-rbac-proxy/kube-rbac-proxy.spec index 9d8075a..ead43b6 100644 --- a/kube-rbac-proxy/kube-rbac-proxy.spec +++ b/kube-rbac-proxy/kube-rbac-proxy.spec @@ -22,7 +22,7 @@ Release: 0.18.1 Summary: The kube-rbac-proxy is a small HTTP proxy for a single upstream License: Apache-2.0 URL: https://github.com/brancz/kube-rbac-proxy -Source: kube-rbac-proxy-%{version}.tar.gz +Source: kube-rbac-proxy-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang(API) = 1.23 ExcludeArch: s390 diff --git a/metal3-chart/Chart.yaml b/metal3-chart/Chart.yaml index b5c8d06..7bce2cf 100644 --- a/metal3-chart/Chart.yaml +++ b/metal3-chart/Chart.yaml @@ -1,16 +1,16 @@ -#!BuildTag: %%IMG_PREFIX%%metal3-chart:%%CHART_MAJOR%%.0.0_up0.9.0 -#!BuildTag: %%IMG_PREFIX%%metal3-chart:%%CHART_MAJOR%%.0.0_up0.9.0-%RELEASE% +#!BuildTag: %%IMG_PREFIX%%metal3-chart:%%CHART_MAJOR%%.0.0_up0.9.2 +#!BuildTag: %%IMG_PREFIX%%metal3-chart:%%CHART_MAJOR%%.0.0_up0.9.2-%RELEASE% apiVersion: v2 -appVersion: 0.9.0 +appVersion: 0.9.2 dependencies: - alias: metal3-baremetal-operator name: baremetal-operator repository: file://./charts/baremetal-operator - version: 0.6.0 + version: 0.6.1 - alias: metal3-ironic name: ironic repository: file://./charts/ironic - version: 0.8.0 + version: 0.9.1 - alias: metal3-mariadb condition: global.enable_mariadb name: mariadb @@ -20,9 +20,9 @@ dependencies: condition: global.enable_metal3_media_server name: media repository: file://./charts/media - version: 0.6.0 + version: 0.6.1 description: A Helm chart that installs all of the dependencies needed for Metal3 icon: https://github.com/cncf/artwork/raw/master/projects/metal3/icon/color/metal3-icon-color.svg name: metal3 type: application -version: "%%CHART_MAJOR%%.0.0+up0.9.0" +version: "%%CHART_MAJOR%%.0.0+up0.9.2" diff --git a/metal3-chart/charts/baremetal-operator/Chart.yaml b/metal3-chart/charts/baremetal-operator/Chart.yaml index 808b950..9fa5be0 100644 --- a/metal3-chart/charts/baremetal-operator/Chart.yaml +++ b/metal3-chart/charts/baremetal-operator/Chart.yaml @@ -3,4 +3,4 @@ appVersion: 0.8.0 description: A Helm chart for baremetal-operator, used by Metal3 name: baremetal-operator type: application -version: 0.6.0 +version: 0.6.1 diff --git a/metal3-chart/charts/baremetal-operator/templates/tests/test-connection.yaml b/metal3-chart/charts/baremetal-operator/templates/tests/test-connection.yaml deleted file mode 100644 index 28715fe..0000000 --- a/metal3-chart/charts/baremetal-operator/templates/tests/test-connection.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: "{{ include "baremetal-operator.fullname" . }}-test-connection" - labels: - {{- include "baremetal-operator.labels" . | nindent 4 }} - annotations: - "helm.sh/hook": test -spec: - containers: - - name: wget - image: busybox - command: ['wget'] - args: ['{{ include "baremetal-operator.fullname" . }}:{{ .Values.service.port }}'] - restartPolicy: Never diff --git a/metal3-chart/charts/ironic/Chart.yaml b/metal3-chart/charts/ironic/Chart.yaml index 4cfc28d..37712fb 100644 --- a/metal3-chart/charts/ironic/Chart.yaml +++ b/metal3-chart/charts/ironic/Chart.yaml @@ -3,4 +3,4 @@ appVersion: 26.1.2 description: A Helm chart for Ironic, used by Metal3 name: ironic type: application -version: 0.8.0 +version: 0.9.1 diff --git a/metal3-chart/charts/ironic/values.yaml b/metal3-chart/charts/ironic/values.yaml index 97b6120..0e153cc 100644 --- a/metal3-chart/charts/ironic/values.yaml +++ b/metal3-chart/charts/ironic/values.yaml @@ -56,11 +56,11 @@ images: ironic: repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic pullPolicy: IfNotPresent - tag: 26.1.2.0 + tag: 26.1.2.2 ironicIPADownloader: repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic-ipa-downloader pullPolicy: IfNotPresent - tag: 3.0.0 + tag: 3.0.1 nameOverride: "" fullnameOverride: "" diff --git a/metal3-chart/charts/media/Chart.yaml b/metal3-chart/charts/media/Chart.yaml index 0028050..0d50533 100644 --- a/metal3-chart/charts/media/Chart.yaml +++ b/metal3-chart/charts/media/Chart.yaml @@ -3,4 +3,4 @@ appVersion: 1.16.0 description: A Helm chart for Media, used by Metal3 name: media type: application -version: 0.6.0 +version: 0.6.1 diff --git a/metal3-chart/charts/media/templates/tests/test-connection.yaml b/metal3-chart/charts/media/templates/tests/test-connection.yaml deleted file mode 100644 index f96c62c..0000000 --- a/metal3-chart/charts/media/templates/tests/test-connection.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: "{{ include "media.fullname" . }}-test-connection" - labels: - {{- include "media.labels" . | nindent 4 }} - annotations: - "helm.sh/hook": test -spec: - containers: - - name: wget - image: busybox - command: ['wget'] - args: ['{{ include "media.fullname" . }}:{{ .Values.service.port }}'] - restartPolicy: Never diff --git a/metal3-chart/charts/media/values.yaml b/metal3-chart/charts/media/values.yaml index 0a52c8f..bf93c3d 100644 --- a/metal3-chart/charts/media/values.yaml +++ b/metal3-chart/charts/media/values.yaml @@ -24,7 +24,7 @@ replicaCount: 1 image: repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic pullPolicy: IfNotPresent - tag: 26.1.2.0 + tag: 26.1.2.2 imagePullSecrets: [] nameOverride: "" diff --git a/metallb/_service b/metallb/_service index 5066257..e709ca2 100644 --- a/metallb/_service +++ b/metallb/_service @@ -12,10 +12,8 @@ yes \1 - - - *.tar - gz + + metallb.obsinfo diff --git a/metallb/metallb.spec b/metallb/metallb.spec index f59d4db..17316a4 100644 --- a/metallb/metallb.spec +++ b/metallb/metallb.spec @@ -22,7 +22,7 @@ Release: 0.14.8 Summary: Load Balancer for bare metal Kubernetes clusters License: Apache-2.0 URL: https://github.com/metallb/metallb -Source: %{name}-%{version}.tar.gz +Source: %{name}-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang(API) = 1.22 ExcludeArch: s390 diff --git a/nm-configurator/_service b/nm-configurator/_service index a83f874..5a481e9 100644 --- a/nm-configurator/_service +++ b/nm-configurator/_service @@ -9,7 +9,9 @@ \1 enable - + + nm-configurator.obsinfo + nm-configurator diff --git a/upgrade-controller/_service b/upgrade-controller/_service index 251bb05..3610179 100644 --- a/upgrade-controller/_service +++ b/upgrade-controller/_service @@ -9,10 +9,8 @@ \1.\2.\3 enable - - - *.tar - gz + + upgrade-controller.obsinfo gz diff --git a/upgrade-controller/upgrade-controller.spec b/upgrade-controller/upgrade-controller.spec index 2d7d586..d7cf993 100644 --- a/upgrade-controller/upgrade-controller.spec +++ b/upgrade-controller/upgrade-controller.spec @@ -22,7 +22,7 @@ Release: 0 Summary: Upgrade Controller License: Apache-2.0 URL: https://github.com/suse-edge/upgrade-controller -Source: upgrade-controller-%{version}.tar.gz +Source: upgrade-controller-%{version}.tar Source1: vendor.tar.gz BuildRequires: golang(API) go1.22 BuildRequires: golang-packaging