Use Cases:
User has configured a pipeline with multiple plugins , User wants to see the plugins used in the app along with programs, streams and datasets used by the pipeline when getting application detail.
User has configured DBSource plugin with macros for the fields "connectionString", "username" and uses macro function secure for the "password" field. UI wants to get all the configured macro properties for that plugin, in this case "connectionString" and "username", so its easy for user to provide the values for those macros as runtime arguments before starting the run.
User Story:
1) User wants to see list of plugins in the app when calling application detail REST endpoint.
2) For a plugin, user wants to get the details on plugin, including plugin properties and list of macros used in properties.
3) UI wants to get properties macro used by a plugin.
Design:
class PluginDetail { String pluginName; String pluginType; } Example : PluginDetail {pluginName : "source1", pluginType: "DBSource"}
PluginDetail for plugins will be added to co.cask.cdap.proto.ApplicationDetail
public class ApplicationDetail { // existing private final String name; private final String version; private final String description; private final String configuration; private final List<StreamDetail> streams; private final List<DatasetDetail> datasets; private final List<ProgramRecord> programs; private final ArtifactSummary artifact; // new field private final List<PluginDetail> plugins; }
REST Endpoint :
GET: /v3/namespaces/{namespace-id}/apps/{app-id}/plugins/ this will return list of Plugin object's used by the app.
// No changes to existing Plugin class in CDAP-API. public final class Plugin { private final ArtifactId artifactId; private final PluginClass pluginClass; private final PluginProperties properties; Plugin(ArtifactId artifactId, PluginClass pluginClass, PluginProperties) { ... } ... }
/** * Plugin instance properties. */ @Beta public class PluginProperties implements Serializable { private static final long serialVersionUID = -7396484717511717753L; // Currently only support String->String map. private final Map<String, String> properties; // new addition in PluginProperties to add macro private final Set<String> macros; public static Builder builder() { return new Builder(); } private PluginProperties(Map<String, String> properties) { this.properties = properties; this.macros = new HashSet<String>(); } /** * return the set of macros used by the plugin */ public Set<String> getMacros() { return macros; } /** * internal method used by platform to add macros used in properties. its not advisable for users to use this. */ public void addMacro(String macro) { macros.add(macro); } // no changes to existing methods or Builder public Map<String, String> getProperties() { return properties; } /** * A builder to create {@link PluginProperties} instance. */ public static final class Builder { private final Map<String, String> properties; private Builder() { this.properties = new HashMap<>(); } /** * Adds multiple properties. * * @param properties map of properties to add. * @return this builder */ public Builder addAll(Map<String, String> properties) { this.properties.putAll(properties); return this; } /** * Adds a property * @param key the name of the property * @param value the value of the property * @return this builder */ public Builder add(String key, String value) { this.properties.put(key, value); return this; } /** * Creates a new instance of {@link PluginProperties} with the properties added to this builder prior to this call. */ public PluginProperties build() { return new PluginProperties(Collections.unmodifiableMap(new HashMap<>(properties))); } } }