From: Iveta Halanova Date: Thu, 16 Jul 2015 13:23:09 +0000 (+0200) Subject: BUG-139: PCEP TLVs extensions implementation X-Git-Tag: release/beryllium~229 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=33e761131cfdae01185cc668ee60264901042fc0;p=bgpcep.git BUG-139: PCEP TLVs extensions implementation - yang model augmented by LSP-DB-VERSION and SPEAKER-ENTITY-ID - parsers/serializers implementation - integration into Lsp and Open objects - expansion of unit tests Change-Id: I07d2da05f27a5fdb1fe87ebdb58793ab59a08012 Signed-off-by: Iveta Halanova --- diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/controller/config/yang/pcep/stateful07/cfg/SyncOptimizationsPCEPParserModule.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/controller/config/yang/pcep/stateful07/cfg/SyncOptimizationsPCEPParserModule.java index 42db6cbd52..5806771f2a 100644 --- a/pcep/ietf-stateful07/src/main/java/org/opendaylight/controller/config/yang/pcep/stateful07/cfg/SyncOptimizationsPCEPParserModule.java +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/controller/config/yang/pcep/stateful07/cfg/SyncOptimizationsPCEPParserModule.java @@ -9,7 +9,7 @@ package org.opendaylight.controller.config.yang.pcep.stateful07.cfg; import org.opendaylight.controller.config.api.DependencyResolver; import org.opendaylight.controller.config.api.ModuleIdentifier; -import org.opendaylight.protocol.pcep.ietf.stateful07.StatefulActivator; +import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsActivator; public class SyncOptimizationsPCEPParserModule extends AbstractSyncOptimizationsPCEPParserModule { @@ -24,7 +24,7 @@ public class SyncOptimizationsPCEPParserModule extends AbstractSyncOptimizations @Override protected AutoCloseable createInstance() { - return new StatefulActivator(); + return new SyncOptimizationsActivator(); } } diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/LspDbVersionTlvParser.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/LspDbVersionTlvParser.java new file mode 100644 index 0000000000..6d63d6573a --- /dev/null +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/LspDbVersionTlvParser.java @@ -0,0 +1,44 @@ +/* + * 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.sync.optimizations; + +import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedLong; +import com.google.common.base.Preconditions; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import java.math.BigInteger; +import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; +import org.opendaylight.protocol.pcep.spi.TlvParser; +import org.opendaylight.protocol.pcep.spi.TlvSerializer; +import org.opendaylight.protocol.pcep.spi.TlvUtil; +import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.lsp.db.version.tlv.LspDbVersion; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.lsp.db.version.tlv.LspDbVersionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Tlv; + +public class LspDbVersionTlvParser implements TlvParser, TlvSerializer { + + public static final int TYPE = 23; + + @Override + public void serializeTlv(final Tlv tlv, final ByteBuf buffer) { + Preconditions.checkArgument(tlv instanceof LspDbVersion, "Tlv object is not instance of LspDbVersion."); + final ByteBuf body = Unpooled.buffer(); + writeUnsignedLong(((LspDbVersion) tlv).getLspDbVersionValue(), body); + TlvUtil.formatTlv(TYPE, body, buffer); + } + + @Override + public Tlv parseTlv(final ByteBuf buffer) throws PCEPDeserializerException { + if (buffer == null) { + return null; + } + return new LspDbVersionBuilder().setLspDbVersionValue(new BigInteger(ByteArray.readAllBytes(buffer))).build(); + } + +} diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SpeakerEntityIdTlvParser.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SpeakerEntityIdTlvParser.java new file mode 100644 index 0000000000..21f41623d1 --- /dev/null +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SpeakerEntityIdTlvParser.java @@ -0,0 +1,42 @@ +/* + * 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.sync.optimizations; + +import com.google.common.base.Preconditions; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; +import org.opendaylight.protocol.pcep.spi.TlvParser; +import org.opendaylight.protocol.pcep.spi.TlvSerializer; +import org.opendaylight.protocol.pcep.spi.TlvUtil; +import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.speaker.entity.id.tlv.SpeakerEntityId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.speaker.entity.id.tlv.SpeakerEntityIdBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Tlv; + +public class SpeakerEntityIdTlvParser implements TlvParser, TlvSerializer { + + public static final int TYPE = 24; + + @Override + public void serializeTlv(final Tlv tlv, final ByteBuf buffer) { + Preconditions.checkArgument(tlv instanceof SpeakerEntityId, "Tlv object is not instance of SpeakerEntityId."); + final ByteBuf body = Unpooled.buffer(); + body.writeBytes(((SpeakerEntityId) tlv).getSpeakerEntityIdValue()); + TlvUtil.formatTlv(TYPE, body, buffer); + } + + @Override + public Tlv parseTlv(final ByteBuf buffer) throws PCEPDeserializerException { + if (buffer == null) { + return null; + } + return new SpeakerEntityIdBuilder().setSpeakerEntityIdValue(ByteArray.readAllBytes(buffer)).build(); + } + +} diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SyncOptimizationsActivator.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SyncOptimizationsActivator.java index e5231cf1d2..0dee0b652e 100644 --- a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SyncOptimizationsActivator.java +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SyncOptimizationsActivator.java @@ -10,8 +10,14 @@ package org.opendaylight.protocol.pcep.sync.optimizations; import java.util.ArrayList; import java.util.List; import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext; +import org.opendaylight.protocol.pcep.spi.TlvRegistry; +import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry; import org.opendaylight.protocol.pcep.spi.pojo.AbstractPCEPExtensionProviderActivator; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.lsp.db.version.tlv.LspDbVersion; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.speaker.entity.id.tlv.SpeakerEntityId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.Lsp; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.stateful.capability.tlv.Stateful; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open; public class SyncOptimizationsActivator extends AbstractPCEPExtensionProviderActivator { @@ -19,6 +25,22 @@ public class SyncOptimizationsActivator extends AbstractPCEPExtensionProviderAct protected List startImpl(final PCEPExtensionProviderContext context) { final List regs = new ArrayList<>(); + final TlvRegistry tlvReg = context.getTlvHandlerRegistry(); + final VendorInformationTlvRegistry viTlvReg = context.getVendorInformationTlvRegistry(); + regs.add(context.registerObjectParser(SyncOptimizationsLspObjectParser.CLASS, SyncOptimizationsLspObjectParser.TYPE, + new SyncOptimizationsLspObjectParser(tlvReg, viTlvReg))); + regs.add(context.registerObjectSerializer(Lsp.class, new SyncOptimizationsLspObjectParser(tlvReg, viTlvReg))); + + regs.add(context.registerObjectParser(SyncOptimizationsOpenObjectParser.CLASS, SyncOptimizationsOpenObjectParser.TYPE, + new SyncOptimizationsOpenObjectParser(tlvReg, viTlvReg))); + regs.add(context.registerObjectSerializer(Open.class, new SyncOptimizationsOpenObjectParser(tlvReg, viTlvReg))); + + regs.add(context.registerTlvParser(LspDbVersionTlvParser.TYPE, new LspDbVersionTlvParser())); + regs.add(context.registerTlvSerializer(LspDbVersion.class, new LspDbVersionTlvParser())); + + regs.add(context.registerTlvParser(SpeakerEntityIdTlvParser.TYPE, new SpeakerEntityIdTlvParser())); + regs.add(context.registerTlvSerializer(SpeakerEntityId.class, new SpeakerEntityIdTlvParser())); + regs.add(context.registerTlvParser(SyncOptimizationsCapabilityTlvParser.TYPE, new SyncOptimizationsCapabilityTlvParser())); regs.add(context.registerTlvSerializer(Stateful.class, new SyncOptimizationsCapabilityTlvParser())); diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SyncOptimizationsLspObjectParser.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SyncOptimizationsLspObjectParser.java new file mode 100644 index 0000000000..33f651fd82 --- /dev/null +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SyncOptimizationsLspObjectParser.java @@ -0,0 +1,59 @@ +/* + * 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.sync.optimizations; + +import com.google.common.base.Preconditions; +import io.netty.buffer.ByteBuf; +import org.opendaylight.protocol.pcep.ietf.initiated00.CInitiated00LspObjectParser; +import org.opendaylight.protocol.pcep.spi.TlvRegistry; +import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.LspDbVersionTlv; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs1; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs1Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.lsp.db.version.tlv.LspDbVersion; +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.types.rev131005.Tlv; + +public class SyncOptimizationsLspObjectParser extends CInitiated00LspObjectParser { + + public SyncOptimizationsLspObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) { + super(tlvReg, viTlvReg); + } + + @Override + public void serializeTlvs(final Tlvs tlvs, final ByteBuf body) { + super.serializeTlvs(tlvs, body); + serializeAugmentation(tlvs.getAugmentation(Tlvs1.class), body); + } + + private void serializeAugmentation(final Tlvs1 tlv, final ByteBuf body) { + if (tlv == null) { + return; + } + Preconditions.checkArgument(tlv instanceof LspDbVersionTlv, "TLV object is not instance of LspDbVersionTlv."); + final LspDbVersionTlv dbVersion = tlv; + serializeTlv(dbVersion.getLspDbVersion(), body); + } + + @Override + public void addTlv(final TlvsBuilder tbuilder, final Tlv tlv) { + super.addTlv(tbuilder, tlv); + final Tlvs1Builder syncOptTlvsBuilder = new Tlvs1Builder(); + if (tbuilder.getAugmentation(Tlvs1.class) != null) { + final Tlvs1 t = tbuilder.getAugmentation(Tlvs1.class); + if (t.getLspDbVersion() != null) { + syncOptTlvsBuilder.setLspDbVersion(t.getLspDbVersion()); + } + } + if (tlv instanceof LspDbVersion) { + syncOptTlvsBuilder.setLspDbVersion((LspDbVersion) tlv); + } + tbuilder.addAugmentation(Tlvs1.class, syncOptTlvsBuilder.build()); + } +} diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SyncOptimizationsOpenObjectParser.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SyncOptimizationsOpenObjectParser.java new file mode 100644 index 0000000000..5fd3487d59 --- /dev/null +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/sync/optimizations/SyncOptimizationsOpenObjectParser.java @@ -0,0 +1,67 @@ +/* + * 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.sync.optimizations; + +import io.netty.buffer.ByteBuf; +import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07OpenObjectParser; +import org.opendaylight.protocol.pcep.spi.TlvRegistry; +import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs3; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs3Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.lsp.db.version.tlv.LspDbVersion; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.speaker.entity.id.tlv.SpeakerEntityId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Tlv; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.Tlvs; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder; + +public class SyncOptimizationsOpenObjectParser extends Stateful07OpenObjectParser { + + public SyncOptimizationsOpenObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) { + super(tlvReg, viTlvReg); + } + + + @Override + public void addTlv(final TlvsBuilder tbuilder, final Tlv tlv) { + super.addTlv(tbuilder, tlv); + final Tlvs3Builder syncOptTlvsBuilder = new Tlvs3Builder(); + if (tbuilder.getAugmentation(Tlvs3.class) != null) { + final Tlvs3 t = tbuilder.getAugmentation(Tlvs3.class); + if (t.getLspDbVersion() != null) { + syncOptTlvsBuilder.setLspDbVersion(t.getLspDbVersion()); + } + if (t.getSpeakerEntityId() != null) { + syncOptTlvsBuilder.setSpeakerEntityId(t.getSpeakerEntityId()); + } + } + if (tlv instanceof LspDbVersion) { + syncOptTlvsBuilder.setLspDbVersion((LspDbVersion) tlv); + } + if (tlv instanceof SpeakerEntityId) { + syncOptTlvsBuilder.setSpeakerEntityId((SpeakerEntityId) tlv); + } + tbuilder.addAugmentation(Tlvs3.class, syncOptTlvsBuilder.build()); + } + + @Override + public void serializeTlvs(final Tlvs tlvs, final ByteBuf body) { + if (tlvs == null) { + return; + } + super.serializeTlvs(tlvs, body); + if (tlvs.getAugmentation(Tlvs3.class) != null) { + final Tlvs3 syncOptTlvs = tlvs.getAugmentation(Tlvs3.class); + if (syncOptTlvs.getLspDbVersion() != null) { + serializeTlv(syncOptTlvs.getLspDbVersion(), body); + } + if (syncOptTlvs.getSpeakerEntityId() != null) { + serializeTlv(syncOptTlvs.getSpeakerEntityId(), body); + } + } + } +} diff --git a/pcep/ietf-stateful07/src/main/yang/odl-pcep-sync-optimizations.yang b/pcep/ietf-stateful07/src/main/yang/odl-pcep-sync-optimizations.yang index cd6551b987..d5020ea1ec 100644 --- a/pcep/ietf-stateful07/src/main/yang/odl-pcep-sync-optimizations.yang +++ b/pcep/ietf-stateful07/src/main/yang/odl-pcep-sync-optimizations.yang @@ -49,6 +49,24 @@ module odl-pcep-sync-optimizations { } } + grouping lsp-db-version-tlv { + container lsp-db-version { + uses pcep:tlv; + leaf lsp-db-version-value { + type uint64; + } + } + } + + grouping speaker-entity-id-tlv { + container speaker-entity-id { + uses pcep:tlv; + leaf speaker-entity-id-value { + type binary; + } + } + } + augment "/msg:open/msg:open-message/msg:open/msg:tlvs/stateful:stateful" { uses sync-optimizations-capability-tlv; } @@ -56,4 +74,34 @@ module odl-pcep-sync-optimizations { augment "/nt:network-topology/nt:topology/nt:node/topo:path-computation-client/topo:stateful-tlv/stateful:stateful" { uses sync-optimizations-capability-tlv; } + + augment "/msg:open/msg:open-message/msg:open/msg:tlvs" { + uses lsp-db-version-tlv; + uses speaker-entity-id-tlv; + } + + augment "/stateful:pcupd/stateful:pcupd-message/stateful:updates/stateful:lsp/stateful:tlvs" { + uses lsp-db-version-tlv; + } + + augment "/stateful:pcrpt/stateful:pcrpt-message/stateful:reports/stateful:lsp/stateful:tlvs" { + uses lsp-db-version-tlv; + } + + augment "/nt:network-topology/nt:topology/nt:node/topo:path-computation-client/topo:reported-lsp/topo:path/stateful:lsp/stateful:tlvs" { + uses lsp-db-version-tlv; + } + + augment "/topo:add-lsp/topo:input/topo:arguments/stateful:lsp/stateful:tlvs" { + uses lsp-db-version-tlv; + } + + augment "/topo:update-lsp/topo:input/topo:arguments/stateful:lsp/stateful:tlvs" { + uses lsp-db-version-tlv; + } + + augment "/msg:pcerr/msg:pcerr-message/msg:error-type/msg:session-case/msg:session/msg:open/msg:tlvs" { + uses lsp-db-version-tlv; + uses speaker-entity-id-tlv; + } } \ No newline at end of file diff --git a/pcep/ietf-stateful07/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java b/pcep/ietf-stateful07/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java index 0abe24da5b..bcf67a780b 100644 --- a/pcep/ietf-stateful07/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java +++ b/pcep/ietf-stateful07/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java @@ -9,25 +9,36 @@ package org.opendaylight.protocol.pcep.ietf; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; - import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import java.io.IOException; +import java.math.BigInteger; import org.junit.Before; import org.junit.Test; -import org.opendaylight.protocol.pcep.ietf.initiated00.CInitiated00LspObjectParser; import org.opendaylight.protocol.pcep.ietf.initiated00.CInitiated00SrpObjectParser; import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07LspObjectParser; import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07LspaObjectParser; -import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07OpenObjectParser; +import org.opendaylight.protocol.pcep.ietf.stateful07.StatefulActivator; +import org.opendaylight.protocol.pcep.impl.Activator; import org.opendaylight.protocol.pcep.spi.ObjectHeaderImpl; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.TlvRegistry; import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry; import org.opendaylight.protocol.pcep.spi.pojo.ServiceLoaderPCEPExtensionProviderContext; +import org.opendaylight.protocol.pcep.spi.pojo.SimplePCEPExtensionProviderContext; +import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsActivator; +import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsLspObjectParser; +import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsOpenObjectParser; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.protocol.util.Ipv4Util; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Stateful1; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Stateful1Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs3; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs3Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.lsp.db.version.tlv.LspDbVersion; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.lsp.db.version.tlv.LspDbVersionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.speaker.entity.id.tlv.SpeakerEntityIdBuilder; 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.Srp1; @@ -59,7 +70,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.iet import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ProtocolVersion; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.Lspa; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.LspaBuilder; -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.path.setup.type.tlv.PathSetupTypeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.AttributeFilter; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.Ipv4ExtendedTunnelId; @@ -68,68 +78,96 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev public class PCEPObjectParserTest { - private TlvRegistry tlvRegistry; + private SimplePCEPExtensionProviderContext ctx; + private Activator act; + private TlvRegistry tlvRegistry; private VendorInformationTlvRegistry viTlvRegistry; + private static final byte[] DB_VERSION = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; + private static final byte[] SPEAKER_ID = {0x01, 0x02, 0x03, 0x04}; + @Before public void setUp() throws Exception { + this.ctx = new SimplePCEPExtensionProviderContext(); + this.act = new Activator(); + this.act.start(this.ctx); this.tlvRegistry = ServiceLoaderPCEPExtensionProviderContext.create().getTlvHandlerRegistry(); this.viTlvRegistry = ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance().getVendorInformationTlvRegistry(); } @Test public void testOpenObjectWithTLV() throws PCEPDeserializerException, IOException { - final Stateful07OpenObjectParser parser = new Stateful07OpenObjectParser(this.tlvRegistry, this.viTlvRegistry); - final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPOpenObject1.bin")); + try (SyncOptimizationsActivator a = new SyncOptimizationsActivator()) { + a.start(this.ctx); - final OpenBuilder builder = new OpenBuilder(); - builder.setProcessingRule(false); - builder.setIgnore(false); - builder.setVersion(new ProtocolVersion((short) 1)); - builder.setKeepalive((short) 30); - builder.setDeadTimer((short) 120); - builder.setSessionId((short) 1); + final SyncOptimizationsOpenObjectParser parser = new SyncOptimizationsOpenObjectParser(this.ctx.getTlvHandlerRegistry(), this.ctx.getVendorInformationTlvRegistry()); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPOpenObject1.bin")); - final Stateful tlv1 = new StatefulBuilder().setLspUpdateCapability(Boolean.TRUE).build(); + final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder builder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder(); + builder.setProcessingRule(false); + builder.setIgnore(false); + builder.setVersion(new ProtocolVersion((short) 1)); + builder.setKeepalive((short) 30); + builder.setDeadTimer((short) 120); + builder.setSessionId((short) 1); - final Tlvs1Builder statBuilder = new Tlvs1Builder(); - statBuilder.setStateful(tlv1); + final Stateful tlv1 = new StatefulBuilder().setLspUpdateCapability(Boolean.TRUE).addAugmentation(Stateful1.class, new Stateful1Builder().build()).build(); - builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder().addAugmentation( - Tlvs1.class, statBuilder.build()).build()); + final Tlvs1Builder statBuilder = new Tlvs1Builder(); + statBuilder.setStateful(tlv1); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() - 4))); - final ByteBuf buf = Unpooled.buffer(); - parser.serializeObject(builder.build(), buf); - assertArrayEquals(result.array(),ByteArray.getAllBytes(buf)); + final Tlvs3Builder syncOptBuilder = new Tlvs3Builder(); + syncOptBuilder.setLspDbVersion(new LspDbVersionBuilder().setLspDbVersionValue(new BigInteger(DB_VERSION)).build()); + syncOptBuilder.setSpeakerEntityId(new SpeakerEntityIdBuilder().setSpeakerEntityIdValue(SPEAKER_ID).build()); + + builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder() + .addAugmentation(Tlvs1.class, statBuilder.build()) + .addAugmentation(Tlvs3.class, syncOptBuilder.build()) + .build()); + + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() - 4))); + final ByteBuf buf = Unpooled.buffer(); + parser.serializeObject(builder.build(), buf); + assertArrayEquals(result.array(), ByteArray.getAllBytes(buf)); + } } @Test public void testLspObjectWithTLV() throws IOException, PCEPDeserializerException { - final CInitiated00LspObjectParser parser = new CInitiated00LspObjectParser(this.tlvRegistry, this.viTlvRegistry); - final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLspObject1WithTLV.bin")); + try (StatefulActivator a = new StatefulActivator(); + SyncOptimizationsActivator a2 = new SyncOptimizationsActivator()) { + a.start(this.ctx); + a2.start(this.ctx); - final LspBuilder builder = new LspBuilder(); - builder.setProcessingRule(true); - builder.setIgnore(true); - builder.setAdministrative(true); - builder.setDelegate(false); - builder.setRemove(true); - builder.setSync(false); - builder.addAugmentation(Lsp1.class, new Lsp1Builder().setCreate(false).build()); - builder.setOperational(OperationalStatus.GoingDown); - builder.setPlspId(new PlspId(0x12345L)); + final SyncOptimizationsLspObjectParser parser = new SyncOptimizationsLspObjectParser(this.ctx.getTlvHandlerRegistry(), this.ctx.getVendorInformationTlvRegistry()); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLspObject1WithTLV.bin")); - final LspErrorCode tlv1 = new LspErrorCodeBuilder().setErrorCode(627610883L).build(); - final SymbolicPathName tlv2 = new SymbolicPathNameBuilder().setPathName( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SymbolicPathName("Med".getBytes())).build(); - builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.TlvsBuilder().setLspErrorCode( - tlv1).setSymbolicPathName(tlv2).build()); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() - 4))); - final ByteBuf buf = Unpooled.buffer(); - parser.serializeObject(builder.build(), buf); - assertArrayEquals(result.array(),ByteArray.getAllBytes(buf)); + final LspBuilder builder = new LspBuilder(); + builder.setProcessingRule(true); + builder.setIgnore(true); + builder.setAdministrative(true); + builder.setDelegate(false); + builder.setRemove(true); + builder.setSync(false); + builder.addAugmentation(Lsp1.class, new Lsp1Builder().setCreate(false).build()); + builder.setOperational(OperationalStatus.GoingDown); + builder.setPlspId(new PlspId(0x12345L)); + + final LspErrorCode tlv1 = new LspErrorCodeBuilder().setErrorCode(627610883L).build(); + final SymbolicPathName tlv2 = new SymbolicPathNameBuilder().setPathName( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SymbolicPathName("Med".getBytes())).build(); + final LspDbVersion lspDbVersion = new LspDbVersionBuilder().setLspDbVersionValue(new BigInteger(DB_VERSION)).build(); + builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.TlvsBuilder().setLspErrorCode( + tlv1).setSymbolicPathName(tlv2) + .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs1.class, new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs1Builder().setLspDbVersion(lspDbVersion).build()) + .build()); + + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() - 4))); + final ByteBuf buf = Unpooled.buffer(); + parser.serializeObject(builder.build(), buf); + assertArrayEquals(result.array(),ByteArray.getAllBytes(buf)); + } } @Test diff --git a/pcep/ietf-stateful07/src/test/resources/PCEPLspObject1WithTLV.bin b/pcep/ietf-stateful07/src/test/resources/PCEPLspObject1WithTLV.bin index 0b28aae333..2ee7d24e27 100755 Binary files a/pcep/ietf-stateful07/src/test/resources/PCEPLspObject1WithTLV.bin and b/pcep/ietf-stateful07/src/test/resources/PCEPLspObject1WithTLV.bin differ diff --git a/pcep/ietf-stateful07/src/test/resources/PCEPOpenObject1.bin b/pcep/ietf-stateful07/src/test/resources/PCEPOpenObject1.bin index 388f09874f..56d83ad541 100644 Binary files a/pcep/ietf-stateful07/src/test/resources/PCEPOpenObject1.bin and b/pcep/ietf-stateful07/src/test/resources/PCEPOpenObject1.bin differ