2 * Copyright (c) 2015 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.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;
57 * Factory for producing writers for {@code EidTable}
59 final class VniTableWriterFactory extends AbstractLispWriterFactoryBase implements WriterFactory {
61 private final NamingContext bridgeDomainContext;
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");
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,
83 public void init(final ModifiableWriterRegistryBuilder registry) {
84 final InstanceIdentifier<VniTable> vniTableId =
85 lispInstanceIdentifier.child(LispFeatureData.class).child(EidTable.class).child(VniTable.class);
87 final InstanceIdentifier<VrfSubtable> vrfSubtableId = vniTableId.child(VrfSubtable.class);
88 final InstanceIdentifier<BridgeDomainSubtable> bridgeDomainSubtableId =
89 vniTableId.child(BridgeDomainSubtable.class);
91 registry.add(new GenericListWriter<>(vniTableId, new VniTableCustomizer(vppApi)));
93 registry.add(new GenericWriter<>(vrfSubtableId, new VrfSubtableCustomizer(vppApi)));
94 registry.add(new GenericWriter<>(bridgeDomainSubtableId,
95 new BridgeDomainSubtableCustomizer(vppApi, bridgeDomainContext)));
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)));
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)));
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)));