diff -r 5b37998e522e -r 162c1de6545a web/lib/Zend/Service/Amazon/Ec2/Instance.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/Zend/Service/Amazon/Ec2/Instance.php Fri Mar 11 15:05:35 2011 +0100 @@ -0,0 +1,529 @@ + 1, + 'maxCount' => 1, + 'instanceType' => Zend_Service_Amazon_Ec2_Instance::SMALL + ); + + // set / override the defualt optoins if they are not passed into the array; + $options = array_merge($_defaultOptions, $options); + + if(!isset($options['imageId'])) { + require_once 'Zend/Service/Amazon/Ec2/Exception.php'; + throw new Zend_Service_Amazon_Ec2_Exception('No Image Id Provided'); + } + + + $params = array(); + $params['Action'] = 'RunInstances'; + $params['ImageId'] = $options['imageId']; + $params['MinCount'] = $options['minCount']; + $params['MaxCount'] = $options['maxCount']; + + if(isset($options['keyName'])) { + $params['KeyName'] = $options['keyName']; + } + + if(is_array($options['securityGroup']) && !empty($options['securityGroup'])) { + foreach($options['securityGroup'] as $k=>$name) { + $params['SecurityGroup.' . ($k+1)] = $name; + } + } elseif(isset($options['securityGroup'])) { + $params['SecurityGroup.1'] = $options['securityGroup']; + } + + if(isset($options['userData'])) { + $params['UserData'] = base64_encode($options['userData']); + } + + if(isset($options['instanceType'])) { + $params['InstanceType'] = $options['instanceType']; + } + + if(isset($options['placement'])) { + $params['Placement.AvailabilityZone'] = $options['placement']; + } + + if(isset($options['kernelId'])) { + $params['KernelId'] = $options['kernelId']; + } + + if(isset($options['ramdiskId'])) { + $params['RamdiskId'] = $options['ramdiskId']; + } + + if(isset($options['blockDeviceVirtualName']) && isset($options['blockDeviceName'])) { + $params['BlockDeviceMapping.n.VirtualName'] = $options['blockDeviceVirtualName']; + $params['BlockDeviceMapping.n.DeviceName'] = $options['blockDeviceName']; + } + + if(isset($options['monitor']) && $options['monitor'] === true) { + $params['Monitoring.Enabled'] = true; + } + + $response = $this->sendRequest($params); + $xpath = $response->getXPath(); + + $return = array(); + + $return['reservationId'] = $xpath->evaluate('string(//ec2:reservationId/text())'); + $return['ownerId'] = $xpath->evaluate('string(//ec2:ownerId/text())'); + + $gs = $xpath->query('//ec2:groupSet/ec2:item'); + foreach($gs as $gs_node) { + $return['groupSet'][] = $xpath->evaluate('string(ec2:groupId/text())', $gs_node); + unset($gs_node); + } + unset($gs); + + $is = $xpath->query('//ec2:instancesSet/ec2:item'); + foreach($is as $is_node) { + $item = array(); + + $item['instanceId'] = $xpath->evaluate('string(ec2:instanceId/text())', $is_node); + $item['imageId'] = $xpath->evaluate('string(ec2:imageId/text())', $is_node); + $item['instanceState']['code'] = $xpath->evaluate('string(ec2:instanceState/ec2:code/text())', $is_node); + $item['instanceState']['name'] = $xpath->evaluate('string(ec2:instanceState/ec2:name/text())', $is_node); + $item['privateDnsName'] = $xpath->evaluate('string(ec2:privateDnsName/text())', $is_node); + $item['dnsName'] = $xpath->evaluate('string(ec2:dnsName/text())', $is_node); + $item['keyName'] = $xpath->evaluate('string(ec2:keyName/text())', $is_node); + $item['instanceType'] = $xpath->evaluate('string(ec2:instanceType/text())', $is_node); + $item['amiLaunchIndex'] = $xpath->evaluate('string(ec2:amiLaunchIndex/text())', $is_node); + $item['launchTime'] = $xpath->evaluate('string(ec2:launchTime/text())', $is_node); + $item['availabilityZone'] = $xpath->evaluate('string(ec2:placement/ec2:availabilityZone/text())', $is_node); + + $return['instances'][] = $item; + unset($item); + unset($is_node); + } + unset($is); + + return $return; + + } + + /** + * Returns information about instances that you own. + * + * If you specify one or more instance IDs, Amazon EC2 returns information + * for those instances. If you do not specify instance IDs, Amazon EC2 + * returns information for all relevant instances. If you specify an invalid + * instance ID, a fault is returned. If you specify an instance that you do + * not own, it will not be included in the returned results. + * + * Recently terminated instances might appear in the returned results. + * This interval is usually less than one hour. + * + * @param string|array $instaceId Set of instances IDs of which to get the status. + * @param boolean Ture to ignore Terminated Instances. + * @return array + */ + public function describe($instanceId = null, $ignoreTerminated = false) + { + $params = array(); + $params['Action'] = 'DescribeInstances'; + + if(is_array($instanceId) && !empty($instanceId)) { + foreach($instanceId as $k=>$name) { + $params['InstanceId.' . ($k+1)] = $name; + } + } elseif($instanceId) { + $params['InstanceId.1'] = $instanceId; + } + + $response = $this->sendRequest($params); + + $xpath = $response->getXPath(); + + $nodes = $xpath->query('//ec2:reservationSet/ec2:item'); + + $return = array(); + $return['instances'] = array(); + + foreach($nodes as $node) { + if($xpath->evaluate('string(ec2:instancesSet/ec2:item/ec2:instanceState/ec2:code/text())', $node) == 48 && $ignoreTerminated) continue; + $item = array(); + + $item['reservationId'] = $xpath->evaluate('string(ec2:reservationId/text())', $node); + $item['ownerId'] = $xpath->evaluate('string(ec2:ownerId/text())', $node); + + $gs = $xpath->query('ec2:groupSet/ec2:item', $node); + foreach($gs as $gs_node) { + $item['groupSet'][] = $xpath->evaluate('string(ec2:groupId/text())', $gs_node); + unset($gs_node); + } + unset($gs); + + $is = $xpath->query('ec2:instancesSet/ec2:item', $node); + + foreach($is as $is_node) { + + $item['instanceId'] = $xpath->evaluate('string(ec2:instanceId/text())', $is_node); + $item['imageId'] = $xpath->evaluate('string(ec2:imageId/text())', $is_node); + $item['instanceState']['code'] = $xpath->evaluate('string(ec2:instanceState/ec2:code/text())', $is_node); + $item['instanceState']['name'] = $xpath->evaluate('string(ec2:instanceState/ec2:name/text())', $is_node); + $item['privateDnsName'] = $xpath->evaluate('string(ec2:privateDnsName/text())', $is_node); + $item['dnsName'] = $xpath->evaluate('string(ec2:dnsName/text())', $is_node); + $item['keyName'] = $xpath->evaluate('string(ec2:keyName/text())', $is_node); + $item['productCode'] = $xpath->evaluate('string(ec2:productCodesSet/ec2:item/ec2:productCode/text())', $is_node); + $item['instanceType'] = $xpath->evaluate('string(ec2:instanceType/text())', $is_node); + $item['launchTime'] = $xpath->evaluate('string(ec2:launchTime/text())', $is_node); + $item['availabilityZone'] = $xpath->evaluate('string(ec2:placement/ec2:availabilityZone/text())', $is_node); + $item['kernelId'] = $xpath->evaluate('string(ec2:kernelId/text())', $is_node); + $item['ramediskId'] = $xpath->evaluate('string(ec2:ramediskId/text())', $is_node); + $item['amiLaunchIndex'] = $xpath->evaluate('string(ec2:amiLaunchIndex/text())', $is_node); + $item['monitoringState'] = $xpath->evaluate('string(ec2:monitoring/ec2:state/text())', $is_node); + + $return['instances'][] = $item; + unset($is_node); + } + unset($item); + unset($is); + } + + return $return; + } + + /** + * Returns information about instances that you own that were started from + * a specific imageId + * + * Recently terminated instances might appear in the returned results. + * This interval is usually less than one hour. + * + * @param string $imageId The imageId used to start the Instance. + * @param boolean Ture to ignore Terminated Instances. + * @return array + */ + public function describeByImageId($imageId, $ignoreTerminated = false) + { + $arrInstances = $this->describe(null, $ignoreTerminated); + + $return = array(); + + foreach($arrInstances['instances'] as $instance) { + if($instance['imageId'] !== $imageId) continue; + $return[] = $instance; + } + + return $return; + } + + /** + * Shuts down one or more instances. This operation is idempotent; if you terminate + * an instance more than once, each call will succeed. + * + * Terminated instances will remain visible after termination (approximately one hour). + * + * @param string|array $instanceId One or more instance IDs returned. + * @return array + */ + public function terminate($instanceId) + { + $params = array(); + $params['Action'] = 'TerminateInstances'; + + if(is_array($instanceId) && !empty($instanceId)) { + foreach($instanceId as $k=>$name) { + $params['InstanceId.' . ($k+1)] = $name; + } + } elseif($instanceId) { + $params['InstanceId.1'] = $instanceId; + } + + $response = $this->sendRequest($params); + $xpath = $response->getXPath(); + + $nodes = $xpath->query('//ec2:instancesSet/ec2:item'); + + $return = array(); + foreach($nodes as $node) { + $item = array(); + + $item['instanceId'] = $xpath->evaluate('string(ec2:instanceId/text())', $node); + $item['shutdownState']['code'] = $xpath->evaluate('string(ec2:shutdownState/ec2:code/text())', $node); + $item['shutdownState']['name'] = $xpath->evaluate('string(ec2:shutdownState/ec2:name/text())', $node); + $item['previousState']['code'] = $xpath->evaluate('string(ec2:previousState/ec2:code/text())', $node); + $item['previousState']['name'] = $xpath->evaluate('string(ec2:previousState/ec2:name/text())', $node); + + $return[] = $item; + unset($item); + } + + return $return; + } + + /** + * Requests a reboot of one or more instances. + * + * This operation is asynchronous; it only queues a request to reboot the specified instance(s). The operation + * will succeed if the instances are valid and belong to the user. Requests to reboot terminated instances are ignored. + * + * @param string|array $instanceId One or more instance IDs. + * @return boolean + */ + public function reboot($instanceId) + { + $params = array(); + $params['Action'] = 'RebootInstances'; + + if(is_array($instanceId) && !empty($instanceId)) { + foreach($instanceId as $k=>$name) { + $params['InstanceId.' . ($k+1)] = $name; + } + } elseif($instanceId) { + $params['InstanceId.1'] = $instanceId; + } + + $response = $this->sendRequest($params); + $xpath = $response->getXPath(); + + $return = $xpath->evaluate('string(//ec2:return/text())'); + + return ($return === "true"); + } + + /** + * Retrieves console output for the specified instance. + * + * Instance console output is buffered and posted shortly after instance boot, reboot, and termination. + * Amazon EC2 preserves the most recent 64 KB output which will be available for at least one hour after the most recent post. + * + * @param string $instanceId An instance ID + * @return array + */ + public function consoleOutput($instanceId) + { + $params = array(); + $params['Action'] = 'GetConsoleOutput'; + $params['InstanceId'] = $instanceId; + + $response = $this->sendRequest($params); + $xpath = $response->getXPath(); + + $return = array(); + + $return['instanceId'] = $xpath->evaluate('string(//ec2:instanceId/text())'); + $return['timestamp'] = $xpath->evaluate('string(//ec2:timestamp/text())'); + $return['output'] = base64_decode($xpath->evaluate('string(//ec2:output/text())')); + + return $return; + } + + /** + * Returns true if the specified product code is attached to the specified instance. + * The operation returns false if the product code is not attached to the instance. + * + * The confirmProduct operation can only be executed by the owner of the AMI. + * This feature is useful when an AMI owner is providing support and wants to + * verify whether a user's instance is eligible. + * + * @param string $productCode The product code to confirm. + * @param string $instanceId The instance for which to confirm the product code. + * @return array|boolean An array if the product code is attached to the instance, false if it is not. + */ + public function confirmProduct($productCode, $instanceId) + { + $params = array(); + $params['Action'] = 'ConfirmProductInstance'; + $params['ProductCode'] = $productCode; + $params['InstanceId'] = $instanceId; + + $response = $this->sendRequest($params); + $xpath = $response->getXPath(); + + $result = $xpath->evaluate('string(//ec2:result/text())'); + + if($result === "true") { + $return['result'] = true; + $return['ownerId'] = $xpath->evaluate('string(//ec2:ownerId/text())'); + + return $return; + } + + return false; + } + + /** + * Turn on Amazon CloudWatch Monitoring for an instance or a list of instances + * + * @param array|string $instanceId The instance or list of instances you want to enable monitoring for + * @return array + */ + public function monitor($instanceId) + { + $params = array(); + $params['Action'] = 'MonitorInstances'; + + if(is_array($instanceId) && !empty($instanceId)) { + foreach($instanceId as $k=>$name) { + $params['InstanceId.' . ($k+1)] = $name; + } + } elseif($instanceId) { + $params['InstanceId.1'] = $instanceId; + } + + $response = $this->sendRequest($params); + $xpath = $response->getXPath(); + + + $items = $xpath->query('//ec2:instancesSet/ec2:item'); + + $arrReturn = array(); + foreach($items as $item) { + $i = array(); + $i['instanceid'] = $xpath->evaluate('string(//ec2:instanceId/text())', $item); + $i['monitorstate'] = $xpath->evaluate('string(//ec2:monitoring/ec2:state/text())'); + $arrReturn[] = $i; + unset($i); + } + + return $arrReturn; + } + /** + * Turn off Amazon CloudWatch Monitoring for an instance or a list of instances + * + * @param array|string $instanceId The instance or list of instances you want to disable monitoring for + * @return array + */ + public function unmonitor($instanceId) + { + $params = array(); + $params['Action'] = 'UnmonitorInstances'; + + if(is_array($instanceId) && !empty($instanceId)) { + foreach($instanceId as $k=>$name) { + $params['InstanceId.' . ($k+1)] = $name; + } + } elseif($instanceId) { + $params['InstanceId.1'] = $instanceId; + } + + $response = $this->sendRequest($params); + $xpath = $response->getXPath(); + + + $items = $xpath->query('//ec2:instancesSet/ec2:item'); + + $arrReturn = array(); + foreach($items as $item) { + $i = array(); + $i['instanceid'] = $xpath->evaluate('string(//ec2:instanceId/text())', $item); + $i['monitorstate'] = $xpath->evaluate('string(//ec2:monitoring/ec2:state/text())'); + $arrReturn[] = $i; + unset($i); + } + + return $arrReturn; + } + +} +