mirror of https://github.com/apache/cloudstack.git
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:
parent
e90e5e9c8c
commit
686064a8be
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue