SRM: Add implementation code
authorVishal Thapar <vishal.thapar@ericsson.com>
Thu, 27 Jul 2017 21:41:05 +0000 (03:11 +0530)
committerVivek Srivastava <vivek.v.srivastava@ericsson.com>
Fri, 27 Oct 2017 07:08:34 +0000 (07:08 +0000)
This adds the following:
1. RPC Implementation in impl and required util class
2. CLI for SRM as mentioned in spec.
3. Debug CLI to clear out SRM operDS.

These cover Work Items 3 and 4 of SRM Spec.

Change-Id: I04553678580ff53217c7757594cdd836aa8abfae
Signed-off-by: Vishal Thapar <vishal.thapar@ericsson.com>
impl/pom.xml
impl/src/main/java/org/opendaylight/genius/srm/SrmRpcProvider.java
impl/src/main/java/org/opendaylight/genius/srm/SrmRpcUtils.java [new file with mode: 0644]
shell/pom.xml
shell/src/main/java/org/opendaylight/genius/srm/shell/RecoverCommand.java
shell/src/main/java/org/opendaylight/genius/srm/shell/ReinstallCommand.java
shell/src/main/java/org/opendaylight/genius/srm/shell/SrmCliUtils.java [new file with mode: 0644]
shell/src/main/java/org/opendaylight/genius/srm/shell/SrmDebugCommand.java [new file with mode: 0644]
shell/src/main/resources/org/opendaylight/blueprint/blueprint.xml

index 6f3921126587ac5c29901b334891ab268b6158ee..c8fb0ffb4d91fb2780dc812b77e542029530600f 100644 (file)
@@ -36,6 +36,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <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>
index 09957f31fa391063c05e01b5e98801fdafe783c1..a612b4de5437ec4d021046da586ac90475a7ca9c 100644 (file)
@@ -13,14 +13,13 @@ import java.util.concurrent.Future;
 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;
 
@@ -38,19 +37,16 @@ public class SrmRpcProvider implements SrmRpcsService {
 
     @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();
     }
 
 }
diff --git a/impl/src/main/java/org/opendaylight/genius/srm/SrmRpcUtils.java b/impl/src/main/java/org/opendaylight/genius/srm/SrmRpcUtils.java
new file mode 100644 (file)
index 0000000..9f71ac9
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+ * 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());
+    }
+
+}
index c55004935b760372af8edbefbe5be9f6bdededf1..6fb97ade58096431e391f47bf3b6d997f3920990 100644 (file)
@@ -25,6 +25,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <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>
index 769f6607c3bede011244eae3ac0f6c17320fb972..bc0392c66e085e7a9eaed26794c0da42e5e98af5 100644 (file)
@@ -8,10 +8,17 @@
 
 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;
 
@@ -37,14 +44,52 @@ public class RecoverCommand extends OsgiCommandSupport {
 
     @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();
     }
 
 }
index 619f1f56231f4bea9422bc933a1aa2bede1a1aaf..96b56793585110aa36e0f0b31313f03dec5e2433 100644 (file)
@@ -8,12 +8,18 @@
 
 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;
 
@@ -25,7 +31,6 @@ public class ReinstallCommand extends OsgiCommandSupport {
     private SrmRpcsService srmRpcService;
     private final Class<? extends EntityTypeBase> entityType = EntityTypeService.class;
 
-
     public ReinstallCommand(SrmRpcsService srmRpcService) {
         this.srmRpcService = srmRpcService;
     }
@@ -36,14 +41,40 @@ public class ReinstallCommand extends OsgiCommandSupport {
 
     @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();
     }
 
 }
diff --git a/shell/src/main/java/org/opendaylight/genius/srm/shell/SrmCliUtils.java b/shell/src/main/java/org/opendaylight/genius/srm/shell/SrmCliUtils.java
new file mode 100644 (file)
index 0000000..e965cc6
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * 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();
+    }
+
+}
diff --git a/shell/src/main/java/org/opendaylight/genius/srm/shell/SrmDebugCommand.java b/shell/src/main/java/org/opendaylight/genius/srm/shell/SrmDebugCommand.java
new file mode 100644 (file)
index 0000000..fbc5782
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * 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);
+    }
+
+}
index 1297b07325d5875ba36fbec7ec687cf31d0e41f1..3ddbcd793da21231993153a8576535906d8195b7 100644 (file)
@@ -9,6 +9,9 @@
            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>