blob: 5c5770220bdbd4f8ee82b09f799bc7532c8ec342 [file] [log] [blame]
Ray Milkey140e4782015-04-24 11:25:13 -07001/*
2 * Copyright 2014-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.xosintegration;
17
Jonathan Hart5e9a63d2015-05-19 16:21:46 -070018import com.eclipsesource.json.JsonArray;
19import com.eclipsesource.json.JsonObject;
alshabib60562282015-06-01 16:45:04 -070020import com.google.common.collect.Maps;
Ray Milkey140e4782015-04-24 11:25:13 -070021import org.apache.felix.scr.annotations.Activate;
22import org.apache.felix.scr.annotations.Component;
23import org.apache.felix.scr.annotations.Deactivate;
24import org.apache.felix.scr.annotations.Modified;
25import org.apache.felix.scr.annotations.Property;
26import org.apache.felix.scr.annotations.Reference;
27import org.apache.felix.scr.annotations.ReferenceCardinality;
28import org.apache.felix.scr.annotations.Service;
Jian Li9d616492016-03-09 10:52:49 -080029import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
Jonathan Hart5e9a63d2015-05-19 16:21:46 -070030import org.onlab.packet.VlanId;
Ray Milkey140e4782015-04-24 11:25:13 -070031import org.onlab.util.Tools;
32import org.onosproject.cfg.ComponentConfigService;
33import org.onosproject.core.ApplicationId;
34import org.onosproject.core.CoreService;
Jonathan Hart5e9a63d2015-05-19 16:21:46 -070035import org.onosproject.net.ConnectPoint;
36import org.onosproject.net.DeviceId;
37import org.onosproject.net.PortNumber;
38import org.onosproject.net.flow.DefaultTrafficSelector;
39import org.onosproject.net.flow.DefaultTrafficTreatment;
40import org.onosproject.net.flow.TrafficSelector;
41import org.onosproject.net.flow.TrafficTreatment;
42import org.onosproject.net.flowobjective.DefaultForwardingObjective;
43import org.onosproject.net.flowobjective.FlowObjectiveService;
44import org.onosproject.net.flowobjective.ForwardingObjective;
Ray Milkey140e4782015-04-24 11:25:13 -070045import org.osgi.service.component.ComponentContext;
46import org.slf4j.Logger;
47
Jian Li9d616492016-03-09 10:52:49 -080048import javax.ws.rs.client.Client;
49import javax.ws.rs.client.ClientBuilder;
50import javax.ws.rs.client.Entity;
51import javax.ws.rs.client.Invocation;
52import javax.ws.rs.client.WebTarget;
53import javax.ws.rs.core.Response;
Jonathan Hart5e9a63d2015-05-19 16:21:46 -070054import java.util.Dictionary;
alshabib60562282015-06-01 16:45:04 -070055import java.util.Map;
Jonathan Hart5e9a63d2015-05-19 16:21:46 -070056import java.util.Set;
57import java.util.stream.Collectors;
58import java.util.stream.IntStream;
Ray Milkey140e4782015-04-24 11:25:13 -070059
60import static com.google.common.base.Strings.isNullOrEmpty;
61import static com.google.common.net.MediaType.JSON_UTF_8;
Jonathan Hart64da69d2015-07-15 15:10:28 -070062import static java.net.HttpURLConnection.HTTP_CREATED;
63import static java.net.HttpURLConnection.HTTP_NO_CONTENT;
64import static java.net.HttpURLConnection.HTTP_OK;
Ray Milkey140e4782015-04-24 11:25:13 -070065import static org.slf4j.LoggerFactory.getLogger;
66
67
68/**
69 * XOS interface application.
70 */
71@Component(immediate = true)
72@Service
Jonathan Hartb92cc512015-11-16 23:05:21 -080073public class OnosXosIntegrationManager implements VoltTenantService {
Ray Milkeydea98172015-05-18 10:39:39 -070074 private static final String XOS_SERVER_ADDRESS_PROPERTY_NAME =
75 "xosServerAddress";
76 private static final String XOS_SERVER_PORT_PROPERTY_NAME =
77 "xosServerPort";
78 private static final String XOS_PROVIDER_SERVICE_PROPERTY_NAME =
79 "xosProviderService";
Ray Milkey140e4782015-04-24 11:25:13 -070080
81 private static final String TEST_XOS_SERVER_ADDRESS = "10.254.1.22";
82 private static final int TEST_XOS_SERVER_PORT = 8000;
83 private static final String XOS_TENANT_BASE_URI = "/xoslib/volttenant/";
Ray Milkeydea98172015-05-18 10:39:39 -070084 private static final int TEST_XOS_PROVIDER_SERVICE = 1;
Ray Milkey140e4782015-04-24 11:25:13 -070085
Jonathan Hartb4558032015-05-20 16:32:04 -070086 private static final int PRIORITY = 50000;
Jonathan Hart5e9a63d2015-05-19 16:21:46 -070087 private static final DeviceId FABRIC_DEVICE_ID = DeviceId.deviceId("of:5e3e486e73000187");
88 private static final PortNumber FABRIC_OLT_CONNECT_POINT = PortNumber.portNumber(2);
89 private static final PortNumber FABRIC_VCPE_CONNECT_POINT = PortNumber.portNumber(3);
90 private static final String FABRIC_CONTROLLER_ADDRESS = "10.0.3.136";
91 private static final int FABRIC_SERVER_PORT = 8181;
92 private static final String FABRIC_BASE_URI = "/onos/cordfabric/vlans/add";
93
Jonathan Hart64da69d2015-07-15 15:10:28 -070094 private static final DeviceId OLT_DEVICE_ID = DeviceId.deviceId("of:90e2ba82f97791e9");
95 private static final int OLT_UPLINK_PORT = 129;
96
Jonathan Hart5e9a63d2015-05-19 16:21:46 -070097 private static final ConnectPoint FABRIC_PORT = new ConnectPoint(
98 DeviceId.deviceId("of:000090e2ba82f974"),
99 PortNumber.portNumber(2));
100
Ray Milkey140e4782015-04-24 11:25:13 -0700101 private final Logger log = getLogger(getClass());
102 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
103 protected CoreService coreService;
104 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
105 protected ComponentConfigService cfgService;
Ray Milkeydea98172015-05-18 10:39:39 -0700106
Jonathan Hart5e9a63d2015-05-19 16:21:46 -0700107 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
108 protected FlowObjectiveService flowObjectiveService;
109
Ray Milkeydea98172015-05-18 10:39:39 -0700110 @Property(name = XOS_SERVER_ADDRESS_PROPERTY_NAME,
Ray Milkey140e4782015-04-24 11:25:13 -0700111 value = TEST_XOS_SERVER_ADDRESS,
112 label = "XOS Server address")
113 protected String xosServerAddress = TEST_XOS_SERVER_ADDRESS;
Ray Milkeydea98172015-05-18 10:39:39 -0700114
115 @Property(name = XOS_SERVER_PORT_PROPERTY_NAME,
Ray Milkey140e4782015-04-24 11:25:13 -0700116 intValue = TEST_XOS_SERVER_PORT,
117 label = "XOS Server port")
118 protected int xosServerPort = TEST_XOS_SERVER_PORT;
Ray Milkeydea98172015-05-18 10:39:39 -0700119
120 @Property(name = XOS_PROVIDER_SERVICE_PROPERTY_NAME,
121 intValue = TEST_XOS_PROVIDER_SERVICE,
122 label = "XOS Provider Service")
123 protected int xosProviderService = TEST_XOS_PROVIDER_SERVICE;
124
Ray Milkey140e4782015-04-24 11:25:13 -0700125 private ApplicationId appId;
alshabib60562282015-06-01 16:45:04 -0700126 private Map<String, ConnectPoint> nodeToPort;
alshabib17cde6d2015-06-05 15:03:51 -0700127 private Map<Long, Short> portToVlan;
Jonathan Hart08ad8232015-06-09 10:51:05 -0700128 private Map<ConnectPoint, String> portToSsid;
Ray Milkey140e4782015-04-24 11:25:13 -0700129
130 @Activate
131 public void activate(ComponentContext context) {
132 log.info("XOS app is starting");
133 cfgService.registerProperties(getClass());
134 appId = coreService.registerApplication("org.onosproject.xosintegration");
alshabib60562282015-06-01 16:45:04 -0700135
136 setupMap();
137
Ray Milkey140e4782015-04-24 11:25:13 -0700138 readComponentConfiguration(context);
139
140 log.info("XOS({}) started", appId.id());
141 }
142
143 @Deactivate
144 public void deactivate() {
145 cfgService.unregisterProperties(getClass(), false);
146 log.info("XOS({}) stopped", appId.id());
147 }
148
149 @Modified
150 public void modified(ComponentContext context) {
151 readComponentConfiguration(context);
152 }
153
alshabib60562282015-06-01 16:45:04 -0700154 private void setupMap() {
155 nodeToPort = Maps.newHashMap();
156
157 nodeToPort.put("cordcompute01.onlab.us", new ConnectPoint(FABRIC_DEVICE_ID,
158 PortNumber.portNumber(4)));
159
160 nodeToPort.put("cordcompute02.onlab.us", new ConnectPoint(FABRIC_DEVICE_ID,
161 PortNumber.portNumber(3)));
alshabib17cde6d2015-06-05 15:03:51 -0700162
Jonathan Hartc02437c2015-06-09 10:05:13 -0700163 portToVlan = Maps.newHashMap();
Jonathan Hart64da69d2015-07-15 15:10:28 -0700164 portToVlan.putIfAbsent(1L, (short) 201);
alshabib17cde6d2015-06-05 15:03:51 -0700165 portToVlan.putIfAbsent(6L, (short) 401);
Jonathan Hart08ad8232015-06-09 10:51:05 -0700166
167 portToSsid = Maps.newHashMap();
Jonathan Hart64da69d2015-07-15 15:10:28 -0700168 portToSsid.put(new ConnectPoint(OLT_DEVICE_ID, PortNumber.portNumber(1)), "0");
Jonathan Hart08ad8232015-06-09 10:51:05 -0700169 portToSsid.put(new ConnectPoint(FABRIC_DEVICE_ID, PortNumber.portNumber(6)), "1");
alshabib60562282015-06-01 16:45:04 -0700170 }
171
Ray Milkey140e4782015-04-24 11:25:13 -0700172 /**
173 * Converts a JSON representation of a tenant into a tenant object.
174 *
175 * @param jsonTenant JSON object representing the tenant
176 * @return volt tenant object
177 */
178 private VoltTenant jsonToTenant(JsonObject jsonTenant) {
179 return VoltTenant.builder()
180 .withHumanReadableName(jsonTenant.get("humanReadableName").asString())
181 .withId(jsonTenant.get("id").asInt())
182 .withProviderService(jsonTenant.get("provider_service").asInt())
183 .withServiceSpecificId(jsonTenant.get("service_specific_id").asString())
184 .withVlanId(jsonTenant.get("vlan_id").asString())
185 .build();
186 }
187
188 /**
189 * Converts a tenant object into a JSON string.
190 *
191 * @param tenant volt tenant object to convert
192 * @return JSON string for the tenant
193 */
194 private String tenantToJson(VoltTenant tenant) {
195 return "{"
196 + "\"humanReadableName\": \"" + tenant.humanReadableName() + "\","
197 + "\"id\": \"" + tenant.id() + "\","
198 + "\"provider_service\": \"" + tenant.providerService() + "\","
199 + "\"service_specific_id\": \"" + tenant.serviceSpecificId() + "\","
200 + "\"vlan_id\": \"" + tenant.vlanId() + "\""
201 + "}";
202 }
203
204 /**
205 * Gets a client web resource builder for the base XOS REST API
206 * with no additional URI.
207 *
208 * @return web resource builder
Sho SHIMIZUbe63b232015-06-30 10:57:58 -0700209 * @deprecated in Cardinal Release
Ray Milkey140e4782015-04-24 11:25:13 -0700210 */
Simon Hunt8483e9d2015-05-26 18:22:07 -0700211 @Deprecated
Jian Li9d616492016-03-09 10:52:49 -0800212 private Invocation.Builder getClientBuilder() {
Ray Milkey140e4782015-04-24 11:25:13 -0700213 return getClientBuilder("");
214 }
215
216 /**
217 * Gets a client web resource builder for the base XOS REST API
218 * with an optional additional URI.
219 *
220 * @return web resource builder
Sho SHIMIZUbe63b232015-06-30 10:57:58 -0700221 * @deprecated in Cardinal Release
Ray Milkey140e4782015-04-24 11:25:13 -0700222 */
Simon Hunt8483e9d2015-05-26 18:22:07 -0700223 @Deprecated
Jian Li9d616492016-03-09 10:52:49 -0800224 private Invocation.Builder getClientBuilder(String uri) {
Ray Milkey140e4782015-04-24 11:25:13 -0700225 String baseUrl = "http://" + xosServerAddress + ":"
226 + Integer.toString(xosServerPort);
Jian Li9d616492016-03-09 10:52:49 -0800227 Client client = ClientBuilder.newClient();
228 client.register(HttpAuthenticationFeature.basic("padmin@vicci.org", "letmein"));
229 WebTarget wt = client.target(baseUrl
Ray Milkey140e4782015-04-24 11:25:13 -0700230 + XOS_TENANT_BASE_URI + uri);
Jian Li9d616492016-03-09 10:52:49 -0800231 return wt.request(JSON_UTF_8.toString());
Ray Milkey140e4782015-04-24 11:25:13 -0700232 }
233
234 /**
235 * Performs a REST GET operation on the base XOS REST URI.
236 *
237 * @return JSON string fetched by the GET operation
Sho SHIMIZUbe63b232015-06-30 10:57:58 -0700238 * @deprecated in Cardinal Release
Ray Milkey140e4782015-04-24 11:25:13 -0700239 */
Simon Hunt8483e9d2015-05-26 18:22:07 -0700240 @Deprecated
Ray Milkey140e4782015-04-24 11:25:13 -0700241 private String getRest() {
242 return getRest("");
243 }
244
245 /**
246 * Performs a REST GET operation on the base XOS REST URI with
247 * an optional additional URI.
248 *
249 * @return JSON string fetched by the GET operation
Sho SHIMIZUbe63b232015-06-30 10:57:58 -0700250 * @deprecated in Cardinal Release
Ray Milkey140e4782015-04-24 11:25:13 -0700251 */
Simon Hunt8483e9d2015-05-26 18:22:07 -0700252 @Deprecated
Ray Milkey140e4782015-04-24 11:25:13 -0700253 private String getRest(String uri) {
Jian Li9d616492016-03-09 10:52:49 -0800254 Invocation.Builder builder = getClientBuilder(uri);
255 Response response = builder.get();
Ray Milkey140e4782015-04-24 11:25:13 -0700256
257 if (response.getStatus() != HTTP_OK) {
258 log.info("REST GET request returned error code {}",
259 response.getStatus());
260 }
Jian Li9d616492016-03-09 10:52:49 -0800261 String jsonString = builder.get(String.class);
Ray Milkey140e4782015-04-24 11:25:13 -0700262 log.info("JSON read:\n{}", jsonString);
263
264 return jsonString;
265 }
266
267 /**
268 * Performs a REST POST operation of a json string on the base
269 * XOS REST URI with an optional additional URI.
270 *
271 * @param json JSON string to post
Sho SHIMIZUbe63b232015-06-30 10:57:58 -0700272 * @deprecated in Cardinal Release
Ray Milkey140e4782015-04-24 11:25:13 -0700273 */
Simon Hunt8483e9d2015-05-26 18:22:07 -0700274 @Deprecated
alshabib60562282015-06-01 16:45:04 -0700275 private String postRest(String json) {
Jian Li9d616492016-03-09 10:52:49 -0800276 Invocation.Builder builder = getClientBuilder();
277 Response response = builder.post(Entity.json(json));
Ray Milkey140e4782015-04-24 11:25:13 -0700278
279 if (response.getStatus() != HTTP_CREATED) {
280 log.info("REST POST request returned error code {}",
281 response.getStatus());
282 }
Jian Li9d616492016-03-09 10:52:49 -0800283 return builder.post(Entity.json(json), String.class);
Ray Milkey140e4782015-04-24 11:25:13 -0700284 }
285
286 /**
287 * Performs a REST DELETE operation on the base
288 * XOS REST URI with an optional additional URI.
289 *
290 * @param uri optional additional URI
Sho SHIMIZUbe63b232015-06-30 10:57:58 -0700291 * @deprecated in Cardinal Release
Ray Milkey140e4782015-04-24 11:25:13 -0700292 */
Simon Hunt8483e9d2015-05-26 18:22:07 -0700293 @Deprecated
Ray Milkey140e4782015-04-24 11:25:13 -0700294 private void deleteRest(String uri) {
Jian Li9d616492016-03-09 10:52:49 -0800295 Invocation.Builder builder = getClientBuilder(uri);
296 Response response = builder.delete();
Ray Milkey140e4782015-04-24 11:25:13 -0700297
298 if (response.getStatus() != HTTP_NO_CONTENT) {
299 log.info("REST DELETE request returned error code {}",
300 response.getStatus());
301 }
302 }
303
304 /**
305 * Deletes the tenant with the given ID.
306 *
307 * @param tenantId ID of tenant to delete
308 */
309 private void deleteTenant(long tenantId) {
310 deleteRest(Long.toString(tenantId));
311 }
312
313 @Override
314 public Set<VoltTenant> getAllTenants() {
315 String jsonString = getRest();
316
317 JsonArray voltTenantItems = JsonArray.readFrom(jsonString);
318
319 return IntStream.range(0, voltTenantItems.size())
320 .mapToObj(index -> jsonToTenant(voltTenantItems.get(index).asObject()))
321 .collect(Collectors.toSet());
322 }
323
324 @Override
325 public void removeTenant(long id) {
326 deleteTenant(id);
327 }
328
329 @Override
330 public VoltTenant addTenant(VoltTenant newTenant) {
Ray Milkeydea98172015-05-18 10:39:39 -0700331 long providerServiceId = newTenant.providerService();
332 if (providerServiceId == -1) {
333 providerServiceId = xosProviderService;
334 }
Jonathan Hart64da69d2015-07-15 15:10:28 -0700335
336 PortNumber onuPort = newTenant.port().port();
Qianqian Hud70407d2016-02-18 15:35:33 +0800337 VlanId subscriberVlan;
338 try {
339 subscriberVlan = VlanId.vlanId(portToVlan.get(onuPort.toLong()));
340 } catch (NullPointerException npe) {
341 log.error("No matched port in portToVlan map", npe);
342 return newTenant;
343 }
Jonathan Hart64da69d2015-07-15 15:10:28 -0700344
Ray Milkeydea98172015-05-18 10:39:39 -0700345 VoltTenant tenantToCreate = VoltTenant.builder()
346 .withProviderService(providerServiceId)
Jonathan Hart08ad8232015-06-09 10:51:05 -0700347 .withServiceSpecificId(portToSsid.get(newTenant.port()))
Jonathan Hart64da69d2015-07-15 15:10:28 -0700348 .withVlanId(String.valueOf(subscriberVlan.toShort()))
Jonathan Hart5e9a63d2015-05-19 16:21:46 -0700349 .withPort(newTenant.port())
Ray Milkeydea98172015-05-18 10:39:39 -0700350 .build();
351 String json = tenantToJson(tenantToCreate);
Jonathan Hart5e9a63d2015-05-19 16:21:46 -0700352
Jonathan Hart64da69d2015-07-15 15:10:28 -0700353
354 provisionVlanOnPort(OLT_DEVICE_ID, OLT_UPLINK_PORT, onuPort, subscriberVlan.toShort());
Jonathan Hart5e9a63d2015-05-19 16:21:46 -0700355
alshabib60562282015-06-01 16:45:04 -0700356 String retJson = postRest(json);
Jonathan Hart5e9a63d2015-05-19 16:21:46 -0700357
Jonathan Hartb92cc512015-11-16 23:05:21 -0800358 fetchCpeLocation(tenantToCreate, retJson);
Jonathan Hart5e9a63d2015-05-19 16:21:46 -0700359
Ray Milkey140e4782015-04-24 11:25:13 -0700360 return newTenant;
361 }
362
Jonathan Hartb92cc512015-11-16 23:05:21 -0800363 private void fetchCpeLocation(VoltTenant newTenant, String jsonString) {
alshabib60562282015-06-01 16:45:04 -0700364 JsonObject json = JsonObject.readFrom(jsonString);
365
366 if (json.get("computeNodeName") != null) {
Jonathan Hart10b98ad2015-06-02 09:53:12 -0700367 ConnectPoint point = nodeToPort.get(json.get("computeNodeName").asString());
Jonathan Hart64da69d2015-07-15 15:10:28 -0700368 //ConnectPoint fromPoint = newTenant.port();
369 ConnectPoint oltPort = new ConnectPoint(FABRIC_DEVICE_ID, FABRIC_OLT_CONNECT_POINT);
alshabib60562282015-06-01 16:45:04 -0700370
371 provisionFabric(VlanId.vlanId(Short.parseShort(newTenant.vlanId())),
Jonathan Hart64da69d2015-07-15 15:10:28 -0700372 point, oltPort);
alshabib60562282015-06-01 16:45:04 -0700373 }
374
375 }
376
Ray Milkey140e4782015-04-24 11:25:13 -0700377 @Override
378 public VoltTenant getTenant(long id) {
379 String jsonString = getRest(Long.toString(id));
380 JsonObject jsonTenant = JsonObject.readFrom(jsonString);
381 if (jsonTenant.get("id") != null) {
382 return jsonToTenant(jsonTenant);
383 } else {
384 return null;
385 }
386 }
387
Jonathan Hart64da69d2015-07-15 15:10:28 -0700388 private void provisionVlanOnPort(DeviceId deviceId, int uplinkPort, PortNumber p, short vlanId) {
389
390 TrafficSelector upstream = DefaultTrafficSelector.builder()
Jonathan Hart1468fee2015-07-16 18:50:34 -0700391 .matchVlanId(VlanId.ANY)
Jonathan Hart64da69d2015-07-15 15:10:28 -0700392 .matchInPort(p)
393 .build();
394
395 TrafficSelector downstream = DefaultTrafficSelector.builder()
396 .matchVlanId(VlanId.vlanId(vlanId))
397 .matchInPort(PortNumber.portNumber(uplinkPort))
398 .build();
399
400 TrafficTreatment upstreamTreatment = DefaultTrafficTreatment.builder()
Jonathan Hart1468fee2015-07-16 18:50:34 -0700401 .setVlanId(VlanId.vlanId(vlanId))
Jonathan Hart64da69d2015-07-15 15:10:28 -0700402 .setOutput(PortNumber.portNumber(uplinkPort))
403 .build();
404
405 TrafficTreatment downstreamTreatment = DefaultTrafficTreatment.builder()
Jonathan Hart1468fee2015-07-16 18:50:34 -0700406 .popVlan()
Jonathan Hart64da69d2015-07-15 15:10:28 -0700407 .setOutput(p)
408 .build();
409
410
411 ForwardingObjective upFwd = DefaultForwardingObjective.builder()
412 .withFlag(ForwardingObjective.Flag.VERSATILE)
413 .withPriority(1000)
414 .makePermanent()
415 .withSelector(upstream)
416 .fromApp(appId)
417 .withTreatment(upstreamTreatment)
418 .add();
419
420 ForwardingObjective downFwd = DefaultForwardingObjective.builder()
421 .withFlag(ForwardingObjective.Flag.VERSATILE)
422 .withPriority(1000)
423 .makePermanent()
424 .withSelector(downstream)
425 .fromApp(appId)
426 .withTreatment(downstreamTreatment)
427 .add();
428
429 flowObjectiveService.forward(deviceId, upFwd);
430 flowObjectiveService.forward(deviceId, downFwd);
431
432 }
433
Jonathan Hart5e9a63d2015-05-19 16:21:46 -0700434 private void provisionDataPlane(VoltTenant tenant) {
435 VlanId vlan = VlanId.vlanId(Short.parseShort(tenant.vlanId()));
436
437 TrafficSelector fromGateway = DefaultTrafficSelector.builder()
438 .matchInPhyPort(tenant.port().port())
439 .build();
440
441 TrafficSelector fromFabric = DefaultTrafficSelector.builder()
442 .matchInPhyPort(FABRIC_PORT.port())
443 .matchVlanId(vlan)
444 .build();
445
446 TrafficTreatment toFabric = DefaultTrafficTreatment.builder()
447 .pushVlan()
448 .setVlanId(vlan)
449 .setOutput(FABRIC_PORT.port())
450 .build();
451
452 TrafficTreatment toGateway = DefaultTrafficTreatment.builder()
453 .popVlan()
454 .setOutput(tenant.port().port())
455 .build();
456
457 ForwardingObjective forwardToFabric = DefaultForwardingObjective.builder()
458 .withFlag(ForwardingObjective.Flag.VERSATILE)
Jonathan Hartb4558032015-05-20 16:32:04 -0700459 .withPriority(PRIORITY)
Jonathan Hart5e9a63d2015-05-19 16:21:46 -0700460 .makePermanent()
461 .fromApp(appId)
462 .withSelector(fromGateway)
463 .withTreatment(toFabric)
464 .add();
465
466 ForwardingObjective forwardToGateway = DefaultForwardingObjective.builder()
467 .withFlag(ForwardingObjective.Flag.VERSATILE)
Jonathan Hartb4558032015-05-20 16:32:04 -0700468 .withPriority(PRIORITY)
Jonathan Hart5e9a63d2015-05-19 16:21:46 -0700469 .makePermanent()
470 .fromApp(appId)
471 .withSelector(fromFabric)
472 .withTreatment(toGateway)
473 .add();
474
475 flowObjectiveService.forward(FABRIC_PORT.deviceId(), forwardToFabric);
476 flowObjectiveService.forward(FABRIC_PORT.deviceId(), forwardToGateway);
477 }
478
alshabib48dd9a12015-06-05 14:45:57 -0700479 private void provisionFabric(VlanId vlanId, ConnectPoint point, ConnectPoint fromPoint) {
alshabib60562282015-06-01 16:45:04 -0700480
Jonathan Hart64da69d2015-07-15 15:10:28 -0700481 long vlan = vlanId.toShort();
alshabibc4b5d462015-06-08 23:06:24 -0700482
alshabib60562282015-06-01 16:45:04 -0700483 JsonObject node = new JsonObject();
alshabibc4b5d462015-06-08 23:06:24 -0700484 node.add("vlan", vlan);
485 if (vlan == 201) {
486 node.add("iptv", true);
487 } else {
488 node.add("iptv", false);
489 }
alshabib60562282015-06-01 16:45:04 -0700490 JsonArray array = new JsonArray();
491 JsonObject cp1 = new JsonObject();
492 JsonObject cp2 = new JsonObject();
493 cp1.add("device", point.deviceId().toString());
494 cp1.add("port", point.port().toLong());
alshabib48dd9a12015-06-05 14:45:57 -0700495 cp2.add("device", fromPoint.deviceId().toString());
496 cp2.add("port", fromPoint.port().toLong());
alshabib60562282015-06-01 16:45:04 -0700497 array.add(cp1);
498 array.add(cp2);
499 node.add("ports", array);
500
Jonathan Hart5e9a63d2015-05-19 16:21:46 -0700501
502 String baseUrl = "http://" + FABRIC_CONTROLLER_ADDRESS + ":"
503 + Integer.toString(FABRIC_SERVER_PORT);
Jian Li9d616492016-03-09 10:52:49 -0800504 Client client = ClientBuilder.newClient();
505 WebTarget wt = client.target(baseUrl + FABRIC_BASE_URI);
506 Invocation.Builder builder = wt.request(JSON_UTF_8.toString());
Jonathan Hart5e9a63d2015-05-19 16:21:46 -0700507
Jian Li9d616492016-03-09 10:52:49 -0800508 builder.post(Entity.json(node.toString()));
Jonathan Hart5e9a63d2015-05-19 16:21:46 -0700509 }
510
Ray Milkey140e4782015-04-24 11:25:13 -0700511 /**
512 * Extracts properties from the component configuration context.
513 *
514 * @param context the component context
515 */
516 private void readComponentConfiguration(ComponentContext context) {
517 Dictionary<?, ?> properties = context.getProperties();
518
Ray Milkeydea98172015-05-18 10:39:39 -0700519 String newXosServerAddress =
520 Tools.get(properties, XOS_SERVER_ADDRESS_PROPERTY_NAME);
Ray Milkey140e4782015-04-24 11:25:13 -0700521 if (!isNullOrEmpty(newXosServerAddress)) {
522 xosServerAddress = newXosServerAddress;
523 }
524
Ray Milkeydea98172015-05-18 10:39:39 -0700525 String newXosServerPortString =
526 Tools.get(properties, XOS_SERVER_PORT_PROPERTY_NAME);
Ray Milkey140e4782015-04-24 11:25:13 -0700527 if (!isNullOrEmpty(newXosServerPortString)) {
528 xosServerPort = Integer.parseInt(newXosServerPortString);
529 }
Ray Milkeydea98172015-05-18 10:39:39 -0700530
531 String newXosProviderServiceString =
532 Tools.get(properties, XOS_PROVIDER_SERVICE_PROPERTY_NAME);
533 if (!isNullOrEmpty(newXosProviderServiceString)) {
534 xosProviderService = Integer.parseInt(newXosProviderServiceString);
535 }
Ray Milkey140e4782015-04-24 11:25:13 -0700536 }
537}
538
539