diff --git a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/template/PipelineTemplateGenerator.java b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/template/PipelineTemplateGenerator.java index dfbbd90816..235e1b7e18 100644 --- a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/template/PipelineTemplateGenerator.java +++ b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/template/PipelineTemplateGenerator.java @@ -122,14 +122,12 @@ protected DataProcessorDescription getProcessor(String id) throws ElementNotFoun } protected DataSinkDescription getSink(String id) throws ElementNotFoundException { - DataSinkDescription result = getStorage() - .getDataSinkByAppId(id); - - if (result == null) { + try { + return getStorage() + .getDataSinkByAppId(id); + } catch (IllegalArgumentException e) { throw new ElementNotFoundException("Data stream " + id + " is not installed!"); } - - return result; } protected IPipelineElementDescriptionStorage getStorage() { diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineTemplate.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineTemplate.java index 74221b3a7f..43eb9234cb 100644 --- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineTemplate.java +++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineTemplate.java @@ -20,6 +20,7 @@ import org.apache.streampipes.manager.operations.Operations; import org.apache.streampipes.model.SpDataStream; import org.apache.streampipes.model.SpDataStreamContainer; +import org.apache.streampipes.model.message.Notifications; import org.apache.streampipes.model.pipeline.PipelineOperationStatus; import org.apache.streampipes.model.template.PipelineTemplateDescription; import org.apache.streampipes.model.template.PipelineTemplateInvocation; @@ -35,6 +36,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Path("/v2/pipeline-templates") public class PipelineTemplate extends AbstractAuthGuardedRestResource { @@ -60,11 +62,19 @@ public Response getPipelineTemplateInvocation(@QueryParam("streamId") String str @QueryParam("templateId") String pipelineTemplateId) { if (pipelineTemplateId != null) { SpDataStream dataStream = getDataStream(streamId); - PipelineTemplateDescription pipelineTemplateDescription = getPipelineTemplateDescription(pipelineTemplateId); - PipelineTemplateInvocation invocation = - Operations.getPipelineInvocationTemplate(dataStream, pipelineTemplateDescription); - PipelineTemplateInvocation clonedInvocation = new PipelineTemplateInvocation(invocation); - return ok(new PipelineTemplateInvocation(clonedInvocation)); + var pipelineTemplateDescriptionOpt = getPipelineTemplateDescription(pipelineTemplateId); + if (pipelineTemplateDescriptionOpt.isPresent()) { + PipelineTemplateInvocation invocation = + Operations.getPipelineInvocationTemplate(dataStream, pipelineTemplateDescriptionOpt.get()); + PipelineTemplateInvocation clonedInvocation = new PipelineTemplateInvocation(invocation); + return ok(new PipelineTemplateInvocation(clonedInvocation)); + } else { + return badRequest(Notifications.error( + String.format( + "Could not create pipeline template %s - did you install all pipeline elements?", + pipelineTemplateId.substring(pipelineTemplateId.lastIndexOf(".") + 1)) + )); + } } else { return fail(); } @@ -82,13 +92,12 @@ public Response generatePipeline(PipelineTemplateInvocation pipelineTemplateInvo } - private PipelineTemplateDescription getPipelineTemplateDescription(String pipelineTemplateId) { + private Optional getPipelineTemplateDescription(String pipelineTemplateId) { return Operations .getAllPipelineTemplates() .stream() .filter(pt -> pt.getAppId().equals(pipelineTemplateId)) - .findFirst() - .get(); + .findFirst(); } private List getAllDataStreams() { diff --git a/ui/src/app/connect/components/adapter-configuration/adapter-settings/adapter-settings.component.html b/ui/src/app/connect/components/adapter-configuration/adapter-settings/adapter-settings.component.html index 5fc8859486..1e28a38f7b 100644 --- a/ui/src/app/connect/components/adapter-configuration/adapter-settings/adapter-settings.component.html +++ b/ui/src/app/connect/components/adapter-configuration/adapter-settings/adapter-settings.component.html @@ -35,25 +35,23 @@ fxLayoutAlign="end center" *ngIf="availableTemplates && availableTemplates.length > 0" > - - Use template - - -- - + + Use template + - {{ template.templateName }} - - - + -- + + {{ template.templateName }} + + + + Adapter successfully updated *ngIf="adapterInstalled && !editMode" class="w-100" > +
+
+ warning +  {{ + templateErrorMessage.notifications[0].title + }} +
+
Adapter successfully updated >
Adapter successfully updated
, private adapterService: AdapterService, @@ -157,31 +160,41 @@ export class AdapterStartedDialog implements OnInit { adapter.correspondingDataStreamElementId, pipelineId, ) - .subscribe(res => { - const pipelineName = 'Persist ' + this.adapter.name; - - const indexName = this.adapter.name; - - const pipelineInvocation = PipelineInvocationBuilder.create( - res, - ) - .setName(pipelineName) - .setTemplateId(pipelineId) - .setFreeTextStaticProperty('db_measurement', indexName) - .setMappingPropertyUnary( - 'timestamp_mapping', - 's0::' + this.dataLakeTimestampField, - ) - .build(); - - this.pipelineTemplateService - .createPipelineTemplateInvocation(pipelineInvocation) - .subscribe(pipelineOperationStatus => { - this.pipelineOperationStatus = - pipelineOperationStatus; - this.startAdapter(message, adapterElementId); - }); - }); + .subscribe( + res => { + const pipelineName = 'Persist ' + this.adapter.name; + + const indexName = this.adapter.name; + + const pipelineInvocation = + PipelineInvocationBuilder.create(res) + .setName(pipelineName) + .setTemplateId(pipelineId) + .setFreeTextStaticProperty( + 'db_measurement', + indexName, + ) + .setMappingPropertyUnary( + 'timestamp_mapping', + 's0::' + this.dataLakeTimestampField, + ) + .build(); + + this.pipelineTemplateService + .createPipelineTemplateInvocation( + pipelineInvocation, + ) + .subscribe(pipelineOperationStatus => { + this.pipelineOperationStatus = + pipelineOperationStatus; + this.startAdapter(message, adapterElementId); + }); + }, + res => { + this.templateErrorMessage = res.error; + this.startAdapter(message, adapterElementId); + }, + ); }); } } diff --git a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.html b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.html index be883f96dd..4ac42a35b8 100644 --- a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.html +++ b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.html @@ -20,7 +20,6 @@