fix: azure needs special handling
This commit is contained in:
parent
d349dff365
commit
85a28fa8fb
@ -23,7 +23,7 @@ temp = AttributeDict(
|
|||||||
"Azure": {
|
"Azure": {
|
||||||
"kiwiType": "oem",
|
"kiwiType": "oem",
|
||||||
"kiwiProfile": "Cloud-Azure",
|
"kiwiProfile": "Cloud-Azure",
|
||||||
"fileType": "qcow2",
|
"fileType": "raw", # post-converted into vhd on MB boundary
|
||||||
"outputKey": "disk_format_image",
|
"outputKey": "disk_format_image",
|
||||||
},
|
},
|
||||||
"OCP": {
|
"OCP": {
|
||||||
@ -135,6 +135,15 @@ class KiwiBackend(BackendInterface):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
|
# TODO(neil): refactor
|
||||||
|
if self.ctx.image_type == 'Azure':
|
||||||
|
try:
|
||||||
|
utils.resize_and_convert_raw_image_to_vhd(dest, self.ctx.outdir)
|
||||||
|
# Remove old raw image
|
||||||
|
pathlib.Path(f"{self.ctx.outdir}/{self.ctx.outname}.raw").unlink()
|
||||||
|
except Exception as e:
|
||||||
|
raise e
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
ret, out, err = self.run_mock_command(["--shell", "rm", "-fr", f"/builddir/{self.ctx.outdir}/build/"])
|
ret, out, err = self.run_mock_command(["--shell", "rm", "-fr", f"/builddir/{self.ctx.outdir}/build/"])
|
||||||
return ret
|
return ret
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
|
import json
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
import pathlib
|
import pathlib
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
from typing import Callable, List, Tuple, Union
|
from typing import Callable, List, Tuple, Union
|
||||||
|
|
||||||
@ -11,6 +15,16 @@ 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]
|
||||||
|
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
log.setLevel(logging.INFO)
|
||||||
|
handler = logging.StreamHandler(sys.stdout)
|
||||||
|
handler.setLevel(logging.INFO)
|
||||||
|
formatter = logging.Formatter(
|
||||||
|
'%(asctime)s :: %(name)s :: %(message)s',
|
||||||
|
'%Y-%m-%d %H:%M:%S'
|
||||||
|
)
|
||||||
|
handler.setFormatter(formatter)
|
||||||
|
log.addHandler(handler)
|
||||||
|
|
||||||
|
|
||||||
def render_template(path, template, **kwargs) -> pathlib.Path:
|
def render_template(path, template, **kwargs) -> pathlib.Path:
|
||||||
@ -80,3 +94,46 @@ def remove_first_directory(path):
|
|||||||
# For a relative path, simply skip the first part
|
# For a relative path, simply skip the first part
|
||||||
new_path = pathlib.Path(*p.parts[1:])
|
new_path = pathlib.Path(*p.parts[1:])
|
||||||
return new_path
|
return new_path
|
||||||
|
|
||||||
|
|
||||||
|
def resize_and_convert_raw_image_to_vhd(raw_image_path, outdir=None):
|
||||||
|
log.info(f"Will resize and convert {raw_image_path}")
|
||||||
|
MB = 1024 * 1024 # For calculations - 1048576 bytes
|
||||||
|
|
||||||
|
if outdir is None:
|
||||||
|
outdir = os.getcwd()
|
||||||
|
|
||||||
|
# Ensure the output directory exists
|
||||||
|
pathlib.Path(outdir).mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# Getting the size of the raw image
|
||||||
|
result = subprocess.run(['qemu-img', 'info', '-f', 'raw', '--output', 'json', raw_image_path], capture_output=True, text=True)
|
||||||
|
if result.returncode != 0:
|
||||||
|
log.error("Error getting image info")
|
||||||
|
raise Exception(result)
|
||||||
|
|
||||||
|
image_info = json.loads(result.stdout)
|
||||||
|
size = int(image_info['virtual-size'])
|
||||||
|
|
||||||
|
# Calculate the new size rounded to the nearest MB
|
||||||
|
rounded_size = ((size + MB - 1) // MB) * MB
|
||||||
|
|
||||||
|
# Prepare output filename (.raw replaced by .vhd)
|
||||||
|
outfilename = pathlib.Path(raw_image_path).name.replace("raw", "vhd")
|
||||||
|
outfile = os.path.join(outdir, outfilename)
|
||||||
|
|
||||||
|
# Resize the image
|
||||||
|
log.info(f"Resizing {raw_image_path} to nearest MB boundary")
|
||||||
|
result = subprocess.run(['qemu-img', 'resize', '-f', 'raw', raw_image_path, str(rounded_size)])
|
||||||
|
if result.returncode != 0:
|
||||||
|
log.error("Error resizing image")
|
||||||
|
raise Exception(result)
|
||||||
|
|
||||||
|
# Convert the image
|
||||||
|
log.info(f"Converting {raw_image_path} to vhd")
|
||||||
|
result = subprocess.run(['qemu-img', 'convert', '-f', 'raw', '-o', 'subformat=fixed,force_size', '-O', 'vpc', raw_image_path, outfile])
|
||||||
|
if result.returncode != 0:
|
||||||
|
log.error("Error converting image to VHD format")
|
||||||
|
raise Exception(result)
|
||||||
|
|
||||||
|
log.info(f"Image converted and saved to {outfile}")
|
||||||
|
Loading…
Reference in New Issue
Block a user