2 * Copyright (c) 2017 Cisco and/or its affiliates.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package io.fd.hc2vpp.lisp.gpe.translate.ctx;
19 import static java.lang.String.format;
21 import io.fd.honeycomb.translate.MappingContext;
22 import io.fd.honeycomb.translate.util.RWUtils;
23 import java.util.Collections;
24 import javax.annotation.Nonnull;
25 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.gpe.locator.pair.identification.context.rev170517.GpeLocatorPairIdentificationCtxAugmentation;
26 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.gpe.locator.pair.identification.context.rev170517.gpe.locator.pair.identification.context.attributes.GpeLocatorPairIdentificationContexts;
27 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.gpe.locator.pair.identification.context.rev170517.gpe.locator.pair.identification.context.attributes.gpe.locator.pair.identification.contexts.GpeLocatorPairIdentification;
28 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.gpe.locator.pair.identification.context.rev170517.gpe.locator.pair.identification.context.attributes.gpe.locator.pair.identification.contexts.GpeLocatorPairIdentificationKey;
29 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.gpe.locator.pair.identification.context.rev170517.gpe.locator.pair.identification.context.attributes.gpe.locator.pair.identification.contexts.gpe.locator.pair.identification.Mappings;
30 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.gpe.locator.pair.identification.context.rev170517.gpe.locator.pair.identification.context.attributes.gpe.locator.pair.identification.contexts.gpe.locator.pair.identification.mappings.Mapping;
31 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.gpe.locator.pair.identification.context.rev170517.gpe.locator.pair.identification.context.attributes.gpe.locator.pair.identification.contexts.gpe.locator.pair.identification.mappings.MappingBuilder;
32 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.gpe.locator.pair.identification.context.rev170517.gpe.locator.pair.identification.context.attributes.gpe.locator.pair.identification.contexts.gpe.locator.pair.identification.mappings.MappingKey;
33 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.gpe.locator.pair.identification.context.rev170517.gpe.locator.pair.identification.context.attributes.gpe.locator.pair.identification.contexts.gpe.locator.pair.identification.mappings.mapping.LocatorPairMapping;
34 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.gpe.locator.pair.identification.context.rev170517.gpe.locator.pair.identification.context.attributes.gpe.locator.pair.identification.contexts.gpe.locator.pair.identification.mappings.mapping.LocatorPairMappingBuilder;
35 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.gpe.locator.pair.identification.context.rev170517.gpe.locator.pair.identification.context.attributes.gpe.locator.pair.identification.contexts.gpe.locator.pair.identification.mappings.mapping.locator.pair.mapping.PairBuilder;
36 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.Contexts;
37 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
38 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
42 public class GpeLocatorPairMappingContextImpl implements GpeLocatorPairMappingContext {
44 private static final Logger LOG = LoggerFactory.getLogger(GpeLocatorPairMappingContextImpl.class);
46 private final KeyedInstanceIdentifier<GpeLocatorPairIdentification, GpeLocatorPairIdentificationKey>
49 public GpeLocatorPairMappingContextImpl(@Nonnull final String instanceName) {
50 namingContextIid = InstanceIdentifier.create(Contexts.class)
51 .augmentation(GpeLocatorPairIdentificationCtxAugmentation.class)
52 .child(GpeLocatorPairIdentificationContexts.class)
53 .child(GpeLocatorPairIdentification.class, new GpeLocatorPairIdentificationKey(instanceName));
58 public void addMapping(@Nonnull final String entryId,
59 @Nonnull final String locatorId,
60 @Nonnull final GpeLocatorPair pair,
61 @Nonnull final MappingContext mappingContext) {
62 LOG.debug("Adding mapping for Gpe entry to locator id[entry-id={},locator-pair-id={}]", entryId, locatorId);
63 mappingContext.merge(getMappingId(entryId), getMappingData(entryId, locatorId, pair));
64 LOG.debug("Mapping for Gpe entry to locator id[entry-id={},locator-pair-id={}] successfully added", entryId,
69 public void removeMapping(@Nonnull final String entryId,
70 @Nonnull final MappingContext mappingContext) {
71 LOG.debug("Removing all mappings for Gpe entry[id={}]", entryId);
72 mappingContext.delete(getMappingId(entryId));
73 LOG.debug("All mappings for Gpe entry[id={}] removed", entryId);
77 public LocatorPairMapping getMapping(@Nonnull final String entryId,
78 @Nonnull final GpeLocatorPair pair,
79 @Nonnull final MappingContext mappingContext) {
81 if (!contains(entryId, pair, mappingContext)) {
82 final String artificialLocatorId = artificialLocatorPairId(entryId, pair);
83 addMapping(entryId, artificialLocatorId, pair, mappingContext);
84 return getMapping(entryId, artificialLocatorId, mappingContext);
87 return mappingContext.read(getMappingId(entryId))
88 .or(new MappingBuilder().setLocatorPairMapping(Collections.emptyList()).build())
89 .getLocatorPairMapping()
91 .filter(mapping -> pair.isSame(mapping.getPair()))
92 .collect(RWUtils.singleItemCollector());
95 private boolean contains(final String entryId,
96 final GpeLocatorPair pair,
97 final MappingContext mappingContext) {
98 return mappingContext.read(getMappingId(entryId))
99 .or(new MappingBuilder().setLocatorPairMapping(Collections.emptyList()).build())
100 .getLocatorPairMapping()
102 .anyMatch(mapping -> pair.isSame(mapping.getPair()));
106 public LocatorPairMapping getMapping(@Nonnull final String entryId,
107 @Nonnull final String locatorId,
108 @Nonnull final MappingContext mappingContext) {
109 return mappingContext.read(getMappingId(entryId))
110 .or(new MappingBuilder().setLocatorPairMapping(Collections.emptyList()).build())
111 .getLocatorPairMapping()
113 .filter(mapping -> mapping.getId().equals(locatorId))
114 .findAny().orElseThrow(() -> new IllegalArgumentException(
115 format("No mapping for entry %s|locator %s", entryId, locatorId)));
118 private String artificialLocatorPairId(final String entryId, final GpeLocatorPair pair) {
119 return format("%s_%s_%s", entryId, pair.getLocalAddress(), pair.getRemoteAddress());
122 private Mapping getMappingData(final String entryId,
123 final String locatorId,
124 final GpeLocatorPair identifier) {
125 return new MappingBuilder()
127 .setLocatorPairMapping(Collections.singletonList(new LocatorPairMappingBuilder()
129 .setPair(new PairBuilder()
130 .setLocalAddress(identifier.getLocalAddress())
131 .setRemoteAddress(identifier.getRemoteAddress())
136 private KeyedInstanceIdentifier<Mapping, MappingKey> getMappingId(final String id) {
137 return namingContextIid.child(Mappings.class)
138 .child(Mapping.class, new MappingKey(id));