Source code for networkapi.api_vip_request.models

# -*- coding: utf-8 -*-
import logging
from itertools import chain

from _mysql_exceptions import OperationalError
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
from django.db.models import get_model
from django.db.models import Q

from networkapi.admin_permission import AdminPermission
from networkapi.api_pools import exceptions as exceptions_pool
from networkapi.api_rest.exceptions import ValidationAPIException
from networkapi.api_vip_request import exceptions
from networkapi.api_vip_request import syncs
from networkapi.models.BaseModel import BaseModel
from networkapi.plugins.factory import PluginFactory
from networkapi.util.decorators import cached_property
from networkapi.util.geral import get_app

log = logging.getLogger(__name__)


[docs]class VipRequest(BaseModel): log = logging.getLogger('VipRequest') id = models.AutoField( primary_key=True, ) created = models.BooleanField( default=False, db_column='created') ipv4 = models.ForeignKey( 'ip.Ip', db_column='id_ipv4', blank=True, null=True ) ipv6 = models.ForeignKey( 'ip.Ipv6', db_column='id_ipv6', blank=True, null=True ) environmentvip = models.ForeignKey( 'ambiente.EnvironmentVip', db_column='id_environmentvip', blank=True, null=True ) business = models.CharField( max_length=255, db_column='business', null=True) service = models.CharField( max_length=255, db_column='service', null=True) name = models.CharField( max_length=255, db_column='name', null=True) class Meta(BaseModel.Meta): db_table = u'vip_request' managed = True def __str__(self): return str(self.id) @cached_property def dscp(self): try: dscp = self.viprequestdscp_set.get() return dscp.dscp except ObjectDoesNotExist: return None @cached_property def equipments(self): if self.ipv4 and not self.ipv6: eqpts = self.ipv4.ipequipamento_set.all()\ .prefetch_related('equipamento') elif self.ipv6 and not self.ipv4: eqpts = self.ipv6.ipv6equipament_set.all()\ .prefetch_related('equipamento') elif self.ipv4 and self.ipv6: eqpts_v4 = self.ipv4.ipequipamento_set.all()\ .prefetch_related('equipamento') eqpts_v6 = self.ipv6.ipv6equipament_set.all()\ .prefetch_related('equipamento') eqpts = list(chain(eqpts_v4, eqpts_v6)) eqpts = [eqpt.equipamento for eqpt in eqpts] return eqpts @cached_property def default_names(self): names = [port.identifier for port in self.viprequestport_set.all()] names = list(set(names)) return names @cached_property def ports(self): ports = self.viprequestport_set.all() return ports @cached_property def options(self): options = self.viprequestoptionvip_set.all() return options @cached_property def groups_permissions(self): ogp_models = get_app('api_ogp', 'models') perms = ogp_models.ObjectGroupPermission\ .get_by_object(self.id, AdminPermission.OBJ_TYPE_VIP) return perms
[docs] @classmethod def get_by_pk(cls, id): """"Get Vip Request by id. @return: Vip Request. @raise VipRequestNotFoundError: Vip Request not registered. @raise VipRequestError: Failed to search for the Vip Request. @raise OperationalError: Lock wait timeout exceeded. """ try: return VipRequest.objects.get(id=id) except ObjectDoesNotExist, e: cls.log.error(u'vip request not found. pk {}'.format(id)) raise exceptions.VipRequestNotFoundError(id) except OperationalError, e: cls.log.error(u'Lock wait timeout exceeded.') raise OperationalError( e, u'Lock wait timeout exceeded; try restarting transaction') except Exception, e: cls.log.error(u'Failure to search the option vip.') raise exceptions.VipRequestError( e, u'Failure to search the vip request.')
def _is_ipv4_in_use(self, ipv4, id_vip=None): id_vip = id_vip if id_vip else self.id spm_model = get_model('requisicaovips', 'ServerPoolMember') vp_model = get_model('api_vip_request', 'VipRequest') is_in_use = True pm_count = spm_model.objects.filter(ip=ipv4).exclude( server_pool__vipporttopool__requisicao_vip__id=self.id ).count() vip_count = vp_model.objects.filter( ipv4=ipv4 ).exclude(pk=id_vip).count() if vip_count == 0 and pm_count == 0: is_in_use = False return is_in_use def _is_ipv6_in_use(self, ipv6, id_vip=None): id_vip = id_vip if id_vip else self.id spm_model = get_model('requisicaovips', 'ServerPoolMember') vp_model = get_model('api_vip_request', 'VipRequest') is_in_use = True pm_count = spm_model.objects.filter(ipv6=ipv6).exclude( server_pool__vipporttopool__requisicao_vip__ipv6=self.id ).count() vip_count = vp_model.objects.filter( ipv6=ipv6 ).exclude(pk=id_vip).count() if vip_count == 0 and pm_count == 0: is_in_use = False return is_in_use def _delete_pools_related(self): ogp_models = get_app('api_ogp', 'models') # Pools related with vip and was not created pools = self.get_pool_related( self.id ).filter(pool_created=False) # Pools assoc with others Vips pools_assoc = pools.exclude( viprequestportpool__vip_request_port__vip_request__id=self.id ) # Remove pool not created and not assoc with others vips for pool in pools: if pool not in pools_assoc: pool_id = pool.id pool.delete() # Deletes Permissions ogp_models.ObjectGroupPermission.objects.filter( object_type__name=AdminPermission.OBJ_TYPE_POOL, object_value=pool_id ).delete() log.info("Deletes Pool Permissions")
[docs] def get_dscp(self): reqvip_models = get_app('requisicaovips', 'models') members = reqvip_models.ServerPoolMember.objects.filter( server_pool__viprequestportpool__vip_request_port__vip_request__id=self.id) eqpts = [member.equipment.id for member in members] members = VipRequestDSCP.objects.filter( vip_request__viprequestport__viprequestportpool__server_pool__serverpoolmember__in=reqvip_models.ServerPoolMember.objects.filter( ip__ipequipamento__equipamento__in=eqpts ) ).distinct().values('dscp') mb = [i.get('dscp') for i in members] perm = range(3, 64) perm_new = list(set(perm) - set(mb)) if perm_new: return perm_new[0] else: raise Exception( 'Can\'t use pool because pool members have dscp is sold out')
def _create_option(self, options): """create options""" reqvip_models = get_app('requisicaovips', 'models') for option in options: opt = VipRequestOptionVip() opt_map = { 'vip_request': self.id, 'optionvip': option } opt.create_v3(opt_map) # DSCP try: dsrl3 = reqvip_models.OptionVip.objects.get( nome_opcao_txt='DSRL3', tipo_opcao='Retorno de trafego' ) except ObjectDoesNotExist: pass else: if dsrl3.id in options: vip_dscp = VipRequestDSCP() dscp_map = { 'vip_request': self.id, 'dscp': self.get_dscp(), } vip_dscp.create_v3(dscp_map) def _delete_option(self, options): """Deletes options""" reqvip_models = get_app('requisicaovips', 'models') VipRequestOptionVip.objects.filter( vip_request=self.id, optionvip__in=options ).delete() # DSCP try: dsrl3 = reqvip_models.OptionVip.objects.get( nome_opcao_txt='DSRL3', tipo_opcao='Retorno de trafego' ) except ObjectDoesNotExist: pass else: if dsrl3.id in options: VipRequestDSCP.objects.filter(vip_request=self.id).delete()
[docs] def validate_save(self, vip_request, permit_created=False): env_models = get_app('ambiente', 'models') reqvip_models = get_app('requisicaovips', 'models') has_identifier = VipRequest.objects.filter( environmentvip=vip_request['environmentvip'] ) # validate ipv4 if vip_request['ipv4']: has_identifier = has_identifier.filter(ipv4=vip_request['ipv4']) vips = env_models.EnvironmentVip.objects.filter( networkipv4__ip=vip_request['ipv4'] ).filter( id=vip_request['environmentvip'] ) if not vips: raise exceptions.IpNotFoundByEnvironment( 'Environment of Ip: %s is different of environment of vip ' 'request: %s. Look the association of network of IP with ' 'environment vip.' % (vip_request['ipv4'], vip_request['name']) ) # validate ipv6 if vip_request['ipv6']: has_identifier = has_identifier.filter(ipv6=vip_request['ipv6']) vips = env_models.EnvironmentVip.objects.filter( networkipv6__ipv6=vip_request['ipv6'] ).filter( id=vip_request['environmentvip'] ) if not vips: raise exceptions.IpNotFoundByEnvironment( 'Environment of Ip: %s is different of environment of vip ' 'request: %s. Look the association of network of IP with ' 'environment vip.' % (vip_request['ipv6'], vip_request['name']) ) # validate change info when vip created if vip_request.get('id'): vip = VipRequest.get_by_pk(vip_request.get('id')) if vip.created: if not permit_created: raise exceptions.CreatedVipRequestValuesException() if vip.environmentvip_id != vip_request['environmentvip']: raise exceptions.CreatedVipRequestValuesException( 'Environment vip of vip request id: %s' % (vip_request.get('id'))) # cannot change ip if vip.ipv4: if vip.ipv4.id != vip_request['ipv4']: raise exceptions.CreatedVipRequestValuesException( 'Ipv4 of vip request id: %s' % (vip_request.get('id'))) if vip.ipv6: if vip.ipv6.id != vip_request['ipv6']: raise exceptions.CreatedVipRequestValuesException( 'Ipv6 of vip request id: %s' % (vip_request.get('id'))) # change traffic return options = [ op.optionvip.id for op in vip.viprequestoptionvip_set.all()] if vip_request['options']['traffic_return'] not in options: raise exceptions.CreatedVipRequestValuesException( 'Traffic Return of vip request id: %s' % (vip_request.get('id'))) for port in vip_request.get('ports'): if port.get('id'): # cannot change options of port port_obj = vip.viprequestport_set.get( id=port.get('id')) options_obj_l4 = port_obj.viprequestportoptionvip_set.filter( optionvip=port.get('options').get('l4_protocol')) options_obj_l7 = port_obj.viprequestportoptionvip_set.filter( optionvip=port.get('options').get('l7_protocol')) if not options_obj_l4 or not options_obj_l7: raise exceptions.CreatedVipRequestValuesException( 'Options of port %s of vip request id: %s' % (port['port'], vip_request.get('id'))) has_identifier = has_identifier.exclude(id=vip_request.get('id')) # validate option vip assoc with environment vip opts = list() for option in vip_request['options']: opt = dict() if option == 'cache_group' and vip_request['options'].get(option) is not None: opt['id'] = vip_request['options'].get(option) opt['tipo_opcao'] = 'cache' elif option == 'persistence' and vip_request['options'].get(option) is not None: opt['id'] = vip_request['options'].get(option) opt['tipo_opcao'] = 'Persistencia' elif option == 'traffic_return' and vip_request['options'].get(option) is not None: opt['id'] = vip_request['options'].get(option) opt['tipo_opcao'] = 'Retorno de trafego' elif option == 'timeout' and vip_request['options'].get(option) is not None: opt['id'] = vip_request['options'].get(option) opt['tipo_opcao'] = 'timeout' if opt: opts.append(opt) for opt in opts: try: option = reqvip_models.OptionVip.objects.get( Q(**opt), optionvipenvironmentvip__environment__id=vip_request[ 'environmentvip'] ) except: raise Exception( 'Invalid option %s: %s, vip request: %s, because ' 'environment vip is not associated to options or ' 'not exists.' % (opt['tipo_opcao'], opt['id'], vip_request['name']) ) # validate pools associates for port in vip_request.get('ports'): opts = list() for option in port['options']: opt = dict() if option == 'l4_protocol' and port['options'].get(option) is not None: opt['id'] = port['options'].get(option) opt['tipo_opcao'] = 'l4_protocol' elif option == 'l7_protocol' and port['options'].get(option) is not None: opt['id'] = port['options'].get(option) opt['tipo_opcao'] = 'l7_protocol' if opt: opts.append(opt) for opt in opts: try: option = reqvip_models.OptionVip.objects.get( Q(**opt), optionvipenvironmentvip__environment__id=vip_request[ 'environmentvip'] ) except: raise ValidationAPIException( u'Invalid option %s: %s, port: %s, vip request: %s, ' 'because environmentvip is not associated to options ' 'or not exists.' % ( opt['tipo_opcao'], opt['id'], port['port'], vip_request['name'] ) ) dsrl3 = reqvip_models.OptionVip.objects.filter( nome_opcao_txt='DSRL3', tipo_opcao='Retorno de trafego', id=vip_request['options']['traffic_return'], ) # validate dsrl3: 1 pool by port if dsrl3 and len(port['pools']) > 1: raise ValidationAPIException( u'Vip %s has DSRL3 and can not to have L7' % ( vip_request['name']) ) count_l7_opt = 0 for pool in port['pools']: # validate option vip(l7_rule) assoc with environment vip try: l7_rule_opt = reqvip_models.OptionVip.objects.get( id=pool['l7_rule'], tipo_opcao='l7_rule', optionvipenvironmentvip__environment__id=vip_request[ 'environmentvip'] ) except: raise ValidationAPIException( u'Invalid option l7_rule: %s, pool: %s, port: %s,' 'viprequest: %s, because environmentvip is not ' 'associated to options or not exists' % ( pool['l7_rule'], pool['server_pool'], port['port'], vip_request['name']) ) # control to validate l7_rule "default_vip" in one pool by port if l7_rule_opt.nome_opcao_txt == 'default_vip': count_l7_opt += 1 # Vips associates with same pool pool_assoc_vip = reqvip_models.ServerPool()\ .get_vips_related(pool['server_pool']) # Exclude current VIP if vip_request.get('id'): pool_assoc_vip = pool_assoc_vip.exclude( id=vip_request.get('id')) # validate dsrl3: pool assoc only vip and no l7 rules if dsrl3: # Vip with dscp(dsrl3) cannot L7 rules if l7_rule_opt.nome_opcao_txt != 'default_vip': raise ValidationAPIException( u'Option Vip of pool %s of Vip Request %s must be ' 'default_vip' % (pool['server_pool'], vip_request['name']) ) else: pool_assoc_vip = pool_assoc_vip.exclude( viprequestdscp__isnull=True) if pool_assoc_vip: raise ValidationAPIException( u'Pool %s must be associated to a only 1 vip ' 'request, when vip request has dslr3 option' % (pool['server_pool'])) try: sp = reqvip_models.ServerPool.objects.get( id=pool['server_pool']) except Exception, e: self.log.error(e) raise exceptions_pool.PoolDoesNotExistException( pool['server_pool']) # validate dsrl3: Pool must have same port of vip if dsrl3: if int(sp.default_port) != int(port['port']): raise ValidationAPIException( u'Pool %s must have same port of vip %s' % (pool['server_pool'], vip_request['name']) ) spms = reqvip_models.ServerPoolMember.objects.filter( server_pool=pool['server_pool']) for spm in spms: # validate dsrl3: Pool Members must have same port of vip if dsrl3: if int(spm.port_real) != int(port['port']): ip_mb = spm.ip if spm.ip else spm.ipv6 raise ValidationAPIException( u'Pool Member %s of Pool {} must have same ' 'port of vip %s' % ( ip_mb, pool['server_pool'], vip_request['name']) ) if spm.ip: vips = env_models.EnvironmentVip.objects.filter( environmentenvironmentvip__environment__vlan__networkipv4__ip=spm.ip ).filter( id=vip_request['environmentvip'] ) if not vips: raise exceptions.ServerPoolMemberDiffEnvironmentVipException( spm.identifier) if spm.ipv6: vips = env_models.EnvironmentVip.objects.filter( environmentenvironmentvip__environment__vlan__networkipv6__ipv6=spm.ipv6 ).filter( id=vip_request['environmentvip'] ) if not vips: raise exceptions.ServerPoolMemberDiffEnvironmentVipException( spm.identifier) if count_l7_opt < 1: raise ValidationAPIException( u'Port {} of Vip Request {} must have one pool with l7_rule equal "default_vip"'.format( port['port'], vip_request['name']) ) if count_l7_opt > 1: raise ValidationAPIException( u'Port {} of Vip Request {} must have only pool with l7_rule equal "default_vip"'.format( port['port'], vip_request['name']) )
[docs] def create_v3(self, vip_map, user): """Creates Vip Request.""" ip_models = get_app('ip', 'models') env_models = get_app('ambiente', 'models') reqvip_models = get_app('requisicaovips', 'models') ogp_models = get_app('api_ogp', 'models') self.validate_save(vip_map, permit_created=False) req = reqvip_models.RequisicaoVips() req.save() self.id = req.id self.name = vip_map.get('name') self.service = vip_map.get('service') self.business = vip_map.get('business') # Environment VIP self.environmentvip = env_models.EnvironmentVip\ .get_by_pk(vip_map.get('environmentvip')) # IPv4 if vip_map.get('ipv4'): self.ipv4 = ip_models.Ip.get_by_pk(vip_map.get('ipv4')) # IPv6 if vip_map.get('ipv6'): self.ipv6 = ip_models.Ipv6.get_by_pk(vip_map.get('ipv6')) self.save() # Options VIP option_create = [int(vip_map['options'][key]) for key in vip_map['options']] self._create_option(option_create) # Ports for port in vip_map['ports']: pt = VipRequestPort() port['vip_request'] = self.id pt.create_v3(port) # Permissions perm = ogp_models.ObjectGroupPermission() perm.create_perms(vip_map, self.id, AdminPermission.OBJ_TYPE_VIP, user) # sync with old tables syncs.new_to_old(self)
[docs] def update_v3(self, vip_map, user, permit_created=False): """Updates Vip Request.""" ip_models = get_app('ip', 'models') env_models = get_app('ambiente', 'models') ogp_models = get_app('api_ogp', 'models') self.validate_save(vip_map, permit_created=permit_created) self.name = vip_map.get('name') self.service = vip_map.get('service') self.business = vip_map.get('business') # Environment VIP self.environmentvip = env_models.EnvironmentVip\ .get_by_pk(vip_map.get('environmentvip')) # IPv4 if vip_map.get('ipv4'): self.ipv4 = ip_models.Ip.get_by_pk(vip_map.get('ipv4')) # IPv6 if vip_map.get('ipv6'): self.ipv6 = ip_models.Ipv6.get_by_pk(vip_map.get('ipv6')) self.save() option_ids = [int(option.optionvip.id) for option in self.viprequestoptionvip_set.all()] options = [int(vip_map['options'][key]) for key in vip_map['options']] option_remove = list(set(option_ids) - set(options)) option_create = list(set(options) - set(option_ids)) self._create_option(option_create) self._delete_option(option_remove) # Ports for port in vip_map.get('ports'): try: pt = VipRequestPort.objects.get( vip_request_id=self.id, port=port['port']) except: pt = VipRequestPort() port['vip_request'] = self.id pt.create_v3(port) else: pt.update_v3(port) # Deletes ports ports_ids = [port.get('port') for port in vip_map.get('ports')] VipRequestPort.objects.filter( vip_request_id=self.id ).exclude( port__in=ports_ids ).delete() # Permissions perm = ogp_models.ObjectGroupPermission() perm.update_perms(vip_map, self.id, AdminPermission.OBJ_TYPE_VIP, user) # sync with old tables syncs.new_to_old(self)
[docs] def delete_v3(self, bypass_ipv4=False, bypass_ipv6=False, sync=True): """Delete Vip Request. @raise VipConstraintCreated: Vip request can not be deleted because it is created in equipment. """ ip_models = get_app('ip') ogp_models = get_app('api_ogp', 'models') id_vip = self.id id_ipv4 = self.ipv4 id_ipv6 = self.ipv6 if self.created: raise exceptions.VipConstraintCreated(id_vip) self._delete_pools_related() self.delete() # Deletes Permissions ogp_models.ObjectGroupPermission.objects.filter( object_type__name=AdminPermission.OBJ_TYPE_VIP, object_value=id_vip ).delete() # delete Ipv4 if self.ipv4 and bypass_ipv4 is False: if not self._is_ipv4_in_use(id_ipv4, id_vip): try: self.ipv4.delete_v3() except ip_models.IpCantBeRemovedFromVip: self.log.info( 'Tried to delete Ipv4, because assoc with in more Vips.') pass except Exception, e: self.log.error(e) raise Exception('Error to delete Ipv4: %s.', e) # delete Ipv6 if self.ipv6 and bypass_ipv6 is False: if not self._is_ipv6_in_use(id_ipv6, id_vip): try: self.ipv6.delete_v3() except ip_models.IpCantBeRemovedFromVip: self.log.info( 'Tried to delete Ipv6, because assoc with in more Vips.') pass except Exception, e: self.log.error(e) raise Exception('Error to delete Ipv6: %s.', e) # sync with old tables if sync: syncs.delete_old(id_vip)
[docs]class VipRequestOptionVip(BaseModel): log = logging.getLogger('VipRequestOptionVip') id = models.AutoField( primary_key=True, db_column='id' ) vip_request = models.ForeignKey( VipRequest, db_column='id_vip_request', ) optionvip = models.ForeignKey( 'requisicaovips.OptionVip', db_column='id_opcoesvip', ) @cached_property def traffic_return(self): opt = self.optionvip \ if self.optionvip.tipo_opcao == 'Retorno de trafego' \ else None return opt @cached_property def cache_group(self): opt = self.optionvip \ if self.optionvip.tipo_opcao == 'cache' \ else None return opt @cached_property def persistence(self): opt = self.optionvip \ if self.optionvip.tipo_opcao == 'Persistencia' \ else None return opt @cached_property def timeout(self): opt = self.optionvip \ if self.optionvip.tipo_opcao == 'timeout' \ else None return opt class Meta(BaseModel.Meta): db_table = u'vip_request_optionsvip' managed = True
[docs] @classmethod def get_by_pk(cls, id): """"Get Vip Request Option Vip by id. @return: Vip Request Option Vip. @raise VipRequestOptionVipNotFoundError: Vip Request Option Vip not registered. @raise VipRequestOptionVipError: Failed to search for the Vip Request Option Vip. @raise OperationalError: Lock wait timeout exceeded. """ try: return VipRequestOptionVip.objects.get(id=id) except ObjectDoesNotExist, e: cls.log.error( u'vip request option vip not found. pk {}'.format(id)) raise exceptions.VipRequestOptionVipNotFoundError(id) except OperationalError, e: cls.log.error(u'Lock wait timeout exceeded.') raise OperationalError( e, u'Lock wait timeout exceeded; try restarting transaction') except Exception, e: cls.log.error(u'Failure to search the option vip.') raise exceptions.VipRequestOptionVipError( e, u'Failure to search the vip request option vip.')
[docs] @classmethod def get_by_kind(cls, vip_request_id, kind): """"Get Vip Request Option Vip by Vip Request and kind. @return: Vip Request Option Vip. @raise VipRequestOptionVipNotFoundError: Vip Request Option Vip not registered. @raise VipRequestOptionVipError: Failed to search for the Vip Request Option Vip. @raise OperationalError: Lock wait timeout exceeded. """ try: return VipRequestOptionVip.objects.get( vip_request_id=vip_request_id, optionvip__tipo_opcao=kind) except ObjectDoesNotExist, e: cls.log.error( u'Vip request option vip not found. Vip {} ' u'kind {}'.format(vip_request_id, kind)) raise exceptions.VipRequestOptionVipNotFoundError(id) except OperationalError, e: cls.log.error(u'Lock wait timeout exceeded.') raise OperationalError( e, u'Lock wait timeout exceeded; try restarting transaction') except Exception, e: cls.log.error(u'Failure to search the option vip.') raise exceptions.VipRequestOptionVipError( e, u'Failure to search the vip request option vip.')
[docs] def create_v3(self, option_map): reqvip_models = get_app('requisicaovips', 'models') self.vip_request = VipRequest\ .get_by_pk(option_map.get('vip_request')) self.optionvip = reqvip_models.OptionVip\ .get_by_pk(option_map.get('optionvip')) self.save()
[docs]class VipRequestPort(BaseModel): log = logging.getLogger('VipRequestPort') id = models.AutoField( primary_key=True, db_column='id' ) vip_request = models.ForeignKey( VipRequest, db_column='id_vip_request', ) port = models.IntegerField( max_length=5, db_column='port' ) identifier = models.CharField( max_length=255, db_column='identifier', null=True ) @cached_property def pools(self): pools = self.viprequestportpool_set.all() return pools @cached_property def options(self): options = self.viprequestportoptionvip_set.all() return options class Meta(BaseModel.Meta): db_table = u'vip_request_port' managed = True
[docs] @classmethod def get_by_pk(cls, id): """"Get Vip Request Port by id. @return: Vip Request Port. @raise VipRequestPortNotFoundError: Vip Request Port not registered. @raise VipRequestPortError: Failed to search for the Vip Request Port. @raise OperationalError: Lock wait timeout exceeded. """ try: return VipRequestPort.objects.get(id=id) except ObjectDoesNotExist, e: cls.log.error(u'vip request port not found. pk {}'.format(id)) raise exceptions.VipRequestPortNotFoundError(id) except OperationalError, e: cls.log.error(u'Lock wait timeout exceeded.') raise OperationalError( e, u'Lock wait timeout exceeded; try restarting transaction') except Exception, e: cls.log.error(u'Failure to search the option vip.') raise exceptions.VipRequestPortError( e, u'Failure to search the vip request port.')
[docs] def create_v3(self, vip_port_map): # save port facade_eqpt = get_app('api_equipment', 'facade') self.vip_request = VipRequest.get_by_pk( vip_port_map.get('vip_request')) self.port = vip_port_map.get('port') eqpts = facade_eqpt.get_eqpt_by_envvip( self.vip_request.environmentvip.id) if eqpts: plugin = PluginFactory.factory(eqpts[0]) identifier = plugin.get_name_eqpt( self.vip_request, vip_port_map['port']) self.identifier = identifier self.save() # L4 Protocol opt = VipRequestPortOptionVip() opt_map = { 'vip_request_port': self.id, 'optionvip': vip_port_map['options']['l4_protocol'] } opt.create_v3(opt_map) # L7 Protocol opt = VipRequestPortOptionVip() opt_map = { 'vip_request_port': self.id, 'optionvip': vip_port_map['options']['l7_protocol'] } opt.create_v3(opt_map) # Pools for pool in vip_port_map.get('pools'): pool_map = { 'vip_request_port': self.id, 'server_pool': pool.get('server_pool'), 'optionvip': pool.get('l7_rule'), 'val_optionvip': pool.get('l7_value'), 'order': pool.get('order') } pl = VipRequestPortPool() pl.create_v3(pool_map)
[docs] def update_v3(self, vip_port_map): facade_eqpt = get_app('api_equipment', 'facade') if not self.identifier or self.port != vip_port_map['port']: eqpts = facade_eqpt\ .get_eqpt_by_envvip(self.vip_request.environmentvip.id) if eqpts: plugin = PluginFactory.factory(eqpts[0]) identifier = plugin.get_name_eqpt( self.vip_request, vip_port_map['port'] ) self.identifier = identifier self.save() # L4 Protocol try: opt = VipRequestPortOptionVip.objects.get( vip_request_port_id=self.id, optionvip_id=vip_port_map.get('options').get('l4_protocol')) except: opt = VipRequestPortOptionVip() opt_map = { 'vip_request_port': self.id, 'optionvip': vip_port_map['options']['l4_protocol'] } opt.create_v3(opt_map) # L7 Protocol try: opt = VipRequestPortOptionVip.objects.get( vip_request_port_id=self.id, optionvip_id=vip_port_map.get('options').get('l7_protocol')) except: opt = VipRequestPortOptionVip() opt_map = { 'vip_request_port': self.id, 'optionvip': vip_port_map['options']['l7_protocol'] } opt.create_v3(opt_map) # Deletes option by port VipRequestPortOptionVip.objects.filter( vip_request_port_id=self.id ).exclude( optionvip_id__in=[ vip_port_map.get('options').get('l4_protocol'), vip_port_map.get('options').get('l7_protocol')] ).delete() # Pools pools = list() for pool in vip_port_map.get('pools'): pool_map = { 'vip_request_port': self.id, 'server_pool': pool.get('server_pool'), 'optionvip': pool.get('l7_rule'), 'val_optionvip': pool.get('l7_value'), 'order': pool.get('order') } try: pl = VipRequestPortPool.objects.get( vip_request_port=self.id, id=pool.get('id')) except: pl = VipRequestPortPool() pl.create_v3(pool_map) else: pl.update_v3(pool_map) pools.append(pl.id) # Deletes pool by port VipRequestPortPool.objects.filter( vip_request_port=self.id ).exclude( id__in=pools ).delete()
[docs]class VipRequestPortOptionVip(BaseModel): log = logging.getLogger('VipRequestPortOptionVip') id = models.AutoField( primary_key=True, db_column='id' ) vip_request_port = models.ForeignKey( VipRequestPort, db_column='id_vip_request_port', ) optionvip = models.ForeignKey( 'requisicaovips.OptionVip', db_column='id_opcoesvip', ) class Meta(BaseModel.Meta): db_table = u'vip_request_port_optionsvip' managed = True
[docs] @classmethod def get_by_pk(cls, id): """"Get Vip Request Port Option Vip by id. @return: Vip Request Port Option Vip. @raise VipRequestPortOptionVipNotFoundError: Vip Request Port Option Vip not registered. @raise VipRequestPortOptionVipError: Failed to search for the Vip Request Port Option Vip. @raise OperationalError: Lock wait timeout exceeded. """ try: return VipRequestPortOptionVip.objects.get(id=id) except ObjectDoesNotExist, e: cls.log.error( u'vip request port option vip not found. pk {}'.format(id)) raise exceptions.VipRequestPortOptionVipNotFoundError(id) except OperationalError, e: cls.log.error(u'Lock wait timeout exceeded.') raise OperationalError( e, u'Lock wait timeout exceeded; try restarting transaction') except Exception, e: cls.log.error(u'Failure to search the option vip.') raise exceptions.VipRequestPortOptionVipError( e, u'Failure to search the vip request port option vip.')
[docs] def create_v3(self, option_map): reqvip_models = get_app('requisicaovips', 'models') self.vip_request_port = VipRequestPort\ .get_by_pk(option_map.get('vip_request_port')) self.optionvip = reqvip_models.OptionVip\ .get_by_pk(option_map.get('optionvip')) self.save()
[docs]class VipRequestPortPool(BaseModel): log = logging.getLogger('VipRequestPortPool') id = models.AutoField( primary_key=True, db_column='id' ) vip_request_port = models.ForeignKey( VipRequestPort, db_column='id_vip_request_port', ) optionvip = models.ForeignKey( 'requisicaovips.OptionVip', db_column='id_opcoesvip', ) server_pool = models.ForeignKey( 'requisicaovips.ServerPool', db_column='id_server_pool', ) val_optionvip = models.CharField( max_length=255, db_column='val_optionvip', blank=True, null=True ) order = models.IntegerField( null=True ) @cached_property def l7_rule(self): return self.optionvip class Meta(BaseModel.Meta): db_table = u'vip_request_port_pool' managed = True
[docs] @classmethod def get_by_pk(cls, id): """"Get Vip Request Port Pool by id. @return: Vip Request Port Pool. @raise VipRequestPortPoolNotFoundError: Vip Request Port Pool not registered. @raise VipRequestPortPoolError: Failed to search for the Vip Request Port Pool. @raise OperationalError: Lock wait timeout exceeded. """ try: return VipRequestPortPool.objects.get(id=id) except ObjectDoesNotExist, e: cls.log.error(u'vip request port pool not found. pk {}'.format(id)) raise exceptions.VipRequestPortPoolNotFoundError(id) except OperationalError, e: cls.log.error(u'Lock wait timeout exceeded.') raise OperationalError( e, u'Lock wait timeout exceeded; try restarting transaction') except Exception, e: cls.log.error(u'Failure to search the option vip.') raise exceptions.VipRequestPortPoolError( e, u'Failure to search the vip request port pool.')
[docs] def create_v3(self, pool_map): reqvip_models = get_app('requisicaovips', 'models') self.vip_request_port = VipRequestPort\ .get_by_pk(pool_map.get('vip_request_port')) self.server_pool = reqvip_models.ServerPool\ .get_by_pk(pool_map.get('server_pool')) self.optionvip = reqvip_models.OptionVip\ .get_by_pk(pool_map.get('optionvip')) self.val_optionvip = pool_map.get('val_optionvip') self.order = pool_map.get('order') self.save()
[docs] def update_v3(self, pool_map): reqvip_models = get_app('requisicaovips', 'models') self.server_pool = reqvip_models.ServerPool\ .get_by_pk(pool_map.get('server_pool')) self.optionvip = reqvip_models.OptionVip\ .get_by_pk(pool_map.get('optionvip')) self.val_optionvip = pool_map.get('val_optionvip') self.order = pool_map.get('order') self.save()
[docs]class VipRequestDSCP(BaseModel): log = logging.getLogger('VipRequestDSCP') id = models.AutoField( primary_key=True, db_column='id' ) vip_request = models.ForeignKey( VipRequest, db_column='id_vip_request', ) dscp = models.IntegerField( max_length=2, db_column='dscp') class Meta(BaseModel.Meta): db_table = u'vip_request_dscp' managed = True
[docs] @classmethod def get_by_pk(cls, id): """"Get Vip Request DSCP by id. @return: Vip Request DSCP. @raise VipRequestDscpNotFoundError: Vip Request DSCP not registered. @raise VipRequestDscpError: Failed to search for the Vip Request DSCP. @raise OperationalError: Lock wait timeout exceeded. """ try: return VipRequestDSCP.objects.get(id=id) except ObjectDoesNotExist, e: cls.log.error(u'vip request dscp not found. pk {}'.format(id)) raise exceptions.VipRequestDSCPNotFoundError(id) except OperationalError, e: cls.log.error(u'Lock wait timeout exceeded.') raise OperationalError( e, u'Lock wait timeout exceeded; try restarting transaction') except Exception, e: cls.log.error(u'Failure to search the option vip.') raise exceptions.VipRequestDSCPError( e, u'Failure to search the vip request dscp.')
[docs] def create_v3(self, dscp_map): self.vip_request = VipRequest\ .get_by_pk(dscp_map.get('vip_request')) self.dscp = dscp_map.get('dscp') self.save()