Storage Chassis support

Closes-Bug: #1385504
Feature: Need functionality to provision storage nodes with the notion
of chassis in the crushmap. This is required for systems like Quanta,
where a single chassis has 4 nodes built into it. The replica for an
object should not reside on the same chassis. This is also required for
the Ganges project, where the bulk of the storage is provided from a
storage shelf containing 60 drives. 15 of the 60 drives are attached to
each of the host in a Quanta system. In case the storage shelf's power
goes out, all of the 60 OSDs will be down. So an object/data in one of
the 15 drives on a node should not have a replica in any of the 60
drives in the same shelf to avoid data loss.
Support: Added support for the above. Changes done to modify the crush
map and have chassis configuration in addition to the host
configuration. The Chassis configuration will have the list of hosts
that share the common chassis. The leaf node of pool rules are
configured to use Chassis instead of hosts. This way the replica will be
put under a different chassis.
Testbed.py changes are done so that user can provide a chassis id, where
the host is present. This chassis id will be used to create a virtual
no-replica zone. Sample testbed.py for chassis support is added in the
utils/provision.py.
Also provided a command in fab 'fab storage_chassis_configure' to
dynamically add the support in an existing cluster without destroying.
The code is idempotent, so can be run any number of times and the final
crushmap will be the same. The chassis support cannot be combined with
the multi-pool support. But it will work for HDD/SSD pools.
Test: Verified the provisioning with a 2Node chassis configuration with
and without HDD/SSD pools. Verified the pg map and confirmed that the
replica is not placed under the same chassis.

Change-Id: I68cfb6dbf8974ba66b4f910bbbd72bf5460f499c
Merge "Storage Chassis support" into R1.10