From 686064a8be8771b90441ebaa32938e5d419cec2b Mon Sep 17 00:00:00 2001 From: Vijayendra Bhamidipati Date: Tue, 22 May 2012 17:54:32 -0700 Subject: [PATCH] CS-15055: DB exception when creating n1kv VSM when adding a cluster via the latest management server GUI. Description: Adding an optional flag to the addCluster command, "addvsmflag". If this is set to true, the API will throw an exception if any VSM parameter is missed out. The above bug was running into a DB exception because the vCenter ipaddress wasn't passed in and the API didn't catch it. --- api/src/com/cloud/api/ApiConstants.java | 1 + .../com/cloud/api/commands/AddClusterCmd.java | 7 ++ .../cloud/resource/ResourceManagerImpl.java | 81 ++++++++++--------- 3 files changed, 51 insertions(+), 38 deletions(-) diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 03d233115cd..27b8ef82c6b 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -353,6 +353,7 @@ public class ApiConstants { public static final String VSM_CONFIG_MODE = "vsmconfigmode"; public static final String VSM_CONFIG_STATE = "vsmconfigstate"; public static final String VSM_DEVICE_STATE = "vsmdevicestate"; + public static final String ADD_VSM_FLAG = "addvsmflag"; public enum HostDetails { all, capacity, events, stats, min; diff --git a/api/src/com/cloud/api/commands/AddClusterCmd.java b/api/src/com/cloud/api/commands/AddClusterCmd.java index 17d1b32910c..4776ee97e81 100755 --- a/api/src/com/cloud/api/commands/AddClusterCmd.java +++ b/api/src/com/cloud/api/commands/AddClusterCmd.java @@ -79,6 +79,13 @@ public class AddClusterCmd extends BaseCmd { @Parameter(name = ApiConstants.VCENTER_DC_NAME, type = CommandType.STRING, required = false, description = "the name of the vCenter Data Center the VSM associated with this cluster will serve") private String vcenterdcname; + @Parameter(name = ApiConstants.ADD_VSM_FLAG, type = CommandType.STRING, required = false, description = "flag that indicates a Cisco Nexus 1000v VSM is being associated with this cluster") + private String addVSMFlag; + + public String getAddVSMFlag() { + return addVSMFlag; + } + public String getvCenterDCName() { return vcenterdcname; } diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index b143931a4f1..a67a834edd0 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -414,48 +414,53 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma } clusterId = cluster.getId(); result.add(cluster); + + if (cmd.getAddVSMFlag().equalsIgnoreCase("true")) { - String vsmIp = cmd.getVSMIpaddress(); - String vsmUser = cmd.getVSMUsername(); - String vsmPassword = cmd.getVSMPassword(); - String vCenterIpaddr = cmd.getvCenterIPAddr(); - String vCenterDcName = cmd.getvCenterDCName(); + String vsmIp = cmd.getVSMIpaddress(); + String vsmUser = cmd.getVSMUsername(); + String vsmPassword = cmd.getVSMPassword(); + String vCenterIpaddr = cmd.getvCenterIPAddr(); + String vCenterDcName = cmd.getvCenterDCName(); - if (vsmIp != null && vsmUser != null && vsmPassword != null) { - NetconfHelper netconfClient; - try { - netconfClient = new NetconfHelper(vsmIp, vsmUser, vsmPassword); - netconfClient.disconnect(); - } catch (CloudRuntimeException e) { - String msg = "Invalid credentials supplied for user " + vsmUser + " for Cisco Nexus 1000v VSM at " + vsmIp; - s_logger.error(msg); - throw new CloudRuntimeException(msg); - } - // persist credentials in database - CiscoNexusVSMDeviceVO vsm = new CiscoNexusVSMDeviceVO(vsmIp, vsmUser, vsmPassword, vCenterIpaddr, vCenterDcName); + if (vsmIp != null && vsmUser != null && vsmPassword != null && vCenterIpaddr != null && vCenterDcName != null) { + NetconfHelper netconfClient; + try { + netconfClient = new NetconfHelper(vsmIp, vsmUser, vsmPassword); + netconfClient.disconnect(); + } catch (CloudRuntimeException e) { + String msg = "Invalid credentials supplied for user " + vsmUser + " for Cisco Nexus 1000v VSM at " + vsmIp; + s_logger.error(msg); + throw new CloudRuntimeException(msg); + } + // persist credentials in database + CiscoNexusVSMDeviceVO vsm = new CiscoNexusVSMDeviceVO(vsmIp, vsmUser, vsmPassword, vCenterIpaddr, vCenterDcName); - Transaction txn = Transaction.currentTxn(); - try { - txn.start(); - vsm = _vsmDao.persist(vsm); - txn.commit(); - } catch (Exception e) { - txn.rollback(); - s_logger.error("Failed to persist VSM details to database. Exception: " + e.getMessage()); - throw new CloudRuntimeException(e.getMessage()); - } + Transaction txn = Transaction.currentTxn(); + try { + txn.start(); + vsm = _vsmDao.persist(vsm); + txn.commit(); + } catch (Exception e) { + txn.rollback(); + s_logger.error("Failed to persist VSM details to database. Exception: " + e.getMessage()); + throw new CloudRuntimeException(e.getMessage()); + } - ClusterVSMMapVO connectorObj = new ClusterVSMMapVO(clusterId, vsm.getId()); - txn = Transaction.currentTxn(); - try { - txn.start(); - _clusterVSMDao.persist(connectorObj); - txn.commit(); - } catch (Exception e) { - txn.rollback(); - s_logger.error("Failed to associate VSM with cluster: " + clusterName + ". Exception: " + e.getMessage()); - throw new CloudRuntimeException(e.getMessage()); - } + ClusterVSMMapVO connectorObj = new ClusterVSMMapVO(clusterId, vsm.getId()); + txn = Transaction.currentTxn(); + try { + txn.start(); + _clusterVSMDao.persist(connectorObj); + txn.commit(); + } catch (Exception e) { + txn.rollback(); + s_logger.error("Failed to associate VSM with cluster: " + clusterName + ". Exception: " + e.getMessage()); + throw new CloudRuntimeException(e.getMessage()); + } + } else { + throw new CloudRuntimeException("All required parameters for VSM not specified"); + } } if (clusterType == Cluster.ClusterType.CloudManaged) {