94b19996b7712de0c8d6b522bd79efc586619f71
[hc2vpp.git] /
1 /*
2  * Copyright (c) 2017 Cisco and/or its affiliates.
3  *
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:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package io.fd.hc2vpp.lisp.gpe.translate.ctx;
18
19 import static java.lang.String.format;
20
21 import io.fd.honeycomb.translate.MappingContext;
22 import java.util.Collections;
23 import javax.annotation.Nonnull;
24 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.gpe.locator.pair.identification.context.rev170517.GpeLocatorPairIdentificationCtxAugmentation;
25 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;
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.gpe.locator.pair.identification.contexts.GpeLocatorPairIdentification;
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.GpeLocatorPairIdentificationKey;
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.gpe.locator.pair.identification.Mappings;
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.Mapping;
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.MappingBuilder;
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.MappingKey;
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.mapping.LocatorPairMapping;
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.LocatorPairMappingBuilder;
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.locator.pair.mapping.PairBuilder;
35 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.Contexts;
36 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
37 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
40
41 public class GpeLocatorPairMappingContextImpl implements GpeLocatorPairMappingContext {
42
43     private static final Logger LOG = LoggerFactory.getLogger(GpeLocatorPairMappingContextImpl.class);
44
45     private final KeyedInstanceIdentifier<GpeLocatorPairIdentification, GpeLocatorPairIdentificationKey>
46             namingContextIid;
47
48     public GpeLocatorPairMappingContextImpl(@Nonnull final String instanceName) {
49         namingContextIid = InstanceIdentifier.create(Contexts.class)
50                 .augmentation(GpeLocatorPairIdentificationCtxAugmentation.class)
51                 .child(GpeLocatorPairIdentificationContexts.class)
52                 .child(GpeLocatorPairIdentification.class, new GpeLocatorPairIdentificationKey(instanceName));
53     }
54
55
56     @Override
57     public void addMapping(@Nonnull final String entryId,
58                            @Nonnull final String locatorId,
59                            @Nonnull final GpeLocatorPair pair,
60                            @Nonnull final MappingContext mappingContext) {
61         LOG.debug("Adding mapping for Gpe entry to locator id[entry-id={},locator-pair-id={}]", entryId, locatorId);
62         mappingContext.merge(getMappingId(entryId), getMappingData(entryId, locatorId, pair));
63         LOG.debug("Mapping for Gpe entry to locator id[entry-id={},locator-pair-id={}] successfully added", entryId,
64                 locatorId);
65     }
66
67     @Override
68     public void removeMapping(@Nonnull final String entryId,
69                               @Nonnull final MappingContext mappingContext) {
70         LOG.debug("Removing all mappings for Gpe entry[id={}]", entryId);
71         mappingContext.delete(getMappingId(entryId));
72         LOG.debug("All mappings for Gpe entry[id={}] removed", entryId);
73     }
74
75     @Override
76     public LocatorPairMapping getMapping(@Nonnull final String entryId,
77                                          @Nonnull final GpeLocatorPair pair,
78                                          @Nonnull final MappingContext mappingContext) {
79         return mappingContext.read(getMappingId(entryId))
80                 .or(new MappingBuilder().setLocatorPairMapping(Collections.emptyList()).build())
81                 .getLocatorPairMapping()
82                 .stream()
83                 .filter(mapping -> pair.isSame(mapping.getPair()))
84                 .findAny().orElseGet(() -> {
85                     final String artificialLocatorId = artificialLocatorPairId(entryId, pair);
86                     addMapping(entryId, artificialLocatorId, pair, mappingContext);
87                     return getMapping(entryId, artificialLocatorId, mappingContext);
88                 });
89     }
90
91     @Override
92     public LocatorPairMapping getMapping(@Nonnull final String entryId,
93                                          @Nonnull final String locatorId,
94                                          @Nonnull final MappingContext mappingContext) {
95         return mappingContext.read(getMappingId(entryId))
96                 .or(new MappingBuilder().setLocatorPairMapping(Collections.emptyList()).build())
97                 .getLocatorPairMapping()
98                 .stream()
99                 .filter(mapping -> mapping.getId().equals(locatorId))
100                 .findAny().orElseThrow(() -> new IllegalArgumentException(
101                         format("No mapping for entry %s|locator %s", entryId, locatorId)));
102     }
103
104     private String artificialLocatorPairId(final String entryId, final GpeLocatorPair pair) {
105         return format("%s_%s_%s", entryId, pair.getLocalAddress(), pair.getRemoteAddress());
106     }
107
108     private Mapping getMappingData(final String entryId,
109                                    final String locatorId,
110                                    final GpeLocatorPair identifier) {
111         return new MappingBuilder()
112                 .setId(entryId)
113                 .setLocatorPairMapping(Collections.singletonList(new LocatorPairMappingBuilder()
114                         .setId(locatorId)
115                         .setPair(new PairBuilder()
116                                 .setLocalAddress(identifier.getLocalAddress())
117                                 .setRemoteAddress(identifier.getRemoteAddress())
118                                 .build())
119                         .build())).build();
120     }
121
122     private KeyedInstanceIdentifier<Mapping, MappingKey> getMappingId(final String id) {
123         return namingContextIid.child(Mappings.class)
124                 .child(Mapping.class, new MappingKey(id));
125     }
126 }
127