package org.zstack.compute.host; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; import org.zstack.header.cluster.*; import org.zstack.header.host.*; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import java.util.List; class HostExtensionToCluster implements ClusterChangeStateExtensionPoint { private static final CLogger logger = Utils.getLogger(HostExtensionToCluster.class); @Autowired private DatabaseFacade dbf; @Autowired private CloudBus bus; @Autowired private HostExtensionPointEmitter extpEmitter; private List<HostVO> findHostUnderClusterByUuid(String clusterUuid) { SimpleQuery<HostVO> query = dbf.createQuery(HostVO.class); query.add(HostVO_.clusterUuid, Op.EQ, clusterUuid); return query.list(); } @Override public void preChangeClusterState(ClusterInventory inventory, ClusterStateEvent event, ClusterState nextState) throws ClusterException { if (!event.toString().equals(ClusterStateEvent.disable.toString()) && !event.toString().equals(ClusterStateEvent.enable.toString())) { logger.debug("Unsupported ClusterStateEvent: " + event + ", won't propgate to extensions of host"); return; } HostStateEvent hostEvent = HostStateEvent.valueOf(event.toString()); List<HostVO> vos = findHostUnderClusterByUuid(inventory.getUuid()); try { extpEmitter.preChange(vos, hostEvent); } catch (HostException e) { throw new ClusterException(e.getMessage(), e); } } @Override public void beforeChangeClusterState(ClusterInventory inventory, ClusterStateEvent event, ClusterState nextState) { /* * given changing cluster state is working simultaneously, we change host state one by one * in order to avoid thread pool exhausted */ if (!event.toString().equals(ClusterStateEvent.disable.toString()) && !event.toString().equals(ClusterStateEvent.enable.toString())) { logger.debug("Unsupport ClusterStateEvent: " + event + ", won't propgate to extensions of host"); return; } HostStateEvent hostEvent = HostStateEvent.valueOf(event.toString()); List<HostVO> vos = findHostUnderClusterByUuid(inventory.getUuid()); if (!vos.isEmpty()) { for (HostVO h : vos) { if (h.getState() == HostState.Maintenance || h.getState() == HostState.PreMaintenance) { continue; } ChangeHostStateMsg msg = new ChangeHostStateMsg(h.getUuid(), hostEvent.toString()); bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, h.getUuid()); ChangeHostStateReply r = (ChangeHostStateReply) bus.call(msg); if (!r.isSuccess()) { logger.warn(String.format("Failed to change host[uuid: %s] state(%s) by event(%s), %s", h.getUuid(), h.getState(), hostEvent, r.getError())); } else { logger.debug(String.format("Successfully changed host[uuid: %s] state(%s) by event(%s), new state is %s", h.getUuid(), h.getState(), hostEvent, r.getInventory().getState())); } } } } @Override public void afterChangeClusterState(ClusterInventory inventory, ClusterStateEvent event, ClusterState previousState) { // TODO Auto-generated method stub } }