diff --git a/server/src/uds/core/ui/UserInterface.py b/server/src/uds/core/ui/UserInterface.py index 202e45ba2..f1501cb15 100644 --- a/server/src/uds/core/ui/UserInterface.py +++ b/server/src/uds/core/ui/UserInterface.py @@ -765,6 +765,9 @@ class UserInterface(object): # Set all values to defaults ones for k in self._gui.iterkeys(): + if self._gui[k].isType(gui.InputField.HIDDEN_TYPE): # Do not fills the value of hidden fields, those will not be deserialized + continue + self._gui[k].value = self._gui[k].defValue for txt in values.decode('zip').split('\002'): diff --git a/server/src/uds/services/OVirt/Helpers.py b/server/src/uds/services/OVirt/Helpers.py index 81d5191a8..2613501bc 100644 --- a/server/src/uds/services/OVirt/Helpers.py +++ b/server/src/uds/services/OVirt/Helpers.py @@ -29,10 +29,10 @@ class oVirtHelpers(object): res = [] # Get storages for that datacenter for storage in provider.getDatacenterInfo(ci['datacenter_id'])['storage']: - if storage['active'] is True and storage['type'] == 'data': + if storage['type'] == 'data': space, free = storage['available']/1024/1024/1024, (storage['available']-storage['used'])/1024/1024/1024 - res.append( {'id': storage['id'], 'text': "%s (%4.2f Gb/%4.2f Gb)" % (storage['name'], space, free ) }) + res.append( {'id': storage['id'], 'text': "%s (%4.2f Gb/%4.2f Gb) %s" % (storage['name'], space, free, storage['active'] and '(ok)' or '(disabled)' ) }) data = [{ 'name' : 'datastore', 'values' : res }] diff --git a/server/src/uds/services/OVirt/OVirtLinkedDeployment.py b/server/src/uds/services/OVirt/OVirtLinkedDeployment.py index bc4f488fc..03f8049f9 100644 --- a/server/src/uds/services/OVirt/OVirtLinkedDeployment.py +++ b/server/src/uds/services/OVirt/OVirtLinkedDeployment.py @@ -52,9 +52,9 @@ class OVirtLinkedDeployment(UserDeployment): ''' - #: Recheck every five seconds by default (for task methods) - suggestedTime = 5 - + #: Recheck every six seconds by default (for task methods) + suggestedTime = 6 + def initialize(self): self._name = '' self._ip = '' @@ -74,7 +74,6 @@ class OVirtLinkedDeployment(UserDeployment): ''' Does nothing here also, all data are keeped at environment storage ''' - logger.debug('Data: {0}'.format(str_)) vals = str_.split('\1') if vals[0] == 'v1': self._name, self._ip, self._mac, self._vmid, self._reason, queue = vals[1:] @@ -245,7 +244,7 @@ class OVirtLinkedDeployment(UserDeployment): def __pushBackOp(self, op): self._queue.append(op) - + def __error(self, reason): ''' Internal method to set object as error state @@ -347,7 +346,7 @@ class OVirtLinkedDeployment(UserDeployment): if state == 'up': # Already started, return return - if state != 'down': + if state != 'down' and state != 'suspended': self.__pushFrontOp(opRetry) # Will call "check Retry", that will finish inmediatly and again call this one else: self.service().startMachine(self._vmid) @@ -365,7 +364,7 @@ class OVirtLinkedDeployment(UserDeployment): return if state != 'up' and state != 'suspended': - self.__pushBackOp(opRetry) # Will call "check Retry", that will finish inmediatly and again call this one + self.__pushFrontOp(opRetry) # Will call "check Retry", that will finish inmediatly and again call this one else: self.service().stopMachine(self._vmid) @@ -382,7 +381,7 @@ class OVirtLinkedDeployment(UserDeployment): return if state != 'up': - self.__pushBackOp(opRetry) # Remember here, the return State.FINISH will make this retry be "poped" right ar return + self.__pushFrontOp(opRetry) # Remember here, the return State.FINISH will make this retry be "poped" right ar return else: self.service().suspendMachine(self._vmid) diff --git a/server/src/uds/services/OVirt/OVirtLinkedService.py b/server/src/uds/services/OVirt/OVirtLinkedService.py index d97304ad5..f2771d463 100644 --- a/server/src/uds/services/OVirt/OVirtLinkedService.py +++ b/server/src/uds/services/OVirt/OVirtLinkedService.py @@ -148,14 +148,20 @@ class OVirtLinkedService(Service): ''' Loads required values inside ''' - self.ov.value = self.parent().serialize() - self.ev.value = self.parent().env().key() - + # Here we have to use "default values", cause values aren't used at form initialization + # This is that value is always '', so if we want to change something, we have to do it + # at defValue + self.ov.defValue = self.parent().serialize() + self.ev.defValue = self.parent().env().key() + machines = self.parent().getMachines() vals = [] for m in machines: vals.append( gui.choiceItem( m['id'], m['name'] )) + + # This is not the same case, values is not the "value" of the field, but + # the list of values shown because this is a "ChoiceField" self.machine.setValues(vals) clusters = self.parent().getClusters() @@ -207,12 +213,16 @@ class OVirtLinkedService(Service): name: Name (sanitized) of the machine comments: Comments for machine templateId: Id of the template to deploy from + displayType: 'vnc' or 'spice'. Display to use ad oVirt admin interface + memoryMB: Memory requested for machine, in MB + guaranteedMB: Minimum memory guaranteed for this machine Returns: Id of the machine being created form template ''' logger.debug('Deploying from template {0} machine {1}'.format(templateId, name)) - return self.parent().deployFromTemplate(name, comments, templateId, self.cluster.value, self.display.value) + return self.parent().deployFromTemplate(name, comments, templateId, self.cluster.value, + self.display.value, int(self.memory.value), int(self.memoryGuaranteed.value)) def removeTemplate(self, templateId): ''' diff --git a/server/src/uds/services/OVirt/OVirtProvider.py b/server/src/uds/services/OVirt/OVirtProvider.py index 23d8b3c73..a8c6146fd 100644 --- a/server/src/uds/services/OVirt/OVirtProvider.py +++ b/server/src/uds/services/OVirt/OVirtProvider.py @@ -291,7 +291,7 @@ class Provider(ServiceProvider): ''' return self.__getApi().removeTemplate(templateId) - def deployFromTemplate(self, name, comments, templateId, clusterId, displayType): + def deployFromTemplate(self, name, comments, templateId, clusterId, displayType, memoryMB, guaranteedMB): ''' Deploys a virtual machine on selected cluster from selected template @@ -300,11 +300,14 @@ class Provider(ServiceProvider): comments: Comments for machine templateId: Id of the template to deploy from clusterId: Id of the cluster to deploy to + displayType: 'vnc' or 'spice'. Display to use ad oVirt admin interface + memoryMB: Memory requested for machine, in MB + guaranteedMB: Minimum memory guaranteed for this machine Returns: Id of the machine being created form template ''' - return self.__getApi().deployFromTemplate(name, comments, templateId, clusterId, displayType) + return self.__getApi().deployFromTemplate(name, comments, templateId, clusterId, displayType, memoryMB, guaranteedMB) def startMachine(self, machineId): ''' diff --git a/server/src/uds/services/OVirt/client/oVirtClient.py b/server/src/uds/services/OVirt/client/oVirtClient.py index 352c25b5f..3359c2102 100644 --- a/server/src/uds/services/OVirt/client/oVirtClient.py +++ b/server/src/uds/services/OVirt/client/oVirtClient.py @@ -257,9 +257,14 @@ class Client(object): d = api.datacenters.get(id=datacenterId) storage = [] for dd in d.storagedomains.list(): + try: + active = dd.get_status().get_state() + except: + active = 'inactive' + storage.append( { 'id' : dd.get_id(), 'name' : dd.get_name(), 'type' : dd.get_type(), 'available' : dd.get_available(), 'used' : dd.get_used(), - 'active' : dd.get_status().get_state() == 'active' } ) + 'active' : active == 'active' } ) res = { 'name' : d.get_name(), 'id' : d.get_id(), 'storage_type' : d.get_storage_type(), @@ -401,7 +406,7 @@ class Client(object): finally: lock.release() - def deployFromTemplate(self, name, comments, templateId, clusterId, displayType): + def deployFromTemplate(self, name, comments, templateId, clusterId, displayType, memoryMB, guaranteedMB): ''' Deploys a virtual machine on selected cluster from selected template @@ -410,10 +415,15 @@ class Client(object): comments: Comments for machine templateId: Id of the template to deploy from clusterId: Id of the cluster to deploy to + displayType: 'vnc' or 'spice'. Display to use ad oVirt admin interface + memoryMB: Memory requested for machine, in MB + guaranteedMB: Minimum memory guaranteed for this machine Returns: Id of the machine being created form template ''' + logger.debug('Deploying machine with name "{0}" from template {1} at cluster {2} with display {3}, memory {4} and guaranteed {5}'.format( + name, templateId, clusterId, displayType, memoryMB, guaranteedMB)) try: lock.acquire(True) @@ -425,7 +435,9 @@ class Client(object): template = params.Template(id=templateId) display = params.Display(type_=displayType) - par = params.VM(name=name, cluster=cluster, template=template, description=comments, display=display) + memoryPolicy = params.MemoryPolicy(guaranteed=guaranteedMB*1024*1024) + par = params.VM(name=name, cluster=cluster, template=template, description=comments, + display=display, type_='desktop', memory=memoryMB*1024*1024, memory_policy=memoryPolicy) return api.vms.add(par).get_id()