)]}'
{"openstack_health/run_aggregator.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"db80403cd2f74c0998f31c5ca1e2fc121888912a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    for run_at, run in run_times_time_series.items():"},{"line_number":38,"context_line":"        for build_name, run_time in list(run.items()):"},{"line_number":39,"context_line":"            if build_name in temp_dict:"},{"line_number":40,"context_line":"                temp_dict[build_name][run_at] \u003d run_time"},{"line_number":41,"context_line":"            else:"},{"line_number":42,"context_line":"                temp_dict[build_name] \u003d {run_at: run_time}"},{"line_number":43,"context_line":"    df \u003d pd.DataFrame(temp_dict)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_4608102b","line":40,"updated":"2018-08-09 18:01:09.000000000","message":"Is this the correct behavior? Doesn\u0027t this mean if we already have a record at a given timestamp for a given build_name and we encounter a second record that we just drop the one we already have.\n\nLooking at what\u0027s there before we were just ignoring the later values if there were multiple runs with the same build_name at the same timestamp.\n\nI\u0027m not sure why either approach is better than the other. Or am I just missing something?","commit_id":"a9bfd78f8dd72bce897d5a6657a70dba09f136ee"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"c05fd25ffb22333eddb1202ddb1de14cae8f87ff","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    for run_at, run in run_times_time_series.items():"},{"line_number":38,"context_line":"        for build_name, run_time in list(run.items()):"},{"line_number":39,"context_line":"            if build_name in temp_dict:"},{"line_number":40,"context_line":"                temp_dict[build_name][run_at] \u003d run_time"},{"line_number":41,"context_line":"            else:"},{"line_number":42,"context_line":"                temp_dict[build_name] \u003d {run_at: run_time}"},{"line_number":43,"context_line":"    df \u003d pd.DataFrame(temp_dict)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_a1930ea3","line":40,"in_reply_to":"3f79a3b5_4608102b","updated":"2018-08-09 18:13:32.000000000","message":"I believe this case is handled in the prepare for get_numeric_data here https://review.openstack.org/#/c/584659/5/openstack_health/api.py@390 so the run_time would be the average of those two or more run_times.\n\nThe old case I thought was appropriate since the graph was only for a single build_name, the failures happen on the grouping page where more than one build_name can appear.\n\nTo make this more fail proof, we could wrap the call with a if key \u003d\u003d \u0027build_name\u0027 statement or pass in {} for the run_times_time_series parameter for that case. Eventually when we implement the job duration graph for the groups page, that safe gaurd can be removed.","commit_id":"a9bfd78f8dd72bce897d5a6657a70dba09f136ee"}],"openstack_health/tests/test_api.py":[{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"3307f41d6db48ad48f6c43f5ebeb1af6bcbeb032","unresolved":false,"context_lines":[{"line_number":824,"context_line":"                                   {u\u0027pass\u0027: 1,"},{"line_number":825,"context_line":"                                    u\u0027fail\u0027: 0,"},{"line_number":826,"context_line":"                                    u\u0027job_name\u0027: u\u0027value-1\u0027,"},{"line_number":827,"context_line":"                                   u\u0027mean_run_time\u0027: 2.0}]},"},{"line_number":828,"context_line":"                    {u\u0027datetime\u0027: u\u0027%s\u0027 % timestamp_d2.date().isoformat(),"},{"line_number":829,"context_line":"                     u\u0027job_data\u0027: [{u\u0027pass\u0027: 1,"},{"line_number":830,"context_line":"                                    u\u0027fail\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_5e884919","line":827,"range":{"start_line":827,"start_character":35,"end_line":827,"end_character":37},"updated":"2018-07-22 17:00:08.000000000","message":"surprised this wasnt caught by pep8 on my local.","commit_id":"db8c2a9246e7d1ae2df69d590a9050a383b5576e"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"1c6d4fe96ad7552705ff8fa8222ba6d324c6125d","unresolved":false,"context_lines":[{"line_number":614,"context_line":"        response_data \u003d json.loads(res.data.decode(\u0027utf-8\u0027))"},{"line_number":615,"context_line":"        # numpy.NaN \u003d\u003d numpy.NaN result is False, a key error here means the"},{"line_number":616,"context_line":"        # dicts are not equal"},{"line_number":617,"context_line":"        for project, item in list(expected_response_data[\u0027numeric\u0027].items()):"},{"line_number":618,"context_line":"            for date, run_time in list(item.items()):"},{"line_number":619,"context_line":"                if (numpy.isnan(run_time) and"},{"line_number":620,"context_line":"                    numpy.isnan(response_data[\u0027numeric\u0027][project][date])):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_99d33f64","side":"PARENT","line":617,"range":{"start_line":617,"start_character":29,"end_line":617,"end_character":33},"updated":"2018-07-23 21:23:36.000000000","message":"surprised this passed py35 ? I remember having to add this for py35, items returns an iterator and deleting from an iterator would cause an error.","commit_id":"1febf0c179682bc01e56a19e007103f65e92f0b1"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"1c6d4fe96ad7552705ff8fa8222ba6d324c6125d","unresolved":false,"context_lines":[{"line_number":613,"context_line":"                                      20.0}}}"},{"line_number":614,"context_line":"        response_data \u003d json.loads(res.data.decode(\u0027utf-8\u0027))"},{"line_number":615,"context_line":"        # numpy.NaN \u003d\u003d numpy.NaN result is False, a key error here means the"},{"line_number":616,"context_line":"        # dicts are not equal"},{"line_number":617,"context_line":"        for project, item in expected_response_data[\u0027numeric\u0027].items():"},{"line_number":618,"context_line":"            for date, run_time in list(item.items()):"},{"line_number":619,"context_line":"                if (numpy.isnan(run_time) and"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_59dda76b","line":616,"updated":"2018-07-23 21:23:36.000000000","message":"sorry, changes to this test weren\u0027t needed but this looks ok too.","commit_id":"5c18bbed13277bf1deb4087cfb7024f5ef6e85c1"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"7119d90c074ea2ad9dcc5377aceceec33fa86253","unresolved":false,"context_lines":[{"line_number":764,"context_line":"                            u\u0027mean_run_time\u0027: 20.0}]}]},"},{"line_number":765,"context_line":"            u\u0027numeric\u0027: {"},{"line_number":766,"context_line":"                u\u0027tempest-dsvm-neutron-full\u0027: {"},{"line_number":767,"context_line":"                    u\u0027%s\u0027 % timestamp_d1.isoformat(): 3.0,"},{"line_number":768,"context_line":"                    u\u0027%s\u0027 % timestamp_d2.isoformat(): 20.0}}}"},{"line_number":769,"context_line":"        response_data \u003d json.loads(res.data.decode(\u0027utf-8\u0027))"},{"line_number":770,"context_line":"        self.maxDiff \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_8ee921b8","line":767,"range":{"start_line":767,"start_character":54,"end_line":767,"end_character":57},"updated":"2018-08-13 16:06:51.000000000","message":"this result correctly averages the two passing where a passing run is, runs pass \u003e 0 and fail \u003d\u003d 0","commit_id":"a9bfd78f8dd72bce897d5a6657a70dba09f136ee"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"bce69b2bccf30b22762dcf4a926ddeaaaaf5f044","unresolved":false,"context_lines":[{"line_number":779,"context_line":"                                    \u0027run_time\u0027: 4.0,"},{"line_number":780,"context_line":"                                    \u0027metadata\u0027: {"},{"line_number":781,"context_line":"                                        \u0027build_name\u0027:"},{"line_number":782,"context_line":"                                            \u0027tempest-dsvm-neutron-full\u0027}},"},{"line_number":783,"context_line":"                                   {\u0027pass\u0027: 10,"},{"line_number":784,"context_line":"                                    \u0027fail\u0027: 1,"},{"line_number":785,"context_line":"                                    \u0027skip\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_fae1739c","line":782,"range":{"start_line":782,"start_character":44,"end_line":782,"end_character":70},"updated":"2018-08-13 13:37:52.000000000","message":"this entry has the the same build name and same timestamp as the 9.0 run_time one below.","commit_id":"a9bfd78f8dd72bce897d5a6657a70dba09f136ee"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"f4f038178b1d70fb0381c2cec1450650009aa197","unresolved":false,"context_lines":[{"line_number":824,"context_line":"                                   {u\u0027pass\u0027: 1,"},{"line_number":825,"context_line":"                                    u\u0027fail\u0027: 1,"},{"line_number":826,"context_line":"                                    u\u0027job_name\u0027: u\u0027tempest-dsvm-neutron-full\u0027,"},{"line_number":827,"context_line":"                                    u\u0027mean_run_time\u0027: 6.5}]},"},{"line_number":828,"context_line":"                    {u\u0027datetime\u0027: u\u0027%s\u0027 % timestamp_d2.date().isoformat(),"},{"line_number":829,"context_line":"                     u\u0027job_data\u0027: [{u\u0027pass\u0027: 1,"},{"line_number":830,"context_line":"                                    u\u0027fail\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_ba7a1bee","line":827,"range":{"start_line":827,"start_character":54,"end_line":827,"end_character":57},"updated":"2018-08-13 13:30:34.000000000","message":"I think this answers Matt\u0027s question, that we are not overwriting the entry. If we did, this would not be the average of the two run times.","commit_id":"a9bfd78f8dd72bce897d5a6657a70dba09f136ee"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"bce69b2bccf30b22762dcf4a926ddeaaaaf5f044","unresolved":false,"context_lines":[{"line_number":824,"context_line":"                                   {u\u0027pass\u0027: 1,"},{"line_number":825,"context_line":"                                    u\u0027fail\u0027: 1,"},{"line_number":826,"context_line":"                                    u\u0027job_name\u0027: u\u0027tempest-dsvm-neutron-full\u0027,"},{"line_number":827,"context_line":"                                    u\u0027mean_run_time\u0027: 6.5}]},"},{"line_number":828,"context_line":"                    {u\u0027datetime\u0027: u\u0027%s\u0027 % timestamp_d2.date().isoformat(),"},{"line_number":829,"context_line":"                     u\u0027job_data\u0027: [{u\u0027pass\u0027: 1,"},{"line_number":830,"context_line":"                                    u\u0027fail\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_3a57eb5a","line":827,"range":{"start_line":827,"start_character":54,"end_line":827,"end_character":57},"in_reply_to":"3f79a3b5_ba7a1bee","updated":"2018-08-13 13:37:52.000000000","message":"oh this is the wrong field i think.","commit_id":"a9bfd78f8dd72bce897d5a6657a70dba09f136ee"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"bce69b2bccf30b22762dcf4a926ddeaaaaf5f044","unresolved":false,"context_lines":[{"line_number":832,"context_line":"                                    u\u0027mean_run_time\u0027: 20.0}]}]},"},{"line_number":833,"context_line":"            u\u0027numeric\u0027: {"},{"line_number":834,"context_line":"                u\u0027tempest-dsvm-neutron-full\u0027: {"},{"line_number":835,"context_line":"                    u\u0027%s\u0027 % timestamp_d1.isoformat(): 4.0,"},{"line_number":836,"context_line":"                    u\u0027%s\u0027 % timestamp_d2.isoformat(): 20.0},"},{"line_number":837,"context_line":"                u\u0027openstack-tox-py27-trove\u0027: {"},{"line_number":838,"context_line":"                    u\u0027%s\u0027 % timestamp_d1.isoformat(): 2.0,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_5a8747b6","line":835,"range":{"start_line":835,"start_character":54,"end_line":835,"end_character":58},"updated":"2018-08-13 13:37:52.000000000","message":"and this should be 6.5 according to what is supposed to be happening. i\u0027ll look into it more, not sure why the numpy mean doesn\u0027t join the two run times here.","commit_id":"a9bfd78f8dd72bce897d5a6657a70dba09f136ee"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"7119d90c074ea2ad9dcc5377aceceec33fa86253","unresolved":false,"context_lines":[{"line_number":832,"context_line":"                                    u\u0027mean_run_time\u0027: 20.0}]}]},"},{"line_number":833,"context_line":"            u\u0027numeric\u0027: {"},{"line_number":834,"context_line":"                u\u0027tempest-dsvm-neutron-full\u0027: {"},{"line_number":835,"context_line":"                    u\u0027%s\u0027 % timestamp_d1.isoformat(): 4.0,"},{"line_number":836,"context_line":"                    u\u0027%s\u0027 % timestamp_d2.isoformat(): 20.0},"},{"line_number":837,"context_line":"                u\u0027openstack-tox-py27-trove\u0027: {"},{"line_number":838,"context_line":"                    u\u0027%s\u0027 % timestamp_d1.isoformat(): 2.0,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_0e451143","line":835,"range":{"start_line":835,"start_character":54,"end_line":835,"end_character":58},"in_reply_to":"3f79a3b5_5a8747b6","updated":"2018-08-13 16:06:51.000000000","message":"this one does not aggregate because the there is fail \u003e 1 with the entry of run_time \u003d 9 so 4.0 is accurate here.\n\nI updated this test case to see if I could get 6.5 from the input, which I can\n\n  u\u0027numeric\u0027: {u\u0027openstack-tox-py27-trove\u0027: {u\u00271914-08-26T00:00:00\u0027: 2.0},\n-               u\u0027tempest-dsvm-neutron-full\u0027: {u\u00271914-08-26T00:00:00\u0027: 4.0,\n?                                                                      ^ ^\n\n+               u\u0027tempest-dsvm-neutron-full\u0027: {u\u00271914-08-26T00:00:00\u0027: 6.5,\n?                                                                      ^ ^\n\nI think the importance of this test highlights, the numeric data does not contain the failed runs when averaging run time in the data, and that was intended from design.\n\nSo I think my investigation is complete in confirming my changes. If we want any other changes, or any additional investigation, let me know.","commit_id":"a9bfd78f8dd72bce897d5a6657a70dba09f136ee"}]}
