You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ma...@apache.org on 2015/05/15 07:21:52 UTC

[23/52] [abbrv] incubator-kylin git commit: add DataModelDesc ACL & fix KYLIN-645

add DataModelDesc ACL & fix KYLIN-645


Project: http://git-wip-us.apache.org/repos/asf/incubator-kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-kylin/commit/4c456a21
Tree: http://git-wip-us.apache.org/repos/asf/incubator-kylin/tree/4c456a21
Diff: http://git-wip-us.apache.org/repos/asf/incubator-kylin/diff/4c456a21

Branch: refs/heads/0.8.0
Commit: 4c456a21e144d80b32acf291e000a80d13421135
Parents: a2f4d32
Author: jiazhong <ji...@ebay.com>
Authored: Wed Mar 18 14:47:48 2015 +0800
Committer: honma <ho...@ebay.com>
Committed: Fri May 15 11:36:27 2015 +0800

----------------------------------------------------------------------
 .../java/org/apache/kylin/metadata/MetadataManager.java   |  4 ++--
 .../apache/kylin/rest/controller/ProjectController.java   |  7 +++++--
 .../org/apache/kylin/rest/security/AclEntityFactory.java  |  8 ++++++++
 .../java/org/apache/kylin/rest/service/ModelService.java  |  7 +++++--
 .../org/apache/kylin/rest/service/ProjectService.java     | 10 ++++------
 .../org/apache/kylin/rest/service/CacheServiceTest.java   |  2 +-
 webapp/app/js/model/cubeListModel.js                      |  7 +++++--
 webapp/app/js/model/modelList.js                          | 10 +++++-----
 webapp/app/js/services/models.js                          |  2 +-
 webapp/app/partials/models/models.html                    |  4 ++--
 10 files changed, 38 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/4c456a21/metadata/src/main/java/org/apache/kylin/metadata/MetadataManager.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/MetadataManager.java b/metadata/src/main/java/org/apache/kylin/metadata/MetadataManager.java
index ea03933..86d33f7 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/MetadataManager.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/MetadataManager.java
@@ -284,13 +284,13 @@ public class MetadataManager {
     }
 
     public List<DataModelDesc> getModels() {
-        return new ArrayList<>(dataModelDescMap.values());
+        return new ArrayList<DataModelDesc>(dataModelDescMap.values());
     }
 
     public List<DataModelDesc> getModels(String projectName){
         ProjectInstance projectInstance =  ProjectManager.getInstance(config).getProject(projectName);
         HashSet<DataModelDesc> ret = new HashSet<>();
-        if (projectInstance != null) {
+        if (projectInstance != null&&projectInstance.getModels()!=null) {
             for (String modelName : projectInstance.getModels()) {
                 DataModelDesc model = getDataModelDesc(modelName);
                 if (null != model) {

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/4c456a21/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java b/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
index 3a87858..bb984af 100644
--- a/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
+++ b/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
@@ -92,7 +92,8 @@ public class ProjectController extends BasicController {
 
         ProjectInstance updatedProj = null;
         try {
-            updatedProj = projectService.updateProject(projectRequest);
+            ProjectInstance currentProject = projectService.getProjectManager().getProject(projectRequest.getFormerProjectName());
+            updatedProj = projectService.updateProject(projectRequest,currentProject);
         } catch (Exception e) {
             logger.error("Failed to deal with the request.", e);
             throw new InternalErrorException(e.getLocalizedMessage());
@@ -106,7 +107,9 @@ public class ProjectController extends BasicController {
     @Metered(name = "deleteProject")
     public void deleteProject(@PathVariable String projectName) {
         try {
-            projectService.deleteProject(projectName);
+
+            ProjectInstance project = projectService.getProjectManager().getProject(projectName);
+            projectService.deleteProject(projectName,project);
         } catch (Exception e) {
             logger.error(e.getLocalizedMessage(), e);
             throw new InternalErrorException("Failed to delete project. " + " Caused by: " + e.getMessage(), e);

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/4c456a21/server/src/main/java/org/apache/kylin/rest/security/AclEntityFactory.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/kylin/rest/security/AclEntityFactory.java b/server/src/main/java/org/apache/kylin/rest/security/AclEntityFactory.java
index 0730a55..621fbe4 100644
--- a/server/src/main/java/org/apache/kylin/rest/security/AclEntityFactory.java
+++ b/server/src/main/java/org/apache/kylin/rest/security/AclEntityFactory.java
@@ -21,6 +21,7 @@ package org.apache.kylin.rest.security;
 import org.apache.kylin.common.persistence.RootPersistentEntity;
 import org.apache.kylin.cube.CubeInstance;
 import org.apache.kylin.job.JobInstance;
+import org.apache.kylin.metadata.model.DataModelDesc;
 import org.apache.kylin.metadata.project.ProjectInstance;
 
 /**
@@ -37,6 +38,13 @@ public class AclEntityFactory {
             return cubeInstance;
         }
 
+        if ("DataModelDesc".equals(entityType)) {
+            DataModelDesc modelInstance = new DataModelDesc();
+            modelInstance.setUuid(uuid);
+
+            return modelInstance;
+        }
+
         if ("JobInstance".equals(entityType)) {
             JobInstance jobInstance = new JobInstance();
             jobInstance.setUuid(uuid);

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/4c456a21/server/src/main/java/org/apache/kylin/rest/service/ModelService.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/kylin/rest/service/ModelService.java b/server/src/main/java/org/apache/kylin/rest/service/ModelService.java
index e423c37..181ccdf 100644
--- a/server/src/main/java/org/apache/kylin/rest/service/ModelService.java
+++ b/server/src/main/java/org/apache/kylin/rest/service/ModelService.java
@@ -23,6 +23,7 @@ import org.apache.kylin.metadata.model.DataModelDesc;
 import org.apache.kylin.metadata.project.ProjectInstance;
 import org.apache.kylin.rest.constant.Constant;
 import org.apache.kylin.rest.exception.InternalErrorException;
+import org.apache.kylin.rest.security.AclPermission;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -97,13 +98,15 @@ public class ModelService extends BasicService {
         DataModelDesc createdDesc = null;
         String owner = SecurityContextHolder.getContext().getAuthentication().getName();
         createdDesc = getMetadataManager().createDataModelDesc(desc,projectName,owner);
+
+        accessService.init(createdDesc, AclPermission.ADMINISTRATION);
         ProjectInstance project = getProjectManager().getProject(projectName);
-        accessService.inherit(desc, project);
+        accessService.inherit(createdDesc, project);
         return createdDesc;
     }
 
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#model, 'ADMINISTRATION') or hasPermission(#model, 'MANAGEMENT')")
+    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#desc, 'ADMINISTRATION') or hasPermission(#desc, 'MANAGEMENT')")
     public DataModelDesc updateModelAndDesc(DataModelDesc desc, String newProjectName) throws IOException {
         DataModelDesc existingModel = getMetadataManager().getDataModelDesc(desc.getName());
         if (existingModel == null) {

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/4c456a21/server/src/main/java/org/apache/kylin/rest/service/ProjectService.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/kylin/rest/service/ProjectService.java b/server/src/main/java/org/apache/kylin/rest/service/ProjectService.java
index 9b6464c..2013a9f 100644
--- a/server/src/main/java/org/apache/kylin/rest/service/ProjectService.java
+++ b/server/src/main/java/org/apache/kylin/rest/service/ProjectService.java
@@ -65,13 +65,12 @@ public class ProjectService extends BasicService {
         return createdProject;
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#cube, 'ADMINISTRATION') or hasPermission(#cube, 'MANAGEMENT')")
-    public ProjectInstance updateProject(UpdateProjectRequest projectRequest) throws IOException {
+    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#currentProject, 'ADMINISTRATION') or hasPermission(#currentProject, 'MANAGEMENT')")
+    public ProjectInstance updateProject(UpdateProjectRequest projectRequest,ProjectInstance currentProject) throws IOException {
         String formerProjectName = projectRequest.getFormerProjectName();
         String newProjectName = projectRequest.getNewProjectName();
         String newDescription = projectRequest.getNewDescription();
 
-        ProjectInstance currentProject = getProjectManager().getProject(formerProjectName);
 
         if (currentProject == null) {
             throw new InternalErrorException("The project named " + formerProjectName + " does not exists");
@@ -101,9 +100,8 @@ public class ProjectService extends BasicService {
         return projects.subList(coffset, coffset + climit);
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#cube, 'ADMINISTRATION') or hasPermission(#cube, 'MANAGEMENT')")
-    public void deleteProject(String projectName) throws IOException {
-        ProjectInstance project = getProjectManager().getProject(projectName);
+    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#project, 'ADMINISTRATION') or hasPermission(#cube, 'MANAGEMENT')")
+    public void deleteProject(String projectName,ProjectInstance project) throws IOException {
         getProjectManager().dropProject(projectName);
 
         accessService.clean(project, true);

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/4c456a21/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java
----------------------------------------------------------------------
diff --git a/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java b/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java
index 64a71c4..6407b06 100644
--- a/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java
+++ b/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java
@@ -303,7 +303,7 @@ public class CacheServiceTest extends LocalFileMetadataTestCase {
         assertTrue(metadataManagerB.getDataModelDesc(dataModelName) == null);
 
         dataModelDesc.setName(dataModelName);
-        metadataManager.createDataModelDesc(dataModelDesc);
+        metadataManager.createDataModelDesc(dataModelDesc,"default","ADMIN");
         //only one for data model update
         assertEquals(1, broadcaster.getCounterAndClear());
         waitForCounterAndClear(1);

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/4c456a21/webapp/app/js/model/cubeListModel.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/model/cubeListModel.js b/webapp/app/js/model/cubeListModel.js
index 3cd1b2b..3e3834f 100755
--- a/webapp/app/js/model/cubeListModel.js
+++ b/webapp/app/js/model/cubeListModel.js
@@ -16,7 +16,7 @@
  * limitations under the License.
 */
 
-KylinApp.service('CubeList',function(CubeService,$q){
+KylinApp.service('CubeList',function(CubeService,$q,AccessService){
     var cubes=[];
     var _this = this;
 
@@ -25,8 +25,11 @@ KylinApp.service('CubeList',function(CubeService,$q){
         var defer = $q.defer();
         CubeService.list(queryParam, function (_cubes) {
             angular.forEach(_cubes, function (cube, index) {
+                AccessService.list({type: "CubeInstance", uuid: cube.uuid}, function (accessEntities) {
+                    cube.accessEntities = accessEntities;
+                });
+
                 if(cube.name){
-//                    $scope.listAccess(cube, 'CubeInstance');
                     if (cube.segments && cube.segments.length > 0) {
                         for(var i= cube.segments.length-1;i>=0;i--){
                             if(cube.segments[i].status==="READY"){

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/4c456a21/webapp/app/js/model/modelList.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/model/modelList.js b/webapp/app/js/model/modelList.js
index 30e9b70..9e92ed9 100644
--- a/webapp/app/js/model/modelList.js
+++ b/webapp/app/js/model/modelList.js
@@ -16,7 +16,7 @@
  * limitations under the License.
 */
 
-KylinApp.service('ModelList',function(ModelService,$q){
+KylinApp.service('ModelList',function(ModelService,$q,AccessService){
     var models=[];
     var _this = this;
 
@@ -24,10 +24,10 @@ KylinApp.service('ModelList',function(ModelService,$q){
 
         var defer = $q.defer();
         ModelService.list(queryParam, function (_models) {
-            angular.forEach(_models, function (models, index) {
-                if(models.name){
-//                    $scope.listAccess(models, 'modelsInstance');
-                }
+            angular.forEach(_models, function (model, index) {
+                AccessService.list({type: "DataModelDesc", uuid: model.uuid}, function (accessEntities) {
+                    model.accessEntities = accessEntities;
+                });
             });
             _models = _.filter(_models,function(models){return models.name!=undefined});
             _this.models = _this.models.concat(_models);

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/4c456a21/webapp/app/js/services/models.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/services/models.js b/webapp/app/js/services/models.js
index 7698e49..fff4c4f 100644
--- a/webapp/app/js/services/models.js
+++ b/webapp/app/js/services/models.js
@@ -21,6 +21,6 @@ KylinApp.factory('ModelService', ['$resource', function ($resource, config) {
         list: {method: 'GET', params: {}, isArray: true},
         drop: {method: 'DELETE', params: {}, isArray: false},
         save: {method: 'POST', params: {}, isArray: false},
-        update: {method: 'PUT', params: {}, isArray: false},
+        update: {method: 'PUT', params: {}, isArray: false}
     });
 }]);

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/4c456a21/webapp/app/partials/models/models.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/models/models.html b/webapp/app/partials/models/models.html
index 85f7cad..ac433c1 100644
--- a/webapp/app/partials/models/models.html
+++ b/webapp/app/partials/models/models.html
@@ -85,12 +85,12 @@
             <td>
                 <div ng-click="$event.stopPropagation();" class="btn-group" ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(model, permissions.ADMINISTRATION.mask, permissions.MANAGEMENT.mask, permissions.OPERATION.mask)">
                     <button type="button" class="btn btn-default btn-xs dropdown-toggle"
-                            data-toggle="dropdown" ng-click="listAccess(model, 'ModelInstance')">
+                            data-toggle="dropdown">
                         Action <span class="ace-icon fa fa-caret-down icon-on-right"></span>
                     </button>
                     <ul class="dropdown-menu" role="menu">
                         <li><a href="models/edit/{{model.name}}">Edit</a></li>
-                        <li ng-if="userService.hasRole('ROLE_ADMIN')">
+                        <li ng-show="false" ng-if="userService.hasRole('ROLE_ADMIN')">
                             <a ng-click="dropModel(model)" tooltip="Drop the model, related cubes and data permanently.">Drop</a></li>
 
                     </ul>