add EC2, Vagrant, Azure, OCP; upload step

This commit is contained in:
Neil Hanlon 2024-05-08 00:27:35 -04:00
parent 59e613fdcc
commit f85030a7b1
Signed by: neil
GPG Key ID: 705BC21EC3C70F34
5 changed files with 66 additions and 35 deletions

View File

@ -149,8 +149,7 @@ class ImageFactoryBackend(BackendInterface):
if (res := all(ret > 0 for ret in returns) > 0): if (res := all(ret > 0 for ret in returns) > 0):
raise Exception(res) raise Exception(res)
ret = self.copy() return 0
return ret
def checkout_kickstarts(self) -> int: def checkout_kickstarts(self) -> int:
cmd = ["git", "clone", "--branch", f"r{self.ctx.architecture.major}", cmd = ["git", "clone", "--branch", f"r{self.ctx.architecture.major}",
@ -291,3 +290,29 @@ class ImageFactoryBackend(BackendInterface):
if self.stage_commands: if self.stage_commands:
self.stage_commands.append(["cp", "-v", lambda: f"{STORAGE_DIR}/{self.target_uuid}.meta", f"{self.ctx.outdir}/build.meta"]) self.stage_commands.append(["cp", "-v", lambda: f"{STORAGE_DIR}/{self.target_uuid}.meta", f"{self.ctx.outdir}/build.meta"])
def prepare_vagrant(self, options):
"""Setup the output directory for the Vagrant type variant, dropping templates as required"""
templates = {}
templates['Vagrantfile'] = self.ctx.tmplenv.get_template(f"vagrant/Vagrantfile.{self.ctx.variant}")
templates['metadata.json'] = self.ctx.tmplenv.get_template('vagrant/metadata.tmpl.json')
templates['info.json'] = self.ctx.tmplenv.get_template('vagrant/info.tmpl.json')
if self.ctx.variant == "VMware":
templates[f"{self.ctx.outname}.vmx"] = self.ctx.tmplenv.get_template('vagrant/vmx.tmpl')
if self.ctx.variant == "Vbox":
templates['box.ovf'] = self.ctx.tmplenv.get_template('vagrant/box.tmpl.ovf')
if self.ctx.variant == "Libvirt":
# Libvirt vagrant driver expects the qcow2 file to be called box.img.
qemu_command_index = [i for i, d in enumerate(self.stage_commands) if d[0] == "qemu-img"][0]
self.stage_commands.insert(qemu_command_index+1, ["mv", f"{self.ctx.outdir}/{self.ctx.outname}.qcow2", f"{self.ctx.outdir}/box.img"])
for name, template in templates.items():
utils.render_template(f"{self.ctx.outdir}/{name}", template,
name=self.ctx.outname,
arch=self.ctx.architecture.name,
options=options
)

View File

@ -20,11 +20,35 @@ import sys
# TODO(neil): this should be part of the config, somewhere # TODO(neil): this should be part of the config, somewhere
temp = AttributeDict( temp = AttributeDict(
{ {
"Azure": {
"kiwiType": "oem",
"kiwiProfile": "Cloud-Azure",
"fileType": "qcow2",
"outputKey": "disk_format_image",
},
"OCP": {
"kiwiType": "oem",
"kiwiProfile": "Cloud-OCP",
"fileType": "qcow2",
"outputKey": "disk_format_image",
},
"GenericCloud": { "GenericCloud": {
"kiwiType": "oem", "kiwiType": "oem",
"kiwiProfile": "Cloud-GenericCloud", "kiwiProfile": "Cloud-GenericCloud",
"fileType": "qcow2", "fileType": "qcow2",
"outputKey": "disk_format_image" "outputKey": "disk_format_image",
},
"EC2": {
"kiwiType": "oem",
"kiwiProfile": "Cloud-EC2",
"fileType": "qcow2",
"outputKey": "disk_format_image",
},
"Vagrant": {
"kiwiType": "oem",
"kiwiProfile": "Vagrant",
"fileType": "box",
"outputKey": "disk_format_image",
}, },
"Container": { "Container": {
"kiwiType": "oci", "kiwiType": "oci",
@ -117,7 +141,7 @@ class KiwiBackend(BackendInterface):
def run_mock_command(self, mock_command: List[str]): def run_mock_command(self, mock_command: List[str]):
mock_args = ["--configdir", "/workdir/mock-rocky-configs/etc/mock", "-r", f"rl-9-{self.ctx.architecture.name}-core-infra"] mock_args = ["--configdir", "/workdir/mock-rocky-configs/etc/mock", "-r", f"rl-9-{self.ctx.architecture.name}-core-infra"]
if self.ctx.image_type == 'GenericCloud': if self.ctx.image_type != 'Container':
mock_args.append("--isolation=simple") mock_args.append("--isolation=simple")
command = [ command = [
"mock", "mock",

View File

@ -105,7 +105,7 @@ class ImageBuild: # pylint: disable=too-few-public-methods
) )
return template return template
def copy(self, skip=False) -> int: def upload(self, skip=False) -> int:
if not skip: if not skip:
self.log.info("Copying files to output directory") self.log.info("Copying files to output directory")
copy_command = ["aws", "s3", "cp", "--recursive", f"{self.outdir}/", copy_command = ["aws", "s3", "cp", "--recursive", f"{self.outdir}/",

View File

@ -11,33 +11,6 @@ BYTES_NONE_T = Union[bytes, None]
CMD_RESULT_T = Tuple[int, BYTES_NONE_T, BYTES_NONE_T, STR_NONE_T] CMD_RESULT_T = Tuple[int, BYTES_NONE_T, BYTES_NONE_T, STR_NONE_T]
# def prepare_vagrant(options):
# """Setup the output directory for the Vagrant type variant, dropping templates as required"""
# file_loader = FileSystemLoader(f"{_rootdir}/templates")
# tmplenv = Environment(loader=file_loader)
#
# templates = {}
# templates['Vagrantfile'] = tmplenv.get_template(f"vagrant/Vagrantfile.{self.variant}")
# templates['metadata.json'] = tmplenv.get_template('vagrant/metadata.tmpl.json')
# templates['info.json'] = tmplenv.get_template('vagrant/info.tmpl.json')
#
# if self.variant == "VMware":
# templates[f"{self.outname}.vmx"] = tmplenv.get_template('vagrant/vmx.tmpl')
#
# if self.variant == "Vbox":
# templates['box.ovf'] = tmplenv.get_template('vagrant/box.tmpl.ovf')
#
# if self.variant == "Libvirt":
# # Libvirt vagrant driver expects the qcow2 file to be called box.img.
# qemu_command_index = [i for i, d in enumerate(self.stage_commands) if d[0] == "qemu-img"][0]
# self.stage_commands.insert(qemu_command_index+1, ["mv", f"{self.outdir}/{self.outname}.qcow2", f"{self.outdir}/box.img"])
#
# for name, template in templates.items():
# self.render_template(f"{self.outdir}/{name}", template,
# name=self.outname,
# arch=self.architecture.name,
# options=options
# )
def render_template(path, template, **kwargs) -> pathlib.Path: def render_template(path, template, **kwargs) -> pathlib.Path:

View File

@ -35,6 +35,9 @@ parser.add_argument('--kube', action='store_true',
parser.add_argument('--timeout', type=str, parser.add_argument('--timeout', type=str,
help="change timeout for imagefactory build process", help="change timeout for imagefactory build process",
required=False, default='3600') required=False, default='3600')
parser.add_argument('--backend', type=str,
help="which backend to use (kiwi|imagefactory)",
required=False, default='kiwi')
results = parser.parse_args() results = parser.parse_args()
@ -65,9 +68,8 @@ def run():
arches = rlvars['allowed_arches'] if results.kube else [platform.uname().machine] arches = rlvars['allowed_arches'] if results.kube else [platform.uname().machine]
for architecture in arches: for architecture in arches:
if results.type in ["Container", "GenericCloud"]: if results.backend == "kiwi":
backend = KiwiBackend( backend = KiwiBackend()
)
else: else:
backend = ImageFactoryBackend( backend = ImageFactoryBackend(
kickstart_dir="kickstart" if results.kickstartdir else "os", kickstart_dir="kickstart" if results.kickstartdir else "os",
@ -104,3 +106,10 @@ def run():
method() method()
else: else:
log.fatal(f"Unable to execute {stage}") log.fatal(f"Unable to execute {stage}")
if 'upload' in skip_stages:
return
log.info("Final stage - Upload")
IB.upload(skip='upload' in skip_stages)