/* * Copyright 2010 Cloud.com, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.cloud.bridge.service; import org.apache.log4j.Logger; import java.util.Calendar; import java.util.UUID; import com.amazon.ec2.*; import com.cloud.bridge.service.core.ec2.EC2AuthorizeRevokeSecurityGroup; import com.cloud.bridge.service.core.ec2.EC2CreateImage; import com.cloud.bridge.service.core.ec2.EC2CreateImageResponse; import com.cloud.bridge.service.core.ec2.EC2CreateVolume; import com.cloud.bridge.service.core.ec2.EC2DescribeAvailabilityZones; import com.cloud.bridge.service.core.ec2.EC2DescribeAvailabilityZonesResponse; import com.cloud.bridge.service.core.ec2.EC2DescribeImages; import com.cloud.bridge.service.core.ec2.EC2DescribeImagesResponse; import com.cloud.bridge.service.core.ec2.EC2DescribeInstances; import com.cloud.bridge.service.core.ec2.EC2DescribeInstancesResponse; import com.cloud.bridge.service.core.ec2.EC2DescribeSecurityGroups; import com.cloud.bridge.service.core.ec2.EC2DescribeSecurityGroupsResponse; import com.cloud.bridge.service.core.ec2.EC2DescribeSnapshots; import com.cloud.bridge.service.core.ec2.EC2DescribeSnapshotsResponse; import com.cloud.bridge.service.core.ec2.EC2DescribeVolumes; import com.cloud.bridge.service.core.ec2.EC2DescribeVolumesResponse; import com.cloud.bridge.service.core.ec2.EC2Engine; import com.cloud.bridge.service.core.ec2.EC2Image; import com.cloud.bridge.service.core.ec2.EC2Instance; import com.cloud.bridge.service.core.ec2.EC2IpPermission; import com.cloud.bridge.service.core.ec2.EC2RebootInstances; import com.cloud.bridge.service.core.ec2.EC2RegisterImage; import com.cloud.bridge.service.core.ec2.EC2RunInstances; import com.cloud.bridge.service.core.ec2.EC2RunInstancesResponse; import com.cloud.bridge.service.core.ec2.EC2SecurityGroup; import com.cloud.bridge.service.core.ec2.EC2Snapshot; import com.cloud.bridge.service.core.ec2.EC2StartInstances; import com.cloud.bridge.service.core.ec2.EC2StartInstancesResponse; import com.cloud.bridge.service.core.ec2.EC2StopInstances; import com.cloud.bridge.service.core.ec2.EC2StopInstancesResponse; import com.cloud.bridge.service.core.ec2.EC2Volume; import com.cloud.bridge.service.exception.EC2ServiceException; public class EC2SoapServiceImpl implements AmazonEC2SkeletonInterface { protected final static Logger logger = Logger.getLogger(EC2SoapServiceImpl.class); private EC2Engine engine; public EC2SoapServiceImpl(EC2Engine engine) { this.engine = engine; } public AllocateAddressResponse allocateAddress(AllocateAddress allocateAddress) { // TODO Auto-generated method stub return null; } public AssociateAddressResponse associateAddress(AssociateAddress associateAddress) { return null; } public AssociateDhcpOptionsResponse associateDhcpOptions(AssociateDhcpOptions associateDhcpOptions) { // TODO Auto-generated method stub return null; }; public AttachVolumeResponse attachVolume(AttachVolume attachVolume) { EC2Volume request = new EC2Volume(); AttachVolumeType avt = attachVolume.getAttachVolume(); request.setId( avt.getVolumeId()); request.setInstanceId( avt.getInstanceId()); request.setDevice( avt.getDevice()); return toAttachVolumeResponse( engine.attachVolume( request )); } public AttachVpnGatewayResponse attachVpnGateway(AttachVpnGateway attachVpnGateway) { // TODO Auto-generated method stub return null; } public AuthorizeSecurityGroupIngressResponse authorizeSecurityGroupIngress(AuthorizeSecurityGroupIngress authorizeSecurityGroupIngress) { AuthorizeSecurityGroupIngressType sgit = authorizeSecurityGroupIngress.getAuthorizeSecurityGroupIngress(); IpPermissionSetType ipPerms = sgit.getIpPermissions(); EC2AuthorizeRevokeSecurityGroup request = toSecurityGroup( sgit.getGroupName(), ipPerms.getItem()); return toAuthorizeSecurityGroupIngressResponse( engine.securityGroupRequest( request, "authorizeNetworkGroupIngress" )); } public RevokeSecurityGroupIngressResponse revokeSecurityGroupIngress(RevokeSecurityGroupIngress revokeSecurityGroupIngress) { RevokeSecurityGroupIngressType sgit = revokeSecurityGroupIngress.getRevokeSecurityGroupIngress(); IpPermissionSetType ipPerms = sgit.getIpPermissions(); EC2AuthorizeRevokeSecurityGroup request = toSecurityGroup( sgit.getGroupName(), ipPerms.getItem()); return toRevokeSecurityGroupIngressResponse( engine.securityGroupRequest( request, "revokeNetworkGroupIngress" )); } /** * Authorize and Revoke Security Group Ingress have the same parameters. */ private EC2AuthorizeRevokeSecurityGroup toSecurityGroup( String groupName, IpPermissionType[] items ) { EC2AuthorizeRevokeSecurityGroup request = new EC2AuthorizeRevokeSecurityGroup(); request.setName( groupName ); for( int i=0; i < items.length; i++ ) { EC2IpPermission perm = new EC2IpPermission(); perm.setProtocol( items[i].getIpProtocol()); perm.setFromPort( items[i].getFromPort()); perm.setToPort( items[i].getToPort()); UserIdGroupPairSetType groups = items[i].getGroups(); if (null != groups) { UserIdGroupPairType[] groupItems = groups.getItem(); for( int j=0; null != groupItems && j < groupItems.length; j++ ) { EC2SecurityGroup user = new EC2SecurityGroup(); user.setName( groupItems[j].getGroupName()); user.setAccount( groupItems[j].getUserId()); perm.addUser( user ); } } IpRangeSetType ranges = items[i].getIpRanges(); if (null != ranges) { IpRangeItemType[] rangeItems = ranges.getItem(); for( int k=0; null != rangeItems && k < rangeItems.length; k++ ) perm.addIpRange( rangeItems[k].getCidrIp()); } request.addIpPermission( perm ); } return request; } public BundleInstanceResponse bundleInstance(BundleInstance bundleInstance) { // TODO Auto-generated method stub return null; } public CancelBundleTaskResponse cancelBundleTask(CancelBundleTask cancelBundleTask) { // TODO Auto-generated method stub return null; } public CancelSpotInstanceRequestsResponse cancelSpotInstanceRequests(CancelSpotInstanceRequests cancelSpotInstanceRequests) { // TODO Auto-generated method stub return null; } public ConfirmProductInstanceResponse confirmProductInstance(ConfirmProductInstance confirmProductInstance) { // TODO Auto-generated method stub return null; } public CreateCustomerGatewayResponse createCustomerGateway(CreateCustomerGateway createCustomerGateway) { // TODO Auto-generated method stub return null; } public CreateDhcpOptionsResponse createDhcpOptions(CreateDhcpOptions createDhcpOptions) { // TODO Auto-generated method stub return null; } public CreateImageResponse createImage(CreateImage createImage) { EC2CreateImage request = new EC2CreateImage(); CreateImageType cit = createImage.getCreateImage(); request.setInstanceId( cit.getInstanceId()); request.setName( cit.getName()); request.setDescription( cit.getDescription()); return toCreateImageResponse( engine.handleRequest( request )); } public CreateKeyPairResponse createKeyPair(CreateKeyPair createKeyPair) { // ToDO: no matching function in the Cloud API return null; } public CreateSecurityGroupResponse createSecurityGroup(CreateSecurityGroup createSecurityGroup) { CreateSecurityGroupType sgt = createSecurityGroup.getCreateSecurityGroup(); EC2SecurityGroup request = new EC2SecurityGroup(); request.setName( sgt.getGroupName()); request.setDescription( sgt.getGroupDescription()); return toCreateSecurityGroupResponse( engine.createSecurityGroup( request )); } public CreateSnapshotResponse createSnapshot(CreateSnapshot createSnapshot) { CreateSnapshotType cst = createSnapshot.getCreateSnapshot(); return toCreateSnapshotResponse( engine.createSnapshot( cst.getVolumeId()), engine.getAccountName()); } public CreateSpotDatafeedSubscriptionResponse createSpotDatafeedSubscription(CreateSpotDatafeedSubscription createSpotDatafeedSubscription) { // TODO Auto-generated method stub return null; } public CreateSubnetResponse createSubnet(CreateSubnet createSubnet) { // TODO Auto-generate return null; } public CreateVolumeResponse createVolume(CreateVolume createVolume) { EC2CreateVolume request = new EC2CreateVolume(); CreateVolumeType cvt = createVolume.getCreateVolume(); request.setSize( cvt.getSize()); request.setSnapshotId( cvt.getSnapshotId()); request.setZoneName( cvt.getAvailabilityZone()); return toCreateVolumeResponse( engine.handleRequest( request )); } public CreateVpcResponse createVpc(CreateVpc createVpc) { // TODO Auto-generated method stub return null; } public CreateVpnConnectionResponse createVpnConnection(CreateVpnConnection createVpnConnection) { // TODO Auto-generated method stub return null; } public CreateVpnGatewayResponse createVpnGateway(CreateVpnGateway createVpnGateway) { // TODO Auto-generated method stub return null; } public DeleteCustomerGatewayResponse deleteCustomerGateway(DeleteCustomerGateway deleteCustomerGateway) { // TODO Auto-generated method stub return null; } public DeleteDhcpOptionsResponse deleteDhcpOptions(DeleteDhcpOptions deleteDhcpOptions) { // TODO Auto-generated method stub return null; } public DeleteKeyPairResponse deleteKeyPair(DeleteKeyPair deleteKeyPair) { // TODO Auto-generated method stub return null; } public DeleteSecurityGroupResponse deleteSecurityGroup(DeleteSecurityGroup deleteSecurityGroup) { DeleteSecurityGroupType sgt = deleteSecurityGroup.getDeleteSecurityGroup(); EC2SecurityGroup request = new EC2SecurityGroup(); request.setName( sgt.getGroupName()); return toDeleteSecurityGroupResponse( engine.deleteSecurityGroup( request )); } public DeleteSnapshotResponse deleteSnapshot(DeleteSnapshot deleteSnapshot) { DeleteSnapshotType dst = deleteSnapshot.getDeleteSnapshot(); return toDeleteSnapshotResponse( engine.deleteSnapshot( dst.getSnapshotId())); } public DeleteSpotDatafeedSubscriptionResponse deleteSpotDatafeedSubscription(DeleteSpotDatafeedSubscription deleteSpotDatafeedSubscription) { // TODO Auto-generated method stub return null; } public DeleteSubnetResponse deleteSubnet(DeleteSubnet deleteSubnet) { // TODO Auto-generated method stub return null; } public DeleteVolumeResponse deleteVolume(DeleteVolume deleteVolume) { EC2Volume request = new EC2Volume(); DeleteVolumeType avt = deleteVolume.getDeleteVolume(); request.setId( avt.getVolumeId()); return toDeleteVolumeResponse( engine.deleteVolume( request )); } public DeleteVpcResponse deleteVpc(DeleteVpc deleteVpc) { // TODO Auto-generated method stub return null; } public DeleteVpnConnectionResponse deleteVpnConnection(DeleteVpnConnection deleteVpnConnection) { // TODO Auto-generated method stub return null; } public DeleteVpnGatewayResponse deleteVpnGateway(DeleteVpnGateway deleteVpnGateway) { // TODO Auto-generated method stub return null; } public DeregisterImageResponse deregisterImage(DeregisterImage deregisterImage) { DeregisterImageType dit = deregisterImage.getDeregisterImage(); EC2Image image = new EC2Image(); image.setId( dit.getImageId()); return toDeregisterImageResponse( engine.deregisterImage( image )); } public DescribeAddressesResponse describeAddresses(DescribeAddresses describeAddresses) { return null; } public DescribeAvailabilityZonesResponse describeAvailabilityZones(DescribeAvailabilityZones describeAvailabilityZones) { EC2DescribeAvailabilityZones request = new EC2DescribeAvailabilityZones(); DescribeAvailabilityZonesType dazt = describeAvailabilityZones.getDescribeAvailabilityZones(); DescribeAvailabilityZonesSetType dazs = dazt.getAvailabilityZoneSet(); DescribeAvailabilityZonesSetItemType[] items = dazs.getItem(); if (null != items) { // -> can be empty for( int i=0; i < items.length; i++ ) request.addZone( items[i].getZoneName()); } return toDescribeAvailabilityZonesResponse( engine.handleRequest( request )); } public DescribeBundleTasksResponse describeBundleTasks(DescribeBundleTasks describeBundleTasks) { // TODO Auto-generated method stub return null; } public DescribeCustomerGatewaysResponse describeCustomerGateways(DescribeCustomerGateways describeCustomerGateways) { // TODO Auto-generated method stub return null; } public DescribeDhcpOptionsResponse describeDhcpOptions(DescribeDhcpOptions describeDhcpOptions) { // TODO Auto-generated method stub return null; } /** * This only supports a query about description. */ public DescribeImageAttributeResponse describeImageAttribute(DescribeImageAttribute describeImageAttribute) { EC2DescribeImages request = new EC2DescribeImages(); DescribeImageAttributeType diat = describeImageAttribute.getDescribeImageAttribute(); DescribeImageAttributesGroup diag = diat.getDescribeImageAttributesGroup(); EmptyElementType description = diag.getDescription(); if ( null != description ) { request.addImageSet( diat.getImageId()); return toDescribeImageAttributeResponse( engine.handleRequest( request )); } else throw new EC2ServiceException( "Unsupported - only description supported", 501 ); } public DescribeImagesResponse describeImages(DescribeImages describeImages) { EC2DescribeImages request = new EC2DescribeImages(); DescribeImagesType dit = describeImages.getDescribeImages(); // -> toEC2DescribeImages DescribeImagesExecutableBySetType param1 = dit.getExecutableBySet(); if (null != param1) { DescribeImagesExecutableByType[] items1 = param1.getItem(); if (null != items1) { for( int i=0; i < items1.length; i++ ) request.addExecutableBySet( items1[i].getUser()); } } DescribeImagesInfoType param2 = dit.getImagesSet(); if (null != param2) { DescribeImagesItemType[] items2 = param2.getItem(); if (null != items2) { for( int i=0; i < items2.length; i++ ) request.addImageSet( items2[i].getImageId()); } } DescribeImagesOwnersType param3 = dit.getOwnersSet(); if (null != param3) { DescribeImagesOwnerType[] items3 = param3.getItem(); if (null != items3) { for( int i=0; i < items3.length; i++ ) request.addOwnersSet( items3[i].getOwner()); } } return toDescribeImagesResponse( engine.handleRequest( request ), engine.getAccountName()); } public DescribeInstanceAttributeResponse describeInstanceAttribute(DescribeInstanceAttribute describeInstanceAttribute) { EC2DescribeInstances request = new EC2DescribeInstances(); DescribeInstanceAttributeType diat = describeInstanceAttribute.getDescribeInstanceAttribute(); DescribeInstanceAttributesGroup diag = diat.getDescribeInstanceAttributesGroup(); EmptyElementType instanceType = diag.getInstanceType(); // -> toEC2DescribeInstances if (null != instanceType) { request.addInstanceId( diat.getInstanceId()); return toDescribeInstanceAttributeResponse( engine.handleRequest( request )); } throw new EC2ServiceException( "Unsupported - only instanceType supported", 501 ); } public DescribeInstancesResponse describeInstances(DescribeInstances describeInstances) { EC2DescribeInstances request = new EC2DescribeInstances(); DescribeInstancesType dit = describeInstances.getDescribeInstances(); // -> toEC2DescribeInstances DescribeInstancesInfoType diit = dit.getInstancesSet(); DescribeInstancesItemType[] items = diit.getItem(); if (null != items) { // -> can be empty for( int i=0; i < items.length; i++ ) request.addInstanceId( items[i].getInstanceId()); } return toDescribeInstancesResponse( engine.handleRequest( request ), engine.getAccountName()); } public DescribeKeyPairsResponse describeKeyPairs(DescribeKeyPairs describeKeyPairs) { // TODO Auto-generated method stub return null; } public DescribeRegionsResponse describeRegions(DescribeRegions describeRegions) { return null; } public DescribeReservedInstancesResponse describeReservedInstances(DescribeReservedInstances describeReservedInstances) { // TODO Auto-generated method stub return null; } public DescribeReservedInstancesOfferingsResponse describeReservedInstancesOfferings( DescribeReservedInstancesOfferings describeReservedInstancesOfferings) { // TODO Auto-generated method stub return null; } public DescribeSecurityGroupsResponse describeSecurityGroups(DescribeSecurityGroups describeSecurityGroups) { EC2DescribeSecurityGroups request = new EC2DescribeSecurityGroups(); DescribeSecurityGroupsType sgt = describeSecurityGroups.getDescribeSecurityGroups(); // -> toEC2DescribeSecurityGroups DescribeSecurityGroupsSetType sgst = sgt.getSecurityGroupSet(); DescribeSecurityGroupsSetItemType[] items = sgst.getItem(); if (null != items) { // -> can be empty for( int i=0; i < items.length; i++ ) request.addGroupName( items[i].getGroupName()); } return toDescribeSecurityGroupsResponse( engine.handleRequest( request )); } public DescribeSnapshotAttributeResponse describeSnapshotAttribute(DescribeSnapshotAttribute describeSnapshotAttribute) { return null; } public DescribeSnapshotsResponse describeSnapshots(DescribeSnapshots describeSnapshots) { EC2DescribeSnapshots request = new EC2DescribeSnapshots(); DescribeSnapshotsType dst = describeSnapshots.getDescribeSnapshots(); DescribeSnapshotsSetType dsst = dst.getSnapshotSet(); if (null != dsst) { DescribeSnapshotsSetItemType[] items = dsst.getItem(); if (null != items) { for( int i=0; i < items.length; i++ ) request.addSnapshotId( items[i].getSnapshotId()); } } return toDescribeSnapshotsResponse( engine.handleRequest( request ), engine.getAccountName()); } public DescribeSpotDatafeedSubscriptionResponse describeSpotDatafeedSubscription( DescribeSpotDatafeedSubscription describeSpotDatafeedSubscription) { // TODO Auto-generated method stub return null; } public DescribeSpotInstanceRequestsResponse describeSpotInstanceRequests( DescribeSpotInstanceRequests describeSpotInstanceRequests) { // TODO Auto-generated method stub return null; } public DescribeSpotPriceHistoryResponse describeSpotPriceHistory(DescribeSpotPriceHistory describeSpotPriceHistory) { // TODO Auto-generated method stub return null; } public DescribeSubnetsResponse describeSubnets(DescribeSubnets describeSubnets) { // TODO Auto-generated method stub return null; } public DescribeVolumesResponse describeVolumes(DescribeVolumes describeVolumes) { EC2DescribeVolumes request = new EC2DescribeVolumes(); DescribeVolumesType dvt = describeVolumes.getDescribeVolumes(); DescribeVolumesSetType dvst = dvt.getVolumeSet(); if (null != dvst) { DescribeVolumesSetItemType[] items = dvst.getItem(); if (null != items) { for( int i=0; i < items.length; i++ ) request.addVolumeId( items[i].getVolumeId()); } } return toDescribeVolumesResponse( engine.handleRequest( request )); } public DescribeVpcsResponse describeVpcs(DescribeVpcs describeVpcs) { // TODO Auto-generated method stub return null; } public DescribeVpnConnectionsResponse describeVpnConnections(DescribeVpnConnections describeVpnConnections) { // TODO Auto-generated method stub return null; } public DescribeVpnGatewaysResponse describeVpnGateways(DescribeVpnGateways describeVpnGateways) { // TODO Auto-generated method stub return null; } public DetachVolumeResponse detachVolume(DetachVolume detachVolume) { EC2Volume request = new EC2Volume(); DetachVolumeType avt = detachVolume.getDetachVolume(); request.setId( avt.getVolumeId()); request.setInstanceId( avt.getInstanceId()); request.setDevice( avt.getDevice()); return toDetachVolumeResponse( engine.detachVolume( request )); } public DetachVpnGatewayResponse detachVpnGateway(DetachVpnGateway detachVpnGateway) { // TODO Auto-generated method stub return null; } public DisassociateAddressResponse disassociateAddress(DisassociateAddress disassociateAddress) { // TODO Auto-generated method stub return null; } public GetConsoleOutputResponse getConsoleOutput(GetConsoleOutput getConsoleOutput) { // TODO Auto-generated method stub return null; } public GetPasswordDataResponse getPasswordData(GetPasswordData getPasswordData) { // TODO Auto-generated method stub return null; } public ModifyImageAttributeResponse modifyImageAttribute(ModifyImageAttribute modifyImageAttribute) { EC2Image request = new EC2Image(); ModifyImageAttributeType miat = modifyImageAttribute.getModifyImageAttribute(); ModifyImageAttributeTypeChoice_type0 item = miat.getModifyImageAttributeTypeChoice_type0(); AttributeValueType description = item.getDescription(); if (null != description) { request.setId( miat.getImageId()); request.setDescription(description.getValue()); return toModifyImageAttributeResponse( engine.modifyImageAttribute( request )); } throw new EC2ServiceException( "Unsupported - can only modify image description", 501 ); } public ModifyInstanceAttributeResponse modifyInstanceAttribute(ModifyInstanceAttribute modifyInstanceAttribute) { // TODO Auto-generated method stub return null; } public ModifySnapshotAttributeResponse modifySnapshotAttribute(ModifySnapshotAttribute modifySnapshotAttribute) { // TODO Auto-generated method stub return null; } public ActivateLicenseResponse activateLicense(ActivateLicense activateLicense) { // TODO Auto-generated method stub return null; } public CreatePlacementGroupResponse createPlacementGroup(CreatePlacementGroup createPlacementGroup) { // TODO Auto-generated method stub return null; } public DeactivateLicenseResponse deactivateLicense(DeactivateLicense deactivateLicense) { // TODO Auto-generated method stub return null; } public DeletePlacementGroupResponse deletePlacementGroup(DeletePlacementGroup deletePlacementGroup) { // TODO Auto-generated method stub return null; } public DescribeLicensesResponse describeLicenses(DescribeLicenses describeLicenses) { // TODO Auto-generated method stub return null; } public DescribePlacementGroupsResponse describePlacementGroups(DescribePlacementGroups describePlacementGroups) { // TODO Auto-generated method stub return null; } /** * Did not find a matching service offering so for now we just return disabled * for each instance request. We could verify that all of the specified instances * exist to detect an error which would require a listVirtualMachines. */ public MonitorInstancesResponse monitorInstances(MonitorInstances monitorInstances) { MonitorInstancesResponse response = new MonitorInstancesResponse(); MonitorInstancesResponseType param1 = new MonitorInstancesResponseType(); MonitorInstancesResponseSetType param2 = new MonitorInstancesResponseSetType(); MonitorInstancesType mit = monitorInstances.getMonitorInstances(); MonitorInstancesSetType mist = mit.getInstancesSet(); MonitorInstancesSetItemType[] misit = mist.getItem(); if (null != misit) { for( int i=0; i < misit.length; i++ ) { String instanceId = misit[i].getInstanceId(); MonitorInstancesResponseSetItemType param3 = new MonitorInstancesResponseSetItemType(); param3.setInstanceId( instanceId ); InstanceMonitoringStateType param4 = new InstanceMonitoringStateType(); param4.setState( "disabled" ); param3.setMonitoring( param4 ); param2.addItem( param3 ); } } param1.setRequestId( UUID.randomUUID().toString()); param1.setInstancesSet( param2 ); response.setMonitorInstancesResponse( param1 ); return response; } public PurchaseReservedInstancesOfferingResponse purchaseReservedInstancesOffering( PurchaseReservedInstancesOffering purchaseReservedInstancesOffering) { // TODO Auto-generated method stub return null; } public RebootInstancesResponse rebootInstances(RebootInstances rebootInstances) { EC2RebootInstances request = new EC2RebootInstances(); RebootInstancesType rit = rebootInstances.getRebootInstances(); // -> toEC2StartInstances RebootInstancesInfoType rist = rit.getInstancesSet(); RebootInstancesItemType[] items = rist.getItem(); if (null != items) { // -> should not be empty for( int i=0; i < items.length; i++ ) request.addInstanceId( items[i].getInstanceId()); } return toRebootInstancesResponse( engine.handleRequest( request )); } public RegisterImageResponse registerImage(RegisterImage registerImage) { EC2RegisterImage request = new EC2RegisterImage(); RegisterImageType rit = registerImage.getRegisterImage(); // -> we redefine the architecture field to hold: "format:zonename:osTypeName", // these are the bare minimum that we need to call the cloud registerTemplate call. request.setLocation( rit.getImageLocation()); // -> should be a URL for us request.setName( rit.getName()); request.setDescription( rit.getDescription()); request.setArchitecture( rit.getArchitecture()); return toRegisterImageResponse( engine.handleRequest( request )); } public ReleaseAddressResponse releaseAddress(ReleaseAddress releaseAddress) { // TODO Auto-generated method stub return null; } public RequestSpotInstancesResponse requestSpotInstances(RequestSpotInstances requestSpotInstances) { // TODO Auto-generated method stub return null; } public ResetImageAttributeResponse resetImageAttribute(ResetImageAttribute resetImageAttribute) { EC2Image request = new EC2Image(); ResetImageAttributeType riat = resetImageAttribute.getResetImageAttribute(); request.setId( riat.getImageId()); request.setDescription( "" ); return toResetImageAttributeResponse( engine.modifyImageAttribute( request )); } public ResetInstanceAttributeResponse resetInstanceAttribute(ResetInstanceAttribute resetInstanceAttribute) { // TODO Auto-generated method stub return null; } public ResetSnapshotAttributeResponse resetSnapshotAttribute(ResetSnapshotAttribute resetSnapshotAttribute) { // TODO Auto-generated method stub return null; } public RunInstancesResponse runInstances(RunInstances runInstances) { EC2RunInstances request = new EC2RunInstances(); RunInstancesType rit = runInstances.getRunInstances(); PlacementRequestType prt = rit.getPlacement(); GroupSetType gst = rit.getGroupSet(); String type = rit.getInstanceType(); UserDataType userData = rit.getUserData(); request.setTemplateId( rit.getImageId()); request.setMinCount( rit.getMinCount()); request.setMaxCount( rit.getMaxCount()); if (null != type ) request.setInstanceType( type ); if (null != prt ) request.setZoneName( prt.getAvailabilityZone()); if (null != userData) request.setUserData( userData.getData()); // -> we can only support one group per instance if (null != gst) { GroupItemType[] items = gst.getItem(); if (null != items && 0 < items.length) request.setGroupId( items[0].getGroupId()); } return toRunInstancesResponse( engine.handleRequest( request ), engine.getAccountName()); } public StartInstancesResponse startInstances(StartInstances startInstances) { EC2StartInstances request = new EC2StartInstances(); StartInstancesType sit = startInstances.getStartInstances(); // -> toEC2StartInstances InstanceIdSetType iist = sit.getInstancesSet(); InstanceIdType[] items = iist.getItem(); if (null != items) { // -> should not be empty for( int i=0; i < items.length; i++ ) request.addInstanceId( items[i].getInstanceId()); } return toStartInstancesResponse( engine.handleRequest( request )); } public StopInstancesResponse stopInstances(StopInstances stopInstances) { EC2StopInstances request = new EC2StopInstances(); StopInstancesType sit = stopInstances.getStopInstances(); // -> toEC2StopInstances InstanceIdSetType iist = sit.getInstancesSet(); InstanceIdType[] items = iist.getItem(); if (null != items) { // -> should not be empty for( int i=0; i < items.length; i++ ) request.addInstanceId( items[i].getInstanceId()); } return toStopInstancesResponse( engine.handleRequest( request )); } /** * Mapping this to the destroyVirtualMachine cloud API concept. * This makes sense since when considering the rebootInstances function. In reboot * any terminated instances are left alone. We will do the same with destroyed instances. */ public TerminateInstancesResponse terminateInstances(TerminateInstances terminateInstances) { EC2StopInstances request = new EC2StopInstances(); TerminateInstancesType sit = terminateInstances.getTerminateInstances(); // -> toEC2StopInstances InstanceIdSetType iist = sit.getInstancesSet(); InstanceIdType[] items = iist.getItem(); if (null != items) { // -> should not be empty for( int i=0; i < items.length; i++ ) request.addInstanceId( items[i].getInstanceId()); } request.setDestroyInstances( true ); return toTermInstancesResponse( engine.handleRequest( request )); } /** * See comment for monitorInstances. */ public UnmonitorInstancesResponse unmonitorInstances(UnmonitorInstances unmonitorInstances) { UnmonitorInstancesResponse response = new UnmonitorInstancesResponse(); MonitorInstancesResponseType param1 = new MonitorInstancesResponseType(); MonitorInstancesResponseSetType param2 = new MonitorInstancesResponseSetType(); MonitorInstancesType mit = unmonitorInstances.getUnmonitorInstances(); MonitorInstancesSetType mist = mit.getInstancesSet(); MonitorInstancesSetItemType[] items = mist.getItem(); if (null != items) { for( int i=0; i < items.length; i++ ) { String instanceId = items[i].getInstanceId(); MonitorInstancesResponseSetItemType param3 = new MonitorInstancesResponseSetItemType(); param3.setInstanceId( instanceId ); InstanceMonitoringStateType param4 = new InstanceMonitoringStateType(); param4.setState( "disabled" ); param3.setMonitoring( param4 ); param2.addItem( param3 ); } } param1.setInstancesSet( param2 ); param1.setRequestId( UUID.randomUUID().toString()); response.setUnmonitorInstancesResponse( param1 ); return response; } public static DescribeImageAttributeResponse toDescribeImageAttributeResponse(EC2DescribeImagesResponse engineResponse) { DescribeImageAttributeResponse response = new DescribeImageAttributeResponse(); DescribeImageAttributeResponseType param1 = new DescribeImageAttributeResponseType(); EC2Image[] imageSet = engineResponse.getImageSet(); if ( 0 < imageSet.length ) { DescribeImageAttributeResponseTypeChoice_type0 param2 = new DescribeImageAttributeResponseTypeChoice_type0(); NullableAttributeValueType param3 = new NullableAttributeValueType(); param3.setValue( imageSet[0].getDescription()); param2.setDescription( param3 ); param1.setDescribeImageAttributeResponseTypeChoice_type0( param2 ); param1.setImageId( imageSet[0].getId()); } param1.setRequestId( UUID.randomUUID().toString()); response.setDescribeImageAttributeResponse( param1 ); return response; } public static ModifyImageAttributeResponse toModifyImageAttributeResponse( boolean engineResponse ) { ModifyImageAttributeResponse response = new ModifyImageAttributeResponse(); ModifyImageAttributeResponseType param1 = new ModifyImageAttributeResponseType(); param1.set_return( engineResponse ); param1.setRequestId( UUID.randomUUID().toString()); response.setModifyImageAttributeResponse( param1 ); return response; } public static ResetImageAttributeResponse toResetImageAttributeResponse( boolean engineResponse ) { ResetImageAttributeResponse response = new ResetImageAttributeResponse(); ResetImageAttributeResponseType param1 = new ResetImageAttributeResponseType(); param1.set_return( engineResponse ); param1.setRequestId( UUID.randomUUID().toString()); response.setResetImageAttributeResponse( param1 ); return response; } public static DescribeImagesResponse toDescribeImagesResponse(EC2DescribeImagesResponse engineResponse, String accountName ) { DescribeImagesResponse response = new DescribeImagesResponse(); DescribeImagesResponseType param1 = new DescribeImagesResponseType(); DescribeImagesResponseInfoType param2 = new DescribeImagesResponseInfoType(); EC2Image[] images = engineResponse.getImageSet(); for( int i=0; i < images.length; i++ ) { DescribeImagesResponseItemType param3 = new DescribeImagesResponseItemType(); param3.setImageId( images[i].getId()); param3.setImageLocation( "" ); param3.setImageState( (images[i].getIsReady() ? "available" : "unavailable" )); param3.setImageOwnerId( accountName ); param3.setIsPublic( images[i].getIsPublic()); ProductCodesSetType param4 = new ProductCodesSetType(); ProductCodesSetItemType param5 = new ProductCodesSetItemType(); param5.setProductCode( "" ); param4.addItem( param5 ); param3.setProductCodes( param4 ); String description = images[i].getDescription(); param3.setDescription( (null == description ? "" : description)); if (null == description) param3.setArchitecture( "" ); else if (-1 != description.indexOf( "x86_64" )) param3.setArchitecture( "x86_64" ); else if (-1 != description.indexOf( "i386" )) param3.setArchitecture( "i386" ); else param3.setArchitecture( "" ); param3.setImageType( "machine" ); param3.setKernelId( "" ); param3.setRamdiskId( "" ); param3.setPlatform( "" ); StateReasonType param6 = new StateReasonType(); param6.setCode( "" ); param6.setMessage( "" ); param3.setStateReason( param6 ); param3.setImageOwnerAlias( "" ); param3.setName( images[i].getName()); param3.setRootDeviceType( "" ); param3.setRootDeviceName( "" ); BlockDeviceMappingType param7 = new BlockDeviceMappingType(); BlockDeviceMappingItemType param8 = new BlockDeviceMappingItemType(); BlockDeviceMappingItemTypeChoice_type0 param9 = new BlockDeviceMappingItemTypeChoice_type0(); param8.setDeviceName( "" ); param9.setVirtualName( "" ); EbsBlockDeviceType param10 = new EbsBlockDeviceType(); param10.setSnapshotId( "" ); param10.setVolumeSize( 0 ); param10.setDeleteOnTermination( false ); param9.setEbs( param10 ); param8.setBlockDeviceMappingItemTypeChoice_type0( param9 ); param7.addItem( param8 ); param3.setBlockDeviceMapping( param7 ); param2.addItem( param3 ); } param1.setImagesSet( param2 ); param1.setRequestId( UUID.randomUUID().toString()); response.setDescribeImagesResponse( param1 ); return response; } public static CreateImageResponse toCreateImageResponse(EC2CreateImageResponse engineResponse) { CreateImageResponse response = new CreateImageResponse(); CreateImageResponseType param1 = new CreateImageResponseType(); param1.setImageId( engineResponse.getId()); param1.setRequestId( UUID.randomUUID().toString()); response.setCreateImageResponse( param1 ); return response; } public static RegisterImageResponse toRegisterImageResponse(EC2CreateImageResponse engineResponse) { RegisterImageResponse response = new RegisterImageResponse(); RegisterImageResponseType param1 = new RegisterImageResponseType(); param1.setImageId( engineResponse.getId()); param1.setRequestId( UUID.randomUUID().toString()); response.setRegisterImageResponse( param1 ); return response; } public static DeregisterImageResponse toDeregisterImageResponse( boolean engineResponse) { DeregisterImageResponse response = new DeregisterImageResponse(); DeregisterImageResponseType param1 = new DeregisterImageResponseType(); param1.set_return( engineResponse ); param1.setRequestId( UUID.randomUUID().toString()); response.setDeregisterImageResponse( param1 ); return response; } public static DescribeVolumesResponse toDescribeVolumesResponse(EC2DescribeVolumesResponse engineResponse) { DescribeVolumesResponse response = new DescribeVolumesResponse(); DescribeVolumesResponseType param1 = new DescribeVolumesResponseType(); DescribeVolumesSetResponseType param2 = new DescribeVolumesSetResponseType(); EC2Volume[] volumes = engineResponse.getVolumeSet(); for( int i=0; i < volumes.length; i++ ) { DescribeVolumesSetItemResponseType param3 = new DescribeVolumesSetItemResponseType(); param3.setVolumeId( volumes[i].getId()); Integer volSize = new Integer( volumes[i].getSize()); param3.setSize( volSize.toString()); param3.setSnapshotId( "" ); param3.setAvailabilityZone( volumes[i].getZoneName()); param3.setStatus( "available" ); // -> CloudStack seems to have issues with timestamp formats so just in case Calendar cal = volumes[i].getCreated(); if ( null == cal ) { cal = Calendar.getInstance(); cal.set( 1970, 1, 1 ); } param3.setCreateTime( cal ); AttachmentSetResponseType param4 = new AttachmentSetResponseType(); if (null != volumes[i].getInstanceId()) { AttachmentSetItemResponseType param5 = new AttachmentSetItemResponseType(); param5.setVolumeId( volumes[i].getId()); param5.setInstanceId( volumes[i].getInstanceId()); param5.setDevice( "" ); param5.setStatus( "attached" ); param5.setAttachTime( cal ); param5.setDeleteOnTermination( false ); param4.addItem( param5 ); } param3.setAttachmentSet( param4 ); param2.addItem( param3 ); } param1.setVolumeSet( param2 ); param1.setRequestId( UUID.randomUUID().toString()); response.setDescribeVolumesResponse( param1 ); return response; } public static DescribeInstanceAttributeResponse toDescribeInstanceAttributeResponse(EC2DescribeInstancesResponse engineResponse) { DescribeInstanceAttributeResponse response = new DescribeInstanceAttributeResponse(); DescribeInstanceAttributeResponseType param1 = new DescribeInstanceAttributeResponseType(); EC2Instance[] instanceSet = engineResponse.getInstanceSet(); if (0 < instanceSet.length) { DescribeInstanceAttributeResponseTypeChoice_type0 param2 = new DescribeInstanceAttributeResponseTypeChoice_type0(); NullableAttributeValueType param3 = new NullableAttributeValueType(); param3.setValue( instanceSet[0].getServiceOffering()); param2.setInstanceType( param3 ); param1.setDescribeInstanceAttributeResponseTypeChoice_type0( param2 ); param1.setInstanceId( instanceSet[0].getId()); } param1.setRequestId( UUID.randomUUID().toString()); response.setDescribeInstanceAttributeResponse( param1 ); return response; } public static DescribeInstancesResponse toDescribeInstancesResponse(EC2DescribeInstancesResponse engineResponse, String accountName ) { DescribeInstancesResponse response = new DescribeInstancesResponse(); DescribeInstancesResponseType param1 = new DescribeInstancesResponseType(); ReservationSetType param2 = new ReservationSetType(); EC2Instance[] instances = engineResponse.getInstanceSet(); for( int i=0; i < instances.length; i++ ) { ReservationInfoType param3 = new ReservationInfoType(); param3.setReservationId( instances[i].getId()); // -> an id we could track down if needed param3.setOwnerId( accountName ); param3.setRequesterId( "" ); GroupSetType param4 = new GroupSetType(); GroupItemType param5 = new GroupItemType(); param5.setGroupId( (null == instances[i].getGroup() ? "" : instances[i].getGroup())); param4.addItem( param5 ); param3.setGroupSet( param4 ); RunningInstancesSetType param6 = new RunningInstancesSetType(); RunningInstancesItemType param7 = new RunningInstancesItemType(); param7.setInstanceId( instances[i].getId()); param7.setImageId( instances[i].getTemplateId()); InstanceStateType param8 = new InstanceStateType(); param8.setCode( toAmazonCode( instances[i].getState())); param8.setName( toAmazonStateName( instances[i].getState())); param7.setInstanceState( param8 ); param7.setPrivateDnsName( "" ); param7.setDnsName( "" ); param7.setReason( "" ); param7.setKeyName( "" ); param7.setAmiLaunchIndex( "" ); param7.setInstanceType( instances[i].getServiceOffering()); ProductCodesSetType param9 = new ProductCodesSetType(); ProductCodesSetItemType param10 = new ProductCodesSetItemType(); param10.setProductCode( "" ); param9.addItem( param10 ); param7.setProductCodes( param9 ); Calendar cal = instances[i].getCreated(); if ( null == cal ) { cal = Calendar.getInstance(); cal.set( 1970, 1, 1 ); } param7.setLaunchTime( cal ); PlacementResponseType param11 = new PlacementResponseType(); param11.setAvailabilityZone( instances[i].getZoneName()); param7.setPlacement( param11 ); param7.setKernelId( "" ); param7.setRamdiskId( "" ); param7.setPlatform( "" ); InstanceMonitoringStateType param12 = new InstanceMonitoringStateType(); param12.setState( "" ); param7.setMonitoring( param12 ); param7.setSubnetId( "" ); param7.setVpcId( "" ); String ipAddr = instances[i].getIpAddress(); param7.setPrivateIpAddress((null != ipAddr ? ipAddr : "")); param7.setIpAddress( instances[i].getIpAddress()); StateReasonType param13 = new StateReasonType(); param13.setCode( "" ); param13.setMessage( "" ); param7.setStateReason( param13 ); param7.setArchitecture( "" ); param7.setRootDeviceType( "" ); param7.setRootDeviceName( "" ); InstanceBlockDeviceMappingResponseType param14 = new InstanceBlockDeviceMappingResponseType(); InstanceBlockDeviceMappingResponseItemType param15 = new InstanceBlockDeviceMappingResponseItemType(); InstanceBlockDeviceMappingResponseItemTypeChoice_type0 param16 = new InstanceBlockDeviceMappingResponseItemTypeChoice_type0(); param15.setDeviceName( "" ); EbsInstanceBlockDeviceMappingResponseType param17 = new EbsInstanceBlockDeviceMappingResponseType(); param17.setVolumeId( "" ); param17.setStatus( "" ); param17.setAttachTime( cal ); param17.setDeleteOnTermination( true ); param16.setEbs( param17 ); param15.setInstanceBlockDeviceMappingResponseItemTypeChoice_type0( param16 ); param14.addItem( param15 ); param7.setBlockDeviceMapping( param14 ); param7.setInstanceLifecycle( "" ); param7.setSpotInstanceRequestId( "" ); param6.addItem( param7 ); param3.setInstancesSet( param6 ); param2.addItem( param3 ); } param1.setReservationSet( param2 ); param1.setRequestId( UUID.randomUUID().toString()); response.setDescribeInstancesResponse( param1 ); return response; } /** * Map our cloud state values into what Amazon defines. * Where are the values that can be returned by our cloud api defined? * * @param cloudState * @return */ private static int toAmazonCode( String cloudState ) { if (null == cloudState) return 48; if (cloudState.equalsIgnoreCase( "Destroyed" )) return 48; else if (cloudState.equalsIgnoreCase( "Stopped" )) return 80; else if (cloudState.equalsIgnoreCase( "Running" )) return 16; else if (cloudState.equalsIgnoreCase( "Starting" )) return 0; else if (cloudState.equalsIgnoreCase( "Stopping" )) return 64; else return 16; } private static String toAmazonStateName( String cloudState ) { if (null == cloudState) return new String( "terminated" ); if (cloudState.equalsIgnoreCase( "Destroyed" )) return new String( "terminated" ); else if (cloudState.equalsIgnoreCase( "Stopped" )) return new String( "stopped" ); else if (cloudState.equalsIgnoreCase( "Running" )) return new String( "running" ); else if (cloudState.equalsIgnoreCase( "Starting" )) return new String( "pending" ); else if (cloudState.equalsIgnoreCase( "Stopping" )) return new String( "stopping" ); else return new String( "running" ); } public static StopInstancesResponse toStopInstancesResponse(EC2StopInstancesResponse engineResponse) { StopInstancesResponse response = new StopInstancesResponse(); StopInstancesResponseType param1 = new StopInstancesResponseType(); InstanceStateChangeSetType param2 = new InstanceStateChangeSetType(); EC2Instance[] instances = engineResponse.getInstanceSet(); for( int i=0; i < instances.length; i++ ) { InstanceStateChangeType param3 = new InstanceStateChangeType(); param3.setInstanceId( instances[i].getId()); InstanceStateType param4 = new InstanceStateType(); param4.setCode( toAmazonCode( instances[i].getState())); param4.setName( toAmazonStateName( instances[i].getState())); param3.setCurrentState( param4 ); InstanceStateType param5 = new InstanceStateType(); param5.setCode( toAmazonCode( instances[i].getPreviousState() )); param5.setName( toAmazonStateName( instances[i].getPreviousState() )); param3.setPreviousState( param5 ); param2.addItem( param3 ); } param1.setRequestId( UUID.randomUUID().toString()); param1.setInstancesSet( param2 ); response.setStopInstancesResponse( param1 ); return response; } public static StartInstancesResponse toStartInstancesResponse(EC2StartInstancesResponse engineResponse) { StartInstancesResponse response = new StartInstancesResponse(); StartInstancesResponseType param1 = new StartInstancesResponseType(); InstanceStateChangeSetType param2 = new InstanceStateChangeSetType(); EC2Instance[] instances = engineResponse.getInstanceSet(); for( int i=0; i < instances.length; i++ ) { InstanceStateChangeType param3 = new InstanceStateChangeType(); param3.setInstanceId( instances[i].getId()); InstanceStateType param4 = new InstanceStateType(); param4.setCode( toAmazonCode( instances[i].getState())); param4.setName( toAmazonStateName( instances[i].getState())); param3.setCurrentState( param4 ); InstanceStateType param5 = new InstanceStateType(); param5.setCode( toAmazonCode( instances[i].getPreviousState() )); param5.setName( toAmazonStateName( instances[i].getPreviousState() )); param3.setPreviousState( param5 ); param2.addItem( param3 ); } param1.setRequestId( UUID.randomUUID().toString()); param1.setInstancesSet( param2 ); response.setStartInstancesResponse( param1 ); return response; } public static TerminateInstancesResponse toTermInstancesResponse(EC2StopInstancesResponse engineResponse) { TerminateInstancesResponse response = new TerminateInstancesResponse(); TerminateInstancesResponseType param1 = new TerminateInstancesResponseType(); InstanceStateChangeSetType param2 = new InstanceStateChangeSetType(); EC2Instance[] instances = engineResponse.getInstanceSet(); for( int i=0; i < instances.length; i++ ) { InstanceStateChangeType param3 = new InstanceStateChangeType(); param3.setInstanceId( instances[i].getId()); InstanceStateType param4 = new InstanceStateType(); param4.setCode( toAmazonCode( instances[i].getState())); param4.setName( toAmazonStateName( instances[i].getState())); param3.setCurrentState( param4 ); InstanceStateType param5 = new InstanceStateType(); param5.setCode( toAmazonCode( instances[i].getPreviousState() )); param5.setName( toAmazonStateName( instances[i].getPreviousState() )); param3.setPreviousState( param5 ); param2.addItem( param3 ); } param1.setRequestId( UUID.randomUUID().toString()); param1.setInstancesSet( param2 ); response.setTerminateInstancesResponse( param1 ); return response; } public static RebootInstancesResponse toRebootInstancesResponse(boolean engineResponse) { RebootInstancesResponse response = new RebootInstancesResponse(); RebootInstancesResponseType param1 = new RebootInstancesResponseType(); param1.setRequestId( UUID.randomUUID().toString()); param1.set_return( engineResponse ); response.setRebootInstancesResponse( param1 ); return response; } public static RunInstancesResponse toRunInstancesResponse(EC2RunInstancesResponse engineResponse, String accountName ) { RunInstancesResponse response = new RunInstancesResponse(); RunInstancesResponseType param1 = new RunInstancesResponseType(); param1.setReservationId( "" ); param1.setOwnerId( accountName ); GroupSetType param2 = new GroupSetType(); GroupItemType param3 = new GroupItemType(); param3.setGroupId( "" ); param2.addItem( param3 ); param1.setGroupSet( param2 ); RunningInstancesSetType param6 = new RunningInstancesSetType(); EC2Instance[] instances = engineResponse.getInstanceSet(); for( int i=0; i < instances.length; i++ ) { RunningInstancesItemType param7 = new RunningInstancesItemType(); param7.setInstanceId( instances[i].getId()); param7.setImageId( instances[i].getTemplateId()); InstanceStateType param8 = new InstanceStateType(); param8.setCode( toAmazonCode( instances[i].getState())); param8.setName( toAmazonStateName( instances[i].getState())); param7.setInstanceState( param8 ); param7.setPrivateDnsName( "" ); param7.setDnsName( "" ); param7.setReason( "" ); param7.setKeyName( "" ); param7.setAmiLaunchIndex( "" ); ProductCodesSetType param9 = new ProductCodesSetType(); ProductCodesSetItemType param10 = new ProductCodesSetItemType(); param10.setProductCode( "" ); param9.addItem( param10 ); param7.setProductCodes( param9 ); param7.setInstanceType( instances[i].getServiceOffering()); // -> CloudStack seems to have issues with timestamp formats so just in case Calendar cal = instances[i].getCreated(); if ( null == cal ) { cal = Calendar.getInstance(); cal.set( 1970, 1, 1 ); } param7.setLaunchTime( cal ); PlacementResponseType param11 = new PlacementResponseType(); param11.setAvailabilityZone( instances[i].getZoneName()); param7.setPlacement( param11 ); param7.setKernelId( "" ); param7.setRamdiskId( "" ); param7.setPlatform( "" ); InstanceMonitoringStateType param12 = new InstanceMonitoringStateType(); param12.setState( "" ); param7.setMonitoring( param12 ); param7.setSubnetId( "" ); param7.setVpcId( "" ); String ipAddr = instances[i].getIpAddress(); param7.setPrivateIpAddress((null != ipAddr ? ipAddr : "")); param7.setIpAddress( instances[i].getIpAddress()); StateReasonType param13 = new StateReasonType(); param13.setCode( "" ); param13.setMessage( "" ); param7.setStateReason( param13 ); param7.setArchitecture( "" ); param7.setRootDeviceType( "" ); param7.setRootDeviceName( "" ); InstanceBlockDeviceMappingResponseType param14 = new InstanceBlockDeviceMappingResponseType(); InstanceBlockDeviceMappingResponseItemType param15 = new InstanceBlockDeviceMappingResponseItemType(); InstanceBlockDeviceMappingResponseItemTypeChoice_type0 param16 = new InstanceBlockDeviceMappingResponseItemTypeChoice_type0(); param15.setDeviceName( "" ); EbsInstanceBlockDeviceMappingResponseType param17 = new EbsInstanceBlockDeviceMappingResponseType(); param17.setVolumeId( "" ); param17.setStatus( "" ); param17.setAttachTime( cal ); param17.setDeleteOnTermination( true ); param16.setEbs( param17 ); param15.setInstanceBlockDeviceMappingResponseItemTypeChoice_type0( param16 ); param14.addItem( param15 ); param7.setBlockDeviceMapping( param14 ); param7.setInstanceLifecycle( "" ); param7.setSpotInstanceRequestId( "" ); param6.addItem( param7 ); } param1.setInstancesSet( param6 ); param1.setRequesterId( "" ); param1.setRequestId( UUID.randomUUID().toString()); response.setRunInstancesResponse( param1 ); return response; } public static DescribeAvailabilityZonesResponse toDescribeAvailabilityZonesResponse(EC2DescribeAvailabilityZonesResponse engineResponse) { DescribeAvailabilityZonesResponse response = new DescribeAvailabilityZonesResponse(); DescribeAvailabilityZonesResponseType param1 = new DescribeAvailabilityZonesResponseType(); AvailabilityZoneSetType param2 = new AvailabilityZoneSetType(); String[] zones = engineResponse.getZoneSet(); for( int i=0; i < zones.length; i++ ) { AvailabilityZoneItemType param3 = new AvailabilityZoneItemType(); AvailabilityZoneMessageSetType param4 = new AvailabilityZoneMessageSetType(); param3.setZoneName( zones[i] ); param3.setZoneState( "available" ); param3.setRegionName( "" ); param3.setMessageSet( param4 ); param2.addItem( param3 ); } param1.setRequestId( UUID.randomUUID().toString()); param1.setAvailabilityZoneInfo( param2 ); response.setDescribeAvailabilityZonesResponse( param1 ); return response; } public static AttachVolumeResponse toAttachVolumeResponse(EC2Volume engineResponse) { AttachVolumeResponse response = new AttachVolumeResponse(); AttachVolumeResponseType param1 = new AttachVolumeResponseType(); Calendar cal = Calendar.getInstance(); cal.set( 1970, 1, 1 ); // return one value, Unix Epoch, what else can we return? // -> if the instanceId was not given in the request then we have no way to get it param1.setVolumeId( engineResponse.getId()); param1.setInstanceId( engineResponse.getInstanceId()); param1.setDevice( engineResponse.getDevice()); if ( null != engineResponse.getStatus()) param1.setStatus( engineResponse.getStatus()); else param1.setStatus( "" ); // ToDo - throw an Soap Fault param1.setAttachTime( cal ); param1.setRequestId( UUID.randomUUID().toString()); response.setAttachVolumeResponse( param1 ); return response; } public static DetachVolumeResponse toDetachVolumeResponse(EC2Volume engineResponse) { DetachVolumeResponse response = new DetachVolumeResponse(); DetachVolumeResponseType param1 = new DetachVolumeResponseType(); Calendar cal = Calendar.getInstance(); cal.set( 1970, 1, 1 ); // return one value, Unix Epoch, what else can we return? param1.setVolumeId( engineResponse.getId()); param1.setInstanceId( (null == engineResponse.getInstanceId() ? "" : engineResponse.getInstanceId())); param1.setDevice( (null == engineResponse.getDevice() ? "" : engineResponse.getDevice())); if ( null != engineResponse.getStatus()) param1.setStatus( engineResponse.getStatus()); else param1.setStatus( "" ); // ToDo - throw an Soap Fault param1.setAttachTime( cal ); param1.setRequestId( UUID.randomUUID().toString()); response.setDetachVolumeResponse( param1 ); return response; } public static CreateVolumeResponse toCreateVolumeResponse(EC2Volume engineResponse) { CreateVolumeResponse response = new CreateVolumeResponse(); CreateVolumeResponseType param1 = new CreateVolumeResponseType(); param1.setVolumeId( engineResponse.getId()); Integer volSize = new Integer( engineResponse.getSize()); param1.setSize( volSize.toString()); param1.setSnapshotId( "" ); param1.setAvailabilityZone( engineResponse.getZoneName()); if ( null != engineResponse.getStatus()) param1.setStatus( engineResponse.getStatus()); else param1.setStatus( "" ); // ToDo - throw an Soap Fault // -> CloudStack seems to have issues with timestamp formats so just in case Calendar cal = engineResponse.getCreated(); if ( null == cal ) { cal = Calendar.getInstance(); cal.set( 1970, 1, 1 ); } param1.setCreateTime( cal ); param1.setRequestId( UUID.randomUUID().toString()); response.setCreateVolumeResponse( param1 ); return response; } public static DeleteVolumeResponse toDeleteVolumeResponse(EC2Volume engineResponse) { DeleteVolumeResponse response = new DeleteVolumeResponse(); DeleteVolumeResponseType param1 = new DeleteVolumeResponseType(); if ( null != engineResponse.getStatus()) param1.set_return( true ); else param1.set_return( false ); // ToDo - throw an Soap Fault param1.setRequestId( UUID.randomUUID().toString()); response.setDeleteVolumeResponse( param1 ); return response; } public static DescribeSnapshotsResponse toDescribeSnapshotsResponse(EC2DescribeSnapshotsResponse engineResponse, String accountName ) { DescribeSnapshotsResponse response = new DescribeSnapshotsResponse(); DescribeSnapshotsResponseType param1 = new DescribeSnapshotsResponseType(); DescribeSnapshotsSetResponseType param2 = new DescribeSnapshotsSetResponseType(); EC2Snapshot[] snapshots = engineResponse.getSnapshotSet(); for( int i=0; i < snapshots.length; i++ ) { DescribeSnapshotsSetItemResponseType param3 = new DescribeSnapshotsSetItemResponseType(); param3.setSnapshotId( snapshots[i].getId()); param3.setVolumeId( snapshots[i].getVolumeId()); param3.setStatus( snapshots[i].getType()); // -> CloudStack seems to have issues with timestamp formats so just in case Calendar cal = snapshots[i].getCreated(); if ( null == cal ) { cal = Calendar.getInstance(); cal.set( 1970, 1, 1 ); } param3.setStartTime( cal ); param3.setProgress( "0" ); param3.setOwnerId( accountName ); Integer volSize = new Integer( snapshots[i].getVolumeSize()); param3.setVolumeSize( volSize.toString()); param3.setDescription( snapshots[i].getName()); param3.setOwnerAlias( "" ); param2.addItem( param3 ); } param1.setSnapshotSet( param2 ); param1.setRequestId( UUID.randomUUID().toString()); response.setDescribeSnapshotsResponse( param1 ); return response; } public static DeleteSnapshotResponse toDeleteSnapshotResponse( boolean engineResponse ) { DeleteSnapshotResponse response = new DeleteSnapshotResponse(); DeleteSnapshotResponseType param1 = new DeleteSnapshotResponseType(); param1.set_return( engineResponse ); param1.setRequestId( UUID.randomUUID().toString()); response.setDeleteSnapshotResponse( param1 ); return response; } public static CreateSnapshotResponse toCreateSnapshotResponse(EC2Snapshot engineResponse, String accountName ) { CreateSnapshotResponse response = new CreateSnapshotResponse(); CreateSnapshotResponseType param1 = new CreateSnapshotResponseType(); param1.setSnapshotId( engineResponse.getId()); param1.setVolumeId( engineResponse.getVolumeId()); param1.setStatus( "completed" ); // -> CloudStack seems to have issues with timestamp formats so just in case Calendar cal = engineResponse.getCreated(); if ( null == cal ) { cal = Calendar.getInstance(); cal.set( 1970, 1, 1 ); } param1.setStartTime( cal ); param1.setProgress( "100" ); param1.setOwnerId( accountName ); Integer volSize = new Integer( engineResponse.getVolumeSize()); param1.setVolumeSize( volSize.toString()); param1.setDescription( engineResponse.getName()); param1.setRequestId( UUID.randomUUID().toString()); response.setCreateSnapshotResponse( param1 ); return response; } public static DescribeSecurityGroupsResponse toDescribeSecurityGroupsResponse(EC2DescribeSecurityGroupsResponse engineResponse ) { DescribeSecurityGroupsResponse response = new DescribeSecurityGroupsResponse(); DescribeSecurityGroupsResponseType param1 = new DescribeSecurityGroupsResponseType(); SecurityGroupSetType param2 = new SecurityGroupSetType(); EC2SecurityGroup[] groups = engineResponse.getGroupSet(); for( int i=0; i < groups.length; i++ ) { SecurityGroupItemType param3 = new SecurityGroupItemType(); param3.setOwnerId( groups[i].getAccount()); param3.setGroupName( groups[i].getName()); String desc = groups[i].getDescription(); param3.setGroupDescription((null != desc ? desc : "")); IpPermissionSetType param4 = new IpPermissionSetType(); EC2IpPermission[] perms = groups[i].getIpPermissionSet(); for( int j=0; j < perms.length; j++ ) { IpPermissionType param5 = new IpPermissionType(); param5.setIpProtocol( perms[j].getProtocol()); param5.setFromPort( perms[j].getFromPort()); param5.setToPort( perms[j].getToPort()); // -> user groups EC2SecurityGroup[] userSet = perms[j].getUserSet(); if ( null == userSet || 0 == userSet.length ) { UserIdGroupPairSetType param8 = new UserIdGroupPairSetType(); param5.setGroups( param8 ); } else { for( int h=0; h < userSet.length; h++ ) { UserIdGroupPairSetType param8 = new UserIdGroupPairSetType(); UserIdGroupPairType param9 = new UserIdGroupPairType(); param9.setUserId( userSet[h].getAccount()); param9.setGroupName( userSet[h].getName()); param8.addItem( param9 ); param5.setGroups( param8 ); } } // -> or CIDR list String[] rangeSet = perms[j].getIpRangeSet(); if ( null == rangeSet || 0 == rangeSet.length ) { IpRangeSetType param6 = new IpRangeSetType(); param5.setIpRanges( param6 ); } else { for( int k=0; k < rangeSet.length; k++ ) { IpRangeSetType param6 = new IpRangeSetType(); IpRangeItemType param7 = new IpRangeItemType(); param7.setCidrIp( rangeSet[k] ); param6.addItem( param7 ); param5.setIpRanges( param6 ); } } param4.addItem( param5 ); } param3.setIpPermissions( param4 ); param2.addItem( param3 ); } param1.setSecurityGroupInfo( param2 ); param1.setRequestId( UUID.randomUUID().toString()); response.setDescribeSecurityGroupsResponse( param1 ); return response; } public static CreateSecurityGroupResponse toCreateSecurityGroupResponse( boolean success ) { CreateSecurityGroupResponse response = new CreateSecurityGroupResponse(); CreateSecurityGroupResponseType param1 = new CreateSecurityGroupResponseType(); param1.set_return( success ); param1.setRequestId( UUID.randomUUID().toString()); response.setCreateSecurityGroupResponse( param1 ); return response; } public static DeleteSecurityGroupResponse toDeleteSecurityGroupResponse( boolean success ) { DeleteSecurityGroupResponse response = new DeleteSecurityGroupResponse(); DeleteSecurityGroupResponseType param1 = new DeleteSecurityGroupResponseType(); param1.set_return( success ); param1.setRequestId( UUID.randomUUID().toString()); response.setDeleteSecurityGroupResponse( param1 ); return response; } public static AuthorizeSecurityGroupIngressResponse toAuthorizeSecurityGroupIngressResponse( boolean success ) { AuthorizeSecurityGroupIngressResponse response = new AuthorizeSecurityGroupIngressResponse(); AuthorizeSecurityGroupIngressResponseType param1 = new AuthorizeSecurityGroupIngressResponseType(); param1.set_return( success ); param1.setRequestId( UUID.randomUUID().toString()); response.setAuthorizeSecurityGroupIngressResponse( param1 ); return response; } public static RevokeSecurityGroupIngressResponse toRevokeSecurityGroupIngressResponse( boolean success ) { RevokeSecurityGroupIngressResponse response = new RevokeSecurityGroupIngressResponse(); RevokeSecurityGroupIngressResponseType param1 = new RevokeSecurityGroupIngressResponseType(); param1.set_return( success ); param1.setRequestId( UUID.randomUUID().toString()); response.setRevokeSecurityGroupIngressResponse( param1 ); return response; } }