This is an automated email from the ASF dual-hosted git repository.
madhan pushed a commit to branch RANGER-3923
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/RANGER-3923 by this push:
new 043180fa5 RANGER-4267: link resource-based services with gds-service
043180fa5 is described below
commit 043180fa5d53cd1654cef189a644481b3d131a8f
Author: Madhan Neethiraj <[email protected]>
AuthorDate: Fri Jun 16 23:35:29 2023 -0700
RANGER-4267: link resource-based services with gds-service
---
.../apache/ranger/plugin/model/RangerService.java | 66 +++++-
.../plugin/model/RangerServiceHeaderInfo.java | 19 +-
.../model/validation/RangerServiceValidator.java | 78 ++++++-
.../ranger/plugin/store/AbstractPredicateUtil.java | 34 +++
.../ranger/plugin/store/ServicePredicateUtil.java | 77 +++++++
.../apache/ranger/plugin/util/SearchFilter.java | 2 +
.../python/apache_ranger/model/ranger_service.py | 4 +
.../optimized/current/ranger_core_db_mysql.sql | 6 +-
.../optimized/current/ranger_core_db_oracle.sql | 6 +-
.../optimized/current/ranger_core_db_postgres.sql | 6 +-
.../current/ranger_core_db_sqlanywhere.sql | 5 +
.../optimized/current/ranger_core_db_sqlserver.sql | 5 +
.../java/org/apache/ranger/biz/ServiceDBStore.java | 47 ++++-
.../org/apache/ranger/entity/XXServiceBase.java | 133 ++++--------
.../apache/ranger/entity/XXServiceVersionInfo.java | 85 ++++----
.../java/org/apache/ranger/rest/ServiceREST.java | 231 +++++++++++----------
.../ranger/service/RangerServiceService.java | 10 +-
.../ranger/service/RangerServiceServiceBase.java | 21 ++
18 files changed, 572 insertions(+), 263 deletions(-)
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerService.java
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerService.java
index 326c91cfb..f5ab21c9a 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerService.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerService.java
@@ -55,13 +55,16 @@ public class RangerService extends RangerBaseModelObject
implements java.io.Seri
private Date policyUpdateTime;
private Long tagVersion;
private Date tagUpdateTime;
+ private String gdsService;
+ private Long gdsVersion;
+ private Date gdsUpdateTime;
/**
* @param
*/
public RangerService() {
- this(null, null, null, null, null);
+ this(null, null, null, null, null, null);
}
/**
@@ -72,12 +75,24 @@ public class RangerService extends RangerBaseModelObject
implements java.io.Seri
* @param tagService
*/
public RangerService(String type, String name, String description,
String tagService, Map<String, String> configs) {
+ this(type, name, description, tagService, null, configs);
+ }
+
+ /**
+ * @param type
+ * @param name
+ * @param description
+ * @param configs
+ * @param tagService
+ */
+ public RangerService(String type, String name, String description,
String tagService, String gdsService, Map<String, String> configs) {
super();
setType(type);
setName(name);
setDescription(description);
setTagService(tagService);
+ setGdsService(gdsService);
setConfigs(configs);
}
@@ -97,6 +112,9 @@ public class RangerService extends RangerBaseModelObject
implements java.io.Seri
setPolicyUpdateTime(other.getPolicyUpdateTime());
setTagVersion(other.getTagVersion());
setTagUpdateTime(other.getTagUpdateTime());
+ setGdsService(other.getGdsService());
+ setGdsVersion(other.getGdsVersion());
+ setGdsUpdateTime(other.getGdsUpdateTime());
}
/**
@@ -248,6 +266,49 @@ public class RangerService extends RangerBaseModelObject
implements java.io.Seri
this.tagUpdateTime = tagUpdateTime;
}
+ /**
+ * @return the gdsService
+ */
+ public String getGdsService() {
+ return gdsService;
+ }
+
+ /**
+ * @param gdsService the gdsServiceName to set
+ */
+ public void setGdsService(String gdsService) {
+ this.gdsService = gdsService;
+ }
+
+ /**
+ * @return the gdsVersion
+ */
+ public Long getGdsVersion() {
+ return gdsVersion;
+ }
+
+ /**
+ * @param gdsVersion the gdsVersion to set
+ */
+ public void setGdsVersion(Long gdsVersion) {
+ this.gdsVersion = gdsVersion;
+ }
+
+
+ /**
+ * @return the gdsUpdateTime
+ */
+ public Date getGdsUpdateTime() {
+ return gdsUpdateTime;
+ }
+
+ /**
+ * @param gdsUpdateTime the gdsUpdateTime to set
+ */
+ public void setGdsUpdateTime(Date gdsUpdateTime) {
+ this.gdsUpdateTime = gdsUpdateTime;
+ }
+
@Override
public String toString( ) {
StringBuilder sb = new StringBuilder();
@@ -283,6 +344,9 @@ public class RangerService extends RangerBaseModelObject
implements java.io.Seri
sb.append("tagVersion={").append(tagVersion).append("} ");
sb.append("tagUpdateTime={").append(tagUpdateTime).append("} ");
+ sb.append("gdsService={").append(gdsService).append("} ");
+ sb.append("gdsVersion={").append(gdsVersion).append("} ");
+ sb.append("gdsUpdateTime={").append(gdsUpdateTime).append("} ");
sb.append("}");
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceHeaderInfo.java
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceHeaderInfo.java
index 9891c06c2..5db395a96 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceHeaderInfo.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceHeaderInfo.java
@@ -34,19 +34,22 @@ public class RangerServiceHeaderInfo extends
RangerBaseModelObject implements ja
private String name;
private Boolean isTagService;
+ private Boolean isGdsService;
public RangerServiceHeaderInfo() {
- super();
- setId(-1L);
- setName("");
- setIsTagService(false);
+ this(-1L, "", false, false);
}
public RangerServiceHeaderInfo(Long id, String name, boolean isTagService)
{
+ this(id, name, isTagService, false);
+ }
+
+ public RangerServiceHeaderInfo(Long id, String name, boolean isTagService,
boolean isGdsService) {
super();
setId(id);
setName(name);
setIsTagService(isTagService);
+ setIsGdsService(isGdsService);
}
public String getName() {
@@ -64,4 +67,12 @@ public class RangerServiceHeaderInfo extends
RangerBaseModelObject implements ja
public void setIsTagService(Boolean isTagService) {
this.isTagService = isTagService;
}
+
+ public Boolean getIsGdsService() {
+ return isGdsService;
+ }
+
+ public void setIsGdsService(Boolean isGdsService) {
+ this.isGdsService = isGdsService;
+ }
}
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerServiceValidator.java
b/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerServiceValidator.java
index 6ae6b6610..a9ad08a48 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerServiceValidator.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerServiceValidator.java
@@ -268,32 +268,76 @@ public class RangerServiceValidator extends
RangerValidator {
}
}
String tagServiceName = service.getTagService();
+ String gdsServiceName = service.getGdsService();
- if (StringUtils.isNotBlank(tagServiceName) &&
StringUtils.equals(type, EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME))
{
- failures.add(new
ValidationFailureDetailsBuilder()
- .field("tag_service")
- .isSemanticallyIncorrect()
- .becauseOf("tag service cannot
be part of any other service")
- .build());
- valid = false;
+ if (StringUtils.equals(type,
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME)) {
+ if (StringUtils.isNotBlank(tagServiceName)) {
+ failures.add(new
ValidationFailureDetailsBuilder()
+ .field("tag_service")
+
.isSemanticallyIncorrect()
+ .becauseOf("tag service
cannot be part of a tag service")
+ .build());
+ valid = false;
+ }
+
+ if (StringUtils.isNotBlank(gdsServiceName)) {
+ failures.add(new
ValidationFailureDetailsBuilder()
+ .field("gds_service")
+
.isSemanticallyIncorrect()
+ .becauseOf("tag service
cannot be part of a gds service")
+ .build());
+ valid = false;
+ }
+ }
+
+ if (StringUtils.equals(type,
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_GDS_NAME)) {
+ if (StringUtils.isNotBlank(tagServiceName)) {
+ failures.add(new
ValidationFailureDetailsBuilder()
+ .field("tag_service")
+
.isSemanticallyIncorrect()
+ .becauseOf("gds service
cannot be linked to a tag service")
+ .build());
+ valid = false;
+ }
+
+ if (StringUtils.isNotBlank(gdsServiceName)) {
+ failures.add(new
ValidationFailureDetailsBuilder()
+ .field("gds_service")
+
.isSemanticallyIncorrect()
+ .becauseOf("gds service
cannot be linked to a gds service")
+ .build());
+ valid = false;
+ }
}
- boolean needToEnsureServiceType = false;
+ boolean needToEnsureTagServiceType = false;
+ boolean needToEnsureGdsServiceType = false;
if (action == Action.UPDATE) {
RangerService otherService = getService(name);
String otherTagServiceName = otherService ==
null ? null : otherService.getTagService();
+ String otherGdsServiceName = otherService ==
null ? null : otherService.getGdsService();
if (StringUtils.isNotBlank(tagServiceName)) {
if (!StringUtils.equals(tagServiceName,
otherTagServiceName)) {
- needToEnsureServiceType = true;
+ needToEnsureTagServiceType =
true;
+ }
+ }
+
+ if (StringUtils.isNotBlank(gdsServiceName)) {
+ if (!StringUtils.equals(gdsServiceName,
otherGdsServiceName)) {
+ needToEnsureGdsServiceType =
true;
}
}
} else { // action == Action.CREATE
if (StringUtils.isNotBlank(tagServiceName)) {
- needToEnsureServiceType = true;
+ needToEnsureTagServiceType = true;
+ }
+
+ if (StringUtils.isNotBlank(gdsServiceName)) {
+ needToEnsureGdsServiceType = true;
}
}
- if (needToEnsureServiceType) {
+ if (needToEnsureTagServiceType) {
RangerService maybeTagService =
getService(tagServiceName);
if (maybeTagService == null ||
!StringUtils.equals(maybeTagService.getType(),
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME)) {
failures.add(new
ValidationFailureDetailsBuilder()
@@ -304,6 +348,18 @@ public class RangerServiceValidator extends
RangerValidator {
valid = false;
}
}
+
+ if (needToEnsureGdsServiceType) {
+ RangerService gdsService =
getService(gdsServiceName);
+ if (gdsService == null ||
!StringUtils.equals(gdsService.getType(),
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_GDS_NAME)) {
+ failures.add(new
ValidationFailureDetailsBuilder()
+ .field("gds_service")
+
.isSemanticallyIncorrect()
+ .becauseOf("gds service
name does not refer to existing gds service:" + gdsServiceName)
+ .build());
+ valid = false;
+ }
+ }
}
if(LOG.isDebugEnabled()) {
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractPredicateUtil.java
b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractPredicateUtil.java
index 07c561506..0c47515ef 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractPredicateUtil.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractPredicateUtil.java
@@ -91,6 +91,7 @@ public class AbstractPredicateUtil {
addPredicateForIsEnabled(filter.getParam(SearchFilter.IS_ENABLED), predicates);
addPredicateForIsRecursive(filter.getParam(SearchFilter.IS_RECURSIVE),
predicates);
addPredicateForTagServiceName(filter.getParam(SearchFilter.TAG_SERVICE_NAME),
predicates);
+
addPredicateForGdsServiceName(filter.getParam(SearchFilter.GDS_SERVICE_NAME),
predicates);
//
addPredicateForTagServiceId(filter.getParam(SearchFilter.TAG_SERVICE_ID),
predicates); // not supported
addPredicateForUserName(filter.getParam(SearchFilter.USER),
predicates);
addPredicateForGroupName(filter.getParam(SearchFilter.GROUP),
predicates);
@@ -857,6 +858,39 @@ public class AbstractPredicateUtil {
return ret;
}
+ private Predicate addPredicateForGdsServiceName(final String
gdsServiceName, List<Predicate> predicates) {
+ if(StringUtils.isEmpty(gdsServiceName)) {
+ return null;
+ }
+
+ Predicate ret = new Predicate() {
+ @Override
+ public boolean evaluate(Object object) {
+ if(object == null) {
+ return false;
+ }
+
+ boolean ret = false;
+
+ if(object instanceof RangerService) {
+ RangerService service =
(RangerService)object;
+
+ ret =
StringUtils.equals(gdsServiceName, service.getGdsService());
+ } else {
+ ret = true;
+ }
+
+ return ret;
+ }
+ };
+
+ if(ret != null) {
+ predicates.add(ret);
+ }
+
+ return ret;
+ }
+
private Predicate addPredicateForResourceSignature(String signature,
List<Predicate> predicates) {
Predicate ret = createPredicateForResourceSignature(signature);
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/store/ServicePredicateUtil.java
b/agents-common/src/main/java/org/apache/ranger/plugin/store/ServicePredicateUtil.java
index 757dc6719..26c5dd7e3 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/store/ServicePredicateUtil.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/store/ServicePredicateUtil.java
@@ -44,6 +44,8 @@ public class ServicePredicateUtil extends
AbstractPredicateUtil {
addPredicateForServiceId(filter.getParam(SearchFilter.SERVICE_ID), predicates);
addPredicateForTagSeviceName(filter.getParam(SearchFilter.TAG_SERVICE_NAME),
predicates);
addPredicateForTagSeviceId(filter.getParam(SearchFilter.TAG_SERVICE_ID),
predicates);
+
addPredicateForGdsSeviceName(filter.getParam(SearchFilter.GDS_SERVICE_NAME),
predicates);
+
addPredicateForGdsSeviceId(filter.getParam(SearchFilter.GDS_SERVICE_ID),
predicates);
}
private String getServiceType(String serviceName) {
@@ -230,4 +232,79 @@ public class ServicePredicateUtil extends
AbstractPredicateUtil {
return ret;
}
+
+ private Predicate addPredicateForGdsSeviceName(final String
gdsServiceName, List<Predicate> predicates) {
+ if(StringUtils.isEmpty(gdsServiceName)) {
+ return null;
+ }
+
+ Predicate ret = new Predicate() {
+ @Override
+ public boolean evaluate(Object object) {
+ if(object == null) {
+ return false;
+ }
+
+ boolean ret = false;
+
+ if(object instanceof RangerService) {
+ RangerService service =
(RangerService)object;
+
+ ret =
StringUtils.equals(gdsServiceName, service.getGdsService());
+ } else {
+ ret = true;
+ }
+
+ return ret;
+ }
+ };
+
+ if(predicates != null) {
+ predicates.add(ret);
+ }
+
+ return ret;
+ }
+
+ private Predicate addPredicateForGdsSeviceId(final String gdsServiceId,
List<Predicate> predicates) {
+ if(StringUtils.isEmpty(gdsServiceId)) {
+ return null;
+ }
+
+ Predicate ret = new Predicate() {
+ @Override
+ public boolean evaluate(Object object) {
+ if(object == null) {
+ return false;
+ }
+
+ boolean ret = false;
+
+ if(object instanceof RangerService) {
+ RangerService service =
(RangerService)object;
+
+ if(!
StringUtils.isEmpty(service.getGdsService())) {
+ RangerService gdsService = null;
+
+ try {
+ gdsService =
serviceStore.getServiceByName(service.getGdsService());
+ } catch(Exception excp) {
+ }
+
+ ret = gdsService != null &&
gdsService.getId() != null && StringUtils.equals(gdsServiceId,
gdsService.getId().toString());
+ }
+ } else {
+ ret = true;
+ }
+
+ return ret;
+ }
+ };
+
+ if(predicates != null) {
+ predicates.add(ret);
+ }
+
+ return ret;
+ }
}
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
index ea8dec8c2..440bb4c24 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
@@ -38,6 +38,8 @@ public class SearchFilter {
public static final String IS_RECURSIVE = "isRecursive"; // search
public static final String TAG_SERVICE_NAME = "tagServiceName"; //
search
public static final String TAG_SERVICE_ID = "tagServiceId"; // search
+ public static final String GDS_SERVICE_NAME = "gdsServiceName"; //
search
+ public static final String GDS_SERVICE_ID = "gdsServiceId"; // search
public static final String USER = "user"; // search
public static final String GROUP = "group"; // search
public static final String ROLE = "role"; // search
diff --git a/intg/src/main/python/apache_ranger/model/ranger_service.py
b/intg/src/main/python/apache_ranger/model/ranger_service.py
index a1346d5b5..e9b69ba5a 100644
--- a/intg/src/main/python/apache_ranger/model/ranger_service.py
+++ b/intg/src/main/python/apache_ranger/model/ranger_service.py
@@ -36,6 +36,9 @@ class RangerService(RangerBaseModelObject):
self.policyUpdateTime = attrs.get('policyUpdateTime')
self.tagVersion = attrs.get('tagVersion')
self.tagUpdateTime = attrs.get('tagUpdateTime')
+ self.gdsService = attrs.get('gdsService')
+ self.gdsVersion = attrs.get('gdsVersion')
+ self.gdsUpdateTime = attrs.get('gdsUpdateTime')
class RangerServiceHeaderInfo(RangerBaseModelObject):
@@ -47,3 +50,4 @@ class RangerServiceHeaderInfo(RangerBaseModelObject):
self.name = attrs.get('name')
self.isTagService = attrs.get('isTagService')
+ self.isGdsService = attrs.get('isGdsService')
diff --git a/security-admin/db/mysql/optimized/current/ranger_core_db_mysql.sql
b/security-admin/db/mysql/optimized/current/ranger_core_db_mysql.sql
index de9512624..12262dfc5 100644
--- a/security-admin/db/mysql/optimized/current/ranger_core_db_mysql.sql
+++ b/security-admin/db/mysql/optimized/current/ranger_core_db_mysql.sql
@@ -563,6 +563,7 @@ CREATE TABLE `x_service` (
`tag_service` BIGINT DEFAULT NULL NULL,
`tag_version` BIGINT DEFAULT 0 NOT NULL,
`tag_update_time` DATETIME DEFAULT NULL NULL,
+`gds_service` BIGINT DEFAULT NULL NULL,
primary key (`id`),
UNIQUE KEY `X_service_name` (`name`),
KEY `x_service_added_by_id` (`added_by_id`),
@@ -573,7 +574,8 @@ KEY `x_service_type` (`type`),
CONSTRAINT `x_service_FK_added_by_id` FOREIGN KEY (`added_by_id`) REFERENCES
`x_portal_user` (`id`),
CONSTRAINT `x_service_FK_upd_by_id` FOREIGN KEY (`upd_by_id`) REFERENCES
`x_portal_user` (`id`),
CONSTRAINT `x_service_FK_type` FOREIGN KEY (`type`) REFERENCES `x_service_def`
(`id`),
-CONSTRAINT `x_service_FK_tag_service` FOREIGN KEY (`tag_service`) REFERENCES
`x_service` (`id`)
+CONSTRAINT `x_service_FK_tag_service` FOREIGN KEY (`tag_service`) REFERENCES
`x_service` (`id`),
+CONSTRAINT `x_service_FK_gds_service` FOREIGN KEY (`gds_service`) REFERENCES
`x_service` (`id`)
)ROW_FORMAT=DYNAMIC;
CREATE TABLE IF NOT EXISTS `x_security_zone`(
@@ -1246,6 +1248,8 @@ CREATE TABLE `x_service_version_info` (
`tag_update_time` datetime NULL DEFAULT NULL,
`role_version` bigint(20) NOT NULL DEFAULT 0,
`role_update_time` datetime NULL DEFAULT NULL,
+`gds_version` bigint(20) DEFAULT 0 NOT NULL,
+`gds_update_time` datetime DEFAULT NULL NULL,
`version` bigint(20) NOT NULL DEFAULT '1',
primary key (`id`),
CONSTRAINT `x_service_version_info_FK_service_id` FOREIGN KEY (`service_id`)
REFERENCES `x_service` (`id`)
diff --git
a/security-admin/db/oracle/optimized/current/ranger_core_db_oracle.sql
b/security-admin/db/oracle/optimized/current/ranger_core_db_oracle.sql
index 91ec963ed..c36ca4c7f 100644
--- a/security-admin/db/oracle/optimized/current/ranger_core_db_oracle.sql
+++ b/security-admin/db/oracle/optimized/current/ranger_core_db_oracle.sql
@@ -662,12 +662,14 @@ is_enabled NUMBER(1) DEFAULT '0' NOT NULL,
tag_service NUMBER(20) DEFAULT NULL NULL,
tag_version NUMBER(20) DEFAULT 0 NOT NULL,
tag_update_time DATE DEFAULT NULL NULL,
+gds_service NUMBER(20) DEFAULT NULL NULL,
primary key (id),
CONSTRAINT x_service_name UNIQUE (name),
CONSTRAINT x_service_FK_added_by_id FOREIGN KEY (added_by_id) REFERENCES
x_portal_user (id),
CONSTRAINT x_service_FK_upd_by_id FOREIGN KEY (upd_by_id) REFERENCES
x_portal_user (id),
CONSTRAINT x_service_FK_type FOREIGN KEY (type) REFERENCES x_service_def (id),
-CONSTRAINT x_service_FK_tag_service FOREIGN KEY (tag_service) REFERENCES
x_service(id)
+CONSTRAINT x_service_FK_tag_service FOREIGN KEY (tag_service) REFERENCES
x_service(id),
+CONSTRAINT x_service_FK_gds_service FOREIGN KEY (gds_service) REFERENCES
x_service(id)
);
CREATE TABLE x_security_zone (
@@ -1325,6 +1327,8 @@ tag_version NUMBER(20) DEFAULT 0 NOT NULL,
tag_update_time DATE DEFAULT NULL NULL,
role_version NUMBER(20) DEFAULT 0 NOT NULL,
role_update_time DATE DEFAULT NULL NULL,
+gds_version NUMBER(20) DEFAULT 0 NOT NULL,
+gds_update_time DATE DEFAULT NULL NULL,
version NUMBER(20) DEFAULT 1 NOT NULL,
primary key (id),
CONSTRAINT x_svc_ver_info_FK_service_id FOREIGN KEY (service_id) REFERENCES
x_service(id)
diff --git
a/security-admin/db/postgres/optimized/current/ranger_core_db_postgres.sql
b/security-admin/db/postgres/optimized/current/ranger_core_db_postgres.sql
index c12832d38..31ed661e4 100644
--- a/security-admin/db/postgres/optimized/current/ranger_core_db_postgres.sql
+++ b/security-admin/db/postgres/optimized/current/ranger_core_db_postgres.sql
@@ -575,12 +575,14 @@ is_enabled BOOLEAN DEFAULT '0' NOT NULL,
tag_service BIGINT DEFAULT NULL NULL,
tag_version BIGINT DEFAULT 0 NOT NULL,
tag_update_time TIMESTAMP DEFAULT NULL NULL,
+gds_service NUMBER(20) DEFAULT NULL NULL,
primary key(id),
CONSTRAINT x_service_name UNIQUE(name),
CONSTRAINT x_service_FK_added_by_id FOREIGN KEY(added_by_id) REFERENCES
x_portal_user(id),
CONSTRAINT x_service_FK_upd_by_id FOREIGN KEY(upd_by_id) REFERENCES
x_portal_user(id),
CONSTRAINT x_service_FK_type FOREIGN KEY(type) REFERENCES x_service_def(id),
-CONSTRAINT x_service_FK_tag_service FOREIGN KEY (tag_service) REFERENCES
x_service(id)
+CONSTRAINT x_service_FK_tag_service FOREIGN KEY (tag_service) REFERENCES
x_service(id),
+CONSTRAINT x_service_FK_gds_service FOREIGN KEY (gds_service) REFERENCES
x_service(id)
);
CREATE SEQUENCE x_security_zone_seq;
@@ -1194,6 +1196,8 @@ tag_version bigint NOT NULL DEFAULT '0',
tag_update_time TIMESTAMP DEFAULT NULL,
role_version bigint NOT NULL DEFAULT '0',
role_update_time TIMESTAMP DEFAULT NULL,
+gds_version bigint NOT NULL DEFAULT '0',
+gds_update_time TIMESTAMP DEFAULT NULL,
version bigint NOT NULL DEFAULT '1',
primary key (id),
CONSTRAINT x_service_version_info_service_id FOREIGN KEY (service_id)
REFERENCES x_service (id)
diff --git
a/security-admin/db/sqlanywhere/optimized/current/ranger_core_db_sqlanywhere.sql
b/security-admin/db/sqlanywhere/optimized/current/ranger_core_db_sqlanywhere.sql
index cbae01f82..e99ffa29e 100644
---
a/security-admin/db/sqlanywhere/optimized/current/ranger_core_db_sqlanywhere.sql
+++
b/security-admin/db/sqlanywhere/optimized/current/ranger_core_db_sqlanywhere.sql
@@ -525,6 +525,7 @@ create table dbo.x_service (
tag_service bigint DEFAULT NULL NULL,
tag_version bigint DEFAULT 0 NOT NULL,
tag_update_time datetime DEFAULT NULL NULL,
+ gds_service bigint DEFAULT NULL NULL,
CONSTRAINT x_service_def_PK_id PRIMARY KEY CLUSTERED(id),
CONSTRAINT x_service_UK_name UNIQUE NONCLUSTERED (name)
)
@@ -1021,6 +1022,8 @@ CREATE TABLE dbo.x_service_version_info(
tag_update_time datetime DEFAULT NULL NULL,
role_version bigint NOT NULL DEFAULT 0,
role_update_time datetime DEFAULT NULL NULL,
+ gds_version bigint NOT NULL DEFAULT 0,
+ gds_update_time datetime DEFAULT NULL NULL,
version bigint NOT NULL DEFAULT 1,
CONSTRAINT x_service_version_info_PK_id PRIMARY KEY CLUSTERED(id)
)
@@ -1583,6 +1586,8 @@ ALTER TABLE dbo.x_tag_resource_map ADD CONSTRAINT
x_tag_res_map_FK_upd_by_id FOR
GO
ALTER TABLE dbo.x_service ADD CONSTRAINT x_service_FK_tag_service FOREIGN
KEY(tag_service) REFERENCES dbo.x_service (id)
GO
+ALTER TABLE dbo.x_service ADD CONSTRAINT x_service_FK_gds_service FOREIGN
KEY(gds_service) REFERENCES dbo.x_service (id)
+GO
ALTER TABLE dbo.x_datamask_type_def ADD CONSTRAINT
x_datamask_type_def_FK_def_id FOREIGN KEY(def_id) REFERENCES dbo.x_service_def
(id)
GO
ALTER TABLE dbo.x_datamask_type_def ADD CONSTRAINT
x_datamask_type_def_FK_added_by_id FOREIGN KEY(added_by_id) REFERENCES
dbo.x_portal_user (id)
diff --git
a/security-admin/db/sqlserver/optimized/current/ranger_core_db_sqlserver.sql
b/security-admin/db/sqlserver/optimized/current/ranger_core_db_sqlserver.sql
index 583464890..5e763ca11 100644
--- a/security-admin/db/sqlserver/optimized/current/ranger_core_db_sqlserver.sql
+++ b/security-admin/db/sqlserver/optimized/current/ranger_core_db_sqlserver.sql
@@ -1403,6 +1403,7 @@ CREATE TABLE [dbo].[x_service] (
[tag_service] [bigint] DEFAULT NULL NULL,
[tag_version] [bigint] DEFAULT 0 NOT NULL,
[tag_update_time] [datetime2] DEFAULT NULL NULL,
+ [gds_service] [bigint] DEFAULT NULL NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
@@ -2083,6 +2084,8 @@ CREATE TABLE [dbo].[x_service_version_info](
[tag_update_time] [datetime2] DEFAULT NULL NULL,
[role_version] [bigint] NOT NULL DEFAULT 0,
[role_update_time] [datetime2] DEFAULT NULL NULL,
+ [gds_version] [bigint] NOT NULL DEFAULT 0,
+ [gds_update_time] [datetime2] DEFAULT NULL NULL,
[version] [bigint] NOT NULL DEFAULT 1,
PRIMARY KEY CLUSTERED
(
@@ -2843,6 +2846,8 @@ REFERENCES [dbo].[x_service_def] ([id])
ALTER TABLE [dbo].[x_service] CHECK CONSTRAINT [x_service_FK_type]
ALTER TABLE [dbo].[x_service] WITH CHECK ADD CONSTRAINT
[x_service_FK_tag_service] FOREIGN KEY([tag_service])
REFERENCES [dbo].[x_service] ([id])
+ALTER TABLE [dbo].[x_service] WITH CHECK ADD CONSTRAINT
[x_service_FK_gds_service] FOREIGN KEY([gds_service])
+REFERENCES [dbo].[x_service] ([id])
ALTER TABLE [dbo].[x_policy] WITH CHECK ADD CONSTRAINT
[x_policy_FK_added_by_id] FOREIGN KEY([added_by_id])
REFERENCES [dbo].[x_portal_user] ([id])
ALTER TABLE [dbo].[x_policy] CHECK CONSTRAINT [x_policy_FK_added_by_id]
diff --git
a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
index 6265b8d37..ecef3dc1e 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
@@ -1690,6 +1690,43 @@ public class ServiceDBStore extends AbstractServiceStore
{
hasTagServiceValueChanged = true;
}
+ boolean hasGdsServiceValueChanged = false;
+ Long existingGdsServiceId = existing.getGdsService();
+ String newGdsServiceName = service.getGdsService(); //
null/empty for old clients; blank string to remove existing association
+ Long newGdsServiceId = null;
+
+ if (StringUtils.isEmpty(newGdsServiceName)) { // old client;
don't update existing gdsService
+ if (existingGdsServiceId != null) {
+ newGdsServiceName =
getServiceName(existingGdsServiceId);
+
+ service.setGdsService(newGdsServiceName);
+
+ LOG.info("ServiceDBStore.updateService(id=" +
service.getId() + "; name=" + service.getName() + "): gdsService is null; using
existing gdsService '" + newGdsServiceName + "'");
+ }
+ }
+
+ if (StringUtils.isNotBlank(newGdsServiceName)) {
+ RangerService tmp = getServiceByName(newGdsServiceName);
+
+ if (tmp == null ||
!EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_GDS_NAME.equals(tmp.getType())) {
+ if (LOG.isDebugEnabled()) {
+
LOG.debug("ServiceDBStore.updateService() - " + newGdsServiceName + " does not
refer to a valid gds service.(" + service + ")");
+ }
+
+ throw
restErrorUtil.createRESTException("Invalid gds service name " +
newGdsServiceName, MessageEnums.ERROR_CREATING_OBJECT);
+ } else {
+ newGdsServiceId = tmp.getId();
+ }
+ }
+
+ if (existingGdsServiceId == null) {
+ if (newGdsServiceId != null) {
+ hasGdsServiceValueChanged = true;
+ }
+ } else if (!existingGdsServiceId.equals(newGdsServiceId)) {
+ hasGdsServiceValueChanged = true;
+ }
+
boolean hasIsEnabledChanged =
!existing.getIsenabled().equals(service.getIsEnabled());
List<XXServiceConfigMap> dbConfigMaps =
daoMgr.getXXServiceConfigMap().findByServiceId(service.getId());
@@ -1707,7 +1744,7 @@ public class ServiceDBStore extends AbstractServiceStore {
service.setVersion(existing.getVersion());
service = svcService.update(service);
- if (hasTagServiceValueChanged || hasIsEnabledChanged ||
hasServiceConfigForPluginChanged) {
+ if (hasTagServiceValueChanged ||
hasGdsServiceValueChanged || hasIsEnabledChanged ||
hasServiceConfigForPluginChanged) {
updatePolicyVersion(service,
RangerPolicyDelta.CHANGE_TYPE_SERVICE_CHANGE, null,false);
}
}
@@ -3684,11 +3721,13 @@ public class ServiceDBStore extends
AbstractServiceStore {
serviceVersionInfoDbObj = new
XXServiceVersionInfo();
serviceVersionInfoDbObj.setServiceId(service.getId());
serviceVersionInfoDbObj.setPolicyVersion(nextVersion);
- serviceVersionInfoDbObj.setPolicyUpdateTime(new
Date());
+
serviceVersionInfoDbObj.setPolicyUpdateTime(now);
serviceVersionInfoDbObj.setTagVersion(nextVersion);
- serviceVersionInfoDbObj.setTagUpdateTime(new
Date());
+ serviceVersionInfoDbObj.setTagUpdateTime(now);
serviceVersionInfoDbObj.setRoleVersion(nextVersion);
- serviceVersionInfoDbObj.setRoleUpdateTime(new
Date());
+ serviceVersionInfoDbObj.setRoleUpdateTime(now);
+
serviceVersionInfoDbObj.setGdsVersion(nextVersion);
+ serviceVersionInfoDbObj.setGdsUpdateTime(now);
serviceVersionUpdater.version = nextVersion;
serviceVersionInfoDao.create(serviceVersionInfoDbObj);
diff --git
a/security-admin/src/main/java/org/apache/ranger/entity/XXServiceBase.java
b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceBase.java
index 85ce53cae..d1e991994 100644
--- a/security-admin/src/main/java/org/apache/ranger/entity/XXServiceBase.java
+++ b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceBase.java
@@ -18,6 +18,7 @@
package org.apache.ranger.entity;
import java.util.Date;
+import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
@@ -86,6 +87,9 @@ public abstract class XXServiceBase extends XXDBBase {
@Column(name = "tag_service")
protected Long tagService;
+ @Column(name = "gds_service")
+ protected Long gdsService;
+
/**
* policyVersion of the XXService
* <ul>
@@ -244,6 +248,24 @@ public abstract class XXServiceBase extends XXDBBase {
return this.tagService;
}
+ /**
+ * This method sets the value to the member attribute <b>
gdsService</b> .
+ *
+ * @param gdsService - Value to set member attribute <b> gdsService</b>
+ */
+ public void setGdsService(Long gdsService) {
+ this.gdsService = gdsService;
+ }
+
+ /**
+ * Returns the value for the member attribute <b>gdsService</b>
+ *
+ * @return Long - value of member attribute <b>gdsService</b> .
+ */
+ public Long getGdsService() {
+ return this.gdsService;
+ }
+
/**
* This method sets the value to the member attribute <b>
policyVersion</b>
* . You cannot set null to the attribute.
@@ -371,94 +393,31 @@ public abstract class XXServiceBase extends XXDBBase {
*/
@Override
public boolean equals(Object obj) {
- if (!super.equals(obj)) {
- return false;
- }
+ final boolean ret;
+
if (this == obj) {
- return true;
+ ret = true;
+ } else if (obj == null || getClass() != obj.getClass()) {
+ ret = false;
+ } else {
+ XXServiceBase other = (XXServiceBase) obj;
+
+ ret = super.equals(obj) &&
+ Objects.equals(description,
other.description) &&
+ Objects.equals(isEnabled, other.isEnabled) &&
+ Objects.equals(name, other.name) &&
+ Objects.equals(policyUpdateTime,
other.policyUpdateTime) &&
+ Objects.equals(policyVersion,
other.policyVersion) &&
+ Objects.equals(tagService, other.tagService)
&&
+ Objects.equals(tagVersion, other.tagVersion)
&&
+ Objects.equals(tagUpdateTime,
other.tagUpdateTime) &&
+ Objects.equals(gdsService, other.gdsService)
&&
+ Objects.equals(type, other.type) &&
+ Objects.equals(version, other.version) &&
+ Objects.equals(guid, other.guid);
}
- if (getClass() != obj.getClass()) {
- return false;
- }
- XXServiceBase other = (XXServiceBase) obj;
- if (description == null) {
- if (other.description != null) {
- return false;
- }
- } else if (!description.equals(other.description)) {
- return false;
- }
- if (isEnabled == null) {
- if (other.isEnabled != null) {
- return false;
- }
- } else if (!isEnabled.equals(other.isEnabled)) {
- return false;
- }
- if (name == null) {
- if (other.name != null) {
- return false;
- }
- } else if (!name.equals(other.name)) {
- return false;
- }
- if (tagService == null) {
- if (other.tagService != null) {
- return false;
- }
- } else if (!tagService.equals(other.tagService)) {
- return false;
- }
- if (policyUpdateTime == null) {
- if (other.policyUpdateTime != null) {
- return false;
- }
- } else if (!policyUpdateTime.equals(other.policyUpdateTime)) {
- return false;
- }
- if (policyVersion == null) {
- if (other.policyVersion != null) {
- return false;
- }
- } else if (!policyVersion.equals(other.policyVersion)) {
- return false;
- }
- if (tagUpdateTime == null) {
- if (other.tagUpdateTime != null) {
- return false;
- }
- } else if (!tagUpdateTime.equals(other.tagUpdateTime)) {
- return false;
- }
- if (tagVersion == null) {
- if (other.tagVersion != null) {
- return false;
- }
- } else if (!tagVersion.equals(other.tagVersion)) {
- return false;
- }
- if (type == null) {
- if (other.type != null) {
- return false;
- }
- } else if (!type.equals(other.type)) {
- return false;
- }
- if (version == null) {
- if (other.version != null) {
- return false;
- }
- } else if (!version.equals(other.version)) {
- return false;
- }
- if (guid == null) {
- if (other.guid != null) {
- return false;
- }
- } else if (!guid.equals(other.guid)) {
- return false;
- }
- return true;
+
+ return ret;
}
/*
@@ -469,7 +428,7 @@ public abstract class XXServiceBase extends XXDBBase {
@Override
public String toString() {
return "XXServiceBase [" + super.toString() + " guid=" + guid +
", version=" + version + ", type=" + type
- + ", name=" + name +", displayName=" +
displayName + ", tagService=" + tagService + ", policyVersion=" + policyVersion
+ ", policyUpdateTime=" + policyUpdateTime
+ + ", name=" + name +", displayName=" +
displayName + ", tagService=" + tagService + ", gdsService=" + gdsService + ",
policyVersion=" + policyVersion + ", policyUpdateTime=" + policyUpdateTime
+ ", tagVersion=" + tagVersion + ",
tagUpdateTime=" + tagUpdateTime
+ ", description=" + description + ",
isEnabled=" + isEnabled + "]";
}
diff --git
a/security-admin/src/main/java/org/apache/ranger/entity/XXServiceVersionInfo.java
b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceVersionInfo.java
index cfb0137b9..9edca0a87 100644
---
a/security-admin/src/main/java/org/apache/ranger/entity/XXServiceVersionInfo.java
+++
b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceVersionInfo.java
@@ -20,6 +20,7 @@
package org.apache.ranger.entity;
import java.util.Date;
+import java.util.Objects;
import javax.persistence.Cacheable;
import javax.persistence.Entity;
@@ -77,6 +78,13 @@ public class XXServiceVersionInfo implements
java.io.Serializable {
@Column(name="role_update_time" )
protected Date roleUpdateTime = DateUtil.getUTCDate();
+ @Column(name = "gds_version")
+ protected Long gdsVersion;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column(name = "gds_update_time")
+ protected Date gdsUpdateTime;
+
@Version
@Column(name = "version")
protected Long version;
@@ -167,6 +175,22 @@ public class XXServiceVersionInfo implements
java.io.Serializable {
return this.roleUpdateTime;
}
+ public void setGdsVersion(Long gdsVersion) {
+ this.gdsVersion = gdsVersion;
+ }
+
+ public Long getGdsVersion() {
+ return this.gdsVersion;
+ }
+
+ public void setGdsUpdateTime(Date gdsUpdateTime) {
+ this.gdsUpdateTime = gdsUpdateTime;
+ }
+
+ public Date getGdsUpdateTime() {
+ return this.gdsUpdateTime;
+ }
+
/**
* This return the bean content in string format
* @return formatedStr
@@ -183,6 +207,8 @@ public class XXServiceVersionInfo implements
java.io.Serializable {
str += "tagUpdateTime={" + tagUpdateTime + "} ";
str += "setRoleVersion={" + roleVersion + "}" ;
str += "setRoleUpdateTime={" + roleUpdateTime + "}" ;
+ str += "gdsVersion={" + gdsVersion + "}" ;
+ str += "gdsUpdateTime={" + gdsUpdateTime + "}" ;
str += "}";
return str;
}
@@ -193,43 +219,30 @@ public class XXServiceVersionInfo implements
java.io.Serializable {
*/
@Override
public boolean equals( Object obj) {
- if (obj == null)
- return false;
- if (this == obj)
- return true;
- if (!super.equals(obj))
- return false;
- if (getClass() != obj.getClass())
- return false;
- XXServiceVersionInfo other = (XXServiceVersionInfo) obj;
- if ((this.id == null && other.id != null) || (this.id != null
&& !this.id.equals(other.id))) {
- return false;
+ final boolean ret;
+
+ if (this == obj) {
+ ret = true;
+ } else if (obj == null || getClass() != obj.getClass()) {
+ ret = false;
+ } else {
+ XXServiceVersionInfo other = (XXServiceVersionInfo) obj;
+
+ ret = super.equals(obj) &&
+ Objects.equals(id, other.id) &&
+ Objects.equals(version, other.version) &&
+ Objects.equals(serviceId, other.serviceId) &&
+ Objects.equals(policyVersion,
other.policyVersion) &&
+ Objects.equals(policyUpdateTime,
other.policyUpdateTime) &&
+ Objects.equals(tagVersion, other.tagVersion)
&&
+ Objects.equals(tagUpdateTime,
other.tagUpdateTime) &&
+ Objects.equals(roleVersion,
other.roleVersion) &&
+ Objects.equals(roleUpdateTime,
other.roleUpdateTime) &&
+ Objects.equals(gdsVersion, other.gdsVersion)
&&
+ Objects.equals(gdsUpdateTime,
other.gdsUpdateTime);
}
- if ((version == null && other.version != null) || (this.version
!= null && !this.version.equals(other.version))) {
- return false;
- }
- if ((this.serviceId == null && other.serviceId != null) ||
(this.serviceId != null && !this.serviceId.equals(other.serviceId))) {
- return false;
- }
- if ((this.policyVersion == null && other.policyVersion != null)
|| (this.policyVersion != null &&
!this.policyVersion.equals(other.policyVersion))) {
- return false;
- }
- if ((this.policyUpdateTime == null && other.policyUpdateTime !=
null) || (this.policyUpdateTime != null &&
!this.policyUpdateTime.equals(other.policyUpdateTime))) {
- return false;
- }
- if ((this.tagVersion == null && other.tagVersion != null) ||
(this.tagVersion != null && !this.tagVersion.equals(other.tagVersion))) {
- return false;
- }
- if ((this.tagUpdateTime == null && other.tagUpdateTime != null)
|| (this.tagUpdateTime != null &&
!this.tagUpdateTime.equals(other.tagUpdateTime))) {
- return false;
- }
- if ((this.roleVersion == null && other.roleVersion != null) ||
(this.roleVersion != null && !this.roleVersion.equals(other.roleVersion))) {
- return false;
- }
- if ((this.roleUpdateTime == null && other.roleUpdateTime !=
null) || (this.roleUpdateTime != null &&
!this.roleUpdateTime.equals(other.roleUpdateTime))) {
- return false;
- }
- return true;
+
+ return ret;
}
public static boolean equals(Object object1, Object object2) {
diff --git
a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
index 6348d0287..2bc3ee4ee 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
@@ -768,14 +768,12 @@ public class ServiceREST {
}
bizUtil.blockAuditorRoleUser();
- if (StringUtils.isBlank(service.getTagService())
- && xxServiceDef != null
- &&
!StringUtils.equals(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME,
xxServiceDef.getName())
- &&
!StringUtils.equals(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_KMS_NAME ,
xxServiceDef.getName())) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Tag service may need to be
created and linked with this service:[" + service.getName() + "]");
- }
- createOrGetTagService(service);
+ String serviceType = xxServiceDef != null ?
xxServiceDef.getName() : null;
+
+ if
(!StringUtils.equals(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME,
serviceType) &&
+
!StringUtils.equals(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_GDS_NAME,
serviceType) &&
+
!StringUtils.equals(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_KMS_NAME ,
serviceType)) {
+ createOrGetLinkedServices(service);
}
ret = svcStore.createService(service);
@@ -4210,155 +4208,158 @@ public class ServiceREST {
}
}
- private void createOrGetTagService(RangerService resourceService) {
+ private void createOrGetLinkedServices(RangerService resourceService) {
if (LOG.isDebugEnabled()) {
- LOG.debug("==> createOrGetTagService(resourceService="
+ resourceService.getName() + ")");
+ LOG.debug("==>
createOrGetLinkedServices(resourceService=" + resourceService.getName() + ")");
}
- final boolean isAutoCreateTagService =
config.getBoolean("ranger.tagservice.auto.create", true);
- if (isAutoCreateTagService) {
+ Runnable createAndLinkTagServiceTask = new Runnable() {
+ @Override
+ public void run() {
+ final LinkedServiceCreator creator = new
LinkedServiceCreator(resourceService.getName(),
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME);
- String tagServiceName =
config.get("ranger.tagservice.auto.name");
-
- if (StringUtils.isBlank(tagServiceName)) {
- tagServiceName =
getGeneratedTagServiceName(resourceService.getName());
+ creator.doCreateAndLinkService();
}
+ };
- if (StringUtils.isNotBlank(tagServiceName)) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Attempting to get/create and
possibly link to tag-service:[" + tagServiceName + "]");
- }
-
- final boolean isAutoLinkTagService =
config.getBoolean("ranger.tagservice.auto.link", true);
- RangerService tagService = null;
-
- try {
- tagService =
svcStore.getServiceByName(tagServiceName);
- } catch (Exception e) {
- LOG.info("failed to retrieve
tag-service [" + tagServiceName + "]. Will attempt to create.", e);
- }
-
- if (tagService == null) {
- final TagServiceOperationContext
context = new TagServiceOperationContext(tagServiceName,
resourceService.getName(), isAutoLinkTagService);
+ Runnable createAndLinkGdsServiceTask = new Runnable() {
+ @Override
+ public void run() {
+ final LinkedServiceCreator creator = new
LinkedServiceCreator(resourceService.getName(),
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_GDS_NAME);
- Runnable createAndLinkTagServiceTask =
new Runnable() {
- @Override
- public void run() {
-
doCreateAndLinkTagService(context);
- }
- };
+ creator.doCreateAndLinkService();
+ }
+ };
-
rangerTransactionSynchronizationAdapter.executeOnTransactionCommit(createAndLinkTagServiceTask);
+
rangerTransactionSynchronizationAdapter.executeOnTransactionCommit(createAndLinkTagServiceTask);
+
rangerTransactionSynchronizationAdapter.executeOnTransactionCommit(createAndLinkGdsServiceTask);
- } else if (isAutoLinkTagService) {
-
resourceService.setTagService(tagServiceName);
- }
- }
- }
if (LOG.isDebugEnabled()) {
LOG.debug("<== createOrGetTagService(resourceService="
+ resourceService.getName() + ")");
}
}
- private String getGeneratedTagServiceName(String resourceServiceName) {
- int lastIndexOfMarker =
StringUtils.lastIndexOf(resourceServiceName, '_');
- if (lastIndexOfMarker != -1) {
- return resourceServiceName.substring(0,
lastIndexOfMarker) + "_tag";
- } else {
- return null;
- }
- }
+ private final class LinkedServiceCreator {
+ static final char SEP = '_';
- private final class TagServiceOperationContext {
- final String tagServiceName;
- final String resourceServiceName;
- final boolean isAutoLinkTagService;
+ final String resourceServiceName;
+ final String linkedServiceType;
+ final String linkedServiceName;
+ final boolean isAutoCreate;
+ final boolean isAutoLink;
- TagServiceOperationContext(@Nonnull String tagserviceName,
@Nonnull String resourceServiceName, boolean isAutoLinkTagService) {
- this.tagServiceName = tagserviceName;
+ LinkedServiceCreator(@Nonnull String resourceServiceName,
@Nonnull String linkedServiceType) {
this.resourceServiceName = resourceServiceName;
- this.isAutoLinkTagService = isAutoLinkTagService;
- }
-
- @Override
- public String toString() {
- return "{tagServiceName=" + tagServiceName + ",
resourceServiceName=" + resourceServiceName + ", isAutoLinkTagService=" +
isAutoLinkTagService + "}";
+ this.linkedServiceType = linkedServiceType;
+ this.linkedServiceName = computeLinkedServiceName();
+ this.isAutoCreate = config.getBoolean("ranger."
+ linkedServiceType + "service.auto.create", true);
+ this.isAutoLink = config.getBoolean("ranger."
+ linkedServiceType + "service.auto.link", true);
}
- }
- private void doCreateAndLinkTagService(final TagServiceOperationContext
context) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> doCreateAndLinkTagService(context=" +
context + ")");
- }
+ void doCreateAndLinkService() {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("==> doCreateAndLinkService()");
+ }
- RangerService resourceService = null;
+ RangerService resourceService = null;
- try {
- resourceService =
svcStore.getServiceByName(context.resourceServiceName);
- LOG.info("Successfully retrieved resource-service:[" +
resourceService.getName() + "]");
- } catch (Exception e) {
- LOG.error("Resource-service:[" +
context.resourceServiceName + "] cannot be retrieved");
- }
-
- if (resourceService != null) {
try {
- String tagServiceName = context.tagServiceName;
+ resourceService =
svcStore.getServiceByName(resourceServiceName);
+ LOG.info("Successfully retrieved
resource-service:[" + resourceService.getName() + "]");
+ } catch (Exception e) {
+ LOG.error("Resource-service:[" +
resourceServiceName + "] cannot be retrieved");
+ }
+
+ if (resourceService != null) {
+ try {
+ RangerService linkedService =
svcStore.getServiceByName(linkedServiceName);
- RangerService tagService =
svcStore.getServiceByName(tagServiceName);
+ if (linkedService == null &&
isAutoCreate) {
+ linkedService = new
RangerService();
- if (tagService == null) {
- tagService = new RangerService();
+
linkedService.setName(linkedServiceName);
+
linkedService.setDisplayName(linkedServiceName); //set DEFAULT display name
+
linkedService.setType(linkedServiceType);
-
tagService.setName(context.tagServiceName);
-
tagService.setDisplayName(context.tagServiceName);//set DEFAULT display name
-
tagService.setType(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME);
+ LOG.info("creating service [" +
linkedServiceName + "]");
- LOG.info("creating tag-service [" +
context.tagServiceName + "]");
+
svcStore.createService(linkedService);
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
- svcStore.createService(tagService);
+ if (isAutoLink) {
+ doLinkService();
}
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- if (context.isAutoLinkTagService) {
- doLinkTagService(context);
+ } else {
+ LOG.info("Resource service :[" +
resourceServiceName + "] not found! Returning without linking " +
linkedServiceType + " service!!");
}
- } else {
- LOG.info("Resource service :[" +
context.resourceServiceName + "] not found! Returning without linking tag
service!!");
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("<== doCreateAndLinkService()");
+ }
}
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== doCreateAndLinkTagService(context=" +
context + ")");
- }
- }
+ private String computeLinkedServiceName() {
+ String ret = config.get("ranger." + linkedServiceType +
"service.auto.name");
- private void doLinkTagService(final TagServiceOperationContext context)
{
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> doLinkTagService(context=" + context +
")");
+ if (StringUtils.isBlank(ret)) {
+ final int lastIndexOfSep =
StringUtils.lastIndexOf(resourceServiceName, SEP);
+
+ ret = (lastIndexOfSep != -1) ?
resourceServiceName.substring(0, lastIndexOfSep) + SEP + linkedServiceType :
null;
+ }
+
+ return ret;
}
- try {
- RangerService resourceService =
svcStore.getServiceByName(context.resourceServiceName);
- LOG.info("Successfully retrieved resource-service:[" +
resourceService.getName() + "]");
- RangerService tagService =
svcStore.getServiceByName(context.tagServiceName);
- LOG.info("Successfully retrieved tag-service:[" +
tagService.getName() + "]");
+ private void doLinkService() {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("==> doLinkTagService()");
+ }
+
+ try {
+ RangerService resourceService =
svcStore.getServiceByName(resourceServiceName);
+ LOG.info("Successfully retrieved
resource-service:[" + resourceService.getName() + "]");
+
+ RangerService linkedService =
svcStore.getServiceByName(linkedServiceName);
+ LOG.info("Successfully retrieved service:[" +
linkedService.getName() + "]");
- if (!StringUtils.equals(tagService.getName(),
resourceService.getTagService())) {
-
resourceService.setTagService(tagService.getName());
+ if (linkedService == null) {
+ LOG.error("Failed to link service[" +
resourceServiceName + "] with service [" + linkedServiceName + "]: " +
linkedServiceName + " not found");
+ } else if
(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME.equals(linkedServiceType))
{
+ if
(!StringUtils.equals(linkedService.getName(), resourceService.getTagService()))
{
+
resourceService.setTagService(linkedService.getName());
- LOG.info("Linking resource-service[" +
resourceService.getName() + "] with tag-service [" + tagService.getName() +
"]");
+ LOG.info("Linking
resource-service[" + resourceService.getName() + "] with tag-service [" +
linkedService.getName() + "]");
- RangerService service =
svcStore.updateService(resourceService, null);
+ RangerService service =
svcStore.updateService(resourceService, null);
- LOG.info("Updated resource-service:[" +
service.getName() + "]");
+ LOG.info("Updated
resource-service:[" + service.getName() + "]");
+ }
+ } else if
(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_GDS_NAME.equals(linkedServiceType))
{
+ if
(!StringUtils.equals(linkedService.getName(), resourceService.getGdsService()))
{
+
resourceService.setGdsService(linkedService.getName());
+
+ LOG.info("Linking
resource-service[" + resourceService.getName() + "] with gds-service [" +
linkedService.getName() + "]");
+
+ RangerService service =
svcStore.updateService(resourceService, null);
+
+ LOG.info("Updated
resource-service:[" + service.getName() + "]");
+ }
+ }
+ } catch (Exception e) {
+ LOG.error("Failed to link service[" +
resourceServiceName + "] with service [" + linkedServiceName + "]");
+ }
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("<== doLinkTagService()");
}
- } catch (Exception e) {
- LOG.error("Failed to link service[" +
context.resourceServiceName + "] with tag-service [" + context.tagServiceName +
"]");
}
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== doLinkTagService(context=" + context +
")");
+
+ @Override
+ public String toString() {
+ return "{resourceServiceName=" + resourceServiceName +
", linkedServiceType=" + linkedServiceType + ", isAutoCreate=" + isAutoCreate +
", isAutoLink=" + isAutoLink + "}";
}
}
diff --git
a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceService.java
b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceService.java
index e72bd4c10..8ec558881 100644
---
a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceService.java
+++
b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceService.java
@@ -262,12 +262,16 @@ public class RangerServiceService extends
RangerServiceServiceBase<XXService, Ra
}
oldValue =
jsonUtil.readMapToString(oldConfig);
value =
jsonUtil.readMapToString(newConfig);
- }
- if ("tagService".equalsIgnoreCase(fieldName)) {
+ } else if
("tagService".equalsIgnoreCase(fieldName)) {
if(!StringUtils.isEmpty(oldValue) &&
!"null".equalsIgnoreCase(oldValue)){
RangerService oldService =
this.populateViewBean(mObj);
oldValue=oldService.getTagService();
}
+ } else if
("gdsService".equalsIgnoreCase(fieldName)) {
+ if(!StringUtils.isEmpty(oldValue) &&
!"null".equalsIgnoreCase(oldValue)){
+ RangerService oldService =
this.populateViewBean(mObj);
+ oldValue =
oldService.getGdsService();
+ }
}
if (oldValue == null ||
value.equalsIgnoreCase(oldValue)) {
return null;
@@ -344,6 +348,8 @@ public class RangerServiceService extends
RangerServiceServiceBase<XXService, Ra
serviceVersionInfo.setPolicyUpdateTime(now);
serviceVersionInfo.setTagUpdateTime(now);
serviceVersionInfo.setRoleUpdateTime(now);
+ serviceVersionInfo.setGdsVersion(1L);
+ serviceVersionInfo.setGdsUpdateTime(now);
XXServiceVersionInfoDao serviceVersionInfoDao =
daoMgr.getXXServiceVersionInfo();
diff --git
a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
index fbe5e42d4..5c9591f63 100755
---
a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
+++
b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
@@ -92,10 +92,27 @@ public abstract class RangerServiceServiceBase<T extends
XXServiceBase, V extend
tagServiceId = xTagService.getId();
}
+ Long gdsServiceId = null;
+ String gdsServiceName = vObj.getGdsService();
+
+ if (StringUtils.isNotBlank(gdsServiceName)) {
+ XXService xGdsService =
daoMgr.getXXService().findByName(gdsServiceName);
+
+ if (xGdsService == null) {
+ throw restErrorUtil.createRESTException(
+ "No Service found with name :"
+ gdsServiceName,
+
MessageEnums.INVALID_INPUT_DATA);
+ }
+
+ gdsServiceId = xGdsService.getId();
+ }
+
xObj.setType(xServiceDef.getId());
xObj.setName(vObj.getName());
xObj.setDisplayName(vObj.getDisplayName());
xObj.setTagService(tagServiceId);
+ xObj.setGdsService(gdsServiceId);
+
if (OPERATION_CONTEXT == OPERATION_CREATE_CONTEXT) {
xObj.setTagVersion(vObj.getTagVersion());
}
@@ -108,6 +125,7 @@ public abstract class RangerServiceServiceBase<T extends
XXServiceBase, V extend
protected V mapEntityToViewBean(V vObj, T xObj) {
XXServiceDef xServiceDef =
daoMgr.getXXServiceDef().getById(xObj.getType());
XXService xTagService = xObj.getTagService() != null ?
daoMgr.getXXService().getById(xObj.getTagService()) : null;
+ XXService xGdsService = xObj.getGdsService() != null ?
daoMgr.getXXService().getById(xObj.getGdsService()) : null;
vObj.setType(xServiceDef.getName());
vObj.setGuid(xObj.getGuid());
vObj.setVersion(xObj.getVersion());
@@ -115,12 +133,15 @@ public abstract class RangerServiceServiceBase<T extends
XXServiceBase, V extend
vObj.setDisplayName(xObj.getDisplayName());
vObj.setDescription(xObj.getDescription());
vObj.setTagService(xTagService != null ? xTagService.getName()
: null);
+ vObj.setGdsService(xGdsService != null ? xGdsService.getName()
: null);
XXServiceVersionInfo versionInfoObj =
daoMgr.getXXServiceVersionInfo().findByServiceId(xObj.getId());
if (versionInfoObj != null) {
vObj.setPolicyVersion(versionInfoObj.getPolicyVersion());
vObj.setTagVersion(versionInfoObj.getTagVersion());
vObj.setPolicyUpdateTime(versionInfoObj.getPolicyUpdateTime());
vObj.setTagUpdateTime(versionInfoObj.getTagUpdateTime());
+ vObj.setGdsVersion(versionInfoObj.getGdsVersion());
+
vObj.setGdsUpdateTime(versionInfoObj.getGdsUpdateTime());
} else {
vObj.setPolicyVersion(xObj.getPolicyVersion());
vObj.setTagVersion(xObj.getTagVersion());