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: I747b9214306cc5381ffb2ba52def93ab6e99ae00