}        Units are in MB, so 122880 = (10 + 100) * 1024.
        NOTE(comstud): Perhaps we should only report a single number
        available per instance_type.
        """
        if not ctxt:
            ctxt = context.get_admin_context()
        reserve_level = CONF.cells.reserve_percent / 100.0
        compute_hosts = {}
        def _get_compute_hosts():
            compute_nodes = self.db.compute_node_get_all(ctxt)
            for compute in compute_nodes:
                service = compute['service']
                if not service or service['disabled']:
                    continue
                host = service['host']
                compute_hosts[host] = {
                        'free_ram_mb': compute['free_ram_mb'],
                        'free_disk_mb': compute['free_disk_gb'] * 1024,
                        'total_ram_mb': compute['memory_mb'],
                        'total_disk_mb': compute['local_gb'] * 1024}
        _get_compute_hosts()
        if not compute_hosts:
            self.my_cell_state.update_capacities({})
            return
        ram_mb_free_units = {}
        disk_mb_free_units = {}
        total_ram_mb_free = 0
        total_disk_mb_free = 0
        def _free_units(total, free, per_inst):
            if per_inst:
                min_free = total * reserve_level
                free = max(0, free - min_free)
                return int(free / per_inst)
            else:
                return 0
        instance_types = self.db.flavor_get_all(ctxt)
        memory_mb_slots = frozenset(
                [inst_type['memory_mb'] for inst_type in instance_types])
        disk_mb_slots = frozenset(
                [(inst_type['root_gb'] + inst_type['ephemeral_gb']) * units.Ki
                    for inst_type in instance_types])
        for compute_values in compute_hosts.values():
            total_ram_mb_free += compute_values['free_ram_mb']
            total_disk_mb_free += compute_values['free_disk_mb']
            for memory_mb_slot in memory_mb_slots:
                ram_mb_free_units.setdefault(str(memory_mb_slot), 0)
                free_units = _free_units(compute_values['total_ram_mb'],
                        compute_values['free_ram_mb'], memory_mb_slot)
                ram_mb_free_units[str(memory_mb_slot)] += free_units
            for disk_mb_slot in disk_mb_slots:
                disk_mb_free_units.setdefault(str(disk_mb_slot), 0)
                free_units = _free_units(compute_values['total_disk_mb'],
                        compute_values['free_disk_mb'], disk_mb_slot)
                disk_mb_free_units[str(disk_mb_slot)] += free_units
        capacities = {'ram_free': {'total_mb': total_ram_mb_free,
                                   'units_by_mb': ram_mb_free_units},
                      'disk_free': {'total_mb': total_disk_mb_free,
                                    'units_by_mb': disk_mb_free_units}}
        self.my_cell_state.update_capacities(capacities)
    @sync_before
**** CubicPower OpenStack Study ****
        def _get_compute_hosts():
            compute_nodes = self.db.compute_node_get_all(ctxt)
            for compute in compute_nodes:
                service = compute['service']
                if not service or service['disabled']:
                    continue
                host = service['host']
                compute_hosts[host] = {
                        'free_ram_mb': compute['free_ram_mb'],
                        'free_disk_mb': compute['free_disk_gb'] * 1024,
                        'total_ram_mb': compute['memory_mb'],
                        'total_disk_mb': compute['local_gb'] * 1024}
        _get_compute_hosts()
        if not compute_hosts:
            self.my_cell_state.update_capacities({})
            return
        ram_mb_free_units = {}
        disk_mb_free_units = {}
        total_ram_mb_free = 0
        total_disk_mb_free = 0
**** CubicPower OpenStack Study ****
        def _free_units(total, free, per_inst):
            if per_inst:
                min_free = total * reserve_level
                free = max(0, free - min_free)
                return int(free / per_inst)
            else:
                return 0
        instance_types = self.db.flavor_get_all(ctxt)
        memory_mb_slots = frozenset(
                [inst_type['memory_mb'] for inst_type in instance_types])
        disk_mb_slots = frozenset(
                [(inst_type['root_gb'] + inst_type['ephemeral_gb']) * units.Ki
                    for inst_type in instance_types])
        for compute_values in compute_hosts.values():
            total_ram_mb_free += compute_values['free_ram_mb']
            total_disk_mb_free += compute_values['free_disk_mb']
            for memory_mb_slot in memory_mb_slots:
                ram_mb_free_units.setdefault(str(memory_mb_slot), 0)
                free_units = _free_units(compute_values['total_ram_mb'],
                        compute_values['free_ram_mb'], memory_mb_slot)
                ram_mb_free_units[str(memory_mb_slot)] += free_units
            for disk_mb_slot in disk_mb_slots:
                disk_mb_free_units.setdefault(str(disk_mb_slot), 0)
                free_units = _free_units(compute_values['total_disk_mb'],
                        compute_values['free_disk_mb'], disk_mb_slot)
                disk_mb_free_units[str(disk_mb_slot)] += free_units
        capacities = {'ram_free': {'total_mb': total_ram_mb_free,
                                   'units_by_mb': ram_mb_free_units},
                      'disk_free': {'total_mb': total_disk_mb_free,
                                    'units_by_mb': disk_mb_free_units}}
        self.my_cell_state.update_capacities(capacities)
    @sync_before
**** CubicPower OpenStack Study ****
    def get_cell_info_for_neighbors(self):
        """Return cell information for all neighbor cells."""
        cell_list = [cell.get_cell_info()
                for cell in self.child_cells.itervalues()]
        cell_list.extend([cell.get_cell_info()
                for cell in self.parent_cells.itervalues()])
        return cell_list
    @sync_before
**** CubicPower OpenStack Study ****
    def get_my_state(self):
        """Return information for my (this) cell."""
        return self.my_cell_state
    @sync_before
**** CubicPower OpenStack Study ****
    def get_child_cells(self):
        """Return list of child cell_infos."""
        return self.child_cells.values()
    @sync_before
**** CubicPower OpenStack Study ****
    def get_parent_cells(self):
        """Return list of parent cell_infos."""
        return self.parent_cells.values()
    @sync_before
**** CubicPower OpenStack Study ****
    def get_parent_cell(self, cell_name):
        return self.parent_cells.get(cell_name)
    @sync_before
**** CubicPower OpenStack Study ****
    def get_child_cell(self, cell_name):
        return self.child_cells.get(cell_name)
    @sync_before
**** CubicPower OpenStack Study ****
    def update_cell_capabilities(self, cell_name, capabilities):
        """Update capabilities for a cell."""
        cell = (self.child_cells.get(cell_name) or
                self.parent_cells.get(cell_name))
        if not cell:
            LOG.error(_("Unknown cell '%(cell_name)s' when trying to "
                        "update capabilities"),
                      {'cell_name': cell_name})
            return
        # Make sure capabilities are sets.
        for capab_name, values in capabilities.items():
            capabilities[capab_name] = set(values)
        cell.update_capabilities(capabilities)
    @sync_before
**** CubicPower OpenStack Study ****
    def update_cell_capacities(self, cell_name, capacities):
        """Update capacities for a cell."""
        cell = (self.child_cells.get(cell_name) or
                self.parent_cells.get(cell_name))
        if not cell:
            LOG.error(_("Unknown cell '%(cell_name)s' when trying to "
                        "update capacities"),
                      {'cell_name': cell_name})
            return
        cell.update_capacities(capacities)
    @sync_before
**** CubicPower OpenStack Study ****
    def get_our_capabilities(self, include_children=True):
        capabs = copy.deepcopy(self.my_cell_state.capabilities)
        if include_children:
            for cell in self.child_cells.values():
                if timeutils.is_older_than(cell.last_seen,
                                CONF.cells.mute_child_interval):
                    continue
                for capab_name, values in cell.capabilities.items():
                    if capab_name not in capabs:
                        capabs[capab_name] = set([])
                    capabs[capab_name] |= values
        return capabs
**** CubicPower OpenStack Study ****
    def _add_to_dict(self, target, src):
        for key, value in src.items():
            if isinstance(value, dict):
                target.setdefault(key, {})
                self._add_to_dict(target[key], value)
                continue
            target.setdefault(key, 0)
            target[key] += value
    @sync_before
**** CubicPower OpenStack Study ****
    def get_our_capacities(self, include_children=True):
        capacities = copy.deepcopy(self.my_cell_state.capacities)
        if include_children:
            for cell in self.child_cells.values():
                self._add_to_dict(capacities, cell.capacities)
        return capacities
    @sync_before
**** CubicPower OpenStack Study ****
    def get_capacities(self, cell_name=None):
        if not cell_name or cell_name == self.my_cell_state.name:
            return self.get_our_capacities()
        if cell_name in self.child_cells:
            return self.child_cells[cell_name].capacities
        raise exception.CellNotFound(cell_name=cell_name)
    @sync_before
**** CubicPower OpenStack Study ****
    def cell_get(self, ctxt, cell_name):
        for cells_dict in (self.parent_cells, self.child_cells):
            if cell_name in cells_dict:
                return cells_dict[cell_name]
        raise exception.CellNotFound(cell_name=cell_name)
**** CubicPower OpenStack Study ****
class CellStateManagerDB(CellStateManager):
    @utils.synchronized('cell-db-sync')
    
**** CubicPower OpenStack Study ****
    def _cell_data_sync(self, force=False):
        """Update cell status for all cells from the backing data store
        when necessary.
        :param force: If True, cell status will be updated regardless
                      of whether it's time to do so.
        """
        if force or self._time_to_sync():
            LOG.debug(_("Updating cell cache from db."))
            self.last_cell_db_check = timeutils.utcnow()
            ctxt = context.get_admin_context()
            db_cells = self.db.cell_get_all(ctxt)
            db_cells_dict = dict((cell['name'], cell) for cell in db_cells)
            self._refresh_cells_from_dict(db_cells_dict)
            self._update_our_capacity(ctxt)
    @sync_after
**** CubicPower OpenStack Study ****
    def cell_create(self, ctxt, values):
        return self.db.cell_create(ctxt, values)
    @sync_after
**** CubicPower OpenStack Study ****
    def cell_update(self, ctxt, cell_name, values):
        return self.db.cell_update(ctxt, cell_name, values)
    @sync_after
**** CubicPower OpenStack Study ****
    def cell_delete(self, ctxt, cell_name):
        return self.db.cell_delete(ctxt, cell_name)
**** CubicPower OpenStack Study ****
class CellStateManagerFile(CellStateManager):
    
**** CubicPower OpenStack Study ****
    def __init__(self, cell_state_cls, cells_config_path):
        self.cells_config_path = cells_config_path
        super(CellStateManagerFile, self).__init__(cell_state_cls)
**** CubicPower OpenStack Study ****
    def _cell_data_sync(self, force=False):
        """Update cell status for all cells from the backing data store
        when necessary.
        :param force: If True, cell status will be updated regardless
                      of whether it's time to do so.
        """
        reloaded, data = fileutils.read_cached_file(self.cells_config_path,
                                                    force_reload=force)
        if reloaded:
            LOG.debug(_("Updating cell cache from config file."))
            self.cells_config_data = jsonutils.loads(data)
            self._refresh_cells_from_dict(self.cells_config_data)
        if force or self._time_to_sync():
            self.last_cell_db_check = timeutils.utcnow()
            self._update_our_capacity()
**** CubicPower OpenStack Study ****
    def cell_create(self, ctxt, values):
        raise exception.CellsUpdateProhibited()
**** CubicPower OpenStack Study ****
    def cell_update(self, ctxt, cell_name, values):
        raise exception.CellsUpdateProhibited()
**** CubicPower OpenStack Study ****
    def cell_delete(self, ctxt, cell_name):
        raise exception.CellsUpdateProhibited()