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)
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)
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)
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)
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()
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'))
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)
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)
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)