<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-binding-api</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.genius</groupId>
+ <artifactId>mdsalutil-api</artifactId>
+ <version>${genius.mdsalutil.version}</version>
+ </dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
import javax.inject.Inject;
import javax.inject.Singleton;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.genius.infra.FutureRpcResults;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RecoverInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RecoverOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.ReinstallInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.ReinstallOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.SrmRpcsService;
-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;
@Override
public Future<RpcResult<RecoverOutput>> recover(RecoverInput input) {
- LOG.trace("recover() called with {}", input);
- RpcResultBuilder resultBuilder = RpcResultBuilder.failed()
- .withError(ErrorType.APPLICATION, "Not implemented yet");
- return Futures.immediateFuture(resultBuilder.build());
+ return FutureRpcResults.fromListenableFuture(LOG, "recover", input, () -> {
+ return Futures.immediateFuture(SrmRpcUtils.callSrmOp(dataBroker, input));
+ }).build();
}
-
@Override
public Future<RpcResult<ReinstallOutput>> reinstall(ReinstallInput input) {
- LOG.trace("reinstall() called with {}", input);
- RpcResultBuilder resultBuilder = RpcResultBuilder.failed()
- .withError(ErrorType.APPLICATION, "Not implemented yet");
- return Futures.immediateFuture(resultBuilder.build());
+ return FutureRpcResults.fromListenableFuture(LOG, "reinstall", input, () -> {
+ return Futures.immediateFuture(SrmRpcUtils.callSrmOp(dataBroker, input));
+ }).build();
}
}
--- /dev/null
+/*
+ * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. 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.genius.srm;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.util.concurrent.CheckedFuture;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.ops.rev170711.ServiceOps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.ops.rev170711.service.ops.Services;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.ops.rev170711.service.ops.ServicesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.ops.rev170711.service.ops.services.Operations;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.ops.rev170711.service.ops.services.OperationsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RecoverInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RecoverOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RecoverOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.ReinstallInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.ReinstallOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.ReinstallOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RpcFailEntityId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RpcFailEntityName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RpcFailEntityType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RpcFailUnknown;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RpcSuccess;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityNameBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityTypeBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityTypeInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityTypeService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.GeniusIfm;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.GeniusIfmInterface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.GeniusItm;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.GeniusItmTep;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.GeniusItmTz;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.NetvirtElan;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.NetvirtElanInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.NetvirtVpn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.NetvirtVpnInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.Ofplugin;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.ServiceOpRecover;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.ServiceOpReinstall;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The Utility class for SRM Shell.
+ */
+public final class SrmRpcUtils {
+
+ private static final Logger LOG = LoggerFactory.getLogger(SrmRpcUtils.class);
+ private static final boolean REINSTALL_FAILED = false;
+ private static final boolean REINSTALL_SUCCESS = true;
+ private static final boolean CREATE_MISSING_PARENT = true;
+
+ private static final ImmutableMap<Class<? extends EntityNameBase>,Class<? extends EntityTypeBase>>
+ NAME_TO_TYPE_MAP = new ImmutableMap
+ .Builder<Class<? extends EntityNameBase>,Class<? extends EntityTypeBase>>()
+ .put(GeniusItm.class, EntityTypeService.class)
+ .put(GeniusIfm.class, EntityTypeService.class)
+ .put(NetvirtVpn.class, EntityTypeService.class)
+ .put(NetvirtElan.class, EntityTypeService.class)
+ .put(Ofplugin.class, EntityTypeService.class)
+ .put(GeniusItmTep.class, EntityTypeInstance.class)
+ .put(GeniusItmTz.class, EntityTypeInstance.class)
+ .put(GeniusIfmInterface.class, EntityTypeInstance.class)
+ .put(NetvirtVpnInstance.class, EntityTypeInstance.class)
+ .put(NetvirtElanInstance.class, EntityTypeInstance.class)
+ .build();
+
+ private static final ImmutableMap<Class<? extends EntityNameBase>, Class<? extends EntityNameBase>>
+ NAME_TO_SERVICE_MAP = new ImmutableMap
+ .Builder<Class<? extends EntityNameBase>, Class<? extends EntityNameBase>>()
+ .put(GeniusItm.class, GeniusItm.class)
+ .put(GeniusIfm.class, GeniusIfm.class)
+ .put(GeniusItmTep.class, GeniusItm.class)
+ .put(GeniusItmTz.class, GeniusItm.class)
+ .put(GeniusIfmInterface.class, GeniusIfm.class)
+ .put(NetvirtVpn.class, NetvirtVpn.class)
+ .put(NetvirtVpnInstance.class, NetvirtVpn.class)
+ .put(NetvirtElan.class, NetvirtElan.class)
+ .put(NetvirtElanInstance.class, NetvirtElan.class)
+ .put(Ofplugin.class, Ofplugin.class)
+ .build();
+
+
+ public static RecoverOutput callSrmOp(DataBroker broker, RecoverInput input) {
+ RecoverOutputBuilder outputBuilder = new RecoverOutputBuilder();
+ if (input.getEntityName() == null) {
+ outputBuilder.setResponse(RpcFailEntityName.class)
+ .setMessage(String.format("EntityName is null", input.getEntityName().getSimpleName()));
+ return outputBuilder.build();
+ }
+ if (input.getEntityType() == null) {
+ outputBuilder.setResponse(RpcFailEntityType.class)
+ .setMessage(String.format("EntityType for %s can't be null", input.getEntityName().getSimpleName()));
+ return outputBuilder.build();
+ }
+ String entityId = null;
+ if (EntityTypeInstance.class.equals(input.getEntityType()) && input.getEntityId() == null) {
+ outputBuilder.setResponse(RpcFailEntityId.class)
+ .setMessage(String.format("EntityId can't be null for %s", input.getEntityName().getSimpleName()));
+ return outputBuilder.build();
+ } else {
+ entityId = input.getEntityId();
+ }
+ Class<? extends EntityNameBase> serviceName = NAME_TO_SERVICE_MAP.get(input.getEntityName());
+ if (serviceName == null) {
+ outputBuilder.setResponse(RpcFailEntityName.class)
+ .setMessage(String.format("EntityName %s has no matching service",
+ input.getEntityName().getSimpleName()));
+ return outputBuilder.build();
+ }
+ Class<? extends EntityTypeBase> entityType = NAME_TO_TYPE_MAP.get(input.getEntityName());
+ if (entityType == null || !input.getEntityType().equals(entityType)) {
+ outputBuilder.setResponse(RpcFailEntityType.class)
+ .setMessage(String.format("EntityName %s doesn't match with EntityType %s",
+ input.getEntityName().getSimpleName(), entityType));
+ return outputBuilder.build();
+ }
+
+ OperationsBuilder opsBuilder = new OperationsBuilder()
+ .setEntityName(input.getEntityName())
+ .setEntityType(entityType)
+ .setTriggerOperation(ServiceOpRecover.class);
+ if (entityId != null) {
+ opsBuilder.setEntityId(entityId);
+ }
+ Operations operation = opsBuilder.build();
+ InstanceIdentifier<Operations> opsIid = getInstanceIdentifier(operation, serviceName);
+ WriteTransaction tx = broker.newWriteOnlyTransaction();
+ tx.put(LogicalDatastoreType.OPERATIONAL, opsIid, operation, CREATE_MISSING_PARENT);
+ CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
+ try {
+ futures.get();
+ } catch (InterruptedException | ExecutionException e) {
+ LOG.error("Error writing RecoveryOp to datastore. path:{}, data:{}", opsIid, operation);
+ outputBuilder.setResponse(RpcFailUnknown.class).setMessage(e.getMessage());
+ return outputBuilder.build();
+ }
+ outputBuilder.setResponse(RpcSuccess.class).setMessage("Recovery operation successfully triggered");
+ return outputBuilder.build();
+ }
+
+ public static ReinstallOutput callSrmOp(DataBroker broker, ReinstallInput input) {
+ ReinstallOutputBuilder outputBuilder = new ReinstallOutputBuilder();
+ if (input.getEntityName() == null) {
+ outputBuilder.setSuccessful(REINSTALL_FAILED)
+ .setMessage(String.format("EntityName is null", input.getEntityName().getSimpleName()));
+ return outputBuilder.build();
+ }
+ if (input.getEntityType() == null) {
+ outputBuilder.setSuccessful(REINSTALL_FAILED)
+ .setMessage(String.format("EntityType for %s can't be null", input.getEntityName().getSimpleName()));
+ return outputBuilder.build();
+ }
+
+ if (!EntityTypeService.class.equals(input.getEntityType())) {
+ outputBuilder.setSuccessful(REINSTALL_FAILED)
+ .setMessage(String.format("EntityType is %s, Reinstall is only for EntityTypeService",
+ input.getEntityName().getSimpleName(), input.getEntityType()));
+ return outputBuilder.build();
+ }
+
+ Class<? extends EntityNameBase> serviceName = NAME_TO_SERVICE_MAP.get(input.getEntityName());
+ if (serviceName == null) {
+ outputBuilder.setSuccessful(REINSTALL_FAILED)
+ .setMessage(String.format("EntityName %s has no matching service",
+ input.getEntityName().getSimpleName()));
+ return outputBuilder.build();
+ }
+
+ Class<? extends EntityTypeBase> entityType = NAME_TO_TYPE_MAP.get(input.getEntityName());
+ if (entityType == null || !input.getEntityType().equals(entityType)) {
+ outputBuilder.setSuccessful(REINSTALL_FAILED)
+ .setMessage(String.format("EntityName %s doesn't match with EntityType %s",
+ input.getEntityName().getSimpleName(), entityType));
+ return outputBuilder.build();
+ }
+
+ OperationsBuilder opsBuilder = new OperationsBuilder()
+ .setEntityName(input.getEntityName())
+ .setEntityType(entityType)
+ .setTriggerOperation(ServiceOpReinstall.class);
+ Operations operation = opsBuilder.build();
+ InstanceIdentifier<Operations> opsIid = getInstanceIdentifier(operation, serviceName);
+ WriteTransaction tx = broker.newWriteOnlyTransaction();
+ tx.put(LogicalDatastoreType.OPERATIONAL, opsIid, operation, CREATE_MISSING_PARENT);
+ CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
+ try {
+ futures.get();
+ } catch (InterruptedException | ExecutionException e) {
+ LOG.error("Error writing RecoveryOp to datastore. path:{}, data:{}", opsIid, operation);
+ outputBuilder.setSuccessful(REINSTALL_FAILED).setMessage(e.getMessage());
+ return outputBuilder.build();
+ }
+ outputBuilder.setSuccessful(REINSTALL_SUCCESS).setMessage("Recovery operation successfully triggered");
+ return outputBuilder.build();
+ }
+
+ private static InstanceIdentifier<Operations> getInstanceIdentifier(
+ Operations operation, Class<? extends EntityNameBase> serviceName) {
+ return InstanceIdentifier.create(ServiceOps.class)
+ .child(Services.class, new ServicesKey(serviceName))
+ .child(Operations.class, operation.getKey());
+ }
+
+}
<name>ODL :: genius :: ${project.artifactId}</name>
<dependencies>
+ <dependency>
+ <groupId>org.opendaylight.genius</groupId>
+ <artifactId>mdsalutil-api</artifactId>
+ <version>${genius.version}</version>
+ </dependency>
<dependency>
<groupId>org.opendaylight.genius</groupId>
<artifactId>srm-api</artifactId>
package org.opendaylight.genius.srm.shell;
+import java.util.concurrent.Future;
import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RecoverInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RecoverInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.RecoverOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.SrmRpcsService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityNameBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityTypeBase;
+import org.opendaylight.yangtools.yang.common.RpcResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Override
protected Object doExecute() throws Exception {
- session.getConsole().println(getHelp());
+ RecoverInput input = getInput();
+ if (input == null) {
+ // We've already shown the relevant error msg
+ return null;
+ }
+ Future<RpcResult<RecoverOutput>> result = srmRpcService.recover(input);
+ RpcResult<RecoverOutput> recoverResult = result.get();
+ printResult(recoverResult);
return null;
}
- private String getHelp() {
- StringBuilder help = new StringBuilder("Usage:");
- help.append("srm:recover <type> <name> [ <id> ]\n");
- return help.toString();
+ private void printResult(RpcResult<RecoverOutput> recoverResult) {
+ StringBuilder strResult = new StringBuilder("");
+ if (recoverResult.isSuccessful()) {
+ strResult.append("RPC call to recover was successful");
+ LOG.trace("RPC Result: ", recoverResult.getResult());
+ } else {
+ strResult.append("RPC Call to recover failed.\n")
+ .append("ErrorCode: ").append(recoverResult.getResult().getResponse().getSimpleName())
+ .append("ErrorMsg: ").append(recoverResult.getResult().getMessage());
+ LOG.trace("RPC Result: ", recoverResult.getResult());
+ }
+ session.getConsole().println(strResult.toString());
+ }
+
+ private RecoverInput getInput() {
+ if (type == null || name == null) {
+ return null;
+ }
+ Class<? extends EntityTypeBase> entityType = SrmCliUtils.getEntityType(type);
+ if (entityType == null) {
+ session.getConsole().println(SrmCliUtils.getTypeHelp());
+ return null;
+ }
+ Class<? extends EntityNameBase> entityName = SrmCliUtils.getEntityName(entityType, name);
+ if (entityName == null) {
+ session.getConsole().println(SrmCliUtils.getNameHelp(entityType));
+ return null;
+ }
+ RecoverInputBuilder inputBuilder = new RecoverInputBuilder();
+ inputBuilder.setEntityType(entityType);
+ inputBuilder.setEntityName(entityName);
+ if (id != null) {
+ inputBuilder.setEntityId(id);
+ }
+ return inputBuilder.build();
}
}
package org.opendaylight.genius.srm.shell;
+import java.util.concurrent.Future;
import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.ReinstallInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.ReinstallInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.ReinstallOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.SrmRpcsService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityNameBase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityTypeBase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityTypeService;
+import org.opendaylight.yangtools.yang.common.RpcResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private SrmRpcsService srmRpcService;
private final Class<? extends EntityTypeBase> entityType = EntityTypeService.class;
-
public ReinstallCommand(SrmRpcsService srmRpcService) {
this.srmRpcService = srmRpcService;
}
@Override
protected Object doExecute() throws Exception {
- session.getConsole().println(getHelp());
+ ReinstallInput input = getInput();
+ if (input == null) {
+ // We've already shown the relevant error msg
+ return null;
+ }
+ Future<RpcResult<ReinstallOutput>> result = srmRpcService.reinstall(input);
+ RpcResult<ReinstallOutput> reinstallResult = result.get();
+ printResult(reinstallResult);
return null;
}
- private String getHelp() {
- StringBuilder help = new StringBuilder("Usage:");
- help.append("srm:reinstall <name>\n");
- return help.toString();
+ private void printResult(RpcResult<ReinstallOutput> reinstallResult) {
+ StringBuilder strResult = new StringBuilder("");
+ if (reinstallResult.isSuccessful()) {
+ strResult.append("RPC call to reinstall was successful");
+ LOG.trace("RPC Result: ", reinstallResult.getResult());
+ } else {
+ strResult.append("RPC Call to reinstall failed.\n")
+ .append("ErrorMsg: ").append(reinstallResult.getResult().getMessage());
+ LOG.trace("RPC Result: ", reinstallResult.getResult());
+ }
+ session.getConsole().println(strResult.toString());
+ }
+
+ private ReinstallInput getInput() {
+ Class<? extends EntityNameBase> entityName = SrmCliUtils.getEntityName(entityType, name);
+ if (entityName == null) {
+ session.getConsole().println(SrmCliUtils.getNameHelp(entityType));
+ return null;
+ }
+ ReinstallInputBuilder inputBuilder = new ReinstallInputBuilder();
+ inputBuilder.setEntityType(entityType);
+ inputBuilder.setEntityName(entityName);
+ return inputBuilder.build();
}
}
--- /dev/null
+/*
+ * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. 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.genius.srm.shell;
+
+import com.google.common.collect.ImmutableMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityNameBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityTypeBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityTypeInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.EntityTypeService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.GeniusIfm;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.GeniusIfmInterface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.GeniusItm;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.GeniusItmTep;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.GeniusItmTz;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.NetvirtElan;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.NetvirtElanInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.NetvirtVpn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.NetvirtVpnInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.types.rev170711.Ofplugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The Utility class for SRM Shell.
+ */
+public final class SrmCliUtils {
+
+ private static final Logger LOG = LoggerFactory.getLogger(SrmCliUtils.class);
+ private static final ImmutableMap<String, Class<? extends EntityTypeBase>> ENTITY_TYPE_MAP =
+ new ImmutableMap.Builder<String, Class<? extends EntityTypeBase>>()
+ .put("SERVICE", EntityTypeService.class)
+ .put("INSTANCE", EntityTypeInstance.class)
+ .build();
+
+ private static final ImmutableMap<String, Class<? extends EntityNameBase>> SERVICE_NAME_MAP =
+ new ImmutableMap.Builder<String, Class<? extends EntityNameBase>>()
+ .put("ITM", GeniusItm.class)
+ .put("IFM", GeniusIfm.class)
+ .put("VPN", NetvirtVpn.class)
+ .put("ELAN", NetvirtElan.class)
+ .put("OFPLUGIN", Ofplugin.class)
+ .build();
+
+ private static final ImmutableMap<String, Class<? extends EntityNameBase>> INSTANCE_NAME_MAP =
+ new ImmutableMap.Builder<String, Class<? extends EntityNameBase>>()
+ .put("ITM-TEP", GeniusItmTep.class)
+ .put("ITM-TZ", GeniusItmTz.class)
+ .put("IFM-IFACE", GeniusIfmInterface.class)
+ .put("VPN-INSTANCE", NetvirtVpnInstance.class)
+ .put("ELAN-INSTANCE", NetvirtElanInstance.class)
+ .build();
+
+ /**
+ * Get EntityName given name in string.
+ *
+ * @param strType Entity Type as a string
+ * @return EntityName for use
+ */
+ public static Class<? extends EntityTypeBase> getEntityType(String strType) {
+ LOG.debug("Getting entityType for type {}", strType);
+ return ENTITY_TYPE_MAP.get(strType.toUpperCase());
+ }
+
+ /**
+ * Get EntityName given name in string.
+ *
+ * @param type Entity Type class
+ * @param strName Entity Name as a string
+ * @return EntityName for use
+ */
+ public static Class<? extends EntityNameBase> getEntityName(Class<? extends EntityTypeBase> type, String strName) {
+ LOG.debug("Getting entityName for type {} and name: {}", type, strName);
+ if (EntityTypeService.class.equals(type)) {
+ return SERVICE_NAME_MAP.get(strName.toUpperCase());
+ } else if (EntityTypeInstance.class.equals(type)) {
+ return INSTANCE_NAME_MAP.get(strName.toUpperCase());
+ } else {
+ return null;
+ }
+ }
+
+ public static String getTypeHelp() {
+ StringBuilder help = new StringBuilder("Supported Entity Types are:\n");
+ for (String entityType : SrmCliUtils.ENTITY_TYPE_MAP.keySet()) {
+ help.append("\t").append(entityType).append("/").append(entityType.toLowerCase()).append("\n");
+ }
+ return help.toString();
+ }
+
+ public static String getNameHelp(Class<? extends EntityTypeBase> entityType) {
+ StringBuilder help = new StringBuilder("Supported Entity Names for type");
+
+ if (EntityTypeService.class.equals(entityType)) {
+ help.append(" SERVICE are:\n");
+ for (String entityName : SrmCliUtils.SERVICE_NAME_MAP.keySet()) {
+ help.append(String.format("\t%s/%s\n", entityName.toLowerCase(), entityName));
+ }
+ } else if (EntityTypeInstance.class.equals(entityType)) {
+ help.append(" INSTANCE are:\n");
+ for (String entityName : SrmCliUtils.INSTANCE_NAME_MAP.keySet()) {
+ help.append(String.format("\t%s/%s\n", entityName.toLowerCase(), entityName));
+ }
+ }
+ return help.toString();
+ }
+
+}
--- /dev/null
+/*
+ * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. 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.genius.srm.shell;
+
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.ops.rev170711.ServiceOps;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Command(scope = "srm", name = "debug", description = "SRM debug commands")
+public class SrmDebugCommand extends OsgiCommandSupport {
+
+ private static final Logger LOG = LoggerFactory.getLogger(SrmDebugCommand.class);
+
+ private final SingleTransactionDataBroker txDataBroker;
+
+ public SrmDebugCommand(DataBroker dataBroker) {
+ this.txDataBroker = new SingleTransactionDataBroker(dataBroker);
+ }
+
+ @Option(name = "-c", aliases = {"--clear-ops"}, description = "Clear operations DS",
+ required = true, multiValued = false)
+ boolean clearOps;
+
+ @Override
+ protected Object doExecute() throws Exception {
+ if (clearOps) {
+ clearOpsDs();
+ }
+ return null;
+ }
+
+ private void clearOpsDs() throws Exception {
+ InstanceIdentifier<ServiceOps> path = getInstanceIdentifier();
+ txDataBroker.syncDelete(LogicalDatastoreType.OPERATIONAL, path);
+ }
+
+ private static InstanceIdentifier<ServiceOps> getInstanceIdentifier() {
+ return InstanceIdentifier.create(ServiceOps.class);
+ }
+
+}
xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
odl:use-default-for-reference-types="true">
+ <reference id="dataBroker"
+ interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"/>
+
<odl:rpc-service id="srmRpcService"
interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.srm.rpcs.rev170711.SrmRpcsService" />
<argument ref="srmRpcService" />
</action>
</command>
+ <command>
+ <action class="org.opendaylight.genius.srm.shell.SrmDebugCommand">
+ <argument ref="dataBroker"/>
+ </action>
+ </command>
</command-bundle>
</blueprint>