use of io.pravega.shared.NameUtils.INTERNAL_NAME_PREFIX in project pravega by pravega.
the class StorageTestBase method createInexistentSegmentHandle.
protected SegmentHandle createInexistentSegmentHandle(Storage s, boolean readOnly) {
Random rnd = RandomFactory.create();
String segmentName = (isTestingSystemSegment() ? INTERNAL_NAME_PREFIX : "") + "Inexistent_" + MathHelpers.abs(rnd.nextInt());
createSegment(segmentName, s);
return (readOnly ? s.openRead(segmentName) : s.openWrite(segmentName)).thenCompose(handle -> s.openWrite(segmentName).thenCompose(h2 -> s.delete(h2, TIMEOUT)).thenApply(v -> handle)).join();
}
use of io.pravega.shared.NameUtils.INTERNAL_NAME_PREFIX in project pravega by pravega.
the class StreamMetadataResourceImpl method listStreams.
/**
* Implementation of listStreams REST API.
*
* @param scopeName The scope name of stream.
* @param securityContext The security for API access.
* @param asyncResponse AsyncResponse provides means for asynchronous server side response processing.
*/
@Override
public void listStreams(final String scopeName, final String filterType, final String filterValue, final SecurityContext securityContext, final AsyncResponse asyncResponse) {
long traceId = LoggerHelpers.traceEnter(log, "listStreams");
long requestId = requestIdGenerator.nextLong();
final Principal principal;
final List<String> authHeader = getAuthorizationHeader();
try {
principal = restAuthHelper.authenticate(authHeader);
restAuthHelper.authorize(authHeader, authorizationResource.ofStreamsInScope(scopeName), principal, READ);
} catch (AuthException e) {
log.warn(requestId, "List streams for {} failed due to authentication failure.", scopeName);
asyncResponse.resume(Response.status(Status.fromStatusCode(e.getResponseCode())).build());
LoggerHelpers.traceLeave(log, "listStreams", traceId);
return;
}
boolean showOnlyInternalStreams = filterType != null && filterType.equals("showInternalStreams");
boolean showStreamsWithTag = filterType != null && filterType.equals("tag");
String tag;
if (showStreamsWithTag && filterValue != null) {
tag = filterValue;
List<Stream> streams = new ArrayList<>();
String finalTag = tag;
localController.listStreamsForTag(scopeName, tag).collectRemaining(streams::add).thenCompose(v -> {
List<CompletableFuture<ImmutablePair<Stream, StreamConfiguration>>> streamConfigFutureList = streams.stream().filter(stream -> {
boolean isAuthorized = false;
try {
isAuthorized = restAuthHelper.isAuthorized(authHeader, authorizationResource.ofStreamInScope(scopeName, stream.getStreamName()), principal, READ);
} catch (AuthException e) {
log.warn(requestId, "List Streams with tag {} for scope {} failed due to authentication failure.", finalTag, scopeName);
// Ignore. This exception occurs under abnormal circumstances and not to determine
// whether the user is authorized. In case it does occur, we assume that the user
// is unauthorized.
}
return isAuthorized;
}).map(stream -> localController.getStreamConfiguration(scopeName, stream.getStreamName()).thenApply(config -> new ImmutablePair<>(stream, config))).collect(Collectors.toList());
return Futures.allOfWithResults(streamConfigFutureList);
}).thenApply(streamConfigPairs -> {
StreamsList responseStreams = new StreamsList();
responseStreams.setStreams(new ArrayList<>());
streamConfigPairs.forEach(pair -> responseStreams.addStreamsItem(ModelHelper.encodeStreamResponse(pair.left.getScope(), pair.left.getStreamName(), pair.right)));
log.info(requestId, "Successfully fetched streams for scope: {} with tag: {}", scopeName, finalTag);
return Response.status(Status.OK).entity(responseStreams).build();
}).exceptionally(exception -> {
if (exception.getCause() instanceof StoreException.DataNotFoundException || exception instanceof StoreException.DataNotFoundException) {
log.warn(requestId, "Scope name: {} not found", scopeName);
return Response.status(Status.NOT_FOUND).build();
} else {
log.warn(requestId, "listStreams for {} with tag {} failed with exception: {}", scopeName, finalTag, exception);
return Response.status(Status.INTERNAL_SERVER_ERROR).build();
}
}).thenApply(asyncResponse::resume).thenAccept(x -> LoggerHelpers.traceLeave(log, "listStreams", traceId));
} else {
controllerService.listStreamsInScope(scopeName, requestId).thenApply(streamsList -> {
StreamsList streams = new StreamsList();
streams.setStreams(new ArrayList<>());
streamsList.forEach((stream, config) -> {
try {
if (restAuthHelper.isAuthorized(authHeader, authorizationResource.ofStreamInScope(scopeName, stream), principal, READ)) {
// otherwise display the regular user created streams.
if (!showOnlyInternalStreams ^ stream.startsWith(INTERNAL_NAME_PREFIX)) {
streams.addStreamsItem(ModelHelper.encodeStreamResponse(scopeName, stream, config));
}
}
} catch (AuthException e) {
log.warn(requestId, "Read internal streams for scope {} failed due to authentication failure.", scopeName);
// Ignore. This exception occurs under abnormal circumstances and not to determine
// whether the user is authorized. In case it does occur, we assume that the user
// is unauthorized.
}
});
log.info(requestId, "Successfully fetched streams for scope: {}", scopeName);
return Response.status(Status.OK).entity(streams).build();
}).exceptionally(exception -> {
if (exception.getCause() instanceof StoreException.DataNotFoundException || exception instanceof StoreException.DataNotFoundException) {
log.warn(requestId, "Scope name: {} not found", scopeName);
return Response.status(Status.NOT_FOUND).build();
} else {
log.warn(requestId, "listStreams for {} failed with exception: {}", scopeName, exception);
return Response.status(Status.INTERNAL_SERVER_ERROR).build();
}
}).thenApply(asyncResponse::resume).thenAccept(x -> LoggerHelpers.traceLeave(log, "listStreams", traceId));
}
}
Aggregations