package org.zstack.test.multinodes;
import junit.framework.Assert;
import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Test;
import org.zstack.core.Platform;
import org.zstack.core.cloudbus.CloudBus;
import org.zstack.core.componentloader.ComponentLoader;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.header.managementnode.ManagementNodeInventory;
import org.zstack.test.Api;
import org.zstack.test.ApiSenderException;
import org.zstack.test.BeanConstructor;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
import org.zstack.utils.path.PathUtil;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* create node0 with some non-restartable jobs
* create node1 with some restartable jobs
* all jobs are in the same queue
* stop node0
* make sure all jobs on node0 are deleted
* all jobs on node1 are restarted
*/
public class TestMultipleNode11 {
CLogger logger = Utils.getLogger(TestMultipleNode11.class);
ComponentLoader loader;
DatabaseFacade dbf;
NodeManager nodeMgr;
CloudBus bus;
Api api;
@Before
public void setUp() throws Exception {
BeanConstructor con = new BeanConstructor();
con.addXml("PortalForUnitTest.xml");
con.addXml("AccountManager.xml");
loader = con.build();
bus = loader.getComponent(CloudBus.class);
dbf = loader.getComponent(DatabaseFacade.class);
nodeMgr = new NodeManager();
api = new Api();
api.startServer();
api.setTimeout(300);
}
@Test
public void test() throws InterruptedException, ApiSenderException, IOException {
try {
nodeMgr.setProperties("-DbFacadeDataSource.maxPoolSize=50")
.createLightWeightNodeWithCore(3, 300, Arrays.asList("silentService.xml", "silentJobService.xml"));
List<ManagementNodeInventory> nodes = api.listManagementNodes();
Iterator<ManagementNodeInventory> it = nodes.iterator();
while (it.hasNext()) {
if (it.next().getUuid().equals(Platform.getManagementServerId())) {
it.remove();
}
}
ManagementNodeInventory node0 = nodes.get(0);
ManagementNodeInventory node1 = nodes.get(1);
ManagementNodeInventory node2 = nodes.get(2);
SilentJobMsg msg = new SilentJobMsg();
msg.setJobNum(50);
bus.makeServiceIdByManagementNodeId(msg, SilentJobService.SERVICE_ID, node0.getUuid());
bus.call(msg);
msg = new SilentJobMsg();
msg.setJobNum(50);
bus.makeServiceIdByManagementNodeId(msg, SilentJobService.SERVICE_ID, node1.getUuid());
SilentJobReply reply = (SilentJobReply) bus.call(msg);
List<String> retUuids = reply.getJobUuids();
msg = new SilentJobMsg();
msg.setJobNum(50);
msg.setRestartable(true);
bus.makeServiceIdByManagementNodeId(msg, SilentJobService.SERVICE_ID, node2.getUuid());
reply = (SilentJobReply) bus.call(msg);
retUuids.addAll(reply.getJobUuids());
nodeMgr.stopNode(node0.getUuid(), 120);
TimeUnit.SECONDS.sleep(5);
File passFolder = new File(RestartableSilentJob.PASS_FOLDER);
if (passFolder.exists()) {
FileUtils.deleteDirectory(passFolder);
}
FileUtils.forceMkdir(passFolder);
for (String uuid : retUuids) {
File f = new File(PathUtil.join(passFolder.getAbsolutePath(), uuid));
f.createNewFile();
logger.debug(String.format("create pass file %s", f.getAbsolutePath()));
}
TimeUnit.SECONDS.sleep(15);
File resFolder = new File(RestartableSilentJob.RESULT_FILE);
Assert.assertEquals(retUuids.size(), resFolder.list().length);
for (String uuid : retUuids) {
File resFile = new File(PathUtil.join(RestartableSilentJob.RESULT_FILE, uuid));
if (!resFile.exists()) {
Assert.fail(String.format("cannot find result file:%s", resFile.getAbsolutePath()));
}
}
} finally {
nodeMgr.stopNodes(120);
}
}
}