private static void writePidFile() throws IOException { if (CoreGlobalProperty.UNIT_TEST_ON) { return; } File pidFile = new File(CoreGlobalProperty.PID_FILE_PATH); if (pidFile.exists()) { String pidStr = FileUtils.readFileToString(pidFile); try { long pid = Long.valueOf(pidStr); String processProcDir = String.format("/proc/%s", pid); File processProcDirFile = new File(processProcDir); if (processProcDirFile.exists()) { throw new CloudRuntimeException(String.format("pid file[%s] exists and the process[pid:%s] that the pid file points to is still running", CoreGlobalProperty.PID_FILE_PATH, pidStr)); } } catch (NumberFormatException e) { logger.warn(String.format("pid file[%s] includes an invalid pid[%s] that is not a long number, ignore it", CoreGlobalProperty.PID_FILE_PATH, pidStr)); } logger.info(String.format("stale pid file[%s], ignore it", CoreGlobalProperty.PID_FILE_PATH)); } pidFile.deleteOnExit(); String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0]; FileUtils.writeStringToFile(pidFile, pid); }
private void handle(APIDetachNetworkServiceProviderFromL2NetworkMsg msg) { NetworkServiceProviderVO vo = dbf.findByUuid(msg.getNetworkServiceProviderUuid(), NetworkServiceProviderVO.class); NetworkServiceProviderFactory factory = getProviderFactory(vo.getType()); NetworkServiceProvider provider = factory.getNetworkServiceProvider(vo); L2NetworkVO l2vo = dbf.findByUuid(msg.getL2NetworkUuid(), L2NetworkVO.class); APIDetachNetworkServiceProviderFromL2NetworkEvent evt = new APIDetachNetworkServiceProviderFromL2NetworkEvent(msg.getId()); try { provider.detachFromL2Network(L2NetworkInventory.valueOf(l2vo), msg); } catch (NetworkException e) { String err = String.format( "unable to detach network service provider[uuid:%s, name:%s, type:%s] to l2network[uuid:%s, name:%s, type:%s], %s", vo.getUuid(), vo.getName(), vo.getType(), l2vo.getUuid(), l2vo.getName(), l2vo.getType(), e.getMessage()); logger.warn(err, e); evt.setErrorCode( errf.instantiateErrorCode( NetworkServiceErrors.DETACH_NETWORK_SERVICE_PROVIDER_ERROR, err)); bus.publish(evt); return; } SimpleQuery<NetworkServiceProviderL2NetworkRefVO> query = dbf.createQuery(NetworkServiceProviderL2NetworkRefVO.class); query.select(NetworkServiceProviderL2NetworkRefVO_.id); query.add(NetworkServiceProviderL2NetworkRefVO_.l2NetworkUuid, Op.EQ, l2vo.getUuid()); query.add( NetworkServiceProviderL2NetworkRefVO_.networkServiceProviderUuid, Op.EQ, vo.getUuid()); Long id = query.findValue(); if (id != null) { dbf.removeByPrimaryKey(id, NetworkServiceProviderL2NetworkRefVO.class); } vo = dbf.findByUuid(vo.getUuid(), NetworkServiceProviderVO.class); evt.setInventory(NetworkServiceProviderInventory.valueOf(vo)); String info = String.format( "successfully detach network service provider[uuid:%s, name:%s, type:%s] to l2network[uuid:%s, name:%s, type:%s]", vo.getUuid(), vo.getName(), vo.getType(), l2vo.getUuid(), l2vo.getName(), l2vo.getType()); logger.debug(info); bus.publish(evt); }
public static String getManagementServerIp() { if (managementServerIp != null) { return managementServerIp; } String ip = System.getProperty("management.server.ip"); if (ip != null) { logger.info(String.format("get management IP[%s] from Java property[management.server.ip]", ip)); return ip; } ip = System.getenv("ZSTACK_MANAGEMENT_SERVER_IP"); if (ip != null) { logger.info(String.format("get management IP[%s] from environment variable[ZSTACK_MANAGEMENT_SERVER_IP]", ip)); return ip; } Linux.ShellResult ret = Linux.shell("/sbin/ip route"); String defaultLine = null; for (String s : ret.getStdout().split("\n")) { if (s.contains("default via")) { defaultLine = s; break; } } String err = "cannot get management server ip of this machine. there are three ways to get the ip.\n1) search for 'management.server.ip' java property\n2) search for 'ZSTACK_MANAGEMENT_SERVER_IP' environment variable\n3) search for default route printed out by '/sbin/ip route'\nhowever, all above methods failed"; if (defaultLine == null) { throw new CloudRuntimeException(err); } try { Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface iface : Collections.list(nets)) { String name = iface.getName(); if (defaultLine.contains(name)) { InetAddress ia = iface.getInetAddresses().nextElement(); ip = ia.getHostAddress(); break; } } } catch (SocketException e) { throw new CloudRuntimeException(e); } if (ip == null) { throw new CloudRuntimeException(err); } logger.info(String.format("get management IP[%s] from default route[/sbin/ip route]", ip)); managementServerIp = ip; return managementServerIp; }
@Transactional public void updatePhysicalCapacityByKvmAgentResponse( String psUuid, String hostUuid, AgentResponse rsp) { LocalStorageHostRefVO ref = dbf.getEntityManager() .find(LocalStorageHostRefVO.class, hostUuid, LockModeType.PESSIMISTIC_WRITE); if (ref == null) { return; } if (ref.getAvailablePhysicalCapacity() == rsp.getAvailableCapacity() && ref.getTotalPhysicalCapacity() == rsp.getTotalCapacity()) { return; } long originalPhysicalTotal = ref.getTotalPhysicalCapacity(); long originalPhysicalAvailable = ref.getAvailablePhysicalCapacity(); ref.setTotalPhysicalCapacity(rsp.getTotalCapacity()); ref.setAvailablePhysicalCapacity(rsp.getAvailableCapacity()); dbf.getEntityManager().merge(ref); if (logger.isTraceEnabled()) { logger.trace( String.format( "[Local Storage Capacity] changed the physical capacity of the host[uuid:%s] of " + "the local primary storage[uuid:%s] as:\n" + "physical total: %s --> %s\n" + "physical available: %s --> %s\n", hostUuid, psUuid, originalPhysicalTotal, ref.getTotalPhysicalCapacity(), originalPhysicalAvailable, ref.getAvailablePhysicalCapacity())); } final long totalChange = rsp.getTotalCapacity() - ref.getTotalPhysicalCapacity(); final long availChange = rsp.getAvailableCapacity() - ref.getAvailablePhysicalCapacity(); new PrimaryStorageCapacityUpdater(psUuid) .run( new PrimaryStorageCapacityUpdaterRunnable() { @Override public PrimaryStorageCapacityVO call(PrimaryStorageCapacityVO cap) { cap.setTotalPhysicalCapacity(cap.getTotalPhysicalCapacity() + totalChange); cap.setAvailablePhysicalCapacity(cap.getAvailablePhysicalCapacity() + availChange); return cap; } }); }
private void handle(APIAttachNetworkServiceProviderToL2NetworkMsg msg) { NetworkServiceProviderVO vo = dbf.findByUuid(msg.getNetworkServiceProviderUuid(), NetworkServiceProviderVO.class); NetworkServiceProviderFactory factory = getProviderFactory(vo.getType()); NetworkServiceProvider provider = factory.getNetworkServiceProvider(vo); L2NetworkVO l2vo = dbf.findByUuid(msg.getL2NetworkUuid(), L2NetworkVO.class); APIAttachNetworkServiceProviderToL2NetworkEvent evt = new APIAttachNetworkServiceProviderToL2NetworkEvent(msg.getId()); try { provider.attachToL2Network(L2NetworkInventory.valueOf(l2vo), msg); } catch (NetworkException e) { String err = String.format( "unable to attach network service provider[uuid:%s, name:%s, type:%s] to l2network[uuid:%s, name:%s, type:%s], %s", vo.getUuid(), vo.getName(), vo.getType(), l2vo.getUuid(), l2vo.getName(), l2vo.getType(), e.getMessage()); logger.warn(err, e); evt.setErrorCode( errf.instantiateErrorCode( NetworkServiceErrors.ATTACH_NETWORK_SERVICE_PROVIDER_ERROR, err)); bus.publish(evt); return; } NetworkServiceProviderL2NetworkRefVO ref = new NetworkServiceProviderL2NetworkRefVO(); ref.setL2NetworkUuid(l2vo.getUuid()); ref.setNetworkServiceProviderUuid(vo.getUuid()); dbf.persist(ref); vo = dbf.findByUuid(vo.getUuid(), NetworkServiceProviderVO.class); evt.setInventory(NetworkServiceProviderInventory.valueOf(vo)); String info = String.format( "successfully attach network service provider[uuid:%s, name:%s, type:%s] to l2network[uuid:%s, name:%s, type:%s]", vo.getUuid(), vo.getName(), vo.getType(), l2vo.getUuid(), l2vo.getName(), l2vo.getType()); logger.debug(info); bus.publish(evt); }
private void handle(APICreateZoneMsg msg) { String zoneType = msg.getType(); if (zoneType == null) { zoneType = BaseZoneFactory.type.toString(); } ZoneFactory factory = this.getZoneFactory(ZoneType.valueOf(zoneType)); APICreateZoneEvent evt = new APICreateZoneEvent(msg.getId()); ZoneVO vo = new ZoneVO(); if (msg.getResourceUuid() != null) { vo.setUuid(msg.getResourceUuid()); } else { vo.setUuid(Platform.getUuid()); } vo.setName(msg.getName()); vo.setDescription(msg.getDescription()); vo = factory.createZone(vo, msg); tagMgr.createTagsFromAPICreateMessage(msg, vo.getUuid(), ZoneVO.class.getSimpleName()); evt.setInventory(ZoneInventory.valueOf(vo)); logger.debug("Created zone: " + vo.getName() + " uuid:" + vo.getUuid()); if (logf.isEnabled()) { logf.info(vo.getUuid(), String.format("Create zone successfully")); } bus.publish(evt); }
private void quit() { try { queue.offer(quitToken, 60, TimeUnit.SECONDS); } catch (InterruptedException e) { logger.warn(e.getMessage(), e); } }
@Override public void contextInitialized(ServletContextEvent event) { try { if (!isInit) { Platform.createComponentLoaderFromWebApplicationContext( WebApplicationContextUtils.getWebApplicationContext(event.getServletContext())); node = Platform.getComponentLoader().getComponent(ManagementNodeManager.class); bus = Platform.getComponentLoader().getComponent(CloudBus.class); node.startNode(); isInit = true; } } catch (Throwable t) { logger.warn("failed to start management server", t); // have to call bus.stop() because its init has been called by spring if (bus != null) { bus.stop(); } Throwable root = ExceptionDSL.getRootThrowable(t); new BootErrorLog().write(root.getMessage()); if (CoreGlobalProperty.EXIT_JVM_ON_BOOT_FAILURE) { System.exit(1); } else { throw new CloudRuntimeException(t); } } }
public static ComponentLoader createComponentLoaderFromWebApplicationContext(WebApplicationContext webAppCtx) { assert loader == null; try { if (webAppCtx != null) { loader = new ComponentLoaderImpl(webAppCtx); } else { loader = new ComponentLoaderImpl(); } } catch (Exception e) { String err = "unable to create ComponentLoader"; logger.warn(e.getMessage(), e); throw new CloudRuntimeException(err); } loader.getPluginRegistry(); GlobalConfigFacade gcf = loader.getComponent(GlobalConfigFacade.class); if (gcf != null) { ((Component)gcf).start(); } bus = loader.getComponentNoExceptionWhenNotExisting(CloudBus.class); if (bus != null) { bus.start(); } return loader; }
protected void exceptionIfImageSizeGreaterThanAvailableCapacity(String url) { if (CoreGlobalProperty.UNIT_TEST_ON) { return; } url = url.trim(); if (!url.startsWith("http") && !url.startsWith("https")) { return; } String len; try { HttpHeaders header = restf.getRESTTemplate().headForHeaders(url); len = header.getFirst("Content-Length"); } catch (Exception e) { logger.warn(String.format("cannot get image. The image url : %s.", url)); return; } if (len == null) { return; } long size = Long.valueOf(len); if (size > self.getAvailableCapacity()) { throw new OperationFailureException( errf.stringToOperationError( String.format( "the backup storage[uuid:%s, name:%s] has not enough capacity to download the image[%s]." + "Required size:%s, available size:%s", self.getUuid(), self.getName(), url, size, self.getAvailableCapacity()))); } }
private void handle(final ExpungeImageMsg msg) { final ExpungeImageReply reply = new ExpungeImageReply(); final ImageBackupStorageRefVO ref = CollectionUtils.find( self.getBackupStorageRefs(), new Function<ImageBackupStorageRefVO, ImageBackupStorageRefVO>() { @Override public ImageBackupStorageRefVO call(ImageBackupStorageRefVO arg) { return arg.getBackupStorageUuid().equals(msg.getBackupStorageUuid()) ? arg : null; } }); if (ref == null) { logger.debug( String.format( "cannot find reference for the image[uuid:%s] on the backup storage[uuid:%s], assume it's been deleted", self.getUuid(), msg.getBackupStorageUuid())); bus.reply(msg, reply); return; } DeleteBitsOnBackupStorageMsg dmsg = new DeleteBitsOnBackupStorageMsg(); dmsg.setBackupStorageUuid(ref.getBackupStorageUuid()); dmsg.setInstallPath(ref.getInstallPath()); bus.makeTargetServiceIdByResourceUuid( dmsg, BackupStorageConstant.SERVICE_ID, dmsg.getBackupStorageUuid()); bus.send( dmsg, new CloudBusCallBack(msg) { @Override public void run(MessageReply r) { if (!r.isSuccess()) { // TODO logger.warn( String.format( "failed to delete image[uuid:%s, name:%s] from backup storage[uuid:%s] because %s, need to garbage collect it", self.getUuid(), self.getName(), r.getError(), ref.getBackupStorageUuid())); reply.setError(r.getError()); } else { returnBackupStorageCapacity(ref.getBackupStorageUuid(), self.getSize()); dbf.remove(ref); logger.debug( String.format( "successfully expunged the image[uuid: %s, name: %s] on the backup storage[uuid: %s]", self.getUuid(), self.getName(), ref.getBackupStorageUuid())); self = dbf.findByUuid(self.getUuid(), ImageVO.class); if (self.getBackupStorageRefs().isEmpty()) { logger.debug( String.format( "the image[uuid:%s, name:%s] has been expunged on all backup storage, remove it from database", self.getUuid(), self.getName())); dbf.remove(self); } } bus.reply(msg, reply); } }); }
private void doScanImages() { try { List<ImageInventory> images = this.scanImages(); } catch (Exception e) { logger.warn( String.format( "Unhandled exception happened while scanning backup storage[uuid:%s]", self.getUuid()), e); } }
@Override public void write(LogVO log) { if (!isStarted) { return; } try { queue.offer(log, 60, TimeUnit.SECONDS); } catch (InterruptedException e) { logger.warn(String.format("unable to write log %s", JSONObjectUtil.toJsonString(log)), e); } }
@Override public void contextDestroyed(ServletContextEvent arg0) { logger.warn("web listener issued context destroy event, start stropping process"); if (isInit) { throwableSafe( new Runnable() { @Override public void run() { node.stop(); } }); } }
@Override public void afterDeleteHost(final HostInventory inventory) { final String priUuid = getLocalStorageInCluster(inventory.getClusterUuid()); if (priUuid != null) { RemoveHostFromLocalStorageMsg msg = new RemoveHostFromLocalStorageMsg(); msg.setPrimaryStorageUuid(priUuid); msg.setHostUuid(inventory.getUuid()); bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, priUuid); MessageReply reply = bus.call(msg); if (!reply.isSuccess()) { // TODO logger.warn( String.format( "failed to remove host[uuid:%s] from local primary storage[uuid:%s], %s", inventory.getUuid(), priUuid, reply.getError())); } else { logger.debug( String.format( "removed host[uuid:%s] from local primary storage[uuid:%s]", inventory.getUuid(), priUuid)); } } }
@Test public void test() throws InterruptedException { for (int i = 0; i < threadNum; i++) { Tester t = new Tester(i); thdf.chainSubmit(t); } latch.await(2, TimeUnit.MINUTES); int si = -1; for (Integer index : res) { logger.debug(String.format("last: %s, next: %s", si, index)); Assert.assertTrue(index > si); si = index; } }
private String steppingAllocate(long s, long e, int total, String rangeUuid) { int step = 254; int failureCount = 0; int failureCheckPoint = 5; while (s < e) { // if failing failureCheckPoint times, the range is probably full, // we check the range. // why don't we check before steppingAllocate()? because in that case we // have to count the used IP every time allocating a IP, and count operation // is a full scan in DB, which is very costly if (failureCheckPoint == failureCount++) { SimpleQuery<UsedIpVO> q = dbf.createQuery(UsedIpVO.class); q.add(UsedIpVO_.ipRangeUuid, Op.EQ, rangeUuid); long count = q.count(); if (count == total) { logger.debug( String.format("ip range[uuid:%s] has no ip available, try next one", rangeUuid)); return null; } else { failureCount = 0; } } long te = s + step; te = te > e ? e : te; SimpleQuery<UsedIpVO> q = dbf.createQuery(UsedIpVO.class); q.select(UsedIpVO_.ipInLong); q.add(UsedIpVO_.ipInLong, Op.GTE, s); q.add(UsedIpVO_.ipInLong, Op.LTE, te); q.add(UsedIpVO_.ipRangeUuid, Op.EQ, rangeUuid); List<Long> used = q.listValue(); if (te - s + 1 == used.size()) { s += step; continue; } Collections.sort(used); return NetworkUtils.randomAllocateIpv4Address(s, te, used); } return null; }
protected void changeStatus(BackupStorageStatus status) { if (status == self.getStatus()) { return; } BackupStorageStatus oldStatus = self.getStatus(); self.setStatus(status); dbf.update(self); BackupStorageStatusChangedData d = new BackupStorageStatusChangedData(); d.setBackupStorageUuid(self.getUuid()); d.setNewStatus(status.toString()); d.setOldStatus(oldStatus.toString()); d.setInventory(BackupStorageInventory.valueOf(self)); evtf.fire(BackupStorageCanonicalEvents.BACKUP_STORAGE_STATUS_CHANGED, d); logger.debug( String.format("change backup storage[uuid:%s] status to %s", self.getUuid(), status)); }
static { try { msId = getUuid(); // TODO: get code version from MANIFEST file codeVersion = "0.1.0"; File globalPropertiesFile = PathUtil.findFileOnClassPath("zstack.properties", true); FileInputStream in = new FileInputStream(globalPropertiesFile); System.getProperties().load(in); linkGlobalProperty(); prepareDefaultDbProperties(); writePidFile(); locale = new Locale(CoreGlobalProperty.LOCALE); } catch (Throwable e) { logger.warn(String.format("unhandled exception when in Platform's static block, %s", e.getMessage()), e); throw new RuntimeException(e); } }
public static void dumpStackTrace(String msg) { String stack = String.format("%s:\n%s", msg, getStackTrace()); logger.debug(stack); }
private void handle(APIRecoverImageMsg msg) { List<String> toRecoverBsUuids; if (msg.getBackupStorageUuids() == null || msg.getBackupStorageUuids().isEmpty()) { toRecoverBsUuids = CollectionUtils.transformToList( self.getBackupStorageRefs(), new Function<String, ImageBackupStorageRefVO>() { @Override public String call(ImageBackupStorageRefVO arg) { return arg.getStatus() == ImageStatus.Deleted ? arg.getBackupStorageUuid() : null; } }); if (toRecoverBsUuids.isEmpty()) { throw new OperationFailureException( errf.stringToOperationError( String.format( "the image[uuid:%s, name:%s] is not deleted on any backup storage", self.getUuid(), self.getName()))); } } else { toRecoverBsUuids = new ArrayList<String>(); for (final String bsUuid : msg.getBackupStorageUuids()) { ImageBackupStorageRefVO ref = CollectionUtils.find( self.getBackupStorageRefs(), new Function<ImageBackupStorageRefVO, ImageBackupStorageRefVO>() { @Override public ImageBackupStorageRefVO call(ImageBackupStorageRefVO arg) { return bsUuid.equals(arg.getBackupStorageUuid()) ? arg : null; } }); if (ref == null) { throw new OperationFailureException( errf.stringToInvalidArgumentError( String.format( "the image[uuid:%s, name:%s] is not on the backup storage[uuid:%s]", self.getUuid(), self.getName(), bsUuid))); } if (ref.getStatus() != ImageStatus.Deleted) { throw new OperationFailureException( errf.stringToInvalidArgumentError( String.format( "the image[uuid:%s, name:%s]'s status[%s] is not Deleted on the backup storage[uuid:%s]", self.getUuid(), self.getName(), ref.getStatus(), bsUuid))); } toRecoverBsUuids.add(bsUuid); } } for (ImageBackupStorageRefVO ref : self.getBackupStorageRefs()) { if (toRecoverBsUuids.contains(ref.getBackupStorageUuid())) { ref.setStatus(ImageStatus.Ready); dbf.update(ref); } } self.setStatus(ImageStatus.Ready); self = dbf.updateAndRefresh(self); logger.debug( String.format( "successfully recovered the image[uuid:%s, name:%s] on the backup storage%s", self.getUuid(), self.getName(), toRecoverBsUuids)); APIRecoverImageEvent evt = new APIRecoverImageEvent(msg.getId()); evt.setInventory(getSelfInventory()); bus.publish(evt); }
private static void prepareDefaultDbProperties() { if (DatabaseGlobalProperty.DbUrl != null) { String dbUrl = DatabaseGlobalProperty.DbUrl; if (dbUrl.endsWith("/")) { dbUrl = dbUrl.substring(0, dbUrl.length()-1); } if (getGlobalProperty("DbFacadeDataSource.jdbcUrl") == null) { String url = String.format("%s/zstack", dbUrl); System.setProperty("DbFacadeDataSource.jdbcUrl", url); logger.debug(String.format("default DbFacadeDataSource.jdbcUrl to DB.url [%s]", url)); } if (getGlobalProperty("RESTApiDataSource.jdbcUrl") == null) { String url = String.format("%s/zstack_rest", dbUrl); System.setProperty("RESTApiDataSource.jdbcUrl", url); logger.debug(String.format("default RESTApiDataSource.jdbcUrl to DB.url [%s]", url)); } } if (DatabaseGlobalProperty.DbUser != null) { if (getGlobalProperty("DbFacadeDataSource.user") == null) { System.setProperty("DbFacadeDataSource.user", DatabaseGlobalProperty.DbUser); logger.debug(String.format("default RESTApiDataSource.user to DB.user [%s]", DatabaseGlobalProperty.DbUser)); } if (getGlobalProperty("RESTApiDataSource.user") == null) { System.setProperty("RESTApiDataSource.user", DatabaseGlobalProperty.DbUser); logger.debug(String.format("default RESTApiDataSource.user to DB.user [%s]", DatabaseGlobalProperty.DbUser)); } } if (DatabaseGlobalProperty.DbPassword != null) { if (getGlobalProperty("DbFacadeDataSource.password") == null) { System.setProperty("DbFacadeDataSource.password", DatabaseGlobalProperty.DbPassword); logger.debug(String.format("default DbFacadeDataSource.password to DB.password [%s]", DatabaseGlobalProperty.DbPassword)); } if (getGlobalProperty("RESTApiDataSource.password") == null) { System.setProperty("RESTApiDataSource.password", DatabaseGlobalProperty.DbPassword); logger.debug(String.format("default RESTApiDataSource.password to DB.password [%s]", DatabaseGlobalProperty.DbPassword)); } } if (DatabaseGlobalProperty.DbMaxIdleTime != null) { if (getGlobalProperty("DbFacadeDataSource.maxIdleTime") == null) { System.setProperty("DbFacadeDataSource.maxIdleTime", DatabaseGlobalProperty.DbMaxIdleTime); logger.debug(String.format("default DbFacadeDataSource.maxIdleTime to DB.maxIdleTime [%s]", DatabaseGlobalProperty.DbMaxIdleTime)); } if (getGlobalProperty("ExtraDataSource.maxIdleTime") == null) { System.setProperty("ExtraDataSource.maxIdleTime", DatabaseGlobalProperty.DbMaxIdleTime); logger.debug(String.format("default ExtraDataSource.maxIdleTime to DB.maxIdleTime [%s]", DatabaseGlobalProperty.DbMaxIdleTime)); } if (getGlobalProperty("RESTApiDataSource.maxIdleTime") == null) { System.setProperty("RESTApiDataSource.maxIdleTime", DatabaseGlobalProperty.DbMaxIdleTime); logger.debug(String.format("default RESTApiDataSource.maxIdleTime to DB.maxIdleTime [%s]", DatabaseGlobalProperty.DbMaxIdleTime)); } } if (DatabaseGlobalProperty.DbIdleConnectionTestPeriod != null) { if (getGlobalProperty("DbFacadeDataSource.idleConnectionTestPeriod") == null) { System.setProperty("DbFacadeDataSource.idleConnectionTestPeriod", DatabaseGlobalProperty.DbIdleConnectionTestPeriod); logger.debug(String.format("default DbFacadeDataSource.idleConnectionTestPeriod to DB.idleConnectionTestPeriod [%s]", DatabaseGlobalProperty.DbIdleConnectionTestPeriod)); } if (getGlobalProperty("ExtraDataSource.idleConnectionTestPeriod") == null) { System.setProperty("ExtraDataSource.idleConnectionTestPeriod", DatabaseGlobalProperty.DbIdleConnectionTestPeriod); logger.debug(String.format("default ExtraDataSource.idleConnectionTestPeriod to DB.idleConnectionTestPeriod [%s]", DatabaseGlobalProperty.DbIdleConnectionTestPeriod)); } if (getGlobalProperty("RESTApiDataSource.idleConnectionTestPeriod") == null) { System.setProperty("RESTApiDataSource.idleConnectionTestPeriod", DatabaseGlobalProperty.DbIdleConnectionTestPeriod); logger.debug(String.format("default RESTApiDataSource.idleConnectionTestPeriod to DB.idleConnectionTestPeriod [%s]", DatabaseGlobalProperty.DbIdleConnectionTestPeriod)); } } }
private static void linkGlobalProperty(Class clz, Map<String, String> propertiesMap) { for (Field f : clz.getDeclaredFields()) { GlobalProperty at = f.getAnnotation(GlobalProperty.class); if (at == null) { continue; } if (!Modifier.isStatic(f.getModifiers())) { throw new CloudRuntimeException(String.format("%s.%s is annotated by @GlobalProperty but it's not defined with static modifier", clz.getName(), f.getName())); } Object valueToSet = null; String name = at.name(); if (Map.class.isAssignableFrom(f.getType())) { Map ret = linkGlobalPropertyMap(name); if (ret.isEmpty() && at.required()) { throw new IllegalArgumentException(String.format("A required global property[%s] missing in zstack.properties", name)); } valueToSet = ret; } else if (List.class.isAssignableFrom(f.getType())) { List ret = linkGlobalPropertyList(name); if (ret.isEmpty() && at.required()) { throw new IllegalArgumentException(String.format("A required global property[%s] missing in zstack.properties", name)); } valueToSet = ret; } else { String value = getGlobalProperty(name); if (value == null && at.defaultValue().equals(GlobalProperty.DEFAULT_NULL_STRING) && at.required()) { throw new IllegalArgumentException(String.format("A required global property[%s] missing in zstack.properties", name)); } if (value == null) { value = at.defaultValue(); } if (GlobalProperty.DEFAULT_NULL_STRING.equals(value)) { value = null; } if (value != null) { value = StringTemplate.subsititute(value, propertiesMap); } if (Integer.class.isAssignableFrom(f.getType()) || Integer.TYPE.isAssignableFrom(f.getType())) { valueToSet = TypeUtils.stringToValue(value, Integer.class, 0); } else if (Long.class.isAssignableFrom(f.getType()) || Long.TYPE.isAssignableFrom(f.getType())) { valueToSet = TypeUtils.stringToValue(value, Long.class, 0L); } else if (Float.class.isAssignableFrom(f.getType()) || Float.TYPE.isAssignableFrom(f.getType())) { valueToSet = TypeUtils.stringToValue(value, Float.class, 0F); } else if (Double.class.isAssignableFrom(f.getType()) || Double.TYPE.isAssignableFrom(f.getType())) { valueToSet = TypeUtils.stringToValue(value, Double.class, 0D); } else if (String.class.isAssignableFrom(f.getType())) { valueToSet = value; } else if (Boolean.class.isAssignableFrom(f.getType()) || Boolean.TYPE.isAssignableFrom(f.getType())) { valueToSet = TypeUtils.stringToValue(value, Boolean.class); } else { throw new CloudRuntimeException(String.format("%s.%s of type[%s] is unsupported by global property. try use Platform.getGlobalProperty() and parse by yourself", clz.getName(), f.getName(), f.getType().getName())); } } f.setAccessible(true); try { f.set(null, valueToSet); globalProperties.put(name, valueToSet == null ? "null" : valueToSet.toString()); logger.debug(String.format("linked global property[%s.%s], value: %s", clz.getName(), f.getName(), valueToSet)); } catch (IllegalAccessException e) { throw new CloudRuntimeException(String.format("unable to link global property[%s.%s]", clz.getName(), f.getName()), e); } } }
@Override public void beforeDeleteHost(final HostInventory inventory) { SimpleQuery<LocalStorageHostRefVO> q = dbf.createQuery(LocalStorageHostRefVO.class); q.select(LocalStorageHostRefVO_.primaryStorageUuid); q.add(LocalStorageHostRefVO_.hostUuid, Op.EQ, inventory.getUuid()); final String psUuid = q.findValue(); if (psUuid == null) { return; } logger.debug( String.format( "the host[uuid:%s] belongs to the local storage[uuid:%s], starts to delete vms and" + " volumes on the host", inventory.getUuid(), psUuid)); final List<String> vmUuids = new Callable<List<String>>() { @Override @Transactional(readOnly = true) public List<String> call() { String sql = "select vm.uuid from VolumeVO vol, LocalStorageResourceRefVO ref, VmInstanceVO vm where ref.primaryStorageUuid = :psUuid" + " and vol.type = :vtype and ref.resourceUuid = vol.uuid and ref.resourceType = :rtype and ref.hostUuid = :huuid" + " and vm.uuid = vol.vmInstanceUuid"; TypedQuery<String> q = dbf.getEntityManager().createQuery(sql, String.class); q.setParameter("vtype", VolumeType.Root); q.setParameter("rtype", VolumeVO.class.getSimpleName()); q.setParameter("huuid", inventory.getUuid()); q.setParameter("psUuid", psUuid); return q.getResultList(); } }.call(); // destroy vms if (!vmUuids.isEmpty()) { List<DestroyVmInstanceMsg> msgs = CollectionUtils.transformToList( vmUuids, new Function<DestroyVmInstanceMsg, String>() { @Override public DestroyVmInstanceMsg call(String uuid) { DestroyVmInstanceMsg msg = new DestroyVmInstanceMsg(); msg.setVmInstanceUuid(uuid); bus.makeTargetServiceIdByResourceUuid(msg, VmInstanceConstant.SERVICE_ID, uuid); return msg; } }); final FutureCompletion completion = new FutureCompletion(); bus.send( msgs, new CloudBusListCallBack(completion) { @Override public void run(List<MessageReply> replies) { for (MessageReply r : replies) { if (!r.isSuccess()) { String vmUuid = vmUuids.get(replies.indexOf(r)); // TODO logger.warn( String.format("failed to destroy the vm[uuid:%s], %s", vmUuid, r.getError())); } } completion.success(); } }); completion.await(TimeUnit.MINUTES.toMillis(15)); } final List<String> volUuids = new Callable<List<String>>() { @Override @Transactional(readOnly = true) public List<String> call() { String sql = "select vol.uuid from VolumeVO vol, LocalStorageResourceRefVO ref where ref.primaryStorageUuid = :psUuid" + " and vol.type = :vtype and ref.resourceUuid = vol.uuid and ref.resourceType = :rtype and ref.hostUuid = :huuid"; TypedQuery<String> q = dbf.getEntityManager().createQuery(sql, String.class); q.setParameter("psUuid", psUuid); q.setParameter("vtype", VolumeType.Data); q.setParameter("rtype", VolumeVO.class.getSimpleName()); q.setParameter("huuid", inventory.getUuid()); return q.getResultList(); } }.call(); // delete data volumes if (!volUuids.isEmpty()) { List<DeleteVolumeMsg> msgs = CollectionUtils.transformToList( volUuids, new Function<DeleteVolumeMsg, String>() { @Override public DeleteVolumeMsg call(String uuid) { DeleteVolumeMsg msg = new DeleteVolumeMsg(); msg.setUuid(uuid); msg.setDetachBeforeDeleting(true); bus.makeTargetServiceIdByResourceUuid(msg, VolumeConstant.SERVICE_ID, uuid); return msg; } }); final FutureCompletion completion = new FutureCompletion(); bus.send( msgs, new CloudBusListCallBack(completion) { @Override public void run(List<MessageReply> replies) { for (MessageReply r : replies) { if (!r.isSuccess()) { String uuid = volUuids.get(replies.indexOf(r)); // TODO logger.warn( String.format( "failed to delete the data volume[uuid:%s], %s", uuid, r.getError())); } } completion.success(); } }); completion.await(TimeUnit.MINUTES.toMillis(15)); } }
public static void dumpStackTrace() { logger.debug(getStackTrace()); }
private void handle(DiskOfferingDeletionMsg msg) { DiskOfferingDeletionReply reply = new DiskOfferingDeletionReply(); dbf.remove(self); logger.debug(String.format("deleted disk offering [uuid:%s]", self.getUuid())); bus.reply(msg, reply); }