def aplicar(rack): path_config = settings.PATH_TO_CONFIG +'*'+rack.nome+'*' arquivos = glob.glob(path_config) #Get all files and search for equipments of the rack for var in arquivos: name_equipaments = var.split('/')[-1][:-4] for nome in name_equipaments: #Check if file is config relative to this rack if rack.nome in nome: #Apply config only in spines. Leaves already have all necessary config in startup if "ADD" in nome: #Check if equipment in under maintenance. If so, does not aplly on it try: equip = Equipamento.get_by_name(nome) if not equip.maintenance: (erro, result) = commands.getstatusoutput("/usr/bin/backuper -T acl -b %s -e -i %s -w 300" % (var, nome)) if erro: raise RackAplError(None, None, "Falha ao aplicar as configuracoes: %s" %(result)) except RackAplError, e: raise e except: #Error equipment not found, do nothing pass
def post(self, *args, **kwargs): try: log.info('RACK deploy.') rack_id = kwargs.get('rack_id') rack = facade.get_by_pk(rack_id) try: PATH_TO_ADD_CONFIG = get_variable('path_to_add_config') REL_PATH_TO_ADD_CONFIG = get_variable('rel_path_to_add_config') except ObjectDoesNotExist: raise var_exceptions.VariableDoesNotExistException("Erro buscando a variável PATH_TO_ADD_CONFIG ou " "REL_PATH_TO_ADD_CONFIG.") path_config = PATH_TO_ADD_CONFIG + '*' + rack.nome + '*' arquivos = glob.glob(path_config) # Get all files and search for equipments of the rack for var in arquivos: filename_equipments = var.split('/')[-1] rel_filename = REL_PATH_TO_ADD_CONFIG + filename_equipments log.debug("rel_filename: %s" % rel_filename) # Check if file is config relative to this rack if rack.nome in filename_equipments: # Apply config only in spines. Leaves already have all necessary config in startup if "ADD" in filename_equipments: # Check if equipment in under maintenance. If so, does not aplly on it equipment_name = filename_equipments.split('-ADD-')[0] log.debug("equipment_name: %s" % equipment_name) try: equip = Equipamento.get_by_name(equipment_name) if not equip.maintenance: lockvar = LOCK_EQUIPMENT_DEPLOY_CONFIG_USERSCRIPT % (equip.id) output = deploy_facade.deploy_config_in_equipment_synchronous(rel_filename, equip, lockvar) log.debug("equipment output: %s" % (output)) except Exception as e: log.exception(e) raise exceptions.RackAplError(e) # SEPARAR AQUI! datas = dict() success_map = dict() success_map['rack_conf'] = True datas['sucesso'] = success_map return Response(datas, status=status.HTTP_201_CREATED) except exceptions.RackNumberNotFoundError as e: log.exception(e) raise exceptions.NetworkAPIException(e) except var_exceptions.VariableDoesNotExistException as e: log.error(e) raise api_exceptions.NetworkAPIException( 'Erro buscando a variável PATH_TO_ADD_CONFIG ou REL_PATH_TO_ADD_CONFIG. Erro: %s' % e) except Exception as e: log.exception(e) raise api_exceptions.NetworkAPIException(e)
def post(self, *args, **kwargs): try: log.info('RACK deploy.') rack_id = kwargs.get('rack_id') rack = facade.get_by_pk(rack_id) try: PATH_TO_ADD_CONFIG = get_variable('path_to_add_config') REL_PATH_TO_ADD_CONFIG = get_variable('rel_path_to_add_config') except ObjectDoesNotExist: raise var_exceptions.VariableDoesNotExistException( "Erro buscando a variável PATH_TO_ADD_CONFIG ou " "REL_PATH_TO_ADD_CONFIG.") path_config = PATH_TO_ADD_CONFIG + '*' + rack.nome + '*' arquivos = glob.glob(path_config) # Get all files and search for equipments of the rack for var in arquivos: filename_equipments = var.split('/')[-1] rel_filename = "../../" + REL_PATH_TO_ADD_CONFIG + filename_equipments log.debug("rel_filename: %s" % rel_filename) # Check if file is config relative to this rack if rack.nome in filename_equipments: # Apply config only in spines. Leaves already have all necessary config in startup if "ADD" in filename_equipments: # Check if equipment in under maintenance. If so, does not aplly on it equipment_name = filename_equipments.split('-ADD-')[0] log.debug("equipment_name: %s" % equipment_name) try: equip = Equipamento.get_by_name(equipment_name) if not equip.maintenance: (erro, result) = commands.getstatusoutput( "/usr/bin/backuper -T acl -b %s -e -i %s -w " "300" % (rel_filename, equipment_name)) log.debug("erro: %s, result: %s" % (str(erro), str(result))) if erro: raise exceptions.RackAplError() except exceptions.RackAplError, e: raise e except: # Error equipment not found, do nothing pass
def inserir_equip(user, variablestochangecore, rede_id): ip = Ip() ip.descricao = None ip.oct1, ip.oct2, ip.oct3, ip.oct4 = str(variablestochangecore["IPCORE"]).split('.') equip = Equipamento.get_by_name(variablestochangecore["EQUIP_NAME"]) rede = NetworkIPv4.get_by_pk(rede_id) ip.save_ipv4(equip.id, user, rede) if ip.id is None: raise RackAplError (None, None, "Erro ao inserir os equipamentos") # Delete vlan's cache destroy_cache_function([rede.vlan_id]) list_id_equip = [] list_id_equip.append(equip.id) destroy_cache_function(list_id_equip, True) return 0
def post(self, *args, **kwargs): try: log.info('RACK deploy.') rack_id = kwargs.get('rack_id') rack = facade.get_by_pk(rack_id) try: PATH_TO_ADD_CONFIG = get_variable('path_to_add_config') REL_PATH_TO_ADD_CONFIG = get_variable('rel_path_to_add_config') except ObjectDoesNotExist: raise var_exceptions.VariableDoesNotExistException("Erro buscando a variável PATH_TO_ADD_CONFIG ou " "REL_PATH_TO_ADD_CONFIG.") path_config = PATH_TO_ADD_CONFIG + '*' + rack.nome + '*' arquivos = glob.glob(path_config) # Get all files and search for equipments of the rack for var in arquivos: filename_equipments = var.split('/')[-1] rel_filename = "../../" + REL_PATH_TO_ADD_CONFIG + filename_equipments log.debug("rel_filename: %s" % rel_filename) # Check if file is config relative to this rack if rack.nome in filename_equipments: # Apply config only in spines. Leaves already have all necessary config in startup if "ADD" in filename_equipments: # Check if equipment in under maintenance. If so, does not aplly on it equipment_name = filename_equipments.split('-ADD-')[0] log.debug("equipment_name: %s" % equipment_name) try: equip = Equipamento.get_by_name(equipment_name) if not equip.maintenance: (erro, result) = commands.getstatusoutput("/usr/bin/backuper -T acl -b %s -e -i %s -w " "300" % (rel_filename, equipment_name)) log.debug("erro: %s, result: %s" % (str(erro), str(result))) if erro: raise exceptions.RackAplError() except exceptions.RackAplError, e: raise e except: # Error equipment not found, do nothing pass
def inserir_equip(user, variablestochangecore, rede_id): ip = Ip() ip.descricao = None ip.oct1, ip.oct2, ip.oct3, ip.oct4 = str( variablestochangecore['IPCORE']).split('.') equip = Equipamento.get_by_name(variablestochangecore['EQUIP_NAME']) rede = NetworkIPv4.get_by_pk(rede_id) ip.save_ipv4(equip.id, user, rede) if ip.id is None: raise RackAplError(None, None, 'Erro ao inserir os equipamentos') # Delete vlan's cache destroy_cache_function([rede.vlan_id]) list_id_equip = [] list_id_equip.append(equip.id) destroy_cache_function(list_id_equip, True) return 0
def handle_post(self, request, user, *args, **kwargs): """Handles POST requests to list all equip access by equipment name. URLs: equipamentoacesso/name/ """ try: # Commons Validations # User permission if not has_perm(user, AdminPermission.EQUIPMENT_MANAGEMENT, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Business Validations # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: msg = u'There is no value to the networkapi tag of XML request.' self.log.error(msg) return self.response_error(3, msg) equip_access_map = networkapi_map.get('equipamento_acesso') if equip_access_map is None: msg = u'There is no value to the vlan tag of XML request.' self.log.error(msg) return self.response_error(3, msg) # Get XML data name = equip_access_map.get('name') # Name must NOT be none and 50 is the maxsize if not is_valid_string_maxsize(name, 50): self.log.error(u'Parameter name is invalid. Value: %s.', name) raise InvalidValueError(None, 'name', name) # Equipment try: # Find equipment by name to check if it exist equip = Equipamento.get_by_name(name) except EquipamentoNotFoundError, e: return self.response_error(117, name) # Business Rules # List access related with equip equip_access_list = equip.equipamentoacesso_set.all() # Permissions equip_access_list = equip_access_list.filter( equipamento__grupos__direitosgrupoequipamento__ugrupo__in=user. grupos.all(), equipamento__grupos__direitosgrupoequipamento__escrita='1') map_dicts = [] for equip_acess in equip_access_list: equip_access_map = model_to_dict(equip_acess) if equip_access_map not in map_dicts: map_dicts.append(equip_access_map) equip_access_map = dict() equip_access_map['equipamento_acesso'] = list(map_dicts) # Return XML return self.response(dumps_networkapi(equip_access_map))
def handle_post(self, request, user, *args, **kwargs): """Treat requests POST to insert request VIP. URLs: /requestvip/ deprecated:: Use the new rest API """ self.log.info("Add request VIP") try: # Load XML data xml_map, attrs_map = loads( request.raw_post_data, ['real', 'reals_weight', 'reals_priority', 'porta']) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error(3, u'There is no value to the networkapi tag of XML request.') vip_map = networkapi_map.get('vip') if vip_map is None: return self.response_error(3, u'There is no value to the vip tag of XML request.') # User permission if not has_perm(user, AdminPermission.VIPS_REQUEST, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Valid Ipv4 and Ipv6 ID if (vip_map.get('id_ipv4') is None and vip_map.get('id_ipv6') is None): self.log.error( u'The id_ipv4 and id_ipv6 parameter is not a valid value: %s.', vip_map.get('id_ipv4')) raise InvalidValueError( None, 'id_ipv4 e id_vip6', vip_map.get('id_ipv4')) if (vip_map.get('id_ipv4') != None): if not is_valid_int_greater_zero_param(vip_map.get('id_ipv4')): self.log.error( u'The id_ipv4 parameter is not a valid value: %s.', vip_map.get('id_ipv4')) raise InvalidValueError( None, 'id_ipv4', vip_map.get('id_ipv4')) if (vip_map.get('id_ipv6') != None): if not is_valid_int_greater_zero_param(vip_map.get('id_ipv6')): self.log.error( u'The id_ipv6 parameter is not a valid value: %s.', vip_map.get('id_ipv6')) raise InvalidValueError( None, 'id_ipv6', vip_map.get('id_ipv6')) # Valid maxcon if not is_valid_int_greater_equal_zero_param(vip_map.get('maxcon')): self.log.error( u'The maxcon parameter is not a valid value: %s.', vip_map.get('maxcon')) raise InvalidValueError(None, 'maxcon', vip_map.get('maxcon')) vip = RequisicaoVips() finalidade = vip_map.get('finalidade') cliente = vip_map.get('cliente') ambiente = vip_map.get('ambiente') try: evip = EnvironmentVip.get_by_values( finalidade, cliente, ambiente) except Exception, e: raise EnvironmentVipNotFoundError( e, 'The fields finality or client or ambiente is None') # Valid real names and real ips of real server if vip_map.get('reals') is not None: for real in vip_map.get('reals').get('real'): ip_aux_error = real.get('real_ip') equip_aux_error = real.get('real_name') if equip_aux_error is not None: equip = Equipamento.get_by_name(equip_aux_error) else: self.log.error( u'The real_name parameter is not a valid value: None.') raise InvalidValueError(None, 'real_name', 'None') # Valid Real RequisicaoVips.valid_real_server( ip_aux_error, equip, evip, False) # Valid reals_prioritys vip_map, code = vip.valid_values_reals_priority(vip_map) if code is not None: return self.response_error(code) # Valid reals_weight vip_map, code = vip.valid_values_reals_weight(vip_map) if code is not None: return self.response_error(code) # Existing IPv4 ID if vip_map.get('id_ipv4') is not None: vip.ip = Ip().get_by_pk(vip_map.get('id_ipv4')) # Existing IPv6 ID if vip_map.get('id_ipv6') is not None: vip.ipv6 = Ipv6().get_by_pk(vip_map.get('id_ipv6')) # Valid ports vip_map, code = vip.valid_values_ports(vip_map) if code is not None: return self.response_error(code[0], code[1]) # Valid HealthcheckExpect vip_map, vip, code = vip.valid_values_healthcheck( vip_map, vip, evip) if code is not None: return self.response_error(code) # Host host_name = vip_map.get('host') if not is_valid_string_minsize(host_name, 3) or not is_valid_string_maxsize(host_name, 100): self.log.error(u'Host_name value is invalid: %s.', host_name) raise InvalidValueError(None, 'host_name', host_name) # Areanegocio areanegocio = vip_map.get('areanegocio') if not is_valid_string_minsize(areanegocio, 3) or not is_valid_string_maxsize(areanegocio, 100): self.log.error( u'Areanegocio value is invalid: %s.', areanegocio) raise InvalidValueError(None, 'areanegocio', areanegocio) # Nome_servico nome_servico = vip_map.get('nome_servico') if not is_valid_string_minsize(nome_servico, 3) or not is_valid_string_maxsize(nome_servico, 100): self.log.error( u'Nome_servico value is invalid: %s.', nome_servico) raise InvalidValueError(None, 'nome_servico', nome_servico) # Existing l7_filter if vip_map.get('l7_filter') is not None: vip.l7_filter = vip_map.get('l7_filter') # If the l7_filter is a rule if vip_map.get('rule_id') is not None: if not is_valid_int_greater_zero_param(vip_map.get('rule_id')): self.log.error( u'The rule_id parameter is not a valid value: %s.', vip_map.get('rule_id')) raise InvalidValueError( None, 'rule_id', vip_map.get('rule_id')) rule = Rule.objects.get(pk=vip_map.get('rule_id')) vip.l7_filter = '\n'.join( rule.rulecontent_set.all().values_list('content', flat=True)) vip.rule = rule # set variables vip.filter_valid = 1 vip.validado = 0 vip.vip_criado = 0 vip.set_variables(vip_map) try: # save Resquest Vip vip.save() # save VipPortToPool, ServerPool and ServerPoolMember vip.save_vips_and_ports(vip_map, user) except Exception, e: if isinstance(e, IntegrityError): # Duplicate value for Port Vip, Port Real and IP self.log.error(u'Failed to save the request vip.') return self.response_error(353) else: raise e
def handle_put(self, request, user, *args, **kwargs): """Treat requests PUT change request VIP. URLs: /requestvip/<id_vip>/ deprecated:: Use the new rest API """ self.log.info("Change request VIP") try: vip_id = kwargs.get('id_vip') # Load XML data xml_map, attrs_map = loads( request.raw_post_data, ['real', 'reals_weight', 'reals_priority', 'porta']) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error(3, u'There is no value to the networkapi tag of XML request.') vip_map = networkapi_map.get('vip') if vip_map is None: return self.response_error(3, u'There is no value to the vip tag of XML request.') # User permission if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Valid Vip ID if not is_valid_int_greater_zero_param(vip_id): self.log.error( u'The vip_id parameter is not a valid value: %s.', vip_id) raise InvalidValueError(None, 'vip_id', vip_id) # Valid Ipv4 and Ipv6 ID if (vip_map.get('id_ipv4') is None and vip_map.get('id_ipv6') is None): self.log.error( u'The id_ipv4 and id_ipv6 parameter is not a valid value: %s.', vip_map.get('id_ipv4')) raise InvalidValueError( None, 'id_ipv4 e id_vip6', vip_map.get('id_ipv4')) if (vip_map.get('id_ipv4') != None): if not is_valid_int_greater_zero_param(vip_map.get('id_ipv4')): self.log.error( u'The id_ipv4 parameter is not a valid value: %s.', vip_map.get('id_ipv4')) raise InvalidValueError( None, 'id_ipv4', vip_map.get('id_ipv4')) if (vip_map.get('id_ipv6') != None): if not is_valid_int_greater_zero_param(vip_map.get('id_ipv6')): self.log.error( u'The id_ipv6 parameter is not a valid value: %s.', vip_map.get('id_ipv6')) raise InvalidValueError( None, 'id_ipv6', vip_map.get('id_ipv6')) # Valid Vip validated if not is_valid_boolean_param(vip_map.get('validado')): self.log.error( u'The validated parameter is not a valid value: %s.', vip_map.get('validado')) raise InvalidValueError( None, 'validated', vip_map.get('validado')) # Valid Vip vip_created if not is_valid_boolean_param(vip_map.get('vip_criado')): self.log.error( u'The vip_created parameter is not a valid value: %s.', vip_map.get('vip_criado')) raise InvalidValueError( None, 'vip_created', vip_map.get('vip_criado')) # Valid maxcon if not is_valid_int_greater_equal_zero_param(vip_map.get('maxcon')): self.log.error( u'The maxcon parameter is not a valid value: %s.', vip_map.get('maxcon')) raise InvalidValueError(None, 'maxcon', vip_map.get('maxcon')) # Existing Vip ID vip = RequisicaoVips.get_by_pk(vip_id) with distributedlock(LOCK_VIP % vip_id): # Valid Vip created if vip.vip_criado: self.log.error( u'The IP of the request for VIP %d can not be changed because the VIP is already created.' % vip.id) raise RequisicaoVipsAlreadyCreatedError(None) # Get variables variables_map = vip.variables_to_map() # Valid variables vip.set_variables(variables_map) evip = EnvironmentVip.get_by_values(variables_map.get( 'finalidade'), variables_map.get('cliente'), variables_map.get('ambiente')) # Valid real names and real ips of real server if vip_map.get('reals') is not None: for real in vip_map.get('reals').get('real'): ip_aux_error = real.get('real_ip') equip_aux_error = real.get('real_name') if equip_aux_error is not None: equip = Equipamento.get_by_name(equip_aux_error) else: self.log.error( u'The real_name parameter is not a valid value: None.') raise InvalidValueError(None, 'real_name', 'None') # Valid Real RequisicaoVips.valid_real_server( ip_aux_error, equip, evip, False) # Valid reals_prioritys vip_map, code = vip.valid_values_reals_priority(vip_map) if code is not None: return self.response_error(code) # Valid reals_weight vip_map, code = vip.valid_values_reals_weight(vip_map) if code is not None: return self.response_error(code) # Existing IPv4 ID if vip_map.get('id_ipv4') is not None: vip.ip = Ip().get_by_pk(vip_map.get('id_ipv4')) else: vip.ip = None # Existing IPv6 ID if vip_map.get('id_ipv6') is not None: vip.ipv6 = Ipv6().get_by_pk(vip_map.get('id_ipv6')) else: vip.ipv6 = None # Valid ports vip_map, code = vip.valid_values_ports(vip_map) if code is not None: return self.response_error(code) # Valid HealthcheckExpect vip_map, vip, code = vip.valid_values_healthcheck( vip_map, vip, evip) if code is not None: return self.response_error(code) # Existing l7_filter if vip_map.get('l7_filter') is not None: vip.l7_filter = vip_map.get('l7_filter') else: vip.l7_filter = None # If the l7_filter is a rule, set filter_valid to TRUE if vip_map.get('rule_id') is not None: # Valid rule if not is_valid_int_greater_zero_param(vip_map.get('rule_id')): self.log.error( u'The rule_id parameter is not a valid value: %s.', vip_map.get('rule_id')) raise InvalidValueError( None, 'rule_id', vip_map.get('rule_id')) rule = Rule.objects.get(pk=vip_map.get('rule_id')) vip.l7_filter = '\n'.join( rule.rulecontent_set.all().values_list('content', flat=True)) vip.rule = rule else: vip.rule = None # set variables vip.filter_valid = 1 vip.validado = 0 vip.set_variables(vip_map) try: # update Resquest Vip vip.save() # update ServerPool, VipPortToPool, ServerPoolMembers vip.save_vips_and_ports(vip_map, user) except RequestVipServerPoolConstraintError, e: self.log.error(e.message) return self.response_error(384, e.message) except Exception, e: if isinstance(e, IntegrityError): # Duplicate value for Port Vip, Port Real and IP self.log.error(u'Failed to update the request vip.') return self.response_error(353) else: self.log.error(u'Failed to update the request vip.') raise RequisicaoVipsError( e, u'Failed to update the request vip')
def handle_post(self, request, user, *args, **kwargs): '''Handles POST requests to get all Ips (v4) or (v6) of equip on Divisao DC and Ambiente Logico of fisrt Network4 and 6 (if exists) of Environment Vip. URL: ip/getbyequipandevip/ ''' self.log.info('Get Ips by Equip - Evip') try: # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.READ_OPERATION): raise UserNotAuthorizedError( None, u'User does not have permission to perform the operation.') # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: msg = u'There is no value to the networkapi tag of XML request.' self.log.error(msg) return self.response_error(3, msg) ip_map = networkapi_map.get('ip_map') if ip_map is None: msg = u'There is no value to the ip tag of XML request.' self.log.error(msg) return self.response_error(3, msg) # Get XML data id_evip = ip_map.get('id_evip') equip_name = ip_map.get('equip_name') # Valid id_evip if not is_valid_int_greater_zero_param(id_evip): self.log.error( u'Parameter id_evip is invalid. Value: %s.', id_evip) raise InvalidValueError(None, 'id_evip', id_evip) # Valid equip_name if not is_valid_string_minsize(equip_name, 3) or not is_valid_string_maxsize(equip_name, 80) or not is_valid_regex(equip_name, "^[A-Z0-9-_]+$"): self.log.error( u'Parameter equip_name is invalid. Value: %s', equip_name) raise InvalidValueError(None, 'equip_name', equip_name) # Business Rules # Get Environment VIp evip = EnvironmentVip.get_by_pk(id_evip) # Get Equipment equip = Equipamento.get_by_name(equip_name) lista_ips_equip = list() lista_ipsv6_equip = list() # GET DIVISAO DC AND AMBIENTE_LOGICO OF NET4 AND NET6 lista_amb_div_4 = list() lista_amb_div_6 = list() for net in evip.networkipv4_set.select_related().all(): dict_div_4 = dict() dict_div_4['divisao_dc'] = net.vlan.ambiente.divisao_dc_id dict_div_4[ 'ambiente_logico'] = net.vlan.ambiente.ambiente_logico_id if dict_div_4 not in lista_amb_div_4: lista_amb_div_4.append(dict_div_4) for net in evip.networkipv6_set.select_related().all(): dict_div_6 = dict() dict_div_6['divisao_dc'] = net.vlan.ambiente.divisao_dc_id dict_div_6[ 'ambiente_logico'] = net.vlan.ambiente.ambiente_logico_id if dict_div_6 not in lista_amb_div_6: lista_amb_div_6.append(dict_div_6) # Get all IPV4's Equipment for ipequip in equip.ipequipamento_set.select_related().all(): if ipequip.ip not in lista_ips_equip: for dict_div_amb in lista_amb_div_4: # if ipequip.ip.networkipv4.ambient_vip is not None and # ipequip.ip.networkipv4.ambient_vip.id == evip.id: if (ipequip.ip.networkipv4.vlan.ambiente.divisao_dc.id == dict_div_amb.get('divisao_dc') and ipequip.ip.networkipv4.vlan.ambiente.ambiente_logico.id == dict_div_amb.get('ambiente_logico')): lista_ips_equip.append(ipequip.ip) # Get all IPV6'S Equipment for ipequip in equip.ipv6equipament_set.select_related().all(): if ipequip.ip not in lista_ipsv6_equip: for dict_div_amb in lista_amb_div_6: # if ipequip.ip.networkipv6.ambient_vip is not None and # ipequip.ip.networkipv6.ambient_vip.id == evip.id: print ipequip.ip.networkipv6.vlan.ambiente.divisao_dc.id print dict_div_amb.get('divisao_dc') if (ipequip.ip.networkipv6.vlan.ambiente.divisao_dc.id == dict_div_amb.get('divisao_dc') and ipequip.ip.networkipv6.vlan.ambiente.ambiente_logico.id == dict_div_amb.get('ambiente_logico')): lista_ipsv6_equip.append(ipequip.ip) # lists and dicts for return lista_ip_entregue = list() lista_ip6_entregue = list() for ip in lista_ips_equip: dict_ips4 = dict() dict_network = dict() dict_ips4['id'] = ip.id dict_ips4['ip'] = "%s.%s.%s.%s" % ( ip.oct1, ip.oct2, ip.oct3, ip.oct4) dict_network['id'] = ip.networkipv4_id dict_network["network"] = "%s.%s.%s.%s" % ( ip.networkipv4.oct1, ip.networkipv4.oct2, ip.networkipv4.oct3, ip.networkipv4.oct4) dict_network["mask"] = "%s.%s.%s.%s" % ( ip.networkipv4.mask_oct1, ip.networkipv4.mask_oct2, ip.networkipv4.mask_oct3, ip.networkipv4.mask_oct4) dict_ips4['network'] = dict_network lista_ip_entregue.append(dict_ips4) for ip in lista_ipsv6_equip: dict_ips6 = dict() dict_network = dict() dict_ips6['id'] = ip.id dict_ips6['ip'] = "%s:%s:%s:%s:%s:%s:%s:%s" % ( ip.block1, ip.block2, ip.block3, ip.block4, ip.block5, ip.block6, ip.block7, ip.block8) dict_network['id'] = ip.networkipv6.id dict_network["network"] = "%s:%s:%s:%s:%s:%s:%s:%s" % ( ip.networkipv6.block1, ip.networkipv6.block2, ip.networkipv6.block3, ip.networkipv6.block4, ip.networkipv6.block5, ip.networkipv6.block6, ip.networkipv6.block7, ip.networkipv6.block8) dict_network["mask"] = "%s:%s:%s:%s:%s:%s:%s:%s" % ( ip.networkipv6.block1, ip.networkipv6.block2, ip.networkipv6.block3, ip.networkipv6.block4, ip.networkipv6.block5, ip.networkipv6.block6, ip.networkipv6.block7, ip.networkipv6.block8) dict_ips6['network'] = dict_network lista_ip6_entregue.append(dict_ips6) lista_ip_entregue = lista_ip_entregue if len( lista_ip_entregue) > 0 else None lista_ip6_entregue = lista_ip6_entregue if len( lista_ip6_entregue) > 0 else None if (lista_ip_entregue is None and lista_ip6_entregue is None): raise IpNotFoundByEquipAndVipError( None, 'Ip não encontrado com equipamento %s e ambiente vip %s' % (equip_name, id_evip)) return self.response(dumps_networkapi({"ipv4": lista_ip_entregue, "ipv6": lista_ip6_entregue})) except IpNotFoundByEquipAndVipError: return self.response_error(317, equip_name, id_evip) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_get(self, request, user, *args, **kwargs): """Handles POST requests to find all Equipments by search parameters. URLs: /equipment/find/ """ self.log.info('Find all Equipments') try: # Commons Validations # User permission if not has_perm(user, AdminPermission.EQUIPMENT_MANAGEMENT, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Business Validations # Get data from URL GET parameters equip_name = kwargs.get('equip_name').strip() id_ambiente = kwargs.get('id_ambiente') # Business Rules # Start with alls ambiente = Ambiente.get_by_pk(id_ambiente) # Get Equipment equip = Equipamento.get_by_name(equip_name) lista_ips_equip = set() lista_ipsv6_equip = set() environment_vip_list = EnvironmentVip.get_environment_vips_by_environment_id( id_ambiente) environment_list_related = EnvironmentEnvironmentVip.get_environment_list_by_environment_vip_list( environment_vip_list) # # Get all IPV4's Equipment for environment in environment_list_related: for ipequip in equip.ipequipamento_set.select_related( 'ip', 'networkipv4', 'vlan').all(): network_ipv4 = ipequip.ip.networkipv4 if network_ipv4.vlan.ambiente == environment: lista_ips_equip.add(ipequip.ip) # # Get all IPV6's Equipment for environment in environment_list_related: for ipequip in equip.ipv6equipament_set.select_related( 'ip', 'networkipv6', 'vlan').all(): network_ipv6 = ipequip.ip.networkipv6 if network_ipv6.vlan.ambiente == environment: lista_ipsv6_equip.add(ipequip.ip) # lists and dicts for return lista_ip_entregue = list() lista_ip6_entregue = list() for ip in lista_ips_equip: dict_ips4 = dict() dict_network = dict() dict_ips4['id'] = ip.id dict_ips4['ip'] = '%s.%s.%s.%s' % (ip.oct1, ip.oct2, ip.oct3, ip.oct4) dict_network['id'] = ip.networkipv4_id dict_network['network'] = '%s.%s.%s.%s' % ( ip.networkipv4.oct1, ip.networkipv4.oct2, ip.networkipv4.oct3, ip.networkipv4.oct4) dict_network['mask'] = '%s.%s.%s.%s' % ( ip.networkipv4.mask_oct1, ip.networkipv4.mask_oct2, ip.networkipv4.mask_oct3, ip.networkipv4.mask_oct4) dict_ips4['network'] = dict_network lista_ip_entregue.append(dict_ips4) for ip in lista_ipsv6_equip: dict_ips6 = dict() dict_network = dict() dict_ips6['id'] = ip.id dict_ips6['ip'] = '%s:%s:%s:%s:%s:%s:%s:%s' % ( ip.block1, ip.block2, ip.block3, ip.block4, ip.block5, ip.block6, ip.block7, ip.block8) dict_network['id'] = ip.networkipv6.id dict_network['network'] = '%s:%s:%s:%s:%s:%s:%s:%s' % ( ip.networkipv6.block1, ip.networkipv6.block2, ip.networkipv6.block3, ip.networkipv6.block4, ip.networkipv6.block5, ip.networkipv6.block6, ip.networkipv6.block7, ip.networkipv6.block8) dict_network['mask'] = '%s:%s:%s:%s:%s:%s:%s:%s' % ( ip.networkipv6.block1, ip.networkipv6.block2, ip.networkipv6.block3, ip.networkipv6.block4, ip.networkipv6.block5, ip.networkipv6.block6, ip.networkipv6.block7, ip.networkipv6.block8) dict_ips6['network'] = dict_network lista_ip6_entregue.append(dict_ips6) lista_ip_entregue = lista_ip_entregue if len( lista_ip_entregue) > 0 else None lista_ip6_entregue = lista_ip6_entregue if len( lista_ip6_entregue) > 0 else None return self.response( dumps_networkapi({ 'list_ipv4': lista_ip_entregue, 'list_ipv6': lista_ip6_entregue })) except InvalidValueError, e: self.log.error(u'Parameter %s is invalid. Value: %s.', e.param, e.value) return self.response_error(269, e.param, e.value)
def handle_post(self, request, user, *args, **kwargs): """Handles POST requests to list all equip scripts by equipment name. URLs: equipamentoroteiro/name/ """ try: # Commons Validations # User permission if not has_perm(user, AdminPermission.EQUIPMENT_MANAGEMENT, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Business Validations # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: msg = u'There is no value to the networkapi tag of XML request.' self.log.error(msg) return self.response_error(3, msg) equip_script_map = networkapi_map.get('equipamento_roteiro') if equip_script_map is None: msg = u'There is no value to the equipamento_roteiro tag of XML request.' self.log.error(msg) return self.response_error(3, msg) # Get XML data name = equip_script_map.get('name') # Name must NOT be none and 50 is the maxsize if not is_valid_string_maxsize(name, 50): self.log.error(u'Parameter name is invalid. Value: %s.', name) raise InvalidValueError(None, 'name', name) # Equipment try: # Find equipment by name to check if it exist equip = Equipamento.get_by_name(name) except EquipamentoNotFoundError, e: return self.response_error(117, name) # Business Rules # List access related with equip equip_script_list = equip.equipamentoroteiro_set.all() # Permissions equip_script_list = equip_script_list.filter(equipamento__grupos__direitosgrupoequipamento__ugrupo__in=user.grupos.all( ), equipamento__grupos__direitosgrupoequipamento__escrita='1') map_dicts = [] for equip_script in equip_script_list: es_map = dict() es_map['id'] = equip_script.id es_map['roteiro_id'] = equip_script.roteiro.id es_map['roteiro_name'] = equip_script.roteiro.roteiro es_map['roteiro_desc'] = equip_script.roteiro.descricao es_map[ 'tipo_roteiro_id'] = equip_script.roteiro.tipo_roteiro.id es_map[ 'tipo_roteiro_name'] = equip_script.roteiro.tipo_roteiro.tipo es_map[ 'tipo_roteiro_desc'] = equip_script.roteiro.tipo_roteiro.descricao map_dicts.append(es_map) equip_map = dict() equip_map['id'] = equip.id equip_map['name'] = equip.nome equip_script_map = dict() equip_script_map['equipamento_roteiro'] = map_dicts equip_script_map['equipamento'] = equip_map # Return XML return self.response(dumps_networkapi(equip_script_map))
def handle_post(self, request, user, *args, **kwargs): """Handles POST requests to valid Real server. URL: vip/real/valid/ """ self.log.info('Valid Real Server') try: # Business Validations # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error(3, u'There is no value to the networkapi tag of XML request.') real_map = networkapi_map.get('real') if real_map is None: return self.response_error(3, u'There is no value to the vip tag of XML request.') # Get XML data ip = real_map.get('ip') name = real_map.get('name_equipment') id_evip = real_map.get('id_environment_vip') valid = real_map.get('valid') # User permission if not has_perm(user, AdminPermission.VIPS_REQUEST, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Valid IP if not is_valid_ip_ipaddr(ip): self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) # Valid Name Equipment if not is_valid_string_minsize(name, 3) or not is_valid_string_maxsize(name, 80) or not is_valid_regex(name, '^[A-Z0-9-_]+$'): self.log.error( u'Parameter name_equipment is invalid. Value: %s', name) raise InvalidValueError(None, 'name_equipment', name) # Valid Environment Vip if not is_valid_int_greater_zero_param(id_evip): self.log.error( u'Parameter id_environment_vip is invalid. Value: %s.', id_evip) raise InvalidValueError(None, 'id_environment_vip', id_evip) # Valid Equipment equip = Equipamento.get_by_name(name) # Valid EnvironmentVip evip = EnvironmentVip.get_by_pk(id_evip) version = '' if is_valid_ipv4(ip): version = IP_VERSION.IPv4[1] elif is_valid_ipv6(ip): version = IP_VERSION.IPv6[1] ip, equip, evip = RequisicaoVips.valid_real_server( ip, equip, evip, valid) real_dict = {} ip_dict = model_to_dict(ip) ip_dict['version'] = version real_dict['ip'] = ip_dict real_dict['equipment'] = model_to_dict(equip) real_dict['environmentvip'] = model_to_dict(evip) return self.response(dumps_networkapi({'real': real_dict})) except XMLError, x: self.log.error(u'Error reading the XML request.') return self.response_error(3, x)
def handle_put(self, request, user, *args, **kwargs): """ Handles PUT requests to change the VIP's real server. URL: vip/real/edit """ self.log.info("Change VIP's real server") try: # User permission if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Commons Validations # Load XML data xml_map, attrs_map = loads( request.raw_post_data, ['real', 'reals_weight', 'reals_priority']) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error(3, u'There is no value to the networkapi tag of XML request.') vip_map = networkapi_map.get('vip') if vip_map is None: return self.response_error(3, u'There is no value to the vip tag of XML request.') # Get XML data vip_id = vip_map.get('vip_id') alter_priority = vip_map.get('alter_priority') # Valid VIP ID if not is_valid_int_greater_zero_param(vip_id): self.log.error( u'The vip_id parameter is not a valid value: %s.', vip_id) raise InvalidValueError(None, 'vip_id', vip_id) # Valid Alter Priority if not is_valid_int_greater_equal_zero_param(alter_priority): alter_priority = 0 # Existing Vip ID vip = RequisicaoVips.get_by_pk(vip_id) # Clone vip vip_old = clone(vip) server_pools = ServerPool.objects.filter(vipporttopool__requisicao_vip=vip) server_pools_old = [] server_pools_members_old = [] for sp in server_pools: server_pools_old.append(sp) for spm in sp.serverpoolmember_set.all(): server_pools_members_old.append(spm) # Get variables variables_map = vip.variables_to_map() # Valid variables vip.set_variables(variables_map) # Get balancing method vip_map['metodo_bal'] = str( variables_map.get('metodo_bal')).upper() with distributedlock(LOCK_VIP % vip_id): # Valid real names and real ips of real server if vip_map.get('reals') is not None: evip = EnvironmentVip.get_by_values(variables_map.get( 'finalidade'), variables_map.get('cliente'), variables_map.get('ambiente')) for real in vip_map.get('reals').get('real'): ip_aux_error = real.get('real_ip') equip_aux_error = real.get('real_name') if equip_aux_error is not None: equip = Equipamento.get_by_name(equip_aux_error) else: self.log.error( u'The real_name parameter is not a valid value: None.') raise InvalidValueError(None, 'real_name', 'None') # Valid Real RequisicaoVips.valid_real_server( ip_aux_error, equip, evip, False) # Valid reals_prioritys vip_map, code = vip.valid_values_reals_priority(vip_map) if code is not None: return self.response_error(329) # Valid reals_weight vip_map, code = vip.valid_values_reals_weight(vip_map) if code is not None: return self.response_error(330) # Get variables variables_map = vip.variables_to_map() vip_port_list, reals_list, reals_priority, reals_weight = vip.get_vips_and_reals( vip.id) if reals_list: variables_map['reals'] = {'real': reals_list} variables_map['reals_prioritys'] = { 'reals_priority': reals_priority} variables_map['reals_weights'] = { 'reals_weight': reals_weight} variables_map['portas_servicos'] = {'porta': vip_port_list} # clone variables_map variables_map_old = clone(variables_map) # Valid ports variables_map, code = vip.valid_values_ports(variables_map) if code is not None: return self.response_error(331) """ OLD CALLS - Deprecated """ vip_ports_pool = VipPortToPool.objects.filter( requisicao_vip=vip) reals = vip_map.get('reals') new_call = True if reals and 'port_real' not in reals['real'][0]: new_call = False reals_prioritys = vip_map.get('reals_prioritys') reals_weights = dict() if 'reals_weights' in vip_map: reals_weights = vip_map.get('reals_weights') reals_aux = dict() reals_prioritys_aux = dict() reals_weight_aux = dict() reals_aux['real'] = list() reals_prioritys_aux['reals_priority'] = list() reals_weight_aux['reals_weight'] = list() repeat = ( len(vip_ports_pool) * len(reals['real'])) / len(reals['real']) execute_list = list() for x in range(repeat): execute_list.append((x + 1) * len(reals['real'])) for i in range(len(reals['real'])): for vippp in vip_ports_pool: reals_prioritys_aux['reals_priority'].append( reals_prioritys['reals_priority'][i]) if 'reals_weight' in reals_weights: reals_weight_aux['reals_weight'].append( reals_weights['reals_weight'][i]) server_pool = ServerPool.objects.get( vipporttopool__id=vippp.id, vipporttopool__requisicao_vip=vip) if 'id_ip' not in reals['real'][i]: id_ip = get_id_ip(reals['real'][i]) else: id_ip = reals['real'][i]['id_ip'] reals_aux['real'].append({'id_ip': id_ip, 'port_real': server_pool.default_port, 'real_name': reals[ 'real'][i]['real_name'], 'port_vip': vippp.port_vip, u'real_ip': reals['real'][i]['real_ip']}) vip_map['reals_prioritys'] = reals_prioritys_aux vip_map['reals_weights'] = reals_weight_aux vip_map['reals'] = reals_aux """ OLD CALLS - END """ # Check diff reals (reals_to_add, reals_to_rem, reals_to_stay) reals_to_add, reals_to_rem, reals_to_stay = diff_reals( variables_map, vip_map) reals_final = dict() reals_final['reals'] = list() reals_final['priorities'] = list() reals_final['weights'] = list() reals_error = list() removes = True error = False ############################################## # NOT MODIFIED - reals_to_stay # ############################################## for i in range(len(reals_to_stay['reals'])): real, priority, weight, id_ip, port_vip, port_real, new_call = get_variables( reals_to_stay, i, new_call) # Check ip type if is_valid_ipv4(real.get('real_ip')) == True: ip_type = IP_VERSION.IPv4[1] ip = Ip().get_by_pk(id_ip) else: ip_type = IP_VERSION.IPv6[1] ip = Ipv6().get_by_pk(id_ip) reals_final['reals'].append(reals_to_stay['reals'][i]) reals_final['priorities'].append( reals_to_stay['priorities'][i]) if reals_to_stay['weighted']: reals_final['weights'].append( reals_to_stay['weights'][i]) server_pool = ServerPool.objects.get( vipporttopool__port_vip=port_vip, vipporttopool__requisicao_vip=vip) if ip_type == IP_VERSION.IPv4[1]: server_pool_member = ServerPoolMember.objects.get(server_pool=server_pool, port_real=port_real, ip=id_ip) else: server_pool_member = ServerPoolMember.objects.get(server_pool=server_pool, port_real=port_real, ipv6=id_ip) server_pool_member.priority = priority server_pool_member.weight = weight server_pool_member.save(user, commit=True) ############################################# # ADD REALS - reals_to_add # ############################################# for i in range(len(reals_to_add['reals'])): real, priority, weight, id_ip, port_vip, port_real, new_call = get_variables( reals_to_add, i, new_call) if len(real.get('real_ip').split('.')) <= 1: ip_type = IP_VERSION.IPv6[1] ip = Ipv6().get_by_pk(id_ip) if new_call: command = VIP_REALS_v6_CREATE % ( vip.id, id_ip, port_real, port_vip) else: command = VIP_REAL_v6_CREATE % ( vip.id, real.get('real_name'), real.get('real_ip')) else: ip_type = IP_VERSION.IPv4[1] ip = Ip().get_by_pk(id_ip) if new_call: command = VIP_REALS_v4_CREATE % ( vip.id, id_ip, port_real, port_vip) else: command = VIP_REAL_v4_CREATE % ( vip.id, real.get('real_name'), real.get('real_ip')) self.log.info( '------------------- ADD ----------------------') self.log.info( 'Insert ServerPoolMember before execute script') add_reals_before_script( port_vip, vip, ip, ip_type, priority, weight, port_real, user) self.log.info('The insert has completed successfully') # if new_call or (i + 1) in execute_list: self.log.info('Execute script: %s' % command) code, stdout, stderr = exec_script(command) self.log.info( 'Script was executed and returned code %s' % code) if code != 0: removes = False error = True reals_error.append(real) self.log.info( 'Remove ServerPoolMember after execute script if code != 0') remove_reals_after_script( port_vip, ip_type, vip, port_real, priority, weight, id_ip, user) self.log.info('The remove has completed successfully') else: reals_final['reals'].append(real) reals_final['priorities'].append( reals_to_add['priorities'][i]) if reals_to_add['weighted']: reals_final['weights'].append( reals_to_add['weights'][i]) self.log.info( '----------------- ADD END --------------------') ########################################## # REMOVE REALS - reals_to_rem # ########################################## if removes: for i in range(len(reals_to_rem['reals'])): real, priority, weight, id_ip, port_vip, port_real, new_call = get_variables( reals_to_rem, i, new_call) if len(real.get('real_ip').split('.')) <= 1: ip_type = IP_VERSION.IPv6[1] if new_call: command = VIP_REALS_v6_REMOVE % ( vip.id, id_ip, port_real, port_vip) else: command = VIP_REAL_v6_REMOVE % ( vip.id, real.get('real_name'), real.get('real_ip')) else: ip_type = IP_VERSION.IPv4[1] if new_call: command = VIP_REALS_v4_REMOVE % ( vip.id, id_ip, port_real, port_vip) else: command = VIP_REAL_v4_REMOVE % ( vip.id, real.get('real_name'), real.get('real_ip')) self.log.info( '------------------ REMOVE --------------------') self.log.info('Execute script: %s' % command) code, stdout, stderr = exec_script(command) self.log.info( 'script was executed and returned code %s' % code) if code != 0: error = True reals_error.append(real) reals_final['reals'].append(real) reals_final['priorities'].append( reals_to_rem['priorities'][i]) if reals_to_rem['weighted']: reals_final['weights'].append( reals_to_rem['weights'][i]) else: self.log.info( 'Remove ServerPoolMember after execute script') remove_reals_after_script( port_vip, ip_type, vip, port_real, priority, weight, id_ip, user) self.log.info( 'The remove has completed successfully') self.log.info( '---------------- REMOVE END ------------------') else: for i in range(len(reals_to_rem['reals'])): real = reals_to_rem['reals'][i] reals_final['reals'].append(real) reals_final['priorities'].append( reals_to_rem['priorities'][i]) if reals_to_add['weighted']: reals_final['weights'].append( reals_to_rem['weights'][i]) variables_map['reals'] = dict() variables_map['reals_prioritys'] = dict() variables_map['reals_weights'] = dict() if len(reals_final['reals']) > 0: variables_map['reals']['real'] = reals_final['reals'] variables_map['reals_prioritys'][ 'reals_priority'] = reals_final['priorities'] if reals_final['weights'] is not None: variables_map['reals_weights'][ 'reals_weight'] = reals_final['weights'] else: variables_map.pop('reals') variables_map.pop('reals_prioritys') variables_map.pop('reals_weights') # set variables vip.set_variables(variables_map) try: # If Priority changed if int(alter_priority) != 0: # gerador_vips -i <ID_REQUISICAO> --priority command = 'gerador_vips -i %d --priority' % vip.id # Logging self.log.info( '---------------- ALTER PRIORITY ------------------') self.log.info('Command: ' + command) # Execute script code, stdout, stderr = exec_script(command) self.log.info('Code returned: ' + str(code)) self.log.info('Stdout: ' + stdout) self.log.info( '-------------- ALTER PRIORITY END ----------------') # Script returned error while executing, rollback the # changes in database if code != 0: self.log.info('Code != 0, rollback changes') vip_old.save(user, commit=True) for sp in server_pools_old: sp.save(user, commit=True) for spm in server_pools_members_old: spm.save(user, commit=True) return self.response_error(2, stdout + stderr) except Exception, e: if isinstance(e, IntegrityError): # Duplicate value for Port Vip, Port Real and IP self.log.error(u'Failed to update the request vip.') return self.response_error(353) else: self.log.error(u'Failed to update the request vip.') raise RequisicaoVipsError( e, u'Failed to update the request vip') if error: # build return message vip_list = '' ip_list = '' for real in reals_error: vip_list = vip_list + real['real_name'] + ', ' ip_list = ip_list + real['real_ip'] + ', ' return self.response_error(333, vip_list[:-2], ip_list[:-2]) else: return self.response(dumps_networkapi({})) except XMLError, x: self.log.error(u'Error reading the XML request.') return self.response_error(3, x)
def handle_put(self, request, user, *args, **kwargs): """Treat requests PUT change limit connections to VIP. URLs: /vip/<id_vip>/maxcon/<maxcon>/ """ self.log.info('Change limit connections to VIP') try: vip_id = kwargs.get('id_vip') maxcon = kwargs.get('maxcon') # User permission if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Valid Vip ID if not is_valid_int_greater_zero_param(vip_id): self.log.error( u'The vip_id parameter is not a valid value: %s.', vip_id) raise InvalidValueError(None) # Valid Maxcon if not is_valid_int_greater_equal_zero_param(maxcon): self.log.error( u'The maxcon parameter is not a valid value: %s.', maxcon) raise InvalidValueError(None) # Existing Vip ID vip = RequisicaoVips.get_by_pk(vip_id) with distributedlock(LOCK_VIP % vip_id): vip_old = clone(vip) server_pools = ServerPool.objects.filter( vipporttopool__requisicao_vip=vip) server_pools_old = [] server_pools_members_old = [] for sp in server_pools: server_pools_old.append(sp) for spm in sp.serverpoolmember_set.all(): server_pools_members_old.append(spm) # Vip must be created if not vip.vip_criado: self.log.error( u'Maxcon can not be changed because VIP has not yet been created.') raise RequestVipsNotBeenCreatedError(None) # Vip equipments permission if vip.ip is not None: for ip_equipment in vip.ip.ipequipamento_set.all(): if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.WRITE_OPERATION, None, ip_equipment.equipamento_id, AdminPermission.EQUIP_UPDATE_CONFIG_OPERATION): self.log.error( u'Groups of equipment registered with the IP of the VIP request is not allowed of acess.') raise EquipmentGroupsNotAuthorizedError(None) if vip.ipv6 is not None: for ip_equipment in vip.ipv6.ipv6equipament_set.all(): if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.WRITE_OPERATION, None, ip_equipment.equipamento_id, AdminPermission.EQUIP_UPDATE_CONFIG_OPERATION): self.log.error( u'Groups of equipment registered with the IP of the VIP request is not allowed of acess.') raise EquipmentGroupsNotAuthorizedError(None) # Get variables variables_map = vip.variables_to_map() # Valid variables vip.set_variables(variables_map) # Valid real names and real ips of real server if variables_map.get('reals') is not None: evip = EnvironmentVip.get_by_values(variables_map.get( 'finalidade'), variables_map.get('cliente'), variables_map.get('ambiente')) for real in variables_map.get('reals').get('real'): ip_aux_error = real.get('real_ip') equip_aux_error = real.get('real_name') equip = Equipamento.get_by_name(equip_aux_error) # Valid Real RequisicaoVips.valid_real_server( ip_aux_error, equip, evip) # Valid reals_prioritys variables_map, code = vip.valid_values_reals_priority( variables_map) if code is not None: return self.response_error(329) # Valid reals_weight variables_map, code = vip.valid_values_reals_weight( variables_map) if code is not None: return self.response_error(330) # Valid ports variables_map, code = vip.valid_values_ports(variables_map) if code is not None: return self.response_error(331) variables_map['maxcon'] = maxcon vip.set_variables(variables_map) vip.save(user, commit=True) # update server pool limits table # Fix #27 server_pools = ServerPool.objects.filter( vipporttopool__requisicao_vip=vip) for sp in server_pools: # If exists pool member, change default maxconn of pool and # members if(len(sp.serverpoolmember_set.all()) > 0): # if(old_maxconn != sp.default_limit and # sp.pool_created): sp.default_limit = maxcon sp.save(user, commit=True) for serverpoolmember in sp.serverpoolmember_set.all(): serverpoolmember.limit = maxcon serverpoolmember.save(user, commit=True) # gerador_vips -i <ID_REQUISICAO> --maxconn command = 'gerador_vips -i %d --maxconn' % vip.id code, stdout, stderr = exec_script(command) if code == 0: success_map = dict() success_map['codigo'] = '%04d' % code success_map['descricao'] = { 'stdout': stdout, 'stderr': stderr} map = dict() map['sucesso'] = success_map return self.response(dumps_networkapi(map)) else: # TODO Check if is needed to update pool members separately vip_old.save(user, commit=True) for sp in server_pools_old: sp.save(user, commit=True) for spm in server_pools_members_old: spm.save(user, commit=True) return self.response_error(2, stdout + stderr) except XMLError, x: self.log.error(u'Error reading the XML request.') return self.response_error(3, x)
def handle_post(self, request, user, *args, **kwargs): """Treat requests POST to insert request VIP. URLs: /requestvip/ deprecated:: Use the new rest API """ self.log.info('Add request VIP') try: # Load XML data xml_map, attrs_map = loads( request.raw_post_data, ['real', 'reals_weight', 'reals_priority', 'porta']) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error( 3, u'There is no value to the networkapi tag of XML request.' ) vip_map = networkapi_map.get('vip') if vip_map is None: return self.response_error( 3, u'There is no value to the vip tag of XML request.') # User permission if not has_perm(user, AdminPermission.VIPS_REQUEST, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Valid Ipv4 and Ipv6 ID if (vip_map.get('id_ipv4') is None and vip_map.get('id_ipv6') is None): self.log.error( u'The id_ipv4 and id_ipv6 parameter is not a valid value: %s.', vip_map.get('id_ipv4')) raise InvalidValueError(None, 'id_ipv4 e id_vip6', vip_map.get('id_ipv4')) if (vip_map.get('id_ipv4') is not None): if not is_valid_int_greater_zero_param(vip_map.get('id_ipv4')): self.log.error( u'The id_ipv4 parameter is not a valid value: %s.', vip_map.get('id_ipv4')) raise InvalidValueError(None, 'id_ipv4', vip_map.get('id_ipv4')) if (vip_map.get('id_ipv6') is not None): if not is_valid_int_greater_zero_param(vip_map.get('id_ipv6')): self.log.error( u'The id_ipv6 parameter is not a valid value: %s.', vip_map.get('id_ipv6')) raise InvalidValueError(None, 'id_ipv6', vip_map.get('id_ipv6')) # Valid maxcon if not is_valid_int_greater_equal_zero_param( vip_map.get('maxcon')): self.log.error( u'The maxcon parameter is not a valid value: %s.', vip_map.get('maxcon')) raise InvalidValueError(None, 'maxcon', vip_map.get('maxcon')) vip = RequisicaoVips() finalidade = vip_map.get('finalidade') cliente = vip_map.get('cliente') ambiente = vip_map.get('ambiente') try: evip = EnvironmentVip.get_by_values(finalidade, cliente, ambiente) except Exception, e: raise EnvironmentVipNotFoundError( e, 'The fields finality or client or ambiente is None') # Valid real names and real ips of real server if vip_map.get('reals') is not None: for real in vip_map.get('reals').get('real'): ip_aux_error = real.get('real_ip') equip_aux_error = real.get('real_name') if equip_aux_error is not None: equip = Equipamento.get_by_name(equip_aux_error) else: self.log.error( u'The real_name parameter is not a valid value: None.' ) raise InvalidValueError(None, 'real_name', 'None') # Valid Real RequisicaoVips.valid_real_server(ip_aux_error, equip, evip, False) # Valid reals_prioritys vip_map, code = vip.valid_values_reals_priority(vip_map) if code is not None: return self.response_error(code) # Valid reals_weight vip_map, code = vip.valid_values_reals_weight(vip_map) if code is not None: return self.response_error(code) # Existing IPv4 ID if vip_map.get('id_ipv4') is not None: vip.ip = Ip().get_by_pk(vip_map.get('id_ipv4')) # Existing IPv6 ID if vip_map.get('id_ipv6') is not None: vip.ipv6 = Ipv6().get_by_pk(vip_map.get('id_ipv6')) # Valid ports vip_map, code = vip.valid_values_ports(vip_map) if code is not None: return self.response_error(code[0], code[1]) # Valid HealthcheckExpect vip_map, vip, code = vip.valid_values_healthcheck( vip_map, vip, evip) if code is not None: return self.response_error(code) # Host host_name = vip_map.get('host') if not is_valid_string_minsize(host_name, 3) or not is_valid_string_maxsize( host_name, 100): self.log.error(u'Host_name value is invalid: %s.', host_name) raise InvalidValueError(None, 'host_name', host_name) # Areanegocio areanegocio = vip_map.get('areanegocio') if not is_valid_string_minsize(areanegocio, 3) or not is_valid_string_maxsize( areanegocio, 100): self.log.error(u'Areanegocio value is invalid: %s.', areanegocio) raise InvalidValueError(None, 'areanegocio', areanegocio) # Nome_servico nome_servico = vip_map.get('nome_servico') if not is_valid_string_minsize(nome_servico, 3) or not is_valid_string_maxsize( nome_servico, 100): self.log.error(u'Nome_servico value is invalid: %s.', nome_servico) raise InvalidValueError(None, 'nome_servico', nome_servico) # Existing l7_filter if vip_map.get('l7_filter') is not None: vip.l7_filter = vip_map.get('l7_filter') # If the l7_filter is a rule if vip_map.get('rule_id') is not None: if not is_valid_int_greater_zero_param(vip_map.get('rule_id')): self.log.error( u'The rule_id parameter is not a valid value: %s.', vip_map.get('rule_id')) raise InvalidValueError(None, 'rule_id', vip_map.get('rule_id')) rule = Rule.objects.get(pk=vip_map.get('rule_id')) vip.l7_filter = '\n'.join( rule.rulecontent_set.all().values_list('content', flat=True)) vip.rule = rule # set variables vip.filter_valid = 1 vip.validado = 0 vip.vip_criado = 0 vip.set_variables(vip_map) try: # save Resquest Vip vip.save() # save VipPortToPool, ServerPool and ServerPoolMember vip.save_vips_and_ports(vip_map, user) # SYNC_VIP old_to_new(vip) except Exception, e: if isinstance(e, IntegrityError): # Duplicate value for Port Vip, Port Real and IP self.log.error(u'Failed to save the request vip.') return self.response_error(353) else: raise e
def handle_put(self, request, user, *args, **kwargs): """Treat requests PUT change request VIP. URLs: /requestvip/<id_vip>/ deprecated:: Use the new rest API """ self.log.info('Change request VIP') try: vip_id = kwargs.get('id_vip') # Load XML data xml_map, attrs_map = loads( request.raw_post_data, ['real', 'reals_weight', 'reals_priority', 'porta']) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error( 3, u'There is no value to the networkapi tag of XML request.' ) vip_map = networkapi_map.get('vip') if vip_map is None: return self.response_error( 3, u'There is no value to the vip tag of XML request.') # User permission if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Valid Vip ID if not is_valid_int_greater_zero_param(vip_id): self.log.error( u'The vip_id parameter is not a valid value: %s.', vip_id) raise InvalidValueError(None, 'vip_id', vip_id) # Valid Ipv4 and Ipv6 ID if (vip_map.get('id_ipv4') is None and vip_map.get('id_ipv6') is None): self.log.error( u'The id_ipv4 and id_ipv6 parameter is not a valid value: %s.', vip_map.get('id_ipv4')) raise InvalidValueError(None, 'id_ipv4 e id_vip6', vip_map.get('id_ipv4')) if (vip_map.get('id_ipv4') is not None): if not is_valid_int_greater_zero_param(vip_map.get('id_ipv4')): self.log.error( u'The id_ipv4 parameter is not a valid value: %s.', vip_map.get('id_ipv4')) raise InvalidValueError(None, 'id_ipv4', vip_map.get('id_ipv4')) if (vip_map.get('id_ipv6') is not None): if not is_valid_int_greater_zero_param(vip_map.get('id_ipv6')): self.log.error( u'The id_ipv6 parameter is not a valid value: %s.', vip_map.get('id_ipv6')) raise InvalidValueError(None, 'id_ipv6', vip_map.get('id_ipv6')) # Valid Vip validated if not is_valid_boolean_param(vip_map.get('validado')): self.log.error( u'The validated parameter is not a valid value: %s.', vip_map.get('validado')) raise InvalidValueError(None, 'validated', vip_map.get('validado')) # Valid Vip vip_created if not is_valid_boolean_param(vip_map.get('vip_criado')): self.log.error( u'The vip_created parameter is not a valid value: %s.', vip_map.get('vip_criado')) raise InvalidValueError(None, 'vip_created', vip_map.get('vip_criado')) # Valid maxcon if not is_valid_int_greater_equal_zero_param( vip_map.get('maxcon')): self.log.error( u'The maxcon parameter is not a valid value: %s.', vip_map.get('maxcon')) raise InvalidValueError(None, 'maxcon', vip_map.get('maxcon')) # Existing Vip ID vip = RequisicaoVips.get_by_pk(vip_id) with distributedlock(LOCK_VIP % vip_id): # Valid Vip created if vip.vip_criado: self.log.error( u'The IP of the request for VIP %d can not be changed because the VIP is already created.' % vip.id) raise RequisicaoVipsAlreadyCreatedError(None) # Get variables variables_map = vip.variables_to_map() # Valid variables vip.set_variables(variables_map) evip = EnvironmentVip.get_by_values( variables_map.get('finalidade'), variables_map.get('cliente'), variables_map.get('ambiente')) # Valid real names and real ips of real server if vip_map.get('reals') is not None: for real in vip_map.get('reals').get('real'): ip_aux_error = real.get('real_ip') equip_aux_error = real.get('real_name') if equip_aux_error is not None: equip = Equipamento.get_by_name(equip_aux_error) else: self.log.error( u'The real_name parameter is not a valid value: None.' ) raise InvalidValueError(None, 'real_name', 'None') # Valid Real RequisicaoVips.valid_real_server( ip_aux_error, equip, evip, False) # Valid reals_prioritys vip_map, code = vip.valid_values_reals_priority(vip_map) if code is not None: return self.response_error(code) # Valid reals_weight vip_map, code = vip.valid_values_reals_weight(vip_map) if code is not None: return self.response_error(code) # Existing IPv4 ID if vip_map.get('id_ipv4') is not None: vip.ip = Ip().get_by_pk(vip_map.get('id_ipv4')) else: vip.ip = None # Existing IPv6 ID if vip_map.get('id_ipv6') is not None: vip.ipv6 = Ipv6().get_by_pk(vip_map.get('id_ipv6')) else: vip.ipv6 = None # Valid ports vip_map, code = vip.valid_values_ports(vip_map) if code is not None: return self.response_error(code) # Valid HealthcheckExpect vip_map, vip, code = vip.valid_values_healthcheck( vip_map, vip, evip) if code is not None: return self.response_error(code) # Existing l7_filter if vip_map.get('l7_filter') is not None: vip.l7_filter = vip_map.get('l7_filter') else: vip.l7_filter = None # If the l7_filter is a rule, set filter_valid to TRUE if vip_map.get('rule_id') is not None: # Valid rule if not is_valid_int_greater_zero_param( vip_map.get('rule_id')): self.log.error( u'The rule_id parameter is not a valid value: %s.', vip_map.get('rule_id')) raise InvalidValueError(None, 'rule_id', vip_map.get('rule_id')) rule = Rule.objects.get(pk=vip_map.get('rule_id')) vip.l7_filter = '\n'.join( rule.rulecontent_set.all().values_list('content', flat=True)) vip.rule = rule else: vip.rule = None # set variables vip.filter_valid = 1 vip.validado = 0 vip.set_variables(vip_map) try: # update Resquest Vip vip.save() # update ServerPool, VipPortToPool, ServerPoolMembers vip.save_vips_and_ports(vip_map, user) # SYNC_VIP old_to_new(vip) except RequestVipServerPoolConstraintError, e: self.log.error(e.message) return self.response_error(384, e.message) except Exception, e: if isinstance(e, IntegrityError): # Duplicate value for Port Vip, Port Real and IP self.log.error(u'Failed to update the request vip.') return self.response_error(353) else: self.log.error(u'Failed to update the request vip.') raise RequisicaoVipsError( e, u'Failed to update the request vip')
def __post_virtual_group_vip(self, vip_maps, user, vip_equipment_ip_map, resp_vip_maps): try: for vip_map in vip_maps: resp_vip_map = dict() vip_id = vip_map.get('id') resp_vip_map['id'] = vip_id id_vip_request_map = vip_map.get('requisicao_vip') ip_map = vip_map.get('ip') # Somente insere o IP do VIP se a requisição de VIP ainda não foi criada # (id_vip_request_map is None). if (ip_map is not None) and (id_vip_request_map is None): # Insere o IP do VIP e o associa aos balanceadores balanceadores_map = vip_map.get('balanceadores') if balanceadores_map is None: return self.response_error( 3, u'Não existe valor para a tag balanceadors do vip %s do XML de requisição.' % vip_id) equipments_ids = balanceadores_map.get('id_equipamento') if len(equipments_ids) == 0: return self.response_error( 3, u'Não existe valor para a tag id_equipamento do vip %s do XML de requisição.' % vip_id) # Insere um IP e o relacionamento dele com o primeiro # balanceador equip_id = equipments_ids[0] ip_map['id_equipamento'] = equip_id response_ip = insert_ip(ip_map, user) if response_ip[0] != 0: return self.__treat_response_error(response_ip) # Insere o relacionamento entre o IP e os demais # balanceadores for equip_id in equipments_ids[1:len(equipments_ids)]: insert_ip_equipment(response_ip[1].get('id'), equip_id, user) resp_vip_map['ip'] = response_ip[1] vip_map['id_ip'] = response_ip[1].get('id') # Constroe o reals # Obtem os reals já criados e que foram enviados no XML de # requisição reals_map = vip_map.get('reals') if reals_map is not None: real_maps = reals_map.get('real', []) else: real_maps = [] # Adiciona os novos reals para os equipamentos criados equipment_ip_maps = vip_equipment_ip_map.get(vip_id) if equipment_ip_maps is not None: for equipment_ip_map in equipment_ip_maps: real_name = equipment_ip_map.get( 'nome_equipamento') # + sufix real_ip = equipment_ip_map.get('ip') real_maps.append({ 'real_name': real_name, 'real_ip': real_ip }) vip_map['reals'] = {'real': real_maps} reals_priority_map = vip_map.get('reals_prioritys') if reals_priority_map is not None: reals_priority_map = reals_priority_map.get( 'reals_priority') if reals_priority_map is None: reals_priority_map = ['0' for __real in real_maps] else: reals_priority_map = ['0' for __real in real_maps] vip_map['reals_prioritys'] = { 'reals_priority': reals_priority_map } reals_weight_map = vip_map.get('reals_weights') if reals_weight_map is not None: reals_weight_map = reals_weight_map.get('reals_weight') if reals_weight_map is None: reals_weight_map = ['0' for __real in real_maps] else: reals_weight_map = ['0' for __real in real_maps] vip_map['reals_weights'] = {'reals_weight': reals_weight_map} # Valid real names and real ips of real server if vip_map.get('reals') is not None: evip = EnvironmentVip.get_by_values( vip_map.get('finalidade'), vip_map.get('cliente'), vip_map.get('ambiente')) for real in vip_map.get('reals').get('real'): ip_aux_error = real.get('real_ip') equip_id = real.get('real_name') if equip_id is not None: equip = Equipamento.get_by_name(equip_id) else: self.log.error( u'The real_name parameter is not a valid value: None.' ) raise InvalidValueError(None, 'real_name', 'None') # Valid Real RequisicaoVips.valid_real_server( ip_aux_error, equip, evip, False) vip_map, code = RequisicaoVips( ).valid_values_reals_priority(vip_map) if code is not None: return self.response_error(code) vip_map, code = RequisicaoVips( ).valid_values_reals_weight(vip_map) if code is not None: return self.response_error(code) # Insere ou atualiza a requisição de VIP if (id_vip_request_map is not None): resp_vip_map['requisicao_vip'] = id_vip_request_map if not is_valid_int_greater_zero_param( id_vip_request_map.get('id')): self.log.error( u'The requisicao_vip.id parameter is not a valid value: %s.', id_vip_request_map.get('id')) raise InvalidValueError(None, 'requisicao_vip.id', id_vip_request_map.get('id')) vip_request = RequisicaoVips.get_by_pk( id_vip_request_map.get('id')) vip_map['id_ip'] = vip_request.ip_id if vip_request.validado: vip_map['validado'] = '1' else: vip_map['validado'] = '0' if vip_request.vip_criado: vip_map['vip_criado'] = '1' else: vip_map['vip_criado'] = '0' response_vip = update_vip_request(vip_request.id, vip_map, user) if (response_vip != 0): return self.response_error(response_vip) else: """This condition is used to attend a requisite from 'Orquestra', because in some points the VIP doesn't have cache option and the value can be 'None'""" if vip_map['cache'] is None: vip_map['cache'] = '(nenhum)' response_vip = insert_vip_request(vip_map, user) if (response_vip[0] != 0): if response_vip[0] not in (275, 276, 277): return self.__treat_response_error(response_vip) else: return self.__treat_response_error( [response_vip[0]]) resp_vip_map['requisicao_vip'] = {'id': response_vip[1].id} resp_vip_maps.append(resp_vip_map) except EnvironmentVipNotFoundError: return self.response_error(316, vip_map['finalidade'], vip_map['cliente'], vip_map['ambiente']) except RequisicaoVipsNotFoundError: return self.response_error(152) except HealthcheckExpectNotFoundError: return self.response_error(124) except InvalidFinalidadeValueError: return self.response_error(125) except InvalidClienteValueError: return self.response_error(126) except InvalidAmbienteValueError: return self.response_error(127) except InvalidCacheValueError: return self.response_error(128) except InvalidMetodoBalValueError: return self.response_error(131) except InvalidPersistenciaValueError: return self.response_error(132) except InvalidHealthcheckTypeValueError: return self.response_error(133) except InvalidHealthcheckValueError: return self.response_error(134) except InvalidTimeoutValueError: return self.response_error(135) except InvalidHostNameError: return self.response_error(136) except InvalidMaxConValueError: return self.response_error(137) except InvalidBalAtivoValueError: return self.response_error(129) except InvalidTransbordoValueError, t: transbordo = 'nulo' if t.message is not None: transbordo = t.message return self.response_error(130, transbordo)
def __post_virtual_group_vip(self, vip_maps, user, vip_equipment_ip_map, resp_vip_maps): try: for vip_map in vip_maps: resp_vip_map = dict() vip_id = vip_map.get('id') resp_vip_map['id'] = vip_id id_vip_request_map = vip_map.get('requisicao_vip') ip_map = vip_map.get('ip') # Somente insere o IP do VIP se a requisição de VIP ainda não foi criada # (id_vip_request_map is None). if (ip_map is not None) and (id_vip_request_map is None): # Insere o IP do VIP e o associa aos balanceadores balanceadores_map = vip_map.get('balanceadores') if balanceadores_map is None: return self.response_error(3, u'Não existe valor para a tag balanceadors do vip %s do XML de requisição.' % vip_id) equipments_ids = balanceadores_map.get('id_equipamento') if len(equipments_ids) == 0: return self.response_error(3, u'Não existe valor para a tag id_equipamento do vip %s do XML de requisição.' % vip_id) # Insere um IP e o relacionamento dele com o primeiro # balanceador equip_id = equipments_ids[0] ip_map['id_equipamento'] = equip_id response_ip = insert_ip(ip_map, user) if response_ip[0] != 0: return self.__treat_response_error(response_ip) # Insere o relacionamento entre o IP e os demais # balanceadores for equip_id in equipments_ids[1:len(equipments_ids)]: insert_ip_equipment( response_ip[1].get('id'), equip_id, user) resp_vip_map['ip'] = response_ip[1] vip_map['id_ip'] = response_ip[1].get('id') # Constroe o reals # Obtem os reals já criados e que foram enviados no XML de # requisição reals_map = vip_map.get('reals') if reals_map is not None: real_maps = reals_map.get('real', []) else: real_maps = [] # Adiciona os novos reals para os equipamentos criados equipment_ip_maps = vip_equipment_ip_map.get(vip_id) if equipment_ip_maps is not None: for equipment_ip_map in equipment_ip_maps: real_name = equipment_ip_map.get( 'nome_equipamento') # + sufix real_ip = equipment_ip_map.get('ip') real_maps.append( {'real_name': real_name, 'real_ip': real_ip}) vip_map['reals'] = {'real': real_maps} reals_priority_map = vip_map.get('reals_prioritys') if reals_priority_map is not None: reals_priority_map = reals_priority_map.get( 'reals_priority') if reals_priority_map is None: reals_priority_map = ['0' for __real in real_maps] else: reals_priority_map = ['0' for __real in real_maps] vip_map['reals_prioritys'] = { 'reals_priority': reals_priority_map} reals_weight_map = vip_map.get('reals_weights') if reals_weight_map is not None: reals_weight_map = reals_weight_map.get('reals_weight') if reals_weight_map is None: reals_weight_map = ['0' for __real in real_maps] else: reals_weight_map = ['0' for __real in real_maps] vip_map['reals_weights'] = {'reals_weight': reals_weight_map} # Valid real names and real ips of real server if vip_map.get('reals') is not None: evip = EnvironmentVip.get_by_values( vip_map.get('finalidade'), vip_map.get('cliente'), vip_map.get('ambiente')) for real in vip_map.get('reals').get('real'): ip_aux_error = real.get('real_ip') equip_id = real.get('real_name') if equip_id is not None: equip = Equipamento.get_by_name(equip_id) else: self.log.error( u'The real_name parameter is not a valid value: None.') raise InvalidValueError(None, 'real_name', 'None') # Valid Real RequisicaoVips.valid_real_server( ip_aux_error, equip, evip, False) vip_map, code = RequisicaoVips().valid_values_reals_priority( vip_map) if code is not None: return self.response_error(code) vip_map, code = RequisicaoVips().valid_values_reals_weight( vip_map) if code is not None: return self.response_error(code) # Insere ou atualiza a requisição de VIP if (id_vip_request_map is not None): resp_vip_map['requisicao_vip'] = id_vip_request_map if not is_valid_int_greater_zero_param(id_vip_request_map.get('id')): self.log.error( u'The requisicao_vip.id parameter is not a valid value: %s.', id_vip_request_map.get('id')) raise InvalidValueError( None, 'requisicao_vip.id', id_vip_request_map.get('id')) vip_request = RequisicaoVips.get_by_pk( id_vip_request_map.get('id')) vip_map['id_ip'] = vip_request.ip_id if vip_request.validado: vip_map['validado'] = '1' else: vip_map['validado'] = '0' if vip_request.vip_criado: vip_map['vip_criado'] = '1' else: vip_map['vip_criado'] = '0' response_vip = update_vip_request( vip_request.id, vip_map, user) if (response_vip != 0): return self.response_error(response_vip) else: """This condition is used to attend a requisite from 'Orquestra', because in some points the VIP doesn't have cache option and the value can be 'None'""" if vip_map['cache'] is None: vip_map['cache'] = "(nenhum)" response_vip = insert_vip_request(vip_map, user) if (response_vip[0] != 0): if response_vip[0] not in (275, 276, 277): return self.__treat_response_error(response_vip) else: return self.__treat_response_error([response_vip[0]]) resp_vip_map['requisicao_vip'] = {'id': response_vip[1].id} resp_vip_maps.append(resp_vip_map) except EnvironmentVipNotFoundError: return self.response_error(316, vip_map['finalidade'], vip_map['cliente'], vip_map['ambiente']) except RequisicaoVipsNotFoundError: return self.response_error(152) except HealthcheckExpectNotFoundError: return self.response_error(124) except InvalidFinalidadeValueError: return self.response_error(125) except InvalidClienteValueError: return self.response_error(126) except InvalidAmbienteValueError: return self.response_error(127) except InvalidCacheValueError: return self.response_error(128) except InvalidMetodoBalValueError: return self.response_error(131) except InvalidPersistenciaValueError: return self.response_error(132) except InvalidHealthcheckTypeValueError: return self.response_error(133) except InvalidHealthcheckValueError: return self.response_error(134) except InvalidTimeoutValueError: return self.response_error(135) except InvalidHostNameError: return self.response_error(136) except InvalidMaxConValueError: return self.response_error(137) except InvalidBalAtivoValueError: return self.response_error(129) except InvalidTransbordoValueError, t: transbordo = 'nulo' if t.message is not None: transbordo = t.message return self.response_error(130, transbordo)
def handle_get(self, request, user, *args, **kwargs): """Handles POST requests to find all Equipments by search parameters. URLs: /equipment/find/ """ self.log.info('Find all Equipments') try: # Commons Validations # User permission if not has_perm(user, AdminPermission.EQUIPMENT_MANAGEMENT, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Business Validations # Get data from URL GET parameters equip_name = kwargs.get('equip_name').strip() id_ambiente = kwargs.get('id_ambiente') # Business Rules # Start with alls ambiente = Ambiente.get_by_pk(id_ambiente) # Get Equipment equip = Equipamento.get_by_name(equip_name) lista_ips_equip = set() lista_ipsv6_equip = set() environment_vip_list = EnvironmentVip.get_environment_vips_by_environment_id(id_ambiente) environment_list_related = EnvironmentEnvironmentVip.get_environment_list_by_environment_vip_list(environment_vip_list) # # Get all IPV4's Equipment for environment in environment_list_related: for ipequip in equip.ipequipamento_set.select_related().all(): network_ipv4 = ipequip.ip.networkipv4 if network_ipv4.vlan.ambiente == environment: lista_ips_equip.add(ipequip.ip) # # Get all IPV6's Equipment for environment in environment_list_related: for ipequip in equip.ipv6equipament_set.select_related().all(): network_ipv6 = ipequip.ip.networkipv6 if network_ipv6.vlan.ambiente == environment: lista_ipsv6_equip.add(ipequip.ip) # lists and dicts for return lista_ip_entregue = list() lista_ip6_entregue = list() for ip in lista_ips_equip: dict_ips4 = dict() dict_network = dict() dict_ips4['id'] = ip.id dict_ips4['ip'] = "%s.%s.%s.%s" % ( ip.oct1, ip.oct2, ip.oct3, ip.oct4) dict_network['id'] = ip.networkipv4_id dict_network["network"] = "%s.%s.%s.%s" % ( ip.networkipv4.oct1, ip.networkipv4.oct2, ip.networkipv4.oct3, ip.networkipv4.oct4) dict_network["mask"] = "%s.%s.%s.%s" % ( ip.networkipv4.mask_oct1, ip.networkipv4.mask_oct2, ip.networkipv4.mask_oct3, ip.networkipv4.mask_oct4) dict_ips4['network'] = dict_network lista_ip_entregue.append(dict_ips4) for ip in lista_ipsv6_equip: dict_ips6 = dict() dict_network = dict() dict_ips6['id'] = ip.id dict_ips6['ip'] = "%s:%s:%s:%s:%s:%s:%s:%s" % ( ip.block1, ip.block2, ip.block3, ip.block4, ip.block5, ip.block6, ip.block7, ip.block8) dict_network['id'] = ip.networkipv6.id dict_network["network"] = "%s:%s:%s:%s:%s:%s:%s:%s" % ( ip.networkipv6.block1, ip.networkipv6.block2, ip.networkipv6.block3, ip.networkipv6.block4, ip.networkipv6.block5, ip.networkipv6.block6, ip.networkipv6.block7, ip.networkipv6.block8) dict_network["mask"] = "%s:%s:%s:%s:%s:%s:%s:%s" % ( ip.networkipv6.block1, ip.networkipv6.block2, ip.networkipv6.block3, ip.networkipv6.block4, ip.networkipv6.block5, ip.networkipv6.block6, ip.networkipv6.block7, ip.networkipv6.block8) dict_ips6['network'] = dict_network lista_ip6_entregue.append(dict_ips6) lista_ip_entregue = lista_ip_entregue if len( lista_ip_entregue) > 0 else None lista_ip6_entregue = lista_ip6_entregue if len( lista_ip6_entregue) > 0 else None return self.response(dumps_networkapi({'list_ipv4': lista_ip_entregue, 'list_ipv6': lista_ip6_entregue})) except InvalidValueError, e: self.log.error( u'Parameter %s is invalid. Value: %s.', e.param, e.value) return self.response_error(269, e.param, e.value)
def handle_put(self, request, user, *args, **kwargs): """Treat requests PUT change limit connections to VIP. URLs: /vip/<id_vip>/maxcon/<maxcon>/ """ self.log.info("Change limit connections to VIP") try: vip_id = kwargs.get('id_vip') maxcon = kwargs.get('maxcon') # User permission if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Valid Vip ID if not is_valid_int_greater_zero_param(vip_id): self.log.error( u'The vip_id parameter is not a valid value: %s.', vip_id) raise InvalidValueError(None) # Valid Maxcon if not is_valid_int_greater_equal_zero_param(maxcon): self.log.error( u'The maxcon parameter is not a valid value: %s.', maxcon) raise InvalidValueError(None) # Existing Vip ID vip = RequisicaoVips.get_by_pk(vip_id) with distributedlock(LOCK_VIP % vip_id): vip_old = clone(vip) server_pools = ServerPool.objects.filter(vipporttopool__requisicao_vip=vip) server_pools_old = [] server_pools_members_old = [] for sp in server_pools: server_pools_old.append(sp) for spm in sp.serverpoolmember_set.all(): server_pools_members_old.append(spm) # Vip must be created if not vip.vip_criado: self.log.error( u'Maxcon can not be changed because VIP has not yet been created.') raise RequestVipsNotBeenCreatedError(None) # Vip equipments permission if vip.ip is not None: for ip_equipment in vip.ip.ipequipamento_set.all(): if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.WRITE_OPERATION, None, ip_equipment.equipamento_id, AdminPermission.EQUIP_UPDATE_CONFIG_OPERATION): self.log.error( u'Groups of equipment registered with the IP of the VIP request is not allowed of acess.') raise EquipmentGroupsNotAuthorizedError(None) if vip.ipv6 is not None: for ip_equipment in vip.ipv6.ipv6equipament_set.all(): if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.WRITE_OPERATION, None, ip_equipment.equipamento_id, AdminPermission.EQUIP_UPDATE_CONFIG_OPERATION): self.log.error( u'Groups of equipment registered with the IP of the VIP request is not allowed of acess.') raise EquipmentGroupsNotAuthorizedError(None) # Get variables variables_map = vip.variables_to_map() # Valid variables vip.set_variables(variables_map) # Valid real names and real ips of real server if variables_map.get('reals') is not None: evip = EnvironmentVip.get_by_values(variables_map.get( 'finalidade'), variables_map.get('cliente'), variables_map.get('ambiente')) for real in variables_map.get('reals').get('real'): ip_aux_error = real.get('real_ip') equip_aux_error = real.get('real_name') equip = Equipamento.get_by_name(equip_aux_error) # Valid Real RequisicaoVips.valid_real_server( ip_aux_error, equip, evip) # Valid reals_prioritys variables_map, code = vip.valid_values_reals_priority( variables_map) if code is not None: return self.response_error(329) # Valid reals_weight variables_map, code = vip.valid_values_reals_weight( variables_map) if code is not None: return self.response_error(330) # Valid ports variables_map, code = vip.valid_values_ports(variables_map) if code is not None: return self.response_error(331) variables_map['maxcon'] = maxcon vip.set_variables(variables_map) vip.save(user, commit=True) #update server pool limits table #Fix #27 server_pools = ServerPool.objects.filter(vipporttopool__requisicao_vip=vip) for sp in server_pools: #If exists pool member, change default maxconn of pool and members if(len(sp.serverpoolmember_set.all()) > 0): #if(old_maxconn != sp.default_limit and sp.pool_created): sp.default_limit = maxcon sp.save(user, commit=True) for serverpoolmember in sp.serverpoolmember_set.all(): serverpoolmember.limit = maxcon serverpoolmember.save(user, commit=True) # gerador_vips -i <ID_REQUISICAO> --maxconn command = 'gerador_vips -i %d --maxconn' % vip.id code, stdout, stderr = exec_script(command) if code == 0: success_map = dict() success_map['codigo'] = '%04d' % code success_map['descricao'] = { 'stdout': stdout, 'stderr': stderr} map = dict() map['sucesso'] = success_map return self.response(dumps_networkapi(map)) else: #TODO Check if is needed to update pool members separately vip_old.save(user, commit=True) for sp in server_pools_old: sp.save(user, commit=True) for spm in server_pools_members_old: spm.save(user, commit=True) return self.response_error(2, stdout + stderr) except XMLError, x: self.log.error(u'Error reading the XML request.') return self.response_error(3, x)
def handle_post(self, request, user, *args, **kwargs): """Handles POST requests to get all Ips (v4) or (v6) of equip on Divisao DC and Ambiente Logico of fisrt Network4 and 6 (if exists) of Environment Vip. URL: ip/getbyequipandevip/ """ self.log.info('Get Ips by Equip - Evip') try: # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.READ_OPERATION): raise UserNotAuthorizedError( None, u'User does not have permission to perform the operation.') # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: msg = u'There is no value to the networkapi tag of XML request.' self.log.error(msg) return self.response_error(3, msg) ip_map = networkapi_map.get('ip_map') if ip_map is None: msg = u'There is no value to the ip tag of XML request.' self.log.error(msg) return self.response_error(3, msg) # Get XML data id_evip = ip_map.get('id_evip') equip_name = ip_map.get('equip_name') # Valid id_evip if not is_valid_int_greater_zero_param(id_evip): self.log.error(u'Parameter id_evip is invalid. Value: %s.', id_evip) raise InvalidValueError(None, 'id_evip', id_evip) # Valid equip_name if not is_valid_string_minsize( equip_name, 3) or not is_valid_string_maxsize( equip_name, 80) or not is_valid_regex( equip_name, '^[A-Z0-9-_]+$'): self.log.error(u'Parameter equip_name is invalid. Value: %s', equip_name) raise InvalidValueError(None, 'equip_name', equip_name) # Business Rules # Get Environment VIp evip = EnvironmentVip.get_by_pk(id_evip) # Get Equipment equip = Equipamento.get_by_name(equip_name) lista_ips_equip = list() lista_ipsv6_equip = list() # GET DIVISAO DC AND AMBIENTE_LOGICO OF NET4 AND NET6 lista_amb_div_4 = list() lista_amb_div_6 = list() for net in evip.networkipv4_set.select_related('vlan', 'ambiente').all(): dict_div_4 = dict() dict_div_4['divisao_dc'] = net.vlan.ambiente.divisao_dc_id dict_div_4[ 'ambiente_logico'] = net.vlan.ambiente.ambiente_logico_id if dict_div_4 not in lista_amb_div_4: lista_amb_div_4.append(dict_div_4) for net in evip.networkipv6_set.select_related('vlan', 'ambiente').all(): dict_div_6 = dict() dict_div_6['divisao_dc'] = net.vlan.ambiente.divisao_dc_id dict_div_6[ 'ambiente_logico'] = net.vlan.ambiente.ambiente_logico_id if dict_div_6 not in lista_amb_div_6: lista_amb_div_6.append(dict_div_6) # Get all IPV4's Equipment for ipequip in equip.ipequipamento_set.select_related( 'ip', 'vlan', 'ambiente').all(): if ipequip.ip not in lista_ips_equip: for dict_div_amb in lista_amb_div_4: # if ipequip.ip.networkipv4.ambient_vip is not None and # ipequip.ip.networkipv4.ambient_vip.id == evip.id: if (ipequip.ip.networkipv4.vlan.ambiente.divisao_dc.id == dict_div_amb.get('divisao_dc') and ipequip. ip.networkipv4.vlan.ambiente.ambiente_logico.id == dict_div_amb.get('ambiente_logico')): lista_ips_equip.append(ipequip.ip) # Get all IPV6'S Equipment for ipequip in equip.ipv6equipament_set.select_related( 'ip', 'vlan', 'ambiente').all(): if ipequip.ip not in lista_ipsv6_equip: for dict_div_amb in lista_amb_div_6: # if ipequip.ip.networkipv6.ambient_vip is not None and # ipequip.ip.networkipv6.ambient_vip.id == evip.id: print ipequip.ip.networkipv6.vlan.ambiente.divisao_dc.id print dict_div_amb.get('divisao_dc') if (ipequip.ip.networkipv6.vlan.ambiente.divisao_dc.id == dict_div_amb.get('divisao_dc') and ipequip. ip.networkipv6.vlan.ambiente.ambiente_logico.id == dict_div_amb.get('ambiente_logico')): lista_ipsv6_equip.append(ipequip.ip) # lists and dicts for return lista_ip_entregue = list() lista_ip6_entregue = list() for ip in lista_ips_equip: dict_ips4 = dict() dict_network = dict() dict_ips4['id'] = ip.id dict_ips4['ip'] = '%s.%s.%s.%s' % (ip.oct1, ip.oct2, ip.oct3, ip.oct4) dict_network['id'] = ip.networkipv4_id dict_network['network'] = '%s.%s.%s.%s' % ( ip.networkipv4.oct1, ip.networkipv4.oct2, ip.networkipv4.oct3, ip.networkipv4.oct4) dict_network['mask'] = '%s.%s.%s.%s' % ( ip.networkipv4.mask_oct1, ip.networkipv4.mask_oct2, ip.networkipv4.mask_oct3, ip.networkipv4.mask_oct4) dict_ips4['network'] = dict_network lista_ip_entregue.append(dict_ips4) for ip in lista_ipsv6_equip: dict_ips6 = dict() dict_network = dict() dict_ips6['id'] = ip.id dict_ips6['ip'] = '%s:%s:%s:%s:%s:%s:%s:%s' % ( ip.block1, ip.block2, ip.block3, ip.block4, ip.block5, ip.block6, ip.block7, ip.block8) dict_network['id'] = ip.networkipv6.id dict_network['network'] = '%s:%s:%s:%s:%s:%s:%s:%s' % ( ip.networkipv6.block1, ip.networkipv6.block2, ip.networkipv6.block3, ip.networkipv6.block4, ip.networkipv6.block5, ip.networkipv6.block6, ip.networkipv6.block7, ip.networkipv6.block8) dict_network['mask'] = '%s:%s:%s:%s:%s:%s:%s:%s' % ( ip.networkipv6.block1, ip.networkipv6.block2, ip.networkipv6.block3, ip.networkipv6.block4, ip.networkipv6.block5, ip.networkipv6.block6, ip.networkipv6.block7, ip.networkipv6.block8) dict_ips6['network'] = dict_network lista_ip6_entregue.append(dict_ips6) lista_ip_entregue = lista_ip_entregue if len( lista_ip_entregue) > 0 else None lista_ip6_entregue = lista_ip6_entregue if len( lista_ip6_entregue) > 0 else None if (lista_ip_entregue is None and lista_ip6_entregue is None): raise IpNotFoundByEquipAndVipError( None, 'Ip não encontrado com equipamento %s e ambiente vip %s' % (equip_name, id_evip)) return self.response( dumps_networkapi({ 'ipv4': lista_ip_entregue, 'ipv6': lista_ip6_entregue })) except IpNotFoundByEquipAndVipError: return self.response_error(317, equip_name, id_evip) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
vip.trafficreturn.id = traffic_id # Valid maxcon if not is_valid_int_greater_equal_zero_param(vip_map.get('maxcon')): log.error(u'The maxcon parameter is not a valid value: %s.', vip_map.get('maxcon')) raise InvalidValueError(None, 'maxcon', vip_map.get('maxcon')) if vip_map.get('reals') is not None: for real in vip_map.get('reals').get('real'): ip_aux_error = real.get('real_ip') equip_aux_error = real.get('real_name') if equip_aux_error is not None: equip = Equipamento.get_by_name(equip_aux_error) else: raise InvalidValueError(None, 'real_name', 'None') RequisicaoVips.valid_real_server(ip_aux_error, equip, environment_vip) vip.create(user, vip_map) # SYNC_VIP old_to_new(vip) return 0, vip def update_vip_request(vip_id, vip_map, user):
def handle_put(self, request, user, *args, **kwargs): """ Handles PUT requests to change the VIP's real server. URL: vip/real/edit """ self.log.info("Change VIP's real server") try: # User permission if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Commons Validations # Load XML data xml_map, attrs_map = loads( request.raw_post_data, ['real', 'reals_weight', 'reals_priority']) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error( 3, u'There is no value to the networkapi tag of XML request.' ) vip_map = networkapi_map.get('vip') if vip_map is None: return self.response_error( 3, u'There is no value to the vip tag of XML request.') # Get XML data vip_id = vip_map.get('vip_id') alter_priority = vip_map.get('alter_priority') # Valid VIP ID if not is_valid_int_greater_zero_param(vip_id): self.log.error( u'The vip_id parameter is not a valid value: %s.', vip_id) raise InvalidValueError(None, 'vip_id', vip_id) # Valid Alter Priority if not is_valid_int_greater_equal_zero_param(alter_priority): alter_priority = 0 # Existing Vip ID vip = RequisicaoVips.get_by_pk(vip_id) # Clone vip vip_old = clone(vip) server_pools = ServerPool.objects.filter( vipporttopool__requisicao_vip=vip) server_pools_old = [] server_pools_members_old = [] for sp in server_pools: server_pools_old.append(sp) for spm in sp.serverpoolmember_set.all(): server_pools_members_old.append(spm) # Get variables variables_map = vip.variables_to_map() # Valid variables vip.set_variables(variables_map) # Get balancing method vip_map['metodo_bal'] = str( variables_map.get('metodo_bal')).upper() with distributedlock(LOCK_VIP % vip_id): # Valid real names and real ips of real server if vip_map.get('reals') is not None: evip = EnvironmentVip.get_by_values( variables_map.get('finalidade'), variables_map.get('cliente'), variables_map.get('ambiente')) for real in vip_map.get('reals').get('real'): ip_aux_error = real.get('real_ip') equip_aux_error = real.get('real_name') if equip_aux_error is not None: equip = Equipamento.get_by_name(equip_aux_error) else: self.log.error( u'The real_name parameter is not a valid value: None.' ) raise InvalidValueError(None, 'real_name', 'None') # Valid Real RequisicaoVips.valid_real_server( ip_aux_error, equip, evip, False) # Valid reals_prioritys vip_map, code = vip.valid_values_reals_priority(vip_map) if code is not None: return self.response_error(329) # Valid reals_weight vip_map, code = vip.valid_values_reals_weight(vip_map) if code is not None: return self.response_error(330) # Get variables variables_map = vip.variables_to_map() vip_port_list, reals_list, reals_priority, reals_weight = vip.get_vips_and_reals( vip.id) if reals_list: variables_map['reals'] = {'real': reals_list} variables_map['reals_prioritys'] = { 'reals_priority': reals_priority } variables_map['reals_weights'] = { 'reals_weight': reals_weight } variables_map['portas_servicos'] = {'porta': vip_port_list} # clone variables_map # variables_map_old = clone(variables_map) # Valid ports variables_map, code = vip.valid_values_ports(variables_map) if code is not None: return self.response_error(331) """ OLD CALLS - Deprecated """ vip_ports_pool = VipPortToPool.objects.filter( requisicao_vip=vip) reals = vip_map.get('reals') new_call = True if reals and 'port_real' not in reals['real'][0]: new_call = False reals_prioritys = vip_map.get('reals_prioritys') reals_weights = dict() if 'reals_weights' in vip_map: reals_weights = vip_map.get('reals_weights') reals_aux = dict() reals_prioritys_aux = dict() reals_weight_aux = dict() reals_aux['real'] = list() reals_prioritys_aux['reals_priority'] = list() reals_weight_aux['reals_weight'] = list() repeat = (len(vip_ports_pool) * len(reals['real'])) / len( reals['real']) execute_list = list() for x in range(repeat): execute_list.append((x + 1) * len(reals['real'])) for i in range(len(reals['real'])): for vippp in vip_ports_pool: reals_prioritys_aux['reals_priority'].append( reals_prioritys['reals_priority'][i]) if 'reals_weight' in reals_weights: reals_weight_aux['reals_weight'].append( reals_weights['reals_weight'][i]) server_pool = ServerPool.objects.get( vipporttopool__id=vippp.id, vipporttopool__requisicao_vip=vip) if 'id_ip' not in reals['real'][i]: id_ip = get_id_ip(reals['real'][i]) else: id_ip = reals['real'][i]['id_ip'] reals_aux['real'].append({ 'id_ip': id_ip, 'port_real': server_pool.default_port, 'real_name': reals['real'][i]['real_name'], 'port_vip': vippp.port_vip, u'real_ip': reals['real'][i]['real_ip'] }) vip_map['reals_prioritys'] = reals_prioritys_aux vip_map['reals_weights'] = reals_weight_aux vip_map['reals'] = reals_aux """ OLD CALLS - END """ # Check diff reals (reals_to_add, reals_to_rem, reals_to_stay) reals_to_add, reals_to_rem, reals_to_stay = diff_reals( variables_map, vip_map) reals_final = dict() reals_final['reals'] = list() reals_final['priorities'] = list() reals_final['weights'] = list() reals_error = list() removes = True error = False ############################################## # NOT MODIFIED - reals_to_stay # ############################################## for i in range(len(reals_to_stay['reals'])): real, priority, weight, id_ip, port_vip, port_real, new_call = get_variables( reals_to_stay, i, new_call) # Check ip type if is_valid_ipv4(real.get('real_ip')) is True: ip_type = IP_VERSION.IPv4[1] ip = Ip().get_by_pk(id_ip) else: ip_type = IP_VERSION.IPv6[1] ip = Ipv6().get_by_pk(id_ip) reals_final['reals'].append(reals_to_stay['reals'][i]) reals_final['priorities'].append( reals_to_stay['priorities'][i]) if reals_to_stay['weighted']: reals_final['weights'].append( reals_to_stay['weights'][i]) server_pool = ServerPool.objects.get( vipporttopool__port_vip=port_vip, vipporttopool__requisicao_vip=vip) if ip_type == IP_VERSION.IPv4[1]: server_pool_member = ServerPoolMember.objects.get( server_pool=server_pool, port_real=port_real, ip=id_ip) else: server_pool_member = ServerPoolMember.objects.get( server_pool=server_pool, port_real=port_real, ipv6=id_ip) server_pool_member.priority = priority server_pool_member.weight = weight server_pool_member.save(user, commit=True) ############################################# # ADD REALS - reals_to_add # ############################################# for i in range(len(reals_to_add['reals'])): real, priority, weight, id_ip, port_vip, port_real, new_call = get_variables( reals_to_add, i, new_call) if len(real.get('real_ip').split('.')) <= 1: ip_type = IP_VERSION.IPv6[1] ip = Ipv6().get_by_pk(id_ip) if new_call: command = VIP_REALS_v6_CREATE % ( vip.id, id_ip, port_real, port_vip) else: command = VIP_REAL_v6_CREATE % ( vip.id, real.get('real_name'), real.get('real_ip')) else: ip_type = IP_VERSION.IPv4[1] ip = Ip().get_by_pk(id_ip) if new_call: command = VIP_REALS_v4_CREATE % ( vip.id, id_ip, port_real, port_vip) else: command = VIP_REAL_v4_CREATE % ( vip.id, real.get('real_name'), real.get('real_ip')) self.log.info( '------------------- ADD ----------------------') self.log.info( 'Insert ServerPoolMember before execute script') add_reals_before_script(port_vip, vip, ip, ip_type, priority, weight, port_real, user) self.log.info('The insert has completed successfully') # if new_call or (i + 1) in execute_list: self.log.info('Execute script: %s' % command) code, stdout, stderr = exec_script(command) self.log.info('Script was executed and returned code %s' % code) if code != 0: removes = False error = True reals_error.append(real) self.log.info( 'Remove ServerPoolMember after execute script if code != 0' ) remove_reals_after_script(port_vip, ip_type, vip, port_real, priority, weight, id_ip, user) self.log.info('The remove has completed successfully') else: reals_final['reals'].append(real) reals_final['priorities'].append( reals_to_add['priorities'][i]) if reals_to_add['weighted']: reals_final['weights'].append( reals_to_add['weights'][i]) self.log.info( '----------------- ADD END --------------------') ########################################## # REMOVE REALS - reals_to_rem # ########################################## if removes: for i in range(len(reals_to_rem['reals'])): real, priority, weight, id_ip, port_vip, port_real, new_call = get_variables( reals_to_rem, i, new_call) if len(real.get('real_ip').split('.')) <= 1: ip_type = IP_VERSION.IPv6[1] if new_call: command = VIP_REALS_v6_REMOVE % ( vip.id, id_ip, port_real, port_vip) else: command = VIP_REAL_v6_REMOVE % ( vip.id, real.get('real_name'), real.get('real_ip')) else: ip_type = IP_VERSION.IPv4[1] if new_call: command = VIP_REALS_v4_REMOVE % ( vip.id, id_ip, port_real, port_vip) else: command = VIP_REAL_v4_REMOVE % ( vip.id, real.get('real_name'), real.get('real_ip')) self.log.info( '------------------ REMOVE --------------------') self.log.info('Execute script: %s' % command) code, stdout, stderr = exec_script(command) self.log.info( 'script was executed and returned code %s' % code) if code != 0: error = True reals_error.append(real) reals_final['reals'].append(real) reals_final['priorities'].append( reals_to_rem['priorities'][i]) if reals_to_rem['weighted']: reals_final['weights'].append( reals_to_rem['weights'][i]) else: self.log.info( 'Remove ServerPoolMember after execute script') remove_reals_after_script(port_vip, ip_type, vip, port_real, priority, weight, id_ip, user) self.log.info( 'The remove has completed successfully') self.log.info( '---------------- REMOVE END ------------------') else: for i in range(len(reals_to_rem['reals'])): real = reals_to_rem['reals'][i] reals_final['reals'].append(real) reals_final['priorities'].append( reals_to_rem['priorities'][i]) if reals_to_add['weighted']: reals_final['weights'].append( reals_to_rem['weights'][i]) variables_map['reals'] = dict() variables_map['reals_prioritys'] = dict() variables_map['reals_weights'] = dict() if len(reals_final['reals']) > 0: variables_map['reals']['real'] = reals_final['reals'] variables_map['reals_prioritys'][ 'reals_priority'] = reals_final['priorities'] if reals_final['weights'] is not None: variables_map['reals_weights'][ 'reals_weight'] = reals_final['weights'] else: variables_map.pop('reals') variables_map.pop('reals_prioritys') variables_map.pop('reals_weights') # set variables vip.set_variables(variables_map) try: # If Priority changed if int(alter_priority) != 0: # gerador_vips -i <ID_REQUISICAO> --priority command = 'gerador_vips -i %d --priority' % vip.id # Logging self.log.info( '---------------- ALTER PRIORITY ------------------' ) self.log.info('Command: ' + command) # Execute script code, stdout, stderr = exec_script(command) self.log.info('Code returned: ' + str(code)) self.log.info('Stdout: ' + stdout) self.log.info( '-------------- ALTER PRIORITY END ----------------' ) # Script returned error while executing, rollback the # changes in database if code != 0: self.log.info('Code != 0, rollback changes') vip_old.save(user, commit=True) for sp in server_pools_old: sp.save(user, commit=True) for spm in server_pools_members_old: spm.save(user, commit=True) return self.response_error(2, stdout + stderr) except Exception, e: if isinstance(e, IntegrityError): # Duplicate value for Port Vip, Port Real and IP self.log.error(u'Failed to update the request vip.') return self.response_error(353) else: self.log.error(u'Failed to update the request vip.') raise RequisicaoVipsError( e, u'Failed to update the request vip') if error: # build return message vip_list = '' ip_list = '' for real in reals_error: vip_list = vip_list + real['real_name'] + ', ' ip_list = ip_list + real['real_ip'] + ', ' return self.response_error(333, vip_list[:-2], ip_list[:-2]) else: return self.response(dumps_networkapi({})) except XMLError, x: self.log.error(u'Error reading the XML request.') return self.response_error(3, x)
def handle_post(self, request, user, *args, **kwargs): '''Handles POST requests to valid Real server. URL: vip/real/valid/ ''' self.log.info('Valid Real Server') try: # Business Validations # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error( 3, u'There is no value to the networkapi tag of XML request.' ) real_map = networkapi_map.get('real') if real_map is None: return self.response_error( 3, u'There is no value to the vip tag of XML request.') # Get XML data ip = real_map.get('ip') name = real_map.get('name_equipment') id_evip = real_map.get('id_environment_vip') valid = real_map.get('valid') # User permission if not has_perm(user, AdminPermission.VIPS_REQUEST, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Valid IP if not is_valid_ip_ipaddr(ip): self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) # Valid Name Equipment if not is_valid_string_minsize( name, 3) or not is_valid_string_maxsize( name, 80) or not is_valid_regex(name, "^[A-Z0-9-_]+$"): self.log.error( u'Parameter name_equipment is invalid. Value: %s', name) raise InvalidValueError(None, 'name_equipment', name) # Valid Environment Vip if not is_valid_int_greater_zero_param(id_evip): self.log.error( u'Parameter id_environment_vip is invalid. Value: %s.', id_evip) raise InvalidValueError(None, 'id_environment_vip', id_evip) # Valid Equipment equip = Equipamento.get_by_name(name) # Valid EnvironmentVip evip = EnvironmentVip.get_by_pk(id_evip) version = "" if is_valid_ipv4(ip): version = IP_VERSION.IPv4[1] elif is_valid_ipv6(ip): version = IP_VERSION.IPv6[1] ip, equip, evip = RequisicaoVips.valid_real_server( ip, equip, evip, valid) real_dict = {} ip_dict = model_to_dict(ip) ip_dict["version"] = version real_dict["ip"] = ip_dict real_dict["equipment"] = model_to_dict(equip) real_dict["environmentvip"] = model_to_dict(evip) return self.response(dumps_networkapi({'real': real_dict})) except XMLError, x: self.log.error(u'Error reading the XML request.') return self.response_error(3, x)
return code, vip # Valid maxcon if not is_valid_int_greater_equal_zero_param(vip_map.get('maxcon')): log.error( u'The maxcon parameter is not a valid value: %s.', vip_map.get('maxcon')) raise InvalidValueError(None, 'maxcon', vip_map.get('maxcon')) if vip_map.get("reals") is not None: for real in vip_map.get('reals').get('real'): ip_aux_error = real.get('real_ip') equip_aux_error = real.get('real_name') if equip_aux_error is not None: equip = Equipamento.get_by_name(equip_aux_error) else: raise InvalidValueError(None, 'real_name', 'None') RequisicaoVips.valid_real_server( ip_aux_error, equip, environment_vip) vip.create(user, vip_map) return 0, vip def update_vip_request(vip_id, vip_map, user): log = Log('update_vip_request') if not has_perm(user,