/* Copyright [2013-2014] eBay Software Foundation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /* Copyright 2012 eBay Software Foundation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package com.ebay.cloud.cms.sysmgmt.server; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.ws.rs.core.MultivaluedMap; import junit.framework.Assert; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.node.ArrayNode; import org.codehaus.jackson.node.JsonNodeFactory; import org.codehaus.jackson.node.ObjectNode; import org.junit.BeforeClass; import org.junit.Test; import com.ebay.cloud.cms.config.CMSDBConfig; import com.ebay.cloud.cms.dal.DalServiceFactory.RegistrationEnum; import com.ebay.cloud.cms.dal.entity.IEntity; import com.ebay.cloud.cms.dal.entity.JsonEntity; import com.ebay.cloud.cms.dal.exception.CmsDalException; import com.ebay.cloud.cms.dal.persistence.ConsistentPolicy; import com.ebay.cloud.cms.dal.persistence.PersistenceContext; import com.ebay.cloud.cms.dal.persistence.PersistenceContext.DBCollectionPolicy; import com.ebay.cloud.cms.entmgr.branch.IBranch; import com.ebay.cloud.cms.entmgr.branch.impl.Branch; import com.ebay.cloud.cms.entmgr.entity.CallbackContext; import com.ebay.cloud.cms.entmgr.entity.EntityContext; import com.ebay.cloud.cms.entmgr.entity.EntityContext.ModifyAction; import com.ebay.cloud.cms.entmgr.entity.IEntityOperationCallback; import com.ebay.cloud.cms.entmgr.exception.CmsEntMgrException; import com.ebay.cloud.cms.entmgr.exception.CmsEntMgrException.EntMgrErrCodeEnum; import com.ebay.cloud.cms.entmgr.loader.RuntimeDataLoader; import com.ebay.cloud.cms.entmgr.utils.RegistrationUtils; import com.ebay.cloud.cms.metadata.RepositoryServiceFactory; import com.ebay.cloud.cms.metadata.dataloader.MetadataDataLoader; import com.ebay.cloud.cms.metadata.exception.IndexExistsException; import com.ebay.cloud.cms.metadata.exception.MetaClassNotExistsException; import com.ebay.cloud.cms.metadata.exception.RepositoryNotExistsException; import com.ebay.cloud.cms.metadata.model.IndexInfo; import com.ebay.cloud.cms.metadata.model.IndexInfo.IndexOptionEnum; import com.ebay.cloud.cms.metadata.model.InternalFieldEnum; import com.ebay.cloud.cms.metadata.model.MetaAttribute; import com.ebay.cloud.cms.metadata.model.MetaClass; import com.ebay.cloud.cms.metadata.model.MetaField.CardinalityEnum; import com.ebay.cloud.cms.metadata.model.MetaField.DataTypeEnum; import com.ebay.cloud.cms.metadata.model.MetaRelationship; import com.ebay.cloud.cms.metadata.model.MetaRelationship.RelationTypeEnum; import com.ebay.cloud.cms.metadata.model.Repository; import com.ebay.cloud.cms.metadata.model.RepositoryOption; import com.ebay.cloud.cms.metadata.model.internal.BranchMetaClass; import com.ebay.cloud.cms.metadata.model.internal.HistoryMetaClass; import com.ebay.cloud.cms.metadata.mongo.converter.ObjectConverter; import com.ebay.cloud.cms.metadata.service.IMetadataService; import com.ebay.cloud.cms.metadata.service.IRepositoryService; import com.ebay.cloud.cms.metadata.service.MetadataContext; import com.ebay.cloud.cms.metadata.service.MetadataContext.UpdateOptionMode; import com.ebay.cloud.cms.mongo.MongoDataSource; import com.ebay.cloud.cms.query.optimizer.QueryOptimizeException; import com.ebay.cloud.cms.query.service.IQueryResult; import com.ebay.cloud.cms.query.service.QueryContext; import com.ebay.cloud.cms.sysmgmt.IManagementServices; import com.ebay.cloud.cms.sysmgmt.exception.CannotServeException; import com.ebay.cloud.cms.sysmgmt.monitor.MetricConstants; import com.ebay.cloud.cms.sysmgmt.priority.CMSPriority; import com.ebay.cloud.cms.sysmgmt.state.CMSState.State; import com.ebay.cloud.cms.sysmgmt.state.IEventListener; import com.ebay.cloud.cms.utils.mongo.test.CMSMongoTest; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.sun.jersey.core.util.MultivaluedMapImpl; public class CMSServerTest extends CMSMongoTest { private static final String ENVIRONMENT = "Environment"; private static final String SOURCE_IP = "127.0.0.1"; private static final String MANIFEST_VERSION = "ManifestVersion"; private static final String MANIFEST = "Manifest"; private static final String SERVICE_INSTANCE = "ServiceInstance"; private static final String DEPLOY_REPO = "software-deployment"; private static final String STRATUS_REPO = "stratus-ci"; private static final String APPLICATION_SERVICE = "ApplicationService"; private static final String RESOURCE_GROUP = "ResourceGroup"; private static final String CMSDB_REPO = "cmsdb"; private static final String NODE_SERVER = "NodeServer"; private static final String SKU_CONFIGURATION = "SkuConfiguration"; private static final String DEP = "Dep"; private static final String BRANCH_MAIN = "main"; private static final String RAPTOR_PAAS = "raptor-paas"; private static final String RAPTOR_TEST_DATA = "raptorTopology.json"; private static CMSServer server; private static EntityContext entityContext; private static QueryContext raptorQueryContext; private static MetadataContext metaContext; // private static final ObjectMapper objectMapper = new ObjectMapper(); static { String delimeter = "/"; URL configFile = CMSServerTest.class.getResource("/" + CMSConfig.CONFIG_FILE); String path = configFile.getPath(); System.setProperty(CMSConfig.CMS_HOME, path.substring(0, path.lastIndexOf(delimeter))); } private class EchoListener implements IEventListener { @Override public void onEvent(State from, State to) { System.out.println("From state:" + from + " to:" + to); } } @BeforeClass public static void setup() { MongoDataSource dataSource = new MongoDataSource(getConnectionString()); MetadataDataLoader.getInstance(dataSource).loadTestDataFromResource(); MetadataDataLoader.getInstance(dataSource).loadCMSDBMetaDataFromResource(); IRepositoryService repositoryService = RepositoryServiceFactory.createRepositoryService(dataSource, "localCMSServer"); RuntimeDataLoader.getDataLoader(dataSource, repositoryService, RAPTOR_PAAS).load(RAPTOR_TEST_DATA); RuntimeDataLoader.getDataLoader(dataSource, repositoryService, "software-deployment").load( "softwareDeploymentRuntime.json"); RuntimeDataLoader.getDataLoader(dataSource, repositoryService, STRATUS_REPO).load("stratusRuntime.json"); RuntimeDataLoader.getDataLoader(dataSource, repositoryService, CMSDB_REPO).load("cmsdbRuntime.json"); server = CMSServer.getCMSServer(); server.start(); entityContext = newEntityContext(); raptorQueryContext = newQueryContext(RAPTOR_PAAS); metaContext = newMetadataContext(); } private static MetadataContext newMetadataContext() { MetadataContext context = new MetadataContext(); context.setSourceIp(SOURCE_IP); context.setSubject("unitTestUser"); context.addAdditionalParameter("dal", RegistrationEnum.hierarchy.name()); return context; } private static QueryContext newQueryContext(String repo) { QueryContext context = new QueryContext(repo, BRANCH_MAIN); context.setSourceIP(SOURCE_IP); context.setDbConfig(config); context.setRegistration(server.getDalImplementation(RegistrationEnum.hierarchy.name())); return context; } private static EntityContext newEntityContext() { EntityContext context = new EntityContext(); context.setSourceIp(SOURCE_IP); context.setModifier("unitTestUser"); context.setRegistration(RegistrationUtils.getDefaultDalImplementation(dataSource)); context.setFetchFieldProperty(true); context.setDbConfig(config); return context; } @Test public void testStart() { EchoListener ls = new EchoListener(); server.registerEvent(ls); server.start(); server.getRepositories(CMSPriority.NEUTRAL, metaContext); server.removeEvent(ls); } @Test public void testPause() { server.pause(); expectCannoServe(); } @Test public void testResume() { server.resume(); } @Test public void testShutdown() { // server.shutdown(); // expectCannoServe(); server.start(); } private void expectCannoServe() { try { server.getRepositories(CMSPriority.NEUTRAL, metaContext); Assert.fail(); } catch (CannotServeException e) { // expected } } @Test public void testCreateBranch() { Repository repoInst = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS); IBranch branch = createBranch(repoInst, "testNewBranch-cmsServer"); IBranch getBranch = server.createBranch(CMSPriority.NON_CRITICAL, branch, entityContext); Assert.assertNotNull(getBranch); } private IBranch createBranch(Repository repoInst, String branchName) { Branch branch = new Branch(); branch.setMainBranch(true); branch.setId(branchName); branch.setRepositoryName(repoInst.getRepositoryName()); return branch; } @Test public void testGetBranch() { Assert.assertNotNull(server.getBranch(CMSPriority.NEUTRAL, RAPTOR_PAAS, BRANCH_MAIN, entityContext)); } @Test public void testGetBranches() { Assert.assertNotNull(server.getMainBranches(CMSPriority.NEUTRAL, RAPTOR_PAAS, entityContext)); } @Test public void testGetServiceStatuses() { Assert.assertNotNull(server.getServiceStatuses()); } @Test public void testGetServiceStatus() { Assert.assertNotNull(server.getServiceStatus(CMSServer.HEALTHY_SERVICE)); Assert.assertNull(server.getServiceStatus("non-service")); } @Test public void testSetServiceStatus() { server.setServiceStatus(CMSServer.HEALTHY_SERVICE, IManagementServices.ServiceStatus.running); server.setServiceStatus("non-service", IManagementServices.ServiceStatus.running); server.setServiceStatus(CMSServer.HEALTHY_SERVICE, IManagementServices.ServiceStatus.stopped); server.setServiceStatus(CMSServer.HEALTHY_SERVICE, IManagementServices.ServiceStatus.running); } @Test public void testGetStatistics() { Assert.assertNotNull(server.getStatistics()); } @Test public void testGetStatisticsString() { Assert.assertNotNull(server.getStatistics(MetricConstants.TOP_QUERY_TNSW_ACSW_SUCCESS)); Assert.assertNull(server.getStatistics("non-metric")); } @Test public void testGetState() { Assert.assertEquals(State.normal, server.getState()); } @Test public void testGetRepositories() { Assert.assertNotNull(server.getRepositories(CMSPriority.NEUTRAL, metaContext)); } @Test public void testGetRepository() { Assert.assertNotNull(server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS)); } @Test public void testCreateRepository() { Repository createRepo = new Repository(); createRepo.setRepositoryName("testNewRepo-cmsServer"); Repository repo = server.createRepository(CMSPriority.NON_CRITICAL, createRepo); Assert.assertNotNull(server.getRepository(CMSPriority.NON_CRITICAL, repo.getRepositoryName())); IBranch branch = server.getBranch(CMSPriority.NON_CRITICAL, repo.getRepositoryName(), IBranch.DEFAULT_BRANCH, entityContext); Assert.assertNotNull(branch); } @Test public void testDeleteRepository() { Map<String, Object> newConfigs = new HashMap<String, Object>(); newConfigs.put(CMSDBConfig.SYS_ALLOW_REPOSITORY_DELETE, false); server.config(newConfigs); Repository createRepo = new Repository(); String repositoryName = "testDeleteRepo-cmsServer"; createRepo.setRepositoryName(repositoryName); server.createRepository(CMSPriority.NON_CRITICAL, createRepo); Repository getRepo = server.getRepository(CMSPriority.NEUTRAL, repositoryName); Assert.assertNotNull(getRepo); try { server.deleteRepository(CMSPriority.NEUTRAL, repositoryName); Assert.fail(); } catch (Exception e) { // expected as the configuration "SysAllowRepositoryDelete" should // be false } newConfigs = new HashMap<String, Object>(); newConfigs.put(CMSDBConfig.SYS_ALLOW_REPOSITORY_DELETE, true); server.config(newConfigs); server.deleteRepository(CMSPriority.NEUTRAL, repositoryName); try { server.getRepository(CMSPriority.NEUTRAL, repositoryName); Assert.fail(); } catch (RepositoryNotExistsException rnee) { // expected } } @Test public void testGetMetaClasses() { MetadataContext context = newMetadataContext(); Assert.assertNotNull(server.getMetaClasses(CMSPriority.NEUTRAL, RAPTOR_PAAS, context)); try { server.getMetaClasses(CMSPriority.NEUTRAL, "non-repo", context); Assert.fail(); } catch (RepositoryNotExistsException e) { // expected } } @Test public void testGetMetaClass() { Assert.assertNotNull(server.getMetaClass(CMSPriority.NEUTRAL, RAPTOR_PAAS, APPLICATION_SERVICE)); try { server.getMetaClass(CMSPriority.NEUTRAL, "non-repo", "meta1"); Assert.fail(); } catch (RepositoryNotExistsException e) { // expected } } @Test public void testGetMetaHistory() { Assert.assertNotNull(server.getMetaHistory(CMSPriority.NEUTRAL, RAPTOR_PAAS, APPLICATION_SERVICE, metaContext)); try { server.getMetaHistory(CMSPriority.NEUTRAL, "non-repo", APPLICATION_SERVICE, metaContext); Assert.fail(); } catch (RepositoryNotExistsException e) { // expected } } @Test public void testDeleteMetaClass() { Map<String, Object> newConfigs = new HashMap<String, Object>(); newConfigs.put(CMSDBConfig.SYS_ALLOW_METADATA_DELETE, true); server.config(newConfigs); String metaType = "ResourceContainer"; MetaClass mc = server.getMetaClass(CMSPriority.NEUTRAL, STRATUS_REPO, metaType); Assert.assertNotNull(mc); int version = mc.getVersion(); server.deleteMetadata(CMSPriority.NEUTRAL, STRATUS_REPO, metaType, metaContext); mc = server.getMetaClass(CMSPriority.NEUTRAL, STRATUS_REPO, metaType); Assert.assertNull(mc); List<IEntity> entities = server.getMetaHistory(CMSPriority.NEUTRAL, STRATUS_REPO, metaType, metaContext); Assert.assertTrue(entities.size() > 0); String opType = (String) entities.get(0).getFieldValues(HistoryMetaClass.OperType).get(0); Assert.assertEquals("deleteMetaClass", opType); // try create one with the same name again MetaClass newMeta = new MetaClass(); newMeta.setName(metaType); newMeta.setRepository(STRATUS_REPO); MetaAttribute ma = new MetaAttribute(); ma.setName("name"); ma.setDataType(DataTypeEnum.STRING); newMeta.addField(ma); MetaRelationship mr = new MetaRelationship(); mr.setName("resources"); mr.setCardinality(CardinalityEnum.Many); mr.setRefDataType("Resource"); mr.setRelationType(RelationTypeEnum.Reference); newMeta.addField(mr); List<MetaClass> metas = new ArrayList<MetaClass>(); metas.add(newMeta); MetadataContext context = new MetadataContext(); context.setSourceIp(SOURCE_IP); server.batchUpsert(CMSPriority.NEUTRAL, STRATUS_REPO, metas, context); MetaClass getMeta = server.getMetaClass(CMSPriority.NEUTRAL, STRATUS_REPO, metaType); Assert.assertNotNull(getMeta); Assert.assertEquals(version + 1, getMeta.getVersion()); } @Test public void testMetaClassVersion() { Map<String, Object> newConfigs = new HashMap<String, Object>(); newConfigs.put(CMSDBConfig.SYS_ALLOW_METADATA_DELETE, true); server.config(newConfigs); // 1. create meta class String metaType = "TestMetaClassVersion"; MetaClass newMeta = new MetaClass(); newMeta.setName(metaType); newMeta.setRepository(STRATUS_REPO); MetaAttribute ma = new MetaAttribute(); ma.setName("name1"); ma.setDataType(DataTypeEnum.STRING); newMeta.addField(ma); server.batchUpsert(CMSPriority.NEUTRAL, STRATUS_REPO, Arrays.asList(newMeta), metaContext); // 2. check no history List<IEntity> entities = server.getMetaHistory(CMSPriority.NEUTRAL, STRATUS_REPO, metaType, metaContext); Assert.assertEquals(0, entities.size()); // 3. update meta class MetaClass newMeta2 = new MetaClass(); newMeta2.setName(metaType); newMeta2.setRepository(STRATUS_REPO); MetaAttribute ma2 = new MetaAttribute(); ma2.setName("name1"); ma2.setDataType(DataTypeEnum.STRING); newMeta2.addField(ma2); MetaRelationship mr = new MetaRelationship(); mr.setName("resources"); mr.setCardinality(CardinalityEnum.Many); mr.setRefDataType("Resource"); mr.setRelationType(RelationTypeEnum.Reference); newMeta2.addField(mr); server.batchUpsert(CMSPriority.NEUTRAL, STRATUS_REPO, Arrays.asList(newMeta2), metaContext); // 3. check current version and older version MetaClass mc = server.getMetaClass(CMSPriority.NEUTRAL, STRATUS_REPO, metaType); Assert.assertNotNull(mc); Assert.assertNotNull(mc.getFieldByName("resources")); Assert.assertEquals(1, mc.getVersion()); List<IEntity> oldMetas = server.getMetaHistory(CMSPriority.NEUTRAL, STRATUS_REPO, metaType, metaContext); Assert.assertEquals(1, oldMetas.size()); DBObject oldMeta = (DBObject) oldMetas.get(0).getFieldValues(HistoryMetaClass.LogBody).get(0); ObjectConverter<MetaClass> converter = new ObjectConverter<MetaClass>(); MetaClass oldMetaClass = converter.fromBson(oldMeta, MetaClass.class); Assert.assertNotNull(oldMetaClass); Assert.assertNotNull(oldMetaClass.getFieldByName("name1")); Assert.assertNull(oldMetaClass.getFieldByName("resources")); Assert.assertEquals(0, oldMetaClass.getVersion()); // 4. delete meta class server.deleteMetadata(CMSPriority.NEUTRAL, STRATUS_REPO, metaType, metaContext); // 5. try create one with the same name again MetaClass newMeta3 = new MetaClass(); newMeta3.setName(metaType); newMeta3.setRepository(STRATUS_REPO); MetaAttribute ma3 = new MetaAttribute(); ma3.setName("name2"); ma3.setDataType(DataTypeEnum.STRING); newMeta3.addField(ma3); server.batchUpsert(CMSPriority.NEUTRAL, STRATUS_REPO, Arrays.asList(newMeta3), metaContext); // 6. delete meta class server.deleteMetadata(CMSPriority.NEUTRAL, STRATUS_REPO, metaType, metaContext); // 7. try create one with the same name again MetaClass newMeta4 = new MetaClass(); newMeta4.setName(metaType); newMeta4.setRepository(STRATUS_REPO); MetaAttribute ma4 = new MetaAttribute(); ma4.setName("name3"); ma4.setDataType(DataTypeEnum.STRING); newMeta4.addField(ma4); server.batchUpsert(CMSPriority.NEUTRAL, STRATUS_REPO, Arrays.asList(newMeta4), metaContext); // 8. check version MetaClass getMeta = server.getMetaClass(CMSPriority.NEUTRAL, STRATUS_REPO, metaType); Assert.assertNotNull(getMeta); Assert.assertEquals(3, getMeta.getVersion()); oldMetas = server.getMetaHistory(CMSPriority.NEUTRAL, STRATUS_REPO, metaType, metaContext); Assert.assertEquals(3, oldMetas.size()); MetaClass oldMetaClass2 = converter.fromBson((DBObject) oldMetas.get(0) .getFieldValues(HistoryMetaClass.LogBody).get(0), MetaClass.class); Assert.assertNotNull(oldMetaClass2); Assert.assertNotNull(oldMetaClass2.getFieldByName("name2")); Assert.assertNull(oldMetaClass2.getFieldByName("resources")); Assert.assertEquals(2, oldMetaClass2.getVersion()); String opType2 = (String) oldMetas.get(0).getFieldValues(HistoryMetaClass.OperType).get(0); Assert.assertEquals("deleteMetaClass", opType2); Integer version2 = (Integer) oldMetas.get(0).getFieldValues(HistoryMetaClass.EntityVersion).get(0); Assert.assertEquals(2, version2.intValue()); MetaClass oldMetaClass1 = converter.fromBson((DBObject) oldMetas.get(1) .getFieldValues(HistoryMetaClass.LogBody).get(0), MetaClass.class); Assert.assertNotNull(oldMetaClass1); Assert.assertNotNull(oldMetaClass1.getFieldByName("name1")); Assert.assertNotNull(oldMetaClass1.getFieldByName("resources")); Assert.assertEquals(1, oldMetaClass1.getVersion()); String opType1 = (String) oldMetas.get(1).getFieldValues(HistoryMetaClass.OperType).get(0); Assert.assertEquals("deleteMetaClass", opType1); Integer version1 = (Integer) oldMetas.get(1).getFieldValues(HistoryMetaClass.EntityVersion).get(0); Assert.assertEquals(1, version1.intValue()); MetaClass oldMetaClass0 = converter.fromBson((DBObject) oldMetas.get(2) .getFieldValues(HistoryMetaClass.LogBody).get(0), MetaClass.class); Assert.assertNotNull(oldMetaClass0); Assert.assertNotNull(oldMetaClass0.getFieldByName("name1")); Assert.assertNull(oldMetaClass0.getFieldByName("resources")); Assert.assertEquals(0, oldMetaClass0.getVersion()); String opType0 = (String) oldMetas.get(2).getFieldValues(HistoryMetaClass.OperType).get(0); Assert.assertEquals("updateMetaClass", opType0); Integer version0 = (Integer) oldMetas.get(2).getFieldValues(HistoryMetaClass.EntityVersion).get(0); Assert.assertEquals(0, version0.intValue()); } @Test public void testMetaClassParentVersion() { Map<String, Object> newConfigs = new HashMap<String, Object>(); newConfigs.put(CMSDBConfig.SYS_ALLOW_METADATA_DELETE, true); server.config(newConfigs); // 1. create meta class String rootType = "RootClass"; MetaClass rootMeta = new MetaClass(); rootMeta.setName(rootType); rootMeta.setRepository(STRATUS_REPO); String childType = "ChildClass"; MetaClass childMeta = new MetaClass(); childMeta.setName(childType); childMeta.setParent(rootType); childMeta.setRepository(STRATUS_REPO); server.batchUpsert(CMSPriority.NEUTRAL, STRATUS_REPO, Arrays.asList(rootMeta, childMeta), metaContext); // 2. update root meta class and add grandson rootMeta = new MetaClass(); rootMeta.setName(rootType); MetaAttribute ma = new MetaAttribute(); ma.setName("rootName"); ma.setDataType(DataTypeEnum.STRING); rootMeta.addField(ma); String grandsonType = "GrandsonClass"; MetaClass grandsonMeta = new MetaClass(); grandsonMeta.setName(grandsonType); grandsonMeta.setParent(childType); grandsonMeta.setRepository(STRATUS_REPO); server.batchUpsert(CMSPriority.NEUTRAL, STRATUS_REPO, Arrays.asList(rootMeta, grandsonMeta), metaContext); // 3. check version and parent version MetaClass getRoot = server.getMetaClass(CMSPriority.NEUTRAL, STRATUS_REPO, rootType); Assert.assertNotNull(getRoot); Assert.assertEquals(1, getRoot.getVersion()); MetaClass getChild = server.getMetaClass(CMSPriority.NEUTRAL, STRATUS_REPO, childType); Assert.assertNotNull(getChild); Assert.assertEquals(1, getChild.getVersion()); Assert.assertEquals(1, getChild.getParentVersion()); MetaClass getGrandson = server.getMetaClass(CMSPriority.NEUTRAL, STRATUS_REPO, grandsonType); Assert.assertNotNull(getGrandson); Assert.assertEquals(0, getGrandson.getVersion()); Assert.assertEquals(1, getGrandson.getParentVersion()); // 4. check history List<IEntity> oldRootMetas = server.getMetaHistory(CMSPriority.NEUTRAL, STRATUS_REPO, rootType, metaContext); Assert.assertEquals(1, oldRootMetas.size()); DBObject oldRootObj = (DBObject) oldRootMetas.get(0).getFieldValues(HistoryMetaClass.LogBody).get(0); ObjectConverter<MetaClass> converter = new ObjectConverter<MetaClass>(); MetaClass oldRootMeta = converter.fromBson(oldRootObj, MetaClass.class); Assert.assertNotNull(oldRootMeta); Assert.assertNull(oldRootMeta.getFieldByName("rootName")); Assert.assertEquals(0, oldRootMeta.getVersion()); List<IEntity> oldChildMetas = server.getMetaHistory(CMSPriority.NEUTRAL, STRATUS_REPO, childType, metaContext); Assert.assertEquals(1, oldChildMetas.size()); DBObject oldChildObj = (DBObject) oldChildMetas.get(0).getFieldValues(HistoryMetaClass.LogBody).get(0); MetaClass oldChildMeta = converter.fromBson(oldChildObj, MetaClass.class); Assert.assertNotNull(oldChildMeta); Assert.assertEquals(0, oldChildMeta.getParentVersion()); List<IEntity> oldGrandsonMetas = server.getMetaHistory(CMSPriority.NEUTRAL, STRATUS_REPO, grandsonType, metaContext); Assert.assertEquals(0, oldGrandsonMetas.size()); // 5. update root and grandson rootMeta = new MetaClass(); rootMeta.setName(rootType); ma = new MetaAttribute(); ma.setName("rootName2"); ma.setDataType(DataTypeEnum.STRING); rootMeta.addField(ma); grandsonMeta = new MetaClass(); grandsonMeta.setName(grandsonType); ma = new MetaAttribute(); ma.setName("grandsonName"); ma.setDataType(DataTypeEnum.STRING); grandsonMeta.addField(ma); server.batchUpsert(CMSPriority.NEUTRAL, STRATUS_REPO, Arrays.asList(rootMeta, grandsonMeta), metaContext); // 6. check version and parent version getRoot = server.getMetaClass(CMSPriority.NEUTRAL, STRATUS_REPO, rootType); Assert.assertNotNull(getRoot); Assert.assertEquals(2, getRoot.getVersion()); getChild = server.getMetaClass(CMSPriority.NEUTRAL, STRATUS_REPO, childType); Assert.assertNotNull(getChild); Assert.assertEquals(2, getChild.getVersion()); Assert.assertEquals(2, getChild.getParentVersion()); getGrandson = server.getMetaClass(CMSPriority.NEUTRAL, STRATUS_REPO, grandsonType); Assert.assertNotNull(getGrandson); Assert.assertEquals(2, getGrandson.getVersion()); Assert.assertEquals(2, getGrandson.getParentVersion()); // 7. check history oldRootMetas = server.getMetaHistory(CMSPriority.NEUTRAL, STRATUS_REPO, rootType, metaContext); Assert.assertEquals(2, oldRootMetas.size()); oldRootObj = (DBObject) oldRootMetas.get(0).getFieldValues(HistoryMetaClass.LogBody).get(0); oldRootMeta = converter.fromBson(oldRootObj, MetaClass.class); Assert.assertNotNull(oldRootMeta); Assert.assertNotNull(oldRootMeta.getFieldByName("rootName")); Assert.assertNull(oldRootMeta.getFieldByName("rootName2")); Assert.assertEquals(1, oldRootMeta.getVersion()); oldChildMetas = server.getMetaHistory(CMSPriority.NEUTRAL, STRATUS_REPO, childType, metaContext); Assert.assertEquals(2, oldChildMetas.size()); oldChildObj = (DBObject) oldChildMetas.get(0).getFieldValues(HistoryMetaClass.LogBody).get(0); oldChildMeta = converter.fromBson(oldChildObj, MetaClass.class); Assert.assertNotNull(oldChildMeta); Assert.assertEquals(1, oldChildMeta.getVersion()); Assert.assertEquals(1, oldChildMeta.getParentVersion()); oldGrandsonMetas = server.getMetaHistory(CMSPriority.NEUTRAL, STRATUS_REPO, grandsonType, metaContext); Assert.assertEquals(2, oldGrandsonMetas.size()); DBObject oldGrandsonObj = (DBObject) oldGrandsonMetas.get(0).getFieldValues(HistoryMetaClass.LogBody).get(0); MetaClass oldGrandsonMeta = converter.fromBson(oldGrandsonObj, MetaClass.class); Assert.assertNotNull(oldGrandsonMeta); Assert.assertEquals(1, oldGrandsonMeta.getVersion()); Assert.assertEquals(2, oldGrandsonMeta.getParentVersion()); oldGrandsonObj = (DBObject) oldGrandsonMetas.get(1).getFieldValues(HistoryMetaClass.LogBody).get(0); oldGrandsonMeta = converter.fromBson(oldGrandsonObj, MetaClass.class); Assert.assertNotNull(oldGrandsonMeta); Assert.assertEquals(0, oldGrandsonMeta.getVersion()); Assert.assertEquals(1, oldGrandsonMeta.getParentVersion()); } @Test public void testDeleteMetaField() { Map<String, Object> newConfigs = new HashMap<String, Object>(); newConfigs.put(CMSDBConfig.SYS_ALLOW_METADATA_DELETE, true); server.config(newConfigs); String metaType = "ServiceCluster"; String fieldName = "poolClusters"; server.deleteMetaField(CMSPriority.NEUTRAL, DEPLOY_REPO, metaType, fieldName, metaContext); MetaClass mc = server.getMetaClass(CMSPriority.NEUTRAL, DEPLOY_REPO, metaType); Assert.assertNotNull(mc); Assert.assertNull(mc.getFieldByName(fieldName)); MetaClass oldMC = server.getMetaClass(CMSPriority.NEUTRAL, DEPLOY_REPO, metaType, mc.getVersion() - 1); Assert.assertNotNull(oldMC); Assert.assertNotNull(oldMC.getFieldByName(fieldName)); List<IEntity> entities = server.getMetaHistory(CMSPriority.NEUTRAL, DEPLOY_REPO, metaType, metaContext); Assert.assertEquals(1, entities.size()); String opType = (String) entities.get(0).getFieldValues(HistoryMetaClass.OperType).get(0); Assert.assertEquals("deleteMetaField", opType); } @Test public void testBatchGet() { MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); raptorQueryContext.setAllowFullTableScan(true); IQueryResult result1 = server.batchGet(CMSPriority.NEUTRAL, APPLICATION_SERVICE, queryParams, raptorQueryContext); Assert.assertTrue(result1.getEntities().size() > 0); queryParams.add("filters", "@_type=\"ApplicationService\""); queryParams.add("fields", "@_oid"); IQueryResult result2 = server.batchGet(CMSPriority.NEUTRAL, APPLICATION_SERVICE, queryParams, raptorQueryContext); Assert.assertTrue(result2.getEntities().size() > 0); IEntity queryEntity = result2.getEntities().get(0); Assert.assertTrue(queryEntity.getFieldValues("name").isEmpty()); } @Test(expected = MetaClassNotExistsException.class) public void testBatchGetInvalidMeta() { MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); server.batchGet(CMSPriority.NEUTRAL, "invalid-meta", queryParams, raptorQueryContext); } @Test public void testBatchUpsert() { } @Test public void testBatchCreate() { } @Test public void testGet() { EntityContext entityContext = newEntityContext(); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); queryParams.add("fields", "@_oid"); queryParams.add("fields", "@_type"); queryParams.add("fields", "@updateStrategies"); IEntity qEntity = buildQueryEntity(CMSPriority.NEUTRAL, RAPTOR_PAAS, BRANCH_MAIN, APPLICATION_SERVICE, "4fbb314fc681caf13e283a76"); IEntity gEntity = server.get(CMSPriority.NEUTRAL, qEntity, queryParams, entityContext); Assert.assertNotNull(gEntity); Assert.assertNull(gEntity.getLastModified()); Assert.assertTrue(gEntity.getFieldValues("name").isEmpty()); } @Test public void testDelete() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); Date date = new Date(456); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-entity-create\", \"_createtime\": " + date.getTime() + " } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); String newId = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); IEntity qEntity = buildQueryEntity(CMSPriority.NEUTRAL, RAPTOR_PAAS, BRANCH_MAIN, APPLICATION_SERVICE, newId); IEntity getEntity = server.get(CMSPriority.NEUTRAL, qEntity, queryParams, entityContext); Assert.assertNotNull(getEntity); server.delete(CMSPriority.NEUTRAL, qEntity, entityContext); getEntity = server.get(CMSPriority.NEUTRAL, qEntity, queryParams, entityContext); Assert.assertNull(getEntity); entityContext.setComment(null); } @Test public void testCreate() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-entity-create\", \"_createtime\": " + date.getTime() + " } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); String newId = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); IEntity qEntity = buildQueryEntity(CMSPriority.NEUTRAL, RAPTOR_PAAS, BRANCH_MAIN, APPLICATION_SERVICE, newId); IEntity getEntity = server.get(CMSPriority.NEUTRAL, qEntity, queryParams, entityContext); Assert.assertNotNull(getEntity); Assert.assertNotNull(getEntity.getCreateTime().equals(date)); // clear comment entityContext.setComment(null); } @Test public void testCreateEmbed() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(DEP); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"dep101\", \"team\": { \"name\": \"team101-1\"} }"); jsonEntity.setBranchId(BRANCH_MAIN); try { server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); Assert.fail(); } catch (IllegalArgumentException e) { Assert.assertEquals("The given value of MetaField team is not an array", e.getMessage()); } } @Test public void testCreateNullReference2() { // for array, when given null, store them as empty list MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-entity-create-app\", \"services\": null}"); jsonEntity.setBranchId(BRANCH_MAIN); String newId = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); IEntity qEntity = buildQueryEntity(CMSPriority.NEUTRAL, RAPTOR_PAAS, BRANCH_MAIN, APPLICATION_SERVICE, newId); IEntity getEntity = server.get(CMSPriority.NEUTRAL, qEntity, queryParams, entityContext); Assert.assertTrue(getEntity.hasField("services")); Assert.assertTrue(getEntity.getFieldValues("services").isEmpty()); } @Test public void testEmbedCreate() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, DEPLOY_REPO).getMetadataService() .getMetaClass(MANIFEST); MetaClass versionMetaClass = server.getRepository(CMSPriority.NEUTRAL, DEPLOY_REPO).getMetadataService() .getMetaClass(MANIFEST_VERSION); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"embedcreate-test-manifest-001\", \"_createtime\": " + date.getTime() + " } "); jsonEntity.setBranchId(BRANCH_MAIN); // create manifest String creator = "root-creator"; entityContext.setModifier(creator); entityContext.setComment("newlycreate"); String newId = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); IEntity qEntity = buildQueryEntity(CMSPriority.NEUTRAL, DEPLOY_REPO, BRANCH_MAIN, MANIFEST, newId); IEntity getEntity = server.get(CMSPriority.NEUTRAL, qEntity, queryParams, entityContext); Assert.assertNotNull(getEntity); Assert.assertTrue(getEntity.getCreateTime().equals(date)); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.COMMENT.getName())); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.USER.getName())); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.MODIFIER.getName())); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName())); // create embed entity JsonEntity versionJsonEntity = new JsonEntity(versionMetaClass); versionJsonEntity.setBranchId(BRANCH_MAIN); versionJsonEntity.setId(MANIFEST + "!" + newId + "!versions!" + "customizedVersionId"); Date versionCreateTime = new Date(); versionJsonEntity.addFieldValue("createdTime", versionCreateTime); versionJsonEntity.addFieldValue("name", "manifest-version-name-001"); // set as null to test the populate userid/subject/comment to parent // entity case String embedCreateUserId = "embed-create-user"; entityContext.setUserId(embedCreateUserId); String embedCreateModifier = "embed-create-subject"; entityContext.setModifier(embedCreateModifier); String embedCreateComments = "embed-create-comment"; entityContext.setComment(embedCreateComments); String versionId = server.create(CMSPriority.NEUTRAL, versionJsonEntity, entityContext); IEntity queryEntity = buildQueryEntity(CMSPriority.NEUTRAL, DEPLOY_REPO, BRANCH_MAIN, MANIFEST, newId); getEntity = server.get(CMSPriority.NEUTRAL, queryEntity, queryParams, entityContext); Assert.assertNotNull(getEntity); // root create time is not changed Assert.assertTrue(getEntity.getCreateTime().equals(date)); Assert.assertEquals(versionId, ((IEntity) getEntity.getFieldValues("versions").get(0)).getId()); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.COMMENT.getName())); Assert.assertEquals(embedCreateComments, getEntity.getFieldValues(InternalFieldEnum.COMMENT.getName()).get(0)); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.USER.getName())); Assert.assertEquals(embedCreateUserId, getEntity.getFieldValues(InternalFieldEnum.USER.getName()).get(0)); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.MODIFIER.getName())); Assert.assertEquals(embedCreateModifier, getEntity.getFieldValues(InternalFieldEnum.MODIFIER.getName()).get(0)); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName())); // creator is not updated! Assert.assertEquals(creator, getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName()).get(0)); // clear comment entityContext.setComment(null); } @Test public void testEmbedCreateUserComment() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, DEPLOY_REPO).getMetadataService() .getMetaClass(MANIFEST); MetaClass versionMetaClass = server.getRepository(CMSPriority.NEUTRAL, DEPLOY_REPO).getMetadataService() .getMetaClass(MANIFEST_VERSION); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"embedcreate-test-manifest-002\", \"_createtime\": " + date.getTime() + " } "); jsonEntity.setBranchId(BRANCH_MAIN); // create manifest String creator = "root-creator"; entityContext.setModifier(creator); String comment = "newlycreate"; entityContext.setComment(comment); String newId = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); IEntity qEntity = buildQueryEntity(CMSPriority.NEUTRAL, DEPLOY_REPO, BRANCH_MAIN, MANIFEST, newId); IEntity getEntity = server.get(CMSPriority.NEUTRAL, qEntity, queryParams, entityContext); Assert.assertNotNull(getEntity); Assert.assertTrue(getEntity.getCreateTime().equals(date)); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.COMMENT.getName())); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.USER.getName())); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.MODIFIER.getName())); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName())); // create embed entity JsonEntity versionJsonEntity = new JsonEntity(versionMetaClass); versionJsonEntity.setBranchId(BRANCH_MAIN); versionJsonEntity.setId(MANIFEST + "!" + newId + "!versions!" + "customizedVersionId"); Date versionCreateTime = new Date(); versionJsonEntity.addFieldValue("createdTime", versionCreateTime); versionJsonEntity.addFieldValue("name", "manifest-version-name-001"); // set as null to test the populate userid/subject/comment to parent // entity case String embedCreateUserId = null; entityContext.setUserId(embedCreateUserId); String embedCreateModifier = null; entityContext.setModifier(embedCreateModifier); String embedCreateComments = null; entityContext.setComment(embedCreateComments); String versionId = server.create(CMSPriority.NEUTRAL, versionJsonEntity, entityContext); IEntity queryEntity = buildQueryEntity(CMSPriority.NEUTRAL, DEPLOY_REPO, BRANCH_MAIN, MANIFEST, newId); getEntity = server.get(CMSPriority.NEUTRAL, queryEntity, queryParams, entityContext); Assert.assertNotNull(getEntity); // root create time is not changed Assert.assertTrue(getEntity.getCreateTime().equals(date)); Assert.assertEquals(versionId, ((IEntity) getEntity.getFieldValues("versions").get(0)).getId()); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.COMMENT.getName())); Assert.assertEquals(comment, getEntity.getFieldValues(InternalFieldEnum.COMMENT.getName()).get(0)); // creator is not updated! Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName())); Assert.assertEquals(creator, getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName()).get(0)); // clear comment entityContext.setComment(null); } @Test public void testCreateWithNullOidStrongReference() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity( metaClass, "{ \"name\": \"cmsserver-test-entity-create-001\", \"_createtime\": " + date.getTime() + "," + "\"services\":[{ \"name\" : \"test-null-oid-service-instance-name\", \"_oid\" : null }] } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); try { server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); Assert.fail(); } catch (CmsEntMgrException e) { // expected Assert.assertEquals(CmsEntMgrException.EntMgrErrCodeEnum.VIOLATE_REFERENCE_INTEGRITY, e.getErrorEnum()); } } @Test public void testCreateWithNoOidStrongReference() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-entity-create-002\", \"_createtime\": " + date.getTime() + "," + "\"services\":[{ \"name\" : \"test-null-oid-service-instance-name\"}] } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); try { server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); Assert.fail(); } catch (CmsEntMgrException e) { // expected Assert.assertEquals(CmsEntMgrException.EntMgrErrCodeEnum.VIOLATE_REFERENCE_INTEGRITY, e.getErrorEnum()); } } @Test public void testModifyWithNoOidStrongReference() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity( metaClass, "{ \"name\": \"cmsserver-test-entity-create-002\", \"_createtime\": " + date.getTime() + "," + "\"services\":[{ \"_oid\": \"4fbb314fc681caf13e283a7a\", \"name\" : \"test-null-oid-service-instance-name\"}] } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); String newOid = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); try { jsonEntity = new JsonEntity(metaClass, "{ \"_oid\": \"" + newOid + "\", \"name\": \"cmsserver-test-entity-create-002\", \"_createtime\": " + date.getTime() + "," + "\"services\":[{ \"name\" : \"test-null-oid-service-instance-name\"}] } "); jsonEntity.setBranchId(BRANCH_MAIN); server.modify(CMSPriority.NEUTRAL, jsonEntity, jsonEntity, entityContext); Assert.fail(); } catch (CmsEntMgrException e) { // expected Assert.assertEquals(CmsEntMgrException.EntMgrErrCodeEnum.VIOLATE_REFERENCE_INTEGRITY, e.getErrorEnum()); } } @Test public void testReplaceWithNoOidStrongReference() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity( metaClass, "{ \"name\": \"cmsserver-test-entity-create-010\", \"_createtime\": " + date.getTime() + "," + "\"services\":[{ \"_oid\": \"4fbb314fc681caf13e283a7a\", \"name\" : \"test-null-oid-service-instance-name\"}] } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); String newOid = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); try { jsonEntity = new JsonEntity(metaClass, "{ \"_oid\": \"" + newOid + "\", \"name\": \"cmsserver-test-entity-create-010\", \"_createtime\": " + date.getTime() + "," + "\"services\":[{ \"name\" : \"test-null-oid-service-instance-name\"}] } "); jsonEntity.setBranchId(BRANCH_MAIN); server.replace(CMSPriority.NEUTRAL, jsonEntity, jsonEntity, entityContext); Assert.fail(); } catch (CmsEntMgrException e) { // expected Assert.assertEquals(CmsEntMgrException.EntMgrErrCodeEnum.VIOLATE_REFERENCE_INTEGRITY, e.getErrorEnum()); } } @Test public void testCreateWithEmptyOidStrongReference() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity( metaClass, "{ \"name\": \"cmsserver-test-entity-create-003\", \"_createtime\": " + date.getTime() + "," + "\"services\":[{ \"name\" : \"test-null-oid-service-instance-name\", \"_oid\": \"\"}] } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); try { server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); Assert.fail(); } catch (CmsEntMgrException e) { // expected Assert.assertEquals(CmsEntMgrException.EntMgrErrCodeEnum.VIOLATE_REFERENCE_INTEGRITY, e.getErrorEnum()); } } @Test public void testCreateWithNullOidWeakReference() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(CLUSTER); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cluster-test-entity-create-004\", \"_createtime\": " + date.getTime() + "," + "\"computes\":[{ \"name\" : \"test-null-oid-compute-name\", \"_oid\" : null }] } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); try { server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); Assert.fail(); } catch (CmsDalException e) { // expected Assert.assertEquals(CmsDalException.DalErrCodeEnum.MISS_REFID, e.getErrorEnum()); } } @Test public void testModifyWithNoOidWeakReference() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(CLUSTER); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity( metaClass, "{ \"name\": \"cluster-test-entity-create-005\", \"_createtime\": " + date.getTime() + "," + "\"computes\":[{ \"_oid\" : \"computeOid-001\", \"name\" : \"test-null-oid-compute-name\" }] } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); String newOid = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); try { jsonEntity = new JsonEntity(metaClass, "{ \"_oid\" : \"" + newOid + "\", \"name\": \"cluster-test-entity-create-005\", \"_createtime\": " + date.getTime() + "," + "\"computes\":[{ \"name\" : \"test-null-oid-compute-name\" }] } "); jsonEntity.setBranchId(BRANCH_MAIN); server.modify(CMSPriority.NEUTRAL, jsonEntity, jsonEntity, entityContext); Assert.fail(); } catch (CmsDalException e) { // expected Assert.assertEquals(CmsDalException.DalErrCodeEnum.MISS_REFID, e.getErrorEnum()); } jsonEntity = new JsonEntity(metaClass, "{ \"_oid\" : \"" + newOid + "\", \"name\": \"cluster-test-entity-create-moidfy-005\", \"_createtime\": " + date.getTime() + "," + "\"computes\":[{ \"name\" : \"test-null-oid-compute-name\", \"_oid\":\"51921beda\" }] } "); jsonEntity.setBranchId(BRANCH_MAIN); server.modify(CMSPriority.NEUTRAL, jsonEntity, jsonEntity, entityContext); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); IEntity qEntity = buildQueryEntity(CMSPriority.NEUTRAL, RAPTOR_PAAS, "main", CLUSTER, newOid); IEntity entity = server.get(CMSPriority.NEUTRAL, qEntity, queryParams, entityContext); Assert.assertTrue("cluster-test-entity-create-moidfy-005".equals(entity.getFieldValues("name").get(0))); } @Test public void testReplaceWithNoOidWeakReference() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(CLUSTER); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity( metaClass, "{ \"name\": \"cluster-test-entity-create-011\", \"_createtime\": " + date.getTime() + "," + "\"computes\":[{ \"_oid\" : \"computeOid-001\", \"name\" : \"test-null-oid-compute-name\" }] } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); String newOid = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); try { jsonEntity = new JsonEntity(metaClass, "{ \"_oid\" : \"" + newOid + "\", \"name\": \"cluster-test-entity-create-011\", \"_createtime\": " + date.getTime() + "," + "\"computes\":[{ \"name\" : \"test-null-oid-compute-name\" }] } "); jsonEntity.setBranchId(BRANCH_MAIN); server.modify(CMSPriority.NEUTRAL, jsonEntity, jsonEntity, entityContext); Assert.fail(); } catch (CmsDalException e) { // expected Assert.assertEquals(CmsDalException.DalErrCodeEnum.MISS_REFID, e.getErrorEnum()); } } @Test public void testCreateWithNoOidWeakReference() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(CLUSTER); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cluster-test-entity-create-005\", \"_createtime\": " + date.getTime() + "," + "\"computes\":[{ \"name\" : \"test-null-oid-compute-name\" }] } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); try { server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); Assert.fail(); } catch (CmsDalException e) { // expected Assert.assertEquals(CmsDalException.DalErrCodeEnum.MISS_REFID, e.getErrorEnum()); } } @Test public void testCreateWithEmptyOidWeakReference() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(CLUSTER); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cluster-test-entity-create-006\", \"_createtime\": " + date.getTime() + "," + "\"computes\":[{ \"name\" : \"test-null-oid-compute-name\", \"_oid\": \"\" }] } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); try { server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); Assert.fail(); } catch (CmsDalException e) { // expected Assert.assertEquals(CmsDalException.DalErrCodeEnum.MISS_REFID, e.getErrorEnum()); } } @Test public void testReplace() { } @Test public void testReplaceToCreate() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-entity-create-005\", \"_createtime\": " + date.getTime() + " } "); jsonEntity.setBranchId(BRANCH_MAIN); String newId = generateRandomName("replace-to-create-id-0001"); jsonEntity.setId(newId); String oldSubject = entityContext.getModifier(); String subject = "replace-to-create-unitTestUser"; entityContext.setModifier(subject); entityContext.setComment("newlycreate"); server.replace(CMSPriority.NEUTRAL, jsonEntity, jsonEntity, entityContext); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); IEntity qEntity = buildQueryEntity(CMSPriority.NEUTRAL, RAPTOR_PAAS, BRANCH_MAIN, APPLICATION_SERVICE, newId); IEntity getEntity = server.get(CMSPriority.NEUTRAL, qEntity, queryParams, entityContext); Assert.assertNotNull(getEntity); Assert.assertNotNull(getEntity.getCreateTime().equals(date)); Assert.assertNotNull(getEntity.getCreator()); entityContext.setModifier(oldSubject); // clear comment entityContext.setComment(null); } @Test public void testModify() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-entity-modify\", \"_createtime\": " + date.getTime() + " } "); jsonEntity.setBranchId(BRANCH_MAIN); String createComment = "newlycreate-comments"; entityContext.setComment(createComment); String newId = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); String modifyCommnet = "modify-comments"; entityContext.setComment(modifyCommnet); jsonEntity.setId(newId); jsonEntity.getNode().remove("name"); jsonEntity.addFieldValue("archTier", "any-arch-tier"); server.modify(CMSPriority.NEUTRAL, jsonEntity, jsonEntity, entityContext); // clear comment entityContext.setComment(null); } @Test public void testModifyArray() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-entity-modify-array\", \"_createtime\": " + date.getTime() + " } "); jsonEntity.setBranchId(BRANCH_MAIN); String newId = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); JsonEntity modifyEntity = new JsonEntity(metaClass, "{ \"updateStrategies\": {\"_type\" : \"UpdateStrategy\", \"_oid\" : \"34234324\" } }"); modifyEntity.setBranchId(BRANCH_MAIN); modifyEntity.setId(newId); try { server.modify(CMSPriority.NEUTRAL, modifyEntity, modifyEntity, entityContext); } catch (IllegalArgumentException e) { Assert.assertEquals("The given value of MetaField updateStrategies is not an array", e.getMessage()); } } private static int seq = 0; // private static MongoDataSource dataSource; private static String CLUSTER = "Cluster";; @Test public void modifyEmbedArrayField() { seq++; MetaClass serviceInstanceMeta = server.getRepository(CMSPriority.NEUTRAL, STRATUS_REPO).getMetadataService() .getMetaClass(SERVICE_INSTANCE); MetaClass serviceAcessPointMeta = server.getRepository(CMSPriority.NEUTRAL, STRATUS_REPO).getMetadataService() .getMetaClass("ServiceAccessPoint"); JsonEntity jsonEntity = new JsonEntity(serviceInstanceMeta); jsonEntity.setBranchId("main"); jsonEntity.addFieldValue("description", "create service instance " + seq); JsonEntity embedEntity = new JsonEntity(serviceAcessPointMeta); String label1 = generateRandomName("accessPoint") + "-" + seq; embedEntity.addFieldValue("label", label1); embedEntity.addFieldValue("port", 80); embedEntity.addFieldValue("protocol", "tcp"); jsonEntity.addFieldValue("serviceAccessPoints", embedEntity); String id = server.create(null, jsonEntity, entityContext); Assert.assertNotNull(id); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); IEntity qEntity = buildQueryEntity(null, STRATUS_REPO, "main", SERVICE_INSTANCE, id); IEntity getEntity = server.get(null, qEntity, queryParams, entityContext); Assert.assertNotNull(getEntity); Assert.assertTrue(getEntity.getFieldValues("serviceAccessPoints").size() == 1); JsonEntity newEmbed = new JsonEntity(serviceAcessPointMeta); String label2 = generateRandomName("accessPoint") + "- " + seq + "by modify field"; newEmbed.addFieldValue("label", label2); newEmbed.addFieldValue("port", 80); newEmbed.addFieldValue("protocol", "tcp"); JsonEntity modifyEntity = new JsonEntity(serviceInstanceMeta); modifyEntity.setBranchId("main"); modifyEntity.setId(id); modifyEntity.addFieldValue("serviceAccessPoints", newEmbed); try { server.modifyField(null, modifyEntity, modifyEntity, "serviceAccessPoints", entityContext); Assert.fail(); } catch (CmsEntMgrException e) { Assert.assertEquals(EntMgrErrCodeEnum.EMBED_RELATIONSHIP_IMMUTABLE, e.getErrorEnum()); } } @Test public void testQuery() { Assert.assertNotNull(server.query(CMSPriority.NEUTRAL, "ApplicationService[@archTier=\"app\"]", raptorQueryContext)); } @Test public void testGetQueryMetaclass() { QueryContext context = new QueryContext(RAPTOR_PAAS, BRANCH_MAIN); Map<String, MetaClass> metadatas = server.getQueryMetaClass(CMSPriority.NEUTRAL, "ServiceInstance", context); Assert.assertEquals(1, metadatas.size()); } @Test public void testAddIndex() { IndexInfo index = new IndexInfo("ut_appTierIndex2_cmsServer"); index.addKeyField("appId"); index.addKeyField("name"); index.addOption(IndexOptionEnum.unique); List<IndexInfo> indexes = new ArrayList<IndexInfo>(); indexes.add(index); metaContext.setOptionChangeMode(UpdateOptionMode.ADD); server.addIndex(CMSPriority.NON_CRITICAL, RAPTOR_PAAS, APPLICATION_SERVICE, indexes, metaContext); } @Test public void testAddIndexOnParent() { IndexInfo index = new IndexInfo("descriptionIndex"); index.addKeyField("description"); List<IndexInfo> indexes = new ArrayList<IndexInfo>(); indexes.add(index); metaContext.setOptionChangeMode(UpdateOptionMode.ADD); server.addIndex(CMSPriority.NON_CRITICAL, STRATUS_REPO, "Base", indexes, metaContext); // case 1 : the meta and all its existing metadata indexes are loaded IMetadataService metaService = server.getRepository(CMSPriority.NEUTRAL, STRATUS_REPO).getMetadataService(); MetaClass meta = metaService.getMetaClass("Base"); checkIndexesLoaded(metaService, meta); // also make sure indexes are added for descendants for (MetaClass descMeta : meta.getDescendants()) { checkIndexesLoaded(metaService, descMeta); } // case 2: all newly create meta after the index will have indexes // built. MetaClass newChild = new MetaClass(); newChild.setName("newChildMeta"); newChild.setRepository(meta.getRepository()); newChild.setParent("Base"); server.batchUpsert(CMSPriority.NEUTRAL, STRATUS_REPO, Arrays.asList(newChild), metaContext); MetaClass getChild = server.getMetaClass(CMSPriority.NEUTRAL, STRATUS_REPO, newChild.getName()); Assert.assertTrue(getChild.getIndexNames().contains(index.getIndexName())); checkIndexesLoaded(metaService, getChild); } @Test public void testUpdateParentMetaToAddIndex() { IMetadataService metaService = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService(); // create parent MetaClass parentMeta = new MetaClass(); parentMeta.setName("newParentMeta"); parentMeta.setRepository(RAPTOR_PAAS); server.batchUpsert(CMSPriority.NEUTRAL, RAPTOR_PAAS, Arrays.asList(parentMeta), metaContext); MetaClass getParent = server.getMetaClass(CMSPriority.NEUTRAL, RAPTOR_PAAS, parentMeta.getName()); checkIndexesLoaded(metaService, getParent); // create child MetaClass child1 = new MetaClass(); child1.setName("newChildMeta"); child1.setRepository(parentMeta.getRepository()); child1.setParent(parentMeta.getName()); server.batchUpsert(CMSPriority.NEUTRAL, RAPTOR_PAAS, Arrays.asList(child1), metaContext); MetaClass getChild1 = server.getMetaClass(CMSPriority.NEUTRAL, RAPTOR_PAAS, child1.getName()); checkIndexesLoaded(metaService, getChild1); // child2 MetaClass child2 = new MetaClass(); child2.setName("newChildMeta2"); child2.setRepository(parentMeta.getRepository()); child2.setParent(child1.getName()); server.batchUpsert(CMSPriority.NEUTRAL, RAPTOR_PAAS, Arrays.asList(child2), metaContext); MetaClass getChild2 = server.getMetaClass(CMSPriority.NEUTRAL, RAPTOR_PAAS, child2.getName()); checkIndexesLoaded(metaService, getChild2); // now update parent MetaClass uParentMeta = new MetaClass(); uParentMeta.setName("newParentMeta"); uParentMeta.setRepository(RAPTOR_PAAS); MetaAttribute attr = new MetaAttribute(); attr.setName("newParentFieldName"); attr.setDataType(DataTypeEnum.STRING); uParentMeta.addField(attr); IndexInfo newInfo = new IndexInfo("nameIndex"); newInfo.addKeyField(attr.getName()); newInfo.addOption(IndexOptionEnum.unique); uParentMeta.addIndex(newInfo); server.batchUpsert(CMSPriority.NEUTRAL, RAPTOR_PAAS, Arrays.asList(uParentMeta), metaContext); // assertion now MetaClass gMeta = server.getMetaClass(CMSPriority.NEUTRAL, RAPTOR_PAAS, uParentMeta.getName()); Assert.assertEquals(3, gMeta.getIndexNames().size()); checkIndexesLoaded(metaService, gMeta); gMeta = server.getMetaClass(CMSPriority.NEUTRAL, RAPTOR_PAAS, child1.getName()); Assert.assertEquals(3, gMeta.getIndexNames().size()); checkIndexesLoaded(metaService, gMeta); gMeta = server.getMetaClass(CMSPriority.NEUTRAL, RAPTOR_PAAS, child2.getName()); Assert.assertEquals(3, gMeta.getIndexNames().size()); Assert.assertTrue(gMeta.getIndexNames().contains(newInfo.getIndexName())); checkIndexesLoaded(metaService, gMeta); } @Test public void testUpdateMetaField() { MetaClass rootMeta = new MetaClass(); rootMeta.setName("newMeta-1"); rootMeta.setRepository(RAPTOR_PAAS); MetaClass newMeta = new MetaClass(); newMeta.setName("newMeta-2"); newMeta.setRepository(RAPTOR_PAAS); MetaRelationship rel = new MetaRelationship(); rel.setName("rel-1"); rel.setRelationType(RelationTypeEnum.Reference); rel.setRefDataType(newMeta.getName()); rootMeta.addField(rel); MetaClass innerMeta = new MetaClass(); innerMeta.setName("innerMeta"); innerMeta.setRepository(RAPTOR_PAAS); innerMeta.setInner(true); List<MetaClass> metaList = new ArrayList<MetaClass>(); metaList.add(rootMeta); metaList.add(newMeta); metaList.add(innerMeta); server.batchUpsert(CMSPriority.NEUTRAL, RAPTOR_PAAS, metaList, metaContext); rel.setRefDataType(innerMeta.getName()); rel.setRelationType(RelationTypeEnum.Inner); rel.setDbName(null); rel.setValueDbName(null); rel.setFlattenValueDbName(null); server.updateMetaField(CMSPriority.NEUTRAL, RAPTOR_PAAS, rootMeta, "rel-1", metaContext); } @Test public void testAddIndexOnParentConflictWithChild() { IndexInfo index = new IndexInfo("fqdnIndex"); index.addKeyField("description"); index.addOption(IndexOptionEnum.unique); List<IndexInfo> indexes = new ArrayList<IndexInfo>(); indexes.add(index); metaContext.setOptionChangeMode(UpdateOptionMode.ADD); try { server.addIndex(CMSPriority.NON_CRITICAL, STRATUS_REPO, "Base", indexes, metaContext); Assert.fail(); } catch (IndexExistsException iee) { // expected : should conflict with the fqdn index in ServiceInstance } } @Test public void testDeleteIndex() { IndexInfo index = new IndexInfo("ut_appTierIndex3_cmsServer"); index.addKeyField("appId"); index.addKeyField("name"); index.addKeyField("archTier"); index.addOption(IndexOptionEnum.unique); List<IndexInfo> indexes = new ArrayList<IndexInfo>(); indexes.add(index); metaContext.setOptionChangeMode(UpdateOptionMode.ADD); server.addIndex(CMSPriority.NON_CRITICAL, RAPTOR_PAAS, APPLICATION_SERVICE, indexes, metaContext); metaContext.setOptionChangeMode(UpdateOptionMode.DELETE); server.deleteIndex(CMSPriority.NON_CRITICAL, RAPTOR_PAAS, APPLICATION_SERVICE, "ut_appTierIndex3_cmsServer", metaContext); } @Test public void testDeleteIndexOnParent() { IndexInfo createIndex = new IndexInfo("descriptionLabelIndex"); createIndex.addKeyField("description"); createIndex.addKeyField("label"); createIndex.addOption(IndexOptionEnum.unique); createIndex.addOption(IndexOptionEnum.sparse); List<IndexInfo> indexes1 = new ArrayList<IndexInfo>(); indexes1.add(createIndex); metaContext.setOptionChangeMode(UpdateOptionMode.ADD); server.addIndex(CMSPriority.NON_CRITICAL, STRATUS_REPO, "Base", indexes1, metaContext); IMetadataService metaService = server.getRepository(CMSPriority.NEUTRAL, STRATUS_REPO).getMetadataService(); MetaClass meta = metaService.getMetaClass("Base"); checkIndexesLoaded(metaService, meta); for (MetaClass descMeta : meta.getDescendants()) { checkIndexesLoaded(metaService, descMeta); } // delete don't need key specified metaContext.setOptionChangeMode(UpdateOptionMode.DELETE); server.deleteIndex(CMSPriority.NON_CRITICAL, STRATUS_REPO, "Base", "descriptionLabelIndex", metaContext); metaService = server.getRepository(CMSPriority.NEUTRAL, STRATUS_REPO).getMetadataService(); meta = metaService.getMetaClass("Base"); checkIndexesLoaded(metaService, meta); // make sure indexes are removed from descendants for (MetaClass descMeta : meta.getDescendants()) { checkIndexesLoaded(metaService, descMeta); } } @Test public void overrideIndex() { final String idxName = "descriptionOidIndex"; IndexInfo parentIndex = new IndexInfo(idxName); parentIndex.addKeyField("description"); parentIndex.addKeyField("_oid"); parentIndex.addOption(IndexOptionEnum.sparse); List<IndexInfo> indexes1 = new ArrayList<IndexInfo>(); indexes1.add(parentIndex); metaContext.setOptionChangeMode(UpdateOptionMode.ADD); server.addIndex(CMSPriority.NON_CRITICAL, STRATUS_REPO, "Base", indexes1, metaContext); // assert the child indexes { MetaClass nodeServer = server.getMetaClass(CMSPriority.NON_CRITICAL, STRATUS_REPO, ENVIRONMENT); IMetadataService metaService = server.getRepository(CMSPriority.NEUTRAL, STRATUS_REPO).getMetadataService(); Map<String, DBObject> dbIndexes = getCollectionIndexMap(metaService, nodeServer); Assert.assertTrue(dbIndexes.containsKey(idxName)); } // try override the index on sub meta class { IndexInfo newIndex = new IndexInfo(); newIndex.setIndexName(idxName); newIndex.addKeyField("description"); newIndex.addKeyField("_oid"); newIndex.addKeyField("label"); server.addIndex(CMSPriority.NON_CRITICAL, STRATUS_REPO, ENVIRONMENT, Arrays.asList(newIndex), metaContext); // assert metadata MetaClass nodeServer = server.getMetaClass(CMSPriority.NON_CRITICAL, STRATUS_REPO, ENVIRONMENT); IndexInfo overIndex = nodeServer.getIndexByName(idxName); Assert.assertEquals(parentIndex.getKeyList().size() + 1, overIndex.getKeyList().size()); Assert.assertTrue(overIndex.getKeyList().contains("description")); Assert.assertTrue(overIndex.getKeyList().contains("_oid")); Assert.assertTrue(overIndex.getKeyList().contains("label")); Assert.assertFalse(overIndex.getIndexOptions().contains(IndexOptionEnum.sparse)); Assert.assertFalse(overIndex.getIndexOptions().contains(IndexOptionEnum.unique)); // assert db indexes IMetadataService metaService = server.getRepository(CMSPriority.NEUTRAL, STRATUS_REPO).getMetadataService(); Map<String, DBObject> dbIndexes = getCollectionIndexMap(metaService, nodeServer); Assert.assertTrue(dbIndexes.containsKey(idxName)); DBObject indexDbo = (DBObject) dbIndexes.get(idxName); Assert.assertFalse(indexDbo.containsField(IndexOptionEnum.sparse.name().toLowerCase())); Assert.assertFalse(indexDbo.containsField(IndexOptionEnum.unique.name().toLowerCase())); DBObject keyObject = (DBObject) indexDbo.get("key"); Assert.assertEquals(3, keyObject.toMap().size()); } } protected static void checkIndexesLoaded(IMetadataService metaService, MetaClass metaClass) { if (metaClass.getName().equals(HistoryMetaClass.NAME) || metaClass.getName().equals(BranchMetaClass.TYPE_NAME)) { return; } Map<String, DBObject> indexObjects = getCollectionIndexMap(metaService, metaClass); for (IndexInfo ii : metaClass.getIndexes()) { Assert.assertTrue(indexObjects.containsKey(ii.getIndexName())); } } protected static Map<String, DBObject> getCollectionIndexMap(IMetadataService metaService, MetaClass metaClass) { PersistenceContext pc = newPersistenceContext(metaService); pc.setMongoDataSource(dataSource); DBCollection collection = pc.getDBCollection(metaClass); List<DBObject> indexInfo = collection.getIndexInfo(); Assert.assertNotNull(indexInfo); Assert.assertTrue(indexInfo.size() > 0); Map<String, DBObject> indexMap = new HashMap<String, DBObject>(); for (DBObject indexObject : indexInfo) { String name = (String) indexObject.get("name"); indexMap.put(name, indexObject); } return indexMap; } protected static PersistenceContext newPersistenceContext(IMetadataService metaService) { PersistenceContext pc = new PersistenceContext(metaService, DBCollectionPolicy.SplitByMetadata, ConsistentPolicy.PRIMARY, IBranch.DEFAULT_BRANCH); pc.setDbConfig(config); pc.setRegistration(RegistrationUtils.getDefaultDalImplementation(dataSource)); return pc; } // configuration api test @Test public void getConfig() { Map<String, Object> configs = server.getCurrentConfigurations(); Assert.assertNotNull(configs); } @Test public void getConfigNames() { Set<String> sets = server.getCurrentConfigurations().keySet(); Set<String> names = server.getConfigNames(); Assert.assertEquals(sets.size(), names.size()); Assert.assertEquals(sets, names); } @Test public void chConfig() { Map<String, Object> current = server.getCurrentConfigurations(); Assert.assertTrue((Boolean) current.get(CMSDBConfig.SYS_ALLOW_FULL_TABLE_SCAN)); Map<String, Object> modConfig = new HashMap<String, Object>(current); modConfig.remove(CMSDBConfig.SYS_SHOW_STACK_TRACE_PROP); modConfig.put(CMSDBConfig.SYS_ALLOW_FULL_TABLE_SCAN, false); server.config(modConfig); Map<String, Object> newConfig = server.getCurrentConfigurations(); Assert.assertEquals(Boolean.FALSE, (Boolean) newConfig.get(CMSDBConfig.SYS_ALLOW_FULL_TABLE_SCAN)); modConfig.put(CMSDBConfig.SYS_ALLOW_FULL_TABLE_SCAN, true); server.config(modConfig); } @Test public void fullTableScanConfig() { // case 1 : query full table scan false + sys full table scan true QueryContext qc = newQueryContext(RAPTOR_PAAS); qc.setSmallTableThreshold(0); try { server.query(CMSPriority.NEUTRAL, "ApplicationService", qc); Assert.fail(); } catch (QueryOptimizeException e) { // expected } // case 2 : query full table scan true + sys full table scan true qc.setAllowFullTableScan(true); server.query(CMSPriority.NEUTRAL, "ApplicationService", qc); // case 3 : query full table scan true + sys full table scan false Map<String, Object> modConfig = new HashMap<String, Object>(); modConfig.put(CMSDBConfig.SYS_ALLOW_FULL_TABLE_SCAN, false); server.config(modConfig); try { server.query(CMSPriority.NEUTRAL, "ApplicationService", qc); Assert.fail(); } catch (QueryOptimizeException e) { // expected } modConfig.put(CMSDBConfig.SYS_ALLOW_FULL_TABLE_SCAN, true); server.config(modConfig); } public static class FailedCallback implements IEntityOperationCallback { @Override public boolean preOperation(IEntity existingEntity, Operation op, IEntity newEntity, CallbackContext context) { return false; } } @Test public void entityCallback() { server.setEntityOperationCallback(new FailedCallback()); try { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-entity-modify-callback\", \"_createtime\": " + date.getTime() + " } "); jsonEntity.setBranchId(BRANCH_MAIN); String createComment = "newlycreate-comments"; entityContext.setComment(createComment); String newId = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); jsonEntity.setId(newId); server.modify(CMSPriority.NEUTRAL, jsonEntity, jsonEntity, entityContext); Assert.fail(); } catch (Exception e) { // expected Assert.assertTrue(e instanceof CmsEntMgrException); Assert.assertEquals(CmsEntMgrException.EntMgrErrCodeEnum.OPERATION_CHECK_FAILED, ((CmsEntMgrException) e).getErrorEnum()); } // clear comment entityContext.setComment(null); server.setEntityOperationCallback(null); } @Test public void testCreator() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); Date date = new Date(123); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-for-creator\" } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); entityContext.setModifier("unitTestUser"); String newId = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); IEntity qEntity = buildQueryEntity(CMSPriority.NEUTRAL, RAPTOR_PAAS, BRANCH_MAIN, APPLICATION_SERVICE, newId); IEntity getEntity = server.get(CMSPriority.NEUTRAL, qEntity, queryParams, entityContext); Assert.assertNotNull(getEntity); Assert.assertNotNull(getEntity.getCreateTime().equals(date)); Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName())); Assert.assertEquals(entityContext.getModifier(), getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName()) .get(0)); // clear comment entityContext.setComment(null); } @Test public void testUpdateToChangeCreator() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-for-creator-update\" } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); String creator = "unitTestUser"; entityContext.setModifier(creator); String newId = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); JsonEntity uJsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-for-creator-update-0001\" } "); entityContext.setModifier("update01"); uJsonEntity.addFieldValue(InternalFieldEnum.CREATOR.getName(), "updateUser01"); uJsonEntity.setBranchId(BRANCH_MAIN); uJsonEntity.setId(newId); server.modify(CMSPriority.NEUTRAL, uJsonEntity, uJsonEntity, entityContext); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); IEntity qEntity = buildQueryEntity(CMSPriority.NEUTRAL, RAPTOR_PAAS, BRANCH_MAIN, APPLICATION_SERVICE, newId); IEntity getEntity = server.get(CMSPriority.NEUTRAL, qEntity, queryParams, entityContext); Assert.assertNotNull(getEntity); // assert that creator is not changed even when user try to update it Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName())); Assert.assertEquals(creator, getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName()).get(0)); } @Test public void testReplaceToChangeCreator() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, RAPTOR_PAAS).getMetadataService() .getMetaClass(APPLICATION_SERVICE); JsonEntity jsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-for-creator-replace\" } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); String creator = "unitTestUser"; entityContext.setModifier(creator); String newId = server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); JsonEntity uJsonEntity = new JsonEntity(metaClass, "{ \"name\": \"cmsserver-test-for-creator-replace-0001\" } "); entityContext.setModifier("replace01"); uJsonEntity.addFieldValue(InternalFieldEnum.CREATOR.getName(), "repalceUser01"); uJsonEntity.setBranchId(BRANCH_MAIN); uJsonEntity.setId(newId); server.replace(CMSPriority.NEUTRAL, uJsonEntity, uJsonEntity, entityContext); MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); IEntity qEntity = buildQueryEntity(CMSPriority.NEUTRAL, RAPTOR_PAAS, BRANCH_MAIN, APPLICATION_SERVICE, newId); IEntity getEntity = server.get(CMSPriority.NEUTRAL, qEntity, queryParams, entityContext); Assert.assertNotNull(getEntity); // assert that creator is not changed even when user try to update it Assert.assertNotNull(getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName())); Assert.assertEquals(1, getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName()).size()); Assert.assertEquals(creator, getEntity.getFieldValues(InternalFieldEnum.CREATOR.getName()).get(0)); } @Test public void testCreateWithInvalidReferenceType() { MetaClass metaClass = server.getRepository(CMSPriority.NEUTRAL, STRATUS_REPO).getMetadataService() .getMetaClass(RESOURCE_GROUP); JsonEntity jsonEntity = new JsonEntity( metaClass, "{ \"type\": \"ApplicationService\", \"resourceId\": \"PHX:SI01\", " + "\"children\":[{ \"_oid\" : \"50e7ee93e4b0fe5ae3aa34c8\", \"_type\" : \"UpdateStrategy\" }] } "); jsonEntity.setBranchId(BRANCH_MAIN); entityContext.setComment("newlycreate"); try { server.create(CMSPriority.NEUTRAL, jsonEntity, entityContext); Assert.fail(); } catch (IllegalArgumentException e) { // expected Assert.assertEquals("Meta relationship ref meta Resource couldn't be add a instance of UpdateStrategy", e.getMessage()); } } private JsonEntity buildQueryEntity(CMSPriority p, String reponame, String branchname, String metadata, String oid) { MetaClass meta = server.getMetaClass(p, reponame, metadata); JsonEntity queryEntity = new JsonEntity(meta); queryEntity.setId(oid); queryEntity.setBranchId(branchname); return queryEntity; } @Test @SuppressWarnings("unchecked") public void testEnumMetaChange_ok() { // newly create meta class with enum; create an entity; then change the // enum value list; try to get/query the given entity MetaClass newMeta = new MetaClass(); newMeta.setName("EnumModelTest"); newMeta.setRepository(RAPTOR_PAAS); MetaAttribute enumAttr = new MetaAttribute(); enumAttr.setName("enumAttr"); enumAttr.setDataType(DataTypeEnum.ENUM); enumAttr.addEnumValue("datamodel"); newMeta.addField(enumAttr); // create meta server.batchUpsert(CMSPriority.NON_CRITICAL, RAPTOR_PAAS, Arrays.asList(newMeta), metaContext); MetaClass getMeta = server.getMetaClass(CMSPriority.NON_CRITICAL, RAPTOR_PAAS, newMeta.getName()); // create entity JsonEntity newEntity = new JsonEntity(getMeta); newEntity.setBranchId(IBranch.DEFAULT_BRANCH); newEntity.addFieldValue(enumAttr.getName(), "datamodel"); String newId = server.create(CMSPriority.NON_CRITICAL, newEntity, entityContext); newEntity.setId(newId); Assert.assertNotNull(server.get(CMSPriority.NON_CRITICAL, newEntity, Collections.<String, List<String>> emptyMap(), entityContext)); // now change enum meta MetaAttribute newEnumAttr = new MetaAttribute(); newEnumAttr.setName("enumAttr"); newEnumAttr.setDataType(DataTypeEnum.ENUM); newEnumAttr.addEnumValue("model"); MetaClass updateMeta = new MetaClass(); updateMeta.setName("EnumModelTest"); updateMeta.setRepository(RAPTOR_PAAS); updateMeta.addField(newEnumAttr); server.updateMetaField(CMSPriority.NON_CRITICAL, RAPTOR_PAAS, updateMeta, newEnumAttr.getName(), metaContext); // try to get the entity with old data IEntity getEntity = server.get(CMSPriority.NON_CRITICAL, newEntity, Collections.<String, List<String>> emptyMap(), entityContext); Assert.assertNotNull(getEntity); List<String> getEnumValues = (List<String>) getEntity.getFieldValues(enumAttr.getName()); Assert.assertNotNull(getEnumValues); Assert.assertEquals(1, getEnumValues.size()); // try query IQueryResult result = server.query(CMSPriority.NON_CRITICAL, newMeta.getName(), raptorQueryContext); Assert.assertEquals(1, result.getEntities().size()); IEntity queryEntity = result.getEntities().get(0); Assert.assertTrue(queryEntity.hasField(newEnumAttr.getName())); } @SuppressWarnings("unchecked") @Test public void testCheckSystemLimitationByCasModifyField() throws Exception { CMSPriority p = CMSPriority.NEUTRAL; String repoName = CMSDB_REPO; Repository repoInst = server.getRepository(p, repoName); RepositoryOption repoOption = repoInst.getOptions(); repoOption.setMaxDocumentSize(524288L); repoOption.setMaxIndexedArraySize(5000); repoOption.setMaxNumOfIndexes(25); repoOption.setMaxRepositorySize(53687091200L); server.updateRepository(p, repoInst); JsonEntity queryEntity = buildQueryEntity(p, repoName, BRANCH_MAIN, NODE_SERVER, "51f977a3171b7e36601ad3ea"); IEntity nodeServerEntity = server.get(p, queryEntity, Collections.<String, List<String>> emptyMap(), entityContext); Assert.assertNotNull(nodeServerEntity); List<IEntity> capacities = (List<IEntity>) nodeServerEntity.getFieldValues("capacities"); Assert.assertNotNull(capacities); Assert.assertEquals(1, capacities.size()); String fieldName = "reserved"; Long oldValue = 0L; Long newValue = 1L; JsonEntity oldCapacity = (JsonEntity) capacities.get(0); JsonEntity newCapacity = new JsonEntity(oldCapacity); newCapacity.setFieldValues(fieldName, Arrays.asList(newValue)); server.casModifyField(p, oldCapacity, newCapacity, fieldName, oldValue, entityContext); IEntity capacityEntity = server.get(p, oldCapacity, Collections.<String, List<String>> emptyMap(), entityContext); Assert.assertNotNull(capacityEntity); List<?> updatedValues = capacityEntity.getFieldValues(fieldName); Assert.assertNotNull(updatedValues); Assert.assertEquals(1, updatedValues.size()); Assert.assertEquals(newValue, updatedValues.get(0)); // reset value changes server.casModifyField(p, newCapacity, oldCapacity, fieldName, newValue, entityContext); capacityEntity = server.get(p, newCapacity, Collections.<String, List<String>> emptyMap(), entityContext); Assert.assertNotNull(capacityEntity); updatedValues = capacityEntity.getFieldValues(fieldName); Assert.assertNotNull(updatedValues); Assert.assertEquals(1, updatedValues.size()); Assert.assertEquals(oldValue, updatedValues.get(0)); // reset repository setting repoOption.setMaxDocumentSize(null); repoOption.setMaxIndexedArraySize(null); repoOption.setMaxNumOfIndexes(null); repoOption.setMaxRepositorySize(null); server.updateRepository(p, repoInst); } @SuppressWarnings("unchecked") @Test public void testCheckSystemLimitationByModifyField() throws Exception { CMSPriority p = CMSPriority.NEUTRAL; String repoName = CMSDB_REPO; Repository repoInst = server.getRepository(p, repoName); RepositoryOption repoOption = repoInst.getOptions(); repoOption.setMaxDocumentSize(524288L); repoOption.setMaxIndexedArraySize(5000); repoOption.setMaxNumOfIndexes(25); repoOption.setMaxRepositorySize(53687091200L); server.updateRepository(p, repoInst); JsonEntity queryEntity = buildQueryEntity(p, repoName, BRANCH_MAIN, NODE_SERVER, "51f977a3171b7e36601ad3ea"); IEntity nodeServerEntity = server.get(p, queryEntity, Collections.<String, List<String>> emptyMap(), entityContext); Assert.assertNotNull(nodeServerEntity); List<IEntity> capacities = (List<IEntity>) nodeServerEntity.getFieldValues("capacities"); Assert.assertNotNull(capacities); Assert.assertEquals(1, capacities.size()); String fieldName = "reserved"; Long oldValue = 0L; Long newValue = 1L; JsonEntity oldCapacity = (JsonEntity) capacities.get(0); JsonEntity newCapacity = new JsonEntity(oldCapacity); newCapacity.setFieldValues(fieldName, Arrays.asList(newValue)); server.modifyField(p, oldCapacity, newCapacity, fieldName, entityContext); IEntity capacityEntity = server.get(p, oldCapacity, Collections.<String, List<String>> emptyMap(), entityContext); Assert.assertNotNull(capacityEntity); List<?> updatedValues = capacityEntity.getFieldValues(fieldName); Assert.assertNotNull(updatedValues); Assert.assertEquals(1, updatedValues.size()); Assert.assertEquals(newValue, updatedValues.get(0)); // reset value changes server.modifyField(p, newCapacity, oldCapacity, fieldName, entityContext); capacityEntity = server.get(p, newCapacity, Collections.<String, List<String>> emptyMap(), entityContext); Assert.assertNotNull(capacityEntity); updatedValues = capacityEntity.getFieldValues(fieldName); Assert.assertNotNull(updatedValues); Assert.assertEquals(1, updatedValues.size()); Assert.assertEquals(oldValue, updatedValues.get(0)); // reset repository setting repoOption.setMaxDocumentSize(null); repoOption.setMaxIndexedArraySize(null); repoOption.setMaxNumOfIndexes(null); repoOption.setMaxRepositorySize(null); server.updateRepository(p, repoInst); } @SuppressWarnings("unchecked") @Test public void testCheckSystemLimitationByPullField() throws Exception { CMSPriority p = CMSPriority.NEUTRAL; String repoName = CMSDB_REPO; Repository repoInst = server.getRepository(p, repoName); RepositoryOption repoOption = repoInst.getOptions(); repoOption.setMaxDocumentSize(524288L); repoOption.setMaxIndexedArraySize(5000); repoOption.setMaxNumOfIndexes(25); repoOption.setMaxRepositorySize(53687091200L); server.updateRepository(p, repoInst); String oid = "51f97777e4b0df04738cba25"; String fieldName = "raidCtrlRaidLevel"; JsonEntity queryEntity = null; MetaClass meta = server.getMetaClass(p, repoName, SKU_CONFIGURATION); queryEntity = new JsonEntity(meta); queryEntity.setId(oid); queryEntity.setBranchId(BRANCH_MAIN); IEntity skuConfigurationEntity = server.get(p, queryEntity, Collections.<String, List<String>> emptyMap(), entityContext); List<String> values = (List<String>) skuConfigurationEntity.getFieldValues(fieldName); Assert.assertNotNull(values); Assert.assertEquals(2, values.size()); String jsonString = "\"raid0\""; ObjectNode node = JsonNodeFactory.instance.objectNode(); ObjectMapper mapper = new ObjectMapper(); JsonNode fieldNode = mapper.readTree(jsonString); ArrayNode arrayNode = JsonNodeFactory.instance.arrayNode(); arrayNode.insert(0, fieldNode); fieldNode = arrayNode; node.put(fieldName, fieldNode); IEntity entity = new JsonEntity(meta, node); entity.setBranchId(BRANCH_MAIN); entity.setId(oid); ModifyAction originalModifyAction = entityContext.getModifyAction(); entityContext.setModifyAction(ModifyAction.PULLFIELD); server.pullField(p, queryEntity, entity, fieldName, entityContext); skuConfigurationEntity = server.get(p, queryEntity, Collections.<String, List<String>> emptyMap(), entityContext); values = (List<String>) skuConfigurationEntity.getFieldValues(fieldName); Assert.assertNotNull(values); Assert.assertEquals(1, values.size()); Assert.assertEquals("raid10", values.get(0)); entityContext.setModifyAction(originalModifyAction); // reset repository setting repoOption.setMaxDocumentSize(null); repoOption.setMaxIndexedArraySize(null); repoOption.setMaxNumOfIndexes(null); repoOption.setMaxRepositorySize(null); server.updateRepository(p, repoInst); } }