use of io.cdap.cdap.proto.provisioner.ProvisionerDetail in project cdap by caskdata.
the class ProfileHttpHandlerTest method testPutAndDeleteProfiles.
@Test
public void testPutAndDeleteProfiles() throws Exception {
Profile invalidProfile = new Profile("MyProfile", "label", "my profile for testing", new ProvisionerInfo("nonExisting", PROPERTY_SUMMARIES));
// adding a profile with non-existing provisioner should get a 400
putProfile(NamespaceId.DEFAULT.profile(invalidProfile.getName()), invalidProfile, HttpURLConnection.HTTP_BAD_REQUEST);
// put a profile with the mock provisioner
Profile expected = new Profile("MyProfile", "label", "my profile for testing", new ProvisionerInfo(MockProvisioner.NAME, PROPERTY_SUMMARIES));
ProfileId expectedProfileId = NamespaceId.DEFAULT.profile(expected.getName());
putProfile(expectedProfileId, expected, HttpURLConnection.HTTP_OK);
// get the profile
Profile actual = getProfile(expectedProfileId, HttpURLConnection.HTTP_OK).get();
Assert.assertEquals(expected, actual);
// list all profiles, should get 2 profiles
List<Profile> profiles = listProfiles(NamespaceId.DEFAULT, true, HttpURLConnection.HTTP_OK);
Set<Profile> expectedList = ImmutableSet.of(Profile.NATIVE, expected);
Assert.assertEquals(expectedList.size(), profiles.size());
Assert.assertEquals(expectedList, new HashSet<>(profiles));
// adding the same profile should still succeed
putProfile(expectedProfileId, expected, HttpURLConnection.HTTP_OK);
// get non-existing profile should get a 404
deleteProfile(NamespaceId.DEFAULT.profile("nonExisting"), HttpURLConnection.HTTP_NOT_FOUND);
// delete the profile should fail first time since it is by default enabled
deleteProfile(expectedProfileId, HttpURLConnection.HTTP_CONFLICT);
// disable the profile then delete should work
disableProfile(expectedProfileId, HttpURLConnection.HTTP_OK);
deleteProfile(expectedProfileId, HttpURLConnection.HTTP_OK);
Assert.assertEquals(Collections.emptyList(), listProfiles(NamespaceId.DEFAULT, false, HttpURLConnection.HTTP_OK));
// if given some unrelated json, it should return a 400 instead of 500
ProvisionerSpecification spec = new MockProvisioner().getSpec();
ProvisionerDetail test = new ProvisionerDetail(spec.getName(), spec.getLabel(), spec.getDescription(), new ArrayList<>(), null, null, false);
putProfile(NamespaceId.DEFAULT.profile(test.getName()), test, HttpURLConnection.HTTP_BAD_REQUEST);
doAs(READ_ONLY_USER_NAME, () -> {
putProfile(expectedProfileId, expected, HttpURLConnection.HTTP_FORBIDDEN);
disableProfile(expectedProfileId, HttpURLConnection.HTTP_FORBIDDEN);
enableProfile(expectedProfileId, HttpURLConnection.HTTP_FORBIDDEN);
deleteProfile(expectedProfileId, HttpURLConnection.HTTP_FORBIDDEN);
});
doAs(READ_WRITE_USER_NAME, () -> {
putProfile(expectedProfileId, expected, HttpURLConnection.HTTP_OK);
disableProfile(expectedProfileId, HttpURLConnection.HTTP_OK);
enableProfile(expectedProfileId, HttpURLConnection.HTTP_OK);
disableProfile(expectedProfileId, HttpURLConnection.HTTP_OK);
deleteProfile(expectedProfileId, HttpURLConnection.HTTP_OK);
});
}
use of io.cdap.cdap.proto.provisioner.ProvisionerDetail in project cdap by caskdata.
the class ProgramLifecycleService method createProgramOptions.
@VisibleForTesting
ProgramOptions createProgramOptions(ProgramId programId, Map<String, String> userArgs, Map<String, String> sysArgs, boolean debug) throws NotFoundException, ProfileConflictException {
ProfileId profileId = SystemArguments.getProfileIdForProgram(programId, userArgs);
Map<String, String> profileProperties = SystemArguments.getProfileProperties(userArgs);
Profile profile = profileService.getProfile(profileId, profileProperties);
if (profile.getStatus() == ProfileStatus.DISABLED) {
throw new ProfileConflictException(String.format("Profile %s in namespace %s is disabled. It cannot be " + "used to start the program %s", profileId.getProfile(), profileId.getNamespace(), programId.toString()), profileId);
}
ProvisionerDetail spec = provisioningService.getProvisionerDetail(profile.getProvisioner().getName());
if (spec == null) {
throw new NotFoundException(String.format("Provisioner '%s' not found.", profile.getProvisioner().getName()));
}
// get and add any user overrides for profile properties
Map<String, String> systemArgs = new HashMap<>(sysArgs);
// add profile properties to the system arguments
SystemArguments.addProfileArgs(systemArgs, profile);
// Set the ClusterMode. If it is NATIVE profile, then it is ON_PREMISE, otherwise is ISOLATED
// This should probably move into the provisioner later once we have a better contract for the
// provisioner to actually pick what launching mechanism it wants to use.
systemArgs.put(ProgramOptionConstants.CLUSTER_MODE, (ProfileId.NATIVE.equals(profileId) ? ClusterMode.ON_PREMISE : ClusterMode.ISOLATED).name());
ProgramSpecification programSpecification = getProgramSpecificationWithoutAuthz(programId);
if (programSpecification == null) {
throw new NotFoundException(programId);
}
addAppCDAPVersion(programId, systemArgs);
// put all the plugin requirements if any involved in the run
systemArgs.put(ProgramOptionConstants.PLUGIN_REQUIREMENTS, GSON.toJson(getPluginRequirements(programSpecification)));
return new SimpleProgramOptions(programId, new BasicArguments(systemArgs), new BasicArguments(userArgs), debug);
}
use of io.cdap.cdap.proto.provisioner.ProvisionerDetail in project cdap by caskdata.
the class ProvisionerHttpHandler method getProvisioner.
@GET
@Path("/provisioners/{provisioner-name}")
public void getProvisioner(HttpRequest request, HttpResponder responder, @PathParam("provisioner-name") String provisionerName) throws NotFoundException {
ProvisionerDetail provisionerDetail = provisioningService.getProvisionerDetail(provisionerName);
if (provisionerDetail == null) {
throw new NotFoundException(String.format("Provisioner %s not found", provisionerName));
}
responder.sendJson(HttpResponseStatus.OK, GSON.toJson(provisionerDetail));
}
use of io.cdap.cdap.proto.provisioner.ProvisionerDetail in project cdap by caskdata.
the class ProvisionerHttpHandlerTest method testListAndGetProvisioners.
@Test
public void testListAndGetProvisioners() throws Exception {
// in unit test, we have the mock provisioners currently
ProvisionerSpecification spec = new MockProvisioner().getSpec();
ProvisionerDetail expected = new ProvisionerDetail(spec.getName(), spec.getLabel(), spec.getDescription(), new ArrayList<>(), null, null, false);
ProvisionerSpecification specWithCpus = new MockProvisionerWithCpus().getSpec();
ProvisionerDetail expectedWithCpus = new ProvisionerDetail(specWithCpus.getName(), specWithCpus.getLabel(), specWithCpus.getDescription(), new ArrayList<>(), null, null, false);
List<ProvisionerDetail> details = listProvisioners();
Assert.assertEquals(ImmutableList.of(expected, expectedWithCpus), details);
// get a non-existing provisioner should get a 404
getProvisioner("nonExisting", 404);
// get the mock provisioner
Assert.assertEquals(expected, getProvisioner(MockProvisioner.NAME, 200));
}
use of io.cdap.cdap.proto.provisioner.ProvisionerDetail in project cdap by caskdata.
the class ProvisioningService method initializeProvisioners.
/**
* Reloads provisioners in the extension directory. Any new provisioners will be added and any deleted provisioners
* will be removed. Loaded provisioners will be initialized.
*/
private void initializeProvisioners() {
Map<String, Provisioner> provisioners = provisionerProvider.loadProvisioners();
Map<String, ProvisionerConfig> provisionerConfigs = provisionerConfigProvider.loadProvisionerConfigs(provisioners.values());
LOG.debug("Provisioners = {}", provisioners);
Map<String, ProvisionerDetail> details = new HashMap<>(provisioners.size());
for (Map.Entry<String, Provisioner> provisionerEntry : provisioners.entrySet()) {
String provisionerName = provisionerEntry.getKey();
Provisioner provisioner = provisionerEntry.getValue();
ProvisionerSystemContext provisionerSystemContext = new DefaultSystemProvisionerContext(cConf, provisionerName);
try {
provisioner.initialize(provisionerSystemContext);
} catch (RuntimeException e) {
LOG.warn("Error initializing the {} provisioner. It will not be available for use.", provisionerName, e);
provisioners.remove(provisionerName);
continue;
}
ProvisionerSpecification spec = provisioner.getSpec();
ProvisionerConfig config = provisionerConfigs.getOrDefault(provisionerName, new ProvisionerConfig(new ArrayList<>(), null, null, false));
details.put(provisionerName, new ProvisionerDetail(spec.getName(), spec.getLabel(), spec.getDescription(), config.getConfigurationGroups(), config.getFilters(), config.getIcon(), config.isBeta()));
}
provisionerInfo.set(new ProvisionerInfo(provisioners, details));
}
Aggregations