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:
