From a0884f2792c31a3a93fb1654ceea754b6c612920 Mon Sep 17 00:00:00 2001 From: Michal Cmarada Date: Fri, 15 Jun 2018 13:10:53 +0200 Subject: HC2VPP-288 - add readers for SRv6 module Changes: - add locator context to map locator name to locator IPv6Prefix - add readers for SRv6 module - implements reading of local sids and their end functions. - implements support for FIB table management (HC2VPP-345) Change-Id: Ib04402539a0b6666c5a1d0b4e1b5b5e08ccbf67b Signed-off-by: Michal Cmarada --- .../srv6/util/LocatorContextManagerImpl.java | 97 ++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/util/LocatorContextManagerImpl.java (limited to 'srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/util/LocatorContextManagerImpl.java') diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/util/LocatorContextManagerImpl.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/util/LocatorContextManagerImpl.java new file mode 100644 index 000000000..aba852dde --- /dev/null +++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/util/LocatorContextManagerImpl.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018 Bell Canada, Pantheon Technologies and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.hc2vpp.srv6.util; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.Optional; +import io.fd.honeycomb.translate.MappingContext; +import javax.annotation.Nonnull; +import javax.annotation.concurrent.ThreadSafe; +import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.locator.context.rev180605.Srv6LocatorContextAugmentation; +import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.locator.context.rev180605.srv6.locator.context.attributes.Srv6LocatorMappings; +import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.locator.context.rev180605.srv6.locator.context.attributes.srv6.locator.mappings.Srv6LocatorMapping; +import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.locator.context.rev180605.srv6.locator.context.attributes.srv6.locator.mappings.Srv6LocatorMappingBuilder; +import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.locator.context.rev180605.srv6.locator.context.attributes.srv6.locator.mappings.Srv6LocatorMappingKey; +import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.Contexts; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; + +/** + * Facade on top of {@link MappingContext} that manages {@link Srv6LocatorMappings}. + */ +@ThreadSafe +public final class LocatorContextManagerImpl implements LocatorContextManager { + private static final String SLASH = "/"; + private final InstanceIdentifier ctxIid; + private final Integer defaultLocatorLength; + + public LocatorContextManagerImpl(@Nonnull final Integer defaultLocatorLength) { + checkArgument(defaultLocatorLength > 0 && defaultLocatorLength < 128, + "defaultLocatorLength is out of range(1-127)."); + this.defaultLocatorLength = checkNotNull(defaultLocatorLength, "defaultLocatorLength should not be null"); + + this.ctxIid = InstanceIdentifier.create(Contexts.class) + .augmentation(Srv6LocatorContextAugmentation.class) + .child(Srv6LocatorMappings.class); + } + + @Override + public void addLocator(@Nonnull final String name, @Nonnull Ipv6Prefix ipv6Prefix, + @Nonnull final MappingContext ctx) { + final KeyedInstanceIdentifier mappingIid = getLocatorIid(name); + final Srv6LocatorMappingBuilder builder = new Srv6LocatorMappingBuilder() + .setKey(new Srv6LocatorMappingKey(name)).setPrefix(ipv6Prefix).setName(name); + ctx.put(mappingIid, builder.build()); + } + + @Override + public boolean containsLocator(@Nonnull final String name, @Nonnull final MappingContext ctx) { + final Optional read = ctx.read(getLocatorIid(name)); + return read.isPresent(); + } + + @Override + public Ipv6Prefix getLocator(@Nonnull final String name, @Nonnull final MappingContext ctx) { + final Optional read = ctx.read(getLocatorIid(name)); + if (read.isPresent()) { + return read.get().getPrefix(); + } + + // construct artificial mapping with default locator length + Ipv6Prefix ipv6Prefix = new Ipv6Prefix(getArtificialName(name)); + addLocator(getArtificialName(name), ipv6Prefix, ctx); + return ipv6Prefix; + } + + @Override + public void removeLocator(@Nonnull final String name, @Nonnull final MappingContext ctx) { + ctx.delete(getLocatorIid(name)); + } + + private KeyedInstanceIdentifier getLocatorIid( + @Nonnull final String locator) { + return ctxIid.child(Srv6LocatorMapping.class, new Srv6LocatorMappingKey(locator)); + } + + private synchronized String getArtificialName(String name) { + return name + SLASH + defaultLocatorLength; + } + +} -- cgit 1.2.3-korg