)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8a01fa888a8fd64f00a990b01ee464ea1db4368a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"consistent with the usage of SSH keys on Linux, as both"},{"line_number":12,"context_line":"are based on public / private keypairs."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Enables nova-api ti return the keypair type, updates"},{"line_number":15,"context_line":"nova-api version to reflect the changes and updates the"},{"line_number":16,"context_line":"unit and functional tests to validate the API changes."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1a930d6b_30742b35","line":14,"updated":"2015-01-26 19:09:20.000000000","message":"s/ti/to/","commit_id":"a13a9ed867f3b65cda1fcda72d4e45671bb46cd9"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"7ea2b678b6ec0d91e0ab3aa628321501862b7781","unresolved":false,"context_lines":[{"line_number":11,"context_line":"consistent with the usage of SSH keys on Linux, as both"},{"line_number":12,"context_line":"are based on public / private keypairs."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Enables nova-api ti return the keypair type, updates"},{"line_number":15,"context_line":"nova-api version to reflect the changes and updates the"},{"line_number":16,"context_line":"unit and functional tests to validate the API changes."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1a930d6b_b61acec3","line":14,"in_reply_to":"1a930d6b_30742b35","updated":"2015-01-26 22:19:09.000000000","message":"Done","commit_id":"a13a9ed867f3b65cda1fcda72d4e45671bb46cd9"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"97fad3ce7f9aed37bbe616147833cb73499d4167","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Unit tests have been updated to ensure that the keypair"},{"line_number":19,"context_line":"type is not being returned on previous API versions."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partially implements: blueprint keypair-x509-certificates"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I215662f2f92a01921a866c3218031787a9eaf915"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"fa81d914_e01de974","line":20,"updated":"2015-01-28 21:04:22.000000000","message":"DocImpact and APIImpact flag needed","commit_id":"10ca6091a80bec042b80157852ae6dd516223006"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"680c9c06cd4e97a44b5ffe2741b7826478838dcf","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Unit tests have been updated to ensure that the keypair"},{"line_number":19,"context_line":"type is not being returned on previous API versions."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partially implements: blueprint keypair-x509-certificates"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I215662f2f92a01921a866c3218031787a9eaf915"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"fa81d914_28ca7c6e","line":20,"in_reply_to":"fa81d914_e01de974","updated":"2015-01-29 01:48:02.000000000","message":"Done","commit_id":"10ca6091a80bec042b80157852ae6dd516223006"}],"nova/api/openstack/api_version_request.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"03cdc4c1a2690d740e2100b21fc45c5c40b2141d","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    * 2.1 - Initial version. Equivalent to v2.0 code"},{"line_number":41,"context_line":"    * 2.2 - Adds (keypair) type parameter for os-keypairs plugin"},{"line_number":42,"context_line":"            Fixes success status code for create a keypair method"},{"line_number":43,"context_line":"\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba7be1f8_285067d3","line":42,"updated":"2015-02-25 02:02:27.000000000","message":"s/\"create\"/\"create/delete\"/","commit_id":"55f3e5731d0d87795af04dd5f310cf81b1e4569e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"e3c1f47276650de3b718246fe1ad2688c307c2da","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    * 2.1 - Initial version. Equivalent to v2.0 code"},{"line_number":41,"context_line":"    * 2.2 - Adds (keypair) type parameter for os-keypairs plugin"},{"line_number":42,"context_line":"            Fixes success status code for create a keypair method"},{"line_number":43,"context_line":"\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba7be1f8_5bd631f2","line":42,"in_reply_to":"ba7be1f8_285067d3","updated":"2015-02-25 12:56:15.000000000","message":"Done","commit_id":"55f3e5731d0d87795af04dd5f310cf81b1e4569e"}],"nova/api/openstack/compute/contrib/keypairs.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8a01fa888a8fd64f00a990b01ee464ea1db4368a","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        authorize(context, action\u003d\u0027show\u0027)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        try:"},{"line_number":116,"context_line":"            keypair \u003d self.api.get_key_pair(context, context.user_id, id)"},{"line_number":117,"context_line":"        except exception.KeypairNotFound as exc:"},{"line_number":118,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003dexc.format_message())"},{"line_number":119,"context_line":"        return {\u0027keypair\u0027: keypair}"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_f0554350","line":116,"updated":"2015-01-26 19:09:20.000000000","message":"Doesn\u0027t show() need to be decorated with microversioning decorator methods? For clients requesting \u003c\u003d 2.1 API version, the type field should not be in the response.","commit_id":"a13a9ed867f3b65cda1fcda72d4e45671bb46cd9"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"7ea2b678b6ec0d91e0ab3aa628321501862b7781","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        authorize(context, action\u003d\u0027show\u0027)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        try:"},{"line_number":116,"context_line":"            keypair \u003d self.api.get_key_pair(context, context.user_id, id)"},{"line_number":117,"context_line":"        except exception.KeypairNotFound as exc:"},{"line_number":118,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003dexc.format_message())"},{"line_number":119,"context_line":"        return {\u0027keypair\u0027: keypair}"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_5629aae4","line":116,"in_reply_to":"1a930d6b_f0554350","updated":"2015-01-26 22:19:09.000000000","message":"Not sure, but I think the methods in contrib won\u0027t work the same way...\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/wsgi.py#L1068\n\nIt says there that the api_version decorator to be used on any method that has a req as the first argument (True), and is a subclass of wsgi.Controller (False).\n\nStill the decorations can be done to plugins/v3/keypairs.py","commit_id":"a13a9ed867f3b65cda1fcda72d4e45671bb46cd9"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"97fad3ce7f9aed37bbe616147833cb73499d4167","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        try:"},{"line_number":70,"context_line":"            params \u003d body[\u0027keypair\u0027]"},{"line_number":71,"context_line":"            name \u003d params[\u0027name\u0027]"},{"line_number":72,"context_line":"            key_type \u003d params.get(\u0027key_type\u0027, keypair_obj.KEYPAIR_TYPE_SSH)"},{"line_number":73,"context_line":"        except KeyError:"},{"line_number":74,"context_line":"            msg \u003d _(\"Invalid request body\")"},{"line_number":75,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa81d914_a07e91ac","line":72,"updated":"2015-01-28 21:04:22.000000000","message":"you don\u0027t need to put into try / catch\n\nnever happen","commit_id":"10ca6091a80bec042b80157852ae6dd516223006"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"680c9c06cd4e97a44b5ffe2741b7826478838dcf","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        try:"},{"line_number":70,"context_line":"            params \u003d body[\u0027keypair\u0027]"},{"line_number":71,"context_line":"            name \u003d params[\u0027name\u0027]"},{"line_number":72,"context_line":"            key_type \u003d params.get(\u0027key_type\u0027, keypair_obj.KEYPAIR_TYPE_SSH)"},{"line_number":73,"context_line":"        except KeyError:"},{"line_number":74,"context_line":"            msg \u003d _(\"Invalid request body\")"},{"line_number":75,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa81d914_8889a828","line":72,"in_reply_to":"fa81d914_a07e91ac","updated":"2015-01-29 01:48:02.000000000","message":"Indeed, this won\u0027t happen, since keypair type will only be available from api v2.2","commit_id":"10ca6091a80bec042b80157852ae6dd516223006"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c70acd1919912921dc993bdfd92b9dffc7c7ca6f","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        try:"},{"line_number":110,"context_line":"            # The return object needs to be a dict in order to pop the \u0027type\u0027"},{"line_number":111,"context_line":"            # field, since it is incompatible with API version \u003c\u003d 2.1."},{"line_number":112,"context_line":"            keypair \u003d self.api.get_key_pair(context, context.user_id, id)"},{"line_number":113,"context_line":"            keypair \u003d self._filter_keypair(keypair, created_at\u003dTrue,"},{"line_number":114,"context_line":"                                           deleted\u003dTrue, deleted_at\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_d2e5c338","line":111,"updated":"2015-01-30 16:16:52.000000000","message":"emm....this is fine I think? Add new field is back-compatible change, so it is ok.","commit_id":"56bfa1a0e089a84d52c570e80a1578972713eac4"}],"nova/api/openstack/compute/plugins/v3/keypairs.py":[{"author":{"_account_id":9420,"name":"Matthew Gilliard","email":"matthew.gilliard@hp.com","username":"gilliard"},"change_message_id":"2455d768bb4f453c9ebe0de87fb421f3cbd26a04","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003dexc.format_message())"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @extensions.expected_errors(404)"},{"line_number":118,"context_line":"    def show(self, req, id):"},{"line_number":119,"context_line":"        \"\"\"Return data for the given key name.\"\"\""},{"line_number":120,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":121,"context_line":"        authorize(context, action\u003d\u0027show\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a930d6b_5feb8012","line":118,"updated":"2015-01-26 21:17:33.000000000","message":"It\u0027s a breaking change here, isn\u0027t it?  So this method needs @api_version(\"2.2\")","commit_id":"ad128e363458bd443d5d5b51d907946fc2f29b9f"},{"author":{"_account_id":9420,"name":"Matthew Gilliard","email":"matthew.gilliard@hp.com","username":"gilliard"},"change_message_id":"91a4813de4c3f7daa9bce7ee7eb84e712c627f1e","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003dexc.format_message())"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @extensions.expected_errors(404)"},{"line_number":118,"context_line":"    def show(self, req, id):"},{"line_number":119,"context_line":"        \"\"\"Return data for the given key name.\"\"\""},{"line_number":120,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":121,"context_line":"        authorize(context, action\u003d\u0027show\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_5f062087","line":118,"updated":"2015-01-26 21:22:19.000000000","message":"Same comment as PS11.  I think this needs the api_version decorator added.","commit_id":"d355f4f08020726cd8da90991ca1b38b0cb0caa0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c70acd1919912921dc993bdfd92b9dffc7c7ca6f","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    # a response."},{"line_number":82,"context_line":"    @wsgi.Controller.api_version(\"2.1\", \"2.2\")  # noqa"},{"line_number":83,"context_line":"    @extensions.expected_errors((400, 403, 409))"},{"line_number":84,"context_line":"    @validation.schema(keypairs.create)"},{"line_number":85,"context_line":"    def create(self, req, body):"},{"line_number":86,"context_line":"        \"\"\"Create or import keypair."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_e5503fd6","line":84,"updated":"2015-01-30 16:16:52.000000000","message":"there should be 2.1 didn\u0027t support \u0027type\u0027 parameter. we can pass the support version in schema decorator also. like in line 104 https://review.openstack.org/#/c/150641/9/doc/source/devref/api_microversions.rst","commit_id":"56bfa1a0e089a84d52c570e80a1578972713eac4"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"a9e45adad979e2f1ce6af5ac7e2ae9b12dd4c7d9","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    # a response."},{"line_number":82,"context_line":"    @wsgi.Controller.api_version(\"2.1\", \"2.2\")  # noqa"},{"line_number":83,"context_line":"    @extensions.expected_errors((400, 403, 409))"},{"line_number":84,"context_line":"    @validation.schema(keypairs.create)"},{"line_number":85,"context_line":"    def create(self, req, body):"},{"line_number":86,"context_line":"        \"\"\"Create or import keypair."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_0c26f7ba","line":84,"in_reply_to":"fa81d914_e5503fd6","updated":"2015-01-30 21:40:53.000000000","message":"Done","commit_id":"56bfa1a0e089a84d52c570e80a1578972713eac4"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c70acd1919912921dc993bdfd92b9dffc7c7ca6f","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        # microversions, as they won\u0027t be needed anymore, keypair type."},{"line_number":150,"context_line":"        return self._show(req, id, type\u003dTrue)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @wsgi.Controller.api_version(\"2.1\", \"2.2\")  # noqa"},{"line_number":153,"context_line":"    @extensions.expected_errors(404)"},{"line_number":154,"context_line":"    def show(self, req, id):"},{"line_number":155,"context_line":"        return self._show(req, id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_c5efbbe7","line":152,"updated":"2015-01-30 16:16:52.000000000","message":"This shouldn\u0027t support 2.2","commit_id":"56bfa1a0e089a84d52c570e80a1578972713eac4"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"a9e45adad979e2f1ce6af5ac7e2ae9b12dd4c7d9","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        # microversions, as they won\u0027t be needed anymore, keypair type."},{"line_number":150,"context_line":"        return self._show(req, id, type\u003dTrue)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @wsgi.Controller.api_version(\"2.1\", \"2.2\")  # noqa"},{"line_number":153,"context_line":"    @extensions.expected_errors(404)"},{"line_number":154,"context_line":"    def show(self, req, id):"},{"line_number":155,"context_line":"        return self._show(req, id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_ac0fab2d","line":152,"in_reply_to":"fa81d914_c5efbbe7","updated":"2015-01-30 21:40:53.000000000","message":"Done","commit_id":"56bfa1a0e089a84d52c570e80a1578972713eac4"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c70acd1919912921dc993bdfd92b9dffc7c7ca6f","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        # microversions, as they won\u0027t be needed anymore, keypair type."},{"line_number":182,"context_line":"        return self._index(req, type\u003dTrue)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    @wsgi.Controller.api_version(\"2.1\", \"2.2\")  # noqa"},{"line_number":185,"context_line":"    @extensions.expected_errors(())"},{"line_number":186,"context_line":"    def index(self, req):"},{"line_number":187,"context_line":"        return self._index(req)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_65b8cfe5","line":184,"updated":"2015-01-30 16:16:52.000000000","message":"ditto","commit_id":"56bfa1a0e089a84d52c570e80a1578972713eac4"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"a9e45adad979e2f1ce6af5ac7e2ae9b12dd4c7d9","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        # microversions, as they won\u0027t be needed anymore, keypair type."},{"line_number":182,"context_line":"        return self._index(req, type\u003dTrue)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    @wsgi.Controller.api_version(\"2.1\", \"2.2\")  # noqa"},{"line_number":185,"context_line":"    @extensions.expected_errors(())"},{"line_number":186,"context_line":"    def index(self, req):"},{"line_number":187,"context_line":"        return self._index(req)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da86d52c_cc1cdf6d","line":184,"in_reply_to":"fa81d914_65b8cfe5","updated":"2015-01-30 21:40:53.000000000","message":"Done","commit_id":"56bfa1a0e089a84d52c570e80a1578972713eac4"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"1c1da9e8900ea7eb6fa684fbab317ae86aabbef9","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @wsgi.Controller.api_version(\"2.2\")"},{"line_number":55,"context_line":"    @extensions.expected_errors((400, 403, 409))"},{"line_number":56,"context_line":"    @wsgi.response(201)"},{"line_number":57,"context_line":"    @validation.schema(keypairs.create_v22)"},{"line_number":58,"context_line":"    def create(self, req, body):"},{"line_number":59,"context_line":"        \"\"\"Create or import keypair."}],"source_content_type":"text/x-python","patch_set":29,"id":"da86d52c_bffeb8ac","line":56,"updated":"2015-02-16 03:40:33.000000000","message":"I prefer putting @wsgi.response() before @extensions.expected_errors() like delete() for readability.","commit_id":"cd9168ada513eeb556a6546278ab7e7e7b020acf"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"1dfdd93a1942f98161e5d251432ee24ec28fb403","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @wsgi.Controller.api_version(\"2.2\")"},{"line_number":55,"context_line":"    @extensions.expected_errors((400, 403, 409))"},{"line_number":56,"context_line":"    @wsgi.response(201)"},{"line_number":57,"context_line":"    @validation.schema(keypairs.create_v22)"},{"line_number":58,"context_line":"    def create(self, req, body):"},{"line_number":59,"context_line":"        \"\"\"Create or import keypair."}],"source_content_type":"text/x-python","patch_set":29,"id":"da86d52c_53520736","line":56,"in_reply_to":"da86d52c_bffeb8ac","updated":"2015-02-16 14:31:23.000000000","message":"Done","commit_id":"cd9168ada513eeb556a6546278ab7e7e7b020acf"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f7e6ff3a09504bf0c66049557a79e2cbd8568b15","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        You can send a public_key to add an existing ssh/x509 key."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        params: keypair object with:"},{"line_number":69,"context_line":"            name (required) - string"},{"line_number":70,"context_line":"            public_key (optional) - string"},{"line_number":71,"context_line":"            key_type (optional) - string"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba7be1f8_be9b2dc8","line":68,"updated":"2015-02-20 18:23:52.000000000","message":"Technically, the parameter is not a keypair object. It is a JSON-encoded string that should have the keypair information in it.","commit_id":"55f3e5731d0d87795af04dd5f310cf81b1e4569e"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"e3c1f47276650de3b718246fe1ad2688c307c2da","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        You can send a public_key to add an existing ssh/x509 key."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        params: keypair object with:"},{"line_number":69,"context_line":"            name (required) - string"},{"line_number":70,"context_line":"            public_key (optional) - string"},{"line_number":71,"context_line":"            key_type (optional) - string"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba7be1f8_7b14d59f","line":68,"in_reply_to":"ba7be1f8_be9b2dc8","updated":"2015-02-25 12:56:15.000000000","message":"True, but this way it is consistent with the v2.1 create method. :)","commit_id":"55f3e5731d0d87795af04dd5f310cf81b1e4569e"}],"nova/api/openstack/compute/schemas/v3/keypairs.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f7e6ff3a09504bf0c66049557a79e2cbd8568b15","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":40,"context_line":"            \u0027properties\u0027: {"},{"line_number":41,"context_line":"                \u0027name\u0027: parameter_types.name,"},{"line_number":42,"context_line":"                \u0027type\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":43,"context_line":"                \u0027public_key\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":44,"context_line":"            },"},{"line_number":45,"context_line":"            \u0027required\u0027: [\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba7be1f8_bea16dab","line":42,"updated":"2015-02-20 18:23:52.000000000","message":"In the future, you may want to change the above to:\n\n \u0027type\u0027: {\u0027enum\u0027: [\u0027ssh\u0027, \u0027x509\u0027]},","commit_id":"55f3e5731d0d87795af04dd5f310cf81b1e4569e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"77bc0a2cd2d214d23fd78c0ab7459ef6b294621c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":40,"context_line":"            \u0027properties\u0027: {"},{"line_number":41,"context_line":"                \u0027name\u0027: parameter_types.name,"},{"line_number":42,"context_line":"                \u0027type\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":43,"context_line":"                \u0027public_key\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":44,"context_line":"            },"},{"line_number":45,"context_line":"            \u0027required\u0027: [\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_6ea7c7bd","line":42,"updated":"2015-03-03 14:08:24.000000000","message":"why not use \u0027enum\u0027 at here?","commit_id":"a146d1dc2f0570c4430fc4c365d62cea8c94df3b"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"19c1f3437e76b09bf77e0ca8eea0afbf76cb5f77","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":40,"context_line":"            \u0027properties\u0027: {"},{"line_number":41,"context_line":"                \u0027name\u0027: parameter_types.name,"},{"line_number":42,"context_line":"                \u0027type\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":43,"context_line":"                \u0027public_key\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":44,"context_line":"            },"},{"line_number":45,"context_line":"            \u0027required\u0027: [\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_eaeaa0d6","line":42,"in_reply_to":"ba7be1f8_6ea7c7bd","updated":"2015-03-04 01:16:27.000000000","message":"will do.","commit_id":"a146d1dc2f0570c4430fc4c365d62cea8c94df3b"}],"nova/api/openstack/rest_api_version_history.rst":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"1c1da9e8900ea7eb6fa684fbab317ae86aabbef9","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"  Fixes status code for os-keypairs create method from 200 to 201"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"  Fixes status code for os-keypairs create method from 202 to 204"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":29,"id":"da86d52c_dfd1ac30","line":36,"updated":"2015-02-16 03:40:33.000000000","message":"s/create/delete/","commit_id":"cd9168ada513eeb556a6546278ab7e7e7b020acf"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"1dfdd93a1942f98161e5d251432ee24ec28fb403","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"  Fixes status code for os-keypairs create method from 200 to 201"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"  Fixes status code for os-keypairs create method from 202 to 204"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":29,"id":"da86d52c_33575328","line":36,"in_reply_to":"da86d52c_dfd1ac30","updated":"2015-02-16 14:31:23.000000000","message":"Done","commit_id":"cd9168ada513eeb556a6546278ab7e7e7b020acf"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"79c0979c9eec23d7f020a23a78429be870b31980","unresolved":false,"context_lines":[{"line_number":31,"context_line":"  If no keypair type is specified, then the default \u0027ssh\u0027 type of keypair is"},{"line_number":32,"context_line":"  created."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"  Fixes status code for os-keypairs create method from 200 to 201"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"  Fixes status code for os-keypairs delete method from 202 to 204"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":30,"id":"ba7be1f8_fcff91a8","line":34,"updated":"2015-02-20 00:02:39.000000000","message":"Sorry for missing this on my previous review.\n\nWhy do we need to contain this status code changes also in this patch/microversion ?\nThat seems out of scope for the main purpose.","commit_id":"55f3e5731d0d87795af04dd5f310cf81b1e4569e"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"0cafa5881345eaafce3d8f50dad9920d1b178aa0","unresolved":false,"context_lines":[{"line_number":31,"context_line":"  If no keypair type is specified, then the default \u0027ssh\u0027 type of keypair is"},{"line_number":32,"context_line":"  created."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"  Fixes status code for os-keypairs create method from 200 to 201"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"  Fixes status code for os-keypairs delete method from 202 to 204"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":30,"id":"ba7be1f8_f7a6ca52","line":34,"in_reply_to":"ba7be1f8_77f81ae6","updated":"2015-02-20 00:53:21.000000000","message":"I think we need concrete reason for changing status codes to avoid a pendulum in the future.\nNow api-wg spec doesn\u0027t contain the description of this status code, so I have a concern about this change.\n\nIt is better to separate the status code changes from this patch as the scope and change them after we get concrete reason.","commit_id":"55f3e5731d0d87795af04dd5f310cf81b1e4569e"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"2b03eeb32b3c1d29f80945906d3f023336d77560","unresolved":false,"context_lines":[{"line_number":31,"context_line":"  If no keypair type is specified, then the default \u0027ssh\u0027 type of keypair is"},{"line_number":32,"context_line":"  created."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"  Fixes status code for os-keypairs create method from 200 to 201"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"  Fixes status code for os-keypairs delete method from 202 to 204"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":30,"id":"ba7be1f8_77f81ae6","line":34,"in_reply_to":"ba7be1f8_fcff91a8","updated":"2015-02-20 00:30:39.000000000","message":"So I think this is one of the cases where since we are changing the api for keypairs anyway we might as well fix the annoying nits for the same plugin too. As developers need to explictly ask for the new version.","commit_id":"55f3e5731d0d87795af04dd5f310cf81b1e4569e"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"3f9e8f8ca4dc239583e9be6aa8ac5f29b901aa81","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"  Fixes status code for os-keypairs create method from 200 to 201"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"  Fixes status code for os-keypairs delete method from 202 to 204"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":30,"id":"ba7be1f8_65b744d9","line":36,"updated":"2015-02-23 04:18:13.000000000","message":"api-wg spec contains the above HTTP201 case, and doesn\u0027t HTTP204 case.\n\nIf https://review.openstack.org/#/c/158179/ (api-wg spec) is merged before this, I also will +2 this.","commit_id":"55f3e5731d0d87795af04dd5f310cf81b1e4569e"}],"nova/compute/api.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"77bc0a2cd2d214d23fd78c0ab7459ef6b294621c","unresolved":false,"context_lines":[{"line_number":3733,"context_line":"    def _validate_new_key_pair(self, context, user_id, key_name, key_type):"},{"line_number":3734,"context_line":"        if key_type is not keypair_obj.KEYPAIR_TYPE_SSH:"},{"line_number":3735,"context_line":"            raise exception.InvalidKeypair("},{"line_number":3736,"context_line":"                reason\u003d_(\u0027Specified Keypair type \"%s\" is invalid\u0027) % key_type)"},{"line_number":3737,"context_line":""},{"line_number":3738,"context_line":"        safe_chars \u003d \"_- \" + string.digits + string.ascii_letters"},{"line_number":3739,"context_line":"        clean_value \u003d \"\".join(x for x in key_name if x in safe_chars)"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_4e13e3b7","line":3736,"updated":"2015-03-03 14:08:24.000000000","message":"same question, why is not handle by schema?","commit_id":"a146d1dc2f0570c4430fc4c365d62cea8c94df3b"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"19c1f3437e76b09bf77e0ca8eea0afbf76cb5f77","unresolved":false,"context_lines":[{"line_number":3733,"context_line":"    def _validate_new_key_pair(self, context, user_id, key_name, key_type):"},{"line_number":3734,"context_line":"        if key_type is not keypair_obj.KEYPAIR_TYPE_SSH:"},{"line_number":3735,"context_line":"            raise exception.InvalidKeypair("},{"line_number":3736,"context_line":"                reason\u003d_(\u0027Specified Keypair type \"%s\" is invalid\u0027) % key_type)"},{"line_number":3737,"context_line":""},{"line_number":3738,"context_line":"        safe_chars \u003d \"_- \" + string.digits + string.ascii_letters"},{"line_number":3739,"context_line":"        clean_value \u003d \"\".join(x for x in key_name if x in safe_chars)"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_4a256c5a","line":3736,"in_reply_to":"ba7be1f8_4e13e3b7","updated":"2015-03-04 01:16:27.000000000","message":"x509 support is added in the next commit. So, the key_type should only be ssh for now. :)\n\nwill remove it in the next commit.","commit_id":"a146d1dc2f0570c4430fc4c365d62cea8c94df3b"}],"nova/tests/functional/v3/test_keypairs.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"77bc0a2cd2d214d23fd78c0ab7459ef6b294621c","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    expected_post_status_code \u003d 201"},{"line_number":104,"context_line":"    expected_delete_status_code \u003d 204"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def test_keypairs_post(self, public_key\u003dNone):"},{"line_number":107,"context_line":"        return self._check_keypairs_post("},{"line_number":108,"context_line":"            public_key, keypair_type\u003dkeypair_obj.KEYPAIR_TYPE_SSH)"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_4e4be386","line":106,"updated":"2015-03-03 14:08:24.000000000","message":"emm....public_key is not used at anywhere? But this is not your fault. cleanup later","commit_id":"a146d1dc2f0570c4430fc4c365d62cea8c94df3b"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"19c1f3437e76b09bf77e0ca8eea0afbf76cb5f77","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    expected_post_status_code \u003d 201"},{"line_number":104,"context_line":"    expected_delete_status_code \u003d 204"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def test_keypairs_post(self, public_key\u003dNone):"},{"line_number":107,"context_line":"        return self._check_keypairs_post("},{"line_number":108,"context_line":"            public_key, keypair_type\u003dkeypair_obj.KEYPAIR_TYPE_SSH)"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_2a64b8b7","line":106,"in_reply_to":"ba7be1f8_4e4be386","updated":"2015-03-04 01:16:27.000000000","message":"hm, true. you\u0027re right, public_key is never used in this test. I didn\u0027t think about it, since the public_key argument was there before. It should be removed.","commit_id":"a146d1dc2f0570c4430fc4c365d62cea8c94df3b"}]}
