Allow filter alarms with query including '/'
For example: mount_point=/ Django can't handle encoded URI correctly, so this implementation uses base64url. And allow filter alarms with dimensions having only key. Change-Id: Ie23403278d4791c702abffd855cf0682510ac153
This commit is contained in:
parent
a181c1cc34
commit
2ef9661ffd
@ -23,14 +23,19 @@
|
|||||||
var dimension = document.forms["form1"]["dimension"].value;
|
var dimension = document.forms["form1"]["dimension"].value;
|
||||||
var metric = document.forms["form1"]["metric"].value;
|
var metric = document.forms["form1"]["metric"].value;
|
||||||
var location = "{{ alarm_url }}";
|
var location = "{{ alarm_url }}";
|
||||||
|
var param = '';
|
||||||
if (!isEmpty(metric)) {
|
if (!isEmpty(metric)) {
|
||||||
location = location + "metric=" + metric;
|
param = 'metric=' + metric;
|
||||||
if (!isEmpty(dimension)) {
|
if (!isEmpty(dimension)) {
|
||||||
location = location + ",";
|
param = param + ',';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!isEmpty(dimension)) {
|
if (!isEmpty(dimension)) {
|
||||||
location = location + dimension;
|
param = param + dimension;
|
||||||
|
}
|
||||||
|
if (!isEmpty(param)) {
|
||||||
|
param = btoa(param).replace(/\+/g, '-').replace(/\//g, '_');
|
||||||
|
location = location + 'b64:' + param;
|
||||||
}
|
}
|
||||||
window.location = location;
|
window.location = location;
|
||||||
}
|
}
|
||||||
@ -48,7 +53,7 @@
|
|||||||
<hr>
|
<hr>
|
||||||
<form method="GET" class="form-group" style="width:400px" onsubmit="sendDimensions()" name="form1">
|
<form method="GET" class="form-group" style="width:400px" onsubmit="sendDimensions()" name="form1">
|
||||||
<h3>{% trans 'Dimension(s)' %}</h3>
|
<h3>{% trans 'Dimension(s)' %}</h3>
|
||||||
{% trans 'Key' %}:{% trans 'Value' %}
|
{% trans 'Key' %}[={% trans 'Value' %}]
|
||||||
<input class="form-control" name="dimension" placeholder="hostname=devstack, service=mysql" data-toggle="tooltip" data-placement="right" title="Example: hostname=devstack, service=mysql">
|
<input class="form-control" name="dimension" placeholder="hostname=devstack, service=mysql" data-toggle="tooltip" data-placement="right" title="Example: hostname=devstack, service=mysql">
|
||||||
<br />
|
<br />
|
||||||
{% trans 'Metric Name' %}: <input class="form-control" name="metric" placeholder="http_status">
|
{% trans 'Metric Name' %}: <input class="form-control" name="metric" placeholder="http_status">
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import base64
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
@ -157,6 +158,9 @@ class AlarmServiceView(tables.DataTableView):
|
|||||||
return results
|
return results
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
|
if self.service[:3] == 'b64':
|
||||||
|
name, value = self.service.split(":")
|
||||||
|
self.service = base64.urlsafe_b64decode(str(value))
|
||||||
results = api.monitor.alarm_list_by_dimension(self.request,
|
results = api.monitor.alarm_list_by_dimension(self.request,
|
||||||
self.service,
|
self.service,
|
||||||
page_offset,
|
page_offset,
|
||||||
|
@ -70,11 +70,14 @@ def alarm_list_by_dimension(request, dimensions, offset=0, limit=10000,
|
|||||||
dimensions = dimensions.replace(" ", "")
|
dimensions = dimensions.replace(" ", "")
|
||||||
dimensions = dimensions.split(",")
|
dimensions = dimensions.split(",")
|
||||||
for item in dimensions:
|
for item in dimensions:
|
||||||
name, value = item.split("=")
|
if '=' in item:
|
||||||
if name == 'metric':
|
name, value = item.split('=')
|
||||||
metric = value
|
if name == 'metric':
|
||||||
|
metric = value
|
||||||
|
else:
|
||||||
|
dim_dict[name] = value
|
||||||
else:
|
else:
|
||||||
dim_dict[name] = value
|
dim_dict[item] = None
|
||||||
if metric:
|
if metric:
|
||||||
result = monascaclient(request).alarms.list(offset=offset, limit=limit,
|
result = monascaclient(request).alarms.list(offset=offset, limit=limit,
|
||||||
metric_dimensions=dim_dict,
|
metric_dimensions=dim_dict,
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import base64
|
||||||
import copy
|
import copy
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
@ -203,9 +204,12 @@ def generate_status(request):
|
|||||||
group_alarms.append(a)
|
group_alarms.append(a)
|
||||||
services = []
|
services = []
|
||||||
for group, group_alarms in alarms_by_group.items():
|
for group, group_alarms in alarms_by_group.items():
|
||||||
|
name = '%s=%s' % (row['groupBy'], group)
|
||||||
|
# Encode as base64url to be able to include '/'
|
||||||
|
name = 'b64:' + base64.urlsafe_b64encode(name)
|
||||||
service = {
|
service = {
|
||||||
'display': group,
|
'display': group,
|
||||||
'name': "%s=%s" % (row['groupBy'], group),
|
'name': name,
|
||||||
'class': get_status(group_alarms)
|
'class': get_status(group_alarms)
|
||||||
}
|
}
|
||||||
service['icon'] = get_icon(service['class'])
|
service['icon'] = get_icon(service['class'])
|
||||||
|
Loading…
Reference in New Issue
Block a user