You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ji...@apache.org on 2018/05/22 15:58:07 UTC

[geode] branch develop updated: GEODE-5011: ResultModel can add a table that takes a list of CliFunct… (#1972)

This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new 3af0a82  GEODE-5011: ResultModel can add a table that takes a list of CliFunct… (#1972)
3af0a82 is described below

commit 3af0a825c828a51d2acd38fb08726c5d80f486b1
Author: jinmeiliao <ji...@pivotal.io>
AuthorDate: Tue May 22 08:58:01 2018 -0700

    GEODE-5011: ResultModel can add a table that takes a list of CliFunct… (#1972)
    
    * change status flag from "IGNORED" to "IGNORABLE"
---
 .../internal/cli/functions/CliFunctionResult.java  |  29 ++---
 .../functions/DestroyGatewayReceiverFunction.java  |   2 +-
 .../cli/functions/DestroyIndexFunction.java        |   4 +-
 .../internal/cli/result/model/ResultModel.java     |  39 ++++--
 .../internal/cli/result/model/ResultModelTest.java | 133 +++++++++++++++++++++
 5 files changed, 169 insertions(+), 38 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CliFunctionResult.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CliFunctionResult.java
index 9aeaa7b..b649480 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CliFunctionResult.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CliFunctionResult.java
@@ -37,7 +37,7 @@ public class CliFunctionResult implements Comparable<CliFunctionResult>, DataSer
   private StatusState state;
 
   public enum StatusState {
-    OK, ERROR, IGNORED
+    OK, ERROR, IGNORABLE
   }
 
   @Deprecated
@@ -131,16 +131,16 @@ public class CliFunctionResult implements Comparable<CliFunctionResult>, DataSer
     return (String) this.serializables[0];
   }
 
-  public String getStatus(boolean allowIgnorableFailures) {
-    if (!allowIgnorableFailures && state == StatusState.IGNORED) {
-      return StatusState.ERROR.name();
+  public String getStatus(boolean skipIgnore) {
+    if (state == StatusState.IGNORABLE) {
+      return skipIgnore ? "IGNORED" : "ERROR";
     }
 
-    return getStatus();
+    return state.name();
   }
 
   public String getStatus() {
-    return state.name();
+    return getStatus(true);
   }
 
   public String getStatusMessage() {
@@ -258,22 +258,7 @@ public class CliFunctionResult implements Comparable<CliFunctionResult>, DataSer
   }
 
   public boolean isIgnorableFailure() {
-    return this.state == StatusState.IGNORED;
-  }
-
-  /**
-   * Use this to signal that an operation failed but it might be OK to ignore. This is intended to
-   * obviate the need to send a 'skip-if-exists' or 'if-not-exists' flag to any relevant function
-   * and allows the caller to now decide how to handle the result.
-   * <p/>
-   * An {@code IllegalStateException} will be thrown if the state of this {@code CliFunctionResult}
-   * is not already error.
-   */
-  public void setIgnorableFailure() {
-    if (isSuccessful()) {
-      throw new IllegalStateException("Cannot call setIgnorableFailure when state == OK");
-    }
-    this.state = StatusState.IGNORED;
+    return this.state == StatusState.IGNORABLE;
   }
 
   @Deprecated
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyGatewayReceiverFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyGatewayReceiverFunction.java
index 46cff54..9b96193 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyGatewayReceiverFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyGatewayReceiverFunction.java
@@ -58,7 +58,7 @@ public class DestroyGatewayReceiverFunction extends CliFunction {
         }
       }
     }
-    return new CliFunctionResult(memberNameOrId, StatusState.IGNORED,
+    return new CliFunctionResult(memberNameOrId, StatusState.IGNORABLE,
         "Gateway receiver not found.");
   }
 
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyIndexFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyIndexFunction.java
index 3d56eed..7d445e1 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyIndexFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyIndexFunction.java
@@ -58,7 +58,7 @@ public class DestroyIndexFunction extends CliFunction {
               result = new CliFunctionResult(memberId, CliFunctionResult.StatusState.OK,
                   "Destroyed index " + indexName + " on region " + regionPath);
             } else {
-              result = new CliFunctionResult(memberId, CliFunctionResult.StatusState.IGNORED,
+              result = new CliFunctionResult(memberId, CliFunctionResult.StatusState.IGNORABLE,
                   CliStrings.format(CliStrings.DESTROY_INDEX__INDEX__NOT__FOUND, indexName));
             }
           }
@@ -77,7 +77,7 @@ public class DestroyIndexFunction extends CliFunction {
             result = new CliFunctionResult(memberId, CliFunctionResult.StatusState.OK,
                 "Destroyed index " + indexName);
           } else {
-            result = new CliFunctionResult(memberId, CliFunctionResult.StatusState.IGNORED,
+            result = new CliFunctionResult(memberId, CliFunctionResult.StatusState.IGNORABLE,
                 CliStrings.format(CliStrings.DESTROY_INDEX__INDEX__NOT__FOUND, indexName));
           }
         }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/model/ResultModel.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/model/ResultModel.java
index 65fa663..a7059d9 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/model/ResultModel.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/model/ResultModel.java
@@ -203,6 +203,29 @@ public class ResultModel {
     return section;
   }
 
+  public TabularResultModel addTableAndSetStatus(String namedSection,
+      List<CliFunctionResult> functionResults, boolean skipIgnored) {
+    Object model = sections.get(namedSection);
+    if (model != null) {
+      throw new IllegalStateException(
+          "Section already exists. Can't overwrite it with this new content.");
+    }
+    TabularResultModel section = this.addTable(namedSection);
+    boolean atLeastOneSuccess = false;
+    section.setColumnHeader("Member", "Status", "Message");
+    for (CliFunctionResult functionResult : functionResults) {
+      section.addRow(functionResult.getMemberIdOrName(), functionResult.getStatus(skipIgnored),
+          functionResult.getStatusMessage());
+      if (functionResult.isSuccessful()) {
+        atLeastOneSuccess = true;
+      } else if (functionResult.isIgnorableFailure() && skipIgnored) {
+        atLeastOneSuccess = true;
+      }
+    }
+    setStatus(atLeastOneSuccess ? Result.Status.OK : Result.Status.ERROR);
+    return section;
+  }
+
   @JsonIgnore
   public List<TabularResultModel> getTableSections() {
     return sections.values().stream().filter(TabularResultModel.class::isInstance)
@@ -312,21 +335,11 @@ public class ResultModel {
   public static ResultModel createMemberStatusResult(List<CliFunctionResult> functionResults,
       String header, String footer, boolean ignoreIfFailed) {
     ResultModel result = new ResultModel();
-    boolean atLeastOneSuccess = ignoreIfFailed;
-    TabularResultModel tabularResultModel = result.addTable(MEMBER_STATUS_SECTION);
+
+    TabularResultModel tabularResultModel =
+        result.addTableAndSetStatus(MEMBER_STATUS_SECTION, functionResults, ignoreIfFailed);
     tabularResultModel.setHeader(header);
     tabularResultModel.setFooter(footer);
-    tabularResultModel.setColumnHeader("Member", "Status", "Message");
-    for (CliFunctionResult functionResult : functionResults) {
-      tabularResultModel.addRow(functionResult.getMemberIdOrName(),
-          functionResult.getStatus(ignoreIfFailed), functionResult.getStatusMessage());
-      if (functionResult.isSuccessful()) {
-        atLeastOneSuccess = true;
-      }
-    }
-    if (!atLeastOneSuccess) {
-      result.setStatus(Result.Status.ERROR);
-    }
     return result;
   }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/result/model/ResultModelTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/result/model/ResultModelTest.java
new file mode 100644
index 0000000..6d15736
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/result/model/ResultModelTest.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You 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.
+ */
+
+package org.apache.geode.management.internal.cli.result.model;
+
+import static org.apache.geode.management.internal.cli.functions.CliFunctionResult.StatusState.ERROR;
+import static org.apache.geode.management.internal.cli.functions.CliFunctionResult.StatusState.IGNORABLE;
+import static org.apache.geode.management.internal.cli.functions.CliFunctionResult.StatusState.OK;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
+import org.apache.geode.test.junit.categories.UnitTest;
+
+
+@Category(UnitTest.class)
+public class ResultModelTest {
+
+  private ResultModel result;
+  private TabularResultModel table;
+
+  @Before
+  public void setUp() throws Exception {
+    result = new ResultModel();
+  }
+
+  @Test
+  public void setContentAllOK() {
+    List<CliFunctionResult> results = new ArrayList<>();
+    results.add(new CliFunctionResult("member1", OK, "success"));
+    results.add(new CliFunctionResult("member2", OK, "success"));
+    table = result.addTableAndSetStatus("table1", results, true);
+    assertThat(result.getStatus()).isEqualTo(Result.Status.OK);
+    assertThat(table.getContent().get("Status").toString()).isEqualTo("[OK, OK]");
+
+    table = result.addTableAndSetStatus("table2", results, false);
+    assertThat(result.getStatus()).isEqualTo(Result.Status.OK);
+    assertThat(table.getContent().get("Status").toString()).isEqualTo("[OK, OK]");
+  }
+
+  @Test
+  public void setContentAllError() {
+    List<CliFunctionResult> results = new ArrayList<>();
+    results.add(new CliFunctionResult("member1", ERROR, "failed"));
+    results.add(new CliFunctionResult("member2", ERROR, "failed"));
+
+    table = result.addTableAndSetStatus("table1", results, true);
+    assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
+    assertThat(table.getContent().get("Status").toString()).isEqualTo("[ERROR, ERROR]");
+
+    table = result.addTableAndSetStatus("table2", results, false);
+    assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
+    assertThat(table.getContent().get("Status").toString()).isEqualTo("[ERROR, ERROR]");
+  }
+
+  @Test
+  public void setContentAllIgnorable() {
+    List<CliFunctionResult> results = new ArrayList<>();
+    results.add(new CliFunctionResult("member1", IGNORABLE, "can be ignored"));
+    results.add(new CliFunctionResult("member2", IGNORABLE, "can be ignored"));
+
+    table = result.addTableAndSetStatus("table1", results, true);
+    assertThat(result.getStatus()).isEqualTo(Result.Status.OK);
+    assertThat(table.getContent().get("Status").toString()).isEqualTo("[IGNORED, IGNORED]");
+
+    table = result.addTableAndSetStatus("table2", results, false);
+    assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
+    assertThat(table.getContent().get("Status").toString()).isEqualTo("[ERROR, ERROR]");
+  }
+
+  @Test
+  public void setContentOKAndError() {
+    List<CliFunctionResult> results = new ArrayList<>();
+    results.add(new CliFunctionResult("member1", OK, "success"));
+    results.add(new CliFunctionResult("member2", ERROR, "failed"));
+
+    table = result.addTableAndSetStatus("table1", results, true);
+    assertThat(result.getStatus()).isEqualTo(Result.Status.OK);
+    assertThat(table.getContent().get("Status").toString()).isEqualTo("[OK, ERROR]");
+
+    table = result.addTableAndSetStatus("table2", results, false);
+    assertThat(result.getStatus()).isEqualTo(Result.Status.OK);
+    assertThat(table.getContent().get("Status").toString()).isEqualTo("[OK, ERROR]");
+  }
+
+  @Test
+  public void setContentOKAndIgnore() {
+    List<CliFunctionResult> results = new ArrayList<>();
+    results.add(new CliFunctionResult("member1", OK, "success"));
+    results.add(new CliFunctionResult("member2", IGNORABLE, "can be ignored"));
+    table = result.addTableAndSetStatus("table1", results, true);
+    assertThat(result.getStatus()).isEqualTo(Result.Status.OK);
+    assertThat(table.getContent().get("Status").toString()).isEqualTo("[OK, IGNORED]");
+
+    table = result.addTableAndSetStatus("table2", results, false);
+    assertThat(result.getStatus()).isEqualTo(Result.Status.OK);
+    assertThat(table.getContent().get("Status").toString()).isEqualTo("[OK, ERROR]");
+  }
+
+  @Test
+  public void setContentErrorAndIgnore() {
+    List<CliFunctionResult> results = new ArrayList<>();
+    results.add(new CliFunctionResult("member1", ERROR, "failed"));
+    results.add(new CliFunctionResult("member2", IGNORABLE, "can be ignored"));
+
+    table = result.addTableAndSetStatus("table1", results, true);
+    assertThat(result.getStatus()).isEqualTo(Result.Status.OK);
+    assertThat(table.getContent().get("Status").toString()).isEqualTo("[ERROR, IGNORED]");
+
+    table = result.addTableAndSetStatus("table2", results, false);
+    assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
+    assertThat(table.getContent().get("Status").toString()).isEqualTo("[ERROR, ERROR]");
+  }
+}

-- 
To stop receiving notification emails like this one, please contact
jinmeiliao@apache.org.