use of io.cdap.cdap.api.artifact.ArtifactSummary in project cdap by cdapio.
the class DraftServiceTest method createBatchPipelineDraft.
private Draft createBatchPipelineDraft(DraftId draftId, String name, String description) throws IOException {
ArtifactSummary artifact = new ArtifactSummary("cdap-data-pipeline", "1.0.0");
ETLBatchConfig config = ETLBatchConfig.builder().addStage(new ETLStage("src", MockSource.getPlugin("dummy1"))).addStage(new ETLStage("sink", MockSink.getPlugin("dummy2"))).addConnection("src", "sink").setEngine(Engine.SPARK).build();
DraftStoreRequest<ETLBatchConfig> batchDraftStoreRequest = new DraftStoreRequest<>(config, "", name, description, 0, artifact);
long now = System.currentTimeMillis();
Draft expectedDraft = new Draft(config, name, description, artifact, draftId.getId(), now, now);
createPipelineDraft(draftId, batchDraftStoreRequest);
return expectedDraft;
}
use of io.cdap.cdap.api.artifact.ArtifactSummary in project cdap by cdapio.
the class DataPipelineServiceTest method testValidatePipelineBadPipelineArtifact.
@Test
public void testValidatePipelineBadPipelineArtifact() throws IOException {
ETLBatchConfig config = ETLBatchConfig.builder().addStage(new ETLStage("src", MockSource.getPlugin("dummy1"))).addStage(new ETLStage("sink", MockSink.getPlugin("dummy2"))).addConnection("src", "sink").build();
ArtifactSummary badArtifact = new ArtifactSummary("ghost", "1.0.0");
AppRequest<ETLBatchConfig> appRequest = new AppRequest<>(badArtifact, config);
URL validatePipelineURL = serviceURI.resolve(String.format("v1/contexts/%s/validations/pipeline", NamespaceId.DEFAULT.getNamespace())).toURL();
HttpRequest request = HttpRequest.builder(HttpMethod.POST, validatePipelineURL).withBody(GSON.toJson(appRequest)).build();
HttpResponse response = HttpRequests.execute(request, new DefaultHttpRequestConfig(false));
Assert.assertEquals(400, response.getResponseCode());
}
use of io.cdap.cdap.api.artifact.ArtifactSummary in project cdap by cdapio.
the class ValidationHandler method validatePipeline.
@POST
@Path("v1/contexts/{context}/validations/pipeline")
public void validatePipeline(HttpServiceRequest request, HttpServiceResponder responder, @PathParam("context") String namespace) throws IOException {
if (!getContext().getAdmin().namespaceExists(namespace)) {
responder.sendError(HttpURLConnection.HTTP_NOT_FOUND, String.format("Namespace '%s' does not exist", namespace));
return;
}
AppRequest<JsonObject> appRequest;
try {
appRequest = GSON.fromJson(StandardCharsets.UTF_8.decode(request.getContent()).toString(), APP_REQUEST_TYPE);
appRequest.validate();
} catch (JsonSyntaxException e) {
responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, "Unable to decode request body: " + e.getMessage());
return;
} catch (IllegalArgumentException e) {
responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, "Invalid artifact in pipeline request: " + e.getMessage());
return;
}
ArtifactSummary artifactSummary = appRequest.getArtifact();
if (StudioUtil.isBatchPipeline(artifactSummary)) {
responder.sendJson(validateBatchPipeline(appRequest));
} else if (StudioUtil.isStreamingPipeline(artifactSummary)) {
responder.sendJson(validateStreamingPipeline(appRequest));
} else {
responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, String.format("Invalid artifact '%s'. Must be '%s' or '%s'.", artifactSummary.getName(), StudioUtil.ARTIFACT_BATCH_NAME, StudioUtil.ARTIFACT_STREAMING_NAME));
}
}
use of io.cdap.cdap.api.artifact.ArtifactSummary in project cdap by cdapio.
the class ApplicationClientTestRun method testAppUpdate.
@Test
public void testAppUpdate() throws Exception {
String artifactName = "cfg-programs";
ArtifactId artifactIdV1 = NamespaceId.DEFAULT.artifact(artifactName, "1.0.0");
ArtifactId artifactIdV2 = NamespaceId.DEFAULT.artifact(artifactName, "2.0.0");
ApplicationId appId = NamespaceId.DEFAULT.app("ProgramsApp");
artifactClient.add(NamespaceId.DEFAULT, artifactName, () -> Files.newInputStream(createAppJarFile(ConfigurableProgramsApp.class).toPath()), "1.0.0");
artifactClient.add(NamespaceId.DEFAULT, artifactName, () -> Files.newInputStream(createAppJarFile(ConfigurableProgramsApp2.class).toPath()), "2.0.0");
try {
// deploy the app with just the worker
ConfigurableProgramsApp.Programs conf = new ConfigurableProgramsApp.Programs("worker1", null, "dataset1");
AppRequest<ConfigurableProgramsApp.Programs> request = new AppRequest<>(new ArtifactSummary(artifactIdV1.getArtifact(), artifactIdV1.getVersion()), conf);
appClient.deploy(appId, request);
// should only have the worker
Assert.assertTrue(appClient.listPrograms(appId, ProgramType.SERVICE).isEmpty());
Assert.assertEquals(1, appClient.listPrograms(appId, ProgramType.WORKER).size());
// update to use just the service
conf = new ConfigurableProgramsApp.Programs(null, "service", "dataset1");
request = new AppRequest<>(new ArtifactSummary(artifactIdV1.getArtifact(), artifactIdV1.getVersion()), conf);
appClient.update(appId, request);
// should only have the service
Assert.assertTrue(appClient.listPrograms(appId, ProgramType.WORKER).isEmpty());
Assert.assertEquals(1, appClient.listPrograms(appId, ProgramType.SERVICE).size());
// check nonexistent app is not found
try {
appClient.update(NamespaceId.DEFAULT.app("ghost"), request);
Assert.fail();
} catch (NotFoundException e) {
// expected
}
// check different artifact name is invalid
request = new AppRequest<>(new ArtifactSummary("ghost", artifactIdV1.getVersion()), conf);
try {
appClient.update(appId, request);
Assert.fail();
} catch (BadRequestException e) {
// expected
}
// check nonexistent artifact is not found
request = new AppRequest<>(new ArtifactSummary(artifactIdV1.getArtifact(), "0.0.1"), conf);
try {
appClient.update(appId, request);
Assert.fail();
} catch (NotFoundException e) {
// expected
}
// update artifact version. This version uses a different app class with that can add a workflow
ConfigurableProgramsApp2.Programs conf2 = new ConfigurableProgramsApp2.Programs(null, null, "workflow1", "dataset1");
AppRequest<ConfigurableProgramsApp2.Programs> request2 = new AppRequest<>(new ArtifactSummary(artifactIdV2.getArtifact(), artifactIdV2.getVersion()), conf2);
appClient.update(appId, request2);
// should only have a single workflow
Assert.assertTrue(appClient.listPrograms(appId, ProgramType.WORKER).isEmpty());
Assert.assertTrue(appClient.listPrograms(appId, ProgramType.SERVICE).isEmpty());
Assert.assertEquals(1, appClient.listPrograms(appId, ProgramType.WORKFLOW).size());
} finally {
appClient.delete(appId);
appClient.waitForDeleted(appId, 30, TimeUnit.SECONDS);
artifactClient.delete(artifactIdV1);
artifactClient.delete(artifactIdV2);
}
}
use of io.cdap.cdap.api.artifact.ArtifactSummary in project cdap by cdapio.
the class ArtifactClientTestRun method setUp.
@Override
@Before
public void setUp() throws Throwable {
super.setUp();
artifactClient = new ArtifactClient(clientConfig, new RESTClient(clientConfig));
for (ArtifactSummary artifactSummary : artifactClient.list(NamespaceId.DEFAULT)) {
artifactClient.delete(NamespaceId.DEFAULT.artifact(artifactSummary.getName(), artifactSummary.getVersion()));
}
}
Aggregations