隊(duì)列
[if !supportLists]1)????? [endif]離線配置中每個(gè)設(shè)備創(chuàng)建一個(gè)獨(dú)立的隊(duì)列绑嘹,用來(lái)處理報(bào)文的時(shí)序畅卓,由設(shè)備的deviceId作為key值在Map中維護(hù)翁潘,從而使不同的設(shè)備的報(bào)文處理任務(wù)之間沒(méi)有業(yè)務(wù)邏輯上的相互影響趁冈。
[if !supportLists]2)????? [endif]正常流程觸發(fā)的任務(wù)和設(shè)備注冊(cè)觸發(fā)的任務(wù)在隊(duì)列中都是相同的處理,如果設(shè)備注冊(cè)創(chuàng)建OfflineConfigTask時(shí)矾飞,隊(duì)列中已經(jīng)有其他任務(wù)存在一膨,則需等其他任務(wù)都處理完成之后瞒津,才會(huì)處理此任務(wù)啦膜,保證報(bào)文下發(fā)的正確順序,防止后下發(fā)的報(bào)文先到達(dá)設(shè)備裸删,導(dǎo)致出現(xiàn)依賴問(wèn)題八拱。
[if !supportLists]3)????? [endif]Netconf-Plugin層設(shè)備與控制器連接的session有一個(gè)標(biāo)志屬性涯塔,用于標(biāo)識(shí)OfflineConfigTask已處理過(guò)匕荸,即當(dāng)前控制器離線配置庫(kù)中的配置與設(shè)備的配置一致灯萍。之后,正常流程下發(fā)的報(bào)文可以直接下到設(shè)備上每聪。Session創(chuàng)建時(shí)旦棉,此標(biāo)識(shí)屬性為null,OfflineConfigTask處理后药薯,會(huì)為此屬性賦一個(gè)對(duì)象绑洛。當(dāng)正常流程報(bào)文下發(fā)時(shí),如果此屬性為null童本,則不將其下發(fā)到設(shè)備真屯。保證了到達(dá)設(shè)備的報(bào)文順序的正確性。
OnlineConfigTask處理流程
這里只講主體流程穷娱,報(bào)文的處理邏輯之后單獨(dú)講绑蔫。從隊(duì)列冒泡任務(wù)執(zhí)行開(kāi)始
[if !supportLists]1)????? [endif]判斷設(shè)備在線狀態(tài)及配置能否直接下發(fā)
通過(guò)deviceId查找Netconf-Plugin層中控制器與設(shè)備連接的session,及其狀態(tài)屬性status.offlineprocessed泵额。如果session存在配深,且其狀態(tài)屬性status.offlineprocessed不為null,則其結(jié)果為true嫁盲。
[if !supportLists]2)????? [endif]如果判斷結(jié)果為false篓叶,則調(diào)用離線配置庫(kù),將報(bào)文合并到離線配置庫(kù)中羞秤。如果報(bào)文在離線配置中執(zhí)行成功缸托,則將報(bào)文保存到數(shù)據(jù)庫(kù)的離線配置報(bào)文表(db.com_huawei_controller_netconf_proxy_entity_OfflineConfigMsgEntity)中。無(wú)論成功失敗瘾蛋,返回結(jié)果報(bào)文俐镐,并發(fā)送結(jié)果通知
[if !supportLists]3)????? [endif]如果判斷結(jié)果為true,則調(diào)用Netconf-plugin層的接口哺哼,將報(bào)文下發(fā)到設(shè)備佩抹,并用回調(diào)的方式監(jiān)聽(tīng)設(shè)備上的報(bào)文處理結(jié)果奇唤。如果失敗,直接發(fā)送失敗通知匹摇,返回失敗報(bào)文咬扇;如果成功,則調(diào)用離線配置庫(kù)廊勃,將報(bào)文合并到離線配置庫(kù)中懈贺,如果合并失敗,發(fā)送失敗通知返回失敗報(bào)文坡垫,否則發(fā)送成功通知返回成功報(bào)文(此處的成功報(bào)文和通知梭灿,以設(shè)備返回的報(bào)文為根據(jù));如果Netconf-plugin拋出通信異常冰悠,則將設(shè)備突然掉線處理堡妒,走2)的邏輯。
OnlineCopyConfigTask處理流程
這里只講主體流程溉卓,報(bào)文的處理邏輯之后單獨(dú)講皮迟。從隊(duì)列冒泡任務(wù)執(zhí)行開(kāi)始
基本流程與edit-config相似,只是直接下發(fā)到設(shè)備前桑寨,需要先從Netconf-plugin層獲取到設(shè)備的callhome配置伏尼,將其加到copy-config報(bào)文中,以免copy操作將設(shè)備上的配置全部覆蓋尉尾,導(dǎo)致配置異常爆阶。
OfflineConfigTask處理流程
這里只講主體流程,報(bào)文的處理邏輯之后單獨(dú)講沙咏。從隊(duì)列冒泡任務(wù)執(zhí)行開(kāi)始
OfflineConfigTask任務(wù)分三種類(lèi)型辨图,根據(jù)設(shè)備注冊(cè)時(shí)獲取到的啟動(dòng)時(shí)間與數(shù)據(jù)庫(kù)中保存的設(shè)備啟動(dòng)時(shí)間判斷。如果數(shù)據(jù)庫(kù)中設(shè)備啟動(dòng)時(shí)間為null肢藐,則當(dāng)前為設(shè)備第一次與控制器連接故河;如果兩個(gè)時(shí)間不同,則當(dāng)前為設(shè)備重啟后重新連接窖壕;如果兩個(gè)時(shí)間相同忧勿,則當(dāng)前為網(wǎng)絡(luò)中斷重新連接:
1)????? [endif]設(shè)備第一次與控制器連接
[if !supportLists]a)???????[endif]從設(shè)備獲取所有配置
[if !supportLists]b)???????[endif]將設(shè)備配置保存到Netconf-plugin的session中
[if !supportLists]c)????????[endif]從離線配置庫(kù)中獲取所有配置報(bào)文
[if !supportLists]d)???????[endif]將從設(shè)備獲取到的部分配置(目前是netconf-server)杉女,添加到從離線配置庫(kù)獲取到的報(bào)文中
[if !supportLists]e)???????[endif]將報(bào)文下發(fā)設(shè)備(同步離線配置)
[if !supportLists]f)????????[endif]將數(shù)據(jù)庫(kù)離線配置報(bào)文表中所有此設(shè)備的報(bào)文修改為已部署狀態(tài)
[if !supportLists]g)???????[endif]獲取設(shè)備配置
[if !supportLists]h)???????[endif]去掉部分配置(目前是netconf-server)瞻讽,改為edit-config報(bào)文
[if !supportLists]i)?????????[endif]將報(bào)文合并到離線配置庫(kù)(同步設(shè)備配置)
[if !supportLists]j)?????????[endif]修改Netconf-plugin層session的狀態(tài)屬性,標(biāo)識(shí)離線庫(kù)與設(shè)備的配置已一致
[if !supportLists]k)???????[endif]發(fā)送通知熏挎,返回結(jié)果報(bào)文
以上各步都是在上步成功的基礎(chǔ)上執(zhí)行下一步速勇,如果某一步失敗,則直接發(fā)送失敗通知坎拐,返回失敗報(bào)文