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:
