package org.zstack.storage.primary.nfs; /** * Created by xing5 on 2016/8/19. */ import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.storage.primary.APIUpdatePrimaryStorageMsg; import org.zstack.header.storage.primary.PrimaryStorageVO; import org.zstack.header.storage.primary.PrimaryStorageVO_; import org.zstack.header.vm.VmInstanceState; import javax.persistence.Tuple; import javax.persistence.TypedQuery; import java.util.List; import java.util.stream.Collectors; import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class NfsApiParamChecker { @Autowired private DatabaseFacade dbf; @Autowired private ErrorFacade errf; public void checkUrl(String zoneUuid, String url) { SimpleQuery<PrimaryStorageVO> q = dbf.createQuery(PrimaryStorageVO.class); q.add(PrimaryStorageVO_.type, Op.EQ, NfsPrimaryStorageConstant.NFS_PRIMARY_STORAGE_TYPE); q.add(PrimaryStorageVO_.url, Op.EQ, url); q.add(PrimaryStorageVO_.zoneUuid, Op.EQ, zoneUuid); if (q.isExists()) { throw new ApiMessageInterceptionException(argerr("there has been a nfs primary storage having url as %s in zone[uuid:%s]", url, zoneUuid)); } } public void checkRunningVmForUpdateUrl(String psuuid) { String sql = "select vm.name, vm.uuid from VmInstanceVO vm, VolumeVO vol where vm.uuid = vol.vmInstanceUuid and" + " vol.primaryStorageUuid = :psUuid and vm.state = :vmState"; TypedQuery<Tuple> q = dbf.getEntityManager().createQuery(sql, Tuple.class); q.setParameter("psUuid", psuuid); q.setParameter("vmState", VmInstanceState.Running); List<Tuple> ts = q.getResultList(); if (!ts.isEmpty()) { List<String> vms = ts.stream().map(v -> String.format("VM[name:%s, uuid:%s]", v.get(0, String.class), v.get(1, String.class))).collect(Collectors.toList()); throw new ApiMessageInterceptionException(operr("there are %s running VMs on the NFS primary storage, please" + " stop them and try again:\n%s\n", vms.size(), StringUtils.join(vms, "\n"))); } } }