mirror of https://github.com/apache/cloudstack.git
2382 lines
116 KiB
Java
2382 lines
116 KiB
Java
// 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.upgrade.dao;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.io.StringReader;
|
|
import java.sql.Connection;
|
|
import java.sql.PreparedStatement;
|
|
import java.sql.ResultSet;
|
|
import java.sql.SQLException;
|
|
import java.sql.Statement;
|
|
import java.sql.Types;
|
|
import java.util.ArrayList;
|
|
import java.util.Date;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Properties;
|
|
import java.util.TimeZone;
|
|
import java.util.UUID;
|
|
|
|
import org.apache.log4j.Logger;
|
|
|
|
import com.cloud.configuration.Resource.ResourceType;
|
|
import com.cloud.consoleproxy.ConsoleProxyManager;
|
|
import com.cloud.event.EventTypes;
|
|
import com.cloud.event.EventVO;
|
|
import com.cloud.event.UsageEventVO;
|
|
import com.cloud.network.router.VirtualNetworkApplianceManager;
|
|
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
|
import com.cloud.utils.DateUtil;
|
|
import com.cloud.utils.NumbersUtil;
|
|
import com.cloud.utils.exception.CloudRuntimeException;
|
|
import com.cloud.utils.net.NetUtils;
|
|
import com.cloud.utils.script.Script;
|
|
|
|
public class Upgrade218to22 implements DbUpgrade {
|
|
final static Logger s_logger = Logger.getLogger(Upgrade218to22.class);
|
|
boolean _basicZone;
|
|
|
|
@Override
|
|
public File[] getPrepareScripts() {
|
|
String file = Script.findScript("", "db/schema-21to22.sql");
|
|
if (file == null) {
|
|
throw new CloudRuntimeException("Unable to find the upgrade script, schema-21to22.sql");
|
|
}
|
|
|
|
return new File[] { new File(file) };
|
|
}
|
|
|
|
protected void upgradeStoragePools(Connection conn) {
|
|
PreparedStatement pstmt;
|
|
try {
|
|
pstmt = conn.prepareStatement("UPDATE storage_pool SET status='Up'");
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Can't upgrade storage pool ", e);
|
|
}
|
|
}
|
|
|
|
protected long insertNetworkOffering(Connection conn, String name, String displayText, String trafficType, boolean systemOnly, boolean defaultNetworkOffering, String availability,
|
|
boolean dns_service, boolean gateway_service, boolean firewall_service, boolean lb_service, boolean userdata_service, boolean vpn_service, boolean dhcp_service) {
|
|
String insertSql = "INSERT INTO network_offerings (name, display_text, nw_rate, mc_rate, concurrent_connections, traffic_type, tags, system_only, specify_vlan, service_offering_id, created, removed, `default`, availability, dns_service, gateway_service, firewall_service, lb_service, userdata_service, vpn_service, dhcp_service) "
|
|
+ "VALUES (?, ?, NULL, NULL, NULL, ?, NULL, ?, 0, NULL, now(), NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
|
try {
|
|
PreparedStatement pstmt = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS);
|
|
int i = 1;
|
|
pstmt.setString(i++, name);
|
|
pstmt.setString(i++, displayText);
|
|
pstmt.setString(i++, trafficType);
|
|
pstmt.setBoolean(i++, systemOnly);
|
|
pstmt.setBoolean(i++, defaultNetworkOffering);
|
|
pstmt.setString(i++, availability);
|
|
pstmt.setBoolean(i++, dns_service);
|
|
pstmt.setBoolean(i++, gateway_service);
|
|
pstmt.setBoolean(i++, firewall_service);
|
|
pstmt.setBoolean(i++, lb_service);
|
|
pstmt.setBoolean(i++, userdata_service);
|
|
pstmt.setBoolean(i++, vpn_service);
|
|
pstmt.setBoolean(i++, dhcp_service);
|
|
pstmt.executeUpdate();
|
|
ResultSet rs = pstmt.getGeneratedKeys();
|
|
rs.next();
|
|
long id = rs.getLong(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
return id;
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Unable to insert network offering ", e);
|
|
}
|
|
}
|
|
|
|
protected void upgradeInstanceGroups(Connection conn) {
|
|
try {
|
|
|
|
// Create instance groups - duplicated names are allowed across accounts
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT DISTINCT v.group, v.account_id from vm_instance v where v.group is not null");
|
|
ResultSet rs = pstmt.executeQuery();
|
|
ArrayList<Object[]> groups = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] group = new Object[10];
|
|
group[0] = rs.getString(1); // group name
|
|
group[1] = rs.getLong(2); // accountId
|
|
groups.add(group);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
for (Object[] group : groups) {
|
|
String groupName = (String) group[0];
|
|
Long accountId = (Long) group[1];
|
|
createInstanceGroups(conn, groupName, accountId);
|
|
}
|
|
|
|
// update instance_group_vm_map
|
|
pstmt = conn.prepareStatement("SELECT g.id, v.id from vm_instance v, instance_group g where g.name=v.group and g.account_id=v.account_id and v.group is not null");
|
|
rs = pstmt.executeQuery();
|
|
ArrayList<Object[]> groupVmMaps = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] groupMaps = new Object[10];
|
|
groupMaps[0] = rs.getLong(1); // vmId
|
|
groupMaps[1] = rs.getLong(2); // groupId
|
|
groupVmMaps.add(groupMaps);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
for (Object[] groupMap : groupVmMaps) {
|
|
Long groupId = (Long) groupMap[0];
|
|
Long instanceId = (Long) groupMap[1];
|
|
createInstanceGroupVmMaps(conn, groupId, instanceId);
|
|
}
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Can't update instance groups ", e);
|
|
}
|
|
|
|
}
|
|
|
|
protected void createInstanceGroups(Connection conn, String groupName, long accountId) throws SQLException {
|
|
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO instance_group (account_id, name, created) values (?, ?, now()) ");
|
|
pstmt.setLong(1, accountId);
|
|
pstmt.setString(2, groupName);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
|
|
protected void createInstanceGroupVmMaps(Connection conn, long groupId, long instanceId) throws SQLException {
|
|
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO instance_group_vm_map (group_id, instance_id) values (?, ?) ");
|
|
pstmt.setLong(1, groupId);
|
|
pstmt.setLong(2, instanceId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
|
|
protected long insertNic(Connection conn, long networkId, long instanceId, boolean running, String macAddress, String ipAddress, String netmask, String strategy, String gateway, String vnet,
|
|
String guru, boolean defNic, int deviceId, String mode, String reservationId) throws SQLException {
|
|
PreparedStatement pstmt = conn
|
|
.prepareStatement(
|
|
"INSERT INTO nics (instance_id, network_id, mac_address, ip4_address, netmask, strategy, ip_type, broadcast_uri, mode, reserver_name, reservation_id, device_id, update_time, isolation_uri, ip6_address, default_nic, created, removed, state, gateway) "
|
|
+ "VALUES (?, ?, ?, ?, ?, ?, 'Ip4', ?, ?, ?, ?, ?, now(), ?, NULL, ?, now(), NULL, ?, ?)",
|
|
Statement.RETURN_GENERATED_KEYS);
|
|
int i = 1;
|
|
String isolationUri = null;
|
|
|
|
String broadcast = null;
|
|
if (vnet != null) {
|
|
broadcast = "vlan://" + vnet;
|
|
if (vnet.equalsIgnoreCase("untagged")) {
|
|
isolationUri = "ec2://" + vnet;
|
|
} else {
|
|
isolationUri = broadcast;
|
|
}
|
|
}
|
|
pstmt.setLong(i++, instanceId);
|
|
pstmt.setLong(i++, networkId);
|
|
pstmt.setString(i++, macAddress);
|
|
pstmt.setString(i++, ipAddress);
|
|
pstmt.setString(i++, netmask);
|
|
pstmt.setString(i++, strategy);
|
|
pstmt.setString(i++, broadcast);
|
|
pstmt.setString(i++, mode);
|
|
pstmt.setString(i++, guru);
|
|
pstmt.setString(i++, reservationId);
|
|
pstmt.setInt(i++, deviceId);
|
|
pstmt.setString(i++, isolationUri);
|
|
pstmt.setBoolean(i++, defNic);
|
|
pstmt.setString(i++, running ? "Reserved" : "Allocated");
|
|
pstmt.setString(i++, gateway);
|
|
pstmt.executeUpdate();
|
|
ResultSet rs = pstmt.getGeneratedKeys();
|
|
long nicId = 0;
|
|
if (!rs.next()) {
|
|
throw new CloudRuntimeException("Unable to get id for nic");
|
|
}
|
|
nicId = rs.getLong(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
return nicId;
|
|
}
|
|
|
|
protected void upgradeDomR(Connection conn, long dcId, long domrId, Long publicNetworkId, long guestNetworkId, long controlNetworkId, String zoneType, String vnet) throws SQLException {
|
|
s_logger.debug("Upgrading domR" + domrId);
|
|
PreparedStatement pstmt = conn
|
|
.prepareStatement("SELECT vm_instance.id, vm_instance.state, vm_instance.private_mac_address, vm_instance.private_ip_address, vm_instance.private_netmask, domain_router.public_mac_address, domain_router.public_ip_address, domain_router.public_netmask, domain_router.guest_mac_address, domain_router.guest_ip_address, domain_router.guest_netmask, domain_router.vnet, domain_router.gateway FROM vm_instance INNER JOIN domain_router ON vm_instance.id=domain_router.id WHERE vm_instance.removed is NULL AND vm_instance.id=?");
|
|
pstmt.setLong(1, domrId);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
|
|
if (!rs.next()) {
|
|
throw new CloudRuntimeException("Unable to find router " + domrId);
|
|
}
|
|
|
|
// long id = rs.getLong(1);
|
|
String state = rs.getString(2);
|
|
boolean running = state.equals("Running") | state.equals("Starting") | state.equals("Stopping");
|
|
String privateMac = rs.getString(3);
|
|
String privateIp = rs.getString(4);
|
|
String privateNetmask = rs.getString(5);
|
|
String publicMac = rs.getString(6);
|
|
String publicIp = rs.getString(7);
|
|
String publicNetmask = rs.getString(8);
|
|
String guestMac = rs.getString(9);
|
|
String guestIp = rs.getString(10);
|
|
String guestNetmask = rs.getString(11);
|
|
String gateway = rs.getString(13);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("SELECT v.vlan_id from vlan v, user_ip_address u where v.id=u.vlan_db_id and u.public_ip_address=?");
|
|
pstmt.setString(1, publicIp);
|
|
rs = pstmt.executeQuery();
|
|
|
|
String publicVlan = null;
|
|
while (rs.next()) {
|
|
publicVlan = rs.getString(1);
|
|
}
|
|
|
|
// Control nic is the same for all types of networks
|
|
long controlNicId = insertNic(conn, controlNetworkId, domrId, running, privateMac, privateIp, privateNetmask, "Start", "169.254.0.1", null, "ControlNetworkGuru", false, 1, "Static",
|
|
privateIp != null ? (domrId + privateIp) : null);
|
|
if (privateIp != null) {
|
|
pstmt = conn.prepareStatement("UPDATE op_dc_link_local_ip_address_alloc SET instance_id=? WHERE ip_address=? AND data_center_id=?");
|
|
pstmt.setLong(1, controlNicId);
|
|
pstmt.setString(2, privateIp);
|
|
pstmt.setLong(3, dcId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
|
|
if (zoneType.equalsIgnoreCase("Basic")) {
|
|
insertNic(conn, guestNetworkId, domrId, running, guestMac, guestIp, guestNetmask, "Create", gateway, vnet, "DirectPodBasedNetworkGuru", true, 0, "Dhcp", null);
|
|
} else if (publicIp != null) {
|
|
// update virtual domR
|
|
insertNic(conn, publicNetworkId, domrId, running, publicMac, publicIp, publicNetmask, "Create", gateway, publicVlan, "PublicNetworkGuru", true, 2, "Static", null);
|
|
insertNic(conn, guestNetworkId, domrId, running, guestMac, guestIp, guestNetmask, "Start", null, vnet, "ExternalGuestNetworkGuru", false, 0, "Dhcp", null);
|
|
} else {
|
|
// update direct domR - dhcp case
|
|
insertNic(conn, guestNetworkId, domrId, running, guestMac, guestIp, guestNetmask, "Create", gateway, vnet, "DirectNetworkGuru", true, 0, "Dhcp", null);
|
|
}
|
|
|
|
}
|
|
|
|
protected void upgradeSsvm(Connection conn, long dataCenterId, long publicNetworkId, long managementNetworkId, long controlNetworkId, String zoneType) throws SQLException {
|
|
s_logger.debug("Upgrading ssvm in " + dataCenterId);
|
|
PreparedStatement pstmt = conn
|
|
.prepareStatement("SELECT vm_instance.id, vm_instance.state, vm_instance.private_mac_address, vm_instance.private_ip_address, vm_instance.private_netmask, secondary_storage_vm.public_mac_address, secondary_storage_vm.public_ip_address, secondary_storage_vm.public_netmask, secondary_storage_vm.guest_mac_address, secondary_storage_vm.guest_ip_address, secondary_storage_vm.guest_netmask, secondary_storage_vm.gateway, vm_instance.type FROM vm_instance INNER JOIN secondary_storage_vm ON vm_instance.id=secondary_storage_vm.id WHERE vm_instance.removed is NULL AND vm_instance.data_center_id=? AND vm_instance.type='SecondaryStorageVm'");
|
|
pstmt.setLong(1, dataCenterId);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
|
|
if (!rs.next()) {
|
|
s_logger.debug("Unable to find ssvm in data center " + dataCenterId);
|
|
return;
|
|
}
|
|
|
|
long ssvmId = rs.getLong(1);
|
|
String state = rs.getString(2);
|
|
boolean running = state.equals("Running") | state.equals("Starting") | state.equals("Stopping");
|
|
String privateMac = rs.getString(3);
|
|
String privateIp = rs.getString(4);
|
|
String privateNetmask = rs.getString(5);
|
|
String publicMac = rs.getString(6);
|
|
String publicIp = rs.getString(7);
|
|
String publicNetmask = rs.getString(8);
|
|
String guestMac = rs.getString(9);
|
|
String guestIp = rs.getString(10);
|
|
String guestNetmask = rs.getString(11);
|
|
String gateway = rs.getString(12);
|
|
String type = rs.getString(13);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn
|
|
.prepareStatement("SELECT host_pod_ref.gateway from host_pod_ref INNER JOIN vm_instance ON vm_instance.pod_id=host_pod_ref.id WHERE vm_instance.removed is NULL AND vm_instance.data_center_id=? AND vm_instance.type='SecondaryStorageVm'");
|
|
pstmt.setLong(1, dataCenterId);
|
|
rs = pstmt.executeQuery();
|
|
|
|
if (!rs.next()) {
|
|
s_logger.debug("Unable to find ssvm in data center " + dataCenterId);
|
|
return;
|
|
}
|
|
|
|
String podGateway = rs.getString(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("SELECT v.vlan_id from vlan v, user_ip_address u where v.id=u.vlan_db_id and u.public_ip_address=?");
|
|
pstmt.setString(1, publicIp);
|
|
rs = pstmt.executeQuery();
|
|
|
|
String publicVlan = null;
|
|
while (rs.next()) {
|
|
publicVlan = rs.getString(1);
|
|
}
|
|
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
if (zoneType.equalsIgnoreCase("Basic")) {
|
|
insertNic(conn, publicNetworkId, ssvmId, running, publicMac, publicIp, publicNetmask, "Create", gateway, publicVlan, "DirectPodBasedNetworkGuru", true, 2, "Dhcp", null);
|
|
|
|
} else {
|
|
insertNic(conn, publicNetworkId, ssvmId, running, publicMac, publicIp, publicNetmask, "Create", gateway, publicVlan, "PublicNetworkGuru", true, 2, "Static", null);
|
|
}
|
|
|
|
long controlNicId = insertNic(conn, controlNetworkId, ssvmId, running, guestMac, guestIp, guestNetmask, "Start", "169.254.0.1", null, "ControlNetworkGuru", false, 0, "Static",
|
|
guestIp != null ? (ssvmId + guestIp) : null);
|
|
if (guestIp != null) {
|
|
pstmt = conn.prepareStatement("UPDATE op_dc_link_local_ip_address_alloc SET instance_id=? WHERE ip_address=? AND data_center_id=?");
|
|
pstmt.setLong(1, controlNicId);
|
|
pstmt.setString(2, guestIp);
|
|
pstmt.setLong(3, dataCenterId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
|
|
long mgmtNicId = insertNic(conn, managementNetworkId, ssvmId, running, privateMac, privateIp, privateNetmask, "Start", podGateway, null, "PodBasedNetworkGuru", false, 1, "Static", null);
|
|
if (privateIp != null) {
|
|
pstmt = conn.prepareStatement("UPDATE op_dc_ip_address_alloc SET instance_id=? WHERE ip_address=? AND data_center_id=?");
|
|
pstmt.setLong(1, mgmtNicId);
|
|
pstmt.setString(2, privateIp);
|
|
pstmt.setLong(3, dataCenterId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
}
|
|
|
|
protected void upgradeConsoleProxy(Connection conn, long dcId, long cpId, long publicNetworkId, long managementNetworkId, long controlNetworkId, String zoneType) throws SQLException {
|
|
s_logger.debug("Upgrading cp" + cpId);
|
|
PreparedStatement pstmt = conn
|
|
.prepareStatement("SELECT vm_instance.id, vm_instance.state, vm_instance.private_mac_address, vm_instance.private_ip_address, vm_instance.private_netmask, console_proxy.public_mac_address, console_proxy.public_ip_address, console_proxy.public_netmask, console_proxy.guest_mac_address, console_proxy.guest_ip_address, console_proxy.guest_netmask, console_proxy.gateway, vm_instance.type FROM vm_instance INNER JOIN console_proxy ON vm_instance.id=console_proxy.id WHERE vm_instance.removed is NULL AND vm_instance.id=?");
|
|
pstmt.setLong(1, cpId);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
|
|
if (!rs.next()) {
|
|
throw new CloudRuntimeException("Unable to find cp " + cpId);
|
|
}
|
|
|
|
long id = rs.getLong(1);
|
|
String state = rs.getString(2);
|
|
boolean running = state.equals("Running") | state.equals("Starting") | state.equals("Stopping");
|
|
String privateMac = rs.getString(3);
|
|
String privateIp = rs.getString(4);
|
|
String privateNetmask = rs.getString(5);
|
|
String publicMac = rs.getString(6);
|
|
String publicIp = rs.getString(7);
|
|
String publicNetmask = rs.getString(8);
|
|
String guestMac = rs.getString(9);
|
|
String guestIp = rs.getString(10);
|
|
String guestNetmask = rs.getString(11);
|
|
String gateway = rs.getString(12);
|
|
String type = rs.getString(13);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("SELECT host_pod_ref.gateway from host_pod_ref INNER JOIN vm_instance ON vm_instance.pod_id=host_pod_ref.id WHERE vm_instance.id=?");
|
|
pstmt.setLong(1, cpId);
|
|
rs = pstmt.executeQuery();
|
|
|
|
if (!rs.next()) {
|
|
throw new CloudRuntimeException("Unable to find cp " + cpId);
|
|
}
|
|
|
|
String podGateway = rs.getString(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("SELECT v.vlan_id from vlan v, user_ip_address u where v.id=u.vlan_db_id and u.public_ip_address=?");
|
|
pstmt.setString(1, publicIp);
|
|
rs = pstmt.executeQuery();
|
|
|
|
String publicVlan = null;
|
|
while (rs.next()) {
|
|
publicVlan = rs.getString(1);
|
|
}
|
|
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
if (zoneType.equalsIgnoreCase("Basic")) {
|
|
insertNic(conn, publicNetworkId, cpId, running, publicMac, publicIp, publicNetmask, "Create", gateway, publicVlan, "DirectPodBasedNetworkGuru", true, 2, "Dhcp", null);
|
|
} else {
|
|
insertNic(conn, publicNetworkId, cpId, running, publicMac, publicIp, publicNetmask, "Create", gateway, publicVlan, "PublicNetworkGuru", true, 2, "Static", null);
|
|
}
|
|
|
|
long controlNicId = insertNic(conn, controlNetworkId, cpId, running, guestMac, guestIp, guestNetmask, "Start", "169.254.0.1", null, "ControlNetworkGuru", false, 0, "Static",
|
|
guestIp != null ? (cpId + guestIp) : null);
|
|
if (guestIp != null) {
|
|
pstmt = conn.prepareStatement("UPDATE op_dc_link_local_ip_address_alloc SET instance_id=? WHERE ip_address=? AND data_center_id=?");
|
|
pstmt.setLong(1, controlNicId);
|
|
pstmt.setString(2, guestIp);
|
|
pstmt.setLong(3, dcId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
long mgmtNicId = insertNic(conn, managementNetworkId, cpId, running, privateMac, privateIp, privateNetmask, "Start", podGateway, null, "PodBasedNetworkGuru", false, 1, "Static",
|
|
privateIp != null ? (cpId + privateIp) : null);
|
|
if (privateIp != null) {
|
|
pstmt = conn.prepareStatement("UPDATE op_dc_ip_address_alloc SET instance_id=? WHERE ip_address=? AND data_center_id=?");
|
|
pstmt.setLong(1, mgmtNicId);
|
|
pstmt.setString(2, privateIp);
|
|
pstmt.setLong(3, dcId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
}
|
|
|
|
protected void upgradeUserVms(Connection conn, long domainRouterId, long networkId, String gateway, String vnet, String guruName, String strategy) throws SQLException {
|
|
PreparedStatement pstmt = conn
|
|
.prepareStatement("SELECT vm_instance.id, vm_instance.private_mac_address, vm_instance.private_ip_address, vm_instance.private_netmask, vm_instance.state, vm_instance.type FROM vm_instance INNER JOIN user_vm ON vm_instance.id=user_vm.id WHERE user_vm.domain_router_id=? and vm_instance.removed IS NULL");
|
|
pstmt.setLong(1, domainRouterId);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
List<Object[]> vms = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] vm = new Object[10];
|
|
vm[0] = rs.getLong(1); // vm id
|
|
vm[1] = rs.getString(2); // mac address
|
|
vm[2] = rs.getString(3); // ip address
|
|
vm[3] = rs.getString(4); // netmask
|
|
vm[4] = rs.getString(5); // vm state
|
|
vms.add(vm);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
s_logger.debug("Upgrading " + vms.size() + " vms for router " + domainRouterId);
|
|
|
|
int count = 0;
|
|
for (Object[] vm : vms) {
|
|
String state = (String) vm[4];
|
|
|
|
boolean running = false;
|
|
if (state.equals("Running") || state.equals("Starting") || state.equals("Stopping")) {
|
|
running = true;
|
|
count++;
|
|
}
|
|
|
|
insertNic(conn, networkId, (Long) vm[0], running, (String) vm[1], (String) vm[2], (String) vm[3], strategy, gateway, vnet, guruName, true, 0, "Dhcp", null);
|
|
}
|
|
|
|
pstmt = conn.prepareStatement("SELECT state FROM vm_instance WHERE id=?");
|
|
pstmt.setLong(1, domainRouterId);
|
|
rs = pstmt.executeQuery();
|
|
rs.next();
|
|
String state = rs.getString(1);
|
|
if (state.equals("Running") || state.equals("Starting") || state.equals("Stopping")) {
|
|
count++;
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
Long originalNicsCount = 0L;
|
|
pstmt = conn.prepareStatement("SELECT nics_count from op_networks where id=?");
|
|
pstmt.setLong(1, networkId);
|
|
ResultSet originalCountRs = pstmt.executeQuery();
|
|
|
|
if (originalCountRs.next()) {
|
|
originalNicsCount = originalCountRs.getLong(1);
|
|
}
|
|
|
|
Long resultCount = originalNicsCount + count;
|
|
originalCountRs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("UPDATE op_networks SET nics_count=?, check_for_gc=? WHERE id=?");
|
|
pstmt.setLong(1, resultCount);
|
|
if (count == 0) {
|
|
pstmt.setBoolean(2, false);
|
|
} else {
|
|
pstmt.setBoolean(2, true);
|
|
}
|
|
pstmt.setLong(3, networkId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
|
|
protected long insertNetwork(Connection conn, String name, String displayText, String trafficType, String broadcastDomainType, String broadcastUri, String gateway, String cidr, String mode,
|
|
long networkOfferingId, long dataCenterId, String guruName, String state, long domainId, long accountId, String dns1, String dns2, String guestType, boolean shared, String networkDomain,
|
|
boolean isDefault, String reservationId) {
|
|
String getNextNetworkSequenceSql = "SELECT value from sequence where name='networks_seq'";
|
|
String advanceNetworkSequenceSql = "UPDATE sequence set value=value+1 where name='networks_seq'";
|
|
String insertNetworkSql = "INSERT INTO networks(id, name, display_text, traffic_type, broadcast_domain_type, gateway, cidr, mode, network_offering_id, data_center_id, guru_name, state, domain_id, account_id, dns1, dns2, guest_type, shared, is_default, created, network_domain, related, reservation_id, broadcast_uri) "
|
|
+ "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, now(), ?, ?, ?, ?)";
|
|
try {
|
|
PreparedStatement pstmt = conn.prepareStatement(getNextNetworkSequenceSql);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
rs.next();
|
|
long seq = rs.getLong(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement(advanceNetworkSequenceSql);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement(insertNetworkSql);
|
|
int i = 1;
|
|
pstmt.setLong(i++, seq);
|
|
pstmt.setString(i++, name);
|
|
pstmt.setString(i++, displayText);
|
|
pstmt.setString(i++, trafficType);
|
|
pstmt.setString(i++, broadcastDomainType);
|
|
pstmt.setString(i++, gateway);
|
|
pstmt.setString(i++, cidr);
|
|
pstmt.setString(i++, mode);
|
|
pstmt.setLong(i++, networkOfferingId);
|
|
pstmt.setLong(i++, dataCenterId);
|
|
pstmt.setString(i++, guruName);
|
|
pstmt.setString(i++, state);
|
|
pstmt.setLong(i++, domainId);
|
|
pstmt.setLong(i++, accountId);
|
|
pstmt.setString(i++, dns1);
|
|
pstmt.setString(i++, dns2);
|
|
pstmt.setString(i++, guestType);
|
|
pstmt.setBoolean(i++, shared);
|
|
pstmt.setBoolean(i++, isDefault);
|
|
pstmt.setString(i++, networkDomain);
|
|
pstmt.setLong(i++, seq);
|
|
pstmt.setString(i++, reservationId);
|
|
pstmt.setString(i++, broadcastUri);
|
|
pstmt.executeUpdate();
|
|
|
|
pstmt = conn.prepareStatement("INSERT INTO op_networks(id, mac_address_seq, nics_count, gc, check_for_gc) VALUES(?, ?, ?, ?, ?)");
|
|
pstmt.setLong(1, seq);
|
|
pstmt.setLong(2, 0);
|
|
pstmt.setLong(3, 0);
|
|
if (trafficType.equals("Guest")) {
|
|
pstmt.setBoolean(4, true);
|
|
} else {
|
|
pstmt.setBoolean(4, false);
|
|
}
|
|
pstmt.setBoolean(5, false);
|
|
pstmt.executeUpdate();
|
|
|
|
pstmt = conn.prepareStatement("INSERT INTO account_network_ref (account_id, network_id, is_owner) VALUES (?, ?, 1)");
|
|
pstmt.setLong(1, accountId);
|
|
pstmt.setLong(2, seq);
|
|
pstmt.executeUpdate();
|
|
|
|
return seq;
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Unable to create network", e);
|
|
}
|
|
}
|
|
|
|
protected void upgradeManagementIpAddress(Connection conn, long dcId) throws SQLException {
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT op_dc_ip_address_alloc.id FROM op_dc_ip_address_alloc WHERE data_center_id=?");
|
|
pstmt.setLong(1, dcId);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
ArrayList<Object[]> allocatedIps = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] ip = new Object[10];
|
|
ip[0] = rs.getLong(1); // id
|
|
allocatedIps.add(ip);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
for (Object[] allocatedIp : allocatedIps) {
|
|
pstmt = conn.prepareStatement("SELECT mac_address FROM data_center WHERE id = ?");
|
|
pstmt.setLong(1, dcId);
|
|
rs = pstmt.executeQuery();
|
|
if (!rs.next()) {
|
|
throw new CloudRuntimeException("Unable to get mac address for data center " + dcId);
|
|
}
|
|
long mac = rs.getLong(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("UPDATE data_center SET mac_address=mac_address+1 WHERE id = ?");
|
|
pstmt.setLong(1, dcId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("UPDATE op_dc_ip_address_alloc SET mac_address=? WHERE id=?");
|
|
pstmt.setLong(1, mac);
|
|
pstmt.setLong(2, (Long) allocatedIp[0]);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
|
|
}
|
|
|
|
protected void upgradeDirectUserIpAddress(Connection conn, long dcId, long networkId, String vlanType) throws SQLException {
|
|
s_logger.debug("Upgrading user ip address for data center " + dcId + " network " + networkId + " vlan type " + vlanType);
|
|
PreparedStatement pstmt = conn
|
|
.prepareStatement("UPDATE user_ip_address INNER JOIN vlan ON user_ip_address.vlan_db_id=vlan.id SET user_ip_address.source_network_id=vlan.network_id WHERE user_ip_address.data_center_id=? AND vlan.vlan_type=?");
|
|
pstmt.setLong(1, dcId);
|
|
pstmt.setString(2, vlanType);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
pstmt = conn
|
|
.prepareStatement("SELECT user_ip_address.id, user_ip_address.public_ip_address, user_ip_address.account_id, user_ip_address.allocated FROM user_ip_address INNER JOIN vlan ON vlan.id=user_ip_address.vlan_db_id WHERE user_ip_address.data_center_id = ? AND vlan.vlan_type=?");
|
|
pstmt.setLong(1, dcId);
|
|
pstmt.setString(2, vlanType);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
ArrayList<Object[]> allocatedIps = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] ip = new Object[10];
|
|
ip[0] = rs.getLong(1); // id
|
|
ip[1] = rs.getString(2); // ip address
|
|
ip[2] = rs.getLong(3); // account id
|
|
ip[3] = rs.getDate(4); // allocated
|
|
allocatedIps.add(ip);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
s_logger.debug("Marking " + allocatedIps.size() + " ip addresses to belong to network " + networkId);
|
|
s_logger.debug("Updating mac addresses for data center id=" + dcId + ". Found " + allocatedIps.size() + " ip addresses to update");
|
|
|
|
for (Object[] allocatedIp : allocatedIps) {
|
|
pstmt = conn.prepareStatement("SELECT mac_address FROM data_center WHERE id = ?");
|
|
pstmt.setLong(1, dcId);
|
|
rs = pstmt.executeQuery();
|
|
if (!rs.next()) {
|
|
throw new CloudRuntimeException("Unable to get mac address for data center " + dcId);
|
|
}
|
|
long mac = rs.getLong(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("UPDATE data_center SET mac_address=mac_address+1 WHERE id = ?");
|
|
pstmt.setLong(1, dcId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("UPDATE user_ip_address SET mac_address=? WHERE id=?");
|
|
pstmt.setLong(1, mac);
|
|
pstmt.setLong(2, (Long) allocatedIp[0]);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
}
|
|
|
|
protected void upgradePublicUserIpAddress(Connection conn, long dcId, long networkId, String vlanType) throws SQLException {
|
|
s_logger.debug("Upgrading user ip address for data center " + dcId + " network " + networkId + " vlan type " + vlanType);
|
|
PreparedStatement pstmt = conn
|
|
.prepareStatement("UPDATE user_ip_address INNER JOIN vlan ON user_ip_address.vlan_db_id=vlan.id SET source_network_id=? WHERE user_ip_address.data_center_id=? AND vlan.vlan_type=?");
|
|
pstmt.setLong(1, networkId);
|
|
pstmt.setLong(2, dcId);
|
|
pstmt.setString(3, vlanType);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("UPDATE vlan SET network_id = ? WHERE data_center_id=? AND vlan_type=?");
|
|
pstmt.setLong(1, networkId);
|
|
pstmt.setLong(2, dcId);
|
|
pstmt.setString(3, vlanType);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
pstmt = conn
|
|
.prepareStatement("SELECT user_ip_address.id, user_ip_address.public_ip_address, user_ip_address.account_id, user_ip_address.allocated FROM user_ip_address INNER JOIN vlan ON vlan.id=user_ip_address.vlan_db_id WHERE user_ip_address.data_center_id = ? AND vlan.vlan_type='VirtualNetwork'");
|
|
pstmt.setLong(1, dcId);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
ArrayList<Object[]> allocatedIps = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] ip = new Object[10];
|
|
ip[0] = rs.getLong(1); // id
|
|
ip[1] = rs.getString(2); // ip address
|
|
ip[2] = rs.getLong(3); // account id
|
|
ip[3] = rs.getDate(4); // allocated
|
|
allocatedIps.add(ip);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
for (Object[] allocatedIp : allocatedIps) {
|
|
pstmt = conn.prepareStatement("SELECT mac_address FROM data_center WHERE id = ?");
|
|
pstmt.setLong(1, dcId);
|
|
rs = pstmt.executeQuery();
|
|
if (!rs.next()) {
|
|
throw new CloudRuntimeException("Unable to get mac address for data center " + dcId);
|
|
}
|
|
long mac = rs.getLong(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("UPDATE data_center SET mac_address=mac_address+1 WHERE id = ?");
|
|
pstmt.setLong(1, dcId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
Long associatedNetworkId = null;
|
|
if (allocatedIp[3] != null && allocatedIp[2] != null) {
|
|
pstmt = conn.prepareStatement("SELECT id FROM networks WHERE data_center_id=? AND account_id=?");
|
|
pstmt.setLong(1, dcId);
|
|
pstmt.setLong(2, (Long) allocatedIp[2]);
|
|
rs = pstmt.executeQuery();
|
|
if (!rs.next()) {
|
|
throw new CloudRuntimeException("Unable to find a network for account " + allocatedIp[2] + " in dc " + dcId);
|
|
}
|
|
associatedNetworkId = rs.getLong(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
}
|
|
pstmt = conn.prepareStatement("UPDATE user_ip_address SET mac_address=?, network_id=? WHERE id=?");
|
|
pstmt.setLong(1, mac);
|
|
if (associatedNetworkId != null) {
|
|
pstmt.setLong(2, associatedNetworkId);
|
|
} else {
|
|
pstmt.setObject(2, null);
|
|
}
|
|
pstmt.setLong(3, (Long) allocatedIp[0]);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
|
|
}
|
|
|
|
protected void upgradeDataCenter(Connection conn) {
|
|
PreparedStatement pstmt;
|
|
try {
|
|
pstmt = conn.prepareStatement("SELECT value FROM configuration WHERE name='direct.attach.untagged.vlan.enabled'");
|
|
ResultSet rs = pstmt.executeQuery();
|
|
_basicZone = !rs.next() || Boolean.parseBoolean(rs.getString(1));
|
|
rs.close();
|
|
pstmt.close();
|
|
pstmt = conn
|
|
.prepareStatement("UPDATE data_center SET networktype=?, dns_provider=?, gateway_provider=?, firewall_provider=?, dhcp_provider=?, lb_provider=?, vpn_provider=?, userdata_provider=?");
|
|
if (_basicZone) {
|
|
pstmt.setString(1, "Basic");
|
|
pstmt.setString(2, "DhcpServer");
|
|
pstmt.setString(3, null);
|
|
pstmt.setString(4, null);
|
|
pstmt.setString(5, "DhcpServer");
|
|
pstmt.setString(6, null);
|
|
pstmt.setString(7, null);
|
|
pstmt.setString(8, "DhcpServer");
|
|
} else {
|
|
pstmt.setString(1, "Advanced");
|
|
pstmt.setString(2, "VirtualRouter");
|
|
pstmt.setString(3, "VirtualRouter");
|
|
pstmt.setString(4, "VirtualRouter");
|
|
pstmt.setString(5, "VirtualRouter");
|
|
pstmt.setString(6, "VirtualRouter");
|
|
pstmt.setString(7, "VirtualRouter");
|
|
pstmt.setString(8, "VirtualRouter");
|
|
}
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
// For basic zone vnet field should be NULL
|
|
|
|
if (_basicZone) {
|
|
pstmt = conn.prepareStatement("UPDATE data_center SET vnet=?, guest_network_cidr=?");
|
|
pstmt.setString(1, null);
|
|
pstmt.setString(2, null);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
|
|
pstmt = conn.prepareStatement("SELECT id, guest_network_cidr, domain FROM data_center");
|
|
rs = pstmt.executeQuery();
|
|
ArrayList<Object[]> dcs = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] dc = new Object[10];
|
|
dc[0] = rs.getLong(1); // data center id
|
|
dc[1] = rs.getString(2); // guest network cidr
|
|
dc[2] = rs.getString(3); // network domain
|
|
dcs.add(dc);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("SELECT id FROM network_offerings WHERE name='System-Management-Network'");
|
|
rs = pstmt.executeQuery();
|
|
if (!rs.next()) {
|
|
s_logger.error("Unable to find the management network offering.");
|
|
throw new CloudRuntimeException("Unable to find the management network offering.");
|
|
}
|
|
long managementNetworkOfferingId = rs.getLong(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("SELECT id FROM network_offerings WHERE name='System-Public-Network'");
|
|
rs = pstmt.executeQuery();
|
|
if (!rs.next()) {
|
|
s_logger.error("Unable to find the public network offering.");
|
|
throw new CloudRuntimeException("Unable to find the public network offering.");
|
|
}
|
|
long publicNetworkOfferingId = rs.getLong(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("SELECT id FROM network_offerings WHERE name='System-Control-Network'");
|
|
rs = pstmt.executeQuery();
|
|
if (!rs.next()) {
|
|
s_logger.error("Unable to find the control network offering.");
|
|
throw new CloudRuntimeException("Unable to find the control network offering.");
|
|
}
|
|
long controlNetworkOfferingId = rs.getLong(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("SELECT id FROM network_offerings WHERE name='System-Storage-Network'");
|
|
rs = pstmt.executeQuery();
|
|
if (!rs.next()) {
|
|
s_logger.error("Unable to find the storage network offering.");
|
|
throw new CloudRuntimeException("Unable to find the storage network offering.");
|
|
}
|
|
long storageNetworkOfferingId = rs.getLong(1);
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
if (_basicZone) {
|
|
for (Object[] dc : dcs) {
|
|
Long dcId = (Long) dc[0];
|
|
long mgmtNetworkId = insertNetwork(conn, "ManagementNetwork" + dcId, "Management Network created for Zone " + dcId, "Management", "Native", null, null, null, "Static",
|
|
managementNetworkOfferingId, dcId, "PodBasedNetworkGuru", "Setup", 1, 1, null, null, null, true, null, false, null);
|
|
long storageNetworkId = insertNetwork(conn, "StorageNetwork" + dcId, "Storage Network created for Zone " + dcId, "Storage", "Native", null, null, null, "Static",
|
|
storageNetworkOfferingId, dcId, "PodBasedNetworkGuru", "Setup", 1, 1, null, null, null, true, null, false, null);
|
|
long controlNetworkId = insertNetwork(conn, "ControlNetwork" + dcId, "Control Network created for Zone " + dcId, "Control", "LinkLocal", null, NetUtils.getLinkLocalGateway(),
|
|
NetUtils.getLinkLocalCIDR(), "Static", controlNetworkOfferingId, dcId, "ControlNetworkGuru", "Setup", 1, 1, null, null, null, true, null, false, null);
|
|
upgradeManagementIpAddress(conn, dcId);
|
|
long basicDefaultDirectNetworkId = insertNetwork(conn, "BasicZoneDirectNetwork" + dcId, "Basic Zone Direct Network created for Zone " + dcId, "Guest", "Native", null, null, null,
|
|
"Dhcp", 5, dcId, "DirectPodBasedNetworkGuru", "Setup", 1, 1, null, null, "Direct", true, null, true, null);
|
|
|
|
pstmt = conn.prepareStatement("SELECT id FROM vlan WHERE vlan_type='DirectAttached' AND data_center_id=?");
|
|
pstmt.setLong(1, dcId);
|
|
rs = pstmt.executeQuery();
|
|
while (rs.next()) {
|
|
long vlanId = rs.getLong(1);
|
|
|
|
pstmt = conn.prepareStatement("UPDATE vlan SET network_id=? WHERE id=?");
|
|
pstmt.setLong(1, basicDefaultDirectNetworkId);
|
|
pstmt.setLong(2, vlanId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
|
|
upgradeDirectUserIpAddress(conn, dcId, basicDefaultDirectNetworkId, "DirectAttached");
|
|
|
|
// update Dhcp servers information in domain_router and vm_instance tables; all domRs belong to the same
|
|
// network
|
|
pstmt = conn
|
|
.prepareStatement("SELECT vm_instance.id, vm_instance.domain_id, vm_instance.account_id, domain_router.gateway, domain_router.guest_ip_address, domain_router.domain, domain_router.dns1, domain_router.dns2, domain_router.vnet FROM vm_instance INNER JOIN domain_router ON vm_instance.id=domain_router.id WHERE vm_instance.removed IS NULL AND vm_instance.type='DomainRouter' AND vm_instance.data_center_id=?");
|
|
pstmt.setLong(1, dcId);
|
|
rs = pstmt.executeQuery();
|
|
ArrayList<Object[]> routers = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] router = new Object[40];
|
|
router[0] = rs.getLong(1); // router id
|
|
router[1] = rs.getString(4); // router gateway which is gonna be gateway for user vms
|
|
routers.add(router);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
for (Object[] router : routers) {
|
|
s_logger.debug("Updating domR with network id in basic zone id=" + dcId);
|
|
pstmt = conn.prepareStatement("UPDATE domain_router SET network_id = ? wHERE id = ? ");
|
|
pstmt.setLong(1, basicDefaultDirectNetworkId);
|
|
pstmt.setLong(2, (Long) router[0]);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
upgradeUserVms(conn, (Long) router[0], basicDefaultDirectNetworkId, (String) router[1], "untagged", "DirectPodBasedNetworkGuru", "Create");
|
|
upgradeDomR(conn, dcId, (Long) router[0], null, basicDefaultDirectNetworkId, controlNetworkId, "Basic", "untagged");
|
|
}
|
|
|
|
upgradeSsvm(conn, dcId, basicDefaultDirectNetworkId, mgmtNetworkId, controlNetworkId, "Basic");
|
|
|
|
pstmt = conn.prepareStatement("SELECT vm_instance.id FROM vm_instance WHERE removed IS NULL AND type='ConsoleProxy' AND data_center_id=?");
|
|
pstmt.setLong(1, dcId);
|
|
rs = pstmt.executeQuery();
|
|
while (rs.next()) {
|
|
upgradeConsoleProxy(conn, dcId, rs.getLong(1), basicDefaultDirectNetworkId, mgmtNetworkId, controlNetworkId, "Basic");
|
|
}
|
|
|
|
}
|
|
} else {
|
|
for (Object[] dc : dcs) {
|
|
Long dcId = (Long) dc[0];
|
|
long mgmtNetworkId = insertNetwork(conn, "ManagementNetwork" + dcId, "Management Network created for Zone " + dcId, "Management", "Native", null, null, null, "Static",
|
|
managementNetworkOfferingId, dcId, "PodBasedNetworkGuru", "Setup", 1, 1, null, null, null, true, null, false, null);
|
|
insertNetwork(conn, "StorageNetwork" + dcId, "Storage Network created for Zone " + dcId, "Storage", "Native", null, null, null, "Static", storageNetworkOfferingId, dcId,
|
|
"PodBasedNetworkGuru", "Setup", 1, 1, null, null, null, true, null, false, null);
|
|
long controlNetworkId = insertNetwork(conn, "ControlNetwork" + dcId, "Control Network created for Zone " + dcId, "Control", "Native", null, null, null, "Static",
|
|
controlNetworkOfferingId, dcId, "ControlNetworkGuru", "Setup", 1, 1, null, null, null, true, null, false, null);
|
|
upgradeManagementIpAddress(conn, dcId);
|
|
long publicNetworkId = insertNetwork(conn, "PublicNetwork" + dcId, "Public Network Created for Zone " + dcId, "Public", "Vlan", null, null, null, "Static",
|
|
publicNetworkOfferingId, dcId, "PublicNetworkGuru", "Setup", 1, 1, null, null, null, true, null, false, null);
|
|
|
|
pstmt = conn
|
|
.prepareStatement("SELECT vm_instance.id, vm_instance.domain_id, vm_instance.account_id, domain_router.guest_ip_address, domain_router.domain, domain_router.dns1, domain_router.dns2, domain_router.vnet FROM vm_instance INNER JOIN domain_router ON vm_instance.id=domain_router.id WHERE vm_instance.removed IS NULL AND vm_instance.type='DomainRouter' AND vm_instance.data_center_id=? and domain_router.role='DHCP_FIREWALL_LB_PASSWD_USERDATA'");
|
|
pstmt.setLong(1, dcId);
|
|
rs = pstmt.executeQuery();
|
|
ArrayList<Object[]> routers = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] router = new Object[40];
|
|
router[0] = rs.getLong(1); // router id
|
|
router[1] = rs.getLong(2); // domain id
|
|
router[2] = rs.getLong(3); // account id
|
|
router[3] = rs.getString(4); // guest ip which becomes the gateway in network
|
|
router[4] = rs.getString(5); // domain name
|
|
router[5] = rs.getString(6); // dns1
|
|
router[6] = rs.getString(7); // dns2
|
|
router[7] = rs.getString(8); // vnet
|
|
routers.add(router);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
for (Object[] router : routers) {
|
|
String vnet = (String) router[7];
|
|
String reservationId = null;
|
|
String state = "Allocated";
|
|
if (vnet != null) {
|
|
reservationId = dcId + "-" + vnet;
|
|
state = "Implemented";
|
|
}
|
|
|
|
String vlan = null;
|
|
if (vnet != null) {
|
|
vlan = "vlan://" + vnet;
|
|
}
|
|
|
|
long virtualNetworkId = insertNetwork(conn, "VirtualNetwork" + router[0], "Virtual Network for " + router[0], "Guest", "Vlan", vlan, (String) router[3], (String) dc[1],
|
|
"Dhcp", 6, dcId, "ExternalGuestNetworkGuru", state, (Long) router[1], (Long) router[2], (String) router[5], (String) router[6], "Virtual", false, (String) router[4],
|
|
true, reservationId);
|
|
pstmt = conn.prepareStatement("UPDATE domain_router SET network_id = ? wHERE id = ? ");
|
|
pstmt.setLong(1, virtualNetworkId);
|
|
pstmt.setLong(2, (Long) router[0]);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
s_logger.debug("Network inserted for " + router[0] + " id = " + virtualNetworkId);
|
|
|
|
upgradeUserVms(conn, (Long) router[0], virtualNetworkId, (String) router[3], vnet, "ExternalGuestNetworkGuru", "Start");
|
|
upgradeDomR(conn, dcId, (Long) router[0], publicNetworkId, virtualNetworkId, controlNetworkId, "Advanced", vnet);
|
|
}
|
|
|
|
upgradePublicUserIpAddress(conn, dcId, publicNetworkId, "VirtualNetwork");
|
|
|
|
// Create direct networks
|
|
pstmt = conn.prepareStatement("SELECT id, vlan_id, vlan_gateway, vlan_netmask FROM vlan WHERE vlan_type='DirectAttached' AND data_center_id=?");
|
|
pstmt.setLong(1, dcId);
|
|
rs = pstmt.executeQuery();
|
|
HashMap<String, Long> vlanNetworkMap = new HashMap<String, Long>();
|
|
while (rs.next()) {
|
|
long vlanId = rs.getLong(1);
|
|
String tag = rs.getString(2);
|
|
String gateway = rs.getString(3);
|
|
String netmask = rs.getString(4);
|
|
String cidr = NetUtils.getCidrFromGatewayAndNetmask(gateway, netmask);
|
|
|
|
// Get the owner of the network
|
|
Long accountId = 1L;
|
|
Long domainId = 1L;
|
|
boolean isShared = true;
|
|
pstmt = conn.prepareStatement("SELECT account_id FROM account_vlan_map WHERE account_id IS NOT NULL AND vlan_db_id=?");
|
|
pstmt.setLong(1, vlanId);
|
|
ResultSet accountRs = pstmt.executeQuery();
|
|
while (accountRs.next()) {
|
|
isShared = false;
|
|
accountId = accountRs.getLong(1);
|
|
pstmt = conn.prepareStatement("SELECT domain_id FROM account WHERE id=?");
|
|
pstmt.setLong(1, accountId);
|
|
ResultSet domainRs = pstmt.executeQuery();
|
|
while (domainRs.next()) {
|
|
domainId = domainRs.getLong(1);
|
|
}
|
|
}
|
|
|
|
if (vlanNetworkMap.get(tag) == null) {
|
|
long directNetworkId = insertNetwork(conn, "DirectNetwork" + vlanId, "Direct network created for " + vlanId, "Guest", "Vlan", "vlan://" + tag, gateway, cidr, "Dhcp", 7,
|
|
dcId, "DirectNetworkGuru", "Setup", domainId, accountId, null, null, "Direct", isShared, (String) dc[2], true, null);
|
|
vlanNetworkMap.put(tag, directNetworkId);
|
|
}
|
|
|
|
pstmt = conn.prepareStatement("UPDATE vlan SET network_id=? WHERE id=?");
|
|
pstmt.setLong(1, vlanNetworkMap.get(tag));
|
|
pstmt.setLong(2, vlanId);
|
|
pstmt.executeUpdate();
|
|
|
|
pstmt.close();
|
|
|
|
upgradeDirectUserIpAddress(conn, dcId, vlanNetworkMap.get(tag), "DirectAttached");
|
|
s_logger.debug("Created Direct networks and upgraded Direct ip addresses");
|
|
}
|
|
|
|
// Create DHCP domRs - Direct networks
|
|
pstmt = conn
|
|
.prepareStatement("SELECT vm_instance.id, domain_router.guest_ip_address FROM vm_instance INNER JOIN domain_router ON vm_instance.id=domain_router.id WHERE vm_instance.removed IS NULL AND vm_instance.type='DomainRouter' AND vm_instance.data_center_id=? and domain_router.role='DHCP_USERDATA'");
|
|
pstmt.setLong(1, dcId);
|
|
rs = pstmt.executeQuery();
|
|
ArrayList<Object[]> dhcpServers = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] dhcpServer = new Object[40];
|
|
dhcpServer[0] = rs.getLong(1); // router id
|
|
dhcpServer[1] = rs.getString(2); // guest IP address - direct ip address of the domR
|
|
dhcpServers.add(dhcpServer);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
for (Object[] dhcpServer : dhcpServers) {
|
|
Long routerId = (Long) dhcpServer[0];
|
|
String directIp = (String) dhcpServer[1];
|
|
|
|
pstmt = conn.prepareStatement("SELECT u.source_network_id, v.vlan_id from user_ip_address u, vlan v where u.public_ip_address=? and v.id=u.vlan_db_id");
|
|
pstmt.setString(1, directIp);
|
|
rs = pstmt.executeQuery();
|
|
if (!rs.next()) {
|
|
throw new CloudRuntimeException("Unable to find Direct ip address " + directIp + " in user_ip_address table");
|
|
}
|
|
|
|
Long directNetworkId = rs.getLong(1);
|
|
String vnet = rs.getString(2);
|
|
rs.close();
|
|
|
|
pstmt = conn.prepareStatement("SELECT gateway from networks where id=?");
|
|
pstmt.setLong(1, directNetworkId);
|
|
rs = pstmt.executeQuery();
|
|
if (!rs.next()) {
|
|
throw new CloudRuntimeException("Unable to find gateway for network id=" + directNetworkId);
|
|
}
|
|
|
|
String gateway = rs.getString(1);
|
|
rs.close();
|
|
|
|
pstmt = conn.prepareStatement("UPDATE domain_router SET network_id = ? wHERE id = ? ");
|
|
pstmt.setLong(1, directNetworkId);
|
|
pstmt.setLong(2, routerId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
s_logger.debug("NetworkId updated for router id=" + routerId + "with network id = " + directNetworkId);
|
|
|
|
upgradeUserVms(conn, routerId, directNetworkId, gateway, vnet, "DirectNetworkGuru", "Create");
|
|
s_logger.debug("Upgraded Direct vms in Advance zone id=" + dcId);
|
|
upgradeDomR(conn, dcId, routerId, null, directNetworkId, controlNetworkId, "Advanced", vnet);
|
|
s_logger.debug("Upgraded Direct domRs in Advance zone id=" + dcId);
|
|
}
|
|
|
|
// Upgrade SSVM
|
|
upgradeSsvm(conn, dcId, publicNetworkId, mgmtNetworkId, controlNetworkId, "Advanced");
|
|
|
|
// Upgrade ConsoleProxy
|
|
pstmt = conn.prepareStatement("SELECT vm_instance.id FROM vm_instance WHERE removed IS NULL AND type='ConsoleProxy' AND data_center_id=?");
|
|
pstmt.setLong(1, dcId);
|
|
rs = pstmt.executeQuery();
|
|
while (rs.next()) {
|
|
upgradeConsoleProxy(conn, dcId, rs.getLong(1), publicNetworkId, mgmtNetworkId, controlNetworkId, "Advanced");
|
|
}
|
|
pstmt.close();
|
|
}
|
|
}
|
|
|
|
} catch (SQLException e) {
|
|
s_logger.error("Can't update data center ", e);
|
|
throw new CloudRuntimeException("Can't update data center ", e);
|
|
}
|
|
}
|
|
|
|
private void updateUserStats(Connection conn) {
|
|
try {
|
|
|
|
// update device_type information
|
|
PreparedStatement pstmt = conn.prepareStatement("UPDATE user_statistics SET device_type='DomainRouter'");
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
s_logger.debug("Upgraded userStatistcis with device_type=DomainRouter");
|
|
|
|
// update device_id infrormation
|
|
pstmt = conn.prepareStatement("SELECT id, account_id, data_center_id FROM user_statistics");
|
|
ResultSet rs = pstmt.executeQuery();
|
|
|
|
while (rs.next()) {
|
|
Long id = rs.getLong(1); // user stats id
|
|
Long accountId = rs.getLong(2); // account id
|
|
Long dataCenterId = rs.getLong(3); // zone id
|
|
|
|
pstmt = conn.prepareStatement("SELECT networktype from data_center where id=?");
|
|
pstmt.setLong(1, dataCenterId);
|
|
|
|
ResultSet dcSet = pstmt.executeQuery();
|
|
|
|
if (!dcSet.next()) {
|
|
s_logger.error("Unable to get data_center information as a part of user_statistics update");
|
|
throw new CloudRuntimeException("Unable to get data_center information as a part of user_statistics update");
|
|
}
|
|
|
|
String dataCenterType = dcSet.getString(1);
|
|
|
|
if (dataCenterType.equalsIgnoreCase("basic")) {
|
|
accountId = 1L;
|
|
}
|
|
|
|
pstmt = conn.prepareStatement("SELECT id from vm_instance where account_id=? AND data_center_id=? AND type='DomainRouter'");
|
|
pstmt.setLong(1, accountId);
|
|
pstmt.setLong(2, dataCenterId);
|
|
ResultSet rs1 = pstmt.executeQuery();
|
|
|
|
Long deviceId = 0L;
|
|
if (!rs1.next()) {
|
|
// check if there are any non-removed user vms existing for this account
|
|
// if all vms are expunged, and there is no domR, just skip this record
|
|
pstmt = conn.prepareStatement("SELECT * from vm_instance where account_id=? AND data_center_id=? AND removed IS NULL");
|
|
pstmt.setLong(1, accountId);
|
|
pstmt.setLong(2, dataCenterId);
|
|
ResultSet nonRemovedVms = pstmt.executeQuery();
|
|
|
|
if (nonRemovedVms.next()) {
|
|
s_logger.warn("Failed to find domR for for account id=" + accountId + " in zone id=" + dataCenterId + "; will try to locate domR based on user_vm info");
|
|
//try to get domR information from the user_vm belonging to the account
|
|
pstmt = conn.prepareStatement("SELECT u.domain_router_id from user_vm u, vm_instance v where u.account_id=? AND v.data_center_id=? AND v.removed IS NULL AND u.domain_router_id is NOT NULL");
|
|
pstmt.setLong(1, accountId);
|
|
pstmt.setLong(2, dataCenterId);
|
|
ResultSet userVmSet = pstmt.executeQuery();
|
|
if (!userVmSet.next()) {
|
|
s_logger.warn("Skipping user_statistics upgrade for account id=" + accountId + " in datacenter id=" + dataCenterId);
|
|
continue;
|
|
}
|
|
deviceId = userVmSet.getLong(1);
|
|
} else {
|
|
s_logger.debug("Account id=" + accountId + " doesn't own any user vms and domRs, so skipping user_statistics update");
|
|
continue;
|
|
}
|
|
} else {
|
|
deviceId = rs1.getLong(1);
|
|
}
|
|
|
|
pstmt = conn.prepareStatement("UPDATE user_statistics SET device_id=? where id=?");
|
|
pstmt.setLong(1, deviceId);
|
|
pstmt.setLong(2, id);
|
|
pstmt.executeUpdate();
|
|
|
|
pstmt = conn.prepareStatement("");
|
|
|
|
}
|
|
s_logger.debug("Upgraded userStatistcis with deviceId(s)");
|
|
|
|
} catch (Exception e) {
|
|
throw new CloudRuntimeException("Failed to migrate usage events: ", e);
|
|
}
|
|
}
|
|
|
|
public void upgradePortForwardingRules(Connection conn) {
|
|
try {
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT id, public_ip_address, public_port, private_ip_address, private_port, protocol FROM ip_forwarding WHERE forwarding=1");
|
|
ResultSet rs = pstmt.executeQuery();
|
|
ArrayList<Object[]> rules = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] rule = new Object[10];
|
|
rule[0] = rs.getLong(1); // rule id
|
|
rule[1] = rs.getString(2); // rule public IP
|
|
rule[2] = rs.getString(3); // rule public port
|
|
rule[3] = rs.getString(4); // rule private Ip
|
|
rule[4] = rs.getString(5); // rule private port
|
|
rule[5] = rs.getString(6); // rule protocol
|
|
rules.add(rule);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
if (!rules.isEmpty()) {
|
|
s_logger.debug("Found " + rules.size() + " port forwarding rules to upgrade");
|
|
for (Object[] rule : rules) {
|
|
long id = (Long) rule[0];
|
|
String sourcePort = (String) rule[2];
|
|
String protocol = (String) rule[5];
|
|
String publicIp = (String) rule[1];
|
|
|
|
pstmt = conn.prepareStatement("SELECT id, account_id, domain_id, network_id FROM user_ip_address WHERE public_ip_address=?");
|
|
pstmt.setString(1, publicIp);
|
|
rs = pstmt.executeQuery();
|
|
|
|
if (!rs.next()) {
|
|
s_logger.error("Unable to find public IP address " + publicIp);
|
|
throw new CloudRuntimeException("Unable to find public IP address " + publicIp);
|
|
}
|
|
|
|
int ipAddressId = rs.getInt(1);
|
|
long accountId = rs.getLong(2);
|
|
long domainId = rs.getLong(3);
|
|
long networkId = rs.getLong(4);
|
|
String privateIp = (String) rule[3];
|
|
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
// update port_forwarding_rules table
|
|
s_logger.trace("Updating port_forwarding_rules table...");
|
|
pstmt = conn.prepareStatement("SELECT instance_id FROM nics where network_id=? AND ip4_address=?");
|
|
pstmt.setLong(1, networkId);
|
|
pstmt.setString(2, privateIp);
|
|
rs = pstmt.executeQuery();
|
|
|
|
if (!rs.next()) {
|
|
// the vm might be expunged already...so just give the warning
|
|
s_logger.warn("Unable to find vmId for private ip address " + privateIp + " for account id=" + accountId + "; assume that the vm is expunged");
|
|
// throw new CloudRuntimeException("Unable to find vmId for private ip address " + privateIp +
|
|
// " for account id=" + accountId);
|
|
} else {
|
|
long instanceId = rs.getLong(1);
|
|
s_logger.debug("Instance id is " + instanceId);
|
|
// update firewall_rules table
|
|
s_logger.trace("Updating firewall_rules table as a part of PF rules upgrade...");
|
|
pstmt = conn
|
|
.prepareStatement("INSERT INTO firewall_rules (id, ip_address_id, start_port, end_port, state, protocol, purpose, account_id, domain_id, network_id, xid, is_static_nat, created) VALUES (?, ?, ?, ?, 'Active', ?, 'PortForwarding', ?, ?, ?, ?, 0, now())");
|
|
pstmt.setLong(1, id);
|
|
pstmt.setInt(2, ipAddressId);
|
|
pstmt.setInt(3, Integer.valueOf(sourcePort.trim()));
|
|
pstmt.setInt(4, Integer.valueOf(sourcePort.trim()));
|
|
pstmt.setString(5, protocol);
|
|
pstmt.setLong(6, accountId);
|
|
pstmt.setLong(7, domainId);
|
|
pstmt.setLong(8, networkId);
|
|
pstmt.setString(9, UUID.randomUUID().toString());
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
s_logger.trace("firewall_rules table is updated as a part of PF rules upgrade");
|
|
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
String privatePort = (String) rule[4];
|
|
pstmt = conn.prepareStatement("INSERT INTO port_forwarding_rules VALUES (?, ?, ?, ?, ?)");
|
|
pstmt.setLong(1, id);
|
|
pstmt.setLong(2, instanceId);
|
|
pstmt.setString(3, privateIp);
|
|
pstmt.setInt(4, Integer.valueOf(privatePort.trim()));
|
|
pstmt.setInt(5, Integer.valueOf(privatePort.trim()));
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
s_logger.trace("port_forwarding_rules table is updated");
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
s_logger.debug("Port forwarding rules are updated");
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Can't update port forwarding rules ", e);
|
|
}
|
|
}
|
|
|
|
public void upgradeLoadBalancingRules(Connection conn) {
|
|
try {
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT name, ip_address, public_port, private_port, algorithm, id FROM load_balancer");
|
|
ResultSet rs = pstmt.executeQuery();
|
|
ArrayList<Object[]> lbs = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] lb = new Object[10];
|
|
lb[0] = rs.getString(1); // lb name
|
|
lb[1] = rs.getString(2); // lb public IP
|
|
lb[2] = rs.getString(3); // lb public port
|
|
lb[3] = rs.getString(4); // lb private port
|
|
lb[4] = rs.getString(5); // lb algorithm
|
|
lb[5] = rs.getLong(6); // lb Id
|
|
lbs.add(lb);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
if (!lbs.isEmpty()) {
|
|
s_logger.debug("Found " + lbs.size() + " lb rules to upgrade");
|
|
pstmt = conn.prepareStatement("SELECT id FROM firewall_rules order by id");
|
|
rs = pstmt.executeQuery();
|
|
long newLbId = 0;
|
|
while (rs.next()) {
|
|
newLbId = rs.getLong(1);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
for (Object[] lb : lbs) {
|
|
String name = (String) lb[0];
|
|
String publicIp = (String) lb[1];
|
|
String sourcePort = (String) lb[2];
|
|
String destPort = (String) lb[3];
|
|
String algorithm = (String) lb[4];
|
|
Long originalLbId = (Long) lb[5];
|
|
newLbId = newLbId + 1;
|
|
|
|
pstmt = conn.prepareStatement("SELECT id, account_id, domain_id, network_id FROM user_ip_address WHERE public_ip_address=?");
|
|
pstmt.setString(1, publicIp);
|
|
rs = pstmt.executeQuery();
|
|
|
|
if (!rs.next()) {
|
|
s_logger.warn("Unable to find public IP address " + publicIp + "; skipping lb rule id=" + originalLbId
|
|
+ " from update. Cleaning it up from load_balancer_vm_map and load_balancer table");
|
|
pstmt = conn.prepareStatement("DELETE from load_balancer_vm_map where load_balancer_id=?");
|
|
pstmt.setLong(1, originalLbId);
|
|
pstmt.executeUpdate();
|
|
|
|
pstmt = conn.prepareStatement("DELETE from load_balancer where id=?");
|
|
pstmt.setLong(1, originalLbId);
|
|
pstmt.executeUpdate();
|
|
|
|
continue;
|
|
}
|
|
|
|
int ipAddressId = rs.getInt(1);
|
|
long accountId = rs.getLong(2);
|
|
long domainId = rs.getLong(3);
|
|
long networkId = rs.getLong(4);
|
|
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
// update firewall_rules table
|
|
s_logger.trace("Updating firewall_rules table as a part of LB rules upgrade...");
|
|
pstmt = conn
|
|
.prepareStatement("INSERT INTO firewall_rules (id, ip_address_id, start_port, end_port, state, protocol, purpose, account_id, domain_id, network_id, xid, is_static_nat, created) VALUES (?, ?, ?, ?, 'Active', ?, 'LoadBalancing', ?, ?, ?, ?, 0, now())");
|
|
pstmt.setLong(1, newLbId);
|
|
pstmt.setInt(2, ipAddressId);
|
|
pstmt.setInt(3, Integer.valueOf(sourcePort));
|
|
pstmt.setInt(4, Integer.valueOf(sourcePort));
|
|
pstmt.setString(5, "tcp");
|
|
pstmt.setLong(6, accountId);
|
|
pstmt.setLong(7, domainId);
|
|
pstmt.setLong(8, networkId);
|
|
pstmt.setString(9, UUID.randomUUID().toString());
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
s_logger.trace("firewall_rules table is updated as a part of LB rules upgrade");
|
|
|
|
// update load_balancing_rules
|
|
s_logger.trace("Updating load_balancing_rules table as a part of LB rules upgrade...");
|
|
pstmt = conn.prepareStatement("INSERT INTO load_balancing_rules VALUES (?, ?, NULL, ?, ?, ?)");
|
|
pstmt.setLong(1, newLbId);
|
|
pstmt.setString(2, name);
|
|
pstmt.setInt(3, Integer.valueOf(destPort));
|
|
pstmt.setInt(4, Integer.valueOf(destPort));
|
|
pstmt.setString(5, algorithm);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
s_logger.trace("load_balancing_rules table is updated as a part of LB rules upgrade");
|
|
|
|
// update load_balancer_vm_map table
|
|
s_logger.trace("Updating load_balancer_vm_map table as a part of LB rules upgrade...");
|
|
pstmt = conn.prepareStatement("SELECT instance_id FROM load_balancer_vm_map WHERE load_balancer_id=?");
|
|
pstmt.setLong(1, originalLbId);
|
|
rs = pstmt.executeQuery();
|
|
ArrayList<Object[]> lbMaps = new ArrayList<Object[]>();
|
|
while (rs.next()) {
|
|
Object[] lbMap = new Object[10];
|
|
lbMap[0] = rs.getLong(1); // instanceId
|
|
lbMaps.add(lbMap);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("UPDATE load_balancer_vm_map SET load_balancer_id=? WHERE load_balancer_id=?");
|
|
pstmt.setLong(1, newLbId);
|
|
pstmt.setLong(2, originalLbId);
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
s_logger.trace("load_balancer_vm_map table is updated as a part of LB rules upgrade");
|
|
}
|
|
}
|
|
s_logger.debug("LB rules are upgraded");
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Can't update LB rules ", e);
|
|
}
|
|
}
|
|
|
|
private void upgradeHostMemoryCapacityInfo(Connection conn) {
|
|
try {
|
|
// count user_vm memory info (M Bytes)
|
|
PreparedStatement pstmt = conn
|
|
.prepareStatement("select h.id, sum(s.ram_size) from host h, vm_instance v, service_offering s where h.type='Routing' and v.state='Running' and v.`type`='User' and v.host_id=h.id and v.service_offering_id = s.id group by h.id");
|
|
|
|
ResultSet rs = pstmt.executeQuery();
|
|
Map<Long, Long> hostUsedMemoryInfo = new HashMap<Long, Long>();
|
|
while (rs.next()) {
|
|
hostUsedMemoryInfo.put(rs.getLong(1), rs.getLong(2));
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
int proxyRamSize = NumbersUtil.parseInt(getConfigValue(conn, "consoleproxy.ram.size"), ConsoleProxyManager.DEFAULT_PROXY_VM_RAMSIZE);
|
|
int domrRamSize = NumbersUtil.parseInt(getConfigValue(conn, "router.ram.size"), VirtualNetworkApplianceManager.DEFAULT_ROUTER_VM_RAMSIZE);
|
|
int ssvmRamSize = NumbersUtil.parseInt(getConfigValue(conn, "secstorage.vm.ram.size"), SecondaryStorageVmManager.DEFAULT_SS_VM_RAMSIZE);
|
|
|
|
pstmt = conn
|
|
.prepareStatement("select h.id, count(v.id) from host h, vm_instance v where h.type='Routing' and v.state='Running' and v.`type`='ConsoleProxy' and v.host_id=h.id group by h.id");
|
|
rs = pstmt.executeQuery();
|
|
while (rs.next()) {
|
|
if (hostUsedMemoryInfo.get(rs.getLong(1)) != null) {
|
|
Long usedMem = hostUsedMemoryInfo.get(rs.getLong(1));
|
|
hostUsedMemoryInfo.put(rs.getLong(1), rs.getLong(2) * proxyRamSize + usedMem);
|
|
} else {
|
|
hostUsedMemoryInfo.put(rs.getLong(1), rs.getLong(2) * proxyRamSize);
|
|
}
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn
|
|
.prepareStatement("select h.id, count(v.id) from host h, vm_instance v where h.type='Routing' and v.state='Running' and v.`type`='DomainRouter' and v.host_id=h.id group by h.id");
|
|
rs = pstmt.executeQuery();
|
|
while (rs.next()) {
|
|
if (hostUsedMemoryInfo.get(rs.getLong(1)) != null) {
|
|
Long usedMem = hostUsedMemoryInfo.get(rs.getLong(1));
|
|
hostUsedMemoryInfo.put(rs.getLong(1), rs.getLong(2) * domrRamSize + usedMem);
|
|
} else {
|
|
hostUsedMemoryInfo.put(rs.getLong(1), rs.getLong(2) * domrRamSize);
|
|
}
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn
|
|
.prepareStatement("select h.id, count(v.id) from host h, vm_instance v where h.type='Routing' and v.state='Running' and v.`type`='SecondaryStorageVm' and v.host_id=h.id group by h.id");
|
|
rs = pstmt.executeQuery();
|
|
while (rs.next()) {
|
|
if (hostUsedMemoryInfo.get(rs.getLong(1)) != null) {
|
|
Long usedMem = hostUsedMemoryInfo.get(rs.getLong(1));
|
|
hostUsedMemoryInfo.put(rs.getLong(1), rs.getLong(2) * ssvmRamSize + usedMem);
|
|
} else {
|
|
hostUsedMemoryInfo.put(rs.getLong(1), rs.getLong(2) * ssvmRamSize);
|
|
}
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
for (Map.Entry<Long, Long> entry : hostUsedMemoryInfo.entrySet()) {
|
|
pstmt = conn.prepareStatement("update op_host_capacity set used_capacity=? where host_id=? and capacity_type=0");
|
|
pstmt.setLong(1, entry.getValue() * 1024 * 1024);
|
|
pstmt.setLong(2, entry.getKey());
|
|
|
|
pstmt.executeUpdate();
|
|
}
|
|
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Can't upgrade host capacity info ", e);
|
|
}
|
|
}
|
|
|
|
// per domain resource counts is introduced from 2.2 so we need to evaluate the domain limits
|
|
// from the resource counts of account, and account-domain relation for all resource types
|
|
private void upgradeDomainResourceCounts(Connection conn) {
|
|
upgradeDomainResourceCounts(conn, ResourceType.volume);
|
|
upgradeDomainResourceCounts(conn, ResourceType.user_vm);
|
|
upgradeDomainResourceCounts(conn, ResourceType.snapshot);
|
|
upgradeDomainResourceCounts(conn, ResourceType.template);
|
|
upgradeDomainResourceCounts(conn, ResourceType.public_ip);
|
|
}
|
|
|
|
public static void upgradeDomainResourceCounts(Connection conn, ResourceType resourceType) {
|
|
try {
|
|
|
|
PreparedStatement account_count_pstmt = conn.prepareStatement("SELECT account_id, count from resource_count where type='" + resourceType + "'");
|
|
ResultSet rs_account_count = account_count_pstmt.executeQuery();
|
|
|
|
while (rs_account_count.next()) {
|
|
Long accountId = rs_account_count.getLong(1);
|
|
Long accountCount = rs_account_count.getLong(2);
|
|
|
|
PreparedStatement account_pstmt = conn.prepareStatement("SELECT domain_id from account where id=?");
|
|
account_pstmt.setLong(1, accountId);
|
|
ResultSet rs_domain = account_pstmt.executeQuery();
|
|
|
|
if (!rs_domain.next()) {
|
|
throw new CloudRuntimeException("Unable to get the domain for the account Id: " + accountId);
|
|
}
|
|
Long domainId = rs_domain.getLong(1);
|
|
|
|
rs_domain.close();
|
|
account_pstmt.close();
|
|
|
|
// resource count on a domain is aggregate of resource count of all the accounts that belong to the domain and
|
|
// its sub-domains.
|
|
// so propagate the count across the domain hierarchy all the way up to the root domain.
|
|
while (domainId != 0) {
|
|
|
|
PreparedStatement domain_count_pstmt = conn.prepareStatement("SELECT count from resource_count where type='" + resourceType + "' and domain_id=?");
|
|
domain_count_pstmt.setLong(1, domainId);
|
|
ResultSet rs_domain_count = domain_count_pstmt.executeQuery();
|
|
|
|
// if a row has been created for the domain in the resource_count table, add the count to the existing
|
|
// domain count
|
|
if (rs_domain_count.next()) {
|
|
Long domainCount = rs_domain_count.getLong(1);
|
|
domainCount = domainCount + accountCount;
|
|
PreparedStatement update_domain_count_pstmt = conn.prepareStatement("UPDATE resource_count set count=? where domain_id=? and type ='" + resourceType + "'");
|
|
update_domain_count_pstmt.setLong(1, domainCount);
|
|
update_domain_count_pstmt.setLong(2, domainId);
|
|
update_domain_count_pstmt.executeUpdate();
|
|
update_domain_count_pstmt.close();
|
|
} else {
|
|
PreparedStatement update_domain_count_pstmt = conn.prepareStatement("INSERT INTO resource_count (type, count, domain_id) VALUES (?,?,?)");
|
|
update_domain_count_pstmt.setString(1, resourceType.getName());
|
|
update_domain_count_pstmt.setLong(2, accountCount);
|
|
update_domain_count_pstmt.setLong(3, domainId);
|
|
update_domain_count_pstmt.executeUpdate();
|
|
update_domain_count_pstmt.close();
|
|
}
|
|
|
|
rs_domain_count.close();
|
|
domain_count_pstmt.close();
|
|
|
|
PreparedStatement parentDomain_pstmt = conn.prepareStatement("SELECT parent from domain where id=?");
|
|
parentDomain_pstmt.setLong(1, domainId);
|
|
ResultSet rs_domain_parent = parentDomain_pstmt.executeQuery();
|
|
|
|
if (rs_domain_parent.next()) {
|
|
domainId = rs_domain_parent.getLong(1);
|
|
} else {
|
|
throw new CloudRuntimeException("Unable to get the parent domain for the domain Id: " + domainId);
|
|
}
|
|
|
|
rs_domain_parent.close();
|
|
parentDomain_pstmt.close();
|
|
}
|
|
}
|
|
|
|
rs_account_count.close();
|
|
account_count_pstmt.close();
|
|
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Can't upgrade domain resource counts ", e);
|
|
}
|
|
}
|
|
|
|
private void upgradeHostCpuCapacityInfo(Connection conn) {
|
|
try {
|
|
// count user_vm memory info (M Bytes)
|
|
PreparedStatement pstmt = conn
|
|
.prepareStatement("select h.id, sum(s.speed*s.cpu) from host h, vm_instance v, service_offering s where h.type='Routing' and v.state='Running' and v.`type`='User' and v.host_id=h.id and v.service_offering_id = s.id group by h.id");
|
|
|
|
ResultSet rs = pstmt.executeQuery();
|
|
Map<Long, Long> hostUsedCpuInfo = new HashMap<Long, Long>();
|
|
while (rs.next()) {
|
|
hostUsedCpuInfo.put(rs.getLong(1), rs.getLong(2));
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
int proxyCpuMhz = NumbersUtil.parseInt(getConfigValue(conn, "consoleproxy.cpu.mhz"), ConsoleProxyManager.DEFAULT_PROXY_VM_CPUMHZ);
|
|
int domrCpuMhz = NumbersUtil.parseInt(getConfigValue(conn, "router.cpu.mhz"), VirtualNetworkApplianceManager.DEFAULT_ROUTER_CPU_MHZ);
|
|
int ssvmCpuMhz = NumbersUtil.parseInt(getConfigValue(conn, "secstorage.vm.cpu.mhz"), SecondaryStorageVmManager.DEFAULT_SS_VM_CPUMHZ);
|
|
|
|
pstmt = conn
|
|
.prepareStatement("select h.id, count(v.id) from host h, vm_instance v where h.type='Routing' and v.state='Running' and v.`type`='ConsoleProxy' and v.host_id=h.id group by h.id");
|
|
|
|
rs = pstmt.executeQuery();
|
|
while (rs.next()) {
|
|
if (hostUsedCpuInfo.get(rs.getLong(1)) != null) {
|
|
Long usedCpuMhz = hostUsedCpuInfo.get(rs.getLong(1));
|
|
hostUsedCpuInfo.put(rs.getLong(1), rs.getLong(2) * proxyCpuMhz + usedCpuMhz);
|
|
} else {
|
|
hostUsedCpuInfo.put(rs.getLong(1), rs.getLong(2) * proxyCpuMhz);
|
|
}
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn
|
|
.prepareStatement("select h.id, count(v.id) from host h, vm_instance v where h.type='Routing' and v.state='Running' and v.`type`='DomainRouter' and v.host_id=h.id group by h.id");
|
|
rs = pstmt.executeQuery();
|
|
while (rs.next()) {
|
|
if (hostUsedCpuInfo.get(rs.getLong(1)) != null) {
|
|
Long usedCpuMhz = hostUsedCpuInfo.get(rs.getLong(1));
|
|
hostUsedCpuInfo.put(rs.getLong(1), rs.getLong(2) * domrCpuMhz + usedCpuMhz);
|
|
} else {
|
|
hostUsedCpuInfo.put(rs.getLong(1), rs.getLong(2) * domrCpuMhz);
|
|
}
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn
|
|
.prepareStatement("select h.id, count(v.id) from host h, vm_instance v where h.type='Routing' and v.state='Running' and v.`type`='SecondaryStorageVm' and v.host_id=h.id group by h.id");
|
|
rs = pstmt.executeQuery();
|
|
while (rs.next()) {
|
|
if (hostUsedCpuInfo.get(rs.getLong(1)) != null) {
|
|
Long usedCpuMhz = hostUsedCpuInfo.get(rs.getLong(1));
|
|
hostUsedCpuInfo.put(rs.getLong(1), rs.getLong(2) * ssvmCpuMhz + usedCpuMhz);
|
|
} else {
|
|
hostUsedCpuInfo.put(rs.getLong(1), rs.getLong(2) * ssvmCpuMhz);
|
|
}
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
for (Map.Entry<Long, Long> entry : hostUsedCpuInfo.entrySet()) {
|
|
pstmt = conn.prepareStatement("update op_host_capacity set used_capacity=? where host_id=? and capacity_type=1");
|
|
pstmt.setLong(1, entry.getValue());
|
|
pstmt.setLong(2, entry.getKey());
|
|
|
|
pstmt.executeUpdate();
|
|
}
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Can't upgrade host capacity info ", e);
|
|
}
|
|
}
|
|
|
|
private String getConfigValue(Connection conn, String name) {
|
|
try {
|
|
// count user_vm memory info (M Bytes)
|
|
PreparedStatement pstmt = conn.prepareStatement("select value from configuration where name=?");
|
|
pstmt.setString(1, name);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
|
|
String val = null;
|
|
if (rs.next()) {
|
|
val = rs.getString(1);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
return val;
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Can't upgrade host capacity info ", e);
|
|
}
|
|
}
|
|
|
|
private void migrateEvents(Connection conn) {
|
|
try {
|
|
PreparedStatement pstmt1 = conn.prepareStatement("SHOW DATABASES LIKE 'cloud_usage'");
|
|
ResultSet rs1 = pstmt1.executeQuery();
|
|
if (!rs1.next()) {
|
|
s_logger.debug("cloud_usage db doesn't exist. Skipping events migration");
|
|
return;
|
|
}
|
|
|
|
// get last processed event Id
|
|
Long lastProcessedEvent = getMostRecentEvent(conn);
|
|
// Events not yet processed
|
|
String sql = "SELECT type, description, user_id, account_id, created, level, parameters FROM cloud.event vmevt WHERE vmevt.id > ? and vmevt.state = 'Completed' ";
|
|
if (lastProcessedEvent == null) {
|
|
s_logger.trace("no events are processed earlier, copying all events");
|
|
sql = "SELECT type, description, user_id, account_id, created, level, parameters FROM cloud.event vmevt WHERE vmevt.state = 'Completed' ";
|
|
}
|
|
|
|
PreparedStatement pstmt = null;
|
|
|
|
pstmt = conn.prepareStatement(sql);
|
|
int i = 1;
|
|
if (lastProcessedEvent != null) {
|
|
pstmt.setLong(i++, lastProcessedEvent);
|
|
}
|
|
ResultSet rs = pstmt.executeQuery();
|
|
s_logger.debug("Begin Migrating events");
|
|
while (rs.next()) {
|
|
EventVO event = new EventVO();
|
|
event.setType(rs.getString(1));
|
|
event.setDescription(rs.getString(2));
|
|
event.setUserId(rs.getLong(3));
|
|
event.setAccountId(rs.getLong(4));
|
|
event.setCreatedDate(DateUtil.parseDateString(TimeZone.getTimeZone("GMT"), rs.getString(5)));
|
|
event.setLevel(rs.getString(6));
|
|
event.setParameters(rs.getString(7));
|
|
convertEvent(event, conn);
|
|
}
|
|
s_logger.debug("Migrating events completed");
|
|
} catch (Exception e) {
|
|
throw new CloudRuntimeException("Failed to migrate usage events: ", e);
|
|
}
|
|
}
|
|
|
|
private Long getMostRecentEvent(Connection conn) {
|
|
PreparedStatement pstmt = null;
|
|
String sql = "SELECT id FROM cloud_usage.event ORDER BY created DESC LIMIT 1";
|
|
try {
|
|
pstmt = conn.prepareStatement(sql);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
if (rs.next()) {
|
|
return rs.getLong(1);
|
|
}
|
|
} catch (Exception ex) {
|
|
throw new CloudRuntimeException("error getting most recent event date: " + ex.getMessage());
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private void convertEvent(EventVO event, Connection conn) throws IOException, SQLException {
|
|
// we only create usage for success cases as error cases mean
|
|
// the event didn't happen, so it couldn't result in usage
|
|
if (!EventVO.LEVEL_INFO.equals(event.getLevel())) {
|
|
return;
|
|
}
|
|
String eventType = event.getType();
|
|
UsageEventVO usageEvent = null;
|
|
if (isVMEvent(eventType)) {
|
|
usageEvent = convertVMEvent(event);
|
|
} else if (isIPEvent(eventType)) {
|
|
usageEvent = convertIPEvent(event, conn);
|
|
} else if (isVolumeEvent(eventType)) {
|
|
usageEvent = convertVolumeEvent(event, conn);
|
|
} else if (isTemplateEvent(eventType)) {
|
|
usageEvent = convertTemplateEvent(event);
|
|
} else if (isISOEvent(eventType)) {
|
|
usageEvent = convertISOEvent(event);
|
|
} else if (isSnapshotEvent(eventType)) {
|
|
usageEvent = convertSnapshotEvent(event, conn);
|
|
} /*
|
|
* else if (isSecurityGrpEvent(eventType)) { usageEvent = convertSecurityGrpEvent(event); } else if
|
|
* (isLoadBalancerEvent(eventType)) { usageEvent = convertLoadBalancerEvent(event); }
|
|
*/
|
|
if (usageEvent != null) {
|
|
usageEvent.setCreatedDate(event.getCreateDate());
|
|
if (usageEvent.getZoneId() == -1) {
|
|
usageEvent.setZoneId(0);
|
|
}
|
|
// update firewall_rules table
|
|
PreparedStatement pstmt = null;
|
|
pstmt = conn
|
|
.prepareStatement("INSERT INTO usage_event (usage_event.type, usage_event.created, usage_event.account_id, usage_event.zone_id, usage_event.resource_id, usage_event.resource_name,"
|
|
+ " usage_event.offering_id, usage_event.template_id, usage_event.size) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
pstmt.setString(1, usageEvent.getType());
|
|
pstmt.setString(2, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), usageEvent.getCreateDate()));
|
|
pstmt.setLong(3, usageEvent.getAccountId());
|
|
pstmt.setLong(4, usageEvent.getZoneId());
|
|
pstmt.setLong(5, usageEvent.getResourceId());
|
|
pstmt.setString(6, usageEvent.getResourceName());
|
|
if (usageEvent.getOfferingId() != null) {
|
|
pstmt.setLong(7, usageEvent.getOfferingId());
|
|
} else {
|
|
pstmt.setNull(7, Types.BIGINT);
|
|
}
|
|
if (usageEvent.getTemplateId() != null) {
|
|
pstmt.setLong(8, usageEvent.getTemplateId());
|
|
} else {
|
|
pstmt.setNull(8, Types.BIGINT);
|
|
}
|
|
if (usageEvent.getSize() != null) {
|
|
pstmt.setLong(9, usageEvent.getSize());
|
|
} else {
|
|
pstmt.setNull(9, Types.BIGINT);
|
|
}
|
|
// pstmt.setString(10, usageEvent.getResourceType());
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
}
|
|
}
|
|
|
|
private boolean isVMEvent(String eventType) {
|
|
if (eventType == null) {
|
|
return false;
|
|
}
|
|
return eventType.startsWith("VM.");
|
|
}
|
|
|
|
private boolean isIPEvent(String eventType) {
|
|
if (eventType == null) {
|
|
return false;
|
|
}
|
|
return eventType.startsWith("NET.IP");
|
|
}
|
|
|
|
private boolean isVolumeEvent(String eventType) {
|
|
if (eventType == null) {
|
|
return false;
|
|
}
|
|
return (eventType.equals(EventTypes.EVENT_VOLUME_CREATE) || eventType.equals(EventTypes.EVENT_VOLUME_DELETE));
|
|
}
|
|
|
|
private boolean isTemplateEvent(String eventType) {
|
|
if (eventType == null) {
|
|
return false;
|
|
}
|
|
return (eventType.equals(EventTypes.EVENT_TEMPLATE_CREATE) || eventType.equals(EventTypes.EVENT_TEMPLATE_COPY) || eventType.equals(EventTypes.EVENT_TEMPLATE_DELETE));
|
|
}
|
|
|
|
private boolean isISOEvent(String eventType) {
|
|
if (eventType == null) {
|
|
return false;
|
|
}
|
|
return (eventType.equals(EventTypes.EVENT_ISO_CREATE) || eventType.equals(EventTypes.EVENT_ISO_COPY) || eventType.equals(EventTypes.EVENT_ISO_DELETE));
|
|
}
|
|
|
|
private boolean isSnapshotEvent(String eventType) {
|
|
if (eventType == null) {
|
|
return false;
|
|
}
|
|
return (eventType.equals(EventTypes.EVENT_SNAPSHOT_CREATE) || eventType.equals(EventTypes.EVENT_SNAPSHOT_DELETE));
|
|
}
|
|
|
|
private boolean isLoadBalancerEvent(String eventType) {
|
|
if (eventType == null) {
|
|
return false;
|
|
}
|
|
return eventType.startsWith("LB.");
|
|
}
|
|
|
|
private UsageEventVO convertVMEvent(EventVO event) throws IOException {
|
|
|
|
Properties vmEventParams = new Properties();
|
|
UsageEventVO usageEvent = null;
|
|
long vmId = -1L;
|
|
long soId = -1L; // service offering id
|
|
long zoneId = -1L;
|
|
String eventParams = event.getParameters();
|
|
if (eventParams != null) {
|
|
vmEventParams.load(new StringReader(eventParams));
|
|
vmId = Long.parseLong(vmEventParams.getProperty("id"));
|
|
soId = Long.parseLong(vmEventParams.getProperty("soId"));
|
|
zoneId = Long.parseLong(vmEventParams.getProperty("dcId"));
|
|
}
|
|
|
|
if (EventTypes.EVENT_VM_START.equals(event.getType())) {
|
|
long templateId = 0;
|
|
String tId = vmEventParams.getProperty("tId");
|
|
if (tId != null) {
|
|
templateId = Long.parseLong(tId);
|
|
}
|
|
|
|
usageEvent = new UsageEventVO(EventTypes.EVENT_VM_START, event.getAccountId(), zoneId, vmId, vmEventParams.getProperty("vmName"), soId, templateId, "");
|
|
} else if (EventTypes.EVENT_VM_STOP.equals(event.getType())) {
|
|
usageEvent = new UsageEventVO(EventTypes.EVENT_VM_STOP, event.getAccountId(), zoneId, vmId, vmEventParams.getProperty("vmName"));
|
|
} else if (EventTypes.EVENT_VM_CREATE.equals(event.getType())) {
|
|
Long templateId = null;
|
|
String tId = vmEventParams.getProperty("tId");
|
|
if (tId != null) {
|
|
templateId = new Long(Long.parseLong(tId));
|
|
}
|
|
|
|
usageEvent = new UsageEventVO(EventTypes.EVENT_VM_CREATE, event.getAccountId(), zoneId, vmId, vmEventParams.getProperty("vmName"), soId, templateId, "");
|
|
} else if (EventTypes.EVENT_VM_DESTROY.equals(event.getType())) {
|
|
usageEvent = new UsageEventVO(EventTypes.EVENT_VM_DESTROY, event.getAccountId(), zoneId, vmId, vmEventParams.getProperty("vmName"));
|
|
}
|
|
return usageEvent;
|
|
}
|
|
|
|
private UsageEventVO convertIPEvent(EventVO event, Connection conn) throws IOException, SQLException {
|
|
|
|
Properties ipEventParams = new Properties();
|
|
UsageEventVO usageEvent = null;
|
|
ipEventParams.load(new StringReader(event.getParameters()));
|
|
String ipAddress = ipEventParams.getProperty("address");
|
|
if (ipAddress == null) {
|
|
ipAddress = ipEventParams.getProperty("guestIPaddress");
|
|
if (ipAddress == null) {
|
|
// can not find IP address, bail for this event
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// Get ip address information
|
|
Long ipId = 0L;
|
|
Long zoneId = 0L;
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT id, data_center_id from user_ip_address where public_ip_address=?");
|
|
pstmt.setString(1, ipAddress);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
if (rs.next()) {
|
|
ipId = rs.getLong(1);
|
|
zoneId = rs.getLong(2);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
boolean isSourceNat = Boolean.parseBoolean(ipEventParams.getProperty("sourceNat"));
|
|
|
|
if (EventTypes.EVENT_NET_IP_ASSIGN.equals(event.getType())) {
|
|
zoneId = Long.parseLong(ipEventParams.getProperty("dcId"));
|
|
usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_ASSIGN, event.getAccountId(), zoneId, ipId, ipAddress, isSourceNat,"", false);
|
|
} else if (EventTypes.EVENT_NET_IP_RELEASE.equals(event.getType())) {
|
|
usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_RELEASE, event.getAccountId(), zoneId, ipId, ipAddress, isSourceNat,"", false);
|
|
}
|
|
return usageEvent;
|
|
}
|
|
|
|
private UsageEventVO convertVolumeEvent(EventVO event, Connection conn) throws IOException, SQLException {
|
|
|
|
Properties volEventParams = new Properties();
|
|
long volId = -1L;
|
|
Long doId = -1L;
|
|
long zoneId = -1L;
|
|
Long templateId = -1L;
|
|
long size = -1L;
|
|
UsageEventVO usageEvent = null;
|
|
volEventParams.load(new StringReader(event.getParameters()));
|
|
volId = Long.parseLong(volEventParams.getProperty("id"));
|
|
if (EventTypes.EVENT_VOLUME_CREATE.equals(event.getType())) {
|
|
doId = Long.parseLong(volEventParams.getProperty("doId"));
|
|
zoneId = Long.parseLong(volEventParams.getProperty("dcId"));
|
|
templateId = Long.parseLong(volEventParams.getProperty("tId"));
|
|
size = Long.parseLong(volEventParams.getProperty("size"));
|
|
size = (size * 1048576);
|
|
if (doId == -1) {
|
|
doId = null;
|
|
}
|
|
if (templateId == -1) {
|
|
templateId = null;
|
|
}
|
|
}
|
|
|
|
// Get volume name information
|
|
String volumeName = "";
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT name, data_center_id from volumes where id=?");
|
|
pstmt.setLong(1, volId);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
if (rs.next()) {
|
|
volumeName = rs.getString(1);
|
|
zoneId = rs.getLong(2);
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
if (EventTypes.EVENT_VOLUME_CREATE.equals(event.getType())) {
|
|
usageEvent = new UsageEventVO(EventTypes.EVENT_VOLUME_CREATE, event.getAccountId(), zoneId, volId, volumeName, doId, templateId, size);
|
|
} else if (EventTypes.EVENT_VOLUME_DELETE.equals(event.getType())) {
|
|
usageEvent = new UsageEventVO(EventTypes.EVENT_VOLUME_DELETE, event.getAccountId(), zoneId, volId, volumeName);
|
|
|
|
}
|
|
return usageEvent;
|
|
}
|
|
|
|
private UsageEventVO convertTemplateEvent(EventVO event) throws IOException {
|
|
|
|
Properties templateEventParams = new Properties();
|
|
long templateId = -1L;
|
|
long zoneId = -1L;
|
|
long templateSize = -1L;
|
|
UsageEventVO usageEvent = null;
|
|
|
|
templateEventParams.load(new StringReader(event.getParameters()));
|
|
templateId = Long.parseLong(templateEventParams.getProperty("id"));
|
|
if (templateEventParams.getProperty("dcId") != null) {
|
|
zoneId = Long.parseLong(templateEventParams.getProperty("dcId"));
|
|
}
|
|
if (EventTypes.EVENT_TEMPLATE_CREATE.equals(event.getType()) || EventTypes.EVENT_TEMPLATE_COPY.equals(event.getType())) {
|
|
templateSize = Long.parseLong(templateEventParams.getProperty("size"));
|
|
if (templateSize < 1) {
|
|
return null;
|
|
}
|
|
if (zoneId == -1L) {
|
|
return null;
|
|
}
|
|
usageEvent = new UsageEventVO(event.getType(), event.getAccountId(), zoneId, templateId, "", null, null, templateSize);
|
|
} else if (EventTypes.EVENT_TEMPLATE_DELETE.equals(event.getType())) {
|
|
usageEvent = new UsageEventVO(event.getType(), event.getAccountId(), zoneId, templateId, null);
|
|
}
|
|
return usageEvent;
|
|
}
|
|
|
|
private UsageEventVO convertISOEvent(EventVO event) throws IOException {
|
|
Properties isoEventParams = new Properties();
|
|
long isoId = -1L;
|
|
long isoSize = -1L;
|
|
long zoneId = -1L;
|
|
UsageEventVO usageEvent = null;
|
|
|
|
isoEventParams.load(new StringReader(event.getParameters()));
|
|
isoId = Long.parseLong(isoEventParams.getProperty("id"));
|
|
if (isoEventParams.getProperty("dcId") != null) {
|
|
zoneId = Long.parseLong(isoEventParams.getProperty("dcId"));
|
|
}
|
|
|
|
if (EventTypes.EVENT_ISO_CREATE.equals(event.getType()) || EventTypes.EVENT_ISO_COPY.equals(event.getType())) {
|
|
isoSize = Long.parseLong(isoEventParams.getProperty("size"));
|
|
usageEvent = new UsageEventVO(event.getType(), event.getAccountId(), zoneId, isoId, "", null, null, isoSize);
|
|
} else if (EventTypes.EVENT_ISO_DELETE.equals(event.getType())) {
|
|
usageEvent = new UsageEventVO(event.getType(), event.getAccountId(), zoneId, isoId, null);
|
|
}
|
|
return usageEvent;
|
|
}
|
|
|
|
private UsageEventVO convertSnapshotEvent(EventVO event, Connection conn) throws IOException, SQLException {
|
|
Properties snapEventParams = new Properties();
|
|
long snapId = -1L;
|
|
long snapSize = -1L;
|
|
Long zoneId = 0L;
|
|
UsageEventVO usageEvent = null;
|
|
|
|
snapEventParams.load(new StringReader(event.getParameters()));
|
|
snapId = Long.parseLong(snapEventParams.getProperty("id"));
|
|
String snapshotName = snapEventParams.getProperty("ssName");
|
|
|
|
String size = snapEventParams.getProperty("size");
|
|
if (size != null) {
|
|
snapSize = Long.parseLong(size);
|
|
}
|
|
|
|
String zoneString = snapEventParams.getProperty("dcId");
|
|
if (zoneString != null) {
|
|
zoneId = Long.parseLong(zoneString);
|
|
}
|
|
|
|
Long accountId = event.getAccountId();
|
|
|
|
// Get snapshot info (there was a bug in 2.1.x - accountId is 0, and data_center info is not present in events table
|
|
if (accountId.longValue() == 0L || zoneId.longValue() == 0L) {
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT zone_id, account_id from usage_event where resource_id=? and type like '%SNAPSHOT%'");
|
|
pstmt.setLong(1, snapId);
|
|
ResultSet rs = pstmt.executeQuery();
|
|
if (rs.next()) {
|
|
zoneId = rs.getLong(1);
|
|
accountId = rs.getLong(2);
|
|
}
|
|
|
|
rs.close();
|
|
pstmt.close();
|
|
}
|
|
|
|
if (EventTypes.EVENT_SNAPSHOT_CREATE.equals(event.getType())) {
|
|
usageEvent = new UsageEventVO(EventTypes.EVENT_SNAPSHOT_CREATE, accountId, zoneId, snapId, snapshotName, null, null, snapSize);
|
|
} else if (EventTypes.EVENT_SNAPSHOT_DELETE.equals(event.getType())) {
|
|
usageEvent = new UsageEventVO(EventTypes.EVENT_SNAPSHOT_DELETE, accountId, zoneId, snapId, snapshotName, null, null, 0L);
|
|
}
|
|
return usageEvent;
|
|
}
|
|
|
|
@Override
|
|
public void performDataMigration(Connection conn) {
|
|
try {
|
|
PreparedStatement pstmt = conn.prepareStatement("USE cloud");
|
|
pstmt.executeQuery();
|
|
upgradeDataCenter(conn);
|
|
upgradeStoragePools(conn);
|
|
upgradeInstanceGroups(conn);
|
|
upgradePortForwardingRules(conn);
|
|
upgradeLoadBalancingRules(conn);
|
|
upgradeHostMemoryCapacityInfo(conn);
|
|
upgradeHostCpuCapacityInfo(conn);
|
|
upgradeDomainResourceCounts(conn);
|
|
|
|
migrateEvents(conn);
|
|
createPortForwardingEvents(conn);
|
|
createLoadBalancerEvents(conn);
|
|
createNetworkOfferingEvents(conn);
|
|
|
|
// Update hypervisor type for user vm to be consistent with original 2.2.4
|
|
pstmt = conn.prepareStatement("UPDATE vm_instance SET hypervisor_type='XenServer' WHERE hypervisor_type='xenserver'");
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
// Set account=systemAccount and domain=ROOT for CPVM/SSVM
|
|
pstmt = conn.prepareStatement("UPDATE vm_instance SET account_id=1, domain_id=1 WHERE type='ConsoleProxy' or type='SecondaryStorageVm'");
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
// Update user statistics
|
|
updateUserStats(conn);
|
|
|
|
// delete orphaned (storage pool no longer exists) template_spool_ref(s)
|
|
deleteOrphanedTemplateRef(conn);
|
|
|
|
// Upgrade volumes with incorrect Destroyed field
|
|
cleanupVolumes(conn);
|
|
|
|
// modify network_group indexes
|
|
modifyIndexes(conn);
|
|
|
|
// cleanup lb - vm maps for load balancers that are already removed (there was a bug in 2.1.x when the mappings were
|
|
// left around)
|
|
cleanupLbVmMaps(conn);
|
|
|
|
} catch (SQLException e) {
|
|
s_logger.error("Can't perform data migration ", e);
|
|
throw new CloudRuntimeException("Can't perform data migration ", e);
|
|
}
|
|
|
|
}
|
|
|
|
@Override
|
|
public File[] getCleanupScripts() {
|
|
String file = Script.findScript("", "db/schema-21to22-cleanup.sql");
|
|
if (file == null) {
|
|
throw new CloudRuntimeException("Unable to find the upgrade script, schema-21to22-cleanup.sql");
|
|
}
|
|
|
|
return new File[] { new File(file) };
|
|
}
|
|
|
|
@Override
|
|
public String[] getUpgradableVersionRange() {
|
|
return new String[] { "2.1.8", "2.1.8" };
|
|
}
|
|
|
|
@Override
|
|
public String getUpgradedVersion() {
|
|
return "2.2.1";
|
|
}
|
|
|
|
@Override
|
|
public boolean supportsRollingUpgrade() {
|
|
return false;
|
|
}
|
|
|
|
private void deleteOrphanedTemplateRef(Connection conn) {
|
|
try {
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT id, pool_id from template_spool_ref");
|
|
ResultSet rs = pstmt.executeQuery();
|
|
if (!rs.next()) {
|
|
s_logger.debug("No records in template_spool_ref, skipping this upgrade part");
|
|
return;
|
|
}
|
|
|
|
while (rs.next()) {
|
|
Long id = rs.getLong(1);
|
|
Long poolId = rs.getLong(2);
|
|
|
|
pstmt = conn.prepareStatement("SELECT * from storage_pool where id=?");
|
|
pstmt.setLong(1, poolId);
|
|
ResultSet rs1 = pstmt.executeQuery();
|
|
|
|
if (!rs1.next()) {
|
|
s_logger.debug("Orphaned template_spool_ref record is found (storage pool doesn't exist any more0) id=" + id + "; so removing the record");
|
|
pstmt = conn.prepareStatement("DELETE FROM template_spool_ref where id=?");
|
|
pstmt.setLong(1, id);
|
|
pstmt.executeUpdate();
|
|
}
|
|
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
s_logger.debug("Finished deleting orphaned template_spool_ref(s)");
|
|
} catch (Exception e) {
|
|
s_logger.error("Failed to delete orphaned template_spool_ref(s): ", e);
|
|
throw new CloudRuntimeException("Failed to delete orphaned template_spool_ref(s): ", e);
|
|
}
|
|
}
|
|
|
|
private void cleanupVolumes(Connection conn) {
|
|
try {
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT id, instance_id, account_id from volumes where destroyed=127");
|
|
ResultSet rs = pstmt.executeQuery();
|
|
|
|
while (rs.next()) {
|
|
Long id = rs.getLong(1);
|
|
s_logger.debug("Volume id is " + id);
|
|
Long instanceId = rs.getLong(2);
|
|
Long accountId = rs.getLong(3);
|
|
|
|
boolean removeVolume = false;
|
|
|
|
pstmt = conn.prepareStatement("SELECT * from account where id=? and removed is not null");
|
|
pstmt.setLong(1, accountId);
|
|
ResultSet rs1 = pstmt.executeQuery();
|
|
|
|
if (rs1.next()) {
|
|
removeVolume = true;
|
|
}
|
|
|
|
if (instanceId != null) {
|
|
pstmt = conn.prepareStatement("SELECT * from vm_instance where id=? and removed is not null");
|
|
pstmt.setLong(1, instanceId);
|
|
rs1 = pstmt.executeQuery();
|
|
|
|
if (rs1.next()) {
|
|
removeVolume = true;
|
|
}
|
|
}
|
|
|
|
if (removeVolume) {
|
|
pstmt = conn.prepareStatement("UPDATE volumes SET state='Destroy' WHERE id=?");
|
|
pstmt.setLong(1, id);
|
|
pstmt.executeUpdate();
|
|
s_logger.debug("Volume with id=" + id + " is marked with Destroy state as a part of volume cleanup (it's Destroyed had 127 value)");
|
|
}
|
|
}
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
s_logger.debug("Finished cleaning up volumes with incorrect Destroyed field (127)");
|
|
} catch (Exception e) {
|
|
s_logger.error("Failed to cleanup volumes with incorrect Destroyed field (127):", e);
|
|
throw new CloudRuntimeException("Failed to cleanup volumes with incorrect Destroyed field (127):", e);
|
|
}
|
|
}
|
|
|
|
private void modifyIndexes(Connection conn) {
|
|
try {
|
|
|
|
// removed indexes
|
|
PreparedStatement pstmt = conn.prepareStatement("SHOW INDEX FROM security_group WHERE KEY_NAME = 'fk_network_group__account_id'");
|
|
ResultSet rs = pstmt.executeQuery();
|
|
|
|
if (rs.next()) {
|
|
pstmt = conn.prepareStatement("ALTER TABLE `cloud`.`security_group` DROP INDEX `fk_network_group__account_id`");
|
|
pstmt.executeUpdate();
|
|
s_logger.debug("Unique key 'fk_network_group__account_id' is removed successfully");
|
|
}
|
|
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
pstmt = conn.prepareStatement("SHOW INDEX FROM security_group WHERE KEY_NAME = 'fk_network_group___account_id'");
|
|
rs = pstmt.executeQuery();
|
|
|
|
if (rs.next()) {
|
|
pstmt = conn.prepareStatement("ALTER TABLE `cloud`.`security_group` DROP INDEX `fk_network_group___account_id`");
|
|
pstmt.executeUpdate();
|
|
s_logger.debug("Unique key 'fk_network_group___account_id' is removed successfully");
|
|
}
|
|
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
// add indexes
|
|
pstmt = conn
|
|
.prepareStatement("ALTER TABLE `cloud`.`security_group` ADD CONSTRAINT `fk_security_group___account_id` FOREIGN KEY `fk_security_group__account_id` (`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE");
|
|
pstmt.executeUpdate();
|
|
pstmt.close();
|
|
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Unable to drop indexes for 'security_group' table due to:", e);
|
|
}
|
|
}
|
|
|
|
// There was a bug in 2.1.x when LB rule mapping wasn't removed along with lb rule removal
|
|
// Do cleanup after making sure that the rule was removed
|
|
private void cleanupLbVmMaps(Connection conn) {
|
|
try {
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT DISTINCT load_balancer_id FROM load_balancer_vm_map");
|
|
ResultSet rs = pstmt.executeQuery();
|
|
|
|
while (rs.next()) {
|
|
long lbId = rs.getLong(1);
|
|
PreparedStatement pstmt1 = conn.prepareStatement("SELECT * FROM load_balancer where id=?");
|
|
pstmt1.setLong(1, lbId);
|
|
ResultSet rs1 = pstmt1.executeQuery();
|
|
|
|
PreparedStatement pstmt2 = conn.prepareStatement("SELECT * from event where type like '%lb.delete%' and parameters like '%id=" + lbId + "%'");
|
|
ResultSet rs2 = pstmt2.executeQuery();
|
|
|
|
if (!rs1.next() && rs2.next()) {
|
|
s_logger.debug("Removing load balancer vm mappings for lb id=" + lbId + " as a part of cleanup");
|
|
pstmt = conn.prepareStatement("DELETE FROM load_balancer_vm_map where load_balancer_id=?");
|
|
pstmt.setLong(1, lbId);
|
|
pstmt.executeUpdate();
|
|
}
|
|
rs1.close();
|
|
rs2.close();
|
|
pstmt1.close();
|
|
pstmt2.close();
|
|
}
|
|
|
|
rs.close();
|
|
pstmt.close();
|
|
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Failed to cleanup orpahned lb-vm mappings due to:", e);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Create usage events for existing port forwarding rules
|
|
*/
|
|
private void createPortForwardingEvents(Connection conn) {
|
|
try {
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT fw.account_id, ip.data_center_id, fw.id FROM firewall_rules fw, user_ip_address ip where purpose = 'PortForwarding' and "
|
|
+ "fw.state = 'Active' and ip.id = fw.ip_address_id");
|
|
s_logger.debug("Creating Port Forwarding usage events");
|
|
ResultSet rs = pstmt.executeQuery();
|
|
Date now = new Date();
|
|
while (rs.next()) {
|
|
long accountId = rs.getLong(1);
|
|
long zoneId = rs.getLong(2);
|
|
long ruleId = rs.getLong(3);
|
|
PreparedStatement pstmt1 = null;
|
|
pstmt1 = conn.prepareStatement("INSERT INTO usage_event (usage_event.type, usage_event.created, usage_event.account_id, usage_event.zone_id, usage_event.resource_id)"
|
|
+ " VALUES (?, ?, ?, ?, ?)");
|
|
pstmt1.setString(1, EventTypes.EVENT_NET_RULE_ADD);
|
|
pstmt1.setString(2, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), now));
|
|
pstmt1.setLong(3, accountId);
|
|
pstmt1.setLong(4, zoneId);
|
|
pstmt1.setLong(5, ruleId);
|
|
|
|
pstmt1.executeUpdate();
|
|
pstmt1.close();
|
|
}
|
|
|
|
rs.close();
|
|
pstmt.close();
|
|
s_logger.debug("Completed creating Port Forwarding usage events");
|
|
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Failed to add port forwarding usage events due to:", e);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Create usage events for existing load balancer rules
|
|
*/
|
|
private void createLoadBalancerEvents(Connection conn) {
|
|
try {
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT fw.account_id, ip.data_center_id, fw.id FROM firewall_rules fw, user_ip_address ip where purpose = 'LoadBalancing' and "
|
|
+ "fw.state = 'Active' and ip.id = fw.ip_address_id");
|
|
s_logger.debug("Creating load balancer usage events");
|
|
ResultSet rs = pstmt.executeQuery();
|
|
Date now = new Date();
|
|
while (rs.next()) {
|
|
long accountId = rs.getLong(1);
|
|
long zoneId = rs.getLong(2);
|
|
long ruleId = rs.getLong(3);
|
|
PreparedStatement pstmt1 = null;
|
|
pstmt1 = conn.prepareStatement("INSERT INTO usage_event (usage_event.type, usage_event.created, usage_event.account_id, usage_event.zone_id, usage_event.resource_id)"
|
|
+ " VALUES (?, ?, ?, ?, ?)");
|
|
pstmt1.setString(1, EventTypes.EVENT_LOAD_BALANCER_CREATE);
|
|
pstmt1.setString(2, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), now));
|
|
pstmt1.setLong(3, accountId);
|
|
pstmt1.setLong(4, zoneId);
|
|
pstmt1.setLong(5, ruleId);
|
|
|
|
pstmt1.executeUpdate();
|
|
pstmt1.close();
|
|
}
|
|
|
|
rs.close();
|
|
pstmt.close();
|
|
s_logger.debug("Completed creating load balancer usage events");
|
|
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Failed to add Load Balancer usage events due to:", e);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Create usage events for network offerings
|
|
*/
|
|
private void createNetworkOfferingEvents(Connection conn) {
|
|
try {
|
|
PreparedStatement pstmt = conn.prepareStatement("SELECT vm.account_id, vm.data_center_id, ni.instance_id, vm.name, nw.network_offering_id, nw.is_default FROM nics ni, "
|
|
+ "networks nw, vm_instance vm where vm.type = 'User' and ni.removed is null and ni.instance_id = vm.id and ni.network_id = nw.id;");
|
|
s_logger.debug("Creating network offering usage events");
|
|
ResultSet rs = pstmt.executeQuery();
|
|
Date now = new Date();
|
|
while (rs.next()) {
|
|
long accountId = rs.getLong(1);
|
|
long zoneId = rs.getLong(2);
|
|
long vmId = rs.getLong(3);
|
|
String vmName = rs.getString(4);
|
|
long nw_offering_id = rs.getLong(5);
|
|
long isDefault = rs.getLong(6);
|
|
PreparedStatement pstmt1 = null;
|
|
pstmt1 = conn
|
|
.prepareStatement("INSERT INTO usage_event (usage_event.type, usage_event.created, usage_event.account_id, usage_event.zone_id, usage_event.resource_id, usage_event.resource_name, "
|
|
+ "usage_event.offering_id, usage_event.size)" + " VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
|
|
pstmt1.setString(1, EventTypes.EVENT_NETWORK_OFFERING_ASSIGN);
|
|
pstmt1.setString(2, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), now));
|
|
pstmt1.setLong(3, accountId);
|
|
pstmt1.setLong(4, zoneId);
|
|
pstmt1.setLong(5, vmId);
|
|
pstmt1.setString(6, vmName);
|
|
pstmt1.setLong(7, nw_offering_id);
|
|
pstmt1.setLong(8, isDefault);
|
|
|
|
pstmt1.executeUpdate();
|
|
pstmt1.close();
|
|
}
|
|
|
|
rs.close();
|
|
pstmt.close();
|
|
s_logger.debug("Completed creating network offering usage events");
|
|
|
|
} catch (SQLException e) {
|
|
throw new CloudRuntimeException("Failed to add network offering usage events due to:", e);
|
|
}
|
|
}
|
|
|
|
}
|