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