1.1.3 - 2013-04-17
  * Deltacloud
    + We no longer support MRI 1.8
    + Added Deltacloud namespace for all models and classes to avoid conflicts (DTACLOUD-517)
    + Added possibility to pass :mock_initialize when using Deltacloud as Rack
      middleware. (DTACLOUD-507)
    + Fixed various dependency issues with excon, tilt and haml
    + Added support for URL helper for Rabbit subcollections (DTACLOUD-526)
    + Switch to use local variables instead of instance variables in HAML views (thanks to Francesco Vollero)
    + Refactored driver source loading code (DTACLOUD-540)
  * Client
    + Complete rewrite from scratch using Faraday lib
  * CIMI
    + Fixed incorrect look up for DiskCollection (DTACLOUD-536)
    + Added missing VolumeConfigurationCreate (DTACLOUD-524)
    + Added initial support for System models (mock, fgcp) (thanks to Dies Koper)
    + Refactored how we generate Rabbit collections (generate_operation_collection)
    + Obsoleted CIMI HAML views were removed
    + Fixed deltacloud-db-upgrade to work on Windows
  * EC2
    + Fixed logging for EC2 frontend
  * Drivers
    + RHEV-M
      - Allow client to select the first boot device
    + Mock
      - Convert all stub URL's correctly
  * Tests
    + Added loadbalancer tests for EC2
    + Added support for Extended Machine scenarios - user_data (thanks to Ronelle Landy)

1.1.2 - 2013-03-13
  * Deltacloud
    + Introducing the 'deltacloud-db-upgrade' command for CIMI database
    + Introducing the 'initializers'
    + Fixed various JRuby issues, Deltacloud now runs on Puma web server
    + Added possibility to defined multiple features in drivers per one-line
    + Fixed Deltacloud logging when running as a daemon
    + Improvements in how we load sinatra-rabbit collections
    + Fixed JSON/XML serialization of 'realms'
    + Fixed improper exception handling (DTACLOUD-489)
    + Fixed namespacing issues in sinatra-rabbit
    + Improved the 'filter_on' helper we use in drivers
    + Improved compatibility with upcoming Ruby 2.0
    + Deltacloud models now live in Deltacloud:: namespace (DTACLOUD-507)
  * CIMI
    + Introducing the CIMI 'create' entities (MachineCreate, MachineTemplateCreate, etc.)
    + CIMI models are now properly validated when they are created
    + General improvements in database support
    + Introducing initial System entity support
    + The 'rake cimi:routes' now display all CIMI entities and their routes
    + Added support for 'referenced' entities in CIMI models
    + (VolumeConfig): add missing type attribute
    + (MachineCreate): pass initialState to driver
    + Added possibility to use 'references' in 'array'
  * Drivers:
    + Mock
      - General cleanup in Mock driver code, removed unused requires/etc
      - Restored previously removed Network operations
      - Initial import of CIMI System entities (dkoper)
      - Create/delete blobs - update bucket size (DTACLOUD-498)
    + FGCP
      - Added code to exclude resources that were deleted during retrieval
      - Added support for storage_volume creation from snapshot (DTACLOUD-492)
      - Added mapping for GET system and system_templates (CIMI)
      - Added many unit tests
    + OpenStack
      - Remaped 'regions' to 'providers' (DTACLOUD-488)
      - Remove realm<->region mapping for created Instances (DTACLOUD-477)
    + DigitalOcean
      - Added :authentication_key feature to instances
      - Added 'valid_credentials?' method for digital_ocean driver
      - Fix filtering of realms (DTACLOUD-503)
      - Define default :realm_id and :hwp_id for create_instance
      - Advertise :destroy operation when instance is STOPPED
    + RHEV-M
      - Avoid failure of GET instance details (DTACLOUD-462)
    + VSphere
      - Added support for StoragePod
    + Opennebula
      - Fix when computehash['INSTANCE_TYPE'] is nil

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:
