ComputeLDParams: do not spell out disk templates unnecessarily

A large part of the complexity in this function is due to the need
to translate from "template-specific" parameter names to
"template-agnostic" parameter names. This logic is complex and having
complex code for complex logic is okay.

However, for all other cases, the additional complexity is not needed.
Additionally this function would do the wrong thing silently for new,
unhandled disk templates by just not changing the resulting paramters.

This commit replaces the ad-hoc logic with a more generally useful
logic while leaving the DRBD code carefully alone.
PathJoin: improve error message when given one argument

PathJoin fails with an unclear message if only one argument is passed
to it. Calling PathJoin("/foo") causes this exception:

    Error: path joining resulted in different prefix (/foo != /foo)

However, /foo and /foo obviously share prefixes: what this function
really checks is that the resulting path should be inside the first
argument and, in that sense, /foo is not a "real" prefix of /foo.

Given that PathJoin already asserts that it received any arguments
at all, this commit discards the assertion for an error to be raised
if 0 or 1 arguments are received. The semantics don't change, but
the error message is clearer.
FileStorage: move to filesstorage.py

Move the FileStorage class in its own file, together with its helper
functions.
FileStorage: extract file handling logic to a FileDeviceHelper object

This will allow code reuse for Gluster through composition, rather
than inheritance.
Add ValidatePortNumber method

This method accepts a port number and checks that it is in fact valid.
Gluster: FIXME: Update design document
Gluster: minimal implementation

Add Gluster to Ganeti by essentially cloning the shared file behaviour
everywhere in the code base.
Gluster: change mount point location to configure-time value

This commit changes the mount point of Gluster devices to an (almost)
arbitrary place (subject to the restrictions of
_GetForbiddenFileStoragePaths checks.)

This introduces complexity around the entire system of file path
allowance checking in Ganeti, as now the allowed storage paths depend
on the specific disk template in question.
Gluster: automatically un/mount gluster volumes

Allow Ganeti to manage mounts of Gluster volumes autonomously.
Gluster: add the Shared File storage type.

The shared file and gluster disk templates should not report their disk
space information like file does, because they do not behave the same.

If a cluster pulls from the same, shared source of storage then it is
not correct, or useful, to report per-node disk availability, as the
information is not node-specific.

Additionally, this information should not be used by Ganeti to check
for system resource requirements. Say that our shared storage resource
has 20 GB out of 120 GB available and we want to migrate a 25 GB large
instance from node A to node B. Ganeti would calculate that migrating a
25 GB instance would change the cluster like this and prevent the move:

        DTotal  DFree      Calculated  Real
Node A    100G    20G  -->        45G   20G
Node B    100G    20G  -->        -5G   20G
Node C    100G    20G  -->        20G   20G

This change introduces the Shared File storage type for which no
per-node measuring of disk resources is made, following this rationale.
Gluster: add userspace access support

Add support for the QEMU gluster: protocol
Gluster: add requirements to install.rst
Gluster: announce in NEWS

Add the relevant line to NEWS