1df162ff6eb43dbf307abe98adb14f8786fad09b
[honeycomb.git] / v3po / v3po2vpp / src / main / java / io / fd / honeycomb / translate / v3po / initializers / VppInitializer.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.translate.v3po.initializers;
18
19 import com.google.common.base.Function;
20 import com.google.common.collect.Lists;
21 import com.google.inject.Inject;
22 import com.google.inject.name.Named;
23 import io.fd.honeycomb.data.init.AbstractDataTreeConverter;
24 import java.util.stream.Collectors;
25 import javax.annotation.Nonnull;
26 import javax.annotation.Nullable;
27 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.Vpp;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppState;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.L2FibTable;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.L2FibTableBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.l2.fib.table.L2FibEntryBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.BridgeDomainsBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainKey;
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42 /**
43  * Initializes vpp node in config data tree based on operational state.
44  */
45 public class VppInitializer extends AbstractDataTreeConverter<VppState, Vpp> {
46     private static final Logger LOG = LoggerFactory.getLogger(VppInitializer.class);
47
48     @Inject
49     public VppInitializer(@Named("honeycomb-initializer") @Nonnull final DataBroker bindingDataBroker) {
50         super(bindingDataBroker, InstanceIdentifier.create(VppState.class), InstanceIdentifier.create(Vpp.class));
51     }
52
53     @Override
54     protected Vpp convert(final VppState operationalData) {
55         LOG.debug("VppInitializer.convert()");
56
57         VppBuilder vppBuilder = new VppBuilder();
58         BridgeDomainsBuilder bdsBuilder = new BridgeDomainsBuilder();
59         bdsBuilder.setBridgeDomain(Lists.transform(operationalData.getBridgeDomains().getBridgeDomain(), CONVERT_BD));
60         vppBuilder.setBridgeDomains(bdsBuilder.build());
61         return vppBuilder.build();
62     }
63
64     private static final Function<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomain, BridgeDomain>
65             CONVERT_BD = input -> {
66         final BridgeDomainBuilder builder = new BridgeDomainBuilder();
67         builder.setLearn(input.isLearn());
68         builder.setUnknownUnicastFlood(input.isUnknownUnicastFlood());
69         builder.setArpTermination(input.isArpTermination());
70         builder.setFlood(input.isFlood());
71         builder.setForward(input.isForward());
72         builder.setKey(new BridgeDomainKey(input.getKey().getName()));
73         builder.setName(input.getName());
74         setL2FibTable(builder, input.getL2FibTable());
75         return builder.build();
76     };
77
78     private static void setL2FibTable(@Nonnull final BridgeDomainBuilder builder,
79                                       @Nullable final L2FibTable l2FibTable) {
80         if (l2FibTable == null) {
81             return;
82         }
83         final L2FibTableBuilder tableBuilder = new L2FibTableBuilder()
84                 .setL2FibEntry(
85                         l2FibTable.getL2FibEntry().stream()
86                                 // Convert operational object to config. VPP does not support setting BVI (see v3po.yang)
87                                 .map(oper -> new L2FibEntryBuilder(oper).setBridgedVirtualInterface(null).build())
88                                 .collect(Collectors.toList()));
89         builder.setL2FibTable(tableBuilder.build());
90     }
91
92 }