def get(self, request, *args, **kwargs): """ Method to return finality, client or environment vip list. Param request.GET["finality"]: finality of environment(optional) Param request.GET["client"]: client of environment(optional) Param request.GET["environmentp44"]: environmentp44(optional) Return finality list: when request has no finality and client. Return client list: when request has only finality. Return environment vip list: when request has finality and client. Return object environment vip: when request has finality and client and environmentp44. """ try: data = request.GET finality = data.get('finality', '') client = data.get('client', '') environmentp44 = data.get('environmentp44', '') if client != '' and finality != '': if environmentp44 != '': obj = EnvironmentVip().get_by_values( finality, client, environmentp44) many = False else: obj = EnvironmentVip( ).list_all_ambientep44_by_finality_and_cliente( finality, client) many = True evip_values = serializers.EnvironmentVipV3Serializer( obj, many=many, fields=self.fields, include=self.include, exclude=self.exclude, kind=self.kind).data elif finality != '': evip_values = EnvironmentVip().list_all_clientes_by_finalitys( finality) else: evip_values = EnvironmentVip().list_all_finalitys() return CustomResponse(evip_values, status=status.HTTP_200_OK, request=request) except Exception, exception: log.error(exception) raise api_exceptions.NetworkAPIException()
def handle_get(self, request, user, *args, **kwargs): """Treat GET requests list all Environment VIP Availables. URL: environmentvip/search/id_vlan """ try: id_vlan = int(kwargs['id_vlan']) self.log.info("List all Environment VIP availables") # Commons Validations # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_VIP, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Business Rules evips = EnvironmentVip.objects.all() evip_list = EnvironmentVip.available_evips(EnvironmentVip(), evips, id_vlan) return self.response( dumps_networkapi({'environment_vip': evip_list})) except (EnvironmentVipError, GrupoError), e: self.log.error(e) return self.response_error(1)
def create_environment_vip(environment_vip): try: env = EnvironmentVip() env.create_v3(environment_vip) except Exception, e: raise NetworkAPIException(str(e))
def setUp(self): self.user = Usuario() self.vlan = Vlan(id=1, ambiente=Ambiente(id=1)) self.network_type = TipoRede(id=1) self.vip_env = EnvironmentVip(id=1) self.network = NetworkIPv4(oct1=10, oct2=126, oct3=1, oct4=0, block=24) self.mock_distributed_lock() self.mock_transaction()
def handle_post(self, request, user, *args, **kwargs): """Treat requests Post to search cliente_txt of Environment VIP by finalidade_txt URL: environmentvip/search/ """ try: self.log.info( "Search cliente_txt Environment VIP by finalidade_txt") # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_VIP, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error(3, u'There is no value to the networkapi tag of XML request.') environmentvip_map = networkapi_map.get('vip') if environmentvip_map is None: return self.response_error(3, u'There is no value to the vip tag of XML request.') # Get XML data finalidade = environmentvip_map.get('finalidade_txt') if not is_valid_string_maxsize(finalidade, 50) or not is_valid_string_minsize(finalidade, 3) or not is_valid_text(finalidade): self.log.error( u'The finalidade_txt parameter is not a valid value: %s.', finalidade) raise InvalidValueError(None, 'finalidade_txt', finalidade) environmentVip = EnvironmentVip() evip_values = environmentVip.list_all_clientes_by_finalitys( finalidade) evips = dict() evips_list = [] for evip in evip_values: evips['finalidade_txt'] = finalidade evips['cliente_txt'] = evip.get('cliente_txt') evips_list.append(evips) evips = dict() return self.response(dumps_networkapi({'cliente_txt': evips_list})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_post(self, request, user, *args, **kwargs): """Treat requests POST to insert Environment VIP. URL: environmentvip/ """ try: self.log.info('Add Environment VIP') # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_VIP, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error( 3, u'There is no value to the networkapi tag of XML request.' ) environmentvip_map = networkapi_map.get('environment_vip') if environmentvip_map is None: return self.response_error( 3, u'There is no value to the environment_vip tag of XML request.' ) # New Environment Vip environment_vip = EnvironmentVip() # Valid Environment Vip environment_vip.valid_environment_vip(environmentvip_map) try: # Save Environment Vip environment_vip.save() except Exception, e: self.log.error(u'Failed to save the environment vip.') raise EnvironmentVipError( e, u'Failed to save the environment vip') environment_map = dict() environment_map['id'] = environment_vip.id return self.response( dumps_networkapi({'environment_vip': environment_map}))
def test_reals_can_associate_server_pool_given_environment_linked_to_vip_environment(self): # imported locally given conflict in namespace from networkapi.api_pools.views.v1 import reals_can_associate_server_pool self.mock_get_environment_vips_by_environment_id( EnvironmentVip(id=1, finalidade_txt='environment_1')) self.mock_get_environment_list_by_environment_vip_list( [self.create_environment()]) self.mock_get_ip_by_ok(self.create_ipv4()) self.mock_find_environment_by_id(self.create_environment()) reals_can_associate_server_pool(self.create_server_pool_model(), [ self.create_real_dict()])
def test_add_network_given_vlan_not_found(self): self.mock_get_network_type_by_pk(TipoRede(id=1)) self.mock_get_vip_environment_by_pk(EnvironmentVip(id=1)) add_network_mock = self.mock_add_network_ipv4(VlanNotFoundError('')) response = self.client.post("/network/ipv4/add/", XML.format(cidr='24', vlan=1, vip_env=1, net_type=1), content_type="text/xml") xml_map = self.parse_response(response) self.assertEquals( "VLAN not registered", xml_map.get('networkapi').get('erro').get('descricao')) self.assertEquals(500, response.status_code) self.assertTrue(add_network_mock.called)
def test_add_network_given_no_more_available_ip_addresses(self): self.mock_get_network_type_by_pk(TipoRede(id=1)) self.mock_get_vip_environment_by_pk(EnvironmentVip(id=1)) add_network_mock = self.mock_add_network_ipv4( NetworkIPv4AddressNotAvailableError('')) response = self.client.post("/network/ipv4/add/", XML.format(cidr='24', vlan=1, vip_env=1, net_type=1), content_type="text/xml") xml_map = self.parse_response(response) self.assertEquals( "Unavailable address to create a NetworkIPv4", xml_map.get('networkapi').get('erro').get('descricao')) self.assertEquals(500, response.status_code) self.assertTrue(add_network_mock.called)
def test_add_network_given_invalid_environment_config(self): self.mock_get_network_type_by_pk(TipoRede(id=1)) self.mock_get_vip_environment_by_pk(EnvironmentVip(id=1)) add_network_mock = self.mock_add_network_ipv4( ConfigEnvironmentInvalidError('')) response = self.client.post('/network/ipv4/add/', XML.format(cidr='24', vlan=1, vip_env=1, net_type=1), content_type='text/xml') xml_map = self.parse_response(response) self.assertEquals( 'Invalid Environment Configuration or not registered', xml_map.get('networkapi').get('erro').get('descricao')) self.assertEquals(500, response.status_code) self.assertTrue(add_network_mock.called)
def test_add_network_given_successfully(self): self.mock_get_network_type_by_pk(TipoRede(id=1)) self.mock_get_vip_environment_by_pk(EnvironmentVip(id=1)) add_network_mock = self.mock_add_network_ipv4(self.get_vlan_map()) self.mock_get_equipamento_ambiente( EquipamentoAmbiente(equipamento=Equipamento(id=1))) self.mock_get_first_available_ip("192.168.10.18") self.mock_ip_save() self.mock_ip_equipamento_create() response = self.client.post("/network/ipv4/add/", XML.format(cidr='24', vlan=1, vip_env=1, net_type=1), content_type="text/xml") xml_map = self.parse_response(response) self.assertIsNotNone(xml_map.get('networkapi').get('vlan')) self.assertEquals(200, response.status_code) self.assertTrue(add_network_mock.called)
def test_add_network_given_no_first_ip_available(self): self.mock_get_network_type_by_pk(TipoRede(id=1)) self.mock_get_vip_environment_by_pk(EnvironmentVip(id=1)) add_network_mock = self.mock_add_network_ipv4({'vlan': {}}) self.mock_get_equipamento_ambiente( EquipamentoAmbiente(equipamento=Equipamento(id=1))) self.mock_get_first_available_ip( IpNotAvailableError('Endereço IP não dispoínvel')) response = self.client.post("/network/ipv4/add/", XML.format(cidr='24', vlan=1, vip_env=1, net_type=1), content_type="text/xml") xml_map = self.parse_response(response) self.assertEquals( "Causa: Endereço IP não dispoínvel, Mensagem: None", xml_map.get('networkapi').get('erro').get('descricao')) self.assertEquals(500, response.status_code) self.assertTrue(add_network_mock.called)
def handle_get(self, request, user, *args, **kwargs): """Handles GET requests to find all finalitys of environment VIP. URLs: /vip/get/finality """ self.log.info('Find all finality distinct of environment_vip') try: # Commons Validations # User permission if not has_perm(user, AdminPermission.VIPS_REQUEST, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() evip = EnvironmentVip() # Business Validations evips = evip.list_all_finalitys() finality_map = dict() finality_list = [] for evip in evips: finality_map['finality'] = evip.get('finalidade_txt') finality_list.append(finality_map) finality_map = dict() return self.response( dumps_networkapi({'finalidade': finality_list})) except InvalidValueError, e: self.log.error(u'Parameter %s is invalid. Value: %s.', e.param, e.value) return self.response_error(269, e.param, e.value)
def 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 old_to_new(vip_request): from networkapi.ambiente.models import EnvironmentVip from networkapi.api_vip_request.models import VipRequest, VipRequestDSCP, VipRequestOptionVip, \ VipRequestPort, VipRequestPortOptionVip, VipRequestPortPool from networkapi.requisicaovips.models import DsrL3_to_Vip, OptionVip, OptionVipEnvironmentVip, \ VipPortToPool mp = vip_request.variables_to_map() try: try: ev = EnvironmentVip().get_by_values( mp['finalidade'], mp['cliente'], mp['ambiente']) except: ev = EnvironmentVip() ev.finalidade_txt = mp['finalidade'] ev.cliente_txt = mp['cliente'] ev.ambiente_p44_txt = mp['ambiente'] ev.description = '%s - %s - %s' % ( mp['finalidade'], mp['cliente'], mp['ambiente']) ev.save() finally: vp = VipRequest() vp.environmentvip = ev vp.id = vip_request.id vp.name = mp['host'] if mp.get('host') else None vp.business = mp['areanegocio'] if mp.get( 'areanegocio') else vp.name vp.service = mp['nome_servico'] if mp.get( 'nome_servico') else vp.name vp.ipv4 = vip_request.ip if vip_request.ip else None vp.ipv6 = vip_request.ipv6 if vip_request.ipv6 else None vp.created = vip_request.vip_criado vp.save() if mp.get('persistencia'): persistencia = mp['persistencia'] else: persistencia = '(nenhum)' try: op_per = OptionVip.objects.filter( tipo_opcao=u'Persistencia', nome_opcao_txt=persistencia)[0] try: opv = OptionVipEnvironmentVip.objects.get( option=op_per, environment=ev) except: opv = OptionVipEnvironmentVip() opv.option = op_per opv.environment = ev opv.save() except: op_per = OptionVip() op_per.tipo_opcao = u'Persistencia' op_per.nome_opcao_txt = persistencia op_per.save() opv = OptionVipEnvironmentVip() opv.option = op_per opv.environment = ev opv.save() finally: try: vro = VipRequestOptionVip.objects.get( optionvip=op_per, vip_request=vp) except: vro = VipRequestOptionVip() vro.optionvip = op_per vro.vip_request = vp vro.save() if mp.get('timeout'): timeout = mp['timeout'] else: timeout = '5' try: op_time = OptionVip.objects.filter( tipo_opcao=u'timeout', nome_opcao_txt=timeout)[0] try: opv = OptionVipEnvironmentVip.objects.get( option=op_time, environment=ev) except: opv = OptionVipEnvironmentVip() opv.option = op_time opv.environment = ev opv.save() except: op_time = OptionVip() op_time.tipo_opcao = u'timeout' op_time.nome_opcao_txt = timeout op_time.save() opv = OptionVipEnvironmentVip() opv.option = op_time opv.environment = ev opv.save() finally: try: vro = VipRequestOptionVip.objects.get( optionvip=op_time, vip_request=vp) except: vro = VipRequestOptionVip() vro.optionvip = op_time vro.vip_request = vp vro.save() if mp.get('trafficreturn'): trafficreturn = mp['trafficreturn'] else: trafficreturn = 12 try: op_traffic = OptionVip.objects.filter( tipo_opcao=u'Retorno de trafego', id=trafficreturn)[0] try: opv = OptionVipEnvironmentVip.objects.get( option=op_traffic, environment=ev) except: opv = OptionVipEnvironmentVip() opv.option = op_traffic opv.environment = ev opv.save() except: op_traffic = OptionVip() op_traffic.tipo_opcao = u'Retorno de trafego' op_traffic.nome_opcao_txt = trafficreturn op_traffic.save() opv = OptionVipEnvironmentVip() opv.option = op_traffic opv.environment = ev opv.save() finally: try: vro = VipRequestOptionVip.objects.get( optionvip=op_traffic, vip_request=vp) except: vro = VipRequestOptionVip() vro.optionvip = op_traffic vro.vip_request = vp vro.save() if int(trafficreturn) == 48: dsrl3 = DsrL3_to_Vip.get_by_vip_id(vip_request.id) try: vp_dsrl3 = VipRequestDSCP.objects.get(vip_request=vp) except: vp_dsrl3 = VipRequestDSCP() vp_dsrl3.vip_request = vp vp_dsrl3.dscp = dsrl3.id_dsrl3 vp_dsrl3.save() else: try: vp_dsrl3 = VipRequestDSCP.objects.get(vip_request=vp) vp_dsrl3.delete() except: pass if mp.get('cache'): cache = mp['cache'] else: cache = '(nenhum)' try: op_cache = OptionVip.objects.filter( tipo_opcao=u'cache', nome_opcao_txt=cache)[0] try: opv = OptionVipEnvironmentVip.objects.get( option=op_cache, environment=ev) except: opv = OptionVipEnvironmentVip() opv.option = op_cache opv.environment = ev opv.save() except: op_cache = OptionVip() op_cache.tipo_opcao = u'cache' op_cache.nome_opcao_txt = cache op_cache.save() opv = OptionVipEnvironmentVip() opv.option = op_cache opv.environment = ev opv.save() finally: try: vro = VipRequestOptionVip.objects.get( optionvip=op_cache, vip_request=vp) except: vro = VipRequestOptionVip() vro.optionvip = op_cache vro.vip_request = vp vro.save() # delete optionvip(op_cache, op_traffic, op_time, op_per) # in port removed in old table VipRequestOptionVip.objects.filter( vip_request=vp ).exclude( optionvip__id__in=[op_cache.id, op_traffic.id, op_time.id, op_per.id] ).delete() pools = VipPortToPool.get_by_vip_id(vip_request.id) # delete old ports ports_current = VipRequestPort.objects.filter(vip_request=vp) ports_ids = [port.id for port in ports_current] pools_ids = [pl.id for pl in pools] ids_to_del = list(set(ports_ids) - set(pools_ids)) ports_current.filter(id__in=ids_to_del).delete() # delete pools removed in old table # ptid = [ptid.server_pool.id for ptid in pools] # VipRequestPortPool.objects.filter( # vip_request_port=vrp # ).exclude( # server_pool__id__in=ptid # ).delete() for pool in pools: # saving ports of vip vrp = VipRequestPort() vrp.id = pool.id vrp.vip_request = vp vrp.port = pool.port_vip if not pool.identifier: from networkapi.api_equipment import facade as facade_eqpt from networkapi.plugins.factory import PluginFactory eqpts = facade_eqpt.get_eqpt_by_envvip(ev.id) if eqpts: plugin = PluginFactory.factory(eqpts[0]) vrp.identifier = plugin.get_name_eqpt( vp, pool.port_vip) pool.identifier = vrp.identifier pool.save() vrp.save() # descobre protocolo l7 e l4 tipo_opcao = 'l7_rule' nome_opcao_txt = 'default_vip' l4_protocol = 'TCP' l7_protocol = 'Outros' if mp.get('healthcheck_type') == 'HTTP': tipo_opcao = 'l7_rule' nome_opcao_txt = 'default_vip' l4_protocol = 'TCP' l7_protocol = 'HTTP' if mp.get('healthcheck_type') == 'TCP': l4_protocol = 'TCP' l7_protocol = 'Outros' if mp.get('healthcheck_type') == 'UDP': l4_protocol = 'UDP' l7_protocol = 'Outros' if pool.port_vip == 20 or pool.port_vip == 21: l4_protocol = 'TCP' l7_protocol = 'FTP' if pool.port_vip == 443: l4_protocol = 'TCP' l7_protocol = 'HTTPS' # l4_protocol try: op_l4 = OptionVip.objects.filter( tipo_opcao='l4_protocol', nome_opcao_txt=l4_protocol)[0] try: opv = OptionVipEnvironmentVip.objects.get( option=op_l4, environment=ev) except: opv = OptionVipEnvironmentVip() opv.option = op_l4 opv.environment = ev opv.save() except: op_l4 = OptionVip() op_l4.tipo_opcao = u'l4_protocol' op_l4.nome_opcao_txt = l4_protocol op_l4.save() opv = OptionVipEnvironmentVip() opv.option = op_l4 opv.environment = ev opv.save() finally: try: vro = VipRequestPortOptionVip.objects.filter( optionvip=op_l4, vip_request_port=vrp)[0] except: vro = VipRequestPortOptionVip() vro.optionvip = op_l4 vro.vip_request_port = vrp vro.save() # l7_protocol try: op_l7 = OptionVip.objects.filter( tipo_opcao='l7_protocol', nome_opcao_txt=l7_protocol)[0] try: opv = OptionVipEnvironmentVip.objects.get( option=op_l7, environment=ev) except: opv = OptionVipEnvironmentVip() opv.option = op_l7 opv.environment = ev opv.save() except: op_l7 = OptionVip() op_l7.tipo_opcao = u'l7_protocol' op_l7.nome_opcao_txt = l7_protocol op_l7.save() opv = OptionVipEnvironmentVip() opv.option = op_l7 opv.environment = ev opv.save() finally: try: vro = VipRequestPortOptionVip.objects.filter( optionvip=op_l7, vip_request_port=vrp)[0] except: vro = VipRequestPortOptionVip() vro.optionvip = op_l7 vro.vip_request_port = vrp vro.save() # delete optionvip(l7 and l4) in port removed in old table VipRequestPortOptionVip.objects.filter( vip_request_port=vrp ).exclude( optionvip__id__in=[op_l7.id, op_l4.id] ).delete() # saving pools of port try: op_pt = OptionVip.objects.filter( tipo_opcao=tipo_opcao, nome_opcao_txt=nome_opcao_txt)[0] try: opv = OptionVipEnvironmentVip.objects.get( option=op_pt, environment=ev) except: opv = OptionVipEnvironmentVip() opv.option = op_pt opv.environment = ev opv.save() except: op_pt = OptionVip() op_pt.tipo_opcao = tipo_opcao op_pt.nome_opcao_txt = nome_opcao_txt op_pt.save() opv = OptionVipEnvironmentVip() opv.option = op_pt opv.environment = ev opv.save() finally: try: vrpp = VipRequestPortPool.objects.filter( server_pool=pool.server_pool, vip_request_port=vrp)[0] except: vrpp = VipRequestPortPool() vrpp.server_pool = pool.server_pool vrpp.vip_request_port = vrp vrpp.optionvip = op_pt vrpp.save() except Exception, e: log.error(e) raise e
def handle_post(self, request, user, *args, **kwargs): """Treat POST requests to add new Network URL: network/add/ """ try: if not has_perm(user, AdminPermission.VLAN_MANAGEMENT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() xml_map, attrs_map = loads(request.raw_post_data) networkapi_map = xml_map.get('networkapi') if networkapi_map is None: msg = u'There is no value to the networkapi tag of XML request.' self.log.error(msg) return self.response_error(3, msg) network_map = networkapi_map.get('network') if network_map is None: msg = u'There is no value to the vlan tag of XML request.' self.log.error(msg) return self.response_error(3, msg) # Get XML data network = network_map.get('network') id_vlan = network_map.get('id_vlan') network_type = network_map.get('id_network_type') environment_vip = network_map.get('id_environment_vip') cluster_unit = network_map.get('cluster_unit') try: net = IPNetwork(network) except ValueError: raise InvalidValueError(None, 'network', network) # Valid vlan ID if not is_valid_int_greater_zero_param(id_vlan): raise InvalidValueError(None, 'id_vlan', id_vlan) if not is_valid_int_greater_zero_param(network_type): raise InvalidValueError(None, 'id_network_type', network_type) vlan = Vlan().get_by_pk(id_vlan) net_type = TipoRede.get_by_pk(network_type) if environment_vip is not None: if not is_valid_int_greater_zero_param(environment_vip): raise InvalidValueError(None, 'id_environment_vip', environment_vip) evips = EnvironmentVip.objects.all() evip_list = EnvironmentVip.available_evips( EnvironmentVip(), evips, int(id_vlan)) # Check if the chose environment is in the same environment if any( int(environment_vip) == item['id'] for item in evip_list): # Find Environment VIP by ID to check if it exist env_vip = EnvironmentVip.get_by_pk(environment_vip) else: raise InvalidValueError(None, 'id_environment_vip', environment_vip) else: env_vip = None # Check unchecked exception blocks, network, version = break_network(network) expl = split(net.network.exploded, '.' if version == IP_VERSION.IPv4[0] else ':') expl.append(str(net.prefixlen)) if blocks != expl: raise InvalidValueError(None, 'rede', network) if version == IP_VERSION.IPv4[0]: # Find all networks related to environment nets = NetworkIPv4.objects.filter( vlan__ambiente__id=vlan.ambiente.id) # Cast to API class networks = set([ IPv4Network('%d.%d.%d.%d/%d' % (net_ip.oct1, net_ip.oct2, net_ip.oct3, net_ip.oct4, net_ip.block)) for net_ip in nets ]) # If network selected not in use for network_aux in networks: if net in network_aux or network_aux in net: self.log.debug( 'Network %s cannot be allocated. It conflicts with %s already ' 'in use in this environment.' % (net, network)) raise NetworkIPv4AddressNotAvailableError( None, u'Network cannot be allocated. %s already in use in this environment.' % network_aux) if env_vip is not None: # Find all networks related to environment vip nets = NetworkIPv4.objects.filter( ambient_vip__id=env_vip.id) # Cast to API class networks = set([ IPv4Network('%d.%d.%d.%d/%d' % (net_ip.oct1, net_ip.oct2, net_ip.oct3, net_ip.oct4, net_ip.block)) for net_ip in nets ]) # If there is already a network with the same range ip as # related the environment vip for network_aux in networks: if net in network_aux or network_aux in net: self.log.debug( 'Network %s cannot be allocated. It conflicts with %s already in use ' 'in this environment VIP.' % (net, network)) raise NetworkIPv4AddressNotAvailableError( None, u'Network cannot be allocated. %s already in use ' u'in this environment VIP.' % network_aux) # Check if the new network is in the range of the Environment Network try: vlan = Vlan().get_by_pk(id_vlan) vlan_env_id = vlan.ambiente try: config_env = ConfigEnvironment() environment_conf = config_env.get_by_environment( vlan_env_id) if environment_conf: for env_config in environment_conf: ipconfig = env_config.ip_config subnet = ipconfig.subnet env_net = IPNetwork(subnet) try: if net in env_net: self.log.debug( 'Network "%s" can be allocated because is in the ' 'environment network(%s) subnets.' % (net, subnet)) else: raise NetworkSubnetRange( None, 'A rede a ser cadastrada (%s) não pertence às ' 'subredes do ambiente (rede ambiente: %s). ' 'Cadastre o range desejado no ' 'ambiente.' % (net, subnet)) except NetworkSubnetRange: self.log.error( 'Network "%s" can not be allocated because is not in the ' 'environment network(%s) subnets.' % (net, subnet)) return self.response_error(414) else: raise NetworkEnvironmentError( None, 'O ambiente não está configurado. ' 'É necessário efetuar a configuração.') except NetworkEnvironmentError: self.log.error( 'The environment does not have a registered network' ) return self.response_error(415) except Exception as ERROR: self.log.error(ERROR) # # Filter case 1 - Adding new network with same ip range to another network on other environment ## # Get environments with networks with the same ip range nets = NetworkIPv4.objects.filter(oct1=expl[0], oct2=expl[1], oct3=expl[2], oct4=expl[3], block=expl[4]) env_ids = list() for net_ip in nets: env_ids.append(net_ip.vlan.ambiente.id) # If other network with same ip range exists if len(env_ids) > 0: # Get equipments related to this network's environment env_equips = EquipamentoAmbiente.objects.filter( ambiente=vlan.ambiente.id) # Verify equipments related with all other environments # that contains networks with same ip range for env_id in env_ids: # Equipments related to other environments other_env_equips = EquipamentoAmbiente.objects.filter( ambiente=env_id) # Adjust to equipments equip_list = list() for equip_env in other_env_equips: equip_list.append(equip_env.equipamento.id) for env_equip in env_equips: if env_equip.equipamento.id in equip_list: # Filter testing if other_env_equips[ 0].ambiente.filter is None or vlan.ambiente.filter is None: raise NetworkIPRangeEnvError( None, u'Um dos equipamentos associados com o ambiente ' u'desta rede também está associado com outro ambiente ' u'que tem uma rede com essa mesma faixa, adicione ' u'filtros nos ambientes se necessário.' ) else: # Test both environment's filters tp_equip_list_one = list() for fet in FilterEquipType.objects.filter( filter=vlan.ambiente.filter.id): tp_equip_list_one.append(fet.equiptype) tp_equip_list_two = list() for fet in FilterEquipType.objects.filter( filter=other_env_equips[0]. ambiente.filter.id): tp_equip_list_two.append(fet.equiptype) if env_equip.equipamento.tipo_equipamento not in tp_equip_list_one or \ env_equip.equipamento.tipo_equipamento not in tp_equip_list_two: raise NetworkIPRangeEnvError( None, u'Um dos equipamentos associados com o ' u'ambiente desta rede também está associado ' u'com outro ambiente que tem uma rede com ' u'essa mesma faixa, adicione filtros nos ' u'ambientes se necessário.') # # Filter case 1 - end ## # New NetworkIPv4 network_ip = NetworkIPv4() network_ip.oct1, network_ip.oct2, network_ip.oct3, network_ip.oct4 = str( net.network).split('.') network_ip.block = net.prefixlen network_ip.mask_oct1, network_ip.mask_oct2, network_ip.mask_oct3, network_ip.mask_oct4 = \ str(net.netmask).split('.') network_ip.broadcast = net.broadcast.compressed else: # Find all networks ralated to environment nets = NetworkIPv6.objects.filter( vlan__ambiente__id=vlan.ambiente.id) networks = set([ IPv6Network('%s:%s:%s:%s:%s:%s:%s:%s/%d' % (net_ip.block1, net_ip.block2, net_ip.block3, net_ip.block4, net_ip.block5, net_ip.block6, net_ip.block7, net_ip.block8, net_ip.block)) for net_ip in nets ]) # If network selected not in use for network_aux in networks: if net in network_aux or network_aux in net: self.log.debug( 'Network %s cannot be allocated. It conflicts with %s already in use ' 'in this environment.' % (net, network)) raise NetworkIPv4AddressNotAvailableError( None, u'Network cannot be allocated. %s already in ' u'use in this environment.' % network_aux) if env_vip is not None: # Find all networks related to environment vip nets = NetworkIPv6.objects.filter( ambient_vip__id=env_vip.id) networks = set([ IPv6Network( '%s:%s:%s:%s:%s:%s:%s:%s/%d' % (net_ip.block1, net_ip.block2, net_ip.block3, net_ip.block4, net_ip.block5, net_ip.block6, net_ip.block7, net_ip.block8, net_ip.block)) for net_ip in nets ]) # If there is already a network with the same range ip as # related the environment vip for network_aux in networks: if net in network_aux or network_aux in net: self.log.debug( 'Network %s cannot be allocated. It conflicts with %s already in ' 'use in this environment VIP.' % (net, network)) raise NetworkIPv4AddressNotAvailableError( None, u'Network cannot be allocated. %s ' u'already in use in this environment ' u'VIP.' % network_aux) # # Filter case 1 - Adding new network with same ip range to another network on other environment ## # Get environments with networks with the same ip range nets = NetworkIPv6.objects.filter(block1=expl[0], block2=expl[1], block3=expl[2], block4=expl[3], block5=expl[4], block6=expl[5], block7=expl[6], block8=expl[7], block=expl[8]) env_ids = list() for net_ip in nets: env_ids.append(net_ip.vlan.ambiente.id) # If other network with same ip range exists if len(env_ids) > 0: # Get equipments related to this network's environment env_equips = EquipamentoAmbiente.objects.filter( ambiente=vlan.ambiente.id) # Verify equipments related with all other environments # that contains networks with same ip range for env_id in env_ids: # Equipments related to other environments other_env_equips = EquipamentoAmbiente.objects.filter( ambiente=env_id) # Adjust to equipments equip_list = list() for equip_env in other_env_equips: equip_list.append(equip_env.equipamento.id) for env_equip in env_equips: if env_equip.equipamento.id in equip_list: # Filter testing if other_env_equips[ 0].ambiente.filter is None or vlan.ambiente.filter is None: raise NetworkIPRangeEnvError( None, u'Um dos equipamentos associados com o ' u'ambiente desta rede também está associado ' u'com outro ambiente que tem uma rede com ' u'essa mesma faixa, adicione filtros nos ' u'ambientes se necessário.') else: # Test both environment's filters tp_equip_list_one = list() for fet in FilterEquipType.objects.filter( filter=vlan.ambiente.filter.id): tp_equip_list_one.append(fet.equiptype) tp_equip_list_two = list() for fet in FilterEquipType.objects.filter( filter=other_env_equips[0]. ambiente.filter.id): tp_equip_list_two.append(fet.equiptype) if env_equip.equipamento.tipo_equipamento not in tp_equip_list_one or \ env_equip.equipamento.tipo_equipamento not in tp_equip_list_two: raise NetworkIPRangeEnvError( None, u'Um dos equipamentos associados com o ' u'ambiente desta rede também está ' u'associado com outro ambiente que tem ' u'uma rede com essa mesma faixa, adicione ' u'filtros nos ambientes se necessário.' ) # # Filter case 1 - end ## # New NetworkIPv6 network_ip = NetworkIPv6() network_ip.block1, network_ip.block2, network_ip.block3, network_ip.block4, network_ip.block5, \ network_ip.block6, network_ip.block7, network_ip.block8 = str(net.network.exploded).split(':') network_ip.block = net.prefixlen network_ip.mask1, network_ip.mask2, network_ip.mask3, network_ip.mask4, network_ip.mask5, \ network_ip.mask6, network_ip.mask7, network_ip.mask8 = str(net.netmask.exploded).split(':') # Get all vlans environments from equipments of the current # environment ambiente = vlan.ambiente equips = list() envs = list() # equips = all equipments from the environment which this network # is about to be allocated on for env in ambiente.equipamentoambiente_set.all(): equips.append(env.equipamento) # envs = all environments from all equips above # This will be used to test all networks from the environments. for equip in equips: for env in equip.equipamentoambiente_set.all(): if env.ambiente not in envs: envs.append(env.ambiente) network_ip_verify = IPNetwork(network) # For all vlans in all common environments, # check if any network is a subnetwork or supernetwork # of the desired network network_ip_verify for env in envs: for vlan_obj in env.vlan_set.all(): is_subnet = verify_subnet(vlan_obj, network_ip_verify, version) if is_subnet: if vlan_obj.ambiente == ambiente: raise NetworkIPRangeEnvError(None) if ambiente.filter_id is None or vlan_obj.ambiente.filter_id is None or \ int(vlan_obj.ambiente.filter_id) != int(ambiente.filter_id): raise NetworkIPRangeEnvError(None) network_ip.vlan = vlan network_ip.network_type = net_type network_ip.ambient_vip = env_vip network_ip.cluster_unit = cluster_unit try: destroy_cache_function([id_vlan]) network_ip.save() list_equip_routers_ambient = EquipamentoAmbiente.objects.filter( ambiente=network_ip.vlan.ambiente.id, is_router=True) if list_equip_routers_ambient: if version == IP_VERSION.IPv4[0]: if network_ip.block < 31: # Add the first available ipv4 on all equipment # that is configured as a router for the environment # related to network ip = Ip.get_first_available_ip(network_ip.id) ip = str(ip).split('.') ip_model = Ip() ip_model.oct1 = ip[0] ip_model.oct2 = ip[1] ip_model.oct3 = ip[2] ip_model.oct4 = ip[3] ip_model.networkipv4_id = network_ip.id ip_model.save() if len(list_equip_routers_ambient ) > 1 and network_ip.block < 30: multiple_ips = True else: multiple_ips = False logging.debug('vxlan: %s' % vlan.vxlan) if vlan.vxlan: logging.debug('vxlan ok') for equip in list_equip_routers_ambient: IpEquipamento().create( user, ip_model.id, equip.equipamento.id) if multiple_ips: debug_ip = Ip.get_first_available_ip( network_ip.id, True) ips = Ip() ips.oct1, ips.oct2, ips.oct3, ips.oct4 = str( debug_ip).split('.') ips.networkipv4_id = network_ip.id ips.descricao = "IP alocado para debug" ips.save(user) IpEquipamento().create( user, ips.id, list_equip_routers_ambient[0]. equipamento.id) else: for equip in list_equip_routers_ambient: IpEquipamento().create( user, ip_model.id, equip.equipamento.id) if multiple_ips: router_ip = Ip.get_first_available_ip( network_ip.id, True) router_ip = str(router_ip).split('.') ip_model2 = Ip() ip_model2.oct1 = router_ip[0] ip_model2.oct2 = router_ip[1] ip_model2.oct3 = router_ip[2] ip_model2.oct4 = router_ip[3] ip_model2.networkipv4_id = network_ip.id ip_model2.save(user) IpEquipamento().create( user, ip_model2.id, equip.equipamento.id) else: if network_ip.block < 127: # Add the first available ipv6 on all equipment # that is configured as a router for the environment # related to network ipv6 = Ipv6.get_first_available_ip6(network_ip.id) ipv6 = str(ipv6).split(':') ipv6_model = Ipv6() ipv6_model.block1 = ipv6[0] ipv6_model.block2 = ipv6[1] ipv6_model.block3 = ipv6[2] ipv6_model.block4 = ipv6[3] ipv6_model.block5 = ipv6[4] ipv6_model.block6 = ipv6[5] ipv6_model.block7 = ipv6[6] ipv6_model.block8 = ipv6[7] ipv6_model.networkipv6_id = network_ip.id ipv6_model.save() if len(list_equip_routers_ambient ) > 1 and network_ip.block < 126: multiple_ips = True else: multiple_ips = False if vlan.vxlan: for equip in list_equip_routers_ambient: Ipv6Equipament().create( user, ipv6_model.id, equip.equipamento.id) if multiple_ips: router_ip = Ipv6.get_first_available_ip6( network_ip.id, True) ipv6s = Ipv6() ipv6s.block1, ipv6s.block2, ipv6s.block3, ipv6s.block4, ipv6s.block5, \ ipv6s.block6, ipv6s.block7, ipv6s.block8 = str(router_ip).split(':') ipv6s.networkipv6_id = network_ip.id ipv6s.descricao = "IPv6 alocado para debug" ipv6s.save(user) Ipv6Equipament().create( user, ipv6s.id, list_equip_routers_ambient[0]. equipamento.id) else: for equip in list_equip_routers_ambient: Ipv6Equipament().create( user, ipv6_model.id, equip.equipamento.id) if multiple_ips: router_ip = Ipv6.get_first_available_ip6( network_ip.id, True) router_ip = str(router_ip).split(':') ipv6_model2 = Ipv6() ipv6_model2.block1 = router_ip[0] ipv6_model2.block2 = router_ip[1] ipv6_model2.block3 = router_ip[2] ipv6_model2.block4 = router_ip[3] ipv6_model2.block5 = router_ip[4] ipv6_model2.block6 = router_ip[5] ipv6_model2.block7 = router_ip[6] ipv6_model2.block8 = router_ip[7] ipv6_model2.networkipv6_id = network_ip.id ipv6_model2.save(user) Ipv6Equipament().create( user, ipv6_model2.id, equip.equipamento.id) except Exception as e: raise IpError(e, u'Error persisting Network.') network_map = dict() network_map['id'] = network_ip.id network_map['rede'] = str(net) network_map[ 'broadcast'] = net.broadcast if net.version == 4 else '' network_map['mask'] = net.netmask.exploded network_map['id_vlan'] = vlan.id network_map['id_tipo_rede'] = net_type.id network_map[ 'id_ambiente_vip'] = env_vip.id if env_vip is not None else '' network_map['active'] = network_ip return self.response(dumps_networkapi({'network': network_map})) except NetworkIPRangeEnvError: return self.response_error(346) except InvalidValueError as e: self.log.error(u'Parameter %s is invalid. Value: %s.' % (e.param, e.value)) return self.response_error(269, e.param, e.value) except NetworkTypeNotFoundError: self.log.error(u'The network_type parameter does not exist.') return self.response_error(111) except VlanNotFoundError: self.log.error(u'Vlan not found') return self.response_error(116) except EnvironmentVipNotFoundError: return self.response_error(283) except NetworkIPv4AddressNotAvailableError: return self.response_error(295) except NetworkIPv6AddressNotAvailableError: return self.response_error(296) except ConfigEnvironmentInvalidError: return self.response_error(294) except NetworkIpAddressNotAvailableError: return self.response_error(335) except (IpError, NetworkIPv6Error, NetworkIPv4Error, GrupoError, VlanError): return self.response_error(1) except XMLError as e: self.log.error(u'Error reading the XML request.') return self.response_error(3, e)
def handle_post(self, request, user, *args, **kwargs): """Treat requests Post to search ambiente_p44_txt of Environment VIP by finalidade_txt and cliente_txt URL: environment-vip/get/ambiente_p44_txt/ """ try: self.log.info( 'Search ambiente_p44_txt Environment VIP by finalidade_txt and cliente_txt' ) # User permission if not has_perm(user, AdminPermission.ENVIRONMENT_VIP, AdminPermission.READ_OPERATION): self.log.error( u'User does not have permission to perform the operation.') raise UserNotAuthorizedError(None) # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error( 3, u'There is no value to the networkapi tag of XML request.') environmentvip_map = networkapi_map.get('vip') if environmentvip_map is None: return self.response_error( 3, u'There is no value to the vip tag of XML request.') # Get XML data finalidade = environmentvip_map.get('finalidade_txt') cliente_txt = environmentvip_map.get('cliente_txt') # finalidade_txt can NOT be greater than 50 if not is_valid_string_maxsize( finalidade, 50, True) or not is_valid_string_minsize( finalidade, 3, True) or not is_valid_text(finalidade): self.log.error( u'Parameter finalidade_txt is invalid. Value: %s.', finalidade) raise InvalidValueError(None, 'finalidade_txt', finalidade) # cliente_txt can NOT be greater than 50 if not is_valid_string_maxsize( cliente_txt, 50, True) or not is_valid_string_minsize( cliente_txt, 3, True) or not is_valid_text(cliente_txt): self.log.error(u'Parameter cliente_txt is invalid. Value: %s.', cliente_txt) raise InvalidValueError(None, 'cliente_txt', cliente_txt) environmentVip = EnvironmentVip() evip_values = environmentVip.list_all_ambientep44_by_finality_and_cliente( finalidade, cliente_txt) evips = dict() evips_list = [] for evip in evip_values: evips['id'] = evip.id evips['finalidade_txt'] = finalidade evips['cliente_txt'] = cliente_txt evips['ambiente_p44'] = evip.ambiente_p44_txt evips['description'] = evip.description evips_list.append(evips) evips = dict() return self.response(dumps_networkapi({'ambiente_p44': evips_list})) except InvalidValueError, e: return self.response_error(269, e.param, e.value)