Merge dev/fluorine work across to master
[unimgr.git] / impl / src / main / java / org / opendaylight / unimgr / mef / nrp / impl / connectivityservice / CreateConnectivityAction.java
index f266d2320977d25a94730b4f9ace402bea5efb2a..cdca1a19a87b6aaeded6187806fd755d128aa6f9 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.unimgr.mef.nrp.impl.connectivityservice;
 
 import java.text.MessageFormat;
 import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -18,9 +19,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.stream.Collectors;
 
-import javax.annotation.Nullable;
-
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.unimgr.mef.nrp.api.ActivationDriver;
@@ -29,32 +28,39 @@ import org.opendaylight.unimgr.mef.nrp.api.FailureResult;
 import org.opendaylight.unimgr.mef.nrp.api.RequestValidator;
 import org.opendaylight.unimgr.mef.nrp.api.Subrequrest;
 import org.opendaylight.unimgr.mef.nrp.api.TapiConstants;
+import org.opendaylight.unimgr.mef.nrp.common.NrpDao;
+import org.opendaylight.unimgr.mef.nrp.common.TapiUtils;
 import org.opendaylight.unimgr.mef.nrp.impl.ActivationTransaction;
-import org.opendaylight.yang.gen.v1.urn.mef.yang.nrp._interface.rev171221.EndPoint2;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.ETH;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.ForwardingDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.GlobalClass;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.PortDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.PortRole;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.TerminationDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.common.rev171113.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.CreateConnectivityServiceInput;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.CreateConnectivityServiceOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.CreateConnectivityServiceOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connection.ConnectionEndPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connection.ConnectionEndPointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connection.RouteBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connection.end.point.LayerProtocolBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.Connection;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.ConnectionBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.ConnectionKey;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.ConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.ConnectivityServiceBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.ConnectivityServiceKey;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.service.ConnConstraint;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.service.ConnConstraintBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.service.EndPointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.create.connectivity.service.output.ServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.nrp._interface.rev180321.EndPoint1;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.nrp._interface.rev180321.EndPoint1Builder;
+import org.opendaylight.yang.gen.v1.urn.mef.yang.nrp._interface.rev180321.EndPoint2;
+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.GlobalClass;
+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.Uuid;
+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.CreateConnectivityServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.CreateConnectivityServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.CreateConnectivityServiceOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.cep.list.ConnectionEndPointBuilder;
+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.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connectivity.context.ConnectivityServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connectivity.context.ConnectivityServiceKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connectivity.service.EndPointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.create.connectivity.service.input.ConnConstraint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.create.connectivity.service.input.ConnConstraintBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.create.connectivity.service.output.ServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev180307.OwnedNodeEdgePointRef;
 import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
 import org.opendaylight.yangtools.yang.common.RpcResult;
@@ -62,10 +68,8 @@ import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-
 /**
+ * Create connectivity implementation.
  * @author bartosz.michalik@amartus.com
  */
 class CreateConnectivityAction implements Callable<RpcResult<CreateConnectivityServiceOutput>> {
@@ -76,7 +80,8 @@ class CreateConnectivityAction implements Callable<RpcResult<CreateConnectivityS
     private List<Subrequrest> decomposedRequest;
     private List<EndPoint> endpoints;
 
-    public CreateConnectivityAction(TapiConnectivityServiceImpl tapiConnectivityService, CreateConnectivityServiceInput input) {
+    CreateConnectivityAction(TapiConnectivityServiceImpl tapiConnectivityService,
+                             CreateConnectivityServiceInput input) {
         Objects.requireNonNull(tapiConnectivityService);
         Objects.requireNonNull(input);
         this.service = tapiConnectivityService;
@@ -84,12 +89,14 @@ class CreateConnectivityAction implements Callable<RpcResult<CreateConnectivityS
     }
 
     @Override
-    public RpcResult<CreateConnectivityServiceOutput> call() throws Exception {
+    @SuppressWarnings("checkstyle:illegalcatch")
+    public RpcResult<CreateConnectivityServiceOutput> call() {
         LOG.debug("running CreateConnectivityService task");
 
         try {
             RequestValidator.ValidationResult validationResult = validateInput();
-            if (!validationResult.isValid()) {
+            if (validationResult.invalid()) {
+                LOG.debug("validation for create connectivity service failed = {}", input);
                 RpcResultBuilder<CreateConnectivityServiceOutput> res = RpcResultBuilder.failed();
                 validationResult.getProblems().forEach(p -> res.withError(RpcError.ErrorType.APPLICATION, p));
                 return res.build();
@@ -97,11 +104,14 @@ class CreateConnectivityAction implements Callable<RpcResult<CreateConnectivityS
             }
 
             endpoints = input.getEndPoint().stream().map(ep -> {
-                EndPoint2 nrpAttributes = ep.getAugmentation(EndPoint2.class);
-                return new EndPoint(ep, nrpAttributes);
+                EndPoint2 nrpAttributes = ep.augmentation(EndPoint2.class);
+                EndPoint endPoint = new EndPoint(ep, nrpAttributes);
+                endPoint.setLocalId(ep.getLocalId());
+                return endPoint;
             }).collect(Collectors.toList());
 
             String uniqueStamp = service.getServiceIdPool().getServiceId();
+            LOG.debug("connectivity service passed validation, request = {}", input);
 
             ActivationTransaction tx = prepareTransaction(toCsId(uniqueStamp));
             if (tx != null) {
@@ -111,17 +121,17 @@ class CreateConnectivityAction implements Callable<RpcResult<CreateConnectivityS
 
                     // XXX [bm] when createConnectivityModel methods throws an exception we have desync
                     // (devices are configured but no data stored in MD-SAL. How should we address that?
-                    ConnectivityService service = createConnectivityModel(uniqueStamp);
+                    ConnectivityService cs = createConnectivityModel(uniqueStamp);
                     CreateConnectivityServiceOutput result = new CreateConnectivityServiceOutputBuilder()
-                            .setService(new ServiceBuilder(service).build()).build();
+                            .setService(new ServiceBuilder(cs).build()).build();
                     return RpcResultBuilder.success(result).build();
                 } else {
-                    LOG.warn("CreateConnectivityService failed, reason = {}, request = {}", txResult.getMessage(), input);
+                    LOG.warn("CreateConnectivityService failed, reason = {}, request = {}",
+                            txResult.getMessage(), input);
                 }
             }
             throw new IllegalStateException("no transaction created for create connectivity request");
 
-
         } catch (Exception e) {
             LOG.warn("Exception in create connectivity service", e);
             return RpcResultBuilder
@@ -135,12 +145,20 @@ class CreateConnectivityAction implements Callable<RpcResult<CreateConnectivityS
         LOG.debug("decompose request");
         decomposedRequest = service.getDecomposer().decompose(endpoints, null);
 
+        if (decomposedRequest == null || decomposedRequest.isEmpty()) {
+            throw new FailureResult("Cannot define activation scheme for "
+                            + endpoints.stream().map(e -> e.getEndpoint().getServiceInterfacePoint()
+                            .getServiceInterfacePointId().getValue())
+                            .collect(Collectors.joining(",", "[", "]")));
+        }
+
         ActivationTransaction tx = new ActivationTransaction();
 
         decomposedRequest.stream().map(s -> {
-            Optional<ActivationDriver> driver = service.getDriverRepo().getDriver(s.getNodeUuid());
+            Optional<ActivationDriver> driver = service.getDriverRepo().getDriver(s.getActivationDriverId());
             if (!driver.isPresent()) {
-                throw new IllegalStateException(MessageFormat.format("driver {} cannot be created", s.getNodeUuid()));
+                throw new IllegalStateException(MessageFormat
+                        .format("driver {} cannot be created", s.getNodeUuid()));
             }
             driver.get().initialize(s.getEndpoints(), serviceId, null);
             LOG.debug("driver {} added to activation transaction", driver.get());
@@ -158,28 +176,37 @@ class CreateConnectivityAction implements Callable<RpcResult<CreateConnectivityS
         return "cs:" + uniqueStamp;
     }
 
-    private ConnectivityService createConnectivityModel(String uniqueStamp) throws TransactionCommitFailedException, TimeoutException {
+    private ConnectivityService createConnectivityModel(String uniqueStamp)
+            throws TransactionCommitFailedException, TimeoutException {
         assert decomposedRequest != null : "this method can be only run after request was successfuly decomposed";
         //sort of unique ;)
 
         LOG.debug("Preparing connectivity related model for {}", uniqueStamp);
 
+        final ReadWriteTransaction tx = service.getBroker().newReadWriteTransaction();
+        NrpDao nrpDao = new NrpDao(tx);
+
         List<Connection> systemConnections = decomposedRequest.stream().map(s -> new ConnectionBuilder()
                 .setUuid(new Uuid("conn:" + s.getNodeUuid().getValue() + ":" + uniqueStamp))
 //                        .setState()
                 .setDirection(ForwardingDirection.BIDIRECTIONAL)
-                .setLayerProtocolName(ETH.class)
-                .setContainerNode(s.getNodeUuid())
-                .setConnectionEndPoint(toConnectionPoints(s.getEndpoints(), uniqueStamp))
-                .build()).collect(Collectors.toList());
+                .setLayerProtocolName(LayerProtocolName.ETH)
+
+                .setConnectionEndPoint(
+                        createSystemConnectionPoints(nrpDao, TapiUtils
+                                .toNodeRef(s.getNodeUuid()), s.getEndpoints(), uniqueStamp))
+                .build())
+            .collect(Collectors.toList());
 
         Connection globalConnection = new ConnectionBuilder()
                 .setUuid(new Uuid("conn:" + TapiConstants.PRESTO_ABSTRACT_NODE + ":" + uniqueStamp))
 //                        .setState()
                 .setDirection(ForwardingDirection.BIDIRECTIONAL)
-                .setLayerProtocolName(ETH.class)
-                .setContainerNode(new Uuid(TapiConstants.PRESTO_ABSTRACT_NODE))
-                .setConnectionEndPoint(toConnectionPoints(endpoints, uniqueStamp))
+                .setLayerProtocolName(LayerProtocolName.ETH)
+//                .setContainerNode(new Uuid(TapiConstants.PRESTO_ABSTRACT_NODE))
+                .setConnectionEndPoint(
+                        createSystemConnectionPoints(nrpDao, TapiUtils
+                                .toNodeRef(new Uuid(TapiConstants.PRESTO_ABSTRACT_NODE)), endpoints, uniqueStamp))
                 .setRoute(Collections.singletonList(new RouteBuilder()
                         .setLocalId("route")
                         .setConnectionEndPoint(systemConnections.stream()
@@ -188,27 +215,27 @@ class CreateConnectivityAction implements Callable<RpcResult<CreateConnectivityS
                         .build())
                 ).build();
 
+        ConnConstraint connConstraint = input.getConnConstraint() == null
+                ? new ConnConstraintBuilder().build() : new ConnConstraintBuilder(input.getConnConstraint()).build();
 
-        ConnConstraint connConstraint = input.getConnConstraint() == null ? null : new ConnConstraintBuilder(input.getConnConstraint()).build();
-
-        org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.ConnectivityService cs =
-                new org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.ConnectivityServiceBuilder()
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307
+                .connectivity.context.ConnectivityService cs =
+                new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307
+                        .connectivity.context.ConnectivityServiceBuilder(connConstraint)
                 .setUuid(new Uuid(toCsId(uniqueStamp)))
-//                    .setState()
-                .setConnConstraint(connConstraint)
                 .setConnection(Collections.singletonList(globalConnection.getUuid()))
-                .setEndPoint(toConnectionServiceEndpoints(endpoints, uniqueStamp))
+                .setEndPoint(toConnectivityServiceEps(endpoints))
                 .build();
 
-        final WriteTransaction tx = service.getBroker().newWriteOnlyTransaction();
-        systemConnections.forEach(c -> {
-            tx.put(LogicalDatastoreType.OPERATIONAL, TapiConnectivityServiceImpl.connectivityCtx.child(Connection.class, new ConnectionKey(c.getUuid())), c);
-        });
+        systemConnections.forEach(c -> tx.put(LogicalDatastoreType.OPERATIONAL, TapiConnectivityServiceImpl
+                .CONNECTIVITY_CTX.child(Connection.class, new ConnectionKey(c.getUuid())), c));
         tx.put(LogicalDatastoreType.OPERATIONAL,
-                TapiConnectivityServiceImpl.connectivityCtx.child(org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.context.ConnectivityService.class,
+                TapiConnectivityServiceImpl.CONNECTIVITY_CTX.child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi
+                                .connectivity.rev180307.connectivity.context.ConnectivityService.class,
                         new ConnectivityServiceKey(cs.getUuid())), cs);
 
-        tx.put(LogicalDatastoreType.OPERATIONAL, TapiConnectivityServiceImpl.connectivityCtx.child(Connection.class, new ConnectionKey(globalConnection.getUuid())), globalConnection);
+        tx.put(LogicalDatastoreType.OPERATIONAL, TapiConnectivityServiceImpl.CONNECTIVITY_CTX.child(Connection.class,
+                new ConnectionKey(globalConnection.getUuid())), globalConnection);
 
         LOG.debug("Storing connectivity related model for {} to operational data store", uniqueStamp);
 
@@ -217,41 +244,102 @@ class CreateConnectivityAction implements Callable<RpcResult<CreateConnectivityS
             tx.submit().checkedGet(500, TimeUnit.MILLISECONDS);
             LOG.info("Success with serializing Connections and Connectivity Service for {}", uniqueStamp);
         } catch (TimeoutException e) {
-            LOG.error("Error with commiting Connections and Connectivity Service for {} within {} ms", uniqueStamp, 500);
+            LOG.error("Error with committing Connections and Connectivity Service for {} within {} ms",
+                    uniqueStamp, 500);
             throw e;
         } catch (TransactionCommitFailedException e) {
-            LOG.error("Error with commiting Connections and Connectivity Service for " + uniqueStamp, e);
+            LOG.error("Error with committing Connections and Connectivity Service for " + uniqueStamp, e);
             throw e;
         }
 
         return new ConnectivityServiceBuilder(cs).build();
     }
 
-    private List<org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.tapi.connectivity.rev171113.connectivity.service.EndPoint> toConnectionServiceEndpoints(List<EndPoint> endpoints, String uniqueStamp) {
-        return endpoints.stream().map(ep -> new EndPointBuilder()
-                .setLocalId("sep:" + ep.getSystemNepUuid() + ":" + uniqueStamp)
+    private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307
+            .connectivity.service.EndPoint> toConnectivityServiceEps(List<EndPoint> eps) {
+        return eps.stream().map(ep -> {
+            String id = ep.getLocalId();
+            if (id == null) {
+                id = "sep:" + Integer.toString(ep.getNepRef()
+                        .getOwnedNodeEdgePointId().getValue().hashCode(), 16);
+            }
+            return new EndPointBuilder()
+                .setLocalId(id)
                 .setServiceInterfacePoint(ep.getEndpoint().getServiceInterfacePoint())
                 .setDirection(PortDirection.BIDIRECTIONAL)
-// TODO donaldh .setLayerProtocolName(Eth.class)
+                .setLayerProtocolName(LayerProtocolName.ETH)
                 .setRole(PortRole.SYMMETRIC)
-                .build()
+                .addAugmentation(EndPoint1.class, new EndPoint1Builder(ep.getAttrs()).build())
+                .build();
+
+            }
         ).collect(Collectors.toList());
     }
 
-    private List<ConnectionEndPoint> toConnectionPoints(List<EndPoint> endpoints, String uniqueStamp) {
-        return endpoints.stream().map(ep -> new ConnectionEndPointBuilder()
-                        .setUuid(new Uuid("cep:" + ep.getSystemNepUuid() + ":" + uniqueStamp))
-//                    .setState()
-                        .setConnectionPortDirection(PortDirection.BIDIRECTIONAL)
-                        .setConnectionPortRole(PortRole.SYMMETRIC)
-                        .setServerNodeEdgePoint(ep.getSystemNepUuid())
-                        .setLayerProtocol(Collections.singletonList(new LayerProtocolBuilder()
-                                .setLocalId(ETH.class.getSimpleName())
-                                .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-                                .setLayerProtocolName(ETH.class).build()))
-                        .build()
-        ).collect(Collectors.toList());
+    private ConnectionEndPointBuilder populateData(ConnectionEndPointBuilder builder,
+                                                   ConnectivityServiceEndPoint csep) {
+        Objects.requireNonNull(builder);
+        Objects.requireNonNull(csep);
+
+        builder
+                .setOperationalState(csep.getOperationalState())
+                .setLayerProtocolName(csep.getLayerProtocolName())
+                .setLifecycleState(csep.getLifecycleState())
+                .setConnectionPortRole(PortRole.SYMMETRIC)
+                .setConnectionPortDirection(csep.getDirection());
+        return builder;
+    }
+
+    private List<ConnectionEndPoint> createSystemConnectionPoints(NrpDao nrpDao, NodeRef ref,
+                                                                  List<EndPoint> eps, String uniqueStamp) {
+
+        Optional<ConnectivityServiceEndPoint> defaultCsEp = eps.stream()
+                .filter(ep -> ep.getEndpoint() != null).map(EndPoint::getEndpoint).findFirst();
 
+        ConnectionEndPointBuilder defB = new ConnectionEndPointBuilder();
+
+        if (defaultCsEp.isPresent()) {
+            populateData(defB, defaultCsEp.get());
+        } else {
+            defB
+                .setOperationalState(OperationalState.ENABLED)
+                .setLayerProtocolName(LayerProtocolName.ETH)
+                .setLifecycleState(LifecycleState.INSTALLED)
+                .setConnectionPortRole(PortRole.SYMMETRIC)
+                .setConnectionPortDirection(PortDirection.BIDIRECTIONAL);
+        }
+
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.cep.list
+                .ConnectionEndPoint defaultVal = defB.build();
+
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307.connection
+                .ConnectionEndPointBuilder cepRefBuilder
+                = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307
+                .connection.ConnectionEndPointBuilder();
+        cepRefBuilder
+                .setTopologyId(ref.getTopologyId())
+                .setNodeId(ref.getNodeId());
+
+
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev180307
+                .connection.ConnectionEndPoint> ceps = new LinkedList<>();
+
+        for (EndPoint ep : eps) {
+            ConnectionEndPointBuilder builder = new ConnectionEndPointBuilder(defaultVal);
+            ConnectivityServiceEndPoint csp = ep.getEndpoint();
+            OwnedNodeEdgePointRef nepRef = ep.getNepRef();
+            cepRefBuilder.setOwnedNodeEdgePointId(nepRef.getOwnedNodeEdgePointId());
+            cepRefBuilder.setConnectionEndPointId(new Uuid("cep:"
+                    + nepRef.getOwnedNodeEdgePointId().getValue() + ":" + uniqueStamp));
+            if (csp != null) {
+                populateData(builder, csp);
+            }
+            builder.setUuid(cepRefBuilder.getConnectionEndPointId());
+            builder.withKey(null);
+            ConnectionEndPoint cepRef = nrpDao.addConnectionEndPoint(cepRefBuilder.build(), builder.build());
+            ceps.add(cepRef);
+        }
 
+        return ceps;
     }
 }