add GenericArm support for SIG/AltArch

This commit is contained in:
Neil Hanlon 2023-05-16 14:03:30 -04:00
parent f473dbc010
commit 48a4171ebd
Signed by untrusted user: neil
GPG key ID: 705BC21EC3C70F34
2 changed files with 57 additions and 44 deletions

View file

@ -1,17 +1,17 @@
# All imports are here # All imports are here
import glob
import hashlib
import logging
import os import os
import platform import platform
import time import time
import glob
import rpm
import yaml
import logging
import hashlib
from collections import defaultdict from collections import defaultdict
from typing import Tuple from typing import Tuple
import rpm
import yaml
# An implementation from the Fabric python library # An implementation from the Fabric python library
class AttributeDict(defaultdict): class AttributeDict(defaultdict):
def __init__(self): def __init__(self):
@ -26,29 +26,31 @@ class AttributeDict(defaultdict):
def __setattr__(self, key, value): def __setattr__(self, key, value):
self[key] = value self[key] = value
# These are a bunch of colors we may use in terminal output # These are a bunch of colors we may use in terminal output
class Color: class Color:
RED = '\033[91m' RED = "\033[91m"
GREEN = '\033[92m' GREEN = "\033[92m"
PURPLE = '\033[95m' PURPLE = "\033[95m"
CYAN = '\033[96m' CYAN = "\033[96m"
DARKCYAN = '\033[36m' DARKCYAN = "\033[36m"
BLUE = '\033[94m' BLUE = "\033[94m"
YELLOW = '\033[93m' YELLOW = "\033[93m"
UNDERLINE = '\033[4m' UNDERLINE = "\033[4m"
BOLD = '\033[1m' BOLD = "\033[1m"
END = '\033[0m' END = "\033[0m"
INFO = '[' + BOLD + GREEN + 'INFO' + END + '] ' INFO = "[" + BOLD + GREEN + "INFO" + END + "] "
WARN = '[' + BOLD + YELLOW + 'WARN' + END + '] ' WARN = "[" + BOLD + YELLOW + "WARN" + END + "] "
FAIL = '[' + BOLD + RED + 'FAIL' + END + '] ' FAIL = "[" + BOLD + RED + "FAIL" + END + "] "
STAT = '[' + BOLD + CYAN + 'STAT' + END + '] ' STAT = "[" + BOLD + CYAN + "STAT" + END + "] "
# vars and additional checks # vars and additional checks
rldict = AttributeDict() rldict = AttributeDict()
sigdict = AttributeDict() sigdict = AttributeDict()
config = { config = {
"rlmacro": rpm.expandMacro('%rhel'), "rlmacro": rpm.expandMacro("%rhel"),
"dist": 'el' + rpm.expandMacro('%rhel'), "dist": "el" + rpm.expandMacro("%rhel"),
"arch": platform.machine(), "arch": platform.machine(),
"date_stamp": time.strftime("%Y%m%d.%H%M%S", time.localtime()), "date_stamp": time.strftime("%Y%m%d.%H%M%S", time.localtime()),
"compose_root": "/mnt/compose", "compose_root": "/mnt/compose",
@ -66,24 +68,25 @@ config = {
"aarch64": "arm64", "aarch64": "arm64",
"ppc64le": "ppc64le", "ppc64le": "ppc64le",
"s390x": "s390x", "s390x": "s390x",
"i686": "386" "i686": "386",
}, },
"aws_region": "us-east-2", "aws_region": "us-east-2",
"bucket": "resf-empanadas", "bucket": "resf-empanadas",
"bucket_url": "https://resf-empanadas.s3.us-east-2.amazonaws.com" "bucket_url": "https://resf-empanadas.s3.us-east-2.amazonaws.com",
} }
# Importing the config from yaml # Importing the config from yaml
import importlib_resources import importlib_resources
_rootdir = importlib_resources.files("empanadas") _rootdir = importlib_resources.files("empanadas")
for conf in glob.iglob(f"{_rootdir}/configs/*.yaml"): for conf in glob.iglob(f"{_rootdir}/configs/*.yaml"):
with open(conf, 'r', encoding="utf-8") as file: with open(conf, "r", encoding="utf-8") as file:
rldict.update(yaml.safe_load(file)) rldict.update(yaml.safe_load(file))
# Import all SIG configs from yaml # Import all SIG configs from yaml
for conf in glob.iglob(f"{_rootdir}/sig/*.yaml"): for conf in glob.iglob(f"{_rootdir}/sig/*.yaml"):
with open(conf, 'r', encoding="utf-8") as file: with open(conf, "r", encoding="utf-8") as file:
sigdict.update(yaml.safe_load(file)) sigdict.update(yaml.safe_load(file))
# The system needs to be a RHEL-like system. It cannot be Fedora or SuSE. # The system needs to be a RHEL-like system. It cannot be Fedora or SuSE.
@ -110,7 +113,10 @@ ALLOWED_TYPE_VARIANTS = {
"Vagrant": ["Libvirt", "Vbox", "VMware"], "Vagrant": ["Libvirt", "Vbox", "VMware"],
"OCP": ["Base"], "OCP": ["Base"],
"RPI": None, "RPI": None,
"GenericArm": ["Minimal"],
} }
def valid_type_variant(_type: str, variant: str = "") -> bool: def valid_type_variant(_type: str, variant: str = "") -> bool:
if _type not in ALLOWED_TYPE_VARIANTS: if _type not in ALLOWED_TYPE_VARIANTS:
raise Exception(f"Type is invalid: ({_type}, {variant})") raise Exception(f"Type is invalid: ({_type}, {variant})")
@ -120,11 +126,18 @@ def valid_type_variant(_type: str, variant: str="") -> bool:
return True return True
if variant not in ALLOWED_TYPE_VARIANTS[_type]: if variant not in ALLOWED_TYPE_VARIANTS[_type]:
if variant and variant.capitalize() in ALLOWED_TYPE_VARIANTS[_type]: if variant and variant.capitalize() in ALLOWED_TYPE_VARIANTS[_type]:
raise Exception(f"Capitalization mismatch. Found: ({_type}, {variant}). Expected: ({_type}, {variant.capitalize()})") raise Exception(
raise Exception(f"Type/Variant Combination is not allowed: ({_type}, {variant})") f"Capitalization mismatch. Found: ({_type}, {variant}). Expected: ({_type}, {variant.capitalize()})"
)
raise Exception(
f"Type/Variant Combination is not allowed: ({_type}, {variant})"
)
return True return True
from attrs import define, field from attrs import define, field
@define(kw_only=True) @define(kw_only=True)
class Architecture: class Architecture:
name: str = field() name: str = field()

View file

@ -133,7 +133,7 @@ class ImageBuild:
["cp", lambda: f"{STORAGE_DIR}/{self.target_uuid}.body", f"{self.outdir}/{self.outname}.raw"], ["cp", lambda: f"{STORAGE_DIR}/{self.target_uuid}.body", f"{self.outdir}/{self.outname}.raw"],
["xz", f"{self.outdir}/{self.outname}.raw"] ["xz", f"{self.outdir}/{self.outname}.raw"]
] ]
if self.image_type in ["GenericCloud", "OCP"]: if self.image_type in ["GenericCloud", "OCP", "GenericArm"]:
self.stage_commands = [ self.stage_commands = [
["qemu-img", "convert", "-c", "-f", "raw", "-O", "qcow2", lambda: f"{STORAGE_DIR}/{self.target_uuid}.body", f"{self.outdir}/{self.outname}.qcow2"] ["qemu-img", "convert", "-c", "-f", "raw", "-O", "qcow2", lambda: f"{STORAGE_DIR}/{self.target_uuid}.body", f"{self.outdir}/{self.outname}.qcow2"]
] ]
@ -244,7 +244,7 @@ class ImageBuild:
args = [] args = []
if self.image_type in ["Container"]: if self.image_type in ["Container"]:
args = ["--parameter", "offline_icicle", "true"] args = ["--parameter", "offline_icicle", "true"]
if self.image_type in ["GenericCloud", "EC2", "Vagrant", "Azure", "OCP", "RPI"]: if self.image_type in ["GenericCloud", "EC2", "Vagrant", "Azure", "OCP", "RPI", "GenericArm"]:
args = ["--parameter", "generate_icicle", "false"] args = ["--parameter", "generate_icicle", "false"]
return args return args