Skip to content

Commit

Permalink
Move pipeline-processor and map-widget REST resources out of /plugins…
Browse files Browse the repository at this point in the history
… prefix (#4607)

* Move pipelineprocessor and map-widget REST resources out of /plugins

* Move hardcoded urls to ApiRoutes

The pipeline urls were hardcoded in the stores. Move them to
ApiRoutes.

* Convert RestControllerPackage to an auto-value

We are using it in a Set so we need properly implemented comparision
methods.

* Add changed HTTP API paths to UPGRADING

* Use correct ApiRoutes function

- To update a pipeline we should use ApiRoutes.PipelinesController.update
  instead of .get. Both works, but this way it is consistent.
  • Loading branch information
bernd authored and edmundoa committed Feb 26, 2018
1 parent 3ebaf88 commit 0894f13
Show file tree
Hide file tree
Showing 15 changed files with 133 additions and 56 deletions.
28 changes: 28 additions & 0 deletions UPGRADING.rst
Expand Up @@ -112,3 +112,31 @@ Starting with Graylog 3.0.0, the following official plugins were merged into the
That means these plugins are not available as separate plugins anymore. If you manually update your Graylog installation (without using operating system packages), make sure to remove all old plugin files from the `plugin_dir <http://docs.graylog.org/en/3.0/pages/configuration/server.conf.html>`_ folder. That means these plugins are not available as separate plugins anymore. If you manually update your Graylog installation (without using operating system packages), make sure to remove all old plugin files from the `plugin_dir <http://docs.graylog.org/en/3.0/pages/configuration/server.conf.html>`_ folder.


The old issues in these repositories are still available for reference but new issues should only be created in the `Graylog server issue tracker <https://github.com/Graylog2/graylog2-server/issues>`_. The old issues in these repositories are still available for reference but new issues should only be created in the `Graylog server issue tracker <https://github.com/Graylog2/graylog2-server/issues>`_.

The following HTTP API paths changed due to the plugin merge:

+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| Old Path | New Path |
+=============================================================================================+===============================================+
| ``/plugins/org.graylog.plugins.map/mapdata`` | ``/search/mapdata`` |
+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| ``/plugins/org.graylog.plugins.pipelineprocessor/system/pipelines/pipeline`` | ``/system/pipelines/pipeline`` |
+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| ``/plugins/org.graylog.plugins.pipelineprocessor/system/pipelines/pipeline/parse`` | ``/system/pipelines/pipeline/parse`` |
+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| ``/plugins/org.graylog.plugins.pipelineprocessor/system/pipelines/rule`` | ``/system/pipelines/rule`` |
+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| ``/plugins/org.graylog.plugins.pipelineprocessor/system/pipelines/rule/functions`` | ``/system/pipelines/rule/functions`` |
+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| ``/plugins/org.graylog.plugins.pipelineprocessor/system/pipelines/rule/multiple`` | ``/system/pipelines/rule/multiple`` |
+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| ``/plugins/org.graylog.plugins.pipelineprocessor/system/pipelines/rule/parse`` | ``/system/pipelines/rule/parse`` |
+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| ``/plugins/org.graylog.plugins.pipelineprocessor/system/pipelines/connections`` | ``/system/pipelines/connections`` |
+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| ``/plugins/org.graylog.plugins.pipelineprocessor/system/pipelines/connections/to_stream`` | ``/system/pipelines/connections/to_stream`` |
+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| ``/plugins/org.graylog.plugins.pipelineprocessor/system/pipelines/connections/to_pipeline`` | ``/system/pipelines/connections/to_pipeline`` |
+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| ``/plugins/org.graylog.plugins.pipelineprocessor/system/pipelines/simulate`` | ``/system/pipelines/simulate`` |
+---------------------------------------------------------------------------------------------+-----------------------------------------------+
Expand Up @@ -18,7 +18,6 @@


import org.graylog.plugins.map.geoip.MaxmindDataAdapter; import org.graylog.plugins.map.geoip.MaxmindDataAdapter;
import org.graylog.plugins.map.geoip.processor.GeoIpProcessor; import org.graylog.plugins.map.geoip.processor.GeoIpProcessor;
import org.graylog.plugins.map.rest.MapDataResource;
import org.graylog.plugins.map.widget.strategy.MapWidgetStrategy; import org.graylog.plugins.map.widget.strategy.MapWidgetStrategy;
import org.graylog2.plugin.PluginModule; import org.graylog2.plugin.PluginModule;


Expand All @@ -27,7 +26,7 @@ public class MapWidgetModule extends PluginModule {
protected void configure() { protected void configure() {
addMessageProcessor(GeoIpProcessor.class, GeoIpProcessor.Descriptor.class); addMessageProcessor(GeoIpProcessor.class, GeoIpProcessor.Descriptor.class);
addWidgetStrategy(MapWidgetStrategy.class, MapWidgetStrategy.Factory.class); addWidgetStrategy(MapWidgetStrategy.class, MapWidgetStrategy.Factory.class);
addRestResource(MapDataResource.class); registerRestControllerPackage(getClass().getPackage().getName());


installLookupDataAdapter(MaxmindDataAdapter.NAME, installLookupDataAdapter(MaxmindDataAdapter.NAME,
MaxmindDataAdapter.class, MaxmindDataAdapter.class,
Expand Down
Expand Up @@ -47,7 +47,7 @@


@RequiresAuthentication @RequiresAuthentication
@Api(value = "MapWidget", description = "Get map data") @Api(value = "MapWidget", description = "Get map data")
@Path("/mapdata") @Path("/search/mapdata")
public class MapDataResource extends SearchResource implements PluginRestResource { public class MapDataResource extends SearchResource implements PluginRestResource {
private static final Logger LOG = LoggerFactory.getLogger(MapDataResource.class); private static final Logger LOG = LoggerFactory.getLogger(MapDataResource.class);


Expand Down
Expand Up @@ -17,34 +17,23 @@
package org.graylog.plugins.pipelineprocessor; package org.graylog.plugins.pipelineprocessor;


import com.google.inject.assistedinject.FactoryModuleBuilder; import com.google.inject.assistedinject.FactoryModuleBuilder;

import org.graylog.plugins.pipelineprocessor.audit.PipelineProcessorAuditEventTypes; import org.graylog.plugins.pipelineprocessor.audit.PipelineProcessorAuditEventTypes;
import org.graylog.plugins.pipelineprocessor.functions.ProcessorFunctionsModule; import org.graylog.plugins.pipelineprocessor.functions.ProcessorFunctionsModule;
import org.graylog.plugins.pipelineprocessor.periodical.LegacyDefaultStreamMigration; import org.graylog.plugins.pipelineprocessor.periodical.LegacyDefaultStreamMigration;
import org.graylog.plugins.pipelineprocessor.processors.PipelineInterpreter; import org.graylog.plugins.pipelineprocessor.processors.PipelineInterpreter;
import org.graylog.plugins.pipelineprocessor.rest.PipelineConnectionsResource;
import org.graylog.plugins.pipelineprocessor.rest.PipelineResource;
import org.graylog.plugins.pipelineprocessor.rest.PipelineRestPermissions; import org.graylog.plugins.pipelineprocessor.rest.PipelineRestPermissions;
import org.graylog.plugins.pipelineprocessor.rest.RuleResource;
import org.graylog.plugins.pipelineprocessor.rest.SimulatorResource;
import org.graylog2.plugin.PluginConfigBean;
import org.graylog2.plugin.PluginModule; import org.graylog2.plugin.PluginModule;


import java.util.Collections;
import java.util.Set;

public class PipelineProcessorModule extends PluginModule { public class PipelineProcessorModule extends PluginModule {
@Override @Override
protected void configure() { protected void configure() {
addPeriodical(LegacyDefaultStreamMigration.class); addPeriodical(LegacyDefaultStreamMigration.class);


addMessageProcessor(PipelineInterpreter.class, PipelineInterpreter.Descriptor.class); addMessageProcessor(PipelineInterpreter.class, PipelineInterpreter.Descriptor.class);
addRestResource(RuleResource.class);
addRestResource(PipelineResource.class);
addRestResource(PipelineConnectionsResource.class);
addRestResource(SimulatorResource.class);
addPermissions(PipelineRestPermissions.class); addPermissions(PipelineRestPermissions.class);


registerRestControllerPackage(getClass().getPackage().getName());

install(new ProcessorFunctionsModule()); install(new ProcessorFunctionsModule());


installSearchResponseDecorator(searchResponseDecoratorBinder(), installSearchResponseDecorator(searchResponseDecoratorBinder(),
Expand Down
Expand Up @@ -37,7 +37,6 @@
import org.graylog2.bindings.providers.SystemJobManagerProvider; import org.graylog2.bindings.providers.SystemJobManagerProvider;
import org.graylog2.bundles.BundleService; import org.graylog2.bundles.BundleService;
import org.graylog2.cluster.ClusterConfigServiceImpl; import org.graylog2.cluster.ClusterConfigServiceImpl;
import org.graylog2.users.UserPermissionsCleanupListener;
import org.graylog2.dashboards.widgets.WidgetCacheTime; import org.graylog2.dashboards.widgets.WidgetCacheTime;
import org.graylog2.dashboards.widgets.WidgetEventsListener; import org.graylog2.dashboards.widgets.WidgetEventsListener;
import org.graylog2.database.MongoConnection; import org.graylog2.database.MongoConnection;
Expand Down Expand Up @@ -94,12 +93,11 @@
import org.graylog2.users.RoleServiceImpl; import org.graylog2.users.RoleServiceImpl;
import org.graylog2.users.StartPageCleanupListener; import org.graylog2.users.StartPageCleanupListener;
import org.graylog2.users.UserImpl; import org.graylog2.users.UserImpl;
import org.graylog2.users.UserPermissionsCleanupListener;


import javax.ws.rs.container.DynamicFeature; import javax.ws.rs.container.DynamicFeature;
import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.ExceptionMapper;


import static com.google.inject.name.Names.named;

public class ServerBindings extends Graylog2Module { public class ServerBindings extends Graylog2Module {
private final Configuration configuration; private final Configuration configuration;


Expand Down Expand Up @@ -174,10 +172,8 @@ private void bindSingletons() {
bind(Engine.class).toInstance(Engine.createEngine()); bind(Engine.class).toInstance(Engine.createEngine());
bind(ErrorPageGenerator.class).to(GraylogErrorPageGenerator.class).asEagerSingleton(); bind(ErrorPageGenerator.class).to(GraylogErrorPageGenerator.class).asEagerSingleton();


bind(String[].class).annotatedWith(named("RestControllerPackages")).toInstance(new String[]{ registerRestControllerPackage("org.graylog2.rest.resources");
"org.graylog2.rest.resources", registerRestControllerPackage("org.graylog2.shared.rest.resources");
"org.graylog2.shared.rest.resources"
});
} }


private void bindInterfaces() { private void bindInterfaces() {
Expand Down
Expand Up @@ -440,4 +440,9 @@ private static class DynamicFeatureType extends TypeLiteral<Class<? extends Dyna
private static class ContainerResponseFilterType extends TypeLiteral<Class<? extends ContainerResponseFilter>> {} private static class ContainerResponseFilterType extends TypeLiteral<Class<? extends ContainerResponseFilter>> {}


private static class ExceptionMapperType extends TypeLiteral<Class<? extends ExceptionMapper>> {} private static class ExceptionMapperType extends TypeLiteral<Class<? extends ExceptionMapper>> {}

protected void registerRestControllerPackage(String packageName) {
final Multibinder<RestControllerPackage> restControllerPackages = Multibinder.newSetBinder(binder(), RestControllerPackage.class);
restControllerPackages.addBinding().toInstance(RestControllerPackage.create(packageName));
}
} }
@@ -0,0 +1,28 @@
/**
* This file is part of Graylog.
*
* Graylog is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Graylog is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Graylog. If not, see <http://www.gnu.org/licenses/>.
*/
package org.graylog2.plugin.inject;

import com.google.auto.value.AutoValue;

@AutoValue
public abstract class RestControllerPackage {
public abstract String name();

public static RestControllerPackage create(String name) {
return new AutoValue_RestControllerPackage(name);
}
}
Expand Up @@ -39,6 +39,7 @@
import org.graylog2.audit.jersey.AuditEventModelProcessor; import org.graylog2.audit.jersey.AuditEventModelProcessor;
import org.graylog2.configuration.HttpConfiguration; import org.graylog2.configuration.HttpConfiguration;
import org.graylog2.jersey.PrefixAddingModelProcessor; import org.graylog2.jersey.PrefixAddingModelProcessor;
import org.graylog2.plugin.inject.RestControllerPackage;
import org.graylog2.plugin.rest.PluginRestResource; import org.graylog2.plugin.rest.PluginRestResource;
import org.graylog2.rest.filter.WebAppNotFoundResponseFilter; import org.graylog2.rest.filter.WebAppNotFoundResponseFilter;
import org.graylog2.shared.rest.CORSFilter; import org.graylog2.shared.rest.CORSFilter;
Expand Down Expand Up @@ -94,7 +95,7 @@ public class JerseyService extends AbstractIdleService {


private final HttpConfiguration configuration; private final HttpConfiguration configuration;
private final Map<String, Set<Class<? extends PluginRestResource>>> pluginRestResources; private final Map<String, Set<Class<? extends PluginRestResource>>> pluginRestResources;
private final String[] restControllerPackages; private final Set<RestControllerPackage> restControllerPackages;


private final Set<Class<? extends DynamicFeature>> dynamicFeatures; private final Set<Class<? extends DynamicFeature>> dynamicFeatures;
private final Set<Class<? extends ContainerResponseFilter>> containerResponseFilters; private final Set<Class<? extends ContainerResponseFilter>> containerResponseFilters;
Expand All @@ -114,7 +115,7 @@ public JerseyService(final HttpConfiguration configuration,
Set<Class<? extends ExceptionMapper>> exceptionMappers, Set<Class<? extends ExceptionMapper>> exceptionMappers,
@Named("additionalJerseyComponents") final Set<Class> additionalComponents, @Named("additionalJerseyComponents") final Set<Class> additionalComponents,
final Map<String, Set<Class<? extends PluginRestResource>>> pluginRestResources, final Map<String, Set<Class<? extends PluginRestResource>>> pluginRestResources,
@Named("RestControllerPackages") final String[] restControllerPackages, final Set<RestControllerPackage> restControllerPackages,
Set<PluginAuditEventTypes> pluginAuditEventTypes, Set<PluginAuditEventTypes> pluginAuditEventTypes,
ObjectMapper objectMapper, ObjectMapper objectMapper,
MetricRegistry metricRegistry, MetricRegistry metricRegistry,
Expand Down Expand Up @@ -154,7 +155,9 @@ private void shutdownHttpServer(HttpServer httpServer, HostAndPort bindAddress)


private void startUpApi() throws Exception { private void startUpApi() throws Exception {
final List<String> resourcePackages = ImmutableList.<String>builder() final List<String> resourcePackages = ImmutableList.<String>builder()
.add(restControllerPackages) .addAll(restControllerPackages.stream()
.map(RestControllerPackage::name)
.collect(Collectors.toList()))
.add(RESOURCE_PACKAGE_WEB) .add(RESOURCE_PACKAGE_WEB)
.build(); .build();


Expand Down
Expand Up @@ -23,14 +23,14 @@
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
import org.graylog2.configuration.HttpConfiguration; import org.graylog2.configuration.HttpConfiguration;
import org.graylog2.plugin.inject.RestControllerPackage;
import org.graylog2.plugin.rest.PluginRestResource; import org.graylog2.plugin.rest.PluginRestResource;
import org.graylog2.rest.RestTools; import org.graylog2.rest.RestTools;
import org.graylog2.shared.plugins.PluginRestResourceClasses; import org.graylog2.shared.plugins.PluginRestResourceClasses;
import org.graylog2.shared.rest.documentation.generator.Generator; import org.graylog2.shared.rest.documentation.generator.Generator;
import org.graylog2.shared.rest.resources.RestResource; import org.graylog2.shared.rest.resources.RestResource;


import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
Expand All @@ -43,6 +43,7 @@
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;


import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import static org.graylog2.shared.initializers.JerseyService.PLUGIN_PREFIX; import static org.graylog2.shared.initializers.JerseyService.PLUGIN_PREFIX;
Expand All @@ -56,14 +57,16 @@ public class DocumentationResource extends RestResource {


@Inject @Inject
public DocumentationResource(HttpConfiguration httpConfiguration, public DocumentationResource(HttpConfiguration httpConfiguration,
@Named("RestControllerPackages") String[] restControllerPackages, Set<RestControllerPackage> restControllerPackages,
ObjectMapper objectMapper, ObjectMapper objectMapper,
PluginRestResourceClasses pluginRestResourceClasses) { PluginRestResourceClasses pluginRestResourceClasses) {


this.httpConfiguration = requireNonNull(httpConfiguration, "httpConfiguration"); this.httpConfiguration = requireNonNull(httpConfiguration, "httpConfiguration");


final ImmutableSet.Builder<String> packageNames = ImmutableSet.<String>builder() final ImmutableSet.Builder<String> packageNames = ImmutableSet.<String>builder()
.add(restControllerPackages); .addAll(restControllerPackages.stream()
.map(RestControllerPackage::name)
.collect(Collectors.toList()));


// All plugin resources get the plugin prefix + the plugin package. // All plugin resources get the plugin prefix + the plugin package.
final Map<Class<?>, String> pluginRestControllerMapping = new HashMap<>(); final Map<Class<?>, String> pluginRestControllerMapping = new HashMap<>();
Expand Down
29 changes: 29 additions & 0 deletions graylog2-web-interface/src/routing/ApiRoutes.js
Expand Up @@ -337,6 +337,35 @@ const ApiRoutes = {
parse: () => { return { url: '/messages/parse' }; }, parse: () => { return { url: '/messages/parse' }; },
single: (index, messageId) => { return { url: `/messages/${index}/${messageId}` }; }, single: (index, messageId) => { return { url: `/messages/${index}/${messageId}` }; },
}, },
MapDataController: {
search: () => { return { url: '/search/mapdata' }; },
},
PipelinesController: {
list: () => { return { url: '/system/pipelines/pipeline' }; },
create: () => { return { url: '/system/pipelines/pipeline' }; },
get: (pipelineId) => { return { url: `/system/pipelines/pipeline/${pipelineId}` }; },
update: (pipelineId) => { return { url: `/system/pipelines/pipeline/${pipelineId}` }; },
delete: (pipelineId) => { return { url: `/system/pipelines/pipeline/${pipelineId}` }; },
parse: () => { return { url: '/system/pipelines/pipeline/parse' }; },
},
RulesController: {
list: () => { return { url: '/system/pipelines/rule' }; },
create: () => { return { url: '/system/pipelines/rule' }; },
get: (ruleId) => { return { url: `/system/pipelines/rule/${ruleId}` }; },
update: (ruleId) => { return { url: `/system/pipelines/rule/${ruleId}` }; },
delete: (ruleId) => { return { url: `/system/pipelines/rule/${ruleId}` }; },
multiple: () => { return { url: '/system/pipelines/rule/multiple' }; },
functions: () => { return { url: '/system/pipelines/rule/functions' }; },
parse: () => { return { url: '/system/pipelines/rule/parse' }; },
},
ConnectionsController: {
list: () => { return { url: '/system/pipelines/connections' }; },
to_stream: () => { return { url: '/system/pipelines/connections/to_stream' }; },
to_pipeline: () => { return { url: '/system/pipelines/connections/to_pipeline' }; },
},
SimulatorController: {
simulate: () => { return { url: '/system/pipelines/simulate' }; },
},
ping: () => { return { url: '/' }; }, ping: () => { return { url: '/' }; },
}; };


Expand Down
3 changes: 2 additions & 1 deletion graylog2-web-interface/src/stores/maps/MapsStore.js
@@ -1,6 +1,7 @@
import Reflux from 'reflux'; import Reflux from 'reflux';


import URLUtils from 'util/URLUtils'; import URLUtils from 'util/URLUtils';
import ApiRoutes from 'routing/ApiRoutes';
import fetch from 'logic/rest/FetchProvider'; import fetch from 'logic/rest/FetchProvider';
import UserNotification from 'util/UserNotification'; import UserNotification from 'util/UserNotification';


Expand All @@ -26,7 +27,7 @@ export const MapsStore = Reflux.createStore({
// The TimeRange object needs a type to correctly deserialize on the server. // The TimeRange object needs a type to correctly deserialize on the server.
timerange.type = rangeType; timerange.type = rangeType;


const promise = fetch('POST', URLUtils.qualifyUrl('/plugins/org.graylog.plugins.map/mapdata'), { const promise = fetch('POST', URLUtils.qualifyUrl(ApiRoutes.MapDataController.search().url), {
query: q, query: q,
timerange: timerange, timerange: timerange,
limit: 50, limit: 50,
Expand Down
@@ -1,13 +1,12 @@
import Reflux from 'reflux'; import Reflux from 'reflux';


import UserNotification from 'util/UserNotification'; import UserNotification from 'util/UserNotification';
import ApiRoutes from 'routing/ApiRoutes';
import URLUtils from 'util/URLUtils'; import URLUtils from 'util/URLUtils';
import fetch from 'logic/rest/FetchProvider'; import fetch from 'logic/rest/FetchProvider';


import PipelineConnectionsActions from 'actions/pipelines/PipelineConnectionsActions'; import PipelineConnectionsActions from 'actions/pipelines/PipelineConnectionsActions';


const urlPrefix = '/plugins/org.graylog.plugins.pipelineprocessor';

const PipelineConnectionsStore = Reflux.createStore({ const PipelineConnectionsStore = Reflux.createStore({
listenables: [PipelineConnectionsActions], listenables: [PipelineConnectionsActions],
connections: undefined, connections: undefined,
Expand All @@ -22,7 +21,7 @@ const PipelineConnectionsStore = Reflux.createStore({
'Could not retrieve pipeline connections'); 'Could not retrieve pipeline connections');
}; };


const url = URLUtils.qualifyUrl(urlPrefix + '/system/pipelines/connections'); const url = URLUtils.qualifyUrl(ApiRoutes.ConnectionsController.list().url);
const promise = fetch('GET', url); const promise = fetch('GET', url);
promise.then((response) => { promise.then((response) => {
this.connections = response; this.connections = response;
Expand All @@ -31,7 +30,7 @@ const PipelineConnectionsStore = Reflux.createStore({
}, },


connectToStream(connection) { connectToStream(connection) {
const url = URLUtils.qualifyUrl(urlPrefix + '/system/pipelines/connections/to_stream'); const url = URLUtils.qualifyUrl(ApiRoutes.ConnectionsController.to_stream().url);
const updatedConnection = { const updatedConnection = {
stream_id: connection.stream, stream_id: connection.stream,
pipeline_ids: connection.pipelines, pipeline_ids: connection.pipelines,
Expand All @@ -52,7 +51,7 @@ const PipelineConnectionsStore = Reflux.createStore({
}, },


connectToPipeline(reverseConnection) { connectToPipeline(reverseConnection) {
const url = URLUtils.qualifyUrl(`${urlPrefix}/system/pipelines/connections/to_pipeline`); const url = URLUtils.qualifyUrl(ApiRoutes.ConnectionsController.to_pipeline().url);
const updatedConnection = { const updatedConnection = {
pipeline_id: reverseConnection.pipeline, pipeline_id: reverseConnection.pipeline,
stream_ids: reverseConnection.streams, stream_ids: reverseConnection.streams,
Expand Down

0 comments on commit 0894f13

Please sign in to comment.