/**
 * Request Spot Instances Action Sample
 * Creates a Spot Instance request. Spot Instances are instances that automatically launch when your
 * request price exceeds the Spot Price that Amazon EC2 periodically calculates.  
 * @param Amazon_EC2_Interface $service instance of Amazon_EC2_Interface
 * @param mixed $request Amazon_EC2_Model_RequestSpotInstances or array of parameters
 */
function invokeRequestSpotInstances(Amazon_EC2_Interface $service, $request)
{
    try {
        $response = $service->requestSpotInstances($request);
        echo "Service Response\n";
        echo "=============================================================================\n";
        echo "        RequestSpotInstancesResponse\n";
        if ($response->isSetResponseMetadata()) {
            echo "            ResponseMetadata\n";
            $responseMetadata = $response->getResponseMetadata();
            if ($responseMetadata->isSetRequestId()) {
                echo "                RequestId\n";
                echo "                    " . $responseMetadata->getRequestId() . "\n";
            }
        }
        if ($response->isSetRequestSpotInstancesResult()) {
            echo "            RequestSpotInstancesResult\n";
            $requestSpotInstancesResult = $response->getRequestSpotInstancesResult();
            $spotInstanceRequestList = $requestSpotInstancesResult->getSpotInstanceRequest();
            foreach ($spotInstanceRequestList as $spotInstanceRequest) {
                echo "                SpotInstanceRequest\n";
                if ($spotInstanceRequest->isSetSpotInstanceRequestId()) {
                    echo "                    SpotInstanceRequestId\n";
                    echo "                        " . $spotInstanceRequest->getSpotInstanceRequestId() . "\n";
                }
                if ($spotInstanceRequest->isSetSpotPrice()) {
                    echo "                    SpotPrice\n";
                    echo "                        " . $spotInstanceRequest->getSpotPrice() . "\n";
                }
                if ($spotInstanceRequest->isSetType()) {
                    echo "                    Type\n";
                    echo "                        " . $spotInstanceRequest->getType() . "\n";
                }
                if ($spotInstanceRequest->isSetState()) {
                    echo "                    State\n";
                    echo "                        " . $spotInstanceRequest->getState() . "\n";
                }
                if ($spotInstanceRequest->isSetFault()) {
                    echo "                    Fault\n";
                    $fault = $spotInstanceRequest->getFault();
                    if ($fault->isSetCode()) {
                        echo "                        Code\n";
                        echo "                            " . $fault->getCode() . "\n";
                    }
                    if ($fault->isSetMessage()) {
                        echo "                        Message\n";
                        echo "                            " . $fault->getMessage() . "\n";
                    }
                }
                if ($spotInstanceRequest->isSetValidFrom()) {
                    echo "                    ValidFrom\n";
                    echo "                        " . $spotInstanceRequest->getValidFrom() . "\n";
                }
                if ($spotInstanceRequest->isSetValidUntil()) {
                    echo "                    ValidUntil\n";
                    echo "                        " . $spotInstanceRequest->getValidUntil() . "\n";
                }
                if ($spotInstanceRequest->isSetLaunchGroup()) {
                    echo "                    LaunchGroup\n";
                    echo "                        " . $spotInstanceRequest->getLaunchGroup() . "\n";
                }
                if ($spotInstanceRequest->isSetAvailabilityZoneGroup()) {
                    echo "                    AvailabilityZoneGroup\n";
                    echo "                        " . $spotInstanceRequest->getAvailabilityZoneGroup() . "\n";
                }
                if ($spotInstanceRequest->isSetLaunchSpecification()) {
                    echo "                    LaunchSpecification\n";
                    $launchSpecification = $spotInstanceRequest->getLaunchSpecification();
                    if ($launchSpecification->isSetImageId()) {
                        echo "                        ImageId\n";
                        echo "                            " . $launchSpecification->getImageId() . "\n";
                    }
                    if ($launchSpecification->isSetKeyName()) {
                        echo "                        KeyName\n";
                        echo "                            " . $launchSpecification->getKeyName() . "\n";
                    }
                    $securityGroupList = $launchSpecification->getSecurityGroup();
                    foreach ($securityGroupList as $securityGroup) {
                        echo "                        SecurityGroup\n";
                        echo "                            " . $securityGroup;
                    }
                    if ($launchSpecification->isSetUserData()) {
                        echo "                        UserData\n";
                        echo "                            " . $launchSpecification->getUserData() . "\n";
                    }
                    if ($launchSpecification->isSetAddressingType()) {
                        echo "                        AddressingType\n";
                        echo "                            " . $launchSpecification->getAddressingType() . "\n";
                    }
                    if ($launchSpecification->isSetInstanceType()) {
                        echo "                        InstanceType\n";
                        echo "                            " . $launchSpecification->getInstanceType() . "\n";
                    }
                    if ($launchSpecification->isSetPlacement()) {
                        echo "                        Placement\n";
                        $placement = $launchSpecification->getPlacement();
                        if ($placement->isSetAvailabilityZone()) {
                            echo "                            AvailabilityZone\n";
                            echo "                                " . $placement->getAvailabilityZone() . "\n";
                        }
                    }
                    if ($launchSpecification->isSetKernelId()) {
                        echo "                        KernelId\n";
                        echo "                            " . $launchSpecification->getKernelId() . "\n";
                    }
                    if ($launchSpecification->isSetRamdiskId()) {
                        echo "                        RamdiskId\n";
                        echo "                            " . $launchSpecification->getRamdiskId() . "\n";
                    }
                    $blockDeviceMappingList = $launchSpecification->getBlockDeviceMapping();
                    foreach ($blockDeviceMappingList as $blockDeviceMapping) {
                        echo "                        BlockDeviceMapping\n";
                        if ($blockDeviceMapping->isSetDeviceName()) {
                            echo "                            DeviceName\n";
                            echo "                                " . $blockDeviceMapping->getDeviceName() . "\n";
                        }
                        if ($blockDeviceMapping->isSetVirtualName()) {
                            echo "                            VirtualName\n";
                            echo "                                " . $blockDeviceMapping->getVirtualName() . "\n";
                        }
                        if ($blockDeviceMapping->isSetEbs()) {
                            echo "                            Ebs\n";
                            $ebs = $blockDeviceMapping->getEbs();
                            if ($ebs->isSetSnapshotId()) {
                                echo "                                SnapshotId\n";
                                echo "                                    " . $ebs->getSnapshotId() . "\n";
                            }
                            if ($ebs->isSetVolumeSize()) {
                                echo "                                VolumeSize\n";
                                echo "                                    " . $ebs->getVolumeSize() . "\n";
                            }
                            if ($ebs->isSetDeleteOnTermination()) {
                                echo "                                DeleteOnTermination\n";
                                echo "                                    " . $ebs->getDeleteOnTermination() . "\n";
                            }
                        }
                        if ($blockDeviceMapping->isSetNoDevice()) {
                            echo "                            NoDevice\n";
                            echo "                                " . $blockDeviceMapping->getNoDevice() . "\n";
                        }
                    }
                    if ($launchSpecification->isSetMonitoring()) {
                        echo "                        Monitoring\n";
                        $monitoring = $launchSpecification->getMonitoring();
                        if ($monitoring->isSetEnabled()) {
                            echo "                            Enabled\n";
                            echo "                                " . $monitoring->getEnabled() . "\n";
                        }
                    }
                    if ($launchSpecification->isSetSubnetId()) {
                        echo "                        SubnetId\n";
                        echo "                            " . $launchSpecification->getSubnetId() . "\n";
                    }
                }
                if ($spotInstanceRequest->isSetInstanceId()) {
                    echo "                    InstanceId\n";
                    echo "                        " . $spotInstanceRequest->getInstanceId() . "\n";
                }
                if ($spotInstanceRequest->isSetCreateTime()) {
                    echo "                    CreateTime\n";
                    echo "                        " . $spotInstanceRequest->getCreateTime() . "\n";
                }
                if ($spotInstanceRequest->isSetProductDescription()) {
                    echo "                    ProductDescription\n";
                    echo "                        " . $spotInstanceRequest->getProductDescription() . "\n";
                }
            }
        }
    } catch (Amazon_EC2_Exception $ex) {
        echo "Caught Exception: " . $ex->getMessage() . "\n";
        echo "Response Status Code: " . $ex->getStatusCode() . "\n";
        echo "Error Code: " . $ex->getErrorCode() . "\n";
        echo "Error Type: " . $ex->getErrorType() . "\n";
        echo "Request ID: " . $ex->getRequestId() . "\n";
        echo "XML: " . $ex->getXML() . "\n";
    }
}