From 127618396f0e30081f3d0ab1aeedff9f0ecc6bc1 Mon Sep 17 00:00:00 2001 From: Dana Kutenicsova Date: Thu, 6 Feb 2014 15:13:00 +0100 Subject: [PATCH] Defined Symbolic path name TLV to LSPA. Change-Id: Ib6c82582d7ff2bbed1d3cccaace53be3bc555ae3 Signed-off-by: Dana Kutenicsova --- pcep/api/src/main/yang/pcep-types.yang | 3 + .../ietf/stateful02/PCEPLspaObjectParser.java | 173 ++++++++++++++++++ .../ietf/stateful02/StatefulActivator.java | 5 + .../yang/odl-pcep-crabbe-initiated00.yang | 4 + .../main/yang/odl-pcep-ietf-stateful02.yang | 4 + .../pcep/ietf/PCEPObjectParserTest.java | 37 ++++ .../resources/PCEPLspaObject1LowerBounds.bin | Bin 0 -> 52 bytes .../AbstractTopologySessionListener.java | 2 + .../Stateful02TopologySessionListener.java | 31 ++-- 9 files changed, 248 insertions(+), 11 deletions(-) create mode 100644 pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/PCEPLspaObjectParser.java create mode 100755 pcep/ietf-stateful02/src/test/resources/PCEPLspaObject1LowerBounds.bin diff --git a/pcep/api/src/main/yang/pcep-types.yang b/pcep/api/src/main/yang/pcep-types.yang index c04c259e51..365e2b369f 100644 --- a/pcep/api/src/main/yang/pcep-types.yang +++ b/pcep/api/src/main/yang/pcep-types.yang @@ -492,6 +492,9 @@ module pcep-types { container lspa { uses object; uses rsvp:tunnel-attributes; + container "tlvs" { + + } } } diff --git a/pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/PCEPLspaObjectParser.java b/pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/PCEPLspaObjectParser.java new file mode 100644 index 0000000000..2cd843a937 --- /dev/null +++ b/pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/PCEPLspaObjectParser.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2013 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.ietf.stateful02; + +import java.util.BitSet; + +import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser; +import org.opendaylight.protocol.pcep.spi.ObjectUtil; +import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; +import org.opendaylight.protocol.pcep.spi.TlvHandlerRegistry; +import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Tlvs2; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Tlvs2Builder; +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.Tlv; +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.lspa.object.lspa.Tlvs; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.lspa.TlvsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.AttributeFilter; + +import com.google.common.primitives.UnsignedBytes; + +/** + * Parser for {@link Lspa} + */ +public class PCEPLspaObjectParser extends AbstractObjectWithTlvsParser { + + public static final int CLASS = 9; + + public static final int TYPE = 1; + + /* + * lengths of fields in bytes + */ + private static final int EXC_ANY_F_LENGTH = 4; + private static final int INC_ANY_F_LENGTH = 4; + private static final int INC_ALL_F_LENGTH = 4; + private static final int SET_PRIO_F_LENGTH = 1; + private static final int HOLD_PRIO_F_LENGTH = 1; + private static final int FLAGS_F_LENGTH = 1; + + /* + * offsets of flags inside flags field in bits + */ + private static final int L_FLAG_OFFSET = 7; + + /* + * offsets of fields in bytes + */ + private static final int EXC_ANY_F_OFFSET = 0; + private static final int INC_ANY_F_OFFSET = EXC_ANY_F_OFFSET + EXC_ANY_F_LENGTH; + private static final int INC_ALL_F_OFFSET = INC_ANY_F_OFFSET + INC_ANY_F_LENGTH; + private static final int SET_PRIO_F_OFFSET = INC_ALL_F_OFFSET + INC_ALL_F_LENGTH; + private static final int HOLD_PRIO_F_OFFSET = SET_PRIO_F_OFFSET + SET_PRIO_F_LENGTH; + private static final int FLAGS_F_OFFSET = HOLD_PRIO_F_OFFSET + HOLD_PRIO_F_LENGTH; + private static final int TLVS_F_OFFSET = FLAGS_F_OFFSET + FLAGS_F_LENGTH + 1; + + public PCEPLspaObjectParser(final TlvHandlerRegistry tlvReg) { + super(tlvReg); + } + + @Override + public Lspa parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException { + if (bytes == null) { + throw new IllegalArgumentException("Bytes array is mandatory."); + } + final BitSet flags = ByteArray.bytesToBitSet(ByteArray.subByte(bytes, FLAGS_F_OFFSET, FLAGS_F_LENGTH)); + + final LspaBuilder builder = new LspaBuilder(); + final TlvsBuilder tbuilder = new TlvsBuilder(); + parseTlvs(tbuilder, ByteArray.cutBytes(bytes, TLVS_F_OFFSET)); + builder.setTlvs(tbuilder.build()); + + builder.setIgnore(header.isIgnore()); + builder.setProcessingRule(header.isProcessingRule()); + + builder.setHoldPriority((short) UnsignedBytes.toInt(bytes[HOLD_PRIO_F_OFFSET])); + builder.setSetupPriority((short) UnsignedBytes.toInt(bytes[SET_PRIO_F_OFFSET])); + builder.setLocalProtectionDesired(flags.get(L_FLAG_OFFSET)); + builder.setExcludeAny(new AttributeFilter(ByteArray.bytesToLong(ByteArray.subByte(bytes, EXC_ANY_F_OFFSET, EXC_ANY_F_LENGTH)))); + builder.setIncludeAll(new AttributeFilter(ByteArray.bytesToLong(ByteArray.subByte(bytes, INC_ALL_F_OFFSET, INC_ALL_F_LENGTH)))); + builder.setIncludeAny(new AttributeFilter(ByteArray.bytesToLong(ByteArray.subByte(bytes, INC_ANY_F_OFFSET, INC_ANY_F_LENGTH)))); + return builder.build(); + } + + @Override + public void addTlv(final TlvsBuilder tbuilder, final Tlv tlv) { + final Tlvs2Builder nameBuilder = new Tlvs2Builder(); + if (tbuilder.getAugmentation(Tlvs2.class) != null) { + final Tlvs2 t = tbuilder.getAugmentation(Tlvs2.class); + if (t.getSymbolicPathName() != null) { + nameBuilder.setSymbolicPathName(t.getSymbolicPathName()); + } + } + tbuilder.addAugmentation(Tlvs2.class, nameBuilder.build()); + } + + @Override + public byte[] serializeObject(final Object object) { + if (!(object instanceof Lspa)) { + throw new IllegalArgumentException("Wrong instance of PCEPObject. Passed " + object.getClass() + ". Needed LspaObject."); + } + final Lspa lspaObj = (Lspa) object; + + final byte[] tlvs = serializeTlvs(lspaObj.getTlvs()); + final byte[] retBytes = new byte[TLVS_F_OFFSET + tlvs.length + getPadding(TLVS_F_OFFSET + tlvs.length, PADDED_TO)]; + + if (lspaObj.getExcludeAny() != null) { + System.arraycopy(ByteArray.longToBytes(lspaObj.getExcludeAny().getValue(), EXC_ANY_F_LENGTH), 0, retBytes, EXC_ANY_F_OFFSET, + EXC_ANY_F_LENGTH); + } + if (lspaObj.getIncludeAny() != null) { + System.arraycopy(ByteArray.longToBytes(lspaObj.getIncludeAny().getValue(), INC_ANY_F_LENGTH), 0, retBytes, INC_ANY_F_OFFSET, + INC_ANY_F_LENGTH); + } + if (lspaObj.getIncludeAll() != null) { + System.arraycopy(ByteArray.longToBytes(lspaObj.getIncludeAll().getValue(), INC_ALL_F_LENGTH), 0, retBytes, INC_ALL_F_OFFSET, + INC_ALL_F_LENGTH); + } + if (lspaObj.getSetupPriority() != null) { + retBytes[SET_PRIO_F_OFFSET] = UnsignedBytes.checkedCast(lspaObj.getSetupPriority()); + } + if (lspaObj.getHoldPriority() != null) { + retBytes[HOLD_PRIO_F_OFFSET] = UnsignedBytes.checkedCast(lspaObj.getHoldPriority()); + } + final BitSet flags = new BitSet(FLAGS_F_LENGTH * Byte.SIZE); + if (lspaObj.isLocalProtectionDesired() != null && lspaObj.isLocalProtectionDesired()) { + flags.set(L_FLAG_OFFSET, lspaObj.isLocalProtectionDesired()); + } + ByteArray.copyWhole(ByteArray.bitSetToBytes(flags, FLAGS_F_LENGTH), retBytes, FLAGS_F_OFFSET); + ByteArray.copyWhole(tlvs, retBytes, TLVS_F_OFFSET); + return ObjectUtil.formatSubobject(TYPE, CLASS, object.isProcessingRule(), object.isIgnore(), retBytes); + } + + public byte[] serializeTlvs(final Tlvs tlvs) { + if (tlvs == null) { + return new byte[0]; + } + int finalLength = 0; + byte[] nameBytes = null; + if (tlvs.getAugmentation(Tlvs2.class) != null) { + final Tlvs2 nameTlvs = tlvs.getAugmentation(Tlvs2.class); + if (nameTlvs.getSymbolicPathName() != null) { + nameBytes = serializeTlv(nameTlvs.getSymbolicPathName()); + finalLength += nameBytes.length; + } + } + int offset = 0; + final byte[] result = new byte[finalLength]; + if (nameBytes != null) { + ByteArray.copyWhole(nameBytes, result, offset); + offset += nameBytes.length; + } + return result; + } + + @Override + public int getObjectType() { + return TYPE; + } + + @Override + public int getObjectClass() { + return CLASS; + } +} diff --git a/pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/StatefulActivator.java b/pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/StatefulActivator.java index 85d78b075c..8417336f57 100644 --- a/pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/StatefulActivator.java +++ b/pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/StatefulActivator.java @@ -22,6 +22,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.cra import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.symbolic.path.name.tlv.SymbolicPathName; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcrep; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcreq; +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.open.object.Open; public class StatefulActivator extends AbstractPCEPExtensionProviderActivator { @@ -52,6 +53,10 @@ public class StatefulActivator extends AbstractPCEPExtensionProviderActivator { new PCEPOpenObjectParser(context.getTlvHandlerRegistry()))); regs.add(context.registerObjectSerializer(Open.class, new PCEPOpenObjectParser(context.getTlvHandlerRegistry()))); + regs.add(context.registerObjectParser(PCEPLspaObjectParser.CLASS, PCEPLspaObjectParser.TYPE, + new PCEPLspaObjectParser(context.getTlvHandlerRegistry()))); + regs.add(context.registerObjectSerializer(Lspa.class, new PCEPLspaObjectParser(context.getTlvHandlerRegistry()))); + regs.add(context.registerTlvParser(PCEStatefulCapabilityTlvParser.TYPE, new PCEStatefulCapabilityTlvParser())); regs.add(context.registerTlvSerializer(Stateful.class, new PCEStatefulCapabilityTlvParser())); diff --git a/pcep/ietf-stateful02/src/main/yang/odl-pcep-crabbe-initiated00.yang b/pcep/ietf-stateful02/src/main/yang/odl-pcep-crabbe-initiated00.yang index e46590f2de..802f036d6e 100644 --- a/pcep/ietf-stateful02/src/main/yang/odl-pcep-crabbe-initiated00.yang +++ b/pcep/ietf-stateful02/src/main/yang/odl-pcep-crabbe-initiated00.yang @@ -70,6 +70,10 @@ module odl-pcep-crabbe-initiated00 { default false; } } + + augment "/pcinitiate/pcinitiate-message/requests/lspa/tlvs" { + uses stateful02:symbolic-path-name-tlv; + } notification pcinitiate { uses pcinitiate-message; diff --git a/pcep/ietf-stateful02/src/main/yang/odl-pcep-ietf-stateful02.yang b/pcep/ietf-stateful02/src/main/yang/odl-pcep-ietf-stateful02.yang index 539f10d5f5..b455e0ca33 100644 --- a/pcep/ietf-stateful02/src/main/yang/odl-pcep-ietf-stateful02.yang +++ b/pcep/ietf-stateful02/src/main/yang/odl-pcep-ietf-stateful02.yang @@ -234,6 +234,10 @@ module odl-pcep-ietf-stateful02 { uses lsp-object; } + augment "/msg:pcreq/msg:pcreq-message/msg:requests/msg:segment-computation/msg:p2p/msg:lspa/msg:tlvs" { + uses symbolic-path-name-tlv; + } + augment "/nt:network-topology/nt:topology/nt:node/topo:path-computation-client/topo:reported-lsp" { uses lsp-object; } diff --git a/pcep/ietf-stateful02/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java b/pcep/ietf-stateful02/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java index 473dbb0762..143de6a34a 100644 --- a/pcep/ietf-stateful02/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java +++ b/pcep/ietf-stateful02/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java @@ -14,6 +14,8 @@ import java.io.IOException; import org.junit.Before; import org.junit.Test; import org.opendaylight.protocol.pcep.ietf.stateful02.PCEPOpenObjectParser; +import org.opendaylight.protocol.pcep.ietf.stateful02.PCEPLspaObjectParser; +import org.opendaylight.protocol.pcep.spi.ObjectHeaderImpl; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.TlvHandlerRegistry; import org.opendaylight.protocol.pcep.spi.pojo.ServiceLoaderPCEPExtensionProviderContext; @@ -27,8 +29,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.cra import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Tlvs2Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.stateful.capability.tlv.Stateful; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.stateful.capability.tlv.StatefulBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.symbolic.path.name.tlv.SymbolicPathName; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.symbolic.path.name.tlv.SymbolicPathNameBuilder; 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.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.rsvp.rev130820.AttributeFilter; public class PCEPObjectParserTest { @@ -70,6 +76,37 @@ public class PCEPObjectParserTest { // assertArrayEquals(result, parser.serializeObject(builder.build())); } + @Test + public void testLspaObjectWithTlv() throws IOException, PCEPDeserializerException { + final PCEPLspaObjectParser parser = new PCEPLspaObjectParser(this.tlvRegistry); + final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPLspaObject1LowerBounds.bin"); + + final LspaBuilder builder = new LspaBuilder(); + builder.setIgnore(false); + builder.setProcessingRule(false); + builder.setIncludeAny(new AttributeFilter(0l)); + builder.setExcludeAny(new AttributeFilter(0l)); + builder.setIncludeAll(new AttributeFilter(0l)); + builder.setSetupPriority((short) 0); + builder.setHoldPriority((short) 0); + builder.setLocalProtectionDesired(false); + + final SymbolicPathName tlv = new SymbolicPathNameBuilder().setPathName( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.SymbolicPathName(new byte[] { + (byte) 0x4d, (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x74, (byte) 0x65, (byte) 0x73, (byte) 0x74, + (byte) 0x20, (byte) 0x6f, (byte) 0x66, (byte) 0x20, (byte) 0x73, (byte) 0x79, (byte) 0x6d, (byte) 0x62, + (byte) 0x6f, (byte) 0x6c, (byte) 0x69, (byte) 0x63, (byte) 0x20, (byte) 0x6e, (byte) 0x61, (byte) 0x6d, (byte) 0x65 })).build(); + + builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.lspa.TlvsBuilder().addAugmentation( + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Tlvs2.class, + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Tlvs2Builder().setSymbolicPathName( + tlv).build()).build()); + // Tlvs container does not contain toString + // assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), + // ByteArray.cutBytes(result, 4))); + assertArrayEquals(result, parser.serializeObject(builder.build())); + } + @Test public void testLspObjectWithTLV() throws IOException, PCEPDeserializerException { // final PCEPLspObjectParser parser = new PCEPLspObjectParser(this.tlvRegistry); diff --git a/pcep/ietf-stateful02/src/test/resources/PCEPLspaObject1LowerBounds.bin b/pcep/ietf-stateful02/src/test/resources/PCEPLspaObject1LowerBounds.bin new file mode 100755 index 0000000000000000000000000000000000000000..881c7c2ffa24eafda93471abd33ec9d7f3a48342 GIT binary patch literal 52 rcmd-SU@&1o2Z9WezNsk+C8@ implements return; } } + LOG.debug("Saved LSP {} with name {}", id, name); this.lsps.put(id, name); Preconditions.checkState(name != null); @@ -311,6 +312,7 @@ public abstract class AbstractTopologySessionListener implements rlb.setMetadata(this.nodeState.getLspMetadata(name)); } + LOG.debug("Updating LSP to MD-SAL {}", rlb.build()); trans.putOperationalData(lspIdentifier(name).build(), rlb.build()); } diff --git a/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/Stateful02TopologySessionListener.java b/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/Stateful02TopologySessionListener.java index 44dbf5346e..b56fe6b159 100644 --- a/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/Stateful02TopologySessionListener.java +++ b/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/Stateful02TopologySessionListener.java @@ -26,6 +26,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.cra import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.ReportedLsp1Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.StatefulTlv1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.StatefulTlv1Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.SymbolicPathName; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Tlvs2; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.lsp.object.Lsp; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.lsp.object.LspBuilder; @@ -34,7 +35,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.cra import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.pcupd.message.pcupd.message.UpdatesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.pcupd.message.pcupd.message.updates.PathBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.stateful.capability.tlv.Stateful; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.symbolic.path.name.tlv.SymbolicPathNameBuilder; 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.lspa.object.LspaBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.lspa.TlvsBuilder; 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.topology.pcep.rev131024.AddLspArgs; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalInput; @@ -98,7 +102,8 @@ public class Stateful02TopologySessionListener extends AbstractTopologySessionLi for (final Reports r : rpt.getReports()) { final Lsp lsp = r.getLsp(); - if (!lsp.isSync()) { + final PlspId id = lsp.getPlspId(); + if (!lsp.isSync() && (id == null || id.getValue() == 0)) { stateSynchronizationAchieved(trans); continue; } @@ -107,19 +112,16 @@ public class Stateful02TopologySessionListener extends AbstractTopologySessionLi rlb.addAugmentation(ReportedLsp1.class, new ReportedLsp1Builder().setLsp(r.getLsp()).build()); boolean solicited = false; - final PlspId id = lsp.getPlspId(); if (id.getValue() != 0) { solicited = true; - if (lsp.isOperational()) { - final PCEPRequest req = removeRequest(id); - if (req != null) { - LOG.debug("Request {} resulted in LSP operational state {}", id, lsp.isOperational()); - rlb.setMetadata(req.getMetadata()); - req.setResult(OperationResults.SUCCESS); - } else { - LOG.warn("Request ID {} not found in outstanding DB", id); - } + final PCEPRequest req = removeRequest(id); + if (req != null) { + LOG.debug("Request {} resulted in LSP operational state {}", id, lsp.isOperational()); + rlb.setMetadata(req.getMetadata()); + req.setResult(OperationResults.SUCCESS); + } else { + LOG.warn("Request ID {} not found in outstanding DB", id); } } @@ -157,9 +159,16 @@ public class Stateful02TopologySessionListener extends AbstractTopologySessionLi return OperationResults.UNSENT.future(); } + final SymbolicPathNameBuilder name = new SymbolicPathNameBuilder().setPathName(new SymbolicPathName(input.getName().getBytes())); + // Build the request final RequestsBuilder rb = new RequestsBuilder(); rb.fieldsFrom(input.getArguments()); + rb.setLspa(new LspaBuilder().setTlvs( + new TlvsBuilder().addAugmentation( + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Tlvs2.class, + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Tlvs2Builder().setSymbolicPathName( + name.build()).build()).build()).build()); final PcinitiateMessageBuilder ib = new PcinitiateMessageBuilder(MESSAGE_HEADER); ib.setRequests(ImmutableList.of(rb.build())); -- 2.36.6