Пример #1
0
    def Render(cls, handler):
        """Rendering method that can be called by main.py.

    Args:
      handler: the webapp.RequestHandler invoking the method
    """
        namespace = handler.request.get('namespace', None)
        has_namespace = namespace is not None
        kinds = handler.request.get_all('kind')
        sizes_known, size_total, remainder = utils.ParseKindsAndSizes(kinds)
        notreadonly_warning = capabilities.CapabilitySet(
            'datastore_v3', capabilities=['write']).is_enabled()
        blob_warning = bool(blobstore.BlobInfo.all().count(1))
        app_id = handler.request.get('app_id')
        template_params = {
            'form_target': DoBackupHandler.SUFFIX,
            'kind_list': kinds,
            'remainder': remainder,
            'sizes_known': sizes_known,
            'size_total': size_total,
            'app_id': app_id,
            'queues': None,
            'cancel_url': handler.request.get('cancel_url'),
            'has_namespace': has_namespace,
            'namespace': namespace,
            'xsrf_token': utils.CreateXsrfToken(XSRF_ACTION),
            'notreadonly_warning': notreadonly_warning,
            'blob_warning': blob_warning,
            'backup_name': 'datastore_backup_%s' % time.strftime('%Y_%m_%d')
        }
        utils.RenderToResponse(handler, 'confirm_backup.html', template_params)
    def Render(cls, handler):
        """Rendering method that can be called by main.py.

    Args:
      handler: the webapp.RequestHandler invoking the method
    """
        namespace = handler.request.get('namespace')
        kinds = handler.request.get('kind', allow_multiple=True)
        sizes_known, size_total, remainder = utils.ParseKindsAndSizes(kinds)

        (namespace_str, kind_str) = utils.GetPrintableStrs(namespace, kinds)
        notreadonly_warning = capabilities.CapabilitySet(
            'datastore_v3', capabilities=['write']).is_enabled()
        blob_warning = bool(blobstore.BlobInfo.all().fetch(1))
        datastore_type = datastore._GetConnection().get_datastore_type()
        high_replication_warning = (datastore_type == datastore_rpc.Connection.
                                    HIGH_REPLICATION_DATASTORE)

        template_params = {
            'form_target': DoCopyHandler.SUFFIX,
            'kind_list': kinds,
            'remainder': remainder,
            'sizes_known': sizes_known,
            'size_total': size_total,
            'app_id': handler.request.get('app_id'),
            'cancel_url': handler.request.get('cancel_url'),
            'kind_str': kind_str,
            'namespace_str': namespace_str,
            'xsrf_token': utils.CreateXsrfToken(XSRF_ACTION),
            'notreadonly_warning': notreadonly_warning,
            'blob_warning': blob_warning,
            'high_replication_warning': high_replication_warning,
        }
        utils.RenderToResponse(handler, 'confirm_copy.html', template_params)
Пример #3
0
    def Render(cls, handler):
        """Rendering method that can be called by main.py or get.

    This method executes no action, so the method by which it is accessed is
    immaterial.  Creating a form with get may be a desirable function.  That is,
    if this builtin is turned on, anyone can create a form to delete a kind by
    simply linking to the ConfirmDeleteHandler like so:
    <a href="/_ah/datastore_admin/confirm_delete?kind=trash">
        Delete all Trash Objects</a>

    Args:
      handler: the webapp.RequestHandler invoking the method
    """
        readonly_warning = not capabilities.CapabilitySet(
            'datastore_v3', capabilities=['write']).is_enabled()
        namespace = handler.request.get('namespace')
        kinds = handler.request.get_all('kind')
        sizes_known, size_total, remainder = utils.ParseKindsAndSizes(kinds)

        (namespace_str, kind_str) = utils.GetPrintableStrs(namespace, kinds)
        template_params = {
            'readonly_warning': readonly_warning,
            'form_target': DoDeleteHandler.SUFFIX,
            'kind_list': kinds,
            'remainder': remainder,
            'sizes_known': sizes_known,
            'size_total': size_total,
            'app_id': handler.request.get('app_id'),
            'datastore_admin_home': utils.GenerateHomeUrl(handler.request),
            'kind_str': kind_str,
            'namespace_str': namespace_str,
            'xsrf_token': utils.CreateXsrfToken(XSRF_ACTION),
        }
        utils.RenderToResponse(handler, 'confirm_delete.html', template_params)
Пример #4
0
  def Render(cls, handler, default_backup_id=None,
             default_delete_backup_after_restore=False):
    """Rendering method that can be called by main.py.

    Args:
      handler: the webapp.RequestHandler invoking the method
      default_backup_id: default value for handler.request
      default_delete_backup_after_restore: default value for handler.request
    """
    backup_id = handler.request.get('backup_id', default_backup_id)
    backup = db.get(backup_id) if backup_id else None
    notreadonly_warning = capabilities.CapabilitySet(
        'datastore_v3', capabilities=['write']).is_enabled()
    original_app_warning = backup.original_app
    if os.getenv('APPLICATION_ID') == original_app_warning:
      original_app_warning = None
    template_params = {
        'form_target': DoBackupRestoreHandler.SUFFIX,
        'queues': None,
        'cancel_url': handler.request.get('cancel_url'),
        'backup': backup,
        'delete_backup_after_restore': handler.request.get(
            'delete_backup_after_restore', default_delete_backup_after_restore),
        'xsrf_token': utils.CreateXsrfToken(XSRF_ACTION),
        'notreadonly_warning': notreadonly_warning,
        'original_app_warning': original_app_warning
    }
    utils.RenderToResponse(handler, 'confirm_restore_from_backup.html',
                           template_params)
Пример #5
0
  def Render(cls, handler):
    """Rendering method that can be called by main.py.

    Args:
      handler: the webapp.RequestHandler invoking the method
    """
    requested_backup_ids = handler.request.get_all('backup_id')
    backup_names = []
    backup_ids = []
    gs_warning = False
    if requested_backup_ids:
      for backup in db.get(requested_backup_ids):
        backup_ids.append(backup.key())
        backup_names.append(backup.name)
        gs_warning |= backup.filesystem == files.GS_FILESYSTEM
    template_params = {
        'form_target': DoBackupDeleteHandler.SUFFIX,
        'app_id': handler.request.get('app_id'),
        'cancel_url': handler.request.get('cancel_url'),
        'backup_ids': backup_ids,
        'backup_names': backup_names,
        'xsrf_token': utils.CreateXsrfToken(XSRF_ACTION),
        'gs_warning': gs_warning
    }
    utils.RenderToResponse(handler, 'confirm_delete_backup.html',
                           template_params)
Пример #6
0
    def Render(cls, handler):
        """Rendering method that can be called by main.py or get.

    This method executes no action, so the method by which it is accessed is
    immaterial.  Creating a form with get may be a desirable function.  That is,
    if this builtin is turned on, anyone can create a form to delete a kind by
    simply linking to the ConfirmDeleteHandler like so:
    <a href="/_ah/datastore_admin/confirm_delete?kind=trash">
        Delete all Trash Objects</a>

    Args:
      handler: the webapp.RequestHandler invoking the method
    """
        namespace = handler.request.get('namespace')
        kinds = handler.request.get('kind', allow_multiple=True)
        sizes_known, size_total, remainder = cls._ParseKindsAndSizes(kinds)

        (namespace_str, kind_str) = _GetPrintableStrs(namespace, kinds)
        template_params = {
            'form_target': DoDeleteHandler.SUFFIX,
            'kind_list': kinds,
            'remainder': remainder,
            'sizes_known': sizes_known,
            'size_total': size_total,
            'app_id': handler.request.get('app_id'),
            'cancel_url': handler.request.get('cancel_url'),
            'kind_str': kind_str,
            'namespace_str': namespace_str,
            'xsrf_token': utils.CreateXsrfToken(XSRF_ACTION),
        }
        utils.RenderToResponse(handler, 'confirm_delete.html', template_params)
 def testBadTokenType(self):
   """Verify that nothing happens with a bad token name."""
   self.handler.request.set('kind', [(__name__ + '.' + TestModel.__name__)])
   self.handler.request.set('namespace', '')
   self.handler.request.set('app_id', APP_ID)
   self.handler.request.set('xsrf_token', utils.CreateXsrfToken('foobar'))
   self.handler.post()
   self.assertTaskNotStarted()
 def testJobCreation(self):
   """Verify that with appropriate request parameters job is kicked off."""
   self.handler.request.set('kind', [(__name__ + '.' + TestModel.__name__)])
   self.handler.request.set('namespace', '')
   self.handler.request.set('app_id', APP_ID)
   self.handler.request.set('xsrf_token', utils.CreateXsrfToken('delete'))
   TestModel(_app=APP_ID).put()
   self.handler.post()
   self.assertTaskStarted()
Пример #9
0
class ConfirmBackupImportHandler(webapp.RequestHandler):
  """Handler to import backup information."""

  SUFFIX = 'backup_information'

  @classmethod
  def Render(cls, handler):
    """Rendering method that can be called by main.py.

    Args:
      handler: the webapp.RequestHandler invoking the method
    """
    gs_handle = handler.request.get('gs_handle')
    error = None if gs_handle else 'Google Cloud Storage path is missing'
    other_backup_info_files = []
    selected_backup_info_file = None
    backup_info_specified = False
    if not error:
      try:
        gs_handle = gs_handle.rstrip()
        bucket_name, prefix = parse_gs_handle(gs_handle)
        validate_gs_bucket_name(bucket_name)
        if not is_accessible_bucket_name(bucket_name):
          raise BackupValidationException(
              'Bucket "%s" is not accessible' % bucket_name)
        if prefix.endswith('.backup_info'):
          prefix = prefix[0:prefix.rfind('/')]
          backup_info_specified = True
        elif prefix and not prefix.endswith('/'):
          prefix += '/'
        for backup_info_file in list_bucket_files(bucket_name, prefix):
          if backup_info_file.endswith('.backup_info'):
            backup_info_file = '/gs/%s/%s' % (bucket_name, backup_info_file)

            if backup_info_specified and backup_info_file == gs_handle:
              selected_backup_info_file = backup_info_file
            else:
              other_backup_info_files.append(backup_info_file)
      except Exception, ex:
        error = 'Failed to read bucket: %s' % ex
    template_params = {
        'error': error,
        'form_target': DoBackupImportHandler.SUFFIX,
        'cancel_url': handler.request.get('cancel_url'),
        'selected_backup_info_file': selected_backup_info_file,
        'other_backup_info_files': other_backup_info_files,
        'backup_info_specified': backup_info_specified,
        'xsrf_token': utils.CreateXsrfToken(XSRF_ACTION)
    }
    utils.RenderToResponse(handler, 'confirm_backup_import.html',
                           template_params)
 def testBadTokenType(self):
     """Verify that nothing happens with a bad token name."""
     self.handler.request.set('kind',
                              [(__name__ + '.' + TestModel.__name__)])
     self.handler.request.set('namespace', '')
     self.handler.request.set('app_id', self.app_id)
     self.handler.request.set('remote_url', self.remote_url)
     self.handler.request.set('xsrf_token', utils.CreateXsrfToken('foobar'))
     self.handler.post()
     self.assertTaskNotStarted()
     self.assertEqual([], self.exceptions)
     self.assertEqual(302, self.handler.response.status)
     self.assertEqual(
         'http://foo.com/_ah/datastore_admin/copy.do?'
         'xsrf_error=1', self.handler.response.headers.get('Location'))
 def testJobCreation(self):
     """Verify that with appropriate request parameters job is kicked off."""
     self.handler.request.set('kind',
                              [(__name__ + '.' + TestModel.__name__)])
     self.handler.request.set('namespace', '')
     self.handler.request.set('app_id', self.app_id)
     self.handler.request.set('remote_url', self.remote_url)
     self.handler.request.set('xsrf_token', utils.CreateXsrfToken('copy'))
     TestModel().put()
     self.handler.post()
     self.assertTaskStarted()
     self.assertEqual([], self.exceptions)
     self.assertEqual(302, self.handler.response.status)
     self.assertIn('http://foo.com/_ah/datastore_admin/copy.do?job=',
                   self.handler.response.headers.get('Location'))
 def testBadRemoteUrl(self):
     """Verify that nothing happens on a bad request."""
     self.handler.request.set('kind',
                              [(__name__ + '.' + TestModel.__name__)])
     self.handler.request.set('namespace', '')
     self.handler.request.set('app_id', self.app_id)
     self.handler.request.set('remote_url', 'bogus remote url')
     self.handler.request.set('xsrf_token', utils.CreateXsrfToken('copy'))
     self.handler.post()
     self.assertTaskNotStarted()
     self.assertEqual(1, len(self.exceptions))
     self.assertEqual(302, self.handler.response.status)
     self.assertEqual(
         'http://foo.com/_ah/datastore_admin/copy.do?'
         'error=unexpected+url%3A+bogus+remote+url',
         self.handler.response.headers.get('Location'))
    def testJobCreationExtraHeaders(self):
        """Verify that with appropriate request parameters job is kicked off.

    With an extra header (typically used for authentication).
    """
        self.handler.request.set('kind',
                                 [(__name__ + '.' + TestModel.__name__)])
        self.handler.request.set('namespace', '')
        self.handler.request.set('app_id', self.app_id)
        self.handler.request.set('remote_url', self.remote_url)
        self.handler.request.set('xsrf_token', utils.CreateXsrfToken('copy'))
        self.handler.request.set('extra_header', 'SecretHeader:LetMeIn')
        self.expected_extra_headers = {'SecretHeader': 'LetMeIn'}
        TestModel().put()
        self.handler.post()
        self.assertTaskStarted()
        self.assertEqual([], self.exceptions)
        self.assertEqual(302, self.handler.response.status)
        self.assertIn('http://foo.com/_ah/datastore_admin/copy.do?job=',
                      self.handler.response.headers.get('Location'))
Пример #14
0
  def Render(cls, handler):
    """Rendering method that can be called by main.py.

    Args:
      handler: the webapp.RequestHandler invoking the method
    """
    requested_backup_ids = handler.request.get_all('backup_id')
    backups = []
    if requested_backup_ids:
      for backup in db.get(requested_backup_ids):
        if backup:
          backups.append(backup)
    template_params = {
        'form_target': DoBackupAbortHandler.SUFFIX,
        'cancel_url': handler.request.get('cancel_url'),
        'backups': backups,
        'xsrf_token': utils.CreateXsrfToken(XSRF_ACTION)
    }
    utils.RenderToResponse(handler, 'confirm_abort_backup.html',
                           template_params)
Пример #15
0
    def Render(cls, handler):
        """Rendering method that can be called by main.py.

    Args:
      handler: the webapp.RequestHandler invoking the method
    """
        backup_id = handler.request.get('backup_id')
        backup = db.get(backup_id) if backup_id else None
        notreadonly_warning = capabilities.CapabilitySet(
            'datastore_v3', capabilities=['write']).is_enabled()
        app_id = handler.request.get('app_id')
        template_params = {
            'form_target': DoBackupRestoreHandler.SUFFIX,
            'app_id': app_id,
            'queues': None,
            'cancel_url': handler.request.get('cancel_url'),
            'backup': backup,
            'xsrf_token': utils.CreateXsrfToken(XSRF_ACTION),
            'notreadonly_warning': notreadonly_warning
        }
        utils.RenderToResponse(handler, 'confirm_restore_from_backup.html',
                               template_params)
Пример #16
0
    def Render(cls, handler):
        """Rendering method that can be called by main.py.

    Args:
      handler: the webapp.RequestHandler invoking the method
    """
        backup_ids = handler.request.get_all('backup_id')
        if backup_ids:
            backups = db.get(backup_ids)
            backup_ids = [backup.key() for backup in backups]
            backup_names = [backup.name for backup in backups]
        else:
            backup_names = []
            backup_ids = []
        template_params = {
            'form_target': DoBackupDeleteHandler.SUFFIX,
            'app_id': handler.request.get('app_id'),
            'cancel_url': handler.request.get('cancel_url'),
            'backup_ids': backup_ids,
            'backup_names': backup_names,
            'xsrf_token': utils.CreateXsrfToken(XSRF_ACTION),
        }
        utils.RenderToResponse(handler, 'confirm_delete_backup.html',
                               template_params)