def commit(self): """Commit updates. By the time we get here, we assume: * volume name has been sanity checked * requested size has been checked """ assert self.deviceName, 'datastore device name not set' assert self.volumeName, 'datastore volume name not set' log.debug("DataStoreWindow.commit device %s volume %s" % (self.deviceName, self.volumeName)) # Check if drives to clear are in use; if so stop this madness. diskSet = devices.DiskSet() if self.deviceName == self.esxDeviceName: clearDrives = [self.deviceName] else: clearDrives = [self.deviceName, self.esxDeviceName] # presumably self.choseCreateNewDatastoreOnEsxDevice == False log.debug("Cleared drives = %s" % (', '.join(clearDrives))) volumePath = os.path.join('/vmfs/volumes', self.volumeName) if (os.path.exists(volumePath) or os.path.islink(volumePath)) \ and not checkForClearedVolume(clearDrives, self.datastoreSet, self.volumeName): log.debug("Volume name in use") self.setSubstepEnv({'next': self.warnInUse}) return # build partition requests, add to userchoices partition.addDefaultPartitionRequests(diskSet[self.esxDeviceName], False) if self.choseCreateNewDatastore: physicalRequests = [ (None, 100, 0, True, fsset.vmfs3FileSystem(self.volumeName)), ] dev = diskSet[self.deviceName] userchoices.addPhysicalPartitionRequests( self.deviceName, partition.createPartitionRequestSet(dev, physicalRequests)) userchoices.setClearPartitions(drives=clearDrives) userchoices.setEsxDatastoreDevice(dev.name) userchoices.setVmdkDatastore(self.volumeName) else: # use existing datastore userchoices.setClearPartitions(drives=[self.esxDeviceName]) userchoices.clearVirtualDevices() userchoices.setEsxDatastoreDevice(None) userchoices.setVmdkDatastore(self.volumeName) # size check size = partition.getRequestsSize(partition.getDefaultVirtualRequests()) if size > devices.runtimeActionFindMaxVmdkSize(): self.setSubstepEnv({'next': self.warnTooSmall}) return self.setSubstepEnv({'next': self.stepForward})
def getNext(self): global _deviceName, _vmfsVolume if self.xml.get_widget('DatastorecreateRadioButton').get_active(): if self.xml.get_widget('DatastoreCheckButton').get_active(): deviceName = self.defaultDeviceName else: deviceName = _deviceName if not deviceName: MessageWindow(None, 'Invalid Datastore Device', 'Specify a device for creating the datastore.') raise exception.StayOnScreen # Set the volume name for the new vmfs partition volumeName = self.xml.get_widget("DatastorenameEntry").get_text() try: fsset.vmfs3FileSystem.sanityCheckVolumeLabel(volumeName) except ValueError, msg: MessageWindow(None, "Datastore Name Invalid", msg[0]) raise exception.StayOnScreen # if we're using the same disk for the datastore that we're # using for installing esx, only clear one disk, otherwise # clear both if deviceName == self.defaultDeviceName or self.preserveVmfs: clearDrives = [deviceName] else: clearDrives = [deviceName, self.defaultDeviceName] volumePath = os.path.join('/vmfs/volumes', volumeName) if (os.path.exists(volumePath) or os.path.islink(volumePath)) \ and not checkForClearedVolume(clearDrives, self.datastoreSet, volumeName): MessageWindow(None, "Datastore Name Already Used", "The specified name is already used by another datastore. " "Specify a new name that is unique.") raise exception.StayOnScreen # if we're preserving the vmfs partition on a different drive # then we don't need the full set of partitions. if not self.preserveVmfs: partition.addDefaultPartitionRequests( self.diskSet[self.defaultDeviceName], False) physicalRequests = [ (None, 100, 0, True, fsset.vmfs3FileSystem(volumeName)), ] dev = self.diskSet[deviceName] userchoices.addPhysicalPartitionRequests(dev.name, partition.createPartitionRequestSet(dev, physicalRequests)) userchoices.setClearPartitions(drives=clearDrives) userchoices.setEsxDatastoreDevice(dev.name) userchoices.setVmdkDatastore(volumeName)
def commit(self): """Commit updates. By the time we get here, we assume: * volume name has been sanity checked * requested size has been checked """ assert self.deviceName, 'datastore device name not set' assert self.volumeName, 'datastore volume name not set' log.debug("DataStoreWindow.commit device %s volume %s" % (self.deviceName, self.volumeName)) # Check if drives to clear are in use; if so stop this madness. diskSet = devices.DiskSet() if self.deviceName == self.esxDeviceName: clearDrives = [self.deviceName] else: clearDrives = [self.deviceName, self.esxDeviceName] # presumably self.choseCreateNewDatastoreOnEsxDevice == False log.debug("Cleared drives = %s" % (', '.join(clearDrives))) volumePath = os.path.join('/vmfs/volumes', self.volumeName) if (os.path.exists(volumePath) or os.path.islink(volumePath)) \ and not checkForClearedVolume(clearDrives, self.datastoreSet, self.volumeName): log.debug("Volume name in use") self.setSubstepEnv({'next': self.warnInUse}) return # build partition requests, add to userchoices partition.addDefaultPartitionRequests(diskSet[self.esxDeviceName], False) if self.choseCreateNewDatastore: physicalRequests = [ (None, 100, 0, True, fsset.vmfs3FileSystem(self.volumeName)), ] dev = diskSet[self.deviceName] userchoices.addPhysicalPartitionRequests(self.deviceName, partition.createPartitionRequestSet(dev, physicalRequests)) userchoices.setClearPartitions(drives=clearDrives) userchoices.setEsxDatastoreDevice(dev.name) userchoices.setVmdkDatastore(self.volumeName) else: # use existing datastore userchoices.setClearPartitions(drives=[self.esxDeviceName]) userchoices.clearVirtualDevices() userchoices.setEsxDatastoreDevice(None) userchoices.setVmdkDatastore(self.volumeName) # size check size = partition.getRequestsSize(partition.getDefaultVirtualRequests()) if size > devices.runtimeActionFindMaxVmdkSize(): self.setSubstepEnv({'next': self.warnTooSmall}) return self.setSubstepEnv({'next': self.stepForward})
def testAddDefaultPartitionRequests(): setupDoubleDiskPartitions() diskSet = devices.DiskSet(forceReprobe=True) partition.addDefaultPartitionRequests(diskSet["vml.1111"]) partition.addDefaultPartitionRequests(diskSet["vml.1112"]) assert len(userchoices.getPhysicalPartitionRequestsDevices()) == 1 assert len(userchoices.getVirtualPartitionRequestsDevices()) == 1 assert len(userchoices.getVirtualDevices()) == 1 assert userchoices.getPhysicalPartitionRequestsDevices()[0] == \ 'vml.1112'
def addPartRequest(self): """Add the default partition request. May be configured for basic or advanced.""" self.popSubstep() # kludge, pop state from warn() # schedule default partition operation request = devices.DiskSet()[self.driveName] if self.partMode == 'basic': partition.addDefaultPartitionRequests(request) else: # partMode == 'advanced' partition.addDefaultPartitionRequests(request, addVirtualPartitions=False) # If ESX location is changing (or this is first time), tell # DataStoreWindow via userchoices so it can clear options. if self.driveName != userchoices.getEsxPhysicalDevice(): userchoices.setResetEsxLocation(True) else: userchoices.setResetEsxLocation(False) self.setSubstepEnv({'next': self.stepForward})
def addPartRequest(self): """Add the default partition request. May be configured for basic or advanced.""" self.popSubstep() # kludge, pop state from warn() # schedule default partition operation request = devices.DiskSet()[self.driveName] if self.partMode == 'basic': partition.addDefaultPartitionRequests(request) else: # partMode == 'advanced' partition.addDefaultPartitionRequests(request, addVirtualPartitions=False) # If ESX location is changing (or this is first time), tell # DataStoreWindow via userchoices so it can clear options. if self.driveName != userchoices.getEsxPhysicalDevice(): userchoices.setResetEsxLocation(True) else: userchoices.setResetEsxLocation(False) self.setSubstepEnv( {'next': self.stepForward } )
def getNext(self): haveMountPoint = bool(userchoices.getPartitionMountRequests()) userchoices.clearPhysicalPartitionRequests() userchoices.clearPartitionMountRequests() userchoices.clearExistingVmdkLocation() (model, diskIter) = self.view.get_selection().get_selected() if diskIter and model.get(diskIter, STORAGEVIEW_DISK_ENTRY)[0]: drive = model.get(diskIter, STORAGEVIEW_DISK_ENTRY)[0] log.debug("Selected drive %s" % (drive)) diskSet = devices.DiskSet() datastoreSet = datastore.DatastoreSet() rc = storage_widgets.promptDeviceHasExistingData(drive) if rc == storage_widgets.EXISTING_DATA_STAY_ON_SCREEN: raise exception.StayOnScreen elif rc == storage_widgets.EXISTING_DATA_PRESERVE_VMFS: vmdkPath = \ esxconf.runtimeActionExtractVmdkPathFromInitrd(drive) vmdkSize = \ devices.runtimeActionFindExistingVmdkSize(vmdkPath) log.debug("VMDK Size = %d Path = %s" % (vmdkSize, vmdkPath)) if vmdkSize > 0: vmdkCheckBox = True # only turn off the preserveVmdk check button if # we're on the install location screen since the user # can choose to put the vmdk on a different datastore # on the esxlocation screen if self.SCREEN_NAME == 'installlocation': ds = datastoreSet.getEntriesByDriveName(drive)[0] freeSize = ds.getFreeSize() / 1024 / 1024 requestSize = partition.getRequestsSize( partition.getDefaultVirtualRequests()) if freeSize + vmdkSize <= requestSize + VMFS_OVERHEAD: MessageWindow(None, "No Free Space", storage_widgets.COSVMDK_TOTALLY_FULL) raise exception.StayOnScreen elif freeSize < requestSize: vmdkCheckBox = False preserveVmdk = PreserveCosVmdkWindow(vmdkCheckBox).run() if preserveVmdk == -1: raise exception.StayOnScreen elif preserveVmdk == 1: pass else: userchoices.setExistingVmdkLocation(vmdkPath) # Set up virtual disk and settings datastore.preserveDatastoreOnDrive(drive) if self.SCREEN_NAME == 'esxlocation': userchoices.setEsxPhysicalDevice(drive) userchoices.setResetEsxLocation(True) elif rc == storage_widgets.EXISTING_DATA_CLEAR_DRIVE: if self.SCREEN_NAME == 'installlocation': partition.addDefaultPartitionRequests(diskSet[drive]) else: # clear out the datastore options if the user has changed # their mind about which drive to use -- this will get # changed back to false on the next screen if drive != userchoices.getEsxPhysicalDevice() or \ haveMountPoint: userchoices.setResetEsxLocation(True) else: userchoices.setResetEsxLocation(False) userchoices.setEsxPhysicalDevice(drive) else: raise ValueError, "Got unexpected return code" else: MessageWindow(self.controlState.gui.getWindow(), "Storage Selection Error", "You must select a place to install ESX.") raise exception.StayOnScreen
def getNext(self): global _deviceName, _vmfsVolume if self.xml.get_widget('DatastorecreateRadioButton').get_active(): if self.xml.get_widget('DatastoreCheckButton').get_active(): deviceName = self.defaultDeviceName else: deviceName = _deviceName if not deviceName: MessageWindow(None, 'Invalid Datastore Device', 'Specify a device for creating the datastore.') raise exception.StayOnScreen # Set the volume name for the new vmfs partition volumeName = self.xml.get_widget("DatastorenameEntry").get_text() try: fsset.vmfs3FileSystem.sanityCheckVolumeLabel(volumeName) except ValueError, msg: MessageWindow(None, "Datastore Name Invalid", msg[0]) raise exception.StayOnScreen # if we're using the same disk for the datastore that we're # using for installing esx, only clear one disk, otherwise # clear both if deviceName == self.defaultDeviceName or self.preserveVmfs: clearDrives = [deviceName] else: clearDrives = [deviceName, self.defaultDeviceName] volumePath = os.path.join('/vmfs/volumes', volumeName) if (os.path.exists(volumePath) or os.path.islink(volumePath)) \ and not checkForClearedVolume(clearDrives, self.datastoreSet, volumeName): MessageWindow( None, "Datastore Name Already Used", "The specified name is already used by another datastore. " "Specify a new name that is unique.") raise exception.StayOnScreen # if we're preserving the vmfs partition on a different drive # then we don't need the full set of partitions. if not self.preserveVmfs: partition.addDefaultPartitionRequests( self.diskSet[self.defaultDeviceName], False) physicalRequests = [ (None, 100, 0, True, fsset.vmfs3FileSystem(volumeName)), ] dev = self.diskSet[deviceName] userchoices.addPhysicalPartitionRequests( dev.name, partition.createPartitionRequestSet(dev, physicalRequests)) userchoices.setClearPartitions(drives=clearDrives) userchoices.setEsxDatastoreDevice(dev.name) userchoices.setVmdkDatastore(volumeName)
partition.createPartitionRequestSet(dev, physicalRequests)) userchoices.setClearPartitions(drives=clearDrives) userchoices.setEsxDatastoreDevice(dev.name) userchoices.setVmdkDatastore(volumeName) else: if not _vmfsVolume: MessageWindow( None, "Invalid Datastore", "No datastore has been selected. " "Select a datatore for ESX to use.") raise exception.StayOnScreen if not self.preserveVmfs: partition.addDefaultPartitionRequests( self.diskSet[self.defaultDeviceName], False) userchoices.setClearPartitions(drives=[self.defaultDeviceName]) userchoices.setEsxDatastoreDevice(None) userchoices.setVmdkDatastore(_vmfsVolume) # find the size of the virtual partitions and then remove the # size of any existing COS since it can be removed to free up space size = partition.getRequestsSize(partition.getDefaultVirtualRequests()) size += VMFS_OVERHEAD if self.vmdkSize > 0: size -= self.vmdkSize if size > devices.runtimeActionFindMaxVmdkSize():
userchoices.addPhysicalPartitionRequests(dev.name, partition.createPartitionRequestSet(dev, physicalRequests)) userchoices.setClearPartitions(drives=clearDrives) userchoices.setEsxDatastoreDevice(dev.name) userchoices.setVmdkDatastore(volumeName) else: if not _vmfsVolume: MessageWindow(None, "Invalid Datastore", "No datastore has been selected. " "Select a datatore for ESX to use.") raise exception.StayOnScreen if not self.preserveVmfs: partition.addDefaultPartitionRequests( self.diskSet[self.defaultDeviceName], False) userchoices.setClearPartitions(drives=[self.defaultDeviceName]) userchoices.setEsxDatastoreDevice(None) userchoices.setVmdkDatastore(_vmfsVolume) # find the size of the virtual partitions and then remove the # size of any existing COS since it can be removed to free up space size = partition.getRequestsSize(partition.getDefaultVirtualRequests()) size += VMFS_OVERHEAD if self.vmdkSize > 0: size -= self.vmdkSize if size > devices.runtimeActionFindMaxVmdkSize():