This is an automated email from the ASF dual-hosted git repository.
nixon pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/master by this push:
new 06cd0cb ATLAS-3855 :- Bulk entity tag association and bulk api
enhancement, authorization fix.
06cd0cb is described below
commit 06cd0cb35a285b3c4a7b0b3c662ce7263848f7b6
Author: chaitali borole <[email protected]>
AuthorDate: Tue Jul 7 23:20:19 2020 +0530
ATLAS-3855 :- Bulk entity tag association and bulk api enhancement,
authorization fix.
Signed-off-by: nixonrodrigues <[email protected]>
---
.../store/graph/v2/AtlasEntityStoreV2.java | 63 +++++++++++++++-------
.../main/java/org/apache/atlas/RequestContext.java | 9 ++++
.../org/apache/atlas/web/filters/AuditFilter.java | 2 +
3 files changed, 56 insertions(+), 18 deletions(-)
diff --git
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
index 9a33e27..9f8c4c1 100644
---
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
+++
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
@@ -210,10 +210,24 @@ public class AtlasEntityStoreV2 implements
AtlasEntityStore {
AtlasEntitiesWithExtInfo ret =
entityRetriever.toAtlasEntitiesWithExtInfo(guids, isMinExtInfo);
if(ret != null){
- for(String guid : guids){
- AtlasEntity entity = ret.getEntity(guid);
+ for(String guid : guids) {
+ try {
+ AtlasEntity entity = ret.getEntity(guid);
+
+ AtlasAuthorizationUtils.verifyAccess(new
AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, new
AtlasEntityHeader(entity)), "read entity: guid=", guid);
+ } catch (AtlasBaseException e) {
+ if (RequestContext.get().isSkipFailedEntities()) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("getByIds(): ignoring failure for entity
{}: error code={}, message={}", guid, e.getAtlasErrorCode(), e.getMessage());
+ }
+
+ ret.removeEntity(guid);
+
+ continue;
+ }
- AtlasAuthorizationUtils.verifyAccess(new
AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, new
AtlasEntityHeader(entity)), "read entity: guid=", guid);
+ throw e;
+ }
}
}
@@ -706,37 +720,50 @@ public class AtlasEntityStoreV2 implements
AtlasEntityStore {
if (CollectionUtils.isEmpty(guids)) {
throw new AtlasBaseException(AtlasErrorCode.INVALID_PARAMETERS,
"Guid(s) not specified");
}
+
if (classification == null) {
throw new AtlasBaseException(AtlasErrorCode.INVALID_PARAMETERS,
"classification not specified");
}
- EntityMutationContext context = new EntityMutationContext();
+ validateAndNormalize(classification);
+
+ EntityMutationContext context = new
EntityMutationContext();
+ List<AtlasClassification> classifications =
Collections.singletonList(classification);
+ List<String> validGuids = new ArrayList<>();
GraphTransactionInterceptor.lockObjectAndReleasePostCommit(guids);
for (String guid : guids) {
- AtlasVertex entityVertex = AtlasGraphUtilsV2.findByGuid(graph,
guid);
+ try {
+ AtlasVertex entityVertex = AtlasGraphUtilsV2.findByGuid(graph,
guid);
- if (entityVertex == null) {
- throw new
AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid);
- }
+ if (entityVertex == null) {
+ throw new
AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid);
+ }
- AtlasEntityHeader entityHeader =
entityRetriever.toAtlasEntityHeaderWithClassifications(entityVertex);
+ AtlasEntityHeader entityHeader =
entityRetriever.toAtlasEntityHeaderWithClassifications(entityVertex);
- AtlasAuthorizationUtils.verifyAccess(new
AtlasEntityAccessRequest(typeRegistry,
AtlasPrivilege.ENTITY_ADD_CLASSIFICATION, entityHeader, classification),
- "add classification: guid=",
guid, ", classification=", classification.getTypeName());
+ AtlasAuthorizationUtils.verifyAccess(new
AtlasEntityAccessRequest(typeRegistry,
AtlasPrivilege.ENTITY_ADD_CLASSIFICATION, entityHeader, classification),
+ "add classification: guid=", guid, ",
classification=", classification.getTypeName());
- context.cacheEntity(guid, entityVertex,
typeRegistry.getEntityTypeByName(entityHeader.getTypeName()));
- }
+ validateEntityAssociations(guid, classifications);
+ validGuids.add(guid);
+ context.cacheEntity(guid, entityVertex,
typeRegistry.getEntityTypeByName(entityHeader.getTypeName()));
+ } catch (AtlasBaseException abe) {
+ if (RequestContext.get().isSkipFailedEntities()) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("addClassification(): ignoring failure for
entity {}: error code={}, message={}", guid, abe.getAtlasErrorCode(),
abe.getMessage());
+ }
- validateAndNormalize(classification);
-
- List<AtlasClassification> classifications =
Collections.singletonList(classification);
+ continue;
+ }
- for (String guid : guids) {
- validateEntityAssociations(guid, classifications);
+ throw abe;
+ }
+ }
+ for (String guid : validGuids) {
entityGraphMapper.addClassifications(context, guid,
classifications);
}
}
diff --git a/server-api/src/main/java/org/apache/atlas/RequestContext.java
b/server-api/src/main/java/org/apache/atlas/RequestContext.java
index 282a66f..c5cbf05 100644
--- a/server-api/src/main/java/org/apache/atlas/RequestContext.java
+++ b/server-api/src/main/java/org/apache/atlas/RequestContext.java
@@ -71,6 +71,7 @@ public class RequestContext {
private boolean isInNotificationProcessing = false;
private boolean isInTypePatching = false;
private boolean createShellEntityForNonExistingReference = false;
+ private boolean skipFailedEntities = false;
private RequestContext() {
}
@@ -208,6 +209,14 @@ public class RequestContext {
this.createShellEntityForNonExistingReference =
createShellEntityForNonExistingReference;
}
+ public boolean isSkipFailedEntities() {
+ return skipFailedEntities;
+ }
+
+ public void setSkipFailedEntities(boolean skipFailedEntities) {
+ this.skipFailedEntities = skipFailedEntities;
+ }
+
public void recordEntityUpdate(AtlasEntityHeader entity) {
if (entity != null && entity.getGuid() != null && !
entitiesToSkipUpdate.contains(entity.getGuid())) {
updatedEntities.put(entity.getGuid(), entity);
diff --git a/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java
b/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java
index c663b00..7e66981 100755
--- a/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java
+++ b/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java
@@ -82,6 +82,7 @@ public class AuditFilter implements Filter {
final String user =
AtlasAuthorizationUtils.getCurrentUserName();
final Set<String> userGroups =
AtlasAuthorizationUtils.getCurrentUserGroups();
final String deleteType =
httpRequest.getParameter("deleteType");
+ final boolean skipFailedEntities =
Boolean.parseBoolean(httpRequest.getParameter("skipFailedEntities"));
try {
currentThread.setName(formatName(oldName, requestId));
@@ -92,6 +93,7 @@ public class AuditFilter implements Filter {
requestContext.setClientIPAddress(AtlasAuthorizationUtils.getRequestIpAddress(httpRequest));
requestContext.setCreateShellEntityForNonExistingReference(createShellEntityForNonExistingReference);
requestContext.setForwardedAddresses(AtlasAuthorizationUtils.getForwardedAddressesFromRequest(httpRequest));
+ requestContext.setSkipFailedEntities(skipFailedEntities);
if (StringUtils.isNotEmpty(deleteType)) {
if (deleteTypeOverrideEnabled) {