a7d84d2b60f4c6f0e9a047d4d6ec0ba989480753
[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 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;
41
42 public class GpeLocatorPairMappingContextImpl implements GpeLocatorPairMappingContext {
43
44     private static final Logger LOG = LoggerFactory.getLogger(GpeLocatorPairMappingContextImpl.class);
45
46     private final KeyedInstanceIdentifier<GpeLocatorPairIdentification, GpeLocatorPairIdentificationKey>
47             namingContextIid;
48
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));
54     }
55
56
57     @Override
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,
65                 locatorId);
66     }
67
68     @Override
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);
74     }
75
76     @Override
77     public LocatorPairMapping getMapping(@Nonnull final String entryId,
78                                          @Nonnull final GpeLocatorPair pair,
79                                          @Nonnull final MappingContext mappingContext) {
80
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);
85         }
86
87         return mappingContext.read(getMappingId(entryId))
88                 .or(new MappingBuilder().setLocatorPairMapping(Collections.emptyList()).build())
89                 .getLocatorPairMapping()
90                 .stream()
91                 .filter(mapping -> pair.isSame(mapping.getPair()))
92                 .collect(RWUtils.singleItemCollector());
93     }
94
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()
101                 .stream()
102                 .anyMatch(mapping -> pair.isSame(mapping.getPair()));
103     }
104
105     @Override
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()
112                 .stream()
113                 .filter(mapping -> mapping.getId().equals(locatorId))
114                 .findAny().orElseThrow(() -> new IllegalArgumentException(
115                         format("No mapping for entry %s|locator %s", entryId, locatorId)));
116     }
117
118     private String artificialLocatorPairId(final String entryId, final GpeLocatorPair pair) {
119         return format("%s_%s_%s", entryId, pair.getLocalAddress(), pair.getRemoteAddress());
120     }
121
122     private Mapping getMappingData(final String entryId,
123                                    final String locatorId,
124                                    final GpeLocatorPair identifier) {
125         return new MappingBuilder()
126                 .setId(entryId)
127                 .setLocatorPairMapping(Collections.singletonList(new LocatorPairMappingBuilder()
128                         .setId(locatorId)
129                         .setPair(new PairBuilder()
130                                 .setLocalAddress(identifier.getLocalAddress())
131                                 .setRemoteAddress(identifier.getRemoteAddress())
132                                 .build())
133                         .build())).build();
134     }
135
136     private KeyedInstanceIdentifier<Mapping, MappingKey> getMappingId(final String id) {
137         return namingContextIid.child(Mappings.class)
138                 .child(Mapping.class, new MappingKey(id));
139     }
140 }
141