2 * Copyright (c) 2016 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.honeycomb.lisp.translate.write.factory;
19 import static com.google.common.base.Preconditions.checkNotNull;
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;
57 //TODO - HONEYCOMB-282 - refactor this and other factories for better readability
60 * Factory for producing writers for {@code EidTable}
62 final class VniTableWriterFactory extends AbstractLispWriterFactoryBase implements WriterFactory {
64 private final NamingContext bridgeDomainContext;
65 private final AdjacenciesMappingContext adjacenciesMappingContext;
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");
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);
91 public void init(final ModifiableWriterRegistryBuilder registry) {
92 final InstanceIdentifier<VniTable> vniTableId =
93 lispInstanceIdentifier.child(LispFeatureData.class).child(EidTable.class).child(VniTable.class);
95 final InstanceIdentifier<VrfSubtable> vrfSubtableId = vniTableId.child(VrfSubtable.class);
96 final InstanceIdentifier<BridgeDomainSubtable> bridgeDomainSubtableId =
97 vniTableId.child(BridgeDomainSubtable.class);
99 registry.add(new GenericListWriter<>(vniTableId, new VniTableCustomizer(vppApi)));
101 registry.add(new GenericWriter<>(vrfSubtableId, new VrfSubtableCustomizer(vppApi)));
102 registry.add(new GenericWriter<>(bridgeDomainSubtableId,
103 new BridgeDomainSubtableCustomizer(vppApi, bridgeDomainContext)));
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)));
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)));
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)));