blob: 88e68b425ee6334a52e9f509c6a0816a6c594870 [file] [log] [blame]
Thomas Vachuskabadb93f2014-11-15 23:51:17 -08001/*
2 * Copyright 2014 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onlab.onos.optical;
17
18import org.apache.felix.scr.annotations.Activate;
19import org.apache.felix.scr.annotations.Component;
20import org.apache.felix.scr.annotations.Deactivate;
21import org.apache.felix.scr.annotations.Reference;
22import org.apache.felix.scr.annotations.ReferenceCardinality;
Thomas Vachuska9feadc22014-11-18 12:42:26 -080023import org.onlab.onos.net.ConnectPoint;
Thomas Vachuskabadb93f2014-11-15 23:51:17 -080024import org.onlab.onos.net.Device;
Thomas Vachuska9feadc22014-11-18 12:42:26 -080025import org.onlab.onos.net.DeviceId;
Thomas Vachuskabadb93f2014-11-15 23:51:17 -080026import org.onlab.onos.net.Link;
Thomas Vachuska9feadc22014-11-18 12:42:26 -080027import org.onlab.onos.net.Port;
Thomas Vachuskabadb93f2014-11-15 23:51:17 -080028import org.onlab.onos.net.device.DeviceEvent;
29import org.onlab.onos.net.device.DeviceListener;
30import org.onlab.onos.net.device.DeviceService;
31import org.onlab.onos.net.link.DefaultLinkDescription;
32import org.onlab.onos.net.link.LinkDescription;
33import org.onlab.onos.net.link.LinkEvent;
34import org.onlab.onos.net.link.LinkListener;
35import org.onlab.onos.net.link.LinkProvider;
36import org.onlab.onos.net.link.LinkProviderRegistry;
37import org.onlab.onos.net.link.LinkProviderService;
38import org.onlab.onos.net.link.LinkService;
39import org.onlab.onos.net.provider.AbstractProvider;
40import org.onlab.onos.net.provider.ProviderId;
41import org.slf4j.Logger;
42import org.slf4j.LoggerFactory;
43
44import static org.onlab.onos.net.Link.Type.OPTICAL;
45
46/**
47 * Ancillary provider to activate/deactivate optical links as their respective
48 * devices go online or offline.
49 */
50@Component(immediate = true)
51public class OpticalLinkProvider extends AbstractProvider implements LinkProvider {
52
53 private static final Logger log = LoggerFactory.getLogger(OpticalLinkProvider.class);
54
55 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
56 protected LinkProviderRegistry registry;
57
58 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
59 protected DeviceService deviceService;
60
61 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
62 protected LinkService linkService;
63
64 private LinkProviderService providerService;
65 private DeviceListener deviceListener = new InternalDeviceListener();
66 private LinkListener linkListener = new InternalLinkListener();
67
68 public OpticalLinkProvider() {
69 super(new ProviderId("optical", "org.onlab.onos.optical"));
70 }
71
72 @Activate
73 protected void activate() {
74 deviceService.addListener(deviceListener);
75 linkService.addListener(linkListener);
76 providerService = registry.register(this);
77 log.info("Started");
78 }
79
80 @Deactivate
81 protected void deactivate() {
82 deviceService.removeListener(deviceListener);
83 linkService.removeListener(linkListener);
84 registry.unregister(this);
85 log.info("Stopped");
86 }
87
88 //Listens to device events and processes their links.
89 private class InternalDeviceListener implements DeviceListener {
90 @Override
91 public void event(DeviceEvent event) {
92 DeviceEvent.Type type = event.type();
93 Device device = event.subject();
94 if (type == DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED ||
95 type == DeviceEvent.Type.DEVICE_ADDED ||
96 type == DeviceEvent.Type.DEVICE_UPDATED) {
Thomas Vachuska9feadc22014-11-18 12:42:26 -080097 processDeviceLinks(device);
98 } else if (type == DeviceEvent.Type.PORT_UPDATED) {
99 processPortLinks(device, event.port());
Thomas Vachuskabadb93f2014-11-15 23:51:17 -0800100 }
101 }
102 }
103
104 //Listens to link events and processes the link additions.
105 private class InternalLinkListener implements LinkListener {
106 @Override
107 public void event(LinkEvent event) {
108 if (event.type() == LinkEvent.Type.LINK_ADDED) {
109 Link link = event.subject();
110 if (link.providerId().scheme().equals("cfg")) {
111 processLink(event.subject());
112 }
113 }
114 }
115 }
116
Thomas Vachuska9feadc22014-11-18 12:42:26 -0800117 private void processDeviceLinks(Device device) {
Thomas Vachuskabadb93f2014-11-15 23:51:17 -0800118 for (Link link : linkService.getDeviceLinks(device.id())) {
119 if (link.isDurable() && link.type() == OPTICAL) {
120 processLink(link);
121 }
122 }
123 }
124
Thomas Vachuska9feadc22014-11-18 12:42:26 -0800125 private void processPortLinks(Device device, Port port) {
126 ConnectPoint connectPoint = new ConnectPoint(device.id(), port.number());
127 for (Link link : linkService.getLinks(connectPoint)) {
128 if (link.isDurable() && link.type() == OPTICAL) {
129 processLink(link);
130 }
131 }
132 }
133
Thomas Vachuskabadb93f2014-11-15 23:51:17 -0800134 private void processLink(Link link) {
Thomas Vachuska9feadc22014-11-18 12:42:26 -0800135 DeviceId srcId = link.src().deviceId();
136 DeviceId dstId = link.dst().deviceId();
137 Port srcPort = deviceService.getPort(srcId, link.src().port());
138 Port dstPort = deviceService.getPort(dstId, link.dst().port());
139
140 boolean active = deviceService.isAvailable(srcId) &&
141 deviceService.isAvailable(dstId) &&
142 srcPort.isEnabled() && dstPort.isEnabled();
143
Thomas Vachuskabadb93f2014-11-15 23:51:17 -0800144 LinkDescription desc = new DefaultLinkDescription(link.src(), link.dst(), OPTICAL);
145 if (active) {
146 providerService.linkDetected(desc);
147 } else {
148 providerService.linkVanished(desc);
149 }
150 }
151}