def test_script(obj): """ obj = MsgWorklistExecute default function name= test_script """ ret_worklist = ERR_FAIL # default ret_rpc = ERR_FAIL ret_datas = "" bool_reboot = False sn = obj.sn for nwf in [1]: try: u1 = User(sn, ip=worklistcfg.AGENT_HTTP_IP, port=worklistcfg.AGENT_HTTP_PORT, page=worklistcfg.WORKLIST2AGENT_PAGE, sender=KEY_SENDER_WORKLIST, worklist_id=obj.id_) # ---------------------------------------------------------- log.app_info("first rpc") ret_rpc, ret_data = u1.delete_object( ObjectName=obj.dict_data["node_add_object"]) ret_datas = ret_datas + "\n" + str(ret_data) if ret_rpc == ERR_SUCCESS: log.app_info("success:%s" % ret_data) status = int(ret_data["Status"]) if status == 1: bool_reboot = True else: log.app_err("fail:%s" % ret_data) break if bool_reboot: # ---------------------------------------------------------- log.app_info("need reboot") ret_rpc, ret_data = u1.reboot() ret_datas = ret_datas + "\n" + str(ret_data) if ret_rpc == ERR_SUCCESS: log.app_info("success:%s" % ret_data) else: log.app_err("fail:%s" % ret_data) break ret_worklist = ERR_SUCCESS except Exception, e: ret_datas = ret_datas + "\n" + str(e) log.app_err(e) break
def rollback(sn, rollbacklist, obj): ret_res = ERR_FAIL # 脚本返回值,成功或失败.缺省失败 ret_data_scr = "" enable = obj.rollback u1 = User(sn, ip=worklistcfg.AGENT_HTTP_IP, port=worklistcfg.AGENT_HTTP_PORT, page=worklistcfg.WORKLIST2AGENT_PAGE, sender=KEY_SENDER_WORKLIST, worklist_id=obj.id_) for att in [1]: if enable == False or enable == "False": break try: if len(rollbacklist) == 0: break info = u"开始执行回退操作......\n" log.app_info(info) ret_data_scr += info for i in rollbacklist: # sleep(5) ret, ret_data = u1.delete_object(ObjectName=i) if ret == ERR_SUCCESS: info = u"删除实例 %s 成功\n" % i log.app_info(info) ret_data_scr += info else: info = u"删除实例 %s 失败,错误信息:%s\n" % (i, ret_data) log.app_err(info) ret_data_scr += info continue # 删除实例失败时,仍然继续去执行删除后面的实例. except Exception, e: log.app_err(str(e)) ret_data_scr += str(e) + '\n' return ret_res, ret_data_scr
def WANDisable(obj, sn, DeviceType, AccessMode, PVC_OR_VLAN, dict_wanpppconnection, dict_wanipconnection, change_account=1): """ """ ret_res = ERR_FAIL # 脚本返回值,成功或失败.缺省失败 ret_data_scr = "" # 返回结果日志 ROOT_PATH = "InternetGatewayDevice.WANDevice.1.WANConnectionDevice." for nwf in [1]: try: u1 = User(sn, ip=worklistcfg.AGENT_HTTP_IP, port=worklistcfg.AGENT_HTTP_PORT, page=worklistcfg.WORKLIST2AGENT_PAGE, sender=KEY_SENDER_WORKLIST, worklist_id=obj.id_) reboot_Yes = 0 # 第一步:调用GetParameterNames方法,查询WAN连接 info = u"开始调用GetParameterNames方法,查询WAN连接\n" log.app_info(info) ret_data_scr += info # sleep(3) # must be ;otherwise exception ret_root, ret_data_root = u1.get_parameter_names(ParameterPath=ROOT_PATH, NextLevel=1) if ret_root == ERR_SUCCESS: info = u"查询WAN连接成功\n" log.app_info(info) ret_data_scr += info # GCW 20130329 解决部分CPE同时将当前路径返回的情况,将其删除 ret_data_root = DelOwnParameterNames(ret_data_root, ROOT_PATH) else: # 对于失败的情况,直接返回失败 info = u"查询WAN连接失败,错误信息:%s\n" % ret_data_root log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr # 第二步:逐个查找,对于A上行,查PVC,其他的则查VLAN # path2 = [] path2 = '' # 保存查到有相同的PVC或关键参数值的WAN连接路径 path2_1 = '' # 保存WANPPPConnection或WANIPConnection节点路径保存,后面修改参数时有用 WAN_Flag = None # 直接调GetParameterValues 查PVC或VLAN for i in xrange(len(ret_data_root['ParameterList'])): tmp_path2 = ret_data_root['ParameterList'][i]['Name'] # A上行是关心PVC,LAN上行是关心VLAN,PON上行也是关心VLAN if DeviceType == 'ADSL': tmp_path2 = tmp_path2 + 'WANDSLLinkConfig.DestinationAddress' info = u"开始调用GetParameterValues,查询第%s个WAN连接的PVC节点DestinationAddress值\n" % str(i + 1) elif DeviceType == 'LAN': tmp_path2 = tmp_path2 + 'WANEthernetLinkConfig.X_CU_VLANIDMark' info = u"开始调用GetParameterValues,查询第%s个WAN连接的VLAN节点X_CU_VLANIDMark值\n" % str(i + 1) elif DeviceType == 'EPON': tmp_path2 = tmp_path2 + 'X_CU_VLAN' info = u"开始调用GetParameterValues,查询第%s个WAN连接的VLAN节点X_CU_VLAN值\n" % str(i + 1) elif DeviceType == 'VDSL': tmp_path2 = tmp_path2 + 'WANDSLLinkConfig.X_CU_VLAN' info = u"开始调用GetParameterValues,查询第%s个WAN连接的VLAN节点X_CU_VLAN值\n" % str(i + 1) elif DeviceType == 'GPON': tmp_path2 = tmp_path2 + 'X_CU_VLAN' info = u"开始调用GetParameterValues,查询第%s个WAN连接的VLAN节点X_CU_VLAN值\n" % str(i + 1) else: tmp_path2 = tmp_path2 + 'WANDSLLinkConfig.DestinationAddress' info = u"开始调用GetParameterValues,查询第%s个WAN连接的PVC节点DestinationAddress值\n" % str(i + 1) log.app_info(info) ret_data_scr += info # sleep(3) ret2, ret_data2 = u1.get_parameter_values(ParameterNames=tmp_path2) if ret2 == ERR_SUCCESS: info = u"查询成功,返回:%s\n" % ret_data2 log.app_info(info) ret_data_scr += info # 当返回的PVC与要绑定的相同时,标记WAN_Flag,走修改流程 if ret_data2['ParameterList'] == []: pass else: # 如果查到PVC或VLAN相同,则标记 if ret_data2['ParameterList']: if ret_data2['ParameterList'][0]['Value'] == PVC_OR_VLAN: # 查到有匹配PVC WAN_Flag = 0 path2 = ret_data_root['ParameterList'][i]['Name'] break else: # 查不到匹配的PVC continue else: continue else: # 对于失败的情况,直接返回错误 info = u"查询失败,错误信息%s\n" % ret_data2 log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr # 如果一直没有查到相同的,则没有对WAN_Flag标志位做过修改,则说明没有匹配的WAN连接实例 if WAN_Flag == None: WAN_Flag = 1 # 查不到匹配的PVC或VLAN,不做任何事情 if WAN_Flag == 1: info = u"查不到匹配的PVC或VLAN,不执行删除WANConnectionDevice实例的操作\n" log.app_info(info) ret_data_scr += info pass elif WAN_Flag == 0: # 当查到有相匹配的PVC时的处理流程,则还需查WANPPPConnection下的三个节点是否一致 # 如果完全一致,直接删除WAN连接实例,否则待完善 # 不同的WAN连接模式,其节点路径不同 if AccessMode == 'PPPoE' or AccessMode == 'PPPoE_Bridged': info = u"开始调用GetParameterNames查询WANPPPConnection实例\n" tmp_path3 = path2 + 'WANPPPConnection.' # GCW 20130418 应该只区分是路由还是桥接 if AccessMode == "PPPoE_Bridged": tmp_ConnectionType = "PPPoE_Bridged" else: tmp_ConnectionType = "IP_Routed" tmp_X_CU_LanInterface = dict_wanpppconnection['X_CU_LanInterface'][1] tmp_X_CU_ServiceList = dict_wanpppconnection['X_CU_ServiceList'][1] elif AccessMode == 'DHCP' or AccessMode == 'Static': info = u"开始调用GetParameterNames查询WANIPConnection实例\n" tmp_path3 = path2 + 'WANIPConnection.' # GCW 20130418 应该只区分是路由还是桥接 tmp_ConnectionType = "IP_Routed" tmp_X_CU_LanInterface = dict_wanipconnection['X_CU_LanInterface'][1] tmp_X_CU_ServiceList = dict_wanipconnection['X_CU_ServiceList'][1] log.app_info(info) ret_data_scr += info # sleep(3) ret_tmp_path3 = [] ret3, ret_data3 = u1.get_parameter_names(ParameterPath=tmp_path3, NextLevel=1) if ret3 == ERR_SUCCESS: info = u"查询成功,返回%s\n" % ret_data3 log.app_info(info) ret_data_scr += info # GCW 20130329 解决部分CPE同时将当前路径返回的情况,将其删除 ret_data3 = DelOwnParameterNames(ret_data3, tmp_path3) # 返回有路径,则保存 if ret_data3['ParameterList']: for tmp_index in xrange(len(ret_data3['ParameterList'])): ret_tmp_path3.append(ret_data3['ParameterList'][tmp_index]['Name']) else: # 对于失败的情况,直接退出 info = u"查询失败,返回错误信息:%s\n" % ret_data3 log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr # 第2.2步,对于PPPOE查找X_CU_ServiceList和Username值. # 由于贝曼有些版本只查X_CU_ServiceList,或者查到Username相同与否不影响判断结果, # 所以目前只支持查X_CU_ServiceList for i in xrange(len(ret_tmp_path3)): info = u"开始调用GetParameterValues查找第%s个WAN连接实例下的参数值\n" % str(i + 1) log.app_err(info) ret_data_scr += info tmp_path3_2 = [] tmp_path3_2.append(ret_tmp_path3[i] + 'ConnectionType') tmp_path3_2.append(ret_tmp_path3[i] + 'X_CU_ServiceList') if AccessMode == 'PPPoE' or AccessMode == 'PPPoE_Bridged': if dict_wanpppconnection['X_CU_LanInterface'][0] == 1: tmp_path3_2.append(ret_tmp_path3[i] + 'X_CU_LanInterface') elif AccessMode == 'DHCP' or AccessMode == 'Static': if dict_wanipconnection['X_CU_LanInterface'][0] == 1: tmp_path3_2.append(ret_tmp_path3[i] + 'X_CU_LanInterface') # sleep(3) ret3_2, ret_data3_2 = u1.get_parameter_values(ParameterNames=tmp_path3_2) if ret3_2 == ERR_SUCCESS: info = u"查找第%s个WAN连接实例下的参数值成功,返回:%s\n" % (str(i + 1), ret_data3_2) log.app_info(info) ret_data_scr += info # 判断值是否相等,相等则直接删除WAN实例,否则就返回错误 WAN_Flag_1 = 0 for j in xrange(len(tmp_path3_2)): if 'ConnectionType' in ret_data3_2['ParameterList'][j]['Name'].split("."): if ret_data3_2['ParameterList'][j]['Value'] == tmp_ConnectionType: WAN_Flag_1 = 1 else: WAN_Flag_1 = 0 break elif 'X_CU_LanInterface' in ret_data3_2['ParameterList'][j]['Name'].split("."): # 只要包含关系,就可认为是查到相等 # GCW 20130410 解决页面删除了绑定的LAN后导致此节点值为空的情况,不能执行split # tmp_value = [] # tmp_value = ret_data3_2['ParameterList'][j]['Value'].split(',') tmp_value = ret_data3_2['ParameterList'][j]['Value'] # GCW 20130413 手动页面删除绑定或工单中传参绑定为空时的异常处理。 if tmp_value == "" or tmp_value == None: if tmp_X_CU_LanInterface == "": # 两者均为空,则匹配成功 WAN_Flag_1 = 1 else: # 两者只要有一个不为空,则匹配为不相等 WAN_Flag_1 = 0 break else: if tmp_X_CU_LanInterface == "": # 两者只要有一个不为空,则匹配为不相等 WAN_Flag_1 = 0 break else: if tmp_X_CU_LanInterface in tmp_value: WAN_Flag_1 = 1 else: WAN_Flag_1 = 0 break elif 'X_CU_ServiceList' in ret_data3_2['ParameterList'][j]['Name'].split("."): # 只要包含关系,就可认为是查到相等 # tmp_value = [] # tmp_value = ret_data3_2['ParameterList'][j]['Value'].split(',') tmp_value = ret_data3_2['ParameterList'][j]['Value'] if tmp_X_CU_ServiceList in tmp_value: WAN_Flag_1 = 1 else: WAN_Flag_1 = 0 break # 如果有一个不匹配,则认为没有开通IGMP的WAN连接,无法删除 if WAN_Flag_1 == 0: info = u"查到与工单中有不匹配的参数,无法删除WAN连接实例\n" log.app_err(info) ret_data_scr += info # GCW 20130419 IPTV取消工单,如果查不到匹配的WAN连接也可以认为成功 # return ret_res, ret_data_scr else: # 删除WAN连接实例 info = u"准备删除WANConnectionDevice实例\n" log.app_info(info) ret_data_scr += info tmp_path = ret_tmp_path3[i].split('.') path = '' for i in xrange(len(tmp_path) - 3): path = path + tmp_path[i] + '.' # sleep(3) # must be ;otherwise exception ret3, ret_data3 = u1.delete_object( ObjectName=path) if ret3 == ERR_SUCCESS: info = u"删除WANConnectionDevice实例成功\n" log.app_info(info) ret_data_scr += info rebootFlag = int(ret_data3["Status"]) if rebootFlag == 1: reboot_Yes = 1 else: # 对于失败的情况,直接退出 info = u"删除WANConnectionDevice实例失败,错误原因:%s\n" % ret_data3 log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr # 如果需要重启,则下发Reboot方法,目前采用静等待130S if reboot_Yes == 1: # sleep(130) ret, ret_data = reboot_wait_next_inform(u1) if ret != ERR_SUCCESS: ret_data_scr += ret_data break # 第七步:调用修改联通维护密码,目前密码固定为CUAdmin ret, ret_data = ChangeAccount_CU(obj, sn, change_account) if ret == ERR_FAIL: ret_data_scr += ret_data return ret, ret_data_scr else: ret_data_scr += ret_data ret_res = ERR_SUCCESS except Exception, e: log.app_err(str(e)) ret_data_scr += str(e) + '\n' return ret_res, ret_data_scr
def Eagleeyes(obj, sn, DeviceType, AccessMode, PortMappingEnabled, dict_PortMapping, change_account=1, rollbacklist=[]): """ """ ret_res = ERR_FAIL # 脚本返回值,成功或失败.缺省失败 ret_data_scr = "" # 返回结果日志 ROOT_PATH = "InternetGatewayDevice.WANDevice.1.WANConnectionDevice." for nwf in [1]: try: u1 = User(sn, ip=worklistcfg.AGENT_HTTP_IP, port=worklistcfg.AGENT_HTTP_PORT, page=worklistcfg.WORKLIST2AGENT_PAGE, sender=KEY_SENDER_WORKLIST, worklist_id=obj.id_) reboot_Yes = 0 #第一步:调用GetParameterNames方法,查询WAN连接 info = u"开始调用GetParameterNames方法,查询WAN连接\n" log.app_info(info) ret_data_scr += info #sleep(3) # must be ;otherwise exception ret_root, ret_data_root = u1.get_parameter_names( ParameterPath=ROOT_PATH, NextLevel=1) if (ret_root == ERR_SUCCESS): info = u"查询WAN连接成功\n" log.app_info(info) ret_data_scr += info # GCW 20130329 解决部分CPE同时将当前路径返回的情况,将其删除 ret_data_root = DelOwnParameterNames(ret_data_root, ROOT_PATH) else: #对于失败的情况,直接返回错误 info = u"查询WAN连接失败,错误信息:%s\n" % ret_data_root log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr #第二步:逐个查找 path2 = [] for i in xrange(len(ret_data_root['ParameterList'])): tmp_path2 = ret_data_root['ParameterList'][i]['Name'] #如果需绑定到PPPoE,则查WANPPPConnection节点。同理,如果以后是想绑定到静态WAN连接,则可以查另外的节点,可开放 #A上行是关心PVC,LAN上行是关心VLAN,PON上行也是关心VLAN if AccessMode == 'PPPoE' or AccessMode == 'PPPoE_Bridged': tmp_path2 = tmp_path2 + 'WANPPPConnection.' info = u"开始调用GetParameterNames查找第%s条WAN连接WANPPPConnection实例\n" % str( i + 1) elif AccessMode == 'DHCP' or AccessMode == 'Static': tmp_path2 = tmp_path2 + 'WANIPConnection.' info = u"开始调用GetParameterNames查找第%s条WAN连接WANIPConnection实例\n" % str( i + 1) else: info = u"参数错误,目前只支持PPPoE_Bridged\PPPoE\DHCP\Static\n" log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr log.app_info(info) ret_data_scr += info #sleep(3) ret2, ret_data2 = u1.get_parameter_names( ParameterPath=tmp_path2, NextLevel=1) if (ret2 == ERR_SUCCESS): info = u"查找第%s条WAN连接实例成功\n" % str(i + 1) log.app_info(info) ret_data_scr += info # GCW 20130329 解决部分CPE同时将当前路径返回的情况,将其删除 ret_data2 = DelOwnParameterNames(ret_data2, tmp_path2) #以下是只考虑返回值只有一个的情况.当然,空的时候则是什么也不做 if ret_data2['ParameterList'] == []: pass else: for tmp_index in xrange(len( ret_data2['ParameterList'])): path2.append( ret_data2['ParameterList'][tmp_index]['Name']) else: #对于失败的情况,直接返回错误 info = u"查找第%s条WAN连接实例失败,错误信息: %s\n" % (str(i + 1), ret_data2) log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr #如果查到当前的WAN连接下,均没有WANPPPConnection实例,则说明不能绑定到PPPOE下,退出。 #同理,如果是绑定到静态WAN连接,而WAN连接下没有实例号,则退出 if path2 == []: info = u"遍历WAN连接实例结束,但无发现可用的Connection实例号,请检查\n" log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr else: pass #第三步,然后对path2中的值进行循环查找,只要一查到INTERNET,则退出 INTERNET_FLAG = False for i in xrange(len(path2)): info = u"开始调用GetParameterValues查找第%s个WAN连接实例下的ConnectionType和X_CT-COM_ServiceList值\n" % str( i + 1) log.app_info(info) ret_data_scr += info # GCW 20130418 增加是路由还是桥的查找判断 tmp_path3 = [] tmp_path3.append(path2[i] + 'ConnectionType') tmp_path3.append(path2[i] + 'X_CT-COM_ServiceList') #sleep(3) ret3, ret_data3 = u1.get_parameter_values( ParameterNames=tmp_path3) if (ret3 == ERR_SUCCESS): info = u"查找第%s个WAN连接实例下的ConnectionType和X_CT-COM_ServiceList值成功,返回:%s\n" % ( str(i + 1), ret_data3) log.app_info(info) ret_data_scr += info #如果查到有INTERNET,同退出当前循环 # GCW 20130410 修改为包含于的关系即可 # GCW 20130418 增加对路由或桥的判断 if AccessMode == "PPPoE_Bridged": ConnectionType = "PPPoE_Bridged" else: ConnectionType = "IP_Routed" # 只有桥对桥,路由对路由对比才有意义。 if ConnectionType == ret_data3['ParameterList'][0]['Value'] or \ ConnectionType == ret_data3['ParameterList'][1]['Value']: # 全球眼固定是绑定到包含INTERNET的WAN连接的 if 'INTERNET' in ret_data3['ParameterList'][0]['Value'] or \ 'INTERNET' in ret_data3['ParameterList'][1]['Value']: INTERNET_FLAG = True #记录包含INTERNET的节点路径 path3 = path2[i] break else: #对于失败的情况,直接返回错误 info = u"查找第%s个WAN连接实例下的X_CT-COM_ServiceList值失败,返回:%s\n" % ( str(i + 1), ret_data3) log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr #如果一直都没有查到,怎么办?目前是直接返回失败 if INTERNET_FLAG == False: info = u"经遍历查找,查无匹配的X_CT-COM_ServiceList包含INTERNET值的%s 连接,执行失败.\n" % AccessMode log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr #第四步,调用GetParameterNames方法,查找端口映射中是否有实例 info = u"开始调用GetParameterNames方法,查找端口映射中是否有实例\n" log.app_info(info) ret_data_scr += info #sleep(3) PortMapping_flag = 0 GetParameterNames_path4 = path3 + 'PortMapping.' ret4, ret_data4 = u1.get_parameter_names( ParameterPath=GetParameterNames_path4, NextLevel=1) if (ret4 == ERR_SUCCESS): # GCW 20130329 解决部分CPE同时将当前路径返回的情况,将其删除 ret_data4 = DelOwnParameterNames(ret_data4, GetParameterNames_path4) #如果查到有实例,则需查找是否所有参数一致,一致则不做任何修改,不一致则修改 if ret_data4['ParameterList'] == []: info = u"端口映射中没有实例\n" log.app_info(info) ret_data_scr += info PortMapping_flag = 0 # 表示查无实例,后面需要新建 else: # 查到有实例,还需要判断是否与工单参数中的相同,相同才删除实例,否则也是不删 info = u"端口映射中已有实例\n" log.app_info(info) ret_data_scr += info for j in xrange(len(ret_data4['ParameterList'])): path = ret_data4['ParameterList'][j]['Name'] #sleep(3) info = u"查找%s 下的参数,检查端口映射规则是否与工单中的完全一致\n" % path log.app_info(info) ret_data_scr += info # 将字典中的追加,查找值然后进行比对 tmp_path = [] # 保存路径 tmp_Value = [] # 保存成对的参数,值 for k in dict_PortMapping: if dict_PortMapping[k][0] == 1: tmp_path.append(path + k) tmp_Value.append([k, dict_PortMapping[k][1]]) ret4_2, ret_data4_2 = u1.get_parameter_values( ParameterNames=tmp_path) if (ret4_2 == ERR_SUCCESS): tmp = len(ret_data4_2['ParameterList']) # 判断所有值是否相等 for k in xrange(len(ret_data4_2['ParameterList'])): tmpaa = ret_data4_2['ParameterList'][k]['Name'] for l in xrange(len(tmp_Value)): if tmp_Value[l][0] in ret_data4_2[ 'ParameterList'][k]['Name'].split( "."): if ret_data4_2['ParameterList'][k][ 'Value'] == tmp_Value[l][1]: PortMapping_flag = 1 break else: PortMapping_flag = 0 break # GCW 20130410 参数不一致时,仍认为端口映射规则相同的问题 if PortMapping_flag == 0: break else: info = u"查找失败,退出工单执行\n" log.app_info(info) ret_data_scr += info return ret_res, ret_data_scr if PortMapping_flag == 1: info = u"查找成功,且所有参数一致\n" log.app_info(info) ret_data_scr += info path_4 = ret_data4['ParameterList'][j]['Name'] break else: info = u"查找成功,但此端口映射中的规则与工单中要求的不一致。\n" log.app_info(info) ret_data_scr += info else: #对于失败的情况,直接返回错误 info = u"查找端口映射中是否有实例失败,错误信息:%s\n" % ret_data4 log.app_info(info) ret_data_scr += info return ret_res, ret_data_scr # 如果是开通业务,则需新增实例并下发参数,如果是取消业务,则直接删除实例 if PortMappingEnabled == 'Enable': #第五步,调用AddObject新建实例 if PortMapping_flag == 0: info = u"本工单是开通业务,且端口映射中查无实例或实例中参数不等,开始调用AddObject新建实例\n" log.app_info(info) ret_data_scr += info path5 = GetParameterNames_path4 #sleep(3) # must be ;otherwise exception ret5, ret_data5 = u1.add_object(ObjectName=path5) if (ret5 == ERR_SUCCESS): instanceNum1 = ret_data5["InstanceNumber"] info = u"新建端口映射实例成功,返回实例号:%s\n" % instanceNum1 log.app_info(info) ret_data_scr += info # GCW 20130327 增加回退机制 rollbacklist.append(path5 + instanceNum1 + '.') rebootFlag = int(ret_data5["Status"]) if (rebootFlag == 1): reboot_Yes = 1 else: #对于失败的情况,直接返回错误 info = u"新建端口映射实例失败,错误原因:%s\n" % ret_data5 log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr #第六步:调用SetParameterValues设置参数 info = u"开始调用SetParameterValues设置端口映射参数\n" log.app_info(info) ret_data_scr += info path6 = path5 + instanceNum1 + '.' para_list6 = [] for i in dict_PortMapping: if dict_PortMapping[i][0] == 1: tmp_path = path6 + i para_list6.append( dict(Name=tmp_path, Value=dict_PortMapping[i][1])) if para_list6 == []: return ret_res, ret_data_scr #sleep(3) # must be ;otherwise exception ret6, ret_data6 = u1.set_parameter_values( ParameterList=para_list6) if (ret6 == ERR_SUCCESS): info = u"设置端口映射参数成功\n" log.app_info(info) ret_data_scr += info rebootFlag = int(ret_data6["Status"]) if (rebootFlag == 1): reboot_Yes = 1 else: #对于失败的情况,直接返回错误 info = u"设置端口映射参数失败,错误信息:%s\n" % ret_data6 log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr else: info = u"本工单是开通业务,但已有端口映射规则且所有参数均相等。不再新建。\n" log.app_info(info) ret_data_scr += info elif PortMappingEnabled == 'Disable': #第五步,调用删除实例 if PortMapping_flag == 1: # 删除WAN连接实例 #log.app_info (u"删除PortMapping实例\n") info = u"本工单是取消业务,在端口映射中查到实例且参数完全一致,开始调用DelObject删除PortMapping实例\n" log.app_info(info) ret_data_scr += info path = path_4 #sleep(3) # must be ;otherwise exception ret5, ret_data5 = u1.delete_object(ObjectName=path) if (ret5 == ERR_SUCCESS): info = u"删除PortMapping实例成功\n" log.app_info(info) ret_data_scr += info rebootFlag = int(ret_data5["Status"]) if (rebootFlag == 1): reboot_Yes = 1 else: #对于失败的情况,直接退出 info = u"删除PortMapping实例失败,错误原因:%s\n" % ret_data5 log.app_err(info) ret_data_scr += info return ret_res, ret_data_scr else: info = u"本工单是取消业务,但查无所有参数均相等的实例可删除。\n" log.app_info(info) ret_data_scr += info # 如果需要重启,则下发Reboot方法,目前采用静等待130S if (reboot_Yes == 1): #sleep(130) ret, ret_data = reboot_wait_next_inform(u1) if (ret != ERR_SUCCESS): ret_data_scr += ret_data break #第七步:调用修改电信维护密码,目前密码固定为nE7jA%5m ret, ret_data = ChangeAccount_CT(obj, sn, change_account) if ret == ERR_FAIL: ret_data_scr += ret_data return ret, ret_data_scr else: ret_data_scr += ret_data ret_res = ERR_SUCCESS except Exception, e: log.app_err(str(e)) ret_data_scr += str(e) + '\n' return ret_res, ret_data_scr