def handle_delete(self, request, user, *args, **kwargs): """Treat DELETE requests to remove IP and Equipment relationship. URL: ip/<id_ip>/equipamento/<id_equipamento>/$ """ try: ip_id = kwargs.get('id_ip') equip_id = kwargs.get('id_equipamento') 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) 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) Ip.get_by_pk(ip_id) Equipamento.get_by_pk(equip_id) with distributedlock(LOCK_IP_EQUIPMENT % (ip_id, equip_id)): ipv4 = Ip.get_by_pk(ip_id) equipament = Equipamento.get_by_pk(equip_id) # Delete vlan's cache destroy_cache_function([ipv4]) # delete equipment's cache destroy_cache_function([equip_id], True) server_pool_member_list = ServerPoolMember.objects.filter( ip=ipv4) if server_pool_member_list.count() != 0: # IP associated with Server Pool server_pool_name_list = set() for member in server_pool_member_list: item = '{}: {}'.format( member.server_pool.id, member.server_pool.identifier) server_pool_name_list.add(item) server_pool_name_list = list(server_pool_name_list) server_pool_identifiers = ', '.join(server_pool_name_list) raise IpCantRemoveFromServerPool({'ip': mount_ipv4_string(ipv4), 'equip_name': equipament.nome, 'server_pool_identifiers': server_pool_identifiers}, 'Ipv4 não pode ser disassociado do equipamento %s porque ele está sendo utilizando nos Server Pools (id:identifier) %s' % (equipament.nome, server_pool_identifiers)) remove_ip_equipment(ip_id, equip_id, user) return self.response(dumps_networkapi({})) except IpCantRemoveFromServerPool, e: return self.response_error(385, e.cause.get('ip'), e.cause.get('equip_name'), e.cause.get('server_pool_identifiers'))
def handle_put(self, request, user, *args, **kwargs): """Trata as requisições de PUT para alterar um grupo de equipamento. URL: egrupo/<id_grupo>/ """ try: egroup_id = kwargs.get('id_grupo') if not is_valid_int_greater_zero_param(egroup_id): self.log.error( u'The egroup_id parameter is not a valid value: %s.', egroup_id) raise InvalidValueError(None, 'egroup_id', egroup_id) egrp = EGrupo.get_by_pk(egroup_id) if not has_perm(user, AdminPermission.EQUIPMENT_GROUP_MANAGEMENT, AdminPermission.WRITE_OPERATION): return self.not_authorized() xml_map, attrs_map = loads(request.raw_post_data) self.log.debug('XML_MAP: %s', xml_map) networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error( 3, u'Não existe valor para a tag networkapi do XML de requisição.' ) egroup_map = networkapi_map.get('grupo') if egroup_map is None: return self.response_error( 3, u'Não existe valor para a tag grupo do XML de requisição.') name = egroup_map.get('nome') if not is_valid_string_maxsize(name, 100): self.log.error(u'Parameter name is invalid. Value: %s', name) raise InvalidValueError(None, 'name', name) with distributedlock(LOCK_GROUP_EQUIPMENT % egroup_id): # Destroy equipment's cache equip_id_list = [] for equipament in egrp.equipamento_set.all(): equip_id_list.append(equipament.id) destroy_cache_function(equip_id_list, True) EGrupo.update(user, egroup_id, nome=name) 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): """Trata as requisições de PUT para alterar um grupo de equipamento. URL: egrupo/<id_grupo>/ """ try: egroup_id = kwargs.get('id_grupo') if not is_valid_int_greater_zero_param(egroup_id): self.log.error( u'The egroup_id parameter is not a valid value: %s.', egroup_id) raise InvalidValueError(None, 'egroup_id', egroup_id) egrp = EGrupo.get_by_pk(egroup_id) if not has_perm(user, AdminPermission.EQUIPMENT_GROUP_MANAGEMENT, AdminPermission.WRITE_OPERATION): return self.not_authorized() xml_map, attrs_map = loads(request.raw_post_data) self.log.debug('XML_MAP: %s', xml_map) networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error(3, u'Não existe valor para a tag networkapi do XML de requisição.') egroup_map = networkapi_map.get('grupo') if egroup_map is None: return self.response_error(3, u'Não existe valor para a tag grupo do XML de requisição.') name = egroup_map.get('nome') if not is_valid_string_maxsize(name, 100): self.log.error(u'Parameter name is invalid. Value: %s', name) raise InvalidValueError(None, 'name', name) with distributedlock(LOCK_GROUP_EQUIPMENT % egroup_id): # Destroy equipment's cache equip_id_list = [] for equipament in egrp.equipamento_set.all(): equip_id_list.append(equipament.id) destroy_cache_function(equip_id_list, True) EGrupo.update(user, egroup_id, nome=name) return self.response(dumps_networkapi({})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_delete(self, request, user, *args, **kwargs): """Trata requisições DELETE para remover um Ambiente. URL: ambiente/<id_ambiente>/ """ try: environment_id = kwargs.get('id_ambiente') # Valid ID Environment 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) if not has_perm(user, AdminPermission.ENVIRONMENT_MANAGEMENT, AdminPermission.WRITE_OPERATION): return self.not_authorized() with distributedlock(LOCK_ENVIRONMENT % environment_id): # Delete vlan's cache key_list_db = Vlan.objects.filter(ambiente__pk=environment_id) key_list = [] for key in key_list_db: key_list.append(key.id) destroy_cache_function(key_list) # Destroy equipment's cache equip_id_list = [] envr = Ambiente.get_by_pk(environment_id) for equipment in envr.equipamentoambiente_set.all(): equip_id_list.append(equipment.equipamento_id) destroy_cache_function(equip_id_list, True) Ambiente.remove(user, environment_id) return self.response(dumps_networkapi({})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_delete(self, request, user, *args, **kwargs): """Trata requisições DELETE para remover um Ambiente. URL: ambiente/<id_ambiente>/ """ try: environment_id = kwargs.get('id_ambiente') # Valid ID Environment 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) if not has_perm(user, AdminPermission.ENVIRONMENT_MANAGEMENT, AdminPermission.WRITE_OPERATION): return self.not_authorized() with distributedlock(LOCK_ENVIRONMENT % environment_id): # Delete vlan's cache key_list_db = Vlan.objects.filter(ambiente__pk=environment_id) key_list = [] for key in key_list_db: key_list.append(key.id) destroy_cache_function(key_list) # Destroy equipment's cache equip_id_list = [] envr = Ambiente.get_by_pk(environment_id) for equipment in envr.equipamentoambiente_set.all(): equip_id_list.append(equipment.equipamento_id) destroy_cache_function(equip_id_list, True) Ambiente.remove(user, environment_id) return self.response(dumps_networkapi({})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def criar_rede_ipv6(user, tipo_rede, variablestochangecore1, vlan, active=1): tiporede = TipoRede() net_id = tiporede.get_by_name(tipo_rede) network_type = tiporede.get_by_pk(net_id.id) network_ip = NetworkIPv6() network_ip.vlan = vlan network_ip.network_type = network_type network_ip.ambient_vip = None network_ip.active = active network_ip.block = variablestochangecore1.get('REDE_MASK') while str(variablestochangecore1.get('REDE_IP')).endswith(':'): variablestochangecore1['REDE_IP'] = variablestochangecore1[ 'REDE_IP'][:-1] while str(variablestochangecore1.get('NETMASK')).endswith(':'): variablestochangecore1['NETMASK'] = variablestochangecore1[ 'NETMASK'][:-1] len_ip_ipv6 = len(str(variablestochangecore1.get('REDE_IP')).split(':')) len_mask = len(str(variablestochangecore1.get('NETMASK')).split(':')) while (8 - len_ip_ipv6 > 0): # 8-6=2--8-7=1--8-8=0 len_ip_ipv6 = len_ip_ipv6 + 1 variablestochangecore1['REDE_IP'] = variablestochangecore1.get( 'REDE_IP') + ':0' while (8 - len_mask > 0): len_mask = len_mask + 1 variablestochangecore1['NETMASK'] = variablestochangecore1.get( 'NETMASK') + ':0' 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( variablestochangecore1.get('REDE_IP')).split(':') 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( variablestochangecore1.get('NETMASK')).split(':') destroy_cache_function([vlan.id]) network_ip.save() return network_ip
def handle_delete(self, request, user, *args, **kwargs): """Trata requisições de DELETE para remover um equipamento. URL: /equipamento/id/ """ try: equipment_id = kwargs.get('id_equip') if not is_valid_int_greater_zero_param(equipment_id): self.log.error( u'The equipment_id parameter is not a valid value: %s.', equipment_id) raise InvalidValueError(None, 'equipment_id', equipment_id) equip = Equipamento.get_by_pk(equipment_id) with distributedlock(LOCK_EQUIPMENT % equipment_id): ip_equipamento_list = IpEquipamento.objects.filter( equipamento=equipment_id) ip6_equipamento_list = Ipv6Equipament.objects.filter( equipamento=equipment_id) # Delete vlan's cache key_list = [] for eq in ip_equipamento_list: vlan = eq.ip.networkipv4.vlan vlan_id = vlan.id key_list.append(vlan_id) for eq in ip6_equipamento_list: vlan = eq.ip.networkipv6.vlan vlan_id = vlan.id key_list.append(vlan_id) destroy_cache_function(key_list) remove_equipment(equipment_id, user) return self.response(dumps_networkapi({})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def inserir_equip(user, variablestochangecore, rede_id): ip = Ip() ip.descricao = None ip.oct1, ip.oct2, ip.oct3, ip.oct4 = str(variablestochangecore["IPCORE"]).split('.') equip = Equipamento.get_by_name(variablestochangecore["EQUIP_NAME"]) rede = NetworkIPv4.get_by_pk(rede_id) ip.save_ipv4(equip.id, user, rede) if ip.id is None: raise RackAplError (None, None, "Erro ao inserir os equipamentos") # Delete vlan's cache destroy_cache_function([rede.vlan_id]) list_id_equip = [] list_id_equip.append(equip.id) destroy_cache_function(list_id_equip, True) return 0
def handle_delete(self, request, user, *args, **kwargs): '''Trata requisições de DELETE para remover um equipamento. URL: /equipamento/id/ ''' try: equipment_id = kwargs.get('id_equip') if not is_valid_int_greater_zero_param(equipment_id): self.log.error( u'The equipment_id parameter is not a valid value: %s.', equipment_id) raise InvalidValueError(None, 'equipment_id', equipment_id) equip = Equipamento.get_by_pk(equipment_id) with distributedlock(LOCK_EQUIPMENT % equipment_id): ip_equipamento_list = IpEquipamento.objects.filter( equipamento=equipment_id) ip6_equipamento_list = Ipv6Equipament.objects.filter( equipamento=equipment_id) # Delete vlan's cache key_list = [] for eq in ip_equipamento_list: vlan = eq.ip.networkipv4.vlan vlan_id = vlan.id key_list.append(vlan_id) for eq in ip6_equipamento_list: vlan = eq.ip.networkipv6.vlan vlan_id = vlan.id key_list.append(vlan_id) destroy_cache_function(key_list) remove_equipment(equipment_id, user) return self.response(dumps_networkapi({})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def criar_rede(user, tipo_rede, variablestochangecore1, vlan, active=1): tiporede = TipoRede() net_id = tiporede.get_by_name(tipo_rede) network_type = tiporede.get_by_pk(net_id.id) network_ip = NetworkIPv4() network_ip.oct1, network_ip.oct2, network_ip.oct3, network_ip.oct4 = str(variablestochangecore1.get("REDE_IP")).split('.') network_ip.block = variablestochangecore1.get("REDE_MASK") network_ip.mask_oct1, network_ip.mask_oct2, network_ip.mask_oct3, network_ip.mask_oct4 = str(variablestochangecore1.get("NETMASK")).split('.') network_ip.broadcast = variablestochangecore1.get("BROADCAST") network_ip.vlan = vlan network_ip.network_type = network_type network_ip.ambient_vip = None network_ip.active = active destroy_cache_function([vlan.id]) network_ip.save() return network_ip
def inserir_equip(user, variablestochangecore, rede_id): ip = Ip() ip.descricao = None ip.oct1, ip.oct2, ip.oct3, ip.oct4 = str( variablestochangecore['IPCORE']).split('.') equip = Equipamento.get_by_name(variablestochangecore['EQUIP_NAME']) rede = NetworkIPv4.get_by_pk(rede_id) ip.save_ipv4(equip.id, user, rede) if ip.id is None: raise RackAplError(None, None, 'Erro ao inserir os equipamentos') # Delete vlan's cache destroy_cache_function([rede.vlan_id]) list_id_equip = [] list_id_equip.append(equip.id) destroy_cache_function(list_id_equip, True) return 0
def criar_rede(user, tipo_rede, variablestochangecore1, vlan, active=1): tiporede = TipoRede() net_id = tiporede.get_by_name(tipo_rede) network_type = tiporede.get_by_pk(net_id.id) network_ip = NetworkIPv4() network_ip.oct1, network_ip.oct2, network_ip.oct3, network_ip.oct4 = str( variablestochangecore1.get('REDE_IP')).split('.') network_ip.block = variablestochangecore1.get('REDE_MASK') network_ip.mask_oct1, network_ip.mask_oct2, network_ip.mask_oct3, network_ip.mask_oct4 = str( variablestochangecore1.get('NETMASK')).split('.') network_ip.broadcast = variablestochangecore1.get('BROADCAST') network_ip.vlan = vlan network_ip.network_type = network_type network_ip.ambient_vip = None network_ip.active = active destroy_cache_function([vlan.id]) network_ip.save() return network_ip
def criar_rede_ipv6(user, tipo_rede, variablestochangecore1, vlan, active=1): tiporede = TipoRede() net_id = tiporede.get_by_name(tipo_rede) network_type = tiporede.get_by_pk(net_id.id) network_ip = NetworkIPv6() network_ip.vlan = vlan network_ip.network_type = network_type network_ip.ambient_vip = None network_ip.active = active network_ip.block = variablestochangecore1.get("REDE_MASK") while str(variablestochangecore1.get("REDE_IP")).endswith(":"): variablestochangecore1['REDE_IP'] = variablestochangecore1['REDE_IP'][:-1] while str(variablestochangecore1.get("NETMASK")).endswith(":"): variablestochangecore1['NETMASK'] = variablestochangecore1['NETMASK'][:-1] len_ip_ipv6 = len(str(variablestochangecore1.get("REDE_IP")).split(':')) len_mask = len(str(variablestochangecore1.get("NETMASK")).split(':')) while(8-len_ip_ipv6>0):#8-6=2--8-7=1--8-8=0 len_ip_ipv6 = len_ip_ipv6 + 1 variablestochangecore1['REDE_IP'] = variablestochangecore1.get("REDE_IP")+":0" while(8-len_mask>0): len_mask = len_mask + 1 variablestochangecore1['NETMASK'] = variablestochangecore1.get("NETMASK")+":0" 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(variablestochangecore1.get("REDE_IP")).split(':') 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(variablestochangecore1.get("NETMASK")).split(':') destroy_cache_function([vlan.id]) network_ip.save() return network_ip
def handle_delete(self, request, user, *args, **kwargs): """Handles DELETE requests to deallocate all relationships between NetworkIPv4. URL: network/ipv4/<id_network_ipv4>/deallocate/ """ self.log.info('Deallocate all relationships between NetworkIPv4.') 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 URL param network_ipv4_id = kwargs.get('id_network_ipv4') # Valid NetworkIpv4 ID if not is_valid_int_greater_zero_param(network_ipv4_id): self.log.error( u'Parameter id_network_ipv4 is invalid. Value: %s.', network_ipv4_id) raise InvalidValueError( None, 'id_network_ipv4', network_ipv4_id) # Existing NetworkIpv4 ID network_ipv4 = NetworkIPv4().get_by_pk(network_ipv4_id) for ipv4 in network_ipv4.ip_set.all(): server_pool_member_list = ServerPoolMember.objects.filter( ip=ipv4) if server_pool_member_list.count() != 0: # IP associated with Server Pool server_pool_name_list = set() for member in server_pool_member_list: item = '{}: {}'.format( member.server_pool.id, member.server_pool.identifier) server_pool_name_list.add(item) server_pool_name_list = list(server_pool_name_list) server_pool_identifiers = ', '.join(server_pool_name_list) ip_formated = mount_ipv4_string(ipv4) network_ipv4_ip = mount_ipv4_string(network_ipv4) raise IpCantRemoveFromServerPool({'ip': ip_formated, 'network_ip': network_ipv4_ip, 'server_pool_identifiers': server_pool_identifiers}, 'Não foi possível excluir a rede %s pois o ip %s contido nela esta sendo usado nos Server Pools (id:identifier) %s' % (network_ipv4_ip, ip_formated, server_pool_identifiers)) with distributedlock(LOCK_NETWORK_IPV4 % network_ipv4_id): destroy_cache_function([network_ipv4.vlan_id]) key_list_eqs = Equipamento.objects.filter( ipequipamento__ip__networkipv4=network_ipv4).values_list('id', flat=True) destroy_cache_function(key_list_eqs, True) # Business Rules # Remove NetworkIPv4 (will remove all relationships by cascade) locks_used = [LOCK_NETWORK_IPV4 % network_ipv4_id] network_ipv4.delete_v3(locks_used) # Return nothing return self.response(dumps_networkapi({})) except IpCantRemoveFromServerPool, e: return self.response_error(386, e.cause.get('network_ip'), e.cause.get('ip'), e.cause.get('server_pool_identifiers'))
def handle_post(self, request, user, *args, **kwargs): """Handles POST requests to add an IP and associate it to an equipment. URL: ipv4/save/ """ self.log.info('Add an IP and associate it to an equipment') 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) 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 equip_id = ip_map.get('id_equip') network_ipv4_id = ip_map.get('id_net') description = ip_map.get('descricao') ip4 = ip_map.get('ip4') # Valid equip_id if not is_valid_int_greater_zero_param(equip_id): self.log.error( u'Parameter equip_id is invalid. Value: %s.', equip_id) raise InvalidValueError(None, 'equip_id', equip_id) # Valid network_ipv4_id if not is_valid_int_greater_zero_param(network_ipv4_id): self.log.error( u'Parameter network_ipv4_id is invalid. Value: %s.', network_ipv4_id) raise InvalidValueError( None, 'network_ipv4_id', network_ipv4_id) # Valid ip size if not is_valid_string_maxsize(ip4, 15): self.log.error(u'Parameter ip4 is invalid. Value: %s.', ip4) raise InvalidValueError(None, 'ip4', ip4) # Description can NOT be greater than 100 if description is not None: if not is_valid_string_maxsize(description, 100) or not is_valid_string_minsize(description, 3): self.log.error( u'Parameter description is invalid. Value: %s.', description) raise InvalidValueError(None, 'description', description) # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION, None, equip_id, AdminPermission.EQUIP_WRITE_OPERATION): raise UserNotAuthorizedError( None, u'User does not have permission to perform the operation.') # Business Rules # New IP ip = Ip() net = NetworkIPv4.get_by_pk(network_ipv4_id) with distributedlock(LOCK_NETWORK_IPV4 % network_ipv4_id): # se Houver erro no ip informado para retorna-lo na mensagem ip_error = ip4 # verificação se foi passado algo errado no ip ip4 = ip4.split('.') for oct in ip4: if not is_valid_int_param(oct): raise InvalidValueError(None, 'ip4', ip_error) # raise IndexError # Ip passado de forma invalida if len(ip4) is not 4: raise IndexError ip.descricao = description ip.oct1 = ip4[0] ip.oct2 = ip4[1] ip.oct3 = ip4[2] ip.oct4 = ip4[3] equip = Equipamento.get_by_pk(equip_id) listaVlansDoEquip = [] for ipequip in equip.ipequipamento_set.all(): vlan = ipequip.ip.networkipv4.vlan if vlan not in listaVlansDoEquip: listaVlansDoEquip.append(vlan) for ipequip in equip.ipv6equipament_set.all(): vlan = ipequip.ip.networkipv6.vlan if vlan not in listaVlansDoEquip: listaVlansDoEquip.append(vlan) vlan_atual = net.vlan vlan_aux = None ambiente_aux = None for vlan in listaVlansDoEquip: if vlan.num_vlan == vlan_atual.num_vlan: if vlan.id != vlan_atual.id: # Filter case 3 - Vlans with same number cannot # share equipments ## flag_vlan_error = False # Filter testing if vlan.ambiente.filter is None or vlan_atual.ambiente.filter is None: flag_vlan_error = True else: # Test both environment's filters tp_equip_list_one = list() for fet in FilterEquipType.objects.filter(filter=vlan_atual.ambiente.filter.id): tp_equip_list_one.append(fet.equiptype) tp_equip_list_two = list() for fet in FilterEquipType.objects.filter(filter=vlan.ambiente.filter.id): tp_equip_list_two.append(fet.equiptype) if equip.tipo_equipamento not in tp_equip_list_one or equip.tipo_equipamento not in tp_equip_list_two: flag_vlan_error = True # Filter case 3 - end # if flag_vlan_error: ambiente_aux = vlan.ambiente vlan_aux = vlan nome_ambiente = '%s - %s - %s' % ( vlan.ambiente.divisao_dc.nome, vlan.ambiente.ambiente_logico.nome, vlan.ambiente.grupo_l3.nome) raise VlanNumberNotAvailableError(None, """O ip informado não pode ser cadastrado, pois o equipamento %s, faz parte do ambiente %s (id %s), que possui a Vlan de id %s, que também possui o número %s, e não é permitido que vlans que compartilhem o mesmo ambiente por meio de equipamentos, possuam o mesmo número, edite o número de uma das Vlans ou adicione um filtro no ambiente para efetuar o cadastro desse IP no Equipamento Informado. """ % (equip.nome, nome_ambiente, ambiente_aux.id, vlan_aux.id, vlan_atual.num_vlan)) # Persist ip.save_ipv4(equip_id, user, net) list_ip = [] lequips = [] if ip.id is None: ip = Ip.get_by_octs_and_net( ip.oct1, ip.oct2, ip.oct3, ip.oct4, net.id) equips = IpEquipamento.list_by_ip(ip.id) ip_maps = dict() ip_maps['id'] = ip.id ip_maps['oct1'] = ip.oct1 ip_maps['oct2'] = ip.oct2 ip_maps['oct3'] = ip.oct3 ip_maps['oct4'] = ip.oct4 ip_maps['descricao'] = ip.descricao list_id_equip = [] for equip in equips: list_id_equip.append(equip.equipamento.id) equip = Equipamento.get_by_pk(equip.equipamento.id) lequips.append(model_to_dict(equip)) ip_maps['equipamento'] = lequips list_ip.append(ip_maps) network_map = dict() network_map['ip'] = list_ip # Delete vlan's cache destroy_cache_function([net.vlan_id]) # Delete equipment's cache destroy_cache_function(list_id_equip, True) return self.response(dumps_networkapi(network_map)) except IpRangeAlreadyAssociation, e: return self.response_error(347)
def handle_put(self, request, user, *args, **kwargs): """Trata requisições PUT para alterar um Ambiente. URL: ambiente/<id_ambiente>/ """ try: environment_id = kwargs.get('id_ambiente') 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) if not has_perm(user, AdminPermission.ENVIRONMENT_MANAGEMENT, AdminPermission.WRITE_OPERATION): return self.not_authorized() xml_map, attrs_map = loads(request.raw_post_data) self.log.debug('XML_MAP: %s', xml_map) networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error(3, u'Não existe valor para a tag networkapi do XML de requisição.') environment_map = networkapi_map.get('ambiente') if environment_map is None: return self.response_error(3, u'Não existe valor para a tag ambiente do XML de requisição.') l3_group_id = environment_map.get('id_grupo_l3') if not is_valid_int_greater_zero_param(l3_group_id): self.log.error( u'The l3_group_id parameter is not a valid value: %s.', l3_group_id) raise InvalidValueError(None, 'l3_group_id', l3_group_id) else: l3_group_id = int(l3_group_id) GrupoL3.get_by_pk(l3_group_id) logic_environment_id = environment_map.get('id_ambiente_logico') if not is_valid_int_greater_zero_param(logic_environment_id): self.log.error( u'The logic_environment_id parameter is not a valid value: %s.', logic_environment_id) raise InvalidValueError( None, 'logic_environment_id', logic_environment_id) else: logic_environment_id = int(logic_environment_id) AmbienteLogico.get_by_pk(logic_environment_id) dc_division_id = environment_map.get('id_divisao') if not is_valid_int_greater_zero_param(dc_division_id): self.log.error( u'The dc_division_id parameter is not a valid value: %s.', dc_division_id) raise InvalidValueError(None, 'dc_division_id', dc_division_id) else: dc_division_id = int(dc_division_id) DivisaoDc.get_by_pk(dc_division_id) link = environment_map.get('link') if not is_valid_string_maxsize(link, 200, False): self.log.error(u'Parameter link is invalid. Value: %s', link) raise InvalidValueError(None, 'link', link) vrf = environment_map.get('vrf') if not is_valid_string_maxsize(link, 100, False): self.log.error(u'Parameter vrf is invalid. Value: %s', vrf) raise InvalidValueError(None, 'vrf', vrf) filter_id = environment_map.get('id_filter') if filter_id is not None: if not is_valid_int_greater_zero_param(filter_id): self.log.error( u'Parameter filter_id is invalid. Value: %s.', filter_id) raise InvalidValueError(None, 'filter_id', filter_id) filter_id = int(filter_id) # Filter must exist Filter.get_by_pk(filter_id) acl_path = environment_map.get('acl_path') if not is_valid_string_maxsize(acl_path, 250, False): self.log.error( u'Parameter acl_path is invalid. Value: %s', acl_path) raise InvalidValueError(None, 'acl_path', acl_path) ipv4_template = environment_map.get('ipv4_template') if not is_valid_string_maxsize(ipv4_template, 250, False): self.log.error( u'Parameter ipv4_template is invalid. Value: %s', ipv4_template) raise InvalidValueError(None, 'ipv4_template', ipv4_template) ipv6_template = environment_map.get('ipv6_template') if not is_valid_string_maxsize(ipv6_template, 250, False): self.log.error( u'Parameter ipv6_template is invalid. Value: %s', ipv6_template) raise InvalidValueError(None, 'ipv6_template', ipv6_template) max_num_vlan_1 = environment_map.get('max_num_vlan_1') min_num_vlan_1 = environment_map.get('min_num_vlan_1') max_num_vlan_2 = environment_map.get('max_num_vlan_2') min_num_vlan_2 = environment_map.get('min_num_vlan_2') # validate max_num_vlan_1 and min_num_vlan_1 if (max_num_vlan_1 is not None and min_num_vlan_1 is None) or (min_num_vlan_1 is not None and max_num_vlan_1 is None): self.log.error( u'Parameters min_num_vlan_1, max_num_vlan_1 is invalid. Values: %s, %s', (min_num_vlan_1, max_num_vlan_1)) raise InvalidValueError( None, 'min_num_vlan_1, max_num_vlan_1', min_num_vlan_1 + ',' + max_num_vlan_1) if max_num_vlan_1 is not None and min_num_vlan_1 is not None: max_num_vlan_1 = int(max_num_vlan_1) min_num_vlan_1 = int(min_num_vlan_1) if max_num_vlan_1 < 1 or min_num_vlan_1 < 1: self.log.error( u'Parameters min_num_vlan_1, max_num_vlan_1 is invalid. Values: %s, %s', (min_num_vlan_1, max_num_vlan_1)) raise InvalidValueError( None, 'min_num_vlan_1, max_num_vlan_1', min_num_vlan_1 + ',' + max_num_vlan_1) if max_num_vlan_1 <= min_num_vlan_1: self.log.error( u'Parameters min_num_vlan_1, max_num_vlan_1 is invalid. Values: %s, %s', (min_num_vlan_1, max_num_vlan_1)) raise InvalidValueError( None, 'min_num_vlan_1, max_num_vlan_1', min_num_vlan_1 + ',' + max_num_vlan_1) else: max_num_vlan_1 = max_num_vlan_2 min_num_vlan_1 = min_num_vlan_2 # validate max_num_vlan_1 and min_num_vlan_1 # validate max_num_vlan_2 and min_num_vlan_2 if (max_num_vlan_2 is not None and min_num_vlan_2 is None) or (min_num_vlan_2 is not None and max_num_vlan_2 is None): self.log.error( u'Parameters min_num_vlan_2, max_num_vlan_2 is invalid. Values: %s, %s', (min_num_vlan_2, max_num_vlan_2)) raise InvalidValueError( None, 'min_num_vlan_2, max_num_vlan_2', min_num_vlan_2 + ',' + max_num_vlan_1) if max_num_vlan_2 is not None and min_num_vlan_2 is not None: max_num_vlan_2 = int(max_num_vlan_2) min_num_vlan_2 = int(min_num_vlan_2) max_num_vlan_1 = int(max_num_vlan_1) min_num_vlan_1 = int(min_num_vlan_1) if max_num_vlan_2 < 1 or min_num_vlan_2 < 1: self.log.error( u'Parameters min_num_vlan_2, max_num_vlan_2 is invalid. Values: %s, %s', (min_num_vlan_2, max_num_vlan_2)) raise InvalidValueError( None, 'min_num_vlan_2, max_num_vlan_2', min_num_vlan_2 + ',' + max_num_vlan_1) if max_num_vlan_2 <= min_num_vlan_2: self.log.error( u'Parameters min_num_vlan_2, max_num_vlan_2 is invalid. Values: %s, %s', (min_num_vlan_2, max_num_vlan_2)) raise InvalidValueError( None, 'min_num_vlan_2, max_num_vlan_2', min_num_vlan_2 + ',' + max_num_vlan_1) else: max_num_vlan_2 = max_num_vlan_1 min_num_vlan_2 = min_num_vlan_1 # validate max_num_vlan_2 and min_num_vlan_2 with distributedlock(LOCK_ENVIRONMENT % environment_id): # Delete vlan's cache key_list_db = Vlan.objects.filter(ambiente__pk=environment_id) key_list = [] for key in key_list_db: key_list.append(key.id) destroy_cache_function(key_list) # Destroy equipment's cache equip_id_list = [] envr = Ambiente.get_by_pk(environment_id) for equipment in envr.equipamentoambiente_set.all(): equip_id_list.append(equipment.equipamento_id) destroy_cache_function(equip_id_list, True) Ambiente.update(user, environment_id, grupo_l3_id=l3_group_id, ambiente_logico_id=logic_environment_id, divisao_dc_id=dc_division_id, filter_id=filter_id, link=link, vrf=vrf, acl_path=fix_acl_path(acl_path), ipv4_template=ipv4_template, ipv6_template=ipv6_template, max_num_vlan_1=max_num_vlan_1, min_num_vlan_1=min_num_vlan_1, max_num_vlan_2=max_num_vlan_2, min_num_vlan_2=min_num_vlan_2) return self.response(dumps_networkapi({})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_delete(self, request, user, *args, **kwargs): """Treat DELETE requests to remove the relationship between IPv6 and equipment. URL: ipv6/<id_ipv6>/equipment/<id_equip>/remove/ """ from networkapi.ip.models import Ipv6, Ipv6Equipament, IpNotFoundError, IpEquipmentNotFoundError, IpEquipamentoDuplicatedError, IpError, IpCantBeRemovedFromVip, IpEquipCantDissociateFromVip, \ IpCantRemoveFromServerPool from networkapi.equipamento.models import Equipamento, EquipamentoNotFoundError, EquipamentoError self.log.info('Remove an IPv6 to a equipament.') try: ipv6_id = kwargs.get('id_ipv6') equip_id = kwargs.get('id_equip') # Valid Ipv6 ID if not is_valid_int_greater_zero_param(ipv6_id): self.log.error( u'The id_ipv6 parameter is not a valid value: %s.', ipv6_id) raise InvalidValueError(None, 'id_ipv6', ipv6_id) # Valid Ipv6 ID if not is_valid_int_greater_zero_param(equip_id): self.log.error( u'The id_equip parameter is not a valid value: %s.', equip_id) raise InvalidValueError(None, 'id_equip', equip_id) # Find Equipament by ID to check if it exist Equipamento().get_by_pk(equip_id) # Find IPv6 by ID to check if it exist Ipv6().get_by_pk(ipv6_id) with distributedlock(LOCK_IPV6 % ipv6_id): # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION, None, equip_id, AdminPermission.EQUIP_WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) ip = Ipv6().get_by_pk(ipv6_id) equipament = Equipamento().get_by_pk(equip_id) # Delete vlan's cache destroy_cache_function([ip.networkipv6.vlan_id]) # delete equipment's cache destroy_cache_function([equip_id], True) # Remove Ipv6Equipament ipv6_equipament = Ipv6Equipament() server_pool_member_list = ServerPoolMember.objects.filter( ipv6=ip) if server_pool_member_list.count() != 0: # IP associated with Server Pool server_pool_name_list = set() for member in server_pool_member_list: item = '{}: {}'.format( member.server_pool.id, member.server_pool.identifier) server_pool_name_list.add(item) server_pool_name_list = list(server_pool_name_list) server_pool_identifiers = ', '.join(server_pool_name_list) raise IpCantRemoveFromServerPool({'ip': mount_ipv6_string(ip), 'equip_name': equipament.nome, 'server_pool_identifiers': server_pool_identifiers}, 'Ipv6 não pode ser disassociado do equipamento %s porque ele está sendo utilizando nos Server Pools (id:identifier) %s' % (equipament.nome, server_pool_identifiers)) ipv6_equipament.remove(user, ipv6_id, equip_id) return self.response(dumps_networkapi({})) except IpCantRemoveFromServerPool, e: return self.response_error(385, e.cause.get('ip'), e.cause.get('equip_name'), e.cause.get('server_pool_identifiers'))
def handle_post(self, request, user, *args, **kwargs): '''Handles POST requests to add an IP6 and associate it to an equipment. URL: ipv6/save/ ''' self.log.info('Add an IP6 and associate it to an equipment') 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) 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 equip_id = ip_map.get('id_equip') network_ipv6_id = ip_map.get('id_net') description = ip_map.get('descricao') ip6 = ip_map.get('ip6') # Valid equip_id if not is_valid_int_greater_zero_param(equip_id): self.log.error( u'Parameter equip_id is invalid. Value: %s.', equip_id) raise InvalidValueError(None, 'equip_id', equip_id) # Valid network_ipv4_id if not is_valid_int_greater_zero_param(network_ipv6_id): self.log.error( u'Parameter network_ipv6_id is invalid. Value: %s.', network_ipv6_id) raise InvalidValueError( None, 'network_ipv6_id', network_ipv6_id) # Description can NOT be greater than 100 if not is_valid_string_maxsize(ip6, 39): self.log.error(u'Parameter ip6 is invalid. Value: %s.', ip6) raise InvalidValueError(None, 'ip6', ip6) if description is not None: if not is_valid_string_maxsize(description, 100) or not is_valid_string_minsize(description, 3): self.log.error( u'Parameter description is invalid. Value: %s.', description) raise InvalidValueError(None, 'description', description) # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION, None, equip_id, AdminPermission.EQUIP_WRITE_OPERATION): raise UserNotAuthorizedError( None, u'User does not have permission to perform the operation.') # Business Rules # New IP ipv6 = Ipv6() net = NetworkIPv6.get_by_pk(network_ipv6_id) with distributedlock(LOCK_NETWORK_IPV6 % network_ipv6_id): # Caso haja erro para retornar o ip corretamente ip_error = ip6 ip6 = ip6.split(":") # Ip informado de maneira incorreta if len(ip6) is not 8: raise InvalidValueError(None, 'ip6', ip_error) ipv6.description = description ipv6.block1 = ip6[0] ipv6.block2 = ip6[1] ipv6.block3 = ip6[2] ipv6.block4 = ip6[3] ipv6.block5 = ip6[4] ipv6.block6 = ip6[5] ipv6.block7 = ip6[6] ipv6.block8 = ip6[7] # Persist equip = Equipamento.get_by_pk(equip_id) listaVlansDoEquip = [] for ipequip in equip.ipv6equipament_set.all(): vlan = ipequip.ip.networkipv6.vlan if vlan not in listaVlansDoEquip: listaVlansDoEquip.append(vlan) for ipequip in equip.ipequipamento_set.all(): vlan = ipequip.ip.networkipv4.vlan if vlan not in listaVlansDoEquip: listaVlansDoEquip.append(vlan) vlan_atual = net.vlan ambiente_aux = None vlan_aux = None for vlan in listaVlansDoEquip: if vlan.num_vlan == vlan_atual.num_vlan: if vlan.id != vlan_atual.id: # Filter case 3 - Vlans with same number cannot # share equipments ## flag_vlan_error = False # Filter testing if vlan.ambiente.filter is None or vlan_atual.ambiente.filter is None: flag_vlan_error = True else: # Test both environment's filters tp_equip_list_one = list() for fet in FilterEquipType.objects.filter(filter=vlan_atual.ambiente.filter.id): tp_equip_list_one.append(fet.equiptype) tp_equip_list_two = list() for fet in FilterEquipType.objects.filter(filter=vlan.ambiente.filter.id): tp_equip_list_two.append(fet.equiptype) if equip.tipo_equipamento not in tp_equip_list_one or equip.tipo_equipamento not in tp_equip_list_two: flag_vlan_error = True ## Filter case 3 - end ## if flag_vlan_error: vlan_aux = vlan ambiente_aux = vlan.ambiente nome_ambiente = "%s - %s - %s" % ( vlan.ambiente.divisao_dc.nome, vlan.ambiente.ambiente_logico.nome, vlan.ambiente.grupo_l3.nome) raise VlanNumberNotAvailableError(None, '''O ip informado não pode ser cadastrado, pois o equipamento %s, faz parte do ambiente %s (id %s), que possui a Vlan de id %s, que também possui o número %s, e não é permitido que vlans que compartilhem o mesmo ambiente, por meio de equipamentos, possuam o mesmo número, edite o número de uma das Vlans ou adicione um filtro no ambiente para efetuar o cadastro desse IP no Equipamento Informado. ''' % (equip.nome, nome_ambiente, ambiente_aux.id, vlan_aux.id, vlan_atual.num_vlan)) ipv6.save_ipv6(equip_id, user, net) list_ip = [] lequips = list() if ipv6.id is None: ipv6 = Ipv6.get_by_blocks_and_net( ipv6.block1, ipv6.block2, ipv6.block3, ipv6.block4, ipv6.block5, ipv6.block6, ipv6.block7, ipv6.block8, net.id) equips = Ipv6Equipament.list_by_ip6(ipv6.id) ip_maps = dict() ip_maps['id'] = ipv6.id ip_maps['block1'] = ipv6.block1 ip_maps['block2'] = ipv6.block2 ip_maps['block3'] = ipv6.block3 ip_maps['block4'] = ipv6.block4 ip_maps['block5'] = ipv6.block5 ip_maps['block6'] = ipv6.block6 ip_maps['block7'] = ipv6.block7 ip_maps['block8'] = ipv6.block8 ip_maps['descricao'] = ipv6.description list_id_equip = [] for equip in equips: list_id_equip.append(equip.equipamento.id) equip = Equipamento.get_by_pk(equip.equipamento.id) lequips.append(model_to_dict(equip)) ip_maps['equipamento'] = lequips list_ip.append(ip_maps) network_map = dict() network_map['ipv6'] = list_ip # Delete vlan's cache destroy_cache_function([net.vlan_id]) # Delete equipment's cache destroy_cache_function(list_id_equip, True) return self.response(dumps_networkapi(network_map)) except IpRangeAlreadyAssociation, e: return self.response_error(347)
def handle_post(self, request, user, *args, **kwargs): """Treat POST requests to edit a vlan URL: vlan/edit/ """ try: network_version = kwargs.get('network_version') # 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_id = vlan_map.get('environment_id') number = vlan_map.get('number') name = vlan_map.get('name') acl_file = vlan_map.get('acl_file') acl_file_v6 = vlan_map.get('acl_file_v6') description = vlan_map.get('description') id_vlan = vlan_map.get('vlan_id') # Valid vlan ID if not is_valid_int_greater_zero_param(id_vlan): self.log.error( u'Parameter id_vlan is invalid. Value: %s.', id_vlan) raise InvalidValueError(None, 'id_vlan', id_vlan) # Valid environment_id ID if not is_valid_int_greater_zero_param(environment_id): self.log.error( u'Parameter environment_id is invalid. Value: %s.', environment_id) raise InvalidValueError(None, 'environment_id', environment_id) # Valid number of Vlan if not is_valid_int_greater_zero_param(number): self.log.error( u'Parameter number is invalid. Value: %s', number) raise InvalidValueError(None, 'number', number) # Valid name of Vlan if not is_valid_string_minsize(name, 3) or not is_valid_string_maxsize(name, 50): self.log.error(u'Parameter name is invalid. Value: %s', name) raise InvalidValueError(None, 'name', name) p = re.compile('^[A-Z0-9-_]+$') m = p.match(name) if not m: name = name.upper() m = p.match(name) if not m: raise InvalidValueError(None, 'name', name) # Valid description of Vlan if not is_valid_string_minsize(description, 3, False) or not is_valid_string_maxsize(description, 200, False): self.log.error( u'Parameter description is invalid. Value: %s', description) raise InvalidValueError(None, 'description', description) vlan = Vlan() vlan = vlan.get_by_pk(id_vlan) with distributedlock(LOCK_VLAN % id_vlan): # Valid acl_file Vlan if acl_file is not None: if not is_valid_string_minsize(acl_file, 3) or not is_valid_string_maxsize(acl_file, 200): self.log.error( u'Parameter acl_file is invalid. Value: %s', acl_file) raise InvalidValueError(None, 'acl_file', acl_file) p = re.compile('^[A-Z0-9-_]+$') m = p.match(acl_file) if not m: raise InvalidValueError(None, 'acl_file', acl_file) # VERIFICA SE VLAN COM MESMO ACL JA EXISTE OU NAO # commenting acl name check - issue #55 # vlan.get_vlan_by_acl(acl_file) # Valid acl_file_v6 Vlan if acl_file_v6 is not None: if not is_valid_string_minsize(acl_file_v6, 3) or not is_valid_string_maxsize(acl_file_v6, 200): self.log.error( u'Parameter acl_file_v6 is invalid. Value: %s', acl_file_v6) raise InvalidValueError( None, 'acl_file_v6', acl_file_v6) p = re.compile('^[A-Z0-9-_]+$') m = p.match(acl_file_v6) if not m: raise InvalidValueError( None, 'acl_file_v6', acl_file_v6) # VERIFICA SE VLAN COM MESMO ACL JA EXISTE OU NAO # commenting acl name check - issue #55 # vlan.get_vlan_by_acl_v6(acl_file_v6) ambiente = Ambiente() ambiente = ambiente.get_by_pk(environment_id) change_name = False change_number_environment = False redes4 = vlan.networkipv4_set.all() redes6 = vlan.networkipv6_set.all() listaIpsv4 = [] listaIpsv6 = [] listaEquips4 = [] listaEquips6 = [] for rede in redes4: for ip in rede.ip_set.all(): listaIpsv4.append(ip) for rede in redes6: for ip in rede.ipv6_set.all(): listaIpsv6.append(ip) for ip in listaIpsv4: for ipequip in ip.ipequipamento_set.all(): listaEquips4.append(ipequip.equipamento) for ip in listaIpsv6: for ipequip in ip.ipv6equipament_set.all(): listaEquips6.append(ipequip.equipamento) listaDeIps4DoEquip = [] listaDeIps6DoEquip = [] listaDeVlansDoEquip = [] for equip in listaEquips4: for ipequip in equip.ipequipamento_set.all(): ip_aux = ipequip.ip if ip_aux not in listaDeIps4DoEquip: listaDeIps4DoEquip.append(ip_aux) for equip in listaEquips6: for ipequip in equip.ipv6equipament_set.all(): ip_aux = ipequip.ip if ip_aux not in listaDeIps4DoEquip: listaDeIps6DoEquip.append(ip_aux) for ip in listaDeIps4DoEquip: vlan_aux = ip.networkipv4.vlan if vlan_aux not in listaDeVlansDoEquip: listaDeVlansDoEquip.append(vlan_aux) for ip in listaDeIps6DoEquip: vlan_aux = ip.networkipv6.vlan if vlan_aux not in listaDeVlansDoEquip: listaDeVlansDoEquip.append(vlan_aux) if vlan.nome != name: change_name = True vlan.nome = name if int(vlan.num_vlan) != int(number) or int(vlan.ambiente.id) != int(environment_id): change_number_environment = True vlan.num_vlan = number vlan.ambiente = ambiente vlan.acl_file_name = acl_file vlan.acl_file_name_v6 = acl_file_v6 vlan.descricao = description vlan_id_cache = [id_vlan] # Delete vlan's cache destroy_cache_function(vlan_id_cache) # Delete equipment's cache equip_id_list = [] for netv4 in vlan.networkipv4_set.all(): for ip in netv4.ip_set.all(): for ip_equip in ip.ipequipamento_set.all(): equip_id_list.append(ip_equip.equipamento_id) for netv6 in vlan.networkipv6_set.all(): for ip in netv6.ipv6_set.all(): for ip_equip in ip.ipv6equipament_set.all(): equip_id_list.append(ip_equip.equipamento_id) destroy_cache_function(equip_id_list, True) vlan.edit_vlan(user, change_name, change_number_environment) # Return XML return self.response(dumps_networkapi({})) except VlanACLDuplicatedError, e: return self.response_error(311, acl_file)
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') # 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.select_related().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 if net in networks: raise NetworkIPv4AddressNotAvailableError( None, u'Unavailable address to create a NetworkIPv4.') if env_vip is not None: # Find all networks related to environment vip nets = NetworkIPv4.objects.select_related().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 if net in networks: raise NetworkIpAddressNotAvailableError( None, u'Unavailable address to create a NetworkIPv4.') # # 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.select_related().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 if net in networks: raise NetworkIPv6AddressNotAvailableError( None, u'Unavailable address to create a NetworkIPv6.') if env_vip is not None: # Find all networks related to environment vip nets = NetworkIPv6.objects.select_related().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 if net in networks: raise NetworkIpAddressNotAvailableError( None, u'Unavailable address to create a NetworkIPv6.') # # 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() envs_aux = list() for env in ambiente.equipamentoambiente_set.all(): equips.append(env.equipamento) for equip in equips: for env in equip.equipamentoambiente_set.all(): if not env.ambiente_id in envs_aux: envs.append(env.ambiente) envs_aux.append(env.ambiente_id) # Check subnet's if version == IP_VERSION.IPv4[0]: expl = split(net.network.exploded, ".") else: expl = split(net.network.exploded, ":") expl.append(str(net.prefixlen)) ids_exclude = [] ids_all = [] network_ip_verify = IPNetwork(network) for env in envs: for vlan_obj in env.vlan_set.all(): ids_all.append(vlan_obj.id) is_subnet = verify_subnet( vlan_obj, network_ip_verify, version) if not is_subnet: ids_exclude.append(vlan_obj.id) else: if ambiente.filter_id == None or vlan_obj.ambiente.filter_id == None or int(vlan_obj.ambiente.filter_id) != int(ambiente.filter_id): pass else: ids_exclude.append(vlan_obj.id) # Ignore actual vlan if envs != [] and long(id_vlan) not in ids_exclude: ids_exclude.append(id_vlan) # Check if have duplicated vlan's with same net range in an # environment with shared equipment if len(ids_all) != len(ids_exclude): 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 # Persist try: # Delete vlan's cache destroy_cache_function([id_vlan]) network_ip.save(user) 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(user) for equip in list_equip_routers_ambient: IpEquipamento().create( user, ip_model.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(user) for equip in list_equip_routers_ambient: Ipv6Equipament().create( user, ipv6_model.id, equip.equipamento.id) except Exception, e: raise IpError(e, u'Error persisting Network.')
def handle_delete(self, request, user, *args, **kwargs): """Treat requests DELETE to deallocate all relationships between Vlan. URL: vlan/<id_vlan>/deallocate/ """ self.log.info("Deallocate all relationships between Vlan.") try: # 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.') raise UserNotAuthorizedError(None) # Load URL param id_vlan = kwargs.get('id_vlan') # Valid vlan id if not is_valid_int_greater_zero_param(id_vlan): self.log.error( u'The id_vlan parameter is not a valid value: %s.', 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) # Delete vlan's cache destroy_cache_function([id_vlan]) # Delete equipment's cache equip_id_list = [] for netv4 in vlan.networkipv4_set.all(): for ipv4 in netv4.ip_set.all(): server_pool_member_list = ServerPoolMember.objects.filter( ip=ipv4) if server_pool_member_list.count() != 0: # IP associated with Server Pool server_pool_name_list = set() for member in server_pool_member_list: item = '{}: {}'.format( member.server_pool.id, member.server_pool.identifier) server_pool_name_list.add(item) server_pool_name_list = list(server_pool_name_list) server_pool_identifiers = ', '.join( server_pool_name_list) ip_formated = mount_ipv4_string(ipv4) vlan_name = vlan.nome network_ip = mount_ipv4_string(netv4) raise IpCantRemoveFromServerPool( { 'ip': ip_formated, 'vlan_name': vlan_name, 'network_ip': network_ip, 'server_pool_identifiers': server_pool_identifiers }, "Não foi possível excluir a vlan %s pois ela possui a rede %s e essa rede possui o ip %s contido nela, e esse ip esta sendo usado nos Server Pools (id:identifier) %s" % (vlan_name, network_ip, ip_formated, server_pool_identifiers)) for ip_equip in ipv4.ipequipamento_set.all(): equip_id_list.append(ip_equip.equipamento_id) for netv6 in vlan.networkipv6_set.all(): for ip in netv6.ipv6_set.all(): server_pool_member_list = ServerPoolMember.objects.filter( ipv6=ip) if server_pool_member_list.count() != 0: # IP associated with Server Pool server_pool_name_list = set() for member in server_pool_member_list: item = '{}: {}'.format( member.server_pool.id, member.server_pool.identifier) server_pool_name_list.add(item) server_pool_name_list = list(server_pool_name_list) server_pool_identifiers = ', '.join( server_pool_name_list) ip_formated = mount_ipv6_string(ip) vlan_name = vlan.nome network_ip = mount_ipv6_string(netv6) raise IpCantRemoveFromServerPool( { 'ip': ip_formated, 'vlan_name': vlan_name, 'network_ip': network_ip, 'server_pool_identifiers': server_pool_identifiers }, "Não foi possível excluir a vlan %s pois ela possui a rede %s e essa rede possui o ip %s contido nela, e esse ip esta sendo usado nos Server Pools (id:identifier) %s" % (vlan_name, network_ip, ip_formated, server_pool_identifiers)) for ip_equip in ip.ipv6equipament_set.all(): equip_id_list.append(ip_equip.equipamento_id) destroy_cache_function(equip_id_list, True) with distributedlock(LOCK_VLAN % id_vlan): # Remove Vlan vlan.delete() return self.response(dumps_networkapi({})) except IpCantRemoveFromServerPool, e: return self.response_error(387, e.cause.get('vlan_name'), e.cause.get('network_ip'), e.cause.get('ip'), e.cause.get('server_pool_identifiers'))
def handle_delete(self, request, user, *args, **kwargs): """Handles DELETE requests to deallocate all relationships between NetworkIPv4. URL: network/ipv4/<id_network_ipv4>/deallocate/ """ self.log.info('Deallocate all relationships between NetworkIPv4.') 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 URL param network_ipv4_id = kwargs.get('id_network_ipv4') # Valid NetworkIpv4 ID if not is_valid_int_greater_zero_param(network_ipv4_id): self.log.error( u'Parameter id_network_ipv4 is invalid. Value: %s.', network_ipv4_id) raise InvalidValueError(None, 'id_network_ipv4', network_ipv4_id) # Existing NetworkIpv4 ID network_ipv4 = NetworkIPv4().get_by_pk(network_ipv4_id) for ipv4 in network_ipv4.ip_set.all(): server_pool_member_list = ServerPoolMember.objects.filter( ip=ipv4) if server_pool_member_list.count() != 0: # IP associated with Server Pool server_pool_name_list = set() for member in server_pool_member_list: item = '{}: {}'.format(member.server_pool.id, member.server_pool.identifier) server_pool_name_list.add(item) server_pool_name_list = list(server_pool_name_list) server_pool_identifiers = ', '.join(server_pool_name_list) ip_formated = mount_ipv4_string(ipv4) network_ipv4_ip = mount_ipv4_string(network_ipv4) raise IpCantRemoveFromServerPool( { 'ip': ip_formated, 'network_ip': network_ipv4_ip, 'server_pool_identifiers': server_pool_identifiers }, 'Não foi possível excluir a rede %s pois o ip %s contido nela esta sendo usado nos Server Pools (id:identifier) %s' % (network_ipv4_ip, ip_formated, server_pool_identifiers)) with distributedlock(LOCK_NETWORK_IPV4 % network_ipv4_id): destroy_cache_function([network_ipv4.vlan_id]) key_list_eqs = Equipamento.objects.filter( ipequipamento__ip__networkipv4=network_ipv4).values_list( 'id', flat=True) destroy_cache_function(key_list_eqs, True) # Business Rules # Remove NetworkIPv4 (will remove all relationships by cascade) locks_used = [LOCK_NETWORK_IPV4 % network_ipv4_id] network_ipv4.delete_v3(locks_used) # Return nothing return self.response(dumps_networkapi({})) except IpCantRemoveFromServerPool, e: return self.response_error(386, e.cause.get('network_ip'), e.cause.get('ip'), e.cause.get('server_pool_identifiers'))
def handle_delete(self, request, user, *args, **kwargs): '''Treat DELETE requests to remove IP and Equipment relationship. URL: ip/<id_ip>/equipamento/<id_equipamento>/$ ''' try: ip_id = kwargs.get('id_ip') equip_id = kwargs.get('id_equipamento') 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) 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) Ip.get_by_pk(ip_id) Equipamento.get_by_pk(equip_id) with distributedlock(LOCK_IP_EQUIPMENT % (ip_id, equip_id)): ipv4 = Ip.get_by_pk(ip_id) equipament = Equipamento.get_by_pk(equip_id) # Delete vlan's cache destroy_cache_function([ipv4]) # delete equipment's cache destroy_cache_function([equip_id], True) server_pool_member_list = ServerPoolMember.objects.filter( ip=ipv4) if server_pool_member_list.count() != 0: # IP associated with Server Pool server_pool_name_list = set() for member in server_pool_member_list: item = '{}: {}'.format(member.server_pool.id, member.server_pool.identifier) server_pool_name_list.add(item) server_pool_name_list = list(server_pool_name_list) server_pool_identifiers = ', '.join(server_pool_name_list) raise IpCantRemoveFromServerPool( { 'ip': mount_ipv4_string(ipv4), 'equip_name': equipament.nome, 'server_pool_identifiers': server_pool_identifiers }, "Ipv4 não pode ser disassociado do equipamento %s porque ele está sendo utilizando nos Server Pools (id:identifier) %s" % (equipament.nome, server_pool_identifiers)) remove_ip_equipment(ip_id, equip_id, user) return self.response(dumps_networkapi({})) except IpCantRemoveFromServerPool, e: return self.response_error(385, e.cause.get('ip'), e.cause.get('equip_name'), e.cause.get('server_pool_identifiers'))
def handle_delete(self, request, user, *args, **kwargs): """Treat DELETE requests to remove the relationship between IPv6 and equipment. URL: ipv6/<id_ipv6>/equipment/<id_equip>/remove/ """ from networkapi.ip.models import Ipv6, Ipv6Equipament, IpNotFoundError, IpEquipmentNotFoundError, IpEquipamentoDuplicatedError, IpError, IpCantBeRemovedFromVip, IpEquipCantDissociateFromVip, \ IpCantRemoveFromServerPool from networkapi.equipamento.models import Equipamento, EquipamentoNotFoundError, EquipamentoError self.log.info('Remove an IPv6 to a equipament.') try: ipv6_id = kwargs.get('id_ipv6') equip_id = kwargs.get('id_equip') # Valid Ipv6 ID if not is_valid_int_greater_zero_param(ipv6_id): self.log.error( u'The id_ipv6 parameter is not a valid value: %s.', ipv6_id) raise InvalidValueError(None, 'id_ipv6', ipv6_id) # Valid Ipv6 ID if not is_valid_int_greater_zero_param(equip_id): self.log.error( u'The id_equip parameter is not a valid value: %s.', equip_id) raise InvalidValueError(None, 'id_equip', equip_id) # Find Equipament by ID to check if it exist Equipamento().get_by_pk(equip_id) # Find IPv6 by ID to check if it exist Ipv6().get_by_pk(ipv6_id) with distributedlock(LOCK_IPV6 % ipv6_id): # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION, None, equip_id, AdminPermission.EQUIP_WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.' ) raise UserNotAuthorizedError(None) ip = Ipv6().get_by_pk(ipv6_id) equipament = Equipamento().get_by_pk(equip_id) # Delete vlan's cache destroy_cache_function([ip.networkipv6.vlan_id]) # delete equipment's cache destroy_cache_function([equip_id], True) # Remove Ipv6Equipament ipv6_equipament = Ipv6Equipament() server_pool_member_list = ServerPoolMember.objects.filter( ipv6=ip) if server_pool_member_list.count() != 0: # IP associated with Server Pool server_pool_name_list = set() for member in server_pool_member_list: item = '{}: {}'.format(member.server_pool.id, member.server_pool.identifier) server_pool_name_list.add(item) server_pool_name_list = list(server_pool_name_list) server_pool_identifiers = ', '.join(server_pool_name_list) raise IpCantRemoveFromServerPool( { 'ip': mount_ipv6_string(ip), 'equip_name': equipament.nome, 'server_pool_identifiers': server_pool_identifiers }, 'Ipv6 não pode ser disassociado do equipamento %s porque ele está sendo utilizando nos Server Pools (id:identifier) %s' % (equipament.nome, server_pool_identifiers)) ipv6_equipament.remove(user, ipv6_id, equip_id) return self.response(dumps_networkapi({})) except IpCantRemoveFromServerPool, e: return self.response_error(385, e.cause.get('ip'), e.cause.get('equip_name'), e.cause.get('server_pool_identifiers'))
def handle_post(self, request, user, *args, **kwargs): '''Handles POST requests to associate and IP to an equipment. URL: ipv4/assoc/ ''' self.log.info('Associate Ip to an Equipment') 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) 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_id = ip_map.get('id_ip') equip_id = ip_map.get('id_equip') network_ipv4_id = ip_map.get('id_net') # Valid ip_id if not is_valid_int_greater_zero_param(ip_id): self.log.error( u'Parameter ip_id is invalid. Value: %s.', ip_id) raise InvalidValueError(None, 'ip_id', ip_id) # Valid equip_id if not is_valid_int_greater_zero_param(equip_id): self.log.error( u'Parameter equip_id is invalid. Value: %s.', equip_id) raise InvalidValueError(None, 'equip_id', equip_id) # Valid network_ipv4_id if not is_valid_int_greater_zero_param(network_ipv4_id): self.log.error( u'Parameter network_ipv4_id is invalid. Value: %s.', network_ipv4_id) raise InvalidValueError( None, 'network_ipv4_id', network_ipv4_id) # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION, None, equip_id, AdminPermission.EQUIP_WRITE_OPERATION): raise UserNotAuthorizedError( None, u'User does not have permission to perform the operation.') # Business Rules # Get net net = NetworkIPv4.get_by_pk(network_ipv4_id) with distributedlock(LOCK_NETWORK_IPV4 % network_ipv4_id): # Get ip ip = Ip.get_by_pk(ip_id) # Get equipment equip = Equipamento.get_by_pk(equip_id) listaVlansDoEquip = [] for ipequip in equip.ipequipamento_set.all(): vlan = ipequip.ip.networkipv4.vlan if vlan not in listaVlansDoEquip: listaVlansDoEquip.append(vlan) for ipequip in equip.ipv6equipament_set.all(): vlan = ipequip.ip.networkipv6.vlan if vlan not in listaVlansDoEquip: listaVlansDoEquip.append(vlan) vlan_atual = net.vlan vlan_aux = None ambiente_aux = None for vlan in listaVlansDoEquip: if vlan.num_vlan == vlan_atual.num_vlan: if vlan.id != vlan_atual.id: # Filter case 3 - Vlans with same number cannot # share equipments ## flag_vlan_error = False # Filter testing if vlan.ambiente.filter is None or vlan_atual.ambiente.filter is None: flag_vlan_error = True else: # Test both environment's filters tp_equip_list_one = list() for fet in FilterEquipType.objects.filter(filter=vlan_atual.ambiente.filter.id): tp_equip_list_one.append(fet.equiptype) tp_equip_list_two = list() for fet in FilterEquipType.objects.filter(filter=vlan.ambiente.filter.id): tp_equip_list_two.append(fet.equiptype) #Equipment type should be in both filters if equip.tipo_equipamento not in tp_equip_list_one or equip.tipo_equipamento not in tp_equip_list_two: flag_vlan_error = True #Out of band network is never trunked, it is only in mgmt interface # allow it - not a good thing to to, but is very specific if vlan.ambiente.divisao_dc.nome == 'OOB-CM' or vlan_atual.ambiente.divisao_dc.nome == 'OOB-CM': flag_vlan_error = False ## Filter case 3 - end ## if flag_vlan_error: ambiente_aux = vlan.ambiente vlan_aux = vlan nome_ambiente = "%s - %s - %s" % ( vlan.ambiente.divisao_dc.nome, vlan.ambiente.ambiente_logico.nome, vlan.ambiente.grupo_l3.nome) raise VlanNumberNotAvailableError(None, '''O ip informado não pode ser cadastrado, pois o equipamento %s, faz parte do ambiente %s (id %s), que possui a Vlan de id %s, que também possui o número %s, e não é permitido que vlans que compartilhem o mesmo ambiente por meio de equipamentos, possuam o mesmo número, edite o número de uma das Vlans ou adicione um filtro no ambiente para efetuar o cadastro desse IP no Equipamento Informado. ''' % (equip.nome, nome_ambiente, ambiente_aux.id, vlan_aux.id, vlan_atual.num_vlan)) # Persist try: try: ipEquip = IpEquipamento() ipEquip.get_by_ip_equipment(ip.id, equip_id) # Ip %s.%s.%s.%s already has association with # Equipament %s.' % (self.oct1, self.oct2, self.oct3, # self.oct4,equipment_id) raise IpEquipmentAlreadyAssociation(None, u'Ip %s.%s.%s.%s already has association with Equipament %s.' % ( ip.oct1, ip.oct2, ip.oct3, ip.oct4, equip_id)) except IpEquipmentNotFoundError, e: pass equipment = Equipamento().get_by_pk(equip_id) ip_equipment = IpEquipamento() ip_equipment.ip = ip ip_equipment.equipamento = equipment # Filter case 2 - Adding new IpEquip for a equip that # already have ip in other network with the same range ## # Get all IpEquipamento related to this equipment ip_equips = IpEquipamento.objects.filter( equipamento=equip_id) for ip_test in [ip_equip.ip for ip_equip in ip_equips]: if ip_test.networkipv4.oct1 == ip.networkipv4.oct1 and \ ip_test.networkipv4.oct2 == ip.networkipv4.oct2 and \ ip_test.networkipv4.oct3 == ip.networkipv4.oct3 and \ ip_test.networkipv4.oct4 == ip.networkipv4.oct4 and \ ip_test.networkipv4.block == ip.networkipv4.block and \ ip_test.networkipv4 != ip.networkipv4: # Filter testing if ip_test.networkipv4.vlan.ambiente.filter is None or ip.networkipv4.vlan.ambiente.filter is None: raise IpRangeAlreadyAssociation( None, u'Equipment is already associated with another ip with the same ip range.') else: # Test both environment's filters tp_equip_list_one = list() for fet in FilterEquipType.objects.filter(filter=ip.networkipv4.vlan.ambiente.filter.id): tp_equip_list_one.append(fet.equiptype) tp_equip_list_two = list() for fet in FilterEquipType.objects.filter(filter=ip_test.networkipv4.vlan.ambiente.filter.id): tp_equip_list_two.append(fet.equiptype) if equipment.tipo_equipamento not in tp_equip_list_one or equipment.tipo_equipamento not in tp_equip_list_two: raise IpRangeAlreadyAssociation( None, u'Equipment is already associated with another ip with the same ip range.') ## Filter case 2 - end ## ip_equipment.save() # Makes Environment Equipment association try: equipment_environment = EquipamentoAmbiente() equipment_environment.equipamento = equipment equipment_environment.ambiente = net.vlan.ambiente equipment_environment.create(user) # Delete vlan's cache destroy_cache_function([net.vlan_id]) except EquipamentoAmbienteDuplicatedError, e: # If already exists, OK ! pass except IpRangeAlreadyAssociation, e: raise IpRangeAlreadyAssociation(None, e.message)
def handle_post(self, request, user, *args, **kwargs): """Trata uma requisicao POST para editar um equipamento. URL: equipmento/edit/ """ 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) equip_map = networkapi_map.get('equipamento') if equip_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 equip_id = equip_map.get('id_equip') id_modelo = equip_map.get('id_modelo') nome = equip_map.get('nome') id_tipo_equipamento = equip_map.get('id_tipo_equipamento') maintenance = equip_map.get('maintenance') # Valid equip_id if not is_valid_int_greater_zero_param(equip_id): self.log.error( u'Parameter equip_id is invalid. Value: %s.', equip_id) raise InvalidValueError(None, 'equip_id', equip_id) # Valid id_modelo if not is_valid_int_greater_zero_param(id_modelo): self.log.error( u'Parameter id_modelo is invalid. Value: %s.', id_modelo) raise InvalidValueError(None, 'id_modelo', id_modelo) # Valid id_tipo_equipamento if not is_valid_int_greater_zero_param(id_tipo_equipamento): self.log.error( u'Parameter id_tipo_equipamento is invalid. Value: %s.', id_tipo_equipamento) raise InvalidValueError( None, 'id_tipo_equipamento', id_tipo_equipamento) # Valid nome if not is_valid_string_minsize(nome, 3) or not is_valid_string_maxsize(nome, 80) or not is_valid_regex(nome, "^[A-Z0-9-_]+$"): self.log.error(u'Parameter nome is invalid. Value: %s', nome) raise InvalidValueError(None, 'nome', nome) # Business Rules # New equipment equip = Equipamento() equip = equip.get_by_pk(equip_id) #maintenance is a new feature. Check existing value if not defined in request #Old calls does not send this field if maintenance is None: maintenance = equip.maintenance if not is_valid_boolean_param(maintenance): self.log.error(u'The maintenance parameter is not a valid value: %s.', maintenance) raise InvalidValueError(None, 'maintenance', maintenance) # User permission if not has_perm(user, AdminPermission.EQUIPMENT_MANAGEMENT, AdminPermission.WRITE_OPERATION, None, equip_id, AdminPermission.EQUIP_WRITE_OPERATION): raise UserNotAuthorizedError( None, u'User does not have permission to perform the operation.') with distributedlock(LOCK_EQUIPMENT % equip_id): tipo_equip = TipoEquipamento.get_by_pk(id_tipo_equipamento) if equip.tipo_equipamento != tipo_equip: # Environments with filters using current equip type, with # equipment associated envs = [eq_env.ambiente.id for eq_env in equip.equipamentoambiente_set.filter( ambiente__filter__filterequiptype__equiptype=equip.tipo_equipamento)] # Filters case 1 and 2 filters_ok = True # Networks in environments with same ip range nets_same_range = NetworkIPv4.objects.filter(vlan__ambiente__in=envs).values( 'oct1', 'oct2', 'oct3', 'oct4', 'block').annotate(count=Count('id')).filter(count__gt=1) if len(nets_same_range) > 0: for net_gp in nets_same_range: nets_current_range = NetworkIPv4.objects.filter(vlan__ambiente__in=envs, oct1=net_gp[ 'oct1'], oct2=net_gp['oct2'], oct3=net_gp['oct3'], oct4=net_gp['oct4'], block=net_gp['block']) filters_of_envs = [ net.vlan.ambiente.filter.id for net in nets_current_range] for fil_ in filters_of_envs: if TipoEquipamento.objects.filter(id=id_tipo_equipamento, filterequiptype__filter=fil_).count() == 0: filters_ok = False break if not filters_ok: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois existe um filtro em uso que não possui o novo tipo de equipamento informado.') # Networks ipv6 in environments with same ipv6 range nets_v6_same_range = NetworkIPv6.objects.filter(vlan__ambiente__in=envs).values( 'block1', 'block2', 'block3', 'block4', 'block5', 'block6', 'block7', 'block8', 'block').annotate(count=Count('id')).filter(count__gt=1) if len(nets_v6_same_range) > 0: for net_gp in nets_v6_same_range: nets_current_range = NetworkIPv6.objects.filter(vlan__ambiente__in=envs, block1=net_gp['block1'], block2=net_gp['block2'], block3=net_gp[ 'block3'], block4=net_gp['block4'], block5=net_gp['block5'], block6=net_gp['block6'], block7=net_gp['block7'], block8=net_gp['block8'], block=net_gp['block']) filters_of_envs = [ net.vlan.ambiente.filter.id for net in nets_current_range] for fil_ in filters_of_envs: if TipoEquipamento.objects.filter(id=id_tipo_equipamento, filterequiptype__filter=fil_).count() == 0: filters_ok = False break if not filters_ok: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois existe um filtro em uso que não possui o novo tipo de equipamento informado.') # Filters case 1 and 2 end # Filter case 3 # Get vlans with same number vlans_same_number = Vlan.objects.filter(ambiente__in=envs).values( 'num_vlan').annotate(count=Count('id')).filter(count__gt=1) if len(vlans_same_number) > 0: for vlan_gp in vlans_same_number: vlans_current_number = Vlan.objects.filter( ambiente__in=envs, num_vlan=vlan_gp['num_vlan']) filters_of_envs = [ vlan.ambiente.filter.id for vlan in vlans_current_number] for fil_ in filters_of_envs: if TipoEquipamento.objects.filter(id=id_tipo_equipamento, filterequiptype__filter=fil_).count() == 0: filters_ok = False break if not filters_ok: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois existe um filtro em uso que não possui o novo tipo de equipamento informado.') # Filter case 3 end # Test all vip requests if equip.tipo_equipamento is # balancing if equip.tipo_equipamento == TipoEquipamento.get_tipo_balanceador(): vips = RequisicaoVips.objects.all() vip_ips = [] vip_ipsv6 = [] for vip in vips: if vip.vip_criado: if vip.ip is not None: if vip.ip.ipequipamento_set.filter(equipamento=equip.id).count() > 0: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois este equipamento é o balanceador associado com o vip criado %s.' % vip.id) if vip.ipv6 is not None: if vip.ipv6.ipv6equipament_set.filter(equipamento=equip.id).count() > 0: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois este equipamento é o balanceador associado com o vip criado %s.' % vip.id) else: if vip.ip is not None: vip_ips.append(vip.ip.id) if vip.ipv6 is not None: vip_ipsv6.append(vip.ipv6.id) nets_using_balancer_in_vips_ = [ ip_.networkipv4 for ip_ in Ip.objects.filter(id__in=vip_ips)] nets_using_balancer_in_vips = [ip_.networkipv4 for ip_ in Ip.objects.filter( networkipv4__in=nets_using_balancer_in_vips_, ipequipamento__equipamento=equip.id)] nets_v6_using_balancer_in_vips_ = [ ip_.networkipv6 for ip_ in Ipv6.objects.filter(id__in=vip_ipsv6)] nets_v6_using_balancer_in_vips = [ip_.networkipv6 for ip_ in Ipv6.objects.filter( networkipv6__in=nets_v6_using_balancer_in_vips_, ipv6equipament__equipamento=equip.id)] for net in nets_using_balancer_in_vips: net_str = str(net.oct1) + '.' + str(net.oct2) + '.' + \ str(net.oct3) + '.' + str(net.oct4) + \ '/' + str(net.block) if IpEquipamento.objects.filter(ip__networkipv4=net, equipamento__tipo_equipamento=TipoEquipamento.get_tipo_balanceador()).exclude(equipamento=equip).count() == 0: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois este equipamento é o único balanceador disponível na rede %s da vlan %s.' % (net_str, net.vlan.nome)) for net in nets_v6_using_balancer_in_vips: net_str = str(net.block1) + ':' + str(net.block2) + ':' + str(net.block3) + ':' + str(net.block4) + ':' + str( net.block5) + ':' + str(net.block6) + ':' + str(net.block7) + ':' + str(net.block8) + '/' + str(net.block) if Ipv6Equipament.objects.filter(ip__networkipv6=net, equipamento__tipo_equipamento=TipoEquipamento.get_tipo_balanceador()).exclude(equipamento=equip).count() == 0: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois este equipamento é o único balanceador disponível na rede %s da vlan %s.' % (net_str, net.vlan.nome)) ip_equipamento_list = IpEquipamento.objects.filter( equipamento=equip_id) ip6_equipamento_list = Ipv6Equipament.objects.filter( equipamento=equip_id) # Delete vlan's cache key_list = [] for eq in ip_equipamento_list: vlan = eq.ip.networkipv4.vlan vlan_id = vlan.id key_list.append(vlan_id) for eq in ip6_equipamento_list: vlan = eq.ip.networkipv6.vlan vlan_id = vlan.id key_list.append(vlan_id) destroy_cache_function(key_list) # Delete equipment's cache destroy_cache_function([equip_id], True) modelo = Modelo.get_by_pk(id_modelo) equip.edit(user, nome, tipo_equip, modelo) return self.response(dumps_networkapi({})) except EquipTypeCantBeChangedError, e: return self.response_error(150, e.message)
def handle_post(self, request, user, *args, **kwargs): """Handles POST requests to add an IP6 and associate it to an equipment. URL: ipv6/save/ """ self.log.info('Add an IP6 and associate it to an equipment') 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) 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 equip_id = ip_map.get('id_equip') network_ipv6_id = ip_map.get('id_net') description = ip_map.get('descricao') ip6 = ip_map.get('ip6') # Valid equip_id if not is_valid_int_greater_zero_param(equip_id): self.log.error(u'Parameter equip_id is invalid. Value: %s.', equip_id) raise InvalidValueError(None, 'equip_id', equip_id) # Valid network_ipv4_id if not is_valid_int_greater_zero_param(network_ipv6_id): self.log.error( u'Parameter network_ipv6_id is invalid. Value: %s.', network_ipv6_id) raise InvalidValueError(None, 'network_ipv6_id', network_ipv6_id) # Description can NOT be greater than 100 if not is_valid_string_maxsize(ip6, 39): self.log.error(u'Parameter ip6 is invalid. Value: %s.', ip6) raise InvalidValueError(None, 'ip6', ip6) if description is not None: if not is_valid_string_maxsize( description, 100) or not is_valid_string_minsize( description, 3): self.log.error( u'Parameter description is invalid. Value: %s.', description) raise InvalidValueError(None, 'description', description) # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION, None, equip_id, AdminPermission.EQUIP_WRITE_OPERATION): raise UserNotAuthorizedError( None, u'User does not have permission to perform the operation.') # Business Rules # New IP ipv6 = Ipv6() net = NetworkIPv6.get_by_pk(network_ipv6_id) with distributedlock(LOCK_NETWORK_IPV6 % network_ipv6_id): # Caso haja erro para retornar o ip corretamente ip_error = ip6 ip6 = ip6.split(':') # Ip informado de maneira incorreta if len(ip6) is not 8: raise InvalidValueError(None, 'ip6', ip_error) ipv6.description = description ipv6.block1 = ip6[0] ipv6.block2 = ip6[1] ipv6.block3 = ip6[2] ipv6.block4 = ip6[3] ipv6.block5 = ip6[4] ipv6.block6 = ip6[5] ipv6.block7 = ip6[6] ipv6.block8 = ip6[7] # Persist equip = Equipamento.get_by_pk(equip_id) listaVlansDoEquip = [] for ipequip in equip.ipv6equipament_set.all(): vlan = ipequip.ip.networkipv6.vlan if vlan not in listaVlansDoEquip: listaVlansDoEquip.append(vlan) for ipequip in equip.ipequipamento_set.all(): vlan = ipequip.ip.networkipv4.vlan if vlan not in listaVlansDoEquip: listaVlansDoEquip.append(vlan) vlan_atual = net.vlan ambiente_aux = None vlan_aux = None for vlan in listaVlansDoEquip: if vlan.num_vlan == vlan_atual.num_vlan: if vlan.id != vlan_atual.id: # Filter case 3 - Vlans with same number cannot # share equipments ## flag_vlan_error = False # Filter testing if vlan.ambiente.filter is None or vlan_atual.ambiente.filter is None: flag_vlan_error = True else: # Test both environment's filters tp_equip_list_one = list() for fet in FilterEquipType.objects.filter( filter=vlan_atual.ambiente.filter.id): tp_equip_list_one.append(fet.equiptype) tp_equip_list_two = list() for fet in FilterEquipType.objects.filter( filter=vlan.ambiente.filter.id): tp_equip_list_two.append(fet.equiptype) if equip.tipo_equipamento not in tp_equip_list_one or equip.tipo_equipamento not in tp_equip_list_two: flag_vlan_error = True ## Filter case 3 - end ## if flag_vlan_error: vlan_aux = vlan ambiente_aux = vlan.ambiente nome_ambiente = '%s - %s - %s' % ( vlan.ambiente.divisao_dc.nome, vlan.ambiente.ambiente_logico.nome, vlan.ambiente.grupo_l3.nome) raise VlanNumberNotAvailableError( None, """O ip informado não pode ser cadastrado, pois o equipamento %s, faz parte do ambiente %s (id %s), que possui a Vlan de id %s, que também possui o número %s, e não é permitido que vlans que compartilhem o mesmo ambiente, por meio de equipamentos, possuam o mesmo número, edite o número de uma das Vlans ou adicione um filtro no ambiente para efetuar o cadastro desse IP no Equipamento Informado. """ % (equip.nome, nome_ambiente, ambiente_aux.id, vlan_aux.id, vlan_atual.num_vlan)) ipv6.save_ipv6(equip_id, user, net) list_ip = [] lequips = list() if ipv6.id is None: ipv6 = Ipv6.get_by_blocks_and_net(ipv6.block1, ipv6.block2, ipv6.block3, ipv6.block4, ipv6.block5, ipv6.block6, ipv6.block7, ipv6.block8, net.id) equips = Ipv6Equipament.list_by_ip6(ipv6.id) ip_maps = dict() ip_maps['id'] = ipv6.id ip_maps['block1'] = ipv6.block1 ip_maps['block2'] = ipv6.block2 ip_maps['block3'] = ipv6.block3 ip_maps['block4'] = ipv6.block4 ip_maps['block5'] = ipv6.block5 ip_maps['block6'] = ipv6.block6 ip_maps['block7'] = ipv6.block7 ip_maps['block8'] = ipv6.block8 ip_maps['descricao'] = ipv6.description list_id_equip = [] for equip in equips: list_id_equip.append(equip.equipamento.id) equip = Equipamento.get_by_pk(equip.equipamento.id) lequips.append(model_to_dict(equip)) ip_maps['equipamento'] = lequips list_ip.append(ip_maps) network_map = dict() network_map['ipv6'] = list_ip # Delete vlan's cache destroy_cache_function([net.vlan_id]) # Delete equipment's cache destroy_cache_function(list_id_equip, True) return self.response(dumps_networkapi(network_map)) except IpRangeAlreadyAssociation, e: return self.response_error(347)
def handle_delete(self, request, user, *args, **kwargs): """Treat requests DELETE to deallocate all relationships between Vlan. URL: vlan/<id_vlan>/deallocate/ """ self.log.info("Deallocate all relationships between Vlan.") try: # 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.') raise UserNotAuthorizedError(None) # Load URL param id_vlan = kwargs.get('id_vlan') # Valid vlan id if not is_valid_int_greater_zero_param(id_vlan): self.log.error( u'The id_vlan parameter is not a valid value: %s.', 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) # Delete vlan's cache destroy_cache_function([id_vlan]) # Delete equipment's cache equip_id_list = [] for netv4 in vlan.networkipv4_set.all(): for ipv4 in netv4.ip_set.all(): server_pool_member_list = ServerPoolMember.objects.filter(ip=ipv4) if server_pool_member_list.count() != 0: # IP associated with Server Pool server_pool_name_list = set() for member in server_pool_member_list: item = '{}: {}'.format(member.server_pool.id, member.server_pool.identifier) server_pool_name_list.add(item) server_pool_name_list = list(server_pool_name_list) server_pool_identifiers = ', '.join(server_pool_name_list) ip_formated = mount_ipv4_string(ipv4) vlan_name = vlan.nome network_ip = mount_ipv4_string(netv4) raise IpCantRemoveFromServerPool({'ip': ip_formated, 'vlan_name': vlan_name, 'network_ip': network_ip, 'server_pool_identifiers': server_pool_identifiers}, "Não foi possível excluir a vlan %s pois ela possui a rede %s e essa rede possui o ip %s contido nela, e esse ip esta sendo usado nos Server Pools (id:identifier) %s" % (vlan_name, network_ip, ip_formated, server_pool_identifiers)) for ip_equip in ipv4.ipequipamento_set.all(): equip_id_list.append(ip_equip.equipamento_id) for netv6 in vlan.networkipv6_set.all(): for ip in netv6.ipv6_set.all(): server_pool_member_list = ServerPoolMember.objects.filter(ipv6=ip) if server_pool_member_list.count() != 0: # IP associated with Server Pool server_pool_name_list = set() for member in server_pool_member_list: item = '{}: {}'.format(member.server_pool.id, member.server_pool.identifier) server_pool_name_list.add(item) server_pool_name_list = list(server_pool_name_list) server_pool_identifiers = ', '.join(server_pool_name_list) ip_formated = mount_ipv6_string(ip) vlan_name = vlan.nome network_ip = mount_ipv6_string(netv6) raise IpCantRemoveFromServerPool({'ip': ip_formated, 'vlan_name': vlan_name, 'network_ip': network_ip, 'server_pool_identifiers': server_pool_identifiers}, "Não foi possível excluir a vlan %s pois ela possui a rede %s e essa rede possui o ip %s contido nela, e esse ip esta sendo usado nos Server Pools (id:identifier) %s" % (vlan_name, network_ip, ip_formated, server_pool_identifiers)) for ip_equip in ip.ipv6equipament_set.all(): equip_id_list.append(ip_equip.equipamento_id) destroy_cache_function(equip_id_list, True) with distributedlock(LOCK_VLAN % id_vlan): # Remove Vlan vlan.delete(user) return self.response(dumps_networkapi({})) except IpCantRemoveFromServerPool, e: return self.response_error(387, e.cause.get('vlan_name'), e.cause.get('network_ip'), e.cause.get('ip'), e.cause.get('server_pool_identifiers'))
def handle_post(self, request, user, *args, **kwargs): """Trata uma requisicao POST para editar um equipamento. URL: equipmento/edit/ """ 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) equip_map = networkapi_map.get('equipamento') if equip_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 equip_id = equip_map.get('id_equip') id_modelo = equip_map.get('id_modelo') nome = equip_map.get('nome') id_tipo_equipamento = equip_map.get('id_tipo_equipamento') maintenance = equip_map.get('maintenance') # Valid equip_id if not is_valid_int_greater_zero_param(equip_id): self.log.error(u'Parameter equip_id is invalid. Value: %s.', equip_id) raise InvalidValueError(None, 'equip_id', equip_id) # Valid id_modelo if not is_valid_int_greater_zero_param(id_modelo): self.log.error(u'Parameter id_modelo is invalid. Value: %s.', id_modelo) raise InvalidValueError(None, 'id_modelo', id_modelo) # Valid id_tipo_equipamento if not is_valid_int_greater_zero_param(id_tipo_equipamento): self.log.error( u'Parameter id_tipo_equipamento is invalid. Value: %s.', id_tipo_equipamento) raise InvalidValueError(None, 'id_tipo_equipamento', id_tipo_equipamento) # Valid nome if not is_valid_string_minsize( nome, 3) or not is_valid_string_maxsize( nome, 80) or not is_valid_regex(nome, '^[A-Z0-9-_]+$'): self.log.error(u'Parameter nome is invalid. Value: %s', nome) raise InvalidValueError(None, 'nome', nome) # Business Rules # New equipment equip = Equipamento() equip = equip.get_by_pk(equip_id) # maintenance is a new feature. Check existing value if not defined in request # Old calls does not send this field if maintenance is None: maintenance = equip.maintenance if not is_valid_boolean_param(maintenance): self.log.error( u'The maintenance parameter is not a valid value: %s.', maintenance) raise InvalidValueError(None, 'maintenance', maintenance) if maintenance in ['1', 'True', True]: maintenance = True else: maintenance = False # User permission if not has_perm(user, AdminPermission.EQUIPMENT_MANAGEMENT, AdminPermission.WRITE_OPERATION, None, equip_id, AdminPermission.EQUIP_WRITE_OPERATION): raise UserNotAuthorizedError( None, u'User does not have permission to perform the operation.') with distributedlock(LOCK_EQUIPMENT % equip_id): tipo_equip = TipoEquipamento.get_by_pk(id_tipo_equipamento) if equip.tipo_equipamento != tipo_equip: # Environments with filters using current equip type, with # equipment associated envs = [ eq_env.ambiente.id for eq_env in equip.equipamentoambiente_set.filter( ambiente__filter__filterequiptype__equiptype=equip. tipo_equipamento) ] # Filters case 1 and 2 filters_ok = True # Networks in environments with same ip range nets_same_range = NetworkIPv4.objects.filter( vlan__ambiente__in=envs).values( 'oct1', 'oct2', 'oct3', 'oct4', 'block').annotate( count=Count('id')).filter(count__gt=1) if len(nets_same_range) > 0: for net_gp in nets_same_range: nets_current_range = NetworkIPv4.objects.filter( vlan__ambiente__in=envs, oct1=net_gp['oct1'], oct2=net_gp['oct2'], oct3=net_gp['oct3'], oct4=net_gp['oct4'], block=net_gp['block']) filters_of_envs = [ net.vlan.ambiente.filter.id for net in nets_current_range ] for fil_ in filters_of_envs: if TipoEquipamento.objects.filter( id=id_tipo_equipamento, filterequiptype__filter=fil_).count( ) == 0: filters_ok = False break if not filters_ok: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois existe um filtro em uso que não possui o novo tipo de equipamento informado.' ) # Networks ipv6 in environments with same ipv6 range nets_v6_same_range = NetworkIPv6.objects.filter( vlan__ambiente__in=envs).values( 'block1', 'block2', 'block3', 'block4', 'block5', 'block6', 'block7', 'block8', 'block').annotate( count=Count('id')).filter(count__gt=1) if len(nets_v6_same_range) > 0: for net_gp in nets_v6_same_range: nets_current_range = NetworkIPv6.objects.filter( vlan__ambiente__in=envs, block1=net_gp['block1'], block2=net_gp['block2'], block3=net_gp['block3'], block4=net_gp['block4'], block5=net_gp['block5'], block6=net_gp['block6'], block7=net_gp['block7'], block8=net_gp['block8'], block=net_gp['block']) filters_of_envs = [ net.vlan.ambiente.filter.id for net in nets_current_range ] for fil_ in filters_of_envs: if TipoEquipamento.objects.filter( id=id_tipo_equipamento, filterequiptype__filter=fil_).count( ) == 0: filters_ok = False break if not filters_ok: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois existe um filtro em uso que não possui o novo tipo de equipamento informado.' ) # Filters case 1 and 2 end # Filter case 3 # Get vlans with same number vlans_same_number = Vlan.objects.filter( ambiente__in=envs).values('num_vlan').annotate( count=Count('id')).filter(count__gt=1) if len(vlans_same_number) > 0: for vlan_gp in vlans_same_number: vlans_current_number = Vlan.objects.filter( ambiente__in=envs, num_vlan=vlan_gp['num_vlan']) filters_of_envs = [ vlan.ambiente.filter.id for vlan in vlans_current_number ] for fil_ in filters_of_envs: if TipoEquipamento.objects.filter( id=id_tipo_equipamento, filterequiptype__filter=fil_).count( ) == 0: filters_ok = False break if not filters_ok: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois existe um filtro em uso que não possui o novo tipo de equipamento informado.' ) # Filter case 3 end # Test all vip requests if equip.tipo_equipamento is # balancing if equip.tipo_equipamento == TipoEquipamento.get_tipo_balanceador( ): vips = RequisicaoVips.objects.all() vip_ips = [] vip_ipsv6 = [] for vip in vips: if vip.vip_criado: if vip.ip is not None: if vip.ip.ipequipamento_set.filter( equipamento=equip.id).count() > 0: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois este equipamento é o balanceador associado com o vip criado %s.' % vip.id) if vip.ipv6 is not None: if vip.ipv6.ipv6equipament_set.filter( equipamento=equip.id).count() > 0: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois este equipamento é o balanceador associado com o vip criado %s.' % vip.id) else: if vip.ip is not None: vip_ips.append(vip.ip.id) if vip.ipv6 is not None: vip_ipsv6.append(vip.ipv6.id) nets_using_balancer_in_vips_ = [ ip_.networkipv4 for ip_ in Ip.objects.filter(id__in=vip_ips) ] nets_using_balancer_in_vips = [ ip_.networkipv4 for ip_ in Ip.objects.filter( networkipv4__in=nets_using_balancer_in_vips_, ipequipamento__equipamento=equip.id) ] nets_v6_using_balancer_in_vips_ = [ ip_.networkipv6 for ip_ in Ipv6.objects.filter(id__in=vip_ipsv6) ] nets_v6_using_balancer_in_vips = [ ip_.networkipv6 for ip_ in Ipv6.objects.filter( networkipv6__in=nets_v6_using_balancer_in_vips_, ipv6equipament__equipamento=equip.id) ] for net in nets_using_balancer_in_vips: net_str = str(net.oct1) + '.' + str(net.oct2) + '.' + \ str(net.oct3) + '.' + str(net.oct4) + \ '/' + str(net.block) if IpEquipamento.objects.filter( ip__networkipv4=net, equipamento__tipo_equipamento=TipoEquipamento .get_tipo_balanceador()).exclude( equipamento=equip).count() == 0: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois este equipamento é o único balanceador disponível na rede %s da vlan %s.' % (net_str, net.vlan.nome)) for net in nets_v6_using_balancer_in_vips: net_str = str(net.block1) + ':' + str( net.block2 ) + ':' + str(net.block3) + ':' + str( net.block4) + ':' + str( net.block5) + ':' + str( net.block6) + ':' + str( net.block7) + ':' + str( net.block8) + '/' + str( net.block) if Ipv6Equipament.objects.filter( ip__networkipv6=net, equipamento__tipo_equipamento=TipoEquipamento .get_tipo_balanceador()).exclude( equipamento=equip).count() == 0: raise EquipTypeCantBeChangedError( None, 'O tipo de equipamento não pode ser modificado pois este equipamento é o único balanceador disponível na rede %s da vlan %s.' % (net_str, net.vlan.nome)) ip_equipamento_list = IpEquipamento.objects.filter( equipamento=equip_id) ip6_equipamento_list = Ipv6Equipament.objects.filter( equipamento=equip_id) # Delete vlan's cache key_list = [] for eq in ip_equipamento_list: vlan = eq.ip.networkipv4.vlan vlan_id = vlan.id key_list.append(vlan_id) for eq in ip6_equipamento_list: vlan = eq.ip.networkipv6.vlan vlan_id = vlan.id key_list.append(vlan_id) destroy_cache_function(key_list) # Delete equipment's cache destroy_cache_function([equip_id], True) modelo = Modelo.get_by_pk(id_modelo) equip.edit(user, nome, tipo_equip, modelo, maintenance) return self.response(dumps_networkapi({})) except EquipTypeCantBeChangedError, e: return self.response_error(150, e.message)
def handle_post(self, request, user, *args, **kwargs): '''Handles POST requests to add an IP and associate it to an equipment. URL: ipv4/save/ ''' self.log.info('Add an IP and associate it to an equipment') 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) 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 equip_id = ip_map.get('id_equip') network_ipv4_id = ip_map.get('id_net') description = ip_map.get('descricao') ip4 = ip_map.get('ip4') # Valid equip_id if not is_valid_int_greater_zero_param(equip_id): self.log.error(u'Parameter equip_id is invalid. Value: %s.', equip_id) raise InvalidValueError(None, 'equip_id', equip_id) # Valid network_ipv4_id if not is_valid_int_greater_zero_param(network_ipv4_id): self.log.error( u'Parameter network_ipv4_id is invalid. Value: %s.', network_ipv4_id) raise InvalidValueError(None, 'network_ipv4_id', network_ipv4_id) # Valid ip size if not is_valid_string_maxsize(ip4, 15): self.log.error(u'Parameter ip4 is invalid. Value: %s.', ip4) raise InvalidValueError(None, 'ip4', ip4) # Description can NOT be greater than 100 if description is not None: if not is_valid_string_maxsize( description, 100) or not is_valid_string_minsize( description, 3): self.log.error( u'Parameter description is invalid. Value: %s.', description) raise InvalidValueError(None, 'description', description) # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION, None, equip_id, AdminPermission.EQUIP_WRITE_OPERATION): raise UserNotAuthorizedError( None, u'User does not have permission to perform the operation.') # Business Rules # New IP ip = Ip() net = NetworkIPv4.get_by_pk(network_ipv4_id) with distributedlock(LOCK_NETWORK_IPV4 % network_ipv4_id): # se Houver erro no ip informado para retorna-lo na mensagem ip_error = ip4 # verificação se foi passado algo errado no ip ip4 = ip4.split(".") for oct in ip4: if not is_valid_int_param(oct): raise InvalidValueError(None, 'ip4', ip_error) #raise IndexError # Ip passado de forma invalida if len(ip4) is not 4: raise IndexError ip.descricao = description ip.oct1 = ip4[0] ip.oct2 = ip4[1] ip.oct3 = ip4[2] ip.oct4 = ip4[3] equip = Equipamento.get_by_pk(equip_id) listaVlansDoEquip = [] for ipequip in equip.ipequipamento_set.all(): vlan = ipequip.ip.networkipv4.vlan if vlan not in listaVlansDoEquip: listaVlansDoEquip.append(vlan) for ipequip in equip.ipv6equipament_set.all(): vlan = ipequip.ip.networkipv6.vlan if vlan not in listaVlansDoEquip: listaVlansDoEquip.append(vlan) vlan_atual = net.vlan vlan_aux = None ambiente_aux = None for vlan in listaVlansDoEquip: if vlan.num_vlan == vlan_atual.num_vlan: if vlan.id != vlan_atual.id: # Filter case 3 - Vlans with same number cannot # share equipments ## flag_vlan_error = False # Filter testing if vlan.ambiente.filter is None or vlan_atual.ambiente.filter is None: flag_vlan_error = True else: # Test both environment's filters tp_equip_list_one = list() for fet in FilterEquipType.objects.filter( filter=vlan_atual.ambiente.filter.id): tp_equip_list_one.append(fet.equiptype) tp_equip_list_two = list() for fet in FilterEquipType.objects.filter( filter=vlan.ambiente.filter.id): tp_equip_list_two.append(fet.equiptype) if equip.tipo_equipamento not in tp_equip_list_one or equip.tipo_equipamento not in tp_equip_list_two: flag_vlan_error = True ## Filter case 3 - end ## if flag_vlan_error: ambiente_aux = vlan.ambiente vlan_aux = vlan nome_ambiente = "%s - %s - %s" % ( vlan.ambiente.divisao_dc.nome, vlan.ambiente.ambiente_logico.nome, vlan.ambiente.grupo_l3.nome) raise VlanNumberNotAvailableError( None, '''O ip informado não pode ser cadastrado, pois o equipamento %s, faz parte do ambiente %s (id %s), que possui a Vlan de id %s, que também possui o número %s, e não é permitido que vlans que compartilhem o mesmo ambiente por meio de equipamentos, possuam o mesmo número, edite o número de uma das Vlans ou adicione um filtro no ambiente para efetuar o cadastro desse IP no Equipamento Informado. ''' % (equip.nome, nome_ambiente, ambiente_aux.id, vlan_aux.id, vlan_atual.num_vlan)) # Persist ip.save_ipv4(equip_id, user, net) list_ip = [] lequips = [] if ip.id is None: ip = Ip.get_by_octs_and_net(ip.oct1, ip.oct2, ip.oct3, ip.oct4, net.id) equips = IpEquipamento.list_by_ip(ip.id) ip_maps = dict() ip_maps['id'] = ip.id ip_maps['oct1'] = ip.oct1 ip_maps['oct2'] = ip.oct2 ip_maps['oct3'] = ip.oct3 ip_maps['oct4'] = ip.oct4 ip_maps['descricao'] = ip.descricao list_id_equip = [] for equip in equips: list_id_equip.append(equip.equipamento.id) equip = Equipamento.get_by_pk(equip.equipamento.id) lequips.append(model_to_dict(equip)) ip_maps['equipamento'] = lequips list_ip.append(ip_maps) network_map = dict() network_map['ip'] = list_ip # Delete vlan's cache destroy_cache_function([net.vlan_id]) # Delete equipment's cache destroy_cache_function(list_id_equip, True) return self.response(dumps_networkapi(network_map)) except IpRangeAlreadyAssociation, e: return self.response_error(347)
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.compressed 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_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: for env_config in environment_conf: ipconfig = env_config.ip_config subnet = ipconfig.subnet env_net = IPNetwork(subnet) try: if net in env_net: self.log.debug( 'Network "%s" can be allocated because is in the ' 'environment network(%s) subnets.' % (net, subnet)) else: raise NetworkSubnetRange( None, 'A rede a ser cadastrada (%s) não pertence às ' 'subredes do ambiente (rede ambiente: %s). ' 'Cadastre o range desejado no ' 'ambiente.' % (net, subnet)) 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) else: raise NetworkEnvironmentError( None, 'O ambiente não está configurado. ' 'É necessário efetuar a configuração.') except NetworkEnvironmentError: self.log.error( 'The environment does not have a registered network' ) 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_post(self, request, user, *args, **kwargs): '''Treat POST requests to edit a vlan URL: vlan/edit/ ''' try: network_version = kwargs.get('network_version') # 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_id = vlan_map.get('environment_id') number = vlan_map.get('number') name = vlan_map.get('name') acl_file = vlan_map.get('acl_file') acl_file_v6 = vlan_map.get('acl_file_v6') description = vlan_map.get('description') id_vlan = vlan_map.get('vlan_id') # Valid vlan ID if not is_valid_int_greater_zero_param(id_vlan): self.log.error( u'Parameter id_vlan is invalid. Value: %s.', id_vlan) raise InvalidValueError(None, 'id_vlan', id_vlan) # Valid environment_id ID if not is_valid_int_greater_zero_param(environment_id): self.log.error( u'Parameter environment_id is invalid. Value: %s.', environment_id) raise InvalidValueError(None, 'environment_id', environment_id) # Valid number of Vlan if not is_valid_int_greater_zero_param(number): self.log.error( u'Parameter number is invalid. Value: %s', number) raise InvalidValueError(None, 'number', number) # Valid name of Vlan if not is_valid_string_minsize(name, 3) or not is_valid_string_maxsize(name, 50): self.log.error(u'Parameter name is invalid. Value: %s', name) raise InvalidValueError(None, 'name', name) p = re.compile("^[A-Z0-9-_]+$") m = p.match(name) if not m: name = name.upper() m = p.match(name) if not m: raise InvalidValueError(None, 'name', name) # Valid description of Vlan if not is_valid_string_minsize(description, 3, False) or not is_valid_string_maxsize(description, 200, False): self.log.error( u'Parameter description is invalid. Value: %s', description) raise InvalidValueError(None, 'description', description) vlan = Vlan() vlan = vlan.get_by_pk(id_vlan) with distributedlock(LOCK_VLAN % id_vlan): # Valid acl_file Vlan if acl_file is not None: if not is_valid_string_minsize(acl_file, 3) or not is_valid_string_maxsize(acl_file, 200): self.log.error( u'Parameter acl_file is invalid. Value: %s', acl_file) raise InvalidValueError(None, 'acl_file', acl_file) p = re.compile("^[A-Z0-9-_]+$") m = p.match(acl_file) if not m: raise InvalidValueError(None, 'acl_file', acl_file) # VERIFICA SE VLAN COM MESMO ACL JA EXISTE OU NAO vlan.get_vlan_by_acl(acl_file) # Valid acl_file_v6 Vlan if acl_file_v6 is not None: if not is_valid_string_minsize(acl_file_v6, 3) or not is_valid_string_maxsize(acl_file_v6, 200): self.log.error( u'Parameter acl_file_v6 is invalid. Value: %s', acl_file_v6) raise InvalidValueError( None, 'acl_file_v6', acl_file_v6) p = re.compile("^[A-Z0-9-_]+$") m = p.match(acl_file_v6) if not m: raise InvalidValueError( None, 'acl_file_v6', acl_file_v6) # VERIFICA SE VLAN COM MESMO ACL JA EXISTE OU NAO vlan.get_vlan_by_acl_v6(acl_file_v6) ambiente = Ambiente() ambiente = ambiente.get_by_pk(environment_id) change_name = False change_number_environment = False redes4 = vlan.networkipv4_set.all() redes6 = vlan.networkipv6_set.all() listaIpsv4 = [] listaIpsv6 = [] listaEquips4 = [] listaEquips6 = [] for rede in redes4: for ip in rede.ip_set.all(): listaIpsv4.append(ip) for rede in redes6: for ip in rede.ipv6_set.all(): listaIpsv6.append(ip) for ip in listaIpsv4: for ipequip in ip.ipequipamento_set.all(): listaEquips4.append(ipequip.equipamento) for ip in listaIpsv6: for ipequip in ip.ipv6equipament_set.all(): listaEquips6.append(ipequip.equipamento) listaDeIps4DoEquip = [] listaDeIps6DoEquip = [] listaDeVlansDoEquip = [] for equip in listaEquips4: for ipequip in equip.ipequipamento_set.all(): ip_aux = ipequip.ip if ip_aux not in listaDeIps4DoEquip: listaDeIps4DoEquip.append(ip_aux) for equip in listaEquips6: for ipequip in equip.ipv6equipament_set.all(): ip_aux = ipequip.ip if ip_aux not in listaDeIps4DoEquip: listaDeIps6DoEquip.append(ip_aux) for ip in listaDeIps4DoEquip: vlan_aux = ip.networkipv4.vlan if vlan_aux not in listaDeVlansDoEquip: listaDeVlansDoEquip.append(vlan_aux) for ip in listaDeIps6DoEquip: vlan_aux = ip.networkipv6.vlan if vlan_aux not in listaDeVlansDoEquip: listaDeVlansDoEquip.append(vlan_aux) if vlan.nome != name: change_name = True vlan.nome = name if int(vlan.num_vlan) != int(number) or int(vlan.ambiente.id) != int(environment_id): change_number_environment = True vlan.num_vlan = number vlan.ambiente = ambiente vlan.acl_file_name = acl_file vlan.acl_file_name_v6 = acl_file_v6 vlan.descricao = description vlan_id_cache = [id_vlan] # Delete vlan's cache destroy_cache_function(vlan_id_cache) # Delete equipment's cache equip_id_list = [] for netv4 in vlan.networkipv4_set.all(): for ip in netv4.ip_set.all(): for ip_equip in ip.ipequipamento_set.all(): equip_id_list.append(ip_equip.equipamento_id) for netv6 in vlan.networkipv6_set.all(): for ip in netv6.ipv6_set.all(): for ip_equip in ip.ipv6equipament_set.all(): equip_id_list.append(ip_equip.equipamento_id) destroy_cache_function(equip_id_list, True) vlan.edit_vlan(user, change_name, change_number_environment) # Return XML return self.response(dumps_networkapi({})) except VlanACLDuplicatedError, e: return self.response_error(311, acl_file)
def handle_put(self, request, user, *args, **kwargs): """Trata requisições PUT para alterar um Ambiente. URL: ambiente/<id_ambiente>/ """ try: environment_id = kwargs.get('id_ambiente') 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) if not has_perm(user, AdminPermission.ENVIRONMENT_MANAGEMENT, AdminPermission.WRITE_OPERATION): return self.not_authorized() xml_map, attrs_map = loads(request.raw_post_data) self.log.debug('XML_MAP: %s', xml_map) networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error( 3, u'Não existe valor para a tag networkapi do XML de requisição.' ) environment_map = networkapi_map.get('ambiente') if environment_map is None: return self.response_error( 3, u'Não existe valor para a tag ambiente do XML de requisição.' ) l3_group_id = environment_map.get('id_grupo_l3') if not is_valid_int_greater_zero_param(l3_group_id): self.log.error( u'The l3_group_id parameter is not a valid value: %s.', l3_group_id) raise InvalidValueError(None, 'l3_group_id', l3_group_id) else: l3_group_id = int(l3_group_id) GrupoL3.get_by_pk(l3_group_id) logic_environment_id = environment_map.get('id_ambiente_logico') if not is_valid_int_greater_zero_param(logic_environment_id): self.log.error( u'The logic_environment_id parameter is not a valid value: %s.', logic_environment_id) raise InvalidValueError(None, 'logic_environment_id', logic_environment_id) else: logic_environment_id = int(logic_environment_id) AmbienteLogico.get_by_pk(logic_environment_id) dc_division_id = environment_map.get('id_divisao') if not is_valid_int_greater_zero_param(dc_division_id): self.log.error( u'The dc_division_id parameter is not a valid value: %s.', dc_division_id) raise InvalidValueError(None, 'dc_division_id', dc_division_id) else: dc_division_id = int(dc_division_id) DivisaoDc.get_by_pk(dc_division_id) link = environment_map.get('link') if not is_valid_string_maxsize(link, 200, False): self.log.error(u'Parameter link is invalid. Value: %s', link) raise InvalidValueError(None, 'link', link) vrf = environment_map.get('vrf') if not is_valid_string_maxsize(link, 100, False): self.log.error(u'Parameter vrf is invalid. Value: %s', vrf) raise InvalidValueError(None, 'vrf', vrf) filter_id = environment_map.get('id_filter') if filter_id is not None: if not is_valid_int_greater_zero_param(filter_id): self.log.error( u'Parameter filter_id is invalid. Value: %s.', filter_id) raise InvalidValueError(None, 'filter_id', filter_id) filter_id = int(filter_id) # Filter must exist Filter.get_by_pk(filter_id) acl_path = environment_map.get('acl_path') if not is_valid_string_maxsize(acl_path, 250, False): self.log.error(u'Parameter acl_path is invalid. Value: %s', acl_path) raise InvalidValueError(None, 'acl_path', acl_path) ipv4_template = environment_map.get('ipv4_template') if not is_valid_string_maxsize(ipv4_template, 250, False): self.log.error( u'Parameter ipv4_template is invalid. Value: %s', ipv4_template) raise InvalidValueError(None, 'ipv4_template', ipv4_template) ipv6_template = environment_map.get('ipv6_template') if not is_valid_string_maxsize(ipv6_template, 250, False): self.log.error( u'Parameter ipv6_template is invalid. Value: %s', ipv6_template) raise InvalidValueError(None, 'ipv6_template', ipv6_template) max_num_vlan_1 = environment_map.get('max_num_vlan_1') min_num_vlan_1 = environment_map.get('min_num_vlan_1') max_num_vlan_2 = environment_map.get('max_num_vlan_2') min_num_vlan_2 = environment_map.get('min_num_vlan_2') # validate max_num_vlan_1 and min_num_vlan_1 if (max_num_vlan_1 is not None and min_num_vlan_1 is None) or ( min_num_vlan_1 is not None and max_num_vlan_1 is None): self.log.error( u'Parameters min_num_vlan_1, max_num_vlan_1 is invalid. Values: %s, %s', (min_num_vlan_1, max_num_vlan_1)) raise InvalidValueError(None, 'min_num_vlan_1, max_num_vlan_1', min_num_vlan_1 + ',' + max_num_vlan_1) if max_num_vlan_1 is not None and min_num_vlan_1 is not None: max_num_vlan_1 = int(max_num_vlan_1) min_num_vlan_1 = int(min_num_vlan_1) if max_num_vlan_1 < 1 or min_num_vlan_1 < 1: self.log.error( u'Parameters min_num_vlan_1, max_num_vlan_1 is invalid. Values: %s, %s', (min_num_vlan_1, max_num_vlan_1)) raise InvalidValueError( None, 'min_num_vlan_1, max_num_vlan_1', min_num_vlan_1 + ',' + max_num_vlan_1) if max_num_vlan_1 <= min_num_vlan_1: self.log.error( u'Parameters min_num_vlan_1, max_num_vlan_1 is invalid. Values: %s, %s', (min_num_vlan_1, max_num_vlan_1)) raise InvalidValueError( None, 'min_num_vlan_1, max_num_vlan_1', min_num_vlan_1 + ',' + max_num_vlan_1) else: max_num_vlan_1 = max_num_vlan_2 min_num_vlan_1 = min_num_vlan_2 # validate max_num_vlan_1 and min_num_vlan_1 # validate max_num_vlan_2 and min_num_vlan_2 if (max_num_vlan_2 is not None and min_num_vlan_2 is None) or ( min_num_vlan_2 is not None and max_num_vlan_2 is None): self.log.error( u'Parameters min_num_vlan_2, max_num_vlan_2 is invalid. Values: %s, %s', (min_num_vlan_2, max_num_vlan_2)) raise InvalidValueError(None, 'min_num_vlan_2, max_num_vlan_2', min_num_vlan_2 + ',' + max_num_vlan_1) if max_num_vlan_2 is not None and min_num_vlan_2 is not None: max_num_vlan_2 = int(max_num_vlan_2) min_num_vlan_2 = int(min_num_vlan_2) max_num_vlan_1 = int(max_num_vlan_1) min_num_vlan_1 = int(min_num_vlan_1) if max_num_vlan_2 < 1 or min_num_vlan_2 < 1: self.log.error( u'Parameters min_num_vlan_2, max_num_vlan_2 is invalid. Values: %s, %s', (min_num_vlan_2, max_num_vlan_2)) raise InvalidValueError( None, 'min_num_vlan_2, max_num_vlan_2', min_num_vlan_2 + ',' + max_num_vlan_1) if max_num_vlan_2 <= min_num_vlan_2: self.log.error( u'Parameters min_num_vlan_2, max_num_vlan_2 is invalid. Values: %s, %s', (min_num_vlan_2, max_num_vlan_2)) raise InvalidValueError( None, 'min_num_vlan_2, max_num_vlan_2', min_num_vlan_2 + ',' + max_num_vlan_1) else: max_num_vlan_2 = max_num_vlan_1 min_num_vlan_2 = min_num_vlan_1 # validate max_num_vlan_2 and min_num_vlan_2 with distributedlock(LOCK_ENVIRONMENT % environment_id): # Delete vlan's cache key_list_db = Vlan.objects.filter(ambiente__pk=environment_id) key_list = [] for key in key_list_db: key_list.append(key.id) destroy_cache_function(key_list) # Destroy equipment's cache equip_id_list = [] envr = Ambiente.get_by_pk(environment_id) for equipment in envr.equipamentoambiente_set.all(): equip_id_list.append(equipment.equipamento_id) destroy_cache_function(equip_id_list, True) Ambiente.update(user, environment_id, grupo_l3_id=l3_group_id, ambiente_logico_id=logic_environment_id, divisao_dc_id=dc_division_id, filter_id=filter_id, link=link, vrf=vrf, acl_path=fix_acl_path(acl_path), ipv4_template=ipv4_template, ipv6_template=ipv6_template, max_num_vlan_1=max_num_vlan_1, min_num_vlan_1=min_num_vlan_1, max_num_vlan_2=max_num_vlan_2, min_num_vlan_2=min_num_vlan_2) return self.response(dumps_networkapi({})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)