def test_check_available_ip(self): ip_equipamento = IpEquipamento(equipamento=Equipamento( tipo_equipamento=TipoEquipamento(id=1, tipo_equipamento='balanceador'))) network = self.mock_network(ip_equipamento) self.mock_user_has_permission(True) self.mock_get_vip_environment_by_pk( self.mock_vip_environment(1, 'production env', networks=[network])) self.mock_network_get_available_ip(IPv4Address('192.168.1.1')) self.mock_get_tipo_balanceador( TipoEquipamento(id=1, tipo_equipamento='balanceador')) ip_save_mock = self.mock_ip_save() response = self.client.post('/ip/availableip4/vip/1/', XML % 1, content_type='text/xml') print(response) xml_map = self.parse_response(response) self.assertEquals('192', xml_map.get('networkapi').get('ip').get('oct1')) self.assertEquals('168', xml_map.get('networkapi').get('ip').get('oct2')) self.assertEquals('1', xml_map.get('networkapi').get('ip').get('oct3')) self.assertEquals('1', xml_map.get('networkapi').get('ip').get('oct4')) self.assertEquals(200, response.status_code) self.assertTrue(ip_save_mock.called)
def handle_post(self, request, user, *args, **kwargs): """Treat requests POST to insert a Equipment Type. URL: equipmenttype/ """ try: self.log.info("Add Equipment Script") # User permission if not has_perm(user, AdminPermission.EQUIPMENT_MANAGEMENT, AdminPermission.WRITE_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) equipment_type_map = networkapi_map.get('equipment_type') if equipment_type_map is None: msg = u'There is no value to the equipment_type tag of XML request.' self.log.error(msg) return self.response_error(3, msg) # Get XML data name = equipment_type_map.get('name') # Valid Name if not is_valid_string_minsize(name, 3) or not is_valid_string_maxsize(name, 100) or not is_valid_regex(name, "^[A-Za-z0-9 -]+$"): self.log.error(u'Parameter name is invalid. Value: %s', name) raise InvalidValueError(None, 'name', name) # Business Rules equipment_type = TipoEquipamento() # save Equipment Type equipment_type.insert_new(user, name) etype_dict = dict() etype_dict['id'] = equipment_type.id return self.response(dumps_networkapi({'equipment_type': etype_dict})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_put(self, request, user, *args, **kwargs): """Treat PUT requests to associate Filter and TipoEquipamento. URL: filter/<filter_id>/equiptype/<equiptype_id> """ try: self.log.info('') # Commons Validations # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_MANAGEMENT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() if not is_valid_int_greater_zero_param(kwargs['id_filter']): self.log.error(u'Parameter id_filter is invalid. Value: %s.', kwargs['id_filter']) raise InvalidValueError(None, 'id_filter', kwargs['id_filter']) else: # Check existence fil = Filter().get_by_pk(kwargs['id_filter']) if not is_valid_int_greater_zero_param(kwargs['id_equiptype']): self.log.error( u'Parameter id_equiptype is invalid. Value: %s.', kwargs['id_equiptype']) raise InvalidValueError(None, 'id_equiptype', kwargs['id_equiptype']) else: # Check existence tp_equip = TipoEquipamento().get_by_pk(kwargs['id_equiptype']) association = FilterEquipType() association.filter = fil association.equiptype = tp_equip # Check existence association.validate() # Save association association.save() fil_et_map = dict() fil_et_map['id'] = association.id return self.response( dumps_networkapi({'equiptype_filter_xref': fil_et_map})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_put(self, request, user, *args, **kwargs): """Treat PUT requests to dissociate Filter and TipoEquipamento. URL: filter/<id_filter>/dissociate/<id_equip_type> """ try: self.log.info("") # Commons Validations # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_MANAGEMENT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() if not is_valid_int_greater_zero_param(kwargs['id_filter']): self.log.error(u'Parameter id_filter is invalid. Value: %s.', kwargs['id_filter']) raise InvalidValueError(None, 'id_filter', kwargs['id_filter']) else: # Check existence fil = Filter().get_by_pk(kwargs['id_filter']) if not is_valid_int_greater_zero_param(kwargs['id_equip_type']): self.log.error( u'Parameter id_equip_type is invalid. Value: %s.', kwargs['id_equip_type']) raise InvalidValueError(None, 'id_equip_type', kwargs['id_equip_type']) else: # Check existence eq_tp = TipoEquipamento().get_by_pk(kwargs['id_equip_type']) # Delete association try: association = FilterEquipType.objects.get(filter=fil.id, equiptype=eq_tp.id) ## Only delete if there's no conflicts ## association.delete() except ObjectDoesNotExist, e: # Association doesn't exist, ok self.log.error(e) pass return self.response(dumps_networkapi({}))
def test_check_available_ip_given_no_load_balancer_equipment_available_on_network( self): ip_equipamento = IpEquipamento(equipamento=Equipamento( tipo_equipamento=TipoEquipamento(id=2, tipo_equipamento='router'))) network = self.mock_network(ip_equipamento) self.mock_user_has_permission(True) self.mock_get_vip_environment_by_pk( self.mock_vip_environment(1, 'production env', networks=[network])) self.mock_network_get_available_ip(IPv4Address('192.168.1.1')) self.mock_get_tipo_balanceador( TipoEquipamento(id=1, tipo_equipamento='balanceador')) response = self.client.post('/ip/availableip4/vip/1/', XML % 1, content_type='text/xml') xml_map = self.parse_response(response) self.assertEquals( 'Não há ipv4 disponivel para as redes associdas com o Ambiente ' 'Vip: production env - production env - production env, pois não existe ' 'equipamentos do Tipo Balanceador nessas redes.', xml_map.get('networkapi').get('erro').get('descricao')) self.assertEquals(500, response.status_code)
def handle_post(self, request, user, *args, **kwargs): """Handles POST requests to check an IPv4 or Ipv6 for vip request. URL: ip/checkvipip/ """ self.log.info('Check a Ipv4 or Ipv6 for Vip') from networkapi.equipamento.models import TipoEquipamento try: # Business Validations # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: msg = u'There is no value to the networkapi tag of XML request.' self.log.error(msg) return self.response_error(3, msg) ip_map = networkapi_map.get('ip_map') if ip_map is None: msg = u'There is no value to the ip tag of XML request.' self.log.error(msg) return self.response_error(3, msg) # Get XML data ip = ip_map.get('ip') id_evip = ip_map.get('id_evip') # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Valid ip id if ip is None: self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) # Valid evip id if not is_valid_int_greater_zero_param(id_evip): raise InvalidValueError(None, 'id_evip', id_evip) # Business Rules evip = EnvironmentVip.get_by_pk(id_evip) ip_list = ip.split('.') if len(ip_list) == 1: if not is_valid_ipv6(ip): self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) if len(evip.networkipv6_set.all()) <= 0: raise NetworkNotInEvip( 'IPv6', 'Não há rede no ambiente vip fornecido') ip_list = ip.split(':') ip_checked = Ipv6.get_by_octs_and_environment_vip( ip_list[0], ip_list[1], ip_list[2], ip_list[3], ip_list[4], ip_list[5], ip_list[6], ip_list[7], id_evip) ip_ok = False for ip_equip in ip_checked.ipv6equipament_set.all(): if ip_equip.equipamento.tipo_equipamento == TipoEquipamento.get_tipo_balanceador( ): ip_ok = True break if not ip_ok: raise IpNotAvailableError( None, 'Ipv6 indisponível para o Ambiente Vip: %s, pois não existe equipamento do Tipo Balanceador relacionado a este Ip.' % evip.show_environment_vip()) else: if not is_valid_ipv4(ip): self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) if len(evip.networkipv4_set.all()) <= 0: raise NetworkNotInEvip( 'IPv4', 'Não há rede no ambiente vip fornecido') ip_checked = Ip.get_by_octs_and_environment_vip( ip_list[0], ip_list[1], ip_list[2], ip_list[3], id_evip) ip_ok = False for ip_equip in ip_checked.ipequipamento_set.all(): if ip_equip.equipamento.tipo_equipamento == TipoEquipamento.get_tipo_balanceador( ): ip_ok = True break if not ip_ok: raise IpNotAvailableError( None, 'Ipv4 indisponível para o Ambiente Vip: %s, pois não existe equipamento do Tipo Balanceador relacionado a este Ip.' % evip.show_environment_vip()) ip_dict = model_to_dict(ip_checked) return self.response(dumps_networkapi({'ip': ip_dict})) except NetworkNotInEvip, e: return self.response_error(321, e.cause)
def handle_post(self, request, user, *args, **kwargs): """Handles GET requests get an IP6 available for vip_request by evip_id. URL: ip/availableip6/vip/id_evip """ self.log.info('Get an IP6 available for vip_request') try: # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') ip_map = networkapi_map.get('ip_map') # Get XML data id_evip = ip_map.get('id_evip') name = ip_map.get('name') if not is_valid_int_greater_zero_param(id_evip): self.log.error( u'Parameter id_evip is invalid. Value: %s.', id_evip) raise InvalidValueError(None, 'id_evip', id_evip) # Business Rules evip = EnvironmentVip.get_by_pk(id_evip) with distributedlock(LOCK_GET_IPV6_AVAILABLE % id_evip): ipv6 = Ipv6() len_network = len(evip.networkipv6_set.all()) if len_network <= 0: raise NetworkNotInEvip( None, 'Não há rede no ambiente vip fornecido') raise_not_found_balanceamento = False cont_network = 0 cont_balanceador_not_found = 0 for net in evip.networkipv6_set.all(): balanceador_found_flag = False cont_network = cont_network + 1 list_ips_equips = list() try: ip_available = ipv6.get_available_ip6(net.id) ip_new = Ipv6() ip_available = ip_available.split(':') ip_new.block1 = ip_available[0] ip_new.block2 = ip_available[1] ip_new.block3 = ip_available[2] ip_new.block4 = ip_available[3] ip_new.block5 = ip_available[4] ip_new.block6 = ip_available[5] ip_new.block7 = ip_available[6] ip_new.block8 = ip_available[7] ip_new.description = name for env_equipment in net.vlan.ambiente.equipamentoambiente_set.all(): equipment = env_equipment.equipamento if equipment.tipo_equipamento == TipoEquipamento.get_tipo_balanceador(): if equipment.id not in list_ips_equips: list_ips_equips.append(equipment.id) if ip_new.id is None: ip_new.save_ipv6( equipment.id, user, net) else: new_ip_equip = Ipv6Equipament() new_ip_equip.ip = ip_new new_ip_equip.equipamento = equipment new_ip_equip.save() balanceador_found_flag = True if not balanceador_found_flag: cont_balanceador_not_found = cont_balanceador_not_found + \ 1 else: break if cont_balanceador_not_found == len_network: raise_not_found_balanceamento = True raise IpNotAvailableError(None, 'Não há ipv6 disponivel para as redes associadas com o ' 'Ambiente Vip: %s - %s - %s, pois não existe equipamentos ' 'do Tipo Balanceador nessas redes.' % (evip.finalidade_txt, evip.cliente_txt, evip.ambiente_p44_txt)) except (IpNotAvailableError, IpRangeAlreadyAssociation), e: cont_balanceador_not_found = cont_balanceador_not_found + 1 if raise_not_found_balanceamento: raise IpNotAvailableError(None, e.message) elif len_network == cont_network: raise IpNotAvailableError(None, 'Não há ipv6 disponivel para as redes associdas com o ' 'Ambiente Vip: %s - %s - %s' % (evip.finalidade_txt, evip.cliente_txt, evip.ambiente_p44_txt)) transaction.commit() return self.response(dumps_networkapi({'ip': model_to_dict(ip_new)})) except NetworkNotInEvip, e: return self.response_error(321, 'ipv6')
def handle_post(self, request, user, *args, **kwargs): '''Handles GET requests get an IP4 available for vip_request by evip_id. URL: ip/availableip6/vip/id_evip/ ''' self.log.info('Get an IP4 available for vip_request') try: # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') ip_map = networkapi_map.get('ip_map') # Get XML data id_evip = ip_map.get('id_evip') name = ip_map.get('name') if not is_valid_int_greater_zero_param(id_evip): self.log.error( u'Parameter id_evip is invalid. Value: %s.', id_evip) raise InvalidValueError(None, 'id_evip', id_evip) # Business Rules evip = EnvironmentVip.get_by_pk(id_evip) ipv4 = Ip() len_network = len(evip.networkipv4_set.all()) raise_not_found_balanceamento = False if (len_network <= 0): raise NetworkNotInEvip( None, 'Não há rede no ambiente vip fornecido') cont_network = 0 cont_balanceador_not_found = 0 for net in evip.networkipv4_set.all(): balanceador_found_flag = False cont_network = cont_network + 1 list_ips_equips = list() try: ip_available = ipv4.get_available_ip(net.id) ip_new = Ip() ip_available = ip_available.exploded ip_available = ip_available.split(".") ip_new.oct1 = ip_available[0] ip_new.oct2 = ip_available[1] ip_new.oct3 = ip_available[2] ip_new.oct4 = ip_available[3] ip_new.descricao = name for env_equipment in net.vlan.ambiente.equipamentoambiente_set.all(): equipment = env_equipment.equipamento if equipment.tipo_equipamento == TipoEquipamento.get_tipo_balanceador(): if equipment.id not in list_ips_equips: list_ips_equips.append(equipment.id) if ip_new.id is None: ip_new.save_ipv4(equipment.id, user, net) else: new_ip_equip = IpEquipamento() new_ip_equip.ip = ip_new new_ip_equip.equipamento = equipment new_ip_equip.save(user) balanceador_found_flag = True if not balanceador_found_flag: cont_balanceador_not_found = cont_balanceador_not_found + \ 1 else: break if cont_balanceador_not_found == len_network: raise_not_found_balanceamento = True raise IpNotAvailableError(None, "Não há ipv4 disponivel para as redes associdas com o Ambiente Vip: %s - %s - %s, pois não existe equipamentos do Tipo Balanceador nessas redes." % ( evip.finalidade_txt, evip.cliente_txt, evip.ambiente_p44_txt)) except (IpNotAvailableError, IpRangeAlreadyAssociation), e: cont_balanceador_not_found = cont_balanceador_not_found + 1 if raise_not_found_balanceamento: raise IpNotAvailableError(None, e.message) elif len_network == cont_network: raise IpNotAvailableError(None, "Não há ipv4 disponivel para as redes associdas com o Ambiente Vip: %s - %s - %s" % ( evip.finalidade_txt, evip.cliente_txt, evip.ambiente_p44_txt)) return self.response(dumps_networkapi({"ip": model_to_dict(ip_new)}))
def handle_post(self, request, user, *args, **kwargs): '''Handles GET requests get an IP4 available for vip_request by evip_id. URL: ip/availableip6/vip/id_evip/ ''' self.log.info('Get an IP4 available for vip_request') try: # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION): self.log.error(u'User does not have permission to perform the operation.') return self.not_authorized() # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') ip_map = networkapi_map.get('ip_map') # Get XML data id_evip = ip_map.get('id_evip') name = ip_map.get('name') if not is_valid_int_greater_zero_param(id_evip): self.log.error(u'Parameter id_evip is invalid. Value: %s.', id_evip) raise InvalidValueError(None, 'id_evip', id_evip) # Business Rules evip = EnvironmentVip.get_by_pk(id_evip) with distributedlock(LOCK_GET_IPV4_AVAILABLE % id_evip): ipv4 = Ip() len_network = len(evip.networkipv4_set.all()) raise_not_found_balanceamento = False if (len_network <= 0): raise NetworkNotInEvip(None, 'Não há rede no ambiente vip fornecido') cont_network = 0 cont_balanceador_not_found = 0 for net in evip.networkipv4_set.all(): balanceador_found_flag = False cont_network = cont_network + 1 list_ips_equips = list() try: ip_available = ipv4.get_available_ip(net.id) ip_new = Ip() ip_available = ip_available.exploded ip_available = ip_available.split(".") ip_new.oct1 = ip_available[0] ip_new.oct2 = ip_available[1] ip_new.oct3 = ip_available[2] ip_new.oct4 = ip_available[3] ip_new.descricao = name for env_equipment in net.vlan.ambiente.equipamentoambiente_set.all(): equipment = env_equipment.equipamento if equipment.tipo_equipamento == TipoEquipamento.get_tipo_balanceador(): if equipment.id not in list_ips_equips: list_ips_equips.append(equipment.id) if ip_new.id is None: ip_new.save_ipv4(equipment.id, user, net) else: new_ip_equip = IpEquipamento() new_ip_equip.ip = ip_new new_ip_equip.equipamento = equipment new_ip_equip.save() balanceador_found_flag = True if not balanceador_found_flag: cont_balanceador_not_found = cont_balanceador_not_found + 1 else: break if cont_balanceador_not_found == len_network: raise_not_found_balanceamento = True raise IpNotAvailableError(None, "Não há ipv4 disponivel para as redes associdas com o Ambiente " "Vip: %s - %s - %s, pois não existe equipamentos do Tipo " "Balanceador nessas redes." % (evip.finalidade_txt, evip.cliente_txt, evip.ambiente_p44_txt)) except (IpNotAvailableError, IpRangeAlreadyAssociation), e: cont_balanceador_not_found = cont_balanceador_not_found + 1 if raise_not_found_balanceamento: raise IpNotAvailableError(None, e.message) elif len_network == cont_network: raise IpNotAvailableError(None, "Não há ipv4 disponivel para as redes associdas com o Ambiente " "Vip: %s - %s - %s" % (evip.finalidade_txt, evip.cliente_txt, evip.ambiente_p44_txt)) transaction.commit() return self.response(dumps_networkapi({"ip": model_to_dict(ip_new)})) except NetworkNotInEvip, e: return self.response_error(321, 'ipv4')
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 check an IPv4 or Ipv6 for vip request. URL: ip/checkvipip/ ''' self.log.info('Check a Ipv4 or Ipv6 for Vip') try: # Business Validations # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: msg = u'There is no value to the networkapi tag of XML request.' self.log.error(msg) return self.response_error(3, msg) ip_map = networkapi_map.get('ip_map') if ip_map is None: msg = u'There is no value to the ip tag of XML request.' self.log.error(msg) return self.response_error(3, msg) # Get XML data ip = ip_map.get('ip') id_evip = ip_map.get('id_evip') # User permission if not has_perm(user, AdminPermission.IPS, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Valid ip id if ip is None: self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) # Valid evip id if not is_valid_int_greater_zero_param(id_evip): raise InvalidValueError(None, 'id_evip', id_evip) # Business Rules evip = EnvironmentVip.get_by_pk(id_evip) ip_list = ip.split(".") if len(ip_list) == 1: if not is_valid_ipv6(ip): self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) if len(evip.networkipv6_set.all()) <= 0: raise NetworkNotInEvip( 'IPv6', 'Não há rede no ambiente vip fornecido') ip_list = ip.split(":") ip_checked = Ipv6.get_by_octs_and_environment_vip(ip_list[0], ip_list[1], ip_list[ 2], ip_list[3], ip_list[4], ip_list[5], ip_list[6], ip_list[7], id_evip) ip_ok = False for ip_equip in ip_checked.ipv6equipament_set.all(): if ip_equip.equipamento.tipo_equipamento == TipoEquipamento.get_tipo_balanceador(): ip_ok = True break if not ip_ok: raise IpNotAvailableError( None, "Ipv6 indisponível para o Ambiente Vip: %s, pois não existe equipamento do Tipo Balanceador relacionado a este Ip." % evip.show_environment_vip()) else: if not is_valid_ipv4(ip): self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) if len(evip.networkipv4_set.all()) <= 0: raise NetworkNotInEvip( 'IPv4', 'Não há rede no ambiente vip fornecido') ip_checked = Ip.get_by_octs_and_environment_vip( ip_list[0], ip_list[1], ip_list[2], ip_list[3], id_evip) ip_ok = False for ip_equip in ip_checked.ipequipamento_set.all(): if ip_equip.equipamento.tipo_equipamento == TipoEquipamento.get_tipo_balanceador(): ip_ok = True break if not ip_ok: raise IpNotAvailableError( None, "Ipv4 indisponível para o Ambiente Vip: %s, pois não existe equipamento do Tipo Balanceador relacionado a este Ip." % evip.show_environment_vip()) ip_dict = model_to_dict(ip_checked) return self.response(dumps_networkapi({'ip': ip_dict})) except NetworkNotInEvip, e: return self.response_error(321, e.cause)
def 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)