Пример #1
0
        def _delete_group():
            prefix_group = self._prefix_group(group_id)
            members = self.client.get_prefix(prefix_group)
            if len(members) > 1:
                raise coordination.GroupNotEmpty(group_id)

            encoded_group = self._encode_group_id(group_id)
            txn = {
                'compare': [{
                    'key': encoded_group,
                    'result': 'NOT_EQUAL',
                    'target': 'VERSION',
                    'version': 0
                }],
                'success': [{
                    'request_delete_range': {
                        'key': encoded_group,
                    }
                }],
                'failure': []
            }
            result = self.client.transaction(txn)

            if not result.get("succeeded"):
                raise coordination.GroupNotCreated(group_id)
Пример #2
0
 def _delete_group():
     group_members, cas = self.client.gets(encoded_group)
     if group_members is None:
         raise coordination.GroupNotCreated(group_id)
     if group_members != {}:
         raise coordination.GroupNotEmpty(group_id)
     # Delete is not atomic, so we first set the group to
     # using CAS, and then we delete it, to avoid race conditions.
     if not self.client.cas(encoded_group, None, cas):
         raise _retry.TryAgain
     self.client.delete(encoded_group)
     self._remove_from_group_list(group_id)
Пример #3
0
        def _delete_group():
            members = list(self.client.get_prefix(encoded_group))
            if len(members) > 1:
                raise coordination.GroupNotEmpty(group_id)

            # Warning: as of this writing python-etcd3 does not support the
            # NOT_EQUAL operator so we use the EQUAL operator and will retry on
            # success, hihi
            status, results = self.client.transaction(
                compare=[self.client.transactions.version(encoded_group) == 0],
                success=[],
                failure=[self.client.transactions.delete(encoded_group)],
            )
            if status:
                raise coordination.GroupNotCreated(group_id)
Пример #4
0
 def _delete_group_handler(async_result, timeout, timeout_exception,
                           group_id):
     try:
         async_result.get(block=True, timeout=timeout)
     except timeout_exception as e:
         utils.raise_with_cause(coordination.OperationTimedOut,
                                encodeutils.exception_to_unicode(e),
                                cause=e)
     except exceptions.NoNodeError:
         raise coordination.GroupNotCreated(group_id)
     except exceptions.NotEmptyError:
         raise coordination.GroupNotEmpty(group_id)
     except exceptions.ZookeeperError as e:
         utils.raise_with_cause(tooz.ToozError,
                                encodeutils.exception_to_unicode(e),
                                cause=e)
Пример #5
0
 def _do_delete_group():
     try:
         entries = os.listdir(group_dir)
     except EnvironmentError as e:
         if e.errno == errno.ENOENT:
             raise coordination.GroupNotCreated(group_id)
         else:
             raise
     else:
         if len(entries) > 1:
             raise coordination.GroupNotEmpty(group_id)
         else:
             try:
                 shutil.rmtree(group_dir)
             except EnvironmentError as e:
                 if e.errno != errno.ENOENT:
                     raise
Пример #6
0
        def _delete_group():
            # create a lock for the group so that other operations on this
            # group do not conflict while the group is being deleted
            with self._get_group_lock(group_id) as lock:
                group_path = self._path_group(group_id)
                group, members = self._get_group_members(group_path)
                if not group:
                    raise coordination.GroupNotCreated(group_id)

                if members:
                    raise coordination.GroupNotEmpty(group_id)

                # delete the group recursively
                result = self._client.kv.delete(group_path, recurse=True)

                # delete the lock for the group
                self._client.kv.delete(lock._name)
                return result
Пример #7
0
 def _delete_group(script):
     keys = [
         self._encode_group_id(group_id),
         self._groups,
     ]
     args = [
         self._encode_group_id(group_id, apply_namespace=False),
     ]
     result = int(script(keys=keys, args=args))
     if result in (-1, -2):
         raise coordination.GroupNotCreated(group_id)
     if result == -3:
         raise coordination.GroupNotEmpty(group_id)
     if result == -4:
         raise tooz.ToozError("Unable to remove '%s' key"
                              " from set located at '%s'" %
                              (args[0], keys[-1]))
     if result != 1:
         raise tooz.ToozError("Internal error, unable"
                              " to complete group '%s' removal" %
                              (group_id))
Пример #8
0
 def _do_delete_group():
     try:
         entries = os.listdir(group_dir)
     except EnvironmentError as e:
         if e.errno == errno.ENOENT:
             raise coordination.GroupNotCreated(group_id)
         else:
             raise
     else:
         if len(entries) > 1:
             raise coordination.GroupNotEmpty(group_id)
         elif len(entries) == 1 and entries != ['.metadata']:
             raise tooz.ToozError(
                 "Unexpected path '%s' found in"
                 " group directory '%s' (expected to only find"
                 " a '.metadata' path)" % (entries[0], group_dir))
         else:
             try:
                 shutil.rmtree(group_dir)
             except EnvironmentError as e:
                 if e.errno != errno.ENOENT:
                     raise