diff --git a/confluent_osdeploy/esxi7/profiles/hypervisor/kickstart b/confluent_osdeploy/esxi7/profiles/hypervisor/kickstart index 99c2934b..a5bed980 100644 --- a/confluent_osdeploy/esxi7/profiles/hypervisor/kickstart +++ b/confluent_osdeploy/esxi7/profiles/hypervisor/kickstart @@ -1,6 +1,5 @@ accepteula -clearpart --firstdisk --overwritevmfs -install --firstdisk --overwritevmfs +%include /tmp/storagecfg %include /tmp/ksnet %include /tmp/rootpw reboot diff --git a/confluent_osdeploy/esxi7/profiles/hypervisor/scripts/getinstalldisk b/confluent_osdeploy/esxi7/profiles/hypervisor/scripts/getinstalldisk new file mode 100644 index 00000000..6e3c710a --- /dev/null +++ b/confluent_osdeploy/esxi7/profiles/hypervisor/scripts/getinstalldisk @@ -0,0 +1,129 @@ +#!/usr/bin/python3 +import subprocess +import os + +class SilentException(Exception): + pass + +class DiskInfo(object): + def __init__(self, devname, devinfo): + self.name = devname + self.path = '/dev/' + devname + self.wwn = None + self.model = devinfo.get('model', 'Unknown') + self.driver = devinfo.get('adapter_driver', 'Unknown') + self.size = devinfo.get('size', 0) # in MiB + if not devinfo.get('is_local', False): + raise SilentException("Not local") + if devinfo.get('is_removable', False): + raise SilentException("Removable") + if devinfo.get('is_usb', False): + raise SilentException("USB device") + if devinfo.get('type', '').lower() in ('cd-rom',): + raise SilentException("CD-ROM device") + if self.size < 2048: + raise SilentException("Too small") + + + + + @property + def priority(self): + if self.model.lower() in ('m.2 nvme 2-bay raid kit', 'thinksystem_m.2_vd', 'thinksystem m.2', 'thinksystem_m.2'): + return 0 + if self.driver == 'vmw_ahci': + return 2 + if self.driver == 'nvme_pcie': + return 3 + return 99 + + def __repr__(self): + return repr({ + 'name': self.name, + 'path': self.path, + 'wwn': self.wwn, + 'driver': self.driver, + 'size': self.size, + 'model': self.model, + }) + +def list_disks(): + current_dev = None + disks = {} + devlist = subprocess.check_output(['localcli', 'storage', 'core', 'device', 'list']) + if not isinstance(devlist, str): + devlist = devlist.decode('utf8') + devbyadp = {} + for line in devlist.split('\n'): + if not line.strip(): + continue + if not line.startswith(' '): + current_dev = line.rsplit(':', 1)[0] + if current_dev not in disks: + disks[current_dev] = {} + elif current_dev: + if ' Model:' in line: + disks[current_dev]['model'] = ' '.join(line.split()[1:]) + elif ' Driver:' in line: + disks[current_dev]['driver'] = ' '.join(line.split()[1:]) + elif ' Is Local:' in line: + disks[current_dev]['is_local'] = ' '.join(line.split()[2:]).lower() == 'true' + elif ' Is Removable:' in line: + disks[current_dev]['is_removable'] = ' '.join(line.split()[2:]).lower() == 'true' + elif ' Size:' in line: # in MiB + disks[current_dev]['size'] = int(line.split()[1]) + elif ' Is SSD:' in line: + disks[current_dev]['is_ssd'] = ' '.join(line.split()[2:]).lower() == 'true' + elif ' Is USB:' in line: + disks[current_dev]['is_usb'] = ' '.join(line.split()[2:]).lower() == 'true' + elif ' Is Removable:' in line: + disks[current_dev]['is_removable'] = ' '.join(line.split()[2:]).lower() == 'true' + elif 'Device Type:' in line: + disks[current_dev]['type'] = ' '.join(line.split()[2:]) + for dev in disks: + pathlist = subprocess.check_output(['localcli', 'storage', 'core', 'path', 'list', '--device', dev]) + if not isinstance(pathlist, str): + pathlist = pathlist.decode('utf8') + for line in pathlist.split('\n'): + if not line.strip(): + continue + if not line.startswith(' '): + continue + if ' Adapter Identifier:' in line: + adpname = ' '.join(line.split()[2:]) + disks[dev]['adapter_id'] = adpname + elif ' Adapter:' in line: + adp = ' '.join(line.split()[1:]) + disks[dev]['adapter'] = adp + devbyadp.setdefault(adp, []).append(dev) + for adp in devbyadp: + adaplist = subprocess.check_output(['localcli', 'storage', 'core', 'adapter', 'listdetailed', '--adapter', adp]) + if not isinstance(adaplist, str): + adaplist = adaplist.decode('utf8') + for line in adaplist.split('\n'): + if not line.strip(): + continue + if 'Driver Name:' in line: + driver = ' '.join(line.split()[2:]) + for dev in devbyadp[adp]: + disks[dev]['adapter_driver'] = driver + return disks + +def main(): + disks = [] + alldisks = list_disks() + for disk in alldisks: + try: + disks.append(DiskInfo(disk, alldisks[disk])) + except SilentException: + pass + except Exception as e: + print("Skipping {0}: {1}".format(disk, str(e))) + nd = [x.name for x in sorted(disks, key=lambda x: [x.priority, x.size])] + if nd: + with open('/tmp/storagecfg', 'w') as sc: + sc.write(f'clearpart --all --drives={nd[0]} --overwritevmfs\n') + sc.write(f'install --drive={nd[0]} --overwritevmfs\n') + +if __name__ == '__main__': + main() diff --git a/confluent_osdeploy/esxi7/profiles/hypervisor/scripts/modinstall b/confluent_osdeploy/esxi7/profiles/hypervisor/scripts/modinstall index ed10f3f2..1907ef30 100644 --- a/confluent_osdeploy/esxi7/profiles/hypervisor/scripts/modinstall +++ b/confluent_osdeploy/esxi7/profiles/hypervisor/scripts/modinstall @@ -1,9 +1,11 @@ #!/bin/sh mv /etc/confluent/confluent.deploycfg /etc/confluent/confluent.newdeploycfg /opt/confluent/bin/apiclient /confluent-public/os/$profile/scripts/makeksnet >> /tmp/makeksnet +/opt/confluent/bin/apiclient /confluent-public/os/$profile/scripts/getinstalldisk >> /tmp/getinstalldisk mv /etc/confluent/confluent.newdeploycfg /etc/confluent/confluent.deploycfg chmod +x /tmp/makeksnet /tmp/makeksnet > /tmp/ksnet +python3 /tmp/getinstalldisk rootpw=$(grep ^rootpassword: /etc/confluent/confluent.deploycfg|sed -e 's/^rootpassword: //') echo rootpw --iscrypted $rootpw > /tmp/rootpw export BOOT_CMDLINE=ks=/etc/confluent/ks.cfg