/*************************************************************************** * Copyright (c) 2014 VMware, Inc. All Rights Reserved. * 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.vmware.bdd.placement; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.testng.Assert; import org.testng.annotations.Test; import com.vmware.bdd.placement.PlacementPlanner; import com.vmware.bdd.placement.entity.AbstractDatacenter.AbstractDatastore; import com.vmware.bdd.spectypes.DiskSpec; /** * Test disk placement algorithms * * test various disk placement algorithms in PlacementPlanner, such as even * split, aggregate * * @author xiangfeiz * */ public class TestDiskPlacement { @Test public void testPlaceUnSeparableDisks() throws Exception { PlacementPlanner placementPlanner = new PlacementPlanner(); List<DiskSpec> diskSpecs = new ArrayList<DiskSpec>(); DiskSpec diskSpec = new DiskSpec(); diskSpec.setName("diskSpec"); diskSpec.setSize(40); diskSpecs.add(diskSpec); //5 Datastores with 5G, 10G, 20G, 30G, 50G free space List<AbstractDatastore> datastores = new ArrayList<AbstractDatastore>(); AbstractDatastore datastore = new AbstractDatastore("datastore1", 5); datastores.add(datastore); datastore = new AbstractDatastore("datastore2", 10); datastores.add(datastore); datastore = new AbstractDatastore("datastore3", 20); datastores.add(datastore); datastore = new AbstractDatastore("datastore4", 30); datastores.add(datastore); datastore = new AbstractDatastore("datastore5", 50); datastores.add(datastore); Method placeUnSeparableDisks = PlacementPlanner.class. getDeclaredMethod("placeUnSeparableDisks", List.class, List.class); placeUnSeparableDisks.setAccessible(true); List<DiskSpec> placedDisks = (List<DiskSpec>) placeUnSeparableDisks.invoke(placementPlanner, diskSpecs, datastores); Assert.assertEquals(placedDisks.size(), 1); Assert.assertEquals(placedDisks.get(0).getTargetDs(), "datastore5"); Assert.assertEquals(placedDisks.get(0).getSize(), 40); } @Test public void testEvenSpliter() throws Exception { PlacementPlanner placementPlanner = new PlacementPlanner(); DiskSpec diskSpec = new DiskSpec(); diskSpec.setName("diskSpec"); diskSpec.setSize(50); //5 Datastores with 5G, 10G, 20G, 30G, 50G free space List<AbstractDatastore> datastores = new ArrayList<AbstractDatastore>(); AbstractDatastore datastore = new AbstractDatastore("datastore1", 5); datastores.add(datastore); datastore = new AbstractDatastore("datastore2", 10); datastores.add(datastore); datastore = new AbstractDatastore("datastore3", 20); datastores.add(datastore); datastore = new AbstractDatastore("datastore4", 30); datastores.add(datastore); datastore = new AbstractDatastore("datastore5", 50); datastores.add(datastore); //Use reflection to invoke private method PlacementPlanner.evenSpliter() Method evenSpliter = PlacementPlanner.class.getDeclaredMethod("evenSpliter", DiskSpec.class, List.class); evenSpliter.setAccessible(true); List<DiskSpec> placedDisks = (List<DiskSpec>) evenSpliter.invoke(placementPlanner, diskSpec, datastores); StringBuffer output = new StringBuffer(); for(DiskSpec disk : placedDisks) { output.append(disk.getTargetDs() + ":" + disk.getSize() + "G, "); } System.out.println(output.toString()); Assert.assertEquals(output.toString(), "datastore1:5G, datastore2:10G, datastore3:12G, datastore4:12G, datastore5:11G, "); } @Test public void testAggregateSpliter() throws Exception { PlacementPlanner placementPlanner = new PlacementPlanner(); DiskSpec diskSpec = new DiskSpec(); diskSpec.setName("diskSpec"); diskSpec.setSize(70); //5 Datastores with 5G, 10G, 20G, 30G, 50G free space List<AbstractDatastore> datastores = new ArrayList<AbstractDatastore>(); AbstractDatastore datastore = new AbstractDatastore("datastore1", 5); datastores.add(datastore); datastore = new AbstractDatastore("datastore2", 10); datastores.add(datastore); datastore = new AbstractDatastore("datastore3", 20); datastores.add(datastore); datastore = new AbstractDatastore("datastore4", 30); datastores.add(datastore); datastore = new AbstractDatastore("datastore5", 50); datastores.add(datastore); //Use reflection to invoke private method PlacementPlanner.evenSpliter() Method aggregateSpliter = PlacementPlanner.class.getDeclaredMethod("aggregateSpliter", DiskSpec.class, List.class); aggregateSpliter.setAccessible(true); List<DiskSpec> placedDisks = (List<DiskSpec>) aggregateSpliter.invoke(placementPlanner, diskSpec, datastores); Assert.assertEquals(placedDisks.size(), 2); Assert.assertEquals(placedDisks.get(0).getTargetDs(), "datastore5"); Assert.assertEquals(placedDisks.get(0).getSize(), 50); Assert.assertEquals(placedDisks.get(1).getTargetDs(), "datastore4"); Assert.assertEquals(placedDisks.get(1).getSize(), 20); } @Test public void testEvenSpliterWithMinimumSpace() throws Exception { PlacementPlanner placementPlanner = new PlacementPlanner(); DiskSpec diskSpec = new DiskSpec(); diskSpec.setName("diskSpec"); diskSpec.setSize(10); //5 Datastores with 5G, 10G, 20G, 30G, 50G free space List<AbstractDatastore> datastores = new ArrayList<AbstractDatastore>(); AbstractDatastore datastore = new AbstractDatastore("datastore1", 10); datastores.add(datastore); datastore = new AbstractDatastore("datastore2", 9); datastores.add(datastore); datastore = new AbstractDatastore("datastore3", 8); datastores.add(datastore); datastore = new AbstractDatastore("datastore4", 7); datastores.add(datastore); datastore = new AbstractDatastore("datastore5", 3); datastores.add(datastore); datastore = new AbstractDatastore("datastore6", 1); datastores.add(datastore); datastore = new AbstractDatastore("datastore7", 1); datastores.add(datastore); //Use reflection to invoke private method PlacementPlanner.evenSpliter() Method evenSpliter = PlacementPlanner.class.getDeclaredMethod("evenSpliter", DiskSpec.class, List.class); evenSpliter.setAccessible(true); List<DiskSpec> placedDisks = (List<DiskSpec>) evenSpliter.invoke(placementPlanner, diskSpec, datastores); StringBuffer output = new StringBuffer(); for(DiskSpec disk : placedDisks) { output.append(disk.getTargetDs() + ":" + disk.getSize() + "G, "); } System.out.println(output.toString()); Assert.assertEquals(output.toString(), "datastore5:2G, datastore4:2G, datastore3:2G, datastore2:2G, datastore1:2G, "); } }