1
0
mirror of https://github.com/dkmstr/openuds.git synced 2025-03-21 10:50:26 +03:00

Merging 2.1 fixes

This commit is contained in:
Adolfo Gómez García 2017-01-19 12:52:33 +01:00
commit 16997b6298
13 changed files with 167 additions and 88 deletions

1
actors/.gitignore vendored
View File

@ -7,3 +7,4 @@ udsactor*.changes
/udsactor_1.7.0.tar.xz
/udsactor*.rpm
/udsactor_2.1.0_amd64.buildinfo
linux/debian/files

View File

@ -2,7 +2,7 @@ udsactor (2.1.0) stable; urgency=medium
* Fixes for 2.1.0 release
-- Adolfo Gómez García <agomez@virtualcable.es> Tue, 11 Oct 2016 08:00:22 +0200
-- Adolfo Gómez García <agomez@virtualcable.es> Tue, 19 Jan 2017 08:00:22 +0200
udsactor (2.0.0) stable; urgency=medium

View File

@ -5,6 +5,7 @@
set -e
case "$1" in
configure)
/usr/bin/python2.7 -m compileall /usr/share/UDSActor > /dev/nul 2>&1
# If new "fresh" install or if configuration file has disappeared...
if [ "$2" = "" ] || [ ! -f /etc/udsactor/udsactor.cfg ]; then
db_get udsactor/host

View File

@ -51,6 +51,8 @@ from udsactor import VERSION
trayIcon = None
doLogoff = False
def sigTerm(sigNo, stackFrame):
if trayIcon:
@ -150,8 +152,6 @@ class MessagesProcessor(QtCore.QThread):
self.script.emit(QtCore.QString.fromUtf8(data))
elif msgId == ipc.MSG_INFORMATION:
self.information.emit(pickle.loads(data))
elif msgId == ipc.MSG_TICKET:
pass # Not processed because not useful here
except Exception as e:
try:
logger.error('Got error on IPC thread {}'.format(utils.exceptionToMessage(e)))
@ -244,20 +244,18 @@ class UDSSystemTray(QtGui.QSystemTrayIcon):
idleTime = operations.getIdleDuration()
remainingTime = self.maxIdleTime - idleTime
if idleTime < 30:
if remainingTime > 120: # Reset show Warning dialog if we have more than 5 minutes left
self.showIdleWarn = True
return # No notification if idle time is less than 30 seconds
logger.debug('User has been idle for: {}'.format(idleTime))
if self.showIdleWarn is True and remainingTime < 300: # With less than five minutes, and 30 seconds at least of idle, show message
if self.showIdleWarn is True and remainingTime < 120: # With two minutes, show a warning message
self.showIdleWarn = False
self.msgDlg.displayMessage("You have been idle for too long. The session will end if you don't resume operations")
return
if self.showIdleWarn is False and remainingTime <= 0:
if remainingTime <= 0:
logger.info('User has been idle for too long, notifying Broker that service can be reclaimed')
self.quit()
self.quit(logoff=True)
def displayMessage(self, message):
logger.debug('Displaying message')
@ -294,10 +292,10 @@ class UDSSystemTray(QtGui.QSystemTrayIcon):
def about(self):
self.aboutDlg.exec_()
def cleanUp(self):
logger.debug('Cleaning up')
def quit(self, logoff=False):
global doLogoff
logger.debug('Quit invoked')
if self.stopped is False:
logger.debug('Not stopped, proceding to cleanup')
self.stopped = True
try:
# If we close Client, send Logoff to Broker
@ -308,21 +306,9 @@ class UDSSystemTray(QtGui.QSystemTrayIcon):
# May we have lost connection with server, simply exit in that case
pass
try:
operations.loggoff() # Invoke log off
except Exception:
pass
def quit(self):
logger.debug('Quit invoked')
if self.stopped is False:
self.cleanUp()
self.app.quit()
def closeEvent(self, event):
event.accept()
self.quit()
doLogoff = logoff
self.app.quit()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
@ -340,8 +326,6 @@ if __name__ == '__main__':
logger.error('UDS Service is not running, or it can\'t contact with UDS Server. User Tools stopped')
sys.exit(1)
app.aboutToQuit.connect(trayIcon.cleanUp)
# Sets a default idle duration, but will not be used unless idle is notified from server
operations.initIdleDuration(3600 * 10)
@ -355,4 +339,12 @@ if __name__ == '__main__':
logger.debug('Exiting')
trayIcon.quit()
if doLogoff:
try:
time.sleep(1)
operations.loggoff() # Invoke log off
except Exception:
pass
sys.exit(res)

View File

@ -35,6 +35,7 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext, ugettext_lazy as _
from uds.models import Provider, Service, UserService
from uds.core import services
from uds.core.util.State import State
from uds.core.util import permissions
from uds.core.util.model import processUuid
@ -87,7 +88,7 @@ class Providers(ModelHandler):
'name': provider.name,
'tags': [tag.vtag for tag in provider.tags.all()],
'services_count': provider.services.count(),
'user_services_count': UserService.objects.filter(deployed_service__service__provider=provider).count(),
'user_services_count': UserService.objects.filter(deployed_service__service__provider=provider).exclude(state__in=(State.REMOVED, State.ERROR)).count(),
'maintenance_mode': provider.maintenance_mode,
'offers': offers,
'type': type_.type(),

View File

@ -46,6 +46,7 @@ from uds.REST.model import DetailHandler
from uds.REST import NotFound, ResponseError, RequestError
from django.db import IntegrityError
from uds.core.ui.images import DEFAULT_THUMB_BASE64
from uds.core.util.State import State
import logging
@ -92,7 +93,7 @@ class Services(DetailHandler): # pylint: disable=too-many-public-methods
'type': item.data_type,
'type_name': _(itemType.name()),
'deployed_services_count': item.deployedServices.count(),
'user_services_count': UserService.objects.filter(deployed_service__service=item).count(),
'user_services_count': UserService.objects.filter(deployed_service__service=item).exclude(state__in=(State.REMOVED, State.ERROR)).count(),
'maintenance_mode': item.provider.maintenance_mode,
'permission': perm
}

View File

@ -36,6 +36,7 @@ from uds.models import User, Service, UserService, DeployedService, getSqlDateti
from uds.core.util.stats import counters
from uds.core.util.Cache import Cache
from uds.core.util.State import State
from uds.REST import Handler, RequestError, ResponseError
import pickle
from datetime import timedelta
@ -89,7 +90,7 @@ class System(Handler):
if self._args[0] == 'overview': # System overview
users = User.objects.count()
services = Service.objects.count()
user_services = UserService.objects.count()
user_services = UserService.objects.exclude(state__in=(State.REMOVED, State.ERROR)).count()
restrained_services_pools = len(DeployedService.getRestraineds())
return {
'users': users,

View File

@ -50,7 +50,7 @@ logger = logging.getLogger(__name__)
class LinuxOsManager(osmanagers.OSManager):
typeName = _('Linux OS Manager')
typeType = 'LinuxManager'
typeDescription = _('Os Manager to control linux virtual machines (basically renames machine and notify state)')
typeDescription = _('Os Manager to control linux virtual machines')
iconFile = 'losmanager.png'
servicesType = (serviceTypes.VDI,)

View File

@ -27,7 +27,7 @@ logger = logging.getLogger(__name__)
class WinDomainOsManager(WindowsOsManager):
typeName = _('Windows Domain OS Manager')
typeType = 'WinDomainManager'
typeDescription = _('Os Manager to control windows machines with domain. (Basically renames machine)')
typeDescription = _('Os Manager to control windows machines with domain.')
iconFile = 'wosmanager.png'
# Apart form data from windows os manager, we need also domain and credentials

View File

@ -45,7 +45,7 @@ def scrambleMsg(data):
class WindowsOsManager(osmanagers.OSManager):
typeName = _('Windows Basic OS Manager')
typeType = 'WindowsManager'
typeDescription = _('Os Manager to control windows machines without domain. (Basically renames machine)')
typeDescription = _('Os Manager to control windows machines without domain.')
iconFile = 'wosmanager.png'
servicesType = (serviceTypes.VDI,)

View File

@ -41,7 +41,7 @@ from uds.core.ui import gui
import logging
__updated__ = '2016-09-11'
__updated__ = '2017-01-17'
logger = logging.getLogger(__name__)
@ -99,8 +99,9 @@ class OVirtLinkedService(Service):
servicesTypeProvided = (serviceTypes.VDI,)
# Now the form part
machine = gui.ChoiceField(label=_("Base Machine"), order=1, tooltip=_('Service base machine'), required=True)
cluster = gui.ChoiceField(label=_("Cluster"), order=2,
cluster = gui.ChoiceField(
label=_("Cluster"),
order=100,
fills={
'callbackName': 'ovFillResourcesFromCluster',
'function': oVirtHelpers.getResources,
@ -112,7 +113,7 @@ class OVirtLinkedService(Service):
datastore = gui.ChoiceField(
label=_("Datastore Domain"),
rdonly=False,
order=3,
order=101,
tooltip=_('Datastore domain where to publish and put incrementals'),
required=True
)
@ -121,18 +122,27 @@ class OVirtLinkedService(Service):
length=3,
label=_('Reserved Space'),
defvalue='32',
order=4,
order=102,
tooltip=_('Minimal free space in GB'),
required=True
)
machine = gui.ChoiceField(
label=_("Base Machine"),
order=110,
tooltip=_('Service base machine'),
tab=_('Machine'),
required=True
)
memory = gui.NumericField(
label=_("Memory (Mb)"),
length=4,
defvalue=512,
rdonly=False,
order=5,
order=111,
tooltip=_('Memory assigned to machines'),
tab=_('Machine'),
required=True
)
@ -141,16 +151,44 @@ class OVirtLinkedService(Service):
length=4,
defvalue=256,
rdonly=False,
order=6,
order=112,
tooltip=_('Physical memory guaranteed to machines'),
tab=_('Machine'),
required=True
)
usb = gui.ChoiceField(
label=_('USB'),
rdonly=False,
order=113,
tooltip=_('Enable usb redirection for SPICE'),
values=[
gui.choiceItem('disabled', 'disabled'),
gui.choiceItem('native', 'native'),
gui.choiceItem('legacy', 'legacy (deprecated)')
],
tab=_('Machine'),
defvalue='1' # Default value is the ID of the choicefield
)
display = gui.ChoiceField(
label=_('Display'),
rdonly=False,
order=114,
tooltip=_('Display type (only for administration purposes)'),
values=[
gui.choiceItem('spice', 'Spice'),
gui.choiceItem('vnc', 'Vnc')
],
tab=_('Machine'),
defvalue='1' # Default value is the ID of the choicefield
)
baseName = gui.TextField(
label=_('Machine Names'),
rdonly=False,
order=6,
order=115,
tooltip=('Base name for clones from this machine'),
tab=_('Machine'),
required=True
)
@ -158,36 +196,12 @@ class OVirtLinkedService(Service):
length=1,
label=_('Name Length'),
defvalue=5,
order=7,
order=116,
tooltip=_('Size of numeric part for the names of these machines (between 3 and 6)'),
tab=_('Machine'),
required=True
)
usb = gui.ChoiceField(
label=_('USB'),
rdonly=False,
order=9,
tooltip=_('Enable usb redirection for SPICE'),
values=[
gui.choiceItem('disabled', 'disabled'),
gui.choiceItem('native', 'native'),
gui.choiceItem('legacy', 'legacy (deprecated)')
],
defvalue='1' # Default value is the ID of the choicefield
)
display = gui.ChoiceField(
label=_('Display'),
rdonly=False,
order=9,
tooltip=_('Display type (only for administration purposes)'),
values=[
gui.choiceItem('spice', 'Spice'),
gui.choiceItem('vnc', 'Vnc')
],
defvalue='1' # Default value is the ID of the choicefield
)
ov = gui.HiddenField(value=None)
ev = gui.HiddenField(value=None) # We need to keep the env so we can instantiate the Provider

View File

@ -40,7 +40,7 @@ from uds.core.ui import gui
import logging
__updated__ = '2016-11-23'
__updated__ = '2017-01-17'
logger = logging.getLogger(__name__)
@ -92,14 +92,28 @@ class LiveService(Service):
servicesTypeProvided = (serviceTypes.VDI,)
# Now the form part
template = gui.ChoiceField(label=_("Base Template"), order=1, tooltip=_('Service base template'), required=True)
datastore = gui.ChoiceField(label=_("Datastore"), order=2, tooltip=_('Service clones datastore'), required=True)
datastore = gui.ChoiceField(
label=_("Datastore"),
order=100,
tooltip=_('Service clones datastore'),
required=True
)
template = gui.ChoiceField(
label=_("Base Template"),
order=110,
tooltip=_('Service base template'),
tab=_('Machine'),
required=True
)
baseName = gui.TextField(
label=_('Machine Names'),
rdonly=False,
order=6,
order=111,
tooltip=('Base name for clones from this machine'),
tab=_('Machine'),
required=True
)
@ -107,8 +121,9 @@ class LiveService(Service):
length=1,
label=_('Name Length'),
defvalue=5,
order=7,
order=112,
tooltip=_('Size of numeric part for the names of these machines (between 3 and 6)'),
tab=_('Machine'),
required=True
)

View File

@ -53,11 +53,11 @@ class XenLinkedService(Service):
# : Name to show the administrator. This string will be translated BEFORE
# : sending it to administration interface, so don't forget to
# : mark it as _ (using ugettext_noop)
typeName = _('Xen Linked Clone (Experimental)')
typeName = _('Xen Linked Clone')
# : Type used internally to identify this provider
typeType = 'XenLinkedService'
# : Description shown at administration interface for this provider
typeDescription = _('Xen Services based on templates (experimental)')
typeDescription = _('Xen Services based on templates')
# : Icon file used as icon for this provider. This string will be translated
# : BEFORE sending it to administration interface, so don't forget to
# : mark it as _ (using ugettext_noop)
@ -99,26 +99,79 @@ class XenLinkedService(Service):
# Now the form part
machine = gui.ChoiceField(label=_("Base Machine"), order=1, tooltip=_('Service base machine'), required=True)
datastore = gui.ChoiceField(
label=_("Storage SR"),
rdonly=False,
order=100,
tooltip=_('Storage where to publish and put incrementals'),
required=True
)
datastore = gui.ChoiceField(label=_("Storage SR"), rdonly=False, order=3,
tooltip=_('Storage where to publish and put incrementals'), required=True)
minSpaceGB = gui.NumericField(
length=3,
label=_('Reserved Space'),
defvalue='32',
order=101,
tooltip=_('Minimal free space in GB'),
required=True
)
network = gui.ChoiceField(label=_("Network"), rdonly=False, order=4,
tooltip=_('Network used for virtual machines'), required=True)
machine = gui.ChoiceField(
label=_("Base Machine"),
order=110,
tooltip=_('Service base machine'),
tab=_('Machine'),
required=True
)
minSpaceGB = gui.NumericField(length=3, label=_('Reserved Space'), defvalue='32', order=5, tooltip=_('Minimal free space in GB'), required=True)
network = gui.ChoiceField(
label=_("Network"),
rdonly=False,
order=111,
tooltip=_('Network used for virtual machines'),
tab=_('Machine'),
required=True
)
memory = gui.NumericField(label=_("Memory (Mb)"), length=4, defvalue=512, rdonly=False, order=6,
tooltip=_('Memory assigned to machines'), required=True)
memory = gui.NumericField(
label=_("Memory (Mb)"),
length=4, defvalue=512,
rdonly=False,
order=112,
tooltip=_('Memory assigned to machines'),
tab=_('Machine'),
required=True
)
shadow = gui.NumericField(label=_("Shadow"), lengh=1, defvalue=2, rdonly=True, order=7,
tooltip=_('Shadow memory multiplier (memory overcommit)'), required=True)
shadow = gui.NumericField(
label=_("Shadow"),
length=1,
defvalue=4,
rdonly=False,
order=113,
tooltip=_('Shadow memory multiplier (memory overcommit)'),
tab=_('Machine'),
required=True
)
baseName = gui.TextField(label=_('Machine Names'), rdonly=False, order=8, tooltip=('Base name for clones from this machine'), required=True)
baseName = gui.TextField(
label=_('Machine Names'),
rdonly=False,
order=114,
tooltip=('Base name for clones from this machine'),
tab=_('Machine'),
required=True
)
lenName = gui.NumericField(length=1, label=_('Name Length'), defvalue=5, order=9,
tooltip=_('Length of numeric part for the names of this machines (beetwen 3 and 6'), required=True)
lenName = gui.NumericField(
length=1,
label=_('Name Length'),
defvalue=5,
order=115,
tooltip=_('Length of numeric part for the names of this machines (beetwen 3 and 6'),
tab=_('Machine'),
required=True
)
def initialize(self, values):
'''