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