use of io.cdap.cdap.common.ArtifactNotFoundException in project cdap by caskdata.
the class AbstractProgramRuntimeService method createPluginSnapshot.
/**
* Return the copy of the {@link ProgramOptions} including locations of plugin artifacts in it.
* @param options the {@link ProgramOptions} in which the locations of plugin artifacts needs to be included
* @param programId Id of the Program
* @param tempDir Temporary Directory to create the plugin artifact snapshot
* @param appSpec program's Application Specification
* @return the copy of the program options with locations of plugin artifacts included in them
*/
private ProgramOptions createPluginSnapshot(ProgramOptions options, ProgramId programId, File tempDir, @Nullable ApplicationSpecification appSpec) throws Exception {
// appSpec is null in an unit test
if (appSpec == null) {
return options;
}
Set<String> files = Sets.newHashSet();
ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
builder.putAll(options.getArguments().asMap());
for (Map.Entry<String, Plugin> pluginEntry : appSpec.getPlugins().entrySet()) {
Plugin plugin = pluginEntry.getValue();
File destFile = new File(tempDir, Artifacts.getFileName(plugin.getArtifactId()));
// Skip if the file has already been copied.
if (!files.add(destFile.getName())) {
continue;
}
try {
ArtifactId artifactId = Artifacts.toProtoArtifactId(programId.getNamespaceId(), plugin.getArtifactId());
copyArtifact(artifactId, noAuthArtifactRepository.getArtifact(Id.Artifact.fromEntityId(artifactId)), destFile);
} catch (ArtifactNotFoundException e) {
throw new IllegalArgumentException(String.format("Artifact %s could not be found", plugin.getArtifactId()), e);
}
}
LOG.debug("Plugin artifacts of {} copied to {}", programId, tempDir.getAbsolutePath());
builder.put(ProgramOptionConstants.PLUGIN_DIR, tempDir.getAbsolutePath());
return new SimpleProgramOptions(options.getProgramId(), new BasicArguments(builder.build()), options.getUserArguments(), options.isDebug());
}
use of io.cdap.cdap.common.ArtifactNotFoundException in project cdap by caskdata.
the class ApplicationLifecycleService method getLatestAppArtifactForUpgrade.
/**
* Finds latest application artifact for given application and current artifact for upgrading application.
* If no artifact found then returns current artifact as the candidate.
*
* @param appId application Id to find latest app artifact for.
* @param currentArtifactId current artifact used by application.
* @param allowedArtifactScopes artifact scopes to search in for finding candidate artifacts.
* @param allowSnapshot whether to consider snapshot version of artifacts or not for upgrade.
* @return {@link ArtifactSummary} for the artifact to be used for upgrade purpose.
* @throws NotFoundException if there is no artifact available for given artifact.
* @throws Exception if there was an exception during finding candidate artifact.
*/
private ArtifactSummary getLatestAppArtifactForUpgrade(ApplicationId appId, ArtifactId currentArtifactId, Set<ArtifactScope> allowedArtifactScopes, boolean allowSnapshot) throws Exception {
List<ArtifactSummary> availableArtifacts = new ArrayList<>();
// At the least, current artifact should be in the set of available artifacts.
availableArtifacts.add(ArtifactSummary.from(currentArtifactId));
// Find candidate artifacts from all scopes we need to consider.
for (ArtifactScope scope : allowedArtifactScopes) {
NamespaceId artifactNamespaceToConsider = ArtifactScope.SYSTEM.equals(scope) ? NamespaceId.SYSTEM : appId.getParent();
List<ArtifactSummary> artifacts;
try {
artifacts = artifactRepository.getArtifactSummaries(artifactNamespaceToConsider, currentArtifactId.getName(), Integer.MAX_VALUE, ArtifactSortOrder.ASC);
} catch (ArtifactNotFoundException e) {
// This can happen if we are looking for candidate artifact in multiple namespace.
continue;
}
for (ArtifactSummary artifactSummary : artifacts) {
ArtifactVersion artifactVersion = new ArtifactVersion(artifactSummary.getVersion());
// Consider if it is a non-snapshot version artifact or it is a snapshot version than allowSnapshot is true.
if ((artifactVersion.isSnapshot() && allowSnapshot) || !artifactVersion.isSnapshot()) {
availableArtifacts.add(artifactSummary);
}
}
}
// Find the artifact with latest version.
Optional<ArtifactSummary> newArtifactCandidate = availableArtifacts.stream().max(Comparator.comparing(artifactSummary -> new ArtifactVersion(artifactSummary.getVersion())));
io.cdap.cdap.proto.id.ArtifactId currentArtifact = new io.cdap.cdap.proto.id.ArtifactId(appId.getNamespace(), currentArtifactId.getName(), currentArtifactId.getVersion().getVersion());
return newArtifactCandidate.orElseThrow(() -> new ArtifactNotFoundException(currentArtifact));
}
use of io.cdap.cdap.common.ArtifactNotFoundException in project cdap by caskdata.
the class ArtifactStore method getArtifacts.
/**
* Get information about all versions of the given artifact.
*
* @param namespace the namespace to get artifacts from
* @param artifactName the name of the artifact to get
* @param limit the limit number of the result
* @param order the order of the result
* @return unmodifiable list of information about all versions of the given artifact
* @throws ArtifactNotFoundException if no version of the given artifact exists
* @throws IOException if there was an exception reading the artifact information from the metastore
*/
public List<ArtifactDetail> getArtifacts(NamespaceId namespace, String artifactName, int limit, ArtifactSortOrder order) throws ArtifactNotFoundException, IOException {
return TransactionRunners.run(transactionRunner, context -> {
StructuredTable table = getTable(context, StoreDefinition.ArtifactStore.ARTIFACT_DATA_TABLE);
Collection<Field<?>> keys = Arrays.asList(Fields.stringField(StoreDefinition.ArtifactStore.ARTIFACT_NAMESPACE_FIELD, namespace.getNamespace()), Fields.stringField(StoreDefinition.ArtifactStore.ARTIFACT_NAME_FIELD, artifactName));
try (CloseableIterator<StructuredRow> iterator = table.scan(Range.singleton(keys), Integer.MAX_VALUE)) {
List<ArtifactDetail> artifacts = getArtifacts(iterator, limit, order, null);
if (artifacts.isEmpty()) {
throw new ArtifactNotFoundException(namespace, artifactName);
}
return artifacts;
}
}, ArtifactNotFoundException.class, IOException.class);
}
use of io.cdap.cdap.common.ArtifactNotFoundException in project cdap by caskdata.
the class ArtifactStore method updateArtifactProperties.
/**
* Update artifact properties using an update function. Functions will receive an immutable map.
*
* @param artifactId the id of the artifact to add
* @param updateFunction the function used to update existing properties
* @throws ArtifactNotFoundException if the artifact does not exist
* @throws IOException if there was an exception writing the properties to the metastore
*/
public void updateArtifactProperties(Id.Artifact artifactId, Function<Map<String, String>, Map<String, String>> updateFunction) throws ArtifactNotFoundException, IOException {
TransactionRunners.run(transactionRunner, context -> {
StructuredTable artifactDataTable = getTable(context, StoreDefinition.ArtifactStore.ARTIFACT_DATA_TABLE);
ArtifactCell artifactCell = new ArtifactCell(artifactId);
Optional<StructuredRow> optional = artifactDataTable.read(artifactCell.keys);
if (!optional.isPresent()) {
throw new ArtifactNotFoundException(artifactId.toEntityId());
}
ArtifactData old = GSON.fromJson(optional.get().getString(StoreDefinition.ArtifactStore.ARTIFACT_DATA_FIELD), ArtifactData.class);
ArtifactMeta updatedMeta = new ArtifactMeta(old.meta.getClasses(), old.meta.getUsableBy(), updateFunction.apply(old.meta.getProperties()));
ArtifactData updatedData = new ArtifactData(Locations.getLocationFromAbsolutePath(locationFactory, old.getLocationPath()), updatedMeta);
// write artifact metadata
List<Field<?>> fields = ImmutableList.<Field<?>>builder().addAll(artifactCell.keys).add(Fields.stringField(StoreDefinition.ArtifactStore.ARTIFACT_DATA_FIELD, GSON.toJson(updatedData))).build();
artifactDataTable.upsert(fields);
}, ArtifactNotFoundException.class, IOException.class);
}
use of io.cdap.cdap.common.ArtifactNotFoundException in project cdap by caskdata.
the class ArtifactStore method getArtifact.
/**
* Get information about the given artifact.
*
* @param artifactId the artifact to get
* @return information about the artifact
* @throws ArtifactNotFoundException if the given artifact does not exist
* @throws IOException if there was an exception reading the artifact information from the metastore
*/
public ArtifactDetail getArtifact(final Id.Artifact artifactId) throws ArtifactNotFoundException, IOException {
ArtifactData artifactData = TransactionRunners.run(transactionRunner, context -> {
StructuredTable table = getTable(context, StoreDefinition.ArtifactStore.ARTIFACT_DATA_TABLE);
ArtifactCell artifactCell = new ArtifactCell(artifactId);
Optional<StructuredRow> row = table.read(artifactCell.keys);
if (!row.isPresent()) {
throw new ArtifactNotFoundException(artifactId.toEntityId());
}
return GSON.fromJson(row.get().getString(StoreDefinition.ArtifactStore.ARTIFACT_DATA_FIELD), ArtifactData.class);
}, IOException.class, ArtifactNotFoundException.class);
try {
Location artifactLocation = impersonator.doAs(artifactId.getNamespace().toEntityId(), () -> Locations.getLocationFromAbsolutePath(locationFactory, artifactData.getLocationPath()));
ArtifactMeta artifactMeta = filterPlugins(artifactData.meta);
return new ArtifactDetail(new ArtifactDescriptor(artifactId.getNamespace().getId(), artifactId.toArtifactId(), artifactLocation), artifactMeta);
} catch (Exception e) {
throw Throwables.propagate(e);
}
}
Aggregations