Fix build faliures due to OFPlugin checktyle fixes
[netvirt.git] / ipv6service / impl / src / main / java / org / opendaylight / netvirt / ipv6service / VirtualPort.java
1 /*
2  * Copyright (c) 2015 Dell Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.netvirt.ipv6service;
10
11 import io.netty.util.Timeout;
12 import java.math.BigInteger;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.concurrent.ConcurrentHashMap;
16 import java.util.concurrent.ConcurrentMap;
17 import java.util.stream.Collectors;
18 import java.util.stream.Stream;
19 import org.opendaylight.netvirt.ipv6service.api.IVirtualPort;
20 import org.opendaylight.netvirt.ipv6service.utils.Ipv6Constants;
21 import org.opendaylight.netvirt.ipv6service.utils.Ipv6PeriodicTimer;
22 import org.opendaylight.netvirt.ipv6service.utils.Ipv6PeriodicTrQueue;
23 import org.opendaylight.netvirt.ipv6service.utils.Ipv6ServiceUtils;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 // This class needs to be overridden by Mockito
32 @SuppressWarnings("checkstyle:FinalClass")
33 public class VirtualPort implements IVirtualPort  {
34     static final Logger LOG = LoggerFactory.getLogger(VirtualPort.class);
35
36     private final Uuid intfUUID;
37     private final Uuid networkID;
38     private final String macAddress;
39     private final boolean routerIntfFlag;
40     private final String deviceOwner;
41     private final ConcurrentMap<Uuid, SubnetInfo> snetInfo = new ConcurrentHashMap<>();
42
43     private volatile Long ofPort;
44     private volatile BigInteger dpId;
45     private volatile boolean serviceBindingStatus;
46     private volatile Ipv6PeriodicTimer periodicTimer;
47     private volatile Timeout periodicTimeout;
48
49     // associated router if any
50     private volatile VirtualRouter router;
51
52     // TODO:: Need Openflow port
53
54     private VirtualPort(Builder builder) {
55         this.intfUUID = builder.intfUUID;
56         this.networkID = builder.networkID;
57         this.macAddress = builder.macAddress;
58         this.routerIntfFlag = builder.routerIntfFlag;
59         this.deviceOwner = builder.deviceOwner;
60     }
61
62     @Override
63     public Uuid getIntfUUID() {
64         return intfUUID;
65     }
66
67     @Override
68     public Uuid getNetworkID() {
69         return networkID;
70     }
71
72     public void setSubnetInfo(Uuid snetID, IpAddress fixedIp) {
73         if (snetID != null) {
74             snetInfo.computeIfAbsent(snetID, key -> new SubnetInfo(snetID, fixedIp)).setIpAddr(fixedIp);
75         }
76     }
77
78     public void clearSubnetInfo() {
79         snetInfo.clear();
80     }
81
82     public void removeSubnetInfo(Uuid snetID) {
83         if (snetID != null) {
84             this.snetInfo.remove(snetID);
85         }
86     }
87
88     public void setSubnet(Uuid snetID, VirtualSubnet subnet) {
89         SubnetInfo subnetInfo = snetID != null ? snetInfo.get(snetID) : null;
90         if (subnetInfo == null) {
91             LOG.info("Subnet {} not associated with the virtual port {}",
92                 snetID, intfUUID);
93             return;
94         }
95         subnetInfo.setSubnet(subnet);
96     }
97
98     public List<VirtualSubnet> getSubnets() {
99         List<VirtualSubnet> subnetList = new ArrayList<>();
100         for (SubnetInfo subnetInfo : snetInfo.values()) {
101             if (subnetInfo.getSubnet() != null) {
102                 subnetList.add(subnetInfo.getSubnet());
103             }
104         }
105
106         return subnetList;
107     }
108
109     public List<IpAddress> getIpAddresses() {
110         return snetInfo.values().stream().flatMap(subnetInfo -> Stream.of(subnetInfo.getIpAddr()))
111                 .collect(Collectors.toList());
112     }
113
114     @Override
115     public List<Ipv6Address> getIpv6Addresses() {
116         List<Ipv6Address> ipv6AddrList = snetInfo.values().stream().flatMap(
117             subnetInfo -> Stream.of(subnetInfo.getIpAddr().getIpv6Address())).collect(Collectors.toList());
118
119         if (deviceOwner.equalsIgnoreCase(Ipv6Constants.NETWORK_ROUTER_INTERFACE)) {
120             Ipv6Address llAddr = Ipv6ServiceUtils.getIpv6LinkLocalAddressFromMac(new MacAddress(macAddress));
121             ipv6AddrList.add(llAddr);
122         }
123         return ipv6AddrList;
124     }
125
126     public List<Ipv6Address> getIpv6AddressesWithoutLLA() {
127         return snetInfo.values().stream().flatMap(
128             subnetInfo -> Stream.of(subnetInfo.getIpAddr().getIpv6Address())).collect(Collectors.toList());
129     }
130
131     @Override
132     public String getMacAddress() {
133         return macAddress;
134     }
135
136     public boolean getRouterIntfFlag() {
137         return routerIntfFlag;
138     }
139
140     public void setRouter(VirtualRouter rtr) {
141         this.router = rtr;
142     }
143
144     public VirtualRouter getRouter() {
145         return router;
146     }
147
148     @Override
149     public String getDeviceOwner() {
150         return deviceOwner;
151     }
152
153     public void setDpId(BigInteger dpId) {
154         this.dpId = dpId;
155     }
156
157     @Override
158     public BigInteger getDpId() {
159         return dpId;
160     }
161
162     public void setOfPort(Long ofPort) {
163         this.ofPort = ofPort;
164     }
165
166     public Long getOfPort() {
167         return ofPort;
168     }
169
170     public void setServiceBindingStatus(Boolean status) {
171         this.serviceBindingStatus = status;
172     }
173
174     public boolean getServiceBindingStatus() {
175         return serviceBindingStatus;
176     }
177
178     public void removeSelf() {
179         if (routerIntfFlag) {
180             if (router != null) {
181                 router.removeInterface(this);
182             }
183         }
184
185         for (SubnetInfo subnetInfo: snetInfo.values()) {
186             if (subnetInfo.getSubnet() != null) {
187                 subnetInfo.getSubnet().removeInterface(this);
188             }
189         }
190     }
191
192     @Override
193     public String toString() {
194         return "VirtualPort[IntfUUid=" + intfUUID + " subnetInfo="
195                 + snetInfo + " NetworkId=" + networkID + " mac=" + macAddress + " ofPort="
196                 + ofPort + " routerFlag=" + routerIntfFlag + " dpId=" + dpId + "]";
197     }
198
199     public void setPeriodicTimer(Ipv6PeriodicTrQueue ipv6Queue) {
200         periodicTimer = new Ipv6PeriodicTimer(intfUUID, ipv6Queue);
201     }
202
203     public Ipv6PeriodicTimer getPeriodicTimer() {
204         return periodicTimer;
205     }
206
207     public void setPeriodicTimeout(Timeout timeout) {
208         periodicTimeout = timeout;
209     }
210
211     public void resetPeriodicTimeout() {
212         periodicTimeout = null;
213     }
214
215     public Timeout getPeriodicTimeout() {
216         return periodicTimeout;
217     }
218
219     private static class SubnetInfo {
220         private final Uuid subnetID;
221         private volatile IpAddress ipAddr;
222         // associated subnet
223         private volatile VirtualSubnet subnet;
224
225         SubnetInfo(Uuid subnetId, IpAddress ipAddr) {
226             this.subnetID = subnetId;
227             this.ipAddr = ipAddr;
228         }
229
230         public Uuid getSubnetID() {
231             return subnetID;
232         }
233
234         public IpAddress getIpAddr() {
235             return ipAddr;
236         }
237
238         public void setIpAddr(IpAddress ipAddr) {
239             this.ipAddr = ipAddr;
240         }
241
242         public VirtualSubnet getSubnet() {
243             return subnet;
244         }
245
246         public void setSubnet(VirtualSubnet subnet) {
247             this.subnet = subnet;
248         }
249
250         @Override
251         public String toString() {
252             return "subnetInfot[subnetId=" + subnetID + " ipAddr=" + ipAddr + " ]";
253         }
254     }
255
256     public static Builder builder() {
257         return new Builder();
258     }
259
260     public static class Builder {
261         private Uuid intfUUID;
262         private Uuid networkID;
263         private String macAddress;
264         private boolean routerIntfFlag;
265         private String deviceOwner;
266
267         public Builder intfUUID(Uuid newIntfUUID) {
268             this.intfUUID = newIntfUUID;
269             return this;
270         }
271
272         public Builder networkID(Uuid newNetworkID) {
273             this.networkID = newNetworkID;
274             return this;
275         }
276
277         public Builder macAddress(String newMacAddress) {
278             this.macAddress = newMacAddress;
279             return this;
280         }
281
282         public Builder routerIntfFlag(boolean value) {
283             this.routerIntfFlag = value;
284             return this;
285         }
286
287         public Builder deviceOwner(String newDeviceOwner) {
288             this.deviceOwner = newDeviceOwner;
289             return this;
290         }
291
292         public VirtualPort build() {
293             return new VirtualPort(this);
294         }
295     }
296 }