blob: 8210992aa1321f439b77130d1601b9169184a966 [file] [log] [blame]
{% extends "base.html" %}
{% block body %}
<h2>Datastore Admin of {{hosting_app_id}}</h2>
{% if run_as_a_service %}
<div class="ae-message ae-rounded-sml">
Backup/Restore running as a service.
<a href="{{datastore_admin_home}}?service=T">Disable</a>
</div>
{% else %}
{% if offer_service %}
<div class="ae-message ae-rounded-sml">
This application may run backup/restore as a service.
<a href="{{datastore_admin_home}}?run_as_a_service=True">Enable</a>
</div>
{% endif %}
{% endif %}
{% if error %}
<div class="ae-errorbox">
{{ error|escape }}
</div>
{% endif %}
<div class="ae-table-caption">
<div class="ae-paginate">
<div class="g-section g-tpl-50-50 g-split">
<div class="g-unit g-first">
<strong>Entities</strong>
</div>
<div class="g-unit">
<span id="ae-dash-quota-refresh-info">
{% if last_stats_update %}
Entity statistics last updated
{{ last_stats_update|date:"M j, Y g:i a T" }}
{% else %}
Entity statistics unavailable.
{% endif %}
<a target="_blank"
href="https://developers.google.com/appengine/docs/adminconsole/datastorestats">
<img class="ae-help-icon" src="{{ base_path }}/static/img/help.gif"
height="14" width="14" alt="help">
</a>
</span>
</div>
</div>
</div>
</div>
{% if kind_stats %}
<form action="{{ base_path }}/" method="post">
{% if run_as_a_service %}
<input type="hidden" name="run_as_a_service" value="{{ run_as_a_service|escape }}">
{% endif %}
{% if has_namespace %}
<input type="hidden" name="namespace" value="{{ namespace|escape }}">
{% endif %}
<input type="hidden" name="app_id" value="{{ app_id|escape }}">
<table id="kinds" class="ae-table ae-table-striped">
<thead>
<tr>
<th scope="col" class="cbc tct-selectall"></th>
<th scope="col" class="id">Entity Kind</th>
<th scope="col" class="id"># Entities</th>
<th scope="col" class="id">Avg. Size/Entity</th>
<th scope="col" class="id">Entities Size</th>
<th scope="col" class="id">Total Size</th>
</tr>
</thead>
<tbody>
{% for kind in kind_stats %}
<tr>
<td class="cbc">
<input type="checkbox" name="kind" value="{{ kind.kind_name }}"
id="{{ kind.kind_name }}">
</td>
<td class="id">
<label for="{{ kind.kind_name }}">{{ kind.kind_name }}</label>
</td>
{% if kind.count %}
<td class="id">{{ kind.count }}</td>
<td class="id">{{ kind.average_bytes_str }}</td>
<td class="id">{{ kind.entity_bytes_str }}</td>
<td class="id">{{ kind.total_bytes_str }}</td>
{% else %}
<td class="id" style="color: #666667;">Stats not available</td>
<td class="id" style="color: #666667;">Stats not available</td>
<td class="id" style="color: #666667;">Stats not available</td>
<td class="id" style="color: #666667;">Stats not available</td>
{% endif %}
</tr>
{% endfor %}
{% if more_kinds %}
<tr>
<td colspan="6" class="cbc">
Not all kinds could be displayed, possibly because there were too many. To back up a kind that does not appear in this list, use a <a href="https://developers.google.com/appengine/articles/scheduled_backups" target="_blank">scheduled backup</a>.
</td>
</tr>
{% endif %}
</tbody>
<tfoot>
<tr>
<td colspan="6">
{% for action in action_list %}
<input type="submit" name="action"
class="goog-button" value="{{ action }}">
{% endfor %}
</td>
</tr>
</tfoot>
</table>
</form>
{% else %}
<table class="ae-table">
<tbody>
<tr>
<td>
<div class="ae-disabled"
style="padding-top: 0.75em; padding-bottom: 0.75em;
text-align: center;">
Datastore is empty.
</div>
</td>
</tr>
</tbody>
</table>
{% endif %}
{% if pending_backups %}
<p>
<div class="ae-table-caption">
<div class="ae-paginate">
<div class="g-section g-tpl-50-50 g-split">
<div class="g-unit g-first">
<strong>Pending Backups</strong>
</div>
</div>
</div>
</div>
<form action="{{ base_path }}/" method="post">
{% if run_as_a_service %}
<input type="hidden" name="run_as_a_service" value="{{ run_as_a_service|escape }}">
{% endif %}
<input type="hidden" name="app_id" value="{{ app_id|escape }}">
<table id="pending_backups" class="ae-table ae-table-striped">
<thead>
<tr>
<th scope="col" class="cbc tct-selectall"></th>
<th scope="col" class="id">Name</th>
<th scope="col" class="id">Start-Time</th>
</tr>
</thead>
<tbody>
{% for pending_backup in pending_backups %}
<tr>
<td class="cbc">
<input type="checkbox" name="backup_id" value="{{ pending_backup.key }}" id="{{ pending_backup.key }}">
</td>
<td class="id">
<span title="Kinds: {{ pending_backup.kinds|join:', '|truncatewords:20|escape}}">{{ pending_backup.name }}{% if pending_backup.original_app %} (Imported from {{pending_backup.original_app|escape}}){% endif %}</span>
</td>
<td class="id">
{{ pending_backup.start_time }}
</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
<tr>
<td colspan="4" nowrap="nowrap">
{% for pending_backup_action in pending_backup_action_list %}
<input type="submit" name="action" style="" class="goog-button" value="{{ pending_backup_action }}">
{% endfor %}
</td>
</tr>
</tfoot>
</table>
</form>
{% endif %}
<p>
<div class="ae-table-caption">
<div class="ae-paginate">
<div class="g-section g-tpl-50-50 g-split">
<div class="g-unit g-first">
<strong>Backups</strong>
</div>
</div>
</div>
</div>
{% if backups %}
<form action="{{ base_path }}/" method="post">
{% if run_as_a_service %}
<input type="hidden" name="run_as_a_service" value="{{ run_as_a_service|escape }}">
{% endif %}
<input type="hidden" name="app_id" value="{{ app_id|escape }}">
<table id="backups" class="ae-table ae-table-striped">
<thead>
<tr>
<th scope="col" class="cbc tct-selectall"></th>
<th scope="col" class="id">Name</th>
<th scope="col" class="id">Start-Time</th>
<th scope="col" class="id">End-Time</th>
</tr>
</thead>
<tbody>
{% for backup in backups %}
<tr>
<td class="cbc">
<input type="checkbox" name="backup_id" value="{{ backup.key }}" id="{{ backup.key }}">
</td>
<td class="id">
<span title="Kinds: {{ backup.kinds|join:', '|truncatewords:20|escape }}">{{ backup.name }}{% if backup.original_app %} (Imported from {{backup.original_app|escape}}){% endif %}</span>
</td>
<td class="id">
{{ backup.start_time }}
</td>
<td class="id">
{{ backup.complete_time }}
</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
<tr>
<td colspan="4" nowrap="nowrap">
{% for backup_action in backup_action_list %}
<input type="submit" name="action" style="" class="goog-button" value="{{ backup_action }}">
{% endfor %}
</td>
</tr>
</tfoot>
</table>
</form>
{% endif %}
<div class="ae-table-caption">
<form action="{{ base_path }}/" method="post" >
{% if run_as_a_service %}
<input type="hidden" name="run_as_a_service" value="{{ run_as_a_service|escape }}">
{% endif %}
<input type="submit" name="action" value="Import Backup Information" title="Import Backup Information or restore from Google Cloud Storage"/>
<input type="text" name="gs_handle" value="" size="50" title="Google Cloud Storage path of a backup info file or a bucket name"/>
</form>
</div>
{% if active_operations %}
<p>
<div class="ae-table-caption">
<div class="ae-paginate">
<div class="g-section g-tpl-50-50 g-split">
<div class="g-unit g-first">
<strong>Active Operations</strong>
</div>
</div>
</div>
</div>
<table id="operations" class="ae-table ae-table-striped">
<thead>
<tr>
<th scope="col" class="id">Description</th>
<th scope="col" class="id">Jobs</th>
</tr>
</thead>
<tbody>
{% for operation in active_operations %}
<tr>
<td class="id">
{{ operation.description }}
</td>
<td class="id">
({{operation.completed_jobs}} steps completed,
{{operation.active_jobs}} active)
{% for job_id in operation.active_job_ids %}
<br/><a href="{{ map_reduce_path }}?mapreduce_id={{job_id}}">Job {{job_id}}</a>
{% endfor %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% if completed_operations %}
<p>
<div class="ae-table-caption">
<div class="ae-paginate">
<div class="g-section g-tpl-50-50 g-split">
<div class="g-unit g-first">
<strong>Completed Operations</strong>
</div>
</div>
</div>
</div>
<table id="operations" class="ae-table ae-table-striped">
<thead>
<tr>
<th scope="col" class="id">Description</th>
<th scope="col" class="id">Completed steps</th>
<th scope="col" class="id">Status</th>
<th scope="col" class="id">Status info</th>
</tr>
</thead>
<tbody>
{% for operation in completed_operations %}
<tr>
<td class="id">
{{ operation.description }}
</td>
<td class="id">
{{operation.completed_jobs}} steps
</td>
<td class="id">
{{operation.status}}
</td>
<td class="id">
{{operation.status_info}}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% endblock %}