Initial Core::Vm integration test

Basically a boilerplate:

- set up a vApp+Vm
- quick test to ensure it was created.
- Add some contexts for the methods that require update in the API
Add Vm#update_memory_in_mb integ tests

For increasing and reducing memory

This highlights that Vm#memory returns a string :(
Add Vm#update_name integ test
Add Vm#vapp_name integ test
Add Vm#update_cpu_count integ tests

Decrease and increase CPU count. Like Vm#memory, this highlights that Vm#cpu
returns a string :(
Add Vm#update_metadata integ tests

Test that metadata updates preserve existing metadata.

Add a test to highlight that Vm#update_metadata also updates parent vApp metadata.
Add Vm#add_extra_disks integration tests

This also adds a helper function to get *just* the disks returned by
(Model) vm.disks -- it returns the disk controllers (SCSI+ID) too, which
we can filter out by matching on name =~ /^Hard Disk/
Add Vm#configure_network_interfaces integ tests

Test that we can create single and dual nic systems.

This highlights that Fog is misbehaving wrt the vcloud_attributes
section for network cards -- ensure_list! is missing, so we get a
Hash if there is one NIC, an Array if there are >1.

On testing against a second provider, it was noticed that
the :NetworkConnection section returned by the API via Fog is
not ordered as per the insertion order.

Hence, add a helper (sort_nics_based_on_network_connection_index) to sort the
returned array based on the :NetworkConnectionIndex parameter, which then allows
us to test each returned hash in respect of the order we used to insert them.
Skip Vm#configure_guest_customization_section tests

Vm#configure_guest_customization_section contains and calls a lot of
code that handles the 'preamble script' generation, including
reading this from an external file.

This work is better done in Vcloud::Launch::VmOrchestrator, with
an interpolated preamble passed to core as data.

Leaving this test alone for now until we decide what to do, there
are tests in alphagov/vcloud-launcher for this already, so there is
no major reason to re-implement them here right now.
Add Vm#update_storage_profile integ test

If storage profiles are available, switch the Vm from the default
storage profile to a new storage profile.

Allow for marking the test as pending if storage profiles are not
available, by setting the new storage profile to be the same as
the default one.
Remove unneccessary instance vars in Vm test
Support warnings for ConfigValidator

These are less extreme than errors in that they don't fail validation. The
first use case will be schema deprecations, whereby one param replaces
another.

The consumer will need to check for them with `warnings.empty?`. I'm not
sure it's worth providing a `#warnings?` method equivalent to `#valid?` and
`#errors`.
Support schema deprecations in ConfigValidator

The renaming of `catalog_item` to `vapp_template` in vcloud-launcher has
exposed the need for parameter deprecations in schemas. Because one or the
other is required, but not both, and a warning should be raised if the old
param is provided. This is only supported in the simplest case where the two
parameters exist at the same nesting level in the schema.

We omit the `required` checking for:

- deprecator params if the deprecatee is provided, because it satisfies the
  requirement of one or the other being there.
- deprecatee params, because we should only recommend that the deprecator is
  populated.

There was some discussion about the naming of `ignore_required` because it
could be taken to mean that "a thing called ignore is required" vs "required
can be ignored". We couldn't think of a better name though.

Any logic about deprecations has been deliberately kept out of the method
`check_hash_parameter()`. It shouldn't need to know.

The methods are split into three which each do one thing. This comes at the
cost of iterating over `schema[:internals]` more than once, but it's much
easier to read than when we tried to lump the logic together in a single
method.
Log schema warnings in ConfigLoader

Log any schema warnings (currently just deprecations) that are returned by
ConfigValidator to ConfigLoader. These should be logged before raising an
exception for any errors, so that the user has the chance to fix as many
problems as possible in one sweep.

It's a deliberate decision to implement this in ConfigLoader instead of
ConfigValidator, because it ConfigLoader already logs messages and
ConfigValidator is much more general purpose and may be split to/replaced by
a separate gem one day.
Simplify :NetworkConnection sort helper
Clarify purpose of cpu count check

The reason to check the initial_cpu_count != new_cpu_count (=1) is to
ensure that we are not effectively doing a no-op in this test. We rely
on the previous test increasing the cpu count to be >1, so this expectation
is really confirming that that has occured.
Merge pull request #50 from alphagov/70452106-schema_param_deprecations

[#70452106] Support schema deprecations in ConfigValidator
Remove vcloud-tools-testing-config after use

CI is failing intermittently because the workspace isn't deleted
before/after each build and the previous clone of the config repo already
exists.

    fatal: destination path 'vcloud-tools-testing-config' already exists and is not an empty directory.
    Build step 'Execute shell' marked build as failure

Prevent this from happening by deleting the repo/dir after we've moved the
one file out of it. We could also amend the `git clean` to `-ffdx`, but I
think it's better to be explicit here.
Merge pull request #60 from alphagov/remove_testing_config_repo

Remove vcloud-tools-testing-config after use
Remove vcloud-tools-testing-config BEFORE tests

Tell `git clean` to remove untracked git repositories before fetching
vcloud-tools-testing-config. Although 6232186 was a good thing to do, it
didn't solve the immediate problem of the directory existing in our
workspaces right now, only after a successful clone.

I've removed the `rm -f Gemfile.lock` because it's covered by `git clean`
(as the file isn't tracked and the `-x` says to disregard `.gitignore`).