)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"d376f3888e9b6fa58a5ded6b7b728bd9e985ee29","unresolved":false,"context_lines":[{"line_number":9,"context_line":"- adds an API extension to include list of attached volumes with instance info"},{"line_number":10,"context_line":"- adds v3 api porting as well"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements blueprint servers-add-volume-list"},{"line_number":13,"context_line":"Change-Id: If58dc40b093c2f61c6ae6b82fcd8f0bf53be464a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAAPn%2F%2FWyA%3D","line":12,"updated":"2013-07-03 13:10:39.000000000","message":"needs DocImpact","commit_id":"5e81afd55a08eff6fccd9d627770549a9c89312d"}],"nova/api/openstack/compute/contrib/extended_volumes.py":[{"author":{"_account_id":1711,"name":"Yun Mao","email":"yunmao@gmail.com","username":"yunmao"},"change_message_id":"1e922729ed089e4441eb6c697b3a424878de76c3","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                self._extend_server(context, server, db_instance)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class Extended_volumes(extensions.ExtensionDescriptor):"},{"line_number":64,"context_line":"    \"\"\"Extended Volumes support.\"\"\""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    name \u003d \"ExtendedVolumes\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F5cQ%3D","line":63,"updated":"2013-06-18 18:51:55.000000000","message":"I think the openstack python naming style prefers ExtendedVolumes rather than Extended_volumes","commit_id":"72706773561872009edc9ae02fb7080a4329974a"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ac8993ab23ee3a9aa0c5e7c83d994e94e85b20be","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                self._extend_server(context, server, db_instance)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class Extended_volumes(extensions.ExtensionDescriptor):"},{"line_number":64,"context_line":"    \"\"\"Extended Volumes support.\"\"\""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    name \u003d \"ExtendedVolumes\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F5aM%3D","line":63,"in_reply_to":"AAAAPn%2F%2F5cQ%3D","updated":"2013-06-18 18:59:05.000000000","message":"The naming style does indeed prefer ExtendedVolumes, but the old plugin loading system expects Extended_volumes.","commit_id":"72706773561872009edc9ae02fb7080a4329974a"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"6942f9d13638d6748c56a678015aa6946b30f852","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    \"\"\"Extended Volumes support.\"\"\""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    name \u003d \"ExtendedVolumes\""},{"line_number":67,"context_line":"    alias \u003d \"OS-EXT-VOLUMES\""},{"line_number":68,"context_line":"    namespace \u003d (\"http://docs.openstack.org/compute/ext/\""},{"line_number":69,"context_line":"                 \"extended_volumes/api/v1.1\")"},{"line_number":70,"context_line":"    updated \u003d \"2013-06-07T00:00:00+00:00\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F1lM%3D","line":67,"updated":"2013-06-20 03:48:55.000000000","message":"I don\u0027t think we should be going ALL CAPS for extension aliases. I know there are already some like this but for v3 we\u0027ve been cleaning them up. So an equivalent would just be \"os-extended-volumes\"\n\nAlthough since it appears its the servers functionality which is being extended rather than the volumes functionality thats a bit misleading but I see the extended_availability_zone extension did the same thing :-( So I won\u0027t get too picky.","commit_id":"72706773561872009edc9ae02fb7080a4329974a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"e30151a364388e15208d6c8960acd71619a5e678","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    \"\"\"Extended Volumes support.\"\"\""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    name \u003d \"ExtendedVolumes\""},{"line_number":67,"context_line":"    alias \u003d \"OS-EXT-VOLUMES\""},{"line_number":68,"context_line":"    namespace \u003d (\"http://docs.openstack.org/compute/ext/\""},{"line_number":69,"context_line":"                 \"extended_volumes/api/v1.1\")"},{"line_number":70,"context_line":"    updated \u003d \"2013-06-07T00:00:00+00:00\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F0YA%3D","line":67,"in_reply_to":"AAAAPn%2F%2F1lM%3D","updated":"2013-06-20 14:36:39.000000000","message":"Done","commit_id":"72706773561872009edc9ae02fb7080a4329974a"}],"nova/api/openstack/compute/plugins/v3/extended_volumes.py":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"12c0af0ddfeef5fc004ea0fdc88a156d99d922aa","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                self._extend_server(context, server, db_instance)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class Extended_volumes(extensions.V3APIExtensionBase):"},{"line_number":68,"context_line":"    \"\"\"Extended Volumes support.\"\"\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    name \u003d \"ExtendedVolumes\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FvD0%3D","line":67,"updated":"2013-06-24 04:02:41.000000000","message":"For the v3 version here its probably better to use ExtendedVolumes for the class name since we\u0027re not restricted by the extension loader to use the same name as the file.","commit_id":"48d883cc45ab0dfc60d933a1734347efc5db3554"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"8053bec15ac51607fe2b1bdbcd71d9228d08fc07","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                self._extend_server(context, server, db_instance)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class Extended_volumes(extensions.V3APIExtensionBase):"},{"line_number":68,"context_line":"    \"\"\"Extended Volumes support.\"\"\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    name \u003d \"ExtendedVolumes\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fuj0%3D","line":67,"in_reply_to":"AAAAPn%2F%2Fu6c%3D","updated":"2013-06-24 10:51:37.000000000","message":"The extension loaders are different. The v2 one looks for files in the contrib directory and then matching class names within those files. The v3 loader relies on entries in setup.cfg or entry points defined in modules in PYTHONPATH. In this case if you update setup.cfg to have the new class name it should load ok. Not sure if you have to rerun setup.py but I think the tests harness does that for you in the venv","commit_id":"48d883cc45ab0dfc60d933a1734347efc5db3554"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"586e2e376619d509ac3c4db40f7af516a6f044fb","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                self._extend_server(context, server, db_instance)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class Extended_volumes(extensions.V3APIExtensionBase):"},{"line_number":68,"context_line":"    \"\"\"Extended Volumes support.\"\"\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    name \u003d \"ExtendedVolumes\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fugk%3D","line":67,"in_reply_to":"AAAAPn%2F%2Fuj0%3D","updated":"2013-06-24 11:21:13.000000000","message":"Yeah, I updated setup.cfg but was running nosetests from my IDE. Now when runnig with run_tests.sh it\u0027s ok! Thanks!","commit_id":"48d883cc45ab0dfc60d933a1734347efc5db3554"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"f11b26256e22f32b4697d929ce918a8efe59815f","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                self._extend_server(context, server, db_instance)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class Extended_volumes(extensions.V3APIExtensionBase):"},{"line_number":68,"context_line":"    \"\"\"Extended Volumes support.\"\"\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    name \u003d \"ExtendedVolumes\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fu6c%3D","line":67,"in_reply_to":"AAAAPn%2F%2FvD0%3D","updated":"2013-06-24 08:17:27.000000000","message":"I tryed to rename but it seems that stevedore still looks for Extended_volumes class name and fails. When running unit test I have:\n\nCould not load \u0027extended_volumes\u0027: \u003cmodule \u0027nova.api.openstack.compute.plugins.v3.extended_volumes\u0027 from \u0027/home/obondarev/projects/nova/nova/api/openstack/compute/plugins/v3/extended_volumes.py\u0027\u003e has no \u0027Extended_volumes\u0027 attribute.\n\nAs far as I see the same extension loader is used for v2 and v3 extensions. Am I missing smth?","commit_id":"48d883cc45ab0dfc60d933a1734347efc5db3554"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"ca33de69f35dcbd791959429696497f7d08f4488","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def _extend_server(self, context, server, instance):"},{"line_number":35,"context_line":"        bdms \u003d self.compute_api.get_instance_bdms(context, instance)"},{"line_number":36,"context_line":"        volume_ids \u003d [bdm[\u0027volume_id\u0027] for bdm in bdms if bdm[\u0027volume_id\u0027]]"},{"line_number":37,"context_line":"        if volume_ids:"},{"line_number":38,"context_line":"            key \u003d \"%s:volumes_attached\" % ExtendedVolumes.alias"},{"line_number":39,"context_line":"            server[key] \u003d [{\u0027id\u0027: volume_id} for volume_id in volume_ids]"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FbWs%3D","line":37,"updated":"2013-07-02 07:06:56.000000000","message":"In normally, we show the attribute even the value is empty list, right?","commit_id":"becdf4a15018a253f9f9e332a1ec94335844e09a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"7002350a2fba641c0d92f511d75e15c5c9be247a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def _extend_server(self, context, server, instance):"},{"line_number":35,"context_line":"        bdms \u003d self.compute_api.get_instance_bdms(context, instance)"},{"line_number":36,"context_line":"        volume_ids \u003d [bdm[\u0027volume_id\u0027] for bdm in bdms if bdm[\u0027volume_id\u0027]]"},{"line_number":37,"context_line":"        if volume_ids:"},{"line_number":38,"context_line":"            key \u003d \"%s:volumes_attached\" % ExtendedVolumes.alias"},{"line_number":39,"context_line":"            server[key] \u003d [{\u0027id\u0027: volume_id} for volume_id in volume_ids]"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FbVw%3D","line":37,"in_reply_to":"AAAAPn%2F%2FbWs%3D","updated":"2013-07-02 07:52:29.000000000","message":"Done","commit_id":"becdf4a15018a253f9f9e332a1ec94335844e09a"}],"nova/tests/api/openstack/compute/contrib/test_extended_volumes.py":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"6942f9d13638d6748c56a678015aa6946b30f852","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2011 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F1lU%3D","line":1,"updated":"2013-06-20 03:48:55.000000000","message":"Should fix the copyright year on this","commit_id":"72706773561872009edc9ae02fb7080a4329974a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"e30151a364388e15208d6c8960acd71619a5e678","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2011 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F0X8%3D","line":1,"in_reply_to":"AAAAPn%2F%2F1lU%3D","updated":"2013-06-20 14:36:39.000000000","message":"Done","commit_id":"72706773561872009edc9ae02fb7080a4329974a"}],"nova/tests/api/openstack/compute/plugins/v3/test_extended_volumes.py":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"c32e6f8f3f3339c308ec837409937796cb084f57","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        self.flags("},{"line_number":57,"context_line":"            osapi_compute_extension\u003d["},{"line_number":58,"context_line":"                \u0027nova.api.openstack.compute.contrib.select_extensions\u0027],"},{"line_number":59,"context_line":"            osapi_compute_ext_list\u003d[\u0027ExtendedVolumes\u0027])"},{"line_number":60,"context_line":"        self.app \u003d fakes.wsgi_app_v3(init_only\u003d(\u0027os-extended-volumes\u0027,"},{"line_number":61,"context_line":"                                                \u0027servers\u0027))"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FdYs%3D","line":59,"updated":"2013-07-01 14:40:31.000000000","message":"You don\u0027t need to set these flags for the v3 API, they are v2 specific","commit_id":"9343a67edf851f58580959dca9953eaf55b9e124"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"bfc3f3c31195b2d9ca2cfc9479165154b3e15f07","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        self.flags("},{"line_number":57,"context_line":"            osapi_compute_extension\u003d["},{"line_number":58,"context_line":"                \u0027nova.api.openstack.compute.contrib.select_extensions\u0027],"},{"line_number":59,"context_line":"            osapi_compute_ext_list\u003d[\u0027ExtendedVolumes\u0027])"},{"line_number":60,"context_line":"        self.app \u003d fakes.wsgi_app_v3(init_only\u003d(\u0027os-extended-volumes\u0027,"},{"line_number":61,"context_line":"                                                \u0027servers\u0027))"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FdVE%3D","line":59,"in_reply_to":"AAAAPn%2F%2FdYs%3D","updated":"2013-07-01 14:57:12.000000000","message":"Done","commit_id":"9343a67edf851f58580959dca9953eaf55b9e124"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"ca33de69f35dcbd791959429696497f7d08f4488","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        self.assertEqual(res.status_int, 200)"},{"line_number":76,"context_line":"        server \u003d self._get_server(res.body)"},{"line_number":77,"context_line":"        print server"},{"line_number":78,"context_line":"        exp_volumes \u003d [{\u0027id\u0027: UUID1}, {\u0027id\u0027: UUID2}]"},{"line_number":79,"context_line":"        if self.content_type \u003d\u003d \u0027application/json\u0027:"},{"line_number":80,"context_line":"            actual \u003d server.get(\u0027%svolumes_attached\u0027 % self.prefix)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FbWw%3D","line":77,"updated":"2013-07-02 07:06:56.000000000","message":"This should be removed","commit_id":"becdf4a15018a253f9f9e332a1ec94335844e09a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"7002350a2fba641c0d92f511d75e15c5c9be247a","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        self.assertEqual(res.status_int, 200)"},{"line_number":76,"context_line":"        server \u003d self._get_server(res.body)"},{"line_number":77,"context_line":"        print server"},{"line_number":78,"context_line":"        exp_volumes \u003d [{\u0027id\u0027: UUID1}, {\u0027id\u0027: UUID2}]"},{"line_number":79,"context_line":"        if self.content_type \u003d\u003d \u0027application/json\u0027:"},{"line_number":80,"context_line":"            actual \u003d server.get(\u0027%svolumes_attached\u0027 % self.prefix)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FbWU%3D","line":77,"in_reply_to":"AAAAPn%2F%2FbWw%3D","updated":"2013-07-02 07:52:29.000000000","message":"Oops","commit_id":"becdf4a15018a253f9f9e332a1ec94335844e09a"}],"setup.cfg":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"1954a87a373bf3f38e71cbbee4eb2f030423e577","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    server_diagnostics \u003d nova.api.openstack.compute.plugins.v3.server_diagnostics:ServerDiagnostics"},{"line_number":74,"context_line":"    servers \u003d nova.api.openstack.compute.plugins.v3.servers:Servers"},{"line_number":75,"context_line":"    simple_tenant_usage \u003d nova.api.openstack.compute.plugins.v3.simple_tenant_usage:SimpleTenantUsage"},{"line_number":76,"context_line":"    extended_volumes \u003d nova.api.openstack.compute.plugins.v3.extended_volumes:ExtendedVolumes"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"nova.api.v3.extensions.server.create \u003d"},{"line_number":79,"context_line":"    config_drive \u003d nova.api.openstack.compute.plugins.v3.config_drive:ConfigDrive"}],"source_content_type":"text/x-ttcn-cfg","patch_set":7,"id":"AAAAPn%2F%2FUkw%3D","line":76,"updated":"2013-07-04 01:36:08.000000000","message":"If you have to do a rebase or fix anything else up, then please put this alphabetically in thist list. Trying to minimise number of merge conflicts.","commit_id":"b65ed2b0514e3fc1ead4b6d5aec8007d94ca4a28"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"981f693cd68dc75793ed9d995902745dde1fc1d5","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    server_diagnostics \u003d nova.api.openstack.compute.plugins.v3.server_diagnostics:ServerDiagnostics"},{"line_number":74,"context_line":"    servers \u003d nova.api.openstack.compute.plugins.v3.servers:Servers"},{"line_number":75,"context_line":"    simple_tenant_usage \u003d nova.api.openstack.compute.plugins.v3.simple_tenant_usage:SimpleTenantUsage"},{"line_number":76,"context_line":"    extended_volumes \u003d nova.api.openstack.compute.plugins.v3.extended_volumes:ExtendedVolumes"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"nova.api.v3.extensions.server.create \u003d"},{"line_number":79,"context_line":"    config_drive \u003d nova.api.openstack.compute.plugins.v3.config_drive:ConfigDrive"}],"source_content_type":"text/x-ttcn-cfg","patch_set":7,"id":"AAAAPn%2F%2FUL4%3D","line":76,"in_reply_to":"AAAAPn%2F%2FUkw%3D","updated":"2013-07-04 07:31:19.000000000","message":"Ok, no problem","commit_id":"b65ed2b0514e3fc1ead4b6d5aec8007d94ca4a28"}]}
