This is an automated email from the ASF dual-hosted git repository.
riemer pushed a commit to branch STREAMPIPES-319
in repository https://gitbox.apache.org/repos/asf/incubator-streampipes.git
The following commit(s) were added to refs/heads/STREAMPIPES-319 by this push:
new a8143fe [STREAMPIPES-319] Refactor data set invocation to support
service discovery
a8143fe is described below
commit a8143fe36df28fdb0674d813ddf5dd66f9c13a65
Author: Dominik Riemer <[email protected]>
AuthorDate: Fri Jul 16 11:48:50 2021 +0200
[STREAMPIPES-319] Refactor data set invocation to support service discovery
---
streampipes-backend/src/main/resources/shiro.ini | 2 +-
.../constants/GlobalStreamPipesConstants.java | 2 +
.../master/management/SourcesManagement.java | 14 +++---
.../container/master/rest/SourcesResource.java | 9 ++--
.../connect/container/master/util/Utils.java | 4 +-
.../master/management/SourcesManagementTest.java | 2 +-
.../org/apache/streampipes/model/SpDataSet.java | 9 ++++
.../ExtensionsServiceEndpointGenerator.java | 2 +-
.../manager/execution/http/GraphSubmitter.java | 16 +++++--
.../manager/execution/http/PipelineExecutor.java | 50 ++++++++++++++++++----
.../manager/setup/CouchDbInstallationStep.java | 2 +-
.../serializers/json/GsonSerializer.java | 2 +
12 files changed, 83 insertions(+), 31 deletions(-)
diff --git a/streampipes-backend/src/main/resources/shiro.ini
b/streampipes-backend/src/main/resources/shiro.ini
index 3d348a1..8851e0b 100644
--- a/streampipes-backend/src/main/resources/shiro.ini
+++ b/streampipes-backend/src/main/resources/shiro.ini
@@ -68,7 +68,7 @@ securityManager.rememberMeManager.cookie.maxAge = 1000000000
/api/v2/users/*/labeling/* = anon
/api/v2/users/*/labeling = anon
/api/v2/connect/*/master/administration = anon
-/api/v2/connect/*/master/sources/** = anon
+/api/v2/connect/master/sources/** = anon
/api/v2/connect/*/master/resolvable/*/configurations = anon
/api/openapi.json = anon
/api/** = authcBearer, customFilter
diff --git
a/streampipes-commons/src/main/java/org/apache/streampipes/commons/constants/GlobalStreamPipesConstants.java
b/streampipes-commons/src/main/java/org/apache/streampipes/commons/constants/GlobalStreamPipesConstants.java
index b1e2230..c706245 100644
---
a/streampipes-commons/src/main/java/org/apache/streampipes/commons/constants/GlobalStreamPipesConstants.java
+++
b/streampipes-commons/src/main/java/org/apache/streampipes/commons/constants/GlobalStreamPipesConstants.java
@@ -22,4 +22,6 @@ public class GlobalStreamPipesConstants {
public static final String STD_ICON_NAME = "icon.png";
public static final String STD_DOCUMENTATION_NAME = "documentation.md";
+ public static final String CONNECT_MASTER_SOURCES_ENDPOINT =
"/streampipes-backend/api/v2/connect/master/sources/";
+
}
diff --git
a/streampipes-connect-container-master/src/main/java/org/apache/streampipes/connect/container/master/management/SourcesManagement.java
b/streampipes-connect-container-master/src/main/java/org/apache/streampipes/connect/container/master/management/SourcesManagement.java
index bba0366..34f2457 100644
---
a/streampipes-connect-container-master/src/main/java/org/apache/streampipes/connect/container/master/management/SourcesManagement.java
+++
b/streampipes-connect-container-master/src/main/java/org/apache/streampipes/connect/container/master/management/SourcesManagement.java
@@ -19,10 +19,9 @@
package org.apache.streampipes.connect.container.master.management;
import
org.apache.streampipes.commons.exceptions.NoServiceEndpointsAvailableException;
-import org.apache.streampipes.connect.api.exception.AdapterException;
import org.apache.streampipes.connect.adapter.util.TransportFormatGenerator;
+import org.apache.streampipes.connect.api.exception.AdapterException;
import
org.apache.streampipes.connect.container.master.util.AdapterEncryptionService;
-import org.apache.streampipes.connect.container.master.util.Utils;
import org.apache.streampipes.container.html.JSONGenerator;
import org.apache.streampipes.container.html.model.DataSourceDescriptionHtml;
import org.apache.streampipes.container.html.model.Description;
@@ -61,10 +60,10 @@ public class SourcesManagement {
this.workerUrlProvider = new WorkerUrlProvider();
}
- public void addAdapter(String streamId, SpDataSet dataSet, String
username) throws AdapterException, NoServiceEndpointsAvailableException {
+ public void addAdapter(String streamId, SpDataSet dataSet) throws
AdapterException, NoServiceEndpointsAvailableException {
- String newUrl = getAdapterUrl(streamId, username);
+ String newUrl = getAdapterUrl(streamId);
AdapterSetDescription adapterDescription = (AdapterSetDescription)
getAdapterDescriptionById(streamId);
adapterDescription.setDataSet(dataSet);
@@ -85,11 +84,11 @@ public class SourcesManagement {
adapterDescription.setUri(newId);
adapterDescription.setId(newId);
- String newUrl = getAdapterUrl(streamId, username);
+ String newUrl = getAdapterUrl(streamId);
WorkerRestClient.stopSetAdapter(newUrl, adapterDescription);
}
- private String getAdapterUrl(String streamId, String username) throws
NoServiceEndpointsAvailableException {
+ private String getAdapterUrl(String streamId) throws
NoServiceEndpointsAvailableException {
String appId = "";
List<AdapterDescription> adapterDescriptions =
this.adapterStorage.getAllAdapters();
for (AdapterDescription ad : adapterDescriptions) {
@@ -97,9 +96,8 @@ public class SourcesManagement {
appId = ad.getAppId();
}
}
- String workerUrl = workerUrlProvider.getWorkerBaseUrl(appId);
- return Utils.addUserNameToApi(workerUrl, username);
+ return workerUrlProvider.getWorkerBaseUrl(appId);
}
diff --git
a/streampipes-connect-container-master/src/main/java/org/apache/streampipes/connect/container/master/rest/SourcesResource.java
b/streampipes-connect-container-master/src/main/java/org/apache/streampipes/connect/container/master/rest/SourcesResource.java
index 7d5e678..3d6a67a 100644
---
a/streampipes-connect-container-master/src/main/java/org/apache/streampipes/connect/container/master/rest/SourcesResource.java
+++
b/streampipes-connect-container-master/src/main/java/org/apache/streampipes/connect/container/master/rest/SourcesResource.java
@@ -32,7 +32,7 @@ import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-@Path("/v2/connect/{username}/master/sources")
+@Path("/v2/connect/master/sources")
public class SourcesResource extends
AbstractAdapterResource<SourcesManagement> {
private static final Logger LOG =
LoggerFactory.getLogger(SourcesResource.class);
@@ -73,13 +73,12 @@ public class SourcesResource extends
AbstractAdapterResource<SourcesManagement>
@Path("/{streamId}")
@Produces(MediaType.APPLICATION_JSON)
public Response addAdapter(@PathParam("streamId") String elementId,
- @PathParam("username") String username,
SpDataSet dataSet) {
String responseMessage = "Instance of data set " + dataSet.getUri() +
" successfully started";
try {
- managementService.addAdapter(elementId, dataSet, username);
+ managementService.addAdapter(elementId, dataSet);
} catch (AdapterException | NoServiceEndpointsAvailableException e) {
LOG.error("Could not set data set instance: " + dataSet.getUri(),
e);
return ok(Notifications.error("Could not set data set instance: "
+ dataSet.getUri()));
@@ -91,7 +90,9 @@ public class SourcesResource extends
AbstractAdapterResource<SourcesManagement>
@DELETE
@Path("/{streamId}/{runningInstanceId}")
@Produces(MediaType.APPLICATION_JSON)
- public Response detach(@PathParam("streamId") String elementId,
@PathParam("runningInstanceId") String runningInstanceId,
@PathParam("username") String username) {
+ public Response detach(@PathParam("streamId") String elementId,
+ @PathParam("runningInstanceId") String
runningInstanceId,
+ @PathParam("username") String username) {
String responseMessage = "Instance of set id: " + elementId + " with
instance id: "+ runningInstanceId + " successfully started";
// String workerUrl = new Utils().getWorkerUrlById(elementId);
diff --git
a/streampipes-connect-container-master/src/main/java/org/apache/streampipes/connect/container/master/util/Utils.java
b/streampipes-connect-container-master/src/main/java/org/apache/streampipes/connect/container/master/util/Utils.java
index 846944f..3ba2b94 100644
---
a/streampipes-connect-container-master/src/main/java/org/apache/streampipes/connect/container/master/util/Utils.java
+++
b/streampipes-connect-container-master/src/main/java/org/apache/streampipes/connect/container/master/util/Utils.java
@@ -21,8 +21,8 @@ package org.apache.streampipes.connect.container.master.util;
public class Utils {
public static String addUserNameToApi(String url, String userName) {
- //return url;
- return url + "/api/v1/" + userName + "/";
+ return url;
+ //return url + "/api/v1/" + userName + "/";
}
diff --git
a/streampipes-connect-container-master/src/test/java/org/apache/streampipes/connect/container/master/management/SourcesManagementTest.java
b/streampipes-connect-container-master/src/test/java/org/apache/streampipes/connect/container/master/management/SourcesManagementTest.java
index a11fa93..d06ab34 100644
---
a/streampipes-connect-container-master/src/test/java/org/apache/streampipes/connect/container/master/management/SourcesManagementTest.java
+++
b/streampipes-connect-container-master/src/test/java/org/apache/streampipes/connect/container/master/management/SourcesManagementTest.java
@@ -61,7 +61,7 @@ public class SourcesManagementTest {
SourcesManagement sourcesManagement = new
SourcesManagement(adapterStorage);
doNothing().when(WorkerRestClient.class, "invokeSetAdapter",
anyString(), any());
- sourcesManagement.addAdapter(ID, new SpDataSet(), "user");
+ sourcesManagement.addAdapter(ID, new SpDataSet());
verify(adapterStorage, times(1)).getAllAdapters();
verifyStatic(WorkerRestClient.class, times(1));
diff --git
a/streampipes-model/src/main/java/org/apache/streampipes/model/SpDataSet.java
b/streampipes-model/src/main/java/org/apache/streampipes/model/SpDataSet.java
index 66bf4d2..13abd82 100644
---
a/streampipes-model/src/main/java/org/apache/streampipes/model/SpDataSet.java
+++
b/streampipes-model/src/main/java/org/apache/streampipes/model/SpDataSet.java
@@ -32,6 +32,7 @@ public class SpDataSet extends SpDataStream {
private String datasetInvocationId;
private String correspondingPipeline;
+ private String selectedEndpointUrl;
public SpDataSet(String uri, String name, String description, String
iconUrl, List<EventStreamQualityDefinition>
hasEventStreamQualities,
@@ -98,4 +99,12 @@ public class SpDataSet extends SpDataStream {
public void setCorrespondingPipeline(String correspondingPipeline) {
this.correspondingPipeline = correspondingPipeline;
}
+
+ public String getSelectedEndpointUrl() {
+ return selectedEndpointUrl;
+ }
+
+ public void setSelectedEndpointUrl(String selectedEndpointUrl) {
+ this.selectedEndpointUrl = selectedEndpointUrl;
+ }
}
diff --git
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/endpoint/ExtensionsServiceEndpointGenerator.java
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/endpoint/ExtensionsServiceEndpointGenerator.java
index 507226d..b3feb3b 100644
---
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/endpoint/ExtensionsServiceEndpointGenerator.java
+++
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/endpoint/ExtensionsServiceEndpointGenerator.java
@@ -64,7 +64,7 @@ public class ExtensionsServiceEndpointGenerator {
if (serviceEndpoints.size() > 0) {
return getServiceEndpoints().get(0);
} else {
- LOG.error("Could not find any service endpoints for appId {}, serviceTag
{}", appId, this.spServiceUrlProvider.getServiceTag(appId));
+ LOG.error("Could not find any service endpoints for appId {}, serviceTag
{}", appId, this.spServiceUrlProvider.getServiceTag(appId).asString());
throw new NoServiceEndpointsAvailableException("Could not find any
matching service endpoints");
}
}
diff --git
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/GraphSubmitter.java
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/GraphSubmitter.java
index 5b3f34c..8074b4d 100644
---
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/GraphSubmitter.java
+++
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/GraphSubmitter.java
@@ -60,7 +60,7 @@ public class GraphSubmitter {
if
(status.getElementStatus().stream().allMatch(PipelineElementStatus::isSuccess))
{
dataSets.forEach(dataSet ->
status.addPipelineElementStatus
- (new HttpRequestBuilder(dataSet,
dataSet.getUri()).invoke()));
+ (performInvocation(dataSet)));
}
status.setSuccess(status.getElementStatus().stream().allMatch(PipelineElementStatus::isSuccess));
@@ -96,9 +96,7 @@ public class GraphSubmitter {
status.setPipelineName(pipelineName);
graphs.forEach(g -> status.addPipelineElementStatus(performDetach(g)));
- dataSets.forEach(dataSet -> status.addPipelineElementStatus(new
HttpRequestBuilder(dataSet, dataSet.getUri() +
- "/" +dataSet.getDatasetInvocationId())
- .detach()));
+ dataSets.forEach(dataSet ->
status.addPipelineElementStatus(performDetach(dataSet)));
status.setSuccess(status.getElementStatus().stream().allMatch(PipelineElementStatus::isSuccess));
if (status.isSuccess()) {
@@ -115,8 +113,18 @@ public class GraphSubmitter {
return new HttpRequestBuilder(entity, endpointUrl).invoke();
}
+ private PipelineElementStatus performInvocation(SpDataSet dataset) {
+ String endpointUrl = dataset.getSelectedEndpointUrl();
+ return new HttpRequestBuilder(dataset, endpointUrl).invoke();
+ }
+
private PipelineElementStatus performDetach(InvocableStreamPipesEntity
entity) {
String endpointUrl = entity.getSelectedEndpointUrl() + "/" +
InstanceIdExtractor.extractId(entity.getElementId());
return new HttpRequestBuilder(entity, endpointUrl).detach();
}
+
+ private PipelineElementStatus performDetach(SpDataSet dataset) {
+ String endpointUrl = dataset.getSelectedEndpointUrl() + "/" +
dataset.getDatasetInvocationId();
+ return new HttpRequestBuilder(dataset, endpointUrl).detach();
+ }
}
diff --git
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/PipelineExecutor.java
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/PipelineExecutor.java
index ad4d430..85553b2 100644
---
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/PipelineExecutor.java
+++
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/PipelineExecutor.java
@@ -18,6 +18,7 @@
package org.apache.streampipes.manager.execution.http;
+import org.apache.streampipes.commons.constants.GlobalStreamPipesConstants;
import
org.apache.streampipes.commons.exceptions.NoServiceEndpointsAvailableException;
import
org.apache.streampipes.manager.execution.endpoint.ExtensionsServiceEndpointGenerator;
import
org.apache.streampipes.manager.execution.endpoint.ExtensionsServiceEndpointUtils;
@@ -26,6 +27,7 @@ import org.apache.streampipes.manager.secret.SecretProvider;
import org.apache.streampipes.manager.util.TemporaryGraphStorage;
import org.apache.streampipes.model.SpDataSet;
import org.apache.streampipes.model.base.InvocableStreamPipesEntity;
+import org.apache.streampipes.model.base.NamedStreamPipesEntity;
import org.apache.streampipes.model.graph.DataProcessorInvocation;
import org.apache.streampipes.model.graph.DataSinkInvocation;
import org.apache.streampipes.model.grounding.KafkaTransportProtocol;
@@ -37,12 +39,13 @@ import
org.apache.streampipes.model.pipeline.PipelineHealthStatus;
import org.apache.streampipes.model.pipeline.PipelineOperationStatus;
import org.apache.streampipes.storage.api.IPipelineStorage;
import org.apache.streampipes.storage.management.StorageDispatcher;
+import org.apache.streampipes.svcdiscovery.SpServiceDiscovery;
+import org.apache.streampipes.svcdiscovery.api.model.DefaultSpServiceGroups;
+import org.apache.streampipes.svcdiscovery.api.model.DefaultSpServiceTags;
+import org.apache.streampipes.svcdiscovery.api.model.SpServiceUrlProvider;
import org.lightcouch.DocumentConflictException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
import java.util.stream.Collectors;
public class PipelineExecutor {
@@ -73,12 +76,23 @@ public class PipelineExecutor {
List<DataProcessorInvocation> sepas = pipeline.getSepas();
List<DataSinkInvocation> secs = pipeline.getActions();
- List<SpDataSet> dataSets = pipeline.getStreams().stream().filter(s -> s
instanceof SpDataSet).map(s -> new
- SpDataSet((SpDataSet) s)).collect(Collectors.toList());
+ List<SpDataSet> dataSets = pipeline
+ .getStreams()
+ .stream()
+ .filter(s -> s instanceof SpDataSet)
+ .map(s -> new SpDataSet((SpDataSet) s))
+ .collect(Collectors.toList());
+
+ List<NamedStreamPipesEntity> failedServices = new ArrayList<>();
- for (SpDataSet ds : dataSets) {
+ dataSets.forEach(ds -> {
ds.setCorrespondingPipeline(pipeline.getPipelineId());
- }
+ try {
+ ds.setSelectedEndpointUrl(findSelectedEndpoint(ds));
+ } catch (NoServiceEndpointsAvailableException e) {
+ failedServices.add(ds);
+ }
+ });
List<InvocableStreamPipesEntity> graphs = new ArrayList<>();
graphs.addAll(sepas);
@@ -86,7 +100,6 @@ public class PipelineExecutor {
decryptSecrets(graphs);
- List<InvocableStreamPipesEntity> failedServices = new ArrayList<>();
graphs.forEach(g -> {
try {
g.setSelectedEndpointUrl(findSelectedEndpoint(g));
@@ -136,6 +149,25 @@ public class PipelineExecutor {
.getEndpointResourceUrl();
}
+ private String findSelectedEndpoint(SpDataSet ds) throws
NoServiceEndpointsAvailableException {
+ String appId = ds.getAppId() != null ? ds.getAppId() :
ds.getCorrespondingAdapterId();
+ if (ds.isInternallyManaged()) {
+ return getConnectMasterSourcesUrl(ds.getElementId());
+ } else {
+ return new ExtensionsServiceEndpointGenerator(appId,
SpServiceUrlProvider.DATA_SET)
+ .getEndpointResourceUrl();
+ }
+ }
+
+ private String getConnectMasterSourcesUrl(String elementId) throws
NoServiceEndpointsAvailableException {
+ List<String> connectMasterEndpoints =
SpServiceDiscovery.getServiceDiscovery().getServiceEndpoints(DefaultSpServiceGroups.CORE,
true,
Collections.singletonList(DefaultSpServiceTags.CONNECT_MASTER.asString()));
+ if (connectMasterEndpoints.size() > 0) {
+ return connectMasterEndpoints.get(0) +
GlobalStreamPipesConstants.CONNECT_MASTER_SOURCES_ENDPOINT + elementId;
+ } else {
+ throw new NoServiceEndpointsAvailableException("Could not find any
available connect master service endpoint");
+ }
+ }
+
private void updateGroupIds(InvocableStreamPipesEntity entity) {
entity.getInputStreams()
.stream()
diff --git
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/CouchDbInstallationStep.java
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/CouchDbInstallationStep.java
index 7c29181..e481c14 100644
---
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/CouchDbInstallationStep.java
+++
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/CouchDbInstallationStep.java
@@ -32,7 +32,7 @@ import java.util.*;
public class CouchDbInstallationStep implements InstallationStep {
private static List<String> initRdfEndpointPorts =
-
Collections.singletonList("8099/api/v1/[email protected]/master/sources/");
+ Collections.singletonList("8099/api/v1/master/sources/");
private static final String initRdfEndpointHost = "http://localhost:";
private static final String PREPARING_NOTIFICATIONS_TEXT = "Preparing
database " +
diff --git
a/streampipes-serializers-json/src/main/java/org/apache/streampipes/serializers/json/GsonSerializer.java
b/streampipes-serializers-json/src/main/java/org/apache/streampipes/serializers/json/GsonSerializer.java
index 45114a9..bde286b 100644
---
a/streampipes-serializers-json/src/main/java/org/apache/streampipes/serializers/json/GsonSerializer.java
+++
b/streampipes-serializers-json/src/main/java/org/apache/streampipes/serializers/json/GsonSerializer.java
@@ -86,6 +86,8 @@ public class GsonSerializer {
builder.registerTypeAdapterFactory(RuntimeTypeAdapterFactory.of(SpDataStream.class,
"sourceType")
.registerSubtype(SpDataSet.class,
"org.apache.streampipes.model.SpDataSet")
.registerSubtype(SpDataStream.class,
"org.apache.streampipes.model.SpDataStream"));
+
builder.registerTypeAdapterFactory(RuntimeTypeAdapterFactory.of(SpDataSet.class,
"sourceType")
+ .registerSubtype(SpDataSet.class,
"org.apache.streampipes.model.SpDataSet"));
builder.registerTypeAdapterFactory(RuntimeTypeAdapterFactory.of(TransformationRuleDescription.class,
"sourceType")
.registerSubtype(RenameRuleDescription.class,
"org.apache.streampipes.model.RenameRuleDescription")