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

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


The following commit(s) were added to refs/heads/master by this push:
     new e6096246780 IGNITE-28796 Add a system view for PluginProvider (#13256)
e6096246780 is described below

commit e6096246780576504c086fbb51f768510c4b2f9c
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Fri Jun 19 20:19:43 2026 +0300

    IGNITE-28796 Add a system view for PluginProvider (#13256)
---
 .../internal/jdbc2/JdbcMetadataSelfTest.java       |  3 +-
 .../ignite/jdbc/thin/JdbcThinMetadataSelfTest.java |  9 ++-
 .../apache/ignite/util/SystemViewCommandTest.java  |  3 +-
 .../org/apache/ignite/internal/IgniteKernal.java   |  2 +
 .../processors/plugin/IgnitePluginProcessor.java   | 25 +++++++-
 .../org/apache/ignite/plugin/PluginProvider.java   |  5 ++
 .../ignite/spi/systemview/view/PluginView.java     | 67 ++++++++++++++++++++++
 .../metric/SystemViewClusterActivationTest.java    |  4 +-
 .../ignite/internal/metric/SystemViewSelfTest.java | 50 ++++++++++++++++
 .../cache/metric/SqlViewExporterSpiTest.java       |  3 +-
 .../processors/query/SqlSystemViewsSelfTest.java   | 50 ++++++++++++++++
 11 files changed, 214 insertions(+), 7 deletions(-)

diff --git 
a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
index e416d417bda..3f989f2e6ae 100755
--- 
a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
+++ 
b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
@@ -368,7 +368,8 @@ public class JdbcMetadataSelfTest extends 
GridCommonAbstractTest {
             "STATISTICS_PARTITION_DATA",
             "STATISTICS_LOCAL_DATA",
             "STATISTICS_GLOBAL_DATA",
-            "SQL_PLANS_HISTORY"
+            "SQL_PLANS_HISTORY",
+            "IGNITE_PLUGINS"
         ));
 
         Set<String> actViews = new TreeSet<>();
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
index 8fdb7f651e2..b1bd8246ff9 100644
--- 
a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
+++ 
b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
@@ -465,7 +465,8 @@ public class JdbcThinMetadataSelfTest extends 
JdbcThinAbstractSelfTest {
                 "SYS.STATISTICS_PARTITION_DATA",
                 "SYS.STATISTICS_CONFIGURATION",
                 "SYS.PAGES_TIMESTAMP_HISTOGRAM",
-                "SYS.SQL_PLANS_HISTORY"
+                "SYS.SQL_PLANS_HISTORY",
+                "SYS.IGNITE_PLUGINS"
             ))
         );
     }
@@ -1173,7 +1174,11 @@ public class JdbcThinMetadataSelfTest extends 
JdbcThinAbstractSelfTest {
                 "SYS.SQL_PLANS_HISTORY.LOCAL.null",
                 "SYS.SQL_PLANS_HISTORY.PLAN.null",
                 "SYS.SQL_PLANS_HISTORY.SCHEMA_NAME.null",
-                "SYS.SQL_PLANS_HISTORY.SQL.null"
+                "SYS.SQL_PLANS_HISTORY.SQL.null",
+                "SYS.IGNITE_PLUGINS.NAME.null",
+                "SYS.IGNITE_PLUGINS.INFO.null",
+                "SYS.IGNITE_PLUGINS.VERSION.null",
+                "SYS.IGNITE_PLUGINS.CLASS_NAME.null"
                 ));
 
             Assert.assertEquals(expectedCols, actualSysCols);
diff --git 
a/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java
 
b/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java
index ca9e839690c..288484d8a14 100644
--- 
a/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java
+++ 
b/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java
@@ -501,7 +501,8 @@ public class SystemViewCommandTest extends 
GridCommandHandlerClusterByClassAbstr
             "DS_SEMAPHORES",
             "DS_QUEUES",
             "PAGES_TIMESTAMP_HISTOGRAM",
-            "SQL_PLANS_HISTORY"
+            "SQL_PLANS_HISTORY",
+            "IGNITE_PLUGINS"
         ));
 
         Set<String> viewNames = new TreeSet<>();
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java 
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 303b0355960..8e92f8118fc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -1253,6 +1253,8 @@ public class IgniteKernal implements IgniteEx, 
Externalizable {
             for (PluginProvider<?> provider : ctx.plugins().allProviders())
                 provider.onIgniteStart();
 
+            ctx.plugins().registerSystemView();
+
             if (recon)
                 reconnectState.waitFirstReconnect();
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/IgnitePluginProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/IgnitePluginProcessor.java
index 59bcabd2bfa..804f5bf743a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/IgnitePluginProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/IgnitePluginProcessor.java
@@ -33,6 +33,8 @@ import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.GridPluginContext;
 import org.apache.ignite.internal.processors.GridProcessorAdapter;
+import org.apache.ignite.internal.processors.metric.impl.MetricUtils;
+import org.apache.ignite.internal.systemview.PluginViewWalker;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.plugin.Extension;
@@ -42,6 +44,7 @@ import org.apache.ignite.plugin.PluginProvider;
 import org.apache.ignite.spi.discovery.DiscoveryDataBag;
 import org.apache.ignite.spi.discovery.DiscoveryDataBag.GridDiscoveryData;
 import 
org.apache.ignite.spi.discovery.DiscoveryDataBag.JoiningNodeDiscoveryData;
+import org.apache.ignite.spi.systemview.view.PluginView;
 import org.jetbrains.annotations.Nullable;
 
 import static 
org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType.PLUGIN;
@@ -50,6 +53,12 @@ import static 
org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType
  *
  */
 public class IgnitePluginProcessor extends GridProcessorAdapter {
+    /** */
+    public static final String PLUGINS_SYS_VIEW = 
MetricUtils.metricName("ignite", "plugins");
+
+    /** */
+    private static final String PLUGINS_SYS_VIEW_DESC = "Information about 
configured and loaded Ignite plugins.";
+
     /** */
     private final Map<String, PluginProvider> plugins = new LinkedHashMap<>();
 
@@ -244,7 +253,7 @@ public class IgnitePluginProcessor extends 
GridProcessorAdapter {
         }
         else {
             for (PluginProvider plugin : plugins.values()) {
-                U.quietAndInfo(log, "  ^-- " + plugin.name() + " " + 
plugin.version());
+                U.quietAndInfo(log, "  ^-- " + plugin.name() + " " + 
plugin.version() + " " + plugin.info());
                 U.quietAndInfo(log, "  ^-- " + plugin.copyright());
                 U.quietAndInfo(log, "");
             }
@@ -292,4 +301,18 @@ public class IgnitePluginProcessor extends 
GridProcessorAdapter {
             return extensions;
         }
     }
+
+    /** */
+    public void registerSystemView() {
+        if (ctx.systemView().view(PLUGINS_SYS_VIEW) != null)
+            return;
+
+        ctx.systemView().registerView(
+            PLUGINS_SYS_VIEW,
+            PLUGINS_SYS_VIEW_DESC,
+            new PluginViewWalker(),
+            plugins::values,
+            PluginView::new
+        );
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java 
b/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java
index 46ca4196fc7..852a1a6d22e 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java
@@ -55,6 +55,11 @@ public interface PluginProvider<C extends 
PluginConfiguration> {
      */
     public String copyright();
 
+    /** @return Plugin info, {@code ""} if missing. */
+    public default String info() {
+        return "";
+    }
+
     /**
      * @param <T> Type of the plugin.
      * @return Plugin API.
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/systemview/view/PluginView.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/systemview/view/PluginView.java
new file mode 100644
index 00000000000..98afea43b00
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/systemview/view/PluginView.java
@@ -0,0 +1,67 @@
+/*
+ * 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.ignite.spi.systemview.view;
+
+import org.apache.ignite.internal.systemview.Filtrable;
+import org.apache.ignite.internal.systemview.Order;
+import org.apache.ignite.internal.systemview.SystemViewDescriptor;
+import org.apache.ignite.plugin.PluginProvider;
+
+/** Ignite plugin representation for a {@link SystemView}. */
+@SystemViewDescriptor
+public class PluginView {
+    /** */
+    private final PluginProvider<?> pluginProvider;
+
+    /**
+     * Constructor.
+     *
+     * @param pluginProvider Plugin provider.
+     */
+    public PluginView(PluginProvider<?> pluginProvider) {
+        this.pluginProvider = pluginProvider;
+    }
+
+    /** @return Plugin name. */
+    @Order
+    @Filtrable
+    public String name() {
+        return pluginProvider.name();
+    }
+
+    /** @return Plugin version. */
+    @Order(1)
+    @Filtrable
+    public String version() {
+        return pluginProvider.version();
+    }
+
+    /** @return Plugin class name. */
+    @Order(2)
+    @Filtrable
+    public String className() {
+        return pluginProvider.plugin().getClass().getName();
+    }
+
+    /** @return Plugin info. */
+    @Order(3)
+    @Filtrable
+    public String info() {
+        return pluginProvider.info();
+    }
+}
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewClusterActivationTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewClusterActivationTest.java
index 30a559d9301..32319c534d1 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewClusterActivationTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewClusterActivationTest.java
@@ -55,6 +55,7 @@ import static 
org.apache.ignite.internal.processors.datastructures.DataStructure
 import static 
org.apache.ignite.internal.processors.job.GridJobProcessor.JOBS_VIEW;
 import static 
org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageImpl.DISTRIBUTED_METASTORE_VIEW;
 import static 
org.apache.ignite.internal.processors.odbc.ClientListenerProcessor.CLI_CONN_VIEW;
+import static 
org.apache.ignite.internal.processors.plugin.IgnitePluginProcessor.PLUGINS_SYS_VIEW;
 import static 
org.apache.ignite.internal.processors.pool.PoolProcessor.STREAM_POOL_QUEUE_VIEW;
 import static 
org.apache.ignite.internal.processors.pool.PoolProcessor.SYS_POOL_QUEUE_VIEW;
 import static 
org.apache.ignite.internal.processors.service.IgniteServiceProcessor.SVCS_VIEW;
@@ -96,7 +97,8 @@ public class SystemViewClusterActivationTest extends 
GridCommonAbstractTest {
             STAMPED_VIEW,
             REFERENCES_VIEW,
             LONGS_VIEW,
-            SEQUENCES_VIEW
+            SEQUENCES_VIEW,
+            PLUGINS_SYS_VIEW
         ));
 
         IgniteEx ignite = 
startGrid(getConfiguration().setClusterStateOnStart(ClusterState.INACTIVE));
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSelfTest.java
index b86ad16bf38..c8d08036d4a 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSelfTest.java
@@ -36,6 +36,7 @@ import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 import javax.cache.Cache;
 import javax.cache.expiry.CreatedExpiryPolicy;
 import javax.cache.expiry.Duration;
@@ -107,6 +108,8 @@ import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.lang.IgniteRunnable;
 import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.plugin.AbstractTestPluginProvider;
+import org.apache.ignite.plugin.IgnitePlugin;
 import org.apache.ignite.services.ServiceConfiguration;
 import org.apache.ignite.spi.systemview.view.BaselineNodeAttributeView;
 import org.apache.ignite.spi.systemview.view.BaselineNodeView;
@@ -128,6 +131,7 @@ import 
org.apache.ignite.spi.systemview.view.NodeAttributeView;
 import org.apache.ignite.spi.systemview.view.NodeMetricsView;
 import org.apache.ignite.spi.systemview.view.PagesListView;
 import org.apache.ignite.spi.systemview.view.PagesTimestampHistogramView;
+import org.apache.ignite.spi.systemview.view.PluginView;
 import org.apache.ignite.spi.systemview.view.ScanQueryView;
 import org.apache.ignite.spi.systemview.view.ServiceView;
 import org.apache.ignite.spi.systemview.view.SnapshotView;
@@ -192,6 +196,7 @@ import static 
org.apache.ignite.internal.processors.metastorage.persistence.Dist
 import static 
org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
 import static 
org.apache.ignite.internal.processors.odbc.ClientListenerProcessor.CLI_CONN_ATTR_VIEW;
 import static 
org.apache.ignite.internal.processors.odbc.ClientListenerProcessor.CLI_CONN_VIEW;
+import static 
org.apache.ignite.internal.processors.plugin.IgnitePluginProcessor.PLUGINS_SYS_VIEW;
 import static 
org.apache.ignite.internal.processors.pool.PoolProcessor.STREAM_POOL_QUEUE_VIEW;
 import static 
org.apache.ignite.internal.processors.pool.PoolProcessor.SYS_POOL_QUEUE_VIEW;
 import static 
org.apache.ignite.internal.processors.service.IgniteServiceProcessor.SVCS_VIEW;
@@ -2615,6 +2620,24 @@ public class SystemViewSelfTest extends 
GridCommonAbstractTest {
         }
     }
 
+    /** */
+    @Test
+    public void testPluginView() throws Exception {
+        try (IgniteEx n = startGrid(getConfiguration().setPluginProviders(new 
TestPluginProvider()))) {
+            SystemView<PluginView> view = 
n.context().systemView().view(PLUGINS_SYS_VIEW);
+
+            PluginView testPluginView = 
StreamSupport.stream(view.spliterator(), false)
+                .filter(v -> "FOR_SYS_VIEW_PLUGIN_NAME".equals(v.name()))
+                .findFirst()
+                .orElseThrow(() -> new AssertionError("Plugin not found"));
+
+            assertEquals("FOR_SYS_VIEW_PLUGIN_NAME", testPluginView.name());
+            assertEquals("FOR_SYS_VIEW_PLUGIN_INFO", testPluginView.info());
+            assertEquals("42", testPluginView.version());
+            assertEquals(TestPluginProvider.TestPlugin.class.getName(), 
testPluginView.className());
+        }
+    }
+
     /** Test node filter. */
     public static class TestNodeFilter implements IgnitePredicate<ClusterNode> 
{
         /** {@inheritDoc} */
@@ -2701,4 +2724,31 @@ public class SystemViewSelfTest extends 
GridCommonAbstractTest {
     public static class InternalTask extends UserTask {
         // No-op.
     }
+
+    /** */
+    private static class TestPluginProvider extends AbstractTestPluginProvider 
{
+        /** {@inheritDoc} */
+        @Override public String name() {
+            return "FOR_SYS_VIEW_PLUGIN_NAME";
+        }
+
+        /** {@inheritDoc} */
+        @Override public String version() {
+            return "42";
+        }
+
+        /** {@inheritDoc} */
+        @Override public String info() {
+            return "FOR_SYS_VIEW_PLUGIN_INFO";
+        }
+
+        /** {@inheritDoc} */
+        @Override public <T extends IgnitePlugin> T plugin() {
+            return (T)new TestPlugin();
+        }
+
+        /** */
+        private static class TestPlugin implements IgnitePlugin {
+        }
+    }
 }
diff --git 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/metric/SqlViewExporterSpiTest.java
 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/metric/SqlViewExporterSpiTest.java
index a6a2ef70686..e2b2317c44d 100644
--- 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/metric/SqlViewExporterSpiTest.java
+++ 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/metric/SqlViewExporterSpiTest.java
@@ -464,7 +464,8 @@ public class SqlViewExporterSpiTest extends 
AbstractExporterSpiTest {
             "DS_SEMAPHORES",
             "DS_QUEUES",
             "PAGES_TIMESTAMP_HISTOGRAM",
-            "SQL_PLANS_HISTORY"
+            "SQL_PLANS_HISTORY",
+            "IGNITE_PLUGINS"
         ));
 
         Set<String> actViews = new TreeSet<>();
diff --git 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java
 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java
index 4c9d8362822..5c74bdf53aa 100644
--- 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java
+++ 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java
@@ -85,6 +85,8 @@ import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteFuture;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.lang.IgniteRunnable;
+import org.apache.ignite.plugin.AbstractTestPluginProvider;
+import org.apache.ignite.plugin.IgnitePlugin;
 import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode;
 import org.apache.ignite.spi.systemview.view.SqlQueryView;
 import org.apache.ignite.spi.systemview.view.SystemView;
@@ -1873,6 +1875,27 @@ public class SqlSystemViewsSelfTest extends 
AbstractIndexingCommonTest {
         }
     }
 
+    /** */
+    @Test
+    public void testPluginView() throws Exception {
+        try (IgniteEx n = startGrid(getConfiguration().setPluginProviders(new 
TestPluginProvider()))) {
+            String sql = String.format(
+                "SELECT name, info, version, class_name  FROM 
%s.IGNITE_PLUGINS WHERE NAME = ?",
+                systemSchemaName()
+            );
+
+            assertEquals(
+                List.of(
+                    "FOR_SYS_VIEW_PLUGIN_NAME",
+                    "FOR_SYS_VIEW_PLUGIN_INFO",
+                    "42",
+                    TestPluginProvider.TestPlugin.class.getName()
+                ),
+                execSql(n, sql, "FOR_SYS_VIEW_PLUGIN_NAME").get(0)
+            );
+        }
+    }
+
     /**
      * Mock for {@link ClusterMetricsImpl} that always returns big (more than 
24h) duration for all duration metrics.
      */
@@ -2089,4 +2112,31 @@ public class SqlSystemViewsSelfTest extends 
AbstractIndexingCommonTest {
             return "CUSTOM_NODE_FILTER";
         }
     }
+
+    /** */
+    private static class TestPluginProvider extends AbstractTestPluginProvider 
{
+        /** {@inheritDoc} */
+        @Override public String name() {
+            return "FOR_SYS_VIEW_PLUGIN_NAME";
+        }
+
+        /** {@inheritDoc} */
+        @Override public String version() {
+            return "42";
+        }
+
+        /** {@inheritDoc} */
+        @Override public String info() {
+            return "FOR_SYS_VIEW_PLUGIN_INFO";
+        }
+
+        /** {@inheritDoc} */
+        @Override public <T extends IgnitePlugin> T plugin() {
+            return (T)new TestPlugin();
+        }
+
+        /** */
+        private static class TestPlugin implements IgnitePlugin {
+        }
+    }
 }

Reply via email to