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.
This commit is contained in:
Vijayendra Bhamidipati 2012-05-22 17:54:32 -07:00
parent e90e5e9c8c
commit 686064a8be
3 changed files with 51 additions and 38 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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) {