blob: 9485e9f33fc5b96edc0f56fa37a5bc120ca08217 [file] [log] [blame]
Madan Jampani38a88212015-09-15 11:21:27 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Madan Jampani38a88212015-09-15 11:21:27 -07003 *
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.onosproject.ovsdb.provider.host;
17
Madan Jampani38a88212015-09-15 11:21:27 -070018import org.onlab.packet.VlanId;
19import org.onosproject.core.CoreService;
20import org.onosproject.net.DefaultAnnotations;
21import org.onosproject.net.DeviceId;
22import org.onosproject.net.Host;
23import org.onosproject.net.HostId;
24import org.onosproject.net.HostLocation;
25import org.onosproject.net.PortNumber;
26import org.onosproject.net.SparseAnnotations;
27import org.onosproject.net.host.DefaultHostDescription;
28import org.onosproject.net.host.HostDescription;
29import org.onosproject.net.host.HostProvider;
30import org.onosproject.net.host.HostProviderRegistry;
31import org.onosproject.net.host.HostProviderService;
Madan Jampani38a88212015-09-15 11:21:27 -070032import org.onosproject.net.provider.AbstractProvider;
33import org.onosproject.net.provider.ProviderId;
34import org.onosproject.ovsdb.controller.EventSubject;
35import org.onosproject.ovsdb.controller.OvsdbController;
36import org.onosproject.ovsdb.controller.OvsdbEvent;
37import org.onosproject.ovsdb.controller.OvsdbEventListener;
38import org.onosproject.ovsdb.controller.OvsdbEventSubject;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070039import org.osgi.service.component.annotations.Activate;
40import org.osgi.service.component.annotations.Component;
41import org.osgi.service.component.annotations.Deactivate;
42import org.osgi.service.component.annotations.Reference;
43import org.osgi.service.component.annotations.ReferenceCardinality;
Madan Jampani38a88212015-09-15 11:21:27 -070044import org.slf4j.Logger;
45
Ray Milkeyd84f89b2018-08-17 14:54:17 -070046import java.net.URI;
47import java.net.URISyntaxException;
48
49import static com.google.common.base.Preconditions.checkNotNull;
50import static org.onlab.util.Tools.toHex;
51import static org.slf4j.LoggerFactory.getLogger;
52
Madan Jampani38a88212015-09-15 11:21:27 -070053/**
54 * Provider which uses an ovsdb controller to detect host.
55 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070056@Component(immediate = true, service = HostProvider.class)
Madan Jampani38a88212015-09-15 11:21:27 -070057public class OvsdbHostProvider extends AbstractProvider implements HostProvider {
58 private final Logger log = getLogger(getClass());
59
Ray Milkeyd84f89b2018-08-17 14:54:17 -070060 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Madan Jampani38a88212015-09-15 11:21:27 -070061 protected HostProviderRegistry providerRegistry;
62
Ray Milkeyd84f89b2018-08-17 14:54:17 -070063 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Madan Jampani38a88212015-09-15 11:21:27 -070064 protected CoreService coreService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070065 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Madan Jampani38a88212015-09-15 11:21:27 -070066 protected OvsdbController controller;
67
68 private HostProviderService providerService;
69 private OvsdbEventListener innerEventListener = new InnerOvsdbEventListener();
70
71 @Activate
72 public void activate() {
73 providerService = providerRegistry.register(this);
74 controller.addOvsdbEventListener(innerEventListener);
75 log.info("Started");
76 }
77
78 @Deactivate
79 public void deactivate() {
Frank Wang14629822017-05-26 09:22:59 +080080 controller.removeOvsdbEventListener(innerEventListener);
Madan Jampani38a88212015-09-15 11:21:27 -070081 providerRegistry.unregister(this);
82 providerService = null;
83 log.info("Stopped");
84 }
85
86 public OvsdbHostProvider() {
87 super(new ProviderId("ovsdb", "org.onosproject.ovsdb.provider.host"));
88 }
89
90 @Override
91 public void triggerProbe(Host host) {
92 log.info("Triggering probe on host {}", host);
93 }
94
95 private class InnerOvsdbEventListener implements OvsdbEventListener {
96
97 @Override
98 public void handle(OvsdbEvent<EventSubject> event) {
99 OvsdbEventSubject subject = null;
100 if (event.subject() instanceof OvsdbEventSubject) {
101 subject = (OvsdbEventSubject) event.subject();
102 }
103 checkNotNull(subject, "EventSubject is not null");
104 // If ifaceid is null,it indicates this is not a vm port.
105 if (subject.ifaceid() == null) {
106 return;
107 }
108 switch (event.type()) {
109 case PORT_ADDED:
jiangrui65609ff2015-10-28 16:26:19 +0800110 HostId hostId = HostId.hostId(subject.hwAddress(), VlanId.vlanId());
Madan Jampani38a88212015-09-15 11:21:27 -0700111 DeviceId deviceId = DeviceId.deviceId(uri(subject.dpid().value()));
112 PortNumber portNumber = PortNumber.portNumber(subject
113 .portNumber().value(), subject.portName().value());
114 HostLocation loaction = new HostLocation(deviceId, portNumber,
115 0L);
116 SparseAnnotations annotations = DefaultAnnotations.builder()
117 .set("ifaceid", subject.ifaceid().value()).build();
118 HostDescription hostDescription = new DefaultHostDescription(
119 subject.hwAddress(),
120 VlanId.vlanId(),
121 loaction,
122 annotations);
Ray Milkeydc083442016-02-22 11:27:57 -0800123 providerService.hostDetected(hostId, hostDescription, false);
Madan Jampani38a88212015-09-15 11:21:27 -0700124 break;
125 case PORT_REMOVED:
jiangrui65609ff2015-10-28 16:26:19 +0800126 HostId host = HostId.hostId(subject.hwAddress(), VlanId.vlanId());
Madan Jampani38a88212015-09-15 11:21:27 -0700127 providerService.hostVanished(host);
128 break;
129 default:
130 break;
131 }
132
133 }
134
135 }
136
137 public URI uri(String value) {
138 try {
139 return new URI("of", toHex(Long.valueOf(value)), null);
140 } catch (URISyntaxException e) {
141 return null;
142 }
143 }
144}