diff --git a/legend-engine-xts-bigqueryFunction/legend-engine-xt-bigqueryFunction-api/src/main/java/org/finos/legend/engine/language/bigqueryFunction/api/BigQueryFunctionService.java b/legend-engine-xts-bigqueryFunction/legend-engine-xt-bigqueryFunction-api/src/main/java/org/finos/legend/engine/language/bigqueryFunction/api/BigQueryFunctionService.java index 25a544e0fee..8f77bc43e63 100644 --- a/legend-engine-xts-bigqueryFunction/legend-engine-xt-bigqueryFunction-api/src/main/java/org/finos/legend/engine/language/bigqueryFunction/api/BigQueryFunctionService.java +++ b/legend-engine-xts-bigqueryFunction/legend-engine-xt-bigqueryFunction-api/src/main/java/org/finos/legend/engine/language/bigqueryFunction/api/BigQueryFunctionService.java @@ -19,6 +19,7 @@ import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.factory.Lists; import org.finos.legend.engine.functionActivator.api.output.FunctionActivatorInfo; +import org.finos.legend.engine.functionActivator.validation.FunctionActivatorResult; import org.finos.legend.engine.protocol.bigqueryFunction.deployment.BigQueryFunctionArtifact; import org.finos.legend.engine.protocol.bigqueryFunction.deployment.BigQueryFunctionContent; import org.finos.legend.engine.protocol.bigqueryFunction.deployment.BigQueryFunctionDeploymentConfiguration; @@ -68,7 +69,7 @@ public boolean supports(Root_meta_external_function_activator_FunctionActivator } @Override - public MutableList validate(Identity identity, PureModel pureModel, Root_meta_external_function_activator_bigQueryFunction_BigQueryFunction activator, PureModelContext inputModel, Function> routerExtensions) + public FunctionActivatorResult validate(Identity identity, PureModel pureModel, Root_meta_external_function_activator_bigQueryFunction_BigQueryFunction activator, PureModelContext inputModel, List runtimeConfigurations, Function> routerExtensions) { BigQueryFunctionArtifact artifact = BigQueryFunctionGenerator.generateArtifact(pureModel, activator, inputModel, routerExtensions); return this.validateArtifact(artifact); @@ -78,7 +79,7 @@ public MutableList validate(Identity identity, public BigQueryFunctionDeploymentResult publishToSandbox(Identity identity, PureModel pureModel, Root_meta_external_function_activator_bigQueryFunction_BigQueryFunction activator, PureModelContext inputModel, List runtimeConfigurations, Function> routerExtensions) { BigQueryFunctionArtifact artifact = BigQueryFunctionGenerator.generateArtifact(pureModel, activator, inputModel, routerExtensions); - MutableList validationErrors = this.validateArtifact(artifact); + MutableList validationErrors = this.validateArtifact(artifact).getErrors(); Root_meta_external_function_activator_bigQueryFunction_BigQueryFunctionDeploymentConfiguration deploymentConfiguration = ((Root_meta_external_function_activator_bigQueryFunction_BigQueryFunctionDeploymentConfiguration) activator._activationConfiguration()); return validationErrors.notEmpty() ? @@ -104,11 +105,11 @@ public List selectConfig(List e instanceof BigQueryFunctionDeploymentConfiguration).collect(e -> (BigQueryFunctionDeploymentConfiguration) e); } - private MutableList validateArtifact(BigQueryFunctionArtifact artifact) + private FunctionActivatorResult validateArtifact(BigQueryFunctionArtifact artifact) { int size = ((BigQueryFunctionContent)artifact.content).sqlExpressions.size(); return size == 1 ? - Lists.fixedSize.empty() : - Lists.fixedSize.with(new BigQueryFunctionError("BigQuery Function can't be used with a plan containing '" + size + "' SQL expressions", ((BigQueryFunctionContent)artifact.content).sqlExpressions)); + new FunctionActivatorResult() : + new FunctionActivatorResult(Lists.fixedSize.with(new BigQueryFunctionError("BigQuery Function can't be used with a plan containing '" + size + "' SQL expressions", ((BigQueryFunctionContent)artifact.content).sqlExpressions))); } } diff --git a/legend-engine-xts-bigqueryFunction/legend-engine-xt-bigqueryFunction-api/src/main/java/org/finos/legend/engine/language/bigqueryFunction/deployment/BigQueryFunctionDeploymentManager.java b/legend-engine-xts-bigqueryFunction/legend-engine-xt-bigqueryFunction-api/src/main/java/org/finos/legend/engine/language/bigqueryFunction/deployment/BigQueryFunctionDeploymentManager.java index 6e4e09468ba..29f335524ab 100644 --- a/legend-engine-xts-bigqueryFunction/legend-engine-xt-bigqueryFunction-api/src/main/java/org/finos/legend/engine/language/bigqueryFunction/deployment/BigQueryFunctionDeploymentManager.java +++ b/legend-engine-xts-bigqueryFunction/legend-engine-xt-bigqueryFunction-api/src/main/java/org/finos/legend/engine/language/bigqueryFunction/deployment/BigQueryFunctionDeploymentManager.java @@ -27,7 +27,9 @@ import org.finos.legend.engine.protocol.bigqueryFunction.deployment.BigQueryFunctionDeploymentResult; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorArtifact; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentConfiguration; +import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentDetails; import org.finos.legend.engine.shared.core.identity.Identity; +import org.finos.legend.pure.generated.Root_meta_external_function_activator_bigQueryFunction_BigQueryFunction; import org.finos.legend.pure.generated.Root_meta_external_function_activator_bigQueryFunction_BigQueryFunctionDeploymentConfiguration; import org.finos.legend.pure.generated.Root_meta_pure_alloy_connections_alloy_specification_BigQueryDatasourceSpecification; import org.slf4j.Logger; @@ -38,7 +40,7 @@ /** * These deployment functions assume that the artifact has already been validated. */ -public class BigQueryFunctionDeploymentManager implements DeploymentManager +public class BigQueryFunctionDeploymentManager implements DeploymentManager { private static final Logger LOGGER = LoggerFactory.getLogger(BigQueryFunctionDeploymentManager.class); @@ -65,6 +67,12 @@ public BigQueryFunctionDeploymentResult deploy(Identity identity, BigQueryFuncti return new BigQueryFunctionDeploymentResult("", false); } + @Override + public FunctionActivatorDeploymentDetails getActivatorDetails(Identity identity, BigQueryFunctionDeploymentConfiguration runtimeConfig, Root_meta_external_function_activator_bigQueryFunction_BigQueryFunction activator) + { + return new FunctionActivatorDeploymentDetails(); + } + public BigQueryFunctionDeploymentResult deployImpl(BigQueryFunctionArtifact artifact, Root_meta_external_function_activator_bigQueryFunction_BigQueryFunctionDeploymentConfiguration deploymentConfiguration) { LOGGER.info("Starting deployment"); diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-deployment/pom.xml b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-deployment/pom.xml index 3ef156e71fb..066694985fa 100644 --- a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-deployment/pom.xml +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-deployment/pom.xml @@ -42,6 +42,10 @@ org.finos.legend.engine legend-engine-xt-functionActivator-generation + + org.finos.legend.engine + legend-engine-xt-functionActivator-pure + diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-deployment/src/main/java/org/finos/legend/engine/functionActivator/deployment/DeploymentManager.java b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-deployment/src/main/java/org/finos/legend/engine/functionActivator/deployment/DeploymentManager.java index 0a02cc0cac0..379c5e15df6 100644 --- a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-deployment/src/main/java/org/finos/legend/engine/functionActivator/deployment/DeploymentManager.java +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-deployment/src/main/java/org/finos/legend/engine/functionActivator/deployment/DeploymentManager.java @@ -19,12 +19,14 @@ import org.finos.legend.engine.protocol.functionActivator.deployment.DeploymentResult; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorArtifact; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentConfiguration; +import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentDetails; import org.finos.legend.engine.protocol.functionActivator.deployment.PostDeploymentActionResult; import org.finos.legend.engine.shared.core.identity.Identity; +import org.finos.legend.pure.generated.Root_meta_external_function_activator_FunctionActivator; import java.util.List; -public interface DeploymentManager +public interface DeploymentManager { public List selectConfig(List availableConfigs); @@ -33,6 +35,8 @@ public interface DeploymentManager availableRuntimeConfigurations); + public X getActivatorDetails(Identity identity, W deploymentConfig, Y activator); + public boolean canDeploy(FunctionActivatorArtifact activatorArtifact); public default List deployActions(Identity identity, U artifact) @@ -40,7 +44,10 @@ public default List deployActions(Identity identity, List actionResults = Lists.mutable.empty(); PostDeploymentActionLoader.extensions().forEach((ex) -> { - actionResults.addAll(ex.processAction(identity, artifact)); + if (ex.canDeploy(artifact)) + { + actionResults.addAll(ex.processAction(identity, artifact)); + } }); return actionResults; } diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/pom.xml b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/pom.xml index 8a49b7c069d..ab060558b4e 100644 --- a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/pom.xml +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/pom.xml @@ -60,6 +60,10 @@ org.finos.legend.engine legend-engine-identity-core + + org.finos.legend.engine + legend-engine-pure-code-compiled-core + diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/generation/FunctionActivatorGenerator.java b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/generation/FunctionActivatorGenerator.java index 4b6d0e46f64..9c3c81b1544 100644 --- a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/generation/FunctionActivatorGenerator.java +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/generation/FunctionActivatorGenerator.java @@ -14,22 +14,25 @@ package org.finos.legend.engine.functionActivator.generation; +import org.eclipse.collections.api.RichIterable; +import org.eclipse.collections.api.block.function.Function; import org.eclipse.collections.api.factory.Lists; import org.finos.legend.engine.functionActivator.postDeployment.PostDeploymentActionLoader; import org.finos.legend.engine.language.pure.compiler.toPureGraph.PureModel; import org.finos.legend.engine.protocol.functionActivator.postDeployment.ActionContent; import org.finos.legend.pure.generated.Root_meta_external_function_activator_FunctionActivator; +import org.finos.legend.pure.generated.Root_meta_pure_extension_Extension; import java.util.List; public abstract class FunctionActivatorGenerator { - public static List generateActions(Root_meta_external_function_activator_FunctionActivator activator, PureModel pureModel) + public static List generateActions(Root_meta_external_function_activator_FunctionActivator activator, PureModel pureModel, Function> routerExtensions) { List actionResults = Lists.mutable.empty(); PostDeploymentActionLoader.generationExtensions().forEach((ex) -> { - actionResults.addAll(ex.generate(activator, pureModel)); + actionResults.addAll(ex.generate(activator, pureModel, routerExtensions)); }); return actionResults; } diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/postDeployment/PostDeploymentActionDeploymentContract.java b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/postDeployment/PostDeploymentActionDeploymentContract.java index 080cfd48257..58cc9293e8e 100644 --- a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/postDeployment/PostDeploymentActionDeploymentContract.java +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/postDeployment/PostDeploymentActionDeploymentContract.java @@ -23,4 +23,6 @@ public interface PostDeploymentActionDeploymentContract { List processAction(Identity identity, FunctionActivatorArtifact artifact); + + boolean canDeploy(FunctionActivatorArtifact artifact); } \ No newline at end of file diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/postDeployment/PostDeploymentGeneration.java b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/postDeployment/PostDeploymentGeneration.java index 2b5fdc8d566..bddf5b2e01f 100644 --- a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/postDeployment/PostDeploymentGeneration.java +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/postDeployment/PostDeploymentGeneration.java @@ -14,13 +14,16 @@ package org.finos.legend.engine.functionActivator.postDeployment; +import org.eclipse.collections.api.RichIterable; +import org.eclipse.collections.api.block.function.Function; import org.finos.legend.engine.language.pure.compiler.toPureGraph.PureModel; import org.finos.legend.engine.protocol.functionActivator.postDeployment.ActionContent; import org.finos.legend.pure.generated.Root_meta_external_function_activator_FunctionActivator; +import org.finos.legend.pure.generated.Root_meta_pure_extension_Extension; import java.util.List; public interface PostDeploymentGeneration { - List generate(Root_meta_external_function_activator_FunctionActivator activator, PureModel pureModel); + List generate(Root_meta_external_function_activator_FunctionActivator activator, PureModel pureModel, Function> routerExtensions); } diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/validation/FunctionActivatorResult.java b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/validation/FunctionActivatorResult.java new file mode 100644 index 00000000000..86a261eecaf --- /dev/null +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/validation/FunctionActivatorResult.java @@ -0,0 +1,66 @@ +// Copyright 2023 Goldman Sachs +// +// Licensed 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.finos.legend.engine.functionActivator.validation; + +import org.eclipse.collections.api.factory.Lists; +import org.eclipse.collections.api.list.MutableList; + +public class FunctionActivatorResult +{ + public MutableList errors = Lists.mutable.empty(); + public MutableList warnings = Lists.mutable.empty(); + + public FunctionActivatorResult() + { + + } + + public FunctionActivatorResult(MutableList errors) + { + this.errors = errors; + } + + public FunctionActivatorResult(MutableList errors, MutableList warnings) + { + this.errors = errors; + this.warnings = warnings; + } + + public MutableList getErrors() + { + return this.errors; + } + + public MutableList getWarnings() + { + return this.warnings; + } + + public void addError(FunctionActivatorError error) + { + this.errors.add(error); + } + + public void addWarning(FunctionActivatorWarning warning) + { + this.warnings.add(warning); + } + + public void addAll(FunctionActivatorResult result) + { + this.errors.addAll(result.errors); + this.warnings.addAll(result.warnings); + } +} diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/validation/FunctionActivatorValidator.java b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/validation/FunctionActivatorValidator.java index 2a78f23d061..d234efc6793 100644 --- a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/validation/FunctionActivatorValidator.java +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/validation/FunctionActivatorValidator.java @@ -15,14 +15,14 @@ package org.finos.legend.engine.functionActivator.validation; -import org.finos.legend.engine.language.pure.compiler.toPureGraph.PureModel; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorArtifact; +import org.finos.legend.engine.protocol.functionActivator.postDeployment.ActionContent; import org.finos.legend.engine.shared.core.identity.Identity; import org.finos.legend.pure.generated.Root_meta_external_function_activator_FunctionActivator; import java.util.List; -public interface FunctionActivatorValidator +public interface FunctionActivatorValidator { boolean supports(T activator); @@ -32,5 +32,5 @@ public interface FunctionActivatorValidator validate(Identity identity, V artifact); - List validate(T activator, PureModel pureModel); + FunctionActivatorResult validateArtifactActions(List actual, List exists); } diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/validation/FunctionActivatorWarning.java b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/validation/FunctionActivatorWarning.java new file mode 100644 index 00000000000..d8e1cd2dac1 --- /dev/null +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-generation/src/main/java/org/finos/legend/engine/functionActivator/validation/FunctionActivatorWarning.java @@ -0,0 +1,25 @@ +// Copyright 2023 Goldman Sachs +// +// Licensed 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.finos.legend.engine.functionActivator.validation; + +public class FunctionActivatorWarning +{ + public String message; + + public FunctionActivatorWarning(String message) + { + this.message = message; + } +} diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-http-api/src/main/java/org/finos/legend/engine/functionActivator/api/FunctionActivatorAPI.java b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-http-api/src/main/java/org/finos/legend/engine/functionActivator/api/FunctionActivatorAPI.java index 9ed9010b189..3ae12ddba4e 100644 --- a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-http-api/src/main/java/org/finos/legend/engine/functionActivator/api/FunctionActivatorAPI.java +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-http-api/src/main/java/org/finos/legend/engine/functionActivator/api/FunctionActivatorAPI.java @@ -24,7 +24,7 @@ import org.eclipse.collections.api.list.MutableList; import org.finos.legend.engine.functionActivator.api.input.FunctionActivatorInput; import org.finos.legend.engine.functionActivator.api.output.FunctionActivatorInfo; -import org.finos.legend.engine.functionActivator.validation.FunctionActivatorError; +import org.finos.legend.engine.functionActivator.validation.FunctionActivatorResult; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentConfiguration; import org.finos.legend.engine.functionActivator.service.FunctionActivatorLoader; import org.finos.legend.engine.functionActivator.service.FunctionActivatorService; @@ -115,7 +115,7 @@ public Response validate(FunctionActivatorInput input, @ApiParam(hidden = true) PureModel pureModel = modelManager.loadModel(input.model, clientVersion, identity, null); Root_meta_external_function_activator_FunctionActivator activator = (Root_meta_external_function_activator_FunctionActivator) pureModel.getPackageableElement(input.functionActivator); FunctionActivatorService service = getActivatorService(activator, pureModel); - MutableList validate = service.validate(Identity.makeIdentity(profiles), pureModel, activator, input.model, routerExtensions); + FunctionActivatorResult validate = service.validate(Identity.makeIdentity(profiles), pureModel, activator, input.model, service.selectConfig(this.runtimeDeploymentConfig), routerExtensions); long end = System.currentTimeMillis(); MetricsHandler.observeRequest(uriInfo != null ? uriInfo.getPath() : null, start, end); return Response.ok(objectMapper.writeValueAsString(validate)).type(MediaType.APPLICATION_JSON_TYPE).build(); diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-http-api/src/main/java/org/finos/legend/engine/functionActivator/service/FunctionActivatorService.java b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-http-api/src/main/java/org/finos/legend/engine/functionActivator/service/FunctionActivatorService.java index cee846c0a28..7fda6300351 100644 --- a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-http-api/src/main/java/org/finos/legend/engine/functionActivator/service/FunctionActivatorService.java +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-http-api/src/main/java/org/finos/legend/engine/functionActivator/service/FunctionActivatorService.java @@ -16,9 +16,8 @@ import org.eclipse.collections.api.RichIterable; import org.eclipse.collections.api.block.function.Function; -import org.eclipse.collections.api.list.MutableList; import org.finos.legend.engine.functionActivator.api.output.FunctionActivatorInfo; -import org.finos.legend.engine.functionActivator.validation.FunctionActivatorError; +import org.finos.legend.engine.functionActivator.validation.FunctionActivatorResult; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorArtifact; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentConfiguration; import org.finos.legend.engine.language.pure.compiler.toPureGraph.PureModel; @@ -43,7 +42,7 @@ default String type() boolean supports(Root_meta_external_function_activator_FunctionActivator packageableElement); - MutableList validate(Identity identity, PureModel pureModel, T functionActivator, PureModelContext inputModel, Function> routerExtensions); + FunctionActivatorResult validate(Identity identity, PureModel pureModel, T functionActivator, PureModelContext inputModel, List runtimeConfigurations, Function> routerExtensions); V publishToSandbox(Identity identity, PureModel pureModel, T functionActivator, PureModelContext inputModel, List runtimeConfigurations, Function> routerExtensions); diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-protocol/src/main/java/org/finos/legend/engine/protocol/functionActivator/deployment/ExtraDeploymentConfigurations.java b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-protocol/src/main/java/org/finos/legend/engine/protocol/functionActivator/deployment/ExtraDeploymentConfigurations.java new file mode 100644 index 00000000000..0cdaad18e4c --- /dev/null +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-protocol/src/main/java/org/finos/legend/engine/protocol/functionActivator/deployment/ExtraDeploymentConfigurations.java @@ -0,0 +1,26 @@ +// Copyright 2023 Goldman Sachs +// +// Licensed 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.finos.legend.engine.protocol.functionActivator.deployment; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "_type") +public class ExtraDeploymentConfigurations +{ + public ExtraDeploymentConfigurations() + { + //For Jackson + } +} diff --git a/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-protocol/src/main/java/org/finos/legend/engine/protocol/functionActivator/deployment/FunctionActivatorDeploymentDetails.java b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-protocol/src/main/java/org/finos/legend/engine/protocol/functionActivator/deployment/FunctionActivatorDeploymentDetails.java new file mode 100644 index 00000000000..15d38907feb --- /dev/null +++ b/legend-engine-xts-functionActivator/legend-engine-xt-functionActivator-protocol/src/main/java/org/finos/legend/engine/protocol/functionActivator/deployment/FunctionActivatorDeploymentDetails.java @@ -0,0 +1,30 @@ +// Copyright 2023 Goldman Sachs +// +// Licensed 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.finos.legend.engine.protocol.functionActivator.deployment; + +public class FunctionActivatorDeploymentDetails +{ + public String errorMessage; + + public FunctionActivatorDeploymentDetails() + { + + } + + public FunctionActivatorDeploymentDetails(String errorMessage) + { + this.errorMessage = errorMessage; + } +} diff --git a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-api/src/main/java/org/finos/legend/engine/language/hostedService/api/HostedServiceService.java b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-api/src/main/java/org/finos/legend/engine/language/hostedService/api/HostedServiceService.java index 2039cb7209a..ae3dbd15497 100644 --- a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-api/src/main/java/org/finos/legend/engine/language/hostedService/api/HostedServiceService.java +++ b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-api/src/main/java/org/finos/legend/engine/language/hostedService/api/HostedServiceService.java @@ -19,17 +19,19 @@ import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.factory.Lists; import org.finos.legend.engine.functionActivator.api.output.FunctionActivatorInfo; +import org.finos.legend.engine.functionActivator.validation.FunctionActivatorResult; import org.finos.legend.engine.functionActivator.validation.FunctionActivatorValidator; +import org.finos.legend.engine.functionActivator.validation.FunctionActivatorWarning; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentConfiguration; import org.finos.legend.engine.protocol.hostedService.deployment.HostedServiceArtifact; import org.finos.legend.engine.protocol.hostedService.deployment.HostedServiceDeploymentConfiguration; import org.finos.legend.engine.functionActivator.validation.FunctionActivatorError; import org.finos.legend.engine.functionActivator.service.FunctionActivatorService; import org.finos.legend.engine.language.hostedService.generation.deployment.HostedServiceDeploymentManager; +import org.finos.legend.engine.protocol.hostedService.deployment.HostedServiceDeploymentDetails; import org.finos.legend.engine.protocol.hostedService.deployment.HostedServiceDeploymentResult; import org.finos.legend.engine.language.hostedService.generation.HostedServiceArtifactGenerator; import org.finos.legend.engine.language.pure.compiler.toPureGraph.PureModel; -import org.finos.legend.engine.protocol.hostedService.deployment.HostedServiceDestination; import org.finos.legend.engine.protocol.hostedService.metamodel.HostedServiceProtocolExtension; import org.finos.legend.engine.protocol.pure.v1.model.context.PureModelContext; import org.finos.legend.engine.shared.core.identity.Identity; @@ -81,9 +83,10 @@ public boolean supports(Root_meta_external_function_activator_FunctionActivator } @Override - public MutableList validate(Identity identity, PureModel pureModel, Root_meta_external_function_activator_hostedService_HostedService activator, PureModelContext inputModel, Function> routerExtensions) + public FunctionActivatorResult validate(Identity identity, PureModel pureModel, Root_meta_external_function_activator_hostedService_HostedService activator, PureModelContext inputModel, List runtimeConfigurations, Function> routerExtensions) { MutableList errors = Lists.mutable.empty(); + FunctionActivatorResult result = new FunctionActivatorResult(); try { core_hostedservice_generation_generation.Root_meta_external_function_activator_hostedService_validator_validateService_HostedService_1__Boolean_1_(activator, pureModel.getExecutionSupport()); //returns true or errors out @@ -96,10 +99,45 @@ public MutableList validate(Identity identity, this.extraValidators.select(v -> v.supports(activator)).forEach(v -> { errors.addAll(v.validate(identity, activator)); - errors.addAll(v.validate(activator, pureModel)); }); - return errors; + result.addAll(validateArtifactActions(identity, pureModel, activator, inputModel, runtimeConfigurations, "vX_X_X", routerExtensions)); + result.getErrors().addAll(errors); + return result; + } + public FunctionActivatorResult validateArtifactActions(Identity identity, PureModel pureModel, Root_meta_external_function_activator_hostedService_HostedService activator, PureModelContext inputModel, List availableRuntimeConfigurations, String clientVersion, Function> routerExtensions) + { + FunctionActivatorResult result = new FunctionActivatorResult(); + if (!activator._actions().isEmpty()) + { + HostedServiceDeploymentConfiguration deployConf; + try + { + HostedServiceArtifact artifact = this.renderArtifact(pureModel, activator, inputModel, clientVersion, routerExtensions); + deployConf = hostedServiceDeploymentManager.getDeploymentConfiguration(artifact, availableRuntimeConfigurations); + if (artifact.version == null) + { + artifact.deploymentConfiguration = deployConf; + } + + HostedServiceDeploymentDetails serviceDetails = this.hostedServiceDeploymentManager.getActivatorDetails(identity, (HostedServiceDeploymentConfiguration) artifact.deploymentConfiguration, activator); + + if (serviceDetails.errorMessage != null) + { + throw new Exception(serviceDetails.errorMessage); + } + + this.extraValidators.select(v -> v.supports(activator)).forEach(v -> + { + result.addAll(v.validateArtifactActions(artifact.actions, serviceDetails.actions)); + }); + } + catch (Exception e) + { + result.addWarning(new FunctionActivatorWarning("Failed to validate Artifact Actions. Error: " + e.getMessage())); + } + } + return result; } @Override @@ -123,13 +161,18 @@ public List selectConfig(List runtimeConfigs, Function> routerExtensions) { - MutableList validationErrors = this.validate(identity, pureModel, activator, inputModel, routerExtensions); + MutableList validationErrors = this.validate(identity, pureModel, activator, inputModel, runtimeConfigs, routerExtensions).getErrors(); if (validationErrors.isEmpty()) { HostedServiceArtifact artifact = this.hostedServiceArtifactgenerator.renderServiceArtifact(pureModel, activator, inputModel, "vX_X_X", routerExtensions); HostedServiceDeploymentResult result = this.hostedServiceDeploymentManager.deploy(identity, artifact, runtimeConfigs); if (result.successful) { + HostedServiceDeploymentConfiguration deployConf = hostedServiceDeploymentManager.getDeploymentConfiguration(artifact, runtimeConfigs); + if (artifact.version == null) + { + artifact.deploymentConfiguration = deployConf; + } result.actionResults = this.hostedServiceDeploymentManager.deployActions(identity, artifact); } return result; diff --git a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-generation/src/main/java/org/finos/legend/engine/language/hostedService/generation/HostedServiceArtifactGenerator.java b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-generation/src/main/java/org/finos/legend/engine/language/hostedService/generation/HostedServiceArtifactGenerator.java index 81a6688e6c8..c9018ef40e6 100644 --- a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-generation/src/main/java/org/finos/legend/engine/language/hostedService/generation/HostedServiceArtifactGenerator.java +++ b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-generation/src/main/java/org/finos/legend/engine/language/hostedService/generation/HostedServiceArtifactGenerator.java @@ -67,7 +67,7 @@ public static HostedServiceArtifact renderServiceArtifact(PureModel pureModel, R { ExecutionPlan plan = generatePlan(pureModel, activator, inputModel, clientVersion, routerExtensions); Lineage lineage = new Lineage(); - return new HostedServiceArtifact(activator._pattern(), new GenerationInfoData(plan, lineage), HostedServiceArtifactGenerator.fetchHostedService(activator, (PureModelContextData)inputModel, pureModel), ((Root_meta_external_function_activator_DeploymentOwnership) activator._ownership())._id(), FunctionActivatorGenerator.generateActions(activator, pureModel), ((PureModelContextData)inputModel).origin != null ? (AlloySDLC) ((PureModelContextData)inputModel).origin.sdlcInfo : null); + return new HostedServiceArtifact(activator._pattern(), new GenerationInfoData(plan, lineage), HostedServiceArtifactGenerator.fetchHostedService(activator, (PureModelContextData)inputModel, pureModel), ((Root_meta_external_function_activator_DeploymentOwnership) activator._ownership())._id(), FunctionActivatorGenerator.generateActions(activator, pureModel, routerExtensions), ((PureModelContextData)inputModel).origin != null ? (AlloySDLC) ((PureModelContextData)inputModel).origin.sdlcInfo : null); } public static ExecutionPlan generatePlan(PureModel pureModel, Root_meta_external_function_activator_hostedService_HostedService activator, PureModelContext inputModel, String clientVersion,Function> routerExtensions) diff --git a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-generation/src/main/java/org/finos/legend/engine/language/hostedService/generation/deployment/HostedServiceArtifactGenerationExtension.java b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-generation/src/main/java/org/finos/legend/engine/language/hostedService/generation/deployment/HostedServiceArtifactGenerationExtension.java index 37c662b9f0e..ee5d0d8a75c 100644 --- a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-generation/src/main/java/org/finos/legend/engine/language/hostedService/generation/deployment/HostedServiceArtifactGenerationExtension.java +++ b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-generation/src/main/java/org/finos/legend/engine/language/hostedService/generation/deployment/HostedServiceArtifactGenerationExtension.java @@ -80,7 +80,7 @@ public List generate(PackageableElement element, PureModel pureModel, Function> routerExtensions = (PureModel p) -> PureCoreExtensionLoader.extensions().flatCollect(e -> e.extraPureCoreExtensions(p.getExecutionSupport())); GenerationInfoData info = HostedServiceArtifactGenerator.renderArtifact(pureModel, activator, data, clientVersion, routerExtensions); PureModelContextData serviceData = HostedServiceArtifactGenerator.fetchHostedService(activator, data, pureModel); - result.add(new Artifact(mapper.writeValueAsString(new HostedServiceArtifact(activator._pattern(), info, generatePointerForActivator(serviceData, data), ((Root_meta_external_function_activator_DeploymentOwnership)activator._ownership())._id(), FunctionActivatorGenerator.generateActions(activator, pureModel), (AlloySDLC) data.origin.sdlcInfo)), FILE_NAME, "json")); + result.add(new Artifact(mapper.writeValueAsString(new HostedServiceArtifact(activator._pattern(), info, generatePointerForActivator(serviceData, data), ((Root_meta_external_function_activator_DeploymentOwnership)activator._ownership())._id(), FunctionActivatorGenerator.generateActions(activator, pureModel, routerExtensions), (AlloySDLC) data.origin.sdlcInfo)), FILE_NAME, "json")); LOGGER.info("Generated artifacts for " + element.getName()); } diff --git a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-generation/src/main/java/org/finos/legend/engine/language/hostedService/generation/deployment/HostedServiceDeploymentManager.java b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-generation/src/main/java/org/finos/legend/engine/language/hostedService/generation/deployment/HostedServiceDeploymentManager.java index 050c794700a..e6104b669ed 100644 --- a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-generation/src/main/java/org/finos/legend/engine/language/hostedService/generation/deployment/HostedServiceDeploymentManager.java +++ b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-generation/src/main/java/org/finos/legend/engine/language/hostedService/generation/deployment/HostedServiceDeploymentManager.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.StringEntity; @@ -33,14 +34,18 @@ import org.finos.legend.engine.shared.core.identity.credential.LegendKerberosCredential; import org.finos.legend.engine.shared.core.kerberos.HttpClientBuilder; import org.finos.legend.engine.shared.core.operational.errorManagement.EngineException; +import org.finos.legend.engine.shared.core.operational.logs.LogInfo; +import org.finos.legend.pure.generated.Root_meta_external_function_activator_hostedService_HostedService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.security.auth.Subject; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.security.PrivilegedExceptionAction; import java.util.List; -public class HostedServiceDeploymentManager implements DeploymentManager +public class HostedServiceDeploymentManager implements DeploymentManager { private static final Logger LOGGER = LoggerFactory.getLogger(HostedServiceDeploymentManager.class); @@ -65,22 +70,17 @@ public HostedServiceDeploymentResult deploy(Identity identity, HostedServiceArti { HostedServiceDeploymentConfiguration deployConf; MutableList c = Lists.mutable.withAll(availableRuntimeConfigurations); + deployConf = getDeploymentConfiguration(artifact, availableRuntimeConfigurations); if (artifact.version == null) { - deployConf = c.select(conf -> conf.destination.equals(HostedServiceDestination.Sandbox)).getFirst(); artifact.deploymentConfiguration = deployConf; } - else - { - deployConf = (HostedServiceDeploymentConfiguration) artifact.deploymentConfiguration; - } return doDeploy(identity, deployConf, artifact); } public HostedServiceDeploymentResult doDeploy(Identity identity, HostedServiceDeploymentConfiguration deployConf, HostedServiceArtifact artifact) { - HostedServiceDeploymentResult result = new HostedServiceDeploymentResult(); try { HttpPost request = new HttpPost(new URIBuilder() @@ -94,8 +94,9 @@ public HostedServiceDeploymentResult doDeploy(Identity identity, HostedServiceDe request.setEntity(stringEntity); CloseableHttpClient httpclient = (CloseableHttpClient) HttpClientBuilder.getHttpClient(new BasicCookieStore()); Subject subject = identity.getCredential(LegendKerberosCredential.class).get().getSubject(); - Subject.doAs(subject, (PrivilegedExceptionAction) () -> + return Subject.doAs(subject, (PrivilegedExceptionAction) () -> { + HostedServiceDeploymentResult result = new HostedServiceDeploymentResult(); HttpResponse response = httpclient.execute(request); if (response.getStatusLine().getStatusCode() != 200) { @@ -103,22 +104,52 @@ public HostedServiceDeploymentResult doDeploy(Identity identity, HostedServiceDe } else { - HostedServiceDeploymentResult responseResult = mapper.readValue(EntityUtils.toString(response.getEntity()), HostedServiceDeploymentResult.class); - result.deployed = responseResult.deployed; - result.successful = true; - result.deploymentLocation = responseResult.deploymentLocation; + result = mapper.readValue(EntityUtils.toString(response.getEntity()), HostedServiceDeploymentResult.class); } - return "done"; + return result; }); //LOGGER.info("Done deploying hosted service"); } catch (Exception e) { - LOGGER.error("Error deploying hosted service", e); + LOGGER.error(new LogInfo(Identity.getAnonymousIdentity().getName(), "HOSTED_SERVICE_DEPLOYMENT_FAILURE", "Error deploying hosted service" + e).toString()); throw new EngineException(e.getMessage()); } - return result; + } + + @Override + public HostedServiceDeploymentDetails getActivatorDetails(Identity identity, HostedServiceDeploymentConfiguration runtimeConfig, Root_meta_external_function_activator_hostedService_HostedService hostedService) + { + try + { + HttpGet request = new HttpGet(new URIBuilder() + .setScheme("http") + .setHost(runtimeConfig.domain) + .setPath(runtimeConfig.serviceDetails + "/" + URLEncoder.encode(hostedService._pattern(), StandardCharsets.UTF_8.toString())) + .build()); + CloseableHttpClient httpclient = (CloseableHttpClient) HttpClientBuilder.getHttpClient(new BasicCookieStore()); + Subject subject = identity.getCredential(LegendKerberosCredential.class).get().getSubject(); + return Subject.doAs(subject, (PrivilegedExceptionAction) () -> + { + HostedServiceDeploymentDetails data = new HostedServiceDeploymentDetails(); + HttpResponse response = httpclient.execute(request); + if (response.getStatusLine().getStatusCode() != 200) + { + data.errorMessage = "Failed to get Active Activator Data. Error Response: " + EntityUtils.toString(response.getEntity()); + } + else + { + data = mapper.readValue(EntityUtils.toString(response.getEntity()), HostedServiceDeploymentDetails.class); + } + return data; + }); + } + catch (Exception e) + { + LOGGER.error(new LogInfo(Identity.getAnonymousIdentity().getName(), "HOSTED_SERVICE_DETAILS_FAILURE", "Error fetching active hosted service details. Exception: " + e.getMessage()).toString()); + throw new EngineException("Error fetching active hosted service data. Exception received: " + e.getMessage()); + } } public String buildDeployStub(HostedServiceDeploymentConfiguration config, HostedServiceArtifact artifact) @@ -126,4 +157,17 @@ public String buildDeployStub(HostedServiceDeploymentConfiguration config, Hoste //change to UI return "http://" + config.domain + ":" + config.port + config.path + ((HostedServiceContent)artifact.content).pattern; } + + public HostedServiceDeploymentConfiguration getDeploymentConfiguration(HostedServiceArtifact artifact, List availableRuntimeConfigurations) + { + MutableList c = Lists.mutable.withAll(availableRuntimeConfigurations); + if (artifact.version == null) + { + return c.select(conf -> conf.destination.equals(HostedServiceDestination.Sandbox)).getFirst(); + } + else + { + return (HostedServiceDeploymentConfiguration) artifact.deploymentConfiguration; + } + } } diff --git a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-protocol/src/main/java/org/finos/legend/engine/protocol/hostedService/deployment/HostedServiceDeploymentConfiguration.java b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-protocol/src/main/java/org/finos/legend/engine/protocol/hostedService/deployment/HostedServiceDeploymentConfiguration.java index 6baa41b872f..3a0323bce8d 100644 --- a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-protocol/src/main/java/org/finos/legend/engine/protocol/hostedService/deployment/HostedServiceDeploymentConfiguration.java +++ b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-protocol/src/main/java/org/finos/legend/engine/protocol/hostedService/deployment/HostedServiceDeploymentConfiguration.java @@ -14,6 +14,7 @@ package org.finos.legend.engine.protocol.hostedService.deployment; +import org.finos.legend.engine.protocol.functionActivator.deployment.ExtraDeploymentConfigurations; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentConfiguration; public class HostedServiceDeploymentConfiguration extends FunctionActivatorDeploymentConfiguration @@ -22,4 +23,6 @@ public class HostedServiceDeploymentConfiguration extends FunctionActivatorDeplo public String domain; public int port; public String path; + public String serviceDetails; + public ExtraDeploymentConfigurations extraConfigurations; } diff --git a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-protocol/src/main/java/org/finos/legend/engine/protocol/hostedService/deployment/HostedServiceDeploymentDetails.java b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-protocol/src/main/java/org/finos/legend/engine/protocol/hostedService/deployment/HostedServiceDeploymentDetails.java new file mode 100644 index 00000000000..f79de38179a --- /dev/null +++ b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-protocol/src/main/java/org/finos/legend/engine/protocol/hostedService/deployment/HostedServiceDeploymentDetails.java @@ -0,0 +1,50 @@ +// Copyright 2023 Goldman Sachs +// +// Licensed 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.finos.legend.engine.protocol.hostedService.deployment; + +import org.eclipse.collections.api.factory.Lists; +import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentDetails; +import org.finos.legend.engine.protocol.functionActivator.postDeployment.ActionContent; +import org.finos.legend.engine.protocol.hostedService.deployment.model.GenerationInfoData; +import org.finos.legend.engine.protocol.pure.v1.model.context.AlloySDLC; + +import java.util.List; + +public class HostedServiceDeploymentDetails extends FunctionActivatorDeploymentDetails +{ + public String pattern; + public String ownership; + public AlloySDLC versionInfo; + public String generationId; + public String linkedSpecification; + public GenerationInfoData generation; + public List actions = Lists.mutable.empty(); + + public HostedServiceDeploymentDetails() + { + + } + + public HostedServiceDeploymentDetails(String pattern, String ownership, AlloySDLC versionInfo, String generationId, String linkedSpecification, GenerationInfoData generation, List actions) + { + this.pattern = pattern; + this.ownership = ownership; + this.versionInfo = versionInfo; + this.generationId = generationId; + this.linkedSpecification = linkedSpecification; + this.generation = generation; + this.actions = actions; + } +} diff --git a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-protocol/src/main/java/org/finos/legend/engine/protocol/hostedService/deployment/HostedServiceDeploymentResult.java b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-protocol/src/main/java/org/finos/legend/engine/protocol/hostedService/deployment/HostedServiceDeploymentResult.java index 6cb62072285..ff36a21176b 100644 --- a/legend-engine-xts-hostedService/legend-engine-xt-hostedService-protocol/src/main/java/org/finos/legend/engine/protocol/hostedService/deployment/HostedServiceDeploymentResult.java +++ b/legend-engine-xts-hostedService/legend-engine-xt-hostedService-protocol/src/main/java/org/finos/legend/engine/protocol/hostedService/deployment/HostedServiceDeploymentResult.java @@ -23,6 +23,7 @@ public class HostedServiceDeploymentResult extends DeploymentResult public String deployed; public String generationId; public List errors; + public List warnings; public HostedServiceDeploymentResult() { diff --git a/legend-engine-xts-memsqlFunction/legend-engine-xt-memsqlFunction-api/src/main/java/org/finos/legend/engine/language/memsql/api/MemSqlFunctionService.java b/legend-engine-xts-memsqlFunction/legend-engine-xt-memsqlFunction-api/src/main/java/org/finos/legend/engine/language/memsql/api/MemSqlFunctionService.java index 031148e0f70..324f618a49b 100644 --- a/legend-engine-xts-memsqlFunction/legend-engine-xt-memsqlFunction-api/src/main/java/org/finos/legend/engine/language/memsql/api/MemSqlFunctionService.java +++ b/legend-engine-xts-memsqlFunction/legend-engine-xt-memsqlFunction-api/src/main/java/org/finos/legend/engine/language/memsql/api/MemSqlFunctionService.java @@ -21,6 +21,7 @@ import org.finos.legend.engine.functionActivator.api.output.FunctionActivatorInfo; import org.finos.legend.engine.functionActivator.validation.FunctionActivatorError; import org.finos.legend.engine.functionActivator.service.FunctionActivatorService; +import org.finos.legend.engine.functionActivator.validation.FunctionActivatorResult; import org.finos.legend.engine.language.memsql.deployment.MemSqlFunctionDeploymentManager; import org.finos.legend.engine.language.memsql.deployment.MemSqlFunctionGenerator; import org.finos.legend.engine.language.pure.compiler.toPureGraph.PureModel; @@ -68,7 +69,7 @@ public boolean supports(Root_meta_external_function_activator_FunctionActivator } @Override - public MutableList validate(Identity identity, PureModel pureModel, Root_meta_external_function_activator_memSqlFunction_MemSqlFunction activator, PureModelContext inputModel, Function> routerExtensions) + public FunctionActivatorResult validate(Identity identity, PureModel pureModel, Root_meta_external_function_activator_memSqlFunction_MemSqlFunction activator, PureModelContext inputModel, List runtimeConfigurations, Function> routerExtensions) { MemSqlFunctionArtifact artifact = MemSqlFunctionGenerator.generateArtifact(pureModel, activator, inputModel, routerExtensions); return this.validateArtifact(artifact); @@ -79,7 +80,7 @@ public MemSqlFunctionDeploymentResult publishToSandbox(Identity identity, PureMo { MemSqlFunctionArtifact artifact = MemSqlFunctionGenerator.generateArtifact(pureModel, activator, inputModel, routerExtensions); - MutableList validationErrors = this.validateArtifact(artifact); + MutableList validationErrors = this.validateArtifact(artifact).getErrors(); Root_meta_external_function_activator_memSqlFunction_MemSqlFunctionDeploymentConfiguration deploymentConfiguration = ((Root_meta_external_function_activator_memSqlFunction_MemSqlFunctionDeploymentConfiguration) activator._activationConfiguration()); return validationErrors.notEmpty() ? @@ -105,11 +106,11 @@ public List selectConfig(List e instanceof MemSqlFunctionDeploymentConfiguration).collect(e -> (MemSqlFunctionDeploymentConfiguration) e); } - private MutableList validateArtifact(MemSqlFunctionArtifact artifact) + private FunctionActivatorResult validateArtifact(MemSqlFunctionArtifact artifact) { int size = ((MemSqlFunctionContent)artifact.content).sqlExpressions.size(); return size == 1 ? - Lists.fixedSize.empty() : - Lists.fixedSize.with(new MemSqlFunctionError("MemSql Function can't be used with a plan containing '" + size + "' SQL expressions", ((MemSqlFunctionContent)artifact.content).sqlExpressions)); + new FunctionActivatorResult() : + new FunctionActivatorResult(Lists.fixedSize.with(new MemSqlFunctionError("MemSql Function can't be used with a plan containing '" + size + "' SQL expressions", ((MemSqlFunctionContent)artifact.content).sqlExpressions))); } } diff --git a/legend-engine-xts-memsqlFunction/legend-engine-xt-memsqlFunction-api/src/main/java/org/finos/legend/engine/language/memsql/deployment/MemSqlFunctionDeploymentManager.java b/legend-engine-xts-memsqlFunction/legend-engine-xt-memsqlFunction-api/src/main/java/org/finos/legend/engine/language/memsql/deployment/MemSqlFunctionDeploymentManager.java index 38111685913..8dec349b71b 100644 --- a/legend-engine-xts-memsqlFunction/legend-engine-xt-memsqlFunction-api/src/main/java/org/finos/legend/engine/language/memsql/deployment/MemSqlFunctionDeploymentManager.java +++ b/legend-engine-xts-memsqlFunction/legend-engine-xt-memsqlFunction-api/src/main/java/org/finos/legend/engine/language/memsql/deployment/MemSqlFunctionDeploymentManager.java @@ -26,6 +26,7 @@ import org.finos.legend.engine.plan.execution.stores.relational.plugin.RelationalStoreState; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorArtifact; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentConfiguration; +import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentDetails; import org.finos.legend.engine.protocol.memsqlFunction.deployment.MemSqlFunctionArtifact; import org.finos.legend.engine.protocol.memsqlFunction.deployment.MemSqlFunctionContent; import org.finos.legend.engine.protocol.memsqlFunction.deployment.MemSqlFunctionDeploymentConfiguration; @@ -33,6 +34,7 @@ import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.connection.DatabaseConnection; import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.connection.RelationalDatabaseConnection; import org.finos.legend.engine.shared.core.identity.Identity; +import org.finos.legend.pure.generated.Root_meta_external_function_activator_memSqlFunction_MemSqlFunction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,7 +46,7 @@ /** * These deployment functions assume that the artifact has already been validated. */ -public class MemSqlFunctionDeploymentManager implements DeploymentManager +public class MemSqlFunctionDeploymentManager implements DeploymentManager { private static final Logger LOGGER = LoggerFactory.getLogger(MemSqlFunctionDeploymentManager.class); @@ -96,6 +98,12 @@ public MemSqlFunctionDeploymentResult deploy(Identity identity, MemSqlFunctionAr return result; } + @Override + public FunctionActivatorDeploymentDetails getActivatorDetails(Identity identity, MemSqlFunctionDeploymentConfiguration runtimeConfig, Root_meta_external_function_activator_memSqlFunction_MemSqlFunction activator) + { + return new FunctionActivatorDeploymentDetails(); + } + public void deployImpl(Connection connection, MemSqlFunctionContent context) throws SQLException { MutableList statements = createFunctionStatements(context); diff --git a/legend-engine-xts-snowflakeApp/legend-engine-xt-snowflakeApp-api/src/main/java/org/finos/legend/engine/language/snowflakeApp/api/SnowflakeAppService.java b/legend-engine-xts-snowflakeApp/legend-engine-xt-snowflakeApp-api/src/main/java/org/finos/legend/engine/language/snowflakeApp/api/SnowflakeAppService.java index 05dfe8137fa..6c48dc8dab7 100644 --- a/legend-engine-xts-snowflakeApp/legend-engine-xt-snowflakeApp-api/src/main/java/org/finos/legend/engine/language/snowflakeApp/api/SnowflakeAppService.java +++ b/legend-engine-xts-snowflakeApp/legend-engine-xt-snowflakeApp-api/src/main/java/org/finos/legend/engine/language/snowflakeApp/api/SnowflakeAppService.java @@ -20,6 +20,7 @@ import org.eclipse.collections.impl.factory.Lists; import org.eclipse.collections.impl.list.mutable.FastList; import org.finos.legend.engine.functionActivator.api.output.FunctionActivatorInfo; +import org.finos.legend.engine.functionActivator.validation.FunctionActivatorResult; import org.finos.legend.engine.functionActivator.validation.FunctionActivatorValidator; import org.finos.legend.engine.language.snowflakeApp.deployment.SnowflakeGrantInfo; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentConfiguration; @@ -99,15 +100,15 @@ public boolean supports(Root_meta_external_function_activator_FunctionActivator } @Override - public MutableList validate(Identity identity, PureModel pureModel, Root_meta_external_function_activator_snowflakeApp_SnowflakeApp activator, PureModelContext inputModel, Function> routerExtensions) + public FunctionActivatorResult validate(Identity identity, PureModel pureModel, Root_meta_external_function_activator_snowflakeApp_SnowflakeApp activator, PureModelContext inputModel, List runtimeConfigurations, Function> routerExtensions) { SnowflakeAppArtifact artifact = SnowflakeAppGenerator.generateArtifact(pureModel, activator, inputModel, routerExtensions); - MutableList errors = validate(identity, artifact); - this.extraValidators.select(v -> v.supports(activator)).forEach(v -> errors.addAll(v.validate(identity, activator))); + FunctionActivatorResult errors = validate(identity, artifact); + this.extraValidators.select(v -> v.supports(activator)).forEach(v -> errors.getErrors().addAll(v.validate(identity, activator))); return errors; } - public MutableList validate(Identity identity, SnowflakeAppArtifact artifact) + public FunctionActivatorResult validate(Identity identity, SnowflakeAppArtifact artifact) { MutableList errors = Lists.mutable.empty(); SnowflakeAppContent content = (SnowflakeAppContent)artifact.content; @@ -133,14 +134,14 @@ public MutableList validate(Identity identity, errors.add(new SnowflakeAppError("Privilege Violation for SEQUESTERED scheme. Deployment Role contains SELECT permissions on tables: " + violations.collect(v -> v.objectName).makeString("[", ",", "]"))); } } - return errors; + return new FunctionActivatorResult(errors); } @Override public SnowflakeDeploymentResult publishToSandbox(Identity identity, PureModel pureModel, Root_meta_external_function_activator_snowflakeApp_SnowflakeApp activator, PureModelContext inputModel, List runtimeConfigurations, Function> routerExtensions) { SnowflakeAppArtifact artifact = SnowflakeAppGenerator.generateArtifact(pureModel, activator, inputModel, routerExtensions); - MutableList validationError = validate(identity, artifact); + MutableList validationError = validate(identity, artifact).getErrors(); if (validationError.isEmpty()) { return this.snowflakeDeploymentManager.deploy(identity, artifact, runtimeConfigurations); diff --git a/legend-engine-xts-snowflakeApp/legend-engine-xt-snowflakeApp-api/src/main/java/org/finos/legend/engine/language/snowflakeApp/deployment/SnowflakeAppDeploymentManager.java b/legend-engine-xts-snowflakeApp/legend-engine-xt-snowflakeApp-api/src/main/java/org/finos/legend/engine/language/snowflakeApp/deployment/SnowflakeAppDeploymentManager.java index 3912951e69d..40e04b5c9ea 100644 --- a/legend-engine-xts-snowflakeApp/legend-engine-xt-snowflakeApp-api/src/main/java/org/finos/legend/engine/language/snowflakeApp/deployment/SnowflakeAppDeploymentManager.java +++ b/legend-engine-xts-snowflakeApp/legend-engine-xt-snowflakeApp-api/src/main/java/org/finos/legend/engine/language/snowflakeApp/deployment/SnowflakeAppDeploymentManager.java @@ -22,7 +22,7 @@ import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorArtifact; import org.finos.legend.engine.language.snowflakeApp.api.SnowflakeAppDeploymentTool; import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentConfiguration; -import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.connection.specification.SnowflakeDatasourceSpecification; +import org.finos.legend.engine.protocol.functionActivator.deployment.FunctionActivatorDeploymentDetails; import org.finos.legend.engine.protocol.snowflakeApp.deployment.SnowflakeAppArtifact; import org.finos.legend.engine.protocol.snowflakeApp.deployment.SnowflakeAppDeploymentConfiguration; import org.finos.legend.engine.protocol.snowflakeApp.deployment.SnowflakeAppContent; @@ -30,9 +30,9 @@ import org.finos.legend.engine.plan.execution.stores.relational.connection.manager.ConnectionManagerSelector; import org.finos.legend.engine.plan.execution.stores.relational.plugin.RelationalStoreExecutor; import org.finos.legend.engine.plan.execution.stores.relational.plugin.RelationalStoreState; -import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.connection.DatabaseConnection; import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.connection.RelationalDatabaseConnection; import org.finos.legend.engine.shared.core.identity.Identity; +import org.finos.legend.pure.generated.Root_meta_external_function_activator_snowflakeApp_SnowflakeApp; import org.finos.legend.pure.generated.Root_meta_pure_alloy_connections_alloy_authentication_SnowflakePublicAuthenticationStrategy; import org.finos.legend.pure.generated.Root_meta_pure_alloy_connections_alloy_specification_SnowflakeDatasourceSpecification; import org.slf4j.Logger; @@ -46,7 +46,7 @@ import java.util.Map; -public class SnowflakeAppDeploymentManager implements DeploymentManager +public class SnowflakeAppDeploymentManager implements DeploymentManager { private static final Logger LOGGER = LoggerFactory.getLogger(SnowflakeAppDeploymentManager.class); @@ -116,6 +116,11 @@ public SnowflakeDeploymentResult deploy(Identity identity, SnowflakeAppArtifact return result; } + @Override + public FunctionActivatorDeploymentDetails getActivatorDetails(Identity identity, SnowflakeAppDeploymentConfiguration runtimeConfig, Root_meta_external_function_activator_snowflakeApp_SnowflakeApp activator) + { + return new FunctionActivatorDeploymentDetails(); + } public SnowflakeAppDeploymentTool getSnowflakeAppDeploymentTool() { diff --git a/legend-engine-xts-snowflakeApp/legend-engine-xt-snowflakeApp-generator/src/main/java/org/finos/legend/engine/language/snowflakeApp/generator/SnowflakeAppGenerator.java b/legend-engine-xts-snowflakeApp/legend-engine-xt-snowflakeApp-generator/src/main/java/org/finos/legend/engine/language/snowflakeApp/generator/SnowflakeAppGenerator.java index f312c5c4a03..1837fc03236 100644 --- a/legend-engine-xts-snowflakeApp/legend-engine-xt-snowflakeApp-generator/src/main/java/org/finos/legend/engine/language/snowflakeApp/generator/SnowflakeAppGenerator.java +++ b/legend-engine-xts-snowflakeApp/legend-engine-xt-snowflakeApp-generator/src/main/java/org/finos/legend/engine/language/snowflakeApp/generator/SnowflakeAppGenerator.java @@ -59,7 +59,7 @@ public static SnowflakeAppArtifact generateArtifact(PureModel pureModel, Root_me } } SnowflakeAppContent content = new SnowflakeAppContent(activator._applicationName(), fullArtifact._createQuery(), fullArtifact._grantStatement(), activator._permissionScheme().toString(), activator._description(), ((Root_meta_external_function_activator_DeploymentOwnership)activator._ownership())._id(), Lists.mutable.withAll(fullArtifact._tables())); - List actionContents = FunctionActivatorGenerator.generateActions(activator, pureModel); + List actionContents = FunctionActivatorGenerator.generateActions(activator, pureModel, routerExtensions); if (activator._activationConfiguration() != null) { //identify connection