diff options
author | Marek Gradzki <mgradzki@cisco.com> | 2016-12-14 06:43:26 +0100 |
---|---|---|
committer | Marek Gradzki <mgradzki@cisco.com> | 2016-12-14 12:29:58 +0100 |
commit | 01619036de54215d1d6d03dd033abfc1f9bdfdf5 (patch) | |
tree | 2fae299e09d86303c60523c2876eb17a5fb8aa67 | |
parent | bbdedfea03d7977165c662fdbb9c4df645df3708 (diff) |
HONEYCOMB-314: expose tag for tap and vlan interfaces
It is possible that interface creation for will succeed in VPP,
but Honeycomb crashes or request timeouts. In such situations, interface name
stored in Honeycomb's cache will not be updated. After restarting Honeycomb,
interface name will be generated.
In such cases Honeycomb user can use tag to identify interface.
Change-Id: I673c52e49dc788c761af471399d2ac839f62be04
Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
7 files changed, 56 insertions, 7 deletions
diff --git a/v3po/api/src/main/yang/v3po.yang b/v3po/api/src/main/yang/v3po.yang index d1af6114c..828a095b0 100644 --- a/v3po/api/src/main/yang/v3po.yang +++ b/v3po/api/src/main/yang/v3po.yang @@ -257,12 +257,24 @@ module v3po { } } + grouping interface-tag { + leaf tag { + type string { + length 1..63; + } + description + "ASCII string placeholder for interface metadata. Value is stored in vpp, + and returned in read requests. No processing involved."; + } + } + grouping tap-interface-base-attributes { leaf tap-name { type string{ pattern "[a-zA-Z0-9\-;.+@$#^&*!_()=\[\]]*"; } } + uses interface-tag; } grouping tap-interface-config-attributes { @@ -335,6 +347,7 @@ module v3po { type vhost-user-role; default "server"; } + uses interface-tag; description "vhost-user settings"; } diff --git a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces/TapCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces/TapCustomizer.java index 220fb95e8..a22a0d429 100644 --- a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces/TapCustomizer.java +++ b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces/TapCustomizer.java @@ -29,6 +29,7 @@ import io.fd.vpp.jvpp.core.dto.TapDeleteReply; import io.fd.vpp.jvpp.core.dto.TapModify; import io.fd.vpp.jvpp.core.dto.TapModifyReply; import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import java.nio.charset.StandardCharsets; import java.util.concurrent.CompletionStage; import javax.annotation.Nonnull; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType; @@ -98,7 +99,7 @@ public class TapCustomizer extends AbstractInterfaceTypeCustomizer<Tap> implemen final WriteContext writeContext) throws WriteFailedException { LOG.debug("Setting tap interface: {}. Tap: {}", swIfName, tap); final CompletionStage<TapConnectReply> tapConnectFuture = getFutureJVpp() - .tapConnect(getTapConnectRequest(tap.getTapName(), tap.getMac(), tap.getDeviceInstance())); + .tapConnect(getTapConnectRequest(tap)); final TapConnectReply reply = getReplyForCreate(tapConnectFuture.toCompletableFuture(), id, tap); LOG.debug("Tap set successfully for: {}, tap: {}", swIfName, tap); // Add new interface to our interface context @@ -128,10 +129,11 @@ public class TapCustomizer extends AbstractInterfaceTypeCustomizer<Tap> implemen interfaceContext.removeName(swIfName, writeContext.getMappingContext()); } - private TapConnect getTapConnectRequest(final String tapName, final PhysAddress mac, final Long deviceInstance) { + private TapConnect getTapConnectRequest(final Tap tap) { final TapConnect tapConnect = new TapConnect(); - tapConnect.tapName = tapName.getBytes(); + tapConnect.tapName = tap.getTapName().getBytes(); + final PhysAddress mac = tap.getMac(); if (mac == null) { tapConnect.useRandomMac = 1; tapConnect.macAddress = new byte[6]; @@ -140,6 +142,7 @@ public class TapCustomizer extends AbstractInterfaceTypeCustomizer<Tap> implemen tapConnect.macAddress = parseMac(mac.getValue()); } + final Long deviceInstance = tap.getDeviceInstance(); if (deviceInstance == null) { tapConnect.renumber = 0; } else { @@ -147,6 +150,11 @@ public class TapCustomizer extends AbstractInterfaceTypeCustomizer<Tap> implemen tapConnect.customDevInstance = Math.toIntExact(deviceInstance); } + final String tag = tap.getTag(); + if (tag != null) { + tapConnect.tag = tag.getBytes(StandardCharsets.US_ASCII); + } + return tapConnect; } diff --git a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces/VhostUserCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces/VhostUserCustomizer.java index 152e6d1c0..ba869b347 100644 --- a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces/VhostUserCustomizer.java +++ b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces/VhostUserCustomizer.java @@ -30,6 +30,7 @@ import io.fd.vpp.jvpp.core.dto.DeleteVhostUserIfReply; import io.fd.vpp.jvpp.core.dto.ModifyVhostUserIf; import io.fd.vpp.jvpp.core.dto.ModifyVhostUserIfReply; import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import java.nio.charset.StandardCharsets; import java.util.concurrent.CompletionStage; import javax.annotation.Nonnull; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType; @@ -92,6 +93,10 @@ public class VhostUserCustomizer extends AbstractInterfaceTypeCustomizer<VhostUs request.renumber = 1; request.customDevInstance = Math.toIntExact(deviceInstance); } + final String tag = vhostUser.getTag(); + if (tag != null) { + request.tag = tag.getBytes(StandardCharsets.US_ASCII); + } request.useCustomMac = 0; request.macAddress = new byte[]{}; return request; diff --git a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfacesstate/TapCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfacesstate/TapCustomizer.java index 683450da3..5cfd05859 100644 --- a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfacesstate/TapCustomizer.java +++ b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfacesstate/TapCustomizer.java @@ -16,14 +16,14 @@ package io.fd.hc2vpp.v3po.interfacesstate; +import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; +import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; +import io.fd.hc2vpp.common.translate.util.NamingContext; import io.fd.honeycomb.translate.read.ReadContext; import io.fd.honeycomb.translate.read.ReadFailedException; import io.fd.honeycomb.translate.spi.read.Initialized; import io.fd.honeycomb.translate.spi.read.InitializingReaderCustomizer; import io.fd.honeycomb.translate.util.RWUtils; -import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; -import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; -import io.fd.hc2vpp.common.translate.util.NamingContext; import io.fd.vpp.jvpp.core.dto.SwInterfaceDetails; import io.fd.vpp.jvpp.core.dto.SwInterfaceTapDetails; import io.fd.vpp.jvpp.core.dto.SwInterfaceTapDetailsReplyDump; @@ -114,13 +114,20 @@ public class TapCustomizer extends FutureJVppCustomizer LOG.trace("Tap interface: {} attributes returned from VPP: {}", key.getName(), swInterfaceTapDetails); builder.setTapName(toString(swInterfaceTapDetails.devName)); + + final SwInterfaceDetails ifcDetails = getVppInterfaceDetails(getFutureJVpp(), id, key.getName(), + interfaceContext.getIndex(key.getName(), ctx.getMappingContext()), ctx.getModificationCache(), LOG); + + if (ifcDetails.tag[0] != 0) { // tag supplied + builder.setTag(toString(ifcDetails.tag)); + } LOG.debug("Tap interface: {}, id: {} attributes read as: {}", key.getName(), index, builder); } @Override public Initialized<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.Tap> init( @Nonnull final InstanceIdentifier<Tap> id, @Nonnull final Tap readValue, @Nonnull final ReadContext ctx) { - // The MAC address is set from interface details, those details are retrieved from cache + // The MAC address & tag is set from interface details, those details are retrieved from cache final InterfaceKey key = id.firstKeyOf(Interface.class); final int index = interfaceContext.getIndex(key.getName(), ctx.getMappingContext()); final SwInterfaceDetails ifcDetails = @@ -130,6 +137,7 @@ public class TapCustomizer extends FutureJVppCustomizer new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.TapBuilder() .setMac(new PhysAddress(vppPhysAddrToYang(ifcDetails.l2Address))) .setTapName(readValue.getTapName()) + .setTag(ifcDetails.tag[0] == 0 ? null : toString(ifcDetails.tag)) // tapBuilder.setDeviceInstance(); .build()); } diff --git a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfacesstate/VhostUserCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfacesstate/VhostUserCustomizer.java index 6a918e842..623c7dbfa 100644 --- a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfacesstate/VhostUserCustomizer.java +++ b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfacesstate/VhostUserCustomizer.java @@ -24,6 +24,7 @@ import io.fd.honeycomb.translate.util.RWUtils; import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; import io.fd.hc2vpp.common.translate.util.NamingContext; +import io.fd.vpp.jvpp.core.dto.SwInterfaceDetails; import io.fd.vpp.jvpp.core.dto.SwInterfaceVhostUserDetails; import io.fd.vpp.jvpp.core.dto.SwInterfaceVhostUserDetailsReplyDump; import io.fd.vpp.jvpp.core.dto.SwInterfaceVhostUserDump; @@ -120,6 +121,9 @@ public class VhostUserCustomizer extends FutureJVppCustomizer LOG.trace("Vhost user interface: {} attributes returned from VPP: {}", key.getName(), swInterfaceVhostUserDetails); + final SwInterfaceDetails ifcDetails = getVppInterfaceDetails(getFutureJVpp(), id, key.getName(), + interfaceContext.getIndex(key.getName(), ctx.getMappingContext()), ctx.getModificationCache(), LOG); + builder.setRole(swInterfaceVhostUserDetails.isServer == 1 ? VhostUserRole.Server : VhostUserRole.Client); @@ -129,6 +133,9 @@ public class VhostUserCustomizer extends FutureJVppCustomizer builder.setVirtioNetHdrSize((long) swInterfaceVhostUserDetails.virtioNetHdrSz); // TODO: map error code to meaningful message after VPP-436 is done builder.setConnectError(Integer.toString(swInterfaceVhostUserDetails.sockErrno)); + if (ifcDetails.tag[0] != 0) { // tag supplied + builder.setTag(toString(ifcDetails.tag)); + } LOG.debug("Vhost user interface: {}, id: {} attributes read as: {}", key.getName(), index, builder); } @@ -138,10 +145,16 @@ public class VhostUserCustomizer extends FutureJVppCustomizer @Nonnull final InstanceIdentifier<VhostUser> id, @Nonnull final VhostUser readValue, @Nonnull final ReadContext ctx) { + // The tag is set from interface details, those details are retrieved from cache + final InterfaceKey key = id.firstKeyOf(Interface.class); + final int index = interfaceContext.getIndex(key.getName(), ctx.getMappingContext()); + final SwInterfaceDetails ifcDetails = + InterfaceCustomizer.getCachedInterfaceDump(ctx.getModificationCache()).get(index); return Initialized.create(getCfgId(id), new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.VhostUserBuilder() .setRole(readValue.getRole()) .setSocket(readValue.getSocket()) + .setTag(ifcDetails.tag[0] == 0 ? null : toString(ifcDetails.tag)) .build()); } diff --git a/v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/interfacesstate/TapCustomizerTest.java b/v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/interfacesstate/TapCustomizerTest.java index c9de7102a..5927797be 100644 --- a/v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/interfacesstate/TapCustomizerTest.java +++ b/v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/interfacesstate/TapCustomizerTest.java @@ -65,6 +65,7 @@ public class TapCustomizerTest extends ReaderCustomizerTest<Tap, TapBuilder> imp final SwInterfaceDetails details = new SwInterfaceDetails(); details.swIfIndex = IF_INDEX; details.interfaceName = IF_NAME.getBytes(); + details.tag = new byte[64]; return details; } diff --git a/v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/interfacesstate/VhostUserCustomizerTest.java b/v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/interfacesstate/VhostUserCustomizerTest.java index 57655db73..ac517e052 100644 --- a/v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/interfacesstate/VhostUserCustomizerTest.java +++ b/v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/interfacesstate/VhostUserCustomizerTest.java @@ -67,6 +67,7 @@ public class VhostUserCustomizerTest extends ReaderCustomizerTest<VhostUser, Vho final SwInterfaceDetails details = new SwInterfaceDetails(); details.swIfIndex = IF_INDEX; details.interfaceName = IF_NAME.getBytes(); + details.tag = new byte[64]; return details; } |