)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"389bad59dc1523152fd34a28ff152c8ddfa85e6a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"in API to support adding tags when"},{"line_number":12,"context_line":"booting instances."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Implemetes: blueprint support-tag-instance-when-boot"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: Ifcaaf285c8f98a1d0e8bbbc87b2f57fbce057346"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":35,"id":"1f1a1f67_ebcf7926","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":52},"updated":"2017-07-18 15:09:55.000000000","message":"s/Implemetes/Implements/","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"}],"api-ref/source/parameters.yaml":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f423e635052b3b4166786bc5b8fcdbf3d820a0fd","unresolved":false,"context_lines":[{"line_number":4743,"context_line":"  type: string"},{"line_number":4744,"context_line":"server_tags_create:"},{"line_number":4745,"context_line":"  description: |"},{"line_number":4746,"context_line":"    A list of tags. The maximum count of tags in this list is 50."},{"line_number":4747,"context_line":""},{"line_number":4748,"context_line":"    .. note:: Create instances with tags is not supported in Cells V1"},{"line_number":4749,"context_line":"              deployments."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3f1d235d_f73dda2c","line":4746,"updated":"2017-06-29 05:41:11.000000000","message":"We can have more description like the max length of each tag, and what kind characters are valid.","commit_id":"f90495d616c6b9591a2964c3ea5a73677d16771c"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"3d810658a10b62099873dc11912a411da24311ca","unresolved":false,"context_lines":[{"line_number":4743,"context_line":"  type: string"},{"line_number":4744,"context_line":"server_tags_create:"},{"line_number":4745,"context_line":"  description: |"},{"line_number":4746,"context_line":"    A list of tags. The maximum count of tags in this list is 50."},{"line_number":4747,"context_line":""},{"line_number":4748,"context_line":"    .. note:: Create instances with tags is not supported in Cells V1"},{"line_number":4749,"context_line":"              deployments."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3f1d235d_e26ee894","line":4746,"in_reply_to":"3f1d235d_f73dda2c","updated":"2017-07-03 02:07:33.000000000","message":"Done","commit_id":"f90495d616c6b9591a2964c3ea5a73677d16771c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"cf5ac983bc79a3e1f93e83448df7bc0629c53f62","unresolved":false,"context_lines":[{"line_number":4783,"context_line":"    Tags are string with length limit to 60 characters and should"},{"line_number":4784,"context_line":"    not include ``,`` and ``\\``."},{"line_number":4785,"context_line":""},{"line_number":4786,"context_line":"    .. note:: Create instances with tags is not supported in Cells V1"},{"line_number":4787,"context_line":"              deployments."},{"line_number":4788,"context_line":"  in: body"},{"line_number":4789,"context_line":"  required: false"},{"line_number":4790,"context_line":"  type: array"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"3f1d235d_2303c275","line":4787,"range":{"start_line":4786,"start_character":4,"end_line":4787,"end_character":26},"updated":"2017-07-03 06:17:48.000000000","message":"I remember Matt mention that, we needn\u0027t talk about cellsV1 in the API doc. Since the API user didn\u0027t know about the underlayer deployment.","commit_id":"e5fb35386ad83f0788200f86df058b15671ec377"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"ab461d90ea1b1f9acac3a8b7f67950c2a95488fb","unresolved":false,"context_lines":[{"line_number":4783,"context_line":"    Tags are string with length limit to 60 characters and should"},{"line_number":4784,"context_line":"    not include ``,`` and ``\\``."},{"line_number":4785,"context_line":""},{"line_number":4786,"context_line":"    .. note:: Create instances with tags is not supported in Cells V1"},{"line_number":4787,"context_line":"              deployments."},{"line_number":4788,"context_line":"  in: body"},{"line_number":4789,"context_line":"  required: false"},{"line_number":4790,"context_line":"  type: array"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"3f1d235d_95d52946","line":4787,"range":{"start_line":4786,"start_character":4,"end_line":4787,"end_character":26},"in_reply_to":"3f1d235d_2303c275","updated":"2017-07-03 06:19:14.000000000","message":"Done","commit_id":"e5fb35386ad83f0788200f86df058b15671ec377"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"57604669505a933aa8817759f97df95376c594aa","unresolved":false,"context_lines":[{"line_number":4946,"context_line":"server_tags_create:"},{"line_number":4947,"context_line":"  description: |"},{"line_number":4948,"context_line":"    A list of tags. The maximum count of tags in this list is 50."},{"line_number":4949,"context_line":"    Tags are string with length limit to 60 characters and should"},{"line_number":4950,"context_line":"    not include ``,`` and ``\\``."},{"line_number":4951,"context_line":"  in: body"},{"line_number":4952,"context_line":"  required: false"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"1f1a1f67_acd013f9","line":4949,"range":{"start_line":4949,"start_character":4,"end_line":4949,"end_character":19},"updated":"2017-07-13 06:12:40.000000000","message":"Each tag is a string, maybe?","commit_id":"8e90f1fa74880eeaab77b31f572f600468c8496f"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"99b2ae5c1d16bda92982fcd2e4894447c5a58182","unresolved":false,"context_lines":[{"line_number":4946,"context_line":"server_tags_create:"},{"line_number":4947,"context_line":"  description: |"},{"line_number":4948,"context_line":"    A list of tags. The maximum count of tags in this list is 50."},{"line_number":4949,"context_line":"    Tags are string with length limit to 60 characters and should"},{"line_number":4950,"context_line":"    not include ``,`` and ``\\``."},{"line_number":4951,"context_line":"  in: body"},{"line_number":4952,"context_line":"  required: false"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"1f1a1f67_a0b6d7d8","line":4949,"range":{"start_line":4949,"start_character":4,"end_line":4949,"end_character":19},"in_reply_to":"1f1a1f67_acd013f9","updated":"2017-07-13 06:29:09.000000000","message":"Done","commit_id":"8e90f1fa74880eeaab77b31f572f600468c8496f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f13dc14a2dfd09d6f5d571203c0e1390ff96d1c","unresolved":false,"context_lines":[{"line_number":4946,"context_line":"server_tags_create:"},{"line_number":4947,"context_line":"  description: |"},{"line_number":4948,"context_line":"    A list of tags. The maximum count of tags in this list is 50."},{"line_number":4949,"context_line":"    Each tag is a string, with length limit to 60 characters and"},{"line_number":4950,"context_line":"    should not include ``,`` and ``\\``."},{"line_number":4951,"context_line":"  in: body"},{"line_number":4952,"context_line":"  required: false"},{"line_number":4953,"context_line":"  type: array"}],"source_content_type":"text/x-yaml","patch_set":28,"id":"1f1a1f67_8e11a6af","line":4950,"range":{"start_line":4949,"start_character":61,"end_line":4950,"end_character":39},"updated":"2017-07-14 02:11:54.000000000","message":"nit: seems like it would be better to talk about what it can include rather than what it cannot include, like, does this mean I can include $ and %?\n\nThere is a good description here:\n\nhttps://developer.openstack.org/api-ref/compute/#server-tags-servers-tags\n\nMaybe we should re-use that? Although I\u0027m not sure about the \"Tags are case sensitive.\" claim since mysql isn\u0027t case sensitive by default.","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cdc6e6322d78cdab626595bf105565fff1dd429d","unresolved":false,"context_lines":[{"line_number":4965,"context_line":"  type: string"},{"line_number":4966,"context_line":"server_tags_create:"},{"line_number":4967,"context_line":"  description: |"},{"line_number":4968,"context_line":"    A list of tags. Tags have the following restrictions:"},{"line_number":4969,"context_line":""},{"line_number":4970,"context_line":"    - Tag is a Unicode bytestring no longer than 60 characters."},{"line_number":4971,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":31,"id":"1f1a1f67_97c63b48","line":4968,"updated":"2017-07-14 19:42:46.000000000","message":"Looks good:\n\nhttp://docs-draft.openstack.org/00/469800/31/check/gate-nova-api-ref/33ccfbe//api-ref/build/html/?expanded\u003dcreate-server-detail#id10","commit_id":"9051bb2269fbbef3f271fda91ec5ba69d3dc28b0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"30b696e5f34fe92efb76393a054121df2ae1ec5f","unresolved":false,"context_lines":[{"line_number":4971,"context_line":""},{"line_number":4972,"context_line":"    - Tag is a non-empty string."},{"line_number":4973,"context_line":""},{"line_number":4974,"context_line":"    - Tags are case sensitive."},{"line_number":4975,"context_line":""},{"line_number":4976,"context_line":"    - \u0027/\u0027 is not allowed to be in a tag name"},{"line_number":4977,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":35,"id":"1f1a1f67_e2068ace","line":4974,"range":{"start_line":4974,"start_character":6,"end_line":4974,"end_character":30},"updated":"2017-07-18 08:42:30.000000000","message":"I think we have bug for this https://bugs.launchpad.net/nova/+bug/1538011\n\nYea, it won\u0027t be fixed in your patch. I plan to fix it in next release.","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"09176463e8bbc3975363a4e9498cb65150f1c721","unresolved":false,"context_lines":[{"line_number":4971,"context_line":""},{"line_number":4972,"context_line":"    - Tag is a non-empty string."},{"line_number":4973,"context_line":""},{"line_number":4974,"context_line":"    - Tags are case sensitive."},{"line_number":4975,"context_line":""},{"line_number":4976,"context_line":"    - \u0027/\u0027 is not allowed to be in a tag name"},{"line_number":4977,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":35,"id":"1f1a1f67_ebf1b902","line":4974,"range":{"start_line":4974,"start_character":6,"end_line":4974,"end_character":30},"in_reply_to":"1f1a1f67_716a3ded","updated":"2017-07-18 15:04:56.000000000","message":"I prefer to remove this words. But I\u0027m ok with a later patch.","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"14b149b9d366942c5366f3c7e211aa88f1724b21","unresolved":false,"context_lines":[{"line_number":4971,"context_line":""},{"line_number":4972,"context_line":"    - Tag is a non-empty string."},{"line_number":4973,"context_line":""},{"line_number":4974,"context_line":"    - Tags are case sensitive."},{"line_number":4975,"context_line":""},{"line_number":4976,"context_line":"    - \u0027/\u0027 is not allowed to be in a tag name"},{"line_number":4977,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":35,"id":"1f1a1f67_716a3ded","line":4974,"range":{"start_line":4974,"start_character":6,"end_line":4974,"end_character":30},"in_reply_to":"1f1a1f67_e2068ace","updated":"2017-07-18 14:31:03.000000000","message":"Yeah I pointed this out when reading the API reference for the existing server tags API.\n\nDo you want to remove this part or you\u0027re just pointing it out?","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08403d9691c71575fcb38e39e918c6ca0d769204","unresolved":false,"context_lines":[{"line_number":4971,"context_line":""},{"line_number":4972,"context_line":"    - Tag is a non-empty string."},{"line_number":4973,"context_line":""},{"line_number":4974,"context_line":"    - Tags are case sensitive."},{"line_number":4975,"context_line":""},{"line_number":4976,"context_line":"    - \u0027/\u0027 is not allowed to be in a tag name"},{"line_number":4977,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":35,"id":"1f1a1f67_f9e862b3","line":4974,"range":{"start_line":4974,"start_character":6,"end_line":4974,"end_character":30},"in_reply_to":"1f1a1f67_ebf1b902","updated":"2017-07-18 21:48:52.000000000","message":"https://review.openstack.org/#/c/484957/","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"}],"nova/api/openstack/api_version_request.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"38ed23d298b4c837f548b8fdfc1de6782114f7c8","unresolved":false,"context_lines":[{"line_number":110,"context_line":"             json dict in the response body with an image_id key and uuid"},{"line_number":111,"context_line":"             value."},{"line_number":112,"context_line":"    * 2.46 - Return ``X-OpenStack-Request-ID`` header on requests."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    * 2.47 - When displaying server details, display the flavor as a dict"},{"line_number":115,"context_line":"             rather than a link.  If the user is prevented from retrieving"},{"line_number":116,"context_line":"             the flavor extra-specs by policy, simply omit the field from"}],"source_content_type":"text/x-python","patch_set":4,"id":"df140735_dbeb15da","line":113,"updated":"2017-06-07 06:57:22.000000000","message":"unrelated change","commit_id":"f843200c610847db44534b70c41656048877a729"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"3dabb1bf7f86370a0c61b15e35f59f9cd45e3202","unresolved":false,"context_lines":[{"line_number":110,"context_line":"             json dict in the response body with an image_id key and uuid"},{"line_number":111,"context_line":"             value."},{"line_number":112,"context_line":"    * 2.46 - Return ``X-OpenStack-Request-ID`` header on requests."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    * 2.47 - When displaying server details, display the flavor as a dict"},{"line_number":115,"context_line":"             rather than a link.  If the user is prevented from retrieving"},{"line_number":116,"context_line":"             the flavor extra-specs by policy, simply omit the field from"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_ff5d0f47","line":113,"updated":"2017-06-15 14:58:52.000000000","message":"Unrelated change.","commit_id":"66eb350f873827b9ed11e02e0e5520472da6b7e0"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"0b111bf1d6c8d798326e50b6408e61e417800939","unresolved":false,"context_lines":[{"line_number":110,"context_line":"             json dict in the response body with an image_id key and uuid"},{"line_number":111,"context_line":"             value."},{"line_number":112,"context_line":"    * 2.46 - Return ``X-OpenStack-Request-ID`` header on requests."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    * 2.47 - When displaying server details, display the flavor as a dict"},{"line_number":115,"context_line":"             rather than a link.  If the user is prevented from retrieving"},{"line_number":116,"context_line":"             the flavor extra-specs by policy, simply omit the field from"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_75a8ed8a","line":113,"in_reply_to":"7f231b9d_ff5d0f47","updated":"2017-06-16 02:45:59.000000000","message":"Done","commit_id":"66eb350f873827b9ed11e02e0e5520472da6b7e0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d214bb1a4df9e36ef5fdf60583afddf4382c3afd","unresolved":false,"context_lines":[{"line_number":110,"context_line":"             json dict in the response body with an image_id key and uuid"},{"line_number":111,"context_line":"             value."},{"line_number":112,"context_line":"    * 2.46 - Return ``X-OpenStack-Request-ID`` header on requests."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    * 2.47 - When displaying server details, display the flavor as a dict"},{"line_number":115,"context_line":"             rather than a link.  If the user is prevented from retrieving"},{"line_number":116,"context_line":"             the flavor extra-specs by policy, simply omit the field from"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f201791_319320a6","line":113,"updated":"2017-06-22 09:43:31.000000000","message":"unrelated change","commit_id":"876e37b7f6ac5c06729342ba2674f653cac6b145"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"6261dec70bb86ba60f04042e2aa774b9e16911da","unresolved":false,"context_lines":[{"line_number":110,"context_line":"             json dict in the response body with an image_id key and uuid"},{"line_number":111,"context_line":"             value."},{"line_number":112,"context_line":"    * 2.46 - Return ``X-OpenStack-Request-ID`` header on requests."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    * 2.47 - When displaying server details, display the flavor as a dict"},{"line_number":115,"context_line":"             rather than a link.  If the user is prevented from retrieving"},{"line_number":116,"context_line":"             the flavor extra-specs by policy, simply omit the field from"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f201791_365bf2f7","line":113,"in_reply_to":"5f201791_319320a6","updated":"2017-06-23 08:56:14.000000000","message":"Done","commit_id":"876e37b7f6ac5c06729342ba2674f653cac6b145"}],"nova/api/openstack/compute/quota_classes.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f47b9f1414b0f0ecec60a9f6e27c5f82c34eedb4","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\"2.50\"):"},{"line_number":59,"context_line":"            original_quotas \u003d [resource for resource in original_quotas"},{"line_number":60,"context_line":"                               if resource not in FILTERED_QUOTAS]"},{"line_number":61,"context_line":"        # NOTE(gmann): Before microversion v2.51, v2.1 API does not return the"},{"line_number":62,"context_line":"        # \u0027server_groups\u0027 \u0026 \u0027server_group_members\u0027 key in quota class API"},{"line_number":63,"context_line":"        # response."},{"line_number":64,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":26,"id":"1f1a1f67_a7185275","line":61,"range":{"start_line":61,"start_character":43,"end_line":61,"end_character":48},"updated":"2017-07-12 09:37:28.000000000","message":"this should not be changed.","commit_id":"8451e23c7a4bf3f77c1db78c6169c4890f0caac8"}],"nova/api/openstack/compute/rest_api_version_history.rst":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"4fc4b9fd0501cff3efdadf419dd997495608b4d0","unresolved":false,"context_lines":[{"line_number":583,"context_line":"2.50"},{"line_number":584,"context_line":"----"},{"line_number":585,"context_line":"  Adds support for applying tags when creating a server. The tag schema is"},{"line_number":586,"context_line":"  the same as in the 2.26 microversion."},{"line_number":587,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"3f1d235d_6b11a504","line":586,"range":{"start_line":586,"start_character":21,"end_line":586,"end_character":38},"updated":"2017-07-11 01:43:26.000000000","message":"ref link would be better","commit_id":"75dc2391c9a51d7d8c28bb5c8b27ffb78f499e6c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f13dc14a2dfd09d6f5d571203c0e1390ff96d1c","unresolved":false,"context_lines":[{"line_number":614,"context_line":"2.52"},{"line_number":615,"context_line":"----"},{"line_number":616,"context_line":""},{"line_number":617,"context_line":"  Adds support for applying tags when creating a server. The tag schema is"},{"line_number":618,"context_line":"  the same as in the 2.26 microversion."}],"source_content_type":"text/x-rst","patch_set":28,"id":"1f1a1f67_8eed268d","line":618,"range":{"start_line":617,"start_character":57,"end_line":618,"end_character":39},"updated":"2017-07-14 02:11:54.000000000","message":"The 2.26 docs above don\u0027t explain what the tag schema is, nor does the parameter description in the API reference.","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cdc6e6322d78cdab626595bf105565fff1dd429d","unresolved":false,"context_lines":[{"line_number":626,"context_line":"----"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"  Adds support for applying tags when creating a server. The tag schema is"},{"line_number":629,"context_line":"  the same as in the `2.26 microversion"},{"line_number":630,"context_line":"  \u003chttps://docs.openstack.org/nova/latest/api_microversion_history.html#id23\u003e`_."}],"source_content_type":"text/x-rst","patch_set":31,"id":"1f1a1f67_17e8ebb1","line":630,"range":{"start_line":629,"start_character":21,"end_line":630,"end_character":80},"updated":"2017-07-14 19:42:46.000000000","message":"I think you can just do `2.26`_ microversion since these headers create an implicit link.","commit_id":"9051bb2269fbbef3f271fda91ec5ba69d3dc28b0"}],"nova/api/openstack/compute/schemas/servers.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"4de42b2f79fadb2424f65d15b409bb827b44a47c","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"# 2.49 builds on 2.42 and makes the following changes:"},{"line_number":133,"context_line":"# Allowing adding tags to instances when booting"},{"line_number":134,"context_line":"base_create_v249 \u003d copy.deepcopy(base_create_v242)"},{"line_number":135,"context_line":"base_create_v249[\u0027properties\u0027][\u0027server\u0027][\u0027properties\u0027][\u0027tags\u0027] \u003d {"},{"line_number":136,"context_line":"    \"type\": \"array\","},{"line_number":137,"context_line":"    \"items\": parameter_types.tag,"},{"line_number":138,"context_line":"    \"maxItems\": instance.MAX_TAG_COUNT"},{"line_number":139,"context_line":"}"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"base_update \u003d {"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f201791_f13008eb","line":139,"range":{"start_line":134,"start_character":0,"end_line":139,"end_character":1},"updated":"2017-06-22 09:42:52.000000000","message":"@Kevin, Can we add unittests in the API layer for those schema validation.","commit_id":"876e37b7f6ac5c06729342ba2674f653cac6b145"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"6261dec70bb86ba60f04042e2aa774b9e16911da","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"# 2.49 builds on 2.42 and makes the following changes:"},{"line_number":133,"context_line":"# Allowing adding tags to instances when booting"},{"line_number":134,"context_line":"base_create_v249 \u003d copy.deepcopy(base_create_v242)"},{"line_number":135,"context_line":"base_create_v249[\u0027properties\u0027][\u0027server\u0027][\u0027properties\u0027][\u0027tags\u0027] \u003d {"},{"line_number":136,"context_line":"    \"type\": \"array\","},{"line_number":137,"context_line":"    \"items\": parameter_types.tag,"},{"line_number":138,"context_line":"    \"maxItems\": instance.MAX_TAG_COUNT"},{"line_number":139,"context_line":"}"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"base_update \u003d {"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f201791_165eb6e5","line":139,"range":{"start_line":134,"start_character":0,"end_line":139,"end_character":1},"in_reply_to":"5f201791_f13008eb","updated":"2017-06-23 08:56:14.000000000","message":"Done","commit_id":"876e37b7f6ac5c06729342ba2674f653cac6b145"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"57604669505a933aa8817759f97df95376c594aa","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from nova.api.validation import parameter_types"},{"line_number":18,"context_line":"from nova.api.validation.parameter_types import multi_params"},{"line_number":19,"context_line":"from nova.objects import instance"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"base_create \u003d {"},{"line_number":22,"context_line":"    \u0027type\u0027: \u0027object\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"1f1a1f67_cc60ef35","line":19,"updated":"2017-07-13 06:12:40.000000000","message":"two empty lines usually should be here","commit_id":"8e90f1fa74880eeaab77b31f572f600468c8496f"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"99b2ae5c1d16bda92982fcd2e4894447c5a58182","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from nova.api.validation import parameter_types"},{"line_number":18,"context_line":"from nova.api.validation.parameter_types import multi_params"},{"line_number":19,"context_line":"from nova.objects import instance"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"base_create \u003d {"},{"line_number":22,"context_line":"    \u0027type\u0027: \u0027object\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"1f1a1f67_e0e16fd2","line":19,"in_reply_to":"1f1a1f67_cc60ef35","updated":"2017-07-13 06:29:09.000000000","message":"Done","commit_id":"8e90f1fa74880eeaab77b31f572f600468c8496f"}],"nova/compute/api.py":[{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"57604669505a933aa8817759f97df95376c594aa","unresolved":false,"context_lines":[{"line_number":989,"context_line":"            max_count, base_options, boot_meta, security_groups,"},{"line_number":990,"context_line":"            block_device_mapping, shutdown_terminate,"},{"line_number":991,"context_line":"            instance_group, check_server_group_quota, filter_properties,"},{"line_number":992,"context_line":"            key_pair, tags\u003dNone):"},{"line_number":993,"context_line":"        # Reserve quotas"},{"line_number":994,"context_line":"        num_instances, quotas \u003d self._check_num_instances_quota("},{"line_number":995,"context_line":"                context, instance_type, min_count, max_count)"}],"source_content_type":"text/x-python","patch_set":27,"id":"1f1a1f67_404a6355","line":992,"updated":"2017-07-13 06:12:40.000000000","message":"Why do you need a default value for tags here?\nYou\u0027re allowing None, but iterating on it in _transform_tags this will fail if _provision_instance is called from places other than create_instance.","commit_id":"8e90f1fa74880eeaab77b31f572f600468c8496f"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"99b2ae5c1d16bda92982fcd2e4894447c5a58182","unresolved":false,"context_lines":[{"line_number":989,"context_line":"            max_count, base_options, boot_meta, security_groups,"},{"line_number":990,"context_line":"            block_device_mapping, shutdown_terminate,"},{"line_number":991,"context_line":"            instance_group, check_server_group_quota, filter_properties,"},{"line_number":992,"context_line":"            key_pair, tags\u003dNone):"},{"line_number":993,"context_line":"        # Reserve quotas"},{"line_number":994,"context_line":"        num_instances, quotas \u003d self._check_num_instances_quota("},{"line_number":995,"context_line":"                context, instance_type, min_count, max_count)"}],"source_content_type":"text/x-python","patch_set":27,"id":"1f1a1f67_00f0eb66","line":992,"in_reply_to":"1f1a1f67_404a6355","updated":"2017-07-13 06:29:09.000000000","message":"Yeah, you are correct","commit_id":"8e90f1fa74880eeaab77b31f572f600468c8496f"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"57604669505a933aa8817759f97df95376c594aa","unresolved":false,"context_lines":[{"line_number":1594,"context_line":""},{"line_number":1595,"context_line":"    def _create_tag_list_obj(self, context, tags):"},{"line_number":1596,"context_line":"        tag_list \u003d []"},{"line_number":1597,"context_line":"        if tags:"},{"line_number":1598,"context_line":"            for tag in tags:"},{"line_number":1599,"context_line":"                tag_obj \u003d objects.Tag(context\u003dcontext, tag\u003dtag)"},{"line_number":1600,"context_line":"                tag_list.append(tag_obj)"}],"source_content_type":"text/x-python","patch_set":27,"id":"1f1a1f67_6070bf73","line":1597,"updated":"2017-07-13 06:12:40.000000000","message":"Why do you need that \"if\"?\nIMO list comprehension fits perfectly here.","commit_id":"8e90f1fa74880eeaab77b31f572f600468c8496f"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"99b2ae5c1d16bda92982fcd2e4894447c5a58182","unresolved":false,"context_lines":[{"line_number":1594,"context_line":""},{"line_number":1595,"context_line":"    def _create_tag_list_obj(self, context, tags):"},{"line_number":1596,"context_line":"        tag_list \u003d []"},{"line_number":1597,"context_line":"        if tags:"},{"line_number":1598,"context_line":"            for tag in tags:"},{"line_number":1599,"context_line":"                tag_obj \u003d objects.Tag(context\u003dcontext, tag\u003dtag)"},{"line_number":1600,"context_line":"                tag_list.append(tag_obj)"}],"source_content_type":"text/x-python","patch_set":27,"id":"1f1a1f67_8003db42","line":1597,"in_reply_to":"1f1a1f67_6070bf73","updated":"2017-07-13 06:29:09.000000000","message":"Good suggestion, I will try to refactor this","commit_id":"8e90f1fa74880eeaab77b31f572f600468c8496f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f13dc14a2dfd09d6f5d571203c0e1390ff96d1c","unresolved":false,"context_lines":[{"line_number":989,"context_line":"            max_count, base_options, boot_meta, security_groups,"},{"line_number":990,"context_line":"            block_device_mapping, shutdown_terminate,"},{"line_number":991,"context_line":"            instance_group, check_server_group_quota, filter_properties,"},{"line_number":992,"context_line":"            key_pair, tags):"},{"line_number":993,"context_line":"        # Reserve quotas"},{"line_number":994,"context_line":"        num_instances, quotas \u003d self._check_num_instances_quota("},{"line_number":995,"context_line":"                context, instance_type, min_count, max_count)"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_89a880db","line":992,"range":{"start_line":992,"start_character":22,"end_line":992,"end_character":26},"updated":"2017-07-14 02:11:54.000000000","message":"Default to None so we don\u0027t have to change all of the unit tests that are just hitting this method? Then _transform_tags would have to handle None...and BuildRequest.tags is not nullable, so _transform_tags would have to return an empty TagList object.\n\nAnyway, not a big deal, just nice to default to None for optional new args.","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f13dc14a2dfd09d6f5d571203c0e1390ff96d1c","unresolved":false,"context_lines":[{"line_number":1592,"context_line":""},{"line_number":1593,"context_line":"        return instance"},{"line_number":1594,"context_line":""},{"line_number":1595,"context_line":"    def _create_tag_list_obj(self, context, tags):"},{"line_number":1596,"context_line":"        tag_list \u003d [objects.Tag(context\u003dcontext, tag\u003dt) for t in tags]"},{"line_number":1597,"context_line":"        tag_list_obj \u003d objects.TagList(objects\u003dtag_list)"},{"line_number":1598,"context_line":"        return tag_list_obj"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_c9d67828","line":1595,"range":{"start_line":1595,"start_character":44,"end_line":1595,"end_character":48},"updated":"2017-07-14 02:11:54.000000000","message":"nit: it\u0027d be nice to have a docstring on this method to point out that these are the simple string tags from the API request, and they get turned into a TagList object which is returned.","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"3b79302b3376fd1b1d9fcdd88adaf53253931867","unresolved":false,"context_lines":[{"line_number":1592,"context_line":""},{"line_number":1593,"context_line":"        return instance"},{"line_number":1594,"context_line":""},{"line_number":1595,"context_line":"    def _create_tag_list_obj(self, context, tags):"},{"line_number":1596,"context_line":"        tag_list \u003d [objects.Tag(context\u003dcontext, tag\u003dt) for t in tags]"},{"line_number":1597,"context_line":"        tag_list_obj \u003d objects.TagList(objects\u003dtag_list)"},{"line_number":1598,"context_line":"        return tag_list_obj"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_02d0c21e","line":1595,"range":{"start_line":1595,"start_character":44,"end_line":1595,"end_character":48},"in_reply_to":"1f1a1f67_c9d67828","updated":"2017-07-14 06:56:36.000000000","message":"Done","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f13dc14a2dfd09d6f5d571203c0e1390ff96d1c","unresolved":false,"context_lines":[{"line_number":1597,"context_line":"        tag_list_obj \u003d objects.TagList(objects\u003dtag_list)"},{"line_number":1598,"context_line":"        return tag_list_obj"},{"line_number":1599,"context_line":""},{"line_number":1600,"context_line":"    def _transform_tags(self, tags, resource_id):"},{"line_number":1601,"context_line":"        instance_tags \u003d copy.deepcopy(tags)"},{"line_number":1602,"context_line":"        for tag in instance_tags:"},{"line_number":1603,"context_line":"            tag.resource_id \u003d resource_id"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_c9bf98ce","line":1600,"range":{"start_line":1600,"start_character":30,"end_line":1600,"end_character":34},"updated":"2017-07-14 02:11:54.000000000","message":"same as above - would be nice to have a docstring explaining this is a TagList object, not a list of strings.","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"3b79302b3376fd1b1d9fcdd88adaf53253931867","unresolved":false,"context_lines":[{"line_number":1597,"context_line":"        tag_list_obj \u003d objects.TagList(objects\u003dtag_list)"},{"line_number":1598,"context_line":"        return tag_list_obj"},{"line_number":1599,"context_line":""},{"line_number":1600,"context_line":"    def _transform_tags(self, tags, resource_id):"},{"line_number":1601,"context_line":"        instance_tags \u003d copy.deepcopy(tags)"},{"line_number":1602,"context_line":"        for tag in instance_tags:"},{"line_number":1603,"context_line":"            tag.resource_id \u003d resource_id"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_c2c9aa78","line":1600,"range":{"start_line":1600,"start_character":30,"end_line":1600,"end_character":34},"in_reply_to":"1f1a1f67_c9bf98ce","updated":"2017-07-14 06:56:36.000000000","message":"Done","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f13dc14a2dfd09d6f5d571203c0e1390ff96d1c","unresolved":false,"context_lines":[{"line_number":1598,"context_line":"        return tag_list_obj"},{"line_number":1599,"context_line":""},{"line_number":1600,"context_line":"    def _transform_tags(self, tags, resource_id):"},{"line_number":1601,"context_line":"        instance_tags \u003d copy.deepcopy(tags)"},{"line_number":1602,"context_line":"        for tag in instance_tags:"},{"line_number":1603,"context_line":"            tag.resource_id \u003d resource_id"},{"line_number":1604,"context_line":"        return instance_tags"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_0969108a","line":1601,"range":{"start_line":1601,"start_character":24,"end_line":1601,"end_character":43},"updated":"2017-07-14 02:11:54.000000000","message":"tags is a TagList, right? Why not use obj_clone() then like in _bdm_validate_set_size_and_instance? That method also has a comment about why the list is copied, we could do that in here too since it\u0027s kind of confusing without context why we have to copy the list.","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"3b79302b3376fd1b1d9fcdd88adaf53253931867","unresolved":false,"context_lines":[{"line_number":1598,"context_line":"        return tag_list_obj"},{"line_number":1599,"context_line":""},{"line_number":1600,"context_line":"    def _transform_tags(self, tags, resource_id):"},{"line_number":1601,"context_line":"        instance_tags \u003d copy.deepcopy(tags)"},{"line_number":1602,"context_line":"        for tag in instance_tags:"},{"line_number":1603,"context_line":"            tag.resource_id \u003d resource_id"},{"line_number":1604,"context_line":"        return instance_tags"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_62a416ba","line":1601,"range":{"start_line":1601,"start_character":24,"end_line":1601,"end_character":43},"in_reply_to":"1f1a1f67_0969108a","updated":"2017-07-14 06:56:36.000000000","message":"Done","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4853f80d18cc662e2356f8f324f72e2aa4ba5ec","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"                        instance\u003dinstance, instance_uuid\u003dinstance.uuid,"},{"line_number":1034,"context_line":"                        project_id\u003dinstance.project_id,"},{"line_number":1035,"context_line":"                        block_device_mappings\u003dblock_device_mapping,"},{"line_number":1036,"context_line":"                        tags\u003dinstance_tags)"},{"line_number":1037,"context_line":"                build_request.create()"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"                # Create an instance_mapping.  The null cell_mapping indicates"}],"source_content_type":"text/x-python","patch_set":32,"id":"1f1a1f67_32e1b5d1","line":1036,"range":{"start_line":1036,"start_character":24,"end_line":1036,"end_character":42},"updated":"2017-07-14 20:13:11.000000000","message":"When reviewing the notifications patch on top of this, I realized that this is never used.\n\nhttps://github.com/openstack/nova/blob/771dd5b1217f8fb8109c782fb7f3a7658e0a4ad4/nova/objects/build_request.py#L248-L251\n\nI thought you were going to deal with that TODO in this change?\n\nhttps://github.com/openstack/nova/blob/771dd5b1217f8fb8109c782fb7f3a7658e0a4ad4/nova/conductor/manager.py#L932\n\nThe instance object we get in the conductor manager doesn\u0027t have the tags set on it from the build request.\n\nI guess because we\u0027re passing the tags to conductor and using those rather than the ones in the build request:\n\nhttps://github.com/openstack/nova/blob/771dd5b1217f8fb8109c782fb7f3a7658e0a4ad4/nova/conductor/manager.py#L985\n\nBut that means if the instance.tags field isn\u0027t set when conductor casts to compute, we have to lazy-load the tags when sending the instance.create notification, which is a performance penalty since compute has to go back through conductor to load the tags from the database:\n\nhttps://github.com/openstack/nova/blob/771dd5b1217f8fb8109c782fb7f3a7658e0a4ad4/nova/compute/manager.py#L1924\n\nAt this point it seems dealing with https://github.com/openstack/nova/blob/771dd5b1217f8fb8109c782fb7f3a7658e0a4ad4/nova/objects/build_request.py#L248-L251 is kind of pointless, except it would set the tags on the instance created in conductor and passed to compute so we\u0027d avoid the lazy-load.\n\nEither way that TODO in the build request needs to be dealt with.","commit_id":"4621ac79133dad3250381d37711315d3aa69da60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"38306a9bd3b894205ac518da0ac1e3a0e6b98fe2","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"                        instance\u003dinstance, instance_uuid\u003dinstance.uuid,"},{"line_number":1034,"context_line":"                        project_id\u003dinstance.project_id,"},{"line_number":1035,"context_line":"                        block_device_mappings\u003dblock_device_mapping,"},{"line_number":1036,"context_line":"                        tags\u003dinstance_tags)"},{"line_number":1037,"context_line":"                build_request.create()"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"                # Create an instance_mapping.  The null cell_mapping indicates"}],"source_content_type":"text/x-python","patch_set":32,"id":"1f1a1f67_71e5eaa7","line":1036,"range":{"start_line":1036,"start_character":24,"end_line":1036,"end_character":42},"in_reply_to":"1f1a1f67_11e116d1","updated":"2017-07-14 21:45:03.000000000","message":"This is also redundant I think:\n\nhttps://github.com/openstack/nova/blob/master/nova/conductor/manager.py#L1071-L1076\n\nBecause when we delete the instance, it also deletes the tags:\n\nhttps://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/api.py#L1894\n\nSame with the BDM.destroy() - those also get cleaned up when the instance is destroyed:\n\nhttps://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/api.py#L1886","commit_id":"4621ac79133dad3250381d37711315d3aa69da60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"21e6f827ed5d408fad21012ebf0f8f6bf8140b65","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"                        instance\u003dinstance, instance_uuid\u003dinstance.uuid,"},{"line_number":1034,"context_line":"                        project_id\u003dinstance.project_id,"},{"line_number":1035,"context_line":"                        block_device_mappings\u003dblock_device_mapping,"},{"line_number":1036,"context_line":"                        tags\u003dinstance_tags)"},{"line_number":1037,"context_line":"                build_request.create()"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"                # Create an instance_mapping.  The null cell_mapping indicates"}],"source_content_type":"text/x-python","patch_set":32,"id":"1f1a1f67_11e116d1","line":1036,"range":{"start_line":1036,"start_character":24,"end_line":1036,"end_character":42},"in_reply_to":"1f1a1f67_32e1b5d1","updated":"2017-07-14 21:32:50.000000000","message":"If we remove the \u0027continue\u0027 code in BuildRequest.get_new_instance then we hit failures like this when creating the instance in the database, because it has a TagList object on it:\n\n    2017-07-14 17:21:50,939 ERROR [oslo_messaging.rpc.server] Exception during message handling\n    Traceback (most recent call last):\n      File \"/home/user/git/nova/.tox/functional/local/lib/python2.7/site-packages/oslo_messaging/rpc/server.py\", line 153, in _process_incoming\n        res \u003d self.dispatcher.dispatch(message)\n      File \"/home/user/git/nova/.tox/functional/local/lib/python2.7/site-packages/oslo_messaging/rpc/dispatcher.py\", line 213, in dispatch\n        return self._do_dispatch(endpoint, method, ctxt, args)\n      File \"/home/user/git/nova/.tox/functional/local/lib/python2.7/site-packages/oslo_messaging/rpc/dispatcher.py\", line 183, in _do_dispatch\n        result \u003d func(ctxt, **new_args)\n      File \"nova/conductor/manager.py\", line 972, in schedule_and_build_instances\n        instance.create()\n      File \"/home/user/git/nova/.tox/functional/local/lib/python2.7/site-packages/oslo_versionedobjects/base.py\", line 226, in wrapper\n        return fn(self, *args, **kwargs)\n      File \"nova/objects/instance.py\", line 551, in create\n        db_inst \u003d db.instance_create(self._context, updates)\n      File \"nova/db/api.py\", line 735, in instance_create\n        return IMPL.instance_create(context, values)\n      File \"nova/db/sqlalchemy/api.py\", line 179, in wrapper\n        return f(*args, **kwargs)\n      File \"/home/user/git/nova/.tox/functional/local/lib/python2.7/site-packages/oslo_db/api.py\", line 150, in wrapper\n        ectxt.value \u003d e.inner_exc\n      File \"/home/user/git/nova/.tox/functional/local/lib/python2.7/site-packages/oslo_utils/excutils.py\", line 220, in __exit__\n        self.force_reraise()\n      File \"/home/user/git/nova/.tox/functional/local/lib/python2.7/site-packages/oslo_utils/excutils.py\", line 196, in force_reraise\n        six.reraise(self.type_, self.value, self.tb)\n      File \"/home/user/git/nova/.tox/functional/local/lib/python2.7/site-packages/oslo_db/api.py\", line 138, in wrapper\n        return f(*args, **kwargs)\n      File \"nova/db/sqlalchemy/api.py\", line 250, in wrapped\n        return f(context, *args, **kwargs)\n      File \"nova/db/sqlalchemy/api.py\", line 1810, in instance_create\n        instance_ref.update(values)\n      File \"/home/user/git/nova/.tox/functional/local/lib/python2.7/site-packages/oslo_db/sqlalchemy/models.py\", line 96, in update\n        setattr(self, k, v)\n      File \"/home/user/git/nova/.tox/functional/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py\", line 224, in __set__\n        instance_dict(instance), value, None)\n      File \"/home/user/git/nova/.tox/functional/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py\", line 1049, in set\n        given, wanted))\n    TypeError: Incompatible collection type: TagList is not list-like\n\nThat would have to be converted to a primitive list of strings for the instance.tags values in the DB API instance_create method, but then we\u0027re just creating the tags later in the conductor manager:\n\nhttps://github.com/openstack/nova/blob/master/nova/conductor/manager.py#L985\n\nSo really, putting the tags in the BuildRequest was unnecessary from the start it looks like, since we don\u0027t even use them from the BuildRequest. I think we added them to the build request because the block device mapping list is in there, but I\u0027m not really sure why that\u0027s needed in there either because we create those separately from the list passed to the conductor schedule_and_build_instances method:\n\nhttps://github.com/openstack/nova/blob/master/nova/conductor/manager.py#L983\n\nSo we could just create the tags in the DB when we create the instance but then there is no point in using the tags passed to conductor.\n\nMaybe it\u0027s best to just continue not setting tags on the instance from BuildRequest.get_new_instance() - sucks we added that code though when none of it will be used. We still want to set the instance_tags on the instance before it\u0027s send to build_and_run_instance in the compute manager though so we don\u0027t lazy-load instance.tags for the instance.create notification.","commit_id":"4621ac79133dad3250381d37711315d3aa69da60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cffa39aab2adc19506fb6d03b1cf42dccc211821","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"                        instance\u003dinstance, instance_uuid\u003dinstance.uuid,"},{"line_number":1034,"context_line":"                        project_id\u003dinstance.project_id,"},{"line_number":1035,"context_line":"                        block_device_mappings\u003dblock_device_mapping,"},{"line_number":1036,"context_line":"                        tags\u003dinstance_tags)"},{"line_number":1037,"context_line":"                build_request.create()"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"                # Create an instance_mapping.  The null cell_mapping indicates"}],"source_content_type":"text/x-python","patch_set":32,"id":"1f1a1f67_e9022609","line":1036,"range":{"start_line":1036,"start_character":24,"end_line":1036,"end_character":42},"in_reply_to":"1f1a1f67_71acca33","updated":"2017-07-15 19:39:59.000000000","message":"https://review.openstack.org/#/c/484170/ is my attempt at cleaning up some of this and optimizing it.","commit_id":"4621ac79133dad3250381d37711315d3aa69da60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9e0221fb098e7f348c6c8f85ff9768c2e70bf841","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"                        instance\u003dinstance, instance_uuid\u003dinstance.uuid,"},{"line_number":1034,"context_line":"                        project_id\u003dinstance.project_id,"},{"line_number":1035,"context_line":"                        block_device_mappings\u003dblock_device_mapping,"},{"line_number":1036,"context_line":"                        tags\u003dinstance_tags)"},{"line_number":1037,"context_line":"                build_request.create()"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"                # Create an instance_mapping.  The null cell_mapping indicates"}],"source_content_type":"text/x-python","patch_set":32,"id":"1f1a1f67_71acca33","line":1036,"range":{"start_line":1036,"start_character":24,"end_line":1036,"end_character":42},"in_reply_to":"1f1a1f67_71e5eaa7","updated":"2017-07-14 21:51:13.000000000","message":"So maybe what we should do for now is just land this change and then follow it up with some optimizations, which I\u0027ve done locally with something like this:\n\nhttp://paste.openstack.org/show/615443/\n\nSo then we have the feature landed and tests are in, and then we can sort out the best way to do this, since either way we go, we\u0027re either not using the BuildRequest.tags or we\u0027re not going to be using the tags passed to the schedule_and_build_instances method in conductor, so we need to figure out which is more efficient. I think it\u0027s probably the former - fewer DB queries involved with that one.","commit_id":"4621ac79133dad3250381d37711315d3aa69da60"}],"nova/conductor/api.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f423e635052b3b4166786bc5b8fcdbf3d820a0fd","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    def build_instances(self, context, instances, image, filter_properties,"},{"line_number":115,"context_line":"            admin_password, injected_files, requested_networks,"},{"line_number":116,"context_line":"            security_groups, block_device_mapping, legacy_bdm\u003dTrue,"},{"line_number":117,"context_line":"                        tags\u003dNone):"},{"line_number":118,"context_line":"        self.conductor_compute_rpcapi.build_instances(context,"},{"line_number":119,"context_line":"                instances\u003dinstances, image\u003dimage,"},{"line_number":120,"context_line":"                filter_properties\u003dfilter_properties,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_f7cf1a55","line":117,"range":{"start_line":117,"start_character":24,"end_line":117,"end_character":33},"updated":"2017-06-29 05:41:11.000000000","message":"We don\u0027t need to add this parameter, since we won\u0027t call it like that?","commit_id":"f90495d616c6b9591a2964c3ea5a73677d16771c"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"3d810658a10b62099873dc11912a411da24311ca","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    def build_instances(self, context, instances, image, filter_properties,"},{"line_number":115,"context_line":"            admin_password, injected_files, requested_networks,"},{"line_number":116,"context_line":"            security_groups, block_device_mapping, legacy_bdm\u003dTrue,"},{"line_number":117,"context_line":"                        tags\u003dNone):"},{"line_number":118,"context_line":"        self.conductor_compute_rpcapi.build_instances(context,"},{"line_number":119,"context_line":"                instances\u003dinstances, image\u003dimage,"},{"line_number":120,"context_line":"                filter_properties\u003dfilter_properties,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_ddc79f45","line":117,"range":{"start_line":117,"start_character":24,"end_line":117,"end_character":33},"in_reply_to":"3f1d235d_f7cf1a55","updated":"2017-07-03 02:07:33.000000000","message":"ah, yes, must be a bad rebase","commit_id":"f90495d616c6b9591a2964c3ea5a73677d16771c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f13dc14a2dfd09d6f5d571203c0e1390ff96d1c","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                                     request_spec, image,"},{"line_number":128,"context_line":"                                     admin_password, injected_files,"},{"line_number":129,"context_line":"                                     requested_networks, block_device_mapping,"},{"line_number":130,"context_line":"                                     tags):"},{"line_number":131,"context_line":"        self.conductor_compute_rpcapi.schedule_and_build_instances("},{"line_number":132,"context_line":"            context, build_requests, request_spec, image,"},{"line_number":133,"context_line":"            admin_password, injected_files, requested_networks,"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_e9bed463","line":130,"range":{"start_line":130,"start_character":37,"end_line":130,"end_character":41},"updated":"2017-07-14 02:11:54.000000000","message":"This should probably default to None.","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"3b79302b3376fd1b1d9fcdd88adaf53253931867","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                                     request_spec, image,"},{"line_number":128,"context_line":"                                     admin_password, injected_files,"},{"line_number":129,"context_line":"                                     requested_networks, block_device_mapping,"},{"line_number":130,"context_line":"                                     tags):"},{"line_number":131,"context_line":"        self.conductor_compute_rpcapi.schedule_and_build_instances("},{"line_number":132,"context_line":"            context, build_requests, request_spec, image,"},{"line_number":133,"context_line":"            admin_password, injected_files, requested_networks,"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_22ae1e98","line":130,"range":{"start_line":130,"start_character":37,"end_line":130,"end_character":41},"in_reply_to":"1f1a1f67_e9bed463","updated":"2017-07-14 06:56:36.000000000","message":"Done","commit_id":"2050315a382c95b41861097bf42924824abcc26c"}],"nova/objects/build_request.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e241651f4cf78a60fd2db32263f60e20d9535cf4","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        if filters.get(\u0027cleaned\u0027, False):"},{"line_number":381,"context_line":"            return cls(context, objects\u003d[])"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        # Because the build_requests table stores an instance as a serialized"},{"line_number":384,"context_line":"        # versioned object it is not feasible to do the filtering and sorting"},{"line_number":385,"context_line":"        # in the database. Just get all potentially relevant records and"},{"line_number":386,"context_line":"        # process them here. It should be noted that build requests are short"},{"line_number":387,"context_line":"        # lived so there should not be a lot of results to deal with."},{"line_number":388,"context_line":"        build_requests \u003d cls.get_all(context)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"        # Fortunately some filters do not apply here."},{"line_number":391,"context_line":"        # \u0027changes-since\u0027 works off of the updated_at field which has not yet"}],"source_content_type":"text/x-python","patch_set":34,"id":"1f1a1f67_fe0bde20","line":388,"range":{"start_line":383,"start_character":8,"end_line":388,"end_character":45},"updated":"2017-07-17 15:01:21.000000000","message":"Are the tags going to be stored on the instance that\u0027s serialized in the build_requests table?","commit_id":"9fa4fcb20d2cf9df7771ace2d88e0f42dbf2d10e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e241651f4cf78a60fd2db32263f60e20d9535cf4","unresolved":false,"context_lines":[{"line_number":417,"context_line":"        filtered_build_reqs \u003d []"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"        for build_req in build_requests:"},{"line_number":420,"context_line":"            instance \u003d build_req.instance"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"            filter_result \u003d cls._pass_exact_filters(instance, exact_filters)"},{"line_number":423,"context_line":"            if filter_result is None:"}],"source_content_type":"text/x-python","patch_set":34,"id":"1f1a1f67_fe599e34","line":420,"range":{"start_line":420,"start_character":23,"end_line":420,"end_character":41},"updated":"2017-07-17 15:01:21.000000000","message":"Calling this should lazy-load the instance and _load_instance sets the tags from the build request onto the instance, so the tags should be set on instance.tags when _pass_exact_filters processes them.","commit_id":"9fa4fcb20d2cf9df7771ace2d88e0f42dbf2d10e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"30b696e5f34fe92efb76393a054121df2ae1ec5f","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                            found.append(item)"},{"line_number":319,"context_line":"                    if len(found) \u003d\u003d len(filter_val):"},{"line_number":320,"context_line":"                        return False"},{"line_number":321,"context_line":"                elif filter_key \u003d\u003d \u0027not-tags-any\u0027:"},{"line_number":322,"context_line":"                    for item in filter_val:"},{"line_number":323,"context_line":"                        if item in tags:"},{"line_number":324,"context_line":"                            return False"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_9f6a8dea","line":321,"range":{"start_line":321,"start_character":36,"end_line":321,"end_character":48},"updated":"2017-07-18 08:42:30.000000000","message":"I\u0027m not sure whether it is my English problem.\n\nAfter reading the API-WG guideline(https://specs.openstack.org/openstack/api-wg/guidelines/tags.html), I feel the logic of \u0027not-tags\u0027 and \u0027not-tags-any\u0027 are reversed.\n\nThe example in the API-WG guideline \"GET /servers?not-tags-any\u003dred,blue\", explained as \u0027Example that returns the servers that do not have the “red” tag, or do not have the “blue” tag\u0027\n\nDoes that mean the server only with red tag can be returned?","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"09176463e8bbc3975363a4e9498cb65150f1c721","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                            found.append(item)"},{"line_number":319,"context_line":"                    if len(found) \u003d\u003d len(filter_val):"},{"line_number":320,"context_line":"                        return False"},{"line_number":321,"context_line":"                elif filter_key \u003d\u003d \u0027not-tags-any\u0027:"},{"line_number":322,"context_line":"                    for item in filter_val:"},{"line_number":323,"context_line":"                        if item in tags:"},{"line_number":324,"context_line":"                            return False"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_2b1d7173","line":321,"range":{"start_line":321,"start_character":36,"end_line":321,"end_character":48},"in_reply_to":"1f1a1f67_27cda765","updated":"2017-07-18 15:04:56.000000000","message":"ok, I see now, thanks, Gmann and Matt!","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"32fc760f55a07bd132caac98ded1573379056afb","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                            found.append(item)"},{"line_number":319,"context_line":"                    if len(found) \u003d\u003d len(filter_val):"},{"line_number":320,"context_line":"                        return False"},{"line_number":321,"context_line":"                elif filter_key \u003d\u003d \u0027not-tags-any\u0027:"},{"line_number":322,"context_line":"                    for item in filter_val:"},{"line_number":323,"context_line":"                        if item in tags:"},{"line_number":324,"context_line":"                            return False"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_ada763bd","line":321,"range":{"start_line":321,"start_character":36,"end_line":321,"end_character":48},"in_reply_to":"1f1a1f67_9f6a8dea","updated":"2017-07-18 09:12:55.000000000","message":"Yeah, I think the spec is confusing, and we are lack of examples in api-ref, I was planning to add them latter, and all this code here are based on tests that I made to the current \"server list\" with tags calls.","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"e482d205e85c5c4f9f475253ce574d2750676bfa","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                            found.append(item)"},{"line_number":319,"context_line":"                    if len(found) \u003d\u003d len(filter_val):"},{"line_number":320,"context_line":"                        return False"},{"line_number":321,"context_line":"                elif filter_key \u003d\u003d \u0027not-tags-any\u0027:"},{"line_number":322,"context_line":"                    for item in filter_val:"},{"line_number":323,"context_line":"                        if item in tags:"},{"line_number":324,"context_line":"                            return False"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_c8772da0","line":321,"range":{"start_line":321,"start_character":36,"end_line":321,"end_character":48},"in_reply_to":"1f1a1f67_9f6a8dea","updated":"2017-07-18 09:28:18.000000000","message":"no doubt their definition is confusing :). i read doc and code many time. these logic seems correct. \n\nas per api-ref, \u0027not-tags-any\u0027 means return the servers does not have any of the tag. so in your example servers not have red or blue will be returned. Its ![tags-any]\n\nexample: server1[\u0027red\u0027, \u0027blue\u0027, \u0027green\u0027] server2[\u0027yellow\u0027, \u0027green\u0027]  server3[\u0027blue\u0027, \u0027green\u0027]\n\nfilter \u0027not-tags-any\u0027: [\u0027red\u0027, \u0027yellow\u0027] will return only server3.\n\nhttps://developer.openstack.org/api-ref/compute/?expanded\u003dlist-servers-detail","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"14b149b9d366942c5366f3c7e211aa88f1724b21","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                            found.append(item)"},{"line_number":319,"context_line":"                    if len(found) \u003d\u003d len(filter_val):"},{"line_number":320,"context_line":"                        return False"},{"line_number":321,"context_line":"                elif filter_key \u003d\u003d \u0027not-tags-any\u0027:"},{"line_number":322,"context_line":"                    for item in filter_val:"},{"line_number":323,"context_line":"                        if item in tags:"},{"line_number":324,"context_line":"                            return False"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_27cda765","line":321,"range":{"start_line":321,"start_character":36,"end_line":321,"end_character":48},"in_reply_to":"1f1a1f67_c8772da0","updated":"2017-07-18 14:31:03.000000000","message":"API reference says not-tags-any is:\n\n\"A list of tags to filter the server list by. Servers that don’t match any tags in this list will be returned. Boolean expression in this case is ‘NOT (t1 OR t2)’. Tags in query must be separated by comma.\"\n\nSo if the item (the tag to filter on) is in the list of tags for a given build request (instance), then we must exclude that one and return False, so I think this logic is correct.","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"389bad59dc1523152fd34a28ff152c8ddfa85e6a","unresolved":false,"context_lines":[{"line_number":321,"context_line":"                elif filter_key \u003d\u003d \u0027not-tags-any\u0027:"},{"line_number":322,"context_line":"                    for item in filter_val:"},{"line_number":323,"context_line":"                        if item in tags:"},{"line_number":324,"context_line":"                            return False"},{"line_number":325,"context_line":"            elif isinstance(filter_val, (list, tuple, set, frozenset)):"},{"line_number":326,"context_line":"                if not filter_val:"},{"line_number":327,"context_line":"                    # Special value to indicate that nothing will match."}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_ceb72bf5","line":324,"updated":"2017-07-18 15:09:55.000000000","message":"Have I mentioned I think it\u0027s terrible we\u0027re doing this filtering outside of a SQL query? :(","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ef3370859e73feaf55e52cec352990dba5ac9295","unresolved":false,"context_lines":[{"line_number":321,"context_line":"                elif filter_key \u003d\u003d \u0027not-tags-any\u0027:"},{"line_number":322,"context_line":"                    for item in filter_val:"},{"line_number":323,"context_line":"                        if item in tags:"},{"line_number":324,"context_line":"                            return False"},{"line_number":325,"context_line":"            elif isinstance(filter_val, (list, tuple, set, frozenset)):"},{"line_number":326,"context_line":"                if not filter_val:"},{"line_number":327,"context_line":"                    # Special value to indicate that nothing will match."}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_aeb4ef80","line":324,"in_reply_to":"1f1a1f67_ceb72bf5","updated":"2017-07-18 15:19:16.000000000","message":"That\u0027s what you get when everything is a serialized json blob in the build_requests table.","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"}],"nova/tests/functional/api_sample_tests/test_servers.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"3dabb1bf7f86370a0c61b15e35f59f9cd45e3202","unresolved":false,"context_lines":[{"line_number":235,"context_line":"    scenarios \u003d [(\u0027v2_49\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"},{"line_number":236,"context_line":"    use_common_server_post \u003d False"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    def test_servers_post(self):"},{"line_number":239,"context_line":"        self._post_server(use_common_server_api_samples\u003dFalse)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"class ServersUpdateSampleJsonTest(ServersSampleBase):"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_b1ffcba9","line":239,"range":{"start_line":238,"start_character":0,"end_line":239,"end_character":62},"updated":"2017-06-15 14:58:52.000000000","message":"These lines are not necessary because the super class is ServersSampleJsonTest.\n(ServersSampleJsonTest class has test_servers_post method.)","commit_id":"66eb350f873827b9ed11e02e0e5520472da6b7e0"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"0b111bf1d6c8d798326e50b6408e61e417800939","unresolved":false,"context_lines":[{"line_number":235,"context_line":"    scenarios \u003d [(\u0027v2_49\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"},{"line_number":236,"context_line":"    use_common_server_post \u003d False"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    def test_servers_post(self):"},{"line_number":239,"context_line":"        self._post_server(use_common_server_api_samples\u003dFalse)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"class ServersUpdateSampleJsonTest(ServersSampleBase):"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_95bee9b1","line":239,"range":{"start_line":238,"start_character":0,"end_line":239,"end_character":62},"in_reply_to":"7f231b9d_b1ffcba9","updated":"2017-06-16 02:45:59.000000000","message":"Done","commit_id":"66eb350f873827b9ed11e02e0e5520472da6b7e0"}],"nova/tests/functional/wsgi/test_servers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e241651f4cf78a60fd2db32263f60e20d9535cf4","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    def test_instance_list_from_buildrequests_old_service(self):"},{"line_number":185,"context_line":"        self._test_instance_list_from_buildrequests()"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _test_instance_list_from_buildrequests_with_tags(self):"},{"line_number":188,"context_line":"        image_ref \u003d fake_image.get_valid_image_id()"},{"line_number":189,"context_line":"        body \u003d {"},{"line_number":190,"context_line":"            \u0027server\u0027: {"}],"source_content_type":"text/x-python","patch_set":34,"id":"1f1a1f67_ca486188","line":187,"range":{"start_line":187,"start_character":8,"end_line":187,"end_character":56},"updated":"2017-07-17 15:01:21.000000000","message":"Do you plan on using this for more than one test? If not, let\u0027s just merge this with the actual test method below.","commit_id":"9fa4fcb20d2cf9df7771ace2d88e0f42dbf2d10e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e241651f4cf78a60fd2db32263f60e20d9535cf4","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        list_resp \u003d self.api.api_get("},{"line_number":205,"context_line":"            \u0027servers/detail?tags\u003dtag1,tag2\u0027)"},{"line_number":206,"context_line":"        list_resp \u003d list_resp.body[\u0027servers\u0027]"},{"line_number":207,"context_line":"        self.assertEqual(1, len(list_resp))"},{"line_number":208,"context_line":"        self.assertEqual(inst1.body[\u0027server\u0027][\u0027id\u0027], list_resp[0][\u0027id\u0027])"},{"line_number":209,"context_line":"        self.assertEqual(\u0027foo\u0027, list_resp[0][\u0027name\u0027])"},{"line_number":210,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"1f1a1f67_be968692","line":207,"range":{"start_line":207,"start_character":8,"end_line":207,"end_character":43},"updated":"2017-07-17 15:01:21.000000000","message":"This is failing:\n\nhttp://logs.openstack.org/00/469800/34/check/gate-nova-tox-functional-ubuntu-xenial/11ad9c7/console.html#_2017-07-17_10_32_08_183866\n\nBut server \u0027foo\u0027 should come back since it has tag1 and tag2. Since we\u0027re using NoopConductorFixture, the instance is never created but we should be processing the two build requests in the API and passing the filters in. The build_requests should have been created in the API with the tags stored on them. And the filtering code is working over build_request.instance which is lazy-loaded from the build_request object and the tags from the build request are put on that instance object.\n\nMight need a breakpoint to figure out what\u0027s failing.","commit_id":"9fa4fcb20d2cf9df7771ace2d88e0f42dbf2d10e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"30b696e5f34fe92efb76393a054121df2ae1ec5f","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        self.assertEqual(inst1.body[\u0027server\u0027][\u0027id\u0027], list_resp[1][\u0027id\u0027])"},{"line_number":225,"context_line":"        self.assertEqual(\u0027foo\u0027, list_resp[1][\u0027name\u0027])"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        # list servers using not-tags\u003dtag1,tag2"},{"line_number":228,"context_line":"        list_resp \u003d self.api.api_get("},{"line_number":229,"context_line":"            \u0027servers/detail?not-tags\u003dtag1,tag2\u0027)"},{"line_number":230,"context_line":"        list_resp \u003d list_resp.body[\u0027servers\u0027]"},{"line_number":231,"context_line":"        self.assertEqual(1, len(list_resp))"},{"line_number":232,"context_line":"        self.assertEqual(inst2.body[\u0027server\u0027][\u0027id\u0027], list_resp[0][\u0027id\u0027])"},{"line_number":233,"context_line":"        self.assertEqual(\u0027bar\u0027, list_resp[0][\u0027name\u0027])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # list servers using not-tags-any\u003dtag1,tag3"},{"line_number":236,"context_line":"        list_resp \u003d self.api.api_get("}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_82f596ef","line":233,"range":{"start_line":227,"start_character":8,"end_line":233,"end_character":53},"updated":"2017-07-18 08:42:30.000000000","message":"I think this test has better coverage https://github.com/openstack/nova/blob/master/nova/tests/unit/db/test_db_api.py#L10447\n\nLike the case the server with only \u0027tag1\u0027, not covered.\n\nWould you mind make this testcase have better coverage? Maybe just like the test in test_db_api, have separated test case for each filter.","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"389bad59dc1523152fd34a28ff152c8ddfa85e6a","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        self.assertEqual(inst1.body[\u0027server\u0027][\u0027id\u0027], list_resp[1][\u0027id\u0027])"},{"line_number":225,"context_line":"        self.assertEqual(\u0027foo\u0027, list_resp[1][\u0027name\u0027])"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        # list servers using not-tags\u003dtag1,tag2"},{"line_number":228,"context_line":"        list_resp \u003d self.api.api_get("},{"line_number":229,"context_line":"            \u0027servers/detail?not-tags\u003dtag1,tag2\u0027)"},{"line_number":230,"context_line":"        list_resp \u003d list_resp.body[\u0027servers\u0027]"},{"line_number":231,"context_line":"        self.assertEqual(1, len(list_resp))"},{"line_number":232,"context_line":"        self.assertEqual(inst2.body[\u0027server\u0027][\u0027id\u0027], list_resp[0][\u0027id\u0027])"},{"line_number":233,"context_line":"        self.assertEqual(\u0027bar\u0027, list_resp[0][\u0027name\u0027])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # list servers using not-tags-any\u003dtag1,tag3"},{"line_number":236,"context_line":"        list_resp \u003d self.api.api_get("}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_6e76d740","line":233,"range":{"start_line":227,"start_character":8,"end_line":233,"end_character":53},"in_reply_to":"1f1a1f67_4eb9db12","updated":"2017-07-18 15:09:55.000000000","message":"I agree with Alex that having the instance filtered using SQL and the build requests filtered in Python introduces a larger surface area for bugs to creep in, so I support the request to add full coverage including the not-tags-any filters.","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"09176463e8bbc3975363a4e9498cb65150f1c721","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        self.assertEqual(inst1.body[\u0027server\u0027][\u0027id\u0027], list_resp[1][\u0027id\u0027])"},{"line_number":225,"context_line":"        self.assertEqual(\u0027foo\u0027, list_resp[1][\u0027name\u0027])"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        # list servers using not-tags\u003dtag1,tag2"},{"line_number":228,"context_line":"        list_resp \u003d self.api.api_get("},{"line_number":229,"context_line":"            \u0027servers/detail?not-tags\u003dtag1,tag2\u0027)"},{"line_number":230,"context_line":"        list_resp \u003d list_resp.body[\u0027servers\u0027]"},{"line_number":231,"context_line":"        self.assertEqual(1, len(list_resp))"},{"line_number":232,"context_line":"        self.assertEqual(inst2.body[\u0027server\u0027][\u0027id\u0027], list_resp[0][\u0027id\u0027])"},{"line_number":233,"context_line":"        self.assertEqual(\u0027bar\u0027, list_resp[0][\u0027name\u0027])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # list servers using not-tags-any\u003dtag1,tag3"},{"line_number":236,"context_line":"        list_resp \u003d self.api.api_get("}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_4eb9db12","line":233,"range":{"start_line":227,"start_character":8,"end_line":233,"end_character":53},"in_reply_to":"1f1a1f67_6796ff40","updated":"2017-07-18 15:04:56.000000000","message":"Sorry, I didn\u0027t list explore all the specific cases.\n\nFor not-tags, I would expect to add one more server with tags [tag1, tag2, tag3]. And one more server without tags.\n\nFor other filters, I think we found more cases in those tests https://github.com/openstack/nova/blob/master/nova/tests/unit/db/test_db_api.py#L10447\n\nIt is terrible to have two implementations for those tags.( one for filter on build_request, another for filter on the instances). And If we have some way to test those two implementations with same set test-cases, that will be great.","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ef3370859e73feaf55e52cec352990dba5ac9295","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        self.assertEqual(inst1.body[\u0027server\u0027][\u0027id\u0027], list_resp[1][\u0027id\u0027])"},{"line_number":225,"context_line":"        self.assertEqual(\u0027foo\u0027, list_resp[1][\u0027name\u0027])"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        # list servers using not-tags\u003dtag1,tag2"},{"line_number":228,"context_line":"        list_resp \u003d self.api.api_get("},{"line_number":229,"context_line":"            \u0027servers/detail?not-tags\u003dtag1,tag2\u0027)"},{"line_number":230,"context_line":"        list_resp \u003d list_resp.body[\u0027servers\u0027]"},{"line_number":231,"context_line":"        self.assertEqual(1, len(list_resp))"},{"line_number":232,"context_line":"        self.assertEqual(inst2.body[\u0027server\u0027][\u0027id\u0027], list_resp[0][\u0027id\u0027])"},{"line_number":233,"context_line":"        self.assertEqual(\u0027bar\u0027, list_resp[0][\u0027name\u0027])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # list servers using not-tags-any\u003dtag1,tag3"},{"line_number":236,"context_line":"        list_resp \u003d self.api.api_get("}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_ee442776","line":233,"range":{"start_line":227,"start_character":8,"end_line":233,"end_character":53},"in_reply_to":"1f1a1f67_6e76d740","updated":"2017-07-18 15:19:16.000000000","message":"The not-tags-any filter is tested below...","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"14b149b9d366942c5366f3c7e211aa88f1724b21","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        self.assertEqual(inst1.body[\u0027server\u0027][\u0027id\u0027], list_resp[1][\u0027id\u0027])"},{"line_number":225,"context_line":"        self.assertEqual(\u0027foo\u0027, list_resp[1][\u0027name\u0027])"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        # list servers using not-tags\u003dtag1,tag2"},{"line_number":228,"context_line":"        list_resp \u003d self.api.api_get("},{"line_number":229,"context_line":"            \u0027servers/detail?not-tags\u003dtag1,tag2\u0027)"},{"line_number":230,"context_line":"        list_resp \u003d list_resp.body[\u0027servers\u0027]"},{"line_number":231,"context_line":"        self.assertEqual(1, len(list_resp))"},{"line_number":232,"context_line":"        self.assertEqual(inst2.body[\u0027server\u0027][\u0027id\u0027], list_resp[0][\u0027id\u0027])"},{"line_number":233,"context_line":"        self.assertEqual(\u0027bar\u0027, list_resp[0][\u0027name\u0027])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # list servers using not-tags-any\u003dtag1,tag3"},{"line_number":236,"context_line":"        list_resp \u003d self.api.api_get("}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_6796ff40","line":233,"range":{"start_line":227,"start_character":8,"end_line":233,"end_character":53},"in_reply_to":"1f1a1f67_82f596ef","updated":"2017-07-18 14:31:03.000000000","message":"\u003e Like the case the server with only \u0027tag1\u0027, not covered.\n\nI\u0027m not sure exactly what you\u0027re asking for, can you be specific? What is the test case? Do you want a 3rd server created in this test that doesn\u0027t have any tags? Or just has tag1? And then mix that into the results?\n\nOtherwise I\u0027m OK with the base testing already present in here and we could add additional wrinkles in follow up changes if necessary, but I\u0027d like to know which specific scenarios we want to add.","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"32fc760f55a07bd132caac98ded1573379056afb","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        self.assertEqual(inst1.body[\u0027server\u0027][\u0027id\u0027], list_resp[1][\u0027id\u0027])"},{"line_number":225,"context_line":"        self.assertEqual(\u0027foo\u0027, list_resp[1][\u0027name\u0027])"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        # list servers using not-tags\u003dtag1,tag2"},{"line_number":228,"context_line":"        list_resp \u003d self.api.api_get("},{"line_number":229,"context_line":"            \u0027servers/detail?not-tags\u003dtag1,tag2\u0027)"},{"line_number":230,"context_line":"        list_resp \u003d list_resp.body[\u0027servers\u0027]"},{"line_number":231,"context_line":"        self.assertEqual(1, len(list_resp))"},{"line_number":232,"context_line":"        self.assertEqual(inst2.body[\u0027server\u0027][\u0027id\u0027], list_resp[0][\u0027id\u0027])"},{"line_number":233,"context_line":"        self.assertEqual(\u0027bar\u0027, list_resp[0][\u0027name\u0027])"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # list servers using not-tags-any\u003dtag1,tag3"},{"line_number":236,"context_line":"        list_resp \u003d self.api.api_get("}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_eda67bab","line":233,"range":{"start_line":227,"start_character":8,"end_line":233,"end_character":53},"in_reply_to":"1f1a1f67_82f596ef","updated":"2017-07-18 09:12:55.000000000","message":"I think the current tests tested these filters well, but it will be OK for me to add more tests here, but maybe we should add them in separate patch as a enhancement to the current \"Server List\" APIs? because I didn\u0027t see any tests on it when I do the coding.","commit_id":"b50b5a660efd5401490e9dbda853d7363d0568e3"}],"nova/tests/unit/api/openstack/compute/test_serversV21.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"4fc4b9fd0501cff3efdadf419dd997495608b4d0","unresolved":false,"context_lines":[{"line_number":3867,"context_line":"        super(ServersControllerCreateTestV250, self).setUp()"},{"line_number":3868,"context_line":"        self.flags(use_neutron\u003dTrue)"},{"line_number":3869,"context_line":""},{"line_number":3870,"context_line":"        ext_info \u003d extension_info.LoadedExtensionInfo()"},{"line_number":3871,"context_line":"        self.controller \u003d servers.ServersController(extension_info\u003dext_info)"},{"line_number":3872,"context_line":""},{"line_number":3873,"context_line":"        self.body \u003d {"},{"line_number":3874,"context_line":"            \u0027server\u0027: {"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f1d235d_8baac182","line":3871,"range":{"start_line":3870,"start_character":0,"end_line":3871,"end_character":76},"updated":"2017-07-11 01:43:26.000000000","message":"extension_info not more used, we can remove this.\n\nhttps://github.com/openstack/nova/blob/e42e3c858fbfbd58de0bf29a742d31bf8b8b4b7e/nova/api/openstack/compute/servers.py#L131","commit_id":"75dc2391c9a51d7d8c28bb5c8b27ffb78f499e6c"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"3ab5ddfb508ef9acddc0ebfdd0764004f744bcd1","unresolved":false,"context_lines":[{"line_number":3867,"context_line":"        super(ServersControllerCreateTestV250, self).setUp()"},{"line_number":3868,"context_line":"        self.flags(use_neutron\u003dTrue)"},{"line_number":3869,"context_line":""},{"line_number":3870,"context_line":"        ext_info \u003d extension_info.LoadedExtensionInfo()"},{"line_number":3871,"context_line":"        self.controller \u003d servers.ServersController(extension_info\u003dext_info)"},{"line_number":3872,"context_line":""},{"line_number":3873,"context_line":"        self.body \u003d {"},{"line_number":3874,"context_line":"            \u0027server\u0027: {"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f1d235d_63030944","line":3871,"range":{"start_line":3870,"start_character":0,"end_line":3871,"end_character":76},"in_reply_to":"3f1d235d_8baac182","updated":"2017-07-11 03:55:37.000000000","message":"Done","commit_id":"75dc2391c9a51d7d8c28bb5c8b27ffb78f499e6c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"4fc4b9fd0501cff3efdadf419dd997495608b4d0","unresolved":false,"context_lines":[{"line_number":3890,"context_line":"        self.req.body \u003d jsonutils.dump_as_bytes(self.body)"},{"line_number":3891,"context_line":"        return self.controller.create(self.req, body\u003dself.body).obj[\u0027server\u0027]"},{"line_number":3892,"context_line":""},{"line_number":3893,"context_line":"    def test_create_server_auth_pre_2_50_fails(self):"},{"line_number":3894,"context_line":"        \"\"\"Negative test to make sure you can\u0027t pass \u0027tags\u0027 before 2.50\"\"\""},{"line_number":3895,"context_line":"        self.req.api_version_request \u003d \\"},{"line_number":3896,"context_line":"            api_version_request.APIVersionRequest(\u00272.49\u0027)"},{"line_number":3897,"context_line":"        self.assertRaises(exception.ValidationError, self._create_server,"},{"line_number":3898,"context_line":"                          [\u0027tag1\u0027])"},{"line_number":3899,"context_line":""},{"line_number":3900,"context_line":""},{"line_number":3901,"context_line":"class ServersControllerCreateTestWithMock(test.TestCase):"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f1d235d_2bf4cd86","line":3898,"range":{"start_line":3893,"start_character":0,"end_line":3898,"end_character":35},"updated":"2017-07-11 01:43:26.000000000","message":"we should create more negative tests for tag schema validation with \u0027,\u0027 \u0027/\u0027 max length and max item etc.","commit_id":"75dc2391c9a51d7d8c28bb5c8b27ffb78f499e6c"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"3ab5ddfb508ef9acddc0ebfdd0764004f744bcd1","unresolved":false,"context_lines":[{"line_number":3890,"context_line":"        self.req.body \u003d jsonutils.dump_as_bytes(self.body)"},{"line_number":3891,"context_line":"        return self.controller.create(self.req, body\u003dself.body).obj[\u0027server\u0027]"},{"line_number":3892,"context_line":""},{"line_number":3893,"context_line":"    def test_create_server_auth_pre_2_50_fails(self):"},{"line_number":3894,"context_line":"        \"\"\"Negative test to make sure you can\u0027t pass \u0027tags\u0027 before 2.50\"\"\""},{"line_number":3895,"context_line":"        self.req.api_version_request \u003d \\"},{"line_number":3896,"context_line":"            api_version_request.APIVersionRequest(\u00272.49\u0027)"},{"line_number":3897,"context_line":"        self.assertRaises(exception.ValidationError, self._create_server,"},{"line_number":3898,"context_line":"                          [\u0027tag1\u0027])"},{"line_number":3899,"context_line":""},{"line_number":3900,"context_line":""},{"line_number":3901,"context_line":"class ServersControllerCreateTestWithMock(test.TestCase):"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f1d235d_03f8d546","line":3898,"range":{"start_line":3893,"start_character":0,"end_line":3898,"end_character":35},"in_reply_to":"3f1d235d_2bf4cd86","updated":"2017-07-11 03:55:37.000000000","message":"Done","commit_id":"75dc2391c9a51d7d8c28bb5c8b27ffb78f499e6c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3811e1244b39408a9089a3f8f7883fc2be8f3dbb","unresolved":false,"context_lines":[{"line_number":3895,"context_line":"        self.assertRaises(exception.ValidationError, self._create_server,"},{"line_number":3896,"context_line":"                          [\u0027tag1\u0027])"},{"line_number":3897,"context_line":""},{"line_number":3898,"context_line":"    def test_create_server_with_tags_inccorect_tags(self):"},{"line_number":3899,"context_line":"        \"\"\"Negative test to inccorect tags are not allowed\"\"\""},{"line_number":3900,"context_line":"        self.req.api_version_request \u003d \\"},{"line_number":3901,"context_line":"            api_version_request.APIVersionRequest(\u00272.50\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_d2115e06","line":3898,"range":{"start_line":3898,"start_character":37,"end_line":3898,"end_character":46},"updated":"2017-07-12 01:22:05.000000000","message":"incorrect","commit_id":"0baa810c87cbb4fab4f775df1843c69b797d2c2c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d6b6f212f322b70d254cf9d2206998506e9e2184","unresolved":false,"context_lines":[{"line_number":3903,"context_line":"                          [\u0027,\u0027])"},{"line_number":3904,"context_line":"        self.assertRaises(exception.ValidationError, self._create_server,"},{"line_number":3905,"context_line":"                          [\u0027/\u0027])"},{"line_number":3906,"context_line":""},{"line_number":3907,"context_line":""},{"line_number":3908,"context_line":"class ServersControllerCreateTestWithMock(test.TestCase):"},{"line_number":3909,"context_line":"    image_uuid \u003d \u002776fa36fc-c930-4bf3-8c8a-ea2a2420deb6\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_ee624ed8","line":3906,"range":{"start_line":3906,"start_character":0,"end_line":3906,"end_character":0},"updated":"2017-07-11 13:39:09.000000000","message":"thanks, but if you can cover all cases it will be more nice. I like to cover maximum schema cases to avoid any accidental changes in schema during microversions. \n\n- \u003e max tag length\n- \u003e max number of tag\n- tag as dict\n- tag with list of int\n- empty tag list\n- tag with empty string\n\netc etc","commit_id":"0baa810c87cbb4fab4f775df1843c69b797d2c2c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2730b05cdd3ec7e0a419b4ebe0823dc5b8f67279","unresolved":false,"context_lines":[{"line_number":3903,"context_line":"                          [\u0027,\u0027])"},{"line_number":3904,"context_line":"        self.assertRaises(exception.ValidationError, self._create_server,"},{"line_number":3905,"context_line":"                          [\u0027/\u0027])"},{"line_number":3906,"context_line":""},{"line_number":3907,"context_line":""},{"line_number":3908,"context_line":"class ServersControllerCreateTestWithMock(test.TestCase):"},{"line_number":3909,"context_line":"    image_uuid \u003d \u002776fa36fc-c930-4bf3-8c8a-ea2a2420deb6\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_55a65855","line":3906,"range":{"start_line":3906,"start_character":0,"end_line":3906,"end_character":0},"in_reply_to":"3f1d235d_123116a3","updated":"2017-07-12 02:37:03.000000000","message":"yea, initially I\u0027m thinking the schema is shared with server-tags API. And there are enough tests in the server-tags API, we just need few test at here to ensure the schema was added in this API change.\n\nBut yes, agree with Gmann, it would be great if have full cover in the test of this API also.","commit_id":"0baa810c87cbb4fab4f775df1843c69b797d2c2c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3811e1244b39408a9089a3f8f7883fc2be8f3dbb","unresolved":false,"context_lines":[{"line_number":3903,"context_line":"                          [\u0027,\u0027])"},{"line_number":3904,"context_line":"        self.assertRaises(exception.ValidationError, self._create_server,"},{"line_number":3905,"context_line":"                          [\u0027/\u0027])"},{"line_number":3906,"context_line":""},{"line_number":3907,"context_line":""},{"line_number":3908,"context_line":"class ServersControllerCreateTestWithMock(test.TestCase):"},{"line_number":3909,"context_line":"    image_uuid \u003d \u002776fa36fc-c930-4bf3-8c8a-ea2a2420deb6\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f1d235d_123116a3","line":3906,"range":{"start_line":3906,"start_character":0,"end_line":3906,"end_character":0},"in_reply_to":"3f1d235d_ee624ed8","updated":"2017-07-12 01:22:05.000000000","message":"If possible, you might be able to work this in using ddt for the various scenarios.","commit_id":"0baa810c87cbb4fab4f775df1843c69b797d2c2c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f47b9f1414b0f0ecec60a9f6e27c5f82c34eedb4","unresolved":false,"context_lines":[{"line_number":3901,"context_line":"    @ddt.data([\u0027,\u0027],"},{"line_number":3902,"context_line":"              [\u0027/\u0027],"},{"line_number":3903,"context_line":"              [\u0027a\u0027 * (tag.MAX_TAG_LENGTH + 1)],"},{"line_number":3904,"context_line":"              [\u0027a\u0027] * (instance_obj.MAX_TAG_COUNT + 1),"},{"line_number":3905,"context_line":"              [\u0027\u0027],"},{"line_number":3906,"context_line":"              [1, 2, 3],"},{"line_number":3907,"context_line":"              {\u0027tag\u0027: \u0027tag\u0027})"}],"source_content_type":"text/x-python","patch_set":26,"id":"1f1a1f67_7c2acde7","line":3904,"range":{"start_line":3904,"start_character":14,"end_line":3904,"end_character":55},"updated":"2017-07-12 09:37:28.000000000","message":"nice but generated name is too long in this case. we can hack the test name in ddt with override function but that will be complex here. How about separating this case from ddt and have separate tests.  \n\nhttp://logs.openstack.org/00/469800/25/check/gate-nova-python27-ubuntu-xenial/c7ea1ae/testr_results.html.gz","commit_id":"8451e23c7a4bf3f77c1db78c6169c4890f0caac8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f13dc14a2dfd09d6f5d571203c0e1390ff96d1c","unresolved":false,"context_lines":[{"line_number":3865,"context_line":""},{"line_number":3866,"context_line":""},{"line_number":3867,"context_line":"@ddt.ddt"},{"line_number":3868,"context_line":"class ServersControllerCreateTestV252(test.NoDBTestCase):"},{"line_number":3869,"context_line":"    def setUp(self):"},{"line_number":3870,"context_line":"        super(ServersControllerCreateTestV252, self).setUp()"},{"line_number":3871,"context_line":"        self.flags(use_neutron\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_4d571304","line":3868,"updated":"2017-07-14 02:11:54.000000000","message":"Could also be nice to have a test in here where we create a server with a unicode tag since that\u0027s supposed to be supported. You could always use my favorite:\n\nu\"\\U0001F4A9\"","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"3b79302b3376fd1b1d9fcdd88adaf53253931867","unresolved":false,"context_lines":[{"line_number":3865,"context_line":""},{"line_number":3866,"context_line":""},{"line_number":3867,"context_line":"@ddt.ddt"},{"line_number":3868,"context_line":"class ServersControllerCreateTestV252(test.NoDBTestCase):"},{"line_number":3869,"context_line":"    def setUp(self):"},{"line_number":3870,"context_line":"        super(ServersControllerCreateTestV252, self).setUp()"},{"line_number":3871,"context_line":"        self.flags(use_neutron\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_628d3630","line":3868,"in_reply_to":"1f1a1f67_4d571304","updated":"2017-07-14 06:56:36.000000000","message":"Done","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f13dc14a2dfd09d6f5d571203c0e1390ff96d1c","unresolved":false,"context_lines":[{"line_number":3868,"context_line":"class ServersControllerCreateTestV252(test.NoDBTestCase):"},{"line_number":3869,"context_line":"    def setUp(self):"},{"line_number":3870,"context_line":"        super(ServersControllerCreateTestV252, self).setUp()"},{"line_number":3871,"context_line":"        self.flags(use_neutron\u003dTrue)"},{"line_number":3872,"context_line":"        self.controller \u003d servers.ServersController()"},{"line_number":3873,"context_line":""},{"line_number":3874,"context_line":"        self.body \u003d {"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_897080de","line":3871,"range":{"start_line":3871,"start_character":8,"end_line":3871,"end_character":36},"updated":"2017-07-14 02:11:54.000000000","message":"use_neutron is already the default so this is redundant.","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"3b79302b3376fd1b1d9fcdd88adaf53253931867","unresolved":false,"context_lines":[{"line_number":3868,"context_line":"class ServersControllerCreateTestV252(test.NoDBTestCase):"},{"line_number":3869,"context_line":"    def setUp(self):"},{"line_number":3870,"context_line":"        super(ServersControllerCreateTestV252, self).setUp()"},{"line_number":3871,"context_line":"        self.flags(use_neutron\u003dTrue)"},{"line_number":3872,"context_line":"        self.controller \u003d servers.ServersController()"},{"line_number":3873,"context_line":""},{"line_number":3874,"context_line":"        self.body \u003d {"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_a2990e7a","line":3871,"range":{"start_line":3871,"start_character":8,"end_line":3871,"end_character":36},"in_reply_to":"1f1a1f67_897080de","updated":"2017-07-14 06:56:36.000000000","message":"Done","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f13dc14a2dfd09d6f5d571203c0e1390ff96d1c","unresolved":false,"context_lines":[{"line_number":3900,"context_line":""},{"line_number":3901,"context_line":"    @ddt.data([\u0027,\u0027],"},{"line_number":3902,"context_line":"              [\u0027/\u0027],"},{"line_number":3903,"context_line":"              [\u0027a\u0027 * (tag.MAX_TAG_LENGTH + 1)],"},{"line_number":3904,"context_line":"              [\u0027a\u0027] * (instance_obj.MAX_TAG_COUNT + 1),"},{"line_number":3905,"context_line":"              [\u0027\u0027],"},{"line_number":3906,"context_line":"              [1, 2, 3],"}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_690e443c","line":3903,"updated":"2017-07-14 02:11:54.000000000","message":"heh nice\n\nhttp://logs.openstack.org/00/469800/28/check/gate-nova-python27-ubuntu-xenial/4c99573/console.html#_2017-07-13_09_16_19_649228","commit_id":"2050315a382c95b41861097bf42924824abcc26c"}],"nova/tests/unit/compute/test_compute_api.py":[{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"7a3526ce7fcf2e408353e363f75a3a26767cb380","unresolved":false,"context_lines":[{"line_number":3696,"context_line":"            filter_properties \u003d {\u0027scheduler_hints\u0027: None,"},{"line_number":3697,"context_line":"                    \u0027instance_type\u0027: flavor}"},{"line_number":3698,"context_line":""},{"line_number":3699,"context_line":"            instances_to_build,_ \u003d self.compute_api._provision_instances("},{"line_number":3700,"context_line":"                    ctxt, flavor,"},{"line_number":3701,"context_line":"                    min_count, max_count, base_options, boot_meta,"},{"line_number":3702,"context_line":"                    security_groups, block_device_mappings, shutdown_terminate,"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_2b335f16","line":3699,"range":{"start_line":3699,"start_character":30,"end_line":3699,"end_character":32},"updated":"2017-06-02 08:08:11.000000000","message":"looks like a \u0027 \u0027 is needed","commit_id":"a31e701cb46370ac70ba7c3f2891aba27703fdce"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"3dabb1bf7f86370a0c61b15e35f59f9cd45e3202","unresolved":false,"context_lines":[{"line_number":3646,"context_line":"                                                  1, 1, mock.MagicMock(),"},{"line_number":3647,"context_line":"                                                  {}, None,"},{"line_number":3648,"context_line":"                                                  None, None, None, {}, None,"},{"line_number":3649,"context_line":"                                                  fake_keypair, [], [])"},{"line_number":3650,"context_line":"            self.assertEqual("},{"line_number":3651,"context_line":"                \u0027test\u0027,"},{"line_number":3652,"context_line":"                mock_instance.return_value.keypairs.objects[0].name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_1f78cbc1","line":3649,"range":{"start_line":3649,"start_character":66,"end_line":3649,"end_character":70},"updated":"2017-06-15 14:58:52.000000000","message":"Remove it.","commit_id":"66eb350f873827b9ed11e02e0e5520472da6b7e0"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"0b111bf1d6c8d798326e50b6408e61e417800939","unresolved":false,"context_lines":[{"line_number":3646,"context_line":"                                                  1, 1, mock.MagicMock(),"},{"line_number":3647,"context_line":"                                                  {}, None,"},{"line_number":3648,"context_line":"                                                  None, None, None, {}, None,"},{"line_number":3649,"context_line":"                                                  fake_keypair, [], [])"},{"line_number":3650,"context_line":"            self.assertEqual("},{"line_number":3651,"context_line":"                \u0027test\u0027,"},{"line_number":3652,"context_line":"                mock_instance.return_value.keypairs.objects[0].name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_35cdd565","line":3649,"range":{"start_line":3649,"start_character":66,"end_line":3649,"end_character":70},"in_reply_to":"7f231b9d_1f78cbc1","updated":"2017-06-16 02:45:59.000000000","message":"Done","commit_id":"66eb350f873827b9ed11e02e0e5520472da6b7e0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f13dc14a2dfd09d6f5d571203c0e1390ff96d1c","unresolved":false,"context_lines":[{"line_number":3651,"context_line":"                              boot_meta, security_groups, block_device_mapping,"},{"line_number":3652,"context_line":"                              shutdown_terminate, instance_group,"},{"line_number":3653,"context_line":"                              check_server_group_quota, filter_properties,"},{"line_number":3654,"context_line":"                              None, [])"},{"line_number":3655,"context_line":""},{"line_number":3656,"context_line":"        do_test()"},{"line_number":3657,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"1f1a1f67_ad458745","line":3654,"range":{"start_line":3654,"start_character":36,"end_line":3654,"end_character":38},"updated":"2017-07-14 02:11:54.000000000","message":"see if we defaulted to None this wouldn\u0027t be a problem","commit_id":"2050315a382c95b41861097bf42924824abcc26c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cdc6e6322d78cdab626595bf105565fff1dd429d","unresolved":false,"context_lines":[{"line_number":3701,"context_line":"                                                  {}, None,"},{"line_number":3702,"context_line":"                                                  None, None, None, {}, None,"},{"line_number":3703,"context_line":"                                                  fake_keypair,"},{"line_number":3704,"context_line":"                                                  mock.MagicMock())"},{"line_number":3705,"context_line":"            self.assertEqual("},{"line_number":3706,"context_line":"                \u0027test\u0027,"},{"line_number":3707,"context_line":"                mock_instance.return_value.keypairs.objects[0].name)"}],"source_content_type":"text/x-python","patch_set":31,"id":"1f1a1f67_97499bd1","line":3704,"range":{"start_line":3704,"start_character":50,"end_line":3704,"end_character":66},"updated":"2017-07-14 19:42:46.000000000","message":"could be mock.sentinel.tags - then it has a name","commit_id":"9051bb2269fbbef3f271fda91ec5ba69d3dc28b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"277269922ebe9376330c1bbf62315ad5dfb97e56","unresolved":false,"context_lines":[{"line_number":3701,"context_line":"                                                  {}, None,"},{"line_number":3702,"context_line":"                                                  None, None, None, {}, None,"},{"line_number":3703,"context_line":"                                                  fake_keypair,"},{"line_number":3704,"context_line":"                                                  mock.MagicMock())"},{"line_number":3705,"context_line":"            self.assertEqual("},{"line_number":3706,"context_line":"                \u0027test\u0027,"},{"line_number":3707,"context_line":"                mock_instance.return_value.keypairs.objects[0].name)"}],"source_content_type":"text/x-python","patch_set":31,"id":"1f1a1f67_777cbfb4","line":3704,"range":{"start_line":3704,"start_character":50,"end_line":3704,"end_character":66},"in_reply_to":"1f1a1f67_97499bd1","updated":"2017-07-17 14:46:37.000000000","message":"Actually just objects.TagList() is best since that\u0027s what gets passed in here if there are no tags specified.","commit_id":"9051bb2269fbbef3f271fda91ec5ba69d3dc28b0"}]}
