use of io.cdap.cdap.proto.id.ProfileId in project cdap by caskdata.
the class SystemProfileCreatorTest method testCreation.
@Test
public void testCreation() throws Exception {
ProfileId profileId = NamespaceId.SYSTEM.profile("p1");
try {
profileService.getProfile(profileId);
Assert.fail("profile should not exist.");
} catch (NotFoundException e) {
// expected
}
List<ProvisionerPropertyValue> properties = new ArrayList<>();
properties.add(new ProvisionerPropertyValue("name1", "val1", true));
properties.add(new ProvisionerPropertyValue("name2", "val2", true));
ProvisionerInfo provisionerInfo = new ProvisionerInfo(MockProvisioner.NAME, properties);
Profile profile = new Profile(profileId.getProfile(), "profile label", "profile description", EntityScope.SYSTEM, provisionerInfo);
SystemProfileCreator.Arguments arguments = new SystemProfileCreator.Arguments(profile.getName(), profile.getLabel(), profile.getDescription(), profile.getProvisioner());
BootstrapStepResult result = profileCreator.execute("label", GSON.toJsonTree(arguments).getAsJsonObject());
BootstrapStepResult expected = new BootstrapStepResult("label", BootstrapStepResult.Status.SUCCEEDED);
Assert.assertEquals(expected, result);
Assert.assertEquals(profile, profileService.getProfile(profileId));
}
use of io.cdap.cdap.proto.id.ProfileId in project cdap by caskdata.
the class ProgramLifecycleHttpHandlerTest method testStartProgramWithDisabledProfile.
@Test
public void testStartProgramWithDisabledProfile() throws Exception {
// put my profile and disable it, using this profile to start program should fail
ProfileId profileId = new NamespaceId(TEST_NAMESPACE1).profile("MyProfile");
Profile profile = new Profile("MyProfile", Profile.NATIVE.getLabel(), Profile.NATIVE.getDescription(), Profile.NATIVE.getScope(), Profile.NATIVE.getProvisioner());
putProfile(profileId, profile, 200);
disableProfile(profileId, 200);
// deploy, check the status
deploy(AppWithWorkflow.class, 200, Constants.Gateway.API_VERSION_3_TOKEN, TEST_NAMESPACE1);
ProgramId programId = new NamespaceId(TEST_NAMESPACE1).app(AppWithWorkflow.NAME).workflow(AppWithWorkflow.SampleWorkflow.NAME);
// workflow is stopped initially
Assert.assertEquals(STOPPED, getProgramStatus(programId));
// start workflow should give a 409 since we have a runtime argument associated with a disabled profile
startProgram(programId, Collections.singletonMap(SystemArguments.PROFILE_NAME, profileId.getScopedName()), 409);
Assert.assertEquals(STOPPED, getProgramStatus(programId));
// use native profile to start workflow should work since it is always enabled.
// the workflow should start but fail because we are not passing in required runtime args.
int runs = getProgramRuns(programId, ProgramRunStatus.FAILED).size();
startProgram(programId, Collections.singletonMap(SystemArguments.PROFILE_NAME, ProfileId.NATIVE.getScopedName()), 200);
// wait for the workflow to stop and check the status
Tasks.waitFor(runs + 1, () -> getProgramRuns(programId, ProgramRunStatus.FAILED).size(), 60, TimeUnit.SECONDS);
}
use of io.cdap.cdap.proto.id.ProfileId in project cdap by caskdata.
the class AppMetadataStore method recordProgramProvisioning.
/**
* Record that the program run is provisioning compute resources for the run. If the current status has
* a higher source id, this call will be ignored.
*
* @param programRunId program run
* @param runtimeArgs runtime arguments
* @param systemArgs system arguments
* @param sourceId unique id representing the source of program run status, such as the message id of the program
* run status notification in TMS. The source id must increase as the recording time of the program
* run status increases, so that the attempt to persist program run status older than the existing
* program run status will be ignored
* @param artifactId artifact id of the program's application -
* its null only for older messages that were not processed before upgrading to 5.0
* @return {@link ProgramRunClusterStatus#PROVISIONING} if it is successfully persisted, {@code null} otherwise.
*/
@Nullable
public RunRecordDetail recordProgramProvisioning(ProgramRunId programRunId, Map<String, String> runtimeArgs, Map<String, String> systemArgs, byte[] sourceId, @Nullable ArtifactId artifactId) throws IOException {
long startTs = RunIds.getTime(programRunId.getRun(), TimeUnit.SECONDS);
if (startTs == -1L) {
LOG.error("Ignoring unexpected request to record provisioning state for program run {} that does not have " + "a timestamp in the run id.", programRunId);
return null;
}
RunRecordDetail existing = getRun(programRunId);
// for some reason, there is an existing run record.
if (existing != null) {
LOG.error("Ignoring unexpected request to record provisioning state for program run {} that has an existing " + "run record in run state {} and cluster state {}.", programRunId, existing.getStatus(), existing.getCluster().getStatus());
return null;
}
Optional<ProfileId> profileId = SystemArguments.getProfileIdFromArgs(programRunId.getNamespaceId(), systemArgs);
if (!profileId.isPresent()) {
LOG.error("Ignoring unexpected request to record provisioning state for program run {} that does not have " + "a profile assigned to it.", programRunId);
return null;
}
ProgramRunCluster cluster = new ProgramRunCluster(ProgramRunClusterStatus.PROVISIONING, null, null);
RunRecordDetail meta = RunRecordDetail.builder().setProgramRunId(programRunId).setStartTime(startTs).setStatus(ProgramRunStatus.PENDING).setProperties(getRecordProperties(systemArgs, runtimeArgs)).setSystemArgs(systemArgs).setCluster(cluster).setProfileId(profileId.get()).setPeerName(systemArgs.get(ProgramOptionConstants.PEER_NAME)).setSourceId(sourceId).setArtifactId(artifactId).setPrincipal(systemArgs.get(ProgramOptionConstants.PRINCIPAL)).build();
writeNewRunRecord(meta, TYPE_RUN_RECORD_ACTIVE);
LOG.trace("Recorded {} for program {}", ProgramRunClusterStatus.PROVISIONING, programRunId);
return meta;
}
use of io.cdap.cdap.proto.id.ProfileId in project cdap by caskdata.
the class ProfileService method deleteAllProfiles.
/**
* Delete all profiles in a given namespace. Deleting all profiles in SYSTEM namespace is not allowed.
*
* @param namespaceId the id of the namespace
*/
public void deleteAllProfiles(NamespaceId namespaceId) throws MethodNotAllowedException, NotFoundException, ProfileConflictException {
if (namespaceId.equals(NamespaceId.SYSTEM)) {
throw new MethodNotAllowedException("Deleting all system profiles is not allowed.");
}
List<ProfileId> deleted = new ArrayList<>();
TransactionRunners.run(transactionRunner, context -> {
ProfileStore profileStore = ProfileStore.get(context);
AppMetadataStore appMetadataStore = AppMetadataStore.create(context);
List<Profile> profiles = profileStore.getProfiles(namespaceId, false);
for (Profile profile : profiles) {
ProfileId profileId = namespaceId.profile(profile.getName());
deleteProfile(profileStore, appMetadataStore, profileId, profile);
deleted.add(profileId);
}
}, ProfileConflictException.class, NotFoundException.class);
// delete the metrics
for (ProfileId profileId : deleted) {
deleteMetrics(profileId);
}
}
use of io.cdap.cdap.proto.id.ProfileId in project cdap by caskdata.
the class ProfileMetricServiceTest method testRoundingLogic.
@Test
public void testRoundingLogic() throws Exception {
ProgramRunId runId = NamespaceId.DEFAULT.app("round").workflow("round").run(RunIds.generate());
ProfileId profileId = NamespaceId.DEFAULT.profile("roundProfile");
MetricsCollectionService collectionService = injector.getInstance(MetricsCollectionService.class);
MetricStore metricStore = injector.getInstance(MetricStore.class);
ProfileMetricService scheduledService = new ProfileMetricService(collectionService, runId, profileId, 1, 1);
// start and stop the service, the metric should still go up by 1
scheduledService.startUp();
scheduledService.shutDown();
Tasks.waitFor(1L, () -> getMetric(metricStore, runId, profileId, "system." + Constants.Metrics.Program.PROGRAM_NODE_MINUTES), 10, TimeUnit.SECONDS);
scheduledService.startUp();
// set the start up time to 90 seconds before the current time
scheduledService.setStartUpTime(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()) - 90);
// 90 seconds should round up to 2 mins, so emit 1 min and test the rounding logic
scheduledService.emitMetric();
scheduledService.shutDown();
// the metric should go up by 2
Tasks.waitFor(3L, () -> getMetric(metricStore, runId, profileId, "system." + Constants.Metrics.Program.PROGRAM_NODE_MINUTES), 10, TimeUnit.SECONDS);
scheduledService.startUp();
// set the start up time to 65 seconds before the current time
scheduledService.setStartUpTime(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()) - 65);
// 65 seconds should round down to 1 min, so emit 1 min and test the rest seconds are ignored
scheduledService.emitMetric();
scheduledService.shutDown();
// the metric should go up by 1
Tasks.waitFor(4L, () -> getMetric(metricStore, runId, profileId, "system." + Constants.Metrics.Program.PROGRAM_NODE_MINUTES), 10, TimeUnit.SECONDS);
}
Aggregations