def handle_put(self, request, user, *args, **kwargs): '''Trata as requisições de PUT para inserir o relacionamento entre IP e Equipamento. 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) with distributedlock(LOCK_IP_EQUIPMENT % (ip_id, equip_id)): ip_equipment = insert_ip_equipment(ip_id, equip_id, user) ipequipamento_map = dict() ipequipamento_map['id'] = ip_equipment.id map = dict() map['ip_equipamento'] = ipequipamento_map return self.response(dumps_networkapi(map)) 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 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 create_ipv4(ipv4, user=None): """Creates a Ipv4.""" try: ipv4_obj = Ip() ipv4_obj.create_v3(ipv4) except ObjectDoesNotExistException, e: raise ObjectDoesNotExistException(e.detail)
def create_ipv4(ipv4, user): """Creates a Ipv4.""" try: ipv4_obj = Ip() ipv4_obj.create_v4(ipv4) except ObjectDoesNotExistException, e: raise ObjectDoesNotExistException(e.detail)
def _update_pool_member(members): """Updates pool members""" for member in members: ip = Ip.get_by_pk(member['ip']['id']) if member['ip'] else None ipv6 = Ipv6.get_by_pk(member['ipv6']['id']) if member['ipv6'] else None pool_member = ServerPoolMember.objects.get(id=member['id']) pool_member.ip = ip pool_member.ipv6 = ipv6 pool_member.weight = member['weight'] pool_member.priority = member['priority'] pool_member.port_real = member['port_real'] pool_member.member_status = member['member_status'] pool_member.limit = member['limit'] pool_member.save() if pool_member.server_pool.dscp: if pool_member.port_real != pool_member.server_pool.default_port: mb_name = '{}:{}'.format( (ip.ip_formated if ip else ipv6.ip_formated), member['port_real']) raise ValidationAPIException( 'DRSL3 Restriction: Pool Member {} cannot have different ' 'port of Pool {}'.format( mb_name, pool_member.server_pool.identifier))
def get_ipv4_by_id(ip_id): """Get Ipv4.""" try: network = Ip.get_by_pk(ip_id) except IpNotFoundError, e: raise ObjectDoesNotExistException(e.message)
def test_update_pool_member(self): save_member_mock = patch( 'networkapi.requisicaovips.models.ServerPoolMember.save').start() pool = ServerPool(id=1, default_limit=1) pool_member = ServerPoolMember() dict = { 'nome_equips': 'equip_name', 'weight': 1, 'priority': 1, 'port_real': 80 } ip = Ip(id=1) ipv6 = Ipv6(id=1) update_pool_member(pool, pool_member, dict, ip, ipv6, self.user) self.assertEquals(pool, pool_member.server_pool) self.assertEquals(1, pool_member.limit) self.assertEquals(ip, pool_member.ip) self.assertEquals(ipv6, pool_member.ipv6) self.assertEquals('equip_name', pool_member.identifier) self.assertEquals(1, pool_member.weight) self.assertEquals(1, pool_member.priority) self.assertEquals(80, pool_member.port_real) self.assertTrue(save_member_mock.called)
def handle_get(self, request, user, *args, **kwargs): """Handles GET requests to get a ipv4 by id. URLs: ip/get-ipv4/id_ip """ try: # Commons Validations # 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() # Business Validations # Valid id access id_ip = kwargs.get('id_ip') if not is_valid_int_greater_zero_param(id_ip): raise InvalidValueError(None, 'id_ip', id_ip) # Business Rules ip = Ip() ip = ip.get_by_pk(id_ip) ip_map = dict() equip_list = [] for ipequip in ip.ipequipamento_set.all(): equip_list.append(ipequip.equipamento.nome) # IP map ip_map = model_to_dict(ip) ip_map['equipamentos'] = equip_list if len( equip_list) > 0 else None # Return XML return self.response(dumps_networkapi({'ipv4': ip_map})) except InvalidValueError, e: self.log.error(u'Parameter %s is invalid. Value: %s.', e.param, e.value) return self.response_error(269, e.param, e.value)
def get_ip_objects(dic): ip_object = None ipv6_object = None if len(dic['ip']) <= 15: ip_object = Ip.get_by_pk(dic['id']) else: ipv6_object = Ipv6.get_by_pk(dic['id']) return ip_object, ipv6_object
def test_deploy_networkipv4_configuration_given_gateway_equipment_not_found( self): self.mock_ip_get_by_octets(Ip(oct1=192, oct2=168, oct3=0, oct4=0)) self.mock_find_equipamento_ip([]) with self.assertRaises(IncorrectRedundantGatewayRegistryException): deploy_networkIPv4_configuration(self.user, self.networkv4, self.equipment_list)
def test_get_ipv4(self): get_by_pk_mock = patch('networkapi.ip.models.Ip.get_by_pk').start() get_by_pk_mock.return_value = Ip() ip = get_ip_objects({'ip': '192.168.10.2', 'id': 1}) self.assertTrue(isinstance(ip[0], Ip)) self.assertIsNone(ip[1])
def handle_get(self, request, user, *args, **kwargs): """Handles GET requests to get a ipv4 by id. URLs: ip/get-ipv4/id_ip """ try: # Commons Validations # 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() # Business Validations # Valid id access id_ip = kwargs.get('id_ip') if not is_valid_int_greater_zero_param(id_ip): raise InvalidValueError(None, 'id_ip', id_ip) # Business Rules ip = Ip() ip = ip.get_by_pk(id_ip) ip_map = dict() equip_list = [] for ipequip in ip.ipequipamento_set.all(): equip_list.append(ipequip.equipamento.nome) # IP map ip_map = model_to_dict(ip) ip_map['equipamentos'] = equip_list if len( equip_list) > 0 else None # Return XML return self.response(dumps_networkapi({'ipv4': ip_map})) except InvalidValueError, e: self.log.error( u'Parameter %s is invalid. Value: %s.', e.param, e.value) return self.response_error(269, e.param, e.value)
def create(self, ipv4_id, networkipv4_id): ipv4 = Ip.get_by_pk(ipv4_id) networkipv4 = NetworkIPv4.get_by_pk(networkipv4_id) if len(DHCPRelayIPv4.objects.filter(ipv4=ipv4, networkipv4=networkipv4)) > 0: raise exceptions.DHCPRelayAlreadyExistsError(ipv4_id, networkipv4_id) self.ipv4 = ipv4 self.networkipv4 = networkipv4
def handle_get(self, request, user, *args, **kwargs): """Treat requests GET to verify that the IP belongs to environment. URLs: /ip/x1.x2.x3.x4/ambiente/<id_amb> URLs: /ip/<ip>/ambiente/<id_amb> """ self.log.info("GET to verify that the IP belongs to environment") try: # 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() environment_id = kwargs.get('id_amb') # Valid Environment ID if not is_valid_int_greater_zero_param(environment_id): self.log.error( u'The id_environment parameter is not a valid value: %s.', environment_id) raise InvalidValueError(None, 'id_environment', environment_id) ip = kwargs.get('ip') # Valid IP if not is_valid_ipv4(ip): self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) # Find Environment by ID to check if it exist Ambiente.get_by_pk(environment_id) # Existing IP octs = str(IPAddress(ip, 4).exploded).split('.') ip = Ip.get_by_octs_and_environment(octs[0], octs[1], octs[2], octs[3], environment_id) # Build dictionary return ip_map = dict() ip_map['id'] = ip.id ip_map['id_vlan'] = ip.networkipv4.vlan.id ip_map['oct4'] = ip.oct4 ip_map['oct3'] = ip.oct3 ip_map['oct2'] = ip.oct2 ip_map['oct1'] = ip.oct1 ip_map['descricao'] = ip.descricao return self.response(dumps_networkapi({'ip': ip_map})) 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 setUp(self): self.client = Client() self.mock_distributed_lock() #workaround on model loading issue #http://stackoverflow.com/questions/14386536/instantiating-django-model-raises-typeerror-isinstance-arg-2-must-be-a-class if not model_cache.loaded: model_cache._populate() self.ip = Ip(oct1 = 192, oct2 = 168, oct3 = 0, oct4 = 15) self.vip = RequisicaoVips(id = 1, ip = self.ip)
def handle_get(self, request, user, *args, **kwargs): """Treat requests GET to verify that the IP belongs to environment. URLs: /ip/x1.x2.x3.x4/ambiente/<id_amb> URLs: /ip/<ip>/ambiente/<id_amb> """ self.log.info("GET to verify that the IP belongs to environment") try: # 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() environment_id = kwargs.get('id_amb') # Valid Environment ID if not is_valid_int_greater_zero_param(environment_id): self.log.error( u'The id_environment parameter is not a valid value: %s.', environment_id) raise InvalidValueError(None, 'id_environment', environment_id) ip = kwargs.get('ip') # Valid IP if not is_valid_ipv4(ip): self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) # Find Environment by ID to check if it exist Ambiente.get_by_pk(environment_id) # Existing IP octs = str(IPAddress(ip, 4).exploded).split('.') ip = Ip.get_by_octs_and_environment( octs[0], octs[1], octs[2], octs[3], environment_id) # Build dictionary return ip_map = dict() ip_map['id'] = ip.id ip_map['id_vlan'] = ip.networkipv4.vlan.id ip_map['oct4'] = ip.oct4 ip_map['oct3'] = ip.oct3 ip_map['oct2'] = ip.oct2 ip_map['oct1'] = ip.oct1 ip_map['descricao'] = ip.descricao return self.response(dumps_networkapi({'ip': ip_map})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def test_deploy_networkipv4_configuration_with_inactive_vlan(self): self.networkv4.vlan.ativada = False ipv4 = Ip(oct1=192, oct2=168, oct3=0, oct4=0) self.mock_ip_get_by_octets(Ip(oct1=192, oct2=168, oct3=0, oct4=0)) self.mock_find_equipamento_ip([IpEquipamento()]) self.mock_dhcp_relay_find([DHCPRelayIPv4(ipv4=ipv4)]) self.mock_find_roteiro( EquipamentoRoteiro(roteiro=Roteiro(roteiro='roteiro'))) self.mock_template_file_read('script content') deploy_config_mock = self.mock_deploy_config('config_deployed') network_activation_mock = self.mock_network_activation() vlan_activation_mock = self.mock_vlan_activation() response = deploy_networkIPv4_configuration(self.user, self.networkv4, self.equipment_list) self.assertTrue(deploy_config_mock.called) network_activation_mock.assert_called_with(self.user) vlan_activation_mock.assert_called_with(self.user) self.assertEquals({1: 'config_deployed'}, response)
def update_vip_request(vip_request, user): """ update Vip Request """ vip = models.VipRequest.get_by_pk(vip_request['id']) vip.name = vip_request['name'] vip.service = vip_request['service'] vip.business = vip_request['business'] vip.environmentvip_id = vip_request['environmentvip'] vip.ipv4 = Ip.get_by_pk( vip_request['ipv4']) if vip_request['ipv4'] else None vip.ipv6 = Ipv6.get_by_pk( vip_request['ipv6']) if vip_request['ipv6'] else None option_ids = [ int(option.optionvip.id) for option in vip.viprequestoptionvip_set.all() ] options = [ int(vip_request['options'][key]) for key in vip_request['options'] ] option_remove = list(set(option_ids) - set(options)) option_create = list(set(options) - set(option_ids)) vip.save() _update_port(vip_request['ports'], vip) _create_option(option_create, vip.id) _delete_option(option_remove, vip.id) dsrl3 = OptionVip.objects.filter( nome_opcao_txt='DSRL3', tipo_opcao='Retorno de trafego').values('id') if dsrl3: if dsrl3[0]['id'] in option_remove: models.VipRequestDSCP.objects.filter(vip_request=vip.id).delete() # perms groups_perm = vip_request.get('groups_permissions', []) groups_perm += facade_usr.get_groups( vip_request.get('users_permissions', [])) groups = facade_usr.reduce_groups(groups_perm) perm = vip_request.get('permissions') perm_replace = perm.get('replace') if perm else False update_groups_permissions(groups, vip.id, user, perm_replace) # sync with old tables syncs.new_to_old(vip)
def buscar_ip(id_sw): ip_sw=None ips = IpEquipamento() ips = ips.list_by_equip(id_sw) for ip in ips: ip_sw = Ip.get_by_pk(ip.ip.id) if not ip_sw==None: ip_sw = str(ip_sw.oct1)+'.'+str(ip_sw.oct2)+'.'+str(ip_sw.oct3)+'.'+str(ip_sw.oct4) return ip_sw
def _create_pool_member(members, pool): """Creates pool members""" for member in members: ip = Ip.get_by_pk(member['ip']['id']) if member['ip'] else None ipv6 = Ipv6.get_by_pk(member['ipv6']['id']) if member['ipv6'] else None identifier = ip.ip_formated if ip else ipv6.ip_formated pool_member = ServerPoolMember() pool_member.server_pool = pool pool_member.ip = ip pool_member.ipv6 = ipv6 pool_member.identifier = identifier pool_member.weight = member['weight'] pool_member.priority = member['priority'] pool_member.port_real = member['port_real'] pool_member.member_status = member['member_status'] pool_member.limit = member['limit'] pool_member.save() # vip with dsrl3 using pool if pool.dscp: mbs = pool_member.get_spm_by_eqpt_id(pool_member.equipment.id) # check all the pools related to this pool vip request to filter # dscp value related_viprequestports = pool.vips[0].viprequestport_set.all() vippools = [ p.viprequestportpool_set.all()[0].server_pool_id for p in related_viprequestports ] sps = ServerPool.objects.filter(serverpoolmember__in=mbs).exclude( id__in=vippools) dscps = [sp.dscp for sp in sps] mb_name = '{}:{}'.format( (ip.ip_formated if ip else ipv6.ip_formated), member['port_real']) if pool.dscp in dscps: raise ValidationAPIException( 'DRSL3 Restriction: Pool Member {} cannot be insert' ' in Pool {}, because already in other pool'.format( mb_name, pool.identifier)) if pool_member.port_real != pool.default_port: raise ValidationAPIException( 'DRSL3 Restriction: Pool Member {} cannot have different' ' port of Pool {}'.format(mb_name, pool.identifier))
def test_task_id_create_in_delete_one_ipv6_success(self, *args): """V4 Test success of id task generate for ipv6 delete success.""" mock_get_ipv6 = args[1] mock_delete_ipv6 = args[2] ipv6 = Ip(id=1) user = Usuario(id='1', nome='test') mock_delete_ipv6.return_value = ipv6 mock_get_ipv6.return_value = ipv6 delete_ipv6(1, user.id) mock_delete_ipv6.assert_called_with(1)
def test_task_id_create_in_post_one_ipv4_success(self, *args): """V4 Test success of id task generate for ipv4 post success.""" mock_get_user = args[1] mock_create_ipv4 = args[2] ipv4 = Ip(id=1) user = Usuario(id=1, nome='test') mock_create_ipv4.return_value = ipv4 mock_get_user.return_value = user create_ipv4({}, user.id) mock_create_ipv4.assert_called_with({}, user)
def get_id_ip(real): """ Get real id_ip by octs/block and equipment """ equip = Equipamento().get_by_name(real['real_name']) # Check ip type if is_valid_ipv4(real['real_ip']) is True: oct = real['real_ip'].split('.') ip = Ip().get_by_octs_equipment( oct[0], oct[1], oct[2], oct[3], equip.id) else: block = real['real_ip'].split(':') ip = Ipv6().get_by_blocks_equipment(block[0], block[1], block[2], block[ 3], block[4], block[5], block[6], block[7], equip.id) return ip.id
def handle_get(self, request, user, *args, **kwargs): """Trata as requisições de GET para consulta de um ambiente. Consulta o ambiente de um IP associado a um Equipamento. URL: /ambiente/equipamento/<nome_equip>/ip/<x1>.<x2>.<x3>.<x4>/ """ equipment_name = kwargs.get('nome_equip') oct1 = kwargs.get('x1') oct2 = kwargs.get('x2') oct3 = kwargs.get('x3') oct4 = kwargs.get('x4') if equipment_name is None or oct1 is None or oct2 is None or oct3 is None or oct4 is None: return super(AmbienteEquipamentoResource, self).handle_get(request, user, *args, **kwargs) self.log.debug('nome_equip = %s', equipment_name) self.log.debug('x1 = %s', oct1) self.log.debug('x2 = %s', oct2) self.log.debug('x3 = %s', oct3) self.log.debug('x4 = %s', oct4) try: equip = Equipamento().get_by_name(equipment_name) if not has_perm(user, AdminPermission.ENVIRONMENT_MANAGEMENT, AdminPermission.READ_OPERATION, None, equip.id, AdminPermission.EQUIP_READ_OPERATION): return self.not_authorized() ip = Ip().get_by_octs_equipment(oct1, oct2, oct3, oct4, equip.id) environment_map = get_environment_map(ip.vlan.ambiente) map = dict() map['ambiente'] = environment_map return self.response(dumps_networkapi(map)) except EquipamentoNotFoundError: return self.response_error(117, equipment_name) except IpNotFoundError: return self.response_error( 118, oct1 + '.' + oct2 + '.' + oct3 + '.' + oct4, equip.id) except (IpError, EquipamentoError, GrupoError): return self.response_error(1)
def test_task_id_create_in_put_one_ipv6_success(self, *args): """V4 Test success of id task generate for ipv6 put success.""" mock_get_user = args[1] mock_get_ipv6 = args[2] mock_update_ipv6 = args[3] ipv6 = Ip(id=1) user = Usuario(id=1, nome='test') mock_update_ipv6.return_value = ipv6 mock_get_ipv6.return_value = ipv6 mock_get_user.return_value = user update_ipv6({'id': 1}, user.id) mock_update_ipv6.assert_called_with({'id': 1}, user)
def handle_get(self, request, user, *args, **kwargs): '''Handles GET requests get an IP4 available. URL: ip/availableip4/ip_rede ''' self.log.info('Get an IP4 available') try: # 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() # Business Validations # Valid id access id_network = kwargs.get('id_rede') if not is_valid_int_greater_zero_param(id_network): self.log.error(u'Parameter id_rede is invalid. Value: %s.', id_network) raise InvalidValueError(None, 'id_rede', id_network) # Business Rules ip = Ip.get_available_ip(id_network) list_ip = [] list_ip.append(ip) network_map = dict() map_aux = dict() map_aux['ip'] = list_ip network_map['ip'] = map_aux # Business Rules return self.response(dumps_networkapi(network_map)) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_get(self, request, user, *args, **kwargs): '''Handles GET requests get an IP4 available. URL: ip/availableip4/ip_rede ''' self.log.info('Get an IP4 available') try: # 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() # Business Validations # Valid id access id_network = kwargs.get('id_rede') if not is_valid_int_greater_zero_param(id_network): self.log.error( u'Parameter id_rede is invalid. Value: %s.', id_network) raise InvalidValueError(None, 'id_rede', id_network) # Business Rules ip = Ip.get_available_ip(id_network) list_ip = [] list_ip.append(ip) network_map = dict() map_aux = dict() map_aux['ip'] = list_ip network_map['ip'] = map_aux # Business Rules return self.response(dumps_networkapi(network_map)) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_get(self, request, user, *args, **kwargs): '''Handles GET requests for delete an IP4 URL: ip4/delete/id_ip4 ''' self.log.info('Delete an IP4') 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() # Business Validations # Valid id access id_ip = kwargs.get('id_ipv4') if not is_valid_int_greater_zero_param(id_ip): self.log.error(u'Parameter id_ip is invalid. Value: %s.', id_ip) raise InvalidValueError(None, 'id_rede', id_ip) ip = Ip.get_by_pk(id_ip) with distributedlock(LOCK_IPV4 % id_ip): # Business Rules ip.delete() # Business Rules return self.response(dumps_networkapi({})) except IpCantBeRemovedFromVip, e: return self.response_error(319, "ip", 'ipv4', id_ip)
def handle_get(self, request, user, *args, **kwargs): '''Handles GET requests for delete an IP4 URL: ip4/delete/id_ip4 ''' self.log.info('Delete an IP4') 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() # Business Validations # Valid id access id_ip = kwargs.get('id_ipv4') if not is_valid_int_greater_zero_param(id_ip): self.log.error( u'Parameter id_ip is invalid. Value: %s.', id_ip) raise InvalidValueError(None, 'id_rede', id_ip) ip = Ip.get_by_pk(id_ip) with distributedlock(LOCK_IPV4 % id_ip): # Business Rules ip.delete() # Business Rules return self.response(dumps_networkapi({})) except IpCantBeRemovedFromVip, e: return self.response_error(319, "ip", 'ipv4', id_ip)
def create_vip_request(vip_request, user): """ Create Vip Request """ # Remove when RequisicaoVips is die req = RequisicaoVips() req.save() vip = models.VipRequest() vip.id = req.id vip.name = vip_request['name'] vip.service = vip_request['service'] vip.business = vip_request['business'] vip.environmentvip_id = vip_request['environmentvip'] vip.ipv4 = Ip.get_by_pk( vip_request['ipv4']) if vip_request['ipv4'] else None vip.ipv6 = Ipv6.get_by_pk( vip_request['ipv6']) if vip_request['ipv6'] else None option_create = [ vip_request['options'][key] for key in vip_request['options'] ] vip.save() _create_port(vip_request['ports'], vip) _create_option(option_create, vip.id) # perms groups_perm = vip_request.get('groups_permissions', []) groups_perm += facade_usr.get_groups( vip_request.get('users_permissions', [])) groups = facade_usr.reduce_groups(groups_perm) create_groups_permissions(groups, vip.id, user) # sync with old tables syncs.new_to_old(vip) return vip
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 insert_vip_request(vip_map, user): """Insere uma requisição de VIP. @param vip_map: Mapa com os dados da requisição. @param user: Usuário autenticado. @return: Em caso de sucesso: tupla (0, <requisição de VIP>). Em caso de erro: tupla (código da mensagem de erro, argumento01, argumento02, ...) @raise IpNotFoundError: IP não cadastrado. @raise IpError: Falha ao pesquisar o IP. @raise HealthcheckExpectNotFoundError: HealthcheckExpect não cadastrado. @raise HealthcheckExpectError: Falha ao pesquisar o HealthcheckExpect. @raise InvalidFinalidadeValueError: Finalidade com valor inválido. @raise InvalidClienteValueError: Cliente com valor inválido. @raise InvalidAmbienteValueError: Ambiente com valor inválido. @raise InvalidCacheValueError: Cache com valor inválido. @raise InvalidMetodoBalValueError: Valor do método de balanceamento inválido. @raise InvalidPersistenciaValueError: Persistencia com valor inválido. @raise InvalidHealthcheckTypeValueError: Healthcheck_Type com valor inválido ou inconsistente em relação ao valor do healthcheck_expect. @raise InvalidTimeoutValueError: Timeout com valor inválido. @raise InvalidHostNameError: Host não cadastrado. @raise EquipamentoError: Falha ao pesquisar o equipamento. @raise InvalidMaxConValueError: Número máximo de conexões com valor inválido. @raise InvalidBalAtivoValueError: Bal_Ativo com valor inválido. @raise InvalidTransbordoValueError: Transbordo com valor inválido. @raise InvalidServicePortValueError: Porta do Serviço com valor inválido. @raise InvalidRealValueError: Valor inválido de um real. @raise InvalidHealthcheckValueError: Valor do healthcheck inconsistente em relação ao valor do healthcheck_type. @raise RequisicaoVipsError: Falha ao inserir a requisição de VIP. @raise UserNotAuthorizedError: """ log = logging.getLogger('insert_vip_request') if not has_perm(user, AdminPermission.VIPS_REQUEST, AdminPermission.WRITE_OPERATION): raise UserNotAuthorizedError( None, u'Usuário não tem permissão para executar a operação.') ip_id = vip_map.get('id_ip') if not is_valid_int_greater_zero_param(ip_id): log.error(u'The ip_id parameter is not a valid value: %s.', ip_id) raise InvalidValueError(None, 'ip_id', ip_id) else: ip_id = int(ip_id) vip = RequisicaoVips() vip.ip = Ip() vip.ip.id = ip_id # Valid ports vip_map, code = vip.valid_values_ports(vip_map) if code is not None: return code, vip # get environmentVip for validation dynamic heathcheck finalidade = vip_map.get('finalidade') cliente = vip_map.get('cliente') ambiente = vip_map.get('ambiente') if not is_valid_string_minsize( finalidade, 3) or not is_valid_string_maxsize(finalidade, 50): log.error(u'Finality value is invalid: %s.', finalidade) raise InvalidValueError(None, 'finalidade', finalidade) if not is_valid_string_minsize(cliente, 3) or not is_valid_string_maxsize( cliente, 50): log.error(u'Client value is invalid: %s.', cliente) raise InvalidValueError(None, 'cliente', cliente) if not is_valid_string_minsize(ambiente, 3) or not is_valid_string_maxsize( ambiente, 50): log.error(u'Environment value is invalid: %s.', ambiente) raise InvalidValueError(None, 'ambiente', ambiente) try: environment_vip = EnvironmentVip.get_by_values(finalidade, cliente, ambiente) except Exception, e: raise EnvironmentVipNotFoundError( e, 'The fields finality or client or ambiente is None')
def handle_get(self, request, user, *args, **kwargs): """Handles GET requests to list all network IPv4 by network ipv4 id. URLs: ip/id_network_ipv4/id_rede """ try: # Commons Validations # 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() # Business Validations # Valid id access id_network = kwargs.get('id_rede') if not is_valid_int_greater_zero_param(id_network): raise InvalidValueError(None, 'id_rede', id_network) # Business Rules NetworkIPv4.get_by_pk(id_network) ips = Ip.list_by_network(id_network) try: len(ips) except Exception, e: raise InvalidValueError(None, 'id_rede', id_network) if ips is None or len(ips) <= 0: raise IpNotFoundError(305, id_network) EquipIps = [] mapa = dict() # lista = [] try: for ip in ips: EquipIps = [] equipsIp = IpEquipamento.list_by_ip(ip.id) for eIp in equipsIp: EquipIps.append(eIp) mapa[ip.id] = EquipIps # lista.append(mapa) except IpEquipmentNotFoundError: EquipIps.append(None) except IpError: EquipIps.append(None) network_map = dict() list_ips = [] for ip in ips: lequips = [] ip_maps = dict() ip_maps = model_to_dict(ip) for equip in mapa.get(ip.id): equip = Equipamento.get_by_pk(equip.equipamento.id) lequips.append(model_to_dict(equip)) ip_maps['equipamento'] = lequips list_ips.append(ip_maps) network_map['ips'] = list_ips # Return XML return self.response(dumps_networkapi(network_map))
def handle_post(self, request, user, *args, **kwargs): """Handles POST requests to edit an IP. URL: ipv4/edit/ """ self.log.info('Edit an IP') 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 id_ip = ip_map.get('id_ip') description = ip_map.get('descricao') ip4 = ip_map.get('ip4') # Valid id_ip if not is_valid_int_greater_zero_param(id_ip): self.log.error( u'Parameter id_ip is invalid. Value: %s.', id_ip) raise InvalidValueError(None, 'id_ip', id_ip) if not is_valid_string_maxsize(ip4, 15): self.log.error(u'Parameter ip4 is invalid. Value: %s.', ip4) raise InvalidValueError(None, 'ip4', description) # Valid description 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): raise UserNotAuthorizedError( None, u'User does not have permission to perform the operation.') # Business Rules # New IP ip = Ip() ip = ip.get_by_pk(id_ip) with distributedlock(LOCK_IPV4 % id_ip): # 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) # 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] # Persist ip.edit_ipv4(user) return self.response(dumps_networkapi({})) except UserNotAuthorizedError: return self.not_authorized() except IndexError: msg = 'Invalid IP %s' % ip_error return self.response_error(150, msg) except IpNotFoundError, e: return self.response_error(150, e.message)
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_get(self, request, user, *args, **kwargs): """Handles GET requests to get a ipv4. URLs: ip/get/id_ip """ try: # Commons Validations # 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() # Business Validations # Valid id access id_ip = kwargs.get('id_ip') if not is_valid_int_greater_zero_param(id_ip): raise InvalidValueError(None, 'id_ip', id_ip) # Business Rules ip = Ip() ip = ip.get_by_pk(id_ip) EquipIps = [] mapa = dict() #lista = [] try: EquipIps = [] equipsIp = IpEquipamento.list_by_ip(ip.id) for eIp in equipsIp: EquipIps.append(eIp) mapa[ip.id] = EquipIps # lista.append(mapa) except IpEquipmentNotFoundError: EquipIps.append(None) except IpError: EquipIps.append(None) network_map = dict() list_ips = [] lequips = [] lequips = [] 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 for equip in mapa.get(ip.id): equip = Equipamento.get_by_pk(equip.equipamento.id) lequips.append(model_to_dict(equip)) ip_maps['equipamento'] = lequips list_ips.append(ip_maps) list_ips network_map['ips'] = list_ips # Return XML return self.response(dumps_networkapi(network_map)) except InvalidValueError, e: self.log.error( u'Parameter %s is invalid. Value: %s.', e.param, e.value) return self.response_error(269, e.param, e.value)
def insert_ip(ip_map, user): '''Insere um IP e o relacionamento entre o IP e o equipamento. @param ip_map: Map com as chaves: id_equipamento, id_vlan e descricao @param user: Usuário autenticado na API. @return Em caso de erro retorna a tupla: (código da mensagem de erro, argumento01, argumento02, ...) Em caso de sucesso retorna a tupla: (0, <mapa com os dados do IP>) @raise VlanNotFoundError: VLAN não cadastrada. @raise VlanError: Falha ao pesquisar a VLAN. @raise EquipamentoNotFoundError: Equipamento não cadastrado. @raise EquipamentoError: Falha ao pesquisar o Equipamento. @raise IpNotAvailableError: Não existe um IP disponível para a VLAN. @raise IpError: Falha ao inserir no banco de dados. @raise UserNotAuthorizedError: Usuário sem autorização para executar a operação. ''' log = logging.getLogger('insert_ip') equip_id = ip_map.get('id_equipamento') if not is_valid_int_greater_zero_param(equip_id): log.error( u'The equip_id parameter is not a valid value: %s.', equip_id) raise InvalidValueError(None, 'equip_id', equip_id) else: equip_id = int(equip_id) if not has_perm(user, AdminPermission.IPS, AdminPermission.WRITE_OPERATION, None, equip_id, AdminPermission.EQUIP_WRITE_OPERATION): raise UserNotAuthorizedError( None, u'Usuário não tem permissão para executar a operação.') vlan_id = ip_map.get('id_vlan') if not is_valid_int_greater_zero_param(vlan_id): log.error(u'The vlan_id parameter is not a valid value: %s.', vlan_id) raise InvalidValueError(None, 'vlan_id', vlan_id) else: vlan_id = int(vlan_id) desc_ip = ip_map.get('descricao') if desc_ip is not None: if not is_valid_string_maxsize(desc_ip, 100) or not is_valid_string_minsize(desc_ip, 3): log.error(u'Parameter desc_ip is invalid. Value: %s.', desc_ip) raise InvalidValueError(None, 'desc_ip', desc_ip) ip = Ip() ip.descricao = desc_ip ip.create(user, equip_id, vlan_id, False) ip_map = dict() ip_map['id'] = ip.id ip_map['id_redeipv4'] = ip.networkipv4.id ip_map['oct4'] = ip.oct4 ip_map['oct3'] = ip.oct3 ip_map['oct2'] = ip.oct2 ip_map['oct1'] = ip.oct1 ip_map['descricao'] = ip.descricao return 0, ip_map
def prepare_apply(load_balance, vip, created=True, user=None): vip_request = copy.deepcopy(vip) id_vip = str(vip_request.get('id')) equips, conf, cluster_unit = _validate_vip_to_apply( vip_request, created, user) cache_group = OptionVip.objects.get( id=vip_request.get('options').get('cache_group')) traffic_return = OptionVip.objects.get( id=vip_request.get('options').get('traffic_return')) timeout = OptionVip.objects.get( id=vip_request.get('options').get('timeout')) persistence = OptionVip.objects.get( id=vip_request.get('options').get('persistence')) if vip_request['ipv4']: ipv4 = Ip.get_by_pk(vip_request['ipv4']) if vip_request[ 'ipv4'] else None vip_request['ipv4'] = { 'id': ipv4.id, 'ip_formated': ipv4.ip_formated } if vip_request['ipv6']: ipv6 = Ipv6.get_by_pk(vip_request['ipv6']) if vip_request[ 'ipv6'] else None vip_request['ipv6'] = { 'id': ipv6.id, 'ip_formated': ipv6.ip_formated } if conf: conf = json.loads(conf) vip_request['options'] = dict() vip_request['options']['cache_group'] = { 'id': cache_group.id, 'nome_opcao_txt': cache_group.nome_opcao_txt } vip_request['options']['traffic_return'] = { 'id': traffic_return.id, 'nome_opcao_txt': traffic_return.nome_opcao_txt } vip_request['options']['timeout'] = { 'id': timeout.id, 'nome_opcao_txt': timeout.nome_opcao_txt } vip_request['options']['persistence'] = { 'id': persistence.id, 'nome_opcao_txt': persistence.nome_opcao_txt } vip_request['options']['cluster_unit'] = cluster_unit try: vip_request['options']['dscp'] = VipRequestDSCP.objects.get( vip_request=vip_request['id'] ).dscp except: vip_request['options']['dscp'] = None pass for idx, port in enumerate(vip_request['ports']): for i, pl in enumerate(port['pools']): pool = get_pool_by_id(pl['server_pool']) pool_serializer = pool_slz.PoolV3Serializer(pool) l7_rule = OptionVip.objects.get( id=pl['l7_rule']).nome_opcao_txt healthcheck = pool_serializer.data['healthcheck'] healthcheck['identifier'] = reserve_name_healthcheck( pool_serializer.data['identifier']) healthcheck['new'] = True vip_request['ports'][idx]['pools'][i]['server_pool'] = { 'id': pool_serializer.data['id'], 'nome': pool_serializer.data['identifier'], 'lb_method': pool_serializer.data['lb_method'], 'healthcheck': healthcheck, 'action': pool_serializer.data['servicedownaction']['name'], 'pool_created': pool_serializer.data['pool_created'], 'pools_members': [{ 'id': pool_member['id'], 'identifier': pool_member['identifier'], 'ip': pool_member['ip']['ip_formated'] if pool_member['ip'] else pool_member['ipv6']['ip_formated'], 'port': pool_member['port_real'], 'member_status': pool_member['member_status'], 'limit': pool_member['limit'], 'priority': pool_member['priority'], 'weight': pool_member['weight'] } for pool_member in pool_serializer.data['server_pool_members']] } vip_request['ports'][idx]['pools'][i]['l7_rule'] = l7_rule l7_protocol = OptionVip.objects.get( id=port['options']['l7_protocol']) l4_protocol = OptionVip.objects.get( id=port['options']['l4_protocol']) vip_request['ports'][idx]['options'] = dict() vip_request['ports'][idx]['options']['l7_protocol'] = { 'id': l7_protocol.id, 'nome_opcao_txt': l7_protocol.nome_opcao_txt } vip_request['ports'][idx]['options']['l4_protocol'] = { 'id': l4_protocol.id, 'nome_opcao_txt': l4_protocol.nome_opcao_txt } vip_request['conf'] = conf if conf: for idx, layer in enumerate(conf['conf']['layers']): requiments = layer.get('requiments') if requiments: # validate for port for idx_port, port in enumerate(vip['ports']): for requiment in requiments: condicionals = requiment.get('condicionals') for condicional in condicionals: validated = True validations = condicional.get('validations') for validation in validations: if validation.get('type') == 'optionvip': validated &= valid_expression( validation.get('operator'), int(vip['options'][ validation.get('variable')]), int(validation.get('value')) ) if validation.get('type') == 'portoptionvip': validated &= valid_expression( validation.get('operator'), int(port['options'][ validation.get('variable')]), int(validation.get('value')) ) if validation.get('type') == 'field' and validation.get('variable') == 'cluster_unit': validated &= valid_expression( validation.get('operator'), cluster_unit, validation.get('value') ) if validated: use = condicional.get('use') for item in use: definitions = item.get('definitions') eqpts = item.get('eqpts') if eqpts: eqpts = Equipamento.objects.filter( id__in=eqpts, maintenance=0, tipo_equipamento__tipo_equipamento=u'Balanceador').distinct() if facade_eqpt.all_equipments_are_in_maintenance(equips): raise exceptions_eqpt.AllEquipmentsAreInMaintenanceException() if user: if not facade_eqpt.all_equipments_can_update_config(equips, user): raise exceptions_eqpt.UserDoesNotHavePermInAllEqptException( 'User does not have permission to update conf in eqpt. \ Verify the permissions of user group with equipment group. Vip:{}'.format( vip_request['id'])) for eqpt in eqpts: eqpt_id = str(eqpt.id) if not load_balance.get(eqpt_id): equipment_access = EquipamentoAcesso.search( equipamento=eqpt.id ) plugin = PluginFactory.factory( eqpt) load_balance[eqpt_id] = { 'plugin': plugin, 'access': equipment_access, 'vips': [], 'layers': {}, } idx_layer = str(idx) idx_port_str = str(port['port']) if not load_balance[eqpt_id]['layers'].get(id_vip): load_balance[eqpt_id][ 'layers'][id_vip] = dict() if load_balance[eqpt_id]['layers'][id_vip].get(idx_layer): if load_balance[eqpt_id]['layers'][id_vip].get(idx_layer).get('definitions').get(idx_port_str): load_balance[eqpt_id]['layers'][id_vip][idx_layer][ 'definitions'][idx_port_str] += definitions else: load_balance[eqpt_id]['layers'][id_vip][idx_layer][ 'definitions'][idx_port_str] = definitions else: load_balance[eqpt_id]['layers'][id_vip][idx_layer] = { 'vip_request': vip_request, 'definitions': { idx_port_str: definitions } } # In first validated==True stops conditionals. # Removing this break will add a wrong # conditional. break for e in equips: eqpt_id = str(e.id) if not load_balance.get(eqpt_id): equipment_access = EquipamentoAcesso.search( equipamento=e.id ) plugin = PluginFactory.factory(e) load_balance[eqpt_id] = { 'plugin': plugin, 'access': equipment_access, 'vips': [], 'layers': {}, } load_balance[eqpt_id]['vips'].append({'vip_request': vip_request}) return load_balance
def get_dict_v4_to_use_in_configuration_deploy(user, networkipv4, equipment_list): '''Generate dictionary with vlan an IP information to be used to generate template dict for equipment configuration Args: networkipv4 NetworkIPv4 object equipment_list: Equipamento objects list Returns: 2-dimension dictionary with equipments information for template rendering ''' try: gateway_ip = Ip.get_by_octs_and_net(networkipv4.oct1, networkipv4.oct2, networkipv4.oct3, networkipv4.oct4+1, networkipv4) except IpNotFoundError: log.error("Equipment IPs not correctly registered. \ Router equipments should have first IP of network allocated for them.") raise exceptions.IncorrectRedundantGatewayRegistryException() ips = IpEquipamento.objects.filter(ip=gateway_ip, equipamento__in=equipment_list) if len(ips) != len(equipment_list): log.error("Equipment IPs not correctly registered. \ Router equipments should have first IP of network allocated for them.") raise exceptions.IncorrectRedundantGatewayRegistryException() dict_ips = dict() if networkipv4.vlan.vrf is not None and networkipv4.vlan.vrf is not '': dict_ips["vrf"] = networkipv4.vlan.vrf elif networkipv4.vlan.ambiente.vrf is not None and networkipv4.vlan.ambiente.vrf is not '': dict_ips["vrf"] = networkipv4.vlan.ambiente.vrf dict_ips["gateway"] = "%d.%d.%d.%d" % (gateway_ip.oct1, gateway_ip.oct2, gateway_ip.oct3, gateway_ip.oct4) dict_ips["ip_version"] = "IPV4" dict_ips["equipments"] = dict() dict_ips["vlan_num"] = networkipv4.vlan.num_vlan dict_ips["vlan_name"] = networkipv4.vlan.nome dict_ips["cidr_block"] = networkipv4.block dict_ips["mask"] = "%d.%d.%d.%d" % (networkipv4.mask_oct1, networkipv4.mask_oct2, networkipv4.mask_oct3, networkipv4.mask_oct4) dict_ips["wildmask"] = "%d.%d.%d.%d" % (255-networkipv4.mask_oct1, 255-networkipv4.mask_oct2, 255-networkipv4.mask_oct3, 255-networkipv4.mask_oct4) if _has_active_network_in_vlan(networkipv4.vlan): dict_ips["first_network"] = False else: dict_ips["first_network"] = True #Check IPs for routers when there are multiple gateways if len(equipment_list) > 1: dict_ips["gateway_redundancy"] = True equip_number = 0 for equipment in equipment_list: ip_equip = IpEquipamento.objects.filter(equipamento=equipment, ip__networkipv4=networkipv4).exclude(ip=gateway_ip)\ .select_related('ip') if ip_equip == []: log.error("Error: Equipment IPs not correctly registered. \ In case of multiple gateways, they should have an IP other than the gateway registered.") raise exceptions.IncorrectNetworkRouterRegistryException ip = ip_equip[0].ip dict_ips[equipment] = dict() dict_ips[equipment]["ip"] = "%s.%s.%s.%s" % (ip.oct1, ip.oct2, ip.oct3, ip.oct4) dict_ips[equipment]["prio"] = 100+equip_number equip_number += 1 else: dict_ips["gateway_redundancy"] = False dict_ips[equipment_list[0]] = dict() dict_ips[equipment_list[0]]["ip"] = dict_ips["gateway"] dict_ips[equipment_list[0]]["prio"] = 100 return dict_ips
def network_ipv4_add(self, user, vlan_id, network_type, environment_vip, prefix=None): try: # Valid vlan ID if not is_valid_int_greater_zero_param(vlan_id): self.log.error( u'Parameter id_vlan is invalid. Value: %s.', vlan_id) raise InvalidValueError(None, 'id_vlan', vlan_id) # Network Type # Valid network_type ID """ if not is_valid_int_greater_zero_param(network_type): self.log.error( u'Parameter id_tipo_rede is invalid. Value: %s.', network_type) raise InvalidValueError(None, 'id_tipo_rede', network_type) """ # Find network_type by ID to check if it exist net = None if network_type: net = TipoRede.get_by_pk(network_type) # Environment Vip if environment_vip is not None: # Valid environment_vip ID if not is_valid_int_greater_zero_param(environment_vip): self.log.error( u'Parameter id_ambiente_vip is invalid. Value: %s.', environment_vip) raise InvalidValueError( None, 'id_ambiente_vip', environment_vip) # Find Environment VIP by ID to check if it exist evip = EnvironmentVip.get_by_pk(environment_vip) else: evip = None # Business Rules # New NetworkIPv4 network_ipv4 = NetworkIPv4() vlan_map = network_ipv4.add_network_ipv4(user, vlan_id, net, evip, prefix) list_equip_routers_ambient = EquipamentoAmbiente.get_routers_by_environment(vlan_map['vlan']['id_ambiente']) if list_equip_routers_ambient: # Add Adds the first available ipv4 on all equipment # that is configured as a router for the environment related to # network ip = Ip.get_first_available_ip(vlan_map['vlan']['id_network']) ip = str(ip).split('.') ip_model = Ip() ip_model.oct1 = ip[0] ip_model.oct2 = ip[1] ip_model.oct3 = ip[2] ip_model.oct4 = ip[3] ip_model.networkipv4_id = network_ipv4.id ip_model.save() if len(list_equip_routers_ambient) > 1: multiple_ips = True else: multiple_ips = False for equip in list_equip_routers_ambient: IpEquipamento().create(user, ip_model.id, equip.equipamento.id) if multiple_ips: router_ip = Ip.get_first_available_ip(vlan_map['vlan']['id_network'], True) router_ip = str(router_ip).split('.') ip_model2 = Ip() ip_model2.oct1 = router_ip[0] ip_model2.oct2 = router_ip[1] ip_model2.oct3 = router_ip[2] ip_model2.oct4 = router_ip[3] ip_model2.networkipv4_id = vlan_map['vlan']['id_network'] ip_model2.save() IpEquipamento().create(user, ip_model2.id, equip.equipamento.id) # Return XML return self.response(dumps_networkapi(vlan_map)) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def create_ipv4(self): return Ip(oct1=10, oct2=170, oct3=0, oct4=4)
def handle_post(self, request, user, *args, **kwargs): """Handles POST requests to get an IPv4 or Ipv6 by oct or blocks . URL: ip/getbyoctblock/ """ self.log.info("Get a Ipv4's or Ipv6's") 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') # 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 if not is_valid_ip_ipaddr(ip): self.log.error(u'Parameter ip is invalid. Value: %s.', ip) raise InvalidValueError(None, 'ip', ip) # Business Rules version = '' ip_list = ip.split('.') if len(ip_list) == 1: ip_list = ip.split(':') ips = Ipv6.get_by_blocks(ip_list[0], ip_list[1], ip_list[2], ip_list[ 3], ip_list[4], ip_list[5], ip_list[6], ip_list[7]) version = IP_VERSION.IPv6[1] else: ips = Ip.get_by_octs( ip_list[0], ip_list[1], ip_list[2], ip_list[3]) version = IP_VERSION.IPv4[1] ips_list = [] for ip in ips: ip_dict = model_to_dict(ip) ip_dict['version'] = version ips_list.append(ip_dict) return self.response(dumps_networkapi({'ips': ips_list})) except XMLError, x: self.log.error(u'Error reading the XML request.') return self.response_error(3, x)
def handle_post(self, request, user, *args, **kwargs): '''Handles POST requests to 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): """Treat POST requests to insert vlan URL: vlan/insert/ """ try: # Generic method for v4 and v6 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') network_ipv4 = vlan_map.get('network_ipv4') network_ipv6 = vlan_map.get('network_ipv6') vrf = vlan_map.get('vrf') # 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) if not network_ipv4 or not str(network_ipv4).isdigit(): self.log.error( u'Parameter network_ipv4 is invalid. Value: %s.', network_ipv4) raise InvalidValueError(None, 'network_ipv4', network_ipv4) if not network_ipv6 or not str(network_ipv6).isdigit(): self.log.error( u'Parameter network_ipv6 is invalid. Value: %s.', network_ipv6) raise InvalidValueError(None, 'network_ipv6', network_ipv6) # vrf can NOT be greater than 100 if not is_valid_string_maxsize(vrf, 100, False): self.log.error( u'Parameter vrf is invalid. Value: %s.', vrf) raise InvalidValueError(None, 'vrf', vrf) network_ipv4 = int(network_ipv4) network_ipv6 = int(network_ipv6) if network_ipv4 not in range(0, 2): self.log.error( u'Parameter network_ipv4 is invalid. Value: %s.', network_ipv4) raise InvalidValueError(None, 'network_ipv4', network_ipv4) if network_ipv6 not in range(0, 2): self.log.error( u'Parameter network_ipv6 is invalid. Value: %s.', network_ipv6) raise InvalidValueError(None, 'network_ipv6', network_ipv6) 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() # 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) vlan.acl_file_name = acl_file vlan.acl_file_name_v6 = acl_file_v6 vlan.num_vlan = number vlan.nome = name vlan.descricao = description vlan.ambiente = ambiente vlan.ativada = 0 vlan.acl_valida = 0 vlan.acl_valida_v6 = 0 vlan.insert_vlan(user) if network_ipv4: network_ipv4 = NetworkIPv4() vlan_map = network_ipv4.add_network_ipv4( user, vlan.id, None, None, None) list_equip_routers_ambient = EquipamentoAmbiente.objects.select_related('equipamento').filter( ambiente=vlan.ambiente.id, is_router=True) if list_equip_routers_ambient: # Add Adds the first available ipv4 on all equipment # that is configured as a router for the environment related to # network ip = Ip.get_first_available_ip(network_ipv4.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_ipv4.id ip_model.save(user) if len(list_equip_routers_ambient) > 1 and network_ipv4.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_ipv4.id, True) router_ip = str(router_ip).split('.') ip_model2 = Ip() ip_model2.oct1 = router_ip[0] ip_model2.oct2 = router_ip[1] ip_model2.oct3 = router_ip[2] ip_model2.oct4 = router_ip[3] ip_model2.networkipv4_id = network_ipv4.id ip_model2.save(user) IpEquipamento().create(user, ip_model2.id, equip.equipamento.id) if network_ipv6: network_ipv6 = NetworkIPv6() vlan_map = network_ipv6.add_network_ipv6( user, vlan.id, None, None, None) list_equip_routers_ambient = EquipamentoAmbiente.objects.filter( ambiente=vlan.ambiente.id, is_router=True) if list_equip_routers_ambient: # Add Adds the first available ipv6 on all equipment # that is configured as a router for the environment related to # network ipv6 = Ipv6.get_first_available_ip6(network_ipv6.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_ipv6.id ipv6_model.save(user) if len(list_equip_routers_ambient) > 1: 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_ipv6.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_ipv6.id ipv6_model2.save(user) Ipv6Equipament().create(user, ipv6_model2.id, equip.equipamento.id) map = dict() listaVlan = dict() listaVlan['id'] = vlan.id listaVlan['nome'] = vlan.nome listaVlan['acl_file_name'] = vlan.acl_file_name listaVlan['descricao'] = vlan.descricao listaVlan['id_ambiente'] = vlan.ambiente.id listaVlan['ativada'] = vlan.ativada listaVlan['acl_valida'] = vlan.acl_valida map['vlan'] = listaVlan # Delete vlan's cache # destroy_cache_function() # Return XML return self.response(dumps_networkapi(map)) except VlanACLDuplicatedError, e: return self.response_error(311, acl_file)
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): """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 get_dict_v4_to_use_in_configuration_deploy(user, networkipv4, equipment_list): """Generate dictionary with vlan an IP information to be used to generate template dict for equipment configuration Args: networkipv4 NetworkIPv4 object equipment_list: Equipamento objects list Returns: 2-dimension dictionary with equipments information for template rendering """ try: gateway_ip = Ip.get_by_octs_and_net(networkipv4.oct1, networkipv4.oct2, networkipv4.oct3, networkipv4.oct4 + 1, networkipv4) except IpNotFoundError: log.error('Equipment IPs not correctly registered. \ Router equipments should have first IP of network allocated for them.') raise exceptions.IncorrectRedundantGatewayRegistryException() ips = IpEquipamento.objects.filter( ip=gateway_ip, equipamento__in=equipment_list) if len(ips) != len(equipment_list): log.error('Equipment IPs not correctly registered. \ Router equipments should have first IP of network allocated for them.') raise exceptions.IncorrectRedundantGatewayRegistryException() dict_ips = dict() if networkipv4.vlan.vrf is not None and networkipv4.vlan.vrf is not '': dict_ips['vrf'] = networkipv4.vlan.vrf elif networkipv4.vlan.ambiente.vrf is not None and networkipv4.vlan.ambiente.vrf is not '': dict_ips['vrf'] = networkipv4.vlan.ambiente.vrf # DHCPRelay list dhcprelay_list = DHCPRelayIPv4.objects.filter(networkipv4=networkipv4) if len(dhcprelay_list) > 0: dict_ips['dhcprelay_list'] = [] for dhcprelay in dhcprelay_list: ipv4 = '%s.%s.%s.%s' % ( dhcprelay.ipv4.oct1, dhcprelay.ipv4.oct2, dhcprelay.ipv4.oct3, dhcprelay.ipv4.oct4) dict_ips['dhcprelay_list'].append(ipv4) dict_ips['gateway'] = '%d.%d.%d.%d' % ( gateway_ip.oct1, gateway_ip.oct2, gateway_ip.oct3, gateway_ip.oct4) dict_ips['ip_version'] = 'IPV4' dict_ips['equipments'] = dict() dict_ips['vlan_num'] = networkipv4.vlan.num_vlan dict_ips['vlan_name'] = networkipv4.vlan.nome dict_ips['cidr_block'] = networkipv4.block dict_ips['mask'] = '%d.%d.%d.%d' % ( networkipv4.mask_oct1, networkipv4.mask_oct2, networkipv4.mask_oct3, networkipv4.mask_oct4) dict_ips['wildmask'] = '%d.%d.%d.%d' % ( 255 - networkipv4.mask_oct1, 255 - networkipv4.mask_oct2, 255 - networkipv4.mask_oct3, 255 - networkipv4.mask_oct4) if _has_active_network_in_vlan(networkipv4.vlan): dict_ips['first_network'] = False else: dict_ips['first_network'] = True # Check IPs for routers when there are multiple gateways if len(equipment_list) > 1: dict_ips['gateway_redundancy'] = True equip_number = 0 for equipment in equipment_list: ip_equip = IpEquipamento.objects.filter(equipamento=equipment, ip__networkipv4=networkipv4).exclude(ip=gateway_ip)\ .select_related('ip') if ip_equip == []: log.error('Error: Equipment IPs not correctly registered. \ In case of multiple gateways, they should have an IP other than the gateway registered.') raise exceptions.IncorrectNetworkRouterRegistryException() ip = ip_equip[0].ip dict_ips[equipment] = dict() dict_ips[equipment]['ip'] = '%s.%s.%s.%s' % ( ip.oct1, ip.oct2, ip.oct3, ip.oct4) dict_ips[equipment]['prio'] = 100 + equip_number equip_number += 1 else: dict_ips['gateway_redundancy'] = False dict_ips[equipment_list[0]] = dict() dict_ips[equipment_list[0]]['ip'] = dict_ips['gateway'] dict_ips[equipment_list[0]]['prio'] = 100 return dict_ips
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_get(self, request, user, *args, **kwargs): """Handles GET requests to get a ipv4 and ipv6 of determined Equip. URLs: ip/getbyequip/id_equip """ try: # Commons Validations # 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() if not has_perm(user, AdminPermission.EQUIPMENT_MANAGEMENT, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Business Validations # Valid id access id_equip = kwargs.get('id_equip') if not is_valid_int_greater_zero_param(id_equip): raise InvalidValueError(None, 'id_equip', id_equip) # Business Rules listadeIps6 = [] listaDeIps4 = [] equip = Equipamento.get_by_pk(id_equip) ipEquip = IpEquipamento() ips = ipEquip.list_by_equip(equip.id) for ip4 in ips: listaDeIps4.append(Ip.get_by_pk(ip4.ip.id)) ips = Ipv6Equipament.list_by_equip(equip.id) for ip6 in ips: listadeIps6.append(Ipv6.get_by_pk(ip6.ip.id)) network_map = dict() list_ips = [] list_ip4 = [] list_ip6 = [] dict_ips = dict() ip4_maps = dict() ip6_maps = dict() for ip4 in listaDeIps4: ip4_maps['id'] = ip4.id ip4_maps['oct1'] = ip4.oct1 ip4_maps['oct2'] = ip4.oct2 ip4_maps['oct3'] = ip4.oct3 ip4_maps['oct4'] = ip4.oct4 ip4_maps['descricao'] = ip4.descricao ip4_maps['id_rede'] = ip4.networkipv4_id list_ip4.append(ip4_maps) ip4_maps = dict() for ip6 in listadeIps6: ip6_maps['id'] = ip6.id ip6_maps['block1'] = ip6.block1 ip6_maps['block2'] = ip6.block2 ip6_maps['block3'] = ip6.block3 ip6_maps['block4'] = ip6.block4 ip6_maps['block5'] = ip6.block5 ip6_maps['block6'] = ip6.block6 ip6_maps['block7'] = ip6.block7 ip6_maps['block8'] = ip6.block8 ip6_maps['descricao'] = ip6.description ip6_maps['id_rede'] = ip6.networkipv6_id list_ip6.append(ip6_maps) ip6_maps = dict() dict_ips['ipv4'] = list_ip4 dict_ips['ipv6'] = list_ip6 list_ips.append(dict_ips) network_map['ips'] = list_ips # Return XML return self.response(dumps_networkapi(network_map)) except InvalidValueError, e: self.log.error( u'Parameter %s is invalid. Value: %s.', e.param, e.value) return self.response_error(269, e.param, e.value)
def handle_post(self, request, user, *args, **kwargs): '''Handles POST requests to add an IP and associate it to an equipment. URL: ipv4/ ''' self.log.info('Add an IP and associate it to an equipment') 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') 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_equipment') network_ipv4_id = ip_map.get('id_network_ipv4') description = ip_map.get('description') # 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) # Description can NOT be greater than 100 if not is_valid_string_maxsize(description, 100) or not is_valid_string_minsize(description, 3): self.log.error( u'Parameter descricao is invalid. Value: %s.', description) raise InvalidValueError(None, 'descricao', 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() ip.descricao = description # Persist ip.create(user, equip_id, network_ipv4_id, True) # Generate return map ip_map = dict() ip_map['id'] = ip.id ip_map['id_redeipv4'] = ip.networkipv4.id ip_map['oct4'] = ip.oct4 ip_map['oct3'] = ip.oct3 ip_map['oct2'] = ip.oct2 ip_map['oct1'] = ip.oct1 ip_map['descricao'] = ip.descricao return self.response(dumps_networkapi({'ip': ip_map})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_post(self, request, user, *args, **kwargs): """ Handles POST requests to list all the VIPs related to IPv4 id. URL: vip/ipv4/all/ """ try: # Commons Validations # User permission if not has_perm(user, AdminPermission.VIPS_REQUEST, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Business Validations # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error(3, u'There is no value to the networkapi tag of XML request.') vip_map = networkapi_map.get('vip') if vip_map is None: return self.response_error(3, u'There is no value to the vip tag of XML request.') # Get XML data ip_str = str(vip_map['ipv4']) all_prop = str(vip_map['all_prop']) # Valid IPv4 if not is_valid_ip(ip_str): self.log.error( u'Parameter ipv4 is invalid. Value: %s.', ip_str) raise InvalidValueError(None, 'ipv4', ip_str) # Valid all_prop if not is_valid_int_param(all_prop): self.log.error( u'Parameter all_prop is invalid. Value: %s.', all_prop) raise InvalidValueError(None, 'all_prop', all_prop) all_prop = int(all_prop) if all_prop not in (0, 1): self.log.error( u'Parameter all_prop is invalid. Value: %s.', all_prop) raise InvalidValueError(None, 'all_prop', all_prop) # Find IPv4 by octs octs = ip_str.split('.') if len(octs) != 4: self.log.error( u'Parameter ipv4 is invalid. Value: %s.', ip_str) raise InvalidValueError(None, 'ipv4', ip_str) ipv4 = Ip().get_by_octs(octs[0], octs[1], octs[2], octs[3]) # Business Rules list_ips = [] for ip in ipv4: ips_map = dict() ips_map = model_to_dict(ip) # Find all VIPs related to ipv4 if all_prop == 1: ips_map["vips"] = ip.requisicaovips_set.all().values() else: vips = ip.requisicaovips_set.all().values_list( 'id', flat=True) ips_map["vips"] = [int(item) for item in vips] list_ips.append(ips_map) # Return XML vips_map = dict() vips_map['ips'] = list_ips return self.response(dumps_networkapi(vips_map)) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
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): '''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_get(self, request, user, *args, **kwargs): """Handles GET requests to get a ipv4 and ipv6 of determined Equip. URLs: ip/getbyequip/id_equip """ try: # Commons Validations # 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() if not has_perm(user, AdminPermission.EQUIPMENT_MANAGEMENT, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Business Validations # Valid id access id_equip = kwargs.get('id_equip') if not is_valid_int_greater_zero_param(id_equip): raise InvalidValueError(None, 'id_equip', id_equip) # Business Rules listadeIps6 = [] listaDeIps4 = [] equip = Equipamento.get_by_pk(id_equip) ipEquip = IpEquipamento() ips = ipEquip.list_by_equip(equip.id) for ip4 in ips: listaDeIps4.append(Ip.get_by_pk(ip4.ip.id)) ips = Ipv6Equipament.list_by_equip(equip.id) for ip6 in ips: listadeIps6.append(Ipv6.get_by_pk(ip6.ip.id)) network_map = dict() list_ips = [] list_ip4 = [] list_ip6 = [] dict_ips = dict() ip4_maps = dict() ip6_maps = dict() for ip4 in listaDeIps4: ip4_maps['id'] = ip4.id ip4_maps['oct1'] = ip4.oct1 ip4_maps['oct2'] = ip4.oct2 ip4_maps['oct3'] = ip4.oct3 ip4_maps['oct4'] = ip4.oct4 ip4_maps['descricao'] = ip4.descricao ip4_maps['id_rede'] = ip4.networkipv4_id list_ip4.append(ip4_maps) ip4_maps = dict() for ip6 in listadeIps6: ip6_maps['id'] = ip6.id ip6_maps['block1'] = ip6.block1 ip6_maps['block2'] = ip6.block2 ip6_maps['block3'] = ip6.block3 ip6_maps['block4'] = ip6.block4 ip6_maps['block5'] = ip6.block5 ip6_maps['block6'] = ip6.block6 ip6_maps['block7'] = ip6.block7 ip6_maps['block8'] = ip6.block8 ip6_maps['descricao'] = ip6.description ip6_maps['id_rede'] = ip6.networkipv6_id list_ip6.append(ip6_maps) ip6_maps = dict() dict_ips['ipv4'] = list_ip4 dict_ips['ipv6'] = list_ip6 list_ips.append(dict_ips) network_map['ips'] = list_ips # Return XML return self.response(dumps_networkapi(network_map)) except InvalidValueError, e: self.log.error(u'Parameter %s is invalid. Value: %s.', e.param, e.value) return self.response_error(269, e.param, e.value)
def save_server_pool_member(user, sp, list_server_pool_member): list_pool_member = list() old_priorities_list = list() # Remove empty values from list id_pool_member_noempty = [x['id_pool_member'] for x in list_server_pool_member if x['id_pool_member'] != ''] #exclue server pool member del_smp = sp.serverpoolmember_set.exclude(id__in=id_pool_member_noempty) if del_smp: for obj in del_smp: obj.delete(user) #execute script remove real if pool already created #commit transaction after each successful script call if sp.pool_created: command = settings.POOL_REAL_REMOVE % (obj.server_pool_id, obj.ip_id if obj.ip else obj.ipv6_id, obj.port_real) code, _, _ = exec_script(command) if code != 0: raise exceptions.ScriptCreatePoolException() transaction.commit() if list_server_pool_member: apply_new_priorities = False for dic in list_server_pool_member: # ip_object = None ipv6_object = None if len(dic['ip']) <= 15: ip_object = Ip.get_by_pk(dic['id']) else: ipv6_object = Ipv6.get_by_pk(dic['id']) id_pool = sp.id id_ip = ip_object and ip_object.id or ipv6_object and ipv6_object.id port_ip = dic['port_real'] if dic['id_pool_member']: spm = ServerPoolMember.objects.get(id=dic['id_pool_member']) spm.server_pool = sp spm.identifier = dic['nome_equips'] spm.ip = ip_object spm.ipv6 = ipv6_object spm.weight = dic['weight'] spm.limit = sp.default_limit old_spm_priority = spm.priority old_priorities_list.append(old_spm_priority) spm.priority = dic['priority'] spm.port_real = dic['port_real'] spm.save(user) if(old_spm_priority != spm.priority and sp.pool_created): apply_new_priorities = True else: spm = ServerPoolMember(server_pool=sp, identifier=dic['nome_equips'], ip=ip_object, ipv6=ipv6_object, priority=dic['priority'], weight=dic['weight'], limit=sp.default_limit, port_real=dic['port_real']) spm.save(user) old_priorities_list.append(dic['priority']) #execute script to create real if pool already created #commits transaction. Rolls back if script returns error if sp.pool_created: transaction.commit() #def prepare_and_save(self, server_pool, ip, ip_type, priority, weight, port_real, user, commit=False): #spm.prepare_and_save(sp, ip_object, IP_VERSION.IPv4[1], dic['priority'], dic['weight'], dic['port_real'], user, True) command = settings.POOL_REAL_CREATE % (id_pool, id_ip, port_ip) code, _, _ = exec_script(command) if code != 0: spm.delete(user) transaction.commit() raise exceptions.ScriptCreatePoolException() #if sp.healthcheck_id: # spm.healthcheck = sp.healthcheck list_pool_member.append(spm) #Applies new priority in pool - only 1 script run for all members if(apply_new_priorities): transaction.commit() command = settings.POOL_MEMBER_PRIORITIES % (sp.id) code, _, _ = exec_script(command) if code != 0: for i in len(old_priorities_list): list_pool_member[i].priority = old_priorities_list[i] list_pool_member[i].save(user) transaction.commit() raise exceptions.ScriptAlterPriorityPoolMembersException() return list_pool_member