v1.8.0 - 2013-11-29

    New and improved Iterators. Users always had problems traversing paginated collections, sometimes having to construct nested loops. Now, everything is offered in an easy-to-use manner that harnesses the power of PHP's native interfaces. For more information, please consult the documentation for this new feature.

    Tenant names and tenant IDs added to OpenStack authentication. Users can now authenticate more specifically. Also fixes an issue one customer had regarding empty Service Catalogs.

    Greater use of Symfony's EventDispatcher. The decision was made to rely more on event dispatching, rather than inheritance, to provide additional features. One of the immediate benefits of this is that there is less repetition in the Request and Response classes.

    Uploading single objects to CloudFiles uses less bandwidth. Previously, when a single object was uploaded, another request was executed afterwards to populate the new object. This was relatively expensive operation - especially for large files. Now we populate the new object using information provided in the response for the PUT operation.

    Fix to BulkExtract content-type uploads. Now the API is allowed to type guess the archived files in a tarball. Previously, they were manually set to application/json.

    Better documentation for authentication, cloud monitoring, queues and iterators.

    More consistent use of mock objects in unit tests. We are now using the MockPlugin for Guzzle to create FIFO request queues.


v1.7.3 - 2013-11-15

    CDN Container logging can now be enabled and disabled (#223 and #225)
    Content-Type is now set to application/json by default for all entity-enclosing request (#221 and #222)
    File handles for multiple file uploads are now closed after the request is executed. On some OSs files are locked during stream handling (#219)
    Changes to "Getting Started" guide
    Fixing typos for ObjectStorage guide


v1.7.2 - 2013-11-08

    Better documentation for Swift
    Fix to content-type handling with DataObjects (#198)
    When using Swift with ServiceNet, you can now access its CDN container information over public URL (#56)
    Added more methods to DataObject to allow access to more state (#211, #216). See docs for a list of supported methods.
    Updated quick reference (#152)
    Better API docs


v1.7.1 - 2013-11-06

    Globals removed in favor of class constants, where possible
    Service signatures are more consistent
    Fixes to Cloud Queues: better handling of Client UUIDs, event dispatching added for the Service, and other small fixes
    Fixes to Monitoring: resource models have clearer methods and better relations to their Service and Parent objects
    More documentation for key services like ObjectStorage and Cloud Queues. The README and "Getting Started" guide have also been rewritten for clarity and succinctness
    Acceptance tests added for Cloud Queues and Monitoring
    Fix for DataObject temporary URLs
    CONTRIBUTING has clearer instructions for running test suites


v1.7.0 - 2013-10-31

Integration with Guzzle HTTP component

    Uploading files is now much quicker
        Parallel requests using multi-cURL, which means files can be uploaded concurrently
        Files over 5GB are fragmented and uploaded using multibyte chunking
    URLs are now treated as fully fledged objects (Guzzle\Http\Url), allowing for greater functionality
    Requests that send content now have the benefit of using the Guzzle\Http\EntityBody object, which extends and builds on the native functionality offered by PHP streams. Now there is a cool abstraction layer that offers a lot of consistency
    Progress functionality (either by dedicated methods or by anonymous functions)
    Event dispatching so all of your objects now have access to, and can also modify, the HTTP workflow. See Symfony's Event Dispatcher Component for more info.

For a complete list of features, view the official page.
Keypair support

Although code now exists in the SDK for API compatability for creating servers with keypairs, there has been a recent bug in Nova where certain endpoints (DFW, IAD and ORD) do not exhibit the desired functionality. A patch will be released in the near future. For reference, you just need to add in an extra array key:

try {
    $server->create(array(
        'name'     => 'test',
        'image'    => $image,
        'flavor'   => $flavor,
        'networks' => array(
            $service->network(RAX_PUBLIC),
            $service->network(RAX_PRIVATE)
        ),
        'OS-DCF:diskConfig' => 'AUTO',
        'keypair' => array(
            'name'      => 'id_rsa.pub',
            'publicKey' => file_get_contents('/path/to/local/key')
        )
    ));
} catch (\Guzzle\Http\Exception\ClientErrorResponseException $e) {
    var_dump($e->getResponse());
}

Better handling of services

    Endpoints, the Service Catalog, and Catalog Items are now treated as objects
    Factory methods in the core OpenStack client have been renamed for greater clarity
    Services are now constructed with a ServiceBuilder for efficiency
    Namespace changes to all resource models for greater consistency

Major upgrade of CloudFiles

    Near 100% API consistency for Cloud Files
    Complete documentation, both technical and non-technical, for all functionality
    Better handling of resource objects: Account, Container, CDNContainer, DataObject
    The ability to upload files in 3 different ways (each one has a different use case):
        Sequential uploads for simple files
        Parallel batched uploads for multiple files
        An OpenCloud\ObjectStore\Upload\TransferBuilder factory for handling large uploads (+5GB) that require chunking
    Conditional requests for getting objects (If-Match, If-None-Match, If-Modified-Since and If-Unmodified-Since). Range is also now supported for partial content returns.
    Bulk extract and bulk delete now better supported

Unit test structure overhaul

    Completely refactored unit tests
        All unit tests now inherit from one centralized test case
        Use of singletons for client object re-use
        New implementation of mock responses
        Request capturing using Event dispatchers

Other changes

    Refactoring of Autoscale/Monitoring to keep things DRY
    New docblock for every file with up-to-date license
    Fix to logging output functionality
    Fixes to server metadata
    Minor changes to Metadata
    Core change to method/property overloading. For every private model property, the end-user now has access to a dynamic getter/setter methods that ensure better encapsulation. For finer-grained control, they can specify concrete methods which supercede the magic methods. I want to get into the habit of encouraging filtered access through methods rather than raw property access.


v1.6.0 - 2013-09-06

    AutoScale. This feature allows people to scale their servers up or down based on "scaling policies". A policy determines the behaviour of a particular scaling action. Webhooks activate policies - and can be tied to Cloud Monitoring (i.e. if CPU falls beneath a certain number), or executed anonymously using a unique link. Each group also has its own configuration sets: one that dictates the general state of the group (its name, etc.) and another that dictates the behaviour of a new server which is spawned (flavor ID, networks, personality file, load balancers, etc.)

    Unit test coverage reaches 100%. We've significantly added to our unit tests and brought the overall coverage to one hundred percent: this includes lines, classes and files. Existing tests are reformatted for PSR, and the stub connection classes have been upgraded.

    Image scheduling for servers. You can now schedule image for your servers programmatically.

    iOS Streaming is now available for containers through a unique URL.

    New logging functionality. We have released a new logging feature compliant with PSR. It provides different levels of reporting, and can be customized to output to a specific file or stream context. With this refactoring, we plan to add in support for Airbrake in the near future.

    Bug fixes to CDN container metadata, exporting credentials, and many others.

    TODO list added to make it clearer for people to help contribute.


v1.5.10 - 2013-08-01

    patch to support the diskConfig (Auto, Manual) or other attributes on Server::Create()
    created CONTRIBUTING.md file to support Github feature
    fixed release notes
    save file to stream
    minor fixes


v1.5.8 - 2013-06-27

    #106 - problem with urlencoded paths for TEMP_URL feature
    #111 - slowness in listing swift containers
    OMG ADDED HEAT (Orchestration) SUPPORT! (Thanks, Stephen!)
    OMG ADDED Cloud Monitoring support! (Thanks, Jamie!)
    numerous other bug fixes, updated docs


v1.5.7 - 2013-05-27

    #102 - Etag support on create
    #104 - function signature mismatch
    #105 - CDN object not associated with container


v1.5.6 - 2013-05-10

    Support for DNS\Domain::CloneDomain() feature


v1.5.5 - 2013-05-07

    PSR-2 implementation (code formatting)
    issue #95 - attempt to fix default timezone to satisfy folks


v1.5.4 - 2013-04-30

    Issue #38 - added support for Cloud Files TEMP_URL feature
    Revised structure around namespaces
    new entrypoint: php-opencloud.php (rackspace.php and openstack.php are still available for backwards compatibility)
    Fixed issue #94
    Added scripts/ver++.sh to increment version patch number


v1.4.1 - 2013-02-21

    Added __DIR__ to all internal require() calls. [Issue #40]
    Added support for Rackspace Cloud DNS (see the quick reference in docs/ for the details)
    Other bug fixes that I can't remember, but which are really good. Really.


v1.4 - do not use

Release had a bug that was immediately fixed in 1.4.1


v1.3 - 2013-02-10

    IMPORTANT: The file extension for include files is now .php (instead of .inc). This came at the request of numerous individuals. However, it means that all of your scripts that use php-opencloud must be edited.
    DataObject::Create() now uses content_type; using the older type parameter is deprecated and will cause an UnknownParameterError exception.
    New global constant RAXSDK_CACERTPEM; if defined, this should be a path to a cacert.pem file that defines the root certificate servers. Defining this provides an extra degree of security in the HTTP transfer operations.
    Fixed a bug (issue #25) wherein the entire DataObject was retrieved in the constructor. This was incorrect; the constructor now does a HEAD request, and you need to use the SaveToFilename() or SaveToString() methods to actually fetch the data from Swift/Cloud Files. If your code relies upon the previous behavior, this might cause it to break.
    Support for Rackspace Cloud Load Balancers
    Fix to remove requirement for Tenant ID in authentication
    Added ExportCredentials() and ImportCredentials() methods to the OpenStack class to permit caching of tokens.
