use of io.cdap.cdap.etl.api.connector.SampleRequest in project cdap by caskdata.
the class ConnectionHandler method sampleLocally.
private void sampleLocally(String namespace, String sampleRequestString, Connection conn, HttpServiceResponder responder) throws IOException {
SampleRequest sampleRequest = GSON.fromJson(sampleRequestString, SampleRequest.class);
ServicePluginConfigurer pluginConfigurer = getContext().createServicePluginConfigurer(namespace);
ConnectorConfigurer connectorConfigurer = new DefaultConnectorConfigurer(pluginConfigurer);
ConnectorContext connectorContext = new DefaultConnectorContext(new SimpleFailureCollector(), pluginConfigurer);
PluginInfo plugin = conn.getPlugin();
// use tracked selector to get exact plugin version that gets selected since the passed version can be null
TrackedPluginSelector pluginSelector = new TrackedPluginSelector(new ArtifactSelectorProvider().getPluginSelector(plugin.getArtifact()));
try (Connector connector = getConnector(pluginConfigurer, plugin, namespace, pluginSelector)) {
connector.configure(connectorConfigurer);
ConnectorSpecRequest specRequest = ConnectorSpecRequest.builder().setPath(sampleRequest.getPath()).setConnection(conn.getName()).setProperties(sampleRequest.getProperties()).build();
ConnectorSpec spec = connector.generateSpec(connectorContext, specRequest);
ConnectorDetail detail = ConnectionUtils.getConnectorDetail(pluginSelector.getSelectedArtifact(), spec);
try {
SampleResponse sampleResponse = ConnectionUtils.getSampleResponse(connector, connectorContext, sampleRequest, detail, pluginConfigurer);
responder.sendString(GSON.toJson(sampleResponse));
} catch (ConnectionBadRequestException e) {
// should not happen
responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, e.getMessage());
}
}
}
use of io.cdap.cdap.etl.api.connector.SampleRequest in project cdap by caskdata.
the class RemoteConnectionSampleTask method execute.
@Override
public String execute(SystemAppTaskContext systemAppContext, RemoteConnectionRequest request) throws Exception {
String namespace = request.getNamespace();
Connection connection = request.getConnection();
// Plugin selector and configurer
TrackedPluginSelector pluginSelector = new TrackedPluginSelector(new ArtifactSelectorProvider().getPluginSelector(connection.getPlugin().getArtifact()));
ServicePluginConfigurer pluginConfigurer = systemAppContext.createServicePluginConfigurer(namespace);
ConnectorContext connectorContext = ConnectionUtils.getConnectorContext(pluginConfigurer);
SampleRequest sampleRequest = GSON.fromJson(request.getRequest(), SampleRequest.class);
try (Connector connector = getConnector(systemAppContext, pluginConfigurer, connection.getPlugin(), namespace, pluginSelector)) {
connector.configure(new DefaultConnectorConfigurer(pluginConfigurer));
ConnectorSpecRequest specRequest = ConnectorSpecRequest.builder().setPath(sampleRequest.getPath()).setConnection(connection.getName()).setProperties(sampleRequest.getProperties()).build();
ConnectorSpec spec = connector.generateSpec(connectorContext, specRequest);
ConnectorDetail detail = ConnectionUtils.getConnectorDetail(pluginSelector.getSelectedArtifact(), spec);
SampleResponse sampleResponse = ConnectionUtils.getSampleResponse(connector, connectorContext, sampleRequest, detail, pluginConfigurer);
return GSON.toJson(sampleResponse);
}
}
use of io.cdap.cdap.etl.api.connector.SampleRequest in project cdap by caskdata.
the class ConnectionHandler method sample.
/**
* Retrive sample result for the connection
*/
@POST
@TransactionPolicy(value = TransactionControl.EXPLICIT)
@Path(API_VERSION + "/contexts/{context}/connections/{connection}/sample")
public void sample(HttpServiceRequest request, HttpServiceResponder responder, @PathParam("context") String namespace, @PathParam("connection") String connection) {
respond(namespace, responder, namespaceSummary -> {
if (namespaceSummary.getName().equalsIgnoreCase(NamespaceId.SYSTEM.getNamespace())) {
responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, "Sampling connection in system namespace is currently not supported");
return;
}
contextAccessEnforcer.enforce(new ConnectionEntityId(namespace, ConnectionId.getConnectionId(connection)), StandardPermission.USE);
String sampleRequestString = StandardCharsets.UTF_8.decode(request.getContent()).toString();
SampleRequest sampleRequest = GSON.fromJson(sampleRequestString, SampleRequest.class);
if (sampleRequest == null) {
responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, "The request body is empty");
return;
}
if (sampleRequest.getPath() == null) {
responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, "Path is not provided in the sample request");
return;
}
if (sampleRequest.getLimit() <= 0) {
responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, "Limit should be greater than 0");
return;
}
Connection conn = store.getConnection(new ConnectionId(namespaceSummary, connection));
if (getContext().isRemoteTaskEnabled()) {
executeRemotely(namespace, sampleRequestString, conn, RemoteConnectionSampleTask.class, responder);
} else {
sampleLocally(namespaceSummary.getName(), sampleRequestString, conn, responder);
}
Metrics child = metrics.child(ImmutableMap.of(Constants.Metrics.Tag.APP_ENTITY_TYPE, Constants.CONNECTION_SERVICE_NAME, Constants.Metrics.Tag.APP_ENTITY_TYPE_NAME, conn.getConnectionType()));
child.count(Constants.Metrics.Connection.CONNECTION_SAMPLE_COUNT, 1);
// sample will also generate the spec, so add the metric for it
child.count(Constants.Metrics.Connection.CONNECTION_SPEC_COUNT, 1);
});
}
Aggregations