Skip to content

Commit 8296d41

Browse files
author
Prachi Damle
committed
CLOUDSTACK-1330: ec2-run-instances - When -n option is used to deploy multiple Vms API returns error even though few of the Vms have been deployed successfully.
Changes: - Instead of throwing out error, return the response containing the info about the instances that were launched.
1 parent 11d5ead commit 8296d41

1 file changed

Lines changed: 39 additions & 33 deletions

File tree

awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,47 +1423,53 @@ public EC2RunInstancesResponse runInstances(EC2RunInstances request) {
14231423

14241424
// now actually deploy the vms
14251425
for( int i=0; i < createInstances; i++ ) {
1426-
CloudStackUserVm resp = getApi().deployVirtualMachine(svcOffering.getId(),
1427-
request.getTemplateId(), zoneId, null, null, null, null,
1428-
null, null, null, request.getKeyName(), null, (network != null ? network.getId() : null),
1429-
null, constructList(request.getGroupSet()), request.getSize().longValue(), request.getUserData());
1430-
EC2Instance vm = new EC2Instance();
1431-
vm.setId(resp.getId().toString());
1432-
vm.setName(resp.getName());
1433-
vm.setZoneName(resp.getZoneName());
1434-
vm.setTemplateId(resp.getTemplateId().toString());
1435-
if (resp.getSecurityGroupList() != null && resp.getSecurityGroupList().size() > 0) {
1436-
List<CloudStackSecurityGroup> securityGroupList = resp.getSecurityGroupList();
1437-
for (CloudStackSecurityGroup securityGroup : securityGroupList) {
1438-
EC2SecurityGroup param = new EC2SecurityGroup();
1439-
param.setId(securityGroup.getId());
1440-
param.setName(securityGroup.getName());
1441-
vm.addGroupName(param);
1426+
try{
1427+
CloudStackUserVm resp = getApi().deployVirtualMachine(svcOffering.getId(),
1428+
request.getTemplateId(), zoneId, null, null, null, null,
1429+
null, null, null, request.getKeyName(), null, (network != null ? network.getId() : null),
1430+
null, constructList(request.getGroupSet()), request.getSize().longValue(), request.getUserData());
1431+
EC2Instance vm = new EC2Instance();
1432+
vm.setId(resp.getId().toString());
1433+
vm.setName(resp.getName());
1434+
vm.setZoneName(resp.getZoneName());
1435+
vm.setTemplateId(resp.getTemplateId().toString());
1436+
if (resp.getSecurityGroupList() != null && resp.getSecurityGroupList().size() > 0) {
1437+
List<CloudStackSecurityGroup> securityGroupList = resp.getSecurityGroupList();
1438+
for (CloudStackSecurityGroup securityGroup : securityGroupList) {
1439+
EC2SecurityGroup param = new EC2SecurityGroup();
1440+
param.setId(securityGroup.getId());
1441+
param.setName(securityGroup.getName());
1442+
vm.addGroupName(param);
1443+
}
14421444
}
1443-
}
1444-
vm.setState(resp.getState());
1445-
vm.setCreated(resp.getCreated());
1446-
List <CloudStackNic> nicList = resp.getNics();
1447-
for (CloudStackNic nic : nicList) {
1448-
if (nic.getIsDefault()) {
1449-
vm.setPrivateIpAddress(nic.getIpaddress());
1450-
break;
1445+
vm.setState(resp.getState());
1446+
vm.setCreated(resp.getCreated());
1447+
List <CloudStackNic> nicList = resp.getNics();
1448+
for (CloudStackNic nic : nicList) {
1449+
if (nic.getIsDefault()) {
1450+
vm.setPrivateIpAddress(nic.getIpaddress());
1451+
break;
1452+
}
14511453
}
1454+
vm.setIpAddress(resp.getIpAddress());
1455+
vm.setAccountName(resp.getAccountName());
1456+
vm.setDomainId(resp.getDomainId());
1457+
vm.setHypervisor(resp.getHypervisor());
1458+
vm.setServiceOffering( svcOffering.getName());
1459+
vm.setKeyPairName(resp.getKeyPairName());
1460+
instances.addInstance(vm);
1461+
countCreated++;
1462+
}catch(Exception e){
1463+
logger.error("Failed to deploy VM number: "+ (i+1) +" due to error: "+e.getMessage());
1464+
break;
14521465
}
1453-
vm.setIpAddress(resp.getIpAddress());
1454-
vm.setAccountName(resp.getAccountName());
1455-
vm.setDomainId(resp.getDomainId());
1456-
vm.setHypervisor(resp.getHypervisor());
1457-
vm.setServiceOffering( svcOffering.getName());
1458-
vm.setKeyPairName(resp.getKeyPairName());
1459-
instances.addInstance(vm);
1460-
countCreated++;
14611466
}
14621467

14631468
if (0 == countCreated) {
14641469
// TODO, we actually need to destroy left-over VMs when the exception is thrown
1465-
throw new EC2ServiceException(ServerError.InsufficientInstanceCapacity, "Insufficient Instance Capacity" );
1470+
throw new EC2ServiceException(ServerError.InternalError, "Failed to deploy instances" );
14661471
}
1472+
logger.debug("Could deploy "+ countCreated + " VM's successfully");
14671473

14681474
return instances;
14691475
} catch( Exception e ) {

0 commit comments

Comments
 (0)