package org.zstack.compute.cluster; 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.message.MessageReply; import org.zstack.header.zone.*; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import java.util.ArrayList; import java.util.List; class ClusterExtensionToZone implements ZoneChangeStateExtensionPoint { private static final CLogger logger = Utils.getLogger(ClusterExtensionToZone.class); @Autowired private DatabaseFacade dbf; @Autowired private CloudBus bus; @Autowired private ClusterExtensionPointEmitter extpEmitter; private List<ClusterVO> findClusterUnderZone(String uuid) { SimpleQuery<ClusterVO> q = dbf.createQuery(ClusterVO.class); q.add(ClusterVO_.zoneUuid, Op.EQ, uuid); return q.list(); } @Override public void preChangeZoneState(ZoneInventory inventory, ZoneStateEvent event, ZoneState nextState) throws ZoneException { if (!event.toString().equals(ClusterStateEvent.disable.toString()) && !event.toString().equals(ClusterStateEvent.enable.toString())) { logger.debug("Unsupported ZoneStateEvent: " + event + ", won't propgate to extensions of cluster"); return; } ClusterStateEvent clusterEvent = ClusterStateEvent.valueOf(event.toString()); List<ClusterVO> vos = findClusterUnderZone(inventory.getUuid()); try { extpEmitter.preChange(vos, clusterEvent); } catch (ClusterException e) { throw new ZoneException(e.getMessage(), e); } } @Override public void beforeChangeZoneState(ZoneInventory inventory, ZoneStateEvent event, ZoneState nextState) { if (!event.toString().equals(ClusterStateEvent.disable.toString()) && !event.toString().equals(ClusterStateEvent.enable.toString())) { logger.debug("Unsupport ZoneStateEvent: " + event + ", won't propgate to extensions of cluster"); return; } List<ClusterVO> vos = findClusterUnderZone(inventory.getUuid()); if (!vos.isEmpty()) { ClusterStateEvent clusterEvent = ClusterStateEvent.valueOf(event.toString()); List<ChangeClusterStateMsg> msgs = new ArrayList<ChangeClusterStateMsg>(vos.size()); for (ClusterVO vo : vos) { ChangeClusterStateMsg msg = new ChangeClusterStateMsg(); msg.setUuid(vo.getUuid()); bus.makeTargetServiceIdByResourceUuid(msg, ClusterConstant.SERVICE_ID, vo.getUuid()); msg.setStateEvent(clusterEvent.toString()); msgs.add(msg); } /* * TODO: Changing 10 clusters each time, thinking about 10000 * clusters, changing them at once will exhaust thread pool and * mysql connections */ logger.debug("Changing state of clusters in zone: " + inventory.getName() + " uuid: " + inventory.getUuid() + " by event: " + clusterEvent); List<MessageReply> replies = bus.call(msgs); for (MessageReply r : replies) { if (!r.isSuccess()) { ChangeClusterStateReply cr = (ChangeClusterStateReply) r; logger.warn("Changing state of cluster: " + cr.getInventory().getName() + " uuid: " + cr.getInventory().getUuid() + " failed, " + r.getError()); } } } } @Override public void afterChangeZoneState(ZoneInventory inventory, ZoneStateEvent event, ZoneState previousState) { // TODO Auto-generated method stub } }