2 * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.netvirt.dhcpservice;
10 import java.util.ArrayList;
11 import java.util.List;
12 import java.util.Optional;
13 import java.util.concurrent.ExecutionException;
14 import java.util.function.Predicate;
15 import javax.inject.Inject;
16 import javax.inject.Singleton;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
19 import org.opendaylight.mdsal.binding.api.DataBroker;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
22 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Switches;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.TunnelIps;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 public class DhcpL2GwUtil {
34 private static final Predicate<List<?>> EMPTY_LIST = (list) -> list == null || list.isEmpty();
36 private static final Predicate<Optional<Node>> CONTAINS_GLOBAL_AUGMENTATION =
37 (optionalNode) -> optionalNode.isPresent()
38 && optionalNode.get().augmentation(HwvtepGlobalAugmentation.class) != null;
40 private static final Predicate<Optional<Node>> CONTAINS_SWITCH_AUGMENTATION =
41 (optionalNode) -> optionalNode.isPresent()
42 && optionalNode.get().augmentation(PhysicalSwitchAugmentation.class) != null;
44 private final DataBroker dataBroker;
45 private final L2GatewayCache l2GatewayCache;
48 public DhcpL2GwUtil(DataBroker dataBroker, L2GatewayCache l2GatewayCache) {
49 this.dataBroker = dataBroker;
50 this.l2GatewayCache = l2GatewayCache;
54 public IpAddress getHwvtepNodeTunnelIp(InstanceIdentifier<Node> nodeIid) {
55 String nodeId = nodeIid.firstKeyOf(Node.class).getNodeId().getValue();
56 L2GatewayDevice targetDevice = null;
57 for (L2GatewayDevice device : l2GatewayCache.getAll()) {
58 if (nodeId.equals(device.getHwvtepNodeId())) {
59 targetDevice = device;
63 return targetDevice != null ? targetDevice.getTunnelIp() : getTunnelIp(nodeIid);
68 private IpAddress getTunnelIp(InstanceIdentifier<Node> nodeIid) {
69 Optional<Node> nodeOptional;
71 nodeOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
72 LogicalDatastoreType.OPERATIONAL, nodeIid);
73 if (!CONTAINS_GLOBAL_AUGMENTATION.test(nodeOptional)) {
76 List<Switches> switchIids = new ArrayList<Switches>(nodeOptional.get()
77 .augmentation(HwvtepGlobalAugmentation.class).nonnullSwitches().values());
78 if (EMPTY_LIST.test(switchIids)) {
81 InstanceIdentifier<Node> psIid = (InstanceIdentifier<Node>) switchIids.get(0).getSwitchRef().getValue();
82 nodeOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL,
84 if (!CONTAINS_SWITCH_AUGMENTATION.test(nodeOptional)) {
87 List<TunnelIps> tunnelIps = new ArrayList<TunnelIps>(nodeOptional.get()
88 .augmentation(PhysicalSwitchAugmentation.class).nonnullTunnelIps().values());
89 if (EMPTY_LIST.test(tunnelIps)) {
92 return tunnelIps.get(0).key().getTunnelIpsKey();
93 } catch (ExecutionException | InterruptedException e) {