Skip to content

Commit

Permalink
feat(ui): don't show deprecated tasks in the plugins list
Browse files Browse the repository at this point in the history
closes #4526
  • Loading branch information
brian-mulier-p committed Jan 29, 2025
1 parent 2d98f90 commit ab796df
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 36 deletions.
30 changes: 18 additions & 12 deletions core/src/main/java/io/kestra/core/docs/Plugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ public class Plugin {
private String subGroup;

public static Plugin of(RegisteredPlugin registeredPlugin, @Nullable String subgroup) {
return Plugin.of(registeredPlugin, subgroup, true);
}

public static Plugin of(RegisteredPlugin registeredPlugin, @Nullable String subgroup, boolean includeDeprecated) {
Plugin plugin = new Plugin();
plugin.name = registeredPlugin.name();
PluginSubGroup subGroupInfos = null;
Expand Down Expand Up @@ -80,17 +84,17 @@ public static Plugin of(RegisteredPlugin registeredPlugin, @Nullable String subg

plugin.subGroup = subgroup;

plugin.tasks = filterAndGetClassName(registeredPlugin.getTasks()).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.triggers = filterAndGetClassName(registeredPlugin.getTriggers()).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.conditions = filterAndGetClassName(registeredPlugin.getConditions()).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.storages = filterAndGetClassName(registeredPlugin.getStorages()).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.secrets = filterAndGetClassName(registeredPlugin.getSecrets()).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.taskRunners = filterAndGetClassName(registeredPlugin.getTaskRunners()).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.apps = filterAndGetClassName(registeredPlugin.getApps()).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.appBlocks = filterAndGetClassName(registeredPlugin.getAppBlocks()).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.charts = filterAndGetClassName(registeredPlugin.getCharts()).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.dataFilters = filterAndGetClassName(registeredPlugin.getDataFilters()).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.logExporters = filterAndGetClassName(registeredPlugin.getLogExporters()).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.tasks = filterAndGetClassName(registeredPlugin.getTasks(), includeDeprecated).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.triggers = filterAndGetClassName(registeredPlugin.getTriggers(), includeDeprecated).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.conditions = filterAndGetClassName(registeredPlugin.getConditions(), includeDeprecated).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.storages = filterAndGetClassName(registeredPlugin.getStorages(), includeDeprecated).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.secrets = filterAndGetClassName(registeredPlugin.getSecrets(), includeDeprecated).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.taskRunners = filterAndGetClassName(registeredPlugin.getTaskRunners(), includeDeprecated).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.apps = filterAndGetClassName(registeredPlugin.getApps(), includeDeprecated).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.appBlocks = filterAndGetClassName(registeredPlugin.getAppBlocks(), includeDeprecated).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.charts = filterAndGetClassName(registeredPlugin.getCharts(), includeDeprecated).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.dataFilters = filterAndGetClassName(registeredPlugin.getDataFilters(), includeDeprecated).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();
plugin.logExporters = filterAndGetClassName(registeredPlugin.getLogExporters(), includeDeprecated).stream().filter(c -> subgroup == null || c.startsWith(subgroup)).toList();

return plugin;
}
Expand All @@ -100,12 +104,14 @@ public static Plugin of(RegisteredPlugin registeredPlugin, @Nullable String subg
* Those classes are only filtered from the documentation to ensure backward compatibility.
*
* @param list The list of classes?
* @param includeDeprecated whether to include deprecated plugins or not
* @return a filtered streams.
*/
private static List<String> filterAndGetClassName(final List<? extends Class<?>> list) {
private static List<String> filterAndGetClassName(final List<? extends Class<?>> list, boolean includeDeprecated) {
return list
.stream()
.filter(not(io.kestra.core.models.Plugin::isInternal))
.filter(p -> includeDeprecated || !io.kestra.core.models.Plugin.isDeprecated(p))
.map(Class::getName)
.filter(c -> !c.startsWith("org.kestra."))
.toList();
Expand Down
14 changes: 12 additions & 2 deletions model/src/main/java/io/kestra/core/models/Plugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
import jakarta.validation.constraints.NotNull;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
Expand Down Expand Up @@ -55,6 +53,18 @@ static boolean isInternal(final Class<?> plugin) {
.orElse(false);
}

/**
* Static helper method to check whether a given plugin is deprecated.
*
* @param plugin The plugin type.
* @return {@code true} if the plugin is deprecated.
*/
static boolean isDeprecated(final Class<?> plugin) {
Objects.requireNonNull(plugin, "Cannot check if a plugin is deprecated from null");
Deprecated annotation = plugin.getAnnotation(Deprecated.class);
return annotation != null;
}

/**
* Static helper method to get the id of a plugin.
*
Expand Down
4 changes: 3 additions & 1 deletion ui/src/components/plugins/Plugin.vue
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,9 @@
},
methods: {
loadToc() {
this.$store.dispatch("plugin/listWithSubgroup")
this.$store.dispatch("plugin/listWithSubgroup", {
includeDeprecated: false
})
},
loadPlugin() {
Expand Down
2 changes: 1 addition & 1 deletion ui/src/components/plugins/PluginHome.vue
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<KestraFilter :placeholder="$t('pluginPage.search', {count: countPlugin})" :search-callback="(input)=> searchInput = input" />
</el-row>
<section class="px-3 plugins-container">
<el-tooltip v-for="(plugin, index) in pluginsList" :show-after="1000" :key="index" effect="light">
<el-tooltip v-for="(plugin, index) in pluginsList" :show-after="1000" :key="plugin.name + '-' + index" effect="light">
<template #content>
<div class="tasks-tooltips">
<p v-if="plugin?.tasks.filter(t => t.toLowerCase().includes(searchInput)).length > 0" class="mb-0">
Expand Down
6 changes: 4 additions & 2 deletions ui/src/stores/plugins.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,10 @@ export default {
return response.data;
})
},
listWithSubgroup({commit}) {
return this.$http.get(`${apiUrl(this)}/plugins/groups/subgroups`, {}).then(response => {
listWithSubgroup({commit}, options) {
return this.$http.get(`${apiUrl(this)}/plugins/groups/subgroups`, {
params: options
}).then(response => {
commit("setPlugins", response.data)
commit("setPluginSingleList", response.data.map(plugin => plugin.tasks.concat(plugin.triggers, plugin.conditions, plugin.controllers, plugin.storages, plugin.taskRunners, plugin.charts, plugin.dataFilters, plugin.aliases, plugin.logExporters)).flat())
return response.data;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,6 @@
package io.kestra.webserver.controllers.api;

import io.kestra.core.docs.ClassInputDocumentation;
import io.kestra.core.docs.ClassPluginDocumentation;
import io.kestra.core.docs.DocumentationGenerator;
import io.kestra.core.docs.DocumentationWithSchema;
import io.kestra.core.docs.InputType;
import io.kestra.core.docs.JsonSchemaGenerator;
import io.kestra.core.docs.Plugin;
import io.kestra.core.docs.PluginIcon;
import io.kestra.core.docs.Schema;
import io.kestra.core.docs.SchemaType;
import io.kestra.core.docs.*;
import io.kestra.core.models.dashboards.Dashboard;
import io.kestra.core.models.flows.Flow;
import io.kestra.core.models.flows.Input;
Expand Down Expand Up @@ -39,11 +30,7 @@
import jakarta.inject.Inject;

import java.io.IOException;
import java.util.AbstractMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

Expand Down Expand Up @@ -252,16 +239,18 @@ public HttpResponse<DocumentationWithSchema> pluginDocumentation(
@Get("/groups/subgroups")
@ExecuteOn(TaskExecutors.IO)
@Operation(tags = {"Plugins"}, summary = "Get plugins group by subgroups")
public List<Plugin> subgroups() {
public List<Plugin> subgroups(
@Parameter(description = "Whether to include deprecated plugins") @QueryValue(value = "includeDeprecated", defaultValue = "true") boolean includeDeprecated
) {
return Stream.concat(
pluginRegistry.plugins()
.stream()
.map(p -> Plugin.of(p, null)),
.map(p -> Plugin.of(p, null, includeDeprecated)),
pluginRegistry.plugins()
.stream()
.flatMap(p -> p.subGroupNames()
.stream()
.map(subgroup -> Plugin.of(p, subgroup))
.map(subgroup -> Plugin.of(p, subgroup, includeDeprecated))
)
)
.distinct()
Expand Down

0 comments on commit ab796df

Please sign in to comment.