)]}'
{"instack_undercloud/tests/test_undercloud.py":[{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"3682067582c2b96d014550f50074c40566c0bb71","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"1f1a1f67_87044816","updated":"2017-07-19 17:34:40.000000000","message":"I would really like to see unit tests for the new function.  At least _run_validation_groups.  I realize the other two new functions are actually refactorings of existing code (that apparently wasn\u0027t tested either...) so I won\u0027t insist on those.","commit_id":"83111c7bd32f7ef448633326755407399f6145d8"},{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"change_message_id":"011dcecad11b29d23ea8ff29cf9bfa45626a9d9c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"ff346bd7_bff6d98e","in_reply_to":"1f1a1f67_87044816","updated":"2017-07-24 15:49:47.000000000","message":"Done","commit_id":"83111c7bd32f7ef448633326755407399f6145d8"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"cb8fca47366a3e7b09e09a825f7b83315e39bfe5","unresolved":false,"context_lines":[{"line_number":734,"context_line":"        mock_post_config_mistral.assert_called_once_with("},{"line_number":735,"context_line":"            instack_env, mock_instance_mistral, mock_instance_swift)"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"    @mock.patch(\u0027keystoneclient.discover.Discover\u0027)"},{"line_number":738,"context_line":"    @mock.patch(\u0027instack_undercloud.undercloud._get_auth_values\u0027)"},{"line_number":739,"context_line":"    @mock.patch(\u0027instack_undercloud.undercloud._get_session\u0027)"},{"line_number":740,"context_line":"    @mock.patch(\u0027mistralclient.api.client.client\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f436f4f_0dbb320e","line":737,"updated":"2017-08-11 16:22:05.000000000","message":"Nit: I think we don\u0027t need to mock this since we have the _get_session function to mock out the keystone bits anyway?","commit_id":"e2a155870c3d477e7401a2042bdb007670b3d863"},{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"change_message_id":"e45f7ac2c739f49bccb34b25bd3cfef1ab30891f","unresolved":false,"context_lines":[{"line_number":734,"context_line":"        mock_post_config_mistral.assert_called_once_with("},{"line_number":735,"context_line":"            instack_env, mock_instance_mistral, mock_instance_swift)"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"    @mock.patch(\u0027keystoneclient.discover.Discover\u0027)"},{"line_number":738,"context_line":"    @mock.patch(\u0027instack_undercloud.undercloud._get_auth_values\u0027)"},{"line_number":739,"context_line":"    @mock.patch(\u0027instack_undercloud.undercloud._get_session\u0027)"},{"line_number":740,"context_line":"    @mock.patch(\u0027mistralclient.api.client.client\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f436f4f_3325d409","line":737,"in_reply_to":"9f436f4f_0dbb320e","updated":"2017-08-16 11:37:09.000000000","message":"thanks Ben you are right, done.","commit_id":"e2a155870c3d477e7401a2042bdb007670b3d863"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"cb8fca47366a3e7b09e09a825f7b83315e39bfe5","unresolved":false,"context_lines":[{"line_number":780,"context_line":"    @mock.patch(\u0027instack_undercloud.undercloud._get_session\u0027)"},{"line_number":781,"context_line":"    @mock.patch(\u0027mistralclient.api.client.client\u0027, autospec\u003dTrue)"},{"line_number":782,"context_line":"    @mock.patch(\u0027time.strptime\u0027)"},{"line_number":783,"context_line":"    def test_run_validation_groups_timeout(self, mock_strptime,"},{"line_number":784,"context_line":"                                           mock_mistral_client,"},{"line_number":785,"context_line":"                                           mock_get_session, mock_auth_values,"},{"line_number":786,"context_line":"                                           mock_ksdiscover):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f436f4f_c87cf8ec","line":783,"updated":"2017-08-11 16:22:05.000000000","message":"I don\u0027t think this is properly testing the timeout functionality.  It\u0027s raising a RuntimeError because there\u0027s no state set on the execution so it\u0027s falling through to the error path.","commit_id":"e2a155870c3d477e7401a2042bdb007670b3d863"},{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"change_message_id":"e45f7ac2c739f49bccb34b25bd3cfef1ab30891f","unresolved":false,"context_lines":[{"line_number":780,"context_line":"    @mock.patch(\u0027instack_undercloud.undercloud._get_session\u0027)"},{"line_number":781,"context_line":"    @mock.patch(\u0027mistralclient.api.client.client\u0027, autospec\u003dTrue)"},{"line_number":782,"context_line":"    @mock.patch(\u0027time.strptime\u0027)"},{"line_number":783,"context_line":"    def test_run_validation_groups_timeout(self, mock_strptime,"},{"line_number":784,"context_line":"                                           mock_mistral_client,"},{"line_number":785,"context_line":"                                           mock_get_session, mock_auth_values,"},{"line_number":786,"context_line":"                                           mock_ksdiscover):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f436f4f_b319c4d7","line":783,"in_reply_to":"9f436f4f_c87cf8ec","updated":"2017-08-16 11:37:09.000000000","message":"ack thanks will update in a bit","commit_id":"e2a155870c3d477e7401a2042bdb007670b3d863"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"cb8fca47366a3e7b09e09a825f7b83315e39bfe5","unresolved":false,"context_lines":[{"line_number":791,"context_line":"        mock_mistral.action_executions.list.return_value \u003d []"},{"line_number":792,"context_line":"        mock_get_session.return_value \u003d mock.MagicMock()"},{"line_number":793,"context_line":"        mock_time \u003d mock.MagicMock()"},{"line_number":794,"context_line":"        mock_time.return_value \u003d time.mktime(time.localtime())"},{"line_number":795,"context_line":"        mock_strptime.return_value \u003d time.mktime(time.localtime())"},{"line_number":796,"context_line":"        with mock.patch(\u0027time.time\u0027, mock_time):"},{"line_number":797,"context_line":"            self.assertRaises(RuntimeError,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f436f4f_03d663f2","line":794,"updated":"2017-08-11 16:22:05.000000000","message":"This time will never increment, which means it can never get to the timeout_at value (which would be this + 1).\n\nI think we need to set the state on the execution to \u0027RUNNING\u0027 and use a side_effect for this mock so we can return increasing values.\n\nI started playing with this code and it turned into kind of a rabbit hole, so here\u0027s what I ended up with: http://paste.openstack.org/show/618205/","commit_id":"e2a155870c3d477e7401a2042bdb007670b3d863"},{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"change_message_id":"e45f7ac2c739f49bccb34b25bd3cfef1ab30891f","unresolved":false,"context_lines":[{"line_number":791,"context_line":"        mock_mistral.action_executions.list.return_value \u003d []"},{"line_number":792,"context_line":"        mock_get_session.return_value \u003d mock.MagicMock()"},{"line_number":793,"context_line":"        mock_time \u003d mock.MagicMock()"},{"line_number":794,"context_line":"        mock_time.return_value \u003d time.mktime(time.localtime())"},{"line_number":795,"context_line":"        mock_strptime.return_value \u003d time.mktime(time.localtime())"},{"line_number":796,"context_line":"        with mock.patch(\u0027time.time\u0027, mock_time):"},{"line_number":797,"context_line":"            self.assertRaises(RuntimeError,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f436f4f_d31688a8","line":794,"in_reply_to":"9f436f4f_03d663f2","updated":"2017-08-16 11:37:09.000000000","message":"thanks for checking this Bnemec, you\u0027re right it wasn\u0027t timing out. We can just set the timout to -1 below in the all to _run_validation_groups (I was setting it to 1, but -1 is more reliable). I also added a assertRaisesRegexp to check the error message as an extra validation","commit_id":"e2a155870c3d477e7401a2042bdb007670b3d863"}],"instack_undercloud/undercloud.py":[{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"change_message_id":"2272ea147fb30564b36ddfa3d35e33ec47d5b57e","unresolved":false,"context_lines":[{"line_number":1446,"context_line":""},{"line_number":1447,"context_line":""},{"line_number":1448,"context_line":"def _run_validation_groups(groups\u003d[], mistral_url\u003d\u0027\u0027, timeout\u003d360):"},{"line_number":1449,"context_line":"    sess \u003d _get_session()"},{"line_number":1450,"context_line":"    mistral \u003d mistralclient.client(mistral_url\u003dmistral_url, session\u003dsess)"},{"line_number":1451,"context_line":"    execution \u003d mistral.executions.create("},{"line_number":1452,"context_line":"        \u0027tripleo.validations.v1.run_groups\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f201791_c4b7c83a","line":1449,"updated":"2017-06-20 16:14:24.000000000","message":"add LOG.info for debug","commit_id":"5c1a34f2ad75be29eff6af3716c393cfe6f38907"},{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"change_message_id":"59242b2219653b8350d61ff72a81948b925f759b","unresolved":false,"context_lines":[{"line_number":1613,"context_line":"            # Run the validations"},{"line_number":1614,"context_line":"            if CONF.enable_validations:"},{"line_number":1615,"context_line":"                mistral_url \u003d instack_env[\u0027UNDERCLOUD_ENDPOINT_MISTRAL_PUBLIC\u0027]"},{"line_number":1616,"context_line":"                _run_validation_groups([\"post-upgrade\", \"post-update\"],"},{"line_number":1617,"context_line":"                                       mistral_url)"},{"line_number":1618,"context_line":"        _run_command([\u0027sudo\u0027, \u0027rm\u0027, \u0027-f\u0027, \u0027/tmp/svc-map-services\u0027], None, \u0027rm\u0027)"},{"line_number":1619,"context_line":"    except Exception as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f201791_08d7f34d","line":1616,"range":{"start_line":1616,"start_character":43,"end_line":1616,"end_character":64},"updated":"2017-06-21 13:04:02.000000000","message":"so we need to reconsider the groups we are using in https://blueprints.launchpad.net/tripleo/+spec/pre-upgrade-validations (we have set pre-upgrade pre-update)","commit_id":"44af18b5066dd129454eab103c37b8ad9d3b1d3c"},{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"change_message_id":"ffe0d565164066d7f3797a37110c19a9d9cf803d","unresolved":false,"context_lines":[{"line_number":1613,"context_line":"            # Run the validations"},{"line_number":1614,"context_line":"            if CONF.enable_validations:"},{"line_number":1615,"context_line":"                mistral_url \u003d instack_env[\u0027UNDERCLOUD_ENDPOINT_MISTRAL_PUBLIC\u0027]"},{"line_number":1616,"context_line":"                _run_validation_groups([\"post-upgrade\", \"post-update\"],"},{"line_number":1617,"context_line":"                                       mistral_url)"},{"line_number":1618,"context_line":"        _run_command([\u0027sudo\u0027, \u0027rm\u0027, \u0027-f\u0027, \u0027/tmp/svc-map-services\u0027], None, \u0027rm\u0027)"},{"line_number":1619,"context_line":"    except Exception as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_c99001f1","line":1616,"range":{"start_line":1616,"start_character":43,"end_line":1616,"end_character":64},"in_reply_to":"5f201791_08d7f34d","updated":"2017-07-07 15:51:33.000000000","message":"posted https://review.openstack.org/481667","commit_id":"44af18b5066dd129454eab103c37b8ad9d3b1d3c"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"3682067582c2b96d014550f50074c40566c0bb71","unresolved":false,"context_lines":[{"line_number":1450,"context_line":"        if exe.state \u003d\u003d \"SUCCESS\":"},{"line_number":1451,"context_line":"            return"},{"line_number":1452,"context_line":"        else:"},{"line_number":1453,"context_line":"            raise RuntimeError(\"ERROR! %s. \", message)"},{"line_number":1454,"context_line":"    else:"},{"line_number":1455,"context_line":"        exe \u003d mistral.executions.get(execution.id)"},{"line_number":1456,"context_line":"        LOG.error(\"Timed out waiting for execution %s to finish. State: %s\","}],"source_content_type":"text/x-python","patch_set":7,"id":"1f1a1f67_c4a47e4d","line":1453,"range":{"start_line":1453,"start_character":18,"end_line":1453,"end_character":54},"updated":"2017-07-19 17:34:40.000000000","message":"This won\u0027t do what I think you expect.  This isn\u0027t a log call so the , doesn\u0027t do string formatting, it just means you\u0027re raising a RuntimeError with a tuple as the argument.  Which sort of works, but is not ideal.  In this case it\u0027s correct to just do the string format up fron:\n\nraise RuntimeError(\"ERROR! %s. \" % message)\n\nDitto for the other exception calls.","commit_id":"83111c7bd32f7ef448633326755407399f6145d8"},{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"change_message_id":"011dcecad11b29d23ea8ff29cf9bfa45626a9d9c","unresolved":false,"context_lines":[{"line_number":1450,"context_line":"        if exe.state \u003d\u003d \"SUCCESS\":"},{"line_number":1451,"context_line":"            return"},{"line_number":1452,"context_line":"        else:"},{"line_number":1453,"context_line":"            raise RuntimeError(\"ERROR! %s. \", message)"},{"line_number":1454,"context_line":"    else:"},{"line_number":1455,"context_line":"        exe \u003d mistral.executions.get(execution.id)"},{"line_number":1456,"context_line":"        LOG.error(\"Timed out waiting for execution %s to finish. State: %s\","}],"source_content_type":"text/x-python","patch_set":7,"id":"1f1a1f67_3edc0d73","line":1453,"range":{"start_line":1453,"start_character":18,"end_line":1453,"end_character":54},"in_reply_to":"1f1a1f67_c4a47e4d","updated":"2017-07-24 15:49:47.000000000","message":"Done","commit_id":"83111c7bd32f7ef448633326755407399f6145d8"},{"author":{"_account_id":7144,"name":"James Slagle","email":"jslagle@redhat.com","username":"slagle"},"change_message_id":"7dd440de1d5fec43925a15897edb1896a0172a9e","unresolved":false,"context_lines":[{"line_number":1450,"context_line":"        if exe.state \u003d\u003d \"SUCCESS\":"},{"line_number":1451,"context_line":"            return"},{"line_number":1452,"context_line":"        else:"},{"line_number":1453,"context_line":"            raise RuntimeError(\"ERROR! %s. \" % message)"},{"line_number":1454,"context_line":"    else:"},{"line_number":1455,"context_line":"        exe \u003d mistral.executions.get(execution.id)"},{"line_number":1456,"context_line":"        LOG.error(\"Timed out waiting for execution %s to finish. State: %s\","}],"source_content_type":"text/x-python","patch_set":8,"id":"ff346bd7_1cc3a8ef","line":1453,"updated":"2017-07-24 21:43:41.000000000","message":"i know you refactored some of this code into a common method. But I wonder if post-upgrades should really throw a traceback from instack-undercloud?\n\nI\u0027d rather see instack-undercloud finish, then run the validations.\n\nOr, we can run the validations but don\u0027t have them cause a traceback.","commit_id":"1823d6f20efe59d40bc2206a0267fc481210aabb"},{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"change_message_id":"bd3c6290ade3a81695bf637590dc3da4505bdb95","unresolved":false,"context_lines":[{"line_number":1450,"context_line":"        if exe.state \u003d\u003d \"SUCCESS\":"},{"line_number":1451,"context_line":"            return"},{"line_number":1452,"context_line":"        else:"},{"line_number":1453,"context_line":"            raise RuntimeError(\"ERROR! %s. \" % message)"},{"line_number":1454,"context_line":"    else:"},{"line_number":1455,"context_line":"        exe \u003d mistral.executions.get(execution.id)"},{"line_number":1456,"context_line":"        LOG.error(\"Timed out waiting for execution %s to finish. State: %s\","}],"source_content_type":"text/x-python","patch_set":8,"id":"ff346bd7_8eff3a00","line":1453,"in_reply_to":"ff346bd7_1cc3a8ef","updated":"2017-07-25 16:08:50.000000000","message":"ack, I will aim to log the error and not raise it for these validations","commit_id":"1823d6f20efe59d40bc2206a0267fc481210aabb"},{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"change_message_id":"05444e1e1501af29c8f605ede579925f09ffcd67","unresolved":false,"context_lines":[{"line_number":1451,"context_line":"        if exe.state \u003d\u003d \"SUCCESS\":"},{"line_number":1452,"context_line":"            return"},{"line_number":1453,"context_line":"        else:"},{"line_number":1454,"context_line":"            exe_out \u003d mistral.executions.get_output(execution.id)"},{"line_number":1455,"context_line":"            error_message \u003d \"ERROR %s %s Mistral execution ID: %s\" % ("},{"line_number":1456,"context_line":"                message, exe_out, execution.id)"},{"line_number":1457,"context_line":"            LOG.error(error_message)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff346bd7_3ed39dd7","line":1454,"range":{"start_line":1454,"start_character":41,"end_line":1454,"end_character":51},"updated":"2017-07-27 07:12:12.000000000","message":"need to revisit the failed upgrade job is valid","commit_id":"2bf45107c2658f9d0aa2fad2fdd28a57b734dbe4"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"cb8fca47366a3e7b09e09a825f7b83315e39bfe5","unresolved":false,"context_lines":[{"line_number":1458,"context_line":"                    (ae.state \u003d\u003d \"ERROR\") and"},{"line_number":1459,"context_line":"                    (time.strptime(ae.created_at,  \"%Y-%m-%d %H:%M:%S\") \u003e"},{"line_number":1460,"context_line":"                     exe_created_at)):"},{"line_number":1461,"context_line":"                    task \u003d mistral.tasks.get(ae.task_execution_id)"},{"line_number":1462,"context_line":"                    task_res \u003d task.to_dict().get(\u0027result\u0027)"},{"line_number":1463,"context_line":"                    exe_out \u003d \"%s %s\" % (exe_out, task_res)"},{"line_number":1464,"context_line":"            error_message \u003d \"ERROR %s %s Mistral execution ID: %s\" % ("}],"source_content_type":"text/x-python","patch_set":10,"id":"9f436f4f_d28dc731","line":1461,"updated":"2017-08-11 16:22:05.000000000","message":"I am surprised this passed pep8.  It usually complains when code and if statements are indented the same.  I suppose it\u0027s working because of the extra indent before exe_created_at.","commit_id":"e2a155870c3d477e7401a2042bdb007670b3d863"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"cb8fca47366a3e7b09e09a825f7b83315e39bfe5","unresolved":false,"context_lines":[{"line_number":1465,"context_line":"                message, exe_out, execution.id)"},{"line_number":1466,"context_line":"            LOG.error(error_message)"},{"line_number":1467,"context_line":"            if fail_on_error:"},{"line_number":1468,"context_line":"                raise RuntimeError(\"ERROR! %s. \" % error_message)"},{"line_number":1469,"context_line":"            return"},{"line_number":1470,"context_line":"    else:"},{"line_number":1471,"context_line":"        exe \u003d mistral.executions.get(execution.id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f436f4f_52231706","line":1468,"updated":"2017-08-11 16:22:05.000000000","message":"Nit: This is going to result in an exception message that looks like \"ERROR! ERROR something something Mistral execution ID...\"  We could probably just raise RuntimeError(error_message) directly.","commit_id":"e2a155870c3d477e7401a2042bdb007670b3d863"},{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"change_message_id":"e45f7ac2c739f49bccb34b25bd3cfef1ab30891f","unresolved":false,"context_lines":[{"line_number":1465,"context_line":"                message, exe_out, execution.id)"},{"line_number":1466,"context_line":"            LOG.error(error_message)"},{"line_number":1467,"context_line":"            if fail_on_error:"},{"line_number":1468,"context_line":"                raise RuntimeError(\"ERROR! %s. \" % error_message)"},{"line_number":1469,"context_line":"            return"},{"line_number":1470,"context_line":"    else:"},{"line_number":1471,"context_line":"        exe \u003d mistral.executions.get(execution.id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f436f4f_93a36000","line":1468,"in_reply_to":"9f436f4f_52231706","updated":"2017-08-16 11:37:09.000000000","message":"done","commit_id":"e2a155870c3d477e7401a2042bdb007670b3d863"}],"releasenotes/notes/wire-up-tripleo-validations-undercloud-upgrade.yaml-244b86a00b260888.yaml":[{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"change_message_id":"41b56ed2c8fb1f2531b9700af20b543d0622f207","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - Wires up running of tripleo-validations to sanity check the undercloud"},{"line_number":4,"context_line":"    environment when running an instack undercloud upgrade. The operator can"},{"line_number":5,"context_line":"    set the existing \u0027enable_validations\u0027 to false to skip these validations"},{"line_number":6,"context_line":"    during the upgrade."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"1f1a1f67_7b1dd871","line":5,"range":{"start_line":3,"start_character":0,"end_line":5,"end_character":76},"updated":"2017-07-14 12:31:04.000000000","message":"revise this to say the validations are those in the \u0027post-upgrade\u0027 group and that this is happening after the undercloud upgrade has completed.","commit_id":"1d49ccaeaa5a6d8d1f65377e85a83706b70da081"}]}
