v1.10.0 - 2014-06-16

    Rackspace Cloud Images / OpenStack Glance now supported
    Sample scripts added for Compute and Object Storage services
    Fixes to various pieces of documentation
    Fix to how PTR records are deleted in DNS service
    Adding Load Balancer access lists is now easier
    Adding multiple scaling policies is now easier
    Convenience methods added to Queues, allowing for easy deletion of members for a queue
    More specific and clear dependency versioning in composer file
    Fix to DNS import method which now adds the appropriate HTTP headers
    Enabling Compute v1.1 to work, which beforehand wasn't supported due to an overly strict wildcard
    Fixes to how the catalog handles region-specific UK DNS
    Servers can now be provisioned using flavor/image IDs instead of fully instantiated objects

v1.9.2 - 2014-02-06

    New container migration strategy. With the deprecation of default regions, a use case arose where people might want to migrate the contents of a Swift container to another geographic region. The copy method only supports cross-container migrations in one region. For more information about how to implement this, please consult the documentation.

    Cloud init now supported for VM creation (see #288)

    CDN enabled check fixed for containers (fixes #292)

    Paths are now added as strings. This arose because integers paths were being ignored, which was fixed with a PR to Guzzle (see here).

    More sympathetic errors when object not found (see 70e807)

    Setting tenant now accounts for numerical strings, rather than just integers (fixes #290)

    New doc for caching credentials

    More documentation for load balancers

    Updated docs for setting metadata when uploading object

v1.9.1 - 2014-01-13

    Fix to server keypairs in how the JSON schema was generated for server creation (fixes #272)

    Removal of abstract method in AbstractService, since the method was already defined in ServiceInterface - this caused problems with versions of 5.3

    Bug fix with Data Objects, allowing 0 content size to be returned (fixes #273)

    Bug fix with Paginated Collections. Previously, the "should append" rule was incorrect - meaning that subsequent requests were not being executed (fixes #274)

    Bug fix with LoadBalancer access resources which prohibited them from being created

    More graceful error handling with Container deletion. If a 409 Conflict response is returned, a more meaningful error will be sent to the end-user (fixes #252)

    Adding OpenCloud\Version class for greater clarity

    Updated Guzzle dependency version to v2.8

    Copyright notices updated to 2014

    New "Getting Started" guide for OpenStack

    Updated documentation for spawning Cloud Servers with keypair authentication

    Adding --prefer-source flag to Travis builds to get around Github API rate-limits

v1.9.0 - 2014-01-07

    Removal of default regions. We want to ensure that the user retains control over where their data is stored, rather than making that decision on their behalf.

    Identity/Keystone support. We now have full support for Rackspace Cloud Identity, and also support for OpenStack Keystone. The resources that you can interact with are Users, Roles, Tokens and Tenants

    Coveralls integration. We have externalized our test coverage with Coveralls and are currently in the process of bumping it to 100%. This allows for greater transparency and holds the project to a far higher standard.

    New iterator for DNS collections that fixes #258

    Changes to Swift object metadata, making it easier and more efficient to update

    Removal of callable type hint in OpenCloud\Common\Collection\ResourceIterator that was causing errors (fixes #249)

    Fix to OpenStack\Rackspace so it references the correct CredentialError class (fixes #253)

    Updating various Orchestration models to reference the correct PersistentObject class path

    Addition of Keystone docs

    Addition and improvement of Nova docs

    Fix to Swift object doc so that the mode is included in fopen() (fixes #262)

    Fix to sprintf in code sample in Getting Started guide (fixes #254, #259)

v1.8.2 - 2013-12-13

    Load Balancer nodes can now be updated (to change condition, weight or type).
    Better garbage collection for Directory syncing -- streams are now explicitly closed after use (#246).
    Static website methods are now available for Containers; if used on CDNContainers, a deprecation warning is thrown.
    Claim IDs can now be extracted from Messages that have been claimed (#247).
    New getter method for Messages (#247).

v1.8.1 2013-12-12

    Directory syncing with Cloud Files. Now you can synchronize local directories with remote containers, allowing for easy deployment for static sites, etc. Documentation here.
    New method allowing for partial downloads of Swift objects (i.e. just metadata). Addresses #243.
    Fix to an issue with iterators where the first element was not populating its resource object correctly (#237)
    Documentation fixes (#240)
    Fix to OpenStack client which allows for the default X-Auth-Token header to be set when importing credentials (#236)
    Fix to recurring issue with Content-Type header (#198)
    Fix ObjectStore being incompatible with CDN-less/OpenStack setups (#238)

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.
