From bb1d7b86bbed6e94716db2370fc795353e645228 Mon Sep 17 00:00:00 2001
From: dongxiancun <dongxiancun@cmhi.chinamobile.com>
Date: Wed, 4 Sep 2019 14:37:17 +0800
Subject: [PATCH] =?UTF-8?q?Mod=20aaa-12=201=EF=BC=89=E7=89=88=E6=9C=AC?=
 =?UTF-8?q?=E5=9B=9E=E6=BB=9A=E5=88=B0o-sr4=E7=89=88=E6=9C=AC=EF=BC=9B2?=
 =?UTF-8?q?=EF=BC=89=E4=BF=AE=E5=A4=8Dyangtools=E6=A8=A1=E5=9D=97=E7=9A=84?=
 =?UTF-8?q?bug=EF=BC=88=E4=BB=A3=E7=A0=81=E5=9C=A8git=E7=9A=84yangtools?=
 =?UTF-8?q?=E8=B7=AF=E5=BE=84=E4=B8=8B=EF=BC=89=E3=80=82=20RCA=EF=BC=9A=20?=
 =?UTF-8?q?SOL=EF=BC=9A=20=E4=BF=AE=E6=94=B9=E4=BA=BA=EF=BC=9Adongxiancun?=
 =?UTF-8?q?=20=E6=A3=80=E8=A7=86=E4=BA=BA=EF=BC=9Adongxiancun?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/main/yang/tp-extension.yang           |   4 +-
 .../huawei/impl/HuaweiNetconfSpeaker.java     | 106 +++++++++++++++---
 2 files changed, 93 insertions(+), 17 deletions(-)

diff --git a/ControlPlatform/driver-layer/adaptation-layer/src/main/yang/tp-extension.yang b/ControlPlatform/driver-layer/adaptation-layer/src/main/yang/tp-extension.yang
index 21d774231..f16e56e1b 100644
--- a/ControlPlatform/driver-layer/adaptation-layer/src/main/yang/tp-extension.yang
+++ b/ControlPlatform/driver-layer/adaptation-layer/src/main/yang/tp-extension.yang
@@ -38,11 +38,11 @@ module tp-extension {
             }
             leaf tx-rate {
                 type int16 ;
-                default "单位为Mbps";
+                description "单位为Mbps";
             }
             leaf rx-rate {
                 type int16 ;
-                default "单位为Mbps";
+                description "单位为Mbps";
             }
             list ip-address {
                 leaf ip {
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 4bc1f9c9b..9ef31f32b 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
@@ -26,6 +26,8 @@ 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.IfmcommAdminStaType;
 import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.ifm.rev181123.ifm.Interfaces;
 import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.ifm.rev181123.ifm.interfaces.Interface;
+//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.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;
@@ -486,6 +488,67 @@ public class HuaweiNetconfSpeaker implements DataTreeChangeListener<ConnectorInf
 //            }
 //        });
 
+        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 NodeId {}, IfName is {},IfIndex is {} ",
+                        nodeId, intf.getIfName().getValue(), intf.getIfIndex());
+                TpInfosBuilder tpInfosBuilder = new TpInfosBuilder();
+                List<IpAddress> ipsOnIntf = getiplist(intf);
+                tpInfosBuilder.setIpAddress(ipsOnIntf);
+                if (Objects.nonNull(intf.getIfMtu())) {
+                    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(),
+                    true
+            );
+        }
+        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.");
+            }
+        });
+
     }
 
     private TpAdminStatus buildTpAdmin(IfmcommAdminStaType ifAdminStatus) {
@@ -496,23 +559,36 @@ public class HuaweiNetconfSpeaker implements DataTreeChangeListener<ConnectorInf
     }
 
     private List<IpAddress> getiplist(Interface intf) {
-        List<Am4CfgAddr> list = intf.getIpv4Config().getAm4CfgAddrs().getAm4CfgAddr();
-        List<Am6CfgAddr> am6CfgAddrList = intf.getIpv6Config().getAm6CfgAddrs().getAm6CfgAddr();
         List<IpAddress> addressList = new ArrayList<>();
-        for (Am4CfgAddr cfg : list) {
-            IpAddressBuilder builder = new IpAddressBuilder();
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress ip = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress(Ipv4Address.getDefaultInstance(cfg.getIfIpAddr().getValue()));
-            builder.setIp(ip);
-            IpAddress tmpAddress = builder.build();
-            addressList.add(tmpAddress);
+        List<Am4CfgAddr> list = null;
+        List<Am6CfgAddr> am6CfgAddrList = null;
+        try {
+            list = intf.getIpv4Config().getAm4CfgAddrs().getAm4CfgAddr();
+        } catch (NullPointerException e) {
+            LOG.debug("端口:{}无ipv4配置.", intf.getIfName());
         }
-
-        for (Am6CfgAddr am6CfgAddr : am6CfgAddrList) {
-            IpAddressBuilder builder = new IpAddressBuilder();
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress ip = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress(Ipv6Address.getDefaultInstance(am6CfgAddr.getIfIp6Addr().getValue()));
-            builder.setIp(ip);
-            IpAddress tmpAddress = builder.build();
-            addressList.add(tmpAddress);
+        if(Objects.nonNull(list)) {
+            for (Am4CfgAddr cfg : list) {
+                IpAddressBuilder builder = new IpAddressBuilder();
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress ip = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress(Ipv4Address.getDefaultInstance(cfg.getIfIpAddr().getValue()));
+                builder.setIp(ip);
+                IpAddress tmpAddress = builder.build();
+                addressList.add(tmpAddress);
+            }
+        }
+        try {
+            am6CfgAddrList = intf.getIpv6Config().getAm6CfgAddrs().getAm6CfgAddr();
+        } catch (NullPointerException e) {
+            LOG.debug("端口:{}无ipv6配置.", intf.getIfName());
+        }
+        if(Objects.nonNull(am6CfgAddrList)) {
+            for (Am6CfgAddr am6CfgAddr : am6CfgAddrList) {
+                IpAddressBuilder builder = new IpAddressBuilder();
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress ip = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress(Ipv6Address.getDefaultInstance(am6CfgAddr.getIfIp6Addr().getValue()));
+                builder.setIp(ip);
+                IpAddress tmpAddress = builder.build();
+                addressList.add(tmpAddress);
+            }
         }
         return addressList;
     }