diff options
Diffstat (limited to 'nat/nat2vpp/src/main/java/io/fd/honeycomb/nat/read/ifc/InterfaceInboundNatCustomizer.java')
-rw-r--r-- | nat/nat2vpp/src/main/java/io/fd/honeycomb/nat/read/ifc/InterfaceInboundNatCustomizer.java | 112 |
1 files changed, 100 insertions, 12 deletions
diff --git a/nat/nat2vpp/src/main/java/io/fd/honeycomb/nat/read/ifc/InterfaceInboundNatCustomizer.java b/nat/nat2vpp/src/main/java/io/fd/honeycomb/nat/read/ifc/InterfaceInboundNatCustomizer.java index 5be35ce16..52467a19a 100644 --- a/nat/nat2vpp/src/main/java/io/fd/honeycomb/nat/read/ifc/InterfaceInboundNatCustomizer.java +++ b/nat/nat2vpp/src/main/java/io/fd/honeycomb/nat/read/ifc/InterfaceInboundNatCustomizer.java @@ -17,39 +17,127 @@ package io.fd.honeycomb.nat.read.ifc; import io.fd.honeycomb.translate.read.ReadContext; -import io.fd.honeycomb.translate.read.ReadFailedException; -import io.fd.honeycomb.translate.spi.read.ReaderCustomizer; +import io.fd.honeycomb.translate.spi.read.Initialized; +import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager; +import io.fd.honeycomb.translate.vpp.util.NamingContext; +import io.fd.vpp.jvpp.snat.dto.SnatInterfaceDetails; +import io.fd.vpp.jvpp.snat.dto.SnatInterfaceDetailsReplyDump; import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev161214.NatInterfaceAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev161214._interface.nat.attributes.Nat; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev161214._interface.nat.attributes.NatBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev161214._interface.nat.attributes.nat.Inbound; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev161214._interface.nat.attributes.nat.InboundBuilder; import org.opendaylight.yangtools.concepts.Builder; +import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class InterfaceInboundNatCustomizer implements ReaderCustomizer<Inbound, InboundBuilder> { +final class InterfaceInboundNatCustomizer extends AbstractInterfaceNatCustomizer<Inbound, InboundBuilder> { private static final Logger LOG = LoggerFactory.getLogger(InterfaceInboundNatCustomizer.class); - @Nonnull + InterfaceInboundNatCustomizer( + @Nonnull final DumpCacheManager<SnatInterfaceDetailsReplyDump, Void> dumpMgr, + @Nonnull final NamingContext ifcContext) { + super(dumpMgr, ifcContext); + } + @Override - public InboundBuilder getBuilder(@Nonnull final InstanceIdentifier<Inbound> id) { - return new InboundBuilder(); + protected Logger getLog() { + return LOG; } @Override - public void readCurrentAttributes(@Nonnull final InstanceIdentifier<Inbound> id, - @Nonnull final InboundBuilder builder, - @Nonnull final ReadContext ctx) - throws ReadFailedException { - // FIXME HONEYCOMB-248 VPP-459 Implement when read is available in VPP/Snat - LOG.debug("Unable to read Inbound NAT feature state for an interface"); + void setBuilderPresence(@Nonnull final InboundBuilder builder) { + ((PresenceInboundBuilder) builder).setPresent(true); + } + + @Override + boolean isExpectedNatType(final SnatInterfaceDetails snatInterfaceDetails) { + return snatInterfaceDetails.isInside == 1; + } + + @Nonnull + @Override + public InboundBuilder getBuilder(@Nonnull final InstanceIdentifier<Inbound> id) { + // Return not present value by default + return new PresenceInboundBuilder(false); } @Override public void merge(@Nonnull final Builder<? extends DataObject> parentBuilder, @Nonnull final Inbound readValue) { ((NatBuilder) parentBuilder).setInbound(readValue); } + + @Nonnull + @Override + public Initialized<? extends DataObject> init(@Nonnull final InstanceIdentifier<Inbound> id, + @Nonnull final Inbound readValue, + @Nonnull final ReadContext ctx) { + final InstanceIdentifier<Inbound> cfgId = + InstanceIdentifier.create(Interfaces.class) + .child(Interface.class, + new InterfaceKey(id.firstKeyOf( + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.class).getName())) + .augmentation(NatInterfaceAugmentation.class) + .child(Nat.class) + .child(Inbound.class); + return Initialized.create(cfgId, readValue); + } + + // TODO HONEYCOMB-270, make this better, having to fake a builder + value is just exploitation. + + /** + * Special Builder to also propagate empty container into the resulting data. + */ + private static final class PresenceInboundBuilder extends InboundBuilder { + + private volatile boolean isPresent = false; + + PresenceInboundBuilder(final boolean isPresent) { + this.isPresent = isPresent; + } + + void setPresent(final boolean present) { + this.isPresent = present; + } + + @Override + public Inbound build() { + return isPresent + ? super.build() + : NotPresentInbound.NOT_PRESENT_INBOUND; + } + } + + /** + * Fake container that returns false on equals. + */ + private static final class NotPresentInbound implements Inbound { + + private static final NotPresentInbound NOT_PRESENT_INBOUND = new NotPresentInbound(); + + @Override + public <E extends Augmentation<Inbound>> E getAugmentation(final Class<E> augmentationType) { + throw new UnsupportedOperationException(); + } + + @Override + public Class<? extends DataContainer> getImplementedInterface() { + return Inbound.class; + } + + @Override + public boolean equals(final Object obj) { + // This is necessary to fake this.equals(something) + return obj == NOT_PRESENT_INBOUND; + } + } } |