def handle_get(self, request, user, *args, **kwargs): """Handles GET requests to find all finalitys of environment VIP. URLs: /vip/get/finality """ self.log.info("Find all finality distinct of environment_vip") try: # Commons Validations # 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() evip = EnvironmentVip() # Business Validations evips = evip.list_all_finalitys() finality_map = dict() finality_list = [] for evip in evips: finality_map["finality"] = evip.get("finalidade_txt") finality_list.append(finality_map) finality_map = dict() return self.response(dumps_networkapi({"finalidade": finality_list})) 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 create_environment_vip(environment_vip): try: env = EnvironmentVip() env.create_v3(environment_vip) except Exception, e: raise NetworkAPIException(str(e))
def handle_post(self, request, user, *args, **kwargs): """Treat requests Post to search cliente_txt of Environment VIP by finalidade_txt URL: environmentvip/search/ """ try: self.log.info( 'Search cliente_txt Environment VIP by finalidade_txt') # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_VIP, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # 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.') environmentvip_map = networkapi_map.get('vip') if environmentvip_map is None: return self.response_error(3, u'There is no value to the vip tag of XML request.') # Get XML data finalidade = environmentvip_map.get('finalidade_txt') if not is_valid_string_maxsize(finalidade, 50) or not is_valid_string_minsize(finalidade, 3) or not is_valid_text(finalidade): self.log.error( u'The finalidade_txt parameter is not a valid value: %s.', finalidade) raise InvalidValueError(None, 'finalidade_txt', finalidade) environmentVip = EnvironmentVip() evip_values = environmentVip.list_all_clientes_by_finalitys( finalidade) evips = dict() evips_list = [] for evip in evip_values: evips['finalidade_txt'] = finalidade evips['cliente_txt'] = evip.get('cliente_txt') evips_list.append(evips) evips = dict() return self.response(dumps_networkapi({'cliente_txt': evips_list})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_get(self, request, user, *args, **kwargs): """Treat GET requests list all Environment VIP Availables. URL: environmentvip/search/id_vlan """ try: id_vlan = int(kwargs['id_vlan']) self.log.info("List all Environment VIP availables") # Commons Validations # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_VIP, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Business Rules evips = EnvironmentVip.objects.all() evip_list = EnvironmentVip.available_evips( EnvironmentVip(), evips, id_vlan) return self.response(dumps_networkapi({'environment_vip': evip_list})) except (EnvironmentVipError, GrupoError), e: self.log.error(e) return self.response_error(1)
def handle_delete(self, request, user, *args, **kwargs): """ Handles DELETE requests to create a relationship of Environment with EnvironmentVip. URL: environment/<environment_id>/environmentvip/<environment_vip_id>/ """ self.log.info("Remove a relationship of Environment with EnvironmentVip") try: # Commons Validations # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_MANAGEMENT, AdminPermission.WRITE_OPERATION): self.log.error(u"User does not have permission to perform the operation.") raise UserNotAuthorizedError(None) # Valid Environment environment_id = kwargs.get("environment_id") if not is_valid_int_greater_zero_param(environment_id): self.log.error(u"The environment_id parameter is not a valid value: %s.", environment_id) raise InvalidValueError(None, "environment_id", environment_id) # Valid EnvironmentVip ID environment_vip_id = kwargs.get("environment_vip_id") if not is_valid_int_greater_zero_param(environment_vip_id): self.log.error(u"The id_environment_vip parameter is not a valid value: %s.", environment_vip_id) raise InvalidValueError(None, "environment_vip_id", environment_vip_id) # Business Validations # Existing Environment ID environment = Ambiente.get_by_pk(environment_id) # Existing EnvironmentVip ID environment_vip = EnvironmentVip.get_by_pk(environment_vip_id) # Business Rules environment_environment_vip = EnvironmentEnvironmentVip().get_by_environment_environment_vip( environment.id, environment_vip.id ) server_pool_list = EnvironmentEnvironmentVip.get_server_pool_member_by_environment_environment_vip( environment_environment_vip ) # Valid integraty between environment/environmentvip related with reals # if exists reals fot this environment then raise a exception if server_pool_list: raise EnvironmentEnvironmentServerPoolLinked({"environment": environment.name}) # Delete environment_environment_vip.delete() # Return nothing return self.response(dumps_networkapi({})) except UserNotAuthorizedError: return self.not_authorized() except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_post(self, request, user, *args, **kwargs): """Treat requests POST to insert Environment VIP. URL: environmentvip/ """ try: self.log.info('Add Environment VIP') # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_VIP, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # 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.') environmentvip_map = networkapi_map.get('environment_vip') if environmentvip_map is None: return self.response_error(3, u'There is no value to the environment_vip tag of XML request.') # New Environment Vip environment_vip = EnvironmentVip() # Valid Environment Vip environment_vip.valid_environment_vip(environmentvip_map) try: # Save Environment Vip environment_vip.save() except Exception, e: self.log.error(u'Failed to save the environment vip.') raise EnvironmentVipError( e, u'Failed to save the environment vip') environment_map = dict() environment_map['id'] = environment_vip.id return self.response(dumps_networkapi({'environment_vip': environment_map}))
def handle_delete(self, request, user, *args, **kwargs): """ Handles DELETE requests to remove a relationship of OptionVip with EnvironmentVip. URL: optionvip/<id_option_vip>/environmentvip/<id_environment_vip>/ """ self.log.info("Remove a relationship of OptionVip with EnvironmentVip") try: # Commons Validations # User permission if not has_perm(user, AdminPermission.OPTION_VIP, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Valid OptionVip ID option_vip_id = kwargs.get('id_option_vip') if not is_valid_int_greater_zero_param(option_vip_id): self.log.error( u'The id_option_vip parameter is not a valid value: %s.', option_vip_id) raise InvalidValueError(None, 'id_option_vip', option_vip_id) # Valid EnvironmentVip ID environment_vip_id = kwargs.get('id_environment_vip') if not is_valid_int_greater_zero_param(environment_vip_id): self.log.error( u'The id_environment_vip parameter is not a valid value: %s.', environment_vip_id) raise InvalidValueError( None, 'id_environment_vip', environment_vip_id) # Business Validations # Existing OptionVip ID option_vip = OptionVip.get_by_pk(option_vip_id) # Existing EnvironmentVip ID environment_vip = EnvironmentVip.get_by_pk(environment_vip_id) # Business Rules # Find opt_vip_env_vip = OptionVipEnvironmentVip().get_by_option_environment( option_vip.id, environment_vip.id) # Delete opt_vip_env_vip.delete() # Return nothing return self.response(dumps_networkapi({})) except UserNotAuthorizedError: return self.not_authorized() except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_put(self, request, user, *args, **kwargs): """Treat requests PUT to change Environment VIP. URL: environmentvip/<id_environment_vip>/ """ try: self.log.info('Change Environment VIP') id_environment_vip = kwargs.get('id_environment_vip') # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_VIP, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # 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.') environmentvip_map = networkapi_map.get('environment_vip') if environmentvip_map is None: return self.response_error(3, u'There is no value to the environment_vip tag of XML request.') # Valid Environment VIP ID if not is_valid_int_greater_zero_param(id_environment_vip): self.log.error( u'The id_environment_vip parameter is not a valid value: %s.', id_environment_vip) raise InvalidValueError( None, 'id_environment_vip', id_environment_vip) # Find Environment VIP by ID to check if it exist environment_vip = EnvironmentVip.get_by_pk(id_environment_vip) with distributedlock(LOCK_ENVIRONMENT_VIP % id_environment_vip): # Valid Environment Vip environment_vip.valid_environment_vip(environmentvip_map) try: # Update Environment Vip environment_vip.save() except Exception, e: self.log.error(u'Failed to update the environment vip.') raise EnvironmentVipError( e, u'Failed to update the environment vip') return self.response(dumps_networkapi({})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_get(self, request, user, *args, **kwargs): """Treat requests GET to list all the VIPs related to Environment VIP. URL: environmentvip/<id_environment_vip>/vip/all' """ try: self.log.info( "GET to list all the VIPs related to Environment VIP") # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_VIP, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Get data id_environment_vip = kwargs.get('id_environment_vip') # Valid Environment VIP ID if not is_valid_int_greater_zero_param(id_environment_vip): self.log.error( u'The id_environment_vip parameter is not a valid value: %s.', id_environment_vip) raise InvalidValueError( None, 'id_environment_vip', id_environment_vip) # Find Environment VIP by ID to check if it exist environment_vip = EnvironmentVip.get_by_pk(id_environment_vip) # Find Request VIP - IPv4 by ID Environment vips_ipv4 = RequisicaoVips.objects.filter( ip__networkipv4__ambient_vip__id=environment_vip.id) # Find Request VIP - IPv6 by ID Environment vips_ipv6 = RequisicaoVips.objects.filter( ipv6__networkipv6__ambient_vip__id=environment_vip.id) vips = {} for vips_ip in [vips_ipv4, vips_ipv6]: for vip in vips_ip: v = {} v = vip.variables_to_map() v['id'] = vip.id v['validado'] = vip.validado v['vip_criado'] = vip.vip_criado v['id_ip'] = vip.ip_id v['id_ipv6'] = vip.ipv6_id v['id_healthcheck_expect'] = vip.healthcheck_expect_id vips['vip_%s' % (vip.id)] = v return self.response(dumps_networkapi(vips)) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def validate(self, attrs): """ Check the Environment Vip is valid. """ try: finalidade = attrs.get("finalidade") cliente = attrs.get("cliente") ambiente = attrs.get("ambiente") EnvironmentVip.get_by_values(finalidade, cliente, ambiente) ip_to_vip = attrs.get("ip") or attrs.get("ipv6") if not ip_to_vip: raise serializers.ValidationError("Is required to enter any Ip") except EnvironmentVipNotFoundError, exception: raise serializers.ValidationError(exception.message)
def handle_get(self, request, user, *args, **kwargs): """Treat requests GET to list all the Environment by Environment Vip. URL: environment/environmentvip/<environment_vip_id>' """ try: self.log.info( 'GET to list all the Environment by Environment Vip.') # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_MANAGEMENT, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) environment_vip_id = kwargs.get('environment_vip_id') # Valid Environment VIP ID if not is_valid_int_greater_zero_param(environment_vip_id): self.log.error( u'The id_environment_vip parameter is not a valid value: %s.', environment_vip_id) raise InvalidValueError( None, 'environment_vip_id', environment_vip_id) # Find Environment VIP by ID to check if it exist environment_vip = EnvironmentVip.get_by_pk(environment_vip_id) environment_related_list = [] for env_env_vip in environment_vip.environmentenvironmentvip_set.all(): environment_map = {} environment_map['environment_id'] = env_env_vip.environment.id environment_map[ 'environment_vip_id'] = env_env_vip.environment_vip.id environment_map[ 'environment'] = env_env_vip.environment.grupo_l3.nome environment_map[ 'ambiente_logico_name'] = env_env_vip.environment.ambiente_logico.nome environment_map[ 'divisao_dc_name'] = env_env_vip.environment.divisao_dc.nome environment_related_list.append(environment_map) return self.response(dumps_networkapi({'environment_related_list': environment_related_list})) except UserNotAuthorizedError: return self.not_authorized() except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_delete(self, request, user, *args, **kwargs): """Treat requests PUT to delete Environment VIP. URL: environmentvip/<id_environment_vip>/ """ try: self.log.info('Delete Environment VIP') id_environment_vip = kwargs.get('id_environment_vip') # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_VIP, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Valid Environment VIP ID if not is_valid_int_greater_zero_param(id_environment_vip): self.log.error( u'The id_environment_vip parameter is not a valid value: %s.', id_environment_vip) raise InvalidValueError( None, 'id_environment_vip', id_environment_vip) # Find Environment VIP by ID to check if it exist environment_vip = EnvironmentVip.get_by_pk(id_environment_vip) with distributedlock(LOCK_ENVIRONMENT_VIP % id_environment_vip): # Find networkIPv4 by Environment VIP to check if is greater # than zero if len(NetworkIPv4.objects.filter(ambient_vip=environment_vip.id)) > 0: return self.response_error(284) # Find networkIPv6 by Environment VIP to check if is greater # than zero if len(NetworkIPv6.objects.filter(ambient_vip=environment_vip.id)) > 0: return self.response_error(285) try: # Delete Environment Vip environment_vip.delete() except Exception, e: self.log.error(u'Failed to delete the environment vip.') raise EnvironmentVipError( e, u'Failed to delete the environment vip') return self.response(dumps_networkapi({})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_get(self, request, user, *args, **kwargs): """Treat requests GET to list all traffic return of the Option VIP by Environment Vip. URL: environment-vip/get/trafficreturn/<id_evip> """ try: self.log.info("GET to list all the Option VIP by Environment Vip - traffic return.") # User permission if not has_perm(user, AdminPermission.OPTION_VIP, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) id_environment_vip = kwargs.get('id_evip') # Valid Environment VIP ID if not is_valid_int_greater_zero_param(id_environment_vip): self.log.error( u'The id_environment_vip parameter is not a valid value: %s.', id_environment_vip) raise InvalidValueError( None, 'id_environment_vip', id_environment_vip) # Find Environment VIP by ID to check if it exist environment_vip = EnvironmentVip.get_by_pk(id_environment_vip) #self.log.info(str(environment_vip)) ovips = OptionVip.get_all_trafficreturn(environment_vip.id) #self.log.info(str(ovips)) ovip_dict = dict() ovip_list = [] for ovip in ovips: ovip_dict['trafficreturn_opt'] = ovip.nome_opcao_txt ovip_list.append(ovip_dict) ovip_dict = dict() self.log.info(str(ovip_list)) return self.response(dumps_networkapi({'trafficreturn_opt': ovip_list})) except UserNotAuthorizedError: return self.not_authorized() except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def validate(self, attrs): """ Check the Environment Vip is valid. """ try: finalidade = attrs.get('finalidade') cliente = attrs.get('cliente') ambiente = attrs.get('ambiente') EnvironmentVip.get_by_values( finalidade, cliente, ambiente ) ip_to_vip = attrs.get('ip') or attrs.get('ipv6') if not ip_to_vip: raise serializers.ValidationError('Is required to enter any Ip') except EnvironmentVipNotFoundError, exception: raise serializers.ValidationError(exception.message)
def server_pool_ips_can_associate_with_vip_request(vip_request, vip_port_to_pool_to_remove=[]): try: environment_vip = EnvironmentVip.get_by_values(vip_request.finalidade, vip_request.cliente, vip_request.ambiente) server_pool_list_add_list = _get_server_pool_list(vip_request) server_pool_list_remove_list = _get_server_pool_list_by_vip_port_to_pool(vip_port_to_pool_to_remove) for server_pool in server_pool_list_add_list: if server_pool not in server_pool_list_remove_list: server_pool_member_list = server_pool.serverpoolmember_set.all() _reals_can_associate_server_pool_by_environment_vip_on_request_vip(server_pool, server_pool_member_list, environment_vip) except Exception, error: log.error(error) raise error
def handle_get(self, request, user, *args, **kwargs): """Treat requests GET to list all the Option VIP by Environment Vip. URL: optionvip/environmentvip/<id_environment_vip>' """ try: self.log.info("GET to list all the Option VIP by Environment Vip.") # User permission if not has_perm(user, AdminPermission.OPTION_VIP, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) id_environment_vip = kwargs.get('id_environment_vip') # Valid Environment VIP ID if not is_valid_int_greater_zero_param(id_environment_vip): self.log.error( u'The id_environment_vip parameter is not a valid value: %s.', id_environment_vip) raise InvalidValueError( None, 'id_environment_vip', id_environment_vip) # Find Environment VIP by ID to check if it exist environment_vip = EnvironmentVip.get_by_pk(id_environment_vip) ovips = [] for env in environment_vip.optionvipenvironmentvip_set.all(): ovips.append(model_to_dict(env.option)) return self.response(dumps_networkapi({'option_vip': ovips})) except UserNotAuthorizedError: return self.not_authorized() except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def get_environmentvip_by_id(environment_vip_id): try: environmentvip = EnvironmentVip.get_by_pk(environment_vip_id) except EnvironmentVipNotFoundError, e: raise ObjectDoesNotExistException(str(e))
def handle_post(self, request, user, *args, **kwargs): """Handles GET requests get an IP6 available for vip_request by evip_id. URL: ip/availableip6/vip/id_evip """ self.log.info('Get an IP6 available for vip_request') try: # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') ip_map = networkapi_map.get('ip_map') # Get XML data id_evip = ip_map.get('id_evip') name = ip_map.get('name') 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) # Business Rules evip = EnvironmentVip.get_by_pk(id_evip) with distributedlock(LOCK_GET_IPV6_AVAILABLE % id_evip): ipv6 = Ipv6() len_network = len(evip.networkipv6_set.all()) if len_network <= 0: raise NetworkNotInEvip( None, 'Não há rede no ambiente vip fornecido') raise_not_found_balanceamento = False cont_network = 0 cont_balanceador_not_found = 0 for net in evip.networkipv6_set.all(): balanceador_found_flag = False cont_network = cont_network + 1 list_ips_equips = list() try: ip_available = ipv6.get_available_ip6(net.id) ip_new = Ipv6() ip_available = ip_available.split(':') ip_new.block1 = ip_available[0] ip_new.block2 = ip_available[1] ip_new.block3 = ip_available[2] ip_new.block4 = ip_available[3] ip_new.block5 = ip_available[4] ip_new.block6 = ip_available[5] ip_new.block7 = ip_available[6] ip_new.block8 = ip_available[7] ip_new.description = name for env_equipment in net.vlan.ambiente.equipamentoambiente_set.all(): equipment = env_equipment.equipamento if equipment.tipo_equipamento == TipoEquipamento.get_tipo_balanceador(): if equipment.id not in list_ips_equips: list_ips_equips.append(equipment.id) if ip_new.id is None: ip_new.save_ipv6( equipment.id, user, net) else: new_ip_equip = Ipv6Equipament() new_ip_equip.ip = ip_new new_ip_equip.equipamento = equipment new_ip_equip.save() balanceador_found_flag = True if not balanceador_found_flag: cont_balanceador_not_found = cont_balanceador_not_found + \ 1 else: break if cont_balanceador_not_found == len_network: raise_not_found_balanceamento = True raise IpNotAvailableError(None, 'Não há ipv6 disponivel para as redes associadas com o ' 'Ambiente Vip: %s - %s - %s, pois não existe equipamentos ' 'do Tipo Balanceador nessas redes.' % (evip.finalidade_txt, evip.cliente_txt, evip.ambiente_p44_txt)) except (IpNotAvailableError, IpRangeAlreadyAssociation), e: cont_balanceador_not_found = cont_balanceador_not_found + 1 if raise_not_found_balanceamento: raise IpNotAvailableError(None, e.message) elif len_network == cont_network: raise IpNotAvailableError(None, 'Não há ipv6 disponivel para as redes associdas com o ' 'Ambiente Vip: %s - %s - %s' % (evip.finalidade_txt, evip.cliente_txt, evip.ambiente_p44_txt)) transaction.commit() return self.response(dumps_networkapi({'ip': model_to_dict(ip_new)})) except NetworkNotInEvip, e: return self.response_error(321, 'ipv6')
def handle_post(self, request, user, *args, **kwargs): '''Handles GET requests get an IP4 available for vip_request by evip_id. URL: ip/availableip6/vip/id_evip/ ''' self.log.info('Get an IP4 available for vip_request') try: # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') ip_map = networkapi_map.get('ip_map') # Get XML data id_evip = ip_map.get('id_evip') name = ip_map.get('name') 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) # Business Rules evip = EnvironmentVip.get_by_pk(id_evip) ipv4 = Ip() len_network = len(evip.networkipv4_set.all()) raise_not_found_balanceamento = False if (len_network <= 0): raise NetworkNotInEvip( None, 'Não há rede no ambiente vip fornecido') cont_network = 0 cont_balanceador_not_found = 0 for net in evip.networkipv4_set.all(): balanceador_found_flag = False cont_network = cont_network + 1 list_ips_equips = list() try: ip_available = ipv4.get_available_ip(net.id) ip_new = Ip() ip_available = ip_available.exploded ip_available = ip_available.split(".") ip_new.oct1 = ip_available[0] ip_new.oct2 = ip_available[1] ip_new.oct3 = ip_available[2] ip_new.oct4 = ip_available[3] ip_new.descricao = name for env_equipment in net.vlan.ambiente.equipamentoambiente_set.all(): equipment = env_equipment.equipamento if equipment.tipo_equipamento == TipoEquipamento.get_tipo_balanceador(): if equipment.id not in list_ips_equips: list_ips_equips.append(equipment.id) if ip_new.id is None: ip_new.save_ipv4(equipment.id, user, net) else: new_ip_equip = IpEquipamento() new_ip_equip.ip = ip_new new_ip_equip.equipamento = equipment new_ip_equip.save(user) balanceador_found_flag = True if not balanceador_found_flag: cont_balanceador_not_found = cont_balanceador_not_found + \ 1 else: break if cont_balanceador_not_found == len_network: raise_not_found_balanceamento = True raise IpNotAvailableError(None, "Não há ipv4 disponivel para as redes associdas com o Ambiente Vip: %s - %s - %s, pois não existe equipamentos do Tipo Balanceador nessas redes." % ( evip.finalidade_txt, evip.cliente_txt, evip.ambiente_p44_txt)) except (IpNotAvailableError, IpRangeAlreadyAssociation), e: cont_balanceador_not_found = cont_balanceador_not_found + 1 if raise_not_found_balanceamento: raise IpNotAvailableError(None, e.message) elif len_network == cont_network: raise IpNotAvailableError(None, "Não há ipv4 disponivel para as redes associdas com o Ambiente Vip: %s - %s - %s" % ( evip.finalidade_txt, evip.cliente_txt, evip.ambiente_p44_txt)) return self.response(dumps_networkapi({"ip": model_to_dict(ip_new)}))
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 __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_post(self, request, user, *args, **kwargs): '''Handles POST requests to check an IPv4 or Ipv6 for vip request. URL: ip/checkvipip/ ''' self.log.info('Check a Ipv4 or Ipv6 for Vip') 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: 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 ip = ip_map.get('ip') id_evip = ip_map.get('id_evip') # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Valid ip id if ip is None: self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) # Valid evip id if not is_valid_int_greater_zero_param(id_evip): raise InvalidValueError(None, 'id_evip', id_evip) # Business Rules evip = EnvironmentVip.get_by_pk(id_evip) ip_list = ip.split(".") if len(ip_list) == 1: if not is_valid_ipv6(ip): self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) if len(evip.networkipv6_set.all()) <= 0: raise NetworkNotInEvip( 'IPv6', 'Não há rede no ambiente vip fornecido') ip_list = ip.split(":") ip_checked = Ipv6.get_by_octs_and_environment_vip( ip_list[0], ip_list[1], ip_list[2], ip_list[3], ip_list[4], ip_list[5], ip_list[6], ip_list[7], id_evip) ip_ok = False for ip_equip in ip_checked.ipv6equipament_set.all(): if ip_equip.equipamento.tipo_equipamento == TipoEquipamento.get_tipo_balanceador( ): ip_ok = True break if not ip_ok: raise IpNotAvailableError( None, "Ipv6 indisponível para o Ambiente Vip: %s, pois não existe equipamento do Tipo Balanceador relacionado a este Ip." % evip.show_environment_vip()) else: if not is_valid_ipv4(ip): self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) if len(evip.networkipv4_set.all()) <= 0: raise NetworkNotInEvip( 'IPv4', 'Não há rede no ambiente vip fornecido') ip_checked = Ip.get_by_octs_and_environment_vip( ip_list[0], ip_list[1], ip_list[2], ip_list[3], id_evip) ip_ok = False for ip_equip in ip_checked.ipequipamento_set.all(): if ip_equip.equipamento.tipo_equipamento == TipoEquipamento.get_tipo_balanceador( ): ip_ok = True break if not ip_ok: raise IpNotAvailableError( None, "Ipv4 indisponível para o Ambiente Vip: %s, pois não existe equipamento do Tipo Balanceador relacionado a este Ip." % evip.show_environment_vip()) ip_dict = model_to_dict(ip_checked) return self.response(dumps_networkapi({'ip': ip_dict})) except NetworkNotInEvip, e: return self.response_error(321, e.cause)
def administrate_real(self, user, vip_id, equip_id, ip_id, operation, network_version, port_vip=None, port_real=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 Equipament ID if not is_valid_int_greater_zero_param(equip_id): self.log.error(u'The equip_id parameter is not a valid value: %s.', equip_id) raise InvalidValueError(None, 'equip_id', equip_id) # Valid IP ID if not is_valid_int_greater_zero_param(ip_id): self.log.error(u'The ip_id parameter is not a valid value: %s.', ip_id) raise InvalidValueError(None, 'ip_id', ip_id) # Valid operation if operation not in ['add', 'del', 'ena', 'dis', 'chk']: self.log.error( u'The operation parameter is not a valid value: %s.', operation) raise InvalidValueError(None, 'operation', operation) # Valid network version if network_version not in ['v4', 'v6']: self.log.error( u'The network_version parameter is not a valid value: %s.', network_version) raise InvalidValueError(None, 'network_version', network_version) # User permission if (operation == 'chk'): if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) else: if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.WRITE_OPERATION, None, equip_id, AdminPermission.EQUIP_UPDATE_CONFIG_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # new_call = True - New calls for Add/Del/Enable/Disable/Check with new params (Port Vip and Port Real) # new_call = False = Old calls for compatibility new_call = False if port_vip is not None and port_real is not None: # Valid ports if not is_valid_int_greater_zero_param(port_vip): self.log.error( u'The port_vip parameter is not a valid value: %s.', port_vip) raise InvalidValueError(None, 'port_vip', port_vip) if not is_valid_int_greater_zero_param(port_real): self.log.error( u'The port_vip parameter is not a valid value: %s.', port_real) raise InvalidValueError(None, 'port_real', port_real) new_call = True # Find Request VIP by ID to check if it exist vip = RequisicaoVips.get_by_pk(vip_id) # 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 network_version - IPv4 if network_version == IP_VERSION.IPv4[0]: # Find IpEquipamento to check if it exist IpEquip = IpEquipamento().get_by_ip_equipment(ip_id, equip_id) real_name = IpEquip.equipamento.nome end_ip = '%s.%s.%s.%s' % (IpEquip.ip.oct1, IpEquip.ip.oct2, IpEquip.ip.oct3, IpEquip.ip.oct4) # Valid Real RequisicaoVips.valid_real_server(end_ip, IpEquip.equipamento, evip, False) # Valid network_version - IPv6 elif network_version == IP_VERSION.IPv6[0]: # Find Ipv6Equipament to check if it exist Ipv6Equip = Ipv6Equipament().get_by_ip_equipment(ip_id, equip_id) real_name = Ipv6Equip.equipamento.nome end_ip = '%s:%s:%s:%s:%s:%s:%s:%s' % ( Ipv6Equip.ip.block1, Ipv6Equip.ip.block2, Ipv6Equip.ip.block3, Ipv6Equip.ip.block4, Ipv6Equip.ip.block5, Ipv6Equip.ip.block6, Ipv6Equip.ip.block7, Ipv6Equip.ip.block8) # Valid Real RequisicaoVips.valid_real_server(end_ip, Ipv6Equip.equipamento, evip, False) if (operation == 'chk'): if IP_VERSION.IPv4[0] == network_version: if new_call: command = VIP_REALS_v4_CHECK % (vip_id, ip_id, port_real, port_vip) else: command = VIP_REAL_v4_CHECK % (vip_id, real_name, end_ip) else: if new_call: command = VIP_REALS_v6_CHECK % (vip_id, ip_id, port_real, port_vip) else: command = VIP_REAL_v6_CHECK % (vip_id, real_name, end_ip) else: with distributedlock(LOCK_VIP_IP_EQUIP % (vip_id, ip_id, equip_id)): if (operation == 'add'): if IP_VERSION.IPv4[0] == network_version: if new_call: command = VIP_REALS_v4_CREATE % ( vip_id, ip_id, port_real, port_vip) ServerPoolMember().save_specified_port( vip_id, port_vip, IpEquip.ip, IP_VERSION.IPv4[1], port_real, user) else: command = VIP_REAL_v4_CREATE % (vip_id, real_name, end_ip) ServerPoolMember().save_with_default_port( vip_id, IpEquip.ip, IP_VERSION.IPv4[1], user) else: if new_call: command = VIP_REALS_v6_CREATE % ( vip_id, ip_id, port_real, port_vip) ServerPoolMember().save_specified_port( vip_id, port_vip, Ipv6Equip.ip, IP_VERSION.IPv6[1], port_real, user) else: command = VIP_REAL_v6_CREATE % (vip_id, real_name, end_ip) ServerPoolMember().save_with_default_port( vip_id, Ipv6Equip.ip, IP_VERSION.IPv6[1], user) elif (operation == 'del'): if IP_VERSION.IPv4[0] == network_version: if new_call: command = VIP_REALS_v4_REMOVE % ( vip_id, ip_id, port_real, port_vip) pool_members = ServerPoolMember.objects.filter( ip=ip_id, server_pool__vipporttopool__requisicao_vip__id= vip_id, server_pool__vipporttopool__port_vip=port_vip, port_real=port_real) [ pool_member.delete() for pool_member in pool_members ] else: command = VIP_REAL_v4_REMOVE % (vip_id, real_name, end_ip) pool_members = ServerPoolMember.objects.filter( ip=ip_id, server_pool__vipporttopool__requisicao_vip__id= vip_id) [ pool_member.delete() for pool_member in pool_members ] else: if new_call: command = VIP_REALS_v6_REMOVE % ( vip_id, ip_id, port_real, port_vip) pool_members = ServerPoolMember.objects.filter( ipv6=ip_id, server_pool__vipporttopool__requisicao_vip__id= vip_id, server_pool__vipporttopool__port_vip=port_vip, port_real=port_real) [ pool_member.delete() for pool_member in pool_members ] else: command = VIP_REAL_v6_REMOVE % (vip_id, real_name, end_ip) pool_members = ServerPoolMember.objects.filter( ipv6=ip_id, server_pool__vipporttopool__requisicao_vip__id= vip_id) [ pool_member.delete() for pool_member in pool_members ] elif (operation == 'ena'): if IP_VERSION.IPv4[0] == network_version: if new_call: command = VIP_REALS_v4_ENABLE % ( vip_id, ip_id, port_real, port_vip) else: command = VIP_REAL_v4_ENABLE % (vip_id, real_name, end_ip) else: if new_call: command = VIP_REALS_v6_ENABLE % ( vip_id, ip_id, port_real, port_vip) else: command = VIP_REAL_v6_ENABLE % (vip_id, real_name, end_ip) elif (operation == 'dis'): if IP_VERSION.IPv4[0] == network_version: if new_call: command = VIP_REALS_v4_DISABLE % ( vip_id, ip_id, port_real, port_vip) else: command = VIP_REAL_v4_DISABLE % (vip_id, real_name, end_ip) else: if new_call: command = VIP_REALS_v6_DISABLE % ( vip_id, ip_id, port_real, port_vip) else: command = VIP_REAL_v6_DISABLE % (vip_id, real_name, end_ip) self.log.info(command) # Execute script code, stdout, stderr = exec_script(command) self.log.info(stdout) map = dict() success_map = dict() # Return XML if code == 0: success_map['codigo'] = '%04d' % code success_map['descricao'] = {'stdout': stdout, 'stderr': stderr} map['sucesso'] = success_map return self.response(dumps_networkapi(map)) elif code == 12: success_map['codigo'] = '0' success_map['descricao'] = {'stdout': '0', 'stderr': ''} map['sucesso'] = success_map self.rollback_changes(operation, new_call, network_version, vip_id, ip_id, port_real, port_vip, real_name, end_ip, user) return self.response(dumps_networkapi(map)) else: self.rollback_changes(operation, new_call, network_version, vip_id, ip_id, port_real, port_vip, real_name, end_ip, user) return self.response_error(2, stdout + stderr)
def handle_post(self, request, user, *args, **kwargs): """Treat POST requests to add new Network URL: network/add/ """ try: if not has_perm(user, AdminPermission.VLAN_MANAGEMENT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() xml_map, attrs_map = loads(request.raw_post_data) 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) network_map = networkapi_map.get('network') if network_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 network = network_map.get('network') id_vlan = network_map.get('id_vlan') network_type = network_map.get('id_network_type') environment_vip = network_map.get('id_environment_vip') cluster_unit = network_map.get('cluster_unit') try: net = IPNetwork(network) except ValueError: raise InvalidValueError(None, 'network', network) # Valid vlan ID if not is_valid_int_greater_zero_param(id_vlan): raise InvalidValueError(None, 'id_vlan', id_vlan) if not is_valid_int_greater_zero_param(network_type): raise InvalidValueError(None, 'id_network_type', network_type) vlan = Vlan().get_by_pk(id_vlan) net_type = TipoRede.get_by_pk(network_type) if environment_vip is not None: if not is_valid_int_greater_zero_param(environment_vip): raise InvalidValueError(None, 'id_environment_vip', environment_vip) evips = EnvironmentVip.objects.all() evip_list = EnvironmentVip.available_evips(EnvironmentVip(), evips, int(id_vlan)) # Check if the chose environment is in the same environment if any(int(environment_vip) == item['id'] for item in evip_list): # Find Environment VIP by ID to check if it exist env_vip = EnvironmentVip.get_by_pk(environment_vip) else: raise InvalidValueError(None, 'id_environment_vip', environment_vip) else: env_vip = None # Check unchecked exception blocks, network, version = break_network(network) expl = split(net.network.exploded, '.' if version == IP_VERSION.IPv4[0] else ':') expl.append(str(net.prefixlen)) if blocks != expl: raise InvalidValueError(None, 'rede', network) if version == IP_VERSION.IPv4[0]: # Find all networks related to environment nets = NetworkIPv4.objects.filter(vlan__ambiente__id=vlan.ambiente.id) # Cast to API class networks = set([IPv4Network('%d.%d.%d.%d/%d' % (net_ip.oct1, net_ip.oct2, net_ip.oct3, net_ip.oct4, net_ip.block)) for net_ip in nets]) # If network selected not in use for network_aux in networks: if net in network_aux or network_aux in net: self.log.debug('Network %s cannot be allocated. It conflicts with %s already ' 'in use in this environment.' % (net, network)) raise NetworkIPv4AddressNotAvailableError( None, u'Network cannot be allocated. %s already in use in this environment.' % network_aux) if env_vip is not None: # Find all networks related to environment vip nets = NetworkIPv4.objects.filter( ambient_vip__id=env_vip.id) # Cast to API class networks = set([IPv4Network('%d.%d.%d.%d/%d' % (net_ip.oct1, net_ip.oct2, net_ip.oct3, net_ip.oct4, net_ip.block)) for net_ip in nets]) # If there is already a network with the same range ip as # related the environment vip for network_aux in networks: if net in network_aux or network_aux in net: self.log.debug('Network %s cannot be allocated. It conflicts with %s already in use ' 'in this environment VIP.' % (net, network)) raise NetworkIPv4AddressNotAvailableError(None, u'Network cannot be allocated. %s already in use ' u'in this environment VIP.' % network_aux) # Check if the new network is in the range of the Environment Network try: vlan = Vlan().get_by_pk(id_vlan) vlan_env_id = vlan.ambiente try: config_env = ConfigEnvironment() environment_conf = config_env.get_by_environment(vlan_env_id) if environment_conf: is_valid_net = False for env_config in environment_conf: ipconfig = env_config.ip_config subnet = ipconfig.subnet env_net = IPNetwork(subnet) if net in env_net: self.log.debug('Network "%s" can be allocated because is in the ' 'environment network(%s) subnets.' % (net, subnet)) is_valid_net = True break raise NetworkSubnetRange(None, 'A rede a ser cadastrada (%s) não pertence às ' 'subredes do ambiente.' % net) if not is_valid_net else None else: raise NetworkEnvironmentError(None, 'O ambiente não está configurado. ') except NetworkSubnetRange: self.log.error('Network "%s" can not be allocated because is not in the ' 'environment network(%s) subnets.' % (net, subnet)) return self.response_error(414) except NetworkEnvironmentError: self.log.error('The environment does not have a configuration') return self.response_error(415) except Exception as ERROR: self.log.error(ERROR) # # Filter case 1 - Adding new network with same ip range to another network on other environment ## # Get environments with networks with the same ip range nets = NetworkIPv4.objects.filter(oct1=expl[0], oct2=expl[1], oct3=expl[2], oct4=expl[3], block=expl[4]) env_ids = list() for net_ip in nets: env_ids.append(net_ip.vlan.ambiente.id) # If other network with same ip range exists if len(env_ids) > 0: # Get equipments related to this network's environment env_equips = EquipamentoAmbiente.objects.filter(ambiente=vlan.ambiente.id) # Verify equipments related with all other environments # that contains networks with same ip range for env_id in env_ids: # Equipments related to other environments other_env_equips = EquipamentoAmbiente.objects.filter(ambiente=env_id) # Adjust to equipments equip_list = list() for equip_env in other_env_equips: equip_list.append(equip_env.equipamento.id) for env_equip in env_equips: if env_equip.equipamento.id in equip_list: # Filter testing if other_env_equips[0].ambiente.filter is None or vlan.ambiente.filter is None: raise NetworkIPRangeEnvError(None, u'Um dos equipamentos associados com o ambiente ' u'desta rede também está associado com outro ambiente ' u'que tem uma rede com essa mesma faixa, adicione ' u'filtros nos ambientes se necessário.') else: # Test both environment's filters tp_equip_list_one = list() for fet in FilterEquipType.objects.filter(filter=vlan.ambiente.filter.id): tp_equip_list_one.append(fet.equiptype) tp_equip_list_two = list() for fet in FilterEquipType.objects.filter( filter=other_env_equips[0].ambiente.filter.id): tp_equip_list_two.append(fet.equiptype) if env_equip.equipamento.tipo_equipamento not in tp_equip_list_one or \ env_equip.equipamento.tipo_equipamento not in tp_equip_list_two: raise NetworkIPRangeEnvError(None, u'Um dos equipamentos associados com o ' u'ambiente desta rede também está associado ' u'com outro ambiente que tem uma rede com ' u'essa mesma faixa, adicione filtros nos ' u'ambientes se necessário.') # # Filter case 1 - end ## # New NetworkIPv4 network_ip = NetworkIPv4() network_ip.oct1, network_ip.oct2, network_ip.oct3, network_ip.oct4 = str(net.network).split('.') network_ip.block = net.prefixlen network_ip.mask_oct1, network_ip.mask_oct2, network_ip.mask_oct3, network_ip.mask_oct4 = \ str(net.netmask).split('.') network_ip.broadcast = net.broadcast.compressed else: # Find all networks ralated to environment nets = NetworkIPv6.objects.filter(vlan__ambiente__id=vlan.ambiente.id) networks = set([IPv6Network('%s:%s:%s:%s:%s:%s:%s:%s/%d' % (net_ip.block1, net_ip.block2, net_ip.block3, net_ip.block4, net_ip.block5, net_ip.block6, net_ip.block7, net_ip.block8, net_ip.block)) for net_ip in nets]) # If network selected not in use for network_aux in networks: if net in network_aux or network_aux in net: self.log.debug('Network %s cannot be allocated. It conflicts with %s already in use ' 'in this environment.' % (net, network)) raise NetworkIPv4AddressNotAvailableError(None, u'Network cannot be allocated. %s already in ' u'use in this environment.' % network_aux) if env_vip is not None: # Find all networks related to environment vip nets = NetworkIPv6.objects.filter( ambient_vip__id=env_vip.id) networks = set([IPv6Network('%s:%s:%s:%s:%s:%s:%s:%s/%d' % (net_ip.block1, net_ip.block2, net_ip.block3, net_ip.block4, net_ip.block5, net_ip.block6, net_ip.block7, net_ip.block8, net_ip.block)) for net_ip in nets]) # If there is already a network with the same range ip as # related the environment vip for network_aux in networks: if net in network_aux or network_aux in net: self.log.debug('Network %s cannot be allocated. It conflicts with %s already in ' 'use in this environment VIP.' % (net, network)) raise NetworkIPv4AddressNotAvailableError(None, u'Network cannot be allocated. %s ' u'already in use in this environment ' u'VIP.' % network_aux) # # Filter case 1 - Adding new network with same ip range to another network on other environment ## # Get environments with networks with the same ip range nets = NetworkIPv6.objects.filter(block1=expl[0], block2=expl[1], block3=expl[2], block4=expl[3], block5=expl[4], block6=expl[5], block7=expl[6], block8=expl[7], block=expl[8]) env_ids = list() for net_ip in nets: env_ids.append(net_ip.vlan.ambiente.id) # If other network with same ip range exists if len(env_ids) > 0: # Get equipments related to this network's environment env_equips = EquipamentoAmbiente.objects.filter(ambiente=vlan.ambiente.id) # Verify equipments related with all other environments # that contains networks with same ip range for env_id in env_ids: # Equipments related to other environments other_env_equips = EquipamentoAmbiente.objects.filter(ambiente=env_id) # Adjust to equipments equip_list = list() for equip_env in other_env_equips: equip_list.append(equip_env.equipamento.id) for env_equip in env_equips: if env_equip.equipamento.id in equip_list: # Filter testing if other_env_equips[0].ambiente.filter is None or vlan.ambiente.filter is None: raise NetworkIPRangeEnvError(None, u'Um dos equipamentos associados com o ' u'ambiente desta rede também está associado ' u'com outro ambiente que tem uma rede com ' u'essa mesma faixa, adicione filtros nos ' u'ambientes se necessário.') else: # Test both environment's filters tp_equip_list_one = list() for fet in FilterEquipType.objects.filter(filter=vlan.ambiente.filter.id): tp_equip_list_one.append(fet.equiptype) tp_equip_list_two = list() for fet in FilterEquipType.objects.filter( filter=other_env_equips[0].ambiente.filter.id): tp_equip_list_two.append(fet.equiptype) if env_equip.equipamento.tipo_equipamento not in tp_equip_list_one or \ env_equip.equipamento.tipo_equipamento not in tp_equip_list_two: raise NetworkIPRangeEnvError(None, u'Um dos equipamentos associados com o ' u'ambiente desta rede também está ' u'associado com outro ambiente que tem ' u'uma rede com essa mesma faixa, adicione ' u'filtros nos ambientes se necessário.') # # Filter case 1 - end ## # New NetworkIPv6 network_ip = NetworkIPv6() network_ip.block1, network_ip.block2, network_ip.block3, network_ip.block4, network_ip.block5, \ network_ip.block6, network_ip.block7, network_ip.block8 = str(net.network.exploded).split(':') network_ip.block = net.prefixlen network_ip.mask1, network_ip.mask2, network_ip.mask3, network_ip.mask4, network_ip.mask5, \ network_ip.mask6, network_ip.mask7, network_ip.mask8 = str(net.netmask.exploded).split(':') # Get all vlans environments from equipments of the current # environment ambiente = vlan.ambiente equips = list() envs = list() # equips = all equipments from the environment which this network # is about to be allocated on for env in ambiente.equipamentoambiente_set.all(): equips.append(env.equipamento) # envs = all environments from all equips above # This will be used to test all networks from the environments. for equip in equips: for env in equip.equipamentoambiente_set.all(): if env.ambiente not in envs: envs.append(env.ambiente) network_ip_verify = IPNetwork(network) # For all vlans in all common environments, # check if any network is a subnetwork or supernetwork # of the desired network network_ip_verify for env in envs: for vlan_obj in env.vlan_set.all(): is_subnet = verify_subnet(vlan_obj, network_ip_verify, version) if is_subnet: if vlan_obj.ambiente == ambiente: raise NetworkIPRangeEnvError(None) if ambiente.filter_id is None or vlan_obj.ambiente.filter_id is None or \ int(vlan_obj.ambiente.filter_id) != int(ambiente.filter_id): raise NetworkIPRangeEnvError(None) network_ip.vlan = vlan network_ip.network_type = net_type network_ip.ambient_vip = env_vip network_ip.cluster_unit = cluster_unit try: destroy_cache_function([id_vlan]) network_ip.save() list_equip_routers_ambient = EquipamentoAmbiente.objects.filter(ambiente=network_ip.vlan.ambiente.id, is_router=True) if list_equip_routers_ambient: if version == IP_VERSION.IPv4[0]: if network_ip.block < 31: # Add the first available ipv4 on all equipment # that is configured as a router for the environment # related to network ip = Ip.get_first_available_ip(network_ip.id) ip = str(ip).split('.') ip_model = Ip() ip_model.oct1 = ip[0] ip_model.oct2 = ip[1] ip_model.oct3 = ip[2] ip_model.oct4 = ip[3] ip_model.networkipv4_id = network_ip.id ip_model.save() if len(list_equip_routers_ambient) > 1 and network_ip.block < 30: multiple_ips = True else: multiple_ips = False logging.debug('vxlan: %s' % vlan.vxlan) if vlan.vxlan: logging.debug('vxlan ok') for equip in list_equip_routers_ambient: IpEquipamento().create(user, ip_model.id, equip.equipamento.id) if multiple_ips: debug_ip = Ip.get_first_available_ip(network_ip.id, True) ips = Ip() ips.oct1, ips.oct2, ips.oct3, ips.oct4 = str(debug_ip).split('.') ips.networkipv4_id = network_ip.id ips.descricao = "IP alocado para debug" ips.save(user) IpEquipamento().create(user, ips.id, list_equip_routers_ambient[0].equipamento.id) else: for equip in list_equip_routers_ambient: IpEquipamento().create(user, ip_model.id, equip.equipamento.id) if multiple_ips: router_ip = Ip.get_first_available_ip(network_ip.id, True) router_ip = str(router_ip).split('.') ip_model2 = Ip() ip_model2.oct1 = router_ip[0] ip_model2.oct2 = router_ip[1] ip_model2.oct3 = router_ip[2] ip_model2.oct4 = router_ip[3] ip_model2.networkipv4_id = network_ip.id ip_model2.save(user) IpEquipamento().create(user, ip_model2.id, equip.equipamento.id) else: if network_ip.block < 127: # Add the first available ipv6 on all equipment # that is configured as a router for the environment # related to network ipv6 = Ipv6.get_first_available_ip6(network_ip.id) ipv6 = str(ipv6).split(':') ipv6_model = Ipv6() ipv6_model.block1 = ipv6[0] ipv6_model.block2 = ipv6[1] ipv6_model.block3 = ipv6[2] ipv6_model.block4 = ipv6[3] ipv6_model.block5 = ipv6[4] ipv6_model.block6 = ipv6[5] ipv6_model.block7 = ipv6[6] ipv6_model.block8 = ipv6[7] ipv6_model.networkipv6_id = network_ip.id ipv6_model.save() if len(list_equip_routers_ambient) > 1 and network_ip.block < 126: multiple_ips = True else: multiple_ips = False if vlan.vxlan: for equip in list_equip_routers_ambient: Ipv6Equipament().create(user, ipv6_model.id, equip.equipamento.id) if multiple_ips: router_ip = Ipv6.get_first_available_ip6(network_ip.id, True) ipv6s = Ipv6() ipv6s.block1, ipv6s.block2, ipv6s.block3, ipv6s.block4, ipv6s.block5, \ ipv6s.block6, ipv6s.block7, ipv6s.block8 = str(router_ip).split(':') ipv6s.networkipv6_id = network_ip.id ipv6s.descricao = "IPv6 alocado para debug" ipv6s.save(user) Ipv6Equipament().create(user, ipv6s.id, list_equip_routers_ambient[0].equipamento.id) else: for equip in list_equip_routers_ambient: Ipv6Equipament().create(user, ipv6_model.id, equip.equipamento.id) if multiple_ips: router_ip = Ipv6.get_first_available_ip6(network_ip.id, True) router_ip = str(router_ip).split(':') ipv6_model2 = Ipv6() ipv6_model2.block1 = router_ip[0] ipv6_model2.block2 = router_ip[1] ipv6_model2.block3 = router_ip[2] ipv6_model2.block4 = router_ip[3] ipv6_model2.block5 = router_ip[4] ipv6_model2.block6 = router_ip[5] ipv6_model2.block7 = router_ip[6] ipv6_model2.block8 = router_ip[7] ipv6_model2.networkipv6_id = network_ip.id ipv6_model2.save(user) Ipv6Equipament().create(user, ipv6_model2.id, equip.equipamento.id) except Exception as e: raise IpError(e, u'Error persisting Network.') network_map = dict() network_map['id'] = network_ip.id network_map['rede'] = str(net) network_map['broadcast'] = net.broadcast if net.version == 4 else '' network_map['mask'] = net.netmask.exploded network_map['id_vlan'] = vlan.id network_map['id_tipo_rede'] = net_type.id network_map['id_ambiente_vip'] = env_vip.id if env_vip is not None else '' network_map['active'] = network_ip return self.response(dumps_networkapi({'network': network_map})) except NetworkIPRangeEnvError: return self.response_error(346) except InvalidValueError as e: self.log.error(u'Parameter %s is invalid. Value: %s.' % (e.param, e.value)) return self.response_error(269, e.param, e.value) except NetworkTypeNotFoundError: self.log.error(u'The network_type parameter does not exist.') return self.response_error(111) except VlanNotFoundError: self.log.error(u'Vlan not found') return self.response_error(116) except EnvironmentVipNotFoundError: return self.response_error(283) except NetworkIPv4AddressNotAvailableError: return self.response_error(295) except NetworkIPv6AddressNotAvailableError: return self.response_error(296) except ConfigEnvironmentInvalidError: return self.response_error(294) except NetworkIpAddressNotAvailableError: return self.response_error(335) except (IpError, NetworkIPv6Error, NetworkIPv4Error, GrupoError, VlanError): return self.response_error(1) except XMLError as e: self.log.error(u'Error reading the XML request.') return self.response_error(3, 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 get_environmentvip_by_id(environment_vip_id): environmentvip = EnvironmentVip.get_by_pk(environment_vip_id) return environmentvip
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_delete(self, request, user, *args, **kwargs): """ Handles DELETE requests to create a relationship of Environment with EnvironmentVip. URL: environment/<environment_id>/environmentvip/<environment_vip_id>/ """ self.log.info( 'Remove a relationship of Environment with EnvironmentVip') try: # Commons Validations # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_MANAGEMENT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Valid Environment environment_id = kwargs.get('environment_id') if not is_valid_int_greater_zero_param(environment_id): self.log.error( u'The environment_id parameter is not a valid value: %s.', environment_id) raise InvalidValueError(None, 'environment_id', environment_id) # Valid EnvironmentVip ID environment_vip_id = kwargs.get('environment_vip_id') if not is_valid_int_greater_zero_param(environment_vip_id): self.log.error( u'The id_environment_vip parameter is not a valid value: %s.', environment_vip_id) raise InvalidValueError(None, 'environment_vip_id', environment_vip_id) # Business Validations # Existing Environment ID environment = Ambiente.get_by_pk(environment_id) # Existing EnvironmentVip ID environment_vip = EnvironmentVip.get_by_pk(environment_vip_id) # Business Rules environment_environment_vip = EnvironmentEnvironmentVip( ).get_by_environment_environment_vip(environment.id, environment_vip.id) server_pool_list = EnvironmentEnvironmentVip.get_server_pool_by_environment_environment_vip( environment_environment_vip) # Check if there are any pool from this environment used in any vip # of this environment vip if server_pool_list: raise EnvironmentEnvironmentServerPoolLinked( {'environment': environment.name}) # Delete environment_environment_vip.delete() # Return nothing return self.response(dumps_networkapi({})) except UserNotAuthorizedError: return self.not_authorized() except InvalidValueError, e: return self.response_error(269, e.param, e.value)
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_put(self, request, user, *args, **kwargs): """ Handles PUT requests to create a relationship of Environment with EnvironmentVip. URL: environment/<environment_id>/environmentvip/<environment_vip_id>/ """ self.log.info( 'Create a relationship of Environment with EnvironmentVip') try: # Commons Validations # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_MANAGEMENT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Valid Environment environment_id = kwargs.get('environment_id') if not is_valid_int_greater_zero_param(environment_id): self.log.error( u'The environment_id parameter is not a valid value: %s.', environment_id) raise InvalidValueError(None, 'environment_id', environment_id) # Valid EnvironmentVip ID environment_vip_id = kwargs.get('environment_vip_id') if not is_valid_int_greater_zero_param(environment_vip_id): self.log.error( u'The id_environment_vip parameter is not a valid value: %s.', environment_vip_id) raise InvalidValueError(None, 'environment_vip_id', environment_vip_id) # Business Validations # Existing Environment ID environment = Ambiente.get_by_pk(environment_id) # Existing EnvironmentVip ID environment_vip = EnvironmentVip.get_by_pk(environment_vip_id) with distributedlock(LOCK_ENVIRONMENT_VIP % environment_vip_id): # Business Rules # Set new values environment_environment_vip = EnvironmentEnvironmentVip() environment_environment_vip.environment = environment environment_environment_vip.environment_vip = environment_vip # Existing EnvironmentEnvironmentVip environment_environment_vip.validate() # Persist environment_environment_vip.save() # Return XML environment_environment_vip_map = {} environment_environment_vip_map[ 'environment_environment_vip'] = model_to_dict( environment_environment_vip, fields=['id']) return self.response( dumps_networkapi(environment_environment_vip_map)) except UserNotAuthorizedError: return self.not_authorized() except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_post(self, request, user, *args, **kwargs): """ Handles POST requests to allocate a new VLAN. URL: vlan/ """ self.log.info('Allocate new VLAN') try: # Commons Validations # User permission if not has_perm(user, AdminPermission.VLAN_MANAGEMENT, AdminPermission.WRITE_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) vlan_map = networkapi_map.get('vlan') if vlan_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 environment = vlan_map.get('id_ambiente') network_type = vlan_map.get('id_tipo_rede') name = vlan_map.get('nome') description = vlan_map.get('descricao') environment_vip = vlan_map.get('id_ambiente_vip') vrf = vlan_map.get('vrf') # Name must NOT be none and 50 is the maxsize if not is_valid_string_minsize(name, 3) or not is_valid_string_maxsize(name, 50): self.log.error(u'Parameter nome is invalid. Value: %s.', name) raise InvalidValueError(None, 'nome', name) if not is_valid_vlan_name(name): self.log.error( u'Parameter %s is invalid because is using special characters and/or breaklines.', name) raise InvalidValueError(None, 'name', name) # Description can NOT be greater than 200 if not is_valid_string_minsize(description, 3, False) or not is_valid_string_maxsize(description, 200, False): self.log.error( u'Parameter descricao is invalid. Value: %s.', description) raise InvalidValueError(None, 'descricao', description) # vrf can NOT be greater than 100 if not is_valid_string_maxsize(vrf, 100, False): self.log.error( u'Parameter vrf is invalid. Value: %s.', vrf) raise InvalidValueError(None, 'vrf', vrf) # Environment # Valid environment ID if not is_valid_int_greater_zero_param(environment): self.log.error( u'Parameter id_ambiente is invalid. Value: %s.', environment) raise InvalidValueError(None, 'id_ambiente', environment) # Find environment by ID to check if it exist env = Ambiente.get_by_pk(environment) # Environment Vip if environment_vip is not None: # Valid environment_vip ID if not is_valid_int_greater_zero_param(environment_vip): self.log.error( u'Parameter id_ambiente_vip is invalid. Value: %s.', environment_vip) raise InvalidValueError( None, 'id_ambiente_vip', environment_vip) # Find Environment VIP by ID to check if it exist evip = EnvironmentVip.get_by_pk(environment_vip) else: evip = None # Network Type # Valid network_type ID if not is_valid_int_greater_zero_param(network_type): self.log.error( u'Parameter id_tipo_rede is invalid. Value: %s.', network_type) raise InvalidValueError(None, 'id_tipo_rede', network_type) # Find network_type by ID to check if it exist net = TipoRede.get_by_pk(network_type) # Business Rules # New Vlan vlan = Vlan() vlan.nome = name vlan.descricao = description vlan.ambiente = env # Check if environment has min/max num_vlan value or use the value # thas was configured in settings if (vlan.ambiente.min_num_vlan_1 and vlan.ambiente.max_num_vlan_1) or (vlan.ambiente.min_num_vlan_2 and vlan.ambiente.max_num_vlan_2): min_num_01 = vlan.ambiente.min_num_vlan_1 if vlan.ambiente.min_num_vlan_1 and vlan.ambiente.max_num_vlan_1 else vlan.ambiente.min_num_vlan_2 max_num_01 = vlan.ambiente.max_num_vlan_1 if vlan.ambiente.min_num_vlan_1 and vlan.ambiente.max_num_vlan_1 else vlan.ambiente.max_num_vlan_2 min_num_02 = vlan.ambiente.min_num_vlan_2 if vlan.ambiente.min_num_vlan_2 and vlan.ambiente.max_num_vlan_2 else vlan.ambiente.min_num_vlan_1 max_num_02 = vlan.ambiente.max_num_vlan_2 if vlan.ambiente.min_num_vlan_2 and vlan.ambiente.max_num_vlan_2 else vlan.ambiente.max_num_vlan_1 else: min_num_01 = settings.MIN_VLAN_NUMBER_01 max_num_01 = settings.MAX_VLAN_NUMBER_01 min_num_02 = settings.MIN_VLAN_NUMBER_02 max_num_02 = settings.MAX_VLAN_NUMBER_02 # Persist vlan.create_new(user, min_num_01, max_num_01, min_num_02, max_num_02 ) # New NetworkIPv4 network_ipv4 = NetworkIPv4() vlan_map = network_ipv4.add_network_ipv4(user, vlan.id, net, evip) # Return XML return self.response(dumps_networkapi(vlan_map)) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def valid_to_save_reals_v2(pools): """ Valid values of pool member """ for pool in pools: ids = [p['id'] for p in pool['server_pool_members'] if p['id']] db_members = ServerPoolMember.objects.filter(id__in=ids) db_members_id = [str(s.id) for s in db_members] # verify if member is invalid for member in pool['server_pool_members']: if member['id']: if str(member['id']) not in db_members_id: raise exceptions.InvalidRealPoolException() # verify if port is invalid invalid_ports_real = [member['port_real'] for member in pool['server_pool_members'] if int(member['port_real']) > 65535 or int(member['port_real']) < 1] # verify if priority is invalid invalid_priority = [member['priority'] for member in pool['server_pool_members'] if int(member['priority']) > 4294967295 or int(member['priority']) < 0] # verify if pool member is duplicate ips_ports = [(member['port_real'], member['ip']['id'] if member['ip'] else member['ipv6']['id']) for member in pool['server_pool_members']] environment_vip_list = EnvironmentVip.get_environment_vips_by_environment_id(pool['server_pool']['environment']['id']) environment_vip_list_name = ', '.join([envvip.name for envvip in environment_vip_list]) environment_list_related = EnvironmentEnvironmentVip.get_environment_list_by_environment_vip_list(environment_vip_list) for members in pool['server_pool_members']: if members['ip']: environment = Ambiente.objects.filter(vlan__networkipv4__ip=members['ip']['id']).uniqueResult() if environment not in environment_list_related: raise api_exceptions.EnvironmentEnvironmentVipNotBoundedException( error_messages.get(396) % (environment.name, members['ip']['ip_formated'], environment_vip_list_name) ) for members in pool['server_pool_members']: if members['ipv6']: environment = Ambiente.objects.filter(vlan__networkipv6__ipv6=members['ipv6']['id']).uniqueResult() if environment not in environment_list_related: raise api_exceptions.EnvironmentEnvironmentVipNotBoundedException( error_messages.get(396) % (environment.name, members['ipv6']['ip_formated'], environment_vip_list_name) ) if invalid_ports_real: raise exceptions.InvalidRealPoolException( 'O número da porta deve estar entre 1 e 65535.') if invalid_priority: raise exceptions.InvalidRealPoolException( 'O valor da Prioridade deve estar entre 0 e 4294967295.') if len(ips_ports) != len(set(ips_ports)): raise exceptions.InvalidRealPoolException( 'Ips com portas iguais.') # if len(id_equips) != len(id_pool_member): # raise exceptions.InvalidRealPoolException( # 'Quantidade de portas e equipamento difere.') # load data in variables for compare db with json pls = ServerPool.objects.filter(id__in=[pool['server_pool']['id'] for pool in pools]) ps = {} for p in pools: ps[str(p['server_pool']['id'])] = p sp = {} for p in pls: sp[str(p.id)] = p # q_filters = list() # for members in pool['server_pool_members']: # if members['id']: # q_filters.append({ # 'port_real': members['port_real'], # 'id': members['id'] # }) # if len(q_filters)>0: # members_par = ServerPoolMember.objects.filter( # reduce(lambda x, y: x | y, [Q(**q_filter) for q_filter in q_filters])) # else: # members_par = list() # members_all = ServerPoolMember.objects.filter(server_pool__id=p.id) # if len(members_par) != len(members_all) and p.pool_created: # raise exceptions.PoolMemberChange(p.identifier) # return error when change names in pool created change_name = [sp[p].identifier for idx, p in enumerate(ps) if sp[p].identifier != ps[str(p)]['server_pool']['identifier'] and sp[p].pool_created] if len(change_name) > 0: raise exceptions.PoolNameChange(','.join(change_name)) # return error when change environments in pool created change_env = [sp[p].identifier for idx, p in enumerate(ps) if str(sp[p].environment.id) != str(ps[str(p)]['server_pool']['environment']['id']) and sp[p].pool_created] change_env_all = [sp[p].id for idx, p in enumerate(ps) if str(sp[p].environment.id) != str(ps[str(p)]['server_pool']['environment']['id'])] change_real = ServerPoolMember.objects.filter(server_pool_id__in=change_env_all) if len(change_env) > 0 or len(change_real) > 0: raise exceptions.PoolEnvironmentChange(','.join(change_env)) return ps, sp
def administrate_real(self, user, vip_id, equip_id, ip_id, operation, network_version, port_vip=None, port_real=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 Equipament ID if not is_valid_int_greater_zero_param(equip_id): self.log.error( u'The equip_id parameter is not a valid value: %s.', equip_id) raise InvalidValueError(None, 'equip_id', equip_id) # Valid IP ID if not is_valid_int_greater_zero_param(ip_id): self.log.error( u'The ip_id parameter is not a valid value: %s.', ip_id) raise InvalidValueError(None, 'ip_id', ip_id) # Valid operation if operation not in ['add', 'del', 'ena', 'dis', 'chk']: self.log.error( u'The operation parameter is not a valid value: %s.', operation) raise InvalidValueError(None, 'operation', operation) # Valid network version if network_version not in ['v4', 'v6']: self.log.error( u'The network_version parameter is not a valid value: %s.', network_version) raise InvalidValueError(None, 'network_version', network_version) # User permission if (operation == 'chk'): if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) else: if not has_perm(user, AdminPermission.VIP_ALTER_SCRIPT, AdminPermission.WRITE_OPERATION, None, equip_id, AdminPermission.EQUIP_UPDATE_CONFIG_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # new_call = True - New calls for Add/Del/Enable/Disable/Check with new params (Port Vip and Port Real) # new_call = False = Old calls for compatibility new_call = False if port_vip != None and port_real != None: # Valid ports if not is_valid_int_greater_zero_param(port_vip): self.log.error( u'The port_vip parameter is not a valid value: %s.', port_vip) raise InvalidValueError(None, 'port_vip', port_vip) if not is_valid_int_greater_zero_param(port_real): self.log.error( u'The port_vip parameter is not a valid value: %s.', port_real) raise InvalidValueError(None, 'port_real', port_real) new_call = True # Find Request VIP by ID to check if it exist vip = RequisicaoVips.get_by_pk(vip_id) # 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 network_version - IPv4 if network_version == IP_VERSION.IPv4[0]: # Find IpEquipamento to check if it exist IpEquip = IpEquipamento().get_by_ip_equipment(ip_id, equip_id) real_name = IpEquip.equipamento.nome end_ip = "%s.%s.%s.%s" % ( IpEquip.ip.oct1, IpEquip.ip.oct2, IpEquip.ip.oct3, IpEquip.ip.oct4) # Valid Real RequisicaoVips.valid_real_server(end_ip, IpEquip.equipamento, evip, False) # Valid network_version - IPv6 elif network_version == IP_VERSION.IPv6[0]: # Find Ipv6Equipament to check if it exist Ipv6Equip = Ipv6Equipament().get_by_ip_equipment(ip_id, equip_id) real_name = Ipv6Equip.equipamento.nome end_ip = "%s:%s:%s:%s:%s:%s:%s:%s" % (Ipv6Equip.ip.block1, Ipv6Equip.ip.block2, Ipv6Equip.ip.block3, Ipv6Equip.ip.block4, Ipv6Equip.ip.block5, Ipv6Equip.ip.block6, Ipv6Equip.ip.block7, Ipv6Equip.ip.block8) # Valid Real RequisicaoVips.valid_real_server(end_ip, Ipv6Equip.equipamento, evip, False) if (operation == 'chk'): if IP_VERSION.IPv4[0] == network_version: if new_call: command = VIP_REALS_v4_CHECK % ( vip_id, ip_id, port_real, port_vip) else: command = VIP_REAL_v4_CHECK % (vip_id, real_name, end_ip) else: if new_call: command = VIP_REALS_v6_CHECK % ( vip_id, ip_id, port_real, port_vip) else: command = VIP_REAL_v6_CHECK % (vip_id, real_name, end_ip) else: with distributedlock(LOCK_VIP_IP_EQUIP % (vip_id, ip_id, equip_id)): if (operation == 'add'): if IP_VERSION.IPv4[0] == network_version: if new_call: command = VIP_REALS_v4_CREATE % ( vip_id, ip_id, port_real, port_vip) ServerPoolMember().save_specified_port( vip_id, port_vip, IpEquip.ip, IP_VERSION.IPv4[1], port_real, user) else: command = VIP_REAL_v4_CREATE % ( vip_id, real_name, end_ip) ServerPoolMember().save_with_default_port( vip_id, IpEquip.ip, IP_VERSION.IPv4[1], user) else: if new_call: command = VIP_REALS_v6_CREATE % ( vip_id, ip_id, port_real, port_vip) ServerPoolMember().save_specified_port( vip_id, port_vip, Ipv6Equip.ip, IP_VERSION.IPv6[1], port_real, user) else: command = VIP_REAL_v6_CREATE % ( vip_id, real_name, end_ip) ServerPoolMember().save_with_default_port( vip_id, Ipv6Equip.ip, IP_VERSION.IPv6[1], user) elif (operation == 'del'): if IP_VERSION.IPv4[0] == network_version: if new_call: command = VIP_REALS_v4_REMOVE % ( vip_id, ip_id, port_real, port_vip) pool_members = ServerPoolMember.objects.filter( ip=ip_id, server_pool__vipporttopool__requisicao_vip__id=vip_id, server_pool__vipporttopool__port_vip=port_vip, port_real=port_real) [pool_member.delete() for pool_member in pool_members] else: command = VIP_REAL_v4_REMOVE % ( vip_id, real_name, end_ip) pool_members = ServerPoolMember.objects.filter( ip=ip_id, server_pool__vipporttopool__requisicao_vip__id=vip_id) [pool_member.delete() for pool_member in pool_members] else: if new_call: command = VIP_REALS_v6_REMOVE % ( vip_id, ip_id, port_real, port_vip) pool_members = ServerPoolMember.objects.filter( ipv6=ip_id, server_pool__vipporttopool__requisicao_vip__id=vip_id, server_pool__vipporttopool__port_vip=port_vip, port_real=port_real) [pool_member.delete() for pool_member in pool_members] else: command = VIP_REAL_v6_REMOVE % ( vip_id, real_name, end_ip) pool_members = ServerPoolMember.objects.filter( ipv6=ip_id, server_pool__vipporttopool__requisicao_vip__id=vip_id) [pool_member.delete() for pool_member in pool_members] elif (operation == 'ena'): if IP_VERSION.IPv4[0] == network_version: if new_call: command = VIP_REALS_v4_ENABLE % ( vip_id, ip_id, port_real, port_vip) else: command = VIP_REAL_v4_ENABLE % ( vip_id, real_name, end_ip) else: if new_call: command = VIP_REALS_v6_ENABLE % ( vip_id, ip_id, port_real, port_vip) else: command = VIP_REAL_v6_ENABLE % ( vip_id, real_name, end_ip) elif (operation == 'dis'): if IP_VERSION.IPv4[0] == network_version: if new_call: command = VIP_REALS_v4_DISABLE % ( vip_id, ip_id, port_real, port_vip) else: command = VIP_REAL_v4_DISABLE % ( vip_id, real_name, end_ip) else: if new_call: command = VIP_REALS_v6_DISABLE % ( vip_id, ip_id, port_real, port_vip) else: command = VIP_REAL_v6_DISABLE % ( vip_id, real_name, end_ip) self.log.info(command) # Execute script code, stdout, stderr = exec_script(command) self.log.info(stdout) map = dict() success_map = dict() # Return XML if code == 0: success_map['codigo'] = '%04d' % code success_map['descricao'] = {'stdout': stdout, 'stderr': stderr} map['sucesso'] = success_map return self.response(dumps_networkapi(map)) elif code == 12: success_map['codigo'] = '0' success_map['descricao'] = {'stdout': '0', 'stderr': ''} map['sucesso'] = success_map self.rollback_changes(operation, new_call, network_version, vip_id, ip_id, port_real, port_vip, real_name, end_ip, user) return self.response(dumps_networkapi(map)) else: self.rollback_changes(operation, new_call, network_version, vip_id, ip_id, port_real, port_vip, real_name, end_ip, user) return self.response_error(2, stdout + stderr)
def insert_vip_request(vip_map, user): '''Insere uma requisição de VIP. @param vip_map: Mapa com os dados da requisição. @param user: Usuário autenticado. @return: Em caso de sucesso: tupla (0, <requisição de VIP>). Em caso de erro: tupla (código da mensagem de erro, argumento01, argumento02, ...) @raise IpNotFoundError: IP não cadastrado. @raise IpError: Falha ao pesquisar o IP. @raise HealthcheckExpectNotFoundError: HealthcheckExpect não cadastrado. @raise HealthcheckExpectError: Falha ao pesquisar o HealthcheckExpect. @raise InvalidFinalidadeValueError: Finalidade com valor inválido. @raise InvalidClienteValueError: Cliente com valor inválido. @raise InvalidAmbienteValueError: Ambiente com valor inválido. @raise InvalidCacheValueError: Cache com valor inválido. @raise InvalidMetodoBalValueError: Valor do método de balanceamento inválido. @raise InvalidPersistenciaValueError: Persistencia com valor inválido. @raise InvalidHealthcheckTypeValueError: Healthcheck_Type com valor inválido ou inconsistente em relação ao valor do healthcheck_expect. @raise InvalidTimeoutValueError: Timeout com valor inválido. @raise InvalidHostNameError: Host não cadastrado. @raise EquipamentoError: Falha ao pesquisar o equipamento. @raise InvalidMaxConValueError: Número máximo de conexões com valor inválido. @raise InvalidBalAtivoValueError: Bal_Ativo com valor inválido. @raise InvalidTransbordoValueError: Transbordo com valor inválido. @raise InvalidServicePortValueError: Porta do Serviço com valor inválido. @raise InvalidRealValueError: Valor inválido de um real. @raise InvalidHealthcheckValueError: Valor do healthcheck inconsistente em relação ao valor do healthcheck_type. @raise RequisicaoVipsError: Falha ao inserir a requisição de VIP. @raise UserNotAuthorizedError: ''' log = Log('insert_vip_request') if not has_perm(user, AdminPermission.VIPS_REQUEST, AdminPermission.WRITE_OPERATION): raise UserNotAuthorizedError( None, u'Usuário não tem permissão para executar a operação.') ip_id = vip_map.get('id_ip') if not is_valid_int_greater_zero_param(ip_id): log.error(u'The ip_id parameter is not a valid value: %s.', ip_id) raise InvalidValueError(None, 'ip_id', ip_id) else: ip_id = int(ip_id) vip = RequisicaoVips() vip.ip = Ip() vip.ip.id = ip_id # Valid ports vip_map, code = vip.valid_values_ports(vip_map) if code is not None: return code, vip # get environmentVip dor validation dynamic heathcheck finalidade = vip_map.get('finalidade') cliente = vip_map.get('cliente') ambiente = vip_map.get('ambiente') if not is_valid_string_minsize(finalidade, 3) or not is_valid_string_maxsize(finalidade, 50): log.error(u'Finality value is invalid: %s.', finalidade) raise InvalidValueError(None, 'finalidade', finalidade) if not is_valid_string_minsize(cliente, 3) or not is_valid_string_maxsize(cliente, 50): log.error(u'Client value is invalid: %s.', cliente) raise InvalidValueError(None, 'cliente', cliente) if not is_valid_string_minsize(ambiente, 3) or not is_valid_string_maxsize(ambiente, 50): log.error(u'Environment value is invalid: %s.', ambiente) raise InvalidValueError(None, 'ambiente', ambiente) try: environment_vip = EnvironmentVip.get_by_values( finalidade, cliente, ambiente) except Exception, e: raise EnvironmentVipNotFoundError( e, 'The fields finality or client or ambiente is None')
def handle_post(self, request, user, *args, **kwargs): """ Handles POST requests to allocate a new VLAN. URL: vlan/ """ self.log.info('Allocate new VLAN') try: # Commons Validations # User permission if not has_perm(user, AdminPermission.VLAN_MANAGEMENT, AdminPermission.WRITE_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) vlan_map = networkapi_map.get('vlan') if vlan_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 environment = vlan_map.get('id_ambiente') network_type = vlan_map.get('id_tipo_rede') name = vlan_map.get('nome') description = vlan_map.get('descricao') environment_vip = vlan_map.get('id_ambiente_vip') vrf = vlan_map.get('vrf') # Name must NOT be none and 50 is the maxsize if not is_valid_string_minsize(name, 3) or not is_valid_string_maxsize(name, 50): self.log.error(u'Parameter nome is invalid. Value: %s.', name) raise InvalidValueError(None, 'nome', name) # Description can NOT be greater than 200 if not is_valid_string_minsize(description, 3, False) or not is_valid_string_maxsize(description, 200, False): self.log.error( u'Parameter descricao is invalid. Value: %s.', description) raise InvalidValueError(None, 'descricao', description) # vrf can NOT be greater than 100 if not is_valid_string_maxsize(vrf, 100, False): self.log.error( u'Parameter vrf is invalid. Value: %s.', vrf) raise InvalidValueError(None, 'vrf', vrf) # Environment # Valid environment ID if not is_valid_int_greater_zero_param(environment): self.log.error( u'Parameter id_ambiente is invalid. Value: %s.', environment) raise InvalidValueError(None, 'id_ambiente', environment) # Find environment by ID to check if it exist env = Ambiente.get_by_pk(environment) # Environment Vip if environment_vip is not None: # Valid environment_vip ID if not is_valid_int_greater_zero_param(environment_vip): self.log.error( u'Parameter id_ambiente_vip is invalid. Value: %s.', environment_vip) raise InvalidValueError( None, 'id_ambiente_vip', environment_vip) # Find Environment VIP by ID to check if it exist evip = EnvironmentVip.get_by_pk(environment_vip) else: evip = None # Network Type # Valid network_type ID if not is_valid_int_greater_zero_param(network_type): self.log.error( u'Parameter id_tipo_rede is invalid. Value: %s.', network_type) raise InvalidValueError(None, 'id_tipo_rede', network_type) # Find network_type by ID to check if it exist net = TipoRede.get_by_pk(network_type) # Business Rules # New Vlan vlan = Vlan() vlan.nome = name vlan.descricao = description vlan.ambiente = env # Check if environment has min/max num_vlan value or use the value # thas was configured in settings if (vlan.ambiente.min_num_vlan_1 and vlan.ambiente.max_num_vlan_1) or (vlan.ambiente.min_num_vlan_2 and vlan.ambiente.max_num_vlan_2): min_num_01 = vlan.ambiente.min_num_vlan_1 if vlan.ambiente.min_num_vlan_1 and vlan.ambiente.max_num_vlan_1 else vlan.ambiente.min_num_vlan_2 max_num_01 = vlan.ambiente.max_num_vlan_1 if vlan.ambiente.min_num_vlan_1 and vlan.ambiente.max_num_vlan_1 else vlan.ambiente.max_num_vlan_2 min_num_02 = vlan.ambiente.min_num_vlan_2 if vlan.ambiente.min_num_vlan_2 and vlan.ambiente.max_num_vlan_2 else vlan.ambiente.min_num_vlan_1 max_num_02 = vlan.ambiente.max_num_vlan_2 if vlan.ambiente.min_num_vlan_2 and vlan.ambiente.max_num_vlan_2 else vlan.ambiente.max_num_vlan_1 else: min_num_01 = settings.MIN_VLAN_NUMBER_01 max_num_01 = settings.MAX_VLAN_NUMBER_01 min_num_02 = settings.MIN_VLAN_NUMBER_02 max_num_02 = settings.MAX_VLAN_NUMBER_02 # Persist vlan.create_new(user, min_num_01, max_num_01, min_num_02, max_num_02 ) # New NetworkIPv4 network_ipv4 = NetworkIPv4() vlan_map = network_ipv4.add_network_ipv4(user, vlan.id, net, evip) # Return XML return self.response(dumps_networkapi(vlan_map)) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
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 network_ipv4_add(self, user, vlan_id, network_type, environment_vip, prefix=None): try: # Valid vlan ID if not is_valid_int_greater_zero_param(vlan_id): self.log.error(u'Parameter id_vlan is invalid. Value: %s.', vlan_id) raise InvalidValueError(None, 'id_vlan', vlan_id) # Network Type # Valid network_type ID # if not is_valid_int_greater_zero_param(network_type): # self.log.error( # u'Parameter id_tipo_rede is invalid. Value: %s.', network_type) # raise InvalidValueError(None, 'id_tipo_rede', network_type) # Find network_type by ID to check if it exist net = None if network_type: net = TipoRede.get_by_pk(network_type) # Environment Vip if environment_vip is not None: # Valid environment_vip ID if not is_valid_int_greater_zero_param(environment_vip): self.log.error( u'Parameter id_ambiente_vip is invalid. Value: %s.', environment_vip) raise InvalidValueError(None, 'id_ambiente_vip', environment_vip) # Find Environment VIP by ID to check if it exist evip = EnvironmentVip.get_by_pk(environment_vip) else: evip = None # Business Rules # New NetworkIPv4 network_ipv4 = NetworkIPv4() vlan_map = network_ipv4.add_network_ipv4(user, vlan_id, net, evip, prefix) list_equip_routers_ambient = EquipamentoAmbiente.get_routers_by_environment( vlan_map['vlan']['id_ambiente']) if list_equip_routers_ambient: # Add the first available ipv4 on all equipment # that is configured as a router for the environment related to # network ip = Ip.get_first_available_ip(vlan_map['vlan']['id_network']) ip = str(ip).split('.') ip_model = Ip() ip_model.oct1 = ip[0] ip_model.oct2 = ip[1] ip_model.oct3 = ip[2] ip_model.oct4 = ip[3] ip_model.networkipv4_id = network_ipv4.id ip_model.save() if len(list_equip_routers_ambient) > 1: multiple_ips = True else: multiple_ips = False if vlan_map.get('vlan').get('vxlan'): logging.debug('vxlan') for equip in list_equip_routers_ambient: IpEquipamento().create(user, ip_model.id, equip.equipamento.id) if multiple_ips: debug_ip = Ip.get_first_available_ip( network_ipv4.id, True) ips = Ip() ips.oct1, ips.oct2, ips.oct3, ips.oct4 = str( debug_ip).split('.') ips.networkipv4_id = network_ipv4.id ips.descricao = "IP alocado para debug" ips.save(user) IpEquipamento().create( user, ips.id, list_equip_routers_ambient[0].equipamento.id) else: for equip in list_equip_routers_ambient: IpEquipamento().create(user, ip_model.id, equip.equipamento.id) if multiple_ips: router_ip = Ip.get_first_available_ip( network_ipv4.id, True) router_ip = str(router_ip).split('.') ip_model2 = Ip() ip_model2.oct1 = router_ip[0] ip_model2.oct2 = router_ip[1] ip_model2.oct3 = router_ip[2] ip_model2.oct4 = router_ip[3] ip_model2.networkipv4_id = network_ipv4.id ip_model2.save(user) IpEquipamento().create(user, ip_model2.id, equip.equipamento.id) # Return XML return self.response(dumps_networkapi(vlan_map)) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
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_post(self, request, user, *args, **kwargs): """Treat POST requests to add new Network URL: network/add/ """ try: # Commons Validations # User permission if not has_perm(user, AdminPermission.VLAN_MANAGEMENT, AdminPermission.WRITE_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) network_map = networkapi_map.get('network') if network_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 network = network_map.get('network') id_vlan = network_map.get('id_vlan') network_type = network_map.get('id_network_type') environment_vip = network_map.get('id_environment_vip') cluster_unit = network_map.get('cluster_unit') # Valid Network try: net = IPNetwork(network) except ValueError, e: raise InvalidValueError(None, 'network', network) # VLAN # Valid vlan ID if not is_valid_int_greater_zero_param(id_vlan): raise InvalidValueError(None, 'id_vlan', id_vlan) # Find vlan by ID to check if it exist vlan = Vlan().get_by_pk(id_vlan) # Network Type # Valid network_type ID if not is_valid_int_greater_zero_param(network_type): raise InvalidValueError(None, 'id_network_type', network_type) # Find network_type by ID to check if it exist net_type = TipoRede.get_by_pk(network_type) # Environment Vip if environment_vip is not None: # Valid environment_vip ID if not is_valid_int_greater_zero_param(environment_vip): raise InvalidValueError(None, 'id_environment_vip', environment_vip) evips = EnvironmentVip.objects.all() evip_list = EnvironmentVip.available_evips( EnvironmentVip(), evips, int(id_vlan)) # Check if the chose environment is in the same environment if any( int(environment_vip) == item['id'] for item in evip_list): # Find Environment VIP by ID to check if it exist env_vip = EnvironmentVip.get_by_pk(environment_vip) else: raise InvalidValueError(None, 'id_environment_vip', environment_vip) else: env_vip = None # Check unchecked exception blocks, network, version = break_network(network) expl = split(net.network.exploded, '.' if version == IP_VERSION.IPv4[0] else ':') expl.append(str(net.prefixlen)) if blocks != expl: raise InvalidValueError(None, 'rede', network) # Business Rules if version == IP_VERSION.IPv4[0]: # Find all networks related to environment nets = NetworkIPv4.objects.filter( vlan__ambiente__id=vlan.ambiente.id) # Cast to API class networks = set([ IPv4Network('%d.%d.%d.%d/%d' % (net_ip.oct1, net_ip.oct2, net_ip.oct3, net_ip.oct4, net_ip.block)) for net_ip in nets ]) # If network selected not in use for network_aux in networks: if net in network_aux or network_aux in net: self.log.debug( 'Network %s cannot be allocated. It conflicts with %s already in use in this environment.' % (net, network)) raise NetworkIPv4AddressNotAvailableError( None, u'Network cannot be allocated. %s already in use in this environment.' % network_aux) if env_vip is not None: # Find all networks related to environment vip nets = NetworkIPv4.objects.filter( ambient_vip__id=env_vip.id) # Cast to API class networks = set([ IPv4Network('%d.%d.%d.%d/%d' % (net_ip.oct1, net_ip.oct2, net_ip.oct3, net_ip.oct4, net_ip.block)) for net_ip in nets ]) # If there is already a network with the same range ip as # related the environment vip for network_aux in networks: if net in network_aux or network_aux in net: self.log.debug( 'Network %s cannot be allocated. It conflicts with %s already in use in this environment VIP.' % (net, network)) raise NetworkIPv4AddressNotAvailableError( None, u'Network cannot be allocated. %s already in use in this environment VIP.' % network_aux) # # Filter case 1 - Adding new network with same ip range to another network on other environment ## # Get environments with networks with the same ip range nets = NetworkIPv4.objects.filter(oct1=expl[0], oct2=expl[1], oct3=expl[2], oct4=expl[3], block=expl[4]) env_ids = list() for net_ip in nets: env_ids.append(net_ip.vlan.ambiente.id) # If other network with same ip range exists if len(env_ids) > 0: # Get equipments related to this network's environment env_equips = EquipamentoAmbiente.objects.filter( ambiente=vlan.ambiente.id) # Verify equipments related with all other environments # that contains networks with same ip range for env_id in env_ids: # Equipments related to other environments other_env_equips = EquipamentoAmbiente.objects.filter( ambiente=env_id) # Adjust to equipments equip_list = list() for equip_env in other_env_equips: equip_list.append(equip_env.equipamento.id) for env_equip in env_equips: if env_equip.equipamento.id in equip_list: # Filter testing if other_env_equips[ 0].ambiente.filter is None or vlan.ambiente.filter is None: raise NetworkIPRangeEnvError( None, u'Um dos equipamentos associados com o ambiente desta rede também está associado com outro ambiente que tem uma rede com essa mesma faixa, adicione filtros nos ambientes se necessário.' ) else: # Test both environment's filters tp_equip_list_one = list() for fet in FilterEquipType.objects.filter( filter=vlan.ambiente.filter.id): tp_equip_list_one.append(fet.equiptype) tp_equip_list_two = list() for fet in FilterEquipType.objects.filter( filter=other_env_equips[0]. ambiente.filter.id): tp_equip_list_two.append(fet.equiptype) if env_equip.equipamento.tipo_equipamento not in tp_equip_list_one or env_equip.equipamento.tipo_equipamento not in tp_equip_list_two: raise NetworkIPRangeEnvError( None, u'Um dos equipamentos associados com o ambiente desta rede também está associado com outro ambiente que tem uma rede com essa mesma faixa, adicione filtros nos ambientes se necessário.' ) # # Filter case 1 - end ## # New NetworkIPv4 network_ip = NetworkIPv4() # Set octs by network generated network_ip.oct1, network_ip.oct2, network_ip.oct3, network_ip.oct4 = str( net.network).split('.') # Set block by network generated network_ip.block = net.prefixlen # Set mask by network generated network_ip.mask_oct1, network_ip.mask_oct2, network_ip.mask_oct3, network_ip.mask_oct4 = str( net.netmask).split('.') # Set broadcast by network generated network_ip.broadcast = net.broadcast else: # Find all networks ralated to environment nets = NetworkIPv6.objects.filter( vlan__ambiente__id=vlan.ambiente.id) # Cast to API class networks = set([ IPv6Network('%s:%s:%s:%s:%s:%s:%s:%s/%d' % (net_ip.block1, net_ip.block2, net_ip.block3, net_ip.block4, net_ip.block5, net_ip.block6, net_ip.block7, net_ip.block8, net_ip.block)) for net_ip in nets ]) # If network selected not in use for network_aux in networks: if net in network_aux or network_aux in net: self.log.debug( 'Network %s cannot be allocated. It conflicts with %s already in use in this environment.' % (net, network)) raise NetworkIPv4AddressNotAvailableError( None, u'Network cannot be allocated. %s already in use in this environment.' % network_aux) if env_vip is not None: # Find all networks related to environment vip nets = NetworkIPv6.objects.filter( ambient_vip__id=env_vip.id) # Cast to API class networks = set([ IPv6Network( '%s:%s:%s:%s:%s:%s:%s:%s/%d' % (net_ip.block1, net_ip.block2, net_ip.block3, net_ip.block4, net_ip.block5, net_ip.block6, net_ip.block7, net_ip.block8, net_ip.block)) for net_ip in nets ]) # If there is already a network with the same range ip as # related the environment vip for network_aux in networks: if net in network_aux or network_aux in net: self.log.debug( 'Network %s cannot be allocated. It conflicts with %s already in use in this environment VIP.' % (net, network)) raise NetworkIPv4AddressNotAvailableError( None, u'Network cannot be allocated. %s already in use in this environment VIP.' % network_aux) # # Filter case 1 - Adding new network with same ip range to another network on other environment ## # Get environments with networks with the same ip range nets = NetworkIPv6.objects.filter(block1=expl[0], block2=expl[1], block3=expl[2], block4=expl[3], block5=expl[4], block6=expl[5], block7=expl[6], block8=expl[7], block=expl[8]) env_ids = list() for net_ip in nets: env_ids.append(net_ip.vlan.ambiente.id) # If other network with same ip range exists if len(env_ids) > 0: # Get equipments related to this network's environment env_equips = EquipamentoAmbiente.objects.filter( ambiente=vlan.ambiente.id) # Verify equipments related with all other environments # that contains networks with same ip range for env_id in env_ids: # Equipments related to other environments other_env_equips = EquipamentoAmbiente.objects.filter( ambiente=env_id) # Adjust to equipments equip_list = list() for equip_env in other_env_equips: equip_list.append(equip_env.equipamento.id) for env_equip in env_equips: if env_equip.equipamento.id in equip_list: # Filter testing if other_env_equips[ 0].ambiente.filter is None or vlan.ambiente.filter is None: raise NetworkIPRangeEnvError( None, u'Um dos equipamentos associados com o ambiente desta rede também está associado com outro ambiente que tem uma rede com essa mesma faixa, adicione filtros nos ambientes se necessário.' ) else: # Test both environment's filters tp_equip_list_one = list() for fet in FilterEquipType.objects.filter( filter=vlan.ambiente.filter.id): tp_equip_list_one.append(fet.equiptype) tp_equip_list_two = list() for fet in FilterEquipType.objects.filter( filter=other_env_equips[0]. ambiente.filter.id): tp_equip_list_two.append(fet.equiptype) if env_equip.equipamento.tipo_equipamento not in tp_equip_list_one or env_equip.equipamento.tipo_equipamento not in tp_equip_list_two: raise NetworkIPRangeEnvError( None, u'Um dos equipamentos associados com o ambiente desta rede também está associado com outro ambiente que tem uma rede com essa mesma faixa, adicione filtros nos ambientes se necessário.' ) # # Filter case 1 - end ## # New NetworkIPv6 network_ip = NetworkIPv6() # Set block by network generated network_ip.block1, network_ip.block2, network_ip.block3, network_ip.block4, network_ip.block5, network_ip.block6, network_ip.block7, network_ip.block8 = str( net.network.exploded).split(':') # Set block by network generated network_ip.block = net.prefixlen # Set mask by network generated network_ip.mask1, network_ip.mask2, network_ip.mask3, network_ip.mask4, network_ip.mask5, network_ip.mask6, network_ip.mask7, network_ip.mask8 = str( net.netmask.exploded).split(':') # Get all vlans environments from equipments of the current # environment ambiente = vlan.ambiente equips = list() envs = list() # equips = all equipments from the environment which this network # is about to be allocated on for env in ambiente.equipamentoambiente_set.all(): equips.append(env.equipamento) # envs = all environments from all equips above # This will be used to test all networks from the environments. for equip in equips: for env in equip.equipamentoambiente_set.all(): if env.ambiente not in envs: envs.append(env.ambiente) network_ip_verify = IPNetwork(network) # For all vlans in all common environments, # check if any network is a subnetwork or supernetwork # of the desired network network_ip_verify for env in envs: for vlan_obj in env.vlan_set.all(): is_subnet = verify_subnet(vlan_obj, network_ip_verify, version) if is_subnet: if vlan_obj.ambiente == ambiente: raise NetworkIPRangeEnvError(None) if ambiente.filter_id is None or vlan_obj.ambiente.filter_id is None or int( vlan_obj.ambiente.filter_id) != int( ambiente.filter_id): raise NetworkIPRangeEnvError(None) # Set Vlan network_ip.vlan = vlan # Set Network Type network_ip.network_type = net_type # Set Environment VIP network_ip.ambient_vip = env_vip # Set Cluster Unit network_ip.cluster_unit = cluster_unit # Persist try: # Delete vlan's cache destroy_cache_function([id_vlan]) network_ip.save() list_equip_routers_ambient = EquipamentoAmbiente.objects.filter( ambiente=network_ip.vlan.ambiente.id, is_router=True) if list_equip_routers_ambient: if version == IP_VERSION.IPv4[0]: if network_ip.block < 31: # Add Adds the first available ipv4 on all equipment # that is configured as a router for the environment # related to network ip = Ip.get_first_available_ip(network_ip.id) ip = str(ip).split('.') ip_model = Ip() ip_model.oct1 = ip[0] ip_model.oct2 = ip[1] ip_model.oct3 = ip[2] ip_model.oct4 = ip[3] ip_model.networkipv4_id = network_ip.id ip_model.save() if len(list_equip_routers_ambient ) > 1 and network_ip.block < 30: multiple_ips = True else: multiple_ips = False for equip in list_equip_routers_ambient: IpEquipamento().create(user, ip_model.id, equip.equipamento.id) if multiple_ips: router_ip = Ip.get_first_available_ip( network_ip.id, True) router_ip = str(router_ip).split('.') ip_model2 = Ip() ip_model2.oct1 = router_ip[0] ip_model2.oct2 = router_ip[1] ip_model2.oct3 = router_ip[2] ip_model2.oct4 = router_ip[3] ip_model2.networkipv4_id = network_ip.id ip_model2.save(user) IpEquipamento().create( user, ip_model2.id, equip.equipamento.id) else: if network_ip.block < 127: # Add Adds the first available ipv6 on all equipment # that is configured as a router for the environment # related to network ipv6 = Ipv6.get_first_available_ip6(network_ip.id) ipv6 = str(ipv6).split(':') ipv6_model = Ipv6() ipv6_model.block1 = ipv6[0] ipv6_model.block2 = ipv6[1] ipv6_model.block3 = ipv6[2] ipv6_model.block4 = ipv6[3] ipv6_model.block5 = ipv6[4] ipv6_model.block6 = ipv6[5] ipv6_model.block7 = ipv6[6] ipv6_model.block8 = ipv6[7] ipv6_model.networkipv6_id = network_ip.id ipv6_model.save() if len(list_equip_routers_ambient ) > 1 and network_ip.block < 126: multiple_ips = True else: multiple_ips = False for equip in list_equip_routers_ambient: Ipv6Equipament().create( user, ipv6_model.id, equip.equipamento.id) if multiple_ips: router_ip = Ipv6.get_first_available_ip6( network_ip.id, True) router_ip = str(router_ip).split(':') ipv6_model2 = Ipv6() ipv6_model2.block1 = router_ip[0] ipv6_model2.block2 = router_ip[1] ipv6_model2.block3 = router_ip[2] ipv6_model2.block4 = router_ip[3] ipv6_model2.block5 = router_ip[4] ipv6_model2.block6 = router_ip[5] ipv6_model2.block7 = router_ip[6] ipv6_model2.block8 = router_ip[7] ipv6_model2.networkipv6_id = network_ip.id ipv6_model2.save(user) Ipv6Equipament().create( user, ipv6_model2.id, equip.equipamento.id) except Exception, e: raise IpError(e, u'Error persisting Network.')
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 network_ipv6_add(self, user, vlan_id, network_type, environment_vip, prefix=None): try: # Valid vlan ID if not is_valid_int_greater_zero_param(vlan_id): self.log.error(u'Parameter id_vlan is invalid. Value: %s.', vlan_id) raise InvalidValueError(None, 'id_vlan', vlan_id) # Network Type # Valid network_type ID """ if not is_valid_int_greater_zero_param(network_type): self.log.error( u'Parameter id_tipo_rede is invalid. Value: %s.', network_type) raise InvalidValueError(None, 'id_tipo_rede', network_type) """ # Find network_type by ID to check if it exist net = None if network_type: net = TipoRede.get_by_pk(network_type) # Environment Vip if environment_vip is not None: # Valid environment_vip ID if not is_valid_int_greater_zero_param(environment_vip): self.log.error( u'Parameter id_ambiente_vip is invalid. Value: %s.', environment_vip) raise InvalidValueError(None, 'id_ambiente_vip', environment_vip) # Find Environment VIP by ID to check if it exist evip = EnvironmentVip.get_by_pk(environment_vip) else: evip = None # Business Rules # New NetworkIPv6 network_ipv6 = NetworkIPv6() vlan_map = network_ipv6.add_network_ipv6(user, vlan_id, net, evip, prefix) list_equip_routers_ambient = EquipamentoAmbiente.get_routers_by_environment( vlan_map['vlan']['id_ambiente']) if list_equip_routers_ambient: # Add Adds the first available ipv6 on all equipment # that is configured as a router for the environment related to # network ipv6 = Ipv6.get_first_available_ip6( vlan_map['vlan']['id_network']) ipv6 = str(ipv6).split(':') ipv6_model = Ipv6() ipv6_model.block1 = ipv6[0] ipv6_model.block2 = ipv6[1] ipv6_model.block3 = ipv6[2] ipv6_model.block4 = ipv6[3] ipv6_model.block5 = ipv6[4] ipv6_model.block6 = ipv6[5] ipv6_model.block7 = ipv6[6] ipv6_model.block8 = ipv6[7] ipv6_model.networkipv6_id = vlan_map['vlan']['id_network'] ipv6_model.save() if len(list_equip_routers_ambient) > 1: multiple_ips = True else: multiple_ips = False if vlan_map.get('vlan').get('vxlan'): logging.debug('vxlan') for equip in list_equip_routers_ambient: Ipv6Equipament().create(user, ipv6_model.id, equip.equipamento.id) if multiple_ips: router_ip = Ipv6.get_first_available_ip6( vlan_map['vlan']['id_network'], True) ipv6s = Ipv6() ipv6s.block1, ipv6s.block2, ipv6s.block3, ipv6s.block4, ipv6s.block5, \ ipv6s.block6, ipv6s.block7, ipv6s.block8 = str(router_ip).split(':') ipv6s.networkipv6_id = vlan_map['vlan']['id_network'] ipv6s.descricao = "IPv6 alocado para debug" ipv6s.save(user) Ipv6Equipament().create( user, ipv6s.id, list_equip_routers_ambient[0].equipamento.id) else: for equip in list_equip_routers_ambient: Ipv6Equipament().create(user, vlan_map['vlan']['id_network'], equip.equipamento.id) if multiple_ips: router_ip = Ipv6.get_first_available_ip6( vlan_map['vlan']['id_network'], True) router_ip = str(router_ip).split(':') ipv6_model2 = Ipv6() ipv6_model2.block1 = router_ip[0] ipv6_model2.block2 = router_ip[1] ipv6_model2.block3 = router_ip[2] ipv6_model2.block4 = router_ip[3] ipv6_model2.block5 = router_ip[4] ipv6_model2.block6 = router_ip[5] ipv6_model2.block7 = router_ip[6] ipv6_model2.block8 = router_ip[7] ipv6_model2.networkipv6_id = vlan_map['vlan'][ 'id_network'] ipv6_model2.save(user) Ipv6Equipament().create( user, ipv6_model2.id, list_equip_routers_ambient[0].equipamento.id) # Return XML return self.response(dumps_networkapi(vlan_map)) except XMLError, e: self.log.error(u'Error reading the XML request.') return self.response_error(3, e)
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_post(self, request, user, *args, **kwargs): """Handles POST requests to edit an Network. URL: network/edit/ """ self.log.info('Edit an Network') try: # 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) net_map = networkapi_map.get('net') if net_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_network = net_map.get('id_network') ip_type = net_map.get('ip_type') id_net_type = net_map.get('id_net_type') id_env_vip = net_map.get('id_env_vip') cluster_unit = net_map.get('cluster_unit') # Valid id_network if not is_valid_int_greater_zero_param(id_network): self.log.error( u'Parameter id_network is invalid. Value: %s.', id_network) raise InvalidValueError(None, 'id_network', id_network) # Valid ip_type if not is_valid_int_param(ip_type): self.log.error( u'Parameter ip_type is invalid. Value: %s.', ip_type) raise InvalidValueError(None, 'ip_type', ip_type) list_choice = [0, 1] # Valid ip_type choice if int(ip_type) not in list_choice: self.log.error( u'Parameter ip_type is invalid. Value: %s.', ip_type) raise InvalidValueError(None, 'ip_type', ip_type) # Valid id_net_type if not is_valid_int_greater_zero_param(id_net_type): self.log.error( u'Parameter id_net_type is invalid. Value: %s.', id_net_type) raise InvalidValueError(None, 'id_net_type', id_net_type) # Valid id_env_vip if id_env_vip is not None: if not is_valid_int_greater_zero_param(id_env_vip): self.log.error( u'Parameter id_env_vip is invalid. Value: %s.', id_env_vip) raise InvalidValueError(None, 'id_env_vip', id_env_vip) # User permission if not has_perm(user, AdminPermission.VLAN_MANAGEMENT, AdminPermission.WRITE_OPERATION): raise UserNotAuthorizedError( None, u'User does not have permission to perform the operation.') # Business Rules if (id_env_vip is not None): id_env_vip = EnvironmentVip.get_by_pk(id_env_vip) id_net_type = TipoRede.get_by_pk(id_net_type) # New network_tyoe # EDIT NETWORK IP4 if int(ip_type) == 0: net = NetworkIPv4.get_by_pk(id_network) with distributedlock(LOCK_NETWORK_IPV4 % id_network): if id_env_vip is not None: if net.ambient_vip is None or net.ambient_vip.id != id_env_vip.id: network = IPNetwork( '%d.%d.%d.%d/%d' % (net.oct1, net.oct2, net.oct3, net.oct4, net.block)) # Find all networks related to environment vip nets = NetworkIPv4.objects.filter( ambient_vip__id=id_env_vip.id) # Cast to API class networks = set([IPv4Network( '%d.%d.%d.%d/%d' % (net_ip.oct1, net_ip.oct2, net_ip.oct3, net_ip.oct4, net_ip.block)) for net_ip in nets]) # If there is already a network with the same ip # range as related the environment vip if network in networks: raise NetworkIpAddressNotAvailableError( None, u'Unavailable address to create a NetworkIPv4.') net.edit_network_ipv4( user, id_net_type, id_env_vip, cluster_unit) # EDIT NETWORK IP6 else: net = NetworkIPv6.get_by_pk(id_network) with distributedlock(LOCK_NETWORK_IPV6 % id_network): if id_env_vip is not None: if net.ambient_vip is None or net.ambient_vip.id != id_env_vip.id: network = IPNetwork('%s:%s:%s:%s:%s:%s:%s:%s/%d' % ( net.block1, net.block2, net.block3, net.block4, net.block5, net.block6, net.block7, net.block8, net.block)) # Find all networks related to environment vip nets = NetworkIPv6.objects.filter( ambient_vip__id=id_env_vip.id) # Cast to API class networks = set([IPv6Network('%s:%s:%s:%s:%s:%s:%s:%s/%d' % (net_ip.block1, net_ip.block2, net_ip.block3, net_ip.block4, net_ip.block5, net_ip.block6, net_ip.block7, net_ip.block8, net_ip.block)) for net_ip in nets]) # If there is already a network with the same # range ip as related the environment vip if net in networks: raise NetworkIpAddressNotAvailableError( None, u'Unavailable address to create a NetworkIPv6.') net.edit_network_ipv6(user, id_net_type, id_env_vip) # Delete vlan's cache # destroy_cache_function() return self.response(dumps_networkapi({})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_put(self, request, user, *args, **kwargs): """ Handles PUT requests to create a relationship of OptionVip with EnvironmentVip. URL: optionvip/<id_option_vip>/environmentvip/<id_environment_vip>/ """ self.log.info("Create a relationship of OptionVip with EnvironmentVip") try: # Commons Validations # User permission if not has_perm(user, AdminPermission.OPTION_VIP, AdminPermission.WRITE_OPERATION): self.log.error(u"User does not have permission to perform the operation.") raise UserNotAuthorizedError(None) # Valid OptionVip ID option_vip_id = kwargs.get("id_option_vip") if not is_valid_int_greater_zero_param(option_vip_id): self.log.error(u"The id_option_vip parameter is not a valid value: %s.", option_vip_id) raise InvalidValueError(None, "id_option_vip", option_vip_id) # Valid EnvironmentVip ID environment_vip_id = kwargs.get("id_environment_vip") if not is_valid_int_greater_zero_param(environment_vip_id): self.log.error(u"The id_environment_vip parameter is not a valid value: %s.", environment_vip_id) raise InvalidValueError(None, "id_environment_vip", environment_vip_id) # Business Validations # Existing OptionVip ID option_vip = OptionVip.get_by_pk(option_vip_id) # Existing EnvironmentVip ID environment_vip = EnvironmentVip.get_by_pk(environment_vip_id) with distributedlock(LOCK_ENVIRONMENT_VIP % environment_vip_id): # Business Rules # Set new values opt_vip_env_vip = OptionVipEnvironmentVip() opt_vip_env_vip.option = option_vip opt_vip_env_vip.environment = environment_vip # Existing OptionVipEnvironmentVip opt_vip_env_vip.validate() # Persist opt_vip_env_vip.save(user) # Return XML opt_vip_env_vip_map = dict() opt_vip_env_vip_map["opcoesvip_ambiente_xref"] = model_to_dict(opt_vip_env_vip, fields=["id"]) return self.response(dumps_networkapi(opt_vip_env_vip_map)) except UserNotAuthorizedError: return self.not_authorized() 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 network_ipv4_add(self, user, vlan_id, network_type, environment_vip, prefix=None): try: # Valid vlan ID if not is_valid_int_greater_zero_param(vlan_id): self.log.error( u'Parameter id_vlan is invalid. Value: %s.', vlan_id) raise InvalidValueError(None, 'id_vlan', vlan_id) # Network Type # Valid network_type ID """ if not is_valid_int_greater_zero_param(network_type): self.log.error( u'Parameter id_tipo_rede is invalid. Value: %s.', network_type) raise InvalidValueError(None, 'id_tipo_rede', network_type) """ # Find network_type by ID to check if it exist net = None if network_type: net = TipoRede.get_by_pk(network_type) # Environment Vip if environment_vip is not None: # Valid environment_vip ID if not is_valid_int_greater_zero_param(environment_vip): self.log.error( u'Parameter id_ambiente_vip is invalid. Value: %s.', environment_vip) raise InvalidValueError( None, 'id_ambiente_vip', environment_vip) # Find Environment VIP by ID to check if it exist evip = EnvironmentVip.get_by_pk(environment_vip) else: evip = None # Business Rules # New NetworkIPv4 network_ipv4 = NetworkIPv4() vlan_map = network_ipv4.add_network_ipv4(user, vlan_id, net, evip, prefix) list_equip_routers_ambient = EquipamentoAmbiente.get_routers_by_environment(vlan_map['vlan']['id_ambiente']) if list_equip_routers_ambient: # Add Adds the first available ipv4 on all equipment # that is configured as a router for the environment related to # network ip = Ip.get_first_available_ip(vlan_map['vlan']['id_network']) ip = str(ip).split('.') ip_model = Ip() ip_model.oct1 = ip[0] ip_model.oct2 = ip[1] ip_model.oct3 = ip[2] ip_model.oct4 = ip[3] ip_model.networkipv4_id = network_ipv4.id ip_model.save() if len(list_equip_routers_ambient) > 1: multiple_ips = True else: multiple_ips = False for equip in list_equip_routers_ambient: IpEquipamento().create(user, ip_model.id, equip.equipamento.id) if multiple_ips: router_ip = Ip.get_first_available_ip(vlan_map['vlan']['id_network'], True) router_ip = str(router_ip).split('.') ip_model2 = Ip() ip_model2.oct1 = router_ip[0] ip_model2.oct2 = router_ip[1] ip_model2.oct3 = router_ip[2] ip_model2.oct4 = router_ip[3] ip_model2.networkipv4_id = vlan_map['vlan']['id_network'] ip_model2.save() IpEquipamento().create(user, ip_model2.id, equip.equipamento.id) # Return XML return self.response(dumps_networkapi(vlan_map)) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_post(self, request, user, *args, **kwargs): """Handles GET requests get an IP6 available for vip_request by evip_id. URL: ip/availableip6/vip/id_evip """ self.log.info('Get an IP6 available for vip_request') try: # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') ip_map = networkapi_map.get('ip_map') # Get XML data id_evip = ip_map.get('id_evip') name = ip_map.get('name') 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) # Business Rules evip = EnvironmentVip.get_by_pk(id_evip) with distributedlock(LOCK_GET_IPV6_AVAILABLE % id_evip): ipv6 = Ipv6() len_network = len(evip.networkipv6_set.all()) if len_network <= 0: raise NetworkNotInEvip( None, 'Não há rede no ambiente vip fornecido') raise_not_found_balanceamento = False cont_network = 0 cont_balanceador_not_found = 0 for net in evip.networkipv6_set.all(): balanceador_found_flag = False cont_network = cont_network + 1 list_ips_equips = list() try: ip_available = ipv6.get_available_ip6(net.id) ip_new = Ipv6() ip_available = ip_available.split(':') ip_new.block1 = ip_available[0] ip_new.block2 = ip_available[1] ip_new.block3 = ip_available[2] ip_new.block4 = ip_available[3] ip_new.block5 = ip_available[4] ip_new.block6 = ip_available[5] ip_new.block7 = ip_available[6] ip_new.block8 = ip_available[7] ip_new.description = name for env_equipment in net.vlan.ambiente.equipamentoambiente_set.all( ): equipment = env_equipment.equipamento if equipment.tipo_equipamento == TipoEquipamento.get_tipo_balanceador( ): if equipment.id not in list_ips_equips: list_ips_equips.append(equipment.id) if ip_new.id is None: ip_new.save_ipv6( equipment.id, user, net) else: new_ip_equip = Ipv6Equipament() new_ip_equip.ip = ip_new new_ip_equip.equipamento = equipment new_ip_equip.save() balanceador_found_flag = True if not balanceador_found_flag: cont_balanceador_not_found = cont_balanceador_not_found + \ 1 else: break if cont_balanceador_not_found == len_network: raise_not_found_balanceamento = True raise IpNotAvailableError( None, 'Não há ipv6 disponivel para as redes associadas com o ' 'Ambiente Vip: %s - %s - %s, pois não existe equipamentos ' 'do Tipo Balanceador nessas redes.' % (evip.finalidade_txt, evip.cliente_txt, evip.ambiente_p44_txt)) except (IpNotAvailableError, IpRangeAlreadyAssociation), e: cont_balanceador_not_found = cont_balanceador_not_found + 1 if raise_not_found_balanceamento: raise IpNotAvailableError(None, e.message) elif len_network == cont_network: raise IpNotAvailableError( None, 'Não há ipv6 disponivel para as redes associdas com o ' 'Ambiente Vip: %s - %s - %s' % (evip.finalidade_txt, evip.cliente_txt, evip.ambiente_p44_txt)) transaction.commit() return self.response( dumps_networkapi({'ip': model_to_dict(ip_new)})) except NetworkNotInEvip, e: return self.response_error(321, 'ipv6')