blob: 63ff94ee2dd7b41bf02ed4ea4ad16433778b1ece [file] [log] [blame]
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -07001package net.onrc.onos.core.topology;
2
3import static com.google.common.base.Preconditions.checkNotNull;
4
5import java.util.ArrayList;
6import java.util.Collection;
7import java.util.Collections;
8import java.util.List;
Yuta HIGUCHIab9dc7b2014-08-26 22:53:13 -07009
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -070010import net.floodlightcontroller.util.MACAddress;
11import net.onrc.onos.core.util.Dpid;
Yuta HIGUCHIab9dc7b2014-08-26 22:53:13 -070012import net.onrc.onos.core.util.OnosInstanceId;
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -070013import net.onrc.onos.core.util.PortNumber;
14import net.onrc.onos.core.util.SwitchPort;
15
16/**
17 * Adaptor to access {@link BaseInternalTopology} as {@link BaseTopology}.
18 */
19public class BaseTopologyAdaptor implements BaseTopology {
20
21 private final BaseInternalTopology internal;
22
23 /**
24 * Constructor.
25 *
26 * @param internal {@link BaseInternalTopology} to use internally
27 */
28 public BaseTopologyAdaptor(BaseInternalTopology internal) {
29 this.internal = checkNotNull(internal);
30 }
31
32
33 @Override
34 public Switch getSwitch(Dpid dpid) {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070035 final SwitchData sw = internal.getSwitchData(dpid);
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -070036 if (sw != null) {
37 return new SwitchImpl(internal, dpid);
38 }
39 return null;
40 }
41
42 @Override
43 public Iterable<Switch> getSwitches() {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070044 final Collection<SwitchData> switches = internal.getAllSwitchDataEntries();
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -070045 List<Switch> list = new ArrayList<>(switches.size());
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070046 for (SwitchData elm : switches) {
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -070047 list.add(new SwitchImpl(internal, elm.getDpid()));
48 }
49 return list;
50 }
51
52 @Override
53 public Port getPort(Dpid dpid, PortNumber portNumber) {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070054 final PortData port = internal.getPortData(dpid, portNumber);
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -070055 if (port != null) {
56 return new PortImpl(internal, port.getSwitchPort());
57 }
58 return null;
59 }
60
61 @Override
62 public Port getPort(SwitchPort port) {
63 return getPort(port.getDpid(), port.getPortNumber());
64 }
65
66 @Override
67 public Collection<Port> getPorts(Dpid dpid) {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070068 final Collection<PortData> ports = internal.getPortDataEntries(dpid);
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -070069 List<Port> list = new ArrayList<>(ports.size());
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070070 for (PortData elm : ports) {
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -070071 list.add(new PortImpl(internal, elm.getSwitchPort()));
72 }
73 return list;
74 }
75
76 @Override
77 public Link getOutgoingLink(Dpid dpid, PortNumber number) {
78 return getOutgoingLink(new SwitchPort(dpid, number));
79 }
80
81 @Override
82 public Link getIncomingLink(Dpid dpid, PortNumber number) {
83 return getIncomingLink(new SwitchPort(dpid, number));
84 }
85
86
87 @Override
88 public Link getOutgoingLink(SwitchPort port) {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070089 final Collection<LinkData> links = internal.getLinkDataEntriesFrom(port);
90 LinkData link = getPacketLinkDataIfExists(links);
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -070091 if (link != null) {
92 return new LinkImpl(internal, link.getLinkTuple());
93 }
94 return null;
95 }
96
97 @Override
98 public Link getIncomingLink(SwitchPort port) {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070099 final Collection<LinkData> links = internal.getLinkDataEntriesTo(port);
100 LinkData link = getPacketLinkDataIfExists(links);
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700101 if (link != null) {
102 return new LinkImpl(internal, link.getLinkTuple());
103 }
104 return null;
105 }
106
107 /**
108 * Gets the "packet" link if such exists,
109 * otherwise return whichever link is found first.
110 *
111 * @param links Collection of links to search from
112 * @return Link instance found or null if no link exists
113 */
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700114 private static LinkData getPacketLinkDataIfExists(Collection<LinkData> links) {
115 for (LinkData link : links) {
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700116 if (TopologyElement.TYPE_PACKET_LAYER.equals(link.getType())) {
117 return link;
118 }
119 }
120 if (!links.isEmpty()) {
121 return links.iterator().next();
122 }
123 return null;
124 }
125
126 @Override
127 public Link getOutgoingLink(Dpid dpid, PortNumber number, String type) {
128 return getOutgoingLink(new SwitchPort(dpid, number), type);
129 }
130
131 @Override
132 public Link getIncomingLink(Dpid dpid, PortNumber number, String type) {
133 return getIncomingLink(new SwitchPort(dpid, number), type);
134 }
135
136
137 @Override
138 public Link getOutgoingLink(SwitchPort port, String type) {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700139 final Collection<LinkData> links = internal.getLinkDataEntriesFrom(port);
140 for (LinkData link : links) {
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700141 if (link.getType().equals(type)) {
142 return new LinkImpl(internal, link.getLinkTuple());
143 }
144 }
145 return null;
146 }
147
148 @Override
149 public Link getIncomingLink(SwitchPort port, String type) {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700150 final Collection<LinkData> links = internal.getLinkDataEntriesTo(port);
151 for (LinkData link : links) {
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700152 if (link.getType().equals(type)) {
153 return new LinkImpl(internal, link.getLinkTuple());
154 }
155 }
156 return null;
157 }
158
159
160 @Override
161 public Collection<Link> getOutgoingLinks(SwitchPort port) {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700162 final Collection<LinkData> links = internal.getLinkDataEntriesFrom(port);
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700163 return toLinkImpls(internal, links);
164 }
165
166 @Override
167 public Collection<Link> getIncomingLinks(SwitchPort port) {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700168 final Collection<LinkData> links = internal.getLinkDataEntriesTo(port);
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700169 return toLinkImpls(internal, links);
170 }
171
172
173 /**
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700174 * Converts collection of LinkData to collection of LinkImpls.
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700175 *
176 * @param internalTopology topology {@code links} resides
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700177 * @param links collection of LinkData
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700178 * @return collection of {@link LinkImpl}s
179 */
180 private static Collection<Link> toLinkImpls(
181 final BaseInternalTopology internalTopology,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700182 final Collection<LinkData> links) {
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700183
184 if (links == null) {
185 return Collections.emptyList();
186 }
187 List<Link> list = new ArrayList<>(links.size());
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700188 for (LinkData elm : links) {
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700189 list.add(new LinkImpl(internalTopology, elm.getLinkTuple()));
190 }
191 return list;
192 }
193
194 @Override
195 public Link getLink(Dpid srcDpid, PortNumber srcNumber,
196 Dpid dstDpid, PortNumber dstNumber) {
197
198 final SwitchPort dstSwitchPort = new SwitchPort(dstDpid, dstNumber);
199 Collection<Link> links = getOutgoingLinks(new SwitchPort(srcDpid, srcNumber));
200 for (Link link : links) {
201 if (link == null) {
202 continue;
203 }
204 if (link.getDstPort().getSwitchPort().equals(dstSwitchPort)) {
205 return link;
206 }
207 }
208 return null;
209 }
210
211 @Override
212 public Link getLink(Dpid srcDpid, PortNumber srcNumber,
213 Dpid dstDpid, PortNumber dstNumber,
214 String type) {
215
216 Link link = getOutgoingLink(srcDpid, srcNumber, type);
217 if (link == null) {
218 return null;
219 }
220 if (!link.getDstSwitch().getDpid().equals(dstDpid)) {
221 return null;
222 }
223 if (!link.getDstPort().getNumber().equals(dstNumber)) {
224 return null;
225 }
226 return link;
227 }
228
229 @Override
230 public Iterable<Link> getLinks() {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700231 final Collection<LinkData> links = internal.getAllLinkDataEntries();
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700232 return toLinkImpls(internal, links);
233 }
234
235 @Override
236 public Host getHostByMac(MACAddress address) {
237
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700238 HostData host = internal.getHostData(address);
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700239 if (host != null) {
240 return new HostImpl(internal, address);
241 }
242 return null;
243 }
244
245 @Override
246 public Iterable<Host> getHosts() {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700247 return toHostImpls(internal, internal.getAllHostDataEntries());
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700248 }
249
250 /**
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700251 * Converts collection of HostData to collection of HostImpl.
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700252 *
253 * @param internalTopology topology {@code hosts} resides
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700254 * @param hosts collection of HostData
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700255 * @return collection of HostImpl
256 */
257 private static List<Host> toHostImpls(BaseInternalTopology internalTopology,
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700258 Collection<HostData> hosts) {
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700259 if (hosts == null) {
260 return Collections.emptyList();
261 }
262 List<Host> list = new ArrayList<>(hosts.size());
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700263 for (HostData elm : hosts) {
Sangho Shin2f263692014-09-15 14:09:41 -0700264 list.add(new HostImpl(internalTopology, elm.getMac(), elm.getIp()));
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700265 }
266 return list;
267 }
268
269 @Override
270 public Collection<Host> getHosts(SwitchPort port) {
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -0700271 return toHostImpls(internal, internal.getHostDataEntries(port));
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700272 }
Yuta HIGUCHIab9dc7b2014-08-26 22:53:13 -0700273
274
275 @Override
276 public OnosInstanceId getSwitchMaster(Dpid dpid) {
277 return internal.getSwitchMaster(dpid);
278 }
Yuta HIGUCHI9e6223d2014-08-26 00:01:32 -0700279}