From 82ffddc7b8ceee55b76be73f8877f07104c46458 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 f678e07bf3e..6ef4b32d752 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -354,6 +354,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 c8f7eae7811..cb2df870410 100755 --- a/api/src/com/cloud/api/commands/AddClusterCmd.java +++ b/api/src/com/cloud/api/commands/AddClusterCmd.java @@ -81,6 +81,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 62653c016b3..22700fc6324 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -430,48 +430,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) {