def handle_post(self, request, user, *args, **kwargs): """Treat POST requests to add new network types. URL: /net_type/ """ try: # Check permission if not has_perm(user, AdminPermission.NETWORK_TYPE_MANAGEMENT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Get request XML data xml_map, attrs_map = loads(request.raw_post_data) # Get networkapi tag map networkapi_map = xml_map.get('networkapi') if networkapi_map is None: return self.response_error(3, u'There is no networkapi tag from request XML.') # Get net_type tag map net_type_map = networkapi_map.get('net_type') if net_type_map is None: return self.response_error(3, u'There is no tipo_rede tag from request XML.') # Valid name attribute name = net_type_map.get('name') if not is_valid_string_minsize(name, 3) or not is_valid_string_maxsize(name, 100): self.log.error( u'Parameter %s is invalid. Value: %s.', 'name', name) raise InvalidValueError(None, 'name', name) net_type = TipoRede(tipo_rede=name) if not is_valid_vlan_name(name): self.log.error( u'Parameter %s is invalid because is using special characters and/or breaklines.', name) raise InvalidValueError(None, 'name', name) try: TipoRede.get_by_name(net_type.tipo_rede) raise NetworkTypeNameDuplicatedError( None, u'Network type with name %s already exist' % net_type.tipo_rede) except NetworkTypeNotFoundError: pass try: net_type.save() except Exception, e: self.log.error(u'Failed to insert network type.') raise VlanError(e, u'Failed to insert network type.') net_type_map = dict() net_type_map['id'] = net_type.id return self.response(dumps_networkapi({'net_type': net_type_map}))
def handle_post(self, request, user, *args, **kwargs): """ Handles POST requests to allocate a new VLAN. URL: vlan/ """ self.log.info('Allocate new VLAN') try: # Commons Validations # User permission if not has_perm(user, AdminPermission.VLAN_MANAGEMENT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Business Validations # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: msg = u'There is no value to the networkapi tag of XML request.' self.log.error(msg) return self.response_error(3, msg) vlan_map = networkapi_map.get('vlan') if vlan_map is None: msg = u'There is no value to the vlan tag of XML request.' self.log.error(msg) return self.response_error(3, msg) # Get XML data environment = vlan_map.get('id_ambiente') network_type = vlan_map.get('id_tipo_rede') name = vlan_map.get('nome') description = vlan_map.get('descricao') environment_vip = vlan_map.get('id_ambiente_vip') vrf = vlan_map.get('vrf') # Name must NOT be none and 50 is the maxsize if not is_valid_string_minsize(name, 3) or not is_valid_string_maxsize(name, 50): self.log.error(u'Parameter nome is invalid. Value: %s.', name) raise InvalidValueError(None, 'nome', name) if not is_valid_vlan_name(name): self.log.error( u'Parameter %s is invalid because is using special characters and/or breaklines.', name) raise InvalidValueError(None, 'name', name) # Description can NOT be greater than 200 if not is_valid_string_minsize(description, 3, False) or not is_valid_string_maxsize(description, 200, False): self.log.error( u'Parameter descricao is invalid. Value: %s.', description) raise InvalidValueError(None, 'descricao', description) # vrf can NOT be greater than 100 if not is_valid_string_maxsize(vrf, 100, False): self.log.error( u'Parameter vrf is invalid. Value: %s.', vrf) raise InvalidValueError(None, 'vrf', vrf) # Environment # Valid environment ID if not is_valid_int_greater_zero_param(environment): self.log.error( u'Parameter id_ambiente is invalid. Value: %s.', environment) raise InvalidValueError(None, 'id_ambiente', environment) # Find environment by ID to check if it exist env = Ambiente.get_by_pk(environment) # Environment Vip if environment_vip is not None: # Valid environment_vip ID if not is_valid_int_greater_zero_param(environment_vip): self.log.error( u'Parameter id_ambiente_vip is invalid. Value: %s.', environment_vip) raise InvalidValueError( None, 'id_ambiente_vip', environment_vip) # Find Environment VIP by ID to check if it exist evip = EnvironmentVip.get_by_pk(environment_vip) else: evip = None # Network Type # Valid network_type ID if not is_valid_int_greater_zero_param(network_type): self.log.error( u'Parameter id_tipo_rede is invalid. Value: %s.', network_type) raise InvalidValueError(None, 'id_tipo_rede', network_type) # Find network_type by ID to check if it exist net = TipoRede.get_by_pk(network_type) # Business Rules # New Vlan vlan = Vlan() vlan.nome = name vlan.descricao = description vlan.ambiente = env # Check if environment has min/max num_vlan value or use the value # thas was configured in settings if (vlan.ambiente.min_num_vlan_1 and vlan.ambiente.max_num_vlan_1) or (vlan.ambiente.min_num_vlan_2 and vlan.ambiente.max_num_vlan_2): min_num_01 = vlan.ambiente.min_num_vlan_1 if vlan.ambiente.min_num_vlan_1 and vlan.ambiente.max_num_vlan_1 else vlan.ambiente.min_num_vlan_2 max_num_01 = vlan.ambiente.max_num_vlan_1 if vlan.ambiente.min_num_vlan_1 and vlan.ambiente.max_num_vlan_1 else vlan.ambiente.max_num_vlan_2 min_num_02 = vlan.ambiente.min_num_vlan_2 if vlan.ambiente.min_num_vlan_2 and vlan.ambiente.max_num_vlan_2 else vlan.ambiente.min_num_vlan_1 max_num_02 = vlan.ambiente.max_num_vlan_2 if vlan.ambiente.min_num_vlan_2 and vlan.ambiente.max_num_vlan_2 else vlan.ambiente.max_num_vlan_1 else: min_num_01 = settings.MIN_VLAN_NUMBER_01 max_num_01 = settings.MAX_VLAN_NUMBER_01 min_num_02 = settings.MIN_VLAN_NUMBER_02 max_num_02 = settings.MAX_VLAN_NUMBER_02 # Persist vlan.create_new(user, min_num_01, max_num_01, min_num_02, max_num_02 ) # New NetworkIPv4 network_ipv4 = NetworkIPv4() vlan_map = network_ipv4.add_network_ipv4(user, vlan.id, net, evip) # Return XML return self.response(dumps_networkapi(vlan_map)) except InvalidValueError, e: return self.response_error(269, e.param, e.value)
def handle_post(self, request, user, *args, **kwargs): """Handles POST requests to create new VLAN without add NetworkIPv4. URLs: /vlan/no-network/ """ self.log.info('Create new VLAN without add NetworkIPv4') try: # Commons Validations # User permission if not has_perm(user, AdminPermission.VLAN_MANAGEMENT, AdminPermission.WRITE_OPERATION): self.log.error( u'User does not have permission to perform the operation.') return self.not_authorized() # Business Validations # Load XML data xml_map, attrs_map = loads(request.raw_post_data) # XML data format networkapi_map = xml_map.get('networkapi') if networkapi_map is None: msg = u'There is no value to the networkapi tag of XML request.' self.log.error(msg) return self.response_error(3, msg) vlan_map = networkapi_map.get('vlan') if vlan_map is None: msg = u'There is no value to the vlan tag of XML request.' self.log.error(msg) return self.response_error(3, msg) # Get XML data environment = vlan_map.get('environment_id') name = vlan_map.get('name') description = vlan_map.get('description') vrf = vlan_map.get('vrf') # Name must NOT be none and 50 is the maxsize if not is_valid_string_minsize( name, 3) or not is_valid_string_maxsize(name, 50): self.log.error(u'Parameter name is invalid. Value: %s.', name) raise InvalidValueError(None, 'name', name) if not is_valid_vlan_name(name): self.log.error( u'Parameter %s is invalid because is using special characters and/or breaklines.', name) raise InvalidValueError(None, 'name', name) # Description can NOT be greater than 200 if not is_valid_string_minsize( description, 3, False) or not is_valid_string_maxsize( description, 200, False): self.log.error(u'Parameter description is invalid. Value: %s.', description) raise InvalidValueError(None, 'description', description) # vrf can NOT be greater than 100 if not is_valid_string_maxsize(vrf, 100, False): self.log.error(u'Parameter vrf is invalid. Value: %s.', vrf) raise InvalidValueError(None, 'vrf', vrf) # Environment try: # Valid environment ID if not is_valid_int_greater_zero_param(environment): self.log.error( u'Parameter environment_id is invalid. Value: %s.', environment) raise InvalidValueError(None, 'environment_id', environment) # Find environment by ID to check if it exist env = Ambiente.get_by_pk(environment) except AmbienteNotFoundError, e: self.log.error(u'The environment parameter does not exist.') return self.response_error(112) # Business Rules # New Vlan vlan = Vlan() vlan.nome = name vlan.descricao = description vlan.ambiente = env # Check if environment has min/max num_vlan value or use the value # thas was configured in settings if (vlan.ambiente.min_num_vlan_1 and vlan.ambiente.max_num_vlan_1 ) or (vlan.ambiente.min_num_vlan_2 and vlan.ambiente.max_num_vlan_2): min_num_01 = vlan.ambiente.min_num_vlan_1 if vlan.ambiente.min_num_vlan_1 and vlan.ambiente.max_num_vlan_1 else vlan.ambiente.min_num_vlan_2 max_num_01 = vlan.ambiente.max_num_vlan_1 if vlan.ambiente.min_num_vlan_1 and vlan.ambiente.max_num_vlan_1 else vlan.ambiente.max_num_vlan_2 min_num_02 = vlan.ambiente.min_num_vlan_2 if vlan.ambiente.min_num_vlan_2 and vlan.ambiente.max_num_vlan_2 else vlan.ambiente.min_num_vlan_1 max_num_02 = vlan.ambiente.max_num_vlan_2 if vlan.ambiente.min_num_vlan_2 and vlan.ambiente.max_num_vlan_2 else vlan.ambiente.max_num_vlan_1 else: min_num_01 = settings.MIN_VLAN_NUMBER_01 max_num_01 = settings.MAX_VLAN_NUMBER_01 min_num_02 = settings.MIN_VLAN_NUMBER_02 max_num_02 = settings.MAX_VLAN_NUMBER_02 # To avoid allocation same vlan number twice for different environments in same equipments # Lock all environments related to this environment when allocating vlan number # select all equipments from this environment that are not part of a filter # and them selects all environments from all these equipments and # lock them out filtered_equipment_type_ids = list() env_filter = None try: env_filter = env.filter.id except: pass for fet in FilterEquipType.objects.filter(filter=env_filter): filtered_equipment_type_ids.append(fet.equiptype.id) filtered_environment_equips = Equipamento.objects.filter( equipamentoambiente__ambiente=env).exclude( tipo_equipamento__in=filtered_equipment_type_ids) # select all environments from the equips that were not filtered locks_list = list() environments_list = Ambiente.objects.filter( equipamentoambiente__equipamento__in=filtered_environment_equips ).distinct().order_by('id') for environment in environments_list: lock = distributedlock(LOCK_ENVIRONMENT % environment.id) lock.__enter__() locks_list.append(lock) # Persist try: vlan.create_new(user, min_num_01, max_num_01, min_num_02, max_num_02) except Exception, e: # release all the locks if failed for lock in locks_list: lock.__exit__('', '', '') raise e
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 is_valid_vlan_name(name): self.log.error( u'Parameter %s is invalid because is using special characters and/or breaklines.', name) raise InvalidValueError(None, 'name', name) 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)