1.1.1 - 2013-02-13
 * Deltacloud
  + API CHANGES
    - Added 'root_type' attribute to Image and HardwareProfile
    - Added the 'resource_types' attribute to Realm model
  + Server
    - Advertise :destroy_image only if backend driver support this operation
    - Added tests for deltacloudd launcher
    - JSON output now include :href attributes (DTACLOUD-418)
    - Fixed bug in JSON output in storage_volumes collection (DTACLOUD-454)
    - Added possiblity to specify an 'username' for 'run on instance' action.
    - Added JSON output for run_on_instance action
    - Don't advertise the 'root_type' if provider does not support
      persistent/transient storage.
 * Drivers:
  + Mock
    - Some buckets hrefs in XML are missing "/" and returned garbled (DTACLOUD-425)
  + EC2
    - Added possiblity to import 'key' (require 'aws' >= 2.7.0) (DTACLOUD-438)
  + Aruba
    - Renamed driver to 'ArubaCloud' (DTACLOUD-444)
    - Fixed in the 'savon' client
  + DigitalOcean
    - New driver (https://www.digitalocean.com/)
    - Added hardware_profiles retrieval from provider
  + FGCP
    - Added support for :instance_count feature (CreateMultipleVServer)
    - Remaped instance error states
  + Rackspace
    - Fixed case when created instances are not returned immediately after
      creation
    - Added compatible hardware_profiles to image (DTACLOUD-439)
  + Openstack
    - Make sure we retain keyname when both authentication_password and
      authentication_key are present in driver (DTACLOUD-421)
    - Added :storage_snapshot support (openstack gem >= 1.0.8 required)
    - Fixed bug when we did base64 encode for :user_data in driver
    - Added :launch_time attribute for instances
    - Map Openstack 'regions' to Deltacloud realms (DTACLOUD-443)
    - Fixed several MRI 1.8.7 compatiblity issues (DTACLOUD-461)
  + Eucalyptus
    - Override the realms method (no vpc/subnets) (DTACLOUD-423)
  + GoGrid
    - Added compatible hardware_profiles to image (DTACLOUD-439)
    - GoGrid VCR fixtures update
  + RHEV-M
    - Advertise the :create_image operation only for STOPPED instances (DTACLOUD-452)
    - Fixed case when using wrong instance_id when performing operation errors
      out (DTACLOUD-457)
 * CIMI
  + Server
   - Datamapper ORM replaced by the Sequel (http://sequel.rubyforge.org/)
   - Added unit-tests for database models
   - Fixed case when the collection is used as value for $select (DTACLOUD-432)
   - Filtering of sub-collections now works using $select (DTACLOUD-431)
   - Fixed missing :href attribute for sub-collections (DTACLOUD-433)
   - Added unit-tests for the $select
   - Fixed case when CIMI database entity is created without properties (DTACLOUD-448)
   - Initial support for $filter parameter
   - Added support for 'initial_state' capability (mock driver) (DTACLOUD-447)
   - Renamed 'test:cimi:models' rake task to 'test:cimi'
   - Fixed case when we set CIMI properties on provider side
   - Improvements in how we handle CIMI::Model vs. DB entity
   - Added support for passing an 'realm' when creating Machine
   - Added 'updated' attribute to all CIMI models
  + Client
   - Added support for NetworkPortConfig and NetworkPortTemplate (DTACLOUD-409)
   - Added support for AddressTemplate and Address (DTACLOUD-409)

1.1.0 - 2013-01-15
 * Deltacloud core server
    -Added minor tuning for jruby to spawn rake tasks correctly
    -Added jruby-head target to Travis
    -Core: Require "json/pure" instead of buggy "json" (DTACLOUD-382)
    -Adds routes and helpers for segmented blob upload API
    -Make backtrace in console longer
    -Core: Fix case when backtrace for 502 exception is not set (DTACLOUD-359)
    -Fix bug in images show.xml ... hwp.name vs hwp.id
    -Added .to_hash method to all Deltacloud models .to_hash produce Ruby Hash that can be converted to JSON
    -Serialize :drivers collection in same way as other collections
    -Do not use require_relative when full path is given
    -DTACLOUD-379 - raise and handle 409 instead of 500
    -Adds error state to state machine model (+openstack)
    -Added constraints to JSON output (DTACLOUD-410)
    -DTACLOUD-398 explicitely specify errors not otherwise caught by sinatra
    -Adds name/description attributes for storage_snapshot entity
    -Fixed filtering of hwp profiles using architecture (DTACLOUD-414)
    -Remove the :show operation from :authentication_key definition
    -Fixed format of reported 403 error
    -Remove 'set' in deltacloudd when thin is not installed
    -Print warning when starting as a daemon without thin
    -Change directory to $top_srcdir when using Webrick
    -Overide default Rack::Server server to use :webrick
    -Fixed timestamps and make be_id not required

 * Deltacloud Tests:
    -Fixed require_relative issue in drivers.
    -Enable turn for Ruby 1.8
    -added test for mock buckets
    -added minitest can_create_bucket in mock driver
    -updated fixtures for openstack instances - fixes broken build
    -fixes openstack driver instances test - broken build
    -Added unit tests for JSON serialization
    -Fix loading of require_relative on MRI 1.8 in test_helper
    -fix failing server (white box) tests for storage_snapshot
    -Initial tests for deltacloudd launcher

 * Deltacloud Client and Client Tests:
    -tests: removing testing loops using API_URL_REDIRECT
    -Fixed wrong directory name for tests in gemspec
    -Fixed 'keys' unit tests

 * Drivers
    +EC2
      -EC2: Round down the float value of m2.xlarge hardware_profile (DTACLOUD-373
      -Adds support for S3 multipart object uploads (segmented blob upload API)
    +Openstack
      -support for object-store multipart object uploads (segmented blob upload API)
      -added support for Openstack block storage volumes
      -Openstack volumes - catch case where volume attachment unset - thanks Ian Main.
      -Fix mappings.UNKNOWN mispeeled and add error state to state machine
    +VSphere
      -Fixed typo that cause DC to return 404 for all instances
      -Report MAC addresses together with ipv4 addresses (DTACLOUD-376)
      -Make API_PROVIDER format consistent with other drivers (DTACLOUD-399)
      -Return 400 in case that required parameter is missing
      -Make the 'name' parameter optional
      -Fixed typo in create_instance method (DTACLOUD-401)
    +RHEV-M
      -Keep reporting the MAC addresses when ipv4 address is ready
      -Fixed VCR fixtures to reflect recent changes in reporting MAC address
      -support user-level API
      -Do not advertise :destroy operation when PAUSED (DTACLOUD-355)
    +FGCP
      -return IP address immediately; also add arguments to batch files
      -generate default instance name using timestamp if not user-specified
    +GoGrid
      -Switch to use json/pure in gogrid_client
    +IBM SBC
      -Make sure the hwp_id is not Nil when creating new instance (DTACLOUD-388)
    +Mock
      -Fix reporting wrong hardware profile when creating instances (DTACLOUD-364)
      -Fix for DTACLOUD-393 - setup of mock fixtures
      -adds storage_snapshot create/delete in mock driver

 * CIMI API frontend:
    -Fix hwp.name bug (.name vs .id) in machine_configs
    -fix issue with machine_configs values - DTACLOUD-369
    -fix stop/restart actions on Machine (DTACLOUD-367 and DTACLOUD-368)
    -fix Time parse on Machine model (creation time) - DTACLOUD-370
    -Fixed problem when generating subcollection
    -Renamed 'name' attribute to 'key' in resource properties (DTACLOUD-372
    -Added mandatory 'state' property to MachineImage (DTACLOUD-371)
    -fix returned 'CIMI-Specification-Version' 1.0.1
    -tidy up nits in Volumes/VolumeConfigs - especially creation
    -Fixes nits on MachineImage model - DTACLOUD-378
    -Fix routes for MachineVolumes - uses rabbit subcollection
    -fixes MachineVolume:attach/detach operations on Machine model correct generation of MachineVolume collection
    -exclude created attribute from volume if not returned by driver (fgcp, rhvem)
    -fixes DELETE route for Volume (+adds delete operation for entries
    -fix nits - volumes create return 201, volume attach is POST
    -Initial support for persisting attributes in database
    -Fix the case when stored attributes are XML
    -Added MachineTemplate database model
    -Added MachineTemplate collection and CRUD operations to model
    -Added support for creating Machine using MachineTemplate
    -Added sample JSON and XML files to support/cimi
    -Fixed namespace error in MachineTemplate collection
    -make CIMI::Model::VolumeImage.find behavie like Machine.find
    -Moved "/cimi" to "/cimi/cloudEntryPoint" redirect to CEP collection
    -Adds Volume creation with template and config by value - DTACLOUD-385
    -collections use grab_content_type helper to guess type if not supplied
    -make retrieving individual volumes and volume images work again
    -don't depend on created to have a value as it's optional in cimi
    -server/lib/cimi/models/machine.rb (from_instance): fix name of delete action
    -Fix $select filter to undercore attributes (DTACLOUD-391)
    -Be more carefull when removing persistence data about entity (DTACLOUD-395)
    -tolerate missing subcollections when parsing
    -use a helper to produce correct headers for create responses
    -strictly enforce only xml or json as content-type for message bodies
    -dont expose 'add' URI for collection if not supported DTACLOUD-400
    -DTACLOUD-390 Add name when creating volume.
    -Fix ordering of Collection entries XML elements (DTACLOUD-396)
    -Add CIMI Features (Sinatra rabbit features DSL
    -Initial implementation of resource_metadata (capabilities) for Machine
    -adds create_image (from a running server) + delete
    -Add database support to Address entity
    -Added AddressTemplate database model
    -Added database support for managing AddressTemplate
    -Initial implementation of 'attributes' in ResourceMetadata
    -Added 'constraints' to resourceMetadata attributes for realms
    -Adds create/destroy for volume_image collection+model
    -Fixed wrong destroy action in AddressTemplate
    -Added database support for VolumeConfiguration
    -Added driver and provider to CEP using resourceMetadata
    -Adds database support for VolumeTemplate (create
    -Added database support for MachineImage
    -Added 'created' attribute to MachineTemplate

 * CIMI Tests:
    -Fixed compare_values() method in tests to use 'key' instead of 'name'
    -allow forcing a refetch of an existing model
    -Removed require "json" from tests
    -API Tests - adds discovery for URIs
    -(cep_test): do not accss forwarding_group_templates collection
    -tests add machineTemplates test and selection if no preferred option
    -tests - add create machineTemplate for scenario
    -tests adding test ordering and task:cimiplan
    -do not send any auth header if no user is set
    -allow setting the Content-Type header for requests
    -tests/cimi/test_helper.rb (model_class): assert that resourceURI is set
    -tests/cimi/cep_test.rb: remove duplicate tests and assertions not required by CIMI
    -check creations against what the spec allows
    -add content_type helper to RestClient::Response
    -tests/cimi/test_helper.rb (retrieve): accomodate responses w/o body
    -fiddle with log format; dump RestClient traffic in debug level
    -tests/cimi/part3_test.rb: streamline part3
    -tests add creation of volume with config by value
    -tests - adding provider detection
    -tests skip if capability ! supported - DTACLOUD-400
    -Adds API/black-box test for MachineImage create + delete
    -test plan (resource metadata - The author of the XSLT (Doug Davis <dug@us.ibm.com>) agreed to licensing the stylesheet http://wstf.org/docs/web/sc2html.xsl under the ASL 2.0

 * CIMI client
    -created view files for network ports; added network port in entities
    -Fixed various compatibility issues in CIMI client
    -UI/HTML client fix (MachineImages show) - DTACLOUD-405
    -fixed typo for network config url

 * Deltacloud Site
    -Add note about require_relative gem install for Deltacloud 1.0.5
    -Update Openstack specific information on drivers page
    -update contact page with links to deltacloud community call
    -fix broken link to aeolus wiki for vsphere setup
    -Adds CIMI REST API and cURL Examples (incomplete)
    -Fix Deltacloud δ logo

1.0.5 - 2012-11-15
 * Server
   - Added possibility to log into a file (deltacloudd -L option)
   - Various fixes and improvements in logging errors
   - Advertise operation and parameters for features (/api)
   - Fixed memory leak (DTACLOUD-347)
 * Drivers
   + Aruba
     - Updated API URLs
   + FGCP
     - Added possibility to filter instances by realm_id
     - Fixed certificate location
   + OpenStack
     - Set hardware profile name to OpenStack flavor name
     - Fixed .id vs .name issues in create_instance
     - Added support for user_data
     - DTACLOUD-316, DTACLOUD_328
   + VSphere
     - Report instance launch_time properly
     - Report time of image creation
   + RHEV-M
     - Report time of image creation
 * CIMI frontend
   - Added support for Collections
   - Added support for embedded collections (Machine.disks,
     Machine.volumes)
   - Added initial support for $expand
   - Many improvements to CIMI tests
   - Fixed parsing of JSON HTTP body when creating Machine
   - Set default content type for CIMI responses
   - Added support for $select to Collections
   - Fixed order of top-level resources
   - Fixed numerous CIMI 1.0 compatibility issues
   - Various JIRA fixes: DTACLOUD-350, DTACLOUD-349
 * CIMI client
   - Fixed various compatibility issues
 * EC2 frontend
   - Allow to pass user_data to RunInstances (thanks to Oved Ourfali)

1.0.4 - 2012-10-08
  * server: shorten backtraces in logs to make them readable
  * server: report unknown frontend cleanly when starting server (JIRA 331)
  * server: generate docs at /api/docs resp. /cimi/docs
  * server: clean up how we map the various frontends into the server URL space
  * tests: produce nicer output and improve Jenkins integration
  * Drivers
    + Google
      - capture 401 and 409 errors from backend
    + Openstack
      - report 401 when no username is given (JIRA 330)
      - query supported collections from backend; this implies that
        credentials are needed to access /api (JIRA 316)
  * EC2 frontend:
    - accept InstanceId as parameter for DescribeInstances (Oved Ourfali)
    - Start/StopInstance: ensure instance details are returned from all
      drivers, especially RHEV-M (Oved Ourfali)
  * CIMI frontend:
    - use correct CIMI v1.0 namespace in XML (Carlos Goncalves)
    - rename entities to match CIMI v1.0 (e.g. RoutingGroup -> ForwardingGroup)
    - various fixes/enhancements for networking entities (only for mock
      driver so far)
    - fix ordering of attributes in XML responses
    - frontend still not entirely compliant with CIMI 1.0, especially
      embedded collections are not yet handled correctly
  * client
    - make sure we send provider when changing drivers

1.0.3 - 2012-09-07
  * change the format of ~/.deltacloud/config: keys are now strings, not
    symbols - requires manual fixup
  * server/tests/
    - simplify how individual tests are run
    - read credentials from a config file, rather than hardcoding them
      in the tests (GoGrid and EC2 tests)
    - simplify how VCR data is recorded, speed up playback
    - more coverage (e.g., Rack extensions, OpenStack driver)
  * server: remove extraneous quotes around ETag header value
  * Drivers
    + EC2
      - list subnets in a VPC as realms
      - allow launching of instances into a subnet in a VPC by specifying
        the corresponding subnet realm
    + OpenStack
      - pass server ID as string (JIRA 306)
      - require openstack gem >= 1.0.4
    + RHEV-M
      - allow force stop of instance (JIRA 308)
  * CIMI frontend:
    - update handling of collections
    - add disks and machine_volumes subcollections to Machine
  * EC2 frontend: mount at ec2/ instead of /, i.e. you need to go to
    http://localhost:3001/ec2 to use the frontend
  * tests/cimi/: scaffolding for running the same test using JSON and XML
    output

1.0.2 - 2012-08-20
  * code works with MRI Ruby 1.9.x, MRI 1.8.7, and jRuby
  * deltacloudd: accept -L/--log option to send log to a file; -V option to
    get detailed logs
  * Revamp all the tests in tests/, server/tests/, and client/tests/ to use
    only the minitest test framework; also expanded the coverage of all
    these test suites
  * Make tests/ a test suite that can be run against any server with the
    Deltacloud API (and eventually CIMI API)
  * use require_relative gem for MRI Ruby 1.8
  * require sinatra-rabbit >= 1.0.7 (JIRA 254)
  * require excon >= 1.4.0
  * Prevent hash_capability to fail finding methods (JIRA 265)
  * Removed deltacloudc command line client; see
    http://deltacloud.apache.org/curl-examples.html on how to use curl in
    its stead
  * Fix memory leak (JIRA 290)
  * Fix author and mailing list address in client and server gemspec
  * Drivers
    + Aruba
      - new driver (Giacomo Bagnoli)
    + EC2
      - fix 'bad URI' error when accessing us-east bucket from other region
        (JIRA 300)
      - fix exception when looking up storage snapshot with invalid id
      - fix register/deregister load balancer actions
      - fix exception when attaching storage volume to instance (JIRA 296)
      - fix error when looking up storage snapshots (JIRA 262)
      - fix error describing load balancer (JIRA 259)
      - fix error viewing storage volume details from web UI (JIRA 249)
    + FGCP (all by Dies Koper)
      - properly translate more backend errors
      - added West Japan region
      - improved error handling when connecting to wrong region, or wrong
        API version
      - add metrics support
      - properly report whether image creation from an instance is possible
        (JIRA 250)
      - prevent error when listing firewall with no rules as XML
      - removed system volumes from instance
      - reinstated snapshots for system volumes
    + GoGrid
      - fix exception in listing images (JIRA 255)
    + Mock
      - fix exception when running command on instance (JIRA 298)
      - added metrics support
    + OpenNebula
      - make driver compatible with ON 3.6 (Daniel Molina)
      - fix exception when requesting hardware profiles (JIRA 258)
    + OpenStack
      - support keys collection (JIRA 205)
      - allow specifying keyname when creating instance (JIRA 205)
    + RHEV-M
      - properly report image_id for an instance and image status
  * CIMI frontend
    - fix error from GET /cimi/machines against vSphere (JIRA 279)
    - fix error when looking up VolumeImage
    - expose only collections supported by backend in cloud entry point
    - fix error when backend does not report cpu or storage for MachineConfig
      (JIRA 245)
  * Deltacloud frontend
    - fix streaming of blob content for large blobs
    - fix EPIPE error when graphviz is not installed
    - do not retrieve instance when performing start/stop/destroy (JIRA 214)
    - add 'X-Deltacloud-Driver' and 'X-Deltacloud-Provider' to all responses
    - fixed broken listing of supported collections in /api
    - fix error changing provider from HTML UI (JIRA 248)
  * EC2 frontend
    - (describe_instance_set) suppress state, IP address and DNS
      information if not supplied by the backend
  * Ruby client
    - return nil from destroy_bucket/destroy_blob
  * CIMI client
    - expose only collections supported by backend in cloud entry point
    - report mandatory baseURI

1.0.0 - 2012-06-15
  * New EC2 frontend: clients can now use the EC2 API when talking to
    Deltacloud. That makes Deltacloud an EC2-to-many-backends proxy.
    See http://mifo.sk/deltacloud-with-ec2-frontend
  * metrics: new collection for gathering/controlling metrics (supported by
    EC2 driver)
  * Report destroy/delete actions on images when available (JIRA 207)
  * Compatibly with Ruby 1.9
  * ability to run multiple frontends from the same server (see deltacloudd
    --frontends)
  * Deltacloud is now a modular Sinatra application. See
    http://www.sinatrarb.com/intro#Modular%20vs.%20Classic%20Style
  * Use sinatra-rabbit for RESTful routing/controllers
    (https://github.com/mifo/sinatra-rabbit)
  * Always return status 202 after reboot in all drivers (JIRA 162)
  * Numerous enhancements and bug fixes in HTML UI (JIRA 232, 211, 210,
    204, 67, and many more)
  * Order hardware profiles by cpu, memory (JIRA 208)
  * Return status 501 when backend lacks needed capability
  * Report list of hardware profile with images to indicate compatibility
    of an image with a set of HWP
  * Windows: fix error caused by syslog not available on Windows (JIRA 186)
  * Use minitest for all our tests
  * Drivers
    + EC2
      - fix retrieval of IP address for run_on_instance (JIRA 211) (Dies Koper)
      - return sttus 404 when deleting nonexistant load balancer (JIRA 169)
      - CloudWatch support via new Metrics collection
      - return status 404 when getting nonexistent blob (JIRA 174)
      - fix memory amount reported for t1.micro
      - add new m1.medium HWP
      - return status 404 when getting nonexistent instance
    + Fujitsu Global Cloud Platform (FGCP)
      - new driver contributed by Dies Koper
    + GoGrid
      - fix retrieval of IP address for run_on_instance (JIRA 211) (Dies Koper)
    + Mock
      - support run_on_instance (JIRA 212) (Dies Koper)
      - create storage directories with mode 0750 (JIRA 139)
      - allow destroying storage snapshot
      - return status 404 when deleting nonexistent bucket
    + OpenNebula
      - support AI v.3.x (Daniel Molina)
      - support using API_PROVIDER env var to select OpenNebula installation
    + OpenStack
      - updated for API v2.0
      - support buckets/blob collection
      - use the new openstack gem (https://github.com/ruby-openstack)
      - more accurate reporting of instance state (JIRA 209)
    + Rackspace
      - fix retrieval of IP address for run_on_instance (JIRA 211) (Dies Koper)
    + RHEV-M
      - better error message when trying to use user_data with a backend
        that is missing the floppyinject hook (JIRA 233)
      - better error message when instance stop/reboot fails (JIRA 185)
      - return status 400 when no provider is specified
      - return status 502 if backend runs out of memory (JIRA 154)
      - return status code 400 when instance name is too long
      - return status 404 for unknown data center
      - return status 502 for inaccessible provider
      - use rbovirt gem (https://github.com/abenari/rbovirt)
    + vSphere
      - return status 502 when user_data is used and backend datastore is
        misconfigured (JIRA 203)
      - respond with status 504 on connection timeout (JIRA 225)
      - return status 502 when vSphere behaves erratically because being
        overloaded (JIRA 225, BZ 805171)
      - return status 502 when backend reports ToolsUnavailable, caused by
        lack of VMWare tools in instance
      - return created image after create_image operation (JIRA 122)
      - return status 502 for inaccessible provider
      - do not indicate that storage volumes and snapshots are supported,
        they are not (JIRA 135)
  * CIMI
    + support networking collections (VSP, VSPTemplate, VSPConfig, Address,
      AddressTemplate, Network, NetworkTemplate, RoutingGroup,
      RoutingGroupTemplate)
    + Improved support for many compute collections (Machine etc.)
    + added X-CIMI-Specification-Version HTTP header for all responses
    + support X-Deltacloud-Provider and X-Deltacloud-Driver request headers
    + client app:
      - allow switching between EC2, RHEV-M, and OpenStack as backend
      - views for networking entities
  * Ruby client
    - Add --user and --password params to deltacloudc (JIRA 141)
    - Fix error when instances have numeric names (JIRA 27)
    - Fix listing keys collection (partial fix for JIRA 199)
    - Handle 301 properly for API entrypoint

0.5.0 - 2012-01-05
  * add display of storage volumes to instance view
  * add way to change provider in HTML UI when applicable (JIRA 105)
  * fix attach volume form in HTML UI
  * fix incorrect handling of REQUEST_PATH (affects platforms like passenger)
  * support dynamically generated provider lists for /api/drivers/:id
  * create image: report correct URL in Location header
  * fix parameter validation error when switching drivers (BZ 750920)
  * create instance: validate hardware properties
  * incredibly experimental support for DMTF CIMI
    (http://dmtf.org/standards/cloud) If you run the server with --cimi and
    it breaks, you get to keep both pieces
  * various client fixes
  * deltacloudd: add --webrick to force use of WEBRick
  * Drivers
    + EC2
      - fetch available regions via DescribeRegions
      - add ap-northeast-1, sa-east-1 and us-west-2 regions
      - fix bucket creation when client specifies 'us-east-1' region
        (BZ 725646)
      - t1.micro HWP is available for 32 and 64 bit (JIRA 95)
      - improvements for launching multiple instances (JIRA 79)
    + Google storage
      - fix blob metadata listing
      - properly validate credentials
    + Mock
      - support storgae_volume create/delete
      - fix m1-large HWP to use integral memory size
    + OpenStack
      - new driver
    + Rackspace
      - correctly report bucket size
    + RHEV-M
      - data centers are now treated as completely separate regions. For a
        given provider URL, only the clusters for one datacenter are
        considered
      - fix deleting VMs (JIRA 110)
      - preserve details about backend errors
      - create instance: choose image realm when none is specified (JIRA 126)
      - better error msg when floppyinject is not installed (BZ 765855)
    + SBC
       - correctly return the realm for /api/realms/:id (JIRA 106)
    + vSphere
       - fix internal error in reporting of instance addresses
       - find objects (VMs etc.) even for datastores that are in nested
         folders (Alfredo Moralejo)
       - HWP: replace effectiveMemory with hardcoded values (JIRA 123)
       - Reboot of a VM now does a RebootGuest rather than ResetVM_Task

0.4.1 - 2011-10-04
  * change how dependencies are managed: canonical deps are now in the
    gemspecs
Server:
  * clarify how user_data injection should work; make sure all drivers
    accept base64 encoded data and make the decoded version available to
    instance
  * fix URL generation so that server works when run behind a reverse proxy
  * init script: honor defaults from sysconfig file
  * init script: fix 'status', properly background deltacloudd
  * deltacloudd: support verbose option
  * Drivers:
    + Condor
      - use UUIDTools instead of UUID to simplify deps
    + Google
      - new driver for Google storage API
    + RHEV-M
      - treat status as case-insensitive
      - inject data through a virtual floppy rather than modifying
        the instance storage directly
    + vSphere
      - report minimum of max memory across all hosts in a data center, so
        that instances can be placed on any host
      - user_data is placed in file 'deltacloud-user-data.txt'

Client:
  * fix parsing of enums in HWP properties
  * fix handling of float value for number of vCPU in HWP

0.4.0 - 2011-08-12
Server:
  * deltacloudd: new option --drivers to list all drivers
  * deltacloudd: new options --ssl, --ssl-key and --ssl-cert to
    enable HTTPS support
  * deltacloudd: new option -d to daemonize server, --user and --pid to
    control the user server runs as and where pid file goes
  * API entrypoint reports features in JSON
  * unify response behavior: any operation returning a 201 Created also
    sets the Location header to point to the new resource; ensure the
    status for an operation is the same regardless of output format
  * Add type to public addresses; type can be one of 'ipv4', 'mac', 'vnc',
    and 'hostname'
  * Complete overhaul of the HTML UI, now uses jquery-mobile
  * Response status for attach/detach storage is now 202 (instead of 302)
  * Response status for get/set blob metadata is 204 No Content
  * Response status for (un)register with load balancer is 204 No Content
  * The user_name feature now reports the permissible length of the name
    as the 'max_length' constraint
  * Add Date header to responses as per RFC 2616
  * New collection 'firewalls' for managing sets of firewalling rules
  * split server/config/drivers.yaml into individual files so each driver
    can be packaged separately; gives deployers better choice of what
    drivers they want enabled
  * new rake task 'routes' that prints all server routes
  * Numerous bug fixes and improvements to the test suite
  * Drivers
    + Condor
      - new driver to run a simple cloud based on the Condor grid scheduler
    + EC2
      - Fix bug in reboot instance so that the details returned are those
        of the stopped instance, not some random instance
      - Support getting and updating blob metadata
      - support destroying images
      - support firewalls (security groups)
      - do not support user_name anymore; instance tagging is too fragile
        in EC2 to be used reliably for this
      - do not support registering an instance with a load balancer upon
        creation anymore
      - stream blob PUT to backend (requires thin)
      - support attaching EBS snapshot to instance upon creation (feature
        'attach_snapshot')
      - support elastic IP's
    + Eucalyptus
      - support firewalls (security groups)
      - support elastic IP's
    + Gogrid
      - when retrieving single realm, make sure we return the right one
      - correctly capture load_balancer params
      - report a listener if load_balancer has no instances
    + Mock
      - support destroying images
      - split into driver and client to make the code clearer; this should
        help driver writers in understanding what a driver must do
    + Rackspace
      - support destroying images
      - stream blob PUT to backend (requires thin)
    + RHEV-M
      - support creating and destroying images
      - report VNC address of instances
      - can use Audrey's confserver to fetch IP of an instance
    + vSphere
      - turns a VMWare vSphere installation into a cloud
      - driver stateless, state is stored in vSphere's data store in
        'deltacloud' folder
      - images are template VM's
      - single HWP, whose max_cpu and max_memory are based on available
        cpus and memory across all vSphere hosts
      - support data injection via user_data and user_iso (upload entire
        ISO image) For both, instance gets virtual CD-ROM with injected
        data

Client:
  * make authentication info for instances available
  * retrieve type and address for public addresses of an instance
  * deltacloudc: allow specifying bucket location when creating a bucket

Site:
  * Major rewrite of REST API docs, covers the entire API now
  * Add libdeltacloud API docs
  * Add Incubator logo and disclaimer to all pages

0.3.0 - 2011-04-01
Server:
  * Dynamic driver switching: select driver on a per-request basis; new
    toplevel 'drivers' collection describing drivers supported by server
  * Create images from running instances (EC2, Mock, GoGrid, Rackspace);
    advertised as action 'create_image' in instance details when possible
  * New 'user_files' feature for create_instance to advertise RAX-style
    injection of user data
  * Return status 204 after successful DELETE operation
  * Return status 401 when authentication fails because of invalid
    credentials
  * Blobs: support user metadata as key/value pairs passed through
    X-Deltacloud-Blobmeta-KEY: VALUE headers
  * Support HEAD requests to retrieve the operations and methods supported
    by a collection
  * Support for OPTIONS request to retrieve optional and required
    parameters for operations
  * Advertise 'create_instance' action for each image
  * Drivers
    + EC2
      - instance_count feature to allow creating multiple instances at once
      - run commands inside an insance via ssh
      - by default, list images owned by 'amazon', when passing in empty
        owner_id, list _all_ images (thousands)
    + Eucalyptus
      - new driver for Eucalyptus (Sang-Min Park)
    + Gogrid
      - run commands inside an insance via ssh
      - allow creating sandbox instances
    + Rackspace
      - report root password after instance creation
    + SBC
      - new driver for IBM SBC cloud (Eric Woods)

Client:
  * run: new method to run commands via ssh
  * drivers: list drivers supported by server
  * properly list blobs in a bucket when showing bucket details
  * full support for managing blobs and buckets

0.2.0 - 2011-01-25

Server:
  * Dynamically select driver through the X-Deltacloud-Driver HTTP header;
    allow passing in driver-specific endpoint with the
    X-Deltacloud-Provider header
  * New 'load_balancers' collection, supported for EC2 and GoGrid
  * Support 'keys' collection in Mock driver
  * Allow creation/deletion of blobs (S3, CloudFiles, Azure)
  * Return HTTP status 405 when trying to perform an action on a instance
    that is not available
  * Drivers
    + EC2
      - security_group and public_ip features for instance creation
      - switched to aws gem
    + GoGrid: now have two hardware profiles
    + RHEV-M: completely rewritten; now uses RHEV-M REST API, not Powershell

Client:
