| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with 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. |
| package com.cloud.test; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.URISyntaxException; |
| 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 com.cloud.host.Status; |
| import com.cloud.service.ServiceOfferingVO; |
| import com.cloud.service.dao.ServiceOfferingDaoImpl; |
| import com.cloud.storage.DiskOfferingVO; |
| import com.cloud.storage.Storage.ProvisioningType; |
| import com.cloud.storage.dao.DiskOfferingDaoImpl; |
| import com.cloud.utils.DateUtil; |
| import com.cloud.utils.PropertiesUtil; |
| import com.cloud.utils.component.ComponentContext; |
| import com.cloud.utils.db.DB; |
| import com.cloud.utils.db.Transaction; |
| import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; |
| import com.cloud.utils.db.TransactionLegacy; |
| import com.cloud.utils.db.TransactionStatus; |
| import com.cloud.utils.net.NfsUtils; |
| import org.apache.cloudstack.utils.security.DigestHelper; |
| 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; |
| |
| 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 = ComponentContext.inject(IPRangeConfig.class); |
| |
| // Maintain a PodZoneConfig object to handle Pod/Zone related logic |
| private final PodZoneConfig pzc = ComponentContext.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.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("system.vm.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_configurationDescriptions.put("publish.action.events", "enable or disable to control the publishing of action events on the event bus"); |
| s_configurationDescriptions.put("publish.alert.events", "enable or disable to control the publishing of alert events on the event bus"); |
| s_configurationDescriptions.put("publish.resource.state.events", "enable or disable to control the publishing of resource state events on the event bus"); |
| s_configurationDescriptions.put("publish.usage.events", "enable or disable to control the publishing of usage events on the event bus"); |
| s_configurationDescriptions.put("publish.async.job.events", "enable or disable to control the publishing of async job events on the event bus"); |
| |
| 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("event.purge.interval", "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.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("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_configurationComponents.put("publish.action.events", "management-server"); |
| s_configurationComponents.put("publish.alert.events", "management-server"); |
| s_configurationComponents.put("publish.resource.state.events", "management-server"); |
| s_configurationComponents.put("publish.usage.events", "management-server"); |
| s_configurationComponents.put("publish.async.job.events", "management-server"); |
| |
| s_defaultConfigurationValues.put("host.stats.interval", "60000"); |
| s_defaultConfigurationValues.put("storage.stats.interval", "60000"); |
| s_defaultConfigurationValues.put("volume.stats.interval", "60000"); |
| 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("event.purge.interval", "86400"); |
| s_defaultConfigurationValues.put("account.cleanup.interval", "86400"); |
| s_defaultConfigurationValues.put("system.vm.use.local.storage", "false"); |
| s_defaultConfigurationValues.put("init", "false"); |
| s_defaultConfigurationValues.put("cpu.overprovisioning.factor", "1"); |
| s_defaultConfigurationValues.put("mem.overprovisioning.factor", "1"); |
| s_defaultConfigurationValues.put("publish.action.events", "true"); |
| s_defaultConfigurationValues.put("publish.alert.events", "true"); |
| s_defaultConfigurationValues.put("publish.resource.state.events", "true"); |
| s_defaultConfigurationValues.put("publish.usage.events", "true"); |
| s_defaultConfigurationValues.put("publish.async.job.events", "true"); |
| } |
| |
| 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 = ComponentContext.inject(DatabaseConfig.class); |
| 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() { |
| try { |
| final File configFile = new File(_configFileName); |
| |
| SAXParserFactory spfactory = SAXParserFactory.newInstance(); |
| final SAXParser saxParser = spfactory.newSAXParser(); |
| final DbConfigXMLHandler handler = new DbConfigXMLHandler(); |
| handler.setParent(this); |
| |
| Transaction.execute(new TransactionCallbackWithExceptionNoReturn<Exception>() { |
| @Override |
| public void doInTransactionWithoutResult(TransactionStatus status) throws Exception { |
| // Save user configured values for all fields |
| saxParser.parse(configFile, handler); |
| |
| // Save default values for configuration fields |
| saveVMTemplate(); |
| saveRootDomain(); |
| saveDefaultConfiguations(); |
| } |
| }); |
| |
| // 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); |
| } |
| } |
| |
| 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(?, ?)"; |
| TransactionLegacy txn = TransactionLegacy.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") || url.startsWith("cifs")) { |
| 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 (?,?,?,?,?,?,?)"; |
| |
| TransactionLegacy txn = TransactionLegacy.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 (?,?,?)"; |
| |
| TransactionLegacy txn = TransactionLegacy.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(DateUtil.currentGMTTime().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 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; |
| |
| TransactionLegacy txn = TransactionLegacy.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 (?,?,?,?,?)"; |
| |
| TransactionLegacy txn = TransactionLegacy.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.equals("")) { |
| 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.equals("")) { |
| 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"); |
| ProvisioningType provisioningType = ProvisioningType.valueOf(_currentObjectParams.get("provisioningType")); |
| 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, |
| provisioningType, useLocalStorage, false, null, false, null, false); |
| |
| Long bytesReadRate = Long.parseLong(_currentObjectParams.get("bytesReadRate")); |
| if ((bytesReadRate != null) && (bytesReadRate > 0)) |
| serviceOffering.setBytesReadRate(bytesReadRate); |
| Long bytesWriteRate = Long.parseLong(_currentObjectParams.get("bytesWriteRate")); |
| if ((bytesWriteRate != null) && (bytesWriteRate > 0)) |
| serviceOffering.setBytesWriteRate(bytesWriteRate); |
| Long iopsReadRate = Long.parseLong(_currentObjectParams.get("iopsReadRate")); |
| if ((iopsReadRate != null) && (iopsReadRate > 0)) |
| serviceOffering.setIopsReadRate(iopsReadRate); |
| Long iopsWriteRate = Long.parseLong(_currentObjectParams.get("iopsWriteRate")); |
| if ((iopsWriteRate != null) && (iopsWriteRate > 0)) |
| serviceOffering.setIopsWriteRate(iopsWriteRate); |
| |
| ServiceOfferingDaoImpl dao = ComponentContext.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"); |
| ProvisioningType provisioningType = ProvisioningType.valueOf(_currentObjectParams.get("provisioningtype")); |
| 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, provisioningType, diskSpace, tags, false, null, null, null); |
| diskOffering.setUseLocalStorage(local); |
| |
| Long bytesReadRate = Long.parseLong(_currentObjectParams.get("bytesReadRate")); |
| if (bytesReadRate != null && (bytesReadRate > 0)) |
| diskOffering.setBytesReadRate(bytesReadRate); |
| Long bytesWriteRate = Long.parseLong(_currentObjectParams.get("bytesWriteRate")); |
| if (bytesWriteRate != null && (bytesWriteRate > 0)) |
| diskOffering.setBytesWriteRate(bytesWriteRate); |
| Long iopsReadRate = Long.parseLong(_currentObjectParams.get("iopsReadRate")); |
| if (iopsReadRate != null && (iopsReadRate > 0)) |
| diskOffering.setIopsReadRate(iopsReadRate); |
| Long iopsWriteRate = Long.parseLong(_currentObjectParams.get("iopsWriteRate")); |
| if (iopsWriteRate != null && (iopsWriteRate > 0)) |
| diskOffering.setIopsWriteRate(iopsWriteRate); |
| |
| DiskOfferingDaoImpl offering = ComponentContext.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` = ?"; |
| |
| TransactionLegacy txn = TransactionLegacy.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 |
| final String insertSystemAccount = "INSERT INTO `cloud`.`account` (id, account_name, type, domain_id) VALUES (1, 'system', '1', '1')"; |
| TransactionLegacy txn = TransactionLegacy.currentTxn(); |
| try { |
| PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSystemAccount); |
| stmt.executeUpdate(); |
| } catch (SQLException ex) { |
| s_logger.error("error creating system account", ex); |
| } |
| |
| // insert system user |
| final String insertSystemUser = |
| "INSERT INTO `cloud`.`user` (id, username, password, account_id, firstname, lastname, created)" |
| + " VALUES (1, 'system', RAND(), 1, 'system', 'cloud', now())"; |
| txn = TransactionLegacy.currentTxn(); |
| try { |
| PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSystemUser); |
| 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."); |
| } |
| |
| String algorithm = "MD5"; |
| String pwDigest; |
| try { |
| pwDigest = DigestHelper.getPaddedDigest(algorithm, password); |
| } catch (NoSuchAlgorithmException e) { |
| s_logger.error("error saving user", e); |
| return; |
| } |
| |
| // create an account for the admin user first |
| final String insertAdminAccount = "INSERT INTO `cloud`.`account` (id, account_name, type, domain_id) VALUES (?, ?, '1', '1')"; |
| txn = TransactionLegacy.currentTxn(); |
| try { |
| PreparedStatement stmt = txn.prepareAutoCloseStatement(insertAdminAccount); |
| stmt.setLong(1, id); |
| stmt.setString(2, username); |
| stmt.executeUpdate(); |
| } catch (SQLException ex) { |
| s_logger.error("error creating account", ex); |
| } |
| |
| // now insert the user |
| final String insertUser = |
| "INSERT INTO `cloud`.`user` (id, username, password, account_id, firstname, lastname, email, created) " + "VALUES (?,?,?, 2, ?,?,?,now())"; |
| txn = TransactionLegacy.currentTxn(); |
| try { |
| PreparedStatement stmt = txn.prepareAutoCloseStatement(insertUser); |
| stmt.setLong(1, id); |
| stmt.setString(2, username); |
| stmt.setString(3, pwDigest); |
| stmt.setString(4, firstname); |
| stmt.setString(5, lastname); |
| stmt.setString(6, email); |
| 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 (?,?,?,?,?,?)"; |
| String selectSql = "SELECT name FROM cloud.configuration WHERE name = ?"; |
| |
| TransactionLegacy txn = TransactionLegacy.currentTxn(); |
| try { |
| PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql); |
| stmt.setString(1, name); |
| ResultSet result = stmt.executeQuery(); |
| Boolean hasRow = result.next(); |
| if (!hasRow) { |
| stmt = txn.prepareAutoCloseStatement(insertSql); |
| stmt.setString(1, instance); |
| stmt.setString(2, component); |
| stmt.setString(3, name); |
| stmt.setString(4, value); |
| stmt.setString(5, description); |
| stmt.setString(6, category); |
| 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)"; |
| TransactionLegacy txn = TransactionLegacy.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) { |
| TransactionLegacy txn = TransactionLegacy.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) { |
| TransactionLegacy txn = TransactionLegacy.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) { |
| TransactionLegacy txn = TransactionLegacy.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(); |
| } |
| } |
| |
| } |