9e9152ce09e395e91b56b9bca768ca7f80b97d0d
[honeycomb.git] / lisp / lisp2vpp / src / main / java / io / fd / honeycomb / lisp / translate / write / factory / VniTableWriterFactory.java
1 /*
2  * Copyright (c) 2016 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.honeycomb.lisp.translate.write.factory;
18
19 import static com.google.common.base.Preconditions.checkNotNull;
20
21 import com.google.common.collect.ImmutableSet;
22 import io.fd.honeycomb.lisp.context.util.AdjacenciesMappingContext;
23 import io.fd.honeycomb.lisp.context.util.EidMappingContext;
24 import io.fd.honeycomb.lisp.translate.write.AdjacencyCustomizer;
25 import io.fd.honeycomb.lisp.translate.write.BridgeDomainSubtableCustomizer;
26 import io.fd.honeycomb.lisp.translate.write.LocalMappingCustomizer;
27 import io.fd.honeycomb.lisp.translate.write.RemoteMappingCustomizer;
28 import io.fd.honeycomb.lisp.translate.write.VniTableCustomizer;
29 import io.fd.honeycomb.lisp.translate.write.VrfSubtableCustomizer;
30 import io.fd.honeycomb.translate.impl.write.GenericListWriter;
31 import io.fd.honeycomb.translate.impl.write.GenericWriter;
32 import io.fd.honeycomb.translate.vpp.util.NamingContext;
33 import io.fd.honeycomb.translate.write.WriterFactory;
34 import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder;
35 import io.fd.vpp.jvpp.core.future.FutureJVppCore;
36 import javax.annotation.Nonnull;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.Lisp;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.Adjacencies;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.adjacencies.Adjacency;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.adjacencies.adjacency.LocalEid;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.adjacencies.adjacency.RemoteEid;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.LocalMappings;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.RemoteMappings;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.local.mappings.LocalMapping;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.remote.mappings.RemoteMapping;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.remote.mappings.remote.mapping.locator.list.negative.mapping.MapReply;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.remote.mappings.remote.mapping.locator.list.positive.mapping.Rlocs;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.remote.mappings.remote.mapping.locator.list.positive.mapping.rlocs.Locator;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.EidTable;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.eid.table.VniTable;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.eid.table.vni.table.BridgeDomainSubtable;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.eid.table.vni.table.VrfSubtable;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.lisp.feature.data.grouping.LispFeatureData;
54 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
55
56
57 //TODO - HONEYCOMB-282 - refactor this and other factories for better readability
58
59 /**
60  * Factory for producing writers for {@code EidTable}
61  */
62 final class VniTableWriterFactory extends AbstractLispWriterFactoryBase implements WriterFactory {
63
64     private final NamingContext bridgeDomainContext;
65     private final AdjacenciesMappingContext adjacenciesMappingContext;
66
67     private VniTableWriterFactory(final InstanceIdentifier<Lisp> lispInstanceIdentifier,
68                                   final FutureJVppCore vppApi,
69                                   final EidMappingContext localMappingContext,
70                                   final EidMappingContext remoteMappingContext,
71                                   final NamingContext bridgeDomainContext,
72                                   final AdjacenciesMappingContext adjacenciesMappingContext) {
73         super(lispInstanceIdentifier, vppApi, localMappingContext, remoteMappingContext);
74         this.bridgeDomainContext = checkNotNull(bridgeDomainContext, "Bridge domain context cannot be null");
75         this.adjacenciesMappingContext =
76                 checkNotNull(adjacenciesMappingContext, "Adjacencies mapping context cannot be null");
77     }
78
79     public static VniTableWriterFactory newInstance(
80             @Nonnull final InstanceIdentifier<Lisp> lispInstanceIdentifier,
81             @Nonnull final FutureJVppCore vppApi,
82             @Nonnull final EidMappingContext localMappingContext,
83             @Nonnull final EidMappingContext remoteMappingContext,
84             @Nonnull final NamingContext bridgeDomainContext,
85             @Nonnull final AdjacenciesMappingContext adjacenciesMappingContext) {
86         return new VniTableWriterFactory(lispInstanceIdentifier, vppApi, localMappingContext, remoteMappingContext,
87                 bridgeDomainContext, adjacenciesMappingContext);
88     }
89
90     @Override
91     public void init(final ModifiableWriterRegistryBuilder registry) {
92         final InstanceIdentifier<VniTable> vniTableId =
93                 lispInstanceIdentifier.child(LispFeatureData.class).child(EidTable.class).child(VniTable.class);
94
95         final InstanceIdentifier<VrfSubtable> vrfSubtableId = vniTableId.child(VrfSubtable.class);
96         final InstanceIdentifier<BridgeDomainSubtable> bridgeDomainSubtableId =
97                 vniTableId.child(BridgeDomainSubtable.class);
98
99         registry.add(new GenericListWriter<>(vniTableId, new VniTableCustomizer(vppApi)));
100
101         registry.add(new GenericWriter<>(vrfSubtableId, new VrfSubtableCustomizer(vppApi)));
102         registry.add(new GenericWriter<>(bridgeDomainSubtableId,
103                 new BridgeDomainSubtableCustomizer(vppApi, bridgeDomainContext)));
104
105         //VniTable - > VrfSubtable -> LocalMappings - > LocalMapping
106         final InstanceIdentifier<LocalMapping> localMappingSubtreeId = InstanceIdentifier.create(LocalMapping.class);
107         registry.subtreeAdd(ImmutableSet.of(localMappingSubtreeId
108                         .child(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.local.mappings.local.mapping.Eid.class)),
109                 new GenericListWriter<>(
110                         vrfSubtableId.child(LocalMappings.class).child(LocalMapping.class),
111                         new LocalMappingCustomizer(vppApi, localMappingContext)));
112         //VniTable - > BridgeDomainSubtable -> LocalMappings - > LocalMapping
113         registry.subtreeAdd(ImmutableSet.of(localMappingSubtreeId
114                         .child(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.local.mappings.local.mapping.Eid.class)),
115                 new GenericListWriter<>(bridgeDomainSubtableId.child(LocalMappings.class)
116                         .child(LocalMapping.class),
117                         new LocalMappingCustomizer(vppApi, localMappingContext)));
118
119         //VniTable - > VrfSubtable -> RemoteMappings - > RemoteMapping
120         final InstanceIdentifier<RemoteMapping> remoteMappingSubtreeId = InstanceIdentifier.create(RemoteMapping.class);
121         registry.subtreeAdd(ImmutableSet.of(remoteMappingSubtreeId
122                         .child(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.remote.mappings.remote.mapping.Eid.class),
123                 remoteMappingSubtreeId.child(Rlocs.class),
124                 remoteMappingSubtreeId.child(Rlocs.class).child(Locator.class),
125                 remoteMappingSubtreeId.child(MapReply.class)),
126                 new GenericListWriter<>(
127                         vrfSubtableId.child(RemoteMappings.class).child(RemoteMapping.class),
128                         new RemoteMappingCustomizer(vppApi, remoteMappingContext)));
129         //VniTable - > BridgeDomainSubtable -> RemoteMappings - > RemoteMapping
130         registry.subtreeAdd(ImmutableSet.of(remoteMappingSubtreeId
131                         .child(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.remote.mappings.remote.mapping.Eid.class),
132                 remoteMappingSubtreeId.child(Rlocs.class),
133                 remoteMappingSubtreeId.child(Rlocs.class).child(Locator.class),
134                 remoteMappingSubtreeId.child(MapReply.class)),
135                 new GenericListWriter<>(bridgeDomainSubtableId.child(RemoteMappings.class)
136                         .child(RemoteMapping.class),
137                         new RemoteMappingCustomizer(vppApi, remoteMappingContext)));
138
139         //VniTable - > VrfSubtable -> RemoteMappings - > RemoteMapping - > Adjacencies - > Adjacency
140         final InstanceIdentifier<Adjacency> adjacencySubtreeId = InstanceIdentifier.create(Adjacency.class);
141         registry.subtreeAdd(ImmutableSet.of(adjacencySubtreeId
142                         .child(LocalEid.class), adjacencySubtreeId.child(RemoteEid.class)),
143                 new GenericListWriter<>(
144                         vrfSubtableId.child(RemoteMappings.class).child(RemoteMapping.class)
145                                 .child(Adjacencies.class).child(Adjacency.class),
146                         new AdjacencyCustomizer(vppApi, localMappingContext, remoteMappingContext,
147                                 adjacenciesMappingContext)));
148         //VniTable - > BridgeDomainSubtable -> RemoteMappings - > RemoteMapping - > Adjacencies - > Adjacency
149         registry.subtreeAdd(ImmutableSet.of(adjacencySubtreeId
150                         .child(LocalEid.class), adjacencySubtreeId.child(RemoteEid.class)),
151                 new GenericListWriter<>(
152                         bridgeDomainSubtableId.child(RemoteMappings.class)
153                                 .child(RemoteMapping.class)
154                                 .child(Adjacencies.class).child(Adjacency.class),
155                         new AdjacencyCustomizer(vppApi, localMappingContext, remoteMappingContext,
156                                 adjacenciesMappingContext)));
157     }
158 }