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,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";
}
}
}
}

View File

@ -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<ConnectorInf
} catch (ReadFailedException 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()) {
List<CpuInfo> 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<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)))
.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<Void>() {
@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<Void>() {
@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<ConnectorInf
} catch (ReadFailedException 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()) {
List<MemoryInfo> 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<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)))
.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<Void>() {
@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<Void>() {
@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<Interfaces> interfacesIID =
InstanceIdentifier.create(Ifm.class).child(Interfaces.class);
Optional<Interfaces> 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<TpInfos> tpInfosList = new ArrayList<>();
if (interfacesOptional.isPresent()) {
List<Interface> 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<IpAddress> 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<TpInfos> 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<Void>() {
@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<Interfaces> interfacesIID =
// InstanceIdentifier.create(Ifm.class).child(Interfaces.class);
//
// Optional<Interfaces> 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<TpInfos> tpInfosList = new ArrayList<>();
// if (interfacesOptional.isPresent()) {
// List<Interface> 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<IpAddress> 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<TpExt> 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<Void>() {
// @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.");
// }
// });
}