Align tapi topology states on OOR topology ones 28/95028/4
authorGilles Thouenon <gilles.thouenon@orange.com>
Tue, 2 Feb 2021 17:56:19 +0000 (18:56 +0100)
committerGilles Thouenon <gilles.thouenon@orange.com>
Mon, 8 Feb 2021 09:20:39 +0000 (10:20 +0100)
- convert administrative and operational states read from openroadm and
otn topologies to tapi states. Since tapi link is bidirectional, adapt
ConvertORTopoToTapiTopo and TapiTopologyImpl classes to take into acount
also states of opposite link (need to introduce Map instead of List in
some treatment)
- create new unitary tests in ConvertORTopoToTapiTopoTest.java to check
this new treatment

JIRA: TRNSPRTPCE-382
Signed-off-by: Gilles Thouenon <gilles.thouenon@orange.com>
Change-Id: I5d358413ecfcfcdb4066f1a3924b2a36e9049b3e

tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoToTapiTopo.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImpl.java
tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoObjectToTapiTooObjectTest.java

index 2d999780ad98e685454e666993168a1ac5a2e2ea..3357519aee7decf993a1b438883c439aaf091340 100644 (file)
@@ -11,6 +11,7 @@ import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -21,6 +22,8 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Collectors;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPools;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
@@ -97,6 +100,8 @@ public class ConvertORTopoToTapiTopo {
     private static final Logger LOG = LoggerFactory.getLogger(ConvertORTopoToTapiTopo.class);
     private String ietfNodeId;
     private OpenroadmNodeType ietfNodeType;
+    private AdminStates ietfNodeAdminState;
+    private State ietfNodeOperState;
     private List<TerminationPoint> oorClientPortList;
     private List<TerminationPoint> oorNetworkPortList;
     private OduSwitchingPools oorOduSwitchingPool;
@@ -122,6 +127,12 @@ public class ConvertORTopoToTapiTopo {
         }
         this.ietfNodeType = ietfNode.augmentation(
             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class).getNodeType();
+        this.ietfNodeAdminState = ietfNode.augmentation(
+                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
+            .getAdministrativeState();
+        this.ietfNodeOperState = ietfNode.augmentation(
+                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
+            .getOperationalState();
         this.oorNetworkPortList = ietfNode.augmentation(
                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
             .getTerminationPoint().values().stream()
@@ -182,18 +193,27 @@ public class ConvertORTopoToTapiTopo {
         createTapiTransitionalLinks();
     }
 
-    public void convertLinks(List
-        <org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link>
-        otnLinkList) {
+    public void convertLinks(Map<
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
+                .LinkKey,
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
+                .Link> otnLinkMap) {
+        List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
+            .Link> otnLinkList = new ArrayList<>(otnLinkMap.values());
+        Collections.sort(otnLinkList, (l1, l2) -> l1.getLinkId().getValue()
+            .compareTo(l2.getLinkId().getValue()));
         List<String> linksToNotConvert = new ArrayList<>();
-        LOG.info("creation of {} otn links", otnLinkList.size() / 2);
+        LOG.info("creation of {} otn links", otnLinkMap.size() / 2);
         for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-            .Link link : otnLinkList) {
-            if (!linksToNotConvert.contains(link.getLinkId().getValue())) {
-                Link tapiLink = createTapiLink(link);
-                linksToNotConvert.add(link
-                    .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
-                    .getOppositeLink().getValue());
+            .Link otnlink : otnLinkList) {
+            if (!linksToNotConvert.contains(otnlink.getLinkId().getValue())) {
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks
+                    .network.Link oppositeLink = otnLinkMap.get(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns
+                        .yang.ietf.network.topology.rev180226.networks.network.LinkKey(otnlink.augmentation(
+                                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
+                            .getOppositeLink()));
+                Link tapiLink = createTapiLink(otnlink, oppositeLink);
+                linksToNotConvert.add(oppositeLink.getLinkId().getValue());
                 tapiLinks.put(tapiLink.key(), tapiLink);
             }
         }
@@ -324,14 +344,51 @@ public class ConvertORTopoToTapiTopo {
                 .setUuid(nodeUuid)
                 .setName(nodeNames)
                 .setLayerProtocolName(layerProtocols)
-                .setAdministrativeState(AdministrativeState.UNLOCKED)
-                .setOperationalState(OperationalState.ENABLED)
+                .setAdministrativeState(setTapiAdminState(this.ietfNodeAdminState))
+                .setOperationalState(setTapiOperationalState(this.ietfNodeOperState))
                 .setLifecycleState(LifecycleState.INSTALLED)
                 .setOwnedNodeEdgePoint(onepl)
                 .setNodeRuleGroup(nodeRuleGroupList)
                 .build();
     }
 
+    private AdministrativeState setTapiAdminState(AdminStates adminState) {
+        if (adminState == null) {
+            return null;
+        }
+        return adminState.equals(AdminStates.InService)
+            ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
+    }
+
+    private AdministrativeState setTapiAdminState(AdminStates adminState1, AdminStates adminState2) {
+        if (adminState1 == null || adminState2 == null) {
+            return null;
+        }
+        if (AdminStates.InService.equals(adminState1) && AdminStates.InService.equals(adminState2)) {
+            return AdministrativeState.UNLOCKED;
+        } else {
+            return AdministrativeState.LOCKED;
+        }
+    }
+
+    private OperationalState setTapiOperationalState(State operState) {
+        if (operState == null) {
+            return null;
+        }
+        return operState.getName().equals("inService") ? OperationalState.ENABLED : OperationalState.DISABLED;
+    }
+
+    private OperationalState setTapiOperationalState(State operState1, State operState2) {
+        if (operState1 == null || operState2 == null) {
+            return null;
+        }
+        if (State.InService.equals(operState1) && State.InService.equals(operState2)) {
+            return OperationalState.ENABLED;
+        } else {
+            return OperationalState.DISABLED;
+        }
+    }
+
     private Uuid getNodeUuid4Photonic(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
         Uuid nodeUuid;
@@ -489,11 +546,16 @@ public class ConvertORTopoToTapiTopo {
         if (withSip) {
             onepBldr.setMappedServiceInterfacePoint(createSIP(this.uuidMap.get(key), 1));
         }
-        onepBldr.setSupportedCepLayerProtocolQualifier(createSupportedCepLayerProtocolQualifier(oorTp, nodeProtocol));
-        onepBldr.setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
-                .setAdministrativeState(AdministrativeState.UNLOCKED).setOperationalState(OperationalState.ENABLED)
-                .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-                .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
+        onepBldr.setSupportedCepLayerProtocolQualifier(createSupportedCepLayerProtocolQualifier(oorTp, nodeProtocol))
+            .setLinkPortDirection(PortDirection.BIDIRECTIONAL)
+            .setLinkPortRole(PortRole.SYMMETRIC)
+            .setAdministrativeState(setTapiAdminState(
+                    oorTp.augmentation(TerminationPoint1.class).getAdministrativeState()))
+            .setOperationalState(setTapiOperationalState(
+                    oorTp.augmentation(TerminationPoint1.class).getOperationalState()))
+            .setLifecycleState(LifecycleState.INSTALLED)
+            .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
+            .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
         return onepBldr.build();
     }
 
@@ -659,7 +721,9 @@ public class ConvertORTopoToTapiTopo {
     }
 
     private Link createTapiLink(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-        .networks.network.Link link) {
+            .networks.network.Link link,
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link
+            oppositeLink) {
         String prefix = link.getLinkId().getValue().split("-")[0];
         String sourceNode = link.getSource().getSourceNode().getValue();
         String sourceTp = link.getSource().getSourceTp().toString();
@@ -671,6 +735,16 @@ public class ConvertORTopoToTapiTopo {
         Uuid destUuidTp;
         Uuid destUuidNode;
         Name linkName;
+        AdminStates oppositeLinkAdminState = null;
+        State oppositeLinkOperState = null;
+        if (oppositeLink != null) {
+            oppositeLinkAdminState = oppositeLink.augmentation(
+                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
+                .getAdministrativeState();
+            oppositeLinkOperState = oppositeLink.augmentation(
+                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
+                .getOperationalState();
+        }
         switch (prefix) {
             case "OTU4":
                 sourceUuidTp = this.uuidMap.get(String.join("+", sourceNode, I_OTSI, sourceTp));
@@ -699,8 +773,12 @@ public class ConvertORTopoToTapiTopo {
                     .toString()))
                 .setName(Map.of(linkName.key(), linkName))
                 .setLayerProtocolName(Arrays.asList(LayerProtocolName.PHOTONICMEDIA))
-                .setAdministrativeState(AdministrativeState.UNLOCKED)
-                .setOperationalState(OperationalState.ENABLED)
+                .setAdministrativeState(setTapiAdminState(link
+                    .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
+                    .getAdministrativeState(), oppositeLinkAdminState))
+                .setOperationalState(setTapiOperationalState(link
+                    .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
+                    .getOperationalState(), oppositeLinkOperState))
                 .setDirection(ForwardingDirection.BIDIRECTIONAL)
                 .setNodeEdgePoint(nepList)
                 .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().setTotalSize(
@@ -738,8 +816,12 @@ public class ConvertORTopoToTapiTopo {
                     .toString()))
                 .setName(Map.of(linkName.key(), linkName))
                 .setLayerProtocolName(Arrays.asList(LayerProtocolName.ODU))
-                .setAdministrativeState(AdministrativeState.UNLOCKED)
-                .setOperationalState(OperationalState.ENABLED)
+                .setAdministrativeState(setTapiAdminState(link
+                    .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
+                    .getAdministrativeState(), oppositeLinkAdminState))
+                .setOperationalState(setTapiOperationalState(link
+                    .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
+                    .getOperationalState(), oppositeLinkOperState))
                 .setDirection(ForwardingDirection.BIDIRECTIONAL)
                 .setNodeEdgePoint(nepList)
                 .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().setTotalSize(
index a716b6e9f64180ebbcf6692fd90bf67c93f07b6b..423533c3be4b31f0bdfb72ed6f54d95c803912d7 100644 (file)
@@ -12,7 +12,6 @@ import com.google.common.util.concurrent.ListenableFuture;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -225,10 +224,9 @@ public class TapiTopologyImpl implements TapiTopologyService {
             LOG.warn("Unable to abstract an ROADM infrasctructure from openroadm-topology");
         }
         if (otnTopo.augmentation(Network1.class) != null) {
-            List<Link> otnLinkList = new ArrayList<>(otnTopo.augmentation(Network1.class).getLink().values());
-            Collections.sort(otnLinkList, (l1, l2) -> l1.getLinkId().getValue()
-                .compareTo(l2.getLinkId().getValue()));
-            tapiFactory.convertLinks(otnLinkList);
+            Map<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks
+                .network.LinkKey, Link> otnLinkMap = otnTopo.augmentation(Network1.class).getLink();
+            tapiFactory.convertLinks(otnLinkMap);
             tapiLinkList.putAll(tapiFactory.getTapiLinks());
         }
         Name name = new NameBuilder().setValue(TopologyUtils.T0_MULTILAYER).setValueName("TAPI Topology Name").build();
index b1e072abb8e9bb933308ca13312500506cec4d5b..f7a4357f7a8ede004d285a9142a04bc262d53420 100644 (file)
@@ -19,9 +19,10 @@ import static org.junit.Assert.fail;
 import com.google.common.util.concurrent.FluentFuture;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
-import java.util.Collections;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
@@ -35,17 +36,28 @@ import org.opendaylight.transportpce.common.InstanceIdentifiers;
 import org.opendaylight.transportpce.tapi.utils.TapiTopologyDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.transportpce.test.utils.TopologyDataUtils;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmTpType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.CapacityUnit;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
@@ -70,6 +82,7 @@ import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Fo
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
@@ -86,7 +99,7 @@ public class ConvertORTopoObjectToTapiTooObjectTest extends AbstractTest {
     private static Node otnMuxC;
     private static Node otnSwitch;
     private static Node tpdr100G;
-    private static List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+    private static Map<LinkKey,org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
         .networks.network.Link> otnLinks;
     private static Uuid topologyUuid;
     private static DataBroker dataBroker = getDataBroker();
@@ -137,13 +150,353 @@ public class ConvertORTopoObjectToTapiTooObjectTest extends AbstractTest {
             .augmentation(Network1.class);
         FluentFuture<Optional<Network1>> linksFuture = dataBroker.newReadOnlyTransaction()
             .read(LogicalDatastoreType.CONFIGURATION, linksIID);
-        otnLinks = linksFuture.get().get().getLink().values().stream().collect(Collectors.toList());
-        Collections.sort(otnLinks, (l1, l2) -> l1.getLinkId().getValue().compareTo(l2.getLinkId().getValue()));
-        topologyUuid = new Uuid(UUID.nameUUIDFromBytes("T0 - Multi-layer topology".getBytes(Charset.forName("UTF-8")))
+        otnLinks = linksFuture.get().get().getLink();
+
+        topologyUuid = new Uuid(UUID.nameUUIDFromBytes(TopologyUtils.T0_MULTILAYER.getBytes(Charset.forName("UTF-8")))
             .toString());
         LOG.info("TEST SETUP READY");
     }
 
+    @Test
+    public void convertNodeWhenNoStates() {
+        Node tpdr = changeTerminationPointState(tpdr100G, "XPDR1-NETWORK1", null, null);
+        List<String> networkPortList = new ArrayList<>();
+        for (TerminationPoint tp : tpdr100G.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortList.add(tp.getTpId().getValue());
+            }
+        }
+        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid);
+        tapiFactory.convertNode(tpdr, networkPortList);
+
+        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
+            .toString());
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node dsrNode = tapiFactory
+            .getTapiNodes().get(new
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(dsrNodeUuid));
+        Uuid networkNepUuid = new Uuid(
+            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+DSR+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+            .toString());
+        OwnedNodeEdgePoint nepN = dsrNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(networkNepUuid));
+        assertNull("Administrative State should not be present", nepN.getAdministrativeState());
+        assertNull("Operational State should not be present", nepN.getOperationalState());
+
+        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
+            .toString());
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node otsiNode = tapiFactory
+            .getTapiNodes().get(new
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(otsiNodeUuid));
+        Uuid enepUuid = new Uuid(
+            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+eOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+            .toString());
+        Uuid inepUuid = new Uuid(
+            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+            .toString());
+        OwnedNodeEdgePoint enep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(enepUuid));
+        assertNull("Administrative State should not be present", enep.getAdministrativeState());
+        assertNull("Operational State should not be present", enep.getOperationalState());
+
+        OwnedNodeEdgePoint inep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(inepUuid));
+        assertNull("Administrative State should not be present", inep.getAdministrativeState());
+        assertNull("Operational State should not be present", inep.getOperationalState());
+    }
+
+    @Test
+    public void convertNodeWhenBadStates1() {
+        Node tpdr = changeTerminationPointState(tpdr100G, "XPDR1-NETWORK1", AdminStates.OutOfService,
+            State.OutOfService);
+        List<String> networkPortList = new ArrayList<>();
+        for (TerminationPoint tp : tpdr100G.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortList.add(tp.getTpId().getValue());
+            }
+        }
+        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid);
+        tapiFactory.convertNode(tpdr, networkPortList);
+
+        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
+            .toString());
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node dsrNode = tapiFactory
+            .getTapiNodes().get(new
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(dsrNodeUuid));
+        Uuid networkNepUuid = new Uuid(
+            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+DSR+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+            .toString());
+        OwnedNodeEdgePoint nepN = dsrNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(networkNepUuid));
+        assertEquals("Administrative State should be Locked",
+            AdministrativeState.LOCKED, nepN.getAdministrativeState());
+        assertEquals("Operational State should be Disabled",
+            OperationalState.DISABLED, nepN.getOperationalState());
+
+        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
+            .toString());
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node otsiNode = tapiFactory
+            .getTapiNodes().get(new
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(otsiNodeUuid));
+        Uuid enepUuid = new Uuid(
+            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+eOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+            .toString());
+        Uuid inepUuid = new Uuid(
+            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+            .toString());
+        OwnedNodeEdgePoint enep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(enepUuid));
+        assertEquals("Administrative State should be Locked",
+            AdministrativeState.LOCKED, enep.getAdministrativeState());
+        assertEquals("Operational State should be Disabled",
+            OperationalState.DISABLED, enep.getOperationalState());
+
+        OwnedNodeEdgePoint inep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(inepUuid));
+        assertEquals("Administrative State should be Locked",
+            AdministrativeState.LOCKED, inep.getAdministrativeState());
+        assertEquals("Operational State should be Disabled",
+            OperationalState.DISABLED, inep.getOperationalState());
+    }
+
+    @Test
+    public void convertNodeWhenBadStates2() {
+        Node tpdr = changeTerminationPointState(tpdr100G, "XPDR1-NETWORK1", AdminStates.Maintenance,
+            State.Degraded);
+        List<String> networkPortList = new ArrayList<>();
+        for (TerminationPoint tp : tpdr100G.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortList.add(tp.getTpId().getValue());
+            }
+        }
+        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid);
+        tapiFactory.convertNode(tpdr, networkPortList);
+
+        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
+            .toString());
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node dsrNode = tapiFactory
+            .getTapiNodes().get(new
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(dsrNodeUuid));
+        Uuid networkNepUuid = new Uuid(
+            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+DSR+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+            .toString());
+        OwnedNodeEdgePoint nepN = dsrNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(networkNepUuid));
+        assertEquals("Administrative State should be Locked",
+            AdministrativeState.LOCKED, nepN.getAdministrativeState());
+        assertEquals("Operational State should be Disabled",
+            OperationalState.DISABLED, nepN.getOperationalState());
+
+        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
+            .toString());
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node otsiNode = tapiFactory
+            .getTapiNodes().get(new
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(otsiNodeUuid));
+        Uuid enepUuid = new Uuid(
+            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+eOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+            .toString());
+        Uuid inepUuid = new Uuid(
+            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+            .toString());
+        OwnedNodeEdgePoint enep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(enepUuid));
+        assertEquals("Administrative State should be Locked",
+            AdministrativeState.LOCKED, enep.getAdministrativeState());
+        assertEquals("Operational State should be Disabled",
+            OperationalState.DISABLED, enep.getOperationalState());
+
+        OwnedNodeEdgePoint inep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(inepUuid));
+        assertEquals("Administrative State should be Locked",
+            AdministrativeState.LOCKED, inep.getAdministrativeState());
+        assertEquals("Operational State should be Disabled",
+            OperationalState.DISABLED, inep.getOperationalState());
+    }
+
+    @Test
+    public void convertOtnLinkWhenNoState() {
+        HashMap<LinkKey, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+            .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link
+            link = changeOtnLinkState(otnLinks.get(new LinkKey(
+                new LinkId("ODU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1"))), null, null);
+        otnLinksAlt.replace(link.key(), link);
+
+        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid);
+        List<String> networkPortListA = new ArrayList<>();
+        for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortListA.add(tp.getTpId().getValue());
+            }
+        }
+        tapiFactory.convertNode(otnMuxA, networkPortListA);
+        List<String> networkPortListC = new ArrayList<>();
+        for (TerminationPoint tp : otnMuxC.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortListC.add(tp.getTpId().getValue());
+            }
+        }
+        tapiFactory.convertNode(otnMuxC, networkPortListC);
+        tapiFactory.convertLinks(otnLinksAlt);
+
+        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
+            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
+            .collect(Collectors.toList());
+        assertNull("Administrative State should not be present", tapiLinks.get(0).getAdministrativeState());
+        assertEquals("Administrative state should be UNLOCKED",
+            AdministrativeState.UNLOCKED, tapiLinks.get(2).getAdministrativeState());
+        assertNull("Operational State should not be present", tapiLinks.get(0).getOperationalState());
+        assertEquals("Operational state should be ENABLED",
+            OperationalState.ENABLED, tapiLinks.get(2).getOperationalState());
+    }
+
+    @Test
+    public void convertOtnLinkWhenNoStateOnOppositeLink() {
+        HashMap<LinkKey, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+            .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link
+            link = changeOtnLinkState(otnLinks.get(new LinkKey(
+                new LinkId("ODU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1"))), null, null);
+        otnLinksAlt.replace(link.key(), link);
+
+        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid);
+        List<String> networkPortListA = new ArrayList<>();
+        for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortListA.add(tp.getTpId().getValue());
+            }
+        }
+        tapiFactory.convertNode(otnMuxA, networkPortListA);
+        List<String> networkPortListC = new ArrayList<>();
+        for (TerminationPoint tp : otnMuxC.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortListC.add(tp.getTpId().getValue());
+            }
+        }
+        tapiFactory.convertNode(otnMuxC, networkPortListC);
+        tapiFactory.convertLinks(otnLinksAlt);
+
+        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
+            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
+            .collect(Collectors.toList());
+        assertNull("Administrative State should not be present", tapiLinks.get(0).getAdministrativeState());
+        assertEquals("Administrative state should be UNLOCKED",
+            AdministrativeState.UNLOCKED, tapiLinks.get(2).getAdministrativeState());
+        assertNull("Operational State should not be present", tapiLinks.get(0).getOperationalState());
+        assertEquals("Operational state should be ENABLED",
+            OperationalState.ENABLED, tapiLinks.get(2).getOperationalState());
+    }
+
+    @Test
+    public void convertOtnLinkWhenBadState1() {
+        HashMap<LinkKey, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+            .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link
+            link = changeOtnLinkState(otnLinks.get(new LinkKey(
+                new LinkId("ODU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1"))),
+                AdminStates.OutOfService, State.OutOfService);
+        otnLinksAlt.replace(link.key(), link);
+
+        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid);
+        List<String> networkPortListA = new ArrayList<>();
+        for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortListA.add(tp.getTpId().getValue());
+            }
+        }
+        tapiFactory.convertNode(otnMuxA, networkPortListA);
+        List<String> networkPortListC = new ArrayList<>();
+        for (TerminationPoint tp : otnMuxC.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortListC.add(tp.getTpId().getValue());
+            }
+        }
+        tapiFactory.convertNode(otnMuxC, networkPortListC);
+        tapiFactory.convertLinks(otnLinksAlt);
+
+        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
+            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
+            .collect(Collectors.toList());
+        assertEquals("Administrative state should be LOCKED",
+            AdministrativeState.LOCKED, tapiLinks.get(0).getAdministrativeState());
+        assertEquals("Administrative state should be UNLOCKED",
+            AdministrativeState.UNLOCKED, tapiLinks.get(2).getAdministrativeState());
+        assertEquals("Operational state should be DISABLED",
+            OperationalState.DISABLED, tapiLinks.get(0).getOperationalState());
+        assertEquals("Operational state should be ENABLED",
+            OperationalState.ENABLED, tapiLinks.get(2).getOperationalState());
+    }
+
+    @Test
+    public void convertOtnLinkWhenBadState2() {
+        HashMap<LinkKey, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+            .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link
+            link = changeOtnLinkState(otnLinks.get(new LinkKey(
+                new LinkId("ODU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1"))),
+                AdminStates.Maintenance, State.Degraded);
+        otnLinksAlt.replace(link.key(), link);
+
+        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid);
+        List<String> networkPortListA = new ArrayList<>();
+        for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortListA.add(tp.getTpId().getValue());
+            }
+        }
+        tapiFactory.convertNode(otnMuxA, networkPortListA);
+        List<String> networkPortListC = new ArrayList<>();
+        for (TerminationPoint tp : otnMuxC.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortListC.add(tp.getTpId().getValue());
+            }
+        }
+        tapiFactory.convertNode(otnMuxC, networkPortListC);
+        tapiFactory.convertLinks(otnLinksAlt);
+
+        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
+            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
+            .collect(Collectors.toList());
+        assertEquals("Administrative state should be LOCKED",
+            AdministrativeState.LOCKED, tapiLinks.get(0).getAdministrativeState());
+        assertEquals("Administrative state should be UNLOCKED",
+            AdministrativeState.UNLOCKED, tapiLinks.get(2).getAdministrativeState());
+        assertEquals("Operational state should be DISABLED",
+            OperationalState.DISABLED, tapiLinks.get(0).getOperationalState());
+        assertEquals("Operational state should be ENABLED",
+            OperationalState.ENABLED, tapiLinks.get(2).getOperationalState());
+    }
+
+    @Test
+    public void convertOtnLinkWhenBadStateOnOppositeLink() {
+        HashMap<LinkKey, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+            .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link
+            link = changeOtnLinkState(otnLinks.get(new LinkKey(
+                new LinkId("ODU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1"))),
+                AdminStates.OutOfService, State.OutOfService);
+        otnLinksAlt.replace(link.key(), link);
+
+        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid);
+        List<String> networkPortListA = new ArrayList<>();
+        for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortListA.add(tp.getTpId().getValue());
+            }
+        }
+        tapiFactory.convertNode(otnMuxA, networkPortListA);
+        List<String> networkPortListC = new ArrayList<>();
+        for (TerminationPoint tp : otnMuxC.augmentation(Node1.class).getTerminationPoint().values()) {
+            if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+                networkPortListC.add(tp.getTpId().getValue());
+            }
+        }
+        tapiFactory.convertNode(otnMuxC, networkPortListC);
+        tapiFactory.convertLinks(otnLinksAlt);
+
+        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
+            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
+            .collect(Collectors.toList());
+        assertEquals("Administrative state should be LOCKED",
+            AdministrativeState.LOCKED, tapiLinks.get(0).getAdministrativeState());
+        assertEquals("Administrative state should be UNLOCKED",
+            AdministrativeState.UNLOCKED, tapiLinks.get(2).getAdministrativeState());
+        assertEquals("Operational state should be DISABLED",
+            OperationalState.DISABLED, tapiLinks.get(0).getOperationalState());
+        assertEquals("Operational state should be ENABLED",
+            OperationalState.ENABLED, tapiLinks.get(2).getOperationalState());
+    }
+
     @Test
     public void convertNodeForTransponder100G() {
         ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid);
@@ -957,4 +1310,35 @@ public class ConvertORTopoObjectToTapiTooObjectTest extends AbstractTest {
             either(containsString(tp1Uuid.getValue())).or(containsString(tp2Uuid.getValue())));
     }
 
+    private Node changeTerminationPointState(Node initialNode, String tpid, AdminStates admin, State oper) {
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder tpdr1Bldr
+            = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder(
+                initialNode.augmentation(Node1.class));
+        Map<TerminationPointKey, TerminationPoint> tps = new HashMap<>(tpdr1Bldr.getTerminationPoint());
+        TerminationPointBuilder tpBldr = new TerminationPointBuilder(
+                tps.get(new TerminationPointKey(new TpId(tpid))));
+        TerminationPoint1Builder tp1Bldr = new TerminationPoint1Builder(tpBldr.augmentation(TerminationPoint1.class));
+        tp1Bldr.setAdministrativeState(admin)
+            .setOperationalState(oper);
+        tpBldr.addAugmentation(tp1Bldr.build());
+        tps.replace(tpBldr.key(), tpBldr.build());
+        tpdr1Bldr.setTerminationPoint(tps);
+        return new NodeBuilder(initialNode).addAugmentation(tpdr1Bldr.build()).build();
+    }
+
+    private org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
+            .Link changeOtnLinkState(
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
+            .Link initiallink, AdminStates admin, State oper) {
+
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
+            .LinkBuilder linkBldr = new
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
+            .LinkBuilder(initiallink);
+        Link1Builder link1Bldr = new Link1Builder(linkBldr.augmentation(Link1.class));
+        link1Bldr.setAdministrativeState(admin)
+            .setOperationalState(oper);
+        linkBldr.addAugmentation(link1Bldr.build());
+        return linkBldr.build();
+    }
 }