)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5044,"name":"Mate Lakat","email":"mlakat@suse.com","username":"mate-lakat"},"change_message_id":"f092fb98c7d57d162d4b49df8a5a06b3b11af523","unresolved":false,"context_lines":[{"line_number":10,"context_line":"to test whether they are the expected version.  We can\u0027t use pip or other"},{"line_number":11,"context_line":"requirement systems as they are cross-machine."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This change also introduces the possibility of separating the plugins"},{"line_number":14,"context_line":"from the nova repository in future while maintaining compatability."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Fixes bug 1226622"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAS3%2F%2FvJ0%3D","line":13,"updated":"2013-09-20 09:56:55.000000000","message":"Is this needed?","commit_id":"8d0f50751d767f0e3cf2eb57cf801fed00683a3e"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"30b2bd2a006305e25372391ea5ea384799a8d2bf","unresolved":false,"context_lines":[{"line_number":10,"context_line":"to test whether they are the expected version.  We can\u0027t use pip or other"},{"line_number":11,"context_line":"requirement systems as they are cross-machine."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This change also introduces the possibility of separating the plugins"},{"line_number":14,"context_line":"from the nova repository in future while maintaining compatability."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Fixes bug 1226622"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAS3%2F%2FlOc%3D","line":13,"in_reply_to":"AAAAS3%2F%2FvJ0%3D","updated":"2013-09-24 12:14:22.000000000","message":"Done","commit_id":"8d0f50751d767f0e3cf2eb57cf801fed00683a3e"},{"author":{"_account_id":5044,"name":"Mate Lakat","email":"mlakat@suse.com","username":"mate-lakat"},"change_message_id":"f092fb98c7d57d162d4b49df8a5a06b3b11af523","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This change also introduces the possibility of separating the plugins"},{"line_number":14,"context_line":"from the nova repository in future while maintaining compatability."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Fixes bug 1226622"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I58ab669061f51bd87071e2cf0d93d33021001309"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAS3%2F%2FvJQ%3D","line":15,"updated":"2013-09-20 09:56:55.000000000","message":"I would rather see a description of how versioning works:\nTwo files are installed along with the plugins:\n md5hashes.txt - containing md5hashes of the source codes\n plugin_version.txt - containing a version string\nVersion checking consists of two steps:\n Check if the version string matches the expected\n Verify the md5 hash of each file listed in plugin_version.txt\n\nVersion check is executed after a session has been established.","commit_id":"8d0f50751d767f0e3cf2eb57cf801fed00683a3e"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"30b2bd2a006305e25372391ea5ea384799a8d2bf","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This change also introduces the possibility of separating the plugins"},{"line_number":14,"context_line":"from the nova repository in future while maintaining compatability."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Fixes bug 1226622"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I58ab669061f51bd87071e2cf0d93d33021001309"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAS3%2F%2FlOI%3D","line":15,"in_reply_to":"AAAAS3%2F%2FvJQ%3D","updated":"2013-09-24 12:14:22.000000000","message":"With the removal of the hashing I think it\u0027s self-explanatory.","commit_id":"8d0f50751d767f0e3cf2eb57cf801fed00683a3e"},{"author":{"_account_id":6722,"name":"ChangBo Guo(gcb)","email":"guochbo@cn.ibm.com","username":"guochbo"},"change_message_id":"eb7baae5cac3aff7714987f1ed10b5b51540766f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"requirement systems as they are cross-machine."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Fixes bug 1226622"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I58ab669061f51bd87071e2cf0d93d33021001309"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAS3%2F%2FZvg%3D","line":14,"updated":"2013-09-27 13:07:53.000000000","message":"we should use Closes-Bug: #\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"dbfbcb70ecf9dcb9340d5b220c1f58613a6e0fe0","unresolved":false,"context_lines":[{"line_number":11,"context_line":"requirement systems as they are cross-machine."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Fixes bug 1226622"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I58ab669061f51bd87071e2cf0d93d33021001309"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAS3%2F%2FZtk%3D","line":14,"in_reply_to":"AAAAS3%2F%2FZvg%3D","updated":"2013-09-27 13:19:14.000000000","message":"Done","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"}],"nova/tests/virt/xenapi/stubs.py":[{"author":{"_account_id":5044,"name":"Mate Lakat","email":"mlakat@suse.com","username":"mate-lakat"},"change_message_id":"f092fb98c7d57d162d4b49df8a5a06b3b11af523","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                ret_str \u003d fake.as_json(out\u003doutput, err\u003d\u0027\u0027)"},{"line_number":242,"context_line":"            return ret_str"},{"line_number":243,"context_line":"        else:"},{"line_number":244,"context_line":"            return (super(FakeSessionForVMTests, self)."},{"line_number":245,"context_line":"                    host_call_plugin(_1, _2, plugin, method, args))"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAS3%2F%2FvL4%3D","line":244,"updated":"2013-09-20 09:56:55.000000000","message":"What a nasty bug... Good stuff!","commit_id":"8d0f50751d767f0e3cf2eb57cf801fed00683a3e"}],"nova/tests/virt/xenapi/test_xenapi.py":[{"author":{"_account_id":5044,"name":"Mate Lakat","email":"mlakat@suse.com","username":"mate-lakat"},"change_message_id":"f092fb98c7d57d162d4b49df8a5a06b3b11af523","unresolved":false,"context_lines":[{"line_number":3789,"context_line":"            ((6, 0, 50), \u0027XenServer\u0027),"},{"line_number":3790,"context_line":"            session._get_product_version_and_brand()"},{"line_number":3791,"context_line":"        )"},{"line_number":3792,"context_line":""},{"line_number":3793,"context_line":"    def test_verify_plugin_version(self):"},{"line_number":3794,"context_line":"        session \u003d self._get_mock_xapisession({})"},{"line_number":3795,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAS3%2F%2FvLQ%3D","line":3792,"updated":"2013-09-20 09:56:55.000000000","message":"I might put these test cases to their separate Test class, this way the methods would be better, like:\n\n test_plugins_have_correct_version\n test_version_plugin_missing\n\nAnd it shows, that the invalid version is not covered, is it?","commit_id":"8d0f50751d767f0e3cf2eb57cf801fed00683a3e"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"30b2bd2a006305e25372391ea5ea384799a8d2bf","unresolved":false,"context_lines":[{"line_number":3789,"context_line":"            ((6, 0, 50), \u0027XenServer\u0027),"},{"line_number":3790,"context_line":"            session._get_product_version_and_brand()"},{"line_number":3791,"context_line":"        )"},{"line_number":3792,"context_line":""},{"line_number":3793,"context_line":"    def test_verify_plugin_version(self):"},{"line_number":3794,"context_line":"        session \u003d self._get_mock_xapisession({})"},{"line_number":3795,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAS3%2F%2FlMg%3D","line":3792,"in_reply_to":"AAAAS3%2F%2FvLQ%3D","updated":"2013-09-24 12:14:22.000000000","message":"\"Invalid version\" is tested by test_verify_plugin_version_fail.","commit_id":"8d0f50751d767f0e3cf2eb57cf801fed00683a3e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"067518f98730546f953efbca98533776d5c8e8d1","unresolved":false,"context_lines":[{"line_number":3925,"context_line":"    def test_verify_plugin_version(self):"},{"line_number":3926,"context_line":"        session \u003d self._get_mock_xapisession({})"},{"line_number":3927,"context_line":""},{"line_number":3928,"context_line":"        session.PLUGIN_REQUIRED_VERSION \u003d \u0027required_version\u0027"},{"line_number":3929,"context_line":""},{"line_number":3930,"context_line":"        self.mox.StubOutWithMock(session, \u0027call_plugin_serialized\u0027)"},{"line_number":3931,"context_line":"        session.call_plugin_serialized(\u0027nova_plugin_version\u0027, \u0027verify_version\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FaFw%3D","line":3928,"updated":"2013-09-27 09:49:40.000000000","message":"Can we not read this expected value from the version file that gets installed with the plugins?","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e2b4fefa8ed726144a42a0a55d14076dd45fc28e","unresolved":false,"context_lines":[{"line_number":3925,"context_line":"    def test_verify_plugin_version(self):"},{"line_number":3926,"context_line":"        session \u003d self._get_mock_xapisession({})"},{"line_number":3927,"context_line":""},{"line_number":3928,"context_line":"        session.PLUGIN_REQUIRED_VERSION \u003d \u0027required_version\u0027"},{"line_number":3929,"context_line":""},{"line_number":3930,"context_line":"        self.mox.StubOutWithMock(session, \u0027call_plugin_serialized\u0027)"},{"line_number":3931,"context_line":"        session.call_plugin_serialized(\u0027nova_plugin_version\u0027, \u0027verify_version\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FZxg%3D","line":3928,"in_reply_to":"AAAAS3%2F%2FaBU%3D","updated":"2013-09-27 13:06:09.000000000","message":"Not sure I see that as a big deal myself.\n\nI just see an opportunity to automate that the two version number are in-sync without having to run the system to find out, as really really useful.","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"f66b98b4f33f2dd51849a6d3d0f196ec42cff0ea","unresolved":false,"context_lines":[{"line_number":3925,"context_line":"    def test_verify_plugin_version(self):"},{"line_number":3926,"context_line":"        session \u003d self._get_mock_xapisession({})"},{"line_number":3927,"context_line":""},{"line_number":3928,"context_line":"        session.PLUGIN_REQUIRED_VERSION \u003d \u0027required_version\u0027"},{"line_number":3929,"context_line":""},{"line_number":3930,"context_line":"        self.mox.StubOutWithMock(session, \u0027call_plugin_serialized\u0027)"},{"line_number":3931,"context_line":"        session.call_plugin_serialized(\u0027nova_plugin_version\u0027, \u0027verify_version\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FaBU%3D","line":3928,"in_reply_to":"AAAAS3%2F%2FaFw%3D","updated":"2013-09-27 10:17:30.000000000","message":"I think it would be very ugly to do so; the plugins are in an entirely separate directory hierarchy and so any attempt to read from that file would place a dependency on the relative paths.","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"abe1bfb2aa6ca4ffce729cb33835f523dbda0806","unresolved":false,"context_lines":[{"line_number":3973,"context_line":"        self.mox.ReplayAll()"},{"line_number":3974,"context_line":"        self.assertRaises(xenapi_fake.Failure, session._verify_plugin_version)"},{"line_number":3975,"context_line":""},{"line_number":3976,"context_line":"    def test_verify_current_version_matches(self):"},{"line_number":3977,"context_line":"        session \u003d self._get_mock_xapisession({})"},{"line_number":3978,"context_line":""},{"line_number":3979,"context_line":"        # Import the plugin to extract it\u0027s version"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FRFA%3D","line":3976,"updated":"2013-10-01 09:24:36.000000000","message":"I think we need to skip this test when the file is not present. if you do a python setup install, I am guessing this file is missing?","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"02ccb3e968d1d1023d16402a031808df8d3331dd","unresolved":false,"context_lines":[{"line_number":3973,"context_line":"        self.mox.ReplayAll()"},{"line_number":3974,"context_line":"        self.assertRaises(xenapi_fake.Failure, session._verify_plugin_version)"},{"line_number":3975,"context_line":""},{"line_number":3976,"context_line":"    def test_verify_current_version_matches(self):"},{"line_number":3977,"context_line":"        session \u003d self._get_mock_xapisession({})"},{"line_number":3978,"context_line":""},{"line_number":3979,"context_line":"        # Import the plugin to extract it\u0027s version"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FRAI%3D","line":3976,"in_reply_to":"AAAAS3%2F%2FRFA%3D","updated":"2013-10-01 10:05:01.000000000","message":"I thought the whole tree was included?","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"abe1bfb2aa6ca4ffce729cb33835f523dbda0806","unresolved":false,"context_lines":[{"line_number":3978,"context_line":""},{"line_number":3979,"context_line":"        # Import the plugin to extract it\u0027s version"},{"line_number":3980,"context_line":"        path \u003d os.path.dirname(__file__)"},{"line_number":3981,"context_line":"        rel_path_elem \u003d \"../../../../plugins/xenserver/xenapi/etc/xapi.d/\"\\"},{"line_number":3982,"context_line":"            \"plugins/nova_plugin_version\""},{"line_number":3983,"context_line":"        for elem in rel_path_elem.split(\u0027/\u0027):"},{"line_number":3984,"context_line":"            path \u003d os.path.join(path, elem)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FRFg%3D","line":3981,"updated":"2013-10-01 09:24:36.000000000","message":"don\u0027t think you need the slash at the end here, but I could be wrong","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"02ccb3e968d1d1023d16402a031808df8d3331dd","unresolved":false,"context_lines":[{"line_number":3978,"context_line":""},{"line_number":3979,"context_line":"        # Import the plugin to extract it\u0027s version"},{"line_number":3980,"context_line":"        path \u003d os.path.dirname(__file__)"},{"line_number":3981,"context_line":"        rel_path_elem \u003d \"../../../../plugins/xenserver/xenapi/etc/xapi.d/\"\\"},{"line_number":3982,"context_line":"            \"plugins/nova_plugin_version\""},{"line_number":3983,"context_line":"        for elem in rel_path_elem.split(\u0027/\u0027):"},{"line_number":3984,"context_line":"            path \u003d os.path.join(path, elem)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FQ60%3D","line":3981,"in_reply_to":"AAAAS3%2F%2FRFg%3D","updated":"2013-10-01 10:05:01.000000000","message":"It doesn\u0027t compile without it","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"b59e59788ae6677e47d6d9a49654cea947df229f","unresolved":false,"context_lines":[{"line_number":3976,"context_line":"    def test_verify_current_version_matches(self):"},{"line_number":3977,"context_line":"        session \u003d self._get_mock_xapisession({})"},{"line_number":3978,"context_line":""},{"line_number":3979,"context_line":"        # Import the plugin to extract it\u0027s version"},{"line_number":3980,"context_line":"        path \u003d os.path.dirname(__file__)"},{"line_number":3981,"context_line":"        rel_path_elem \u003d \"../../../../plugins/xenserver/xenapi/etc/xapi.d/\" \\"},{"line_number":3982,"context_line":"            \"plugins/nova_plugin_version\""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAS3%2F%2FQBo%3D","line":3979,"updated":"2013-10-01 14:55:15.000000000","message":"s/it\u0027s/its/","commit_id":"67d61e91adffc9a10de4dd2b15cbb8afb498f8de"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"33eb30a76b47b94a63739d73d43319527077a822","unresolved":false,"context_lines":[{"line_number":3976,"context_line":"    def test_verify_current_version_matches(self):"},{"line_number":3977,"context_line":"        session \u003d self._get_mock_xapisession({})"},{"line_number":3978,"context_line":""},{"line_number":3979,"context_line":"        # Import the plugin to extract it\u0027s version"},{"line_number":3980,"context_line":"        path \u003d os.path.dirname(__file__)"},{"line_number":3981,"context_line":"        rel_path_elem \u003d \"../../../../plugins/xenserver/xenapi/etc/xapi.d/\" \\"},{"line_number":3982,"context_line":"            \"plugins/nova_plugin_version\""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAS3%2F%2FKGE%3D","line":3979,"in_reply_to":"AAAAS3%2F%2FQBo%3D","updated":"2013-10-03 09:53:17.000000000","message":"Femtodone","commit_id":"67d61e91adffc9a10de4dd2b15cbb8afb498f8de"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"b59e59788ae6677e47d6d9a49654cea947df229f","unresolved":false,"context_lines":[{"line_number":3985,"context_line":"        path \u003d os.path.realpath(path)"},{"line_number":3986,"context_line":""},{"line_number":3987,"context_line":"        plugin_version \u003d None"},{"line_number":3988,"context_line":"        plugin_file \u003d open(path)"},{"line_number":3989,"context_line":"        try:"},{"line_number":3990,"context_line":"            for line in plugin_file:"},{"line_number":3991,"context_line":"                if \"PLUGIN_VERSION \u003d \" in line:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAS3%2F%2FQBc%3D","line":3988,"updated":"2013-10-01 14:55:15.000000000","message":"This code is in 2.6 land, so you could use the `with open() as plugin_file` idiom to make this slightly cleaner if you want.","commit_id":"67d61e91adffc9a10de4dd2b15cbb8afb498f8de"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"33eb30a76b47b94a63739d73d43319527077a822","unresolved":false,"context_lines":[{"line_number":3985,"context_line":"        path \u003d os.path.realpath(path)"},{"line_number":3986,"context_line":""},{"line_number":3987,"context_line":"        plugin_version \u003d None"},{"line_number":3988,"context_line":"        plugin_file \u003d open(path)"},{"line_number":3989,"context_line":"        try:"},{"line_number":3990,"context_line":"            for line in plugin_file:"},{"line_number":3991,"context_line":"                if \"PLUGIN_VERSION \u003d \" in line:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAS3%2F%2FKGA%3D","line":3988,"in_reply_to":"AAAAS3%2F%2FQBc%3D","updated":"2013-10-03 09:53:17.000000000","message":"Femtodone","commit_id":"67d61e91adffc9a10de4dd2b15cbb8afb498f8de"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a17fa01e9422928f37de915187dfda562eb1a00d","unresolved":false,"context_lines":[{"line_number":4013,"context_line":""},{"line_number":4014,"context_line":"        # Import the plugin to extract its version"},{"line_number":4015,"context_line":"        path \u003d os.path.dirname(__file__)"},{"line_number":4016,"context_line":"        rel_path_elem \u003d \"../../../../plugins/xenserver/xenapi/etc/xapi.d/\" \\"},{"line_number":4017,"context_line":"            \"plugins/nova_plugin_version\""},{"line_number":4018,"context_line":"        for elem in rel_path_elem.split(\u0027/\u0027):"},{"line_number":4019,"context_line":"            path \u003d os.path.join(path, elem)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAS3%2F%2FJiE%3D","line":4016,"updated":"2013-10-03 14:09:16.000000000","message":"Thanks for adding this one, I feel much happier about this now.","commit_id":"24fd331b8cd5aca66362e6f76deec9c437875933"}],"nova/virt/xenapi/driver.py":[{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"706e665f09e02700b6913bd01ab5f2522df37671","unresolved":false,"context_lines":[{"line_number":677,"context_line":""},{"line_number":678,"context_line":"    def _verify_plugin_version(self):"},{"line_number":679,"context_line":"        # Verify that we\u0027re using the right version of the plugins"},{"line_number":680,"context_line":"        args \u003d {\u0027expected_version\u0027: self.PLUGIN_REQUIRED_VERSION}"},{"line_number":681,"context_line":"        retval \u003d self.call_plugin(\u0027nova_plugin_version\u0027, \u0027verify_version\u0027, args)"},{"line_number":682,"context_line":"        if retval \u003d\u003d \"ok\":"},{"line_number":683,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAS3%2F%2F1A8%3D","line":680,"updated":"2013-09-18 15:57:43.000000000","message":"This can use the new plugin-call syntax so \u0027args\u0027 don\u0027t have to be manually packed as a dictionary.\n\nSee call_plugin_serialized.","commit_id":"3ad3ab903ca9d09d882459c9abfc4e92a478f983"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"dde060040e19a86b50858edb314b89a7210d8402","unresolved":false,"context_lines":[{"line_number":677,"context_line":""},{"line_number":678,"context_line":"    def _verify_plugin_version(self):"},{"line_number":679,"context_line":"        # Verify that we\u0027re using the right version of the plugins"},{"line_number":680,"context_line":"        args \u003d {\u0027expected_version\u0027: self.PLUGIN_REQUIRED_VERSION}"},{"line_number":681,"context_line":"        retval \u003d self.call_plugin(\u0027nova_plugin_version\u0027, \u0027verify_version\u0027, args)"},{"line_number":682,"context_line":"        if retval \u003d\u003d \"ok\":"},{"line_number":683,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAS3%2F%2F07M%3D","line":680,"in_reply_to":"AAAAS3%2F%2F1A8%3D","updated":"2013-09-18 16:23:58.000000000","message":"Done","commit_id":"3ad3ab903ca9d09d882459c9abfc4e92a478f983"},{"author":{"_account_id":5044,"name":"Mate Lakat","email":"mlakat@suse.com","username":"mate-lakat"},"change_message_id":"f092fb98c7d57d162d4b49df8a5a06b3b11af523","unresolved":false,"context_lines":[{"line_number":683,"context_line":"                expected_version\u003dself.PLUGIN_REQUIRED_VERSION)"},{"line_number":684,"context_line":"        except self.XenAPI.Failure as e:"},{"line_number":685,"context_line":"            err_msg \u003d e.details[0]"},{"line_number":686,"context_line":"            if err_msg \u003d\u003d \u0027XENAPI_MISSING_PLUGIN\u0027:"},{"line_number":687,"context_line":"                raise self.XenAPI.Failure(_("},{"line_number":688,"context_line":"                    \"XenAPI plugin validation failed: \""},{"line_number":689,"context_line":"                    \"Missing \u0027nova_plugin_version\u0027 plugin.\"))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAS3%2F%2FvMY%3D","line":686,"updated":"2013-09-20 09:56:55.000000000","message":"I would convert the self.XenAPI.Failure to a nova specific, or at least a driver specific exceptions. By raising self.XenAPI.Failure, we are not hiding the dirty details.","commit_id":"8d0f50751d767f0e3cf2eb57cf801fed00683a3e"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"30b2bd2a006305e25372391ea5ea384799a8d2bf","unresolved":false,"context_lines":[{"line_number":683,"context_line":"                expected_version\u003dself.PLUGIN_REQUIRED_VERSION)"},{"line_number":684,"context_line":"        except self.XenAPI.Failure as e:"},{"line_number":685,"context_line":"            err_msg \u003d e.details[0]"},{"line_number":686,"context_line":"            if err_msg \u003d\u003d \u0027XENAPI_MISSING_PLUGIN\u0027:"},{"line_number":687,"context_line":"                raise self.XenAPI.Failure(_("},{"line_number":688,"context_line":"                    \"XenAPI plugin validation failed: \""},{"line_number":689,"context_line":"                    \"Missing \u0027nova_plugin_version\u0027 plugin.\"))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAS3%2F%2FlN8%3D","line":686,"in_reply_to":"AAAAS3%2F%2FvMY%3D","updated":"2013-09-24 12:14:22.000000000","message":"I\u0027m not trying to hide the details of it being a XAPI failure; just trying to make it clear _what_ the failure was.\nI don\u0027t think it\u0027s worth having a nova/driver specific exception for this - nobody will be trying to catch it.","commit_id":"8d0f50751d767f0e3cf2eb57cf801fed00683a3e"},{"author":{"_account_id":5044,"name":"Mate Lakat","email":"mlakat@suse.com","username":"mate-lakat"},"change_message_id":"f092fb98c7d57d162d4b49df8a5a06b3b11af523","unresolved":false,"context_lines":[{"line_number":695,"context_line":""},{"line_number":696,"context_line":"        raise self.XenAPI.Failure(_(\"XenAPI plugin validation failed: %s\") %"},{"line_number":697,"context_line":"                                  retval)"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"    def _create_first_session(self, url, user, pw, exception):"},{"line_number":700,"context_line":"        try:"},{"line_number":701,"context_line":"            session \u003d self._create_session(url)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAS3%2F%2FvMU%3D","line":698,"updated":"2013-09-20 09:56:55.000000000","message":"Again, raising self.XenAPI.Failure smells.","commit_id":"8d0f50751d767f0e3cf2eb57cf801fed00683a3e"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"30b2bd2a006305e25372391ea5ea384799a8d2bf","unresolved":false,"context_lines":[{"line_number":695,"context_line":""},{"line_number":696,"context_line":"        raise self.XenAPI.Failure(_(\"XenAPI plugin validation failed: %s\") %"},{"line_number":697,"context_line":"                                  retval)"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"    def _create_first_session(self, url, user, pw, exception):"},{"line_number":700,"context_line":"        try:"},{"line_number":701,"context_line":"            session \u003d self._create_session(url)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAS3%2F%2FlNA%3D","line":698,"in_reply_to":"AAAAS3%2F%2FvMU%3D","updated":"2013-09-24 12:14:22.000000000","message":"See line 667 where we\u0027re doing this in the driver.","commit_id":"8d0f50751d767f0e3cf2eb57cf801fed00683a3e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"067518f98730546f953efbca98533776d5c8e8d1","unresolved":false,"context_lines":[{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    # This is not a config option as it should only ever be"},{"line_number":659,"context_line":"    # changed in development environments."},{"line_number":660,"context_line":"    PLUGIN_REQUIRED_VERSION \u003d \u00271_HAVANA\u0027"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"    def __init__(self, url, user, pw, virtapi):"},{"line_number":663,"context_line":"        import XenAPI"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FaH0%3D","line":660,"updated":"2013-09-27 09:49:40.000000000","message":"not sure why this is in all caps if its not a \u0027constant\u0027 at the top of the module, its a bit odd.\n\nI know it helps being here for testing, just wondering about it.","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"067518f98730546f953efbca98533776d5c8e8d1","unresolved":false,"context_lines":[{"line_number":673,"context_line":"            self._get_product_version_and_brand()"},{"line_number":674,"context_line":"        self._virtapi \u003d virtapi"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        self._verify_plugin_version()"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"    def _verify_plugin_version(self):"},{"line_number":679,"context_line":"        # Verify that we\u0027re using the right version of the plugins"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FaF4%3D","line":676,"updated":"2013-09-27 09:49:40.000000000","message":"I am tempted to say this should be called in the period update loop, to make sure things don\u0027t get broken while nova-compute is running.\n\nBut maybe that is over-kill, this is a good start for sure.","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e2b4fefa8ed726144a42a0a55d14076dd45fc28e","unresolved":false,"context_lines":[{"line_number":673,"context_line":"            self._get_product_version_and_brand()"},{"line_number":674,"context_line":"        self._virtapi \u003d virtapi"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        self._verify_plugin_version()"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"    def _verify_plugin_version(self):"},{"line_number":679,"context_line":"        # Verify that we\u0027re using the right version of the plugins"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FZxA%3D","line":676,"in_reply_to":"AAAAS3%2F%2FaCg%3D","updated":"2013-09-27 13:06:09.000000000","message":"sure, but we need to go towards rolling upgrades though, and since we don\u0027t support multiple api versions, or multiple directories, this was just a safety net, just thinking out loud here, needs more thought","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"f66b98b4f33f2dd51849a6d3d0f196ec42cff0ea","unresolved":false,"context_lines":[{"line_number":673,"context_line":"            self._get_product_version_and_brand()"},{"line_number":674,"context_line":"        self._virtapi \u003d virtapi"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        self._verify_plugin_version()"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"    def _verify_plugin_version(self):"},{"line_number":679,"context_line":"        # Verify that we\u0027re using the right version of the plugins"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FaCg%3D","line":676,"in_reply_to":"AAAAS3%2F%2FaF4%3D","updated":"2013-09-27 10:17:30.000000000","message":"I think that\u0027s over-kill; if someone is going to be updating the host or nova during the process then they could also be updating the IP or the password or restarting XAPI (which I think requires a restart of Nova etc?)","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"067518f98730546f953efbca98533776d5c8e8d1","unresolved":false,"context_lines":[{"line_number":690,"context_line":"            else:"},{"line_number":691,"context_line":"                raise e"},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"        if retval \u003d\u003d \"ok\":"},{"line_number":694,"context_line":"            return"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"        raise self.XenAPI.Failure(_(\"XenAPI plugin validation failed: %s\") %"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FaI0%3D","line":693,"updated":"2013-09-27 09:49:40.000000000","message":"I would be up for the plugin just raising an exception to signal the plugins are out of data, but this works.","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e2b4fefa8ed726144a42a0a55d14076dd45fc28e","unresolved":false,"context_lines":[{"line_number":690,"context_line":"            else:"},{"line_number":691,"context_line":"                raise e"},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"        if retval \u003d\u003d \"ok\":"},{"line_number":694,"context_line":"            return"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"        raise self.XenAPI.Failure(_(\"XenAPI plugin validation failed: %s\") %"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FZw4%3D","line":693,"in_reply_to":"AAAAS3%2F%2FaCM%3D","updated":"2013-09-27 13:06:09.000000000","message":"well, I meant check for a specific exception, but I don\u0027t mind, just thinking that would be simpler, maybe its not.","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"f66b98b4f33f2dd51849a6d3d0f196ec42cff0ea","unresolved":false,"context_lines":[{"line_number":690,"context_line":"            else:"},{"line_number":691,"context_line":"                raise e"},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"        if retval \u003d\u003d \"ok\":"},{"line_number":694,"context_line":"            return"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"        raise self.XenAPI.Failure(_(\"XenAPI plugin validation failed: %s\") %"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FaCM%3D","line":693,"in_reply_to":"AAAAS3%2F%2FaI0%3D","updated":"2013-09-27 10:17:30.000000000","message":"It does raise an exception, but it\u0027s sensible to have some form of return value - just making sure it \"worked\" rather than \"didn\u0027t fail\"","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"abe1bfb2aa6ca4ffce729cb33835f523dbda0806","unresolved":false,"context_lines":[{"line_number":655,"context_line":"class XenAPISession(object):"},{"line_number":656,"context_line":"    \"\"\"The session to invoke XenAPI SDK calls.\"\"\""},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    # This is not a config option as it should only ever be"},{"line_number":659,"context_line":"    # changed in development environments."},{"line_number":660,"context_line":"    # MAJOR VERSION: Incompatible changes with the plugins"},{"line_number":661,"context_line":"    # MINOR VERSION: Compatible changes, new plguins, etc"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FRFw%3D","line":658,"updated":"2013-10-01 09:24:36.000000000","message":"not sure we need this bit?","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"02ccb3e968d1d1023d16402a031808df8d3331dd","unresolved":false,"context_lines":[{"line_number":655,"context_line":"class XenAPISession(object):"},{"line_number":656,"context_line":"    \"\"\"The session to invoke XenAPI SDK calls.\"\"\""},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    # This is not a config option as it should only ever be"},{"line_number":659,"context_line":"    # changed in development environments."},{"line_number":660,"context_line":"    # MAJOR VERSION: Incompatible changes with the plugins"},{"line_number":661,"context_line":"    # MINOR VERSION: Compatible changes, new plguins, etc"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FQ%2BE%3D","line":658,"in_reply_to":"AAAAS3%2F%2FRFw%3D","updated":"2013-10-01 10:05:01.000000000","message":"It\u0027s only an explanatory comment for why it\u0027s there.  I wanted the major/minor comment in so that people looking at which version is required here can see that plugins 1.3 are compatible with nova requiring 1.2.","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"abe1bfb2aa6ca4ffce729cb33835f523dbda0806","unresolved":false,"context_lines":[{"line_number":658,"context_line":"    # This is not a config option as it should only ever be"},{"line_number":659,"context_line":"    # changed in development environments."},{"line_number":660,"context_line":"    # MAJOR VERSION: Incompatible changes with the plugins"},{"line_number":661,"context_line":"    # MINOR VERSION: Compatible changes, new plguins, etc"},{"line_number":662,"context_line":"    PLUGIN_REQUIRED_VERSION \u003d \u00271.0\u0027"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"    def __init__(self, url, user, pw, virtapi):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FRFo%3D","line":661,"updated":"2013-10-01 09:24:36.000000000","message":"would be good to mention other place that needs changing to keep in sync, but maybe thats not needed.","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"02ccb3e968d1d1023d16402a031808df8d3331dd","unresolved":false,"context_lines":[{"line_number":658,"context_line":"    # This is not a config option as it should only ever be"},{"line_number":659,"context_line":"    # changed in development environments."},{"line_number":660,"context_line":"    # MAJOR VERSION: Incompatible changes with the plugins"},{"line_number":661,"context_line":"    # MINOR VERSION: Compatible changes, new plguins, etc"},{"line_number":662,"context_line":"    PLUGIN_REQUIRED_VERSION \u003d \u00271.0\u0027"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"    def __init__(self, url, user, pw, virtapi):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FQ9w%3D","line":661,"in_reply_to":"AAAAS3%2F%2FRFo%3D","updated":"2013-10-01 10:05:01.000000000","message":"Nova won\u0027t start if you don\u0027t change in both places, so I think it\u0027s fine.","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"abe1bfb2aa6ca4ffce729cb33835f523dbda0806","unresolved":false,"context_lines":[{"line_number":659,"context_line":"    # changed in development environments."},{"line_number":660,"context_line":"    # MAJOR VERSION: Incompatible changes with the plugins"},{"line_number":661,"context_line":"    # MINOR VERSION: Compatible changes, new plguins, etc"},{"line_number":662,"context_line":"    PLUGIN_REQUIRED_VERSION \u003d \u00271.0\u0027"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"    def __init__(self, url, user, pw, virtapi):"},{"line_number":665,"context_line":"        import XenAPI"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FRDw%3D","line":662,"updated":"2013-10-01 09:24:36.000000000","message":"Not sure if thats the correct variable name style, probably is the best bet I guess.","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"abe1bfb2aa6ca4ffce729cb33835f523dbda0806","unresolved":false,"context_lines":[{"line_number":684,"context_line":""},{"line_number":685,"context_line":"        # Can\u0027t use vmops.cmp_version because that tolerates differences in"},{"line_number":686,"context_line":"        # major version"},{"line_number":687,"context_line":"        req_maj, req_min \u003d self.PLUGIN_REQUIRED_VERSION.split(\u0027.\u0027)"},{"line_number":688,"context_line":"        got_maj, got_min \u003d returned_version.split(\u0027.\u0027)"},{"line_number":689,"context_line":"        if req_maj !\u003d got_maj or req_min \u003e got_min:"},{"line_number":690,"context_line":"            raise self.XenAPI.Failure("}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FREQ%3D","line":687,"updated":"2013-10-01 09:24:36.000000000","message":"might be easier as a separate method like \"_is_compatible_version(required, current) return true/false?\n\nJust thinking Single Responsibility, etc.","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"02ccb3e968d1d1023d16402a031808df8d3331dd","unresolved":false,"context_lines":[{"line_number":684,"context_line":""},{"line_number":685,"context_line":"        # Can\u0027t use vmops.cmp_version because that tolerates differences in"},{"line_number":686,"context_line":"        # major version"},{"line_number":687,"context_line":"        req_maj, req_min \u003d self.PLUGIN_REQUIRED_VERSION.split(\u0027.\u0027)"},{"line_number":688,"context_line":"        got_maj, got_min \u003d returned_version.split(\u0027.\u0027)"},{"line_number":689,"context_line":"        if req_maj !\u003d got_maj or req_min \u003e got_min:"},{"line_number":690,"context_line":"            raise self.XenAPI.Failure("}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FQ9U%3D","line":687,"in_reply_to":"AAAAS3%2F%2FREQ%3D","updated":"2013-10-01 10:05:01.000000000","message":"I think this is small enough to inline rather than have too many functions","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2fe2d566ba7adec3f64c768c9e7076b237474ccc","unresolved":false,"context_lines":[{"line_number":688,"context_line":"        got_maj, got_min \u003d returned_version.split(\u0027.\u0027)"},{"line_number":689,"context_line":"        if req_maj !\u003d got_maj or req_min \u003e got_min:"},{"line_number":690,"context_line":"            raise self.XenAPI.Failure("},{"line_number":691,"context_line":"                _(\"Plugin version mismatch (Expected %(exp)s, got %(got)s)\") %"},{"line_number":692,"context_line":"                {\u0027exp\u0027: self.PLUGIN_REQUIRED_VERSION, \u0027got\u0027: returned_version})"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"    def _create_first_session(self, url, user, pw, exception):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FRCk%3D","line":691,"updated":"2013-10-01 09:26:54.000000000","message":"Also, this violates:\nhttps://wiki.openstack.org/wiki/StringFreeze\n\nMay have to wait until Icehouse, or get exception granted.","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"02ccb3e968d1d1023d16402a031808df8d3331dd","unresolved":false,"context_lines":[{"line_number":688,"context_line":"        got_maj, got_min \u003d returned_version.split(\u0027.\u0027)"},{"line_number":689,"context_line":"        if req_maj !\u003d got_maj or req_min \u003e got_min:"},{"line_number":690,"context_line":"            raise self.XenAPI.Failure("},{"line_number":691,"context_line":"                _(\"Plugin version mismatch (Expected %(exp)s, got %(got)s)\") %"},{"line_number":692,"context_line":"                {\u0027exp\u0027: self.PLUGIN_REQUIRED_VERSION, \u0027got\u0027: returned_version})"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"    def _create_first_session(self, url, user, pw, exception):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAS3%2F%2FQ7E%3D","line":691,"in_reply_to":"AAAAS3%2F%2FRCk%3D","updated":"2013-10-01 10:05:01.000000000","message":"No exception needed?  This message is not user-visible and is adding a log message, so is an exception for StringFreeze already.\n\nI think the point made on the wiki page is that a new string is OK - it just won\u0027t get translated - it won\u0027t break existing translations?","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"}],"nova/virt/xenapi/fake.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a17fa01e9422928f37de915187dfda562eb1a00d","unresolved":false,"context_lines":[{"line_number":674,"context_line":"        return base64.b64encode(zlib.compress(\"dom_id: %s\" % dom_id))"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"    def _plugin_nova_plugin_version_get_version(self, method, args):"},{"line_number":677,"context_line":"        return pickle.dumps(\"1.0\")"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"    def host_call_plugin(self, _1, _2, plugin, method, args):"},{"line_number":680,"context_line":"        func \u003d getattr(self, \u0027_plugin_%s_%s\u0027 % (plugin, method), None)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAS3%2F%2FJh4%3D","line":677,"updated":"2013-10-03 14:09:16.000000000","message":"Not sure if thats what we want here, but it will do for now.","commit_id":"24fd331b8cd5aca66362e6f76deec9c437875933"}],"plugins/xenserver/xenapi/contrib/rpmbuild/SPECS/openstack-xen-plugins.spec":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"067518f98730546f953efbca98533776d5c8e8d1","unresolved":false,"context_lines":[{"line_number":43,"context_line":"/etc/xapi.d/plugins/xenstore.py"},{"line_number":44,"context_line":"/etc/xapi.d/plugins/utils.py"},{"line_number":45,"context_line":"/etc/xapi.d/plugins/nova_plugin_version"},{"line_number":46,"context_line":"/etc/xapi.d/plugins/hashes.txt"},{"line_number":47,"context_line":"/etc/xapi.d/plugins/plugin_version.txt"}],"source_content_type":"text/x-rpm-spec","patch_set":9,"id":"AAAAS3%2F%2FaFs%3D","line":46,"updated":"2013-09-27 09:49:40.000000000","message":"is this left over from an old change?","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"f66b98b4f33f2dd51849a6d3d0f196ec42cff0ea","unresolved":false,"context_lines":[{"line_number":43,"context_line":"/etc/xapi.d/plugins/xenstore.py"},{"line_number":44,"context_line":"/etc/xapi.d/plugins/utils.py"},{"line_number":45,"context_line":"/etc/xapi.d/plugins/nova_plugin_version"},{"line_number":46,"context_line":"/etc/xapi.d/plugins/hashes.txt"},{"line_number":47,"context_line":"/etc/xapi.d/plugins/plugin_version.txt"}],"source_content_type":"text/x-rpm-spec","patch_set":9,"id":"AAAAS3%2F%2FaCI%3D","line":46,"in_reply_to":"AAAAS3%2F%2FaFs%3D","updated":"2013-09-27 10:17:30.000000000","message":"Done","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"}],"plugins/xenserver/xenapi/etc/xapi.d/plugins/nova_plugin_version":[{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"706e665f09e02700b6913bd01ab5f2522df37671","unresolved":false,"context_lines":[{"line_number":32,"context_line":"PLUGIN_VERSION \u003d \u00271_HAVANA\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"# hashlib is not installed in xenserver, so cannot use md5 sums."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# Regenerate the HASH_SUMS list with:"},{"line_number":38,"context_line":"# ls --color\u003dnever | xargs -l python -c \u0027import sys; print hash(open(sys.argv[1]).read()), sys.argv[1]\u0027"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAS3%2F%2F1Es%3D","line":35,"updated":"2013-09-18 15:57:43.000000000","message":"`hashlib` isn\u0027t installed, but the `md5` and `sha` modules should be available.\n\n\u003e\u003e\u003e import md5\n\u003e\u003e\u003e md5.md5(\u0027foo\u0027).hexdigest()\n\u0027acbd18db4cc2f85cedef654fccc4a4d8\u0027","commit_id":"3ad3ab903ca9d09d882459c9abfc4e92a478f983"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"dde060040e19a86b50858edb314b89a7210d8402","unresolved":false,"context_lines":[{"line_number":32,"context_line":"PLUGIN_VERSION \u003d \u00271_HAVANA\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"# hashlib is not installed in xenserver, so cannot use md5 sums."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# Regenerate the HASH_SUMS list with:"},{"line_number":38,"context_line":"# ls --color\u003dnever | xargs -l python -c \u0027import sys; print hash(open(sys.argv[1]).read()), sys.argv[1]\u0027"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAS3%2F%2F064%3D","line":35,"in_reply_to":"AAAAS3%2F%2F1Es%3D","updated":"2013-09-18 16:23:58.000000000","message":"Argh! Can\u0027t believe I missed that!\nI wrote it with md5 initially (using xenserver-core) and was annoyed when I thought I had to strip it out.","commit_id":"3ad3ab903ca9d09d882459c9abfc4e92a478f983"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"706e665f09e02700b6913bd01ab5f2522df37671","unresolved":false,"context_lines":[{"line_number":39,"context_line":"HASH_SUMS \u003d \"\"\""},{"line_number":40,"context_line":"1794380934 agent"},{"line_number":41,"context_line":"-1584926602 bandwidth"},{"line_number":42,"context_line":"1429368418 bittorrent"},{"line_number":43,"context_line":"1870918121 _bittorrent_seeder"},{"line_number":44,"context_line":"815644729 config_file"},{"line_number":45,"context_line":"1489974222 console"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAS3%2F%2F1EQ%3D","line":42,"updated":"2013-09-18 15:57:43.000000000","message":"Probably better (and more standard) to use hexidecimal instead of signed-ints as the encoding.","commit_id":"3ad3ab903ca9d09d882459c9abfc4e92a478f983"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"dde060040e19a86b50858edb314b89a7210d8402","unresolved":false,"context_lines":[{"line_number":39,"context_line":"HASH_SUMS \u003d \"\"\""},{"line_number":40,"context_line":"1794380934 agent"},{"line_number":41,"context_line":"-1584926602 bandwidth"},{"line_number":42,"context_line":"1429368418 bittorrent"},{"line_number":43,"context_line":"1870918121 _bittorrent_seeder"},{"line_number":44,"context_line":"815644729 config_file"},{"line_number":45,"context_line":"1489974222 console"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAS3%2F%2F06c%3D","line":42,"in_reply_to":"AAAAS3%2F%2F1EQ%3D","updated":"2013-09-18 16:23:58.000000000","message":"Will do now I\u0027ve moved back to md5.","commit_id":"3ad3ab903ca9d09d882459c9abfc4e92a478f983"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"706e665f09e02700b6913bd01ab5f2522df37671","unresolved":false,"context_lines":[{"line_number":55,"context_line":"\"\"\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def verify_version(session, args):"},{"line_number":59,"context_line":"    expected_version \u003d exists(args, \u0027expected_version\u0027)"},{"line_number":60,"context_line":"    if expected_version !\u003d PLUGIN_VERSION:"},{"line_number":61,"context_line":"        return \"Version of plugins (%s) does not match required version (%s)\"%\\"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAS3%2F%2F1DM%3D","line":58,"updated":"2013-09-18 15:57:43.000000000","message":"Lately we\u0027ve been writing entry-point functions using a new-style that avoids having to unpack the args variable manually.\n\nUsing the new style, you can just write:\n\ndef verify_version(session, expected_version):\n   pass","commit_id":"3ad3ab903ca9d09d882459c9abfc4e92a478f983"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"dde060040e19a86b50858edb314b89a7210d8402","unresolved":false,"context_lines":[{"line_number":55,"context_line":"\"\"\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def verify_version(session, args):"},{"line_number":59,"context_line":"    expected_version \u003d exists(args, \u0027expected_version\u0027)"},{"line_number":60,"context_line":"    if expected_version !\u003d PLUGIN_VERSION:"},{"line_number":61,"context_line":"        return \"Version of plugins (%s) does not match required version (%s)\"%\\"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAS3%2F%2F060%3D","line":58,"in_reply_to":"AAAAS3%2F%2F1DM%3D","updated":"2013-09-18 16:23:58.000000000","message":"Done","commit_id":"3ad3ab903ca9d09d882459c9abfc4e92a478f983"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"706e665f09e02700b6913bd01ab5f2522df37671","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                (PLUGIN_VERSION, expected_version)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    plugin_directory \u003d os.path.dirname(os.path.realpath(__file__))"},{"line_number":65,"context_line":"    for hash_line in HASH_SUMS.split(\u0027\\n\u0027):"},{"line_number":66,"context_line":"        # Remove comments"},{"line_number":67,"context_line":"        if \u0027#\u0027 in hash_line:"},{"line_number":68,"context_line":"            hash_line \u003d hash_line.split(\u0027#\u0027)[0]"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAS3%2F%2F1D8%3D","line":65,"updated":"2013-09-18 15:57:43.000000000","message":"If we\u0027re going to store the patches in the Python file itself, might just be easier to use a dictionary:\n\nHASHES \u003d {\n\u0027xenhost\u0027: \u0027deadbeef\u0027,\n\u0027kernel\u0027: abcdeabcde\u0027\n}\nfor filename, hashvalue in HASHES.iteritems():\n    pass\n\n\nThough, I think the idea of storing a separate \u0027hashes.txt\u0027 that this script reads from might be a bit easier to work with.\n\nIf we use md5\u0027s, generating could be something simple like:\n\nls | grep -v nova_plugin_version | xargs -n1 md5sum","commit_id":"3ad3ab903ca9d09d882459c9abfc4e92a478f983"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"dde060040e19a86b50858edb314b89a7210d8402","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                (PLUGIN_VERSION, expected_version)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    plugin_directory \u003d os.path.dirname(os.path.realpath(__file__))"},{"line_number":65,"context_line":"    for hash_line in HASH_SUMS.split(\u0027\\n\u0027):"},{"line_number":66,"context_line":"        # Remove comments"},{"line_number":67,"context_line":"        if \u0027#\u0027 in hash_line:"},{"line_number":68,"context_line":"            hash_line \u003d hash_line.split(\u0027#\u0027)[0]"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAS3%2F%2F06k%3D","line":65,"in_reply_to":"AAAAS3%2F%2F1D8%3D","updated":"2013-09-18 16:23:58.000000000","message":"I wanted to keep it as a simple output - rather than storing in a dict.\nI\u0027m very happy to move it to a hashes.txt file; that\u0027s even easier to generate:\n\nmd5sum * \u003e hashes.txt\n\nI\u0027ll make that change too.","commit_id":"3ad3ab903ca9d09d882459c9abfc4e92a478f983"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"706e665f09e02700b6913bd01ab5f2522df37671","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":90,"context_line":"    XenAPIPlugin.dispatch({\u0027verify_version\u0027: verify_version})"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAS3%2F%2F1C8%3D","line":90,"updated":"2013-09-18 15:57:43.000000000","message":"To make use of new-style calling...\nthis would change to \n\nutils.register_plugin_calls(verify_version)","commit_id":"3ad3ab903ca9d09d882459c9abfc4e92a478f983"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"dde060040e19a86b50858edb314b89a7210d8402","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":90,"context_line":"    XenAPIPlugin.dispatch({\u0027verify_version\u0027: verify_version})"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAS3%2F%2F06U%3D","line":90,"in_reply_to":"AAAAS3%2F%2F1C8%3D","updated":"2013-09-18 16:23:58.000000000","message":"Done","commit_id":"3ad3ab903ca9d09d882459c9abfc4e92a478f983"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"d7b30de225bf5bb66021c8eb1ee92ad4c0470182","unresolved":false,"context_lines":[{"line_number":31,"context_line":"exists \u003d pluginlib_nova.exists"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"PLUGIN_VERSION \u003d \u00271_HAVANA\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def verify_version(session, expected_version):"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAAS3%2F%2F0e0%3D","line":34,"updated":"2013-09-18 17:46:11.000000000","message":"Like md5hashes.txt, I wonder if we should just read this from a separate file, maybe `plugin_version.txt`.\n\nThis would give Ops a file they can easily cat to get the status.\n\nAlso, when bumping the version, our diff would be hitting a text file and not this python file, making it slightly easier/safer to review (you don\u0027t have to worry about verification implementation changing, since only a text file is changing).\n\nIt\u0027s slightly more complicated, so not 100% sold, but worth considering. Thoughts?","commit_id":"2d4ba7af4c73210a53a8b559f0dced529083e3c5"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"60a39fcd9c4f29f5d427ca4c1edbec9a6c593206","unresolved":false,"context_lines":[{"line_number":31,"context_line":"exists \u003d pluginlib_nova.exists"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"PLUGIN_VERSION \u003d \u00271_HAVANA\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def verify_version(session, expected_version):"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAAS3%2F%2FygI%3D","line":34,"in_reply_to":"AAAAS3%2F%2F0e0%3D","updated":"2013-09-19 10:09:02.000000000","message":"I think the biggest benefit of moving to a separate file is that this plugin probably never needs to change (hence the MD5 sum stays the same) - so devs can just update the version number in the separate file without any other changes.","commit_id":"2d4ba7af4c73210a53a8b559f0dced529083e3c5"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"d7b30de225bf5bb66021c8eb1ee92ad4c0470182","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    plugin_directory \u003d os.path.dirname(os.path.realpath(__file__))"},{"line_number":43,"context_line":"    hashes \u003d open(os.path.join(plugin_directory, \"md5hashes.txt\"), \"r\")"},{"line_number":44,"context_line":"    try:"},{"line_number":45,"context_line":"        for hash_line in hashes:"},{"line_number":46,"context_line":"            (expected_hash, plugin_name) \u003d hash_line.split()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"            # Ignore md5hashes.txt if it\u0027s in the file to avoid a cyclic hash"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAAS3%2F%2F0jQ%3D","line":45,"updated":"2013-09-18 17:46:11.000000000","message":"Might be worth making this a bit more robust to whitespace issues--perhaps something like:\n\nfor hash_line in hashes:\n    # Skip leading/trailing whitespace\n    hash_line \u003d hash_line.strip()\n    # Skip blank lines\n    if not hash_line:\n        continue\n    (expected_hash, plugin_name) \u003d hash_line.split()","commit_id":"2d4ba7af4c73210a53a8b559f0dced529083e3c5"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"60a39fcd9c4f29f5d427ca4c1edbec9a6c593206","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    plugin_directory \u003d os.path.dirname(os.path.realpath(__file__))"},{"line_number":43,"context_line":"    hashes \u003d open(os.path.join(plugin_directory, \"md5hashes.txt\"), \"r\")"},{"line_number":44,"context_line":"    try:"},{"line_number":45,"context_line":"        for hash_line in hashes:"},{"line_number":46,"context_line":"            (expected_hash, plugin_name) \u003d hash_line.split()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"            # Ignore md5hashes.txt if it\u0027s in the file to avoid a cyclic hash"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAAS3%2F%2Fyfw%3D","line":45,"in_reply_to":"AAAAS3%2F%2F0jQ%3D","updated":"2013-09-19 10:09:02.000000000","message":"I wanted the output to be exactly \"md5sum * \u003e hashes.txt\" therefore blank lines / comments didn\u0027t make sense","commit_id":"2d4ba7af4c73210a53a8b559f0dced529083e3c5"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"d7b30de225bf5bb66021c8eb1ee92ad4c0470182","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    hashes \u003d open(os.path.join(plugin_directory, \"md5hashes.txt\"), \"r\")"},{"line_number":44,"context_line":"    try:"},{"line_number":45,"context_line":"        for hash_line in hashes:"},{"line_number":46,"context_line":"            (expected_hash, plugin_name) \u003d hash_line.split()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"            # Ignore md5hashes.txt if it\u0027s in the file to avoid a cyclic hash"},{"line_number":49,"context_line":"            if plugin_name \u003d\u003d \"md5hashes.txt\":"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAAS3%2F%2F0is%3D","line":46,"updated":"2013-09-18 17:46:11.000000000","message":"Also worth considering skipping lines that startwith \u0027#\u0027 to give ops a way of temporarily disabling a hash check.\n\n# Give ops a way to annotate hashes or disable a hash for some # reason\nif hash_line.startswith(\u0027#\u0027):\n    continue","commit_id":"2d4ba7af4c73210a53a8b559f0dced529083e3c5"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"60a39fcd9c4f29f5d427ca4c1edbec9a6c593206","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    hashes \u003d open(os.path.join(plugin_directory, \"md5hashes.txt\"), \"r\")"},{"line_number":44,"context_line":"    try:"},{"line_number":45,"context_line":"        for hash_line in hashes:"},{"line_number":46,"context_line":"            (expected_hash, plugin_name) \u003d hash_line.split()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"            # Ignore md5hashes.txt if it\u0027s in the file to avoid a cyclic hash"},{"line_number":49,"context_line":"            if plugin_name \u003d\u003d \"md5hashes.txt\":"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAAS3%2F%2Fyf0%3D","line":46,"in_reply_to":"AAAAS3%2F%2F0is%3D","updated":"2013-09-19 10:09:02.000000000","message":"However, ops being able to do this makes more sense to me.\n\nAdded the change.","commit_id":"2d4ba7af4c73210a53a8b559f0dced529083e3c5"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"d7b30de225bf5bb66021c8eb1ee92ad4c0470182","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            full_filename \u003d os.path.join(plugin_directory, plugin_name)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"            calc_hash \u003d md5.new(open(full_filename, \u0027rb\u0027).read()).hexdigest()"},{"line_number":55,"context_line":"            if expected_hash !\u003d str(calc_hash):"},{"line_number":56,"context_line":"                return \"hash of file %s incorrect (%s not %s) - update \"\\"},{"line_number":57,"context_line":"                       \"md5hashes.txt and consider incrementing \"\\"},{"line_number":58,"context_line":"                       \"PLUGIN_VERSION\" % (full_filename,"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAAS3%2F%2F0kU%3D","line":55,"updated":"2013-09-18 17:46:11.000000000","message":"str() here shouldn\u0027t be needed.","commit_id":"2d4ba7af4c73210a53a8b559f0dced529083e3c5"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"60a39fcd9c4f29f5d427ca4c1edbec9a6c593206","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            full_filename \u003d os.path.join(plugin_directory, plugin_name)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"            calc_hash \u003d md5.new(open(full_filename, \u0027rb\u0027).read()).hexdigest()"},{"line_number":55,"context_line":"            if expected_hash !\u003d str(calc_hash):"},{"line_number":56,"context_line":"                return \"hash of file %s incorrect (%s not %s) - update \"\\"},{"line_number":57,"context_line":"                       \"md5hashes.txt and consider incrementing \"\\"},{"line_number":58,"context_line":"                       \"PLUGIN_VERSION\" % (full_filename,"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAAS3%2F%2Fyfs%3D","line":55,"in_reply_to":"AAAAS3%2F%2F0kU%3D","updated":"2013-09-19 10:09:02.000000000","message":"Done\n\nIt was needed when I was using pythons Hash - but is not needed any longer.","commit_id":"2d4ba7af4c73210a53a8b559f0dced529083e3c5"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"8f251aad297e570dc9a2509651f5830aaa3afeac","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"pluginlib_nova.configure_logging(\u0027nova_plugin_version\u0027)"},{"line_number":30,"context_line":"logging \u003d pluginlib_nova.logging"},{"line_number":31,"context_line":"exists \u003d pluginlib_nova.exists"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def verify_version(session, expected_version):"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAS3%2F%2Fxjk%3D","line":31,"updated":"2013-09-19 15:37:22.000000000","message":"Ugh, wish I had caught this earlier but... looks like this is no longer needed :/","commit_id":"7b4bc9dc42a7d09008a04e179fca2e8b9abb7611"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"0ba1b719c7ed538e9eaa85b945b01bb9304df6f5","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"pluginlib_nova.configure_logging(\u0027nova_plugin_version\u0027)"},{"line_number":30,"context_line":"logging \u003d pluginlib_nova.logging"},{"line_number":31,"context_line":"exists \u003d pluginlib_nova.exists"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def verify_version(session, expected_version):"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAS3%2F%2FxdU%3D","line":31,"in_reply_to":"AAAAS3%2F%2Fxjk%3D","updated":"2013-09-19 15:46:51.000000000","message":"Done","commit_id":"7b4bc9dc42a7d09008a04e179fca2e8b9abb7611"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"8f251aad297e570dc9a2509651f5830aaa3afeac","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        return \"Version of plugins (%s) does not match required version (%s)\"%\\"},{"line_number":45,"context_line":"                (plugin_version, expected_version)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    plugin_directory \u003d os.path.dirname(os.path.realpath(__file__))"},{"line_number":48,"context_line":"    hashes \u003d open(os.path.join(plugin_directory, \"md5hashes.txt\"), \"r\")"},{"line_number":49,"context_line":"    try:"},{"line_number":50,"context_line":"        for hash_line in hashes:"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAS3%2F%2FxgQ%3D","line":47,"updated":"2013-09-19 15:37:22.000000000","message":"This is already defined above.","commit_id":"7b4bc9dc42a7d09008a04e179fca2e8b9abb7611"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"0ba1b719c7ed538e9eaa85b945b01bb9304df6f5","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        return \"Version of plugins (%s) does not match required version (%s)\"%\\"},{"line_number":45,"context_line":"                (plugin_version, expected_version)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    plugin_directory \u003d os.path.dirname(os.path.realpath(__file__))"},{"line_number":48,"context_line":"    hashes \u003d open(os.path.join(plugin_directory, \"md5hashes.txt\"), \"r\")"},{"line_number":49,"context_line":"    try:"},{"line_number":50,"context_line":"        for hash_line in hashes:"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAS3%2F%2FxdQ%3D","line":47,"in_reply_to":"AAAAS3%2F%2FxgQ%3D","updated":"2013-09-19 15:46:51.000000000","message":"Done","commit_id":"7b4bc9dc42a7d09008a04e179fca2e8b9abb7611"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"8f251aad297e570dc9a2509651f5830aaa3afeac","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                (plugin_version, expected_version)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    plugin_directory \u003d os.path.dirname(os.path.realpath(__file__))"},{"line_number":48,"context_line":"    hashes \u003d open(os.path.join(plugin_directory, \"md5hashes.txt\"), \"r\")"},{"line_number":49,"context_line":"    try:"},{"line_number":50,"context_line":"        for hash_line in hashes:"},{"line_number":51,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAS3%2F%2FxiM%3D","line":48,"updated":"2013-09-19 15:37:22.000000000","message":"Not that it matters much, but \u0027r\u0027 is the default so could be omitted if you want. (You do above).","commit_id":"7b4bc9dc42a7d09008a04e179fca2e8b9abb7611"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"0ba1b719c7ed538e9eaa85b945b01bb9304df6f5","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                (plugin_version, expected_version)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    plugin_directory \u003d os.path.dirname(os.path.realpath(__file__))"},{"line_number":48,"context_line":"    hashes \u003d open(os.path.join(plugin_directory, \"md5hashes.txt\"), \"r\")"},{"line_number":49,"context_line":"    try:"},{"line_number":50,"context_line":"        for hash_line in hashes:"},{"line_number":51,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAS3%2F%2FxdM%3D","line":48,"in_reply_to":"AAAAS3%2F%2FxiM%3D","updated":"2013-09-19 15:46:51.000000000","message":"Done","commit_id":"7b4bc9dc42a7d09008a04e179fca2e8b9abb7611"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"8f251aad297e570dc9a2509651f5830aaa3afeac","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            if \u0027#\u0027 in hash_line:"},{"line_number":54,"context_line":"                hash_line \u003d hash_line.split(\u0027#\u0027)[0]"},{"line_number":55,"context_line":"            hash_line \u003d hash_line.strip()"},{"line_number":56,"context_line":"            if len(hash_line) \u003d\u003d 0:"},{"line_number":57,"context_line":"                continue"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"            (expected_hash, plugin_name) \u003d hash_line.split()"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAS3%2F%2Fxg4%3D","line":56,"updated":"2013-09-19 15:37:22.000000000","message":"PEP8 (the guide, not the tool) recommends:\n\nif not hash_line:\n   pass\n\n\nReference:\n\nhttp://www.python.org/dev/peps/pep-0008/#id39\n\nFor sequences, (strings, lists, tuples), use the fact that empty sequences are false.\n\nYes: if not seq:\n     if seq:\n\nNo: if len(seq)\n    if not len(seq)","commit_id":"7b4bc9dc42a7d09008a04e179fca2e8b9abb7611"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"0ba1b719c7ed538e9eaa85b945b01bb9304df6f5","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            if \u0027#\u0027 in hash_line:"},{"line_number":54,"context_line":"                hash_line \u003d hash_line.split(\u0027#\u0027)[0]"},{"line_number":55,"context_line":"            hash_line \u003d hash_line.strip()"},{"line_number":56,"context_line":"            if len(hash_line) \u003d\u003d 0:"},{"line_number":57,"context_line":"                continue"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"            (expected_hash, plugin_name) \u003d hash_line.split()"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAS3%2F%2FxdI%3D","line":56,"in_reply_to":"AAAAS3%2F%2Fxg4%3D","updated":"2013-09-19 15:46:51.000000000","message":"Done","commit_id":"7b4bc9dc42a7d09008a04e179fca2e8b9abb7611"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"8f251aad297e570dc9a2509651f5830aaa3afeac","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                               \u0027rb\u0027)"},{"line_number":67,"context_line":"            try:"},{"line_number":68,"context_line":"                calc_hash \u003d md5.new(plugin_file.read()).hexdigest()"},{"line_number":69,"context_line":"                if expected_hash !\u003d str(calc_hash):"},{"line_number":70,"context_line":"                    return \"hash of file %s incorrect (%s not %s) - update \"\\"},{"line_number":71,"context_line":"                           \"md5hashes.txt and consider incrementing \"\\"},{"line_number":72,"context_line":"                           \"PLUGIN_VERSION\" % (plugin_name,"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAS3%2F%2Fxis%3D","line":69,"updated":"2013-09-19 15:37:22.000000000","message":"str() is still there ;-)","commit_id":"7b4bc9dc42a7d09008a04e179fca2e8b9abb7611"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"0ba1b719c7ed538e9eaa85b945b01bb9304df6f5","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                               \u0027rb\u0027)"},{"line_number":67,"context_line":"            try:"},{"line_number":68,"context_line":"                calc_hash \u003d md5.new(plugin_file.read()).hexdigest()"},{"line_number":69,"context_line":"                if expected_hash !\u003d str(calc_hash):"},{"line_number":70,"context_line":"                    return \"hash of file %s incorrect (%s not %s) - update \"\\"},{"line_number":71,"context_line":"                           \"md5hashes.txt and consider incrementing \"\\"},{"line_number":72,"context_line":"                           \"PLUGIN_VERSION\" % (plugin_name,"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAS3%2F%2FxdE%3D","line":69,"in_reply_to":"AAAAS3%2F%2Fxis%3D","updated":"2013-09-19 15:46:51.000000000","message":"Embarasement_factor+\u003d1","commit_id":"7b4bc9dc42a7d09008a04e179fca2e8b9abb7611"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"067518f98730546f953efbca98533776d5c8e8d1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2013 OpenStack Foundation"},{"line_number":4,"context_line":"# Copyright (c) 2013 Citrix Systems, Inc."}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAAS3%2F%2FaFg%3D","line":1,"updated":"2013-09-27 09:49:40.000000000","message":"can\u0027t see if you have set the execute bit on this file, just checking that you have, and not set it on the txt file.","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"dbfbcb70ecf9dcb9340d5b220c1f58613a6e0fe0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2013 OpenStack Foundation"},{"line_number":4,"context_line":"# Copyright (c) 2013 Citrix Systems, Inc."}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAAS3%2F%2FZt0%3D","line":1,"in_reply_to":"AAAAS3%2F%2FaFg%3D","updated":"2013-09-27 13:19:14.000000000","message":"Yup, that\u0027s right.","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"abe1bfb2aa6ca4ffce729cb33835f523dbda0806","unresolved":false,"context_lines":[{"line_number":24,"context_line":"import utils"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# MAJOR VERSION: Incompatible changes"},{"line_number":27,"context_line":"# MINOR VERSION: Compatible changes, new plugins, etc"},{"line_number":28,"context_line":"PLUGIN_VERSION \u003d \"1.0\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def get_version(session):"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAS3%2F%2FREs%3D","line":27,"updated":"2013-10-01 09:24:36.000000000","message":"Would be good to mention where this also need to be updated, but maybe thats overkill, the unit test will tell you.","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"02ccb3e968d1d1023d16402a031808df8d3331dd","unresolved":false,"context_lines":[{"line_number":24,"context_line":"import utils"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# MAJOR VERSION: Incompatible changes"},{"line_number":27,"context_line":"# MINOR VERSION: Compatible changes, new plugins, etc"},{"line_number":28,"context_line":"PLUGIN_VERSION \u003d \"1.0\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def get_version(session):"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAS3%2F%2FQ6s%3D","line":27,"in_reply_to":"AAAAS3%2F%2FREs%3D","updated":"2013-10-01 10:05:01.000000000","message":"Agreed - we\u0027ve got enough static references that need to be updated if we refactor, I don\u0027t want them in comments as well that wouldn\u0027t get picked up automatically and would therefore rot","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"abe1bfb2aa6ca4ffce729cb33835f523dbda0806","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# MAJOR VERSION: Incompatible changes"},{"line_number":27,"context_line":"# MINOR VERSION: Compatible changes, new plugins, etc"},{"line_number":28,"context_line":"PLUGIN_VERSION \u003d \"1.0\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def get_version(session):"},{"line_number":31,"context_line":"    return PLUGIN_VERSION"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAS3%2F%2FREc%3D","line":28,"updated":"2013-10-01 09:24:36.000000000","message":"It would be good to have a version change log similar to:\nhttps://github.com/openstack/nova/blob/master/nova/compute/rpcapi.py#L68\n\nMaybe here would be the best place?","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"02ccb3e968d1d1023d16402a031808df8d3331dd","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# MAJOR VERSION: Incompatible changes"},{"line_number":27,"context_line":"# MINOR VERSION: Compatible changes, new plugins, etc"},{"line_number":28,"context_line":"PLUGIN_VERSION \u003d \"1.0\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def get_version(session):"},{"line_number":31,"context_line":"    return PLUGIN_VERSION"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAS3%2F%2FQ6w%3D","line":28,"in_reply_to":"AAAAS3%2F%2FREc%3D","updated":"2013-10-01 10:05:01.000000000","message":"Done","commit_id":"52978a9f5e35280f56f6f347817b2d585a56e9f6"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"b59e59788ae6677e47d6d9a49654cea947df229f","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"\"\"\"Returns the version of the nova plugins\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import XenAPIPlugin"},{"line_number":23,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAS3%2F%2FQDA%3D","line":20,"updated":"2013-10-01 14:55:15.000000000","message":"Import not needed.","commit_id":"67d61e91adffc9a10de4dd2b15cbb8afb498f8de"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"33eb30a76b47b94a63739d73d43319527077a822","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"\"\"\"Returns the version of the nova plugins\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import XenAPIPlugin"},{"line_number":23,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAS3%2F%2FKFw%3D","line":20,"in_reply_to":"AAAAS3%2F%2FQDA%3D","updated":"2013-10-03 09:53:17.000000000","message":"Femtodone","commit_id":"67d61e91adffc9a10de4dd2b15cbb8afb498f8de"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"b59e59788ae6677e47d6d9a49654cea947df229f","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import XenAPIPlugin"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import utils"},{"line_number":25,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAS3%2F%2FQCo%3D","line":22,"updated":"2013-10-01 14:55:15.000000000","message":"Import shouldn\u0027t be needed.\n\n(Assuming this module isn\u0027t doing any initialization on import..which would be awful.)","commit_id":"67d61e91adffc9a10de4dd2b15cbb8afb498f8de"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"33eb30a76b47b94a63739d73d43319527077a822","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import XenAPIPlugin"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import utils"},{"line_number":25,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAS3%2F%2FKFs%3D","line":22,"in_reply_to":"AAAAS3%2F%2FQCo%3D","updated":"2013-10-03 09:53:17.000000000","message":"Femtodone","commit_id":"67d61e91adffc9a10de4dd2b15cbb8afb498f8de"}],"plugins/xenserver/xenapi/etc/xapi.d/plugins/plugin_version.txt":[{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"8fd7d96513baee0ed454d8c2ce1c37ae041b56fd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"1_HAVANA"}],"source_content_type":"text/plain","patch_set":9,"id":"AAAAS3%2F%2FklQ%3D","line":1,"updated":"2013-09-24 15:05:42.000000000","message":"Why not use some kind of semantic versioning for plugins?\n\nPerhaps:\n\nMAJOR VERSION: Reflects release, Grizzly (0), Havana (1), etc\nMINOR VERSION: Bumped on addition or removal of a plugin\nPATCH VERSION: Bumped on update of a plugin\n\nSo if I updated `console` in Havana, it would go from:\n\n1.0.0 -\u003e 1.0.1","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"dbfbcb70ecf9dcb9340d5b220c1f58613a6e0fe0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"1_HAVANA"}],"source_content_type":"text/plain","patch_set":9,"id":"AAAAS3%2F%2FZto%3D","line":1,"in_reply_to":"AAAAS3%2F%2FZwc%3D","updated":"2013-09-27 13:19:14.000000000","message":"Done","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e2b4fefa8ed726144a42a0a55d14076dd45fc28e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"1_HAVANA"}],"source_content_type":"text/plain","patch_set":9,"id":"AAAAS3%2F%2FZwc%3D","line":1,"in_reply_to":"AAAAS3%2F%2FaB8%3D","updated":"2013-09-27 13:06:09.000000000","message":"Sorry, I meant creating a different style of numbering. RPC goes for Major.Minor where major is bumped if old version of that will no longer work, bump minor if you get new features / arguments added.","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"f66b98b4f33f2dd51849a6d3d0f196ec42cff0ea","unresolved":false,"context_lines":[{"line_number":1,"context_line":"1_HAVANA"}],"source_content_type":"text/plain","patch_set":9,"id":"AAAAS3%2F%2FaBg%3D","line":1,"in_reply_to":"AAAAS3%2F%2FaHQ%3D","updated":"2013-09-27 10:17:30.000000000","message":"I think there are good arguments to create a separate numbering; this is an API \"separate\" to OS or the RPC revisions.  I\u0027ll go with Rick\u0027s suggestion for the format though.","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"067518f98730546f953efbca98533776d5c8e8d1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"1_HAVANA"}],"source_content_type":"text/plain","patch_set":9,"id":"AAAAS3%2F%2FaHQ%3D","line":1,"in_reply_to":"AAAAS3%2F%2FklQ%3D","updated":"2013-09-27 09:49:40.000000000","message":"+1 on rick\u0027s suggestion\n\nI wondering if we should track the openstack version numbering, or go for something more like the RPC version numbering. Seems silly to create a different one.\n\nAlso, I really want a unit test to check the content of this file equals the variable in the driver.","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"f66b98b4f33f2dd51849a6d3d0f196ec42cff0ea","unresolved":false,"context_lines":[{"line_number":1,"context_line":"1_HAVANA"}],"source_content_type":"text/plain","patch_set":9,"id":"AAAAS3%2F%2FaB8%3D","line":1,"in_reply_to":"AAAAS3%2F%2FklQ%3D","updated":"2013-09-27 10:17:30.000000000","message":"Done","commit_id":"d543226db3e9ab9c58e58a84c4a1e2997943a9af"}]}
