KYLIN-1168 add UT

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

Branch: refs/heads/master
Commit: 9e069eed066f356909ac34a570707219d95ecb5e
Parents: 316bc04
Author: shaofengshi <shaofeng...@apache.org>
Authored: Thu Dec 3 14:54:22 2015 +0800
Committer: shaofengshi <shaofeng...@apache.org>
Committed: Thu Dec 3 14:57:19 2015 +0800

----------------------------------------------------------------------
 .../kylin/rest/controller/CubeController.java   |  50 +++--
 .../kylin/rest/controller/JobController.java    |   2 +-
 .../apache/kylin/rest/service/BasicService.java |  10 -
 .../apache/kylin/rest/service/CacheService.java |  24 ++-
 .../apache/kylin/rest/service/CubeService.java  |  42 +----
 .../kylin/rest/service/CacheServiceTest.java    | 186 +++++++++++++++----
 .../kylin/rest/service/CubeServiceTest.java     |   4 -
 .../kylin/rest/service/JobServiceTest.java      |   1 -
 .../kylin/rest/service/QueryServiceTest.java    |   1 -
 9 files changed, 219 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/9e069eed/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java
----------------------------------------------------------------------
diff --git 
a/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java 
b/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java
index f27f312..42cf206 100644
--- a/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java
+++ b/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java
@@ -41,6 +41,8 @@ import org.apache.kylin.metadata.MetadataManager;
 import org.apache.kylin.metadata.model.DataModelDesc;
 import org.apache.kylin.metadata.model.SegmentStatusEnum;
 import org.apache.kylin.metadata.project.ProjectInstance;
+import org.apache.kylin.metadata.project.ProjectManager;
+import org.apache.kylin.metadata.realization.RealizationType;
 import org.apache.kylin.rest.exception.BadRequestException;
 import org.apache.kylin.rest.exception.ForbiddenException;
 import org.apache.kylin.rest.exception.InternalErrorException;
@@ -49,6 +51,8 @@ import org.apache.kylin.rest.request.CubeRequest;
 import org.apache.kylin.rest.request.JobBuildRequest;
 import org.apache.kylin.rest.response.GeneralResponse;
 import org.apache.kylin.rest.response.HBaseResponse;
+import org.apache.kylin.rest.security.AclPermission;
+import org.apache.kylin.rest.service.AccessService;
 import org.apache.kylin.rest.service.CubeService;
 import org.apache.kylin.rest.service.JobService;
 import org.apache.kylin.storage.hbase.coprocessor.observer.ObserverEnabler;
@@ -83,6 +87,9 @@ public class CubeController extends BasicController {
     private CubeService cubeService;
 
     @Autowired
+    private AccessService accessService;
+    
+    @Autowired
     private JobService jobService;
 
     @RequestMapping(value = "", method = { RequestMethod.GET })
@@ -278,6 +285,7 @@ public class CubeController extends BasicController {
 
         try {
             cubeService.deleteCube(cube);
+            accessService.clean(cube, true);
         } catch (Exception e) {
             logger.error(e.getLocalizedMessage(), e);
             throw new InternalErrorException("Failed to delete cube. " + " 
Caused by: " + e.getMessage(), e);
@@ -285,21 +293,25 @@ public class CubeController extends BasicController {
     }
 
     /**
-     * Get available table list of the input database
+     * Create a new Cube
      *
-     * @return Table metadata array
+     * @return cubeRequest cube change request
      * @throws IOException
      */
     @RequestMapping(value = "", method = { RequestMethod.POST })
     @ResponseBody
     public CubeRequest saveCubeDesc(@RequestBody CubeRequest cubeRequest) {
         //Update Model
-        MetadataManager metaManager = 
MetadataManager.getInstance(KylinConfig.getInstanceFromEnv());
+        MetadataManager metaManager = 
MetadataManager.getInstance(cubeService.getConfig());
         DataModelDesc modelDesc = deserializeDataModelDesc(cubeRequest);
-        if (modelDesc == null || StringUtils.isEmpty(modelDesc.getName())) {
-            return cubeRequest;
+        if (modelDesc == null) {
+            return errorRequest(cubeRequest, "Missing ModelDesc data in the 
request.");
         }
 
+        if (StringUtils.isEmpty(modelDesc.getName())) {
+            return errorRequest(cubeRequest, "Missing modelName.");
+        }
+        
         try {
             DataModelDesc existingModel = 
metaManager.getDataModelDesc(modelDesc.getName());
             if (existingModel == null) {
@@ -309,7 +321,6 @@ public class CubeController extends BasicController {
                 metaManager.updateDataModelDesc(modelDesc);
             }
         } catch (IOException e) {
-            // TODO Auto-generated catch block
             logger.error("Failed to deal with the request:" + 
e.getLocalizedMessage(), e);
             throw new InternalErrorException("Failed to deal with the request: 
" + e.getLocalizedMessage());
         }
@@ -319,16 +330,21 @@ public class CubeController extends BasicController {
             return cubeRequest;
         }
 
-        String name = CubeService.getCubeNameFromDesc(desc.getName());
-        if (StringUtils.isEmpty(name)) {
+        if (StringUtils.isEmpty(desc.getName())) {
             logger.info("Cube name should not be empty.");
-            throw new BadRequestException("Cube name should not be empty.");
+            return errorRequest(cubeRequest, "Missing cubeDescName");
         }
 
         try {
             desc.setUuid(UUID.randomUUID().toString());
             String projectName = (null == cubeRequest.getProject()) ? 
ProjectInstance.DEFAULT_PROJECT_NAME : cubeRequest.getProject();
-            cubeService.createCubeAndDesc(name, projectName, desc);
+            CubeInstance createdCube = 
cubeService.createCubeAndDesc(desc.getName(), projectName, desc);
+
+            accessService.init(createdCube, AclPermission.ADMINISTRATION);
+
+            ProjectInstance project = 
cubeService.getProjectManager().getProject(projectName);
+            accessService.inherit(createdCube, project);
+
         } catch (Exception e) {
             logger.error("Failed to deal with the request.", e);
             throw new InternalErrorException(e.getLocalizedMessage(), e);
@@ -342,7 +358,7 @@ public class CubeController extends BasicController {
     /**
      * Update cube description. If cube signature has changed, all existing 
cube segments are dropped.
      *
-     * @return Table metadata array
+     * @return cubeRequest cube change request
      * @throws JsonProcessingException
      */
     @RequestMapping(value = "", method = { RequestMethod.PUT })
@@ -358,7 +374,7 @@ public class CubeController extends BasicController {
             return errorRequest(cubeRequest, "Missing cubeName");
         }
 
-        MetadataManager metadataManager = 
MetadataManager.getInstance(KylinConfig.getInstanceFromEnv());
+        MetadataManager metadataManager = 
MetadataManager.getInstance(cubeService.getConfig());
         DataModelDesc modelDesc = null;
         DataModelDesc oldModelDesc = null;
         if (StringUtils.isNotEmpty(cubeRequest.getModelDescData())) {
@@ -397,6 +413,12 @@ public class CubeController extends BasicController {
             String projectName = (null == cubeRequest.getProject()) ? 
ProjectInstance.DEFAULT_PROJECT_NAME : cubeRequest.getProject();
             desc = cubeService.updateCubeAndDesc(cube, desc, projectName);
 
+            ProjectManager projectManager = cubeService.getProjectManager();
+            if (!cubeService.isCubeInProject(projectName, cube)) {
+                String owner = 
SecurityContextHolder.getContext().getAuthentication().getName();
+                ProjectInstance newProject = 
projectManager.moveRealizationToProject(RealizationType.CUBE, cube.getName(), 
projectName, owner);
+                accessService.inherit(cube, newProject);
+            }
 
             if (desc.getError().isEmpty()) {
                 cubeRequest.setSuccessful(true);
@@ -537,4 +559,8 @@ public class CubeController extends BasicController {
         this.jobService = jobService;
     }
 
+    public void setAccessService(AccessService accessService) {
+        this.accessService = accessService;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/9e069eed/server/src/main/java/org/apache/kylin/rest/controller/JobController.java
----------------------------------------------------------------------
diff --git 
a/server/src/main/java/org/apache/kylin/rest/controller/JobController.java 
b/server/src/main/java/org/apache/kylin/rest/controller/JobController.java
index 483d843..f95830f 100644
--- a/server/src/main/java/org/apache/kylin/rest/controller/JobController.java
+++ b/server/src/main/java/org/apache/kylin/rest/controller/JobController.java
@@ -67,7 +67,7 @@ public class JobController extends BasicController implements 
InitializingBean {
      */
     @Override
     public void afterPropertiesSet() throws Exception {
-        String timeZone = jobService.getKylinConfig().getTimeZone();
+        String timeZone = jobService.getConfig().getTimeZone();
         TimeZone tzone = TimeZone.getTimeZone(timeZone);
         TimeZone.setDefault(tzone);
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/9e069eed/server/src/main/java/org/apache/kylin/rest/service/BasicService.java
----------------------------------------------------------------------
diff --git 
a/server/src/main/java/org/apache/kylin/rest/service/BasicService.java 
b/server/src/main/java/org/apache/kylin/rest/service/BasicService.java
index d91c6d3..b345b96 100644
--- a/server/src/main/java/org/apache/kylin/rest/service/BasicService.java
+++ b/server/src/main/java/org/apache/kylin/rest/service/BasicService.java
@@ -140,16 +140,6 @@ public abstract class BasicService {
         logger.debug("clean query cache...");
     }
 
-    public final KylinConfig getKylinConfig() {
-        KylinConfig kylinConfig = KylinConfig.getInstanceFromEnv();
-
-        if (kylinConfig == null) {
-            throw new IllegalArgumentException("Failed to load kylin config 
instance");
-        }
-
-        return kylinConfig;
-    }
-
     public final MetadataManager getMetadataManager() {
         return MetadataManager.getInstance(getConfig());
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/9e069eed/server/src/main/java/org/apache/kylin/rest/service/CacheService.java
----------------------------------------------------------------------
diff --git 
a/server/src/main/java/org/apache/kylin/rest/service/CacheService.java 
b/server/src/main/java/org/apache/kylin/rest/service/CacheService.java
index 7a3238c..398577d 100644
--- a/server/src/main/java/org/apache/kylin/rest/service/CacheService.java
+++ b/server/src/main/java/org/apache/kylin/rest/service/CacheService.java
@@ -24,6 +24,7 @@ import java.util.List;
 import org.apache.kylin.common.restclient.Broadcaster;
 import org.apache.kylin.cube.CubeDescManager;
 import org.apache.kylin.cube.CubeManager;
+import org.apache.kylin.cube.model.CubeDesc;
 import org.apache.kylin.invertedindex.IIDescManager;
 import org.apache.kylin.invertedindex.IIManager;
 import org.apache.kylin.metadata.MetadataManager;
@@ -59,13 +60,13 @@ public class CacheService extends BasicService {
                 cleanProjectCacheByRealization(RealizationType.CUBE, cacheKey);
                 break;
             case CUBE_DESC:
-                if (getCubeDescManager().getCubeDesc(cacheKey) != null) {
-                    String modelName = 
getCubeDescManager().getCubeDesc(cacheKey).getModelName();
+                CubeDesc oldDesc = getCubeDescManager().getCubeDesc(cacheKey);
+                if (oldDesc != null) {
+                    // existing cubedesc, reload model before reload cubedesc
+                    String modelName = oldDesc.getModelName();
                     getMetadataManager().reloadDataModelDesc(modelName);
-                }
+                } 
                 getCubeDescManager().reloadCubeDesc(cacheKey);
-                IIDescManager.clearCache();
-                CubeDescManager.clearCache();
                 break;
             case PROJECT:
                 getProjectManager().reloadProject(cacheKey);
@@ -84,7 +85,13 @@ public class CacheService extends BasicService {
                 CubeDescManager.clearCache();
                 break;
             case DATA_MODEL:
-                // To avoid in an inconsistent state, model desc will be 
refreshed together with cube desc
+                // To avoid in an inconsistent state, model desc will be 
reload together with cube desc if it is not a new one.
+                if (getMetadataManager().getDataModelDesc(cacheKey) == null) {
+                    // new data model
+                    getMetadataManager().reloadDataModelDesc(cacheKey);
+                }
+                IIDescManager.clearCache();
+                CubeDescManager.clearCache();
                 break;
             case ALL:
                 MetadataManager.clearCache();
@@ -145,5 +152,8 @@ public class CacheService extends BasicService {
             throw new RuntimeException("error " + log, e);
         }
     }
-    
+
+    public void setCubeService(CubeService cubeService) {
+        this.cubeService = cubeService;
+    }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/9e069eed/server/src/main/java/org/apache/kylin/rest/service/CubeService.java
----------------------------------------------------------------------
diff --git 
a/server/src/main/java/org/apache/kylin/rest/service/CubeService.java 
b/server/src/main/java/org/apache/kylin/rest/service/CubeService.java
index 612798e..af518ef 100644
--- a/server/src/main/java/org/apache/kylin/rest/service/CubeService.java
+++ b/server/src/main/java/org/apache/kylin/rest/service/CubeService.java
@@ -84,13 +84,8 @@ import com.google.common.collect.Lists;
  */
 @Component("cubeMgmtService")
 public class CubeService extends BasicService {
-    private static final String DESC_SUFFIX = "_desc";
-
     private static final Logger logger = 
LoggerFactory.getLogger(CubeService.class);
 
-    @Autowired
-    private AccessService accessService;
-
     @PostFilter(Constant.ACCESS_POST_FILTER_READ)
     public List<CubeInstance> listAllCubes(final String cubeName, final String 
projectName) {
         List<CubeInstance> cubeInstances = null;
@@ -183,11 +178,6 @@ public class CubeService extends BasicService {
         }
 
         createdCube = getCubeManager().createCube(cubeName, projectName, 
createdDesc, owner);
-        accessService.init(createdCube, AclPermission.ADMINISTRATION);
-
-        ProjectInstance project = getProjectManager().getProject(projectName);
-        accessService.inherit(createdCube, project);
-
         return createdCube;
     }
 
@@ -210,7 +200,7 @@ public class CubeService extends BasicService {
         return result;
     }
 
-    private boolean isCubeInProject(String projectName, CubeInstance target) {
+    public boolean isCubeInProject(String projectName, CubeInstance target) {
         ProjectManager projectManager = getProjectManager();
         ProjectInstance project = projectManager.getProject(projectName);
         if (project == null) {
@@ -246,13 +236,6 @@ public class CubeService extends BasicService {
             int cuboidCount = 
CuboidCLI.simulateCuboidGeneration(updatedCubeDesc);
             logger.info("Updated cube " + cube.getName() + " has " + 
cuboidCount + " cuboids");
 
-            ProjectManager projectManager = getProjectManager();
-            if (!isCubeInProject(newProjectName, cube)) {
-                String owner = 
SecurityContextHolder.getContext().getAuthentication().getName();
-                ProjectInstance newProject = 
projectManager.moveRealizationToProject(RealizationType.CUBE, cube.getName(), 
newProjectName, owner);
-                accessService.inherit(cube, newProject);
-            }
-
             return updatedCubeDesc;
         } catch (IOException e) {
             throw new InternalErrorException("Failed to deal with the 
request.", e);
@@ -266,9 +249,8 @@ public class CubeService extends BasicService {
             throw new JobException("The cube " + cube.getName() + " has 
running job, please discard it and try again.");
         }
 
-        this.releaseAllSegments(cube);
+        this.discardAllRunningJobs(cube);
         getCubeManager().dropCube(cube.getName(), true);
-        accessService.clean(cube, true);
     }
 
     public boolean isCubeEditable(CubeInstance ci) {
@@ -289,18 +271,6 @@ public class CubeService extends BasicService {
         return true;
     }
 
-    public static String getCubeDescNameFromCube(String cubeName) {
-        return cubeName + DESC_SUFFIX;
-    }
-
-    public static String getCubeNameFromDesc(String descName) {
-        if (descName.toLowerCase().endsWith(DESC_SUFFIX)) {
-            return descName.substring(0, 
descName.toLowerCase().indexOf(DESC_SUFFIX));
-        } else {
-            return descName;
-        }
-    }
-
     public void reloadCubeCache(String cubeName) {
         CubeManager.getInstance(this.getConfig()).loadCubeCache(cubeName);
     }
@@ -328,6 +298,7 @@ public class CubeService extends BasicService {
         }
 
         try {
+            this.discardAllRunningJobs(cube);
             this.releaseAllSegments(cube);
             return cube;
         } catch (IOException e) {
@@ -524,6 +495,11 @@ public class CubeService extends BasicService {
      * @throws JobException
      */
     private void releaseAllSegments(CubeInstance cube) throws IOException, 
JobException {
+        cube.getSegments().clear();
+        CubeManager.getInstance(getConfig()).updateCube(cube);
+    }
+    
+    private void discardAllRunningJobs(CubeInstance cube) {
         final List<CubingJob> cubingJobs = listAllCubingJobs(cube.getName(), 
null);
         for (CubingJob cubingJob : cubingJobs) {
             final ExecutableState status = cubingJob.getStatus();
@@ -531,8 +507,6 @@ public class CubeService extends BasicService {
                 getExecutableManager().discardJob(cubingJob.getId());
             }
         }
-        cube.getSegments().clear();
-        CubeManager.getInstance(getConfig()).updateCube(cube);
     }
 
     @PreAuthorize(Constant.ACCESS_HAS_ROLE_MODELER + " or " + 
Constant.ACCESS_HAS_ROLE_ADMIN)

http://git-wip-us.apache.org/repos/asf/kylin/blob/9e069eed/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 44755d4..a14be1d 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
@@ -18,17 +18,10 @@
 
 package org.apache.kylin.rest.service;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.atomic.AtomicLong;
-
 import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.common.persistence.AclEntity;
 import org.apache.kylin.common.restclient.Broadcaster;
+import org.apache.kylin.common.util.JsonUtil;
 import org.apache.kylin.common.util.LocalFileMetadataTestCase;
 import org.apache.kylin.cube.CubeDescManager;
 import org.apache.kylin.cube.CubeInstance;
@@ -44,16 +37,28 @@ import org.apache.kylin.metadata.project.ProjectManager;
 import org.apache.kylin.metadata.realization.IRealization;
 import org.apache.kylin.metadata.realization.RealizationType;
 import org.apache.kylin.rest.broadcaster.BroadcasterReceiveServlet;
+import org.apache.kylin.rest.controller.CubeController;
+import org.apache.kylin.rest.request.CubeRequest;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.junit.*;
 import org.slf4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.acls.model.Acl;
+import org.springframework.security.acls.model.Permission;
+import org.springframework.security.authentication.TestingAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.User;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static org.junit.Assert.*;
 
 /**
  */
-@Ignore ("Not working for some time")
 public class CacheServiceTest extends LocalFileMetadataTestCase {
 
     private static Server server;
@@ -85,26 +90,40 @@ public class CacheServiceTest extends 
LocalFileMetadataTestCase {
                     public KylinConfig getConfig() {
                         return configB;
                     }
+
                 };
+
+                cacheService.setCubeService(new CubeService() {
+
+                    @Override
+                    public KylinConfig getConfig() {
+                        return configB;
+                    }
+                });
                 Broadcaster.TYPE wipeType = Broadcaster.TYPE.getType(type);
                 Broadcaster.EVENT wipeEvent = 
Broadcaster.EVENT.getEvent(event);
                 final String log = "wipe cache type: " + wipeType + " event:" 
+ wipeEvent + " name:" + name;
                 logger.info(log);
                 counter.incrementAndGet();
                 switch (wipeEvent) {
-                case CREATE:
-                case UPDATE:
-                    cacheService.rebuildCache(wipeType, name);
-                    break;
-                case DROP:
-                    cacheService.removeCache(wipeType, name);
-                    break;
-                default:
-                    throw new RuntimeException("invalid type:" + wipeEvent);
+                    case CREATE:
+                    case UPDATE:
+                        cacheService.rebuildCache(wipeType, name);
+                        break;
+                    case DROP:
+                        cacheService.removeCache(wipeType, name);
+                        break;
+                    default:
+                        throw new RuntimeException("invalid type:" + 
wipeEvent);
                 }
             }
         })), "/");
         server.start();
+
+        List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
+        User user = new User("ADMIN", "ADMIN", authorities);
+        Authentication authentication = new TestingAuthenticationToken(user, 
"ADMIN", "ROLE_ADMIN");
+        SecurityContextHolder.getContext().setAuthentication(authentication);
     }
 
     @AfterClass
@@ -121,6 +140,7 @@ public class CacheServiceTest extends 
LocalFileMetadataTestCase {
 
     @After
     public void after() throws Exception {
+        cleanupTestMetadata();
     }
 
     private void waitForCounterAndClear(long count) {
@@ -171,9 +191,9 @@ public class CacheServiceTest extends 
LocalFileMetadataTestCase {
         assertNotNull(getCubeManager(configB));
         assertNotNull(getCubeDescManager(configA));
         assertNotNull(getCubeDescManager(configB));
+        assertNotNull(getProjectManager(configA));
         assertNotNull(getProjectManager(configB));
-        assertNotNull(getProjectManager(configB));
-        assertNotNull(getMetadataManager(configB));
+        assertNotNull(getMetadataManager(configA));
         assertNotNull(getMetadataManager(configB));
 
         assertTrue(!getCubeManager(configA).equals(getCubeManager(configB)));
@@ -277,7 +297,6 @@ public class CacheServiceTest extends 
LocalFileMetadataTestCase {
     }
 
     @Test
-//    @Ignore ("disable this as only data model change will not trigger a 
broad cast event, see KYLIN-1168")
     public void testMetaCRUD() throws Exception {
         final MetadataManager metadataManager = 
MetadataManager.getInstance(configA);
         final MetadataManager metadataManagerB = 
MetadataManager.getInstance(configB);
@@ -308,14 +327,119 @@ public class CacheServiceTest extends 
LocalFileMetadataTestCase {
         waitForCounterAndClear(1);
         assertEquals(dataModelDesc.getName(), 
metadataManagerB.getDataModelDesc(dataModelName).getName());
 
-        final LookupDesc[] lookups = dataModelDesc.getLookups();
-        assertTrue(lookups.length > 0);
-        dataModelDesc.setLookups(new LookupDesc[] { lookups[0] });
-        metadataManager.updateDataModelDesc(dataModelDesc);
-        //only one for data model update
-        assertEquals(1, broadcaster.getCounterAndClear());
-        waitForCounterAndClear(1);
-        assertEquals(dataModelDesc.getLookups().length, 
metadataManagerB.getDataModelDesc(dataModelName).getLookups().length);
+    }
+    
+    @Test
+    public void testCubeModelCRUD() throws Exception {
+        final Broadcaster broadcaster = Broadcaster.getInstance();
+        broadcaster.getCounterAndClear();
+
+        getStore().deleteResource("/cube/a_whole_new_cube_2.json");
+        getStore().deleteResource("/cube_desc/a_whole_new_cube_2.json");
+        getStore().deleteResource("/model_desc/a_whole_new_cube_2.json");
+        
+        final CubeController cubeController = new CubeController();
+
+        final CubeDesc cubeDesc = 
getCubeDescManager(configA).getCubeDesc("test_kylin_cube_with_slr_desc");
+        final DataModelDesc modelDesc = 
getMetadataManager(configA).getDataModelDesc(cubeDesc.getModelName());
+
+
+        cubeController.setCubeService(new CubeService() {
+            @Override
+            public KylinConfig getConfig() {
+                return configA;
+            }
+        });
+        cubeController.setAccessService(new AccessService() {
+
+            @Override
+            public Acl init(AclEntity ae, Permission initPermission) {
+                return null;
+            }
+            
+            @Override
+            public void inherit(AclEntity ae, AclEntity parentAe) {
+                
+            }
+
+            @Override
+            public void clean(AclEntity ae, boolean deleteChildren) {
+                
+            }
+        });
+        String newCubeName = "a_whole_new_cube_2";
+        cubeDesc.setName(newCubeName);
+        cubeDesc.setModelName(newCubeName);
+        modelDesc.setName(newCubeName);
+        cubeDesc.setLastModified(0);
+        modelDesc.setLastModified(0);
+
+        CubeRequest cubeRequest = new CubeRequest();
+
+        cubeRequest.setCubeName(newCubeName);
+        cubeRequest.setModelDescData(JsonUtil.writeValueAsString(modelDesc));
+        cubeRequest.setCubeDescData(JsonUtil.writeValueAsString(cubeDesc));
+        cubeRequest = cubeController.saveCubeDesc(cubeRequest);
+
+        // 4 events: model, cube desc, cube and project
+        assertEquals(4, broadcaster.getCounterAndClear());
+        waitForCounterAndClear(4);
+        assertTrue(cubeRequest.getSuccessful() == true);
+        
+        CubeDescManager cubeDescManagerB = getCubeDescManager(configB);
+        MetadataManager metadataManagerB = getMetadataManager(configB);
+        final CubeManager cubeManagerB = getCubeManager(configB);
+        assertTrue(metadataManagerB.getDataModelDesc(newCubeName) != null);
+        assertTrue(cubeDescManagerB.getCubeDesc(newCubeName) != null);
+        assertTrue(cubeManagerB.getCube(newCubeName) != null);
+        
+        // test a valid update
+        final DataModelDesc newdataModelDesc = 
getMetadataManager(configA).getDataModelDesc(newCubeName);
+        final CubeDesc newcubeDesc = 
getCubeDescManager(configA).getCubeDesc(newCubeName);
+        newdataModelDesc.setCapacity(DataModelDesc.RealizationCapacity.LARGE);
+        newcubeDesc.setRetentionRange(200000);
+        cubeRequest = new CubeRequest();
+        cubeRequest.setCubeName(newCubeName);
+        
cubeRequest.setModelDescData(JsonUtil.writeValueAsString(newdataModelDesc));
+        cubeRequest.setCubeDescData(JsonUtil.writeValueAsString(newcubeDesc));
+        cubeRequest = cubeController.updateCubeDesc(cubeRequest);
+        assertTrue(cubeRequest.getSuccessful() == true);
+
+        // three event: model, cube desc, cube
+        assertEquals(3, broadcaster.getCounterAndClear());
+        waitForCounterAndClear(3);
+        
assertTrue(getCubeDescManager(configB).getCubeDesc(newCubeName).getRetentionRange()
 == 200000);
+        
assertTrue(getMetadataManager(configB).getDataModelDesc(newCubeName).getCapacity().equals(DataModelDesc.RealizationCapacity.LARGE));
+
+        
+        // test a invalid update (remove one lookup table from model desc, 
cube desc doesn't change)
+        final DataModelDesc validDataModelDesc = 
getMetadataManager(configA).getDataModelDesc(newCubeName);
+        
+        final CubeDesc invalidCubeDesc = 
getCubeDescManager(configA).getCubeDesc(newCubeName);
+
+        DataModelDesc modelDescCopy = 
JsonUtil.readValue(JsonUtil.writeValueAsString(validDataModelDesc), 
DataModelDesc.class);
+        int lookupTableCount = validDataModelDesc.getLookups().length;
+        LookupDesc[] newLookups = new LookupDesc[lookupTableCount - 1];
+        System.arraycopy(validDataModelDesc.getLookups(), 0, newLookups, 0, 
lookupTableCount - 1);
+        modelDescCopy.setLookups(newLookups);
+        cubeRequest = new CubeRequest();
+        cubeRequest.setCubeName(newCubeName);
+        
cubeRequest.setModelDescData(JsonUtil.writeValueAsString(modelDescCopy));
+        
cubeRequest.setCubeDescData(JsonUtil.writeValueAsString(invalidCubeDesc));
+        cubeRequest = cubeController.updateCubeDesc(cubeRequest);
+        assertTrue(cubeRequest.getSuccessful() == false);
+        // 2 events, all for model
+        assertEquals(2, broadcaster.getCounterAndClear());
+        waitForCounterAndClear(2);
+        
assertTrue(getMetadataManager(configB).getDataModelDesc(newCubeName).getLookups().length
 == lookupTableCount);
+        
assertTrue(getMetadataManager(configA).getDataModelDesc(newCubeName).getLookups().length
 == lookupTableCount);
+        
+        // test delete
+        cubeController.deleteCube(newCubeName);
+        // two events: cube, project
+        assertEquals(2, broadcaster.getCounterAndClear());
+        waitForCounterAndClear(2);
+        assertTrue(getCubeManager(configB).getCube(newCubeName) == null);
 
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/9e069eed/server/src/test/java/org/apache/kylin/rest/service/CubeServiceTest.java
----------------------------------------------------------------------
diff --git 
a/server/src/test/java/org/apache/kylin/rest/service/CubeServiceTest.java 
b/server/src/test/java/org/apache/kylin/rest/service/CubeServiceTest.java
index 6cfeb26..586f579 100644
--- a/server/src/test/java/org/apache/kylin/rest/service/CubeServiceTest.java
+++ b/server/src/test/java/org/apache/kylin/rest/service/CubeServiceTest.java
@@ -41,13 +41,9 @@ public class CubeServiceTest extends ServiceTestBase {
     @Test
     public void testBasics() throws JsonProcessingException, JobException, 
UnknownHostException {
         Assert.assertNotNull(cubeService.getConfig());
-        Assert.assertNotNull(cubeService.getKylinConfig());
         Assert.assertNotNull(cubeService.getMetadataManager());
         
Assert.assertNotNull(cubeService.getOLAPDataSource(ProjectInstance.DEFAULT_PROJECT_NAME));
 
-        
Assert.assertTrue(CubeService.getCubeDescNameFromCube("testCube").equals("testCube_desc"));
-        
Assert.assertTrue(CubeService.getCubeNameFromDesc("testCube_desc").equals("testCube"));
-
         List<CubeInstance> cubes = cubeService.getCubes(null, null, null, 
null);
         Assert.assertNotNull(cubes);
         CubeInstance cube = cubes.get(0);

http://git-wip-us.apache.org/repos/asf/kylin/blob/9e069eed/server/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java
----------------------------------------------------------------------
diff --git 
a/server/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java 
b/server/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java
index 987cfa8..996f814 100644
--- a/server/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java
+++ b/server/src/test/java/org/apache/kylin/rest/service/JobServiceTest.java
@@ -37,7 +37,6 @@ public class JobServiceTest extends ServiceTestBase {
     @Test
     public void testBasics() throws JobException, IOException {
         Assert.assertNotNull(jobService.getConfig());
-        Assert.assertNotNull(jobService.getKylinConfig());
         Assert.assertNotNull(jobService.getMetadataManager());
         
Assert.assertNotNull(jobService.getOLAPDataSource(ProjectInstance.DEFAULT_PROJECT_NAME));
         Assert.assertNull(jobService.getJobInstance("job_not_exist"));

http://git-wip-us.apache.org/repos/asf/kylin/blob/9e069eed/server/src/test/java/org/apache/kylin/rest/service/QueryServiceTest.java
----------------------------------------------------------------------
diff --git 
a/server/src/test/java/org/apache/kylin/rest/service/QueryServiceTest.java 
b/server/src/test/java/org/apache/kylin/rest/service/QueryServiceTest.java
index 1b1932c..df14f86 100644
--- a/server/src/test/java/org/apache/kylin/rest/service/QueryServiceTest.java
+++ b/server/src/test/java/org/apache/kylin/rest/service/QueryServiceTest.java
@@ -40,7 +40,6 @@ public class QueryServiceTest extends ServiceTestBase {
     @Test
     public void testBasics() throws JobException, IOException, SQLException {
         Assert.assertNotNull(queryService.getConfig());
-        Assert.assertNotNull(queryService.getKylinConfig());
         Assert.assertNotNull(queryService.getMetadataManager());
         
Assert.assertNotNull(queryService.getOLAPDataSource(ProjectInstance.DEFAULT_PROJECT_NAME));
 

Reply via email to