Mod aaa-12 修复、屏蔽异常,目前的状态:可以正常获取cpu和内存信息;获取端口的代码被屏蔽了,因为NETCONF o-sr4版本的NetconfMessageTransformer类有bug,待升级新版本的NETCONF后,再重试。

RCA:
SOL:
修改人:dongxiancun
检视人:dongxiancun
This commit is contained in:
dongxiancun 2019-08-28 17:58:24 +08:00
parent 62a5d8eea4
commit 08101f68d7
2 changed files with 133 additions and 102 deletions

View File

@ -14,6 +14,10 @@ module device-status {
grouping cpu-status { grouping cpu-status {
container cpu-infos { container cpu-infos {
description "CPU的状态信息"; description "CPU的状态信息";
list cpu-info {
leaf position {
type string ;
}
leaf usage-rate { leaf usage-rate {
type int16 { type int16 {
range "0..100"; range "0..100";
@ -21,10 +25,15 @@ module device-status {
} }
} }
} }
}
grouping mem-status { grouping mem-status {
container memory-infos { container memory-infos {
description "内存的状态信息"; description "内存的状态信息";
list memory-info {
leaf position {
type string ;
}
leaf memory-total { leaf memory-total {
type int64 ; type int64 ;
} }
@ -35,6 +44,7 @@ module device-status {
} }
} }
} }
}
grouping driver-status { grouping driver-status {
container driver-id-info { container driver-id-info {

View File

@ -15,9 +15,8 @@ import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.opendaylight.controller.md.sal.binding.api.*; 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.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.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;
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.CpuInfos;
import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.devm.rev181123.devm.MemoryInfos; 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.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.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.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.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.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.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.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.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.TpInfosBuilder;
import org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.tp.extension.rev190809.tp.status.tp.infos.IpAddress; 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<ConnectorInf
} catch (ReadFailedException e) { } catch (ReadFailedException e) {
throw new IllegalStateException("Unexpected error reading data from " + nodeId, e); throw new IllegalStateException("Unexpected error reading data from " + nodeId, e);
} }
List<org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.cpu.status.CpuInfos> ifcList = new ArrayList<>(); List<org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.cpu.status.cpu.infos.CpuInfo> ifcList = new ArrayList<>();
if (cupInfos.isPresent()) { if (cupInfos.isPresent()) {
List<CpuInfo> cpuInfoList = cupInfos.get().getCpuInfo(); List<CpuInfo> cpuInfoList = cupInfos.get().getCpuInfo();
for (CpuInfo cpuInfo : cpuInfoList) { for (CpuInfo cpuInfo : cpuInfoList) {
LOG.info("Show cpu with serial {},cpu usage is {} ", LOG.info("Show cpu with serial {},cpu usage is {} ",
cpuInfo.getKey().getPosition(), cpuInfo.getSystemCpuUsage()); cpuInfo.getKey().getPosition(), cpuInfo.getSystemCpuUsage());
CpuInfosBuilder builder = new CpuInfosBuilder(); org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.cpu.status.cpu.infos.CpuInfo temp =
org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.cpu.status.CpuInfos temp = builder.setUsageRate(cpuInfo.getSystemCpuUsage().shortValue()).build(); 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); ifcList.add(temp);
} }
} else { } else {
LOG.info("No data present on path '{}' for mountpoint: {}", LOG.info("No data present on path '{}' for mountpoint: {}",
iid, nodeId); iid, nodeId);
} }
CpuInfosBuilder cpuInfosBuilder = new CpuInfosBuilder().setCpuInfo(ifcList);
//write cpu information to layer //write cpu information to layer
InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.cpu.status.CpuInfos> cpuIid = NETCONF_TOPO_IID InstanceIdentifier<NodeCpu> cpuIid = NETCONF_TOPO_IID
.child(Node.class, new NodeKey(new NodeId(nodeId))) .child(Node.class, new NodeKey(new NodeId(nodeId)))
.augmentation(NodeCpu.class) .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(); final WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
writeTransaction.put(LogicalDatastoreType.OPERATIONAL, cpuIid, ifcList.get(i)); writeTransaction.put(LogicalDatastoreType.OPERATIONAL, cpuIid,
new NodeCpuBuilder()
.setCpuInfos(cpuInfosBuilder.build())
.build()
);
Futures.addCallback(writeTransaction.submit(), new FutureCallback<Void>() { Futures.addCallback(writeTransaction.submit(), new FutureCallback<Void>() {
@Override @Override
public void onFailure(Throwable throwable) { public void onFailure(Throwable throwable) {
if (throwable instanceof OptimisticLockFailedException) {
LOG.warn("Write cpu information 捕获 乐观锁异常,本次获取忽略!");
} else {
LOG.error("Write cpu information failed." + throwable.getMessage()); LOG.error("Write cpu information failed." + throwable.getMessage());
} }
}
@Override @Override
public void onSuccess(Void avoid) { public void onSuccess(Void avoid) {
LOG.info("Write cpu information success."); LOG.info("Write cpu information success.");
} }
}); });
}
// Identifier path is equivalent to: // Identifier path is equivalent to:
// '.../yang-ext:mount/huawei-devm:devm/memoryInfos' // '.../yang-ext:mount/huawei-devm:devm/memoryInfos'
@ -372,98 +381,110 @@ public class HuaweiNetconfSpeaker implements DataTreeChangeListener<ConnectorInf
} catch (ReadFailedException e) { } catch (ReadFailedException e) {
throw new IllegalStateException("Unexpected error reading data from " + nodeId, e); throw new IllegalStateException("Unexpected error reading data from " + nodeId, e);
} }
List<org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.mem.status.MemoryInfos> memoryList = new ArrayList<>(); List<org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.mem.status.memory.infos.MemoryInfo> memoryList = new ArrayList<>();
if (memoryInfosOptional.isPresent()) { if (memoryInfosOptional.isPresent()) {
List<MemoryInfo> memoryInfoList = memoryInfosOptional.get().getMemoryInfo(); List<MemoryInfo> memoryInfoList = memoryInfosOptional.get().getMemoryInfo();
for (MemoryInfo memoryInfo : memoryInfoList) { 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()); memoryInfo.getKey().getPosition(), memoryInfo.getDoMemoryUsage());
MemoryInfosBuilder builder = new MemoryInfosBuilder();
LOG.info("Huawei Device {} OsMemoryTotal is: {}", nodeId, memoryInfo.getOsMemoryTotal()); 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()). org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.mem.status.memory.infos.MemoryInfo temp =
setUsageRate(memoryInfo.getOsMemoryUsage().shortValue()).build(); 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); memoryList.add(temp);
} }
} else { } else {
LOG.info("No data present on path '{}' for mountpoint: {}", LOG.info("No data present on path '{}' for mountpoint: {}",
iid, nodeId); iid, nodeId);
} }
MemoryInfosBuilder memoryInfosBuilder = new MemoryInfosBuilder().setMemoryInfo(memoryList);
//write memory information to layer //write memory information to layer
InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.mem.status.MemoryInfos> customMemoryIID = NETCONF_TOPO_IID InstanceIdentifier<NodeMemory> customMemoryIID = NETCONF_TOPO_IID
.child(Node.class, new NodeKey(new NodeId(nodeId))) .child(Node.class, new NodeKey(new NodeId(nodeId)))
.augmentation(NodeMemory.class) .augmentation(NodeMemory.class);
.child(org.opendaylight.yang.gen.v1.urn.cmcc.cmhi.adaptation.layer.device.status.rev190809.mem.status.MemoryInfos.class); final WriteTransaction writeTransaction2 = dataBroker.newWriteOnlyTransaction();
for (int i = 0; i < memoryList.size(); i++) { writeTransaction2.put(LogicalDatastoreType.OPERATIONAL, customMemoryIID,
final WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); new NodeMemoryBuilder()
writeTransaction.put(LogicalDatastoreType.OPERATIONAL, customMemoryIID, memoryList.get(i)); .setMemoryInfos(memoryInfosBuilder.build())
Futures.addCallback(writeTransaction.submit(), new FutureCallback<Void>() { .build()
);
Futures.addCallback(writeTransaction2.submit(), new FutureCallback<Void>() {
@Override @Override
public void onFailure(Throwable throwable) { public void onFailure(Throwable throwable) {
if (throwable instanceof OptimisticLockFailedException) {
LOG.warn("Write memory information 捕获 乐观锁异常,本次获取忽略!");
} else {
LOG.error("Write memory information failed." + throwable.getMessage()); LOG.error("Write memory information failed." + throwable.getMessage());
} }
}
@Override @Override
public void onSuccess(Void avoid) { public void onSuccess(Void avoid) {
LOG.info("Write memory information success."); LOG.info("Write memory information success.");
} }
}); });
}
InstanceIdentifier<Interfaces> interfacesIID = // InstanceIdentifier<Interfaces> interfacesIID =
InstanceIdentifier.create(Ifm.class).child(Interfaces.class); // InstanceIdentifier.create(Ifm.class).child(Interfaces.class);
//
Optional<Interfaces> interfacesOptional; // Optional<Interfaces> interfacesOptional;
try { // try {
// Read from a transaction is asynchronous, but a simple // // Read from a transaction is asynchronous, but a simple
// get/checkedGet makes the call synchronous // // get/checkedGet makes the call synchronous
interfacesOptional = hwNodeReadTx.read(LogicalDatastoreType.OPERATIONAL, interfacesIID).checkedGet(); // interfacesOptional = hwNodeReadTx.read(LogicalDatastoreType.OPERATIONAL, interfacesIID).checkedGet();
} catch (ReadFailedException e) { // } catch (ReadFailedException e) {
throw new IllegalStateException("Unexpected error reading data from " + nodeId, e); // throw new IllegalStateException("Unexpected error reading data from " + nodeId, e);
} // }
List<TpInfos> tpInfosList = new ArrayList<>(); // List<TpInfos> tpInfosList = new ArrayList<>();
if (interfacesOptional.isPresent()) { // if (interfacesOptional.isPresent()) {
List<Interface> interfaceList = interfacesOptional.get().getInterface(); // List<Interface> interfaceList = interfacesOptional.get().getInterface();
for (Interface intf : interfaceList) { // for (Interface intf : interfaceList) {
LOG.info("Show memory with serial {},ipv4 config is {} ", // LOG.info("Show memory with serial {},ipv4 config is {} ",
intf.getKey().getIfName(), intf.getIpv4Config()); // intf.getKey().getIfName(), intf.getIpv4Config());
TpInfosBuilder tpInfosBuilder = new TpInfosBuilder(); // TpInfosBuilder tpInfosBuilder = new TpInfosBuilder();
List<IpAddress> ipsOnIntf = getiplist(intf); // List<IpAddress> ipsOnIntf = getiplist(intf);
tpInfosBuilder.setIpAddress(ipsOnIntf); // tpInfosBuilder.setIpAddress(ipsOnIntf);
tpInfosBuilder.setMtu(intf.getIfMtu().shortValue()); // tpInfosBuilder.setMtu(intf.getIfMtu().shortValue());
tpInfosBuilder.setTpName(intf.getIfName().getValue()); // tpInfosBuilder.setTpName(intf.getIfName().getValue());
tpInfosBuilder.setTpNumber(intf.getIfNumber()); // tpInfosBuilder.setTpNumber(intf.getIfNumber());
tpInfosBuilder.setTpAdminStatus(buildTpAdmin(intf.getIfAdminStatus())); // tpInfosBuilder.setTpAdminStatus(buildTpAdmin(intf.getIfAdminStatus()));
tpInfosBuilder.setTpPhyType(intf.getIfPhyType().getName()); // tpInfosBuilder.setTpPhyType(intf.getIfPhyType().getName());
tpInfosList.add(tpInfosBuilder.build()); // tpInfosList.add(tpInfosBuilder.build());
} // }
} else { // } else {
LOG.info("No data present on path '{}' for mountpoint: {}", // LOG.info("No data present on path '{}' for mountpoint: {}",
iid, nodeId); // iid, nodeId);
} // }
//
//
//write interface information to layer // //write interface information to layer
for (int i = 0; i < tpInfosList.size(); i++) { // final WriteTransaction writeTransaction3 = dataBroker.newWriteOnlyTransaction();
InstanceIdentifier<TpInfos> tpinfosIID = NETCONF_TOPO_IID // for (int i = 0; i < tpInfosList.size(); i++) {
.child(Node.class, new NodeKey(new NodeId(nodeId))) // InstanceIdentifier<TpExt> tpinfosIID = NETCONF_TOPO_IID
.child(TerminationPoint.class, new TerminationPointKey(new TpId(tpInfosList.get(i).getTpName()))) // .child(Node.class, new NodeKey(new NodeId(nodeId)))
.augmentation(TpExt.class).child(TpInfos.class); // .child(TerminationPoint.class, new TerminationPointKey(new TpId(tpInfosList.get(i).getTpName())))
final WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); // .augmentation(TpExt.class);
writeTransaction.put(LogicalDatastoreType.OPERATIONAL, tpinfosIID, tpInfosList.get(i)); // writeTransaction3.put(LogicalDatastoreType.OPERATIONAL, tpinfosIID,
Futures.addCallback(writeTransaction.submit(), new FutureCallback<Void>() { // new TpExtBuilder()
@Override // .setTpInfos(tpInfosList.get(i))
public void onFailure(Throwable throwable) { // .build()
LOG.error("Write tp information information failed." + throwable.getMessage()); // );
} // }
// Futures.addCallback(writeTransaction3.submit(), new FutureCallback<Void>() {
@Override // @Override
public void onSuccess(Void avoid) { // public void onFailure(Throwable throwable) {
LOG.info("Write tp information information success."); // LOG.error("Write tp information information failed." + throwable.getMessage());
} // }
}); //
} // @Override
// public void onSuccess(Void avoid) {
// LOG.info("Write tp information information success.");
// }
// });
} }