From 08101f68d7674e896a4be850af8c11211c1ab5ce Mon Sep 17 00:00:00 2001 From: dongxiancun Date: Wed, 28 Aug 2019 17:58:24 +0800 Subject: [PATCH] =?UTF-8?q?Mod=20aaa-12=20=E4=BF=AE=E5=A4=8D=E3=80=81?= =?UTF-8?q?=E5=B1=8F=E8=94=BD=E5=BC=82=E5=B8=B8=EF=BC=8C=E7=9B=AE=E5=89=8D?= =?UTF-8?q?=E7=9A=84=E7=8A=B6=E6=80=81=EF=BC=9A=E5=8F=AF=E4=BB=A5=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E8=8E=B7=E5=8F=96cpu=E5=92=8C=E5=86=85=E5=AD=98?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=EF=BC=9B=E8=8E=B7=E5=8F=96=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81=E8=A2=AB=E5=B1=8F=E8=94=BD=E4=BA=86?= =?UTF-8?q?=EF=BC=8C=E5=9B=A0=E4=B8=BANETCONF=20o-sr4=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84NetconfMessageTransformer=E7=B1=BB=E6=9C=89bug?= =?UTF-8?q?=EF=BC=8C=E5=BE=85=E5=8D=87=E7=BA=A7=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84NETCONF=E5=90=8E=EF=BC=8C=E5=86=8D=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E3=80=82=20RCA=EF=BC=9A=20SOL=EF=BC=9A=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BA=BA=EF=BC=9Adongxiancun=20=E6=A3=80=E8=A7=86=E4=BA=BA?= =?UTF-8?q?=EF=BC=9Adongxiancun?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/yang/device-status.yang | 28 ++- .../huawei/impl/HuaweiNetconfSpeaker.java | 207 ++++++++++-------- 2 files changed, 133 insertions(+), 102 deletions(-) diff --git a/ControlPlatform/driver-layer/adaptation-layer/src/main/yang/device-status.yang b/ControlPlatform/driver-layer/adaptation-layer/src/main/yang/device-status.yang index 2ae2220d9..de55d4405 100644 --- a/ControlPlatform/driver-layer/adaptation-layer/src/main/yang/device-status.yang +++ b/ControlPlatform/driver-layer/adaptation-layer/src/main/yang/device-status.yang @@ -14,9 +14,14 @@ module device-status { grouping cpu-status { container cpu-infos { description "CPU的状态信息"; - leaf usage-rate { - type int16 { - range "0..100"; + list cpu-info { + leaf position { + type string ; + } + leaf usage-rate { + type int16 { + range "0..100"; + } } } } @@ -25,12 +30,17 @@ module device-status { grouping mem-status { container memory-infos { description "内存的状态信息"; - leaf memory-total { - type int64 ; - } - leaf usage-rate { - type int16 { - range "0..100"; + list memory-info { + leaf position { + type string ; + } + leaf memory-total { + type int64 ; + } + leaf usage-rate { + type int16 { + range "0..100"; + } } } } diff --git a/ControlPlatform/driver-layer/drivers/huawei/src/main/java/com/cmcc/cmhi/huawei/impl/HuaweiNetconfSpeaker.java b/ControlPlatform/driver-layer/drivers/huawei/src/main/java/com/cmcc/cmhi/huawei/impl/HuaweiNetconfSpeaker.java index 18735c1da..4bc1f9c9b 100644 --- a/ControlPlatform/driver-layer/drivers/huawei/src/main/java/com/cmcc/cmhi/huawei/impl/HuaweiNetconfSpeaker.java +++ b/ControlPlatform/driver-layer/drivers/huawei/src/main/java/com/cmcc/cmhi/huawei/impl/HuaweiNetconfSpeaker.java @@ -15,9 +15,8 @@ import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.opendaylight.controller.md.sal.binding.api.*; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; -import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.devm.rev181123.Devm; import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.devm.rev181123.devm.CpuInfos; import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.devm.rev181123.devm.MemoryInfos; @@ -30,10 +29,13 @@ import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.ifm.r import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.ifm.rev181123.ifm.interfaces._interface.ipv4config.am4cfgaddrs.Am4CfgAddr; import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.ifm.rev181123.ifm.interfaces._interface.ipv6config.am6cfgaddrs.Am6CfgAddr; import org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.NodeCpu; +import org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.NodeCpuBuilder; import org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.NodeMemory; +import org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.NodeMemoryBuilder; import org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.cpu.status.CpuInfosBuilder; import org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.mem.status.MemoryInfosBuilder; import org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.tp.extension.rev190809.TpExt; +import org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.tp.extension.rev190809.TpExtBuilder; import org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.tp.extension.rev190809.tp.status.TpInfos; import org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.tp.extension.rev190809.tp.status.TpInfosBuilder; import org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.tp.extension.rev190809.tp.status.tp.infos.IpAddress; @@ -325,40 +327,47 @@ public class HuaweiNetconfSpeaker implements DataTreeChangeListener ifcList = new ArrayList<>(); + List ifcList = new ArrayList<>(); if (cupInfos.isPresent()) { List cpuInfoList = cupInfos.get().getCpuInfo(); for (CpuInfo cpuInfo : cpuInfoList) { LOG.info("Show cpu with serial {},cpu usage is {} ", cpuInfo.getKey().getPosition(), cpuInfo.getSystemCpuUsage()); - CpuInfosBuilder builder = new CpuInfosBuilder(); - org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.cpu.status.CpuInfos temp = builder.setUsageRate(cpuInfo.getSystemCpuUsage().shortValue()).build(); + org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.cpu.status.cpu.infos.CpuInfo temp = + new org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.cpu.status.cpu.infos.CpuInfoBuilder().setPosition(cpuInfo.getKey().getPosition()) + .setUsageRate(cpuInfo.getSystemCpuUsage().shortValue()).build(); ifcList.add(temp); } } else { LOG.info("No data present on path '{}' for mountpoint: {}", iid, nodeId); } + CpuInfosBuilder cpuInfosBuilder = new CpuInfosBuilder().setCpuInfo(ifcList); //write cpu information to layer - InstanceIdentifier cpuIid = NETCONF_TOPO_IID + InstanceIdentifier cpuIid = NETCONF_TOPO_IID .child(Node.class, new NodeKey(new NodeId(nodeId))) - .augmentation(NodeCpu.class) - .child(org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.cpu.status.CpuInfos.class); - for (int i = 0; i < ifcList.size(); i++) { - final WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); - writeTransaction.put(LogicalDatastoreType.OPERATIONAL, cpuIid, ifcList.get(i)); - Futures.addCallback(writeTransaction.submit(), new FutureCallback() { - @Override - public void onFailure(Throwable throwable) { + .augmentation(NodeCpu.class); + final WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); + writeTransaction.put(LogicalDatastoreType.OPERATIONAL, cpuIid, + new NodeCpuBuilder() + .setCpuInfos(cpuInfosBuilder.build()) + .build() + ); + Futures.addCallback(writeTransaction.submit(), new FutureCallback() { + @Override + public void onFailure(Throwable throwable) { + if (throwable instanceof OptimisticLockFailedException) { + LOG.warn("Write cpu information 捕获 乐观锁异常,本次获取忽略!"); + } else { LOG.error("Write cpu information failed." + throwable.getMessage()); } + } - @Override - public void onSuccess(Void avoid) { - LOG.info("Write cpu information success."); - } - }); - } + @Override + public void onSuccess(Void avoid) { + LOG.info("Write cpu information success."); + } + }); // Identifier path is equivalent to: // '.../yang-ext:mount/huawei-devm:devm/memoryInfos' @@ -372,98 +381,110 @@ public class HuaweiNetconfSpeaker implements DataTreeChangeListener memoryList = new ArrayList<>(); + List memoryList = new ArrayList<>(); if (memoryInfosOptional.isPresent()) { List memoryInfoList = memoryInfosOptional.get().getMemoryInfo(); for (MemoryInfo memoryInfo : memoryInfoList) { - LOG.info("Show memory with serial {},cpu usage is {} ", + LOG.info("Show memory with serial {},memory usage is {} ", memoryInfo.getKey().getPosition(), memoryInfo.getDoMemoryUsage()); - MemoryInfosBuilder builder = new MemoryInfosBuilder(); LOG.info("Huawei Device {} OsMemoryTotal is: {}", nodeId, memoryInfo.getOsMemoryTotal()); - org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.mem.status.MemoryInfos temp = builder.setMemoryTotal(memoryInfo.getOsMemoryTotal()). - setUsageRate(memoryInfo.getOsMemoryUsage().shortValue()).build(); + org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.mem.status.memory.infos.MemoryInfo temp = + new org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.mem.status.memory.infos.MemoryInfoBuilder() + .setPosition(memoryInfo.getKey().getPosition()) + .setMemoryTotal(memoryInfo.getOsMemoryTotal()) + .setUsageRate(memoryInfo.getDoMemoryUsage().shortValue()) + .build(); memoryList.add(temp); - } } else { LOG.info("No data present on path '{}' for mountpoint: {}", iid, nodeId); } + MemoryInfosBuilder memoryInfosBuilder = new MemoryInfosBuilder().setMemoryInfo(memoryList); //write memory information to layer - InstanceIdentifier customMemoryIID = NETCONF_TOPO_IID + InstanceIdentifier customMemoryIID = NETCONF_TOPO_IID .child(Node.class, new NodeKey(new NodeId(nodeId))) - .augmentation(NodeMemory.class) - .child(org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.mem.status.MemoryInfos.class); - for (int i = 0; i < memoryList.size(); i++) { - final WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); - writeTransaction.put(LogicalDatastoreType.OPERATIONAL, customMemoryIID, memoryList.get(i)); - Futures.addCallback(writeTransaction.submit(), new FutureCallback() { - @Override - public void onFailure(Throwable throwable) { + .augmentation(NodeMemory.class); + final WriteTransaction writeTransaction2 = dataBroker.newWriteOnlyTransaction(); + writeTransaction2.put(LogicalDatastoreType.OPERATIONAL, customMemoryIID, + new NodeMemoryBuilder() + .setMemoryInfos(memoryInfosBuilder.build()) + .build() + ); + Futures.addCallback(writeTransaction2.submit(), new FutureCallback() { + @Override + public void onFailure(Throwable throwable) { + if (throwable instanceof OptimisticLockFailedException) { + LOG.warn("Write memory information 捕获 乐观锁异常,本次获取忽略!"); + } else { LOG.error("Write memory information failed." + throwable.getMessage()); } - - @Override - public void onSuccess(Void avoid) { - LOG.info("Write memory information success."); - } - }); - } - - InstanceIdentifier interfacesIID = - InstanceIdentifier.create(Ifm.class).child(Interfaces.class); - - Optional interfacesOptional; - try { - // Read from a transaction is asynchronous, but a simple - // get/checkedGet makes the call synchronous - interfacesOptional = hwNodeReadTx.read(LogicalDatastoreType.OPERATIONAL, interfacesIID).checkedGet(); - } catch (ReadFailedException e) { - throw new IllegalStateException("Unexpected error reading data from " + nodeId, e); - } - List tpInfosList = new ArrayList<>(); - if (interfacesOptional.isPresent()) { - List interfaceList = interfacesOptional.get().getInterface(); - for (Interface intf : interfaceList) { - LOG.info("Show memory with serial {},ipv4 config is {} ", - intf.getKey().getIfName(), intf.getIpv4Config()); - TpInfosBuilder tpInfosBuilder = new TpInfosBuilder(); - List ipsOnIntf = getiplist(intf); - tpInfosBuilder.setIpAddress(ipsOnIntf); - tpInfosBuilder.setMtu(intf.getIfMtu().shortValue()); - tpInfosBuilder.setTpName(intf.getIfName().getValue()); - tpInfosBuilder.setTpNumber(intf.getIfNumber()); - tpInfosBuilder.setTpAdminStatus(buildTpAdmin(intf.getIfAdminStatus())); - tpInfosBuilder.setTpPhyType(intf.getIfPhyType().getName()); - tpInfosList.add(tpInfosBuilder.build()); } - } else { - LOG.info("No data present on path '{}' for mountpoint: {}", - iid, nodeId); - } + @Override + public void onSuccess(Void avoid) { + LOG.info("Write memory information success."); + } + }); - //write interface information to layer - for (int i = 0; i < tpInfosList.size(); i++) { - InstanceIdentifier tpinfosIID = NETCONF_TOPO_IID - .child(Node.class, new NodeKey(new NodeId(nodeId))) - .child(TerminationPoint.class, new TerminationPointKey(new TpId(tpInfosList.get(i).getTpName()))) - .augmentation(TpExt.class).child(TpInfos.class); - final WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); - writeTransaction.put(LogicalDatastoreType.OPERATIONAL, tpinfosIID, tpInfosList.get(i)); - Futures.addCallback(writeTransaction.submit(), new FutureCallback() { - @Override - public void onFailure(Throwable throwable) { - LOG.error("Write tp information information failed." + throwable.getMessage()); - } - - @Override - public void onSuccess(Void avoid) { - LOG.info("Write tp information information success."); - } - }); - } +// InstanceIdentifier interfacesIID = +// InstanceIdentifier.create(Ifm.class).child(Interfaces.class); +// +// Optional interfacesOptional; +// try { +// // Read from a transaction is asynchronous, but a simple +// // get/checkedGet makes the call synchronous +// interfacesOptional = hwNodeReadTx.read(LogicalDatastoreType.OPERATIONAL, interfacesIID).checkedGet(); +// } catch (ReadFailedException e) { +// throw new IllegalStateException("Unexpected error reading data from " + nodeId, e); +// } +// List tpInfosList = new ArrayList<>(); +// if (interfacesOptional.isPresent()) { +// List interfaceList = interfacesOptional.get().getInterface(); +// for (Interface intf : interfaceList) { +// LOG.info("Show memory with serial {},ipv4 config is {} ", +// intf.getKey().getIfName(), intf.getIpv4Config()); +// TpInfosBuilder tpInfosBuilder = new TpInfosBuilder(); +// List ipsOnIntf = getiplist(intf); +// tpInfosBuilder.setIpAddress(ipsOnIntf); +// tpInfosBuilder.setMtu(intf.getIfMtu().shortValue()); +// tpInfosBuilder.setTpName(intf.getIfName().getValue()); +// tpInfosBuilder.setTpNumber(intf.getIfNumber()); +// tpInfosBuilder.setTpAdminStatus(buildTpAdmin(intf.getIfAdminStatus())); +// tpInfosBuilder.setTpPhyType(intf.getIfPhyType().getName()); +// tpInfosList.add(tpInfosBuilder.build()); +// } +// } else { +// LOG.info("No data present on path '{}' for mountpoint: {}", +// iid, nodeId); +// } +// +// +// //write interface information to layer +// final WriteTransaction writeTransaction3 = dataBroker.newWriteOnlyTransaction(); +// for (int i = 0; i < tpInfosList.size(); i++) { +// InstanceIdentifier tpinfosIID = NETCONF_TOPO_IID +// .child(Node.class, new NodeKey(new NodeId(nodeId))) +// .child(TerminationPoint.class, new TerminationPointKey(new TpId(tpInfosList.get(i).getTpName()))) +// .augmentation(TpExt.class); +// writeTransaction3.put(LogicalDatastoreType.OPERATIONAL, tpinfosIID, +// new TpExtBuilder() +// .setTpInfos(tpInfosList.get(i)) +// .build() +// ); +// } +// Futures.addCallback(writeTransaction3.submit(), new FutureCallback() { +// @Override +// public void onFailure(Throwable throwable) { +// LOG.error("Write tp information information failed." + throwable.getMessage()); +// } +// +// @Override +// public void onSuccess(Void avoid) { +// LOG.info("Write tp information information success."); +// } +// }); }