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
+}