[Cluster-devel] conga/luci site/luci/Extensions/StorageReport. ...
kupcevic at sourceware.org
kupcevic at sourceware.org
Mon Oct 16 07:39:28 UTC 2006
CVSROOT: /cvs/cluster
Module name: conga
Changes by: kupcevic at sourceware.org 2006-10-16 07:39:27
Modified files:
luci/site/luci/Extensions: StorageReport.py Variable.py
ricci_communicator.py
luci/storage : form-macros
Added files:
luci/storage : check-batch
Log message:
luci storage:
- use async calls to commit storage changes
- detailed error reporting during commits
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/StorageReport.py.diff?cvsroot=cluster&r1=1.17&r2=1.18
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/Variable.py.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ricci_communicator.py.diff?cvsroot=cluster&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/check-batch.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/form-macros.diff?cvsroot=cluster&r1=1.14&r2=1.15
--- conga/luci/site/luci/Extensions/StorageReport.py 2006/10/15 22:34:54 1.17
+++ conga/luci/site/luci/Extensions/StorageReport.py 2006/10/16 07:39:27 1.18
@@ -10,7 +10,7 @@
from conga_storage_constants import *
from HelperFunctions import *
-from ricci_communicator import get_ricci_communicator
+from ricci_communicator import get_ricci_communicator, batch_status, extract_module_status
@@ -811,14 +811,10 @@
return [valid, var_name, msg]
-# TODO: implement
-def apply(self, ricci, storage_report, request, main_URL):
+
+def apply(self, ricci, storage_report, request):
if validate(self, storage_report, request) != 'OK':
- return 'Internal error: input not validated!!!'
-
- #return 'size has to be within limits'
- #return request
- #return main_URL
+ raise 'Internal error: input not validated!!!'
session = request.SESSION
@@ -833,6 +829,8 @@
path = request[PT_PATH]
+ batch_id = ''
+
if object_type == 'bd':
bd_data = get_bd_data(self, storage_report, mapper_id, path)
bd_xml = bd_data['xml'].cloneNode(True)
@@ -853,11 +851,8 @@
module.appendChild(req)
batch.appendChild(module)
- res = ricci.process_batch(batch, False)
- if res.getAttribute('status') != '0':
- invalidate_storage_report(request.SESSION, storagename)
- err_msg = 'Error removing ' + path + '\n' + res.toprettyxml()
- return err_msg
+ res = ricci.process_batch(batch, True)
+ batch_id = res.getAttribute('batch_id')
pass
@@ -978,51 +973,10 @@
module.appendChild(req)
batch.appendChild(module)
- res = ricci.process_batch(batch, False)
- if res.getAttribute('status') != '0':
- invalidate_storage_report(request.SESSION, storagename)
- err_msg = 'Error modifying ' + path + '\n' + res.toprettyxml()
- return err_msg
- module_r = None
- for node in res.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == 'module':
- module_r = node
- if module_r == None:
- raise 'missing <module/> in <batch/>'
- if module_r.getAttribute('status') != '0':
- raise 'error retrieving storage report'
- resp_r = None
- for node in module_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == RESPONSE_TAG:
- resp_r = node
- if resp_r == None:
- raise 'missing <response/> in <module/>'
- fr_r = None
- for node in resp_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == FUNC_RESP_TAG:
- fr_r = node
- if fr_r == None:
- raise 'missing <function_response/> in <response/>'
- bd_var = None
- for node in fr_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == VARIABLE_TAG:
- if node.getAttribute('name') == 'bd':
- bd_var = node
- if bd_var == None:
- raise 'missing <var name="bd"/> in <function_response/>'
- bd_xml = None
- for node in bd_var.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == BD_TYPE:
- bd_xml = node.cloneNode(True)
- path = bd_xml.getAttribute('path')
+ res = ricci.process_batch(batch, True)
+ batch_id = res.getAttribute('batch_id')
pass
- pass
-
+
elif object_type == 'bd_template':
@@ -1149,51 +1103,10 @@
module.appendChild(req)
batch.appendChild(module)
- res = ricci.process_batch(batch, False)
- if res.getAttribute('status') != '0':
- invalidate_storage_report(request.SESSION, storagename)
- err_msg = 'Error creating new ' + path + '\n' + res.toprettyxml()
- return err_msg
- module_r = None
- for node in res.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == 'module':
- module_r = node
- if module_r == None:
- raise 'missing <module/> in <batch/>'
- if module_r.getAttribute('status') != '0':
- raise 'error retrieving storage report'
- resp_r = None
- for node in module_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == RESPONSE_TAG:
- resp_r = node
- if resp_r == None:
- raise 'missing <response/> in <module/>'
- fr_r = None
- for node in resp_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == FUNC_RESP_TAG:
- fr_r = node
- if fr_r == None:
- raise 'missing <function_response/> in <response/>'
- bd_var = None
- for node in fr_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == VARIABLE_TAG:
- if node.getAttribute('name') == 'bd':
- bd_var = node
- if bd_var == None:
- raise 'missing <var name="bd"/> in <function_response/>'
- bd_xml = None
- for node in bd_var.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == BD_TYPE:
- bd_xml = node.cloneNode(True)
- path = bd_xml.getAttribute('path')
+ res = ricci.process_batch(batch, True)
+ batch_id = res.getAttribute('batch_id')
pass
- pass
-
+
elif object_type == 'mapper':
@@ -1217,13 +1130,11 @@
module.appendChild(req)
batch.appendChild(module)
- res = ricci.process_batch(batch, False)
- if res.getAttribute('status') != '0':
- invalidate_storage_report(request.SESSION, storagename)
- err_msg = 'Error removing ' + mapper_id + '\n' + res.toprettyxml()
- return err_msg
+ res = ricci.process_batch(batch, True)
+ batch_id = res.getAttribute('batch_id')
pass
+
elif action_type == 'Apply':
# props
props_xml = None
@@ -1274,51 +1185,10 @@
module.appendChild(req)
batch.appendChild(module)
- res = ricci.process_batch(batch, False)
- if res.getAttribute('status') != '0':
- invalidate_storage_report(request.SESSION, storagename)
- err_msg = 'Error modifying ' + mapper_id + '\n' + res.toprettyxml()
- return err_msg
- module_r = None
- for node in res.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == 'module':
- module_r = node
- if module_r == None:
- raise 'missing <module/> in <batch/>'
- if module_r.getAttribute('status') != '0':
- raise 'error retrieving storage report'
- resp_r = None
- for node in module_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == RESPONSE_TAG:
- resp_r = node
- if resp_r == None:
- raise 'missing <response/> in <module/>'
- fr_r = None
- for node in resp_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == FUNC_RESP_TAG:
- fr_r = node
- if fr_r == None:
- raise 'missing <function_response/> in <response/>'
- mapper_var = None
- for node in fr_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == VARIABLE_TAG:
- if node.getAttribute('name') == 'mapper':
- mapper_var = node
- if mapper_var == None:
- raise 'missing <var name="mapper"/> in <function_response/>'
- mapper_xml = None
- for node in mapper_var.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == MAPPER_TYPE:
- mapper_xml = node.cloneNode(True)
- path = mapper_xml.getAttribute('mapper_id')
+ res = ricci.process_batch(batch, True)
+ batch_id = res.getAttribute('batch_id')
pass
- pass
-
+
elif object_type == 'mapper_template':
@@ -1388,51 +1258,10 @@
module.appendChild(req)
batch.appendChild(module)
- res = ricci.process_batch(batch, False)
- if res.getAttribute('status') != '0':
- invalidate_storage_report(request.SESSION, storagename)
- err_msg = 'Error creating new ' + mapper_type + '\n' + res.toprettyxml()
- return err_msg
- module_r = None
- for node in res.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == 'module':
- module_r = node
- if module_r == None:
- raise 'missing <module/> in <batch/>'
- if module_r.getAttribute('status') != '0':
- raise 'error retrieving storage report'
- resp_r = None
- for node in module_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == RESPONSE_TAG:
- resp_r = node
- if resp_r == None:
- raise 'missing <response/> in <module/>'
- fr_r = None
- for node in resp_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == FUNC_RESP_TAG:
- fr_r = node
- if fr_r == None:
- raise 'missing <function_response/> in <response/>'
- mapper_var = None
- for node in fr_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == VARIABLE_TAG:
- if node.getAttribute('name') == 'mapper':
- mapper_var = node
- if mapper_var == None:
- raise 'missing <var name="mapper"/> in <function_response/>'
- mapper_xml = None
- for node in mapper_var.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == 'mapper':
- mapper_xml = node.cloneNode(True)
- mapper_id = mapper_xml.getAttribute('mapper_id')
+ res = ricci.process_batch(batch, True)
+ batch_id = res.getAttribute('batch_id')
pass
- pass
-
+
@@ -1470,88 +1299,129 @@
module.appendChild(req)
batch.appendChild(module)
- #return batch.toprettyxml()
-
- res = ricci.process_batch(batch, False)
- if res.getAttribute('status') != '0':
- invalidate_storage_report(request.SESSION, storagename)
- err_msg = 'Error adding sources to ' + mapper_type + ' ' + mapper_id + '\n' + res.toprettyxml()
- return err_msg
- module_r = None
- for node in res.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == 'module':
- module_r = node
- if module_r == None:
- raise 'missing <module/> in <batch/>'
- if module_r.getAttribute('status') != '0':
- raise 'error retrieving storage report'
- resp_r = None
- for node in module_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == RESPONSE_TAG:
- resp_r = node
- if resp_r == None:
- raise 'missing <response/> in <module/>'
- fr_r = None
- for node in resp_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == FUNC_RESP_TAG:
- fr_r = node
- if fr_r == None:
- raise 'missing <function_response/> in <response/>'
- mapper_var = None
- for node in fr_r.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == VARIABLE_TAG:
- if node.getAttribute('name') == 'mapper':
- mapper_var = node
- if mapper_var == None:
- raise 'missing <var name="mapper"/> in <function_response/>'
- mapper_xml = None
- for node in mapper_var.childNodes:
- if node.nodeType == xml.dom.Node.ELEMENT_NODE:
- if node.nodeName == 'mapper':
- mapper_xml = node.cloneNode(True)
- mapper_id = mapper_xml.getAttribute('mapper_id')
+ res = ricci.process_batch(batch, True)
+ batch_id = res.getAttribute('batch_id')
pass
pass
-
-
-
-
- invalidate_storage_report(request.SESSION, storagename)
-
- goto_url = main_URL + '?storagename=' + storagename
- if object_type == 'bd_template':
- goto_url += '&pagetype=' + VIEW_BD
- goto_url += '&' + PT_PATH + '=' + path
- elif object_type == 'bd':
- if action_type == 'Remove':
- goto_url += '&pagetype=' + VIEW_MAPPER
- else:
- goto_url += '&pagetype=' + VIEW_BD
- goto_url += '&' + PT_PATH + '=' + request[PT_PATH]
- elif object_type == 'mapper':
- if action_type == 'Remove':
- goto_url += '&pagetype=' + VIEW_MAPPERS
+ if batch_id == '':
+ raise 'unsupported function'
+ else:
+ invalidate_storage_report(request.SESSION, storagename)
+ return batch_id;
+
+
+def get_storage_batch_result(self,
+ storagename,
+ ricci,
+ index_html_URL,
+ batch_id):
+ error = True # ricci reported failure or no ricci
+ completed = False # no batch, or batch done (defined if no error)
+ url = index_html_URL # redirect URL
+ msg = 'Unknown error occured'
+
+ if ricci == None:
+ # ricci down
+ error = True
+ url = url
+ msg = 'Unable to contact ' + storagename
+ else:
+ batch = 'no batch'
+ try:
+ batch = ricci.batch_report(batch_id)
+ except:
+ pass
+ if batch == 'no batch':
+ error = True
+ url = url
+ msg = 'Ricci on ' + storagename + ' responded with error. No detailed info available.'
+ elif batch == None:
+ # no such batch
+ error = False
+ completed = True
+ url += '?' + STONAME + '=' + storagename + '&' + PAGETYPE + '=' + STORAGE
+ msg = 'No such batch'
else:
- goto_url += '&pagetype=' + VIEW_MAPPER
- elif object_type == 'mapper_template':
- goto_url += '&pagetype=' + VIEW_MAPPER
- elif object_type == 'add_sources':
- goto_url += '&pagetype=' + VIEW_MAPPER
- goto_url += '&' + PT_MAPPER_TYPE + '=' + mapper_type
- goto_url += '&' + PT_MAPPER_ID + '=' + mapper_id
- redirect_html = '<head>\n'
- redirect_html += ' <meta http-equiv="Refresh" content="0;url=' + goto_url + '"/>\n'
- redirect_html += '</head>\n'
- redirect_html += '<body>\n'
- #redirect_html += 'Reloading Storage Info...\n'
- redirect_html += '</body>'
- return redirect_html
+ DEFAULT_ERROR = 'extract_module_status() failed'
+ code, err_msg = DEFAULT_ERROR, ''
+ try:
+ code, err_msg = extract_module_status(batch, 1)
+ except:
+ pass
+ if code == DEFAULT_ERROR:
+ error = True
+ url += '?' + STONAME + '=' + storagename + '&' + PAGETYPE + '=' + STORAGE
+ msg = 'Ricci on ' + storagename + ' sent malformed response'
+ elif code == -101 or code == -102:
+ # in progress
+ error = False
+ completed = False
+ msg = 'Task still in progress'
+ elif code == -103:
+ # module removed from scheduler
+ error = True
+ url += '?' + STONAME + '=' + storagename + '&' + PAGETYPE + '=' + STORAGE
+ msg = 'Ricci on ' + storagename + ' removed request from scheduler. File bug report against ricci.'
+ elif code == -104:
+ # module failure
+ error = True
+ url += '?' + STONAME + '=' + storagename + '&' + PAGETYPE + '=' + STORAGE
+ msg = 'Ricci on ' + storagename + ' failed to execute storage module; reinstall it.'
+ elif code == -2:
+ # API error
+ error = True
+ url += '?' + STONAME + '=' + storagename + '&' + PAGETYPE + '=' + STORAGE
+ msg = 'Luci server used invalid API to communicate with ' + storagename + '. File a bug report against luci.'
+ elif code == -1:
+ # undefined error
+ error = True
+ url += '?' + STONAME + '=' + storagename + '&' + PAGETYPE + '=' + STORAGE
+ msg = 'Reason for failure (as reported by ' + storagename + '): ' + err_msg
+ elif code == 0:
+ # no error
+ error = False
+ completed = True
+ # TODO: implement proper redirect
+ url = get_commit_redirect(url,
+ storagename,
+ batch)
+ msg = 'Done successfully'
+ elif code == 1:
+ # mid-air
+ error = True
+ url += '?' + STONAME + '=' + storagename + '&' + PAGETYPE + '=' + STORAGE
+ msg = 'Mid-Air collision (storage on ' + storagename + ' has changed since last probe). '
+ elif code == 2:
+ # validation error
+ error = True
+ url += '?' + STONAME + '=' + storagename + '&' + PAGETYPE + '=' + STORAGE
+ msg = 'Validation error. File bug report against Luci.'
+ elif code == 3:
+ # unmount error
+ error = True
+ url += '?' + STONAME + '=' + storagename + '&' + PAGETYPE + '=' + STORAGE
+ msg = 'Unmount failure: ' + err_msg
+ elif code == 4:
+ # clvmd error
+ error = True
+ url += '?' + STONAME + '=' + storagename + '&' + PAGETYPE + '=' + STORAGE
+ msg = 'clvmd (clustered LVM daemon) is not running on ' + storagename + '. Start it and try again.'
+ elif code == 5:
+ # not quorate
+ error = True
+ url += '?' + STONAME + '=' + storagename + '&' + PAGETYPE + '=' + STORAGE
+ msg = 'Cluster quorum is required, and yet cluster is not quorate. Start cluster, and try again.'
+ elif code > 5:
+ error = True
+ url += '?' + STONAME + '=' + storagename + '&' + PAGETYPE + '=' + STORAGE
+ msg = err_msg
+
+ return {'error' : error,
+ 'completed' : completed,
+ 'redirect_url' : url,
+ 'msg' : msg}
@@ -1561,6 +1431,74 @@
+def get_commit_redirect(main_url,
+ storagename,
+ batch_xml):
+ module_r = None
+ for node in batch_xml.childNodes:
+ if node.nodeType == xml.dom.Node.ELEMENT_NODE:
+ if node.nodeName == 'module':
+ module_r = node
+ if module_r == None:
+ raise 'missing <module/> in <batch/>'
+ resp_r = None
+ for node in module_r.childNodes:
+ if node.nodeType == xml.dom.Node.ELEMENT_NODE:
+ if node.nodeName == RESPONSE_TAG:
+ resp_r = node
+ if resp_r == None:
+ raise 'missing <response/> in <module/>'
+ fr_r = None
+ for node in resp_r.childNodes:
+ if node.nodeType == xml.dom.Node.ELEMENT_NODE:
+ if node.nodeName == FUNC_RESP_TAG:
+ fr_r = node
+ if fr_r == None:
+ raise 'missing <function_response/> in <response/>'
+ vars = {}
+ for node in fr_r.childNodes:
+ try:
+ var = parse_variable(node)
+ vars[var.get_name()] = var
+ except:
+ pass
+ pass
+
+
+ mapper_id = ''
+ mapper_type = ''
+ bd_path = ''
+ if 'mapper' in vars:
+ mapper = vars['mapper'].get_value()
+ mapper_type = mapper.getAttribute('mapper_type')
+ mapper_id = mapper.getAttribute('mapper_id')
+ if 'bd' in vars:
+ bd = vars['bd'].get_value()
+ bd_path = bd.getAttribute('path')
+ mapper_type = bd.getAttribute('mapper_type')
+ mapper_id = bd.getAttribute('mapper_id')
+
+ url = main_url + '?'
+ url += STONAME + '=' + storagename
+ if mapper_type != '':
+ url += '&' + PT_MAPPER_TYPE + '=' + mapper_type
+ if mapper_id != '':
+ url += '&' + PT_MAPPER_ID + '=' + mapper_id
+ if bd_path != '':
+ url += '&' + PT_PATH + '=' + bd_path
+
+ if mapper_type == '':
+ url += '&' + PAGETYPE + '=' + STORAGE
+ elif bd_path != '':
+ url += '&' + PAGETYPE + '=' + VIEW_BD
+ else:
+ url += '&' + PAGETYPE + '=' + VIEW_MAPPER
+
+ return url
+
+
+
+
def get_bd_data_internal(session, bd_xml, mapper_xml):
data = {}
--- conga/luci/site/luci/Extensions/Variable.py 2006/10/16 04:26:19 1.3
+++ conga/luci/site/luci/Extensions/Variable.py 2006/10/16 07:39:27 1.4
@@ -49,12 +49,12 @@
value = []
for kid in node.childNodes:
if kid.nodeType == xml.dom.Node.ELEMENT_NODE:
- value.append(kid)
+ value.append(kid.cloneNode(True))
return VariableList(attrs_dir['name'], value, mods, VARIABLE_TYPE_LIST_XML)
elif attrs_dir['type'] == VARIABLE_TYPE_XML:
for kid in node.childNodes:
if kid.nodeType == xml.dom.Node.ELEMENT_NODE:
- value = kid
+ value = kid.cloneNode(True)
break
elif attrs_dir['type'] == VARIABLE_TYPE_INT:
value = int(attrs_dir['value'])
--- conga/luci/site/luci/Extensions/ricci_communicator.py 2006/10/16 04:26:19 1.8
+++ conga/luci/site/luci/Extensions/ricci_communicator.py 2006/10/16 07:39:27 1.9
@@ -297,7 +297,7 @@
# -102 - scheduled
# -103 - removed from schedule
# -104 - failed to execute module
-#
+#
# >-3 - module executed. Following codes are defined:
# -2 - API error
# -1 - undefined error occured (msg not necesarily very informative)
/cvs/cluster/conga/luci/storage/check-batch,v --> standard output
revision 1.1
--- conga/luci/storage/check-batch
+++ - 2006-10-16 07:39:28.551973000 +0000
@@ -0,0 +1,60 @@
+<span tal:omit-tag=""
+ tal:define="global storagename request/storagename;
+ global batch_id request/batch_id"/>
+<span tal:omit-tag=""
+ tal:define="stosystemss context/systems/storage/objectItems;
+ global allowed_systems python:here.allowed_systems(user, stosystemss);
+ global access_to_host_allowed python:here.access_to_host_allowed(storagename, allowed_systems)"/>
+<span tal:omit-tag=""
+ tal:define="global ricci python:here.get_ricci_communicator(storagename, allowed_systems)"/>
+
+
+
+<span tal:omit-tag=""
+ tal:condition="not: access_to_host_allowed">
+FAILURE
+<span tal:replace="structure context/storage/index_html/absolute_url"/>
+You are not authorized to modify storage system <span tal:replace="structure storagename"/>!!!
+</span>
+
+
+<span tal:omit-tag=""
+ tal:condition="access_to_host_allowed">
+ <span tal:omit-tag=""
+ tal:define="index_html_URL context/storage/index_html/absolute_url;
+ dummy python:here.get_storage_batch_result(storagename, ricci, index_html_URL, batch_id);
+ error dummy/error;
+ completed dummy/completed;
+ redirect_url dummy/redirect_url;
+ msg dummy/msg">
+
+ <span tal:omit-tag=""
+ tal:condition="not: error">
+ <span tal:omit-tag=""
+ tal:condition="completed">
+DONE
+<span tal:replace="structure redirect_url"/>
+<span tal:replace="structure msg"/>
+ </span>
+
+ <span tal:omit-tag=""
+ tal:condition="not: completed">
+NOT_DONE
+<span tal:replace="structure redirect_url"/>
+<span tal:replace="structure msg"/>
+ </span>
+ </span>
+
+
+ <span tal:omit-tag=""
+ tal:condition="error">
+FAILURE
+<span tal:replace="structure redirect_url"/>
+<span tal:replace="structure msg"/>
+ </span>
+
+
+
+
+ </span>
+</span>
--- conga/luci/storage/form-macros 2006/10/15 22:34:54 1.14
+++ conga/luci/storage/form-macros 2006/10/16 07:39:27 1.15
@@ -99,6 +99,87 @@
<div metal:define-macro="commit-changes">
+ <span tal:omit-tag=""
+ tal:define="batch_id python:here.apply(ricci, storage_report, request);
+ check_URL context/storage/check-batch/absolute_url;
+ check_url python:check_URL + '?storagename=' + storagename + '&batch_id=' + batch_id">
+ <div metal:use-macro="here/form-macros/macros/display-commiting-changes"/>
+ <form id="urls_form">
+ <input tal:attributes="type string:hidden;
+ name string:check_url;
+ value check_url"/>
+ </form>
+ </span>
+
+
+<script language="javascript" type="text/javascript">
+
+function strip_left(txt) {
+ for (i=0; i<txt.length; i++) {
+ if (txt[i] == " " || txt[i] == "\n")
+ continue;
+ return txt.substr(i);
+ }
+ return txt;
+}
+function check_batch_callback() {
+ if (xmlHttp_object.readyState == 4) {
+ var err_url = (window.location + '').split("?")[1].split("&");
+ for (i=0; i<err_url.length; i++) {
+ var t = err_url[i];
+ if (t.indexOf("storagename=") == 0) {
+ err_url = './?' + t + '&pagetype=44';
+ break;
+ }
+ }
+ if (xmlHttp_object.status == 200) {
+ var msg = xmlHttp_object.responseText;
+ msg = strip_left(msg);
+ var res = msg.split('\n');
+ if (res[0] == "DONE") {
+ window.location = res[1];
+ } else if (res[0] == "NOT_DONE") {
+ setTimeout("initiate_check_batch()", 3000);
+ } else {
+ var m = '';
+ if (res[0] == "FAILURE") {
+ err_url = res[1];
+ m = res[2];
+ } else {
+ m = msg;
+ }
+ alert('An error has occured while commiting changes:\n\n' + m);
+ window.location = err_url;
+ }
+ } else {
+ alert("Error retrieving data from Luci server:\n\nTransfer error:\nStorage server might (not) have completed successfuly.\nVerify by yourself.");
+ window.location = err_url;
+ }
+ }
+}
+function initiate_check_batch() {
+ form = document.getElementById("urls_form");
+ for (i=0; i<form.length; i++) {
+ elem = form.elements[i];
+ name = elem.name;
+ value = elem.value;
+ if (name == 'check_url') {
+ initiate_async_get(value, check_batch_callback);
+ return;
+ }
+ }
+}
+setTimeout("initiate_check_batch()", 1000);
+
+</script>
+
+</div>
+
+
+
+
+
+<div metal:define-macro="display-commiting-changes">
<table style="width: 100%;">
<tr>
<td align="center">
@@ -111,11 +192,6 @@
</td>
</tr>
</table>
-
- <span tal:define="main_URL context/storage/index_html/absolute_url"
- tal:replace="structure python:here.apply(ricci, storage_report, request, main_URL)">
- here.apply() response
- </span>
</div>
More information about the Cluster-devel
mailing list