예제 #1
0
 def getFields(self, parent):
     return [
         # Note that this field is "self generated" on client table
         {
             'group_name': {
                 'title': _('Name'),
                 'type': 'icon_dict',
                 'icon_dict': {
                     'group': 'fa fa-group text-success',
                     'meta': 'fa fa-gears text-info'
                 }
             }
         },
         {
             'comments': {
                 'title': _('comments')
             }
         },
         {
             'state': {
                 'title': _('State'),
                 'type': 'dict',
                 'dict': State.dictionary()
             }
         },
     ]
예제 #2
0
 def getFields(self, parent):
     return [
         {'revision': {'title': _('Revision'), 'type': 'numeric', 'width': '6em'}},
         {'publish_date': {'title': _('Publish date'), 'type': 'datetime'}},
         {'state': {'title': _('State'), 'type': 'dict', 'dict': State.dictionary()}},
         {'reason': {'title': _('Reason')}},
     ]
예제 #3
0
 def getFields(self, parent):
     return [
         {
             'name': {
                 'title': _('Group'),
                 'visible': True,
                 'type': 'icon_dict',
                 'icon_dict': {
                     'group': 'fa fa-group text-success',
                     'meta': 'fa fa-gears text-info'
                 }
             }
         },
         {
             'comments': {
                 'title': _('Comments')
             }
         },
         {
             'state': {
                 'title': _('state'),
                 'type': 'dict',
                 'dict': State.dictionary()
             }
         },
     ]
예제 #4
0
 def getFields(self, parent):
     return [
         # Note that this field is "self generated" on client table
         {'group_name': {'title': _('Name'), 'type': 'icon_dict', 'icon_dict': {'group': 'fa fa-group text-success', 'meta': 'fa fa-gears text-info'}}},
         {'comments': {'title': _('comments')}},
         {'state': {'title': _('State'), 'type': 'dict', 'dict': State.dictionary()}},
     ]
예제 #5
0
 def getFields(self, parent):
     return [
         {"revision": {"title": _("Revision"), "type": "numeric", "width": "6em"}},
         {"publish_date": {"title": _("Publish date"), "type": "datetime"}},
         {"state": {"title": _("State"), "type": "dict", "dict": State.dictionary()}},
         {"reason": {"title": _("Reason")}},
     ]
예제 #6
0
 def getFields(self, parent):
     return [
         {
             'revision': {
                 'title': _('Revision'),
                 'type': 'numeric',
                 'width': '6em'
             }
         },
         {
             'publish_date': {
                 'title': _('Publish date'),
                 'type': 'datetime'
             }
         },
         {
             'state': {
                 'title': _('State'),
                 'type': 'dict',
                 'dict': State.dictionary()
             }
         },
         {
             'reason': {
                 'title': _('Reason')
             }
         },
     ]
예제 #7
0
 def getFields(self, parent):
     return [
         {
             'name': {
                 'title': _('Username'),
                 'visible': True,
                 'type': 'icon',
                 'icon': 'fa fa-user text-success'
             }
         },
         {
             'real_name': {
                 'title': _('Name')
             }
         },
         {
             'comments': {
                 'title': _('Comments')
             }
         },
         {
             'state': {
                 'title': _('state'),
                 'type': 'dict',
                 'dict': State.dictionary()
             }
         },
         {
             'last_access': {
                 'title': _('Last access'),
                 'type': 'datetime'
             }
         },
     ]
예제 #8
0
 def getFields(self, parent):
     return [
         {'name': {'title': _('Username'), 'visible': True, 'type': 'icon', 'icon': 'fa fa-user text-success'}},
         {'real_name': {'title': _('Name')}},
         {'comments': {'title': _('Comments')}},
         {'state': {'title': _('state'), 'type': 'dict', 'dict': State.dictionary()}},
         {'last_access': {'title': _('Last access'), 'type': 'datetime'}},
     ]
예제 #9
0
 def getFields(self, parent):
     return [
         {'creation_date': {'title': _('Creation date'), 'type': 'datetime'}},
         {'revision': {'title': _('Revision')}},
         {'unique_id': {'title': 'Unique ID'}},
         {'ip': {'title': _('IP')}},
         {'friendly_name': {'title': _('Friendly name')}},
         {'state': {'title': _('State'), 'type': 'dict', 'dict': State.dictionary()}},
         {'cache_level': {'title': _('Cache level')}},
         {'actor_version': {'title': _('Actor version')}}
     ]
예제 #10
0
 def getFields(self, parent):
     return [
         {'creation_date': {'title': _('Creation date'), 'type': 'datetime'}},
         {'revision': {'title': _('Revision')}},
         {'unique_id': {'title': 'Unique ID'}},
         {'ip': {'title': _('IP')}},
         {'friendly_name': {'title': _('Friendly name')}},
         {'state': {'title': _('State'), 'type': 'dict', 'dict': State.dictionary()}},
         {'cache_level': {'title': _('Cache level')}},
         {'actor_version': {'title': _('Actor version')}}
     ]
예제 #11
0
 def getFields(self, parent):
     return [
         {"creation_date": {"title": _("Creation date"), "type": "datetime"}},
         {"revision": {"title": _("Revision")}},
         {"unique_id": {"title": "Unique ID"}},
         {"ip": {"title": _("IP")}},
         {"friendly_name": {"title": _("Friendly name")}},
         {"state": {"title": _("State"), "type": "dict", "dict": State.dictionary()}},
         {"cache_level": {"title": _("Cache level")}},
         {"actor_version": {"title": _("Actor version")}},
     ]
예제 #12
0
 def getFields(self, parent):
     return [{
         'creation_date': {
             'title': _('Creation date'),
             'type': 'datetime'
         }
     }, {
         'revision': {
             'title': _('Revision')
         }
     }, {
         'unique_id': {
             'title': 'Unique ID'
         }
     }, {
         'ip': {
             'title': _('IP')
         }
     }, {
         'friendly_name': {
             'title': _('Friendly name')
         }
     }, {
         'state': {
             'title': _('status'),
             'type': 'dict',
             'dict': State.dictionary()
         }
     }, {
         'state_date': {
             'title': _('Status date'),
             'type': 'datetime'
         }
     }, {
         'in_use': {
             'title': _('In Use')
         }
     }, {
         'source_host': {
             'title': _('Src Host')
         }
     }, {
         'source_ip': {
             'title': _('Src Ip')
         }
     }, {
         'owner': {
             'title': _('Owner')
         }
     }, {
         'actor_version': {
             'title': _('Actor version')
         }
     }]
예제 #13
0
 def getFields(self, parent):
     return [
         # Note that this field is "self generated" on client table
         {
             "group_name": {
                 "title": _("Name"),
                 "type": "icon_dict",
                 "icon_dict": {"group": "fa fa-group text-success", "meta": "fa fa-gears text-info"},
             }
         },
         {"comments": {"title": _("comments")}},
         {"state": {"title": _("State"), "type": "dict", "dict": State.dictionary()}},
     ]
예제 #14
0
 def getFields(self, parent):
     return [
         {'creation_date': {'title': _('Creation date'), 'type': 'datetime'}},
         {'pool_name': {'title': _('Pool')}},
         {'unique_id': {'title': 'Unique ID'}},
         {'ip': {'title': _('IP')}},
         {'friendly_name': {'title': _('Friendly name')}},
         {'state': {'title': _('status'), 'type': 'dict', 'dict': State.dictionary()}},
         {'in_use': {'title': _('In Use')}},
         {'source_host': {'title': _('Src Host')}},
         {'source_ip': {'title': _('Src Ip')}},
         {'owner': {'title': _('Owner')}},
         {'actor_version': {'title': _('Actor version')}}
     ]
예제 #15
0
 def getFields(self, parent):
     return [
         {"creation_date": {"title": _("Creation date"), "type": "datetime"}},
         {"revision": {"title": _("Revision")}},
         {"unique_id": {"title": "Unique ID"}},
         {"ip": {"title": _("IP")}},
         {"friendly_name": {"title": _("Friendly name")}},
         {"state": {"title": _("status"), "type": "dict", "dict": State.dictionary()}},
         {"state_date": {"title": _("Status date"), "type": "datetime"}},
         {"in_use": {"title": _("In Use")}},
         {"source_host": {"title": _("Src Host")}},
         {"source_ip": {"title": _("Src Ip")}},
         {"owner": {"title": _("Owner")}},
         {"actor_version": {"title": _("Actor version")}},
     ]
예제 #16
0
class ServicesPools(ModelHandler):
    '''
    Handles Services Pools REST requests
    '''
    model = DeployedService
    detail = {
        'services': AssignedService,
        'cache': CachedService,
        'groups': Groups,
        'transports': Transports,
        'publications': Publications,
    }

    save_fields = [
        'name', 'comments', 'service_id', 'osmanager_id', 'image_id',
        'initial_srvs', 'cache_l1_srvs', 'cache_l2_srvs', 'max_srvs',
        'show_transports'
    ]
    remove_fields = ['osmanager_id', 'service_id']

    table_title = _('Service Pools')
    table_fields = [
        {
            'name': {
                'title': _('Name')
            }
        },
        {
            'parent': {
                'title': _('Parent Service')
            }
        },  # Will process this field on client in fact, not sent by server
        {
            'state': {
                'title': _('status'),
                'type': 'dict',
                'dict': State.dictionary()
            }
        },
        {
            'show_transports': {
                'title': _('Shows transports')
            }
        },  # Will process this field on client in fact, not sent by server
        {
            'comments': {
                'title': _('Comments')
            }
        },
    ]
    # Field from where to get "class" and prefix for that class, so this will generate "row-state-A, row-state-X, ....
    table_row_style = {'field': 'state', 'prefix': 'row-state-'}

    def item_as_dict(self, item):
        # if item does not have an associated service, hide it (the case, for example, for a removed service)
        # Access from dict will raise an exception, and item will be skipped
        val = {
            'id':
            item.uuid,
            'name':
            item.name,
            'parent':
            item.service.name,
            'comments':
            item.comments,
            'state':
            item.state if item.service.provider.maintenance_mode is False else
            State.MAINTENANCE,
            'thumb':
            item.image.thumb64
            if item.image is not None else DEFAULT_THUMB_BASE64,
            'service_id':
            item.service.uuid,
            'provider_id':
            item.service.provider.uuid,
            'image_id':
            item.image.uuid if item.image is not None else None,
            'initial_srvs':
            item.initial_srvs,
            'cache_l1_srvs':
            item.cache_l1_srvs,
            'cache_l2_srvs':
            item.cache_l2_srvs,
            'max_srvs':
            item.max_srvs,
            'user_services_count':
            item.userServices.count(),
            'restrained':
            item.isRestrained(),
            'show_transports':
            item.show_transports,
            'permission':
            permissions.getEffectivePermission(self._user, item),
            'info':
            Services.serviceInfo(item.service)
        }

        if item.osmanager is not None:
            val['osmanager_id'] = item.osmanager.uuid

        return val

    # Gui related
    def getGui(self, type_):
        if OSManager.objects.count() < 1:  # No os managers, can't create db
            raise ResponseError(
                ugettext(
                    'Create at least one OS Manager before creating a new service pool'
                ))
        if Service.objects.count() < 1:
            raise ResponseError(
                ugettext(
                    'Create at least a service before creating a new service pool'
                ))

        g = self.addDefaultFields([], ['name', 'comments'])

        for f in [
            {
                'name':
                'service_id',
                'values': [gui.choiceItem(-1, '')] + gui.sortedChoices([
                    gui.choiceItem(v.uuid, v.provider.name + '\\' + v.name)
                    for v in Service.objects.all()
                ]),
                'label':
                ugettext('Base service'),
                'tooltip':
                ugettext('Service used as base of this service pool'),
                'type':
                gui.InputField.CHOICE_TYPE,
                'rdonly':
                True,
                'order':
                100,  # Ensueres is At end
            },
            {
                'name':
                'osmanager_id',
                'values': [gui.choiceItem(-1, '')] + gui.sortedChoices([
                    gui.choiceItem(v.uuid, v.name)
                    for v in OSManager.objects.all()
                ]),
                'label':
                ugettext('OS Manager'),
                'tooltip':
                ugettext('OS Manager used as base of this service pool'),
                'type':
                gui.InputField.CHOICE_TYPE,
                'rdonly':
                True,
                'order':
                101,
            },
            {
                'name':
                'image_id',
                'values': [gui.choiceItem(-1, '')] + gui.sortedChoices([
                    gui.choiceItem(v.uuid, v.name)
                    for v in Image.objects.all()
                ]),
                'label':
                ugettext('Associated Image'),
                'tooltip':
                ugettext('Image assocciated with this service'),
                'type':
                gui.InputField.CHOICE_TYPE,
                'order':
                102,
            },
            {
                'name':
                'initial_srvs',
                'value':
                '0',
                'minValue':
                '0',
                'label':
                ugettext('Initial available services'),
                'tooltip':
                ugettext('Services created initially for this service pool'),
                'type':
                gui.InputField.NUMERIC_TYPE,
                'order':
                103,
            },
            {
                'name':
                'cache_l1_srvs',
                'value':
                '0',
                'minValue':
                '0',
                'label':
                ugettext('Services to keep in cache'),
                'tooltip':
                ugettext(
                    'Services kept in cache for improved user service assignation'
                ),
                'type':
                gui.InputField.NUMERIC_TYPE,
                'order':
                104,
            },
            {
                'name':
                'cache_l2_srvs',
                'value':
                '0',
                'minValue':
                '0',
                'label':
                ugettext('Services to keep in L2 cache'),
                'tooltip':
                ugettext(
                    'Services kept in cache of level2 for improved service generation'
                ),
                'type':
                gui.InputField.NUMERIC_TYPE,
                'order':
                105,
            },
            {
                'name':
                'max_srvs',
                'value':
                '0',
                'minValue':
                '1',
                'label':
                ugettext('Maximum number of services to provide'),
                'tooltip':
                ugettext(
                    'Maximum number of service (assigned and L1 cache) that can be created for this service'
                ),
                'type':
                gui.InputField.NUMERIC_TYPE,
                'order':
                106,
            },
            {
                'name':
                'show_transports',
                'value':
                True,
                'label':
                ugettext('Show transports'),
                'tooltip':
                ugettext(
                    'If active, alternative transports for user will be shown'
                ),
                'type':
                gui.InputField.CHECKBOX_TYPE,
                'order':
                107,
            }
        ]:
            self.addField(g, f)

        return g

    def beforeSave(self, fields):
        # logger.debug(self._params)
        try:
            try:
                service = Service.objects.get(uuid=fields['service_id'])
                fields['service_id'] = service.id
            except:
                raise RequestError(
                    ugettext('Base service does not exist anymore'))

            try:
                serviceType = service.getType()

                if serviceType.publicationType is None:
                    self._params['publish_on_save'] = False

                if serviceType.needsManager is True:
                    osmanager = OSManager.objects.get(
                        uuid=fields['osmanager_id'])
                    fields['osmanager_id'] = osmanager.id
                else:
                    del fields['osmanager_id']

                if serviceType.usesCache is False:
                    for k in ('initial_srvs', 'cache_l1_srvs', 'cache_l2_srvs',
                              'max_srvs'):
                        fields[k] = 0

            except Exception:
                raise RequestError(
                    ugettext('This service requires an OS Manager'))

            imgId = fields['image_id']
            fields['image_id'] = None
            logger.debug('Image id: {}'.format(imgId))
            try:
                if imgId != '-1':
                    image = Image.objects.get(uuid=imgId)
                    fields['image_id'] = image.id
            except Exception:
                logger.exception('At image recovering')

        except (RequestError, ResponseError):
            raise
        except Exception as e:
            raise RequestError(str(e))

    def afterSave(self, item):
        if self._params.get('publish_on_save', False) is True:
            item.publish()

    def deleteItem(self, item):
        item.remove(
        )  # This will mark it for deletion, but in fact will not delete it directly

    # Logs
    def getLogs(self, item):
        return log.getLogs(item)
예제 #17
0
class ServicesPools(ModelHandler):
    """
    Handles Services Pools REST requests
    """
    model = DeployedService
    detail = {
        'services': AssignedService,
        'cache': CachedService,
        'groups': Groups,
        'transports': Transports,
        'publications': Publications,
        'changelog': Changelog,
        'access': AccessCalendars,
        'actions': ActionsCalendars
    }

    save_fields = [
        'name', 'short_name', 'comments', 'tags', 'service_id', 'osmanager_id',
        'image_id', 'servicesPoolGroup_id', 'initial_srvs', 'cache_l1_srvs',
        'cache_l2_srvs', 'max_srvs', 'show_transports', 'visible',
        'allow_users_remove', 'allow_users_reset', 'ignores_unused',
        'account_id'
    ]

    remove_fields = ['osmanager_id', 'service_id']

    table_title = _('Service Pools')
    table_fields = [
        {
            'name': {
                'title': _('Name')
            }
        },
        {
            'state': {
                'title': _('Status'),
                'type': 'dict',
                'dict': State.dictionary()
            }
        },
        {
            'user_services_count': {
                'title': _('User services'),
                'type': 'number'
            }
        },
        {
            'user_services_in_preparation': {
                'title': _('In Preparation')
            }
        },
        {
            'usage': {
                'title': _('Usage')
            }
        },
        {
            'visible': {
                'title': _('Visible'),
                'type': 'callback'
            }
        },
        {
            'show_transports': {
                'title': _('Shows transports'),
                'type': 'callback'
            }
        },
        {
            'pool_group_name': {
                'title': _('Pool group')
            }
        },
        {
            'parent': {
                'title': _('Parent service')
            }
        },
        {
            'tags': {
                'title': _('tags'),
                'visible': False
            }
        },
    ]
    # Field from where to get "class" and prefix for that class, so this will generate "row-state-A, row-state-X, ....
    table_row_style = {'field': 'state', 'prefix': 'row-state-'}

    custom_methods = [('setFallbackAccess', True), ('getFallbackAccess', True),
                      ('actionsList', True)]

    def item_as_dict(self, item):
        summary = 'summarize' in self._params
        # if item does not have an associated service, hide it (the case, for example, for a removed service)
        # Access from dict will raise an exception, and item will be skipped
        poolGroupId = None
        poolGroupName = _('Default')
        poolGroupThumb = DEFAULT_THUMB_BASE64
        if item.servicesPoolGroup is not None:
            poolGroupId = item.servicesPoolGroup.uuid
            poolGroupName = item.servicesPoolGroup.name
            if item.servicesPoolGroup.image is not None:
                poolGroupThumb = item.servicesPoolGroup.image.thumb64

        state = item.state
        if item.isInMaintenance():
            state = State.MAINTENANCE
        elif userServiceManager().canInitiateServiceFromDeployedService(
                item) is False:
            state = State.SLOWED_DOWN

        val = {
            'id':
            item.uuid,
            'name':
            item.name,
            'short_name':
            item.short_name,
            'tags': [tag.tag for tag in item.tags.all()],
            'parent':
            item.service.name,
            'parent_type':
            item.service.data_type,
            'comments':
            item.comments,
            'state':
            state,
            'thumb':
            item.image.thumb64
            if item.image is not None else DEFAULT_THUMB_BASE64,
            'account':
            item.account.name if item.account is not None else '',
            'account_id':
            item.account.uuid if item.account is not None else None,
            'service_id':
            item.service.uuid,
            'provider_id':
            item.service.provider.uuid,
            'image_id':
            item.image.uuid if item.image is not None else None,
            'initial_srvs':
            item.initial_srvs,
            'cache_l1_srvs':
            item.cache_l1_srvs,
            'cache_l2_srvs':
            item.cache_l2_srvs,
            'max_srvs':
            item.max_srvs,
            'show_transports':
            item.show_transports,
            'visible':
            item.visible,
            'allow_users_remove':
            item.allow_users_remove,
            'allow_users_reset':
            item.allow_users_reset,
            'ignores_unused':
            item.ignores_unused,
            'fallbackAccess':
            item.fallbackAccess,
            'meta_member': [{
                'id': i.uuid,
                'name': i.name
            } for i in item.meta.all()],
        }

        # Extended info
        if not summary:
            state = item.state
            if item.isInMaintenance():
                state = State.MAINTENANCE
            elif userServiceManager().canInitiateServiceFromDeployedService(
                    item) is False:
                state = State.SLOWED_DOWN

            poolGroupId = None
            poolGroupName = _('Default')
            poolGroupThumb = DEFAULT_THUMB_BASE64
            if item.servicesPoolGroup is not None:
                poolGroupId = item.servicesPoolGroup.uuid
                poolGroupName = item.servicesPoolGroup.name
                if item.servicesPoolGroup.image is not None:
                    poolGroupThumb = item.servicesPoolGroup.image.thumb64

            val['state'] = state
            val['thumb'] = item.image.thumb64 if item.image is not None else DEFAULT_THUMB_BASE64
            val['user_services_count'] = item.userServices.exclude(
                state__in=State.INFO_STATES).count()
            val['user_services_in_preparation'] = item.userServices.filter(
                state=State.PREPARING).count()
            val['tags'] = [tag.tag for tag in item.tags.all()]
            val['restrained'] = item.isRestrained()
            val['permission'] = permissions.getEffectivePermission(
                self._user, item)
            val['info'] = Services.serviceInfo(item.service)
            val['pool_group_id'] = poolGroupId
            val['pool_group_name'] = poolGroupName
            val['pool_group_thumb'] = poolGroupThumb
            val['usage'] = item.usage()

        if item.osmanager is not None:
            val['osmanager_id'] = item.osmanager.uuid

        return val

    # Gui related
    def getGui(self, type_):
        if OSManager.objects.count() < 1:  # No os managers, can't create db
            raise ResponseError(
                ugettext(
                    'Create at least one OS Manager before creating a new service pool'
                ))
        if Service.objects.count() < 1:
            raise ResponseError(
                ugettext(
                    'Create at least a service before creating a new service pool'
                ))

        g = self.addDefaultFields([],
                                  ['name', 'short_name', 'comments', 'tags'])

        for f in [
            {
                'name':
                'service_id',
                'values': [gui.choiceItem('', '')] + gui.sortedChoices([
                    gui.choiceItem(v.uuid, v.provider.name + '\\' + v.name)
                    for v in Service.objects.all()
                ]),
                'label':
                ugettext('Base service'),
                'tooltip':
                ugettext('Service used as base of this service pool'),
                'type':
                gui.InputField.CHOICE_TYPE,
                'rdonly':
                True,
                'order':
                100,  # Ensueres is At end
            },
            {
                'name':
                'osmanager_id',
                'values': [gui.choiceItem(-1, '')] + gui.sortedChoices([
                    gui.choiceItem(v.uuid, v.name)
                    for v in OSManager.objects.all()
                ]),
                'label':
                ugettext('OS Manager'),
                'tooltip':
                ugettext('OS Manager used as base of this service pool'),
                'type':
                gui.InputField.CHOICE_TYPE,
                'rdonly':
                True,
                'order':
                101,
            },
            {
                'name':
                'show_transports',
                'value':
                True,
                'label':
                ugettext('Show transports'),
                'tooltip':
                ugettext(
                    'If active, alternative transports for user will be shown'
                ),
                'type':
                gui.InputField.CHECKBOX_TYPE,
                'order':
                110,
                'tab':
                ugettext('Advanced'),
            },
            {
                'name':
                'allow_users_remove',
                'value':
                False,
                'label':
                ugettext('Allow removal by users'),
                'tooltip':
                ugettext(
                    'If active, the user will be allowed to remove the service "manually". Be careful with this, because the user will have the "power" to delete it\'s own service'
                ),
                'type':
                gui.InputField.CHECKBOX_TYPE,
                'order':
                111,
                'tab':
                ugettext('Advanced'),
            },
            {
                'name':
                'allow_users_reset',
                'value':
                False,
                'label':
                ugettext('Allow reset by users'),
                'tooltip':
                ugettext(
                    'If active, the user will be allowed to reset the service'
                ),
                'type':
                gui.InputField.CHECKBOX_TYPE,
                'order':
                112,
                'tab':
                ugettext('Advanced'),
            },
            {
                'name':
                'ignores_unused',
                'value':
                False,
                'label':
                ugettext('Ignores unused'),
                'tooltip':
                ugettext(
                    'If the option is enabled, UDS will not attempt to detect and remove the user services assigned but not in use.'
                ),
                'type':
                gui.InputField.CHECKBOX_TYPE,
                'order':
                113,
                'tab':
                ugettext('Advanced'),
            },
            {
                'name':
                'image_id',
                'values':
                [gui.choiceImage(-1, '--------', DEFAULT_THUMB_BASE64)] +
                gui.sortedChoices([
                    gui.choiceImage(v.uuid, v.name, v.thumb64)
                    for v in Image.objects.all()
                ]),
                'label':
                ugettext('Associated Image'),
                'tooltip':
                ugettext('Image assocciated with this service'),
                'type':
                gui.InputField.IMAGECHOICE_TYPE,
                'order':
                120,
                'tab':
                ugettext('Display'),
            },
            {
                'name':
                'servicesPoolGroup_id',
                'values':
                [gui.choiceImage(-1, _('Default'), DEFAULT_THUMB_BASE64)] +
                gui.sortedChoices([
                    gui.choiceImage(v.uuid, v.name, v.thumb64)
                    for v in ServicesPoolGroup.objects.all()
                ]),
                'label':
                ugettext('Pool group'),
                'tooltip':
                ugettext(
                    'Pool group for this pool (for pool classify on display)'),
                'type':
                gui.InputField.IMAGECHOICE_TYPE,
                'order':
                121,
                'tab':
                ugettext('Display'),
            },
            {
                'name':
                'visible',
                'value':
                True,
                'label':
                ugettext('Visible'),
                'tooltip':
                ugettext('If active, transport will be visible for users'),
                'type':
                gui.InputField.CHECKBOX_TYPE,
                'order':
                107,
                'tab':
                ugettext('Display'),
            },
            {
                'name':
                'initial_srvs',
                'value':
                '0',
                'minValue':
                '0',
                'label':
                ugettext('Initial available services'),
                'tooltip':
                ugettext('Services created initially for this service pool'),
                'type':
                gui.InputField.NUMERIC_TYPE,
                'order':
                130,
                'tab':
                ugettext('Availability'),
            },
            {
                'name':
                'cache_l1_srvs',
                'value':
                '0',
                'minValue':
                '0',
                'label':
                ugettext('Services to keep in cache'),
                'tooltip':
                ugettext(
                    'Services kept in cache for improved user service assignation'
                ),
                'type':
                gui.InputField.NUMERIC_TYPE,
                'order':
                131,
                'tab':
                ugettext('Availability'),
            },
            {
                'name':
                'cache_l2_srvs',
                'value':
                '0',
                'minValue':
                '0',
                'label':
                ugettext('Services to keep in L2 cache'),
                'tooltip':
                ugettext(
                    'Services kept in cache of level2 for improved service generation'
                ),
                'type':
                gui.InputField.NUMERIC_TYPE,
                'order':
                132,
                'tab':
                ugettext('Availability'),
            },
            {
                'name':
                'max_srvs',
                'value':
                '0',
                'minValue':
                '1',
                'label':
                ugettext('Maximum number of services to provide'),
                'tooltip':
                ugettext(
                    'Maximum number of service (assigned and L1 cache) that can be created for this service'
                ),
                'type':
                gui.InputField.NUMERIC_TYPE,
                'order':
                133,
                'tab':
                ugettext('Availability'),
            },
            {
                'name':
                'show_transports',
                'value':
                True,
                'label':
                ugettext('Show transports'),
                'tooltip':
                ugettext(
                    'If active, alternative transports for user will be shown'
                ),
                'type':
                gui.InputField.CHECKBOX_TYPE,
                'tab':
                ugettext('Advanced'),
                'order':
                130,
            },
            {
                'name':
                'account_id',
                'values': [gui.choiceItem(-1, '')] + gui.sortedChoices([
                    gui.choiceItem(v.uuid, v.name)
                    for v in Account.objects.all()
                ]),
                'label':
                ugettext('Accounting'),
                'tooltip':
                ugettext('Account associated to this service pool'),
                'type':
                gui.InputField.CHOICE_TYPE,
                'tab':
                ugettext('Advanced'),
                'order':
                131,
            }
        ]:
            self.addField(g, f)

        return g

    def beforeSave(self, fields):
        # logger.debug(self._params)
        try:
            try:
                service = Service.objects.get(
                    uuid=processUuid(fields['service_id']))
                fields['service_id'] = service.id
            except:
                raise RequestError(
                    ugettext('Base service does not exist anymore'))

            try:
                serviceType = service.getType()

                if serviceType.publicationType is None:
                    self._params['publish_on_save'] = False

                if serviceType.canReset is False:
                    self._params['allow_users_reset'] = False

                if serviceType.needsManager is True:
                    osmanager = OSManager.objects.get(
                        uuid=processUuid(fields['osmanager_id']))
                    fields['osmanager_id'] = osmanager.id
                else:
                    del fields['osmanager_id']

                if serviceType.cacheConstrains is not None:
                    for k, v in serviceType.cacheConstrains.items():
                        fields[k] = v

                if serviceType.maxDeployed != -1:
                    fields['max_srvs'] = min(
                        (int(fields['max_srvs']), serviceType.maxDeployed))
                    fields['initial_srvs'] = min(int(fields['initial_srvs']),
                                                 serviceType.maxDeployed)
                    fields['cache_l1_srvs'] = min(int(fields['cache_l1_srvs']),
                                                  serviceType.maxDeployed)

                if serviceType.usesCache is False:
                    for k in ('initial_srvs', 'cache_l1_srvs', 'cache_l2_srvs',
                              'max_srvs'):
                        fields[k] = 0

            except Exception:
                raise RequestError(
                    ugettext('This service requires an OS Manager'))

            # If max < initial or cache_1 or cache_l2
            fields['max_srvs'] = max(
                (int(fields['initial_srvs']), int(fields['cache_l1_srvs']),
                 int(fields['max_srvs'])))

            # *** ACCOUNT ***
            accountId = fields['account_id']
            fields['account_id'] = None
            logger.debug('Account id: %s', accountId)

            if accountId != '-1':
                try:
                    fields['account_id'] = Account.objects.get(
                        uuid=processUuid(accountId)).id
                except Exception:
                    logger.exception('Getting account ID')

            # **** IMAGE ***
            imgId = fields['image_id']
            fields['image_id'] = None
            logger.debug('Image id: %s', imgId)
            try:
                if imgId != '-1':
                    image = Image.objects.get(uuid=processUuid(imgId))
                    fields['image_id'] = image.id
            except Exception:
                logger.exception('At image recovering')

            # Servicepool Group
            spgrpId = fields['servicesPoolGroup_id']
            fields['servicesPoolGroup_id'] = None
            logger.debug('servicesPoolGroup_id: %s', spgrpId)
            try:
                if spgrpId != '-1':
                    spgrp = ServicesPoolGroup.objects.get(
                        uuid=processUuid(spgrpId))
                    fields['servicesPoolGroup_id'] = spgrp.id
            except Exception:
                logger.exception('At service pool group recovering')

        except (RequestError, ResponseError):
            raise
        except Exception as e:
            raise RequestError(str(e))

    def afterSave(self, item):
        if self._params.get('publish_on_save', False) is True:
            try:
                item.publish()
            except Exception:
                pass

    def deleteItem(self, item):
        try:
            logger.debug('Deleting %s', item)
            item.remove(
            )  # This will mark it for deletion, but in fact will not delete it directly
        except Exception:
            # Eat it and logit
            logger.exception('deleting service pool')

    # Logs
    def getLogs(self, item):
        try:
            return log.getLogs(item)
        except Exception:
            return []

    # Set fallback status
    def setFallbackAccess(self, item):
        self.ensureAccess(item, permissions.PERMISSION_MANAGEMENT)

        fallback = self._params.get('fallbackAccess')
        if fallback != '':
            logger.debug('Setting fallback of %s to %s', item.name, fallback)
            item.fallbackAccess = fallback
            item.save()
        return item.fallbackAccess

    def getFallbackAccess(self, item):
        return item.fallbackAccess

    #  Returns the action list based on current element, for calendar
    def actionsList(self, item):
        validActions = ()
        itemInfo = item.service.getType()
        if itemInfo.usesCache is True:
            validActions += (CALENDAR_ACTION_INITIAL, CALENDAR_ACTION_CACHE_L1,
                             CALENDAR_ACTION_MAX)
            if itemInfo.usesCache_L2 is True:
                validActions += (CALENDAR_ACTION_CACHE_L2, )

        if itemInfo.publicationType is not None:
            validActions += (CALENDAR_ACTION_PUBLISH, )

        # Transport & groups actions
        validActions += (CALENDAR_ACTION_ADD_TRANSPORT,
                         CALENDAR_ACTION_DEL_TRANSPORT,
                         CALENDAR_ACTION_ADD_GROUP, CALENDAR_ACTION_DEL_GROUP)
        return validActions
예제 #18
0
 def getFields(self, parent):
     return [
         {'name': {'title': _('Group'), 'visible': True, 'type': 'icon_dict', 'icon_dict': {'group': 'fa fa-group text-success', 'meta': 'fa fa-gears text-info'}}},
         {'comments': {'title': _('Comments')}},
         {'state': {'title': _('state'), 'type': 'dict', 'dict': State.dictionary()}},
     ]