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:
commit
16997b6298
1
actors/.gitignore
vendored
1
actors/.gitignore
vendored
@ -7,3 +7,4 @@ udsactor*.changes
|
||||
/udsactor_1.7.0.tar.xz
|
||||
/udsactor*.rpm
|
||||
/udsactor_2.1.0_amd64.buildinfo
|
||||
linux/debian/files
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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(),
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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,)
|
||||
|
@ -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
|
||||
|
@ -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,)
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
)
|
||||
|
||||
|
@ -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):
|
||||
'''
|
||||
|
Loading…
x
Reference in New Issue
Block a user