/*
* Copyright (c) 2016, 2017 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.sfc.pot.provider;
import com.google.common.util.concurrent.Futures;
import java.util.concurrent.Future;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.RspName;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.ioam.nb.pot.rev161122.DisableSfcIoamPotRenderedPathInput;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.ioam.nb.pot.rev161122.DisableSfcIoamPotRenderedPathOutput;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.ioam.nb.pot.rev161122.DisableSfcIoamPotRenderedPathOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.ioam.nb.pot.rev161122.EnableSfcIoamPotRenderedPathInput;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.ioam.nb.pot.rev161122.EnableSfcIoamPotRenderedPathOutput;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.ioam.nb.pot.rev161122.EnableSfcIoamPotRenderedPathOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.ioam.nb.pot.rev161122.SfcIoamNbPotService;
import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This class holds all RPCs/methods for enabling/disabling SFC iOAM Proof of
* Transit (https://github.com/CiscoDevNet/iOAM).
*
* <p>
* @author Srihari Raghavan (srihari@cisco.com)
* @version 0.1
* @since 2016-06-01
*/
public class SfcPotRpc implements SfcIoamNbPotService {
private static final Logger LOG = LoggerFactory.getLogger(SfcPotRpc.class);
public static SfcPotRpc getSfcPotRpc() {
return new SfcPotRpc();
}
/**
* This method triggers enabling of Proof of Transit feature on the selected
* SFC/RSP and passes in iOAM PoT parameters as well.
*
* <p>
* @param input
* RPC input including a Rendered Service Path name
* @return RPC output including a success or failure code.
*/
@Override
public Future<RpcResult<EnableSfcIoamPotRenderedPathOutput>> enableSfcIoamPotRenderedPath(
EnableSfcIoamPotRenderedPathInput input) {
boolean ret;
RpcResultBuilder<EnableSfcIoamPotRenderedPathOutput> rpcResultBuilder;
RspName rspName = new RspName(input.getSfcIoamPotRspName());
/* Enable iOAM Proof of Transit on the SFC/RSP */
ret = SfcPotRspProcessor.enableSfcPot(rspName, input.getRefreshPeriodTimeUnits(), input.getRefreshPeriodValue(),
input.getIoamPotBitMask(), input.getIoamPotNumProfiles());
if (ret) {
/* success */
EnableSfcIoamPotRenderedPathOutputBuilder enableSfcIoamPotRenderedPathOutputBuilder =
new EnableSfcIoamPotRenderedPathOutputBuilder();
enableSfcIoamPotRenderedPathOutputBuilder.setResult(true);
rpcResultBuilder = RpcResultBuilder.success(enableSfcIoamPotRenderedPathOutputBuilder.build());
} else {
String message = "Error enabling SFC Proof of Transit for Rendered Service Path: " + rspName.getValue();
rpcResultBuilder = RpcResultBuilder.<EnableSfcIoamPotRenderedPathOutput>failed()
.withError(ErrorType.APPLICATION, message);
}
return Futures.immediateFuture(rpcResultBuilder.build());
}
/**
* This method triggers disabling of Proof of Transit feature on the
* selected SFC/RSP.
*
* <p>
* @param input
* RPC input including a Rendered Service Path name
* @return RPC output including a success or failure code.
*/
@Override
public Future<RpcResult<DisableSfcIoamPotRenderedPathOutput>> disableSfcIoamPotRenderedPath(
DisableSfcIoamPotRenderedPathInput input) {
boolean ret;
RpcResultBuilder<DisableSfcIoamPotRenderedPathOutput> rpcResultBuilder;
RspName rspName = new RspName(input.getSfcIoamPotRspName());
/* Disable iOAM Proof of transit for this SFC/RSP */
ret = SfcPotRspProcessor.disableSfcPot(rspName);
if (ret) {
/* success */
DisableSfcIoamPotRenderedPathOutputBuilder disableSfcIoamPotRenderedPathOutputBuilder =
new DisableSfcIoamPotRenderedPathOutputBuilder();
disableSfcIoamPotRenderedPathOutputBuilder.setResult(true);
rpcResultBuilder = RpcResultBuilder.success(disableSfcIoamPotRenderedPathOutputBuilder.build());
} else {
String message = "Error disabling SFC Proof of Transit for Rendered Service Path: " + rspName.getValue();
rpcResultBuilder = RpcResultBuilder.<DisableSfcIoamPotRenderedPathOutput>failed()
.withError(ErrorType.APPLICATION, message);
}
return Futures.immediateFuture(rpcResultBuilder.build());
}
}