Yuta HIGUCHI
Committed by Gerrit Code Review

[ONOS-4513] decouple optical-model from CLI

- core/cli is now optical-model clean
- Add command for pretty printing optical-ports

Change-Id: I2926ef6d52971d1a7f6642dfe4098d7ed2422363
Showing 28 changed files with 431 additions and 157 deletions
1 COMPILE_DEPS = [ 1 COMPILE_DEPS = [
2 '//lib:CORE_DEPS', 2 '//lib:CORE_DEPS',
3 '//incubator/api:onos-incubator-api', 3 '//incubator/api:onos-incubator-api',
4 + '//cli:onos-cli',
5 + '//lib:org.apache.karaf.shell.console',
4 ] 6 ]
5 7
6 TEST_DEPS = [ 8 TEST_DEPS = [
......
...@@ -59,6 +59,17 @@ ...@@ -59,6 +59,17 @@
59 59
60 <dependency> 60 <dependency>
61 <groupId>org.onosproject</groupId> 61 <groupId>org.onosproject</groupId>
62 + <artifactId>onos-cli</artifactId>
63 + <version>${project.version}</version>
64 + </dependency>
65 +
66 + <dependency>
67 + <groupId>org.apache.karaf.shell</groupId>
68 + <artifactId>org.apache.karaf.shell.console</artifactId>
69 + </dependency>
70 +
71 + <dependency>
72 + <groupId>org.onosproject</groupId>
62 <artifactId>onlab-junit</artifactId> 73 <artifactId>onlab-junit</artifactId>
63 <scope>test</scope> 74 <scope>test</scope>
64 </dependency> 75 </dependency>
......
...@@ -17,8 +17,6 @@ package org.onosproject.net.optical; ...@@ -17,8 +17,6 @@ package org.onosproject.net.optical;
17 17
18 import org.onosproject.net.OchSignal; 18 import org.onosproject.net.OchSignal;
19 import org.onosproject.net.OduSignalType; 19 import org.onosproject.net.OduSignalType;
20 -import org.onosproject.net.Port;
21 -
22 import com.google.common.annotations.Beta; 20 import com.google.common.annotations.Beta;
23 21
24 /** 22 /**
...@@ -27,7 +25,7 @@ import com.google.common.annotations.Beta; ...@@ -27,7 +25,7 @@ import com.google.common.annotations.Beta;
27 * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)" 25 * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)"
28 */ 26 */
29 @Beta 27 @Beta
30 -public interface OchPort extends Port { 28 +public interface OchPort extends ProjectedPort {
31 29
32 /** 30 /**
33 * Returns ODU signal type. 31 * Returns ODU signal type.
......
...@@ -16,8 +16,6 @@ ...@@ -16,8 +16,6 @@
16 package org.onosproject.net.optical; 16 package org.onosproject.net.optical;
17 17
18 import org.onosproject.net.CltSignalType; 18 import org.onosproject.net.CltSignalType;
19 -import org.onosproject.net.Port;
20 -
21 import com.google.common.annotations.Beta; 19 import com.google.common.annotations.Beta;
22 20
23 /** 21 /**
...@@ -26,7 +24,7 @@ import com.google.common.annotations.Beta; ...@@ -26,7 +24,7 @@ import com.google.common.annotations.Beta;
26 * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)" 24 * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)"
27 */ 25 */
28 @Beta 26 @Beta
29 -public interface OduCltPort extends Port { 27 +public interface OduCltPort extends ProjectedPort {
30 28
31 /** 29 /**
32 * Returns ODU client signal type. 30 * Returns ODU client signal type.
......
...@@ -16,8 +16,6 @@ ...@@ -16,8 +16,6 @@
16 package org.onosproject.net.optical; 16 package org.onosproject.net.optical;
17 17
18 import org.onlab.util.Frequency; 18 import org.onlab.util.Frequency;
19 -import org.onosproject.net.Port;
20 -
21 import com.google.common.annotations.Beta; 19 import com.google.common.annotations.Beta;
22 20
23 /** 21 /**
...@@ -28,7 +26,7 @@ import com.google.common.annotations.Beta; ...@@ -28,7 +26,7 @@ import com.google.common.annotations.Beta;
28 * Assumes we only support fixed grid for now. 26 * Assumes we only support fixed grid for now.
29 */ 27 */
30 @Beta 28 @Beta
31 -public interface OmsPort extends Port { 29 +public interface OmsPort extends ProjectedPort {
32 30
33 /** 31 /**
34 * Returns the total number of channels on the port. 32 * Returns the total number of channels on the port.
......
...@@ -16,8 +16,6 @@ ...@@ -16,8 +16,6 @@
16 package org.onosproject.net.optical; 16 package org.onosproject.net.optical;
17 17
18 import org.onosproject.net.OtuSignalType; 18 import org.onosproject.net.OtuSignalType;
19 -import org.onosproject.net.Port;
20 -
21 import com.google.common.annotations.Beta; 19 import com.google.common.annotations.Beta;
22 20
23 /** 21 /**
...@@ -27,7 +25,7 @@ import com.google.common.annotations.Beta; ...@@ -27,7 +25,7 @@ import com.google.common.annotations.Beta;
27 * Open Networking Foundation "Optical Transport Protocol Extensions Version 1.0". 25 * Open Networking Foundation "Optical Transport Protocol Extensions Version 1.0".
28 */ 26 */
29 @Beta 27 @Beta
30 -public interface OtuPort extends Port { 28 +public interface OtuPort extends ProjectedPort {
31 29
32 /** 30 /**
33 * Returns OTU signal type. 31 * Returns OTU signal type.
......
1 +/*
2 + * Copyright 2016-present 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 + */
16 +package org.onosproject.net.optical;
17 +
18 +import org.onosproject.net.Annotations;
19 +import org.onosproject.net.Port;
20 +
21 +import com.google.common.annotations.Beta;
22 +
23 +/**
24 + * Abstraction of a network port.
25 + */
26 +@Beta
27 +public interface ProjectedPort extends Port {
28 +
29 + /**
30 + * Returns the key/value annotations, not used by projection.
31 + *
32 + * @return key/value annotations
33 + */
34 + Annotations unhandledAnnotations();
35 +
36 +}
...@@ -13,11 +13,14 @@ ...@@ -13,11 +13,14 @@
13 * See the License for the specific language governing permissions and 13 * See the License for the specific language governing permissions and
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 -package org.onosproject.cli.net; 16 +package org.onosproject.net.optical.cli;
17 17
18 import org.apache.karaf.shell.commands.Argument; 18 import org.apache.karaf.shell.commands.Argument;
19 import org.apache.karaf.shell.commands.Command; 19 import org.apache.karaf.shell.commands.Command;
20 import org.apache.karaf.shell.commands.Option; 20 import org.apache.karaf.shell.commands.Option;
21 +import org.onosproject.cli.app.AllApplicationNamesCompleter;
22 +import org.onosproject.cli.net.ConnectPointCompleter;
23 +import org.onosproject.cli.net.ConnectivityIntentCommand;
21 import org.onosproject.net.CltSignalType; 24 import org.onosproject.net.CltSignalType;
22 import org.onosproject.net.ConnectPoint; 25 import org.onosproject.net.ConnectPoint;
23 import org.onosproject.net.Device; 26 import org.onosproject.net.Device;
...@@ -45,6 +48,14 @@ import static org.onosproject.net.optical.device.OpticalDeviceServiceView.optica ...@@ -45,6 +48,14 @@ import static org.onosproject.net.optical.device.OpticalDeviceServiceView.optica
45 description = "Installs optical connectivity intent") 48 description = "Installs optical connectivity intent")
46 public class AddOpticalIntentCommand extends ConnectivityIntentCommand { 49 public class AddOpticalIntentCommand extends ConnectivityIntentCommand {
47 50
51 + // OSGi workaround
52 + @SuppressWarnings("unused")
53 + private ConnectPointCompleter cpCompleter;
54 +
55 + // OSGi workaround
56 + @SuppressWarnings("unused")
57 + private AllApplicationNamesCompleter appCompleter;
58 +
48 @Argument(index = 0, name = "ingressDevice", 59 @Argument(index = 0, name = "ingressDevice",
49 description = "Ingress Device/Port Description", 60 description = "Ingress Device/Port Description",
50 required = true, multiValued = false) 61 required = true, multiValued = false)
......
1 +/*
2 + * Copyright 2014-present 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 + */
16 +package org.onosproject.net.optical.cli;
17 +
18 +import com.fasterxml.jackson.databind.ObjectMapper;
19 +import org.apache.karaf.shell.commands.Command;
20 +import org.onlab.util.Frequency;
21 +import org.onosproject.cli.net.DevicePortsListCommand;
22 +import org.onosproject.net.Device;
23 +import org.onosproject.net.Port;
24 +import org.onosproject.net.Port.Type;
25 +import org.onosproject.net.device.DeviceService;
26 +import org.onosproject.net.optical.OchPort;
27 +import org.onosproject.net.optical.OduCltPort;
28 +import org.onosproject.net.optical.OmsPort;
29 +import org.onosproject.net.optical.OtuPort;
30 +
31 +import java.util.ArrayList;
32 +import java.util.EnumSet;
33 +import java.util.List;
34 +
35 +import static org.onosproject.net.DeviceId.deviceId;
36 +import static org.onosproject.net.optical.device.OpticalDeviceServiceView.opticalView;
37 +
38 +/**
39 + * Lists all ports or all ports of a device.
40 + */
41 +@Command(scope = "onos", name = "optical-ports",
42 + description = "Lists all optical ports or all optical ports of a device")
43 +public class OpticalPortsListCommand extends DevicePortsListCommand {
44 +
45 + private static final String FMT = " port=%s, state=%s, type=%s, speed=%s %s";
46 + private static final String FMT_OCH = " port=%s, state=%s, type=%s, signalType=%s, isTunable=%s %s";
47 + private static final String FMT_ODUCLT_OTU = " port=%s, state=%s, type=%s, signalType=%s %s";
48 + private static final String FMT_OMS = " port=%s, state=%s, type=%s, freqs=%s / %s / %s GHz, totalChannels=%s %s";
49 +
50 + private static final EnumSet<Port.Type> OPTICAL = EnumSet.of(Type.OCH, Type.ODUCLT, Type.OMS, Type.OTU);
51 +
52 + @Override
53 + protected void execute() {
54 + DeviceService service = opticalView(get(DeviceService.class));
55 + if (uri == null) {
56 + if (outputJson()) {
57 + print("%s", jsonPorts(service, getSortedDevices(service)));
58 + } else {
59 + for (Device device : getSortedDevices(service)) {
60 + printDevice(service, device);
61 + printPorts(service, device);
62 + }
63 + }
64 +
65 + } else {
66 + Device device = service.getDevice(deviceId(uri));
67 + if (device == null) {
68 + error("No such device %s", uri);
69 + } else if (outputJson()) {
70 + print("%s", jsonPorts(service, new ObjectMapper(), device));
71 + } else {
72 + printDevice(service, device);
73 + printPorts(service, device);
74 + }
75 + }
76 + }
77 +
78 + // Determines if a port should be included in output.
79 + @Override
80 + protected boolean isIncluded(Port port) {
81 + return OPTICAL.contains(port.type()) &&
82 + super.isIncluded(port);
83 + }
84 +
85 + @Override
86 + protected void printPorts(DeviceService service, Device device) {
87 + List<Port> ports = new ArrayList<>(service.getPorts(device.id()));
88 + ports.sort((p1, p2) ->
89 + Long.signum(p1.number().toLong() - p2.number().toLong())
90 + );
91 + for (Port port : ports) {
92 + if (!isIncluded(port)) {
93 + continue;
94 + }
95 + String portName = port.number().toString();
96 + String portIsEnabled = port.isEnabled() ? "enabled" : "disabled";
97 + String portType = port.type().toString().toLowerCase();
98 + switch (port.type()) {
99 + case OCH:
100 + if (port instanceof OchPort) {
101 + OchPort och = (OchPort) port;
102 + print(FMT_OCH, portName, portIsEnabled, portType,
103 + och.signalType().toString(),
104 + och.isTunable() ? "yes" : "no",
105 + annotations(och.unhandledAnnotations()));
106 + break;
107 + }
108 + print("WARN: OchPort but not on OpticalDevice or ill-formed");
109 + print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations(port.annotations()));
110 + break;
111 + case ODUCLT:
112 + if (port instanceof OduCltPort) {
113 + OduCltPort oduCltPort = (OduCltPort) port;
114 + print(FMT_ODUCLT_OTU, portName, portIsEnabled, portType,
115 + oduCltPort.signalType().toString(),
116 + annotations(oduCltPort.unhandledAnnotations()));
117 + break;
118 + }
119 + print("WARN: OduCltPort but not on OpticalDevice or ill-formed");
120 + print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations(port.annotations()));
121 + break;
122 + case OMS:
123 + if (port instanceof OmsPort) {
124 + OmsPort oms = (OmsPort) port;
125 + print(FMT_OMS, portName, portIsEnabled, portType,
126 + oms.minFrequency().asHz() / Frequency.ofGHz(1).asHz(),
127 + oms.maxFrequency().asHz() / Frequency.ofGHz(1).asHz(),
128 + oms.grid().asHz() / Frequency.ofGHz(1).asHz(),
129 + oms.totalChannels(),
130 + annotations(oms.unhandledAnnotations()));
131 + break;
132 + }
133 + print("WARN: OmsPort but not on OpticalDevice or ill-formed");
134 + print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations(port.annotations()));
135 + break;
136 + case OTU:
137 + if (port instanceof OtuPort) {
138 + OtuPort otuPort = (OtuPort) port;
139 + print(FMT_ODUCLT_OTU, portName, portIsEnabled, portType,
140 + otuPort.signalType().toString(),
141 + annotations(otuPort.unhandledAnnotations()));
142 + break;
143 + }
144 + print("WARN: OtuPort but not on OpticalDevice or ill-formed");
145 + print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations(port.annotations()));
146 + break;
147 + default:
148 + // do not print non-optical ports
149 + break;
150 + }
151 + }
152 + }
153 +}
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5 + * use this file except in compliance with the License. You may obtain a copy of
6 + * 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, WITHOUT
12 + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 + * License for the specific language governing permissions and limitations under
14 + * the License.
15 + */
16 +
17 +/**
18 + * Console command-line for interacting with the
19 + * optical network model &amp; services.
20 + */
21 +package org.onosproject.net.optical.cli;
1 +/*
2 + * Copyright 2016-present 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 + */
16 +package org.onosproject.net.optical.device;
17 +
18 +import static com.google.common.base.Preconditions.checkNotNull;
19 +
20 +import java.util.HashMap;
21 +import java.util.Map;
22 +import java.util.Set;
23 +
24 +import org.onosproject.net.Annotations;
25 +
26 +import com.google.common.annotations.Beta;
27 +import com.google.common.collect.ImmutableSet;
28 +import com.google.common.collect.Sets;
29 +
30 +/**
31 + * Filtered {@link Annotations} view.
32 + */
33 +@Beta
34 +public class FilteredAnnotation implements Annotations {
35 +
36 + private final Annotations delegate;
37 + private final Set<String> filtered;
38 +
39 + /**
40 + * Creates filtered {@link Annotations} view based on {@code delegate}.
41 + *
42 + * @param delegate input {@link Annotations}
43 + * @param keys to filter-out
44 + */
45 + public FilteredAnnotation(Annotations delegate, Set<String> keys) {
46 + this.delegate = checkNotNull(delegate);
47 + this.filtered = ImmutableSet.copyOf(keys);
48 + }
49 +
50 + @Override
51 + public String value(String key) {
52 + if (filtered.contains(key)) {
53 + return null;
54 + }
55 + return delegate.value(key);
56 + }
57 +
58 + @Override
59 + public Set<String> keys() {
60 + return Sets.difference(delegate.keys(), filtered);
61 + }
62 +
63 + @Override
64 + public String toString() {
65 + Map<String, String> mapView = new HashMap<>();
66 + keys().forEach(key -> mapView.put(key, delegate.value(key)));
67 + return mapView.toString();
68 + }
69 +}
...@@ -38,6 +38,7 @@ import org.slf4j.Logger; ...@@ -38,6 +38,7 @@ import org.slf4j.Logger;
38 import com.fasterxml.jackson.databind.ObjectMapper; 38 import com.fasterxml.jackson.databind.ObjectMapper;
39 import com.fasterxml.jackson.databind.node.ObjectNode; 39 import com.fasterxml.jackson.databind.node.ObjectNode;
40 import com.google.common.annotations.Beta; 40 import com.google.common.annotations.Beta;
41 +import com.google.common.collect.ImmutableSet;
41 42
42 /** 43 /**
43 * OCh port related helpers. 44 * OCh port related helpers.
...@@ -151,6 +152,16 @@ public final class OchPortHelper { ...@@ -151,6 +152,16 @@ public final class OchPortHelper {
151 } 152 }
152 } 153 }
153 154
155 + /**
156 + * Returns {@link Annotations} not used by the port type projection.
157 + *
158 + * @param input {@link Annotations}
159 + * @return filtered view of given {@link Annotations}
160 + */
161 + public static Annotations stripHandledAnnotations(Annotations input) {
162 + return new FilteredAnnotation(input, ImmutableSet.of(SIGNAL_TYPE, TUNABLE, LAMBDA));
163 + }
164 +
154 // not meant to be instantiated 165 // not meant to be instantiated
155 private OchPortHelper() {} 166 private OchPortHelper() {}
156 } 167 }
......
...@@ -33,6 +33,7 @@ import org.onosproject.net.optical.impl.DefaultOduCltPort; ...@@ -33,6 +33,7 @@ import org.onosproject.net.optical.impl.DefaultOduCltPort;
33 import org.slf4j.Logger; 33 import org.slf4j.Logger;
34 34
35 import com.google.common.annotations.Beta; 35 import com.google.common.annotations.Beta;
36 +import com.google.common.collect.ImmutableSet;
36 37
37 /** 38 /**
38 * ODU client port related helpers. 39 * ODU client port related helpers.
...@@ -122,6 +123,16 @@ public final class OduCltPortHelper { ...@@ -122,6 +123,16 @@ public final class OduCltPortHelper {
122 } 123 }
123 } 124 }
124 125
126 + /**
127 + * Returns {@link Annotations} not used by the port type projection.
128 + *
129 + * @param input {@link Annotations}
130 + * @return filtered view of given {@link Annotations}
131 + */
132 + public static Annotations stripHandledAnnotations(Annotations input) {
133 + return new FilteredAnnotation(input, ImmutableSet.of(SIGNAL_TYPE));
134 + }
135 +
125 // not meant to be instantiated 136 // not meant to be instantiated
126 private OduCltPortHelper() {} 137 private OduCltPortHelper() {}
127 } 138 }
......
...@@ -33,6 +33,7 @@ import org.onosproject.net.optical.impl.DefaultOmsPort; ...@@ -33,6 +33,7 @@ import org.onosproject.net.optical.impl.DefaultOmsPort;
33 import org.slf4j.Logger; 33 import org.slf4j.Logger;
34 34
35 import com.google.common.annotations.Beta; 35 import com.google.common.annotations.Beta;
36 +import com.google.common.collect.ImmutableSet;
36 37
37 /** 38 /**
38 * OMS port related helpers. 39 * OMS port related helpers.
...@@ -142,6 +143,16 @@ public final class OmsPortHelper { ...@@ -142,6 +143,16 @@ public final class OmsPortHelper {
142 } 143 }
143 } 144 }
144 145
146 + /**
147 + * Returns {@link Annotations} not used by the port type projection.
148 + *
149 + * @param input {@link Annotations}
150 + * @return filtered view of given {@link Annotations}
151 + */
152 + public static Annotations stripHandledAnnotations(Annotations input) {
153 + return new FilteredAnnotation(input, ImmutableSet.of(MIN_FREQ_HZ, MAX_FREQ_HZ, GRID_HZ));
154 + }
155 +
145 // not meant to be instantiated 156 // not meant to be instantiated
146 private OmsPortHelper() {} 157 private OmsPortHelper() {}
147 } 158 }
......
...@@ -33,6 +33,7 @@ import org.onosproject.net.optical.impl.DefaultOtuPort; ...@@ -33,6 +33,7 @@ import org.onosproject.net.optical.impl.DefaultOtuPort;
33 import org.slf4j.Logger; 33 import org.slf4j.Logger;
34 34
35 import com.google.common.annotations.Beta; 35 import com.google.common.annotations.Beta;
36 +import com.google.common.collect.ImmutableSet;
36 37
37 /** 38 /**
38 * OTU port related helpers. 39 * OTU port related helpers.
...@@ -122,6 +123,15 @@ public final class OtuPortHelper { ...@@ -122,6 +123,15 @@ public final class OtuPortHelper {
122 } 123 }
123 } 124 }
124 125
126 + /**
127 + * Returns {@link Annotations} not used by the port type projection.
128 + *
129 + * @param input {@link Annotations}
130 + * @return filtered view of given {@link Annotations}
131 + */
132 + public static Annotations stripHandledAnnotations(Annotations input) {
133 + return new FilteredAnnotation(input, ImmutableSet.of(SIGNAL_TYPE));
134 + }
125 135
126 // not meant to be instantiated 136 // not meant to be instantiated
127 private OtuPortHelper() {} 137 private OtuPortHelper() {}
......
...@@ -25,6 +25,7 @@ import org.onosproject.net.utils.ForwardingPort; ...@@ -25,6 +25,7 @@ import org.onosproject.net.utils.ForwardingPort;
25 import com.google.common.annotations.Beta; 25 import com.google.common.annotations.Beta;
26 26
27 import static com.google.common.base.Preconditions.checkNotNull; 27 import static com.google.common.base.Preconditions.checkNotNull;
28 +import static org.onosproject.net.optical.device.OchPortHelper.stripHandledAnnotations;
28 29
29 import java.util.Objects; 30 import java.util.Objects;
30 31
...@@ -71,12 +72,9 @@ public class DefaultOchPort extends ForwardingPort implements OchPort { ...@@ -71,12 +72,9 @@ public class DefaultOchPort extends ForwardingPort implements OchPort {
71 return signalType.bitRate(); 72 return signalType.bitRate();
72 } 73 }
73 74
74 -
75 @Override 75 @Override
76 - public Annotations annotations() { 76 + public Annotations unhandledAnnotations() {
77 - // FIXME Filter OCh annotations, after confirming that 77 + return stripHandledAnnotations(super.annotations());
78 - // it'll not result in information-loss
79 - return super.annotations();
80 } 78 }
81 79
82 /** 80 /**
...@@ -140,6 +138,7 @@ public class DefaultOchPort extends ForwardingPort implements OchPort { ...@@ -140,6 +138,7 @@ public class DefaultOchPort extends ForwardingPort implements OchPort {
140 .add("signalType", signalType()) 138 .add("signalType", signalType())
141 .add("isTunable", isTunable()) 139 .add("isTunable", isTunable())
142 .add("lambda", lambda()) 140 .add("lambda", lambda())
141 + .add("annotations", unhandledAnnotations())
143 .toString(); 142 .toString();
144 } 143 }
145 } 144 }
......
...@@ -16,9 +16,11 @@ ...@@ -16,9 +16,11 @@
16 package org.onosproject.net.optical.impl; 16 package org.onosproject.net.optical.impl;
17 17
18 import static com.google.common.base.Preconditions.checkNotNull; 18 import static com.google.common.base.Preconditions.checkNotNull;
19 +import static org.onosproject.net.optical.device.OduCltPortHelper.stripHandledAnnotations;
19 20
20 import java.util.Objects; 21 import java.util.Objects;
21 22
23 +import org.onosproject.net.Annotations;
22 import org.onosproject.net.CltSignalType; 24 import org.onosproject.net.CltSignalType;
23 import org.onosproject.net.Port; 25 import org.onosproject.net.Port;
24 import org.onosproject.net.optical.OduCltPort; 26 import org.onosproject.net.optical.OduCltPort;
...@@ -58,6 +60,11 @@ public class DefaultOduCltPort extends ForwardingPort implements OduCltPort { ...@@ -58,6 +60,11 @@ public class DefaultOduCltPort extends ForwardingPort implements OduCltPort {
58 } 60 }
59 61
60 @Override 62 @Override
63 + public Annotations unhandledAnnotations() {
64 + return stripHandledAnnotations(super.annotations());
65 + }
66 +
67 + @Override
61 public CltSignalType signalType() { 68 public CltSignalType signalType() {
62 return signalType; 69 return signalType;
63 } 70 }
...@@ -87,6 +94,7 @@ public class DefaultOduCltPort extends ForwardingPort implements OduCltPort { ...@@ -87,6 +94,7 @@ public class DefaultOduCltPort extends ForwardingPort implements OduCltPort {
87 public String toString() { 94 public String toString() {
88 return super.toStringHelper() 95 return super.toStringHelper()
89 .add("signalType", signalType()) 96 .add("signalType", signalType())
97 + .add("annotations", unhandledAnnotations())
90 .toString(); 98 .toString();
91 } 99 }
92 100
......
...@@ -16,10 +16,12 @@ ...@@ -16,10 +16,12 @@
16 package org.onosproject.net.optical.impl; 16 package org.onosproject.net.optical.impl;
17 17
18 import static com.google.common.base.Preconditions.checkNotNull; 18 import static com.google.common.base.Preconditions.checkNotNull;
19 +import static org.onosproject.net.optical.device.OmsPortHelper.stripHandledAnnotations;
19 20
20 import java.util.Objects; 21 import java.util.Objects;
21 22
22 import org.onlab.util.Frequency; 23 import org.onlab.util.Frequency;
24 +import org.onosproject.net.Annotations;
23 import org.onosproject.net.Port; 25 import org.onosproject.net.Port;
24 import org.onosproject.net.optical.OmsPort; 26 import org.onosproject.net.optical.OmsPort;
25 import org.onosproject.net.utils.ForwardingPort; 27 import org.onosproject.net.utils.ForwardingPort;
...@@ -67,6 +69,12 @@ public class DefaultOmsPort extends ForwardingPort implements OmsPort { ...@@ -67,6 +69,12 @@ public class DefaultOmsPort extends ForwardingPort implements OmsPort {
67 } 69 }
68 70
69 @Override 71 @Override
72 + public Annotations unhandledAnnotations() {
73 + return stripHandledAnnotations(super.annotations());
74 + }
75 +
76 +
77 + @Override
70 public Frequency minFrequency() { 78 public Frequency minFrequency() {
71 return minFrequency; 79 return minFrequency;
72 } 80 }
...@@ -112,6 +120,7 @@ public class DefaultOmsPort extends ForwardingPort implements OmsPort { ...@@ -112,6 +120,7 @@ public class DefaultOmsPort extends ForwardingPort implements OmsPort {
112 .add("minFrequency", minFrequency()) 120 .add("minFrequency", minFrequency())
113 .add("maxFrequency", maxFrequency()) 121 .add("maxFrequency", maxFrequency())
114 .add("grid", grid()) 122 .add("grid", grid())
123 + .add("annotations", unhandledAnnotations())
115 .toString(); 124 .toString();
116 } 125 }
117 126
......
...@@ -16,9 +16,11 @@ ...@@ -16,9 +16,11 @@
16 package org.onosproject.net.optical.impl; 16 package org.onosproject.net.optical.impl;
17 17
18 import static com.google.common.base.Preconditions.checkNotNull; 18 import static com.google.common.base.Preconditions.checkNotNull;
19 +import static org.onosproject.net.optical.device.OtuPortHelper.stripHandledAnnotations;
19 20
20 import java.util.Objects; 21 import java.util.Objects;
21 22
23 +import org.onosproject.net.Annotations;
22 import org.onosproject.net.OtuSignalType; 24 import org.onosproject.net.OtuSignalType;
23 import org.onosproject.net.Port; 25 import org.onosproject.net.Port;
24 import org.onosproject.net.optical.OtuPort; 26 import org.onosproject.net.optical.OtuPort;
...@@ -57,6 +59,11 @@ public class DefaultOtuPort extends ForwardingPort implements OtuPort { ...@@ -57,6 +59,11 @@ public class DefaultOtuPort extends ForwardingPort implements OtuPort {
57 // } 59 // }
58 60
59 @Override 61 @Override
62 + public Annotations unhandledAnnotations() {
63 + return stripHandledAnnotations(super.annotations());
64 + }
65 +
66 + @Override
60 public OtuSignalType signalType() { 67 public OtuSignalType signalType() {
61 return signalType; 68 return signalType;
62 } 69 }
...@@ -86,6 +93,7 @@ public class DefaultOtuPort extends ForwardingPort implements OtuPort { ...@@ -86,6 +93,7 @@ public class DefaultOtuPort extends ForwardingPort implements OtuPort {
86 public String toString() { 93 public String toString() {
87 return super.toStringHelper() 94 return super.toStringHelper()
88 .add("signalType", signalType()) 95 .add("signalType", signalType())
96 + .add("annotations", unhandledAnnotations())
89 .toString(); 97 .toString();
90 } 98 }
91 99
......
1 +<!--
2 + ~ Copyright 2016-present 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 + -->
16 +<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
17 +
18 + <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
19 + <command>
20 + <action class="org.onosproject.net.optical.cli.AddOpticalIntentCommand"/>
21 + <completers>
22 + <ref component-id="connectPointCompleter"/>
23 + <ref component-id="connectPointCompleter"/>
24 + </completers>
25 + <optional-completers>
26 + <entry key="-a" value-ref="allAppNameCompleter"/>
27 + </optional-completers>
28 + </command>
29 + <command>
30 + <action class="org.onosproject.net.optical.cli.OpticalPortsListCommand"/>
31 + <completers>
32 + <ref component-id="deviceIdCompleter"/>
33 + </completers>
34 + </command>
35 + </command-bundle>
36 +
37 + <bean id="connectPointCompleter" class="org.onosproject.cli.net.ConnectPointCompleter"/>
38 + <bean id="allAppNameCompleter" class="org.onosproject.cli.app.AllApplicationNamesCompleter"/>
39 + <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
40 +
41 +</blueprint>
...\ No newline at end of file ...\ No newline at end of file
...@@ -5,8 +5,6 @@ COMPILE_DEPS = [ ...@@ -5,8 +5,6 @@ COMPILE_DEPS = [
5 '//incubator/net:onos-incubator-net', 5 '//incubator/net:onos-incubator-net',
6 '//utils/rest:onlab-rest', 6 '//utils/rest:onlab-rest',
7 '//core/common:onos-core-common', 7 '//core/common:onos-core-common',
8 - # TODO Remove after decoupling optical
9 - '//apps/optical-model:onos-apps-optical-model',
10 ] 8 ]
11 9
12 osgi_jar ( 10 osgi_jar (
......
...@@ -49,13 +49,6 @@ ...@@ -49,13 +49,6 @@
49 <artifactId>onos-core-common</artifactId> 49 <artifactId>onos-core-common</artifactId>
50 </dependency> 50 </dependency>
51 51
52 - <!-- TODO Remove after decoupling optical -->
53 - <dependency>
54 - <groupId>org.onosproject</groupId>
55 - <artifactId>onos-optical-model</artifactId>
56 - <version>${project.version}</version>
57 - </dependency>
58 -
59 <dependency> 52 <dependency>
60 <groupId>com.fasterxml.jackson.core</groupId> 53 <groupId>com.fasterxml.jackson.core</groupId>
61 <artifactId>jackson-databind</artifactId> 54 <artifactId>jackson-databind</artifactId>
......
...@@ -22,24 +22,15 @@ import com.fasterxml.jackson.databind.node.ObjectNode; ...@@ -22,24 +22,15 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
22 import org.apache.karaf.shell.commands.Argument; 22 import org.apache.karaf.shell.commands.Argument;
23 import org.apache.karaf.shell.commands.Command; 23 import org.apache.karaf.shell.commands.Command;
24 import org.apache.karaf.shell.commands.Option; 24 import org.apache.karaf.shell.commands.Option;
25 -import org.onlab.util.Frequency;
26 import org.onosproject.utils.Comparators; 25 import org.onosproject.utils.Comparators;
27 import org.onosproject.net.Device; 26 import org.onosproject.net.Device;
28 import org.onosproject.net.Port; 27 import org.onosproject.net.Port;
29 -import org.onosproject.net.PortNumber;
30 import org.onosproject.net.device.DeviceService; 28 import org.onosproject.net.device.DeviceService;
31 -import org.onosproject.net.optical.OchPort;
32 -import org.onosproject.net.optical.OduCltPort;
33 -import org.onosproject.net.optical.OmsPort;
34 -import org.onosproject.net.optical.OpticalDevice;
35 -import org.onosproject.net.optical.OtuPort;
36 -
37 import java.util.ArrayList; 29 import java.util.ArrayList;
38 import java.util.Collections; 30 import java.util.Collections;
39 import java.util.List; 31 import java.util.List;
40 32
41 import static org.onosproject.net.DeviceId.deviceId; 33 import static org.onosproject.net.DeviceId.deviceId;
42 -import static org.onosproject.net.optical.device.OpticalDeviceServiceView.opticalView;
43 34
44 /** 35 /**
45 * Lists all ports or all ports of a device. 36 * Lists all ports or all ports of a device.
...@@ -49,9 +40,6 @@ import static org.onosproject.net.optical.device.OpticalDeviceServiceView.optica ...@@ -49,9 +40,6 @@ import static org.onosproject.net.optical.device.OpticalDeviceServiceView.optica
49 public class DevicePortsListCommand extends DevicesListCommand { 40 public class DevicePortsListCommand extends DevicesListCommand {
50 41
51 private static final String FMT = " port=%s, state=%s, type=%s, speed=%s %s"; 42 private static final String FMT = " port=%s, state=%s, type=%s, speed=%s %s";
52 - private static final String FMT_OCH = " port=%s, state=%s, type=%s, signalType=%s, isTunable=%s %s";
53 - private static final String FMT_ODUCLT_OTU = " port=%s, state=%s, type=%s, signalType=%s %s";
54 - private static final String FMT_OMS = " port=%s, state=%s, type=%s, Freqs= %s / %s / %s GHz, totalChannels=%s %s";
55 43
56 @Option(name = "-e", aliases = "--enabled", description = "Show only enabled ports", 44 @Option(name = "-e", aliases = "--enabled", description = "Show only enabled ports",
57 required = false, multiValued = false) 45 required = false, multiValued = false)
...@@ -63,17 +51,18 @@ public class DevicePortsListCommand extends DevicesListCommand { ...@@ -63,17 +51,18 @@ public class DevicePortsListCommand extends DevicesListCommand {
63 51
64 @Argument(index = 0, name = "uri", description = "Device ID", 52 @Argument(index = 0, name = "uri", description = "Device ID",
65 required = false, multiValued = false) 53 required = false, multiValued = false)
66 - String uri = null; 54 + protected String uri = null;
67 55
68 @Override 56 @Override
69 protected void execute() { 57 protected void execute() {
70 - DeviceService service = opticalView(get(DeviceService.class)); 58 + DeviceService service = get(DeviceService.class);
71 if (uri == null) { 59 if (uri == null) {
72 if (outputJson()) { 60 if (outputJson()) {
73 print("%s", jsonPorts(service, getSortedDevices(service))); 61 print("%s", jsonPorts(service, getSortedDevices(service)));
74 } else { 62 } else {
75 for (Device device : getSortedDevices(service)) { 63 for (Device device : getSortedDevices(service)) {
76 printDevice(service, device); 64 printDevice(service, device);
65 + printPorts(service, device);
77 } 66 }
78 } 67 }
79 68
...@@ -85,6 +74,7 @@ public class DevicePortsListCommand extends DevicesListCommand { ...@@ -85,6 +74,7 @@ public class DevicePortsListCommand extends DevicesListCommand {
85 print("%s", jsonPorts(service, new ObjectMapper(), device)); 74 print("%s", jsonPorts(service, new ObjectMapper(), device));
86 } else { 75 } else {
87 printDevice(service, device); 76 printDevice(service, device);
77 + printPorts(service, device);
88 } 78 }
89 } 79 }
90 } 80 }
...@@ -119,7 +109,7 @@ public class DevicePortsListCommand extends DevicesListCommand { ...@@ -119,7 +109,7 @@ public class DevicePortsListCommand extends DevicesListCommand {
119 for (Port port : service.getPorts(device.id())) { 109 for (Port port : service.getPorts(device.id())) {
120 if (isIncluded(port)) { 110 if (isIncluded(port)) {
121 ports.add(mapper.createObjectNode() 111 ports.add(mapper.createObjectNode()
122 - .put("port", portName(port.number())) 112 + .put("port", port.number().toString())
123 .put("isEnabled", port.isEnabled()) 113 .put("isEnabled", port.isEnabled())
124 .put("type", port.type().toString().toLowerCase()) 114 .put("type", port.type().toString().toLowerCase())
125 .put("portSpeed", port.portSpeed()) 115 .put("portSpeed", port.portSpeed())
...@@ -131,122 +121,24 @@ public class DevicePortsListCommand extends DevicesListCommand { ...@@ -131,122 +121,24 @@ public class DevicePortsListCommand extends DevicesListCommand {
131 return result; 121 return result;
132 } 122 }
133 123
134 - private String portName(PortNumber port) {
135 - return port.equals(PortNumber.LOCAL) ? "local" : port.toString();
136 - }
137 -
138 // Determines if a port should be included in output. 124 // Determines if a port should be included in output.
139 - private boolean isIncluded(Port port) { 125 + protected boolean isIncluded(Port port) {
140 return enabled && port.isEnabled() || disabled && !port.isEnabled() || 126 return enabled && port.isEnabled() || disabled && !port.isEnabled() ||
141 !enabled && !disabled; 127 !enabled && !disabled;
142 } 128 }
143 129
144 - @Override 130 + protected void printPorts(DeviceService service, Device device) {
145 - protected void printDevice(DeviceService service, Device device) {
146 - super.printDevice(service, device);
147 List<Port> ports = new ArrayList<>(service.getPorts(device.id())); 131 List<Port> ports = new ArrayList<>(service.getPorts(device.id()));
148 Collections.sort(ports, Comparators.PORT_COMPARATOR); 132 Collections.sort(ports, Comparators.PORT_COMPARATOR);
149 for (Port port : ports) { 133 for (Port port : ports) {
150 if (!isIncluded(port)) { 134 if (!isIncluded(port)) {
151 continue; 135 continue;
152 } 136 }
153 - String portName = portName(port.number()); 137 + String portName = port.number().toString();
154 Object portIsEnabled = port.isEnabled() ? "enabled" : "disabled"; 138 Object portIsEnabled = port.isEnabled() ? "enabled" : "disabled";
155 String portType = port.type().toString().toLowerCase(); 139 String portType = port.type().toString().toLowerCase();
156 String annotations = annotations(port.annotations()); 140 String annotations = annotations(port.annotations());
157 - switch (port.type()) {
158 - case OCH:
159 - if (port instanceof org.onosproject.net.OchPort) {
160 - // old OchPort model
161 - org.onosproject.net.OchPort oPort = (org.onosproject.net.OchPort) port;
162 - print("WARN: OchPort in old model");
163 - print(FMT_OCH, portName, portIsEnabled, portType,
164 - oPort.signalType().toString(),
165 - oPort.isTunable() ? "yes" : "no", annotations);
166 - break;
167 - }
168 - if (port instanceof OchPort) {
169 - OchPort och = (OchPort) port;
170 - print(FMT_OCH, portName, portIsEnabled, portType,
171 - och.signalType().toString(),
172 - och.isTunable() ? "yes" : "no", annotations);
173 - break;
174 - } else if (port.element().is(OpticalDevice.class)) {
175 - // Note: should never reach here, but
176 - // leaving it here as an example to
177 - // manually translate to specific port.
178 - OpticalDevice optDevice = port.element().as(OpticalDevice.class);
179 - if (optDevice.portIs(port, OchPort.class)) {
180 - OchPort och = optDevice.portAs(port, OchPort.class).get();
181 - print(FMT_OCH, portName, portIsEnabled, portType,
182 - och.signalType().toString(),
183 - och.isTunable() ? "yes" : "no", annotations);
184 - break;
185 - }
186 - }
187 - print("WARN: OchPort but not on OpticalDevice or ill-formed");
188 - print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations);
189 - break;
190 - case ODUCLT:
191 - if (port instanceof org.onosproject.net.OduCltPort) {
192 - // old OduCltPort model
193 - org.onosproject.net.OduCltPort oPort = (org.onosproject.net.OduCltPort) port;
194 - print("WARN: OduCltPort in old model");
195 - print(FMT_ODUCLT_OTU, portName, portIsEnabled, portType,
196 - oPort.signalType().toString(), annotations);
197 - break;
198 - }
199 - if (port instanceof OduCltPort) {
200 - print(FMT_ODUCLT_OTU, portName, portIsEnabled, portType,
201 - ((OduCltPort) port).signalType().toString(), annotations);
202 - break;
203 - }
204 - print("WARN: OduCltPort but not on OpticalDevice or ill-formed");
205 print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations); 141 print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations);
206 - break;
207 - case OMS:
208 - if (port instanceof org.onosproject.net.OmsPort) {
209 - org.onosproject.net.OmsPort oms = (org.onosproject.net.OmsPort) port;
210 - print("WARN: OmsPort in old model");
211 - print(FMT_OMS, portName, portIsEnabled, portType,
212 - oms.minFrequency().asHz() / Frequency.ofGHz(1).asHz(),
213 - oms.maxFrequency().asHz() / Frequency.ofGHz(1).asHz(),
214 - oms.grid().asHz() / Frequency.ofGHz(1).asHz(),
215 - oms.totalChannels(), annotations);
216 - break;
217 - }
218 - if (port instanceof OmsPort) {
219 - OmsPort oms = (OmsPort) port;
220 - print(FMT_OMS, portName, portIsEnabled, portType,
221 - oms.minFrequency().asHz() / Frequency.ofGHz(1).asHz(),
222 - oms.maxFrequency().asHz() / Frequency.ofGHz(1).asHz(),
223 - oms.grid().asHz() / Frequency.ofGHz(1).asHz(),
224 - oms.totalChannels(), annotations);
225 - break;
226 - }
227 - print("WARN: OmsPort but not on OpticalDevice or ill-formed");
228 - print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations);
229 - break;
230 - case OTU:
231 - if (port instanceof org.onosproject.net.OtuPort) {
232 - org.onosproject.net.OtuPort otu = (org.onosproject.net.OtuPort) port;
233 - print("WARN: OtuPort in old model");
234 - print(FMT_ODUCLT_OTU, portName, portIsEnabled, portType,
235 - otu.signalType().toString(), annotations);
236 - break;
237 - }
238 - if (port instanceof OtuPort) {
239 - print(FMT_ODUCLT_OTU, portName, portIsEnabled, portType,
240 - ((OtuPort) port).signalType().toString(), annotations);
241 - break;
242 - }
243 - print("WARN: OtuPort but not on OpticalDevice or ill-formed");
244 - print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations);
245 - break;
246 - default:
247 - print(FMT, portName, portIsEnabled, portType, port.portSpeed(), annotations);
248 - break;
249 - }
250 } 142 }
251 } 143 }
252 } 144 }
......
...@@ -292,16 +292,6 @@ ...@@ -292,16 +292,6 @@
292 </optional-completers> 292 </optional-completers>
293 </command> 293 </command>
294 <command> 294 <command>
295 - <action class="org.onosproject.cli.net.AddOpticalIntentCommand"/>
296 - <completers>
297 - <ref component-id="connectPointCompleter"/>
298 - <ref component-id="connectPointCompleter"/>
299 - </completers>
300 - <optional-completers>
301 - <entry key="-a" value-ref="allAppNameCompleter"/>
302 - </optional-completers>
303 - </command>
304 - <command>
305 <action class="org.onosproject.cli.net.GetStatisticsCommand"/> 295 <action class="org.onosproject.cli.net.GetStatisticsCommand"/>
306 <completers> 296 <completers>
307 <ref component-id="connectPointCompleter"/> 297 <ref component-id="connectPointCompleter"/>
......
...@@ -128,8 +128,6 @@ osgi_feature ( ...@@ -128,8 +128,6 @@ osgi_feature (
128 required_features = ['onos-api'], 128 required_features = ['onos-api'],
129 included_bundles = [ 129 included_bundles = [
130 '//cli:onos-cli', 130 '//cli:onos-cli',
131 - # TODO Remove after decoupling optical
132 - '//apps/optical-model:onos-apps-optical-model',
133 ] 131 ]
134 ) 132 )
135 133
......
...@@ -142,8 +142,6 @@ ...@@ -142,8 +142,6 @@
142 description="ONOS admin command console components"> 142 description="ONOS admin command console components">
143 <feature>onos-api</feature> 143 <feature>onos-api</feature>
144 <bundle>mvn:org.onosproject/onos-cli/@ONOS-VERSION</bundle> 144 <bundle>mvn:org.onosproject/onos-cli/@ONOS-VERSION</bundle>
145 - <!-- TODO Remove after decoupling optical -->
146 - <bundle>mvn:org.onosproject/onos-optical-model/@ONOS-VERSION</bundle>
147 </feature> 145 </feature>
148 146
149 <feature name="onos-security" version="@FEATURE-VERSION" 147 <feature name="onos-security" version="@FEATURE-VERSION"
......
1 APPS = [ 1 APPS = [
2 + 'org.onosproject.optical-model',
2 'org.onosproject.openflow-base', 3 'org.onosproject.openflow-base',
3 'org.onosproject.hostprovider', 4 'org.onosproject.hostprovider',
4 'org.onosproject.lldpprovider', 5 'org.onosproject.lldpprovider',
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 <onos.app.title>OpenFlow Meta App</onos.app.title> 33 <onos.app.title>OpenFlow Meta App</onos.app.title>
34 <onos.app.category>Provider</onos.app.category> 34 <onos.app.category>Provider</onos.app.category>
35 <onos.app.requires> 35 <onos.app.requires>
36 + org.onosproject.optical-model,
36 org.onosproject.openflow-base, 37 org.onosproject.openflow-base,
37 org.onosproject.hostprovider, 38 org.onosproject.hostprovider,
38 org.onosproject.lldpprovider 39 org.onosproject.lldpprovider
......