blob: 3f4cdfbc045dd1270c60f2501ed6e28a089977ff [file] [log] [blame]
Jonathan Hart472062d2014-04-03 10:56:48 -07001package net.onrc.onos.core.topology;
Jonathan Hart062a2e82014-02-03 09:41:57 -08002
Yuta HIGUCHI8313f0b2014-07-09 16:36:03 -07003import java.util.Collection;
Yuta HIGUCHIdb1b8302014-06-26 10:50:39 -07004import java.util.Map;
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -07005
6import org.apache.commons.lang.Validate;
7
Yuta HIGUCHI8f3dfa32014-06-25 00:14:25 -07008import net.onrc.onos.core.util.Dpid;
9import net.onrc.onos.core.util.PortNumber;
Jonathan Hart25bd53e2014-04-30 23:44:09 -070010import net.onrc.onos.core.util.SwitchPort;
11
Yuta HIGUCHI181d34d2014-02-05 15:05:46 -080012/**
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -070013 * Handler to Port object stored in In-memory Topology snapshot.
Ray Milkey269ffb92014-04-03 14:43:30 -070014 * <p/>
Yuta HIGUCHI181d34d2014-02-05 15:05:46 -080015 */
Jonathan Harte37e4e22014-05-13 19:12:02 -070016public class PortImpl extends TopologyObject implements Port {
Yuta HIGUCHI181d34d2014-02-05 15:05:46 -080017
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -070018 private final SwitchPort id;
Yuta HIGUCHIc0366272014-02-10 21:04:57 -080019
Jonathan Hart25bd53e2014-04-30 23:44:09 -070020
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070021 /**
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -070022 * Creates a Port handler object.
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070023 *
24 * @param topology Topology instance this object belongs to
25 * @param switchPort SwitchPort
26 */
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -070027 PortImpl(TopologyInternal topology, SwitchPort switchPort) {
28 super(topology);
29 Validate.notNull(switchPort);
30 this.id = switchPort;
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070031 }
32
33 /**
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -070034 * Creates a Port handler object.
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070035 *
36 * @param topology Topology instance this object belongs to
37 * @param dpid DPID
38 * @param number PortNumber
39 */
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -070040 PortImpl(TopologyInternal topology, Dpid dpid, PortNumber number) {
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070041 this(topology, new SwitchPort(dpid, number));
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070042 }
43
Ray Milkey269ffb92014-04-03 14:43:30 -070044 @Override
Yuta HIGUCHI8f3dfa32014-06-25 00:14:25 -070045 public Dpid getDpid() {
Yuta HIGUCHIcd14dda2014-07-24 09:57:22 -070046 return getSwitchPort().getDpid();
Ray Milkey269ffb92014-04-03 14:43:30 -070047 }
Yuta HIGUCHIea516d62014-02-13 15:59:32 -080048
Ray Milkey269ffb92014-04-03 14:43:30 -070049 @Override
Yuta HIGUCHI8f3dfa32014-06-25 00:14:25 -070050 public PortNumber getNumber() {
Yuta HIGUCHIcd14dda2014-07-24 09:57:22 -070051 return getPortNumber();
Ray Milkey269ffb92014-04-03 14:43:30 -070052 }
Yuta HIGUCHIc0366272014-02-10 21:04:57 -080053
Ray Milkey269ffb92014-04-03 14:43:30 -070054 @Override
Yuta HIGUCHIcd14dda2014-07-24 09:57:22 -070055 public PortNumber getPortNumber() {
56 return getSwitchPort().getPortNumber();
57 }
58
59 @Override
60 public SwitchPort getSwitchPort() {
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -070061 return id;
Jonathan Hart25bd53e2014-04-30 23:44:09 -070062 }
63
64 @Override
Ray Milkey269ffb92014-04-03 14:43:30 -070065 public String getDescription() {
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070066 return getStringAttribute(PortEvent.DESCRIPTION, "");
Ray Milkey269ffb92014-04-03 14:43:30 -070067 }
Yuta HIGUCHIc0366272014-02-10 21:04:57 -080068
Yuta HIGUCHIdb1b8302014-06-26 10:50:39 -070069 @Override
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070070 public Long getHardwareAddress() {
71 // TODO implement using attributes?
72 throw new UnsupportedOperationException("Not implemented yet");
73 }
74
75 @Override
76 public Switch getSwitch() {
77 topology.acquireReadLock();
78 try {
79 return topology.getSwitch(getDpid());
80 } finally {
81 topology.releaseReadLock();
82 }
83 }
84
85 @Override
86 public Link getOutgoingLink() {
87 topology.acquireReadLock();
88 try {
Yuta HIGUCHIcd14dda2014-07-24 09:57:22 -070089 return topology.getOutgoingLink(getSwitchPort());
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070090 } finally {
91 topology.releaseReadLock();
92 }
93 }
94
95 @Override
Yuta HIGUCHI8313f0b2014-07-09 16:36:03 -070096 public Link getOutgoingLink(String type) {
97 topology.acquireReadLock();
98 try {
Yuta HIGUCHIcd14dda2014-07-24 09:57:22 -070099 return topology.getOutgoingLink(getSwitchPort(), type);
Yuta HIGUCHI8313f0b2014-07-09 16:36:03 -0700100 } finally {
101 topology.releaseReadLock();
102 }
103 }
104
105 @Override
106 public Collection<Link> getOutgoingLinks() {
107 topology.acquireReadLock();
108 try {
Yuta HIGUCHIcd14dda2014-07-24 09:57:22 -0700109 return topology.getOutgoingLinks(getSwitchPort());
Yuta HIGUCHI8313f0b2014-07-09 16:36:03 -0700110 } finally {
111 topology.releaseReadLock();
112 }
113 }
114
115 @Override
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700116 public Link getIncomingLink() {
117 topology.acquireReadLock();
118 try {
Yuta HIGUCHIcd14dda2014-07-24 09:57:22 -0700119 return topology.getIncomingLink(getSwitchPort());
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700120 } finally {
121 topology.releaseReadLock();
122 }
123 }
124
125 @Override
Yuta HIGUCHI8313f0b2014-07-09 16:36:03 -0700126 public Link getIncomingLink(String type) {
127 topology.acquireReadLock();
128 try {
Yuta HIGUCHIcd14dda2014-07-24 09:57:22 -0700129 return topology.getIncomingLink(getSwitchPort(), type);
Yuta HIGUCHI8313f0b2014-07-09 16:36:03 -0700130 } finally {
131 topology.releaseReadLock();
132 }
133 }
134
135 @Override
136 public Collection<Link> getIncomingLinks() {
137 topology.acquireReadLock();
138 try {
Yuta HIGUCHIcd14dda2014-07-24 09:57:22 -0700139 return topology.getIncomingLinks(getSwitchPort());
Yuta HIGUCHI8313f0b2014-07-09 16:36:03 -0700140 } finally {
141 topology.releaseReadLock();
142 }
143 }
144
145 @Override
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700146 public Collection<Host> getHosts() {
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700147 topology.acquireReadLock();
148 try {
Yuta HIGUCHIcd14dda2014-07-24 09:57:22 -0700149 return topology.getHosts(this.getSwitchPort());
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700150 } finally {
151 topology.releaseReadLock();
152 }
153 }
154
Praseed Balakrishnanfa21be12014-07-15 14:42:26 -0700155 /**
156 * Returns the port type of this port.
157 *
158 * @return {@link net.onrc.onos.core.topology.PortType}
159 */
160 @Override
161 public PortType getPortType() {
162 return PortType.valueOf(getStringAttribute(TopologyElement.ELEMENT_TYPE,
163 PortType.ETHERNET_PORT.toString()));
164 }
165
166
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700167 @Override
168 public String getStringAttribute(String attr) {
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700169 return this.topology.getPortEvent(id).getStringAttribute(attr);
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700170 }
171
172 @Override
Yuta HIGUCHIdb1b8302014-06-26 10:50:39 -0700173 public String getStringAttribute(String attr, String def) {
174 final String v = getStringAttribute(attr);
175 if (v == null) {
176 return def;
177 } else {
178 return v;
179 }
180 }
181
182 @Override
183 public Map<String, String> getAllStringAttributes() {
Yuta HIGUCHI8b389a72014-07-18 13:50:00 -0700184 return this.topology.getPortEvent(id).getAllStringAttributes();
Yuta HIGUCHIdb1b8302014-06-26 10:50:39 -0700185 }
186
187 @Override
Ray Milkey269ffb92014-04-03 14:43:30 -0700188 public String toString() {
Yuta HIGUCHI8f3dfa32014-06-25 00:14:25 -0700189 return String.format("%s:%s",
Ray Milkey269ffb92014-04-03 14:43:30 -0700190 getSwitch().getDpid(),
191 getNumber());
192 }
Praseed Balakrishnan57ed8432014-06-26 11:49:56 -0700193
194
195 /**
196 * Returns the type of topology object.
197 *
198 * @return the type of the topology object
199 */
200 @Override
201 public String getType() {
Yuta HIGUCHIdbc33122014-07-10 13:32:32 -0700202 return getStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET_LAYER);
Praseed Balakrishnan57ed8432014-06-26 11:49:56 -0700203 }
Praseed Balakrishnan2aa6c0b2014-07-17 11:42:05 -0700204
205 /**
206 * Returns the config state of topology element.
207 *
208 * @return ConfigState
209 */
210 @Override
211 public ConfigState getConfigState() {
212 return ConfigState.valueOf(getStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE));
213
214 }
215
216 /**
217 * Returns the status of topology element.
218 *
219 * @return AdminStatus
220 */
221 @Override
222 public AdminStatus getStatus() {
223 return AdminStatus.valueOf(getStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS));
224 }
Jonathan Hart062a2e82014-02-03 09:41:57 -0800225}