Bug-2208: pcc-mock support tunnel initiate and remove 57/15257/2
authorMilos Fabian <milfabia@cisco.com>
Wed, 11 Feb 2015 14:16:07 +0000 (15:16 +0100)
committerDana Kutenicsova <dkutenic@cisco.com>
Tue, 17 Feb 2015 13:36:08 +0000 (13:36 +0000)
-pcc-mock can handle PCInitaiate message (create/remove tunnel)
and sends fake report message.
-extended EndPointIpv4ObjectParser to avoid checking "P" object header flag

Change-Id: I822d649940a1a8d0fb8ab5dedf886bb2a9f63a47
Signed-off-by: Milos Fabian <milfabia@cisco.com>
pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/Main.java
pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/MsgBuilderUtil.java
pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/PCCActivator.java [new file with mode: 0644]
pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/PCCEndPointIpv4ObjectParser.java [new file with mode: 0644]
pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/SimpleSessionListener.java
pcep/pcc-mock/src/test/java/org/opendaylight/protocol/pcep/pcc/mock/PCCMockTest.java

index 88817e39a73b0a739f940cfde69655823e8db52b..74d8e526fba9e397008067bcc1ce2f4af97ac67c 100644 (file)
@@ -28,13 +28,22 @@ import org.opendaylight.protocol.framework.ReconnectImmediatelyStrategy;
 import org.opendaylight.protocol.framework.SessionListenerFactory;
 import org.opendaylight.protocol.framework.SessionNegotiatorFactory;
 import org.opendaylight.protocol.pcep.PCEPSessionListener;
+import org.opendaylight.protocol.pcep.ietf.initiated00.CrabbeInitiatedActivator;
 import org.opendaylight.protocol.pcep.ietf.stateful07.StatefulActivator;
 import org.opendaylight.protocol.pcep.impl.DefaultPCEPSessionNegotiatorFactory;
 import org.opendaylight.protocol.pcep.impl.PCEPSessionImpl;
+import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
 import org.opendaylight.protocol.pcep.spi.pojo.ServiceLoaderPCEPExtensionProviderContext;
 import org.opendaylight.tcpmd5.api.KeyMapping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Stateful1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Stateful1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.stateful.capability.tlv.StatefulBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -94,22 +103,22 @@ public final class Main {
     public static void createPCCs(final int lspsPerPcc, final boolean pcerr, final int pccCount,
             final InetSocketAddress localAddress, final List<InetSocketAddress> remoteAddress, final short keepalive, final short deadtimer,
             final String password) throws InterruptedException, ExecutionException {
-        final StatefulActivator activator07 = new StatefulActivator();
-        activator07.start(ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance());
+        startActivators();
         InetAddress currentAddress = localAddress.getAddress();
+        final Open openMessage = getOpenMessage(keepalive, deadtimer);
         final PCCDispatcher pccDispatcher = new PCCDispatcher(ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance().getMessageHandlerRegistry(),
-                getSessionNegotiatorFactory(keepalive, deadtimer));
+                getSessionNegotiatorFactory(openMessage));
         for (int i = 0; i < pccCount; i++) {
             createPCC(lspsPerPcc, pcerr, new InetSocketAddress(currentAddress, localAddress.getPort()),
-                    remoteAddress, keepalive, deadtimer, pccDispatcher, password);
+                    remoteAddress, openMessage, pccDispatcher, password);
             currentAddress = InetAddresses.increment(currentAddress);
         }
     }
 
     private static void createPCC(final int lspsPerPcc, final boolean pcerr, final InetSocketAddress localAddress,
-            final List<InetSocketAddress> remoteAddress, final short keepalive, final short deadtimer, final PCCDispatcher pccDispatcher,
+            final List<InetSocketAddress> remoteAddress, final Open openMessage, final PCCDispatcher pccDispatcher,
             final String password) throws InterruptedException, ExecutionException {
-        final SessionNegotiatorFactory<Message, PCEPSessionImpl, PCEPSessionListener> snf = getSessionNegotiatorFactory(keepalive, deadtimer);
+        final SessionNegotiatorFactory<Message, PCEPSessionImpl, PCEPSessionListener> snf = getSessionNegotiatorFactory(openMessage);
         for (final InetSocketAddress pceAddress : remoteAddress) {
             pccDispatcher.createClient(localAddress, pceAddress, new ReconnectImmediatelyStrategy(GlobalEventExecutor.INSTANCE, RECONNECT_STRATEGY_TIMEOUT), new SessionListenerFactory<PCEPSessionListener>() {
                 @Override
@@ -120,10 +129,8 @@ public final class Main {
         }
     }
 
-    private static SessionNegotiatorFactory<Message, PCEPSessionImpl, PCEPSessionListener> getSessionNegotiatorFactory(final short keepalive,
-            final short deadtimer) {
-        return new DefaultPCEPSessionNegotiatorFactory(
-                new OpenBuilder().setKeepalive(keepalive).setDeadTimer(deadtimer).setSessionId((short) 0).build(), 0);
+    private static SessionNegotiatorFactory<Message, PCEPSessionImpl, PCEPSessionListener> getSessionNegotiatorFactory(final Open openMessage) {
+        return new DefaultPCEPSessionNegotiatorFactory(openMessage, 0);
     }
 
     private static ch.qos.logback.classic.Logger getRootLogger(final LoggerContext lc) {
@@ -158,4 +165,21 @@ public final class Main {
         return null;
     }
 
+    private static Open getOpenMessage(final short keepalive, final short deadtimer) {
+        final Tlvs1 tlvs1 = new Tlvs1Builder().setStateful(new StatefulBuilder().addAugmentation(Stateful1.class,
+                new Stateful1Builder().setInitiation(true).build()).setLspUpdateCapability(true).build()).build();
+        return new OpenBuilder().setTlvs(new TlvsBuilder().addAugmentation(Tlvs1.class, tlvs1).build())
+                .setKeepalive(keepalive).setDeadTimer(deadtimer).setSessionId((short) 0).build();
+    }
+
+    private static void startActivators() {
+        final PCCActivator pccActivator = new PCCActivator();
+        final StatefulActivator stateful = new StatefulActivator();
+        final CrabbeInitiatedActivator activator = new CrabbeInitiatedActivator();
+        final PCEPExtensionProviderContext ctx = ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance();
+        pccActivator.start(ctx);
+        stateful.start(ctx);
+        activator.start(ctx);
+    }
+
 }
index 591013bdc89a24f78809b1c60731df364870716f..2945c3d8f235eb62fbf3310fb2bfac8084a36749 100644 (file)
@@ -15,6 +15,7 @@ import java.util.Arrays;
 import java.util.List;
 import org.opendaylight.protocol.pcep.spi.PCEPErrors;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.pcinitiate.message.pcinitiate.message.Requests;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.OperationalStatus;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Pcrpt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PcrptBuilder;
@@ -98,15 +99,13 @@ public final class MsgBuilderUtil {
     public static Path updToRptPath(
             org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcupd.message.pcupd.message.updates.Path path) {
         final PathBuilder pathBuilder = new PathBuilder();
-        pathBuilder.setBandwidth(path.getBandwidth());
-        pathBuilder.setClassType(path.getClassType());
-        pathBuilder.setEro(path.getEro());
-        pathBuilder.setIro(path.getIro());
-        pathBuilder.setLspa(path.getLspa());
-        pathBuilder.setMetrics(path.getMetrics());
-        pathBuilder.setOf(path.getOf());
-        pathBuilder.setRro(path.getRro());
-        pathBuilder.setXro(path.getXro());
+        pathBuilder.fieldsFrom(path);
+        return pathBuilder.build();
+    }
+
+    public static Path reqToRptPath(final Requests request) {
+        final PathBuilder pathBuilder = new PathBuilder();
+        pathBuilder.fieldsFrom(request);
         return pathBuilder.build();
     }
 
diff --git a/pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/PCCActivator.java b/pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/PCCActivator.java
new file mode 100644 (file)
index 0000000..c196848
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.pcep.pcc.mock;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
+import org.opendaylight.protocol.pcep.spi.pojo.AbstractPCEPExtensionProviderActivator;
+
+public class PCCActivator extends AbstractPCEPExtensionProviderActivator {
+
+    @Override
+    protected List<AutoCloseable> startImpl(final PCEPExtensionProviderContext context) {
+        final List<AutoCloseable> regs = new ArrayList<>();
+        regs.add(context.registerObjectParser(PCCEndPointIpv4ObjectParser.CLASS, PCCEndPointIpv4ObjectParser.TYPE, new PCCEndPointIpv4ObjectParser()));
+        return regs;
+    }
+
+}
diff --git a/pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/PCCEndPointIpv4ObjectParser.java b/pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/PCCEndPointIpv4ObjectParser.java
new file mode 100644 (file)
index 0000000..22c1f05
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.pcep.pcc.mock;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.protocol.pcep.impl.object.PCEPEndPointsIpv4ObjectParser;
+import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
+import org.opendaylight.protocol.util.Ipv4Util;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.address.family.Ipv4CaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.address.family.ipv4._case.Ipv4Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.object.EndpointsObjBuilder;
+
+public class PCCEndPointIpv4ObjectParser extends PCEPEndPointsIpv4ObjectParser {
+
+    @Override
+    public Object parseObject(ObjectHeader header, ByteBuf bytes) throws PCEPDeserializerException {
+        Preconditions.checkArgument(bytes != null && bytes.isReadable(), "Array of bytes is mandatory. Can't be null or empty.");
+        final EndpointsObjBuilder builder = new EndpointsObjBuilder();
+        if (bytes.readableBytes() != Ipv4Util.IP4_LENGTH * 2) {
+            throw new PCEPDeserializerException("Wrong length of array of bytes.");
+        }
+        builder.setIgnore(header.isIgnore());
+        builder.setProcessingRule(header.isProcessingRule());
+        final Ipv4Builder b = new Ipv4Builder();
+        b.setSourceIpv4Address(Ipv4Util.addressForByteBuf(bytes));
+        b.setDestinationIpv4Address((Ipv4Util.addressForByteBuf(bytes)));
+        builder.setAddressFamily(new Ipv4CaseBuilder().setIpv4(b.build()).build());
+        return builder.build();
+    }
+}
index 56dcc3729d8aecc787e3b79e0049b5ee8c88de59..ef001933a3cd07e4d7c6f4b3cefde641c559db8c 100644 (file)
@@ -13,6 +13,7 @@ import static org.opendaylight.protocol.pcep.pcc.mock.MsgBuilderUtil.createLspTl
 import static org.opendaylight.protocol.pcep.pcc.mock.MsgBuilderUtil.createPath;
 import static org.opendaylight.protocol.pcep.pcc.mock.MsgBuilderUtil.createPcRtpMessage;
 import static org.opendaylight.protocol.pcep.pcc.mock.MsgBuilderUtil.createSrp;
+import static org.opendaylight.protocol.pcep.pcc.mock.MsgBuilderUtil.reqToRptPath;
 import static org.opendaylight.protocol.pcep.pcc.mock.MsgBuilderUtil.updToRptPath;
 
 import com.google.common.base.Optional;
@@ -22,19 +23,28 @@ import java.net.InetAddress;
 import java.util.Collections;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.atomic.AtomicLong;
 import org.opendaylight.protocol.pcep.PCEPSession;
 import org.opendaylight.protocol.pcep.PCEPSessionListener;
 import org.opendaylight.protocol.pcep.PCEPTerminationReason;
 import org.opendaylight.protocol.pcep.spi.PCEPErrors;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Pcinitiate;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.pcinitiate.message.pcinitiate.message.Requests;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Pcrpt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Pcupd;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PlspId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.LspBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.Tlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.TlvsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcupd.message.pcupd.message.Updates;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.Srp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.address.family.Ipv4Case;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.Subobject;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.SubobjectBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.basic.explicit.route.subobjects.subobject.type.IpPrefixCase;
@@ -55,12 +65,14 @@ public class SimpleSessionListener implements PCEPSessionListener {
     private final int lspsCount;
     private final boolean pcError;
     private final String address;
+    private final AtomicLong plspIDs;
 
     public SimpleSessionListener(final int lspsCount, final boolean pcError, final InetAddress address) {
         Preconditions.checkArgument(lspsCount >= 0);
         this.lspsCount = lspsCount;
         this.pcError = pcError;
         this.address = address.getHostAddress();
+        this.plspIDs = new AtomicLong(lspsCount);
     }
 
     @Override
@@ -79,6 +91,26 @@ public class SimpleSessionListener implements PCEPSessionListener {
                         Optional.fromNullable(createSrp(srpId)), updToRptPath(updates.getPath()));
                 session.sendMessage(pcRpt);
             }
+        } else if (message instanceof Pcinitiate) {
+            final Pcinitiate initMsg = (Pcinitiate) message;
+            final Requests request = initMsg.getPcinitiateMessage().getRequests().get(0);
+            if (this.pcError) {
+                session.sendMessage(MsgBuilderUtil.createErrorMsg(getRandomError(), request.getSrp().getOperationId().getValue()));
+            } else {
+                final Pcrpt pcRpt;
+                if (request.getSrp().getAugmentation(Srp1.class) != null && request.getSrp().getAugmentation(Srp1.class).isRemove()) {
+                    pcRpt = createPcRtpMessage(request.getLsp(), Optional.fromNullable(request.getSrp()), reqToRptPath(request));
+                } else {
+                    final LspBuilder lspBuilder = new LspBuilder(request.getLsp());
+                    lspBuilder.setPlspId(new PlspId(this.plspIDs.incrementAndGet()));
+                    lspBuilder.addAugmentation(Lsp1.class, new Lsp1Builder().setCreate(true).build());
+                    final Tlvs tlvs = createLspTlvs(lspBuilder.getPlspId().getValue(), false,
+                            ((Ipv4Case) request.getEndpointsObj().getAddressFamily()).getIpv4().getDestinationIpv4Address().getValue(), this.address, this.address);
+                    lspBuilder.setTlvs(new TlvsBuilder(tlvs).setSymbolicPathName(request.getLsp().getTlvs().getSymbolicPathName()).build());
+                    pcRpt = createPcRtpMessage(lspBuilder.build(), Optional.fromNullable(request.getSrp()), reqToRptPath(request));
+                }
+                session.sendMessage(pcRpt);
+            }
         }
     }
 
index 5ed37f8a54ab9e923dbf425270901248bbd64331..01826b4746d248cc145fe5e5cf3be149bc0823f4 100644 (file)
@@ -24,6 +24,8 @@ import org.opendaylight.protocol.pcep.PCEPSession;
 import org.opendaylight.protocol.pcep.impl.DefaultPCEPSessionNegotiatorFactory;
 import org.opendaylight.protocol.pcep.impl.PCEPDispatcherImpl;
 import org.opendaylight.protocol.pcep.spi.pojo.ServiceLoaderPCEPExtensionProviderContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Stateful1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
 
 public class PCCMockTest {
@@ -65,6 +67,7 @@ public class PCCMockTest {
         Assert.assertNotNull(session);
         Assert.assertEquals(40, session.getPeerPref().getDeadtimer().shortValue());
         Assert.assertEquals(10, session.getPeerPref().getKeepalive().shortValue());
+        Assert.assertTrue(session.getRemoteTlvs().getAugmentation(Tlvs1.class).getStateful().getAugmentation(Stateful1.class).isInitiation());
         channel.close().get();
     }