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

pingsutw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/submarine.git


The following commit(s) were added to refs/heads/master by this push:
     new 3bf0bf1  SUBMARINE-943. add [tags] into experimentSpec and add a 
searchExperimentByTag function
3bf0bf1 is described below

commit 3bf0bf1f5d28edea5a4a20d0a1ef7a94805ed2b1
Author: brandonlin <brandon...@verizonmedia.com>
AuthorDate: Tue Jul 20 14:13:00 2021 +0800

    SUBMARINE-943. add [tags] into experimentSpec and add a 
searchExperimentByTag function
    
    ### What is this PR for?
    We would like to allow users could define the tag on experiment by 
themself, and the tags should be also an useful field when they try to find 
experiment precisely, so I add a tags property into ExperimentSpec POJO and add 
a findExperimentByTag function.
    
    ### What type of PR is it?
    Improvement
    
    ### Todos
    add the new fields in front-end pages.
    
    ### What is the Jira issue?
    https://issues.apache.org/jira/browse/SUBMARINE-943
    
    ### How should this be tested?
    The unit test has also been modified and added.
    
    ### Screenshots (if appropriate)
    N/A
    ### Questions:
    * Do the license files need updating? No
    * Are there breaking changes for older versions? No
    * Does this need new documentation? No
    
    Author: brandonlin <brandon...@verizonmedia.com>
    Author: Brandon Lin <fatal...@gmail.com>
    
    Signed-off-by: Kevin <pings...@apache.org>
    
    Closes #685 from FatalLin/SUBMARINE-943 and squashes the following commits:
    
    e2e25116 [Brandon Lin] add comments
    7c127265 [brandonlin] polish
    fdb95807 [brandonlin] polish
    5136cb17 [brandonlin] polish
    a637a3dd [brandonlin] align code style
    906fa4ef [brandonlin] fix matching logic
    9cbe1468 [brandonlin] add [tags] into experimentSpec and add a 
searchExperimentByTag function
---
 .../submarine/server/api/spec/ExperimentMeta.java  | 20 ++++++++++-
 .../server/experiment/ExperimentManager.java       | 40 +++++++++++++++++++++
 .../server/experiment/ExperimentManagerTest.java   | 41 ++++++++++++++++++++++
 .../src/test/resources/experiment/spec.json        |  5 ++-
 4 files changed, 104 insertions(+), 2 deletions(-)

diff --git 
a/submarine-server/server-api/src/main/java/org/apache/submarine/server/api/spec/ExperimentMeta.java
 
b/submarine-server/server-api/src/main/java/org/apache/submarine/server/api/spec/ExperimentMeta.java
index 7791b89..67af93d 100644
--- 
a/submarine-server/server-api/src/main/java/org/apache/submarine/server/api/spec/ExperimentMeta.java
+++ 
b/submarine-server/server-api/src/main/java/org/apache/submarine/server/api/spec/ExperimentMeta.java
@@ -19,6 +19,9 @@
 
 package org.apache.submarine.server.api.spec;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -33,7 +36,8 @@ public class ExperimentMeta {
   private String namespace;
   private String framework;
   private String cmd;
-  private Map<String, String> envVars;
+  private Map<String, String> envVars = new HashMap<>();
+  private List<String> tags = new ArrayList<>();
 
   public ExperimentMeta() {
 
@@ -126,6 +130,19 @@ public class ExperimentMeta {
   }
 
   /**
+   * The default tag list for task. If the @{@link 
ExperimentTaskSpec#getEnvVars()} not specified
+   * replaced with it.
+   * @return tags
+   */
+  public List<String> getTags() {
+    return tags;
+  }
+
+  public void setTags(List<String> tags) {
+    this.tags = tags;
+  }
+
+  /**
    * The {@link ExperimentMeta#framework} should be one of the below supported 
framework name.
    */
   public enum SupportedMLFramework {
@@ -161,6 +178,7 @@ public class ExperimentMeta {
       ", framework='" + framework + '\'' +
       ", cmd='" + cmd + '\'' +
       ", envVars=" + envVars +
+      ", tags=" + tags +
       '}';
   }
 }
diff --git 
a/submarine-server/server-core/src/main/java/org/apache/submarine/server/experiment/ExperimentManager.java
 
b/submarine-server/server-core/src/main/java/org/apache/submarine/server/experiment/ExperimentManager.java
index 7ccf35b..7466bf8 100644
--- 
a/submarine-server/server-core/src/main/java/org/apache/submarine/server/experiment/ExperimentManager.java
+++ 
b/submarine-server/server-core/src/main/java/org/apache/submarine/server/experiment/ExperimentManager.java
@@ -110,6 +110,7 @@ public class ExperimentManager {
     // and then log experiment metrics and parameters to submarine server
     ExperimentId id = generateExperimentId();
     String url = getSQLAlchemyURL();
+
     spec.getMeta().getEnvVars().put(RestConstants.JOB_ID, id.toString());
     spec.getMeta().getEnvVars().put(RestConstants.SUBMARINE_TRACKING_URI, url);
     spec.getMeta().getEnvVars().put(RestConstants.LOG_DIR_KEY, 
RestConstants.LOG_DIR_VALUE);
@@ -182,6 +183,45 @@ public class ExperimentManager {
   }
 
   /**
+   * List experiments
+   *
+   * @param tag, if null will return all experiments
+   * @return list
+   * @throws SubmarineRuntimeException the service error
+   */
+  public List<Experiment> listExperimentsByTag(String searchTag) throws 
SubmarineRuntimeException {
+    List<Experiment> experimentList = new ArrayList<>();
+    List<ExperimentEntity> entities = experimentService.selectAll();
+
+    for (ExperimentEntity entity : entities) {
+      Experiment experiment = buildExperimentFromEntity(entity);
+      Experiment foundExperiment;
+      try {
+        foundExperiment = submitter.findExperiment(experiment.getSpec());
+      } catch (SubmarineRuntimeException e) {
+        LOG.warn("Submitter can not find experiment: {}, will delete it", 
entity.getId());
+        experimentService.delete(entity.getId());
+        continue;
+      }
+      LOG.info("Found experiment: {}", 
foundExperiment.getSpec().getMeta().getTags());
+      if (searchTag == null) {
+        experiment.rebuild(foundExperiment);
+        experimentList.add(experiment);
+      } else {
+        for (String tag: experiment.getSpec().getMeta().getTags()) {
+          if (tag.equalsIgnoreCase(searchTag)) {
+            experiment.rebuild(foundExperiment);
+            experimentList.add(experiment);
+            break;
+          }
+        }
+      }
+    }
+    LOG.info("List experiment: {}", experimentList.size());
+    return experimentList;
+  }
+
+  /**
    * Patch the experiment
    *
    * @param id      experiment id
diff --git 
a/submarine-server/server-core/src/test/java/org/apache/submarine/server/experiment/ExperimentManagerTest.java
 
b/submarine-server/server-core/src/test/java/org/apache/submarine/server/experiment/ExperimentManagerTest.java
index d70639b..b8ec96a 100644
--- 
a/submarine-server/server-core/src/test/java/org/apache/submarine/server/experiment/ExperimentManagerTest.java
+++ 
b/submarine-server/server-core/src/test/java/org/apache/submarine/server/experiment/ExperimentManagerTest.java
@@ -41,6 +41,8 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.List;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
@@ -106,6 +108,40 @@ public class ExperimentManagerTest {
   }
 
   @Test
+  public void testFinaExperimentByTag() {
+
+    // Build two experiment objects, only experiment1 has tags
+    ExperimentId experimentId1 = new ExperimentId();
+    experimentId1.setServerTimestamp(System.currentTimeMillis());
+    experimentId1.setId(1);
+
+    Experiment experiment1 = new Experiment();
+    experiment1.setSpec(spec);
+    experiment1.setExperimentId(experimentId1);
+    experiment1.rebuild(result);
+
+    ExperimentId experimentId2 = new ExperimentId();
+    experimentId2.setServerTimestamp(System.currentTimeMillis());
+    experimentId2.setId(2);
+
+    ExperimentEntity entity1 = new ExperimentEntity();
+    entity1.setId(experiment1.getExperimentId().toString());
+    entity1.setExperimentSpec(new 
GsonBuilder().disableHtmlEscaping().create().toJson(experiment1.getSpec()));
+
+    doReturn(Arrays.asList(entity1)).when(mockService).selectAll();
+
+    
when(mockSubmitter.findExperiment(any(ExperimentSpec.class))).thenReturn(experiment1);
+
+    ExperimentManager spyExperimentManager = spy(experimentManager);
+    // only the experiment1 object should be found with giving tag stable
+    List<Experiment> foundExperiments = 
spyExperimentManager.listExperimentsByTag("stable");
+    assertEquals(1, foundExperiments.size());
+    // no object should be found when we're searching with tag "test"
+    List<Experiment> foundExperiments2 = 
spyExperimentManager.listExperimentsByTag("test");
+    assertEquals(0, foundExperiments2.size());
+  }
+
+  @Test
   public void testGetExperiment() {
 
     // Create the experimentID for this experiment
@@ -234,6 +270,11 @@ public class ExperimentManagerTest {
         expected.getSpec().getEnvironment().getImage(),
         actual.getSpec().getEnvironment().getImage())
     ;
+
+    assertEquals(
+            expected.getSpec().getMeta().getTags().toString(),
+            actual.getSpec().getMeta().getTags().toString())
+    ;
   }
 
   private Object buildFromJsonFile(Object obj, String filePath) throws 
SubmarineException {
diff --git 
a/submarine-server/server-core/src/test/resources/experiment/spec.json 
b/submarine-server/server-core/src/test/resources/experiment/spec.json
index 3a071f4..83312fe 100644
--- a/submarine-server/server-core/src/test/resources/experiment/spec.json
+++ b/submarine-server/server-core/src/test/resources/experiment/spec.json
@@ -6,7 +6,10 @@
     "cmd": "python /var/tf_mnist/mnist_with_summaries.py --log_dir=/train/log 
--learning_rate=0.01 --batch_size=150",
     "envVars": {
       "ENV_1": "ENV1"
-    }
+    },
+    "tags": [
+      "default", "stable"
+    ]
   },
   "environment": {
     "image": "apache/submarine:tf-mnist-with-summaries-1.0"

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@submarine.apache.org
For additional commands, e-mail: dev-h...@submarine.apache.org

Reply via email to