Merge dev/fluorine work across to master
[unimgr.git] / impl / src / test / java / org / opendaylight / unimgr / mef / nrp / impl / AbstractTestWithTopo.java
index 9a878964d1d70648bc2b8f0cbdd8b64f809e7e5e..da532d7c780de748cc26604632cf1c13ccf4e372 100644 (file)
@@ -11,6 +11,8 @@ package org.opendaylight.unimgr.mef.nrp.impl;
 import static org.junit.Assert.fail;
 import static org.opendaylight.unimgr.mef.nrp.api.TapiConstants.PRESTO_SYSTEM_TOPO;
 
+import com.google.common.base.Optional;
+
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -19,7 +21,6 @@ import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import com.google.common.base.Optional;
 import org.junit.Before;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
@@ -28,28 +29,52 @@ import org.opendaylight.controller.md.sal.binding.test.AbstractConcurrentDataBro
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.unimgr.mef.nrp.api.EndPoint;
 import org.opendaylight.unimgr.mef.nrp.api.TapiConstants;
-import org.opendaylight.unimgr.mef.nrp.api.TopologyManager;
 import org.opendaylight.unimgr.mef.nrp.common.NrpDao;
 import org.opendaylight.unimgr.mef.nrp.common.TapiUtils;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.*;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.context.attrs.ServiceInterfacePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.ConnectivityServiceEndPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.create.connectivity.service.input.EndPointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.Context1;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.link.*;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.node.OwnedNodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.risk.parameter.pac.RiskCharacteristicBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.topology.*;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.topology.context.*;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.topology.context.TopologyKey;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.transfer.cost.pac.CostCharacteristicBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.transfer.timing.pac.LatencyCharacteristicBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.topology.rev171113.validation.pac.ValidationMechanismBuilder;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.mef.common.types.rev180321.NaturalNumber;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.mef.common.types.rev180321.PositiveInteger;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.nrm.connectivity.rev180321.carrier.eth.connectivity.end.point.resource.CeVlanIdListAndUntag;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.nrm.connectivity.rev180321.carrier.eth.connectivity.end.point.resource.CeVlanIdListAndUntagBuilder;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.nrm.connectivity.rev180321.vlan.id.list.and.untag.VlanIdBuilder;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.nrp._interface.rev180321.EndPoint2Builder;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.nrp._interface.rev180321.NrpConnectivityServiceEndPointAttrs;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.nrp._interface.rev180321.ServiceInterfacePoint1;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.nrp._interface.rev180321.ServiceInterfacePoint1Builder;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.nrp._interface.rev180321.nrp.connectivity.service.end.point.attrs.NrpCarrierEthConnectivityEndPointResourceBuilder;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.nrp._interface.rev180321.nrp.sip.attrs.NrpCarrierEthInniNResourceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev180307.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev180307.ForwardingDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev180307.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev180307.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev180307.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev180307.PortDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev180307.PortRole;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev180307.TerminationDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev180307.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev180307.tapi.context.ServiceInterfacePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.ConnectivityServiceEndPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connection.ConnectionEndPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connection.RouteBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connectivity.context.Connection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connectivity.context.ConnectionBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connectivity.context.ConnectionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connectivity.service.end.point.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.create.connectivity.service.input.EndPointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.OwnedNodeEdgePointRef;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.link.NodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.link.NodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.node.OwnedNodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.node.edge.point.MappedServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.topology.LinkBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.topology.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.topology.context.TopologyKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-/**
- * @author bartosz.michalik@amartus.com
- */
 public abstract class AbstractTestWithTopo extends AbstractConcurrentDataBrokerTest {
     protected static final InstanceIdentifier<Node> NRP_ABSTRACT_NODE_IID = InstanceIdentifier
             .create(Context.class)
@@ -66,6 +91,7 @@ public abstract class AbstractTestWithTopo extends AbstractConcurrentDataBrokerT
         dataBroker = getDataBroker();
         topologyManager = new NrpInitializer(dataBroker);
         topologyManager.init();
+        new AbstractNodeHandler(dataBroker).init();
     }
 
     protected  EndPoint ep(String nepId) {
@@ -73,142 +99,163 @@ public abstract class AbstractTestWithTopo extends AbstractConcurrentDataBrokerT
     }
 
     protected EndPoint ep(String nepId, PortDirection pd) {
+
         ConnectivityServiceEndPoint ep = new EndPointBuilder()
                 .setLocalId("ep_" + nepId)
                 .setDirection(pd)
-                .setServiceInterfacePoint(new Uuid("sip:" + nepId))
+                .setServiceInterfacePoint(TapiUtils.toSipRef(new Uuid("sip:" + nepId), ServiceInterfacePoint.class))
                 .build();
 
-        return new EndPoint(ep, null);
+        return new EndPoint(ep, someAttributes());
+    }
+
+    CeVlanIdListAndUntag toVlanList(long... vlans) {
+        List<org.opendaylight.yang.gen.v1.urn.mef.yang.nrm.connectivity.rev180321
+                .vlan.id.list.and.untag.VlanId> vlanList = Arrays.stream(vlans)
+                .mapToObj(vlan -> new VlanIdBuilder().setVlanId(new PositiveInteger(vlan)).build())
+                .collect(Collectors.toList());
+        return new CeVlanIdListAndUntagBuilder().setVlanId(vlanList).build();
+
+    }
+
+    private NrpConnectivityServiceEndPointAttrs someAttributes() {
+        return new EndPoint2Builder()
+                .setNrpCarrierEthConnectivityEndPointResource(
+                    new NrpCarrierEthConnectivityEndPointResourceBuilder()
+                        .setCeVlanIdListAndUntag(toVlanList(1004L)
+                        ).build()
+                ).build();
     }
 
-    protected Link l(ReadWriteTransaction tx, String nA, String nepA, String nB, String nepB, OperationalState state) {
-        return l(tx, nA, nepA, nB, nepB, state, ForwardingDirection.BIDIRECTIONAL);
+    protected Link l(ReadWriteTransaction tx, String nameA, String nepA, String nameB, String nepB,
+                     OperationalState state) {
+        return l(tx, nameA, nepA, nameB, nepB, state, ForwardingDirection.BIDIRECTIONAL);
     }
 
-    protected Link l(ReadWriteTransaction tx, String nA, String nepA, String nB, String nepB, OperationalState state, ForwardingDirection dir) {
+    protected Link l(ReadWriteTransaction tx, String nameA, String nepA, String nameB, String nepB,
+                     OperationalState state, ForwardingDirection dir) {
         Uuid uuid = new Uuid(nepA + "-" + nepB);
 
         NrpDao dao = new NrpDao(tx);
 
-        if(dao.hasSip(nepA)) {
+        if (dao.hasSip(nepA)) {
             dao.removeSip(new Uuid("sip:" + nepA));
         }
 
-        if(dao.hasSip(nepB)) {
+        if (dao.hasSip(nepB)) {
             dao.removeSip(new Uuid("sip:" + nepB));
         }
 
+        NodeEdgePointBuilder builder = new NodeEdgePointBuilder()
+                .setTopologyId(new Uuid(TapiConstants.PRESTO_SYSTEM_TOPO));
+
+        NodeEdgePoint nepRefA = builder
+                .setNodeId(new Uuid(nameA))
+                .setOwnedNodeEdgePointId(new Uuid(nepA))
+                .build();
+
+        NodeEdgePoint nepRefB = builder
+                .setNodeId(new Uuid(nameB))
+                .setOwnedNodeEdgePointId(new Uuid(nepB))
+                .build();
+
+
         Link link = new LinkBuilder()
                 .setUuid(uuid)
-                .setKey(new LinkKey(uuid))
+                .withKey(new LinkKey(uuid))
                 .setDirection(dir)
-                .setLayerProtocolName(Collections.singletonList(ETH.class))
-                .setNode(toIds(nA, nB).collect(Collectors.toList()))
-                .setNodeEdgePoint(toIds(nepA, nepB).collect(Collectors.toList()))
-                .setState(new StateBuilder().setOperationalState(state).build())
-                .setTransferCost(emptyCost())
-                .setTransferTiming(emptyTiming())
-                .setRiskParameter(emptyRisk())
-                .setValidation(emptyValidation())
-                .setLpTransition(emptyLpTransition())
+                .setLayerProtocolName(Collections.singletonList(LayerProtocolName.ETH))
+                .setOperationalState(state)
+                .setTransitionedLayerProtocolName(Collections.emptyList())
+                .setCostCharacteristic(Collections.emptyList())
+                .setLatencyCharacteristic(Collections.emptyList())
+                .setRiskCharacteristic(Collections.emptyList())
+                .setValidationMechanism(Collections.emptyList())
+                .setNodeEdgePoint(Stream.of(nepRefA, nepRefB).collect(Collectors.toList()))
+
                 .build();
 
-        tx.put(LogicalDatastoreType.OPERATIONAL, NrpDao.topo(PRESTO_SYSTEM_TOPO).child(Link.class, new LinkKey(uuid)), link);
+        tx.put(LogicalDatastoreType.OPERATIONAL,
+                NrpDao.topo(PRESTO_SYSTEM_TOPO).child(Link.class, new LinkKey(uuid)), link);
         return link;
     }
 
-    private LpTransition emptyLpTransition() {
-        return new LpTransitionBuilder()
-                .setTransitionedLayerProtocolName(Collections.singletonList("n/a"))
-                .build();
-    }
+    protected org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307
+                .connectivity.context.Connection
+        c(ReadWriteTransaction tx, String nodeUuid, List<Uuid> route, String... neps) {
 
-    private Validation emptyValidation() {
-        return new ValidationBuilder()
-                .setValidationMechanism(Collections.singletonList(
-                        new ValidationMechanismBuilder()
-                            .setValidationMechanism("empty")
-                            .setLayerProtocolAdjacencyValidated("n/a")
-                            .setValidationRobustness("n/a")
-                        .build()
-                ))
-                .build();
-    }
+        ConnectionBuilder builder = new ConnectionBuilder()
+                .setUuid(new Uuid("c:" + nodeUuid))
+                .setConnectionEndPoint(ceps(tx, nodeUuid, neps));
 
-    private RiskParameter emptyRisk() {
-        return new RiskParameterBuilder()
-                .setRiskCharacteristic(Collections.singletonList(
-                        new RiskCharacteristicBuilder()
-                        .setRiskCharacteristicName("empty").build()
-                )).build();
+        if (!route.isEmpty()) {
+            builder.setRoute(Collections.singletonList(new RouteBuilder()
+                    .setConnectionEndPoint(route)
+                    .setLocalId("route")
+                    .build()
+            ));
+        }
 
-    }
+        Connection connection = builder.build();
+        InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang
+                .tapi.connectivity.rev180307.Context1> connectivityCtx = NrpDao.ctx()
+                .augmentation(
+                        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.Context1.class);
+        tx.put(LogicalDatastoreType.OPERATIONAL, connectivityCtx.child(Connection.class,
+                new ConnectionKey(connection.getUuid())), connection);
 
-    private TransferTiming emptyTiming() {
-        return new TransferTimingBuilder()
-                .setLatencyCharacteristic(Collections.singletonList(
-                        new LatencyCharacteristicBuilder()
-                            .setTrafficPropertyName("empty")
-                            .setTrafficPropertyQueingLatency("0")
-                        .build()
-                )).build();
+        return connection;
     }
 
-    private TransferCost emptyCost() {
-        return new TransferCostBuilder()
-                .setCostCharacteristic(Collections.singletonList(
-                        new CostCharacteristicBuilder()
-                            .setCostName("empty")
-                            .setCostAlgorithm("n/a")
-                            .setCostValue("0")
-                        .build()
-                )).build();
-    }
 
+    protected org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307
+            .connectivity.context.Connection c(ReadWriteTransaction tx, String nodeUuid, String... neps) {
+        return c(tx, nodeUuid, Collections.emptyList(), neps);
+    }
 
+    private List<ConnectionEndPoint> ceps(ReadWriteTransaction tx, String nodeId, String... neps) {
+        NrpDao nrpDao = new NrpDao(tx);
 
-    protected Stream<Uuid> toIds(String ... uuids) {
-        return toIds(Arrays.stream(uuids));
-    }
+        return  Arrays.stream(neps).map(nep -> {
+            OwnedNodeEdgePointRef nepRef = toRef(nodeId, nep);
+            return nrpDao.addConnectionEndPoint(nepRef, dummyCep(nepRef));
 
-    protected Stream<Uuid> toIds(Stream<String> uuids) {
-        return uuids.map(Uuid::new);
+        }).collect(Collectors.toList());
     }
 
-    protected Node n(ReadWriteTransaction tx, boolean addSips, String node, String ... endpoints) {
-        return n(tx, addSips, node, Arrays.stream(endpoints).map(i -> new Pair(i, PortDirection.BIDIRECTIONAL)));
+    private OwnedNodeEdgePointRef toRef(String nodeId, String nepId) {
+        return new NodeEdgePointBuilder()
+                .setTopologyId(new Uuid(
+                        TapiConstants.PRESTO_ABSTRACT_NODE.equals(nodeId)
+                        ? TapiConstants.PRESTO_EXT_TOPO
+                                : TapiConstants.PRESTO_SYSTEM_TOPO))
+                .setNodeId(new Uuid(nodeId))
+                .setOwnedNodeEdgePointId(new Uuid(nepId))
+                .build();
     }
 
-    protected Node n(ReadWriteTransaction tx, boolean addSips, String node, Stream<Pair> endpoints) {
-        List<Pair> eps = endpoints.collect(Collectors.toList());
-        NrpDao nrpDao = new NrpDao(tx);
-        if (addSips) {
-            eps.stream().map(e -> new ServiceInterfacePointBuilder()
-                    .setUuid(new Uuid("sip:" + e.getId()))
-                    .setLayerProtocol(Collections.singletonList(TapiUtils.toSipPN(ETH.class)))
-                    .build())
-                    .forEach(nrpDao::addSip);
-        }
-
-        return nrpDao.createNode(TapiConstants.PRESTO_SYSTEM_TOPO, node, ETH.class, eps.stream()
-                .map(e-> {
-                    OwnedNodeEdgePointBuilder builder = new OwnedNodeEdgePointBuilder()
-                            .setLinkPortDirection(e.getDir())
-                            .setLayerProtocol(Collections.singletonList(TapiUtils.toNepPN(ETH.class)))
-                            .setUuid(new Uuid(e.getId()));
-                    if (addSips) {
-                        builder.setMappedServiceInterfacePoint(Collections.singletonList(new Uuid("sip:" + e.getId())));
-                    }
-                    return builder.build();
-                }).collect(Collectors.toList()));
+    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307
+            .cep.list.ConnectionEndPoint dummyCep(OwnedNodeEdgePointRef nepRef) {
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307
+                .cep.list.ConnectionEndPointBuilder builder
+                = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307
+                .cep.list.ConnectionEndPointBuilder();
+
+        return builder
+                .setUuid(new Uuid("cep:" + nepRef.getOwnedNodeEdgePointId().getValue()))
+                .setConnectionPortRole(PortRole.SYMMETRIC)
+                .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
+                .setLifecycleState(LifecycleState.INSTALLED)
+                .setOperationalState(OperationalState.ENABLED)
+                .build();
     }
 
+    @SuppressWarnings("checkstyle:illegalcatch")
     protected Node getAbstractNode() {
 
-        try(ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
+        try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
             Optional<Node> opt =
-                    tx.read(LogicalDatastoreType.OPERATIONAL,NRP_ABSTRACT_NODE_IID).checkedGet();
+                    tx.read(LogicalDatastoreType.OPERATIONAL,NRP_ABSTRACT_NODE_IID).get();
             if (opt.isPresent()) {
                 return opt.get();
             } else {
@@ -221,25 +268,22 @@ public abstract class AbstractTestWithTopo extends AbstractConcurrentDataBrokerT
         return null;
     }
 
-
+    @SuppressWarnings("checkstyle:emptyblock")
     protected Node getAbstractNode(Predicate<Node> nodePredicate) {
 
-        for(int i = 0; i < 5; ++i) {
+        for (int i = 0; i < 5; ++i) {
             Node node = getAbstractNode();
-            if(node != null && nodePredicate.test(node)) {
+            if (node != null && nodePredicate.test(node)) {
                 return node;
             }
             try {
                 TimeUnit.MILLISECONDS.sleep(10);
             } catch (InterruptedException e) {
-                e.printStackTrace();
             }
         }
         throw new IllegalStateException("No NEPs matching predicate");
     }
 
-
-
     protected static class Pair {
         private String id;
         private PortDirection dir;
@@ -259,6 +303,52 @@ public abstract class AbstractTestWithTopo extends AbstractConcurrentDataBrokerT
     }
 
     protected Node n(ReadWriteTransaction tx, String node, String ... endpoints) {
-        return n(tx,true, node, endpoints);
+        return n(tx,true, new Uuid(node), node, endpoints);
+    }
+
+    protected Node n(ReadWriteTransaction tx, Uuid node, String activationDriverId, String ... endpoints) {
+        return n(tx,true, node, activationDriverId, endpoints);
+    }
+
+    protected Node n(ReadWriteTransaction tx, boolean addSips, Uuid node,
+            String activationDriverId, String ... endpoints) {
+        return n(tx, addSips, node.getValue(), activationDriverId, Arrays.stream(endpoints)
+                .map(i -> new Pair(i, PortDirection.BIDIRECTIONAL)));
+    }
+
+    protected Node n(ReadWriteTransaction tx, boolean addSips, String node,
+            String activationDriverId, Stream<Pair> endpoints) {
+        List<Pair> eps = endpoints.collect(Collectors.toList());
+        NrpDao nrpDao = new NrpDao(tx);
+        if (addSips) {
+            ServiceInterfacePoint1Builder sipBuilder = new ServiceInterfacePoint1Builder();
+            sipBuilder.setNrpCarrierEthInniNResource(new NrpCarrierEthInniNResourceBuilder()
+                    .setMaxFrameSize(new NaturalNumber(2048L))
+                    .build());
+
+            eps.stream().map(e -> new ServiceInterfacePointBuilder()
+                    .setUuid(new Uuid("sip:" + e.getId()))
+                    .setLayerProtocolName(Collections.singletonList(LayerProtocolName.ETH))
+                    .addAugmentation(ServiceInterfacePoint1.class, sipBuilder.build())
+                    .build())
+            .forEach(nrpDao::addSip);
+        }
+
+        return nrpDao.createNode(TapiConstants.PRESTO_SYSTEM_TOPO, node,
+                activationDriverId, LayerProtocolName.ETH, eps.stream()
+                .map(e -> {
+                    OwnedNodeEdgePointBuilder builder = new OwnedNodeEdgePointBuilder()
+                            .setLinkPortDirection(e.getDir())
+                            .setLayerProtocolName(LayerProtocolName.ETH)
+                            .setUuid(new Uuid(e.getId()));
+                    if (addSips) {
+                        builder.setMappedServiceInterfacePoint(
+                                Collections.singletonList(
+                                        TapiUtils.toSipRef(
+                                                new Uuid("sip:" + e.getId()),
+                                                MappedServiceInterfacePoint.class)));
+                    }
+                    return builder.build();
+                }).collect(Collectors.toList()));
     }
 }