Exemplo n.º 1
0
 def safe_crushmap_update(self):
     with open(os.devnull,
               'w') as fnull, tempfile.TemporaryFile() as backup:
         LOG.info("Saving crushmap for safe update")
         try:
             subprocess.check_call(  # pylint: disable=not-callable
                 "ceph osd getcrushmap",
                 stdin=fnull,
                 stdout=backup,
                 stderr=fnull,
                 shell=True)
         except subprocess.CalledProcessError as exc:
             raise exception.CephFailure("failed to backup crushmap: %s" %
                                         str(exc))
         try:
             yield
         except exception.CephFailure:
             backup.seek(0, os.SEEK_SET)
             LOG.warn("Crushmap update failed. Restoring from backup")
             subprocess.call(  # pylint: disable=not-callable
                 "ceph osd setcrushmap",
                 stdin=backup,
                 stdout=fnull,
                 stderr=fnull,
                 shell=True)
             raise
Exemplo n.º 2
0
 def _crushmap_tier_rename(self, old_name, new_name):
     old_root_name = self._format_root_name(old_name)
     new_root_name = self._format_root_name(new_name)
     response, body = self._ceph_api.osd_crush_dump(body='json')
     if response.status_code != requests.codes.ok:
         raise exception.CephFailure(reason=response.reason)
     # build map of buckets to be renamed
     rename_map = {}
     for buck in body['output']['buckets']:
         name = buck['name']
         if buck['type_name'] == 'root':
             if name == old_root_name:
                 rename_map[name] = new_root_name
         else:
             old_suffix = '-{}'.format(old_name)
             new_suffix = '-{}'.format(new_name)
             if name.endswith(old_suffix):
                 rename_map[name] = name[:-len(old_suffix)] + new_suffix
     conflicts = set(b['name'] for b in body['output']['buckets']) \
         .intersection(set(rename_map.values()))
     if conflicts:
         raise exception.CephCrushTierRenameFailure(
             tier=old_name,
             reason=("Target buckets already exist: %s" %
                     ', '.join(conflicts)))
     old_rule_name = self._format_rule_name(old_name)
     new_rule_name = self._format_rule_name(new_name)
     response, body = self._ceph_api.osd_crush_rule_dump(new_rule_name)
     if response.status_code == requests.codes.ok:
         raise exception.CephCrushTierRenameFailure(
             tier=old_name,
             reason=("Target ruleset already exists %s" % new_rule_name))
     for _from, _to in rename_map.items():
         LOG.info("Rename bucket from '%s' to '%s'", _from, _to)
         response, body = self._ceph_api.osd_crush_rename_bucket(_from, _to)
         if response.status_code != requests.codes.ok:
             raise exception.CephCrushTierRenameFailure(
                 tier=old_name, reason=response.reason)
     LOG.info("Rename crush rule from '%s' to '%s'", old_rule_name,
              new_rule_name)
     response, body = self._ceph_api.osd_crush_rule_rename(
         old_rule_name, new_rule_name)
     if response.status_code != requests.codes.ok:
         raise exception.CephCrushTierRenameFailure(tier=old_name,
                                                    reason=response.reason)