use of io.cdap.cdap.api.macro.MacroParserOptions in project cdap by caskdata.
the class PipelinePhase method registerPlugins.
/**
* Registers all the plugin to the given pluginConfigurer by calling {@link PluginConfigurer#usePluginClass(String,
* String, String, PluginProperties, PluginSelector)}
*
* @param pluginConfigurer the {@link PluginConfigurer} to which the plugins in this {@link PipelinePhase} needs to be
* registered
* @param runtimeConfigurer the runtime configurer to provide runtime arguments to resolve macro better, null
* if this is the initial deploy
* @param namespace namespace the app is deployed
*/
public void registerPlugins(PluginConfigurer pluginConfigurer, @Nullable RuntimeConfigurer runtimeConfigurer, String namespace) {
MacroParserOptions options = MacroParserOptions.builder().skipInvalidMacros().setEscaping(false).setFunctionWhitelist(ConnectionMacroEvaluator.FUNCTION_NAME).build();
MacroEvaluator runtimeEvaluator = null;
if (runtimeConfigurer != null) {
Map<String, MacroEvaluator> evaluators = Collections.singletonMap(ConnectionMacroEvaluator.FUNCTION_NAME, new ConnectionMacroEvaluator(namespace, runtimeConfigurer));
runtimeEvaluator = new DefaultMacroEvaluator(new BasicArguments(runtimeConfigurer.getRuntimeArguments()), evaluators, Collections.singleton(ConnectionMacroEvaluator.FUNCTION_NAME));
}
for (StageSpec stageSpec : stagesByName.values()) {
// we don't need to register connectors only source, sink and transform plugins
if (stageSpec.getPluginType().equals(Constants.Connector.PLUGIN_TYPE)) {
continue;
}
PluginSpec pluginSpec = stageSpec.getPlugin();
ArtifactVersion version = pluginSpec.getArtifact().getVersion();
ArtifactSelector artifactSelector = new ArtifactSelector(pluginSpec.getArtifact().getScope(), pluginSpec.getArtifact().getName(), new ArtifactVersionRange(version, true, version, true));
Map<String, String> prop = pluginSpec.getProperties();
pluginConfigurer.usePluginClass(pluginSpec.getType(), pluginSpec.getName(), stageSpec.getName(), PluginProperties.builder().addAll(runtimeConfigurer == null ? prop : pluginConfigurer.evaluateMacros(prop, runtimeEvaluator, options)).build(), artifactSelector);
}
}
use of io.cdap.cdap.api.macro.MacroParserOptions in project cdap by caskdata.
the class PluginInstantiator method substituteMacros.
public PluginProperties substituteMacros(Plugin plugin, @Nullable MacroEvaluator macroEvaluator, @Nullable MacroParserOptions options) {
Map<String, String> properties = new HashMap<>();
Map<String, PluginPropertyField> pluginPropertyFieldMap = plugin.getPluginClass().getProperties();
// create macro evaluator and parser based on if it is config or runtime
boolean configTime = (macroEvaluator == null);
TrackingMacroEvaluator trackingMacroEvaluator = new TrackingMacroEvaluator();
for (Map.Entry<String, String> property : plugin.getProperties().getProperties().entrySet()) {
PluginPropertyField field = pluginPropertyFieldMap.get(property.getKey());
String propertyValue = property.getValue();
if (field != null && field.isMacroSupported()) {
// TODO: cleanup after endpoint to get plugin details is merged (#6089)
if (configTime) {
// parse for syntax check and check if trackingMacroEvaluator finds macro syntax present
MacroParser macroParser = new MacroParser(trackingMacroEvaluator, MacroParserOptions.builder().setEscaping(field.isMacroEscapingEnabled()).build());
macroParser.parse(propertyValue);
propertyValue = getOriginalOrDefaultValue(propertyValue, property.getKey(), field.getType(), trackingMacroEvaluator);
} else {
MacroParserOptions parserOptions = options == null ? MacroParserOptions.builder().setEscaping(field.isMacroEscapingEnabled()).build() : options;
MacroParser macroParser = new MacroParser(macroEvaluator, parserOptions);
propertyValue = macroParser.parse(propertyValue);
}
}
properties.put(property.getKey(), propertyValue);
}
return PluginProperties.builder().addAll(properties).build();
}
use of io.cdap.cdap.api.macro.MacroParserOptions in project cdap by caskdata.
the class ValidationHandler method validateLocally.
private void validateLocally(HttpServiceRequest request, HttpServiceResponder responder, String namespace) throws IOException {
StageValidationRequest validationRequest;
try {
validationRequest = GSON.fromJson(StandardCharsets.UTF_8.decode(request.getContent()).toString(), StageValidationRequest.class);
validationRequest.validate();
} catch (JsonSyntaxException e) {
responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, "Unable to decode request body: " + e.getMessage());
return;
} catch (IllegalArgumentException e) {
responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, "Invalid stage config: " + e.getMessage());
return;
}
Map<String, String> arguments = Collections.emptyMap();
// this option.
if (validationRequest.getResolveMacrosFromPreferences()) {
try {
arguments = getContext().getPreferencesForNamespace(namespace, true);
} catch (IllegalArgumentException iae) {
// If this method returns IllegalArgumentException, it means the namespace doesn't exist.
// If this is the case, we return a 404 error.
responder.sendError(HttpURLConnection.HTTP_NOT_FOUND, String.format("Namespace '%s' does not exist", namespace));
return;
}
}
Map<String, MacroEvaluator> evaluators = ImmutableMap.of(SecureStoreMacroEvaluator.FUNCTION_NAME, new SecureStoreMacroEvaluator(namespace, getContext()), OAuthMacroEvaluator.FUNCTION_NAME, new OAuthMacroEvaluator(getContext()), ConnectionMacroEvaluator.FUNCTION_NAME, new ConnectionMacroEvaluator(namespace, getContext()));
MacroEvaluator macroEvaluator = new DefaultMacroEvaluator(new BasicArguments(arguments), evaluators, DefaultMacroEvaluator.MAP_FUNCTIONS);
MacroParserOptions macroParserOptions = MacroParserOptions.builder().skipInvalidMacros().setEscaping(false).setFunctionWhitelist(evaluators.keySet()).build();
Function<Map<String, String>, Map<String, String>> macroFn = macroProperties -> getContext().evaluateMacros(namespace, macroProperties, macroEvaluator, macroParserOptions);
String validationResponse = GSON.toJson(ValidationUtils.validate(namespace, validationRequest, getContext().createServicePluginConfigurer(namespace), macroFn, getContext()));
responder.sendString(validationResponse);
}
use of io.cdap.cdap.api.macro.MacroParserOptions in project cdap by caskdata.
the class RemoteValidationTask method run.
@Override
public void run(RunnableTaskContext context) throws Exception {
SystemAppTaskContext systemAppContext = context.getRunnableTaskSystemAppContext();
RemoteValidationRequest remoteValidationRequest = GSON.fromJson(context.getParam(), RemoteValidationRequest.class);
String namespace = remoteValidationRequest.getNamespace();
String originalRequest = remoteValidationRequest.getRequest();
StageValidationRequest validationRequest;
try {
validationRequest = GSON.fromJson(originalRequest, StageValidationRequest.class);
validationRequest.validate();
} catch (JsonSyntaxException e) {
throw new IllegalArgumentException(String.format("Unable to decode request body %s", originalRequest), e);
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Invalid stage config", e);
}
Map<String, String> arguments = Collections.emptyMap();
// this option.
if (validationRequest.getResolveMacrosFromPreferences()) {
try {
arguments = systemAppContext.getPreferencesForNamespace(namespace, true);
} catch (IllegalArgumentException iae) {
// If this is the case, we return a 404 error.
throw new IllegalArgumentException(String.format(NAMESPACE_DOES_NOT_EXIST, namespace), iae);
}
}
Map<String, MacroEvaluator> evaluators = ImmutableMap.of(SecureStoreMacroEvaluator.FUNCTION_NAME, new SecureStoreMacroEvaluator(namespace, systemAppContext), OAuthMacroEvaluator.FUNCTION_NAME, new OAuthMacroEvaluator(systemAppContext), ConnectionMacroEvaluator.FUNCTION_NAME, new ConnectionMacroEvaluator(namespace, systemAppContext));
MacroEvaluator macroEvaluator = new DefaultMacroEvaluator(new BasicArguments(arguments), evaluators, DefaultMacroEvaluator.MAP_FUNCTIONS);
MacroParserOptions macroParserOptions = MacroParserOptions.builder().skipInvalidMacros().setEscaping(false).setFunctionWhitelist(evaluators.keySet()).build();
Function<Map<String, String>, Map<String, String>> macroFn = macroProperties -> systemAppContext.evaluateMacros(namespace, macroProperties, macroEvaluator, macroParserOptions);
PluginConfigurer pluginConfigurer = systemAppContext.createPluginConfigurer(namespace);
StageValidationResponse validationResponse = ValidationUtils.validate(namespace, validationRequest, pluginConfigurer, macroFn, systemAppContext);
// If the validation success and if it only involves system artifacts, then we don't need to restart task runner
if (validationResponse.getFailures().isEmpty()) {
StageSpec spec = validationResponse.getSpec();
if (spec != null) {
context.setTerminateOnComplete(!ArtifactScope.SYSTEM.equals(spec.getPlugin().getArtifact().getScope()));
}
}
context.writeResult(GSON.toJson(validationResponse).getBytes());
}
use of io.cdap.cdap.api.macro.MacroParserOptions in project cdap by caskdata.
the class ConnectionHandler method getConnector.
private Connector getConnector(ServicePluginConfigurer configurer, PluginInfo pluginInfo, String namespace, TrackedPluginSelector pluginSelector) throws IOException {
Map<String, String> arguments = getContext().getPreferencesForNamespace(namespace, true);
Map<String, MacroEvaluator> evaluators = ImmutableMap.of(SecureStoreMacroEvaluator.FUNCTION_NAME, new SecureStoreMacroEvaluator(namespace, getContext()), OAuthMacroEvaluator.FUNCTION_NAME, new OAuthMacroEvaluator(getContext()));
MacroEvaluator macroEvaluator = new DefaultMacroEvaluator(new BasicArguments(arguments), evaluators, Collections.singleton(OAuthMacroEvaluator.FUNCTION_NAME));
MacroParserOptions options = MacroParserOptions.builder().setEscaping(false).setFunctionWhitelist(evaluators.keySet()).build();
return ConnectionUtils.getConnector(configurer, pluginInfo, pluginSelector, macroEvaluator, options);
}
Aggregations