Jonathan Hart | 472062d | 2014-04-03 10:56:48 -0700 | [diff] [blame] | 1 | package net.onrc.onos.core.topology; |
Toshio Koide | 5799b60 | 2014-02-10 15:29:06 -0800 | [diff] [blame] | 2 | |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 3 | import java.util.ArrayList; |
| 4 | import java.util.List; |
| 5 | |
| 6 | import org.apache.commons.lang.Validate; |
Toshio Koide | 5799b60 | 2014-02-10 15:29:06 -0800 | [diff] [blame] | 7 | |
| 8 | import net.floodlightcontroller.util.MACAddress; |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 9 | import net.onrc.onos.core.util.SwitchPort; |
Toshio Koide | 5799b60 | 2014-02-10 15:29:06 -0800 | [diff] [blame] | 10 | |
| 11 | /** |
Yuta HIGUCHI | bfc77f0 | 2014-07-14 22:50:25 -0700 | [diff] [blame] | 12 | * Host Object stored in In-memory Topology. |
Toshio Koide | 5799b60 | 2014-02-10 15:29:06 -0800 | [diff] [blame] | 13 | */ |
Yuta HIGUCHI | bfc77f0 | 2014-07-14 22:50:25 -0700 | [diff] [blame] | 14 | public class HostImpl extends TopologyObject implements Host { |
Toshio Koide | 5799b60 | 2014-02-10 15:29:06 -0800 | [diff] [blame] | 15 | |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 16 | ////////////////////////////////////////////////////// |
| 17 | /// Topology element attributes |
| 18 | /// - any changes made here needs to be replicated. |
| 19 | ////////////////////////////////////////////////////// |
Yuta HIGUCHI | bfc77f0 | 2014-07-14 22:50:25 -0700 | [diff] [blame] | 20 | private HostEvent deviceObj; |
Toshio Koide | 5799b60 | 2014-02-10 15:29:06 -0800 | [diff] [blame] | 21 | |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 22 | |
| 23 | /** |
Yuta HIGUCHI | bfc77f0 | 2014-07-14 22:50:25 -0700 | [diff] [blame] | 24 | * Creates a Host object based on {@link HostEvent}. |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 25 | * |
| 26 | * @param topology Topology instance this object belongs to |
Yuta HIGUCHI | bfc77f0 | 2014-07-14 22:50:25 -0700 | [diff] [blame] | 27 | * @param scHost self contained {@link HostEvent} |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 28 | */ |
Yuta HIGUCHI | bfc77f0 | 2014-07-14 22:50:25 -0700 | [diff] [blame] | 29 | public HostImpl(Topology topology, HostEvent scHost) { |
Jonathan Hart | e37e4e2 | 2014-05-13 19:12:02 -0700 | [diff] [blame] | 30 | super(topology); |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 31 | Validate.notNull(scHost); |
| 32 | |
| 33 | // TODO should we assume deviceObj is already frozen before this call |
| 34 | // or expect attribute update will happen after . |
| 35 | if (scHost.isFrozen()) { |
| 36 | this.deviceObj = scHost; |
| 37 | } else { |
Yuta HIGUCHI | bfc77f0 | 2014-07-14 22:50:25 -0700 | [diff] [blame] | 38 | this.deviceObj = new HostEvent(scHost); |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 39 | this.deviceObj.freeze(); |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | /** |
Yuta HIGUCHI | bfc77f0 | 2014-07-14 22:50:25 -0700 | [diff] [blame] | 44 | * Creates a Host object with empty attributes. |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 45 | * |
| 46 | * @param topology Topology instance this object belongs to |
| 47 | * @param mac MAC address of the host |
| 48 | */ |
Yuta HIGUCHI | bfc77f0 | 2014-07-14 22:50:25 -0700 | [diff] [blame] | 49 | public HostImpl(Topology topology, MACAddress mac) { |
| 50 | this(topology, new HostEvent(mac).freeze()); |
Yuta HIGUCHI | c036627 | 2014-02-10 21:04:57 -0800 | [diff] [blame] | 51 | } |
Toshio Koide | 5799b60 | 2014-02-10 15:29:06 -0800 | [diff] [blame] | 52 | |
Yuta HIGUCHI | c036627 | 2014-02-10 21:04:57 -0800 | [diff] [blame] | 53 | @Override |
| 54 | public MACAddress getMacAddress() { |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 55 | return this.deviceObj.getMac(); |
Yuta HIGUCHI | c036627 | 2014-02-10 21:04:57 -0800 | [diff] [blame] | 56 | } |
Toshio Koide | 5799b60 | 2014-02-10 15:29:06 -0800 | [diff] [blame] | 57 | |
Yuta HIGUCHI | c036627 | 2014-02-10 21:04:57 -0800 | [diff] [blame] | 58 | @Override |
Yuta HIGUCHI | c036627 | 2014-02-10 21:04:57 -0800 | [diff] [blame] | 59 | public Iterable<Port> getAttachmentPoints() { |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 60 | List<Port> ports = new ArrayList<>(); |
| 61 | topology.acquireReadLock(); |
| 62 | try { |
| 63 | for (SwitchPort swp : this.deviceObj.getAttachmentPoints()) { |
| 64 | Port p = this.topology.getPort(swp); |
| 65 | if (p != null) { |
| 66 | ports.add(p); |
| 67 | } |
| 68 | } |
| 69 | } finally { |
| 70 | topology.releaseReadLock(); |
| 71 | } |
| 72 | return ports; |
Yuta HIGUCHI | c036627 | 2014-02-10 21:04:57 -0800 | [diff] [blame] | 73 | } |
| 74 | |
| 75 | @Override |
| 76 | public long getLastSeenTime() { |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 77 | return deviceObj.getLastSeenTime(); |
Yuta HIGUCHI | c036627 | 2014-02-10 21:04:57 -0800 | [diff] [blame] | 78 | } |
| 79 | |
| 80 | @Override |
| 81 | public String toString() { |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 82 | return getMacAddress().toString(); |
TeruU | d1c5b65 | 2014-03-24 13:58:46 -0700 | [diff] [blame] | 83 | } |
Ray Milkey | 269ffb9 | 2014-04-03 14:43:30 -0700 | [diff] [blame] | 84 | |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 85 | // TODO we may no longer need this. confirm and delete later. |
TeruU | d1c5b65 | 2014-03-24 13:58:46 -0700 | [diff] [blame] | 86 | void setLastSeenTime(long lastSeenTime) { |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 87 | // XXX Following will make this instance thread unsafe. Need to use AtomicRef. |
Yuta HIGUCHI | bfc77f0 | 2014-07-14 22:50:25 -0700 | [diff] [blame] | 88 | HostEvent updated = new HostEvent(this.deviceObj); |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 89 | updated.setLastSeenTime(lastSeenTime); |
| 90 | updated.freeze(); |
| 91 | this.deviceObj = updated; |
Yuta HIGUCHI | c036627 | 2014-02-10 21:04:57 -0800 | [diff] [blame] | 92 | } |
| 93 | |
| 94 | /** |
Ray Milkey | b41100a | 2014-04-10 10:42:15 -0700 | [diff] [blame] | 95 | * Only {@link TopologyManager} should use this method. |
Ray Milkey | 269ffb9 | 2014-04-03 14:43:30 -0700 | [diff] [blame] | 96 | * |
TeruU | 5d2c939 | 2014-06-09 20:02:02 -0700 | [diff] [blame] | 97 | * @param port the port that the device is attached to |
Yuta HIGUCHI | c036627 | 2014-02-10 21:04:57 -0800 | [diff] [blame] | 98 | */ |
TeruU | 5d2c939 | 2014-06-09 20:02:02 -0700 | [diff] [blame] | 99 | void addAttachmentPoint(Port port) { |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 100 | // XXX Following will make this instance thread unsafe. Need to use AtomicRef. |
Yuta HIGUCHI | bfc77f0 | 2014-07-14 22:50:25 -0700 | [diff] [blame] | 101 | HostEvent updated = new HostEvent(this.deviceObj); |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 102 | updated.removeAttachmentPoint(port.asSwitchPort()); |
| 103 | updated.addAttachmentPoint(port.asSwitchPort()); |
| 104 | updated.freeze(); |
| 105 | this.deviceObj = updated; |
Yuta HIGUCHI | c036627 | 2014-02-10 21:04:57 -0800 | [diff] [blame] | 106 | } |
| 107 | |
| 108 | /** |
Ray Milkey | b41100a | 2014-04-10 10:42:15 -0700 | [diff] [blame] | 109 | * Only {@link TopologyManager} should use this method. |
Ray Milkey | 269ffb9 | 2014-04-03 14:43:30 -0700 | [diff] [blame] | 110 | * |
TeruU | 5d2c939 | 2014-06-09 20:02:02 -0700 | [diff] [blame] | 111 | * @param port the port that the device is attached to |
Yuta HIGUCHI | c036627 | 2014-02-10 21:04:57 -0800 | [diff] [blame] | 112 | */ |
TeruU | 5d2c939 | 2014-06-09 20:02:02 -0700 | [diff] [blame] | 113 | boolean removeAttachmentPoint(Port port) { |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 114 | // XXX Following will make this instance thread unsafe. Need to use AtomicRef. |
Yuta HIGUCHI | bfc77f0 | 2014-07-14 22:50:25 -0700 | [diff] [blame] | 115 | HostEvent updated = new HostEvent(this.deviceObj); |
Yuta HIGUCHI | bf0a871 | 2014-06-30 18:59:46 -0700 | [diff] [blame] | 116 | final boolean result = updated.removeAttachmentPoint(port.asSwitchPort()); |
| 117 | updated.freeze(); |
| 118 | this.deviceObj = updated; |
| 119 | return result; |
Yuta HIGUCHI | c036627 | 2014-02-10 21:04:57 -0800 | [diff] [blame] | 120 | } |
Praseed Balakrishnan | 57ed843 | 2014-06-26 11:49:56 -0700 | [diff] [blame] | 121 | |
| 122 | |
| 123 | /** |
| 124 | * Returns the type of topology object. |
| 125 | * |
| 126 | * @return the type of the topology object |
| 127 | */ |
| 128 | @Override |
| 129 | public String getType() { |
Yuta HIGUCHI | 1222ac5 | 2014-07-09 16:50:28 -0700 | [diff] [blame] | 130 | // FIXME assuming device is always in packet layer for now. |
Yuta HIGUCHI | dbc3312 | 2014-07-10 13:32:32 -0700 | [diff] [blame] | 131 | return TopologyElement.TYPE_PACKET_LAYER; |
Praseed Balakrishnan | 57ed843 | 2014-06-26 11:49:56 -0700 | [diff] [blame] | 132 | } |
Toshio Koide | 5799b60 | 2014-02-10 15:29:06 -0800 | [diff] [blame] | 133 | } |