blob: c880dd3ebf639bab077ec0fd4a633bfeaf7a8cf4 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
''' query_operator_unittest.py '''
# pylint: disable=too-many-lines, missing-docstring, too-many-public-methods, undefined-variable
# over 500 bad indentation errors so disable
# pylint: disable=bad-continuation
# pylint: disable=unused-argument, unused-variable
import tornado.concurrent
import tornado.gen
import tornado.testing
from mock import patch, Mock
from heron.tools.tracker.src.python.query_operators import *
class QueryOperatorTests(tornado.testing.AsyncTestCase):
@tornado.testing.gen_test
def test_TS_execute(self):
ts = TS(["a", "b", "c"])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Return mocked timeline
@tornado.gen.coroutine
def getMetricTimelineSideEffect(*args):
self.assertEqual((tmaster, "a", ["c"], ["b"], 40, 360), args)
raise tornado.gen.Return({
"starttime": 40,
"endtime": 360,
"component": "a",
"timeline": {
"c": {
"b": {
40: "1.0",
100: "1.0",
160: "1.0",
220: "1.0",
280: "1.0",
340: "1.0"
}
}
}
})
with patch("heron.tools.tracker.src.python.query_operators.getMetricsTimeline",
side_effect=getMetricTimelineSideEffect):
metrics = yield ts.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertEqual("b", metrics[0].instance)
self.assertEqual("c", metrics[0].metricName)
self.assertEqual("a", metrics[0].componentName)
self.assertDictEqual({
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_TS_execute_when_no_timeline(self):
ts = TS(["a", "b", "c"])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# If no timeline is returned
@tornado.gen.coroutine
def getMetricTimelineSideEffect(*args):
self.assertEqual((tmaster, "a", ["c"], ["b"], 40, 360), args)
raise tornado.gen.Return({
"message": "some_exception"
})
# pylint: disable=unused-variable
with self.assertRaises(Exception):
with patch("heron.tools.tracker.src.python.query_operators.getMetricsTimeline",
side_effect=getMetricTimelineSideEffect):
metrics = yield ts.execute(tracker, tmaster, start, end)
@tornado.testing.gen_test
def test_TS_execute_with_multiple_instances(self):
ts = TS(["a", "b", "c"])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# With multiple instances
@tornado.gen.coroutine
def getMetricTimelineSideEffect(*args):
self.assertEqual((tmaster, "a", ["c"], [], 40, 360), args)
raise tornado.gen.Return({
"starttime": 40,
"endtime": 360,
"component": "a",
"timeline": {
"c": {
"b": {
40: "1.0",
100: "1.0",
# 160: "1.0", # This value is missing
220: "1.0",
280: "1.0",
340: "1.0"
},
"d": {
40: "2.0",
100: "2.0",
160: "2.0",
220: "2.0",
280: "2.0",
340: "2.0"
}
}
}
})
# pylint: disable=unused-variable
with patch("heron.tools.tracker.src.python.query_operators.getMetricsTimeline",
side_effect=getMetricTimelineSideEffect):
ts = TS(["a", "*", "c"])
metrics = yield ts.execute(tracker, tmaster, start, end)
self.assertEqual(2, len(metrics))
metric1 = metrics[0]
metric2 = metrics[1]
for metric in metrics:
if metric.instance == "b":
self.assertEqual("c", metric.metricName)
self.assertEqual("a", metric.componentName)
self.assertDictEqual({
# 120: 1.0, # Missing value is not reported
180: 1.0,
240: 1.0,
300: 1.0
}, metric.timeline)
elif metric.instance == "d":
self.assertEqual("c", metric.metricName)
self.assertEqual("a", metric.componentName)
self.assertDictEqual({
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0
}, metric.timeline)
else:
self.fail("Wrong metrics generated by TS.execute")
@tornado.testing.gen_test
def test_DEFAULT_execute(self):
ts = Mock()
default = Default([float(0), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Return mocked timeline
@tornado.gen.coroutine
def ts_side_effect(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0,
})
])
ts.execute.side_effect = ts_side_effect
metrics = yield default.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertEqual("instance", metrics[0].instance)
self.assertEqual("metricName", metrics[0].metricName)
self.assertEqual("component", metrics[0].componentName)
self.assertDictEqual({
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_DEFAULT_execute_when_exception(self):
ts = Mock()
default = Default([float(0), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# In case of exception
@tornado.gen.coroutine
def ts_side_effect2(*args):
raise Exception("some_exception")
ts.execute.side_effect = ts_side_effect2
with self.assertRaises(Exception):
metrics = yield default.execute(tracker, tmaster, start, end)
@tornado.testing.gen_test
def test_DEFAULT_execute_when_missing_value(self):
ts = Mock()
default = Default([float(0), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# When missing a value
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
180: 1.0,
240: 1.0,
300: 1.0,
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield default.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertEqual("instance", metrics[0].instance)
self.assertEqual("metricName", metrics[0].metricName)
self.assertEqual("component", metrics[0].componentName)
self.assertDictEqual({
120: 0, # Missing value filled
180: 1.0,
240: 1.0,
300: 1.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_DEFAULT_execute_with_multiple_ts(self):
ts = Mock()
default = Default([float(0), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Multiple timelines missing some values
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
# 120: 1.0, # Missing
180: 1.0,
240: 1.0,
300: 1.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 2.0,
# 180: 2.0, # Missing
240: 2.0,
# 300: 2.0, # Missing
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield default.execute(tracker, tmaster, start, end)
self.assertEqual(2, len(metrics))
for metric in metrics:
if metric.instance == "instance":
self.assertEqual("instance", metric.instance)
self.assertEqual("metricName", metric.metricName)
self.assertEqual("component", metric.componentName)
self.assertDictEqual({
120: 0, # Filled
180: 1.0,
240: 1.0,
300: 1.0
}, metric.timeline)
elif metric.instance == "instance2":
self.assertEqual("instance2", metric.instance)
self.assertEqual("metricName", metric.metricName)
self.assertEqual("component", metric.componentName)
self.assertDictEqual({
120: 2.0,
180: 0, # Filled
240: 2.0,
300: 0 # Filled
}, metric.timeline)
else:
self.fail("Wrong metrics generated by TS.execute")
@tornado.testing.gen_test
def test_SUM_execute(self):
ts = Mock()
operator = Sum([float(10), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Return mocked timeline
@tornado.gen.coroutine
def ts_side_effect(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0,
})
])
ts.execute.side_effect = ts_side_effect
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertDictEqual({
120: 11.0,
180: 11.0,
240: 11.0,
300: 11.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_SUM_execute_when_exception(self):
ts = Mock()
operator = Sum([float(10), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# In case of exception
@tornado.gen.coroutine
def ts_side_effect2(*args):
raise Exception("some_exception")
ts.execute.side_effect = ts_side_effect2
with self.assertRaises(Exception):
metrics = yield operator.execute(tracker, tmaster, start, end)
@tornado.testing.gen_test
def test_SUM_execute_when_missing_value(self):
ts = Mock()
operator = Sum([float(10), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# When missing a value
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
180: 1.0,
240: 1.0,
300: 1.0,
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertDictEqual({
120: 10, # Missing value filled
180: 11.0,
240: 11.0,
300: 11.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_SUM_execute_with_multiple_ts(self):
ts = Mock()
operator = Sum([float(10), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Multiple timelines missing some values
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
# 120: 1.0, # Missing
180: 1.0,
240: 1.0,
300: 1.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertDictEqual({
120: 12.0,
180: 13.0,
240: 13.0,
300: 13.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_MAX_execute(self):
ts = Mock()
operator = Max([ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Return mocked timeline
@tornado.gen.coroutine
def ts_side_effect(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0,
})
])
ts.execute.side_effect = ts_side_effect
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertDictEqual({
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_MAX_execute_when_exception(self):
ts = Mock()
operator = Max([ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# In case of exception
@tornado.gen.coroutine
def ts_side_effect2(*args):
raise Exception("some_exception")
ts.execute.side_effect = ts_side_effect2
with self.assertRaises(Exception):
metrics = yield operator.execute(tracker, tmaster, start, end)
@tornado.testing.gen_test
def test_MAX_execute_when_missing_values(self):
ts = Mock()
operator = Max([ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# When missing a value
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
180: 1.0,
240: 1.0,
300: 1.0,
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertDictEqual({
180: 1.0,
240: 1.0,
300: 1.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_MAX_execute_with_multiple_ts(self):
ts = Mock()
operator = Max([ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Multiple timelines missing some values
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
# 120: 1.0, # Missing
180: 1.0,
240: 3.0,
300: 3.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 2.0,
180: 0.0,
240: 2.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertDictEqual({
120: 2.0,
180: 1.0,
240: 3.0,
300: 5.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_PERCENTILE_execute(self):
ts = Mock()
operator = Percentile([float(90), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Return mocked timeline
@tornado.gen.coroutine
def ts_side_effect(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0,
})
])
ts.execute.side_effect = ts_side_effect
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertDictEqual({
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_PERCENTILE_execute_when_exception(self):
ts = Mock()
operator = Percentile([float(90), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# In case of exception
@tornado.gen.coroutine
def ts_side_effect2(*args):
raise Exception("some_exception")
ts.execute.side_effect = ts_side_effect2
with self.assertRaises(Exception):
metrics = yield operator.execute(tracker, tmaster, start, end)
@tornado.testing.gen_test
def test_PERCENTILE_execute_when_missing_values(self):
ts = Mock()
operator = Percentile([float(90), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# When missing a value
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
180: 1.0,
240: 1.0,
300: 1.0,
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertDictEqual({
180: 1.0,
240: 1.0,
300: 1.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_PERCENTILE_execute_with_multiple_ts(self):
ts = Mock()
operator = Percentile([float(90), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Multiple timelines missing some values
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 4.0,
240: 6.0,
300: 3.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 2.0,
180: 5.0,
240: 5.0,
300: 5.0,
}),
Metrics("component", "metricName", "instance3", start, end, {
120: 4.0,
180: 6.0,
240: 4.0,
300: 4.0,
}),
Metrics("component", "metricName", "instance4", start, end, {
120: 3.0,
180: 7.0,
240: 3.0,
300: 6.0,
}),
Metrics("component", "metricName", "instance5", start, end, {
120: 5.0,
180: 8.0,
240: 2.0,
300: 7.0,
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertDictEqual({
120: 4.0,
180: 7.0,
240: 5.0,
300: 6.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_DIVIDE_execute(self):
ts = Mock()
operator = Divide([float(100), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Return mocked timeline
@tornado.gen.coroutine
def ts_side_effect(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 2.0,
240: 4.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertEqual("instance", metrics[0].instance)
self.assertDictEqual({
120: 100.0,
180: 50.0,
240: 25.0,
300: 20.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_DIVIDE_execute_when_exception(self):
ts = Mock()
operator = Divide([float(100), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# In case of exception
@tornado.gen.coroutine
def ts_side_effect2(*args):
raise Exception("some_exception")
ts.execute.side_effect = ts_side_effect2
with self.assertRaises(Exception):
metrics = yield operator.execute(tracker, tmaster, start, end)
@tornado.testing.gen_test
def test_DIVIDE_execute_when_missing_values(self):
ts = Mock()
operator = Divide([float(100), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# When missing a value
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
180: 2.0,
240: 4.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertEqual("instance", metrics[0].instance)
self.assertDictEqual({
180: 50.0,
240: 25.0,
300: 20.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_DIVIDE_execute_with_multiple_ts(self):
ts = Mock()
ts2 = Mock()
operator = Divide([ts, ts2])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Multiple timelines
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance3", start, end, {
120: 3.0,
180: 3.0,
240: 3.0,
300: 3.0,
}),
Metrics("component", "metricName", "instance4", start, end, {
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
}),
Metrics("component", "metricName", "instance5", start, end, {
120: 5.0,
180: 5.0,
240: 5.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect3
@tornado.gen.coroutine
def ts_side_effect4(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
}),
Metrics("component", "metricName", "instance3", start, end, {
120: 6.0,
180: 6.0,
240: 6.0,
300: 6.0,
}),
Metrics("component", "metricName", "instance4", start, end, {
120: 8.0,
180: 8.0,
240: 8.0,
300: 8.0,
}),
Metrics("component", "metricName", "instance5", start, end, {
120: 10.0,
180: 10.0,
240: 10.0,
300: 10.0,
})
])
ts2.execute.side_effect = ts_side_effect4
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(5, len(metrics))
for metric in metrics:
# All should have same value - 0.5
self.assertDictEqual({
120: 0.5,
180: 0.5,
240: 0.5,
300: 0.5
}, metric.timeline)
@tornado.testing.gen_test
def test_DIVIDE_execute_with_mulitiple_ts_when_instances_do_not_match(self):
ts = Mock()
ts2 = Mock()
operator = Divide([ts, ts2])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Multiple timelines
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance3", start, end, {
120: 3.0,
180: 3.0,
240: 3.0,
300: 3.0,
}),
Metrics("component", "metricName", "instance4", start, end, {
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
}),
Metrics("component", "metricName", "instance5", start, end, {
120: 5.0,
180: 5.0,
240: 5.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect3
# When instances do not match
@tornado.gen.coroutine
def ts_side_effect4(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
})
])
ts2.execute.side_effect = ts_side_effect4
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(2, len(metrics))
instances = []
for metric in metrics:
instances.append(metric.instance)
self.assertDictEqual({
120: 0.5,
180: 0.5,
240: 0.5,
300: 0.5
}, metric.timeline)
self.assertTrue("instance" in instances and "instance2" in instances)
@tornado.testing.gen_test
def test_MULTIPLY_execute(self):
ts = Mock()
operator = Multiply([float(100), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Return mocked timeline
@tornado.gen.coroutine
def ts_side_effect(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 2.0,
240: 4.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertEqual("instance", metrics[0].instance)
self.assertDictEqual({
120: 100.0,
180: 200.0,
240: 400.0,
300: 500.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_MULTIPLY_execute_when_exception(self):
ts = Mock()
operator = Multiply([float(100), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# In case of exception
@tornado.gen.coroutine
def ts_side_effect2(*args):
raise Exception("some_exception")
ts.execute.side_effect = ts_side_effect2
with self.assertRaises(Exception):
metrics = yield operator.execute(tracker, tmaster, start, end)
@tornado.testing.gen_test
def test_MULTIPLY_execute_when_missing_values(self):
ts = Mock()
operator = Multiply([float(100), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# When missing a value
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
180: 2.0,
240: 4.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertEqual("instance", metrics[0].instance)
self.assertDictEqual({
180: 200.0,
240: 400.0,
300: 500.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_MULTIPLY_execute_with_multiple_ts(self):
ts = Mock()
ts2 = Mock()
operator = Multiply([ts, ts2])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Multiple timelines
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance3", start, end, {
120: 3.0,
180: 3.0,
240: 3.0,
300: 3.0,
}),
Metrics("component", "metricName", "instance4", start, end, {
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
}),
Metrics("component", "metricName", "instance5", start, end, {
120: 5.0,
180: 5.0,
240: 5.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect3
@tornado.gen.coroutine
def ts_side_effect4(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
}),
Metrics("component", "metricName", "instance3", start, end, {
120: 6.0,
180: 6.0,
240: 6.0,
300: 6.0,
}),
Metrics("component", "metricName", "instance4", start, end, {
120: 8.0,
180: 8.0,
240: 8.0,
300: 8.0,
}),
Metrics("component", "metricName", "instance5", start, end, {
120: 10.0,
180: 10.0,
240: 10.0,
300: 10.0,
})
])
ts2.execute.side_effect = ts_side_effect4
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(5, len(metrics))
for metric in metrics:
if metric.instance == "instance":
self.assertDictEqual({
120: 2,
180: 2,
240: 2,
300: 2
}, metric.timeline)
elif metric.instance == "instance2":
self.assertDictEqual({
120: 8,
180: 8,
240: 8,
300: 8
}, metric.timeline)
elif metric.instance == "instance3":
self.assertDictEqual({
120: 18,
180: 18,
240: 18,
300: 18
}, metric.timeline)
elif metric.instance == "instance4":
self.assertDictEqual({
120: 32,
180: 32,
240: 32,
300: 32
}, metric.timeline)
elif metric.instance == "instance5":
self.assertDictEqual({
120: 50,
180: 50,
240: 50,
300: 50
}, metric.timeline)
@tornado.testing.gen_test
def test_MULTIPLY_execute_with_multiple_ts_when_instances_do_not_match(self):
ts = Mock()
ts2 = Mock()
operator = Multiply([ts, ts2])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Multiple timelines
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance3", start, end, {
120: 3.0,
180: 3.0,
240: 3.0,
300: 3.0,
}),
Metrics("component", "metricName", "instance4", start, end, {
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
}),
Metrics("component", "metricName", "instance5", start, end, {
120: 5.0,
180: 5.0,
240: 5.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect3
# When instances do not match
@tornado.gen.coroutine
def ts_side_effect4(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
})
])
ts2.execute.side_effect = ts_side_effect4
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(2, len(metrics))
instances = []
for metric in metrics:
instances.append(metric.instance)
if metric.instance == "instance":
self.assertDictEqual({
120: 2,
180: 2,
240: 2,
300: 2
}, metric.timeline)
elif metric.instance == "instance2":
self.assertDictEqual({
120: 8,
180: 8,
240: 8,
300: 8
}, metric.timeline)
self.assertTrue("instance" in instances and "instance2" in instances)
@tornado.testing.gen_test
def test_SUBTRACT_execute(self):
ts = Mock()
operator = Subtract([float(100), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Return mocked timeline
@tornado.gen.coroutine
def ts_side_effect(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 2.0,
240: 4.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertEqual("instance", metrics[0].instance)
self.assertDictEqual({
120: 99.0,
180: 98.0,
240: 96.0,
300: 95.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_SUBTRACT_execute_when_exception(self):
ts = Mock()
operator = Subtract([float(100), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# In case of exception
@tornado.gen.coroutine
def ts_side_effect2(*args):
raise Exception("some_exception")
ts.execute.side_effect = ts_side_effect2
with self.assertRaises(Exception):
metrics = yield operator.execute(tracker, tmaster, start, end)
@tornado.testing.gen_test
def test_SUBTRACT_execute_when_missing_values(self):
ts = Mock()
operator = Subtract([float(100), ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# When missing a value
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
180: 2.0,
240: 4.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertEqual("instance", metrics[0].instance)
self.assertDictEqual({
180: 98.0,
240: 96.0,
300: 95.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_SUBTRACT_execute_with_multiple_ts(self):
ts = Mock()
ts2 = Mock()
operator = Subtract([ts, ts2])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Multiple timelines
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance3", start, end, {
120: 3.0,
180: 3.0,
240: 3.0,
300: 3.0,
}),
Metrics("component", "metricName", "instance4", start, end, {
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
}),
Metrics("component", "metricName", "instance5", start, end, {
120: 5.0,
180: 5.0,
240: 5.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect3
@tornado.gen.coroutine
def ts_side_effect4(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
}),
Metrics("component", "metricName", "instance3", start, end, {
120: 6.0,
180: 6.0,
240: 6.0,
300: 6.0,
}),
Metrics("component", "metricName", "instance4", start, end, {
120: 8.0,
180: 8.0,
240: 8.0,
300: 8.0,
}),
Metrics("component", "metricName", "instance5", start, end, {
120: 10.0,
180: 10.0,
240: 10.0,
300: 10.0,
})
])
ts2.execute.side_effect = ts_side_effect4
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(5, len(metrics))
for metric in metrics:
if metric.instance == "instance":
self.assertDictEqual({
120: -1,
180: -1,
240: -1,
300: -1
}, metric.timeline)
elif metric.instance == "instance2":
self.assertDictEqual({
120: -2,
180: -2,
240: -2,
300: -2
}, metric.timeline)
elif metric.instance == "instance3":
self.assertDictEqual({
120: -3,
180: -3,
240: -3,
300: -3
}, metric.timeline)
elif metric.instance == "instance4":
self.assertDictEqual({
120: -4,
180: -4,
240: -4,
300: -4
}, metric.timeline)
elif metric.instance == "instance5":
self.assertDictEqual({
120: -5,
180: -5,
240: -5,
300: -5
}, metric.timeline)
@tornado.testing.gen_test
def test_SUBTRACT_execute_with_multiple_ts_when_instances_do_not_match(self):
ts = Mock()
ts2 = Mock()
operator = Subtract([ts, ts2])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Multiple timelines
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance3", start, end, {
120: 3.0,
180: 3.0,
240: 3.0,
300: 3.0,
}),
Metrics("component", "metricName", "instance4", start, end, {
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
}),
Metrics("component", "metricName", "instance5", start, end, {
120: 5.0,
180: 5.0,
240: 5.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect3
# When instances do not match
@tornado.gen.coroutine
def ts_side_effect4(*args):
self.assertEqual((tracker, tmaster, 100, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start, end, {
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance2", start, end, {
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
})
])
ts2.execute.side_effect = ts_side_effect4
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(2, len(metrics))
instances = []
for metric in metrics:
instances.append(metric.instance)
if metric.instance == "instance":
self.assertDictEqual({
120: -1,
180: -1,
240: -1,
300: -1
}, metric.timeline)
elif metric.instance == "instance2":
self.assertDictEqual({
120: -2,
180: -2,
240: -2,
300: -2
}, metric.timeline)
self.assertTrue("instance" in instances and "instance2" in instances)
@tornado.testing.gen_test
def test_RATE_execute(self):
ts = Mock()
operator = Rate([ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Return mocked timeline
@tornado.gen.coroutine
def ts_side_effect(*args):
self.assertEqual((tracker, tmaster, 40, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start-60, end, {
60: 0.0,
120: 1.0,
180: 2.0,
240: 4.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertEqual("instance", metrics[0].instance)
self.assertDictEqual({
120: 1.0,
180: 1.0,
240: 2.0,
300: 1.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_RATE_execute_when_exception(self):
ts = Mock()
operator = Rate([ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# In case of exception
@tornado.gen.coroutine
def ts_side_effect2(*args):
raise Exception("some_exception")
ts.execute.side_effect = ts_side_effect2
with self.assertRaises(Exception):
metrics = yield operator.execute(tracker, tmaster, start, end)
@tornado.testing.gen_test
def test_RATE_execute_when_missing_values(self):
ts = Mock()
operator = Rate([ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# When missing a value
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 40, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start-60, end, {
60: 0.0,
# 120: 1.0, # Missing
180: 2.0,
240: 4.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(1, len(metrics))
self.assertEqual("instance", metrics[0].instance)
self.assertDictEqual({
# 180: 2.0, # Won't be there since 120 is missing
240: 2.0,
300: 1.0
}, metrics[0].timeline)
@tornado.testing.gen_test
def test_RATE_execute_with_multiple_ts(self):
ts = Mock()
operator = Rate([ts])
tmaster = Mock()
tracker = Mock()
start = 100
end = 300
# Multiple timelines
@tornado.gen.coroutine
def ts_side_effect3(*args):
self.assertEqual((tracker, tmaster, 40, 300), args)
raise tornado.gen.Return([
Metrics("component", "metricName", "instance", start-60, end, {
60: 0.0,
120: 1.0,
180: 1.0,
240: 1.0,
300: 1.0,
}),
Metrics("component", "metricName", "instance2", start-60, end, {
60: 0.0,
120: 2.0,
180: 2.0,
240: 2.0,
300: 2.0,
}),
Metrics("component", "metricName", "instance3", start-60, end, {
60: 0.0,
120: 3.0,
180: 3.0,
240: 3.0,
300: 3.0,
}),
Metrics("component", "metricName", "instance4", start-60, end, {
60: 0.0,
120: 4.0,
180: 4.0,
240: 4.0,
300: 4.0,
}),
Metrics("component", "metricName", "instance5", start-60, end, {
60: 0.0,
120: 5.0,
180: 5.0,
240: 5.0,
300: 5.0,
})
])
ts.execute.side_effect = ts_side_effect3
metrics = yield operator.execute(tracker, tmaster, start, end)
self.assertEqual(5, len(metrics))
for metric in metrics:
if metric.instance == "instance":
self.assertDictEqual({
120: 1,
180: 0,
240: 0,
300: 0
}, metric.timeline)
elif metric.instance == "instance2":
self.assertDictEqual({
120: 2,
180: 0,
240: 0,
300: 0
}, metric.timeline)
elif metric.instance == "instance3":
self.assertDictEqual({
120: 3,
180: 0,
240: 0,
300: 0
}, metric.timeline)
elif metric.instance == "instance4":
self.assertDictEqual({
120: 4,
180: 0,
240: 0,
300: 0
}, metric.timeline)
elif metric.instance == "instance5":
self.assertDictEqual({
120: 5,
180: 0,
240: 0,
300: 0
}, metric.timeline)