blob: e1ef13f03f3c8249903daae14c3feab945e3d096 [file] [log] [blame]
Brian O'Connor5296b322014-10-23 14:59:05 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 Open Networking Laboratory
Brian O'Connor5296b322014-10-23 14:59:05 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * 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
Brian O'Connor5296b322014-10-23 14:59:05 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * 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.
Brian O'Connor5296b322014-10-23 14:59:05 -070015 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.cli.net;
Brian O'Connor5296b322014-10-23 14:59:05 -070017
Brian O'Connor5296b322014-10-23 14:59:05 -070018import org.apache.karaf.shell.commands.Argument;
19import org.apache.karaf.shell.commands.Command;
Aaron Kruglikov0a4da0d2015-06-10 14:40:48 -070020import org.apache.karaf.shell.commands.Option;
Toru Furusawa72ee30c2016-01-08 13:29:04 -080021import org.onosproject.net.CltSignalType;
Brian O'Connorabafb502014-12-02 22:26:20 -080022import org.onosproject.net.ConnectPoint;
Marc De Leenheer9f7d1892015-05-30 13:22:24 -070023import org.onosproject.net.OchPort;
24import org.onosproject.net.OduCltPort;
Marc De Leenheer88194c32015-05-29 22:10:59 -070025import org.onosproject.net.DeviceId;
Marc De Leenheer8c2caac2015-05-28 16:37:33 -070026import org.onosproject.net.OduSignalType;
Marc De Leenheer9f7d1892015-05-30 13:22:24 -070027import org.onosproject.net.Port;
28import org.onosproject.net.device.DeviceService;
Brian O'Connorabafb502014-12-02 22:26:20 -080029import org.onosproject.net.intent.Intent;
30import org.onosproject.net.intent.IntentService;
Marc De Leenheer9f7d1892015-05-30 13:22:24 -070031import org.onosproject.net.intent.OpticalCircuitIntent;
Brian O'Connorabafb502014-12-02 22:26:20 -080032import org.onosproject.net.intent.OpticalConnectivityIntent;
Brian O'Connor5296b322014-10-23 14:59:05 -070033
Marc De Leenheer88194c32015-05-29 22:10:59 -070034import java.util.List;
35
36import static com.google.common.base.Preconditions.checkArgument;
37
Brian O'Connor5296b322014-10-23 14:59:05 -070038/**
Marc De Leenheer9f7d1892015-05-30 13:22:24 -070039 * Installs optical connectivity or circuit intents, depending on given port types.
Brian O'Connor5296b322014-10-23 14:59:05 -070040 */
41@Command(scope = "onos", name = "add-optical-intent",
42 description = "Installs optical connectivity intent")
43public class AddOpticalIntentCommand extends ConnectivityIntentCommand {
44
45 @Argument(index = 0, name = "ingressDevice",
46 description = "Ingress Device/Port Description",
47 required = true, multiValued = false)
Ayaka Koshibeafb546f2015-10-23 17:13:58 -070048 String ingressDeviceString = "";
Brian O'Connor5296b322014-10-23 14:59:05 -070049
50 @Argument(index = 1, name = "egressDevice",
51 description = "Egress Device/Port Description",
52 required = true, multiValued = false)
Ayaka Koshibeafb546f2015-10-23 17:13:58 -070053 String egressDeviceString = "";
Aaron Kruglikov0a4da0d2015-06-10 14:40:48 -070054
55 @Option(name = "-b", aliases = "--bidirectional",
56 description = "If this argument is passed the optical link created will be bidirectional, " +
57 "else the link will be unidirectional.",
58 required = false, multiValued = false)
59 private boolean bidirectional = false;
60
Brian O'Connor5296b322014-10-23 14:59:05 -070061
Marc De Leenheer88194c32015-05-29 22:10:59 -070062 private ConnectPoint createConnectPoint(String devicePortString) {
63 String[] splitted = devicePortString.split("/");
64
65 checkArgument(splitted.length == 2,
66 "Connect point must be in \"deviceUri/portNumber\" format");
67
68 DeviceId deviceId = DeviceId.deviceId(splitted[0]);
Marc De Leenheer88194c32015-05-29 22:10:59 -070069 DeviceService deviceService = get(DeviceService.class);
70
71 List<Port> ports = deviceService.getPorts(deviceId);
72
73 for (Port port : ports) {
74 if (splitted[1].equals(port.number().name())) {
75 return new ConnectPoint(deviceId, port.number());
76 }
77 }
78
79 return null;
80 }
81
Brian O'Connor5296b322014-10-23 14:59:05 -070082 @Override
83 protected void execute() {
84 IntentService service = get(IntentService.class);
85
Marc De Leenheer88194c32015-05-29 22:10:59 -070086 ConnectPoint ingress = createConnectPoint(ingressDeviceString);
87 ConnectPoint egress = createConnectPoint(egressDeviceString);
Brian O'Connor5296b322014-10-23 14:59:05 -070088
Marc De Leenheer88194c32015-05-29 22:10:59 -070089 if (ingress == null || egress == null) {
Ayaka Koshibeafb546f2015-10-23 17:13:58 -070090 print("Invalid endpoint(s); could not create optical intent");
91 return;
Marc De Leenheer88194c32015-05-29 22:10:59 -070092 }
Brian O'Connor5296b322014-10-23 14:59:05 -070093
Marc De Leenheer9f7d1892015-05-30 13:22:24 -070094 DeviceService deviceService = get(DeviceService.class);
95 Port srcPort = deviceService.getPort(ingress.deviceId(), ingress.port());
96 Port dstPort = deviceService.getPort(egress.deviceId(), egress.port());
97
98 Intent intent;
99 // FIXME: Hardcoded signal types
100 if (srcPort instanceof OduCltPort && dstPort instanceof OduCltPort) {
101 intent = OpticalCircuitIntent.builder()
102 .appId(appId())
103 .key(key())
104 .src(ingress)
105 .dst(egress)
Toru Furusawa72ee30c2016-01-08 13:29:04 -0800106 .signalType(CltSignalType.CLT_10GBE)
Aaron Kruglikov0a4da0d2015-06-10 14:40:48 -0700107 .bidirectional(bidirectional)
Marc De Leenheer9f7d1892015-05-30 13:22:24 -0700108 .build();
109 } else if (srcPort instanceof OchPort && dstPort instanceof OchPort) {
110 intent = OpticalConnectivityIntent.builder()
111 .appId(appId())
112 .key(key())
113 .src(ingress)
114 .dst(egress)
115 .signalType(OduSignalType.ODU4)
Aaron Kruglikov0a4da0d2015-06-10 14:40:48 -0700116 .bidirectional(bidirectional)
Marc De Leenheer9f7d1892015-05-30 13:22:24 -0700117 .build();
118 } else {
119 print("Unable to create optical intent between connect points {} and {}", ingress, egress);
120 return;
121 }
122
Brian O'Connor5296b322014-10-23 14:59:05 -0700123 service.submit(intent);
Ray Milkeycb33a132015-02-02 10:05:12 -0800124 print("Optical intent submitted:\n%s", intent.toString());
Brian O'Connor5296b322014-10-23 14:59:05 -0700125 }
Brian O'Connor5296b322014-10-23 14:59:05 -0700126}