// Copyright 2012 Citrix Systems, Inc. Licensed under the // Apache License, Version 2.0 (the "License"); you may not use this // file except in compliance with the License. Citrix Systems, Inc. // reserves all rights not expressly granted by the License. // You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.test; import java.io.File; import java.io.IOException; import java.math.BigInteger; import java.net.URISyntaxException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.UUID; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.cloud.host.Status; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDaoImpl; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.dao.DiskOfferingDaoImpl; import com.cloud.utils.PropertiesUtil; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; import com.cloud.utils.net.NfsUtils; public class DatabaseConfig { private static final Logger s_logger = Logger.getLogger(DatabaseConfig.class.getName()); private String _configFileName = null; private String _currentObjectName = null; private String _currentFieldName = null; private Map<String, String> _currentObjectParams = null; private static Map<String, String> s_configurationDescriptions = new HashMap<String, String>(); private static Map<String, String> s_configurationComponents = new HashMap<String, String>(); private static Map<String, String> s_defaultConfigurationValues = new HashMap<String, String>(); // Change to HashSet private static HashSet<String> objectNames = new HashSet<String>(); private static HashSet<String> fieldNames = new HashSet<String>(); // Maintain an IPRangeConfig object to handle IP related logic private final IPRangeConfig iprc = ComponentLocator.inject(IPRangeConfig.class); // Maintain a PodZoneConfig object to handle Pod/Zone related logic private final PodZoneConfig pzc = ComponentLocator.inject(PodZoneConfig.class); // Global variables to store network.throttling.rate and multicast.throttling.rate from the configuration table // Will be changed from null to a non-null value if the value existed in the configuration table private String _networkThrottlingRate = null; private String _multicastThrottlingRate = null; static { // initialize the objectNames ArrayList objectNames.add("zone"); objectNames.add("physicalNetwork"); objectNames.add("vlan"); objectNames.add("pod"); objectNames.add("cluster"); objectNames.add("storagePool"); objectNames.add("secondaryStorage"); objectNames.add("serviceOffering"); objectNames.add("diskOffering"); objectNames.add("user"); objectNames.add("pricing"); objectNames.add("configuration"); objectNames.add("privateIpAddresses"); objectNames.add("publicIpAddresses"); objectNames.add("physicalNetworkServiceProvider"); objectNames.add("virtualRouterProvider"); // initialize the fieldNames ArrayList fieldNames.add("id"); fieldNames.add("name"); fieldNames.add("dns1"); fieldNames.add("dns2"); fieldNames.add("internalDns1"); fieldNames.add("internalDns2"); fieldNames.add("guestNetworkCidr"); fieldNames.add("gateway"); fieldNames.add("netmask"); fieldNames.add("vncConsoleIp"); fieldNames.add("zoneId"); fieldNames.add("vlanId"); fieldNames.add("cpu"); fieldNames.add("ramSize"); fieldNames.add("speed"); fieldNames.add("useLocalStorage"); fieldNames.add("hypervisorType"); fieldNames.add("diskSpace"); fieldNames.add("nwRate"); fieldNames.add("mcRate"); fieldNames.add("price"); fieldNames.add("username"); fieldNames.add("password"); fieldNames.add("firstname"); fieldNames.add("lastname"); fieldNames.add("email"); fieldNames.add("priceUnit"); fieldNames.add("type"); fieldNames.add("value"); fieldNames.add("podId"); fieldNames.add("podName"); fieldNames.add("ipAddressRange"); fieldNames.add("vlanType"); fieldNames.add("vlanName"); fieldNames.add("cidr"); fieldNames.add("vnet"); fieldNames.add("mirrored"); fieldNames.add("enableHA"); fieldNames.add("displayText"); fieldNames.add("domainId"); fieldNames.add("hostAddress"); fieldNames.add("hostPath"); fieldNames.add("guestIpType"); fieldNames.add("url"); fieldNames.add("storageType"); fieldNames.add("category"); fieldNames.add("tags"); fieldNames.add("networktype"); fieldNames.add("clusterId"); fieldNames.add("physicalNetworkId"); fieldNames.add("destPhysicalNetworkId"); fieldNames.add("providerName"); fieldNames.add("vpn"); fieldNames.add("dhcp"); fieldNames.add("dns"); fieldNames.add("firewall"); fieldNames.add("sourceNat"); fieldNames.add("loadBalance"); fieldNames.add("staticNat"); fieldNames.add("portForwarding"); fieldNames.add("userData"); fieldNames.add("securityGroup"); fieldNames.add("nspId"); s_configurationDescriptions.put("host.stats.interval", "the interval in milliseconds when host stats are retrieved from agents"); s_configurationDescriptions.put("storage.stats.interval", "the interval in milliseconds when storage stats (per host) are retrieved from agents"); s_configurationDescriptions.put("volume.stats.interval", "the interval in milliseconds when volume stats are retrieved from agents"); s_configurationDescriptions.put("host", "host address to listen on for agent connection"); s_configurationDescriptions.put("port", "port to listen on for agent connection"); s_configurationDescriptions.put("guest.domain.suffix", "domain suffix for users"); s_configurationDescriptions.put("instance.name", "Name of the deployment instance"); s_configurationDescriptions.put("storage.overprovisioning.factor", "Storage Allocator overprovisioning factor"); s_configurationDescriptions.put("retries.per.host", "The number of times each command sent to a host should be retried in case of failure."); s_configurationDescriptions.put("integration.api.port", "internal port used by the management server for servicing Integration API requests"); s_configurationDescriptions.put("usage.stats.job.exec.time", "the time at which the usage statistics aggregation job will run as an HH24:MM time, e.g. 00:30 to run at 12:30am"); s_configurationDescriptions.put("usage.stats.job.aggregation.range", "the range of time for aggregating the user statistics specified in minutes (e.g. 1440 for daily, 60 for hourly)"); s_configurationDescriptions.put("consoleproxy.domP.enable", "Obsolete"); s_configurationDescriptions.put("consoleproxy.port", "Obsolete"); s_configurationDescriptions.put("consoleproxy.url.port", "Console proxy port for AJAX viewer"); s_configurationDescriptions.put("consoleproxy.ram.size", "RAM size (in MB) used to create new console proxy VMs"); s_configurationDescriptions.put("consoleproxy.cmd.port", "Console proxy command port that is used to communicate with management server"); s_configurationDescriptions.put("consoleproxy.loadscan.interval", "The time interval(in milliseconds) to scan console proxy working-load info"); s_configurationDescriptions.put("consoleproxy.capacityscan.interval", "The time interval(in millisecond) to scan whether or not system needs more console proxy to ensure minimal standby capacity"); s_configurationDescriptions.put("consoleproxy.capacity.standby", "The minimal number of console proxy viewer sessions that system is able to serve immediately(standby capacity)"); s_configurationDescriptions.put("alert.email.addresses", "comma seperated list of email addresses used for sending alerts"); s_configurationDescriptions.put("alert.smtp.host", "SMTP hostname used for sending out email alerts"); s_configurationDescriptions.put("alert.smtp.port", "port the SMTP server is listening on (default is 25)"); s_configurationDescriptions.put("alert.smtp.useAuth", "If true, use SMTP authentication when sending emails. If false, do not use SMTP authentication when sending emails."); s_configurationDescriptions.put("alert.smtp.username", "username for SMTP authentication (applies only if alert.smtp.useAuth is true)"); s_configurationDescriptions.put("alert.smtp.password", "password for SMTP authentication (applies only if alert.smtp.useAuth is true)"); s_configurationDescriptions.put("alert.email.sender", "sender of alert email (will be in the From header of the email)"); s_configurationDescriptions.put("memory.capacity.threshold", "percentage (as a value between 0 and 1) of memory utilization above which alerts will be sent about low memory available"); s_configurationDescriptions.put("cpu.capacity.threshold", "percentage (as a value between 0 and 1) of cpu utilization above which alerts will be sent about low cpu available"); s_configurationDescriptions.put("storage.capacity.threshold", "percentage (as a value between 0 and 1) of storage utilization above which alerts will be sent about low storage available"); s_configurationDescriptions.put("public.ip.capacity.threshold", "percentage (as a value between 0 and 1) of public IP address space utilization above which alerts will be sent"); s_configurationDescriptions.put("private.ip.capacity.threshold", "percentage (as a value between 0 and 1) of private IP address space utilization above which alerts will be sent"); s_configurationDescriptions.put("expunge.interval", "the interval to wait before running the expunge thread"); s_configurationDescriptions.put("network.throttling.rate", "default data transfer rate in megabits per second allowed per user"); s_configurationDescriptions.put("multicast.throttling.rate", "default multicast rate in megabits per second allowed"); s_configurationDescriptions.put("use.local.storage", "Indicates whether to use local storage pools or shared storage pools for user VMs"); s_configurationDescriptions.put("use.local.storage", "Indicates whether to use local storage pools or shared storage pools for system VMs."); s_configurationDescriptions.put("snapshot.poll.interval", "The time interval in seconds when the management server polls for snapshots to be scheduled."); s_configurationDescriptions.put("snapshot.max.hourly", "Maximum hourly snapshots for a volume"); s_configurationDescriptions.put("snapshot.max.daily", "Maximum daily snapshots for a volume"); s_configurationDescriptions.put("snapshot.max.weekly", "Maximum weekly snapshots for a volume"); s_configurationDescriptions.put("snapshot.max.monthly", "Maximum monthly snapshots for a volume"); s_configurationDescriptions.put("snapshot.delta.max", "max delta snapshots between two full snapshots."); s_configurationDescriptions.put("snapshot.recurring.test", "Flag for testing recurring snapshots"); s_configurationDescriptions.put("snapshot.test.minutes.per.hour", "Set it to a smaller value to take more recurring snapshots"); s_configurationDescriptions.put("snapshot.test.hours.per.day", "Set it to a smaller value to take more recurring snapshots"); s_configurationDescriptions.put("snapshot.test.days.per.week", "Set it to a smaller value to take more recurring snapshots"); s_configurationDescriptions.put("snapshot.test.days.per.month", "Set it to a smaller value to take more recurring snapshots"); s_configurationDescriptions.put("snapshot.test.weeks.per.month", "Set it to a smaller value to take more recurring snapshots"); s_configurationDescriptions.put("snapshot.test.months.per.year", "Set it to a smaller value to take more recurring snapshots"); s_configurationDescriptions.put("hypervisor.type", "The type of hypervisor that this deployment will use."); s_configurationComponents.put("host.stats.interval", "management-server"); s_configurationComponents.put("storage.stats.interval", "management-server"); s_configurationComponents.put("volume.stats.interval", "management-server"); s_configurationComponents.put("integration.api.port", "management-server"); s_configurationComponents.put("usage.stats.job.exec.time", "management-server"); s_configurationComponents.put("usage.stats.job.aggregation.range", "management-server"); s_configurationComponents.put("consoleproxy.domP.enable", "management-server"); s_configurationComponents.put("consoleproxy.port", "management-server"); s_configurationComponents.put("consoleproxy.url.port", "management-server"); s_configurationComponents.put("alert.email.addresses", "management-server"); s_configurationComponents.put("alert.smtp.host", "management-server"); s_configurationComponents.put("alert.smtp.port", "management-server"); s_configurationComponents.put("alert.smtp.useAuth", "management-server"); s_configurationComponents.put("alert.smtp.username", "management-server"); s_configurationComponents.put("alert.smtp.password", "management-server"); s_configurationComponents.put("alert.email.sender", "management-server"); s_configurationComponents.put("memory.capacity.threshold", "management-server"); s_configurationComponents.put("cpu.capacity.threshold", "management-server"); s_configurationComponents.put("storage.capacity.threshold", "management-server"); s_configurationComponents.put("public.ip.capacity.threshold", "management-server"); s_configurationComponents.put("private.ip.capacity.threshold", "management-server"); s_configurationComponents.put("capacity.check.period", "management-server"); s_configurationComponents.put("network.throttling.rate", "management-server"); s_configurationComponents.put("multicast.throttling.rate", "management-server"); s_configurationComponents.put("account.cleanup.interval", "management-server"); s_configurationComponents.put("expunge.delay", "UserVmManager"); s_configurationComponents.put("expunge.interval", "UserVmManager"); s_configurationComponents.put("host", "AgentManager"); s_configurationComponents.put("port", "AgentManager"); s_configurationComponents.put("domain", "AgentManager"); s_configurationComponents.put("instance.name", "AgentManager"); s_configurationComponents.put("storage.overprovisioning.factor", "StorageAllocator"); s_configurationComponents.put("retries.per.host", "AgentManager"); s_configurationComponents.put("start.retry", "AgentManager"); s_configurationComponents.put("wait", "AgentManager"); s_configurationComponents.put("ping.timeout", "AgentManager"); s_configurationComponents.put("ping.interval", "AgentManager"); s_configurationComponents.put("alert.wait", "AgentManager"); s_configurationComponents.put("update.wait", "AgentManager"); s_configurationComponents.put("guest.domain.suffix", "AgentManager"); s_configurationComponents.put("consoleproxy.ram.size", "AgentManager"); s_configurationComponents.put("consoleproxy.cmd.port", "AgentManager"); s_configurationComponents.put("consoleproxy.loadscan.interval", "AgentManager"); s_configurationComponents.put("consoleproxy.capacityscan.interval", "AgentManager"); s_configurationComponents.put("consoleproxy.capacity.standby", "AgentManager"); s_configurationComponents.put("consoleproxy.session.max", "AgentManager"); s_configurationComponents.put("consoleproxy.session.timeout", "AgentManager"); s_configurationComponents.put("expunge.workers", "UserVmManager"); s_configurationComponents.put("extract.url.cleanup.interval", "management-server"); s_configurationComponents.put("stop.retry.interval", "HighAvailabilityManager"); s_configurationComponents.put("restart.retry.interval", "HighAvailabilityManager"); s_configurationComponents.put("investigate.retry.interval", "HighAvailabilityManager"); s_configurationComponents.put("migrate.retry.interval", "HighAvailabilityManager"); s_configurationComponents.put("storage.overwrite.provisioning", "UserVmManager"); s_configurationComponents.put("init", "none"); s_configurationComponents.put("system.vm.use.local.storage", "ManagementServer"); s_configurationComponents.put("use.local.storage", "ManagementServer"); s_configurationComponents.put("snapshot.poll.interval", "SnapshotManager"); s_configurationComponents.put("snapshot.max.hourly", "SnapshotManager"); s_configurationComponents.put("snapshot.max.daily", "SnapshotManager"); s_configurationComponents.put("snapshot.max.weekly", "SnapshotManager"); s_configurationComponents.put("snapshot.max.monthly", "SnapshotManager"); s_configurationComponents.put("snapshot.delta.max", "SnapshotManager"); s_configurationComponents.put("snapshot.recurring.test", "SnapshotManager"); s_configurationComponents.put("snapshot.test.minutes.per.hour", "SnapshotManager"); s_configurationComponents.put("snapshot.test.hours.per.day", "SnapshotManager"); s_configurationComponents.put("snapshot.test.days.per.week", "SnapshotManager"); s_configurationComponents.put("snapshot.test.days.per.month", "SnapshotManager"); s_configurationComponents.put("snapshot.test.weeks.per.month", "SnapshotManager"); s_configurationComponents.put("snapshot.test.months.per.year", "SnapshotManager"); s_configurationComponents.put("hypervisor.type", "ManagementServer"); s_defaultConfigurationValues.put("host.stats.interval", "60000"); s_defaultConfigurationValues.put("storage.stats.interval", "60000"); //s_defaultConfigurationValues.put("volume.stats.interval", "-1"); s_defaultConfigurationValues.put("port", "8250"); s_defaultConfigurationValues.put("integration.api.port", "8096"); s_defaultConfigurationValues.put("usage.stats.job.exec.time", "00:15"); // run at 12:15am s_defaultConfigurationValues.put("usage.stats.job.aggregation.range", "1440"); // do a daily aggregation s_defaultConfigurationValues.put("storage.overprovisioning.factor", "2"); s_defaultConfigurationValues.put("retries.per.host", "2"); s_defaultConfigurationValues.put("ping.timeout", "2.5"); s_defaultConfigurationValues.put("ping.interval", "60"); s_defaultConfigurationValues.put("snapshot.poll.interval", "300"); s_defaultConfigurationValues.put("snapshot.max.hourly", "8"); s_defaultConfigurationValues.put("snapshot.max.daily", "8"); s_defaultConfigurationValues.put("snapshot.max.weekly", "8"); s_defaultConfigurationValues.put("snapshot.max.monthly", "8"); s_defaultConfigurationValues.put("snapshot.delta.max", "16"); s_defaultConfigurationValues.put("snapshot.recurring.test", "false"); s_defaultConfigurationValues.put("snapshot.test.minutes.per.hour", "60"); s_defaultConfigurationValues.put("snapshot.test.hours.per.day", "24"); s_defaultConfigurationValues.put("snapshot.test.days.per.week", "7"); s_defaultConfigurationValues.put("snapshot.test.days.per.month", "30"); s_defaultConfigurationValues.put("snapshot.test.weeks.per.month", "4"); s_defaultConfigurationValues.put("snapshot.test.months.per.year", "12"); s_defaultConfigurationValues.put("alert.wait", "1800"); s_defaultConfigurationValues.put("update.wait", "600"); s_defaultConfigurationValues.put("expunge.interval", "86400"); s_defaultConfigurationValues.put("extract.url.cleanup.interval", "120"); s_defaultConfigurationValues.put("instance.name", "VM"); s_defaultConfigurationValues.put("expunge.workers", "1"); s_defaultConfigurationValues.put("stop.retry.interval", "600"); s_defaultConfigurationValues.put("restart.retry.interval", "600"); s_defaultConfigurationValues.put("investigate.retry.interval", "60"); s_defaultConfigurationValues.put("migrate.retry.interval", "120"); s_defaultConfigurationValues.put("account.cleanup.interval", "86400"); s_defaultConfigurationValues.put("system.vm.use.local.storage", "false"); s_defaultConfigurationValues.put("use.local.storage", "false"); s_defaultConfigurationValues.put("init", "false"); } protected DatabaseConfig() { } /** * @param args - name of server-setup.xml file which contains the bootstrap data */ public static void main(String[] args) { System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"); System.setProperty("javax.xml.parsers.SAXParserFactory", "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"); File file = PropertiesUtil.findConfigFile("log4j-cloud.xml"); if(file != null) { System.out.println("Log4j configuration from : " + file.getAbsolutePath()); DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000); } else { System.out.println("Configure log4j with default properties"); } if (args.length < 1) { s_logger.error("error starting database config, missing initial data file"); } else { try { DatabaseConfig config = ComponentLocator.inject(DatabaseConfig.class, args[0]); config.doVersionCheck(); config.doConfig(); System.exit(0); } catch (Exception ex) { System.out.print("Error Caught"); ex.printStackTrace(); s_logger.error("error", ex); } } } public DatabaseConfig(String configFileName) { _configFileName = configFileName; } private void doVersionCheck() { try { String warningMsg = "\nYou are using an outdated format for server-setup.xml. Please switch to the new format.\n"; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder dbuilder = dbf.newDocumentBuilder(); File configFile = new File(_configFileName); Document d = dbuilder.parse(configFile); NodeList nodeList = d.getElementsByTagName("version"); if (nodeList.getLength() == 0) { System.out.println(warningMsg); return; } Node firstNode = nodeList.item(0); String version = firstNode.getTextContent(); if (!version.equals("2.0")) { System.out.println(warningMsg); } } catch (ParserConfigurationException parserException) { parserException.printStackTrace(); } catch (IOException ioException) { ioException.printStackTrace(); } catch (SAXException saxException) { saxException.printStackTrace(); } } @DB protected void doConfig() { Transaction txn = Transaction.currentTxn(); try { File configFile = new File(_configFileName); SAXParserFactory spfactory = SAXParserFactory.newInstance(); SAXParser saxParser = spfactory.newSAXParser(); DbConfigXMLHandler handler = new DbConfigXMLHandler(); handler.setParent(this); txn.start(); // Save user configured values for all fields saxParser.parse(configFile, handler); // Save default values for configuration fields saveVMTemplate(); saveRootDomain(); saveDefaultConfiguations(); txn.commit(); // Check pod CIDRs against each other, and against the guest ip network/netmask pzc.checkAllPodCidrSubnets(); } catch (Exception ex) { System.out.print("ERROR IS"+ex); s_logger.error("error", ex); txn.rollback(); } } private void setCurrentObjectName(String name) { _currentObjectName = name; } private void saveCurrentObject() { if ("zone".equals(_currentObjectName)) { saveZone(); } else if ("physicalNetwork".equals(_currentObjectName)) { savePhysicalNetwork(); } else if ("vlan".equals(_currentObjectName)) { saveVlan(); } else if ("pod".equals(_currentObjectName)) { savePod(); } else if ("serviceOffering".equals(_currentObjectName)) { saveServiceOffering(); } else if ("diskOffering".equals(_currentObjectName)) { saveDiskOffering(); } else if ("user".equals(_currentObjectName)) { saveUser(); } else if ("configuration".equals(_currentObjectName)) { saveConfiguration(); } else if ("storagePool".equals(_currentObjectName)) { saveStoragePool(); } else if ("secondaryStorage".equals(_currentObjectName)) { saveSecondaryStorage(); } else if ("cluster".equals(_currentObjectName)) { saveCluster(); } else if ("physicalNetworkServiceProvider".equals(_currentObjectName)) { savePhysicalNetworkServiceProvider(); } else if ("virtualRouterProvider".equals(_currentObjectName)) { saveVirtualRouterProvider(); } _currentObjectParams = null; } @DB public void saveSecondaryStorage() { long dataCenterId = Long.parseLong(_currentObjectParams.get("zoneId")); String url = _currentObjectParams.get("url"); String mountPoint; try { mountPoint = NfsUtils.url2Mount(url); } catch (URISyntaxException e1) { return; } String insertSql1 = "INSERT INTO `host` (`id`, `name`, `status` , `type` , `private_ip_address`, `private_netmask` ,`private_mac_address` , `storage_ip_address` ,`storage_netmask`, `storage_mac_address`, `data_center_id`, `version`, `dom0_memory`, `last_ping`, `resource`, `guid`, `hypervisor_type`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; String insertSqlHostDetails = "INSERT INTO `host_details` (`id`, `host_id`, `name`, `value`) VALUES(?,?,?,?)"; String insertSql2 = "INSERT INTO `op_host` (`id`, `sequence`) VALUES(?, ?)"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1); stmt.setLong(1, 0); stmt.setString(2, url); stmt.setString(3, "UP"); stmt.setString(4, "SecondaryStorage"); stmt.setString(5, "192.168.122.1"); stmt.setString(6, "255.255.255.0"); stmt.setString(7, "92:ff:f5:ad:23:e1"); stmt.setString(8, "192.168.122.1"); stmt.setString(9, "255.255.255.0"); stmt.setString(10, "92:ff:f5:ad:23:e1"); stmt.setLong(11, dataCenterId); stmt.setString(12, "2.2.4"); stmt.setLong(13, 0); stmt.setLong(14, 1238425896); boolean nfs = false; if (url.startsWith("nfs")) { nfs = true; } if (nfs) { stmt.setString(15, "com.cloud.storage.resource.NfsSecondaryStorageResource"); } else { stmt.setString(15, "com.cloud.storage.secondary.LocalSecondaryStorageResource"); } stmt.setString(16, url); stmt.setString(17, "None"); stmt.executeUpdate(); stmt = txn.prepareAutoCloseStatement(insertSqlHostDetails); stmt.setLong(1, 1); stmt.setLong(2, 1); stmt.setString(3, "mount.parent"); if (nfs) { stmt.setString(4, "/mnt"); } else { stmt.setString(4, "/"); } stmt.executeUpdate(); stmt.setLong(1, 2); stmt.setLong(2, 1); stmt.setString(3, "mount.path"); if (nfs) { stmt.setString(4, mountPoint); } else { stmt.setString(4, url.replaceFirst("file:/", "")); } stmt.executeUpdate(); stmt.setLong(1, 3); stmt.setLong(2, 1); stmt.setString(3, "orig.url"); stmt.setString(4, url); stmt.executeUpdate(); stmt = txn.prepareAutoCloseStatement(insertSql2); stmt.setLong(1, 1); stmt.setLong(2, 1); stmt.executeUpdate(); } catch (SQLException ex) { System.out.println("Error creating secondary storage: " + ex.getMessage()); return; } } @DB public void saveCluster() { String name = _currentObjectParams.get("name"); long id = Long.parseLong(_currentObjectParams.get("id")); long dataCenterId = Long.parseLong(_currentObjectParams.get("zoneId")); long podId = Long.parseLong(_currentObjectParams.get("podId")); String hypervisor = _currentObjectParams.get("hypervisorType"); String insertSql1 = "INSERT INTO `cluster` (`id`, `name`, `data_center_id` , `pod_id`, `hypervisor_type` , `cluster_type`, `allocation_state`) VALUES (?,?,?,?,?,?,?)"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1); stmt.setLong(1, id); stmt.setString(2, name); stmt.setLong(3, dataCenterId); stmt.setLong(4, podId); stmt.setString(5, hypervisor); stmt.setString(6, "CloudManaged"); stmt.setString(7, "Enabled"); stmt.executeUpdate(); } catch (SQLException ex) { System.out.println("Error creating cluster: " + ex.getMessage()); s_logger.error("error creating cluster", ex); return; } } @DB public void saveStoragePool() { String name = _currentObjectParams.get("name"); long id = Long.parseLong(_currentObjectParams.get("id")); long dataCenterId = Long.parseLong(_currentObjectParams.get("zoneId")); long podId = Long.parseLong(_currentObjectParams.get("podId")); long clusterId = Long.parseLong(_currentObjectParams.get("clusterId")); String hostAddress = _currentObjectParams.get("hostAddress"); String hostPath = _currentObjectParams.get("hostPath"); String storageType = _currentObjectParams.get("storageType"); String uuid = UUID.nameUUIDFromBytes(new String(hostAddress+hostPath).getBytes()).toString(); String insertSql1 = "INSERT INTO `storage_pool` (`id`, `name`, `uuid` , `pool_type` , `port`, `data_center_id` ,`available_bytes` , `capacity_bytes` ,`host_address`, `path`, `created`, `pod_id`,`status` , `cluster_id`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; // String insertSql2 = "INSERT INTO `netfs_storage_pool` VALUES (?,?,?)"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1); stmt.setLong(1, id); stmt.setString(2, name); stmt.setString(3, uuid); if (storageType == null) { stmt.setString(4, "NetworkFileSystem"); } else { stmt.setString(4, storageType); } stmt.setLong(5, 111); stmt.setLong(6, dataCenterId); stmt.setLong(7,0); stmt.setLong(8,0); stmt.setString(9, hostAddress); stmt.setString(10, hostPath); stmt.setDate(11, new Date(new java.util.Date().getTime())); stmt.setLong(12, podId); stmt.setString(13, Status.Up.toString()); stmt.setLong(14, clusterId); stmt.executeUpdate(); } catch (SQLException ex) { System.out.println("Error creating storage pool: " + ex.getMessage()); s_logger.error("error creating storage pool ", ex); return; } } private void saveZone() { long id = Long.parseLong(_currentObjectParams.get("id")); String name = _currentObjectParams.get("name"); //String description = _currentObjectParams.get("description"); String dns1 = _currentObjectParams.get("dns1"); String dns2 = _currentObjectParams.get("dns2"); String internalDns1 = _currentObjectParams.get("internalDns1"); String internalDns2 = _currentObjectParams.get("internalDns2"); //String vnetRange = _currentObjectParams.get("vnet"); String guestNetworkCidr = _currentObjectParams.get("guestNetworkCidr"); String networkType = _currentObjectParams.get("networktype"); // Check that all IPs are valid String ipError = "Please enter a valid IP address for the field: "; if (!IPRangeConfig.validOrBlankIP(dns1)) { printError(ipError + "dns1"); } if (!IPRangeConfig.validOrBlankIP(dns2)) { printError(ipError + "dns2"); } if (!IPRangeConfig.validOrBlankIP(internalDns1)) { printError(ipError + "internalDns1"); } if (!IPRangeConfig.validOrBlankIP(internalDns2)) { printError(ipError + "internalDns2"); } if (!IPRangeConfig.validCIDR(guestNetworkCidr)) { printError("Please enter a valid value for guestNetworkCidr"); } pzc.saveZone(false, id, name, dns1, dns2, internalDns1, internalDns2, guestNetworkCidr, networkType); } private void savePhysicalNetwork() { long id = Long.parseLong(_currentObjectParams.get("id")); String zoneId = _currentObjectParams.get("zoneId"); String vnetRange = _currentObjectParams.get("vnet"); int vnetStart = -1; int vnetEnd = -1; if (vnetRange != null) { String[] tokens = vnetRange.split("-"); vnetStart = Integer.parseInt(tokens[0]); vnetEnd = Integer.parseInt(tokens[1]); } long zoneDbId = Long.parseLong(zoneId); pzc.savePhysicalNetwork(false, id, zoneDbId, vnetStart, vnetEnd); } private void savePhysicalNetworkServiceProvider() { long id = Long.parseLong(_currentObjectParams.get("id")); long physicalNetworkId = Long.parseLong(_currentObjectParams.get("physicalNetworkId")); String providerName = _currentObjectParams.get("providerName"); long destPhysicalNetworkId = Long.parseLong(_currentObjectParams.get("destPhysicalNetworkId")); String uuid = UUID.randomUUID().toString(); int vpn = Integer.parseInt(_currentObjectParams.get("vpn")); int dhcp = Integer.parseInt(_currentObjectParams.get("dhcp")); int dns = Integer.parseInt(_currentObjectParams.get("dns")); int gateway = Integer.parseInt(_currentObjectParams.get("gateway")); int firewall = Integer.parseInt(_currentObjectParams.get("firewall")); int sourceNat = Integer.parseInt(_currentObjectParams.get("sourceNat")); int lb = Integer.parseInt(_currentObjectParams.get("loadBalance")); int staticNat = Integer.parseInt(_currentObjectParams.get("staticNat")); int pf =Integer.parseInt(_currentObjectParams.get("portForwarding")); int userData =Integer.parseInt(_currentObjectParams.get("userData")); int securityGroup =Integer.parseInt(_currentObjectParams.get("securityGroup")); String insertSql1 = "INSERT INTO `physical_network_service_providers` (`id`, `uuid`, `physical_network_id` , `provider_name`, `state` ," + "`destination_physical_network_id`, `vpn_service_provided`, `dhcp_service_provided`, `dns_service_provided`, `gateway_service_provided`," + "`firewall_service_provided`, `source_nat_service_provided`, `load_balance_service_provided`, `static_nat_service_provided`," + "`port_forwarding_service_provided`, `user_data_service_provided`, `security_group_service_provided`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1); stmt.setLong(1, id); stmt.setString(2, uuid); stmt.setLong(3, physicalNetworkId); stmt.setString(4, providerName); stmt.setString(5, "Enabled"); stmt.setLong(6, destPhysicalNetworkId); stmt.setInt(7, vpn); stmt.setInt(8, dhcp); stmt.setInt(9, dns); stmt.setInt(10, gateway); stmt.setInt(11, firewall); stmt.setInt(12, sourceNat); stmt.setInt(13, lb); stmt.setInt(14, staticNat); stmt.setInt(15, pf); stmt.setInt(16, userData); stmt.setInt(17, securityGroup); stmt.executeUpdate(); } catch (SQLException ex) { System.out.println("Error creating physical network service provider: " + ex.getMessage()); s_logger.error("error creating physical network service provider", ex); return; } } private void saveVirtualRouterProvider() { long id = Long.parseLong(_currentObjectParams.get("id")); long nspId = Long.parseLong(_currentObjectParams.get("nspId")); String uuid = UUID.randomUUID().toString(); String type = _currentObjectParams.get("type"); String insertSql1 = "INSERT INTO `virtual_router_providers` (`id`, `nsp_id`, `uuid` , `type` , `enabled`) " + "VALUES (?,?,?,?,?)"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1); stmt.setLong(1, id); stmt.setLong(2, nspId); stmt.setString(3, uuid); stmt.setString(4, type); stmt.setInt(5, 1); stmt.executeUpdate(); } catch (SQLException ex) { System.out.println("Error creating virtual router provider: " + ex.getMessage()); s_logger.error("error creating virtual router provider ", ex); return; } } private void saveVlan() { String zoneId = _currentObjectParams.get("zoneId"); String physicalNetworkIdStr = _currentObjectParams.get("physicalNetworkId"); String vlanId = _currentObjectParams.get("vlanId"); String gateway = _currentObjectParams.get("gateway"); String netmask = _currentObjectParams.get("netmask"); String publicIpRange = _currentObjectParams.get("ipAddressRange"); String vlanType = _currentObjectParams.get("vlanType"); String vlanPodName = _currentObjectParams.get("podName"); String ipError = "Please enter a valid IP address for the field: "; if (!IPRangeConfig.validOrBlankIP(gateway)) { printError(ipError + "gateway"); } if (!IPRangeConfig.validOrBlankIP(netmask)) { printError(ipError + "netmask"); } // Check that the given IP address range was valid if (!checkIpAddressRange(publicIpRange)) { printError("Please enter a valid public IP range."); } // Split the IP address range String[] ipAddressRangeArray = publicIpRange.split("\\-"); String startIP = ipAddressRangeArray[0]; String endIP = null; if (ipAddressRangeArray.length > 1) { endIP = ipAddressRangeArray[1]; } // If a netmask was provided, check that the startIP, endIP, and gateway all belong to the same subnet if (netmask != null && netmask != "") { if (endIP != null) { if (!IPRangeConfig.sameSubnet(startIP, endIP, netmask)) { printError("Start and end IPs for the public IP range must be in the same subnet, as per the provided netmask."); } } if (gateway != null && gateway != "") { if (!IPRangeConfig.sameSubnet(startIP, gateway, netmask)) { printError("The start IP for the public IP range must be in the same subnet as the gateway, as per the provided netmask."); } if (endIP != null) { if (!IPRangeConfig.sameSubnet(endIP, gateway, netmask)) { printError("The end IP for the public IP range must be in the same subnet as the gateway, as per the provided netmask."); } } } } long zoneDbId = Long.parseLong(zoneId); String zoneName = PodZoneConfig.getZoneName(zoneDbId); long physicalNetworkId = Long.parseLong(physicalNetworkIdStr); //Set networkId to be 0, the value will be updated after management server starts up pzc.modifyVlan(zoneName, true, vlanId, gateway, netmask, vlanPodName, vlanType, publicIpRange, 0, physicalNetworkId); long vlanDbId = pzc.getVlanDbId(zoneName, vlanId); iprc.saveIPRange("public", -1, zoneDbId, vlanDbId, startIP, endIP, null, physicalNetworkId); } private void savePod() { long id = Long.parseLong(_currentObjectParams.get("id")); String name = _currentObjectParams.get("name"); long dataCenterId = Long.parseLong(_currentObjectParams.get("zoneId")); String privateIpRange = _currentObjectParams.get("ipAddressRange"); String gateway = _currentObjectParams.get("gateway"); String cidr = _currentObjectParams.get("cidr"); String zoneName = PodZoneConfig.getZoneName(dataCenterId); String startIP = null; String endIP = null; String vlanRange = _currentObjectParams.get("vnet"); int vlanStart = -1; int vlanEnd = -1; if (vlanRange != null) { String[] tokens = vlanRange.split("-"); vlanStart = Integer.parseInt(tokens[0]); vlanEnd = Integer.parseInt(tokens[1]); } // Get the individual cidrAddress and cidrSize values String[] cidrPair = cidr.split("\\/"); String cidrAddress = cidrPair[0]; String cidrSize = cidrPair[1]; long cidrSizeNum = Long.parseLong(cidrSize); // Check that the gateway is in the same subnet as the CIDR if (!IPRangeConfig.sameSubnetCIDR(gateway, cidrAddress, cidrSizeNum)) { printError("For pod " + name + " in zone " + zoneName + " , please ensure that your gateway is in the same subnet as the pod's CIDR address."); } pzc.savePod(false, id, name, dataCenterId, gateway, cidr, vlanStart, vlanEnd); if (privateIpRange != null) { // Check that the given IP address range was valid if (!checkIpAddressRange(privateIpRange)) { printError("Please enter a valid private IP range."); } String[] ipAddressRangeArray = privateIpRange.split("\\-"); startIP = ipAddressRangeArray[0]; endIP = null; if (ipAddressRangeArray.length > 1) { endIP = ipAddressRangeArray[1]; } } // Check that the start IP and end IP match up with the CIDR if (!IPRangeConfig.sameSubnetCIDR(startIP, endIP, cidrSizeNum)) { printError("For pod " + name + " in zone " + zoneName + ", please ensure that your start IP and end IP are in the same subnet, as per the pod's CIDR size."); } if (!IPRangeConfig.sameSubnetCIDR(startIP, cidrAddress, cidrSizeNum)) { printError("For pod " + name + " in zone " + zoneName + ", please ensure that your start IP is in the same subnet as the pod's CIDR address."); } if (!IPRangeConfig.sameSubnetCIDR(endIP, cidrAddress, cidrSizeNum)) { printError("For pod " + name + " in zone " + zoneName + ", please ensure that your end IP is in the same subnet as the pod's CIDR address."); } if (privateIpRange != null) { // Save the IP address range iprc.saveIPRange("private", id, dataCenterId, -1, startIP, endIP, null, -1); } } @DB protected void saveServiceOffering() { long id = Long.parseLong(_currentObjectParams.get("id")); String name = _currentObjectParams.get("name"); String displayText = _currentObjectParams.get("displayText"); int cpu = Integer.parseInt(_currentObjectParams.get("cpu")); int ramSize = Integer.parseInt(_currentObjectParams.get("ramSize")); int speed = Integer.parseInt(_currentObjectParams.get("speed")); String useLocalStorageValue = _currentObjectParams.get("useLocalStorage"); // int nwRate = Integer.parseInt(_currentObjectParams.get("nwRate")); // int mcRate = Integer.parseInt(_currentObjectParams.get("mcRate")); boolean ha = Boolean.parseBoolean(_currentObjectParams.get("enableHA")); boolean mirroring = Boolean.parseBoolean(_currentObjectParams.get("mirrored")); boolean useLocalStorage; if (useLocalStorageValue != null) { if (Boolean.parseBoolean(useLocalStorageValue)) { useLocalStorage = true; } else { useLocalStorage = false; } } else { useLocalStorage = false; } ServiceOfferingVO serviceOffering = new ServiceOfferingVO(name, cpu, ramSize, speed, null, null, ha, displayText, useLocalStorage, false, null, false, null, false); ServiceOfferingDaoImpl dao = ComponentLocator.inject(ServiceOfferingDaoImpl.class); try { dao.persist(serviceOffering); } catch (Exception e) { s_logger.error("error creating service offering", e); } /* String insertSql = "INSERT INTO `cloud`.`service_offering` (id, name, cpu, ram_size, speed, nw_rate, mc_rate, created, ha_enabled, mirrored, display_text, guest_ip_type, use_local_storage) " + "VALUES (" + id + ",'" + name + "'," + cpu + "," + ramSize + "," + speed + "," + nwRate + "," + mcRate + ",now()," + ha + "," + mirroring + ",'" + displayText + "','" + guestIpType + "','" + useLocalStorage + "')"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql); stmt.executeUpdate(); } catch (SQLException ex) { s_logger.error("error creating service offering", ex); return; } */ } @DB protected void saveDiskOffering() { long id = Long.parseLong(_currentObjectParams.get("id")); long domainId = Long.parseLong(_currentObjectParams.get("domainId")); String name = _currentObjectParams.get("name"); String displayText = _currentObjectParams.get("displayText"); long diskSpace = Long.parseLong(_currentObjectParams.get("diskSpace")); diskSpace = diskSpace * 1024 * 1024; // boolean mirroring = Boolean.parseBoolean(_currentObjectParams.get("mirrored")); String tags = _currentObjectParams.get("tags"); String useLocal = _currentObjectParams.get("useLocal"); boolean local = false; if (useLocal != null) { local = Boolean.parseBoolean(useLocal); } if (tags != null && tags.length() > 0) { String[] tokens = tags.split(","); StringBuilder newTags = new StringBuilder(); for (String token : tokens) { newTags.append(token.trim()).append(","); } newTags.delete(newTags.length() - 1, newTags.length()); tags = newTags.toString(); } DiskOfferingVO diskOffering = new DiskOfferingVO(domainId, name, displayText, diskSpace , tags, false); diskOffering.setUseLocalStorage(local); DiskOfferingDaoImpl offering = ComponentLocator.inject(DiskOfferingDaoImpl.class); try { offering.persist(diskOffering); } catch (Exception e) { s_logger.error("error creating disk offering", e); } /* String insertSql = "INSERT INTO `cloud`.`disk_offering` (id, domain_id, name, display_text, disk_size, mirrored, tags) " + "VALUES (" + id + "," + domainId + ",'" + name + "','" + displayText + "'," + diskSpace + "," + mirroring + ", ? )"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql); stmt.setString(1, tags); stmt.executeUpdate(); } catch (SQLException ex) { s_logger.error("error creating disk offering", ex); return; } */ } @DB protected void saveThrottlingRates() { boolean saveNetworkThrottlingRate = (_networkThrottlingRate != null); boolean saveMulticastThrottlingRate = (_multicastThrottlingRate != null); if (!saveNetworkThrottlingRate && !saveMulticastThrottlingRate) { return; } String insertNWRateSql = "UPDATE `cloud`.`service_offering` SET `nw_rate` = ?"; String insertMCRateSql = "UPDATE `cloud`.`service_offering` SET `mc_rate` = ?"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt; if (saveNetworkThrottlingRate) { stmt = txn.prepareAutoCloseStatement(insertNWRateSql); stmt.setString(1, _networkThrottlingRate); stmt.executeUpdate(); } if (saveMulticastThrottlingRate) { stmt = txn.prepareAutoCloseStatement(insertMCRateSql); stmt.setString(1, _multicastThrottlingRate); stmt.executeUpdate(); } } catch (SQLException ex) { s_logger.error("error saving network and multicast throttling rates to all service offerings", ex); return; } } // no configurable values for VM Template, hard-code the defaults for now private void saveVMTemplate() { /* long id = 1; String uniqueName = "routing"; String name = "DomR Template"; int isPublic = 0; String path = "template/private/u000000/os/routing"; String type = "ext3"; int requiresHvm = 0; int bits = 64; long createdByUserId = 1; int isReady = 1; String insertSql = "INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, path, created, type, hvm, bits, created_by, ready) " + "VALUES (" + id + ",'" + uniqueName + "','" + name + "'," + isPublic + ",'" + path + "',now(),'" + type + "'," + requiresHvm + "," + bits + "," + createdByUserId + "," + isReady + ")"; Transaction txn = Transaction.open(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql); stmt.executeUpdate(); } catch (SQLException ex) { s_logger.error("error creating vm template: " + ex); } finally { txn.close(); } */ /* // do it again for console proxy template id = 2; uniqueName = "consoleproxy"; name = "Console Proxy Template"; isPublic = 0; path = "template/private/u000000/os/consoleproxy"; type = "ext3"; insertSql = "INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, path, created, type, hvm, bits, created_by, ready) " + "VALUES (" + id + ",'" + uniqueName + "','" + name + "'," + isPublic + ",'" + path + "',now(),'" + type + "'," + requiresHvm + "," + bits + "," + createdByUserId + "," + isReady + ")"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql); stmt.executeUpdate(); } catch (SQLException ex) { s_logger.error("error creating vm template: " + ex); } finally { txn.close(); } */ } @DB protected void saveUser() { // insert system account String insertSql = "INSERT INTO `cloud`.`account` (id, account_name, type, domain_id) VALUES (1, 'system', '1', '1')"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql); stmt.executeUpdate(); } catch (SQLException ex) { s_logger.error("error creating system account", ex); } // insert system user insertSql = "INSERT INTO `cloud`.`user` (id, username, password, account_id, firstname, lastname, created) VALUES (1, 'system', '', 1, 'system', 'cloud', now())"; txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql); stmt.executeUpdate(); } catch (SQLException ex) { s_logger.error("error creating system user", ex); } // insert admin user long id = Long.parseLong(_currentObjectParams.get("id")); String username = _currentObjectParams.get("username"); String firstname = _currentObjectParams.get("firstname"); String lastname = _currentObjectParams.get("lastname"); String password = _currentObjectParams.get("password"); String email = _currentObjectParams.get("email"); if (email == null || email.equals("")) { printError("An email address for each user is required."); } MessageDigest md5 = null; try { md5 = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { s_logger.error("error saving user", e); return; } md5.reset(); BigInteger pwInt = new BigInteger(1, md5.digest(password.getBytes())); String pwStr = pwInt.toString(16); int padding = 32 - pwStr.length(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < padding; i++) { sb.append('0'); // make sure the MD5 password is 32 digits long } sb.append(pwStr); // create an account for the admin user first insertSql = "INSERT INTO `cloud`.`account` (id, account_name, type, domain_id) VALUES (" + id + ", '" + username + "', '1', '1')"; txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql); stmt.executeUpdate(); } catch (SQLException ex) { s_logger.error("error creating account", ex); } // now insert the user insertSql = "INSERT INTO `cloud`.`user` (id, username, password, account_id, firstname, lastname, email, created) " + "VALUES (" + id + ",'" + username + "','" + sb.toString() + "', 2, '" + firstname + "','" + lastname + "','" + email + "',now())"; txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql); stmt.executeUpdate(); } catch (SQLException ex) { s_logger.error("error creating user", ex); } } private void saveDefaultConfiguations() { for (String name : s_defaultConfigurationValues.keySet()) { String value = s_defaultConfigurationValues.get(name); saveConfiguration(name, value, null); } } private void saveConfiguration() { String name = _currentObjectParams.get("name"); String value = _currentObjectParams.get("value"); String category = _currentObjectParams.get("category"); saveConfiguration(name, value, category); } @DB protected void saveConfiguration(String name, String value, String category) { String instance = "DEFAULT"; String description = s_configurationDescriptions.get(name); String component = s_configurationComponents.get(name); if (category == null) { category = "Advanced"; } String instanceNameError = "Please enter a non-blank value for the field: "; if (name.equals("instance.name")) { if (value == null || value.isEmpty() || !value.matches("^[A-Za-z0-9]{1,8}$")) { printError(instanceNameError + "configuration: instance.name can not be empty and can only contain numbers and alphabets up to 8 characters long"); } } if (name.equals("network.throttling.rate")) { if (value != null && !value.isEmpty()) { _networkThrottlingRate = value; } } if (name.equals("multicast.throttling.rate")) { if (value != null && !value.isEmpty()) { _multicastThrottlingRate = value; } } String insertSql = "INSERT INTO `cloud`.`configuration` (instance, component, name, value, description, category) " + "VALUES ('" + instance + "','" + component + "','" + name + "','" + value + "','" + description + "','" + category + "')"; String selectSql = "SELECT name FROM cloud.configuration WHERE name = '" + name + "'"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql); ResultSet result = stmt.executeQuery(); Boolean hasRow = result.next(); if (!hasRow) { stmt = txn.prepareAutoCloseStatement(insertSql); stmt.executeUpdate(); } } catch (SQLException ex) { s_logger.error("error creating configuration", ex); } } private boolean checkIpAddressRange(String ipAddressRange) { String[] ipAddressRangeArray = ipAddressRange.split("\\-"); String startIP = ipAddressRangeArray[0]; String endIP = null; if (ipAddressRangeArray.length > 1) { endIP = ipAddressRangeArray[1]; } if (!IPRangeConfig.validIP(startIP)) { s_logger.error("The private IP address: " + startIP + " is invalid."); return false; } if (!IPRangeConfig.validOrBlankIP(endIP)) { s_logger.error("The private IP address: " + endIP + " is invalid."); return false; } if (!IPRangeConfig.validIPRange(startIP, endIP)) { s_logger.error("The IP range " + startIP + " -> " + endIP + " is invalid."); return false; } return true; } @DB protected void saveRootDomain() { String insertSql = "insert into `cloud`.`domain` (id, name, parent, owner, path, level) values (1, 'ROOT', NULL, 2, '/', 0)"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql); stmt.executeUpdate(); } catch (SQLException ex) { s_logger.error("error creating ROOT domain", ex); } /* String updateSql = "update account set domain_id = 1 where id = 2"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareStatement(updateSql); stmt.executeUpdate(); } catch (SQLException ex) { s_logger.error("error updating admin user", ex); } finally { txn.close(); } updateSql = "update account set domain_id = 1 where id = 1"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareStatement(updateSql); stmt.executeUpdate(); } catch (SQLException ex) { s_logger.error("error updating system user", ex); } finally { txn.close(); } */ } class DbConfigXMLHandler extends DefaultHandler { private DatabaseConfig _parent = null; public void setParent(DatabaseConfig parent) { _parent = parent; } @Override public void endElement(String s, String s1, String s2) throws SAXException { if (DatabaseConfig.objectNames.contains(s2) || "object".equals(s2)) { _parent.saveCurrentObject(); } else if (DatabaseConfig.fieldNames.contains(s2) || "field".equals(s2)) { _currentFieldName = null; } } @Override public void startElement(String s, String s1, String s2, Attributes attributes) throws SAXException { if ("object".equals(s2)) { _parent.setCurrentObjectName(convertName(attributes.getValue("name"))); } else if ("field".equals(s2)) { if (_currentObjectParams == null) { _currentObjectParams = new HashMap<String, String>(); } _currentFieldName = convertName(attributes.getValue("name")); } else if (DatabaseConfig.objectNames.contains(s2)) { _parent.setCurrentObjectName(s2); } else if (DatabaseConfig.fieldNames.contains(s2)) { if (_currentObjectParams == null) { _currentObjectParams = new HashMap<String, String>(); } _currentFieldName = s2; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if ((_currentObjectParams != null) && (_currentFieldName != null)) { String currentFieldVal = new String(ch, start, length); _currentObjectParams.put(_currentFieldName, currentFieldVal); } } private String convertName(String name) { if (name.contains(".")){ String[] nameArray = name.split("\\."); for (int i = 1; i < nameArray.length; i++) { String word = nameArray[i]; nameArray[i] = word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase(); } name = ""; for (int i = 0; i < nameArray.length; i++) { name = name.concat(nameArray[i]); } } return name; } } public static List<String> genReturnList(String success, String message) { List<String> returnList = new ArrayList<String>(2); returnList.add(0, success); returnList.add(1, message); return returnList; } public static void printError(String message) { System.out.println(message); System.exit(1); } public static String getDatabaseValueString(String selectSql, String name, String errorMsg) { Transaction txn = Transaction.open("getDatabaseValueString"); PreparedStatement stmt = null; try { stmt = txn.prepareAutoCloseStatement(selectSql); ResultSet rs = stmt.executeQuery(); if (rs.next()) { String value = rs.getString(name); return value; } else { return null; } } catch (SQLException e) { System.out.println("Exception: " + e.getMessage()); printError(errorMsg); } finally { txn.close(); } return null; } public static long getDatabaseValueLong(String selectSql, String name, String errorMsg) { Transaction txn = Transaction.open("getDatabaseValueLong"); PreparedStatement stmt = null; try { stmt = txn.prepareAutoCloseStatement(selectSql); ResultSet rs = stmt.executeQuery(); if (rs.next()) { return rs.getLong(name); } else { return -1; } } catch (SQLException e) { System.out.println("Exception: " + e.getMessage()); printError(errorMsg); } finally { txn.close(); } return -1; } public static void saveSQL(String sql, String errorMsg) { Transaction txn = Transaction.open("saveSQL"); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(sql); stmt.executeUpdate(); } catch (SQLException ex) { System.out.println("SQL Exception: " + ex.getMessage()); printError(errorMsg); } finally { txn.close(); } } }