From 4aafd31ed00fc21dbe099152fc0e1d6059eb571e Mon Sep 17 00:00:00 2001 From: wangyueliang Date: Sun, 28 Apr 2024 16:18:50 +0800 Subject: [PATCH] cmd/coreos-assembler: Improve exception handling [upstream] 0a69b3750fdbb7ddd2977502f8cb2c31dda89340 fce1d6cc666fbadeaa6ef1d0687d4603570eeb68 aa55d188cbcfc405b8dd537d553f4d515e1c43e5 aa944b8f6c70cfb2f6aaa2ff5250b170b1b59ab7 d82d501cd2707e4ffb5b0286adeb7927cc178908 --- cmd/coreos-assembler.go | 30 ++++++++---- ... => cmd-buildextend-hashlist-experimental} | 46 +++++++++++-------- 2 files changed, 47 insertions(+), 29 deletions(-) rename src/{cmd-generate-hashlist => cmd-buildextend-hashlist-experimental} (80%) diff --git a/cmd/coreos-assembler.go b/cmd/coreos-assembler.go index 1e2ffe7d..0bc23a82 100644 --- a/cmd/coreos-assembler.go +++ b/cmd/coreos-assembler.go @@ -13,9 +13,9 @@ import ( // commands we'd expect to use in the local dev path var buildCommands = []string{"init", "fetch", "build", "run", "prune", "clean", "list"} -var advancedBuildCommands = []string{"buildfetch", "buildupload", "oc-adm-release", "push-container", "upload-oscontainer"} -var buildextendCommands = []string{"aliyun", "aws", "azure", "digitalocean", "exoscale", "gcp", "ibmcloud", "kubevirt", "legacy-oscontainer", "live", "metal", "metal4k", "nutanix", "openstack", "qemu", "secex", "virtualbox", "vmware", "vultr"} -var utilityCommands = []string{"aws-replicate", "build-extensions-container", "compress", "generate-hashlist", "koji-upload", "kola", "remote-build-container", "remote-prune", "remote-session", "sign", "tag", "update-variant"} +var advancedBuildCommands = []string{"buildfetch", "buildupload", "oc-adm-release", "push-container", "upload-oscontainer", "buildextend-extensions"} +var buildextendCommands = []string{"aliyun", "aws", "azure", "digitalocean", "exoscale", extensions-container, "gcp", "hashlist-experimental", "ibmcloud", "kubevirt", "legacy-oscontainer", "live", "metal", "metal4k", "nutanix", "openstack", "qemu", "secex", "virtualbox", "vmware", "vultr"} +var utilityCommands = []string{"aws-replicate", "compress", "koji-upload", "kola", "remote-build-container", "remote-prune", "remote-session", "sign", "tag", "update-variant"} var otherCommands = []string{"shell", "meta"} func init() { @@ -38,8 +38,12 @@ func wrapCommandErr(err error) error { func printCommands(title string, cmds []string) { fmt.Printf("%s:\n", title) + var prefix string + if title == "Platform builds" { + prefix = "buildextend-" + } for _, cmd := range cmds { - fmt.Printf(" %s\n", cmd) + fmt.Printf(" %s%s\n", prefix, cmd) } } @@ -63,7 +67,7 @@ func run(argv []string) error { argv = argv[1:] } - if cmd == "" { + if cmd == "" || cmd == "--help" { printUsage() os.Exit(1) } @@ -88,7 +92,8 @@ func run(argv []string) error { return runUpdateVariant(argv) case "remote-session": return runRemoteSession(argv) - case "build-extensions-container": + case "build-extensions-container", // old alias + "buildextend-extensions-container": return buildExtensionContainer() } @@ -106,7 +111,8 @@ func run(argv []string) error { c.Stdout = os.Stdout c.Stderr = os.Stderr if err := c.Run(); err != nil { - return fmt.Errorf("failed to execute cmd-%s: %w", cmd, err) + fmt.Fprintf(os.Stderr, "failed to execute cmd-%s: %v\n", cmd, err.Error()) + return err } return nil } @@ -187,7 +193,13 @@ func initializeGlobalState(argv []string) error { func main() { err := run(os.Args[1:]) if err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) + if exitErr, ok := err.(*exec.ExitError); ok { + // In this case the command we ran gave a non-zero exit + // code. Let's also exit with that exit code. + os.Exit(exitErr.ExitCode()) + } else { + fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) + } } } diff --git a/src/cmd-generate-hashlist b/src/cmd-buildextend-hashlist-experimental similarity index 80% rename from src/cmd-generate-hashlist rename to src/cmd-buildextend-hashlist-experimental index 3164bf97..5c3fb43a 100755 --- a/src/cmd-generate-hashlist +++ b/src/cmd-buildextend-hashlist-experimental @@ -9,6 +9,7 @@ import argparse import datetime import json import os +import shutil import subprocess import sys import tempfile @@ -17,6 +18,7 @@ cosa_dir = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, cosa_dir) from cosalib import meta +from cosalib.builds import Builds from cosalib.cmdlib import ( ensure_glob, get_basearch, @@ -78,16 +80,23 @@ class HashListV1(dict): :raises: IndexError """ checkout = 'tmp/repo/tmp/keylime-checkout' + if os.path.isdir(checkout): + shutil.rmtree(checkout) import_ostree_commit( os.getcwd(), self._metadata.build_dir, - self._metadata, - force=True) + self._metadata) subprocess.check_call([ 'ostree', 'checkout', '--repo=tmp/repo', '-U', self._metadata['ostree-commit'], checkout]) + # Make all dirs in 'tmp' checkout readable. + # 'find' can't recurse into tmp dir files, we add 'x' so that it can recurse into it. + # With '+', 'find' accumulates paths and runs 'chmod' once (or batched by the arg limit). + # To 'chmod' the dir before it tries to recurse into it, we use ';'. + subprocess.check_call(['find', checkout, '-type', 'd', '-exec', + 'chmod', 'u+rwx', '{}', ';']) self.hash_from_path(checkout) # Extract initramfs contents @@ -97,20 +106,12 @@ class HashListV1(dict): initramfs_path = os.path.realpath(initramfs_path) with tempfile.TemporaryDirectory() as tmpdir: - skipcpio = subprocess.Popen( - ['/usr/lib/dracut/skipcpio', initramfs_path], - stdout=subprocess.PIPE) - gunzip = subprocess.Popen( - ['gunzip', '-c'], - stdin=skipcpio.stdout, - stdout=subprocess.PIPE) - cpio = subprocess.Popen( - ['cpio', '-idmv'], - stdin=gunzip.stdout, - cwd=tmpdir) - cpio.wait(timeout=300) # timeout of 5 minutes + subprocess.check_call(['lsinitrd', '--unpack', initramfs_path], + cwd=tmpdir) self.hash_from_path(tmpdir) + shutil.rmtree(checkout) + def hash_from_path(self, toppath): """ Create hashes from files starting at a specific path. @@ -127,7 +128,6 @@ class HashListV1(dict): filepath = os.path.join(dirpath, fname) # Skip symlinks if os.path.islink(filepath): - print(f'Skipping symlink {filepath}') continue try: filehash = sha256sum_file(filepath) @@ -146,6 +146,8 @@ class HashListV1(dict): """ with open(output, 'w') as out: out.write(json.dumps(self, indent=4)) + with open(f'{output}-CHECKSUM', 'w') as out: + subprocess.check_call(['sha256sum', output], stdout=out) def main(): @@ -165,13 +167,17 @@ def main(): parser.add_argument( '-a', '--arch', default=get_basearch(), help='Target Architecture') - parser.add_argument( - '-o', '--output', - help='Where the output should be written', default='hashlist.json') + parser.add_argument('-b', '--build', default='latest', help='Target build') # Parse arguments and ignore anything we didn't explicitly request args = parser.parse_args() + builds = Builds() + builddir = builds.get_build_dir(build_id=args.build, basearch=args.arch) + + # it's not in the schema nor in meta.json yet + output = os.path.join(builddir, "exp-hash.json") + # Load metadata metadata = meta.GenericBuildMeta(schema=None, basearch=args.arch) @@ -183,8 +189,8 @@ def main(): hashlist.populate_hash_list() # Step 2: Write the hashlist to disk - hashlist.write(args.output) - print(f'Hash list created at {args.output}') + hashlist.write(output) + print(f'Hash list created at {output}') if __name__ == '__main__': -- Gitee