blob: f5b4eda6760d5a1b463995802891e26f8c3f2958 [file] [log] [blame]
/*
* Copyright 2020-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This work was partially supported by EC H2020 project METRO-HAUL (761727).
*/
package org.onosproject.drivers.odtn;
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.commons.configuration.XMLConfiguration;
import org.onosproject.net.ModulationScheme;
import org.onosproject.net.PortNumber;
import org.onosproject.netconf.DatastoreId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* Driver Implementation of the ModulationConfig for OcNos standard open config based terminal devices.
*/
public class GrooveModulationOpenConfig<T> extends TerminalDeviceModulationConfig<T> {
public static Logger log = LoggerFactory.getLogger(GrooveModulationOpenConfig.class);
/**
* Construct a rpc target power message.
*
* @return RPC payload
*/
@Override
public DatastoreId getDataStoreId() {
return DatastoreId.RUNNING;
}
/**
* Construct a rpc target power message.
*
* @param name for optical channel name
* @return RPC payload
*/
@Override
public StringBuilder createModulationFilterRequestRpc(String name) {
StringBuilder rpc = new StringBuilder();
rpc.append("<name>").append(name).append("</name>");
return rpc;
}
@Override
public ModulationScheme modulationSchemeType(String operationalMode) {
/*Used for Internal Testing */
//String modulationScheme="DP16QAM";
ModulationScheme modulation;
if (operationalMode.equalsIgnoreCase("62") ||
operationalMode.equalsIgnoreCase("68")) {
modulation = ModulationScheme.DP_16QAM;
} else {
modulation = ModulationScheme.DP_QPSK;
}
return modulation;
}
@Override
public String modulationEditConfigRequestRpc(TerminalDeviceModulationConfig modulationConfig, PortNumber portNumber,
Object component, long bitRate, String modulation) {
if (component != null) {
// This is an edit-config operation.
String portMode = modulation.equals("DP_QPSK") ? "QPSK_100G" : "16QAM_200G";
String portName = state.ocName(modulationConfig, portNumber);
Pattern portPattern = Pattern.compile(".*-[1]-[1-9][0-4]?-L[1-2]$"); // e.g. TRANSCEIVER-1-1-L1
Matcher lineMatch = portPattern.matcher(portName);
lineMatch.find();
final String[] split = lineMatch.group(0).split("-");
return "<ne xmlns=\"http://coriant.com/yang/os/ne\">" +
" <shelf>" +
" <shelf-id>" + split[1] + "</shelf-id>" +
" <slot>" +
" <slot-id>" + split[2] + "</slot-id>" +
" <card>" +
" <port>" +
" <port-id>" + split[3].replace("L", "") + "</port-id>" +
" <port-mode>" + portMode + "</port-mode>" +
" </port>" +
" </card>" +
" </slot>" +
" </shelf>" +
" </ne>";
} else {
log.error("Cannot process the component {}.", component.getClass());
return null;
}
}
@Override
public void setModulationSchemeProcessor(PortNumber port, Object component, long bitRate) {
ModulationScheme modulation = null;
if (bitRate <= BitRate.GBPS_100.value) {
modulation = ModulationScheme.DP_QPSK;
} else {
modulation = ModulationScheme.DP_16QAM;
}
// TODO: Groove doesn't support to change the modulation format via OpenConfig directly
// without recommissioning the Optical Channel
// Workaround: use Groove native model via port-mode change
// String editConfig = modulationEditConfig(groove, port, component, bitRate, modulation.name());
String editConfig = state.modulationEditConfig(state.terminalDevice, port, component,
bitRate, modulation.name());
//setting the modulation by calling rpc
state.setModulationRpc(port, component, editConfig);
}
/**
* Get the Modulation Scheme on the component.
*
* @param conf HierarchicalConfiguration for path ../optical-channel/config
* @return Optional<ModulationScheme>
**/
public Optional<ModulationScheme> getModulation(XMLConfiguration conf) {
HierarchicalConfiguration config =
conf.configurationAt("data/components/component/optical-channel/config");
String operationalMode = String.valueOf(config.getString("operational-mode"));
/*Used for Internal Testing */
//String modulationScheme="DP16QAM";
ModulationScheme modulation;
if (operationalMode.equalsIgnoreCase("62") ||
operationalMode.equalsIgnoreCase("68")) {
modulation = ModulationScheme.DP_16QAM;
} else {
modulation = ModulationScheme.DP_QPSK;
}
return Optional.of(modulation);
}
}