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/1.x-HBase1.1.3 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));