<?php
/**
 * @category   Zend
 * @package    Zend_Cloud
 * @subpackage Infrastructure
 * @copyright  Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */

/**
 * Adapter interface for infrastructure service
 * 
 * @package    Zend_Cloud
 * @subpackage Infrastructure
 * @copyright  Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
interface Zend_Cloud_Infrastructure_Adapter 
{ 
    const HTTP_ADAPTER = 'http_adapter'; 

    /**
     * The max. amount of time, in seconds, to wait for a status change
     */
    const TIMEOUT_STATUS_CHANGE = 30;

    /**
     * The time step, in seconds, for the status change
     */
    const TIME_STEP_STATUS_CHANGE = 5;

    /**
     * Return a list of the available instances
     *
     * @return InstanceList
     */ 
    public function listInstances(); 
 
    /**
     * Return the status of an instance
     *
     * @param  string $id
     * @return string
     */ 
    public function statusInstance($id); 

    /**
     * Wait for status $status with a timeout of $timeout seconds
     * 
     * @param  string $id
     * @param  string $status
     * @param  integer $timeout 
     * @return boolean
     */
    public function waitStatusInstance($id, $status, $timeout = self::TIMEOUT_STATUS_CHANGE);
    
    /**
     * Return the public DNS name of the instance
     * 
     * @param  string $id
     * @return string|boolean 
     */
    public function publicDnsInstance($id);
    
    /**
     * Reboot an instance
     *
     * @param string $id
     * @return boolean
     */ 
    public function rebootInstance($id); 
 
    /**
     * Create a new instance
     *
     * @param  string $name
     * @param  array $options
     * @return boolean
     */ 
    public function createInstance($name, $options); 
 
    /**
     * Stop the execution of an instance
     *
     * @param  string $id
     * @return boolean
     */ 
    public function stopInstance($id); 
 
    /**
     * Start the execution of an instance
     *
     * @param  string $id
     * @return boolean
     */ 
    public function startInstance($id); 
 
    /**
     * Destroy an instance
     *
     * @param  string $id
     * @return boolean
     */ 
    public function destroyInstance($id); 
 
    /**
     * Return all the available instances images
     *
     * @return ImageList
     */ 
    public function imagesInstance(); 
    
    /**
     * Return all the available zones
     * 
     * @return array
     */
    public function zonesInstance();
    
    /**
     * Return the system informations about the $metric of an instance
     *
     * @param  string $id
     * @param  string $metric
     * @param  array $options
     * @return array
     */ 
    public function monitorInstance($id, $metric, $options = null); 
 
    /**
     * Run arbitrary shell script on an instance
     *
     * @param  string $id
     * @param  array $param
     * @param  string|array $cmd
     * @return string|array
     */ 
    public function deployInstance($id, $param, $cmd);
            
    /**
     * Get the adapter instance
     * 
     * @return object
     */
    public function getAdapter();
    
    /**
     * Get the adapter result
     * 
     * @return array
     */
    public function getAdapterResult();
    
    /**
     * Get the last HTTP response
     * 
     * @return Zend_Http_Response
     */
    public function getLastHttpResponse();
    
    /**
     * Get the last HTTP request
     * 
     * @return string
     */
    public function getLastHttpRequest();
}