blob: 0978778d142cd9d631a7399267a6787289bae256 [file] [log] [blame]
Madan Jampani38a88212015-09-15 11:21:27 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
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
18import static com.google.common.base.Preconditions.checkNotNull;
19import static org.onlab.util.Tools.toHex;
20import static org.slf4j.LoggerFactory.getLogger;
21
22import java.net.URI;
23import java.net.URISyntaxException;
24
25import org.apache.felix.scr.annotations.Activate;
26import org.apache.felix.scr.annotations.Component;
27import org.apache.felix.scr.annotations.Deactivate;
28import org.apache.felix.scr.annotations.Reference;
29import org.apache.felix.scr.annotations.ReferenceCardinality;
30import org.apache.felix.scr.annotations.Service;
31import org.onlab.packet.VlanId;
32import org.onosproject.core.CoreService;
33import org.onosproject.net.DefaultAnnotations;
34import org.onosproject.net.DeviceId;
35import org.onosproject.net.Host;
36import org.onosproject.net.HostId;
37import org.onosproject.net.HostLocation;
38import org.onosproject.net.PortNumber;
39import org.onosproject.net.SparseAnnotations;
40import org.onosproject.net.host.DefaultHostDescription;
41import org.onosproject.net.host.HostDescription;
42import org.onosproject.net.host.HostProvider;
43import org.onosproject.net.host.HostProviderRegistry;
44import org.onosproject.net.host.HostProviderService;
Madan Jampani38a88212015-09-15 11:21:27 -070045import org.onosproject.net.provider.AbstractProvider;
46import org.onosproject.net.provider.ProviderId;
47import org.onosproject.ovsdb.controller.EventSubject;
48import org.onosproject.ovsdb.controller.OvsdbController;
49import org.onosproject.ovsdb.controller.OvsdbEvent;
50import org.onosproject.ovsdb.controller.OvsdbEventListener;
51import org.onosproject.ovsdb.controller.OvsdbEventSubject;
52import org.slf4j.Logger;
53
54/**
55 * Provider which uses an ovsdb controller to detect host.
56 */
57@Component(immediate = true)
58@Service
59public class OvsdbHostProvider extends AbstractProvider implements HostProvider {
60 private final Logger log = getLogger(getClass());
61
62 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
63 protected HostProviderRegistry providerRegistry;
64
65 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Madan Jampani38a88212015-09-15 11:21:27 -070066 protected CoreService coreService;
67 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
68 protected OvsdbController controller;
69
70 private HostProviderService providerService;
71 private OvsdbEventListener innerEventListener = new InnerOvsdbEventListener();
72
73 @Activate
74 public void activate() {
75 providerService = providerRegistry.register(this);
76 controller.addOvsdbEventListener(innerEventListener);
77 log.info("Started");
78 }
79
80 @Deactivate
81 public void deactivate() {
Frank Wang14629822017-05-26 09:22:59 +080082 controller.removeOvsdbEventListener(innerEventListener);
Madan Jampani38a88212015-09-15 11:21:27 -070083 providerRegistry.unregister(this);
84 providerService = null;
85 log.info("Stopped");
86 }
87
88 public OvsdbHostProvider() {
89 super(new ProviderId("ovsdb", "org.onosproject.ovsdb.provider.host"));
90 }
91
92 @Override
93 public void triggerProbe(Host host) {
94 log.info("Triggering probe on host {}", host);
95 }
96
97 private class InnerOvsdbEventListener implements OvsdbEventListener {
98
99 @Override
100 public void handle(OvsdbEvent<EventSubject> event) {
101 OvsdbEventSubject subject = null;
102 if (event.subject() instanceof OvsdbEventSubject) {
103 subject = (OvsdbEventSubject) event.subject();
104 }
105 checkNotNull(subject, "EventSubject is not null");
106 // If ifaceid is null,it indicates this is not a vm port.
107 if (subject.ifaceid() == null) {
108 return;
109 }
110 switch (event.type()) {
111 case PORT_ADDED:
jiangrui65609ff2015-10-28 16:26:19 +0800112 HostId hostId = HostId.hostId(subject.hwAddress(), VlanId.vlanId());
Madan Jampani38a88212015-09-15 11:21:27 -0700113 DeviceId deviceId = DeviceId.deviceId(uri(subject.dpid().value()));
114 PortNumber portNumber = PortNumber.portNumber(subject
115 .portNumber().value(), subject.portName().value());
116 HostLocation loaction = new HostLocation(deviceId, portNumber,
117 0L);
118 SparseAnnotations annotations = DefaultAnnotations.builder()
119 .set("ifaceid", subject.ifaceid().value()).build();
120 HostDescription hostDescription = new DefaultHostDescription(
121 subject.hwAddress(),
122 VlanId.vlanId(),
123 loaction,
124 annotations);
Ray Milkeydc083442016-02-22 11:27:57 -0800125 providerService.hostDetected(hostId, hostDescription, false);
Madan Jampani38a88212015-09-15 11:21:27 -0700126 break;
127 case PORT_REMOVED:
jiangrui65609ff2015-10-28 16:26:19 +0800128 HostId host = HostId.hostId(subject.hwAddress(), VlanId.vlanId());
Madan Jampani38a88212015-09-15 11:21:27 -0700129 providerService.hostVanished(host);
130 break;
131 default:
132 break;
133 }
134
135 }
136
137 }
138
139 public URI uri(String value) {
140 try {
141 return new URI("of", toHex(Long.valueOf(value)), null);
142 } catch (URISyntaxException e) {
143 return null;
144 }
145 }
146}