@Override public void run(FlowTrigger trigger, Map data) { reportCapacity(context.getInventory(), new Completion(trigger) { @Override public void success() { trigger.next(); } @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); } }); } };
private void continueConnect(final boolean newAdded, final Completion completion) { ErrorCode errCode = connectToAgent(); if (errCode != null) { throw new OperationFailureException(errCode); } FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); chain.setName(String.format("continue-connecting-kvm-host-%s-%s", self.getManagementIp(), self.getUuid())); for (KVMHostConnectExtensionPoint extp : factory.getConnectExtensions()) { KVMHostConnectedContext ctx = new KVMHostConnectedContext(); ctx.setInventory((KVMHostInventory) getSelfInventory()); ctx.setNewAddedHost(newAdded); chain.then(extp.createKvmHostConnectingFlow(ctx)); } chain.done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { if (noStorageAccessible()){ completion.fail(operr("host can not access any primary storage, please check network")); } else { completion.success(); } } }).error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { completion.fail(err(HostErrors.CONNECTION_ERROR, errCode, "connection error for KVM host[uuid:%s, ip:%s]", self.getUuid(), self.getManagementIp())); } }).start(); }
@Override public void run(final FlowTrigger trigger, Map data) { syncVm(context.getInventory(), new Completion(trigger) { String __name__ = "sync-vm-state"; @Override public void success() { trigger.next(); } @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); } }); } };
@Override public void run(final FlowTrigger trigger, Map data) { final List<String> priUuids = findLocalStorageUuidByHostUuid(context.getInventory().getClusterUuid()); if (priUuids == null || priUuids.isEmpty()) { trigger.next(); return; } Iterator<String> iterator = priUuids.iterator(); initLocalStorage(iterator, trigger, data, context); } };
@Override public void run(final FlowTrigger trigger, Map data) { List<L2NetworkInventory> l2s = getL2Networks(context.getInventory().getClusterUuid()); if (l2s.isEmpty()) { trigger.next(); return; } prepareNetwork(l2s.iterator(), context.getInventory().getUuid(), new Completion(trigger) { @Override public void success() { trigger.next(); } @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); } }); } };
@Override public void run(final FlowTrigger trigger, Map data) { List<L2NetworkInventory> l2s = getL2Networks(context.getInventory().getClusterUuid()); if (l2s.isEmpty()) { trigger.next(); return; } prepareNetwork(l2s.iterator(), context.getInventory().getUuid(), new Completion(trigger) { @Override public void success() { trigger.next(); } @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); } }); } };
@Transactional(readOnly = true) private List<String> getVmsNeedUserdataOnHost() { String sql = "select vm.uuid from VmInstanceVO vm where vm.hostUuid = :huuid and vm.state = :state"; TypedQuery<String> q = dbf.getEntityManager().createQuery(sql, String.class); q.setParameter("state", VmInstanceState.Running); q.setParameter("huuid", context.getInventory().getUuid()); List<String> vmUuids = q.getResultList(); if (vmUuids.isEmpty()) { return null; } vmUuids = new NetworkServiceFilter().filterVmByServiceTypeAndProviderType(vmUuids, UserdataConstant.USERDATA_TYPE_STRING, FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); if (vmUuids.isEmpty()) { return null; } return vmUuids; }
@Transactional(readOnly = true) private List<EipTO> getEipsOnTheHost() { List<VmNicVO> vmNics = new VmNicFinder().findVmNicsByHostUuid(context.getInventory().getUuid()); if (vmNics == null) { return null; } return getEipsByNics(vmNics); }
private void checkQemuImgVersionInOtherClusters(KVMHostConnectedContext context, List<PrimaryStorageInventory> invs) { String mine = KVMSystemTags.QEMU_IMG_VERSION.getTokenByResourceUuid(context.getInventory().getUuid(), KVMSystemTags.QEMU_IMG_VERSION_TOKEN); + "version[%s]. qemu-img version greater than %s is incompatible with versions less than %s, this will causes volume snapshot operation " + "to fail. Please avoid attaching a primary storage to clusters that have different Linux distributions, in order to prevent qemu-img version mismatch", context.getInventory().getUuid(), context.getInventory().getName(), mine, e.getKey(), version, QCOW3_QEMU_IMG_VERSION, QCOW3_QEMU_IMG_VERSION ); throw new OperationFailureException(err);
@Override public void run(final FlowTrigger trigger, Map data) { List<EipTO> tos = getEipsOnTheHost(); if (tos == null) { trigger.next(); return; } batchApplyEips(tos, context.getInventory().getUuid(), true, new Completion(trigger) { @Override public void success() { trigger.next(); } @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); } }); } };
@Override public void run(MessageReply reply) { if (!reply.isSuccess()) { trigger.fail(operr("KVM host[uuid: %s] fails to be added into local primary storage[uuid: %s], %s", context.getInventory().getUuid(), priUuid, reply.getError())); } else { initLocalStorage(iterator, trigger, data, context); } } });
@Override public void run(FlowTrigger trigger, Map data) { RefreshSecurityGroupRulesOnHostMsg msg = new RefreshSecurityGroupRulesOnHostMsg(); msg.setHostUuid(context.getInventory().getUuid()); bus.makeLocalServiceId(msg, SecurityGroupConstant.SERVICE_ID); bus.send(msg); trigger.next(); } };
private void initLocalStorage(final Iterator<String> iterator, final FlowTrigger trigger, Map data, final KVMHostConnectedContext context) { if (!iterator.hasNext()) { trigger.next(); return; } final String priUuid = iterator.next(); InitPrimaryStorageOnHostConnectedMsg msg = new InitPrimaryStorageOnHostConnectedMsg(); msg.setPrimaryStorageUuid(priUuid); msg.setHostUuid(context.getInventory().getUuid()); bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, priUuid); bus.send(msg, new CloudBusCallBack(trigger) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { trigger.fail(operr("KVM host[uuid: %s] fails to be added into local primary storage[uuid: %s], %s", context.getInventory().getUuid(), priUuid, reply.getError())); } else { initLocalStorage(iterator, trigger, data, context); } } }); }
@Override public void run(final FlowTrigger trigger, Map data) { PrimaryStorageInventory ps = findSMPByHostUuid(context.getInventory().getClusterUuid()); if (ps == null) { trigger.next(); return; } InitKvmHostMsg msg = new InitKvmHostMsg(); msg.setHypervisorType(context.getInventory().getHypervisorType()); msg.setHostUuid(context.getInventory().getUuid()); msg.setPrimaryStorageUuid(ps.getUuid()); bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, ps.getUuid()); bus.send(msg, new CloudBusCallBack(trigger) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { trigger.fail(reply.getError()); return; } SMPRecalculatePrimaryStorageCapacityMsg msg = new SMPRecalculatePrimaryStorageCapacityMsg(); msg.setPrimaryStorageUuid(ps.getUuid()); msg.setRelease(false); bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, ps.getUuid()); bus.send(msg); trigger.next(); } }); } };
String sql = "select vm.uuid, vm.defaultL3NetworkUuid from VmInstanceVO vm where vm.hostUuid = :huuid and vm.state in (:states) and vm.type = :vtype"; TypedQuery<Tuple> q = dbf.getEntityManager().createQuery(sql, Tuple.class); q.setParameter("huuid", context.getInventory().getUuid()); q.setParameter("states", list(VmInstanceState.Running, VmInstanceState.Unknown)); q.setParameter("vtype", VmInstanceConstant.USER_VM_TYPE);
@Override public void run(final FlowTrigger trigger, Map data) { List<UserdataTO> tos = getUserData(); if (tos == null) { trigger.next(); return; } BatchApplyUserdataCmd cmd = new BatchApplyUserdataCmd(); cmd.userdata = tos; cmd.rebuild = true; new KvmCommandSender(context.getInventory().getUuid(), true).send(cmd, BATCH_APPLY_USER_DATA, new KvmCommandFailureChecker() { @Override public ErrorCode getError(KvmResponseWrapper wrapper) { AgentResponse rsp = wrapper.getResponse(AgentResponse.class); return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); } }, new ReturnValueCompletion<KvmResponseWrapper>(trigger) { @Override public void success(KvmResponseWrapper returnValue) { trigger.next(); } @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); } }); } };