sendRequest($params); $xpath = $response->getXPath(); $amiId = $xpath->evaluate('string(//ec2:imageId/text())'); return $amiId; } /** * Returns information about AMIs, AKIs, and ARIs available to the user. * Information returned includes image type, product codes, architecture, * and kernel and RAM disk IDs. Images available to the user include public * images available for any user to launch, private images owned by the user * making the request, and private images owned by other users for which the * user has explicit launch permissions. * * Launch permissions fall into three categories: * public: The owner of the AMI granted launch permissions for the AMI * to the all group. All users have launch permissions for these AMIs. * explicit: The owner of the AMI granted launch permissions to a specific user. * implicit: A user has implicit launch permissions for all AMIs he or she owns. * * The list of AMIs returned can be modified by specifying AMI IDs, AMI owners, * or users with launch permissions. If no options are specified, Amazon EC2 returns * all AMIs for which the user has launch permissions. * * If you specify one or more AMI IDs, only AMIs that have the specified IDs are returned. * If you specify an invalid AMI ID, a fault is returned. If you specify an AMI ID for which * you do not have access, it will not be included in the returned results. * * If you specify one or more AMI owners, only AMIs from the specified owners and for * which you have access are returned. The results can include the account IDs of the * specified owners, amazon for AMIs owned by Amazon or self for AMIs that you own. * * If you specify a list of executable users, only users that have launch permissions * for the AMIs are returned. You can specify account IDs (if you own the AMI(s)), self * for AMIs for which you own or have explicit permissions, or all for public AMIs. * * @param string|array $imageId A list of image descriptions * @param string|array $owner Owners of AMIs to describe. * @param string|array $executableBy AMIs for which specified users have access. * @return array */ public function describe($imageId = null, $owner = null, $executableBy = null) { $params = array(); $params['Action'] = 'DescribeImages'; if(is_array($imageId) && !empty($imageId)) { foreach($imageId as $k=>$name) { $params['ImageId.' . ($k+1)] = $name; } } elseif($imageId) { $params['ImageId.1'] = $imageId; } if(is_array($owner) && !empty($owner)) { foreach($owner as $k=>$name) { $params['Owner.' . ($k+1)] = $name; } } elseif($owner) { $params['Owner.1'] = $owner; } if(is_array($executableBy) && !empty($executableBy)) { foreach($executableBy as $k=>$name) { $params['ExecutableBy.' . ($k+1)] = $name; } } elseif($executableBy) { $params['ExecutableBy.1'] = $executableBy; } $response = $this->sendRequest($params); $xpath = $response->getXPath(); $nodes = $xpath->query('//ec2:imagesSet/ec2:item'); $return = array(); foreach ($nodes as $node) { $item = array(); $item['imageId'] = $xpath->evaluate('string(ec2:imageId/text())', $node); $item['imageLocation'] = $xpath->evaluate('string(ec2:imageLocation/text())', $node); $item['imageState'] = $xpath->evaluate('string(ec2:imageState/text())', $node); $item['imageOwnerId'] = $xpath->evaluate('string(ec2:imageOwnerId/text())', $node); $item['isPublic'] = $xpath->evaluate('string(ec2:isPublic/text())', $node); $item['architecture'] = $xpath->evaluate('string(ec2:architecture/text())', $node); $item['imageType'] = $xpath->evaluate('string(ec2:imageType/text())', $node); $item['kernelId'] = $xpath->evaluate('string(ec2:kernelId/text())', $node); $item['ramdiskId'] = $xpath->evaluate('string(ec2:ramdiskId/text())', $node); $item['platform'] = $xpath->evaluate('string(ec2:platform/text())', $node); $return[] = $item; unset($item, $node); } return $return; } /** * Deregisters an AMI. Once deregistered, instances of the AMI can no longer be launched. * * @param string $imageId Unique ID of a machine image, returned by a call * to RegisterImage or DescribeImages. * @return boolean */ public function deregister($imageId) { $params = array(); $params['Action'] = 'DeregisterImage'; $params['ImageId'] = $imageId; $response = $this->sendRequest($params); $xpath = $response->getXPath(); $return = $xpath->evaluate('string(//ec2:return/text())'); return ($return === "true"); } /** * Modifies an attribute of an AMI. * * Valid Attributes: * launchPermission: Controls who has permission to launch the AMI. Launch permissions * can be granted to specific users by adding userIds. * To make the AMI public, add the all group. * productCodes: Associates a product code with AMIs. This allows developers to * charge users for using AMIs. The user must be signed up for the * product before they can launch the AMI. This is a write once attribute; * after it is set, it cannot be changed or removed. * * @param string $imageId AMI ID to modify. * @param string $attribute Specifies the attribute to modify. See the preceding * attributes table for supported attributes. * @param string $operationType Specifies the operation to perform on the attribute. * See the preceding attributes table for supported operations for attributes. * Valid Values: add | remove * Required for launchPermssion Attribute * * @param string|array $userId User IDs to add to or remove from the launchPermission attribute. * Required for launchPermssion Attribute * @param string|array $userGroup User groups to add to or remove from the launchPermission attribute. * Currently, the all group is available, which will make it a public AMI. * Required for launchPermssion Attribute * @param string $productCode Attaches a product code to the AMI. Currently only one product code * can be associated with an AMI. Once set, the product code cannot be changed or reset. * Required for productCodes Attribute * @return boolean */ public function modifyAttribute($imageId, $attribute, $operationType = 'add', $userId = null, $userGroup = null, $productCode = null) { $params = array(); $params['Action'] = 'ModifyImageAttribute'; $parmas['ImageId'] = $imageId; $params['Attribute'] = $attribute; switch($attribute) { case 'launchPermission': // break left out case 'launchpermission': $params['Attribute'] = 'launchPermission'; $params['OperationType'] = $operationType; if(is_array($userId) && !empty($userId)) { foreach($userId as $k=>$name) { $params['UserId.' . ($k+1)] = $name; } } elseif($userId) { $params['UserId.1'] = $userId; } if(is_array($userGroup) && !empty($userGroup)) { foreach($userGroup as $k=>$name) { $params['UserGroup.' . ($k+1)] = $name; } } elseif($userGroup) { $params['UserGroup.1'] = $userGroup; } break; case 'productCodes': // break left out case 'productcodes': $params['Attribute'] = 'productCodes'; $params['ProductCode.1'] = $productCode; break; default: require_once 'Zend/Service/Amazon/Ec2/Exception.php'; throw new Zend_Service_Amazon_Ec2_Exception('Invalid Attribute Passed In. Valid Image Attributes are launchPermission and productCode.'); break; } $response = $this->sendRequest($params); $xpath = $response->getXPath(); $return = $xpath->evaluate('string(//ec2:return/text())'); return ($return === "true"); } /** * Returns information about an attribute of an AMI. Only one attribute can be specified per call. * * @param string $imageId ID of the AMI for which an attribute will be described. * @param string $attribute Specifies the attribute to describe. Valid Attributes are * launchPermission, productCodes */ public function describeAttribute($imageId, $attribute) { $params = array(); $params['Action'] = 'DescribeImageAttribute'; $params['ImageId'] = $imageId; $params['Attribute'] = $attribute; $response = $this->sendRequest($params); $xpath = $response->getXPath(); $return = array(); $return['imageId'] = $xpath->evaluate('string(//ec2:imageId/text())'); // check for launchPermission if($attribute == 'launchPermission') { $lPnodes = $xpath->query('//ec2:launchPermission/ec2:item'); if($lPnodes->length > 0) { $return['launchPermission'] = array(); foreach($lPnodes as $node) { $return['launchPermission'][] = $xpath->evaluate('string(ec2:userId/text())', $node); } } } // check for product codes if($attribute == 'productCodes') { $pCnodes = $xpath->query('//ec2:productCodes/ec2:item'); if($pCnodes->length > 0) { $return['productCodes'] = array(); foreach($pCnodes as $node) { $return['productCodes'][] = $xpath->evaluate('string(ec2:productCode/text())', $node); } } } return $return; } /** * Resets an attribute of an AMI to its default value. The productCodes attribute cannot be reset * * @param string $imageId ID of the AMI for which an attribute will be reset. * @param String $attribute Specifies the attribute to reset. Currently, only launchPermission is supported. * In the case of launchPermission, all public and explicit launch permissions for * the AMI are revoked. * @return boolean */ public function resetAttribute($imageId, $attribute) { $params = array(); $params['Action'] = 'ResetImageAttribute'; $params['ImageId'] = $imageId; $params['Attribute'] = $attribute; $response = $this->sendRequest($params); $xpath = $response->getXPath(); $return = $xpath->evaluate('string(//ec2:return/text())'); return ($return === "true"); } }