)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"88db0f0b850dfe5fcfd743dc5324d2c82a6291a8","unresolved":false,"context_lines":[{"line_number":15,"context_line":"include a \u0027.py\u0027 extension. To avoid forcing operators to upgrade the"},{"line_number":16,"context_line":"Nova service and per-host plugins at the same time, continue to"},{"line_number":17,"context_line":"reference the old, non-\u0027.py\u0027 filenames, using symlinks to ensure the"},{"line_number":18,"context_line":"references continue to work. Once Mitaka has been released, these"},{"line_number":19,"context_line":"symlinks can be removed, the API version updated and the reference"},{"line_number":20,"context_line":"updated to include the \u0027.py\u0027 extension."},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9a061dce_21cd4831","line":18,"range":{"start_line":18,"start_character":34,"end_line":18,"end_character":40},"updated":"2016-04-07 13:28:48.000000000","message":"Newton","commit_id":"94b17a07bcebcfb8b58f29edefe442264e6d6073"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6d4d9f102e33c1521a34dea098bca1b4352585dd","unresolved":false,"context_lines":[{"line_number":14,"context_line":"Begin working towards a resolution for this by renaming all files to"},{"line_number":15,"context_line":"include a \u0027.py\u0027 extension. To avoid forcing operators to upgrade the"},{"line_number":16,"context_line":"Nova service and per-host plugins at the same time, continue to"},{"line_number":17,"context_line":"reference the old, non-\u0027.py\u0027 filenames, using symlinks to ensure the"},{"line_number":18,"context_line":"references continue to work. Once Newton has been released, these"},{"line_number":19,"context_line":"symlinks can be removed, the API version updated and the reference"},{"line_number":20,"context_line":"updated to include the \u0027.py\u0027 extension."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"1ac06dbe_1ae7b6ac","line":17,"range":{"start_line":17,"start_character":40,"end_line":17,"end_character":54},"updated":"2016-08-24 09:53:21.000000000","message":"I don\u0027t actually see the symlinks in this patch.","commit_id":"25f0a4c2f271300d40c90fc3bbbe57621f48f934"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6db53544224c6dfef54c85b50a023380bb5fd9cd","unresolved":false,"context_lines":[{"line_number":14,"context_line":"Begin working towards a resolution for this by renaming all files to"},{"line_number":15,"context_line":"include a \u0027.py\u0027 extension. To avoid forcing operators to upgrade the"},{"line_number":16,"context_line":"Nova service and per-host plugins at the same time, continue to"},{"line_number":17,"context_line":"reference the old, non-\u0027.py\u0027 filenames, using symlinks to ensure the"},{"line_number":18,"context_line":"references continue to work. Once Newton has been released, these"},{"line_number":19,"context_line":"symlinks can be removed, the API version updated and the reference"},{"line_number":20,"context_line":"updated to include the \u0027.py\u0027 extension."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"fa7ab95a_81ae3496","line":17,"range":{"start_line":17,"start_character":40,"end_line":17,"end_character":54},"in_reply_to":"1ac06dbe_1ae7b6ac","updated":"2016-08-29 11:37:24.000000000","message":"Whoops, these got dropped somewhere along the way. Done.","commit_id":"25f0a4c2f271300d40c90fc3bbbe57621f48f934"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6d4d9f102e33c1521a34dea098bca1b4352585dd","unresolved":false,"context_lines":[{"line_number":17,"context_line":"reference the old, non-\u0027.py\u0027 filenames, using symlinks to ensure the"},{"line_number":18,"context_line":"references continue to work. Once Newton has been released, these"},{"line_number":19,"context_line":"symlinks can be removed, the API version updated and the reference"},{"line_number":20,"context_line":"updated to include the \u0027.py\u0027 extension."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: Icf4cf2424c15276a6c01778fb92f76bbdc9b2068"},{"line_number":23,"context_line":"Closes-bug: #1302831"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"1ac06dbe_7d5ce418","line":20,"updated":"2016-08-24 09:53:21.000000000","message":"So we are asking deployers to ensure the deploy the new plugins, before they restart to use the new nova-compute code.\n\nCan we have a reno note describing that issue please?","commit_id":"25f0a4c2f271300d40c90fc3bbbe57621f48f934"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6db53544224c6dfef54c85b50a023380bb5fd9cd","unresolved":false,"context_lines":[{"line_number":17,"context_line":"reference the old, non-\u0027.py\u0027 filenames, using symlinks to ensure the"},{"line_number":18,"context_line":"references continue to work. Once Newton has been released, these"},{"line_number":19,"context_line":"symlinks can be removed, the API version updated and the reference"},{"line_number":20,"context_line":"updated to include the \u0027.py\u0027 extension."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: Icf4cf2424c15276a6c01778fb92f76bbdc9b2068"},{"line_number":23,"context_line":"Closes-bug: #1302831"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"fa7ab95a_e19d4067","line":20,"in_reply_to":"1ac06dbe_7d5ce418","updated":"2016-08-29 11:37:24.000000000","message":"Done","commit_id":"25f0a4c2f271300d40c90fc3bbbe57621f48f934"}],"nova/tests/unit/virt/xenapi/test_xenapi.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6d4d9f102e33c1521a34dea098bca1b4352585dd","unresolved":false,"context_lines":[{"line_number":4107,"context_line":""},{"line_number":4108,"context_line":"        session.PLUGIN_REQUIRED_VERSION \u003d \u00272.0\u0027"},{"line_number":4109,"context_line":""},{"line_number":4110,"context_line":"        self.mox.StubOutWithMock(session, \u0027call_plugin_serialized\u0027)"},{"line_number":4111,"context_line":"        session.call_plugin_serialized(\u0027nova_plugin_version\u0027, \u0027get_version\u0027,"},{"line_number":4112,"context_line":"                            ).AndReturn(\u00271.8\u0027)"},{"line_number":4113,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1ac06dbe_9abd6604","line":4110,"updated":"2016-08-24 09:53:21.000000000","message":"We really can\u0027t add any more mox tests at this point, even though this is locally consistent here, we should use mock now.","commit_id":"25f0a4c2f271300d40c90fc3bbbe57621f48f934"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6d4d9f102e33c1521a34dea098bca1b4352585dd","unresolved":false,"context_lines":[{"line_number":4155,"context_line":"        with open(path) as plugin_file:"},{"line_number":4156,"context_line":"            for line in plugin_file:"},{"line_number":4157,"context_line":"                if \"PLUGIN_VERSION \u003d \" in line:"},{"line_number":4158,"context_line":"                    plugin_version \u003d line.strip()[17:].strip(\"\u0027\")"},{"line_number":4159,"context_line":""},{"line_number":4160,"context_line":"        self.assertEqual(session.PLUGIN_REQUIRED_VERSION,"},{"line_number":4161,"context_line":"                         plugin_version)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ac06dbe_5a75ae61","line":4158,"range":{"start_line":4158,"start_character":55,"end_line":4158,"end_character":65},"updated":"2016-08-24 09:53:21.000000000","message":"Are we sure this is backwards compatible? this seems odd?","commit_id":"25f0a4c2f271300d40c90fc3bbbe57621f48f934"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6db53544224c6dfef54c85b50a023380bb5fd9cd","unresolved":false,"context_lines":[{"line_number":4155,"context_line":"        with open(path) as plugin_file:"},{"line_number":4156,"context_line":"            for line in plugin_file:"},{"line_number":4157,"context_line":"                if \"PLUGIN_VERSION \u003d \" in line:"},{"line_number":4158,"context_line":"                    plugin_version \u003d line.strip()[17:].strip(\"\u0027\")"},{"line_number":4159,"context_line":""},{"line_number":4160,"context_line":"        self.assertEqual(session.PLUGIN_REQUIRED_VERSION,"},{"line_number":4161,"context_line":"                         plugin_version)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa7ab95a_a627cec8","line":4158,"range":{"start_line":4158,"start_character":55,"end_line":4158,"end_character":65},"in_reply_to":"1ac06dbe_5a75ae61","updated":"2016-08-29 11:37:24.000000000","message":"...and unnecessary. Changed this back.","commit_id":"25f0a4c2f271300d40c90fc3bbbe57621f48f934"}],"nova/virt/xenapi/client/session.py":[{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"89b4d276f237f171c43b7aa5c443cd01c5a9fe25","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    # changed in development environments."},{"line_number":82,"context_line":"    # MAJOR VERSION: Incompatible changes with the plugins"},{"line_number":83,"context_line":"    # MINOR VERSION: Compatible changes, new plguins, etc"},{"line_number":84,"context_line":"    PLUGIN_REQUIRED_VERSION \u003d \u00271.3\u0027"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __init__(self, url, user, pw):"},{"line_number":87,"context_line":"        version_string \u003d version.version_string_with_package()"}],"source_content_type":"text/x-python","patch_set":1,"id":"5aef4532_597c7072","line":84,"updated":"2016-03-07 16:44:17.000000000","message":"Major version change","commit_id":"30594013be77a939d637e2908ab4261312620636"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"89b4d276f237f171c43b7aa5c443cd01c5a9fe25","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        # NOTE(stephenfin): Plugins are Python files, but there\u0027s no reason"},{"line_number":213,"context_line":"        # to expose this to the user. By doing this, we abstract the"},{"line_number":214,"context_line":"        # file-based nature of these plugins"},{"line_number":215,"context_line":"        plugin \u003d plugin + \u0027.py\u0027"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        with self._get_session() as session:"},{"line_number":218,"context_line":"            return self._unwrap_plugin_exceptions("}],"source_content_type":"text/x-python","patch_set":1,"id":"5aef4532_f9d45c48","line":215,"updated":"2016-03-07 16:44:17.000000000","message":"This makes the change backwards incompatible (i.e. an old Nova can\u0027t use new plugins) and would require a change in the major version number for the plugin version number.\n\nThe only way to avoid this would be to enable plugins to be called without the .py extension (i.e. remove this change and still make it work :) )\n\nPerhaps having all the plugins as .py in the source tree, but with symlinks from the non-.py versions where they exist currently?","commit_id":"30594013be77a939d637e2908ab4261312620636"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"bd390d4ea241f1b4306d4814317345502b5608c4","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        # NOTE(stephenfin): Plugins are Python files, but there\u0027s no reason"},{"line_number":213,"context_line":"        # to expose this to the user. By doing this, we abstract the"},{"line_number":214,"context_line":"        # file-based nature of these plugins"},{"line_number":215,"context_line":"        plugin \u003d plugin + \u0027.py\u0027"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        with self._get_session() as session:"},{"line_number":218,"context_line":"            return self._unwrap_plugin_exceptions("}],"source_content_type":"text/x-python","patch_set":1,"id":"5aef4532_559a7015","line":215,"in_reply_to":"5aef4532_35bfe4fc","updated":"2016-03-07 18:13:48.000000000","message":"No - but the point is when you have a deployment the normal upgrade scenario is to update the plugins across all hosts (which is out of band from the normal nova upgrade process), then at some point update the nova services as with any other nova upgrade.\n\nHaving a non-backward compatible change here means that you must upgrade the plugins in-step with the nova services, making such an upgrade notably harder.","commit_id":"30594013be77a939d637e2908ab4261312620636"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0bfc06502b76470a9db2df54593bec1da793986d","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        # NOTE(stephenfin): Plugins are Python files, but there\u0027s no reason"},{"line_number":213,"context_line":"        # to expose this to the user. By doing this, we abstract the"},{"line_number":214,"context_line":"        # file-based nature of these plugins"},{"line_number":215,"context_line":"        plugin \u003d plugin + \u0027.py\u0027"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        with self._get_session() as session:"},{"line_number":218,"context_line":"            return self._unwrap_plugin_exceptions("}],"source_content_type":"text/x-python","patch_set":1,"id":"5aef4532_35bfe4fc","line":215,"in_reply_to":"5aef4532_f9d45c48","updated":"2016-03-07 18:03:54.000000000","message":"Would plugins be kept out of tree (i.e. untied from this change?). If so, I wasn\u0027t aware of that and was trying to be clever. That clearly isn\u0027t going to work in this case, so I\u0027ll just change all the calls.","commit_id":"30594013be77a939d637e2908ab4261312620636"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7a14787e7b197c80faf85390527eef38dd5a4b40","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    # changed in development environments."},{"line_number":82,"context_line":"    # MAJOR VERSION: Incompatible changes with the plugins"},{"line_number":83,"context_line":"    # MINOR VERSION: Compatible changes, new plguins, etc"},{"line_number":84,"context_line":"    PLUGIN_REQUIRED_VERSION \u003d \u00271.3\u0027"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __init__(self, url, user, pw):"},{"line_number":87,"context_line":"        version_string \u003d version.version_string_with_package()"}],"source_content_type":"text/x-python","patch_set":7,"id":"5aef4532_875c1c4c","line":84,"updated":"2016-03-10 12:31:19.000000000","message":"I feel we should bump the version here, at least as a signal.","commit_id":"fdcf91003b16534b1d6a28958ee8de0a9108f179"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"88db0f0b850dfe5fcfd743dc5324d2c82a6291a8","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    # changed in development environments."},{"line_number":82,"context_line":"    # MAJOR VERSION: Incompatible changes with the plugins"},{"line_number":83,"context_line":"    # MINOR VERSION: Compatible changes, new plguins, etc"},{"line_number":84,"context_line":"    PLUGIN_REQUIRED_VERSION \u003d \u00271.3\u0027"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __init__(self, url, user, pw):"},{"line_number":87,"context_line":"        version_string \u003d version.version_string_with_package()"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_44668a2a","line":84,"updated":"2016-04-07 13:28:48.000000000","message":"Bump to 1.4, add comment that 2.0 \u003d\u003d latest in 1.x","commit_id":"94b17a07bcebcfb8b58f29edefe442264e6d6073"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"88db0f0b850dfe5fcfd743dc5324d2c82a6291a8","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        current_version \u003d self.call_plugin_serialized("},{"line_number":117,"context_line":"            \u0027nova_plugin_version\u0027, \u0027get_version\u0027)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        if not versionutils.is_compatible(requested_version, current_version):"},{"line_number":120,"context_line":"            raise self.XenAPI.Failure("},{"line_number":121,"context_line":"                _(\"Plugin version mismatch (Expected %(exp)s, got %(got)s)\") %"},{"line_number":122,"context_line":"                {\u0027exp\u0027: requested_version, \u0027got\u0027: current_version})"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_042f72a1","line":119,"updated":"2016-04-07 13:28:48.000000000","message":"Add special case code that will accept a 2.0 plugin as well.","commit_id":"94b17a07bcebcfb8b58f29edefe442264e6d6073"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"88db0f0b850dfe5fcfd743dc5324d2c82a6291a8","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        # TODO(sfinucan): Once Newton is released, add code in here to add"},{"line_number":213,"context_line":"        # a \u0027.py\u0027 extension to all files, or rewrite all calls to this and"},{"line_number":214,"context_line":"        # related functions to include a \u0027.py\u0027 extension."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        with self._get_session() as session:"},{"line_number":217,"context_line":"            return self._unwrap_plugin_exceptions("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_6722b0a4","line":214,"updated":"2016-04-07 13:28:48.000000000","message":"With the proposed plugin version bump, we can add the .py extension now.","commit_id":"94b17a07bcebcfb8b58f29edefe442264e6d6073"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"a29f03da3e5e52bef95034abb95865887c0e9bea","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        # we can assume that all files will have a \u0027.py\u0027 extension. Until then,"},{"line_number":211,"context_line":"        # handle hosts without this extension by rewriting all calls to plugins"},{"line_number":212,"context_line":"        # to include a \u0027.py\u0027 extension"},{"line_number":213,"context_line":"        plugin \u003d plugin + \u0027.py\u0027"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        with self._get_session() as session:"},{"line_number":216,"context_line":"            return self._unwrap_plugin_exceptions("}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_42e6c815","line":213,"updated":"2016-07-06 13:01:04.000000000","message":"Some plugins already have a .py suffix; we don\u0027t want double .py :)","commit_id":"10f17287799d6e89da6316fe35ce320fec90c985"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"22d0f7791d909ca2b3260f2a707d37f91a3535c5","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        # we can assume that all files will have a \u0027.py\u0027 extension. Until then,"},{"line_number":211,"context_line":"        # handle hosts without this extension by rewriting all calls to plugins"},{"line_number":212,"context_line":"        # to include a \u0027.py\u0027 extension"},{"line_number":213,"context_line":"        plugin \u003d plugin + \u0027.py\u0027"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        with self._get_session() as session:"},{"line_number":216,"context_line":"            return self._unwrap_plugin_exceptions("}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_c80bf7d4","line":213,"in_reply_to":"1aa78d24_42e6c815","updated":"2016-07-06 13:33:22.000000000","message":"Are you sure? I thought none of the files with py were called directly?\n\nSo it turns out xenstore.py is called. probably need to strip \".py\" and add it back.","commit_id":"10f17287799d6e89da6316fe35ce320fec90c985"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"98f2b97cfccfeceb4c3dd7fc07ed964a70d6a698","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        # we can assume that all files will have a \u0027.py\u0027 extension. Until then,"},{"line_number":211,"context_line":"        # handle hosts without this extension by rewriting all calls to plugins"},{"line_number":212,"context_line":"        # to include a \u0027.py\u0027 extension"},{"line_number":213,"context_line":"        plugin \u003d plugin + \u0027.py\u0027"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        with self._get_session() as session:"},{"line_number":216,"context_line":"            return self._unwrap_plugin_exceptions("}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_33078c19","line":213,"in_reply_to":"1aa78d24_c80bf7d4","updated":"2016-07-06 13:42:27.000000000","message":"And partition_utils.py too","commit_id":"10f17287799d6e89da6316fe35ce320fec90c985"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6d4d9f102e33c1521a34dea098bca1b4352585dd","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        # we can assume that all files will have a \u0027.py\u0027 extension. Until then,"},{"line_number":211,"context_line":"        # handle hosts without this extension by rewriting all calls to plugins"},{"line_number":212,"context_line":"        # to include a \u0027.py\u0027 extension"},{"line_number":213,"context_line":"        if not plugin.endswith(\u0027.py\u0027):"},{"line_number":214,"context_line":"            plugin \u003d plugin + \u0027.py\u0027"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        with self._get_session() as session:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ac06dbe_fd21f49e","line":213,"updated":"2016-08-24 09:53:21.000000000","message":"Could we not just fix all the code to add .py as required here?","commit_id":"25f0a4c2f271300d40c90fc3bbbe57621f48f934"}],"plugins/xenserver/xenapi/etc/xapi.d/plugins/agent.py":[{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"a28cb1c197d808d503a110450bfe974c686b00dc","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# TODO(sfinucan): Resolve all \u0027noqa\u0027 items once the above is no longer true"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# TODO(sfinucan): Remove the symlinks in this folder once Liberty is released"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"#"},{"line_number":29,"context_line":"# XenAPI plugin for reading/writing information to xenstore"}],"source_content_type":"text/x-python","patch_set":9,"id":"bab6814e_2edf1d0e","line":26,"range":{"start_line":26,"start_character":58,"end_line":26,"end_character":65},"updated":"2016-05-20 18:34:36.000000000","message":"Liberty -\u003e Newton?","commit_id":"94b17a07bcebcfb8b58f29edefe442264e6d6073"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6d4d9f102e33c1521a34dea098bca1b4352585dd","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# TODO(sfinucan): Resolve all \u0027noqa\u0027 items once the above is no longer true"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# TODO(sfinucan): Remove the symlinks in this folder once Newton is released"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"#"},{"line_number":29,"context_line":"# XenAPI plugin for reading/writing information to xenstore"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ac06dbe_7aa7caa6","line":26,"updated":"2016-08-24 09:53:21.000000000","message":"So I think we are missing the symlinks here?","commit_id":"25f0a4c2f271300d40c90fc3bbbe57621f48f934"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6db53544224c6dfef54c85b50a023380bb5fd9cd","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# TODO(sfinucan): Resolve all \u0027noqa\u0027 items once the above is no longer true"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# TODO(sfinucan): Remove the symlinks in this folder once Newton is released"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"#"},{"line_number":29,"context_line":"# XenAPI plugin for reading/writing information to xenstore"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa7ab95a_81b394e8","line":26,"in_reply_to":"1ac06dbe_7aa7caa6","updated":"2016-08-29 11:37:24.000000000","message":"Done","commit_id":"25f0a4c2f271300d40c90fc3bbbe57621f48f934"}],"plugins/xenserver/xenapi/etc/xapi.d/plugins/nova_plugin_version.py":[{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"d43bb1b6b2633d7f1038c7bc085a9d7bc53f5906","unresolved":false,"context_lines":[{"line_number":29,"context_line":"# 1.1 - New call to check GC status"},{"line_number":30,"context_line":"# 1.2 - Added support for pci passthrough devices"},{"line_number":31,"context_line":"# 1.3 - Add vhd2 functions for doing glance operations by url"},{"line_number":32,"context_line":"PLUGIN_VERSION \u003d \"1.3\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def get_version(session):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5aef4532_09270365","line":32,"updated":"2016-03-08 14:09:30.000000000","message":"To avoid having to upgrade the plugins exactly at the same time as Nova, we could move the plugin comparison logic here.\n\nWe could then update PLUGIN_VERSION to 2.0 and have a is_compatible(session, version) which, in addition to checking the major/minor versions normally, knows that 2.0 is compatible with the 1.x stream.\n\nThis way, we could chose when to break compatibility and depend on the 2.x stream (i.e. Newton, since Mitaka would have a 2.x plugin version)\n\nWe could alternatively have this logic in Nova instead - with REQUIRED_PLUGIN_VERSION \u003d 2.0, but a special case that says 1.4 is also compatible.","commit_id":"bfc370d397582773f6752af6f3d0b9045b4f0f81"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"438b8c5e8eec72a8e0268a89f1668da609ac4392","unresolved":false,"context_lines":[{"line_number":29,"context_line":"# 1.1 - New call to check GC status"},{"line_number":30,"context_line":"# 1.2 - Added support for pci passthrough devices"},{"line_number":31,"context_line":"# 1.3 - Add vhd2 functions for doing glance operations by url"},{"line_number":32,"context_line":"PLUGIN_VERSION \u003d \"1.3\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def get_version(session):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5aef4532_8cfde13c","line":32,"in_reply_to":"5aef4532_09270365","updated":"2016-03-08 14:38:29.000000000","message":"Doesn\u0027t this undermine the whole reason for having a \"REQUIRED_PLUGIN_VERSION\", though? The way I picture it, Nova will compare the REQUIRED_PLUGIN_VERSION to the PLUGIN_VERSION you reference. Updating the REQUIRED_PLUGIN_VERSION to 2.0 will mean patches of PLUGIN_VERSION 1.3 will no longer work but that\u0027s expected. Isn\u0027t it how it worked for 1.2 -\u003e 1.3, for example?","commit_id":"bfc370d397582773f6752af6f3d0b9045b4f0f81"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"88db0f0b850dfe5fcfd743dc5324d2c82a6291a8","unresolved":false,"context_lines":[{"line_number":29,"context_line":"# 1.1 - New call to check GC status"},{"line_number":30,"context_line":"# 1.2 - Added support for pci passthrough devices"},{"line_number":31,"context_line":"# 1.3 - Add vhd2 functions for doing glance operations by url"},{"line_number":32,"context_line":"PLUGIN_VERSION \u003d \"1.3\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def get_version(session):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a061dce_a1ae782b","line":32,"updated":"2016-04-07 13:28:48.000000000","message":"Bump this:\n1.4 - Add support for calling plug-ins with the .py suffix\n\nAlso add a comment saying that v2.0 will be equivalent to the last in the 1.x stream.","commit_id":"94b17a07bcebcfb8b58f29edefe442264e6d6073"}]}
