2 * Copyright 2015 Open Networking Laboratory
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
16 package org.onosproject.ovsdb.provider.host;
\r
18 import static com.google.common.base.Preconditions.checkNotNull;
\r
19 import static org.onlab.util.Tools.toHex;
\r
20 import static org.slf4j.LoggerFactory.getLogger;
\r
22 import java.net.URI;
\r
23 import java.net.URISyntaxException;
\r
25 import org.apache.felix.scr.annotations.Activate;
\r
26 import org.apache.felix.scr.annotations.Component;
\r
27 import org.apache.felix.scr.annotations.Deactivate;
\r
28 import org.apache.felix.scr.annotations.Reference;
\r
29 import org.apache.felix.scr.annotations.ReferenceCardinality;
\r
30 import org.apache.felix.scr.annotations.Service;
\r
31 import org.onlab.packet.VlanId;
\r
32 import org.onosproject.core.CoreService;
\r
33 import org.onosproject.net.DefaultAnnotations;
\r
34 import org.onosproject.net.DeviceId;
\r
35 import org.onosproject.net.Host;
\r
36 import org.onosproject.net.HostId;
\r
37 import org.onosproject.net.HostLocation;
\r
38 import org.onosproject.net.PortNumber;
\r
39 import org.onosproject.net.SparseAnnotations;
\r
40 import org.onosproject.net.host.DefaultHostDescription;
\r
41 import org.onosproject.net.host.HostDescription;
\r
42 import org.onosproject.net.host.HostProvider;
\r
43 import org.onosproject.net.host.HostProviderRegistry;
\r
44 import org.onosproject.net.host.HostProviderService;
\r
45 import org.onosproject.net.host.HostService;
\r
46 import org.onosproject.net.provider.AbstractProvider;
\r
47 import org.onosproject.net.provider.ProviderId;
\r
48 import org.onosproject.ovsdb.controller.EventSubject;
\r
49 import org.onosproject.ovsdb.controller.OvsdbController;
\r
50 import org.onosproject.ovsdb.controller.OvsdbEvent;
\r
51 import org.onosproject.ovsdb.controller.OvsdbEventListener;
\r
52 import org.onosproject.ovsdb.controller.OvsdbEventSubject;
\r
53 import org.slf4j.Logger;
\r
56 * Provider which uses an ovsdb controller to detect host.
\r
58 @Component(immediate = true)
\r
60 public class OvsdbHostProvider extends AbstractProvider implements HostProvider {
\r
61 private final Logger log = getLogger(getClass());
\r
63 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
\r
64 protected HostProviderRegistry providerRegistry;
\r
66 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
\r
67 protected HostService hostService;
\r
68 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
\r
69 protected CoreService coreService;
\r
70 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
\r
71 protected OvsdbController controller;
\r
73 private HostProviderService providerService;
\r
74 private OvsdbEventListener innerEventListener = new InnerOvsdbEventListener();
\r
77 public void activate() {
\r
78 providerService = providerRegistry.register(this);
\r
79 controller.addOvsdbEventListener(innerEventListener);
\r
80 log.info("Started");
\r
84 public void deactivate() {
\r
85 providerRegistry.unregister(this);
\r
86 providerService = null;
\r
87 log.info("Stopped");
\r
90 public OvsdbHostProvider() {
\r
91 super(new ProviderId("ovsdb", "org.onosproject.ovsdb.provider.host"));
\r
95 public void triggerProbe(Host host) {
\r
96 log.info("Triggering probe on host {}", host);
\r
99 private class InnerOvsdbEventListener implements OvsdbEventListener {
\r
102 public void handle(OvsdbEvent<EventSubject> event) {
\r
103 OvsdbEventSubject subject = null;
\r
104 if (event.subject() instanceof OvsdbEventSubject) {
\r
105 subject = (OvsdbEventSubject) event.subject();
\r
107 checkNotNull(subject, "EventSubject is not null");
\r
108 // If ifaceid is null,it indicates this is not a vm port.
\r
109 if (subject.ifaceid() == null) {
\r
112 switch (event.type()) {
\r
114 HostId hostId = HostId.hostId(subject.hwAddress(), null);
\r
115 DeviceId deviceId = DeviceId.deviceId(uri(subject.dpid().value()));
\r
116 PortNumber portNumber = PortNumber.portNumber(subject
\r
117 .portNumber().value(), subject.portName().value());
\r
118 HostLocation loaction = new HostLocation(deviceId, portNumber,
\r
120 SparseAnnotations annotations = DefaultAnnotations.builder()
\r
121 .set("ifaceid", subject.ifaceid().value()).build();
\r
122 HostDescription hostDescription = new DefaultHostDescription(
\r
123 subject.hwAddress(),
\r
127 providerService.hostDetected(hostId, hostDescription);
\r
130 HostId host = HostId.hostId(subject.hwAddress(), null);
\r
131 providerService.hostVanished(host);
\r
141 public URI uri(String value) {
\r
143 return new URI("of", toHex(Long.valueOf(value)), null);
\r
144 } catch (URISyntaxException e) {
\r