2 * Copyright (c) 2017 Cisco Systems. 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
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.mappers;
11 import com.google.common.collect.ArrayListMultimap;
12 import com.google.common.collect.Multimap;
13 import org.apache.commons.lang3.mutable.MutableInt;
14 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.loopback.SubnetHostInfo;
16 import java.util.HashMap;
17 import java.util.List;
18 import java.util.stream.Collectors;
21 * Created by Shakib Ahmed on 4/26/17.
23 public class LoopbackHostSpecificInfoMapper {
24 private HashMap<String, HashMap<String, SubnetHostInfo>> hostIdToSubnetMapper;
25 private Multimap<String, String> subnetUuidToHostIdListMapper;
26 private HashMap<String, MutableInt> hostIdToLoopbackCountMapper;
28 public LoopbackHostSpecificInfoMapper() {
29 hostIdToSubnetMapper = new HashMap<>();
30 subnetUuidToHostIdListMapper = ArrayListMultimap.create();
31 hostIdToLoopbackCountMapper = new HashMap<>();
34 private HashMap<String, SubnetHostInfo> getSubnetsOfHost(String hostName) {
35 return hostIdToSubnetMapper.get(hostName);
38 public boolean loopbackAlreadyExists(String hostName, String subnetUuid) {
39 return hostIdToSubnetMapper.containsKey(hostName) &&
40 hostIdToSubnetMapper.get(hostName).containsKey(subnetUuid);
43 public void addLoopbackForHost(String hostName, String subnetUuid, String interfaceName, long vrf) {
44 putSubnetInfoOfAHost(hostName, subnetUuid, interfaceName, vrf);
45 subnetUuidToHostIdListMapper.put(subnetUuid, hostName);
48 private void putSubnetInfoOfAHost(String hostId, String subnetUuid, String interfaceName, long vrf) {
49 HashMap<String, SubnetHostInfo> subnetsOfAHost = getSubnetsOfHost(hostId);
50 MutableInt loopbackCount = getMutableIntAfterInitIfNecessary(hostId);
54 if (subnetsOfAHost == null) {
55 subnetsOfAHost = new HashMap<>();
56 hostIdToSubnetMapper.put(hostId, subnetsOfAHost);
59 SubnetHostInfo subnetHostInfo = new SubnetHostInfo(interfaceName);
60 subnetsOfAHost.put(subnetUuid, subnetHostInfo);
63 private MutableInt getMutableIntAfterInitIfNecessary(String hostId) {
64 MutableInt loopbackCount = hostIdToLoopbackCountMapper.get(hostId);
66 if (loopbackCount == null) {
67 loopbackCount = new MutableInt();
68 loopbackCount.setValue(0);
69 hostIdToLoopbackCountMapper.put(hostId, loopbackCount);
74 public int getLoopbackCount(String hostName) {
75 MutableInt loopbackCount = getMutableIntAfterInitIfNecessary(hostName);
76 return loopbackCount.getValue();
79 public void clearSubnet(String subnetUuid) {
80 subnetUuidToHostIdListMapper.get(subnetUuid).forEach(hostId -> {
81 deleteParticularSubnetFromHost(hostId, subnetUuid);
83 subnetUuidToHostIdListMapper.get(subnetUuid).clear();
86 private void deleteParticularSubnetFromHost(String hostId, String subnetUuid) {
87 hostIdToSubnetMapper.get(hostId).remove(subnetUuid);
90 private void deleteHostFromSubnetMap(String subnetUuid, String hostId) {
91 subnetUuidToHostIdListMapper.get(subnetUuid).remove(hostId);
94 public List<String> getHostsWithSubnet(String subnetUuid) {
95 return subnetUuidToHostIdListMapper.get(subnetUuid).stream().collect(Collectors.toList());
98 public String getInterfaceNameForLoopbackInHost(String hostId, String subnetUuid) {
99 if (hostIdToSubnetMapper.get(hostId) != null) {
100 return hostIdToSubnetMapper.get(hostId).get(subnetUuid).getInterfaceName();
106 public int getPortCount(String hostId, String subnetUuid) {
107 if (hostIdToSubnetMapper.containsKey(hostId)) {
108 if (hostIdToSubnetMapper.get(hostId).containsKey(subnetUuid)) {
109 return hostIdToSubnetMapper.get(hostId).get(subnetUuid).getPortCount();
118 public void addNewPortInHostSubnet(String hostId, String subnetUuid) {
119 getSubnetsOfHost(hostId).get(subnetUuid).incrementPortCount();
122 public boolean deletePortFromHostSubnetAndTriggerLoopbackDelete(String hostId, String subnetUuid) {
123 if (getSubnetsOfHost(hostId).containsKey(subnetUuid)) {
124 int count = getSubnetsOfHost(hostId).get(subnetUuid).decrementAndGetPortCount();
127 deleteParticularSubnetFromHost(hostId, subnetUuid);