def _remove_zte_onu_from_olt( zte_ip_addr: str, telnet_login: str, telnet_passw: str, telnet_prompt: str, snmp_info: str, *args, **kwargs ): if not re.match(expect_util.IP4_ADDR_REGEX, zte_ip_addr): raise expect_util.ExpectValidationError("ip address for zte not valid") rack_num, fiber_num, onu_num = zte_utils.zte_onu_conv_from_onu(snmp_info) int_addr = "1/%d/%d" % (rack_num, fiber_num) # Входим ch = ZteOnuDeviceConfigType.login_into_olt(zte_ip_addr, telnet_login, telnet_passw, telnet_prompt) # enter to config ch.do_cmd("conf t", "%s(config)#" % telnet_prompt) # go to olt interface ch.do_cmd("interface gpon-olt_%s" % int_addr, "%s(config-if)#" % telnet_prompt) # remove onu register from olt fiber ch.do_cmd("no onu %d" % onu_num, "%s(config-if)#" % telnet_prompt) # Exit ch.do_cmd("exit", "%s(config)#" % telnet_prompt) ch.do_cmd("exit", "%s#" % telnet_prompt) ch.sendline("exit") ch.close() return True
def remove_from_olt(self, extra_data: Dict): dev = self.dev_instance if not dev: return False if not dev.parent_dev or not dev.snmp_extra: return False telnet = extra_data.get("telnet") if not telnet: return False fiber_num, onu_num = str(dev.snmp_extra).split(".") fiber_num, onu_num = safe_int(fiber_num), safe_int(onu_num) fiber_addr = "%d.%d" % (fiber_num, onu_num) sn = self.get_item_plain(".1.3.6.1.4.1.3902.1012.3.28.1.1.5.%s" % fiber_addr) if sn is not None: if isinstance(sn, str): sn = "ZTEG%s" % "".join("%.2X" % ord(x) for x in sn[-4:]) else: sn = "ZTEG%s" % "".join("%.2X" % x for x in sn[-4:]) sn_mac = zte_utils.sn_to_mac(sn) if str(dev.mac_addr) != sn_mac: raise expect_util.ExpectValidationError(_("Mac of device not equal mac by snmp")) return _remove_zte_onu_from_olt( zte_ip_addr=str(dev.parent_dev.ip_address), telnet_login=telnet.get("login"), telnet_passw=telnet.get("password"), telnet_prompt=telnet.get("prompt"), snmp_info=str(dev.snmp_extra), ) raise DeviceConsoleError(_("Could not fetch serial for onu"))
def validate_extra_snmp_info(v: str) -> None: # for example 268501760.5 try: fiber_num, onu_port = v.split(".") int(fiber_num), int(onu_port) except ValueError: raise expect_util.ExpectValidationError(_("Zte onu snmp field must be two dot separated integers"))
def _get_pon_mng_template(all_vids: VlanList, config: dict, *args, **kwargs) -> list: all_vids = ",".join(map(str, set(all_vids))) vlan_config = config.get("vlanConfig") vids = vlan_config[0].get("vids") native_vids = (vid.get("vid") for vid in vids if vid.get("native", False)) native_vids = list(set(native_vids)) trunk_vids = (vid.get("vid") for vid in vids if not vid.get("native", False)) trunk_vids = list(set(trunk_vids)) native_vids_len = len(native_vids) trunk_vids_len = len(trunk_vids) if native_vids_len > 1: raise expect_util.ExpectValidationError( _("Multiple native vid is not allowed on one port")) ports_config = [] if native_vids_len == 1: if trunk_vids_len > 0: # Trunk with access port, Hybrid ports_config.extend([ "vlan port eth_0/1 mode hybrid def-vlan %d" % native_vids[0], "vlan port eth_0/1 vlan %s" % ",".join(map(str, trunk_vids)), ]) elif trunk_vids_len == 0: # Only Access port ports_config.append("vlan port eth_0/1 mode tag vlan %d" % native_vids[0]) elif native_vids_len == 0: if trunk_vids_len > 0: # Only trunk port ports_config.extend([ "vlan port eth_0/1 mode trunk", "vlan port eth_0/1 vlan %s" % ",".join(map(str, trunk_vids)), ]) elif trunk_vids_len == 0: # Without vlan config, type default vlan ports_config.append("vlan port eth_0/1 mode tag vlan 1") return ([ f"service HSI type internet gemport 1 vlan {all_vids}", "loop-detect ethuni eth_0/1 enable", ] + ports_config + ["dhcp-ip ethuni eth_0/1 forbidden"])
def remove_from_olt(ip_addr: str, telnet_login: str, telnet_passw: str, telnet_prompt: str, int_name: str): if not re.match(expect_util.IP4_ADDR_REGEX, ip_addr): raise expect_util.ExpectValidationError("ip address for OLT not valid") # Split "EPON0/1:17" for fiber_num - 1, and onu_num - 17 try: fiber_num, onu_num = int_name.split("/")[1].split(":") fiber_num, onu_num = safe_int(fiber_num), safe_int(onu_num) except (IndexError, ValueError): raise DeviceImplementationError("Device interface unexpected") if onu_num < 1 or onu_num > 64: raise DeviceImplementationError("Onu num must be in range 1-64") # Enter ch = expect_util.MySpawn("telnet %s" % ip_addr) ch.timeout = 15 ch.expect_exact("Username: "******"Password: "******"Authentication failed!", "%s>" % telnet_prompt]) if choice == 0: raise DeviceConsoleError(gettext("Wrong login or password for telnet access")) # enable privileges ch.do_cmd("enable", "%s#" % telnet_prompt) # enter to config ch.do_cmd("config", "%s_config#" % telnet_prompt) fiber_prompt = "%s_config_epon0/%d#" % (telnet_prompt, fiber_num) # enter to fiber ch.do_cmd("int EPON0/%d" % fiber_num, fiber_prompt) # unbind onu ch.do_cmd("no epon bind-onu sequence %d" % onu_num, fiber_prompt) # end removing ch.close() return True
def _get_onu_mng_template(all_vids: VlanList, config: dict, *args, **kwargs): all_vids = ",".join(map(str, set(all_vids))) vlan_config = config.get("vlanConfig") ports_config = [] for port_conf in vlan_config: port_num = port_conf.get("port") vids = port_conf.get("vids") if not vids: continue native_vids = (vid.get("vid") for vid in vids if vid.get("native", False)) native_vids = list(set(native_vids)) trunk_vids = (vid.get("vid") for vid in vids if not vid.get("native", False)) trunk_vids = list(set(trunk_vids)) native_vids_len = len(native_vids) trunk_vids_len = len(trunk_vids) if native_vids_len > 1: raise expect_util.ExpectValidationError( _("Multiple native vid is not allowed on one port")) if native_vids_len == 1: if trunk_vids_len > 0: # Trunk with access port, Hybrid ports_config.extend([ "vlan port eth_0/%d mode hybrid def-vlan %d" % (port_num, native_vids[0]), "vlan port eth_0/%d vlan %s" % (port_num, ",".join(map(str, trunk_vids))), ]) elif trunk_vids_len == 0: # Only Access port ports_config.append("vlan port eth_0/%d mode tag vlan %d" % (port_num, native_vids[0])) elif native_vids_len == 0: if trunk_vids_len > 0: # Only trunk port ports_config.extend([ "vlan port eth_0/%d mode trunk" % port_num, "vlan port eth_0/%d vlan %s" % (port_num, ",".join(map(str, trunk_vids))), ]) elif trunk_vids_len == 0: # Without vlan config, type default vlan ports_config.append("vlan port eth_0/%d mode tag vlan 1" % port_num) return ([ f"service HSI type internet gemport 1 vlan {all_vids}", "loop-detect ethuni eth_0/1 enable", "loop-detect ethuni eth_0/2 enable", "loop-detect ethuni eth_0/3 enable", "loop-detect ethuni eth_0/4 enable", "interface pots pots_0/1 state lock", "interface pots pots_0/2 state lock", "interface wifi wifi_0/1 state lock", ] + ports_config + [ "dhcp-ip ethuni eth_0/1 forbidden", "dhcp-ip ethuni eth_0/2 forbidden", "dhcp-ip ethuni eth_0/3 forbidden", "dhcp-ip ethuni eth_0/4 forbidden", ])
def register_onu( self, serial: str, config: dict, onu_mac: str, zte_ip_addr: str, telnet_login: str, telnet_password: str, telnet_prompt: str, *args, **kwargs, ) -> Optional[str]: if not re.match(r"^ZTEG[0-9A-F]{8}$", serial): raise expect_util.ExpectValidationError( "Serial not valid, match: ^ZTEG[0-9A-F]{8}$") all_vids = get_all_vlans_from_config(config=config) if not all_vids: raise zte_utils.OnuZteRegisterError("not passed vlan list") onu_vlan = safe_int(all_vids[0]) if onu_vlan == 0: raise zte_utils.OnuZteRegisterError("Bad vlan passed in config") if not re.match(expect_util.IP4_ADDR_REGEX, zte_ip_addr): raise expect_util.ExpectValidationError( "ip address for zte not valid") ch = self.login_into_olt(zte_ip_addr, telnet_login, telnet_password, telnet_prompt) self.ch = ch stack_num, rack_num, fiber_num = self.find_unregistered_onu( prompt=telnet_prompt, serial=serial) free_onu_number = self.get_last_registered_onu_number( stack_num=stack_num, rack_num=rack_num, fiber_num=fiber_num, prompt=telnet_prompt) # enter to config ch.do_cmd("conf t", f"{telnet_prompt}(config)#") int_addr = "%d/%d/%d" % (stack_num, rack_num, fiber_num) self.register_onu_on_olt_interface( free_onu_number=free_onu_number, serial=serial, prompt=telnet_prompt, onu_type=self.zte_type, int_addr=int_addr, ) self.apply_zte_top_conf( prompt=telnet_prompt, free_onu_number=free_onu_number, int_addr=int_addr, user_vid=onu_vlan, onu_mac=onu_mac, all_vids=all_vids, config=config, ) self.apply_zte_bot_conf( prompt=telnet_prompt, int_addr=int_addr, free_onu_number=free_onu_number, user_vid=onu_vlan, all_vids=all_vids, config=config, ) ch.do_cmd("exit", "%s#" % telnet_prompt) ch.sendline("exit") ch.close() return zte_utils.zte_onu_conv_to_num(rack_num=rack_num, fiber_num=fiber_num, port_num=free_onu_number)