Example #1
0
    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})
Example #2
0
    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)
Example #3
0
    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})
Example #4
0
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'
Example #5
0
    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})
Example #6
0
    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 } )
Example #7
0
    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
Example #8
0
    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)
Example #9
0
                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():
    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
Example #11
0
            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():