Add basic support for Independent Disks

Independent Disks are their own vCloud Entity, unrelated to the 'local' disks
that can currently be added to VMs via the Vm.extra_disks method. They are conceptually
similar to AWS EBS volumes.

Instead, independent disks are created as their own entity, and *attached*
to a VM. This can be done when the VM is stopped or running.

When the VM is destroyed, any attached Independent Disks will be detached,
but not destroyed. They can subsequently be re-attached to another (usually recreated) Vm.

This commit adds basic support for referring to existing Independent Disks. Future commits
will add the necessary create and attach operations.
Add IndependentDisk#create functionality

Wrapping around (the incorrecly named) post_upload_disk Fog request method, this
enables creation of Independent Disks in vDC.

Currently size can only be specified in bytes as per the API, and options have not
been implemented so no Storage Profile support as yet.
Integration test for Vcloud::Core::IndependentDisk

Check end-to-end create and examine of independent disks.

Adds an independent disk fixture helper, since we will also need
to create fixture independent disks in the in the Vm class integration
tests (when attaching of disks is added in a subseuqent commit)
Allow specification of size param in GB/MB/MiB/GiB

It is very impractical to expect folk to specify a disk size
in bytes, when it is far more commonplace to specify them in GB/MB/etc.

Disks are usually treated as 1MB = 10^6 bytes rather than 2^20, so use
this convention but also allow for 'MiB' and 'GiB' to correctly specify
2^20 and 2^30 respectively.

Continue to support bytes being supplied as a string or an Integer.

Raise an ArgumentError if we cannot parse the input string.
Allow attaching independent disks to a VM
Add IndependentDisk#attached_vms; disk integ tests

IndependentDisk#attached_vms allows us to know where a disk has been attached
to, so we can check that it has been attached correctly.

This method allows us to reliably test the attachment of disks to VMs, so an
integration test has been added.

NB: It is possible to detect Independent Disks attached to a Vm via the
Vm#vcloud_attributes call, by looking for a RASD OVF disk with a :vcloud_disk key,
but this is quite an error-prone and ugly process.
Add Vapp.get_by_child_vm_id constructor

At present, to create a Vm object you must also supply the parent
vApp object. This is technically unneccessary, since the vm retrieved
from the API knows this calready.

In the interests of not changing the interface of the Vm.new method
though, we must provide a way of discovering the parent vApp in order
to create a Vm object from a vm_id reference.

This work was prompted by the need to create a bunch of Vm object
from the output of the 'get_vms_disk_attached_to' Fog method, which
returns a list of Vm ids that a given independent_disk_id is attached
to. I could not return a list of Vm objects without a way to find the
parent Vapp of each.
Improve attach disk test; note ordering issue

Improved the VM attach independent disk tests, to check that
the disk was actually flagged as attached to the VM via the
IndependentDisk#attached_vms call.

In the process of this, discovered that the Vm#add_extra_disks method
fails if there are independent disks already attached to the VM. I
strongly suspect that this is due to the way the Fog Model handles
adding local disks rather than it being a limitation of the vCD API itself,
but fixing that is out of scope for this update.

Added a test to document this behaviour and the exception raised by Fog.
Rework size-suffix handling code - tests and name

It is better to test the behaviour of the helper method directly.

Also, since the helper handles integers as well, remove 'string' from the method name.
Do not allow creation of duplicate disks

The vCloud Director API allows you to create a rather nasty situation with
independent disks, as it does not enforce uniqueness on independent disk name
- even when they are in the same vDC. Once duplicate disk names have been created
in the same vDC, it is very difficult to tell them apart.

This commit adds code to IndependentDisk.create to check for a disk with the same name+vdc
combination before creation, and raise an error if it is attempted.

In the process, I have added specific exception classes for the various error cases of
the get_by_name_and_vdc_name() method.
Fix Rubocop error in integration test

:sadface:
Improve multiple-disks error message

IndependentDisks#get_by_name_and_vdc_name cannot handle the case where
multiple disks have the same name, in the same vdc. We try to prevent
this, but we cannot prevent it in the API. If the situation arises, the
IndependentDisk API can still be used, but the disks must be referenced
using the .new(id) constructor directly.
Rename 'post_upload_disk' to 'post_create_disk'

The Fog request method is incorrecly named 'post_upload_disk'. To prevent
propogating this error, use the correct name - 'post_create_disk'.

Fog will shortly be updated to fix this error too, with post_upload_disk
being deprecated.
Update CHANGELOG
Fix CHANGELOG headings
Merge pull request #130 from mikepea/attach_independent_disks

Independent Disk management
Merge branch 'master' of https://github.com/gds-operations/vcloud-core into custom_fields

Conflicts:
	lib/vcloud/core/fog/service_interface.rb