/* # Licensed Materials - Property of IBM # Copyright IBM Corp. 2015 */ package com.ibm.streamsx.topology.internal.context; import static com.ibm.streamsx.topology.internal.context.remote.DeployKeys.deploy; import static com.ibm.streamsx.topology.internal.context.remote.DeployKeys.keepArtifacts; import static com.ibm.streamsx.topology.internal.gson.GsonUtilities.jstring; import static com.ibm.streamsx.topology.internal.streaminganalytics.VcapServices.getVCAPService; import java.io.File; import java.io.IOException; import java.math.BigInteger; import java.util.concurrent.Future; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import com.google.gson.JsonObject; import com.ibm.streamsx.topology.Topology; import com.ibm.streamsx.topology.context.remote.RemoteContext; import com.ibm.streamsx.topology.internal.context.remote.DeployKeys; import com.ibm.streamsx.topology.internal.gson.GsonUtilities; import com.ibm.streamsx.topology.internal.process.CompletedFuture; import com.ibm.streamsx.topology.internal.streaminganalytics.RestUtils; public class AnalyticsServiceStreamsContext extends BundleUserStreamsContext<BigInteger> { private final Type type; public AnalyticsServiceStreamsContext(Type type) { super(false); this.type = type; } @Override public Type getType() { return type; } @Override Future<BigInteger> invoke(AppEntity entity, File bundle) throws Exception { try { BigInteger jobId = submitJobToService(bundle, entity.submission); return new CompletedFuture<BigInteger>(jobId); } finally { if (!keepArtifacts(entity.submission)) bundle.delete(); } } /** * Verify we have a valid Streaming Analytic service * information before we attempt anything. */ @Override void preSubmit(AppEntity entity) { try { if (entity.submission != null) getVCAPService(deploy(entity.submission)); } catch (IOException e) { throw new IllegalArgumentException(e); } } /* private JsonObject getBluemixSubmitConfig( Map<String, Object> config) throws IOException { JobConfig jc = JobConfig.fromProperties(config); // Streaming Analytics service is always using 4.2 or later // so use the job config overlay JobConfigOverlay jco = new JobConfigOverlay(jc); return jco.fullOverlayAsJSON(new JsonObject()); } */ private BigInteger submitJobToService(File bundle, JsonObject submission) throws IOException { JsonObject deploy = deploy(submission); final JsonObject service = getVCAPService(deploy); final String serviceName = jstring(service, "name"); final JsonObject credentials = service.getAsJsonObject("credentials"); final CloseableHttpClient httpClient = HttpClients.createDefault(); try { Topology.STREAMS_LOGGER.info("Streaming Analytics service (" + serviceName + "): Checking status :" + serviceName); RestUtils.checkInstanceStatus(httpClient, service); Topology.STREAMS_LOGGER.info("Streaming Analytics service (" + serviceName + "): Submitting bundle : " + bundle.getName() + " to " + serviceName); JsonObject jcojson = DeployKeys.copyJobConfigOverlays(deploy); Topology.STREAMS_LOGGER.info("Streaming Analytics service (" + serviceName + "): submit job request:" + jcojson.toString()); JsonObject response = RestUtils.postJob(httpClient, service, bundle, jcojson); final JsonObject submissionResult = GsonUtilities.objectCreate(submission, RemoteContext.SUBMISSION_RESULTS); GsonUtilities.addAll(submissionResult, response); String jobId = jstring(response, "jobId"); if (jobId == null) return BigInteger.valueOf(-1); return new BigInteger(jobId); } finally { httpClient.close(); } } }