def createImage(options): (validImage, config) = verifyImageTypeAndConfig(options.config_file, options.img_name) if not validImage: raise Exception("Image type/config not supported") if 'ova' in config['artifacttype'] and shutil.which("ovftool") is None: raise Exception("ovftool is not available") install_config = config['installer'] image_type = config['image_type'] image_name = config.get('image_name', 'photon-' + image_type) workingDir = os.path.abspath(options.stage_path + "/" + image_type) if os.path.exists(workingDir) and os.path.isdir(workingDir): shutil.rmtree(workingDir) os.mkdir(workingDir) script_dir = os.path.dirname(os.path.realpath(__file__)) grub_script = replaceScript(script_dir, image_type, "mk-setup-grub.sh", options.installer_path) install_config['setup_grub_script'] = grub_script # Set absolute path for 'packagelist_file' if 'packagelist_file' in install_config: plf = install_config['packagelist_file'] if not plf.startswith('/'): plf = os.path.join(options.generated_data_path, plf) install_config['packagelist_file'] = plf os.chdir(workingDir) image_file = workingDir + "/" + image_name + ".raw" # Create disk image Utils.runshellcommand( "dd if=/dev/zero of={} bs=1024 seek={} count=0".format( image_file, config['size'] * 1024)) Utils.runshellcommand("chmod 755 {}".format(image_file)) if 'log_level' not in install_config: install_config['log_level'] = options.log_level install_config['search_path'] = [ os.path.abspath(os.path.join(script_dir, image_type)), os.path.abspath(script_dir), ] # Associating loopdevice to raw disk and save the name as a target's 'disk' install_config['disk'] = (Utils.runshellcommand( "losetup --show -f {}".format(image_file))).rstrip('\n') # No return value, it throws exception on error. runInstaller(options, install_config, workingDir) # Detaching loop device from vmdk Utils.runshellcommand("losetup -d {}".format(install_config['disk'])) os.chdir(script_dir) imagegenerator.createOutputArtifact(image_file, config, options.src_root, options.src_root + '/tools/bin/')
def createImage(options): (validImage, config) = verifyImageTypeAndConfig(options.config_file, options.img_name) if not validImage: raise Exception("Image type/config not supported") if 'ova' in config['artifacttype'] and shutil.which("ovftool") is None: raise Exception("ovftool is not available") install_config = config['installer'] image_type = config['image_type'] image_name = config.get('image_name', 'photon-' + image_type) workingDir = os.path.abspath(options.stage_path + "/" + image_type) if os.path.exists(workingDir) and os.path.isdir(workingDir): shutil.rmtree(workingDir) os.mkdir(workingDir) script_dir = os.path.dirname(os.path.realpath(__file__)) grub_script = replaceScript(script_dir, image_type, "mk-setup-grub.sh", options.installer_path) install_config['setup_grub_script'] = grub_script # Set absolute path for 'packagelist_file' if 'packagelist_file' in install_config: plf = install_config['packagelist_file'] if not plf.startswith('/'): plf = os.path.join(options.generated_data_path, plf) install_config['packagelist_file'] = plf os.chdir(workingDir) if 'log_level' not in install_config: install_config['log_level'] = options.log_level install_config['search_path'] = [ os.path.abspath(os.path.join(script_dir, image_type)), os.path.abspath(script_dir), ] if 'size' in config and 'disks' in config: raise Exception( "Both 'size' and 'disks' key should not be defined together.Please use 'disks' for defining multidisks only." ) elif 'size' in config: # 'BOOTDISK' key name doesn't matter. It is just a name given for better understanding config['disks'] = {"BOOTDISK": config['size']} elif 'disks' not in config: raise Exception("Disk size not defined!!") image_file = [] loop_device = {} # Create disk image for ndisk, k in enumerate(config['disks']): image_file.append(workingDir + "/" + image_name + "-" + str(ndisk) + ".raw") Utils.runshellcommand( "dd if=/dev/zero of={} bs=1024 seek={} count=0".format( image_file[ndisk], config['disks'].get(k) * 1024)) Utils.runshellcommand("chmod 755 {}".format(image_file[ndisk])) # Associating loopdevice to raw disk and save the name as a target's 'disk' loop_device[k] = (Utils.runshellcommand("losetup --show -f {}".format( image_file[ndisk]))).rstrip('\n') # Assigning first loop device as BOOTDISK install_config['disk'] = loop_device[next(iter(loop_device))] # Mapping the given disks to the partition table disk # Assigning the appropriate loop device to the partition 'disk' if 'partitions' in install_config: for partition in install_config['partitions']: if len(loop_device) == 1: partition['disk'] = install_config['disk'] elif 'disk' in partition: if partition['disk'] in loop_device.keys(): partition['disk'] = loop_device[partition['disk']] else: cleanup(loop_device.values(), image_file) raise Exception( "disk name:{} defined in partition table not found in list of 'disks'!!" .format(partition['disk'])) else: cleanup(loop_device.values(), image_file) raise Exception( "disk name must be defined in partition table for multidisks!!" ) # No return value, it throws exception on error. runInstaller(options, install_config, workingDir) # Detaching loop device from vmdk for loop_dev in loop_device.values(): Utils.runshellcommand("losetup -d {}".format(loop_dev)) os.chdir(script_dir) imagegenerator.createOutputArtifact(image_file, config, options.src_root, options.src_root + '/tools/bin/')