def post(self):
        """Handler for post requests to datastore_admin/delete.do.

    Jobs are executed and user is redirected to the get handler.
    """
        namespace = self.request.get('namespace')
        kinds = self.request.get('kind', allow_multiple=True)
        (namespace_str, kinds_str) = utils.GetPrintableStrs(namespace, kinds)
        token = self.request.get('xsrf_token')

        jobs = []
        if utils.ValidateXsrfToken(token, XSRF_ACTION):
            try:
                op = utils.StartOperation('Deleting %s%s' %
                                          (kinds_str, namespace_str))
                name_template = 'Delete all %(kind)s objects%(namespace)s'
                jobs = utils.RunMapForKinds(op.key(), kinds, name_template,
                                            self.DELETE_HANDLER,
                                            self.INPUT_READER, None, {})
                error = ''

            except Exception, e:
                error = self._HandleException(e)

            parameters = [('job', job) for job in jobs]
            if error:
                parameters.append(('error', error))
예제 #2
0
  def post(self):
    """Handler for post requests to datastore_admin/import_backup.do.

    Import is executed and user is redirected to the base-path handler.
    """
    gs_handle = self.request.get('gs_handle')
    token = self.request.get('xsrf_token')
    error = None
    if gs_handle and utils.ValidateXsrfToken(token, XSRF_ACTION):
      try:
        bucket_name, path = parse_gs_handle(gs_handle)
        file_content = get_gs_object(bucket_name, path)
        entities = parse_backup_info_file(file_content)
        original_backup_info = entities.next()
        entity = datastore.Entity(BackupInformation.kind())
        entity.update(original_backup_info)
        backup_info = BackupInformation.from_entity(entity)
        if original_backup_info.key().app() != os.getenv('APPLICATION_ID'):
          backup_info.original_app = original_backup_info.key().app()

        def tx():
          backup_info.put(force_writes=True)
          kind_files_models = []
          for entity in entities:
            kind_files = backup_info.create_kind_backup_files(
                entity.key().name(), entity['files'])
            kind_files_models.append(kind_files)
          db.put(kind_files_models, force_writes=True)
        db.run_in_transaction(tx)
        backup_id = str(backup_info.key())
      except Exception, e:
        logging.exception('Failed to Import datastore backup information.')
        error = str(e)
예제 #3
0
  def post(self):
    """Handler for post requests to datastore_admin/copy.do.

    Jobs are executed and user is redirected to the get handler.
    """
    namespace = self.request.get('namespace')
    kinds = self.request.get_all('kind')
    (namespace_str, kinds_str) = utils.GetPrintableStrs(namespace, kinds)
    token = self.request.get('xsrf_token')
    remote_url = self.request.get('remote_url')
    extra_header = self.request.get('extra_header')

    jobs = []
    if not remote_url:
      parameters = [('error', 'Unspecified remote URL.')]
    elif not utils.ValidateXsrfToken(token, XSRF_ACTION):
      parameters = [('xsrf_error', '1')]
    else:
      try:


        if extra_header:
          extra_headers = dict([extra_header.split(':', 1)])
        else:
          extra_headers = None
        target_app = remote_api_put_stub.get_remote_appid(remote_url,
                                                          extra_headers)
        op = utils.StartOperation(
            'Copying %s%s to %s' % (kinds_str, namespace_str, target_app))
        name_template = 'Copy all %(kind)s objects%(namespace)s'
        mapper_params = {
            'target_app': target_app,
            'remote_url': remote_url,
            'extra_header': extra_header,
        }
        jobs = utils.RunMapForKinds(
            op.key(),
            kinds,
            name_template,
            self.COPY_HANDLER,
            self.INPUT_READER,
            None,
            mapper_params)

        error = ''


      except Exception, e:
        logging.exception('Handling exception.')
        error = self._HandleException(e)

      parameters = [('job', job) for job in jobs]
      if error:
        parameters.append(('error', error))
예제 #4
0
    def post(self):
        """Handler for post requests to datastore_admin/delete.do.

    Jobs are executed and user is redirected to the get handler.
    """
        namespace = self.request.get('namespace')
        kinds = self.request.get_all('kind')
        (namespace_str, kinds_str) = utils.GetPrintableStrs(namespace, kinds)
        token = self.request.get('xsrf_token')
        readonly_warning = self.request.get('readonly_warning')

        jobs = []

        if (readonly_warning
                == 'True') and not self.request.get('confirm_readonly_delete'):
            parameters = [('noconfirm_error', '1')]
        else:
            if utils.ValidateXsrfToken(token, XSRF_ACTION):
                try:
                    op = utils.StartOperation('Deleting %s%s' %
                                              (kinds_str, namespace_str))
                    name_template = 'Delete all %(kind)s objects%(namespace)s'
                    mapreduce_params = {'force_ops_writes': True}
                    queue = self.request.get('queue')
                    queue = queue or os.environ.get(
                        'HTTP_X_APPENGINE_QUEUENAME', 'default')
                    if queue[0] == '_':

                        queue = 'default'
                    jobs = utils.RunMapForKinds(
                        op.key(),
                        kinds,
                        name_template,
                        self.DELETE_HANDLER,
                        self.INPUT_READER,
                        None, {},
                        mapreduce_params=mapreduce_params,
                        queue_name=queue,
                        max_shard_count=utils.MAPREDUCE_DEFAULT_SHARDS)
                    error = ''

                except Exception as e:
                    error = self._HandleException(e)

                parameters = [('job', job) for job in jobs]
                if error:
                    parameters.append(('error', error))
            else:
                parameters = [('xsrf_error', '1')]

        query = urllib.parse.urlencode(parameters)

        self.redirect('%s/%s?%s' % (config.BASE_PATH, self.SUFFIX, query))
예제 #5
0
    def post(self):
        """Handler for post requests to datastore_admin/backup_delete.do.

    Deletes are executed and user is redirected to the base-path handler.
    """
        backup_ids = self.request.get_all('backup_id')
        token = self.request.get('xsrf_token')
        error = None
        if backup_ids and utils.ValidateXsrfToken(token, XSRF_ACTION):
            try:
                for backup_info in db.get(backup_ids):
                    if backup_info:
                        delete_backup_info(backup_info)
            except Exception, e:
                logging.exception('Failed to delete datastore backup.')
                error = str(e)
예제 #6
0
    def post(self):
        """Handler for post requests to datastore_admin/backup.do.

    Redirects to the get handler after processing the request.
    """
        token = self.request.get('xsrf_token')

        if not utils.ValidateXsrfToken(token, XSRF_ACTION):
            parameters = [('xsrf_error', '1')]
        else:
            try:
                parameters = self._ProcessPostRequest()

            except Exception, e:
                error = self._HandleException(e)
                parameters = [('error', error)]
예제 #7
0
    def post(self):
        """Handler for post requests to datastore_admin/backup_delete.do.

    Jobs are executed and user is redirected to the base-path handler.
    """
        backup_ids = self.request.get_all('backup_id')
        token = self.request.get('xsrf_token')
        error = None
        if backup_ids and utils.ValidateXsrfToken(token, XSRF_ACTION):
            try:
                for backup_info in db.get(backup_ids):
                    if backup_info:
                        blobstore_api.delete([
                            files.blobstore.get_blob_key(filename)
                            for filename in backup_info.blob_files
                        ])
                        backup_info.delete()
            except Exception, e:
                logging.exception('Failed to delete datastore backup.')
                error = str(e)
예제 #8
0
    def post(self):
        """Handler for post requests to datastore_admin/delete.do.

    Jobs are executed and user is redirected to the get handler.
    """
        namespace = self.request.get('namespace')
        kinds = self.request.get('kind', allow_multiple=True)
        (namespace_str, _) = _GetPrintableStrs(namespace, kinds)
        app_id = self.request.get('app_id')
        token = self.request.get('xsrf_token')

        jobs = []
        if utils.ValidateXsrfToken(token, XSRF_ACTION):
            try:
                for kind in kinds:
                    name = 'Delete all %s objects%s' % (kind, namespace_str)
                    mapreduce_params = {
                        'entity_kind': kind,
                    }

                    if utils.config.CLEANUP_MAPREDUCE_STATE:
                        mapreduce_params['done_callback'] = '%s/%s' % (
                            utils.config.BASE_PATH, DeleteDoneHandler.SUFFIX)

                    jobs.append(
                        control.start_map(
                            name,
                            self.DELETE_HANDLER,
                            self.INPUT_READER,
                            mapreduce_params,
                            mapreduce_parameters=mapreduce_params,
                            base_path=utils.config.MAPREDUCE_PATH,
                            _app=app_id))

                error = ''
            except Exception, e:
                error = self._HandleException(e)

            parameters = [('job', job) for job in jobs]
            if error:
                parameters.append(('error', error))
예제 #9
0
    def post(self):
        """Handler for post requests to datastore_admin/delete.do.

    Jobs are executed and user is redirected to the get handler.
    """
        namespace = self.request.get('namespace')
        kinds = self.request.get_all('kind')
        (namespace_str, kinds_str) = utils.GetPrintableStrs(namespace, kinds)
        token = self.request.get('xsrf_token')

        jobs = []
        if utils.ValidateXsrfToken(token, XSRF_ACTION):
            try:
                op = utils.StartOperation('Deleting %s%s' %
                                          (kinds_str, namespace_str))
                name_template = 'Delete all %(kind)s objects%(namespace)s'
                queue = self.request.get('queue')
                queue = queue or os.environ.get('HTTP_X_APPENGINE_QUEUENAME',
                                                'default')
                if queue[0] == '_':

                    queue = 'default'
                jobs = utils.RunMapForKinds(
                    op.key(),
                    kinds,
                    name_template,
                    self.DELETE_HANDLER,
                    self.INPUT_READER,
                    None, {},
                    queue_name=queue,
                    max_shard_count=utils.MAPREDUCE_DEFAULT_SHARDS)
                error = ''

            except Exception, e:
                error = self._HandleException(e)

            parameters = [('job', job) for job in jobs]
            if error:
                parameters.append(('error', error))