package org.zstack.test.storage.ceph;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.zstack.core.cloudbus.CloudBus;
import org.zstack.core.componentloader.ComponentLoader;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.header.identity.SessionInventory;
import org.zstack.header.storage.backup.BackupStorageInventory;
import org.zstack.header.storage.backup.BackupStorageStatus;
import org.zstack.simulator.kvm.KVMSimulatorConfig;
import org.zstack.storage.backup.BackupStorageGlobalConfig;
import org.zstack.storage.ceph.CephGlobalConfig;
import org.zstack.storage.ceph.MonStatus;
import org.zstack.storage.ceph.backup.CephBackupStorageBase.PingOperationFailure;
import org.zstack.storage.ceph.backup.CephBackupStorageMonVO;
import org.zstack.storage.ceph.backup.CephBackupStorageSimulatorConfig;
import org.zstack.storage.ceph.backup.CephBackupStorageVO;
import org.zstack.test.Api;
import org.zstack.test.ApiSenderException;
import org.zstack.test.DBUtil;
import org.zstack.test.WebBeanConstructor;
import org.zstack.test.deployer.Deployer;
import java.util.Iterator;
import java.util.concurrent.TimeUnit;
/**
* test ping ceph backup storage mons
*/
public class TestPingCephBs1 {
Deployer deployer;
Api api;
ComponentLoader loader;
CloudBus bus;
DatabaseFacade dbf;
SessionInventory session;
KVMSimulatorConfig kconfig;
CephBackupStorageSimulatorConfig config;
@Before
public void setUp() throws Exception {
DBUtil.reDeployDB();
WebBeanConstructor con = new WebBeanConstructor();
deployer = new Deployer("deployerXml/ceph/TestPingCephPs1.xml", con);
deployer.addSpringConfig("ceph.xml");
deployer.addSpringConfig("cephSimulator.xml");
deployer.addSpringConfig("KVMRelated.xml");
deployer.build();
api = deployer.getApi();
loader = deployer.getComponentLoader();
bus = loader.getComponent(CloudBus.class);
dbf = loader.getComponent(DatabaseFacade.class);
config = loader.getComponent(CephBackupStorageSimulatorConfig.class);
kconfig = loader.getComponent(KVMSimulatorConfig.class);
session = api.loginAsAdmin();
}
@Test
public void test() throws ApiSenderException, InterruptedException {
BackupStorageInventory bs = deployer.backupStorages.get("ceph-bk");
CephBackupStorageVO ceph = dbf.findByUuid(bs.getUuid(), CephBackupStorageVO.class);
Iterator<CephBackupStorageMonVO> it = ceph.getMons().iterator();
CephBackupStorageMonVO mon1 = it.next();
CephBackupStorageMonVO mon2 = it.next();
BackupStorageGlobalConfig.PING_INTERVAL.updateValue(1);
CephGlobalConfig.BACKUP_STORAGE_MON_AUTO_RECONNECT.updateValue(false);
CephGlobalConfig.BACKUP_STORAGE_MON_RECONNECT_DELAY.updateValue(0);
// put one mon down, the backup storage is still up because another mon is up
config.pingCmdSuccess.put(mon1.getUuid(), false);
TimeUnit.SECONDS.sleep(3);
ceph = dbf.reload(ceph);
mon1 = dbf.reload(mon1);
mon2 = dbf.reload(mon2);
Assert.assertEquals(BackupStorageStatus.Connected, ceph.getStatus());
Assert.assertEquals(MonStatus.Disconnected, mon1.getStatus());
Assert.assertEquals(MonStatus.Connected, mon2.getStatus());
// put all mon down, the backup storage is down
config.pingCmdSuccess.put(mon2.getUuid(), false);
TimeUnit.SECONDS.sleep(3);
ceph = dbf.reload(ceph);
mon1 = dbf.reload(mon1);
mon2 = dbf.reload(mon2);
Assert.assertEquals(BackupStorageStatus.Disconnected, ceph.getStatus());
Assert.assertEquals(MonStatus.Disconnected, mon1.getStatus());
Assert.assertEquals(MonStatus.Disconnected, mon2.getStatus());
// put one mon up, the backup storage is up
config.pingCmdSuccess.put(mon1.getUuid(), true);
TimeUnit.SECONDS.sleep(3);
ceph = dbf.reload(ceph);
mon1 = dbf.reload(mon1);
mon2 = dbf.reload(mon2);
Assert.assertEquals(BackupStorageStatus.Connected, ceph.getStatus());
Assert.assertEquals(MonStatus.Connected, mon1.getStatus());
Assert.assertEquals(MonStatus.Disconnected, mon2.getStatus());
// put all mons up
config.pingCmdSuccess.put(mon2.getUuid(), true);
CephGlobalConfig.BACKUP_STORAGE_MON_AUTO_RECONNECT.updateValue(true);
TimeUnit.SECONDS.sleep(3);
ceph = dbf.reload(ceph);
mon1 = dbf.reload(mon1);
mon2 = dbf.reload(mon2);
Assert.assertEquals(BackupStorageStatus.Connected, ceph.getStatus());
Assert.assertEquals(MonStatus.Connected, mon1.getStatus());
Assert.assertEquals(MonStatus.Connected, mon2.getStatus());
CephGlobalConfig.BACKUP_STORAGE_MON_AUTO_RECONNECT.updateValue(false);
// put all mons to operation failure, confirm all down
config.pingCmdSuccess.put(mon1.getUuid(), false);
config.pingCmdSuccess.put(mon2.getUuid(), false);
config.pingCmdOperationFailure.put(mon1.getUuid(), PingOperationFailure.UnableToCreateFile);
TimeUnit.SECONDS.sleep(3);
ceph = dbf.reload(ceph);
mon1 = dbf.reload(mon1);
mon2 = dbf.reload(mon2);
Assert.assertEquals(BackupStorageStatus.Disconnected, ceph.getStatus());
Assert.assertEquals(MonStatus.Disconnected, mon1.getStatus());
Assert.assertEquals(MonStatus.Disconnected, mon2.getStatus());
// put one mon to the error MonAddrChanged, confirm only the mon down
config.pingCmdSuccess.put(mon1.getUuid(), false);
config.pingCmdSuccess.put(mon2.getUuid(), true);
config.pingCmdOperationFailure.put(mon1.getUuid(), PingOperationFailure.MonAddrChanged);
TimeUnit.SECONDS.sleep(3);
ceph = dbf.reload(ceph);
mon1 = dbf.reload(mon1);
mon2 = dbf.reload(mon2);
Assert.assertEquals(BackupStorageStatus.Connected, ceph.getStatus());
Assert.assertEquals(MonStatus.Disconnected, mon1.getStatus());
Assert.assertEquals(MonStatus.Connected, mon2.getStatus());
// put all mons up, the backup storage is up
CephGlobalConfig.BACKUP_STORAGE_MON_AUTO_RECONNECT.updateValue(true);
config.pingCmdSuccess.clear();
config.pingCmdOperationFailure.clear();
TimeUnit.SECONDS.sleep(3);
ceph = dbf.reload(ceph);
mon1 = dbf.reload(mon1);
mon2 = dbf.reload(mon2);
Assert.assertEquals(BackupStorageStatus.Connected, ceph.getStatus());
Assert.assertEquals(MonStatus.Connected, mon1.getStatus());
Assert.assertEquals(MonStatus.Connected, mon2.getStatus());
}
}