/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.brooklyn.entity.nosql.mongodb.sharding; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.core.entity.trait.Startable; import org.apache.brooklyn.core.test.BrooklynAppLiveTestSupport; import org.apache.brooklyn.entity.nosql.mongodb.AbstractMongoDBServer; import org.apache.brooklyn.entity.nosql.mongodb.MongoDBReplicaSet; import org.apache.brooklyn.entity.nosql.mongodb.MongoDBServer; import org.apache.brooklyn.entity.nosql.mongodb.MongoDBTestHelper; import org.apache.brooklyn.test.EntityTestUtils; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.mongodb.DBObject; public class MongoDBShardedDeploymentIntegrationTest extends BrooklynAppLiveTestSupport { private static final Integer ROUTER_CLUSTER_SIZE = 2; private static final Integer REPLICASET_SIZE = 2; private static final Integer SHARD_CLUSTER_SIZE = 3; private LocalhostMachineProvisioningLocation localhostProvisioningLocation; @BeforeMethod(alwaysRun=true) public void setUp() throws Exception { super.setUp(); localhostProvisioningLocation = app.newLocalhostProvisioningLocation(); } private MongoDBShardedDeployment makeAndStartDeployment() { final MongoDBShardedDeployment deployment = app.createAndManageChild(EntitySpec.create(MongoDBShardedDeployment.class) .configure(MongoDBShardedDeployment.INITIAL_ROUTER_CLUSTER_SIZE, ROUTER_CLUSTER_SIZE) .configure(MongoDBShardedDeployment.SHARD_REPLICASET_SIZE, REPLICASET_SIZE) .configure(MongoDBShardedDeployment.INITIAL_SHARD_CLUSTER_SIZE, SHARD_CLUSTER_SIZE) .configure(MongoDBShardedDeployment.MONGODB_REPLICA_SET_SPEC, EntitySpec.create(MongoDBReplicaSet.class) .configure(MongoDBServer.MONGODB_CONF_TEMPLATE_URL, "classpath:///test-mongodb.conf") .configure(MongoDBReplicaSet.MEMBER_SPEC, EntitySpec.create(MongoDBServer.class))) .configure(MongoDBShardedDeployment.MONGODB_ROUTER_SPEC, EntitySpec.create(MongoDBRouter.class) .configure(MongoDBConfigServer.MONGODB_CONF_TEMPLATE_URL, "classpath:///test-mongodb-router.conf")) .configure(MongoDBShardedDeployment.MONGODB_CONFIG_SERVER_SPEC, EntitySpec.create(MongoDBConfigServer.class) .configure(MongoDBConfigServer.MONGODB_CONF_TEMPLATE_URL, "classpath:///test-mongodb-configserver.conf"))); app.start(ImmutableList.of(localhostProvisioningLocation)); EntityTestUtils.assertAttributeEqualsEventually(deployment, Startable.SERVICE_UP, true); return deployment; } @Test(groups = "Integration") public void testCanStartAndStopDeployment() { MongoDBShardedDeployment deployment = makeAndStartDeployment(); deployment.stop(); EntityTestUtils.assertAttributeEqualsEventually(deployment, Startable.SERVICE_UP, false); } @Test(groups = "Integration") public void testDeployedStructure() { MongoDBShardedDeployment deployment = makeAndStartDeployment(); MongoDBConfigServerCluster configServers = deployment.getConfigCluster(); MongoDBRouterCluster routers = deployment.getRouterCluster(); MongoDBShardCluster shards = deployment.getShardCluster(); Assert.assertNotNull(configServers); Assert.assertNotNull(routers); Assert.assertNotNull(shards); Assert.assertEquals(configServers.getCurrentSize(), MongoDBShardedDeployment.CONFIG_CLUSTER_SIZE.getDefaultValue()); Assert.assertEquals(routers.getCurrentSize(), ROUTER_CLUSTER_SIZE); Assert.assertEquals(shards.getCurrentSize(), SHARD_CLUSTER_SIZE); for (Entity entity : deployment.getShardCluster().getMembers()) { Assert.assertEquals(((MongoDBReplicaSet)entity).getCurrentSize(), REPLICASET_SIZE); } for (Entity entity : configServers.getMembers()) { checkEntityTypeAndServiceUp(entity, MongoDBConfigServer.class); } for (Entity entity : routers.getMembers()) { checkEntityTypeAndServiceUp(entity, MongoDBRouter.class); } for (Entity entity : shards.getMembers()) { checkEntityTypeAndServiceUp(entity, MongoDBReplicaSet.class); } } @Test(groups = "Integration") private void testReadAndWriteDifferentRouters() { MongoDBShardedDeployment deployment = makeAndStartDeployment(); EntityTestUtils.assertAttributeEqualsEventually(deployment, Startable.SERVICE_UP, true); MongoDBRouter router1 = (MongoDBRouter) Iterables.get(deployment.getRouterCluster().getMembers(), 0); MongoDBRouter router2 = (MongoDBRouter) Iterables.get(deployment.getRouterCluster().getMembers(), 1); EntityTestUtils.assertAttributeEqualsEventually(router1, Startable.SERVICE_UP, true); EntityTestUtils.assertAttributeEqualsEventually(router2, Startable.SERVICE_UP, true); String documentId = MongoDBTestHelper.insert(router1, "meaning-of-life", 42); DBObject docOut = MongoDBTestHelper.getById(router2, documentId); Assert.assertEquals(docOut.get("meaning-of-life"), 42); for (Entity entity : Iterables.filter(app.getManagementContext().getEntityManager().getEntitiesInApplication(app), AbstractMongoDBServer.class)) { EntityTestUtils.assertAttributeEqualsEventually(entity, Startable.SERVICE_UP, true); } } private void checkEntityTypeAndServiceUp(Entity entity, Class<? extends Entity> expectedClass) { Assert.assertNotNull(entity); Assert.assertTrue(expectedClass.isAssignableFrom(entity.getClass()), "expected: " + expectedClass + " on interfaces, found: " + entity.getClass().getInterfaces()); EntityTestUtils.assertAttributeEqualsEventually(entity, Startable.SERVICE_UP, true); } }