blob: 7aa63f6f9ef74aa1eeabd05cbea6951a2a489dd2 [file] [log] [blame]
YuanyouZhangf26445a2015-07-22 17:13:18 +08001/*
2 * Copyright 2015 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.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.host.DefaultHostDescription;
40import org.onosproject.net.host.HostDescription;
41import org.onosproject.net.host.HostProvider;
42import org.onosproject.net.host.HostProviderRegistry;
43import org.onosproject.net.host.HostProviderService;
44import org.onosproject.net.host.HostService;
45import 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)
66 protected HostService hostService;
67 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
68 protected CoreService coreService;
69 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
70 protected OvsdbController controller;
71
72 private HostProviderService providerService;
73 private OvsdbEventListener innerEventListener = new InnerOvsdbEventListener();
74
75 @Activate
76 public void activate() {
77 providerService = providerRegistry.register(this);
78 controller.addOvsdbEventListener(innerEventListener);
79 log.info("Started");
80 }
81
82 @Deactivate
83 public void deactivate() {
84 providerRegistry.unregister(this);
85 providerService = null;
86 log.info("Stopped");
87 }
88
89 public OvsdbHostProvider() {
90 super(new ProviderId("ovsdb", "org.onosproject.ovsdb.provider.host"));
91 }
92
93 @Override
94 public void triggerProbe(Host host) {
95 log.info("Triggering probe on host {}", host);
96 }
97
98 private class InnerOvsdbEventListener implements OvsdbEventListener {
99
100 @Override
101 public void handle(OvsdbEvent<EventSubject> event) {
102 OvsdbEventSubject subject = null;
103 if (event.subject() instanceof OvsdbEventSubject) {
104 subject = (OvsdbEventSubject) event.subject();
105 }
106 checkNotNull(subject, "EventSubject is not null");
107 // If ifaceid is null,it indicates this is not a vm port.
108 if (subject.ifaceid() == null) {
109 return;
110 }
111 switch (event.type()) {
112 case PORT_ADDED:
113 HostId hostId = HostId.hostId(subject.hwAddress(), null);
114 DeviceId deviceId = DeviceId.deviceId(uri(subject.dpid().value()));
115 PortNumber portNumber = PortNumber.portNumber(subject
116 .portNumber().value(), subject.portName().value());
117 HostLocation loaction = new HostLocation(deviceId, portNumber,
118 0L);
119 DefaultAnnotations annotations = DefaultAnnotations.builder()
120 .set("ifaceid", subject.ifaceid().value()).build();
121 HostDescription hostDescription = new DefaultHostDescription(
122 subject.hwAddress(),
123 VlanId.vlanId(),
124 loaction,
125 annotations);
126 providerService.hostDetected(hostId, hostDescription);
127 break;
128 case PORT_REMOVED:
129 HostId host = HostId.hostId(subject.hwAddress(), null);
130 providerService.hostVanished(host);
131 break;
132 default:
133 break;
134 }
135
136 }
137
138 }
139
140 public URI uri(String value) {
141 try {
142 return new URI("of", toHex(Long.valueOf(value)), null);
143 } catch (URISyntaxException e) {
144 return null;
145 }
146 }
147}