队列
[if !supportLists]1) [endif]离线配置中每个设备创建一个独立的队列,用来处理报文的时序,由设备的deviceId作为key值在Map中维护,从而使不同的设备的报文处理任务之间没有业务逻辑上的相互影响。
[if !supportLists]2) [endif]正常流程触发的任务和设备注册触发的任务在队列中都是相同的处理,如果设备注册创建OfflineConfigTask时,队列中已经有其他任务存在,则需等其他任务都处理完成之后,才会处理此任务,保证报文下发的正确顺序,防止后下发的报文先到达设备,导致出现依赖问题。
[if !supportLists]3) [endif]Netconf-Plugin层设备与控制器连接的session有一个标志属性,用于标识OfflineConfigTask已处理过,即当前控制器离线配置库中的配置与设备的配置一致。之后,正常流程下发的报文可以直接下到设备上。Session创建时,此标识属性为null,OfflineConfigTask处理后,会为此属性赋一个对象。当正常流程报文下发时,如果此属性为null,则不将其下发到设备。保证了到达设备的报文顺序的正确性。
OnlineConfigTask处理流程
这里只讲主体流程,报文的处理逻辑之后单独讲。从队列冒泡任务执行开始
[if !supportLists]1) [endif]判断设备在线状态及配置能否直接下发
通过deviceId查找Netconf-Plugin层中控制器与设备连接的session,及其状态属性status.offlineprocessed。如果session存在,且其状态属性status.offlineprocessed不为null,则其结果为true。
[if !supportLists]2) [endif]如果判断结果为false,则调用离线配置库,将报文合并到离线配置库中。如果报文在离线配置中执行成功,则将报文保存到数据库的离线配置报文表(db.com_huawei_controller_netconf_proxy_entity_OfflineConfigMsgEntity)中。无论成功失败,返回结果报文,并发送结果通知
[if !supportLists]3) [endif]如果判断结果为true,则调用Netconf-plugin层的接口,将报文下发到设备,并用回调的方式监听设备上的报文处理结果。如果失败,直接发送失败通知,返回失败报文;如果成功,则调用离线配置库,将报文合并到离线配置库中,如果合并失败,发送失败通知返回失败报文,否则发送成功通知返回成功报文(此处的成功报文和通知,以设备返回的报文为根据);如果Netconf-plugin抛出通信异常,则将设备突然掉线处理,走2)的逻辑。
OnlineCopyConfigTask处理流程
这里只讲主体流程,报文的处理逻辑之后单独讲。从队列冒泡任务执行开始
基本流程与edit-config相似,只是直接下发到设备前,需要先从Netconf-plugin层获取到设备的callhome配置,将其加到copy-config报文中,以免copy操作将设备上的配置全部覆盖,导致配置异常。
OfflineConfigTask处理流程
这里只讲主体流程,报文的处理逻辑之后单独讲。从队列冒泡任务执行开始
OfflineConfigTask任务分三种类型,根据设备注册时获取到的启动时间与数据库中保存的设备启动时间判断。如果数据库中设备启动时间为null,则当前为设备第一次与控制器连接;如果两个时间不同,则当前为设备重启后重新连接;如果两个时间相同,则当前为网络中断重新连接:
1) [endif]设备第一次与控制器连接
[if !supportLists]a) [endif]从设备获取所有配置
[if !supportLists]b) [endif]将设备配置保存到Netconf-plugin的session中
[if !supportLists]c) [endif]从离线配置库中获取所有配置报文
[if !supportLists]d) [endif]将从设备获取到的部分配置(目前是netconf-server),添加到从离线配置库获取到的报文中
[if !supportLists]e) [endif]将报文下发设备(同步离线配置)
[if !supportLists]f) [endif]将数据库离线配置报文表中所有此设备的报文修改为已部署状态
[if !supportLists]g) [endif]获取设备配置
[if !supportLists]h) [endif]去掉部分配置(目前是netconf-server),改为edit-config报文
[if !supportLists]i) [endif]将报文合并到离线配置库(同步设备配置)
[if !supportLists]j) [endif]修改Netconf-plugin层session的状态属性,标识离线库与设备的配置已一致
[if !supportLists]k) [endif]发送通知,返回结果报文
以上各步都是在上步成功的基础上执行下一步,如果某一步失败,则直接发送失败通知,返回失败报文