blob: 2bd2b4ea692c43b8a07819f35d2d80d61e95d1c7 [file] [log] [blame]
Srikanth Vavilapallied12ae52015-02-09 14:43:19 -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.grouphandler;
17
18import static org.slf4j.LoggerFactory.getLogger;
19
20import java.util.Arrays;
21import java.util.HashMap;
22import java.util.List;
23
24import org.apache.felix.scr.annotations.Activate;
25import org.apache.felix.scr.annotations.Component;
26import org.apache.felix.scr.annotations.Deactivate;
27import org.apache.felix.scr.annotations.Reference;
28import org.apache.felix.scr.annotations.ReferenceCardinality;
29import org.onlab.packet.MacAddress;
30import org.onosproject.core.ApplicationId;
31import org.onosproject.core.CoreService;
32import org.onosproject.net.Device;
33import org.onosproject.net.DeviceId;
34import org.onosproject.net.device.DeviceEvent;
35import org.onosproject.net.device.DeviceListener;
36import org.onosproject.net.device.DeviceService;
37import org.onosproject.net.group.GroupService;
38import org.onosproject.net.link.LinkEvent;
39import org.onosproject.net.link.LinkListener;
40import org.onosproject.net.link.LinkService;
41import org.onosproject.net.topology.TopologyService;
42import org.slf4j.Logger;
43
44/**
45 * Sample application to verify group subsystem end to end.
46 * This application expects a network of maximum of six connected
47 * devices for the test to work. For every device in the network,
48 * this test application launches a default group handler function
49 * that creates ECMP groups for every neighbor the device is
50 * connected to.
51 */
52@Component(immediate = true)
53public class DefaultGroupHandlerApp {
54
55 private final Logger log = getLogger(getClass());
56
57 private final DeviceProperties config = new DeviceConfiguration();
58 private ApplicationId appId;
59 private HashMap<DeviceId, DefaultGroupHandler> dghMap =
60 new HashMap<DeviceId, DefaultGroupHandler>();
61
62 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
63 protected TopologyService topologyService;
64 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
65 protected DeviceService deviceService;
66 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
67 protected LinkService linkService;
68 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
69 protected GroupService groupService;
70 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
71 protected CoreService coreService;
72
73 private DeviceListener deviceListener = new InternalDeviceListener();
74 private LinkListener linkListener = new InternalLinkListener();
75
76 @Activate
77 public void activate() {
78 appId = coreService.registerApplication("org.onosproject.defaultgrouphandler");
79 log.info("DefaultGroupHandlerApp Activating");
80 deviceService.addListener(deviceListener);
81 linkService.addListener(linkListener);
82 for (Device device: deviceService.getDevices()) {
83 log.debug("Initiating default group handling for {}", device.id());
84 DefaultGroupHandler dgh = DefaultGroupHandler.createGroupHandler(device.id(),
85 appId,
86 config,
87 linkService,
88 groupService);
89 dgh.createGroups();
90 dghMap.put(device.id(), dgh);
91 }
92 log.info("Activated");
93 }
94
95 @Deactivate
96 public void deactivate() {
97 dghMap.clear();
98 }
99
100 public class DeviceConfiguration implements DeviceProperties {
101 private final List<Integer> allSegmentIds =
102 Arrays.asList(101, 102, 103, 104, 105, 106);
103 private HashMap<DeviceId, Integer> deviceSegmentIdMap =
104 new HashMap<DeviceId, Integer>() {
105 {
106 put(DeviceId.deviceId("of:0000000000000001"), 101);
107 put(DeviceId.deviceId("of:0000000000000002"), 102);
108 put(DeviceId.deviceId("of:0000000000000003"), 103);
109 put(DeviceId.deviceId("of:0000000000000004"), 104);
110 put(DeviceId.deviceId("of:0000000000000005"), 105);
111 put(DeviceId.deviceId("of:0000000000000006"), 106);
112 }
113 };
114 private final HashMap<DeviceId, MacAddress> deviceMacMap =
115 new HashMap<DeviceId, MacAddress>() {
116 {
117 put(DeviceId.deviceId("of:0000000000000001"),
118 MacAddress.valueOf("00:00:00:00:00:01"));
119 put(DeviceId.deviceId("of:0000000000000002"),
120 MacAddress.valueOf("00:00:00:00:00:02"));
121 put(DeviceId.deviceId("of:0000000000000003"),
122 MacAddress.valueOf("00:00:00:00:00:03"));
123 put(DeviceId.deviceId("of:0000000000000004"),
124 MacAddress.valueOf("00:00:00:00:00:04"));
125 put(DeviceId.deviceId("of:0000000000000005"),
126 MacAddress.valueOf("00:00:00:00:00:05"));
127 put(DeviceId.deviceId("of:0000000000000006"),
128 MacAddress.valueOf("00:00:00:00:00:06"));
129 }
130 };
131
132 @Override
133 public int getSegmentId(DeviceId deviceId) {
134 if (deviceSegmentIdMap.get(deviceId) != null) {
135 log.debug("getSegmentId for device{} is {}",
136 deviceId,
137 deviceSegmentIdMap.get(deviceId));
138 return deviceSegmentIdMap.get(deviceId);
139 } else {
140 throw new IllegalStateException();
141 }
142 }
143 @Override
144 public MacAddress getDeviceMac(DeviceId deviceId) {
145 if (deviceMacMap.get(deviceId) != null) {
146 log.debug("getDeviceMac for device{} is {}",
147 deviceId,
148 deviceMacMap.get(deviceId));
149 return deviceMacMap.get(deviceId);
150 } else {
151 throw new IllegalStateException();
152 }
153 }
154 @Override
155 public boolean isEdgeDevice(DeviceId deviceId) {
156 return true;
157 }
158 @Override
159 public List<Integer> getAllDeviceSegmentIds() {
160 return allSegmentIds;
161 }
162 }
163
164 private class InternalDeviceListener implements DeviceListener {
165
166 @Override
167 public void event(DeviceEvent event) {
168 switch (event.type()) {
169 case DEVICE_ADDED:
170 log.debug("Initiating default group handling for {}", event.subject().id());
171 DefaultGroupHandler dgh = DefaultGroupHandler.createGroupHandler(
172 event.subject().id(),
173 appId,
174 config,
175 linkService,
176 groupService);
177 dgh.createGroups();
178 dghMap.put(event.subject().id(), dgh);
179 break;
180 case PORT_REMOVED:
181 if (dghMap.get(event.subject().id()) != null) {
182 dghMap.get(event.subject().id()).portDown(event.port().number());
183 }
184 break;
185 default:
186 break;
187 }
188
189 }
190 }
191
192 private class InternalLinkListener implements LinkListener {
193
194 @Override
195 public void event(LinkEvent event) {
196 switch (event.type()) {
197 case LINK_ADDED:
198 if (dghMap.get(event.subject().src().deviceId()) != null) {
199 dghMap.get(event.subject().src().deviceId()).linkUp(event.subject());
200 }
201 break;
202 default:
203 break;
204 }
205 }
206
207 }
208}