)]}'
{"nova/api/openstack/compute/contrib/admin_actions.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"725f6a677631c8c22cb71a0f30240569d3c08e97","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @wsgi.action(\u0027unlock\u0027)"},{"line_number":178,"context_line":"    def _unlock(self, req, id, body):"},{"line_number":179,"context_line":"        \"\"\"Permit admins to lock a server.\"\"\""},{"line_number":180,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":181,"context_line":"        authorize(context, \u0027unlock\u0027)"},{"line_number":182,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAQn%2F%2Fw5o%3D","line":179,"updated":"2013-07-23 17:03:55.000000000","message":"Need some updated docs in the extension to reflect that non-admins may be capable of locking/unlocking servers.","commit_id":"2a348cca1ad6492d353c09489a95adcaaae5c68e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"46c2e9620ca1727db36db1681db361751f4df1f1","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        try:"},{"line_number":184,"context_line":"            instance \u003d self.compute_api.get(context, id)"},{"line_number":185,"context_line":"            self.compute_api.unlock(context, instance)"},{"line_number":186,"context_line":"        except exception.PolicyNotAuthorized:"},{"line_number":187,"context_line":"            raise"},{"line_number":188,"context_line":"        except exception.InstanceNotFound:"},{"line_number":189,"context_line":"            raise exc.HTTPNotFound(_(\"Server not found\"))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FSb0%3D","line":186,"updated":"2013-08-02 14:47:23.000000000","message":"what kind of error will the user receive here? should this not raise - exc.HTTPForbidden","commit_id":"45ef10c0ac00695ea61ec7abb84a98bafbcc64ae"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"ecfcddf27e6d1e8cdb23410103301918342ce382","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        try:"},{"line_number":184,"context_line":"            instance \u003d self.compute_api.get(context, id)"},{"line_number":185,"context_line":"            self.compute_api.unlock(context, instance)"},{"line_number":186,"context_line":"        except exception.PolicyNotAuthorized:"},{"line_number":187,"context_line":"            raise"},{"line_number":188,"context_line":"        except exception.InstanceNotFound:"},{"line_number":189,"context_line":"            raise exc.HTTPNotFound(_(\"Server not found\"))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FSAY%3D","line":186,"in_reply_to":"AAAAQn%2F%2FSEM%3D","updated":"2013-08-02 16:16:21.000000000","message":"Scratch that - I didn\u0027t read your comment properly - you are right. \n\nStill it looks kind of convoluted - why not riase the HTTPForbidden here and be explicit.","commit_id":"45ef10c0ac00695ea61ec7abb84a98bafbcc64ae"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"b14a7a75d3a0f52fa19a5141a69068b2bfed9644","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        try:"},{"line_number":184,"context_line":"            instance \u003d self.compute_api.get(context, id)"},{"line_number":185,"context_line":"            self.compute_api.unlock(context, instance)"},{"line_number":186,"context_line":"        except exception.PolicyNotAuthorized:"},{"line_number":187,"context_line":"            raise"},{"line_number":188,"context_line":"        except exception.InstanceNotFound:"},{"line_number":189,"context_line":"            raise exc.HTTPNotFound(_(\"Server not found\"))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FSEM%3D","line":186,"in_reply_to":"AAAAQn%2F%2FSZ4%3D","updated":"2013-08-02 16:03:45.000000000","message":"Not exactly - the re- raised one will not be caught again - you should handle stuff here an raise the appropriate one.","commit_id":"45ef10c0ac00695ea61ec7abb84a98bafbcc64ae"},{"author":{"_account_id":7231,"name":"Jason Dillaman","username":"jdillaman","inactive":true},"change_message_id":"24439f5374cb21a8d5da50683d65fe9c1be8dd8e","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        try:"},{"line_number":184,"context_line":"            instance \u003d self.compute_api.get(context, id)"},{"line_number":185,"context_line":"            self.compute_api.unlock(context, instance)"},{"line_number":186,"context_line":"        except exception.PolicyNotAuthorized:"},{"line_number":187,"context_line":"            raise"},{"line_number":188,"context_line":"        except exception.InstanceNotFound:"},{"line_number":189,"context_line":"            raise exc.HTTPNotFound(_(\"Server not found\"))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FSZ4%3D","line":186,"in_reply_to":"AAAAQn%2F%2FSb0%3D","updated":"2013-08-02 14:55:17.000000000","message":"The extension library will convert the PolicyNotAuthorized exception to HTTPForbidden.  However, the PolicyNotAuthorized exception is being swallowed by the generic Exception handler below.","commit_id":"45ef10c0ac00695ea61ec7abb84a98bafbcc64ae"}],"nova/api/openstack/compute/plugins/v3/extended_status.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"b269108ba904d1d0eeb106d6f3393978fcd76084","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        self.compute_api \u003d compute.API()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _extend_server(self, server, instance):"},{"line_number":32,"context_line":"        for state in [\u0027task_state\u0027, \u0027vm_state\u0027, \u0027power_state\u0027, \u0027locked\u0027]:"},{"line_number":33,"context_line":"            key \u003d \"%s:%s\" % (ExtendedStatus.alias, state)"},{"line_number":34,"context_line":"            server[key] \u003d instance[state]"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Ftf4%3D","line":32,"updated":"2013-07-24 16:31:21.000000000","message":"Should this be \u0027locked_by\u0027 now?","commit_id":"ccf4400551c9fba20af770ae9cc3987b379642ac"}],"nova/compute/api.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"725f6a677631c8c22cb71a0f30240569d3c08e97","unresolved":false,"context_lines":[{"line_number":2475,"context_line":"    @wrap_check_policy"},{"line_number":2476,"context_line":"    def lock(self, context, instance):"},{"line_number":2477,"context_line":"        \"\"\"Lock the given instance.\"\"\""},{"line_number":2478,"context_line":"        # Only update the lock if we\u0027re not the owner"},{"line_number":2479,"context_line":"        if instance[\u0027locked\u0027] and \\"},{"line_number":2480,"context_line":"           instance[\u0027project_id\u0027] \u003d\u003d context.project_id:"},{"line_number":2481,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAQn%2F%2Fw5w%3D","line":2478,"updated":"2013-07-23 17:03:55.000000000","message":"So non-admin can \"take over\" a lock from an admin?\n\nOnce they do that, can\u0027t they unlock an admin locked instance?","commit_id":"2a348cca1ad6492d353c09489a95adcaaae5c68e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"a7502a23eaf55e6663a10b15ffdbee04fb10ae8e","unresolved":false,"context_lines":[{"line_number":2493,"context_line":"        expect_locked_by \u003d \u0027owner\u0027 if is_owner else \u0027admin\u0027"},{"line_number":2494,"context_line":"        locked_by \u003d instance[\u0027locked_by\u0027]"},{"line_number":2495,"context_line":"        if locked_by and locked_by !\u003d expect_locked_by:"},{"line_number":2496,"context_line":"            check_policy(context, \u0027unlock_override\u0027, {})"},{"line_number":2497,"context_line":""},{"line_number":2498,"context_line":"        context \u003d context.elevated()"},{"line_number":2499,"context_line":"        instance_uuid \u003d instance[\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FSPw%3D","line":2496,"updated":"2013-08-02 15:36:39.000000000","message":"User may change the config of policy.json, so this won\u0027t work for  \u0027rule:admin_or_owner\u0027\n\nThis should be \u0027check_policy(context, \u0027unlock_override\u0027, instance)\u0027","commit_id":"45ef10c0ac00695ea61ec7abb84a98bafbcc64ae"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"330b9df428998d39f84a1adad348bda2ccc6ce91","unresolved":false,"context_lines":[{"line_number":2486,"context_line":""},{"line_number":2487,"context_line":"    @wrap_check_policy"},{"line_number":2488,"context_line":"    def unlock(self, context, instance):"},{"line_number":2489,"context_line":"        \"\"\"Unlock the given instance.\"\"\""},{"line_number":2490,"context_line":"        # If the instance was locked by someone else, check"},{"line_number":2491,"context_line":"        # that we\u0027re allowed to override the lock"},{"line_number":2492,"context_line":"        is_owner \u003d instance[\u0027project_id\u0027] \u003d\u003d context.project_id"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2FQfA%3D","line":2489,"updated":"2013-08-03 07:22:24.000000000","message":"Would it be worthwhile checking if the instance is locked prior to attempting to unlock?","commit_id":"152477071cd63796e5c85b9cd7f01fb6cce5cbce"}],"nova/db/sqlalchemy/models.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"725f6a677631c8c22cb71a0f30240569d3c08e97","unresolved":false,"context_lines":[{"line_number":242,"context_line":"    # An instance may have moved to another host by live migration."},{"line_number":243,"context_line":"    launched_on \u003d Column(Text, nullable\u003dTrue)"},{"line_number":244,"context_line":"    locked \u003d Column(Boolean, nullable\u003dTrue)"},{"line_number":245,"context_line":"    locked_by \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    os_type \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":248,"context_line":"    architecture \u003d Column(String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAQn%2F%2Fw5Y%3D","line":245,"updated":"2013-07-23 17:03:55.000000000","message":"Would be nice to indicate that this is a tenant/project id.","commit_id":"2a348cca1ad6492d353c09489a95adcaaae5c68e"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"40fbf2c100c07716501e41d5445065a3d2941b18","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    # An instance may have moved to another host by live migration."},{"line_number":248,"context_line":"    launched_on \u003d Column(Text, nullable\u003dTrue)"},{"line_number":249,"context_line":"    locked \u003d Column(Boolean, nullable\u003dTrue)"},{"line_number":250,"context_line":"    locked_by_project_id \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    os_type \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":253,"context_line":"    architecture \u003d Column(String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2Ft70%3D","line":250,"updated":"2013-07-24 14:39:34.000000000","message":"Do we care what project id locked the instance?  I\u0027m just wondering if it\u0027s good enough to make this a boolean like \"admin_locked\" or \"owner_locked\".\n\nYou could also create a tri-state field named \"locked_by\" with values: \"none\", \"admin\", or \"owner.\"  Then deprecated the \"locked\" column for removal in the next major release.\n\nThoughts?","commit_id":"cbc310a7d3c9993e470edb842b83c7c10f1c9183"},{"author":{"_account_id":7231,"name":"Jason Dillaman","username":"jdillaman","inactive":true},"change_message_id":"97a4a6b61f106931aab50bb17d4ddb5882e98f0c","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    # An instance may have moved to another host by live migration."},{"line_number":248,"context_line":"    launched_on \u003d Column(Text, nullable\u003dTrue)"},{"line_number":249,"context_line":"    locked \u003d Column(Boolean, nullable\u003dTrue)"},{"line_number":250,"context_line":"    locked_by_project_id \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    os_type \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":253,"context_line":"    architecture \u003d Column(String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2Ft4I%3D","line":250,"in_reply_to":"AAAAQn%2F%2Ft70%3D","updated":"2013-07-24 14:56:02.000000000","message":"Sounds good to me (null, \u0027admin\u0027, \u0027owner\u0027)","commit_id":"cbc310a7d3c9993e470edb842b83c7c10f1c9183"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"b269108ba904d1d0eeb106d6f3393978fcd76084","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    # An instance may have moved to another host by live migration."},{"line_number":248,"context_line":"    launched_on \u003d Column(Text, nullable\u003dTrue)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    # NOTE(jdillaman): locked deprecated in favor of locked_by"},{"line_number":251,"context_line":"    locked \u003d Column(Boolean, nullable\u003dTrue)"},{"line_number":252,"context_line":"    locked_by \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":253,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Ftg0%3D","line":250,"updated":"2013-07-24 16:31:21.000000000","message":"...to be removed in Icehouse","commit_id":"ccf4400551c9fba20af770ae9cc3987b379642ac"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"b269108ba904d1d0eeb106d6f3393978fcd76084","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    # NOTE(jdillaman): locked deprecated in favor of locked_by"},{"line_number":251,"context_line":"    locked \u003d Column(Boolean, nullable\u003dTrue)"},{"line_number":252,"context_line":"    locked_by \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    os_type \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":255,"context_line":"    architecture \u003d Column(String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fthk%3D","line":252,"updated":"2013-07-24 16:31:21.000000000","message":"Please note the possible values.  Also 255 chars is a probably more than necessary. :)","commit_id":"ccf4400551c9fba20af770ae9cc3987b379642ac"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"541088a82561ad58b159a529500303cb0c0f23c0","unresolved":false,"context_lines":[{"line_number":250,"context_line":"    # NOTE(jdillaman): locked deprecated in favor of locked_by,"},{"line_number":251,"context_line":"    # to be removed in I release"},{"line_number":252,"context_line":"    locked \u003d Column(Boolean, nullable\u003dTrue)"},{"line_number":253,"context_line":"    locked_by \u003d Column(String(5), nullable\u003dTrue)  # null, \"owner\" or \"admin\""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    os_type \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":256,"context_line":"    architecture \u003d Column(String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FScw%3D","line":253,"updated":"2013-08-02 14:44:37.000000000","message":"would a boolean here be an option - for example, locked_by_admin?","commit_id":"45ef10c0ac00695ea61ec7abb84a98bafbcc64ae"},{"author":{"_account_id":7231,"name":"Jason Dillaman","username":"jdillaman","inactive":true},"change_message_id":"24439f5374cb21a8d5da50683d65fe9c1be8dd8e","unresolved":false,"context_lines":[{"line_number":250,"context_line":"    # NOTE(jdillaman): locked deprecated in favor of locked_by,"},{"line_number":251,"context_line":"    # to be removed in I release"},{"line_number":252,"context_line":"    locked \u003d Column(Boolean, nullable\u003dTrue)"},{"line_number":253,"context_line":"    locked_by \u003d Column(String(5), nullable\u003dTrue)  # null, \"owner\" or \"admin\""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    os_type \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":256,"context_line":"    architecture \u003d Column(String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FSaY%3D","line":253,"in_reply_to":"AAAAQn%2F%2FScw%3D","updated":"2013-08-02 14:55:17.000000000","message":"Since the goal would be to deprecate \"locked\", you cannot use a boolean as that would only offer two-states (not locked and locked by admin).","commit_id":"45ef10c0ac00695ea61ec7abb84a98bafbcc64ae"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"e308fdf17abb06870d07e653cc6d59810ebe664d","unresolved":false,"context_lines":[{"line_number":250,"context_line":"    # NOTE(jdillaman): locked deprecated in favor of locked_by,"},{"line_number":251,"context_line":"    # to be removed in I release"},{"line_number":252,"context_line":"    locked \u003d Column(Boolean, nullable\u003dTrue)"},{"line_number":253,"context_line":"    locked_by \u003d Column(String(5), nullable\u003dTrue)  # null, \"owner\" or \"admin\""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    os_type \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":256,"context_line":"    architecture \u003d Column(String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2FQfQ%3D","line":253,"updated":"2013-08-03 07:05:03.000000000","message":"nit: consider using an enum","commit_id":"152477071cd63796e5c85b9cd7f01fb6cce5cbce"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"386a4947db83542eee582462291cfb7c6d84e7a7","unresolved":false,"context_lines":[{"line_number":250,"context_line":"    # NOTE(jdillaman): locked deprecated in favor of locked_by,"},{"line_number":251,"context_line":"    # to be removed in I release"},{"line_number":252,"context_line":"    locked \u003d Column(Boolean, nullable\u003dTrue)"},{"line_number":253,"context_line":"    locked_by \u003d Column(String(5), nullable\u003dTrue)  # null, \"owner\" or \"admin\""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    os_type \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":256,"context_line":"    architecture \u003d Column(String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2FQNE%3D","line":253,"in_reply_to":"AAAAQn%2F%2FQe0%3D","updated":"2013-08-03 18:00:18.000000000","message":"My bad - this is supported at the moment. An Enum is a good idea.","commit_id":"152477071cd63796e5c85b9cd7f01fb6cce5cbce"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"330b9df428998d39f84a1adad348bda2ccc6ce91","unresolved":false,"context_lines":[{"line_number":250,"context_line":"    # NOTE(jdillaman): locked deprecated in favor of locked_by,"},{"line_number":251,"context_line":"    # to be removed in I release"},{"line_number":252,"context_line":"    locked \u003d Column(Boolean, nullable\u003dTrue)"},{"line_number":253,"context_line":"    locked_by \u003d Column(String(5), nullable\u003dTrue)  # null, \"owner\" or \"admin\""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    os_type \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":256,"context_line":"    architecture \u003d Column(String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAQn%2F%2FQe0%3D","line":253,"in_reply_to":"AAAAQn%2F%2FQfQ%3D","updated":"2013-08-03 07:22:24.000000000","message":"this is only supported in sql alchemy 0.8 (which we currently do not use)","commit_id":"152477071cd63796e5c85b9cd7f01fb6cce5cbce"}],"nova/objects/instance.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"38759062f437ccff4ad975c22ad94450ac1d08fa","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        \u0027launched_on\u0027: obj_utils.str_or_none,"},{"line_number":95,"context_line":"        \u0027locked\u0027: bool,"},{"line_number":96,"context_line":"        \u0027locked_by\u0027: obj_utils.str_or_none,"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        \u0027os_type\u0027: obj_utils.str_or_none,"},{"line_number":99,"context_line":"        \u0027architecture\u0027: obj_utils.str_or_none,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAQn%2F%2FMC8%3D","line":96,"updated":"2013-08-05 18:47:54.000000000","message":"You need to bump the object version for this change.","commit_id":"df5dca6f37f1961a3444760d05c3513e3566df76"}],"nova/tests/api/openstack/compute/plugins/v3/test_extended_status.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"b269108ba904d1d0eeb106d6f3393978fcd76084","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def fake_compute_get(*args, **kwargs):"},{"line_number":34,"context_line":"    return fakes.stub_instance(1, uuid\u003dUUID3, task_state\u003d\"kayaking\","},{"line_number":35,"context_line":"            vm_state\u003d\"slightly crunchy\", power_state\u003d1, locked\u003dTrue)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def fake_compute_get_all(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Ftfs%3D","line":35,"updated":"2013-07-24 16:31:21.000000000","message":"locked_by?","commit_id":"ccf4400551c9fba20af770ae9cc3987b379642ac"}],"nova/tests/compute/test_compute.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"725f6a677631c8c22cb71a0f30240569d3c08e97","unresolved":false,"context_lines":[{"line_number":2692,"context_line":"        self.compute.terminate_instance(self.context,"},{"line_number":2693,"context_line":"                instance\u003djsonutils.to_primitive(instance))"},{"line_number":2694,"context_line":""},{"line_number":2695,"context_line":"    def test_tenant_lock(self):"},{"line_number":2696,"context_line":"        admin_context \u003d context.RequestContext(\u0027admin-user\u0027,"},{"line_number":2697,"context_line":"                                               \u0027admin-project\u0027,"},{"line_number":2698,"context_line":"                                               is_admin\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAQn%2F%2Fw5I%3D","line":2695,"updated":"2013-07-23 17:03:55.000000000","message":"Test that tenant cannot \"take over\" an admin lock?","commit_id":"2a348cca1ad6492d353c09489a95adcaaae5c68e"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"40fbf2c100c07716501e41d5445065a3d2941b18","unresolved":false,"context_lines":[{"line_number":2692,"context_line":"        self.compute.terminate_instance(self.context,"},{"line_number":2693,"context_line":"                instance\u003djsonutils.to_primitive(instance))"},{"line_number":2694,"context_line":""},{"line_number":2695,"context_line":"    def test_lock_by_owner(self):"},{"line_number":2696,"context_line":"        admin_context \u003d context.RequestContext(\u0027admin-user\u0027,"},{"line_number":2697,"context_line":"                                               \u0027admin-project\u0027,"},{"line_number":2698,"context_line":"                                               is_admin\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2Ft8o%3D","line":2695,"updated":"2013-07-24 14:39:34.000000000","message":"Not a big deal, but it would be nice if these were separate test cases for each assertion.","commit_id":"cbc310a7d3c9993e470edb842b83c7c10f1c9183"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"b269108ba904d1d0eeb106d6f3393978fcd76084","unresolved":false,"context_lines":[{"line_number":2701,"context_line":"        instance_uuid \u003d instance[\u0027uuid\u0027]"},{"line_number":2702,"context_line":"        self.compute.run_instance(self.context, instance\u003dinstance)"},{"line_number":2703,"context_line":""},{"line_number":2704,"context_line":"        def check_locked_by(locked_by):"},{"line_number":2705,"context_line":"            instance \u003d db.instance_get_by_uuid(self.context, instance_uuid)"},{"line_number":2706,"context_line":"            self.assertEqual(instance[\u0027locked\u0027], locked_by !\u003d None)"},{"line_number":2707,"context_line":"            self.assertEqual(instance[\u0027locked_by\u0027], locked_by)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FtgQ%3D","line":2704,"updated":"2013-07-24 16:31:21.000000000","message":"getting nit picky now, but you might as well move the check_locked_by_method up a level to avoid the cut-and-paste.","commit_id":"ccf4400551c9fba20af770ae9cc3987b379642ac"}]}
