)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"5f91a3025efcb3dbdafc34384a45651687112d37","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduces API microversion 3.65, which allows"},{"line_number":10,"context_line":"snapshot creation on in-use volumes without the"},{"line_number":11,"context_line":"force flag being passed."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I6d45aeab065197a85ce62740fc95306bce9dfc45"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"cb90fd71_14fdc842","line":11,"updated":"2021-07-27 18:55:27.000000000","message":"Need more description here about API changes re. force\u003dFalse","commit_id":"1cd6fb6cc4f6588f48934ab5965cf0b17b168640"}],"api-ref/source/v3/volumes-v3-snapshots.inc":[{"author":{"_account_id":32171,"name":"Girish Chilukuri","email":"girish.chilukuri@ibm.com","username":"GirishChilukuri"},"change_message_id":"b196c422a22ea2b23e91a9f91c9eb593374de3c7","unresolved":true,"context_lines":[{"line_number":105,"context_line":"You can create a volume from a snapshot."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"As of API version 3.65, False boolean values are not allowed for the \"force\""},{"line_number":108,"context_line":"parameter."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"Response codes"},{"line_number":111,"context_line":"--------------"}],"source_content_type":"text/x-c++src","patch_set":10,"id":"de8b2eae_8e7be1bb","line":108,"updated":"2021-08-16 15:08:11.000000000","message":"I think we need to update about allow-in-use volume snapshot also.","commit_id":"f48e620c9d8133d15eec0dfe5f97f4d2f9390b62"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"e86ea0aeab83d4a43b77af61c4bb523554506361","unresolved":true,"context_lines":[{"line_number":105,"context_line":"You can create a volume from a snapshot."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"As of API version 3.65, False boolean values are not allowed for the \"force\""},{"line_number":108,"context_line":"parameter."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"Response codes"},{"line_number":111,"context_line":"--------------"}],"source_content_type":"text/x-c++src","patch_set":11,"id":"e7cf8684_685bd3e7","line":108,"updated":"2021-08-25 13:10:26.000000000","message":"May want to rephrase this along the lines of what I suggested for the api version history.","commit_id":"a046f29a7e4852d2897fd06853c73c2102a971fe"}],"cinder/api/openstack/api_version_request.py":[{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"c3b20296a1f3b1902bfbd107d5f8a438ec946096","unresolved":true,"context_lines":[{"line_number":147,"context_line":"             in the volume details. This MV affects the volume detail list"},{"line_number":148,"context_line":"             (\"GET /v3/{project_id}/volumes/detail\") and volume-show"},{"line_number":149,"context_line":"             (\"GET /v3/{project_id}/volumes/{volume_id}\") calls."},{"line_number":150,"context_line":"    * 3.64 - Include \u0027encryption_key_id\u0027 in volume and backup details"},{"line_number":151,"context_line":"\"\"\""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":10,"id":"4cbb1c32_8ebfd239","line":150,"updated":"2021-08-23 07:46:17.000000000","message":"Here a comment can be added for 3.65","commit_id":"f48e620c9d8133d15eec0dfe5f97f4d2f9390b62"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"0c36d9db2826d1759c790c81800553de5af7f08b","unresolved":false,"context_lines":[{"line_number":147,"context_line":"             in the volume details. This MV affects the volume detail list"},{"line_number":148,"context_line":"             (\"GET /v3/{project_id}/volumes/detail\") and volume-show"},{"line_number":149,"context_line":"             (\"GET /v3/{project_id}/volumes/{volume_id}\") calls."},{"line_number":150,"context_line":"    * 3.64 - Include \u0027encryption_key_id\u0027 in volume and backup details"},{"line_number":151,"context_line":"\"\"\""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":10,"id":"11c95e92_d69fb6c1","line":150,"in_reply_to":"4cbb1c32_8ebfd239","updated":"2021-08-24 13:34:41.000000000","message":"Done","commit_id":"f48e620c9d8133d15eec0dfe5f97f4d2f9390b62"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"3cd2917c5252b1b867cf476ee1966a56312c9138","unresolved":true,"context_lines":[{"line_number":156,"context_line":"# minimum version of the API supported."},{"line_number":157,"context_line":"_MIN_API_VERSION \u003d \"3.0\""},{"line_number":158,"context_line":"_MAX_API_VERSION \u003d \"3.65\""},{"line_number":159,"context_line":"UPDATED \u003d \"2021-07-27T00:00:00Z\""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"# NOTE(cyeoh): min and max versions declared as functions so we can"}],"source_content_type":"text/x-python","patch_set":11,"id":"09de0e8b_80237d77","line":159,"range":{"start_line":159,"start_character":11,"end_line":159,"end_character":21},"updated":"2021-08-26 03:05:02.000000000","message":"Maybe make this 2021-09-16 (expected date of RC-1)","commit_id":"a046f29a7e4852d2897fd06853c73c2102a971fe"}],"cinder/api/openstack/rest_api_version_history.rst":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c33500fdb300b6f5a1483633223f75237d1a671c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"bde7178a_82c4c3d8","line":493,"updated":"2021-08-25 12:46:10.000000000","message":"don\u0027t forget to add:\n\n  3.65 (Maximum in Xena)\n  ----------------------\n  Volume snapshots of in-use volumes can be created without the \u0027force\u0027 flag.\n  Although the \u0027force\u0027 flag is now considered invalid when passed in a volume\n  snapshot request, for backward compatibility, the \u0027force\u0027 flag with a value\n  evaluating to True is silently ignored.\n\n(feel free to rephrase)","commit_id":"a046f29a7e4852d2897fd06853c73c2102a971fe"}],"cinder/api/v3/snapshots.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"5fb6fd54e9ae208632dc091f53ea87c266e69f0f","unresolved":true,"context_lines":[{"line_number":154,"context_line":"                **kwargs)"},{"line_number":155,"context_line":"        else:"},{"line_number":156,"context_line":"            req_version \u003d req.api_version_request"},{"line_number":157,"context_line":"            if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":158,"context_line":"                kwargs[\u0027allow_in_use\u0027] \u003d True"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"            new_snapshot \u003d self.volume_api.create_snapshot("}],"source_content_type":"text/x-python","patch_set":6,"id":"5c0cd889_1202cab8","line":157,"updated":"2021-06-10 16:28:05.000000000","message":"-1: This code will ignore the caller passing force set to false.\n\nI think we should be consistent.  We either ignore the force parameter in this microversion, or we just default to true on L140 for this microversion and to false for earlier versions.\n\nI was going to complain about this being mostly duplicate code from v2, but since v2 is going away, I think it\u0027s OK to have this code here.","commit_id":"257a99e1d77397bac1843d4c9474027a48720f73"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6e992fa393de1b2a639679398f5aa0d3e1f73d68","unresolved":true,"context_lines":[{"line_number":154,"context_line":"                **kwargs)"},{"line_number":155,"context_line":"        else:"},{"line_number":156,"context_line":"            req_version \u003d req.api_version_request"},{"line_number":157,"context_line":"            if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":158,"context_line":"                kwargs[\u0027allow_in_use\u0027] \u003d True"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"            new_snapshot \u003d self.volume_api.create_snapshot("}],"source_content_type":"text/x-python","patch_set":6,"id":"1f985603_1cfbcdd2","line":157,"in_reply_to":"5c0cd889_1202cab8","updated":"2021-06-10 18:28:46.000000000","message":"I\u0027m not sure what you mean by it ignoring the caller passing force\u003dFalse.  Are you suggesting that someone passing force\u003dFalse should fail when snapshotting an in-use volume, even after this API change?  I\u0027m not sure I agree, but we should define this in the spec.\n\nI think the model for v3 API controllers like this has typically been to copy the needed methods from the v2 controller and add what is needed for the new functionality?  I\u0027m not sure what would work better...","commit_id":"257a99e1d77397bac1843d4c9474027a48720f73"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"ae9dd6e5476f49522e73dff1e49cbd5a61b450bb","unresolved":true,"context_lines":[{"line_number":141,"context_line":"        req_version \u003d req.api_version_request"},{"line_number":142,"context_line":"        force \u003d snapshot.get(\u0027force\u0027, False)"},{"line_number":143,"context_line":"        if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":144,"context_line":"            if force is not None and isinstance(force, str) and \\"},{"line_number":145,"context_line":"                    force.lower() \u003d\u003d \u0027false\u0027:"},{"line_number":146,"context_line":"                raise exc.HTTPBadRequest("},{"line_number":147,"context_line":"                    explanation\u003d\u0027Invalid value %s for force flag.\u0027 % force)"}],"source_content_type":"text/x-python","patch_set":9,"id":"36cb7759_812e2c9f","line":144,"range":{"start_line":144,"start_character":15,"end_line":144,"end_character":32},"updated":"2021-08-11 09:47:17.000000000","message":"nit: Why do we explicitly check for it not being None here?   If it\u0027s None then it\u0027s not an str instance.\n\nnit: Why are we nested the 2 ifs instead of having a single boolean expression?","commit_id":"c9ca77483c1da05c9e75c1c9a9ed1b5a41aaff18"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"88ea5a3affc3577e50535085a690010af66f65d6","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        req_version \u003d req.api_version_request"},{"line_number":142,"context_line":"        force \u003d snapshot.get(\u0027force\u0027, False)"},{"line_number":143,"context_line":"        if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":144,"context_line":"            if force is not None and isinstance(force, str) and \\"},{"line_number":145,"context_line":"                    force.lower() \u003d\u003d \u0027false\u0027:"},{"line_number":146,"context_line":"                raise exc.HTTPBadRequest("},{"line_number":147,"context_line":"                    explanation\u003d\u0027Invalid value %s for force flag.\u0027 % force)"}],"source_content_type":"text/x-python","patch_set":9,"id":"e8c8fba0_66e115db","line":144,"range":{"start_line":144,"start_character":15,"end_line":144,"end_character":32},"in_reply_to":"36cb7759_812e2c9f","updated":"2021-08-11 19:25:44.000000000","message":"Done","commit_id":"c9ca77483c1da05c9e75c1c9a9ed1b5a41aaff18"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"ae9dd6e5476f49522e73dff1e49cbd5a61b450bb","unresolved":true,"context_lines":[{"line_number":142,"context_line":"        force \u003d snapshot.get(\u0027force\u0027, False)"},{"line_number":143,"context_line":"        if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":144,"context_line":"            if force is not None and isinstance(force, str) and \\"},{"line_number":145,"context_line":"                    force.lower() \u003d\u003d \u0027false\u0027:"},{"line_number":146,"context_line":"                raise exc.HTTPBadRequest("},{"line_number":147,"context_line":"                    explanation\u003d\u0027Invalid value %s for force flag.\u0027 % force)"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ab7ee09f_c750fdbb","line":145,"range":{"start_line":145,"start_character":38,"end_line":145,"end_character":43},"updated":"2021-08-11 09:47:17.000000000","message":"-1: false is not the only possible value indicating force is disabled, we also have \u0027off\u0027, \u0027no\u0027, \u0027f\u0027, \u00270\u0027, and \u0027n\u0027.","commit_id":"c9ca77483c1da05c9e75c1c9a9ed1b5a41aaff18"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"88ea5a3affc3577e50535085a690010af66f65d6","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        force \u003d snapshot.get(\u0027force\u0027, False)"},{"line_number":143,"context_line":"        if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":144,"context_line":"            if force is not None and isinstance(force, str) and \\"},{"line_number":145,"context_line":"                    force.lower() \u003d\u003d \u0027false\u0027:"},{"line_number":146,"context_line":"                raise exc.HTTPBadRequest("},{"line_number":147,"context_line":"                    explanation\u003d\u0027Invalid value %s for force flag.\u0027 % force)"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"b652b3fe_e3455da1","line":145,"range":{"start_line":145,"start_character":38,"end_line":145,"end_character":43},"in_reply_to":"ab7ee09f_c750fdbb","updated":"2021-08-11 19:25:44.000000000","message":"Done","commit_id":"c9ca77483c1da05c9e75c1c9a9ed1b5a41aaff18"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"ae9dd6e5476f49522e73dff1e49cbd5a61b450bb","unresolved":true,"context_lines":[{"line_number":161,"context_line":"                snapshot.get(\u0027description\u0027),"},{"line_number":162,"context_line":"                **kwargs)"},{"line_number":163,"context_line":"        else:"},{"line_number":164,"context_line":"            if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":165,"context_line":"                kwargs[\u0027allow_in_use\u0027] \u003d True"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"            new_snapshot \u003d self.volume_api.create_snapshot("},{"line_number":168,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":9,"id":"0ed5701d_c71b016e","line":165,"range":{"start_line":164,"start_character":0,"end_line":165,"end_character":45},"updated":"2021-08-11 09:47:17.000000000","message":"I still prefer setting the force parameter instead of adding a new one, but you already explained your reasons for the new parameter, so we just won\u0027t agree of this one.  This comment won\u0027t affect the vote.","commit_id":"c9ca77483c1da05c9e75c1c9a9ed1b5a41aaff18"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"88ea5a3affc3577e50535085a690010af66f65d6","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                snapshot.get(\u0027description\u0027),"},{"line_number":162,"context_line":"                **kwargs)"},{"line_number":163,"context_line":"        else:"},{"line_number":164,"context_line":"            if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":165,"context_line":"                kwargs[\u0027allow_in_use\u0027] \u003d True"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"            new_snapshot \u003d self.volume_api.create_snapshot("},{"line_number":168,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":9,"id":"2083ccdb_c9543c1e","line":165,"range":{"start_line":164,"start_character":0,"end_line":165,"end_character":45},"in_reply_to":"0ed5701d_c71b016e","updated":"2021-08-11 19:25:44.000000000","message":"Ack","commit_id":"c9ca77483c1da05c9e75c1c9a9ed1b5a41aaff18"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"a18c3405a613b5333da0df4f4e975f3dcf682968","unresolved":true,"context_lines":[{"line_number":142,"context_line":"        force_flag \u003d snapshot.get(\u0027force\u0027)"},{"line_number":143,"context_line":"        force \u003d False"},{"line_number":144,"context_line":"        if force_flag is not None:"},{"line_number":145,"context_line":"            force \u003d strutils.bool_from_string(force_flag, strict\u003dTrue)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"            if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":148,"context_line":"                if force is False:"}],"source_content_type":"text/x-python","patch_set":11,"id":"6c2cf74b_0e3fa0c7","line":145,"range":{"start_line":145,"start_character":58,"end_line":145,"end_character":69},"updated":"2021-08-25 12:36:59.000000000","message":"If someone has \u0027force\u003dmajor\u0027, this will raise a ValueError with a message (that I think will be passed through to the user): \"Unrecognized value \u0027major\u0027, acceptable values are: \u0027t\u0027,\u0027true\u0027, \u0027on\u0027, \u0027y\u0027, \u0027yes\u0027, \u00271\u0027, \u0027f\u0027, \u0027false\u0027, \u0027off\u0027, \u0027n\u0027, \u0027no\u0027, or \u00270\u0027\" [0].  I wonder whether we should do a try here, catch a ValueError, and in the except block check the mv.  If it\u0027s pre-3.65, just reraise the ValueError, and if it\u0027s \u003e\u003d3.65, change the message to something like \"Since microversion 3.65 the \u0027force\u0027 flag is invalid for this request.  For backward compatability, however, when the \u0027force\u0027 flag is passed with a value evaluating to True, it is silently ignored.\"\n\nWe\u0027ll still have to do that secondary check at lines 147-150, but could re-use the above message in the exception.\n\n(This would also help address the weirdness Fernando mentions below.)\n\n[0] https://opendev.org/openstack/oslo.utils/src/commit/cf45c2cf8a9ac7308cf425a8c5263314cc398dc9/oslo_utils/strutils.py#L152-L154","commit_id":"a046f29a7e4852d2897fd06853c73c2102a971fe"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"1f137b9fa454345830b3c344387fdb04452efd39","unresolved":true,"context_lines":[{"line_number":142,"context_line":"        force_flag \u003d snapshot.get(\u0027force\u0027)"},{"line_number":143,"context_line":"        force \u003d False"},{"line_number":144,"context_line":"        if force_flag is not None:"},{"line_number":145,"context_line":"            force \u003d strutils.bool_from_string(force_flag, strict\u003dTrue)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"            if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":148,"context_line":"                if force is False:"}],"source_content_type":"text/x-python","patch_set":11,"id":"dd3848cd_70f2a37a","line":145,"range":{"start_line":145,"start_character":58,"end_line":145,"end_character":69},"in_reply_to":"4156d935_75e2d231","updated":"2021-08-31 18:39:48.000000000","message":"I\u0027m wrong about strict\u003dTrue raising here because a non-boolean-ish value will be caught by the request validation schema.  So Eric\u0027s correct that we just need to screen for False for mv.SNAPSHOT_IN_USE below.","commit_id":"a046f29a7e4852d2897fd06853c73c2102a971fe"},{"author":{"_account_id":16721,"name":"Zohar Mamedov","email":"zohar.cloud@gmail.com","username":"zohar"},"change_message_id":"be0bf15eab5b56fdb52a26e53ede1024557fb772","unresolved":true,"context_lines":[{"line_number":142,"context_line":"        force_flag \u003d snapshot.get(\u0027force\u0027)"},{"line_number":143,"context_line":"        force \u003d False"},{"line_number":144,"context_line":"        if force_flag is not None:"},{"line_number":145,"context_line":"            force \u003d strutils.bool_from_string(force_flag, strict\u003dTrue)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"            if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":148,"context_line":"                if force is False:"}],"source_content_type":"text/x-python","patch_set":11,"id":"4156d935_75e2d231","line":145,"range":{"start_line":145,"start_character":58,"end_line":145,"end_character":69},"in_reply_to":"6c2cf74b_0e3fa0c7","updated":"2021-08-31 08:59:16.000000000","message":"Why not be strict and raise on an ambiguous force flag value?\n\nIf user chooses to use force flag, they should put in a valid value. And I think it should be assumed that all previously hardcoded usages of force flag (for which this backward compatibility is for) use a valid value there.","commit_id":"a046f29a7e4852d2897fd06853c73c2102a971fe"},{"author":{"_account_id":30555,"name":"Fernando Ferraz","display_name":"Fernando Ferraz","email":"fesilva@redhat.com","username":"fernandoperches"},"change_message_id":"2b14e1786ebc11d5cbde19740e30ee1f595a016d","unresolved":true,"context_lines":[{"line_number":147,"context_line":"            if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":148,"context_line":"                if force is False:"},{"line_number":149,"context_line":"                    raise exc.HTTPBadRequest("},{"line_number":150,"context_line":"                        explanation\u003d\u0027Invalid value %s for force flag.\u0027 % force)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        LOG.info(\"Create snapshot from volume %s\", volume_id)"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3bd92392_8e039e9a","line":150,"updated":"2021-08-25 04:50:02.000000000","message":"A force flag that can\u0027t be set to False seems a bit weird \u003dx\nWouldn\u0027t be simpler just ignore the force flag in case of vers 3.65 (SNAPSHOT_IN_USE)? Is the idea to keep the API consistent and avoid users from getting a force behavior even with force flag set to false?","commit_id":"a046f29a7e4852d2897fd06853c73c2102a971fe"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"a18c3405a613b5333da0df4f4e975f3dcf682968","unresolved":true,"context_lines":[{"line_number":147,"context_line":"            if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":148,"context_line":"                if force is False:"},{"line_number":149,"context_line":"                    raise exc.HTTPBadRequest("},{"line_number":150,"context_line":"                        explanation\u003d\u0027Invalid value %s for force flag.\u0027 % force)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        LOG.info(\"Create snapshot from volume %s\", volume_id)"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"63932eab_a0150df4","line":150,"in_reply_to":"3bd92392_8e039e9a","updated":"2021-08-25 12:36:59.000000000","message":"@Fernando: Yes, that\u0027s exactly it.  The behavior with 3.65 is that if you request a snapshot, it gets made.  We\u0027re accepting force\u003dTrue for backward compatibility with scripts that already have \u0027force\u003dTrue\u0027 hard-coded.  But force\u003dFalse seems to mean \"don\u0027t make the snapshot if you have to force it\", so rather than ignore the flag, we reject the request and let the user think it over.","commit_id":"a046f29a7e4852d2897fd06853c73c2102a971fe"},{"author":{"_account_id":16721,"name":"Zohar Mamedov","email":"zohar.cloud@gmail.com","username":"zohar"},"change_message_id":"be0bf15eab5b56fdb52a26e53ede1024557fb772","unresolved":true,"context_lines":[{"line_number":147,"context_line":"            if req_version.matches(mv.SNAPSHOT_IN_USE):"},{"line_number":148,"context_line":"                if force is False:"},{"line_number":149,"context_line":"                    raise exc.HTTPBadRequest("},{"line_number":150,"context_line":"                        explanation\u003d\u0027Invalid value %s for force flag.\u0027 % force)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        LOG.info(\"Create snapshot from volume %s\", volume_id)"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"6c728d7d_636bd8ba","line":150,"in_reply_to":"63932eab_a0150df4","updated":"2021-08-31 08:59:16.000000000","message":"The logic and discussion make sense. I just want to suggest improving the user-facing message on the same line:\n\nexplanation\u003d\u0027Invalid value %s for force flag.\u0027 % force)\n\nThis seems to suggest an invalid value for the force flag.\n\nIf im understanding this correctly, at this point the intended force param is already understood from the force_flag, and rather, the issue is that we are telling the user that we failed the operation because he set force to false. So, I think the message should read something like:\n\nSnapshot is in-use, and \"force\" is explicitly set to False - aborting..","commit_id":"a046f29a7e4852d2897fd06853c73c2102a971fe"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"0ea67145861da3c1e5baee1f94184ff5c12342f7","unresolved":true,"context_lines":[{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"SNAPSHOT_IN_USE_FLAG_MSG \u003d ("},{"line_number":38,"context_line":"    f\"Since microversion {mv.SNAPSHOT_IN_USE} the \u0027force\u0027 flag is \""},{"line_number":39,"context_line":"    \"invalid for this request.  For backward compatability, however, when \""},{"line_number":40,"context_line":"    \"the \u0027force\u0027 flag is passed with a value evaluating to True, it  is \""},{"line_number":41,"context_line":"    \"silently ignored.\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"ca16c597_e1c5e7b1","line":38,"range":{"start_line":38,"start_character":4,"end_line":38,"end_character":6},"updated":"2021-09-01 14:16:37.000000000","message":"Don\u0027t think there is supposed to be an \u0027f\u0027 here.","commit_id":"9ed7c16ef0c8b190cb727604467819cdf23531b0"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"60d7472edd342aa980224cac71271ad8e471d4cf","unresolved":true,"context_lines":[{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"SNAPSHOT_IN_USE_FLAG_MSG \u003d ("},{"line_number":38,"context_line":"    f\"Since microversion {mv.SNAPSHOT_IN_USE} the \u0027force\u0027 flag is \""},{"line_number":39,"context_line":"    \"invalid for this request.  For backward compatability, however, when \""},{"line_number":40,"context_line":"    \"the \u0027force\u0027 flag is passed with a value evaluating to True, it  is \""},{"line_number":41,"context_line":"    \"silently ignored.\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"f6286461_8869902f","line":38,"range":{"start_line":38,"start_character":4,"end_line":38,"end_character":6},"in_reply_to":"57ff6112_71151ce1","updated":"2021-09-01 14:53:02.000000000","message":"apologies.  Now I know.  :-)","commit_id":"9ed7c16ef0c8b190cb727604467819cdf23531b0"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"eb6c2ff1a71c0399d330f18fd8e18d2aedd361af","unresolved":true,"context_lines":[{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"SNAPSHOT_IN_USE_FLAG_MSG \u003d ("},{"line_number":38,"context_line":"    f\"Since microversion {mv.SNAPSHOT_IN_USE} the \u0027force\u0027 flag is \""},{"line_number":39,"context_line":"    \"invalid for this request.  For backward compatability, however, when \""},{"line_number":40,"context_line":"    \"the \u0027force\u0027 flag is passed with a value evaluating to True, it  is \""},{"line_number":41,"context_line":"    \"silently ignored.\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"57ff6112_71151ce1","line":38,"range":{"start_line":38,"start_character":4,"end_line":38,"end_character":6},"in_reply_to":"ca16c597_e1c5e7b1","updated":"2021-09-01 14:43:24.000000000","message":"It\u0027s an f-string, there is.","commit_id":"9ed7c16ef0c8b190cb727604467819cdf23531b0"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"0ea67145861da3c1e5baee1f94184ff5c12342f7","unresolved":true,"context_lines":[{"line_number":37,"context_line":"SNAPSHOT_IN_USE_FLAG_MSG \u003d ("},{"line_number":38,"context_line":"    f\"Since microversion {mv.SNAPSHOT_IN_USE} the \u0027force\u0027 flag is \""},{"line_number":39,"context_line":"    \"invalid for this request.  For backward compatability, however, when \""},{"line_number":40,"context_line":"    \"the \u0027force\u0027 flag is passed with a value evaluating to True, it  is \""},{"line_number":41,"context_line":"    \"silently ignored.\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"6fddd022_14fe922a","line":40,"range":{"start_line":40,"start_character":67,"end_line":40,"end_character":69},"updated":"2021-09-01 14:16:37.000000000","message":"extra space here.","commit_id":"9ed7c16ef0c8b190cb727604467819cdf23531b0"}],"cinder/tests/unit/api/v3/test_snapshots.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"ae9dd6e5476f49522e73dff1e49cbd5a61b450bb","unresolved":true,"context_lines":[{"line_number":405,"context_line":"        snapshot_description \u003d \u0027Snapshot Test Desc\u0027"},{"line_number":406,"context_line":"        snapshot \u003d {"},{"line_number":407,"context_line":"            \"volume_id\": fake.VOLUME_ID,"},{"line_number":408,"context_line":"            \"force\": \u0027false\u0027,"},{"line_number":409,"context_line":"            \"name\": snapshot_name,"},{"line_number":410,"context_line":"            \"description\": snapshot_description"},{"line_number":411,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":9,"id":"b5224893_74f9096d","line":408,"range":{"start_line":408,"start_character":22,"end_line":408,"end_character":27},"updated":"2021-08-11 09:47:17.000000000","message":"this could have other values such as \u0027f\u0027, \u0027no\u0027, \u0027n\u0027, \u00270\u0027, or \u0027off\u0027","commit_id":"c9ca77483c1da05c9e75c1c9a9ed1b5a41aaff18"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"88ea5a3affc3577e50535085a690010af66f65d6","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        snapshot_description \u003d \u0027Snapshot Test Desc\u0027"},{"line_number":406,"context_line":"        snapshot \u003d {"},{"line_number":407,"context_line":"            \"volume_id\": fake.VOLUME_ID,"},{"line_number":408,"context_line":"            \"force\": \u0027false\u0027,"},{"line_number":409,"context_line":"            \"name\": snapshot_name,"},{"line_number":410,"context_line":"            \"description\": snapshot_description"},{"line_number":411,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":9,"id":"06f5cb25_d5efb505","line":408,"range":{"start_line":408,"start_character":22,"end_line":408,"end_character":27},"in_reply_to":"b5224893_74f9096d","updated":"2021-08-11 19:25:44.000000000","message":"Done","commit_id":"c9ca77483c1da05c9e75c1c9a9ed1b5a41aaff18"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"e86ea0aeab83d4a43b77af61c4bb523554506361","unresolved":true,"context_lines":[{"line_number":418,"context_line":"        self.assertRaises(exc.HTTPBadRequest,"},{"line_number":419,"context_line":"                          self.controller.create,"},{"line_number":420,"context_line":"                          req,"},{"line_number":421,"context_line":"                          body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":11,"id":"2d2a1bb6_d6892c4a","line":421,"updated":"2021-08-25 13:10:26.000000000","message":"maybe make the request again here with mv.get_prior_version(mv.SNAPSHOT_IN_USE) to make sure it doesn\u0027t raise?  (Maybe we already have a test for that, but i didn\u0027t see it on a quick look.)","commit_id":"a046f29a7e4852d2897fd06853c73c2102a971fe"}],"cinder/tests/unit/volume/test_snapshot.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"ae9dd6e5476f49522e73dff1e49cbd5a61b450bb","unresolved":true,"context_lines":[{"line_number":406,"context_line":"        snapshot_ref.destroy()"},{"line_number":407,"context_line":"        db.volume_destroy(self.context, volume[\u0027id\u0027])"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        # create volume and attach to the host"},{"line_number":410,"context_line":"        volume \u003d tests_utils.create_volume(self.context, **self.volume_params)"},{"line_number":411,"context_line":"        self.volume.create_volume(self.context, volume)"},{"line_number":412,"context_line":"        values \u003d {\u0027volume_id\u0027: volume[\u0027id\u0027],"},{"line_number":413,"context_line":"                  \u0027attached_host\u0027: \u0027fake_host\u0027,"},{"line_number":414,"context_line":"                  \u0027attach_status\u0027: fields.VolumeAttachStatus.ATTACHING, }"},{"line_number":415,"context_line":"        attachment \u003d db.volume_attach(self.context, values)"},{"line_number":416,"context_line":"        db.volume_attached(self.context, attachment[\u0027id\u0027], None,"},{"line_number":417,"context_line":"                           \u0027fake_host\u0027, \u0027/dev/sda1\u0027)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"        volume_api \u003d cinder.volume.api.API()"},{"line_number":420,"context_line":"        volume \u003d volume_api.get(self.context, volume[\u0027id\u0027])"},{"line_number":421,"context_line":"        self.assertRaises(exception.InvalidVolume,"},{"line_number":422,"context_line":"                          volume_api.create_snapshot,"},{"line_number":423,"context_line":"                          self.context, volume,"},{"line_number":424,"context_line":"                          \u0027fake_name\u0027, \u0027fake_description\u0027)"},{"line_number":425,"context_line":"        snapshot_ref \u003d volume_api.create_snapshot(self.context,"},{"line_number":426,"context_line":"                                                  volume,"},{"line_number":427,"context_line":"                                                  \u0027fake_name\u0027,"},{"line_number":428,"context_line":"                                                  \u0027fake_description\u0027,"},{"line_number":429,"context_line":"                                                  allow_in_use\u003dTrue)"},{"line_number":430,"context_line":"        snapshot_ref.destroy()"},{"line_number":431,"context_line":"        db.volume_destroy(self.context, volume[\u0027id\u0027])"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    @mock.patch(\u0027cinder.image.image_utils.qemu_img_info\u0027)"},{"line_number":434,"context_line":"    def test_create_snapshot_from_bootable_volume(self, mock_qemu_info):"}],"source_content_type":"text/x-python","patch_set":9,"id":"a73dba58_94b780b2","line":431,"range":{"start_line":409,"start_character":0,"end_line":431,"end_character":53},"updated":"2021-08-11 09:47:17.000000000","message":"-1: This is a different test, should be in a different method.","commit_id":"c9ca77483c1da05c9e75c1c9a9ed1b5a41aaff18"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"88ea5a3affc3577e50535085a690010af66f65d6","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        snapshot_ref.destroy()"},{"line_number":407,"context_line":"        db.volume_destroy(self.context, volume[\u0027id\u0027])"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        # create volume and attach to the host"},{"line_number":410,"context_line":"        volume \u003d tests_utils.create_volume(self.context, **self.volume_params)"},{"line_number":411,"context_line":"        self.volume.create_volume(self.context, volume)"},{"line_number":412,"context_line":"        values \u003d {\u0027volume_id\u0027: volume[\u0027id\u0027],"},{"line_number":413,"context_line":"                  \u0027attached_host\u0027: \u0027fake_host\u0027,"},{"line_number":414,"context_line":"                  \u0027attach_status\u0027: fields.VolumeAttachStatus.ATTACHING, }"},{"line_number":415,"context_line":"        attachment \u003d db.volume_attach(self.context, values)"},{"line_number":416,"context_line":"        db.volume_attached(self.context, attachment[\u0027id\u0027], None,"},{"line_number":417,"context_line":"                           \u0027fake_host\u0027, \u0027/dev/sda1\u0027)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"        volume_api \u003d cinder.volume.api.API()"},{"line_number":420,"context_line":"        volume \u003d volume_api.get(self.context, volume[\u0027id\u0027])"},{"line_number":421,"context_line":"        self.assertRaises(exception.InvalidVolume,"},{"line_number":422,"context_line":"                          volume_api.create_snapshot,"},{"line_number":423,"context_line":"                          self.context, volume,"},{"line_number":424,"context_line":"                          \u0027fake_name\u0027, \u0027fake_description\u0027)"},{"line_number":425,"context_line":"        snapshot_ref \u003d volume_api.create_snapshot(self.context,"},{"line_number":426,"context_line":"                                                  volume,"},{"line_number":427,"context_line":"                                                  \u0027fake_name\u0027,"},{"line_number":428,"context_line":"                                                  \u0027fake_description\u0027,"},{"line_number":429,"context_line":"                                                  allow_in_use\u003dTrue)"},{"line_number":430,"context_line":"        snapshot_ref.destroy()"},{"line_number":431,"context_line":"        db.volume_destroy(self.context, volume[\u0027id\u0027])"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    @mock.patch(\u0027cinder.image.image_utils.qemu_img_info\u0027)"},{"line_number":434,"context_line":"    def test_create_snapshot_from_bootable_volume(self, mock_qemu_info):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5851cd96_a1d3c662","line":431,"range":{"start_line":409,"start_character":0,"end_line":431,"end_character":53},"in_reply_to":"a73dba58_94b780b2","updated":"2021-08-11 19:25:44.000000000","message":"Done\n\nAlso see\n    https://review.opendev.org/c/openstack/cinder/+/804293","commit_id":"c9ca77483c1da05c9e75c1c9a9ed1b5a41aaff18"}],"cinder/volume/api.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"5fb6fd54e9ae208632dc091f53ea87c266e69f0f","unresolved":true,"context_lines":[{"line_number":849,"context_line":"                         force\u003dFalse, metadata\u003dNone,"},{"line_number":850,"context_line":"                         cgsnapshot_id\u003dNone,"},{"line_number":851,"context_line":"                         group_snapshot_id\u003dNone,"},{"line_number":852,"context_line":"                         allow_in_use\u003dFalse):"},{"line_number":853,"context_line":"        volume.assert_not_frozen()"},{"line_number":854,"context_line":"        snapshot \u003d self.create_snapshot_in_db("},{"line_number":855,"context_line":"            context, volume, name,"}],"source_content_type":"text/x-python","patch_set":6,"id":"aeab68ba_170ea343","line":852,"range":{"start_line":852,"start_character":0,"end_line":852,"end_character":45},"updated":"2021-06-10 16:28:05.000000000","message":"I\u0027m not sure which one of the options is better:\n\n- Adding a new parameter like this patch is doing\n- Use the `force` parameter for this case as well\n- Renaming the force parameter to `allow_in_use`\n\nI kind of like the last one best, though it will probably make for a bigger patch, which goes in line with what you\u0027ve been saying for the past 5 years about \"force\" being ambiguous.\n\nReusing of the force parameter is also appealing because it creates less code changes, doesn\u0027t duplicate parameters that do the same thing, and it\u0027s an easy concept \"force is always set to true\".\n\nI don\u0027t love the idea of having both \"force\" and \"allow_in_use\" parameters, but wouldn\u0027t necessarily downvote for it.","commit_id":"257a99e1d77397bac1843d4c9474027a48720f73"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"2ad6e61c5fbb5a8963d19e8814d4c9bb29a30600","unresolved":true,"context_lines":[{"line_number":849,"context_line":"                         force\u003dFalse, metadata\u003dNone,"},{"line_number":850,"context_line":"                         cgsnapshot_id\u003dNone,"},{"line_number":851,"context_line":"                         group_snapshot_id\u003dNone,"},{"line_number":852,"context_line":"                         allow_in_use\u003dFalse):"},{"line_number":853,"context_line":"        volume.assert_not_frozen()"},{"line_number":854,"context_line":"        snapshot \u003d self.create_snapshot_in_db("},{"line_number":855,"context_line":"            context, volume, name,"}],"source_content_type":"text/x-python","patch_set":6,"id":"e5fdd673_d228f05c","line":852,"range":{"start_line":852,"start_character":0,"end_line":852,"end_character":45},"in_reply_to":"aeab68ba_170ea343","updated":"2021-06-10 18:12:59.000000000","message":"Some of this needs to be discussed in\n    https://review.opendev.org/c/openstack/cinder-specs/+/781914/\n\nI leaned toward separating \"force\" and \"allow_in_use\" because force is provided by the API caller, allow_in_use is just added by the API code itself and isn\u0027t sent by the caller.","commit_id":"257a99e1d77397bac1843d4c9474027a48720f73"},{"author":{"_account_id":32171,"name":"Girish Chilukuri","email":"girish.chilukuri@ibm.com","username":"GirishChilukuri"},"change_message_id":"b196c422a22ea2b23e91a9f91c9eb593374de3c7","unresolved":true,"context_lines":[{"line_number":879,"context_line":""},{"line_number":880,"context_line":"        utils.check_metadata_properties(metadata)"},{"line_number":881,"context_line":""},{"line_number":882,"context_line":"        valid_status \u003d (\u0027available\u0027,)"},{"line_number":883,"context_line":"        if force or allow_in_use:"},{"line_number":884,"context_line":"            valid_status \u003d (\u0027available\u0027, \u0027in-use\u0027)"},{"line_number":885,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"291725f5_b8ddd524","line":882,"range":{"start_line":882,"start_character":35,"end_line":882,"end_character":36},"updated":"2021-08-16 15:08:11.000000000","message":"comma can be removed.","commit_id":"f48e620c9d8133d15eec0dfe5f97f4d2f9390b62"},{"author":{"_account_id":32171,"name":"Girish Chilukuri","email":"girish.chilukuri@ibm.com","username":"GirishChilukuri"},"change_message_id":"69aeaf2434db2d56776cc24aeaa3cab8d39d9511","unresolved":false,"context_lines":[{"line_number":879,"context_line":""},{"line_number":880,"context_line":"        utils.check_metadata_properties(metadata)"},{"line_number":881,"context_line":""},{"line_number":882,"context_line":"        valid_status \u003d (\u0027available\u0027,)"},{"line_number":883,"context_line":"        if force or allow_in_use:"},{"line_number":884,"context_line":"            valid_status \u003d (\u0027available\u0027, \u0027in-use\u0027)"},{"line_number":885,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"e483ce97_ce2b016a","line":882,"range":{"start_line":882,"start_character":35,"end_line":882,"end_character":36},"in_reply_to":"291725f5_b8ddd524","updated":"2021-08-23 13:58:01.000000000","message":"Done","commit_id":"f48e620c9d8133d15eec0dfe5f97f4d2f9390b62"}],"releasenotes/notes/snapshot-in-use-without-force-86c6d74ebc9c0d60.yaml":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"a18c3405a613b5333da0df4f4e975f3dcf682968","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    As of API version 3.65, volume snapshots of in-use volumes can be created"},{"line_number":5,"context_line":"    without passing the \"force\" flag.  Passing \"False\" boolean values for the"},{"line_number":6,"context_line":"    \"force\" field is no longer allowed."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"942c2435_ac42f597","line":6,"range":{"start_line":5,"start_character":36,"end_line":6,"end_character":39},"updated":"2021-08-25 12:36:59.000000000","message":"Maybe replace with something like:\n\n, and the \u0027force\u0027 flag is considered invalid for this request.  For backward compatability, however, when the \u0027force\u0027 flag is passed with a value evaluating to True, it is silently ignored.","commit_id":"a046f29a7e4852d2897fd06853c73c2102a971fe"}]}
