use of co.cask.cdap.proto.metadata.MetadataSearchResultRecord in project cdap by caskdata.
the class DefaultMetadataAdmin method filterAuthorizedSearchResult.
/**
* Filter a list of {@link MetadataSearchResultRecord} that ensures the logged-in user has a privilege on
*
* @param results the {@link MetadataSearchResponse} to filter
* @return filtered {@link MetadataSearchResponse}
*/
private MetadataSearchResponse filterAuthorizedSearchResult(MetadataSearchResponse results) throws Exception {
Principal principal = authenticationContext.getPrincipal();
final Predicate<EntityId> filter = authorizationEnforcer.createFilter(principal);
return new MetadataSearchResponse(results.getSort(), results.getOffset(), results.getLimit(), results.getNumCursors(), results.getTotal(), ImmutableSet.copyOf(Iterables.filter(results.getResults(), new com.google.common.base.Predicate<MetadataSearchResultRecord>() {
@Override
public boolean apply(MetadataSearchResultRecord metadataSearchResultRecord) {
return filter.apply(metadataSearchResultRecord.getEntityId());
}
})), results.getCursors(), results.isShowHidden(), results.getEntityScope());
}
use of co.cask.cdap.proto.metadata.MetadataSearchResultRecord in project cdap by caskdata.
the class DefaultMetadataStore method addMetadataToEntities.
private Set<MetadataSearchResultRecord> addMetadataToEntities(Set<NamespacedEntityId> entities, Map<NamespacedEntityId, Metadata> systemMetadata, Map<NamespacedEntityId, Metadata> userMetadata) {
Set<MetadataSearchResultRecord> result = new LinkedHashSet<>();
for (NamespacedEntityId entity : entities) {
ImmutableMap.Builder<MetadataScope, co.cask.cdap.proto.metadata.Metadata> builder = ImmutableMap.builder();
// Add system metadata
Metadata metadata = systemMetadata.get(entity);
if (metadata != null) {
builder.put(MetadataScope.SYSTEM, new co.cask.cdap.proto.metadata.Metadata(metadata.getProperties(), metadata.getTags()));
}
// Add user metadata
metadata = userMetadata.get(entity);
if (metadata != null) {
builder.put(MetadataScope.USER, new co.cask.cdap.proto.metadata.Metadata(metadata.getProperties(), metadata.getTags()));
}
// Create result
result.add(new MetadataSearchResultRecord(entity, builder.build()));
}
return result;
}
use of co.cask.cdap.proto.metadata.MetadataSearchResultRecord in project cdap by caskdata.
the class MetadataHttpHandlerTestRun method testSearchResultPagination.
@Test
public void testSearchResultPagination() throws Exception {
NamespaceId namespace = new NamespaceId("pagination");
namespaceClient.create(new NamespaceMeta.Builder().setName(namespace).build());
StreamId stream = namespace.stream("text");
DatasetId dataset = namespace.dataset("mydataset");
StreamViewId view = stream.view("view");
DatasetId trackerDataset = namespace.dataset("_auditLog");
// create entities so system metadata is annotated
streamClient.create(stream);
streamViewClient.createOrUpdate(view, new ViewSpecification(new FormatSpecification("csv", null, null)));
datasetClient.create(dataset, new DatasetInstanceConfiguration(Table.class.getName(), Collections.<String, String>emptyMap()));
datasetClient.create(trackerDataset, new DatasetInstanceConfiguration(Table.class.getName(), Collections.<String, String>emptyMap()));
// search with showHidden to true
EnumSet<EntityTypeSimpleName> targets = EnumSet.allOf(EntityTypeSimpleName.class);
String sort = AbstractSystemMetadataWriter.ENTITY_NAME_KEY + " asc";
// search to get all the above entities offset 0, limit interger max and cursors 0
MetadataSearchResponse searchResponse = searchMetadata(namespace, "*", targets, sort, 0, Integer.MAX_VALUE, 0, null, true);
List<MetadataSearchResultRecord> expectedResults = ImmutableList.of(new MetadataSearchResultRecord(trackerDataset), new MetadataSearchResultRecord(dataset), new MetadataSearchResultRecord(stream), new MetadataSearchResultRecord(view));
List<String> expectedCursors = ImmutableList.of();
Assert.assertEquals(expectedResults, new ArrayList<>(searchResponse.getResults()));
Assert.assertEquals(expectedCursors, searchResponse.getCursors());
// no offset, limit 1, no cursors
searchResponse = searchMetadata(namespace, "*", targets, sort, 0, 1, 0, null);
expectedResults = ImmutableList.of(new MetadataSearchResultRecord(dataset));
expectedCursors = ImmutableList.of();
Assert.assertEquals(expectedResults, new ArrayList<>(searchResponse.getResults()));
Assert.assertEquals(expectedCursors, searchResponse.getCursors());
// no offset, limit 1, 2 cursors, should return 1st result, with 2 cursors
searchResponse = searchMetadata(namespace, "*", targets, sort, 0, 1, 2, null);
expectedResults = ImmutableList.of(new MetadataSearchResultRecord(dataset));
expectedCursors = ImmutableList.of(stream.getEntityName(), view.getEntityName());
Assert.assertEquals(expectedResults, new ArrayList<>(searchResponse.getResults()));
Assert.assertEquals(expectedCursors, searchResponse.getCursors());
// offset 1, limit 1, 2 cursors, should return 2nd result, with only 1 cursor since we don't have enough data
searchResponse = searchMetadata(namespace, "*", targets, sort, 1, 1, 2, null);
expectedResults = ImmutableList.of(new MetadataSearchResultRecord(stream));
expectedCursors = ImmutableList.of(view.getEntityName());
Assert.assertEquals(expectedResults, new ArrayList<>(searchResponse.getResults()));
Assert.assertEquals(expectedCursors, searchResponse.getCursors());
// offset 2, limit 1, 2 cursors, should return 3rd result, with 0 cursors since we don't have enough data
searchResponse = searchMetadata(namespace, "*", targets, sort, 2, 1, 2, null);
expectedResults = ImmutableList.of(new MetadataSearchResultRecord(view));
Assert.assertEquals(expectedResults, new ArrayList<>(searchResponse.getResults()));
Assert.assertTrue(searchResponse.getCursors().isEmpty());
// offset 3, limit 1, 2 cursors, should 0 results, with 0 cursors since we don't have enough data
searchResponse = searchMetadata(namespace, "*", targets, sort, 3, 1, 2, null);
Assert.assertTrue(searchResponse.getResults().isEmpty());
Assert.assertTrue(searchResponse.getCursors().isEmpty());
// no offset, no limit, should return everything
searchResponse = searchMetadata(namespace, "*", targets, sort, 0, Integer.MAX_VALUE, 4, null);
expectedResults = ImmutableList.of(new MetadataSearchResultRecord(dataset), new MetadataSearchResultRecord(stream), new MetadataSearchResultRecord(view));
Assert.assertEquals(expectedResults, new ArrayList<>(searchResponse.getResults()));
Assert.assertTrue(searchResponse.getCursors().isEmpty());
// cleanup
namespaceClient.delete(namespace);
}
use of co.cask.cdap.proto.metadata.MetadataSearchResultRecord in project cdap by caskdata.
the class MetadataHttpHandlerTestRun method assertArtifactSearch.
private void assertArtifactSearch() throws Exception {
// add a plugin artifact.
Manifest manifest = new Manifest();
manifest.getMainAttributes().put(ManifestFields.EXPORT_PACKAGE, AllProgramsApp.AppPlugin.class.getPackage().getName());
ArtifactId pluginArtifact = NamespaceId.DEFAULT.artifact("plugins", "1.0.0");
addPluginArtifact(pluginArtifact, AllProgramsApp.AppPlugin.class, manifest, null);
// search using artifact name
Set<MetadataSearchResultRecord> expected = ImmutableSet.of(new MetadataSearchResultRecord(pluginArtifact));
Set<MetadataSearchResultRecord> results = searchMetadata(NamespaceId.DEFAULT, "plugins");
Assert.assertEquals(expected, results);
// search the artifact given a plugin
results = searchMetadata(NamespaceId.DEFAULT, AllProgramsApp.PLUGIN_TYPE);
Assert.assertEquals(expected, results);
results = searchMetadata(NamespaceId.DEFAULT, AllProgramsApp.PLUGIN_NAME + ":" + AllProgramsApp.PLUGIN_TYPE);
Assert.assertEquals(expected, results);
results = searchMetadata(NamespaceId.DEFAULT, AllProgramsApp.PLUGIN_NAME, EntityTypeSimpleName.ARTIFACT);
Assert.assertEquals(expected, results);
// add a user tag to the application with the same name as the plugin
addTags(application, ImmutableSet.of(AllProgramsApp.PLUGIN_NAME));
// search for all entities with plugin name. Should return both artifact and application
results = searchMetadata(NamespaceId.DEFAULT, AllProgramsApp.PLUGIN_NAME);
Assert.assertEquals(ImmutableSet.of(new MetadataSearchResultRecord(application), new MetadataSearchResultRecord(pluginArtifact)), results);
// search for all entities for a plugin with the plugin name. Should return only the artifact, since for the
// application, its just a tag, not a plugin
results = searchMetadata(NamespaceId.DEFAULT, "plugin:" + AllProgramsApp.PLUGIN_NAME + ":*");
Assert.assertEquals(expected, results);
}
use of co.cask.cdap.proto.metadata.MetadataSearchResultRecord in project cdap by caskdata.
the class MetadataHttpHandlerTestRun method testSearchResultSorting.
@Test
public void testSearchResultSorting() throws Exception {
NamespaceId namespace = new NamespaceId("sorting");
namespaceClient.create(new NamespaceMeta.Builder().setName(namespace).build());
StreamId stream = namespace.stream("text");
DatasetId dataset = namespace.dataset("mydataset");
StreamViewId view = stream.view("view");
// create entities so system metadata is annotated
// also ensure that they are created at least 1 ms apart
streamClient.create(stream);
TimeUnit.MILLISECONDS.sleep(1);
streamViewClient.createOrUpdate(view, new ViewSpecification(new FormatSpecification("csv", null, null)));
TimeUnit.MILLISECONDS.sleep(1);
datasetClient.create(dataset, new DatasetInstanceConfiguration(Table.class.getName(), Collections.<String, String>emptyMap()));
// search with bad sort param
EnumSet<EntityTypeSimpleName> targets = EnumSet.allOf(EntityTypeSimpleName.class);
// test ascending order of entity name
Set<MetadataSearchResultRecord> searchResults = searchMetadata(namespace, "*", targets, AbstractSystemMetadataWriter.ENTITY_NAME_KEY + " asc");
List<MetadataSearchResultRecord> expected = ImmutableList.of(new MetadataSearchResultRecord(dataset), new MetadataSearchResultRecord(stream), new MetadataSearchResultRecord(view));
Assert.assertEquals(expected, new ArrayList<>(searchResults));
// test descending order of entity name
searchResults = searchMetadata(namespace, "*", targets, AbstractSystemMetadataWriter.ENTITY_NAME_KEY + " desc");
expected = ImmutableList.of(new MetadataSearchResultRecord(view), new MetadataSearchResultRecord(stream), new MetadataSearchResultRecord(dataset));
Assert.assertEquals(expected, new ArrayList<>(searchResults));
// test ascending order of creation time
searchResults = searchMetadata(namespace, "*", targets, AbstractSystemMetadataWriter.CREATION_TIME_KEY + " asc");
expected = ImmutableList.of(new MetadataSearchResultRecord(stream), new MetadataSearchResultRecord(view), new MetadataSearchResultRecord(dataset));
Assert.assertEquals(expected, new ArrayList<>(searchResults));
// test descending order of creation time
searchResults = searchMetadata(namespace, "*", targets, AbstractSystemMetadataWriter.CREATION_TIME_KEY + " desc");
expected = ImmutableList.of(new MetadataSearchResultRecord(dataset), new MetadataSearchResultRecord(view), new MetadataSearchResultRecord(stream));
Assert.assertEquals(expected, new ArrayList<>(searchResults));
// cleanup
namespaceClient.delete(namespace);
}
Aggregations