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();
+ }
+}