You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by li...@apache.org on 2014/07/07 13:33:30 UTC
git commit: updated refs/heads/master to 8e11285
Repository: cloudstack
Updated Branches:
refs/heads/master 8cf94c9ec -> 8e112858d
CLOUDSTACK-7071. Upgrade to CCP 4.2 fails in case a VMware setup has multiple zones mapping to the same VMware datacenter.
If 2 or more CloudStack zones map to the same VMware datacenter, mark the zones as legacy zones.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/8e112858
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/8e112858
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/8e112858
Branch: refs/heads/master
Commit: 8e112858d35a77943e154e69736caaf2e5b94e7d
Parents: 8cf94c9
Author: Likitha Shetty <li...@citrix.com>
Authored: Fri Jul 4 12:24:25 2014 +0530
Committer: Likitha Shetty <li...@citrix.com>
Committed: Mon Jul 7 16:38:56 2014 +0530
----------------------------------------------------------------------
.../com/cloud/upgrade/dao/Upgrade410to420.java | 163 +++++++++++++------
1 file changed, 117 insertions(+), 46 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8e112858/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
index 671cbb7..097f6c5 100755
--- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
+++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
@@ -863,14 +863,14 @@ public class Upgrade410to420 implements DbUpgrade {
private void persistLegacyZones(Connection conn) {
List<Long> listOfLegacyZones = new ArrayList<Long>();
+ List<Long> listOfNonLegacyZones = new ArrayList<Long>();
+ Map<String, ArrayList<Long>> dcToZoneMap = new HashMap<String, ArrayList<Long>>();
PreparedStatement pstmt = null;
PreparedStatement clustersQuery = null;
PreparedStatement clusterDetailsQuery = null;
ResultSet rs = null;
ResultSet clusters = null;
ResultSet clusterDetails = null;
- ResultSet dcInfo = null;
- Long vmwareDcId = 1L;
Long zoneId;
Long clusterId;
String clusterHypervisorType;
@@ -881,13 +881,8 @@ public class Upgrade410to420 implements DbUpgrade {
String dcOfCurrentCluster = null;
String[] tokens;
String url;
- String user = "";
- String password = "";
String vc = "";
String dcName = "";
- String guid;
- String key;
- String value;
try {
pstmt = conn.prepareStatement("select id from `cloud`.`data_center` where removed is NULL");
@@ -899,6 +894,7 @@ public class Upgrade410to420 implements DbUpgrade {
clustersQuery.setLong(1, zoneId);
legacyZone = false;
ignoreZone = true;
+ ArrayList<String> dcList = new ArrayList<String>();
count = 0L;
// Legacy zone term is meant only for VMware
// Legacy zone is a zone with atleast 2 clusters & with multiple DCs or VCs
@@ -923,6 +919,9 @@ public class Upgrade410to420 implements DbUpgrade {
dcName = tokens[3];
dcOfPreviousCluster = dcOfCurrentCluster;
dcOfCurrentCluster = dcName + "@" + vc;
+ if (!dcList.contains(dcOfCurrentCluster)) {
+ dcList.add(dcOfCurrentCluster);
+ }
if (count > 0) {
if (!dcOfPreviousCluster.equalsIgnoreCase(dcOfCurrentCluster)) {
legacyZone = true;
@@ -942,47 +941,30 @@ public class Upgrade410to420 implements DbUpgrade {
if (legacyZone) {
listOfLegacyZones.add(zoneId);
} else {
- assert (clusterDetails != null) : "Couldn't retrieve details of cluster!";
- s_logger.debug("Discovered non-legacy zone " + zoneId + ". Processing the zone to associate with VMware datacenter.");
-
- clusterDetailsQuery = conn.prepareStatement("select name, value from `cloud`.`cluster_details` where cluster_id=?");
- clusterDetailsQuery.setLong(1, clusterId);
- clusterDetails = clusterDetailsQuery.executeQuery();
- while (clusterDetails.next()) {
- key = clusterDetails.getString(1);
- value = clusterDetails.getString(2);
- if (key.equalsIgnoreCase("username")) {
- user = value;
- } else if (key.equalsIgnoreCase("password")) {
- password = value;
- }
+ listOfNonLegacyZones.add(zoneId);
+ }
+ for (String dc : dcList) {
+ ArrayList<Long> dcZones = new ArrayList<Long>();
+ if (dcToZoneMap.get(dc) != null) {
+ dcZones = dcToZoneMap.get(dc);
}
- guid = dcName + "@" + vc;
-
- pstmt =
- conn.prepareStatement("INSERT INTO `cloud`.`vmware_data_center` (uuid, name, guid, vcenter_host, username, password) values(?, ?, ?, ?, ?, ?)");
- pstmt.setString(1, UUID.randomUUID().toString());
- pstmt.setString(2, dcName);
- pstmt.setString(3, guid);
- pstmt.setString(4, vc);
- pstmt.setString(5, user);
- pstmt.setString(6, password);
- pstmt.executeUpdate();
-
- pstmt = conn.prepareStatement("SELECT id FROM `cloud`.`vmware_data_center` where guid=?");
- pstmt.setString(1, guid);
- dcInfo = pstmt.executeQuery();
- if (dcInfo.next()) {
- vmwareDcId = dcInfo.getLong("id");
+ dcZones.add(zoneId);
+ dcToZoneMap.put(dc, dcZones);
+ }
+ }
+ // If a VMware datacenter in a vCenter maps to more than 1 CloudStack zone, mark all the zones it is mapped to as legacy
+ for (Map.Entry<String, ArrayList<Long>> entry : dcToZoneMap.entrySet()) {
+ if (entry.getValue().size() > 1) {
+ for (Long newLegacyZone : entry.getValue()) {
+ if (listOfNonLegacyZones.contains(newLegacyZone)) {
+ listOfNonLegacyZones.remove(newLegacyZone);
+ listOfLegacyZones.add(newLegacyZone);
+ }
}
-
- pstmt = conn.prepareStatement("INSERT INTO `cloud`.`vmware_data_center_zone_map` (zone_id, vmware_data_center_id) values(?, ?)");
- pstmt.setLong(1, zoneId);
- pstmt.setLong(2, vmwareDcId);
- pstmt.executeUpdate();
}
}
updateLegacyZones(conn, listOfLegacyZones);
+ updateNonLegacyZones(conn, listOfNonLegacyZones);
} catch (SQLException e) {
String msg = "Unable to discover legacy zones." + e.getMessage();
s_logger.error(msg);
@@ -995,9 +977,6 @@ public class Upgrade410to420 implements DbUpgrade {
if (pstmt != null) {
pstmt.close();
}
- if (dcInfo != null) {
- dcInfo.close();
- }
if (clusters != null) {
clusters.close();
}
@@ -1037,6 +1016,98 @@ public class Upgrade410to420 implements DbUpgrade {
}
}
+ private void updateNonLegacyZones(Connection conn, List<Long> zones) {
+ PreparedStatement clustersQuery = null;
+ PreparedStatement clusterDetailsQuery = null;
+ PreparedStatement pstmt = null;
+ ResultSet clusters = null;
+ ResultSet clusterDetails = null;
+ ResultSet dcInfo = null;
+ try {
+ for (Long zoneId : zones) {
+ s_logger.debug("Discovered non-legacy zone " + zoneId + ". Processing the zone to associate with VMware datacenter.");
+
+ // All clusters in a non legacy zone will belong to the same VMware DC, hence pick the first cluster
+ clustersQuery = conn.prepareStatement("select id from `cloud`.`cluster` where removed is NULL AND data_center_id=?");
+ clustersQuery.setLong(1, zoneId);
+ clusters = clustersQuery.executeQuery();
+ clusters.next();
+ Long clusterId = clusters.getLong("id");
+
+ // Get VMware datacenter details from cluster_details table
+ String user = null;
+ String password = null;
+ String url = null;
+ clusterDetailsQuery = conn.prepareStatement("select name, value from `cloud`.`cluster_details` where cluster_id=?");
+ clusterDetailsQuery.setLong(1, clusterId);
+ clusterDetails = clusterDetailsQuery.executeQuery();
+ while (clusterDetails.next()) {
+ String key = clusterDetails.getString(1);
+ String value = clusterDetails.getString(2);
+ if (key.equalsIgnoreCase("username")) {
+ user = value;
+ } else if (key.equalsIgnoreCase("password")) {
+ password = value;
+ } else if (key.equalsIgnoreCase("url")) {
+ url = value;
+ }
+ }
+ String[] tokens = url.split("/"); // url format - http://vcenter/dc/cluster
+ String vc = tokens[2];
+ String dcName = tokens[3];
+ String guid = dcName + "@" + vc;
+
+ pstmt = conn.prepareStatement("INSERT INTO `cloud`.`vmware_data_center` (uuid, name, guid, vcenter_host, username, password) values(?, ?, ?, ?, ?, ?)");
+ pstmt.setString(1, UUID.randomUUID().toString());
+ pstmt.setString(2, dcName);
+ pstmt.setString(3, guid);
+ pstmt.setString(4, vc);
+ pstmt.setString(5, user);
+ pstmt.setString(6, password);
+ pstmt.executeUpdate();
+
+ pstmt = conn.prepareStatement("SELECT id FROM `cloud`.`vmware_data_center` where guid=?");
+ pstmt.setString(1, guid);
+ dcInfo = pstmt.executeQuery();
+ Long vmwareDcId = -1L;
+ if (dcInfo.next()) {
+ vmwareDcId = dcInfo.getLong("id");
+ }
+
+ pstmt = conn.prepareStatement("INSERT INTO `cloud`.`vmware_data_center_zone_map` (zone_id, vmware_data_center_id) values(?, ?)");
+ pstmt.setLong(1, zoneId);
+ pstmt.setLong(2, vmwareDcId);
+ pstmt.executeUpdate();
+ }
+ } catch (SQLException e) {
+ String msg = "Unable to update non legacy zones." + e.getMessage();
+ s_logger.error(msg);
+ throw new CloudRuntimeException(msg, e);
+ } finally {
+ try {
+ if (clustersQuery != null) {
+ clustersQuery.close();
+ }
+ if (clusterDetails != null) {
+ clusterDetails.close();
+ }
+ if (clusterDetailsQuery != null) {
+ clusterDetailsQuery.close();
+ }
+ if (clusters != null) {
+ clusters.close();
+ }
+ if (dcInfo != null) {
+ dcInfo.close();
+ }
+ if (pstmt != null) {
+ pstmt.close();
+ }
+ } catch (SQLException e) {
+ }
+ }
+ }
+
private void createPlaceHolderNics(Connection conn) {
PreparedStatement pstmt = null;
ResultSet rs = null;