You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2015/12/22 09:44:28 UTC
[30/50] kylin git commit: KYLIN-1168 add UT
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 <sh...@apache.org>
Authored: Thu Dec 3 14:54:22 2015 +0800
Committer: shaofengshi <sh...@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));