From 030286279cb84c6afcab6c6811c0478e99652678 Mon Sep 17 00:00:00 2001 From: abhishek Date: Fri, 4 Feb 2011 08:52:25 -0800 Subject: [PATCH] adding a migration util --- .../Db22beta4to22GAMigrationUtil.java | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 server/src/com/cloud/migration/Db22beta4to22GAMigrationUtil.java diff --git a/server/src/com/cloud/migration/Db22beta4to22GAMigrationUtil.java b/server/src/com/cloud/migration/Db22beta4to22GAMigrationUtil.java new file mode 100644 index 00000000000..fb7c0bd5bd0 --- /dev/null +++ b/server/src/com/cloud/migration/Db22beta4to22GAMigrationUtil.java @@ -0,0 +1,129 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.migration; + +import java.io.File; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import org.apache.log4j.xml.DOMConfigurator; + +import com.cloud.utils.PropertiesUtil; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; + +@DB(txn=false) +public class Db22beta4to22GAMigrationUtil { + + private Map pfRuleIdToIpAddressIdMap = new HashMap(); + private final String FindPfIdToPublicIpId = "SELECT id,ip_address_id from firewall_rules where is_static_nat=1"; + private final String FindVmIdPerPfRule = "SELECT instance_id from port_forwarding_rules where id = ?"; + private final String WriteVmIdToIpAddrTable = "UPDATE user_ip_address set vm_id = ? where id = ?"; + protected Db22beta4to22GAMigrationUtil() { + } + + @DB + //This method gets us a map of pf/firewall id <-> ip address id + //Using the keyset, we will iterate over the pf table to find corresponding vm id + //When we get the vm id, we will use the val for each key to update the corresponding ip addr row with the vm id + public void populateMap(){ + Long key = null; + Long val = null; + + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + + StringBuilder sql = new StringBuilder(FindPfIdToPublicIpId); + + PreparedStatement pstmt = null; + try { + pstmt = txn.prepareAutoCloseStatement(sql.toString()); + + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + key = rs.getLong("id"); + val = rs.getLong("ip_address_id"); + pfRuleIdToIpAddressIdMap.put(key, val); + } + + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to execute " + pstmt.toString(), e); + } + + } + + @DB + public void updateVmIdForIpAddresses(){ + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + Set pfIds = pfRuleIdToIpAddressIdMap.keySet(); + StringBuilder sql = new StringBuilder(FindVmIdPerPfRule); + Long vmId = null; + Long ipAddressId = null; + PreparedStatement pstmt = null; + for(Long pfId : pfIds){ + try { + pstmt = txn.prepareAutoCloseStatement(sql.toString()); + pstmt.setLong(1, pfId); + ResultSet rs = pstmt.executeQuery(); + while(rs.next()) { + vmId = rs.getLong("instance_id"); + } + ipAddressId = pfRuleIdToIpAddressIdMap.get(pfId); + finallyUpdate(ipAddressId, vmId, txn); + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to execute " + pstmt.toString(), e); + } + } + } + + @DB + public void finallyUpdate(Long ipAddressId, Long vmId, Transaction txn){ + + StringBuilder sql = new StringBuilder(WriteVmIdToIpAddrTable); + + PreparedStatement pstmt = null; + try { + pstmt = txn.prepareAutoCloseStatement(sql.toString()); + pstmt.setLong(1, vmId); + pstmt.setLong(2, ipAddressId); + int rs = pstmt.executeUpdate(); + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to execute " + pstmt.toString(), e); + } + } + + public static void main(String[] args) { + + File file = PropertiesUtil.findConfigFile("log4j-cloud.xml"); + + if(file != null) { + System.out.println("Log4j configuration from : " + file.getAbsolutePath()); + DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000); + } else { + System.out.println("Configure log4j with default properties"); + } + + Db22beta4to22GAMigrationUtil util = new Db22beta4to22GAMigrationUtil(); + util.populateMap(); + util.updateVmIdForIpAddresses(); + } +}