This is an automated email from the ASF dual-hosted git repository. sarath pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/atlas.git
commit df58d1ae782ede4b2ee69b1bf6cfba62c604d914 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]> (cherry picked from commit 06cd0cb35a285b3c4a7b0b3c662ce7263848f7b6) --- .../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 f721e7b..7cf77ea 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 b93d31b..befd726 100644 --- a/server-api/src/main/java/org/apache/atlas/RequestContext.java +++ b/server-api/src/main/java/org/apache/atlas/RequestContext.java @@ -70,6 +70,7 @@ public class RequestContext { private boolean isInNotificationProcessing = false; private boolean isInTypePatching = false; private boolean createShellEntityForNonExistingReference = false; + private boolean skipFailedEntities = false; private RequestContext() { } @@ -207,6 +208,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 ddce3de..329d209 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) {
