Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Insert generated image.json into the ostree commit #2811

Merged
merged 3 commits into from
Apr 29, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pytest.ini
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
[pytest]
addopts = --cov=cosalib.cli --cov=cosalib.meta --cov=cosalib.cmdlib --cov-report term --cov-fail-under=80
addopts = --cov=cosalib.cli --cov=cosalib.meta --cov=cosalib.cmdlib --cov-report term --cov-fail-under=75
22 changes: 10 additions & 12 deletions src/cmd-buildextend-live
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import time

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from cosalib.builds import Builds
from cosalib.cmdlib import run_verbose, sha256sum_file, generate_image_json
from cosalib.cmdlib import run_verbose, sha256sum_file, extract_image_json
from cosalib.cmdlib import import_ostree_commit, get_basearch, ensure_glob
from cosalib.meta import GenericBuildMeta

Expand Down Expand Up @@ -46,9 +46,6 @@ if not args.build:
args.build = builds.get_latest()
print(f"Targeting build: {args.build}")

image_json = generate_image_json('src/config/image.yaml')
squashfs_compression = 'lz4' if args.fast else image_json['squashfs-compression']

srcdir_prefix = "src/config/live/"

if not os.path.isdir(srcdir_prefix):
Expand All @@ -58,6 +55,15 @@ workdir = os.path.abspath(os.getcwd())
builddir = builds.get_build_dir(args.build)
buildmeta_path = os.path.join(builddir, 'meta.json')
buildmeta = GenericBuildMeta(workdir=workdir, build=args.build)
repo = os.path.join(workdir, 'tmp/repo')

# Grab the commit hash for this build
buildmeta_commit = buildmeta['ostree-commit']

import_ostree_commit(repo, builddir, buildmeta)

image_json = extract_image_json(repo, buildmeta_commit)
squashfs_compression = 'lz4' if args.fast else image_json['squashfs-compression']

base_name = buildmeta['name']
if base_name == "rhcos" and args.fast:
Expand All @@ -71,12 +77,6 @@ if os.path.exists(build_semaphore):
raise Exception(
f"{build_semaphore} exists: another process is building live")


# Grab the commit hash for this build
buildmeta_commit = buildmeta['ostree-commit']

repo = os.path.join(workdir, 'tmp/repo')

# Don't run if it's already been done, unless forced
if 'live-iso' in buildmeta['images'] and not args.force:
print(f"'live' has already been built for {args.build}. Skipping.")
Expand Down Expand Up @@ -696,8 +696,6 @@ boot
print(f"Updated: {buildmeta_path}")


import_ostree_commit(repo, builddir, buildmeta)

# lock and build
with open(build_semaphore, 'w') as f:
f.write(f"{time.time_ns()}")
Expand Down
3 changes: 3 additions & 0 deletions src/cmd-buildextend-metal
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,9 @@ ostree_repo=${tmprepo}
# Ensure that we have the cached unpacked commit
import_ostree_commit_for_build "${build}"

image_json=image.json
extract_image_json "${tmprepo}" "${commit}" > "${image_json}"

image_format=raw
if [[ $image_type == qemu ]]; then
image_format=qcow2
Expand Down
21 changes: 21 additions & 0 deletions src/cmdlib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,13 @@ EOF
done
fi

local imagejsondir="${tmp_overridesdir}/imagejson"
export ostree_image_json="/usr/share/coreos-assembler/image.json"
mkdir -p "${imagejsondir}/usr/share/coreos-assembler/"
cp "${image_json}" "${imagejsondir}${ostree_image_json}"
commit_overlay cosa-image-json "${imagejsondir}"
layers="${layers} cosa-image-json"

local_overrides_lockfile="${tmp_overridesdir}/local-overrides.json"
if [ -n "${with_cosa_overrides}" ] && [[ -n $(ls "${overridesdir}/rpm/"*.rpm 2> /dev/null) ]]; then
(cd "${overridesdir}"/rpm && rm -rf .repodata && createrepo_c .)
Expand Down Expand Up @@ -874,6 +881,7 @@ builds.bump_timestamp()
print('Build ${buildid} was inserted ${arch:+for $arch}')")
}

# Prepare the image.json as part of an ostree image build
write_image_json() {
local srcfile=$1; shift
local outfile=$1; shift
Expand All @@ -884,6 +892,19 @@ from cosalib import cmdlib
cmdlib.write_image_json('${srcfile}', '${outfile}')")
}

# Fetch the image.json from the ostree commit to stdout.
# Should be used by disk image builds.
extract_image_json() {
local repo=$1; shift
local commit=$1; shift
(python3 -c "
import sys, json
sys.path.insert(0, '${DIR}')
from cosalib import cmdlib
json.dump(cmdlib.extract_image_json('${repo}', '${commit}'), sys.stdout, sort_keys=True)
")
}

# Shell wrapper for the Python import_ostree_commit
import_ostree_commit_for_build() {
local buildid=$1; shift
Expand Down
10 changes: 10 additions & 0 deletions src/cosalib/cmdlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -350,10 +350,20 @@ def cmdlib_sh(script):
'''])


# Should be used by disk image builds to extract the image.json from the
# ostree commit.
def extract_image_json(repo, commit):
out = subprocess.check_output(['ostree', f'--repo={repo}', 'cat', commit, '/usr/share/coreos-assembler/image.json'])
return json.loads(out)


def generate_image_json(srcfile):
r = yaml.safe_load(open("/usr/lib/coreos-assembler/image-default.yaml"))
for k, v in flatten_image_yaml(srcfile).items():
r[k] = v
# Serialize our default GRUB config
with open("/usr/lib/coreos-assembler/grub.cfg") as f:
r['grub-script'] = f.read()
return r


Expand Down
4 changes: 2 additions & 2 deletions src/cosalib/ova.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
sys.path.insert(0, f"{cosa_dir}/cosalib")
sys.path.insert(0, cosa_dir)

from cosalib.cmdlib import generate_image_json, image_info
from cosalib.cmdlib import extract_image_json, image_info
from cosalib.qemuvariants import QemuVariantImage


Expand Down Expand Up @@ -86,7 +86,7 @@ def generate_ovf_parameters(self, vmdk, cpu=2, memory=4096):
Returns a dictionary with the parameters needed to create an OVF file
based on the qemu, vmdk, image.yaml, and info from the build metadata
"""
image_json = generate_image_json('src/config/image.yaml')
image_json = extract_image_json(os.path.join(self._workdir, 'tmp/repo'), self.meta['ostree-commit'])

system_type = 'vmx-{}'.format(image_json['vmware-hw-version'])
os_type = image_json['vmware-os-type']
Expand Down
6 changes: 5 additions & 1 deletion src/cosalib/qemuvariants.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
get_basearch,
image_info,
run_verbose,
sha256sum_file
sha256sum_file,
import_ostree_commit
)

# BASEARCH is the current machine architecture
Expand Down Expand Up @@ -183,6 +184,9 @@ def __init__(self, **kwargs):

_Build.__init__(self, **kwargs)

repo = os.path.join(self._workdir, 'tmp/repo')
import_ostree_commit(repo, self._tmpdir, self.meta)

@property
def image_qemu(self):
"""
Expand Down
2 changes: 1 addition & 1 deletion src/create_disk.sh
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ install_grub_cfg() {
# 0700 to match the RPM permissions which I think are mainly in case someone has
# manually set a grub password
mkdir -p -m 0700 $rootfs/boot/grub2
cp -v $grub_script $rootfs/boot/grub2/grub.cfg
printf "%s" "$grub_script" > $rootfs/boot/grub2/grub.cfg
}

# Other arch-specific bootloader changes
Expand Down
1 change: 0 additions & 1 deletion src/image-default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ bootfs: "ext4"
rootfs: "xfs"
# Add arguments here that will be passed to e.g. mkfs.xfs
rootfs-args: ""
grub-script: "/usr/lib/coreos-assembler/grub.cfg"

# Additional default kernel arguments injected into disk images
extra-kargs: []
Expand Down