package org.zstack.storage.fusionstor.backup; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.annotation.Transactional; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.Platform; import org.zstack.core.ansible.AnsibleFacade; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.Component; import org.zstack.header.storage.backup.*; import org.zstack.storage.fusionstor.*; import org.zstack.tag.SystemTagCreator; import javax.persistence.LockModeType; import javax.persistence.TypedQuery; import java.util.List; /** * Created by frank on 7/27/2015. */ public class FusionstorBackupStorageFactory implements BackupStorageFactory, FusionstorCapacityUpdateExtensionPoint, Component { @Autowired private DatabaseFacade dbf; @Autowired private AnsibleFacade asf; public static final BackupStorageType type = new BackupStorageType(FusionstorConstants.FUSIONSTOR_BACKUP_STORAGE_TYPE); static { type.setOrder(799); } void init() { type.setPrimaryStorageFinder(new BackupStorageFindRelatedPrimaryStorage() { @Override @Transactional(readOnly = true) public List<String> findRelatedPrimaryStorage(String backupStorageUuid) { String sql = "select p.uuid from FusionstorPrimaryStorageVO p, FusionstorBackupStorageVO b where b.fsid = p.fsid" + " and b.uuid = :buuid"; TypedQuery<String> q = dbf.getEntityManager().createQuery(sql, String.class); q.setParameter("buuid", backupStorageUuid); return q.getResultList(); } }); } @Override public BackupStorageType getBackupStorageType() { return type; } @Override @Transactional public BackupStorageInventory createBackupStorage(final BackupStorageVO vo, APIAddBackupStorageMsg msg) { APIAddFusionstorBackupStorageMsg cmsg = (APIAddFusionstorBackupStorageMsg)msg; FusionstorBackupStorageVO cvo = new FusionstorBackupStorageVO(vo); cvo.setType(FusionstorConstants.FUSIONSTOR_BACKUP_STORAGE_TYPE); String poolName = cmsg.getPoolName() == null ? String.format("bak-t-%s", vo.getUuid()) : cmsg.getPoolName(); cvo.setPoolName(poolName); dbf.getEntityManager().persist(cvo); if (cmsg.getPoolName() != null) { SystemTagCreator creator = FusionstorSystemTags.PREDEFINED_BACKUP_STORAGE_POOL.newSystemTagCreator(cvo.getUuid()); creator.ignoreIfExisting = true; creator.create(); } for (String url : cmsg.getMonUrls()) { FusionstorBackupStorageMonVO monvo = new FusionstorBackupStorageMonVO(); MonUri uri = new MonUri(url); monvo.setUuid(Platform.getUuid()); monvo.setStatus(MonStatus.Connecting); monvo.setHostname(uri.getHostname()); monvo.setMonPort(uri.getMonPort()); monvo.setSshPort(uri.getSshPort()); monvo.setSshUsername(uri.getSshUsername()); monvo.setSshPassword(uri.getSshPassword()); monvo.setBackupStorageUuid(cvo.getUuid()); dbf.getEntityManager().persist(monvo); } return BackupStorageInventory.valueOf(cvo); } @Override public BackupStorage getBackupStorage(BackupStorageVO vo) { FusionstorBackupStorageVO cvo = dbf.findByUuid(vo.getUuid(), FusionstorBackupStorageVO.class); return new FusionstorBackupStorageBase(cvo); } @Override public BackupStorageInventory reload(String uuid) { return FusionstorBackupStorageInventory.valueOf(dbf.findByUuid(uuid, FusionstorBackupStorageVO.class)); } @Override @Transactional public void update(String fsid, long total, long avail) { String sql = "select c from FusionstorBackupStorageVO c where c.fsid = :fsid"; TypedQuery<FusionstorBackupStorageVO> q = dbf.getEntityManager().createQuery(sql, FusionstorBackupStorageVO.class); q.setParameter("fsid", fsid); q.setLockMode(LockModeType.PESSIMISTIC_WRITE); try { FusionstorBackupStorageVO vo = q.getSingleResult(); vo.setTotalCapacity(total); vo.setAvailableCapacity(avail); dbf.getEntityManager().merge(vo); } catch (EmptyResultDataAccessException e) { return; } } @Override public boolean start() { if (!CoreGlobalProperty.UNIT_TEST_ON) { asf.deployModule(FusionstorGlobalProperty.BACKUP_STORAGE_MODULE_PATH, FusionstorGlobalProperty.BACKUP_STORAGE_PLAYBOOK_NAME); } return true; } @Override public boolean stop() { return true; } }