8d2fd1424ce6768d0bb144cef6841b364356559a
[onosfw.git] /
1 /*\r
2  * Copyright 2015 Open Networking Laboratory\r
3  *\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
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\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
15  */\r
16 package org.onosproject.ovsdb.provider.host;\r
17 \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
21 \r
22 import java.net.URI;\r
23 import java.net.URISyntaxException;\r
24 \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
54 \r
55 /**\r
56  * Provider which uses an ovsdb controller to detect host.\r
57  */\r
58 @Component(immediate = true)\r
59 @Service\r
60 public class OvsdbHostProvider extends AbstractProvider implements HostProvider {\r
61     private final Logger log = getLogger(getClass());\r
62 \r
63     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)\r
64     protected HostProviderRegistry providerRegistry;\r
65 \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
72 \r
73     private HostProviderService providerService;\r
74     private OvsdbEventListener innerEventListener = new InnerOvsdbEventListener();\r
75 \r
76     @Activate\r
77     public void activate() {\r
78         providerService = providerRegistry.register(this);\r
79         controller.addOvsdbEventListener(innerEventListener);\r
80         log.info("Started");\r
81     }\r
82 \r
83     @Deactivate\r
84     public void deactivate() {\r
85         providerRegistry.unregister(this);\r
86         providerService = null;\r
87         log.info("Stopped");\r
88     }\r
89 \r
90     public OvsdbHostProvider() {\r
91         super(new ProviderId("ovsdb", "org.onosproject.ovsdb.provider.host"));\r
92     }\r
93 \r
94     @Override\r
95     public void triggerProbe(Host host) {\r
96         log.info("Triggering probe on host {}", host);\r
97     }\r
98 \r
99     private class InnerOvsdbEventListener implements OvsdbEventListener {\r
100 \r
101         @Override\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
106             }\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
110                 return;\r
111             }\r
112             switch (event.type()) {\r
113             case PORT_ADDED:\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
119                                                          0L);\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
124                                                                              VlanId.vlanId(),\r
125                                                                              loaction,\r
126                                                                              annotations);\r
127                 providerService.hostDetected(hostId, hostDescription);\r
128                 break;\r
129             case PORT_REMOVED:\r
130                 HostId host = HostId.hostId(subject.hwAddress(), null);\r
131                 providerService.hostVanished(host);\r
132                 break;\r
133             default:\r
134                 break;\r
135             }\r
136 \r
137         }\r
138 \r
139     }\r
140 \r
141     public URI uri(String value) {\r
142         try {\r
143             return new URI("of", toHex(Long.valueOf(value)), null);\r
144         } catch (URISyntaxException e) {\r
145             return null;\r
146         }\r
147     }\r
148 }\r