You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by is...@apache.org on 2022/02/13 05:30:30 UTC

[solr] branch jira/solr-14688_poc updated: Tabular output of list-available

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

ishan pushed a commit to branch jira/solr-14688_poc
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/jira/solr-14688_poc by this push:
     new 1c34011  Tabular output of list-available
1c34011 is described below

commit 1c34011f71200c168f64955f2238dbf78cfef638
Author: Ishan Chattopadhyaya <is...@apache.org>
AuthorDate: Sun Feb 13 11:00:21 2022 +0530

    Tabular output of list-available
---
 solr/core/build.gradle                             |  2 +-
 .../src/java/org/apache/solr/pkg/PackageAPI.java   | 19 ++++++++-
 .../java/org/apache/solr/pkg/PackageLoader.java    | 16 +++----
 .../src/java/org/apache/solr/util/PackageTool.java | 49 ++++++++++++++++++++--
 solr/modules/build.gradle                          | 10 ++---
 5 files changed, 77 insertions(+), 19 deletions(-)

diff --git a/solr/core/build.gradle b/solr/core/build.gradle
index 9d2acf1..5af94d7 100644
--- a/solr/core/build.gradle
+++ b/solr/core/build.gradle
@@ -91,7 +91,7 @@ dependencies {
 
   // For Package Manager
   implementation 'com.github.zafarkhaja:java-semver'
-
+  implementation 'de.vandermeer:asciitable:0.3.2'
   implementation('com.jayway.jsonpath:json-path', {
     exclude group: "net.minidev", module: "json-smart"
   })
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java b/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
index 91cfbb5..819691a 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
@@ -39,6 +39,7 @@ import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZooKeeperException;
 import org.apache.solr.common.util.CommandOperation;
 import org.apache.solr.common.util.ReflectMapWriter;
+import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.filestore.PackageStoreAPI;
@@ -166,7 +167,6 @@ public class PackageAPI {
     @JsonProperty
     public Map<String, List<PkgVersion>> packages = new LinkedHashMap<>();
 
-
     public Packages copy() {
       Packages p = new Packages();
       p.znodeVersion = this.znodeVersion;
@@ -400,6 +400,23 @@ public class PackageAPI {
       }
     }
 
+    @EndPoint(
+            method = SolrRequest.METHOD.GET,
+            path = {"/node/packages/"},
+            permission = PACKAGE_READ_PERM
+    )
+    public void getLocalPackages(SolrQueryRequest req, SolrQueryResponse rsp) {
+      String name = req.getPathTemplateValues().get("name");
+      if (name == null) {
+        Map<String, Object> localPackages = new LinkedHashMap<>();
+        for (String packageName: packageLoader.localPackages.packages.keySet()) {
+          boolean enabled = StrUtils.splitSmart(packageLoader.enabledLocalPkgsList, ',').contains(packageName);
+          localPackages.put(packageName, Map.of("enabled", enabled, "versions", packageLoader.localPackages.packages.get(packageName)));
+        }
+        rsp.add("packages", localPackages);
+      }
+    }
+
     private void syncToVersion(int expectedVersion) {
       int origVersion = pkgs.znodeVersion;
       for (int i = 0; i < 10; i++) {
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java b/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java
index 19bebb6..72942a3 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java
@@ -54,7 +54,7 @@ public class PackageLoader implements Closeable, MapWriter {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   public static final String LATEST = "$LATEST";
   public static final String LOCAL_PKGS_DIR_PROP = "solr.packages.local.dir";
-  public static final String ENABLED_LOCAL_PKGS_PROP = "solr.enabled.local.pkgs";
+  public static final String ENABLED_LOCAL_PKGS_PROP = "solr.enabled.local.packages";
   public static final String LOCAL_PACKAGES_JSON = "local_packages.json";
   public static final String ENABLE_PACKAGES_REPO_PROP = "enable.packages";
   public static final String ENABLE_PACKAGES_REPO_PROP_NEW = "solr.enable.pkgs.repo";
@@ -103,9 +103,8 @@ public class PackageLoader implements Closeable, MapWriter {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "No such directory: " + packagesPath);
     }
     Path packagesJsonPath = packagesPath.resolve(LOCAL_PACKAGES_JSON);
-    if(Files.exists(packagesJsonPath)) {
+    if (Files.exists(packagesJsonPath)) {
       try {
-
         try (InputStream in = Files.newInputStream(packagesJsonPath)) {
           localPackages = PackageAPI.mapper.readValue(in, PackageAPI.Packages.class);
         }
@@ -113,17 +112,18 @@ public class PackageLoader implements Closeable, MapWriter {
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error reading local_packages.json", e);
       }
     } else {
-      //the no local_packages.json
-      //we will look for each subdirectory and consider them as a package
-      localPackages =  readDirAsPackages(packagesPath);
+      // the no local_packages.json
+      // we will look for each subdirectory and consider them as a package
+      log.warn("No local_packages.json found. Solr will look for each subdirectory and consider them as a package.");
+      localPackages = readDirAsPackages(packagesPath);
     }
 
-    if(localPackages != null) {
+    if (localPackages != null) {
       localPackages.packages.forEach((s, versions) -> versions.forEach(v -> {
         v.local = Boolean.TRUE;
       }));
       for (Map.Entry<String, List<PackageAPI.PkgVersion>> e : localPackages.packages.entrySet()) {
-        if(!enabledPackages.contains(e.getKey())) continue;
+        if (!enabledPackages.contains(e.getKey())) continue;
         Package p = new Package(e.getKey(), e.getValue());
         p.updateVersions(e.getValue(), packagesPath);
         packageClassLoaders.put(e.getKey(), p);
diff --git a/solr/core/src/java/org/apache/solr/util/PackageTool.java b/solr/core/src/java/org/apache/solr/util/PackageTool.java
index 75a9bdb..8ba2866 100644
--- a/solr/core/src/java/org/apache/solr/util/PackageTool.java
+++ b/solr/core/src/java/org/apache/solr/util/PackageTool.java
@@ -16,19 +16,30 @@
  */
 package org.apache.solr.util;
 
+import java.io.PrintStream;
 import java.lang.invoke.MethodHandles;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import de.vandermeer.asciitable.AsciiTable;
+import de.vandermeer.skb.interfaces.document.TableRowStyle;
+import de.vandermeer.skb.interfaces.transformers.textformat.TextAlignment;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.config.Configurator;
 import org.apache.lucene.util.SuppressForbidden;
+import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.SolrResponse;
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.impl.HttpClientUtil;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.request.V2Request;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.util.Pair;
@@ -45,15 +56,18 @@ import org.slf4j.LoggerFactory;
 import static org.apache.solr.packagemanager.PackageUtils.print;
 import static org.apache.solr.packagemanager.PackageUtils.printGreen;
 
-public class PackageTool extends SolrCLI.ToolBase {
+public class PackageTool extends SolrCLI.SolrCloudTool {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   @SuppressForbidden(reason = "Need to turn off logging, and SLF4J doesn't seem to provide for a way.")
   public PackageTool() {
+    this(CLIO.getOutStream());
     // Need a logging free, clean output going through to the user.
     Configurator.setRootLevel(Level.OFF);
   }
+  public PackageTool(PrintStream stdout) { super(stdout); }
+
 
   @Override
   public String getName() {
@@ -69,7 +83,8 @@ public class PackageTool extends SolrCLI.ToolBase {
   @SuppressForbidden(reason = "We really need to print the stacktrace here, otherwise "
       + "there shall be little else information to debug problems. Other SolrCLI tools "
       + "don't print stack traces, hence special treatment is needed here.")
-  protected void runImpl(CommandLine cli) throws Exception {
+  @SuppressWarnings("unchecked")
+  protected void runCloudTool(CloudSolrClient cloudSolrClient, CommandLine cli) throws Exception {
     try {
       solrUrl = cli.getOptionValues("solrUrl")[cli.getOptionValues("solrUrl").length-1];
       solrBaseUrl = solrUrl.replaceAll("\\/solr$", ""); // strip out ending "/solr"
@@ -105,12 +120,38 @@ public class PackageTool extends SolrCLI.ToolBase {
                 break;
               case "list-available":
                 PackageUtils.printGreen("Available packages:\n-----");
+
+
+                AsciiTable table = new AsciiTable();
+                table.addRule();
+                table.addRow("Name", "Description", "Versions", "Repository");
+                table.addRule();
+
+                SolrResponse resp = new V2Request.Builder("/node/packages")
+                        .withMethod(SolrRequest.METHOD.GET)
+                        .build().process(cloudSolrClient);
+                Map<String, Object> local = (Map<String, Object>) new ObjectMapper().readValue(resp.jsonStr(), Map.class);
+                local = (Map<String, Object>) local.get("packages");
+                for (String pkg: local.keySet()) {
+                  String versions = "";
+                  for (Map<String, Object> version: ((List<Map<String, Object>>) ((Map<String, Object>) local.get(pkg)).get("versions"))) {
+                    versions += version.get("version") + "\n";
+                  }
+                  table.addRow(Arrays.asList(pkg, "", versions.substring(0, versions.length() - 1), "local"));
+                  table.addRule();
+                }
+
                 for (SolrPackage pkg: repositoryManager.getPackages()) {
-                  PackageUtils.printGreen(pkg.name + " \t\t"+pkg.description);
+                  String versions = "";
                   for (SolrPackageRelease version: pkg.versions) {
-                    PackageUtils.printGreen("\tVersion: "+version.version);
+                    versions = versions + version.version + "\n";
                   }
+                  table.addRow(Arrays.asList(pkg.name, pkg.description, versions.substring(0, versions.length() - 1), pkg.getRepository()));
+                  table.addRule();
                 }
+
+                table.setTextAlignment(TextAlignment.LEFT);
+                PackageUtils.printGreen(table.render());
                 break;
               case "list-deployed":
                 if (cli.hasOption('c')) {
diff --git a/solr/modules/build.gradle b/solr/modules/build.gradle
index 7452530..f65c99f 100644
--- a/solr/modules/build.gradle
+++ b/solr/modules/build.gradle
@@ -49,10 +49,10 @@ task createLocalPackagesJson {
         packages: [:]
     ]
     configurations.modulePackages.each { depPath ->
-      def moduleName = depPath.parentFile.parentFile.name
+      def moduleName = "solr-" + depPath.parentFile.parentFile.name
       def module = [
           version: version,
-          moduleFiles: [],
+          files: [],
           manifest: "",
       ]
       fileTree(depPath).filter { it.isFile() }.files.each {pkgFile ->
@@ -60,12 +60,12 @@ task createLocalPackagesJson {
         if (filePath.endsWith("manifest.json")) {
           module.manifest = filePath
         } else if (filePath.contains("/lib/")) {
-          module.moduleFiles.add(filePath)
+          module.files.add(filePath)
         }
       }
-      packagesJson.packages[moduleName] = module
+      packagesJson.packages[moduleName] = [module]
     }
     mkdir packagingDir
     new File(localPackagesFile).text = JsonOutput.prettyPrint(JsonOutput.toJson(packagesJson))
   }
-}
\ No newline at end of file
+}