)]}'
{"doc/source/admin/node-deployment.rst":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"a162f455203d5f376e4ba72b56eca529d9e178ec","unresolved":true,"context_lines":[{"line_number":113,"context_line":"                \"step\": \"upgrade_firmware\","},{"line_number":114,"context_line":"                \"args\": {"},{"line_number":115,"context_line":"                    \"force\": \"True\""},{"line_number":116,"context_line":"                }"},{"line_number":117,"context_line":"            }"},{"line_number":118,"context_line":"        ]"},{"line_number":119,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":2,"id":"200a9d10_dafda3aa","line":116,"updated":"2021-01-05 15:17:13.000000000","message":"missing priority","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"cc61618d9ca7ef5d8092af2059c83482c38505ed","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                \"step\": \"upgrade_firmware\","},{"line_number":114,"context_line":"                \"args\": {"},{"line_number":115,"context_line":"                    \"force\": \"True\""},{"line_number":116,"context_line":"                }"},{"line_number":117,"context_line":"            }"},{"line_number":118,"context_line":"        ]"},{"line_number":119,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":2,"id":"e5c768e4_a7ce4b06","line":116,"in_reply_to":"200a9d10_dafda3aa","updated":"2021-01-08 09:05:12.000000000","message":"Done","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a944749e31c581279d67c417112681b0c3aaeba1","unresolved":false,"context_lines":[{"line_number":89,"context_line":":ironic-python-agent-doc:`IPA hardware managers documentation"},{"line_number":90,"context_line":"\u003cadmin/hardware_managers.html\u003e` for a listing."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"User steps"},{"line_number":93,"context_line":"----------"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"Starting with Bare Metal API version 1.69 user can optionally supply deploy"}],"source_content_type":"text/x-rst","patch_set":4,"id":"8ab4019a_22d31a72","line":92,"updated":"2021-01-11 18:04:57.000000000","message":"Maybe something like \"Requesting steps\"? \"User steps\" may be confused with documentation on how to write steps.","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"2174638f56e703c0081320bec8bf37a5bac7be6d","unresolved":false,"context_lines":[{"line_number":89,"context_line":":ironic-python-agent-doc:`IPA hardware managers documentation"},{"line_number":90,"context_line":"\u003cadmin/hardware_managers.html\u003e` for a listing."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"User steps"},{"line_number":93,"context_line":"----------"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"Starting with Bare Metal API version 1.69 user can optionally supply deploy"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3bfcda1a_8f1ecec3","line":92,"in_reply_to":"8ab4019a_22d31a72","updated":"2021-01-15 16:12:37.000000000","message":"done","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a944749e31c581279d67c417112681b0c3aaeba1","unresolved":false,"context_lines":[{"line_number":97,"context_line":"steps will take precedence over `Agent steps`_ and `Deploy Templates`_"},{"line_number":98,"context_line":"steps."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"An example of passing a deploy step via API when deploying::"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    PUT /v1/nodes/{node_ident}/states/provision"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"f503c143_a3ee39eb","line":100,"updated":"2021-01-11 18:04:57.000000000","message":"Please move most of this section to api-ref. Let\u0027s only leave the introduction and the CLI example.","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"2174638f56e703c0081320bec8bf37a5bac7be6d","unresolved":false,"context_lines":[{"line_number":97,"context_line":"steps will take precedence over `Agent steps`_ and `Deploy Templates`_"},{"line_number":98,"context_line":"steps."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"An example of passing a deploy step via API when deploying::"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    PUT /v1/nodes/{node_ident}/states/provision"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"063b69bb_29e2b104","line":100,"in_reply_to":"f503c143_a3ee39eb","updated":"2021-01-15 16:12:37.000000000","message":"done","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b76d514c36b44e53367e72db6cca46ebcc2f29e","unresolved":false,"context_lines":[{"line_number":92,"context_line":"Requesting steps"},{"line_number":93,"context_line":"----------------"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"Starting with Bare Metal API version 1.69 user can optionally supply deploy"},{"line_number":96,"context_line":"steps for node deployment when invoking deployment or rebuilding. Overlapping"},{"line_number":97,"context_line":"steps will take precedence over `Agent steps`_ and `Deploy Templates`_"},{"line_number":98,"context_line":"steps."}],"source_content_type":"text/x-rst","patch_set":6,"id":"869f767c_bd1ca59f","line":95,"updated":"2021-02-02 13:57:26.000000000","message":"nit: mention the ironicclient version (later once it is known)","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"79be7e25d75e2a0ac5ead04f156910d5c1d4698d","unresolved":false,"context_lines":[{"line_number":92,"context_line":"Requesting steps"},{"line_number":93,"context_line":"----------------"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"Starting with Bare Metal API version 1.69 user can optionally supply deploy"},{"line_number":96,"context_line":"steps for node deployment when invoking deployment or rebuilding. Overlapping"},{"line_number":97,"context_line":"steps will take precedence over `Agent steps`_ and `Deploy Templates`_"},{"line_number":98,"context_line":"steps."}],"source_content_type":"text/x-rst","patch_set":6,"id":"2ae2855a_81d4955b","line":95,"in_reply_to":"869f767c_bd1ca59f","updated":"2021-02-03 16:35:11.000000000","message":"here or in another patch? ironicclient depends on this patch, so its release version number should be planned ahead if doing in this patch.","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"}],"doc/source/contributor/webapi-version-history.rst":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a944749e31c581279d67c417112681b0c3aaeba1","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Add support for ``deploy-steps`` parameter to provisioning endpoint"},{"line_number":9,"context_line":"``/v1/nodes/{node_ident}/states/provision``. Available and optional when target"},{"line_number":10,"context_line":"is \u0027active\u0027 or \u0027rebuild\u0027. When overlapping, these steps override deploy"},{"line_number":11,"context_line":"template and driver steps."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"1.68 (Victoria, 16.0)"},{"line_number":14,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"52c7737b_e11f2d1a","line":11,"updated":"2021-01-11 18:04:57.000000000","message":"nit: I\u0027d skip the last sentence, the information here need not be detailed","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"2174638f56e703c0081320bec8bf37a5bac7be6d","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Add support for ``deploy-steps`` parameter to provisioning endpoint"},{"line_number":9,"context_line":"``/v1/nodes/{node_ident}/states/provision``. Available and optional when target"},{"line_number":10,"context_line":"is \u0027active\u0027 or \u0027rebuild\u0027. When overlapping, these steps override deploy"},{"line_number":11,"context_line":"template and driver steps."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"1.68 (Victoria, 16.0)"},{"line_number":14,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"b49b7981_45b1c02d","line":11,"in_reply_to":"52c7737b_e11f2d1a","updated":"2021-01-15 16:12:37.000000000","message":"done","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"}],"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"ecf049cd58d364628fb9c53dbc6e282fefa235c5","unresolved":true,"context_lines":[{"line_number":920,"context_line":"            dictionary that is passed to the deploy step method.::"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"              { \u0027interface\u0027: \u003cdriver_interface\u003e,"},{"line_number":923,"context_line":"                \u0027step\u0027: \u003cname_of_clean_step\u003e,"},{"line_number":924,"context_line":"                \u0027args\u0027: {\u003carg1\u003e: \u003cvalue1\u003e, ..., \u003cargn\u003e: \u003cvaluen\u003e}"},{"line_number":925,"context_line":"                \u0027priority\u0027: \u003cinteger\u003e}"},{"line_number":926,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"6ad6ce06_9e85e1f6","line":923,"range":{"start_line":923,"start_character":33,"end_line":923,"end_character":38},"updated":"2021-01-05 11:01:59.000000000","message":"nit: s/ clean / deploy /","commit_id":"2ca5e66e164d926f934c42d31b37dad810d7a2f1"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"3037859bd4341ada4c489c826bcdedfc92c536ff","unresolved":false,"context_lines":[{"line_number":920,"context_line":"            dictionary that is passed to the deploy step method.::"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"              { \u0027interface\u0027: \u003cdriver_interface\u003e,"},{"line_number":923,"context_line":"                \u0027step\u0027: \u003cname_of_clean_step\u003e,"},{"line_number":924,"context_line":"                \u0027args\u0027: {\u003carg1\u003e: \u003cvalue1\u003e, ..., \u003cargn\u003e: \u003cvaluen\u003e}"},{"line_number":925,"context_line":"                \u0027priority\u0027: \u003cinteger\u003e}"},{"line_number":926,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3e0ea449_23fb344f","line":923,"range":{"start_line":923,"start_character":33,"end_line":923,"end_character":38},"in_reply_to":"6ad6ce06_9e85e1f6","updated":"2021-01-05 14:06:33.000000000","message":"Done","commit_id":"2ca5e66e164d926f934c42d31b37dad810d7a2f1"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"a162f455203d5f376e4ba72b56eca529d9e178ec","unresolved":true,"context_lines":[{"line_number":1041,"context_line":"    the required information."},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    :param steps: a list of steps. For more details, see the"},{"line_number":1044,"context_line":"        clean_steps parameter of :func:`NodeStatesController.provision`."},{"line_number":1045,"context_line":"    :param step_type: \u0027clean\u0027 or \u0027deploy\u0027 step type"},{"line_number":1046,"context_line":"    :param schema: JSON schema to use for validation."},{"line_number":1047,"context_line":"    :raises: InvalidParameterValue if validation of steps fails."}],"source_content_type":"text/x-python","patch_set":2,"id":"4cba7308_6aee6e63","line":1044,"range":{"start_line":1044,"start_character":8,"end_line":1044,"end_character":19},"updated":"2021-01-05 15:17:13.000000000","message":"clean_steps and deploy_steps","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"cc61618d9ca7ef5d8092af2059c83482c38505ed","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"    the required information."},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    :param steps: a list of steps. For more details, see the"},{"line_number":1044,"context_line":"        clean_steps parameter of :func:`NodeStatesController.provision`."},{"line_number":1045,"context_line":"    :param step_type: \u0027clean\u0027 or \u0027deploy\u0027 step type"},{"line_number":1046,"context_line":"    :param schema: JSON schema to use for validation."},{"line_number":1047,"context_line":"    :raises: InvalidParameterValue if validation of steps fails."}],"source_content_type":"text/x-python","patch_set":2,"id":"92683303_f33dc32f","line":1044,"range":{"start_line":1044,"start_character":8,"end_line":1044,"end_character":19},"in_reply_to":"4cba7308_6aee6e63","updated":"2021-01-08 09:05:12.000000000","message":"Done","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a944749e31c581279d67c417112681b0c3aaeba1","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    \"title\": \"Deploy steps schema\","},{"line_number":90,"context_line":"    \"type\": \"array\","},{"line_number":91,"context_line":"    # list of deploy steps"},{"line_number":92,"context_line":"    \"items\": {"},{"line_number":93,"context_line":"        \"type\": \"object\","},{"line_number":94,"context_line":"        # args is optional"},{"line_number":95,"context_line":"        \"required\": [\"interface\", \"step\", \"priority\"],"}],"source_content_type":"text/x-python","patch_set":4,"id":"9cebbbd7_721fec9b","line":92,"updated":"2021-01-11 18:04:57.000000000","message":"This was copied from deploy_template.py, right? Let\u0027s move it to a common place where both modules can use it.","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"2174638f56e703c0081320bec8bf37a5bac7be6d","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    \"title\": \"Deploy steps schema\","},{"line_number":90,"context_line":"    \"type\": \"array\","},{"line_number":91,"context_line":"    # list of deploy steps"},{"line_number":92,"context_line":"    \"items\": {"},{"line_number":93,"context_line":"        \"type\": \"object\","},{"line_number":94,"context_line":"        # args is optional"},{"line_number":95,"context_line":"        \"required\": [\"interface\", \"step\", \"priority\"],"}],"source_content_type":"text/x-python","patch_set":4,"id":"9dd58ab8_12c10c6b","line":92,"in_reply_to":"9cebbbd7_721fec9b","updated":"2021-01-15 16:12:37.000000000","message":"not really, got inspired from clean steps schema in line 56, but it should match with deploy_template schema. Any suggestions what would be a good place for controllers to share it?","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a944749e31c581279d67c417112681b0c3aaeba1","unresolved":false,"context_lines":[{"line_number":985,"context_line":"                     \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027clean\u0027])"},{"line_number":986,"context_line":"            raise exception.ClientSideError("},{"line_number":987,"context_line":"                msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":988,"context_line":""},{"line_number":989,"context_line":"        if deploy_steps and target not in (ir_states.ACTIVE,"},{"line_number":990,"context_line":"                                           ir_states.REBUILD):"},{"line_number":991,"context_line":"            msg \u003d (_(\u0027\"deploy_steps\" is only valid when setting target \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"5983a26d_c28d7399","line":988,"updated":"2021-01-11 18:04:57.000000000","message":"Let\u0027s also check the deploy_steps is not used with an older API version.","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"2174638f56e703c0081320bec8bf37a5bac7be6d","unresolved":false,"context_lines":[{"line_number":985,"context_line":"                     \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027clean\u0027])"},{"line_number":986,"context_line":"            raise exception.ClientSideError("},{"line_number":987,"context_line":"                msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":988,"context_line":""},{"line_number":989,"context_line":"        if deploy_steps and target not in (ir_states.ACTIVE,"},{"line_number":990,"context_line":"                                           ir_states.REBUILD):"},{"line_number":991,"context_line":"            msg \u003d (_(\u0027\"deploy_steps\" is only valid when setting target \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"729e39d1_d52e6ed2","line":988,"in_reply_to":"5983a26d_c28d7399","updated":"2021-01-15 16:12:37.000000000","message":"done","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a944749e31c581279d67c417112681b0c3aaeba1","unresolved":false,"context_lines":[{"line_number":1034,"context_line":"    _check_steps(deploy_steps, \u0027deploy\u0027, _DEPLOY_STEPS_SCHEMA)"},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"def _check_steps(steps, step_type, schema):"},{"line_number":1038,"context_line":"    \"\"\"Ensure all necessary keys are present and correct in steps."},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    Check that the user-specified steps are in the expected format and include"}],"source_content_type":"text/x-python","patch_set":4,"id":"f558134a_edd77d65","line":1037,"updated":"2021-01-11 18:04:57.000000000","message":"nit: not sure it\u0027s worth creating a new helper, both functions are trivial..","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"2174638f56e703c0081320bec8bf37a5bac7be6d","unresolved":false,"context_lines":[{"line_number":1034,"context_line":"    _check_steps(deploy_steps, \u0027deploy\u0027, _DEPLOY_STEPS_SCHEMA)"},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"def _check_steps(steps, step_type, schema):"},{"line_number":1038,"context_line":"    \"\"\"Ensure all necessary keys are present and correct in steps."},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    Check that the user-specified steps are in the expected format and include"}],"source_content_type":"text/x-python","patch_set":4,"id":"e2a89d2e_da188438","line":1037,"in_reply_to":"f558134a_edd77d65","updated":"2021-01-15 16:12:37.000000000","message":"yeah, it\u0027s borderline excessive, but I\u0027d like to keep it as it is to indicate that they really are doing the same thing in the end.","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b76d514c36b44e53367e72db6cca46ebcc2f29e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    }"},{"line_number":85,"context_line":"}"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"_DEPLOY_STEPS_SCHEMA \u003d {"},{"line_number":88,"context_line":"    \"$schema\": \"http://json-schema.org/schema#\","},{"line_number":89,"context_line":"    \"title\": \"Deploy steps schema\","},{"line_number":90,"context_line":"    \"type\": \"array\","}],"source_content_type":"text/x-python","patch_set":6,"id":"b741e629_ee19bcd2","line":87,"updated":"2021-02-02 13:57:26.000000000","message":"nit: move to common.py and reuse in deploy_templates","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"79be7e25d75e2a0ac5ead04f156910d5c1d4698d","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    }"},{"line_number":85,"context_line":"}"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"_DEPLOY_STEPS_SCHEMA \u003d {"},{"line_number":88,"context_line":"    \"$schema\": \"http://json-schema.org/schema#\","},{"line_number":89,"context_line":"    \"title\": \"Deploy steps schema\","},{"line_number":90,"context_line":"    \"type\": \"array\","}],"source_content_type":"text/x-python","patch_set":6,"id":"d6a00042_2cb8a54a","line":87,"in_reply_to":"b741e629_ee19bcd2","updated":"2021-02-03 16:35:11.000000000","message":"still couldn\u0027t find any common.py, moved to v1/utils.py where there were other schemas","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"}],"ironic/api/controllers/v1/utils.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1b4bce07b442efd3a88cf9e6cc68683d0fb87319","unresolved":true,"context_lines":[{"line_number":1697,"context_line":"        return"},{"line_number":1698,"context_line":""},{"line_number":1699,"context_line":"    if not allow_deploy_steps():"},{"line_number":1700,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":1701,"context_line":"            _(\u0027Field \"deploy_steps\" not recognised in this version\u0027))"},{"line_number":1702,"context_line":""},{"line_number":1703,"context_line":"    if target not in (states.ACTIVE, states.REBUILD):"}],"source_content_type":"text/x-python","patch_set":6,"id":"648dee72_52a78d1b","line":1700,"updated":"2021-01-26 10:09:34.000000000","message":"nit: I think in similar cases we raise NotAcceptable","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"79be7e25d75e2a0ac5ead04f156910d5c1d4698d","unresolved":false,"context_lines":[{"line_number":1697,"context_line":"        return"},{"line_number":1698,"context_line":""},{"line_number":1699,"context_line":"    if not allow_deploy_steps():"},{"line_number":1700,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":1701,"context_line":"            _(\u0027Field \"deploy_steps\" not recognised in this version\u0027))"},{"line_number":1702,"context_line":""},{"line_number":1703,"context_line":"    if target not in (states.ACTIVE, states.REBUILD):"}],"source_content_type":"text/x-python","patch_set":6,"id":"81c7e504_738532d4","line":1700,"in_reply_to":"648dee72_52a78d1b","updated":"2021-02-03 16:35:11.000000000","message":"Done","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b76d514c36b44e53367e72db6cca46ebcc2f29e","unresolved":false,"context_lines":[{"line_number":1698,"context_line":""},{"line_number":1699,"context_line":"    if not allow_deploy_steps():"},{"line_number":1700,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":1701,"context_line":"            _(\u0027Field \"deploy_steps\" not recognised in this version\u0027))"},{"line_number":1702,"context_line":""},{"line_number":1703,"context_line":"    if target not in (states.ACTIVE, states.REBUILD):"},{"line_number":1704,"context_line":"        msg \u003d (_(\u0027\"deploy_steps\" is only valid when setting target \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"2af28120_41edb91c","line":1701,"updated":"2021-02-02 13:57:26.000000000","message":"+1 to both. Unfortunately, it has to be fixed here since it\u0027s API-visible","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1b4bce07b442efd3a88cf9e6cc68683d0fb87319","unresolved":true,"context_lines":[{"line_number":1698,"context_line":""},{"line_number":1699,"context_line":"    if not allow_deploy_steps():"},{"line_number":1700,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":1701,"context_line":"            _(\u0027Field \"deploy_steps\" not recognised in this version\u0027))"},{"line_number":1702,"context_line":""},{"line_number":1703,"context_line":"    if target not in (states.ACTIVE, states.REBUILD):"},{"line_number":1704,"context_line":"        msg \u003d (_(\u0027\"deploy_steps\" is only valid when setting target \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"55cf91a2_1cf02648","line":1701,"updated":"2021-01-26 10:09:34.000000000","message":"In similar cases we have more info in the message, e.g.\n\n\"Request not acceptable. The minimal required API version \"\n            \"should be %(base)s.%(opr)s\") %\n            {\u0027base\u0027: versions.BASE_VERSION,\n             \u0027opr\u0027: versions.MINOR_46_NODE_CONDUCTOR_GROUP})","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"79be7e25d75e2a0ac5ead04f156910d5c1d4698d","unresolved":false,"context_lines":[{"line_number":1698,"context_line":""},{"line_number":1699,"context_line":"    if not allow_deploy_steps():"},{"line_number":1700,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":1701,"context_line":"            _(\u0027Field \"deploy_steps\" not recognised in this version\u0027))"},{"line_number":1702,"context_line":""},{"line_number":1703,"context_line":"    if target not in (states.ACTIVE, states.REBUILD):"},{"line_number":1704,"context_line":"        msg \u003d (_(\u0027\"deploy_steps\" is only valid when setting target \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"8581c108_cd3a1272","line":1701,"in_reply_to":"2af28120_41edb91c","updated":"2021-02-03 16:35:11.000000000","message":"Done","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"79be7e25d75e2a0ac5ead04f156910d5c1d4698d","unresolved":false,"context_lines":[{"line_number":1698,"context_line":""},{"line_number":1699,"context_line":"    if not allow_deploy_steps():"},{"line_number":1700,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":1701,"context_line":"            _(\u0027Field \"deploy_steps\" not recognised in this version\u0027))"},{"line_number":1702,"context_line":""},{"line_number":1703,"context_line":"    if target not in (states.ACTIVE, states.REBUILD):"},{"line_number":1704,"context_line":"        msg \u003d (_(\u0027\"deploy_steps\" is only valid when setting target \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"059573d1_28776367","line":1701,"in_reply_to":"55cf91a2_1cf02648","updated":"2021-02-03 16:35:11.000000000","message":"Done","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"f6d66a1a825159251c7b17b713d9646b2f1d8c28","unresolved":true,"context_lines":[{"line_number":1700,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":1701,"context_line":"            _(\u0027Field \"deploy_steps\" not recognised in this version\u0027))"},{"line_number":1702,"context_line":""},{"line_number":1703,"context_line":"    if target not in (states.ACTIVE, states.REBUILD):"},{"line_number":1704,"context_line":"        msg \u003d (_(\u0027\"deploy_steps\" is only valid when setting target \u0027"},{"line_number":1705,"context_line":"                 \u0027provision state to %s or %s\u0027)"},{"line_number":1706,"context_line":"               % (states.ACTIVE, states.REBUILD))"}],"source_content_type":"text/x-python","patch_set":6,"id":"046be405_03d43e55","line":1703,"range":{"start_line":1703,"start_character":22,"end_line":1703,"end_character":52},"updated":"2021-01-26 09:01:52.000000000","message":"nit: this can be probably be a variable and re-used in the msg below","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"79be7e25d75e2a0ac5ead04f156910d5c1d4698d","unresolved":false,"context_lines":[{"line_number":1700,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":1701,"context_line":"            _(\u0027Field \"deploy_steps\" not recognised in this version\u0027))"},{"line_number":1702,"context_line":""},{"line_number":1703,"context_line":"    if target not in (states.ACTIVE, states.REBUILD):"},{"line_number":1704,"context_line":"        msg \u003d (_(\u0027\"deploy_steps\" is only valid when setting target \u0027"},{"line_number":1705,"context_line":"                 \u0027provision state to %s or %s\u0027)"},{"line_number":1706,"context_line":"               % (states.ACTIVE, states.REBUILD))"}],"source_content_type":"text/x-python","patch_set":6,"id":"d9432ad8_a9e5b7d4","line":1703,"range":{"start_line":1703,"start_character":22,"end_line":1703,"end_character":52},"in_reply_to":"046be405_03d43e55","updated":"2021-02-03 16:35:11.000000000","message":"Done","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"}],"ironic/api/controllers/v1/versions.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a944749e31c581279d67c417112681b0c3aaeba1","unresolved":false,"context_lines":[{"line_number":106,"context_line":"# v1.66: Add support for node network_data field."},{"line_number":107,"context_line":"# v1.67: Add support for port_uuid/portgroup_uuid in node vif_attach"},{"line_number":108,"context_line":"# v1.68: Add agent_verify_ca to heartbeat."},{"line_number":109,"context_line":"# v1.69: Add deploy-steps to provisioning"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":112,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"340edbe6_c7a73917","line":109,"updated":"2021-01-11 18:04:57.000000000","message":"nit: deploy_steps","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"2174638f56e703c0081320bec8bf37a5bac7be6d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"# v1.66: Add support for node network_data field."},{"line_number":107,"context_line":"# v1.67: Add support for port_uuid/portgroup_uuid in node vif_attach"},{"line_number":108,"context_line":"# v1.68: Add agent_verify_ca to heartbeat."},{"line_number":109,"context_line":"# v1.69: Add deploy-steps to provisioning"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":112,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"b525536a_88b651d4","line":109,"in_reply_to":"340edbe6_c7a73917","updated":"2021-01-15 16:12:37.000000000","message":"done","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"}],"ironic/conductor/deployments.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"a162f455203d5f376e4ba72b56eca529d9e178ec","unresolved":true,"context_lines":[{"line_number":191,"context_line":"        # steps."},{"line_number":192,"context_line":"        if deploy_steps:"},{"line_number":193,"context_line":"            info \u003d node.driver_internal_info"},{"line_number":194,"context_line":"            info[\u0027user_deploy_steps\u0027] \u003d deploy_steps"},{"line_number":195,"context_line":"            node.driver_internal_info \u003d info"},{"line_number":196,"context_line":"            node.save()"},{"line_number":197,"context_line":"        # This gets the deploy steps (if any) from driver, deploy template and"}],"source_content_type":"text/x-python","patch_set":2,"id":"37bc774c_a7581387","line":194,"range":{"start_line":194,"start_character":18,"end_line":194,"end_character":35},"updated":"2021-01-05 15:17:13.000000000","message":"Do these need to be stored on the node, or could they be passed into set_node_deployment_steps?\n\nIf so, we need to make sure they are cleaned up when the node is deprovisioned, and possibly when rebuilt.","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"cc61618d9ca7ef5d8092af2059c83482c38505ed","unresolved":true,"context_lines":[{"line_number":191,"context_line":"        # steps."},{"line_number":192,"context_line":"        if deploy_steps:"},{"line_number":193,"context_line":"            info \u003d node.driver_internal_info"},{"line_number":194,"context_line":"            info[\u0027user_deploy_steps\u0027] \u003d deploy_steps"},{"line_number":195,"context_line":"            node.driver_internal_info \u003d info"},{"line_number":196,"context_line":"            node.save()"},{"line_number":197,"context_line":"        # This gets the deploy steps (if any) from driver, deploy template and"}],"source_content_type":"text/x-python","patch_set":2,"id":"5395b7ec_332be723","line":194,"range":{"start_line":194,"start_character":18,"end_line":194,"end_character":35},"in_reply_to":"37bc774c_a7581387","updated":"2021-01-08 09:05:12.000000000","message":"They have to be kept somewhere as \"deploy_steps\" get reassigned on continue_node_deploy with _get_all_deployment_steps. If they are stored in \"deploy_steps\" only, they get mixed together with driver and template steps and it gets harder to distinguish their source and precedence. I\u0027m ready to reconsider this, if there are other suggestions.\n\nThe property is removed at wipe_deploy_internal_info [1]. Is this necessary anywhere else?\n\n[1] https://review.opendev.org/c/openstack/ironic/+/768353/3/ironic/conductor/utils.py#506","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"4dfa3621d80893821c1109a82adcaa35141b06d1","unresolved":true,"context_lines":[{"line_number":191,"context_line":"        # steps."},{"line_number":192,"context_line":"        if deploy_steps:"},{"line_number":193,"context_line":"            info \u003d node.driver_internal_info"},{"line_number":194,"context_line":"            info[\u0027user_deploy_steps\u0027] \u003d deploy_steps"},{"line_number":195,"context_line":"            node.driver_internal_info \u003d info"},{"line_number":196,"context_line":"            node.save()"},{"line_number":197,"context_line":"        # This gets the deploy steps (if any) from driver, deploy template and"}],"source_content_type":"text/x-python","patch_set":2,"id":"786d204e_089665b9","line":194,"range":{"start_line":194,"start_character":18,"end_line":194,"end_character":35},"in_reply_to":"5395b7ec_332be723","updated":"2021-01-11 10:56:05.000000000","message":"Ok, I see. I think wipe_deploy_internal_info is sufficient but I will have a look around.","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"a162f455203d5f376e4ba72b56eca529d9e178ec","unresolved":true,"context_lines":[{"line_number":364,"context_line":"    # Agent is now running, we\u0027re ready to validate the remaining steps"},{"line_number":365,"context_line":"    if not node.driver_internal_info.get(\u0027steps_validated\u0027):"},{"line_number":366,"context_line":"        try:"},{"line_number":367,"context_line":"            conductor_steps.validate_deploy_templates(task)"},{"line_number":368,"context_line":"            conductor_steps.set_node_deployment_steps("},{"line_number":369,"context_line":"                task, reset_current\u003dFalse)"},{"line_number":370,"context_line":"        except exception.IronicException as exc:"}],"source_content_type":"text/x-python","patch_set":2,"id":"b034117b_5ec2745e","line":367,"updated":"2021-01-05 15:17:13.000000000","message":"Need to validate again here without skip_missing","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"cc61618d9ca7ef5d8092af2059c83482c38505ed","unresolved":false,"context_lines":[{"line_number":364,"context_line":"    # Agent is now running, we\u0027re ready to validate the remaining steps"},{"line_number":365,"context_line":"    if not node.driver_internal_info.get(\u0027steps_validated\u0027):"},{"line_number":366,"context_line":"        try:"},{"line_number":367,"context_line":"            conductor_steps.validate_deploy_templates(task)"},{"line_number":368,"context_line":"            conductor_steps.set_node_deployment_steps("},{"line_number":369,"context_line":"                task, reset_current\u003dFalse)"},{"line_number":370,"context_line":"        except exception.IronicException as exc:"}],"source_content_type":"text/x-python","patch_set":2,"id":"13355916_f839c689","line":367,"in_reply_to":"b034117b_5ec2745e","updated":"2021-01-08 09:05:12.000000000","message":"Done","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"4dfa3621d80893821c1109a82adcaa35141b06d1","unresolved":true,"context_lines":[{"line_number":364,"context_line":"    if not node.driver_internal_info.get(\u0027steps_validated\u0027):"},{"line_number":365,"context_line":"        try:"},{"line_number":366,"context_line":"            conductor_steps.validate_user_deploy_steps_and_templates("},{"line_number":367,"context_line":"                task, task.node.driver_internal_info.get(\u0027user_deploy_steps\u0027))"},{"line_number":368,"context_line":"            conductor_steps.set_node_deployment_steps("},{"line_number":369,"context_line":"                task, reset_current\u003dFalse)"},{"line_number":370,"context_line":"        except exception.IronicException as exc:"}],"source_content_type":"text/x-python","patch_set":3,"id":"d66fa202_ec15a5af","line":367,"range":{"start_line":367,"start_character":22,"end_line":367,"end_character":77},"updated":"2021-01-11 10:56:05.000000000","message":"Using this could be the default action, unless a set of deploy_steps is passed as on L103. WDYT?","commit_id":"89b2942434182941d855a0f1961d3109a87aea2d"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"2884037e58f78e75c92650edabbdc529d16f637e","unresolved":true,"context_lines":[{"line_number":364,"context_line":"    if not node.driver_internal_info.get(\u0027steps_validated\u0027):"},{"line_number":365,"context_line":"        try:"},{"line_number":366,"context_line":"            conductor_steps.validate_user_deploy_steps_and_templates("},{"line_number":367,"context_line":"                task, task.node.driver_internal_info.get(\u0027user_deploy_steps\u0027))"},{"line_number":368,"context_line":"            conductor_steps.set_node_deployment_steps("},{"line_number":369,"context_line":"                task, reset_current\u003dFalse)"},{"line_number":370,"context_line":"        except exception.IronicException as exc:"}],"source_content_type":"text/x-python","patch_set":3,"id":"c71d7fed_0a380c3e","line":367,"range":{"start_line":367,"start_character":22,"end_line":367,"end_character":77},"in_reply_to":"2fede00b_f6a82bb2","updated":"2021-01-12 09:48:30.000000000","message":"The validate_user_deploy_steps_and_templates function could default to getting the steps via task.node.driver_internal_info.get(\u0027user_deploy_steps\u0027). Only when the steps have not been set is this incorrect.","commit_id":"89b2942434182941d855a0f1961d3109a87aea2d"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"2174638f56e703c0081320bec8bf37a5bac7be6d","unresolved":false,"context_lines":[{"line_number":364,"context_line":"    if not node.driver_internal_info.get(\u0027steps_validated\u0027):"},{"line_number":365,"context_line":"        try:"},{"line_number":366,"context_line":"            conductor_steps.validate_user_deploy_steps_and_templates("},{"line_number":367,"context_line":"                task, task.node.driver_internal_info.get(\u0027user_deploy_steps\u0027))"},{"line_number":368,"context_line":"            conductor_steps.set_node_deployment_steps("},{"line_number":369,"context_line":"                task, reset_current\u003dFalse)"},{"line_number":370,"context_line":"        except exception.IronicException as exc:"}],"source_content_type":"text/x-python","patch_set":3,"id":"b430827d_df114966","line":367,"range":{"start_line":367,"start_character":22,"end_line":367,"end_character":77},"in_reply_to":"c71d7fed_0a380c3e","updated":"2021-01-15 16:12:37.000000000","message":"Done","commit_id":"89b2942434182941d855a0f1961d3109a87aea2d"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"299eac4d8b4edd3e41b8491148daa2e9bc5e44dc","unresolved":true,"context_lines":[{"line_number":364,"context_line":"    if not node.driver_internal_info.get(\u0027steps_validated\u0027):"},{"line_number":365,"context_line":"        try:"},{"line_number":366,"context_line":"            conductor_steps.validate_user_deploy_steps_and_templates("},{"line_number":367,"context_line":"                task, task.node.driver_internal_info.get(\u0027user_deploy_steps\u0027))"},{"line_number":368,"context_line":"            conductor_steps.set_node_deployment_steps("},{"line_number":369,"context_line":"                task, reset_current\u003dFalse)"},{"line_number":370,"context_line":"        except exception.IronicException as exc:"}],"source_content_type":"text/x-python","patch_set":3,"id":"2fede00b_f6a82bb2","line":367,"range":{"start_line":367,"start_character":22,"end_line":367,"end_character":77},"in_reply_to":"d66fa202_ec15a5af","updated":"2021-01-11 14:04:12.000000000","message":"What would pass that deploy_steps and where would it get them from? At this stage originating sync API call is gone unlike in L103. This is called in async process where it needs to get the steps from somewhere, in this case driver internal info.","commit_id":"89b2942434182941d855a0f1961d3109a87aea2d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a944749e31c581279d67c417112681b0c3aaeba1","unresolved":false,"context_lines":[{"line_number":364,"context_line":"    if not node.driver_internal_info.get(\u0027steps_validated\u0027):"},{"line_number":365,"context_line":"        try:"},{"line_number":366,"context_line":"            conductor_steps.validate_user_deploy_steps_and_templates("},{"line_number":367,"context_line":"                task, task.node.driver_internal_info.get(\u0027user_deploy_steps\u0027))"},{"line_number":368,"context_line":"            conductor_steps.set_node_deployment_steps("},{"line_number":369,"context_line":"                task, reset_current\u003dFalse)"},{"line_number":370,"context_line":"        except exception.IronicException as exc:"}],"source_content_type":"text/x-python","patch_set":4,"id":"24054bc2_09d61c48","line":367,"updated":"2021-01-11 18:04:57.000000000","message":"maybe make validate_blah_blah check dii[user_deploy_steps] by default?","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"2174638f56e703c0081320bec8bf37a5bac7be6d","unresolved":false,"context_lines":[{"line_number":364,"context_line":"    if not node.driver_internal_info.get(\u0027steps_validated\u0027):"},{"line_number":365,"context_line":"        try:"},{"line_number":366,"context_line":"            conductor_steps.validate_user_deploy_steps_and_templates("},{"line_number":367,"context_line":"                task, task.node.driver_internal_info.get(\u0027user_deploy_steps\u0027))"},{"line_number":368,"context_line":"            conductor_steps.set_node_deployment_steps("},{"line_number":369,"context_line":"                task, reset_current\u003dFalse)"},{"line_number":370,"context_line":"        except exception.IronicException as exc:"}],"source_content_type":"text/x-python","patch_set":4,"id":"157ef2a1_5f76ada5","line":367,"in_reply_to":"24054bc2_09d61c48","updated":"2021-01-15 16:12:37.000000000","message":"done","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"}],"ironic/conductor/manager.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"a162f455203d5f376e4ba72b56eca529d9e178ec","unresolved":true,"context_lines":[{"line_number":1890,"context_line":"                        # NOTE(dtantsur): without the agent running we cannot"},{"line_number":1891,"context_line":"                        # have the complete list of steps, so skip ones that we"},{"line_number":1892,"context_line":"                        # don\u0027t know."},{"line_number":1893,"context_line":"                        conductor_steps.validate_deploy_templates("},{"line_number":1894,"context_line":"                            task, skip_missing\u003dTrue)"},{"line_number":1895,"context_line":"                    result \u003d True"},{"line_number":1896,"context_line":"                except (exception.InvalidParameterValue,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bb9b2bd5_fa9608b0","line":1893,"updated":"2021-01-05 15:17:13.000000000","message":"Also need to validate here.","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"cc61618d9ca7ef5d8092af2059c83482c38505ed","unresolved":false,"context_lines":[{"line_number":1890,"context_line":"                        # NOTE(dtantsur): without the agent running we cannot"},{"line_number":1891,"context_line":"                        # have the complete list of steps, so skip ones that we"},{"line_number":1892,"context_line":"                        # don\u0027t know."},{"line_number":1893,"context_line":"                        conductor_steps.validate_deploy_templates("},{"line_number":1894,"context_line":"                            task, skip_missing\u003dTrue)"},{"line_number":1895,"context_line":"                    result \u003d True"},{"line_number":1896,"context_line":"                except (exception.InvalidParameterValue,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf7f6023_9b4cfde5","line":1893,"in_reply_to":"bb9b2bd5_fa9608b0","updated":"2021-01-08 09:05:12.000000000","message":"Done","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a944749e31c581279d67c417112681b0c3aaeba1","unresolved":false,"context_lines":[{"line_number":1894,"context_line":"                         .validate_user_deploy_steps_and_templates("},{"line_number":1895,"context_line":"                             task,"},{"line_number":1896,"context_line":"                             (task.node.driver_internal_info"},{"line_number":1897,"context_line":"                              .get(\u0027user_deploy_steps\u0027)),"},{"line_number":1898,"context_line":"                             skip_missing\u003dTrue))"},{"line_number":1899,"context_line":"                    result \u003d True"},{"line_number":1900,"context_line":"                except (exception.InvalidParameterValue,"}],"source_content_type":"text/x-python","patch_set":4,"id":"bebe5742_971f87b7","line":1897,"updated":"2021-01-11 18:04:57.000000000","message":"yeah, I\u0027d rather move this inside the call (see above)","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"2174638f56e703c0081320bec8bf37a5bac7be6d","unresolved":false,"context_lines":[{"line_number":1894,"context_line":"                         .validate_user_deploy_steps_and_templates("},{"line_number":1895,"context_line":"                             task,"},{"line_number":1896,"context_line":"                             (task.node.driver_internal_info"},{"line_number":1897,"context_line":"                              .get(\u0027user_deploy_steps\u0027)),"},{"line_number":1898,"context_line":"                             skip_missing\u003dTrue))"},{"line_number":1899,"context_line":"                    result \u003d True"},{"line_number":1900,"context_line":"                except (exception.InvalidParameterValue,"}],"source_content_type":"text/x-python","patch_set":4,"id":"0534e104_6899d449","line":1897,"in_reply_to":"bebe5742_971f87b7","updated":"2021-01-15 16:12:37.000000000","message":"done","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"}],"ironic/conductor/rpcapi.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"a162f455203d5f376e4ba72b56eca529d9e178ec","unresolved":true,"context_lines":[{"line_number":419,"context_line":"        undeployed state before this method is called."},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        \"\"\""},{"line_number":422,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.22\u0027)"},{"line_number":423,"context_line":"        return cctxt.call(context, \u0027do_node_deploy\u0027, node_id\u003dnode_id,"},{"line_number":424,"context_line":"                          rebuild\u003drebuild, configdrive\u003dconfigdrive,"},{"line_number":425,"context_line":"                          deploy_steps\u003ddeploy_steps)"}],"source_content_type":"text/x-python","patch_set":2,"id":"181f02ac_6e43f27b","line":422,"range":{"start_line":422,"start_character":72,"end_line":422,"end_character":76},"updated":"2021-01-05 15:17:13.000000000","message":"1.52? Possibly we need to fall back to 1.22 if deploy_steps is not set, for rolling upgrades.","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"cc61618d9ca7ef5d8092af2059c83482c38505ed","unresolved":true,"context_lines":[{"line_number":419,"context_line":"        undeployed state before this method is called."},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        \"\"\""},{"line_number":422,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.22\u0027)"},{"line_number":423,"context_line":"        return cctxt.call(context, \u0027do_node_deploy\u0027, node_id\u003dnode_id,"},{"line_number":424,"context_line":"                          rebuild\u003drebuild, configdrive\u003dconfigdrive,"},{"line_number":425,"context_line":"                          deploy_steps\u003ddeploy_steps)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a0fb08d_be0ea5e3","line":422,"range":{"start_line":422,"start_character":72,"end_line":422,"end_character":76},"in_reply_to":"181f02ac_6e43f27b","updated":"2021-01-08 09:05:12.000000000","message":"added to use 1.52 when deploy steps passed and version supported; unit test case added","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"4dfa3621d80893821c1109a82adcaa35141b06d1","unresolved":true,"context_lines":[{"line_number":421,"context_line":"        \"\"\""},{"line_number":422,"context_line":"        version \u003d \u00271.22\u0027"},{"line_number":423,"context_line":"        new_kws \u003d {}"},{"line_number":424,"context_line":"        if deploy_steps and self.client.can_send_version(\u00271.52\u0027):"},{"line_number":425,"context_line":"            version \u003d \u00271.52\u0027"},{"line_number":426,"context_line":"            new_kws[\u0027deploy_steps\u0027] \u003d deploy_steps"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003dversion)"},{"line_number":429,"context_line":"        return cctxt.call(context, \u0027do_node_deploy\u0027, node_id\u003dnode_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"247076f9_52984439","line":426,"range":{"start_line":424,"start_character":0,"end_line":426,"end_character":50},"updated":"2021-01-11 10:56:05.000000000","message":"I think we need to fail the request here when:\n\nif deploy_steps and not self.client.can_send_version(\u00271.52\u0027):\n    # fail","commit_id":"89b2942434182941d855a0f1961d3109a87aea2d"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"299eac4d8b4edd3e41b8491148daa2e9bc5e44dc","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        \"\"\""},{"line_number":422,"context_line":"        version \u003d \u00271.22\u0027"},{"line_number":423,"context_line":"        new_kws \u003d {}"},{"line_number":424,"context_line":"        if deploy_steps and self.client.can_send_version(\u00271.52\u0027):"},{"line_number":425,"context_line":"            version \u003d \u00271.52\u0027"},{"line_number":426,"context_line":"            new_kws[\u0027deploy_steps\u0027] \u003d deploy_steps"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003dversion)"},{"line_number":429,"context_line":"        return cctxt.call(context, \u0027do_node_deploy\u0027, node_id\u003dnode_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"36a35eef_7689354f","line":426,"range":{"start_line":424,"start_character":0,"end_line":426,"end_character":50},"in_reply_to":"247076f9_52984439","updated":"2021-01-11 14:04:12.000000000","message":"Done","commit_id":"89b2942434182941d855a0f1961d3109a87aea2d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a944749e31c581279d67c417112681b0c3aaeba1","unresolved":false,"context_lines":[{"line_number":424,"context_line":"        version \u003d \u00271.22\u0027"},{"line_number":425,"context_line":"        new_kws \u003d {}"},{"line_number":426,"context_line":"        if deploy_steps:"},{"line_number":427,"context_line":"            if self.client.can_send_version(\u00271.52\u0027):"},{"line_number":428,"context_line":"                version \u003d \u00271.52\u0027"},{"line_number":429,"context_line":"                new_kws[\u0027deploy_steps\u0027] \u003d deploy_steps"},{"line_number":430,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3c058ddc_11b5bb90","line":427,"updated":"2021-01-11 18:04:57.000000000","message":"I suspect using version\u003d\u00271.52\u0027 below will provide this check automatically","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"2884037e58f78e75c92650edabbdc529d16f637e","unresolved":false,"context_lines":[{"line_number":424,"context_line":"        version \u003d \u00271.22\u0027"},{"line_number":425,"context_line":"        new_kws \u003d {}"},{"line_number":426,"context_line":"        if deploy_steps:"},{"line_number":427,"context_line":"            if self.client.can_send_version(\u00271.52\u0027):"},{"line_number":428,"context_line":"                version \u003d \u00271.52\u0027"},{"line_number":429,"context_line":"                new_kws[\u0027deploy_steps\u0027] \u003d deploy_steps"},{"line_number":430,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"c41a185b_f622ce37","line":427,"in_reply_to":"3c058ddc_11b5bb90","updated":"2021-01-12 09:48:30.000000000","message":"For rolling upgrades don\u0027t we want to use 1.22 if possible? I guess we need some TODO here to bump to 1.52 after transition.","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"79be7e25d75e2a0ac5ead04f156910d5c1d4698d","unresolved":false,"context_lines":[{"line_number":424,"context_line":"        version \u003d \u00271.22\u0027"},{"line_number":425,"context_line":"        new_kws \u003d {}"},{"line_number":426,"context_line":"        if deploy_steps:"},{"line_number":427,"context_line":"            if self.client.can_send_version(\u00271.52\u0027):"},{"line_number":428,"context_line":"                version \u003d \u00271.52\u0027"},{"line_number":429,"context_line":"                new_kws[\u0027deploy_steps\u0027] \u003d deploy_steps"},{"line_number":430,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"dff10f2d_7c1d6864","line":427,"in_reply_to":"c347ef55_5bf154fe","updated":"2021-02-03 16:35:11.000000000","message":"updated from IRC chat","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"2174638f56e703c0081320bec8bf37a5bac7be6d","unresolved":false,"context_lines":[{"line_number":424,"context_line":"        version \u003d \u00271.22\u0027"},{"line_number":425,"context_line":"        new_kws \u003d {}"},{"line_number":426,"context_line":"        if deploy_steps:"},{"line_number":427,"context_line":"            if self.client.can_send_version(\u00271.52\u0027):"},{"line_number":428,"context_line":"                version \u003d \u00271.52\u0027"},{"line_number":429,"context_line":"                new_kws[\u0027deploy_steps\u0027] \u003d deploy_steps"},{"line_number":430,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"c347ef55_5bf154fe","line":427,"in_reply_to":"c41a185b_f622ce37","updated":"2021-01-15 16:12:37.000000000","message":"Which way to go in the end?","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a944749e31c581279d67c417112681b0c3aaeba1","unresolved":false,"context_lines":[{"line_number":428,"context_line":"                version \u003d \u00271.52\u0027"},{"line_number":429,"context_line":"                new_kws[\u0027deploy_steps\u0027] \u003d deploy_steps"},{"line_number":430,"context_line":"            else:"},{"line_number":431,"context_line":"                raise NotImplementedError(_(\u0027Incompatible conductor version - \u0027"},{"line_number":432,"context_line":"                                            \u0027please upgrade ironic-conductor \u0027"},{"line_number":433,"context_line":"                                            \u0027first\u0027))"},{"line_number":434,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"90694f97_c38bca7a","line":431,"updated":"2021-01-11 18:04:57.000000000","message":"If you do want to raise an error, please use something derived from IronicException","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"79be7e25d75e2a0ac5ead04f156910d5c1d4698d","unresolved":false,"context_lines":[{"line_number":428,"context_line":"                version \u003d \u00271.52\u0027"},{"line_number":429,"context_line":"                new_kws[\u0027deploy_steps\u0027] \u003d deploy_steps"},{"line_number":430,"context_line":"            else:"},{"line_number":431,"context_line":"                raise NotImplementedError(_(\u0027Incompatible conductor version - \u0027"},{"line_number":432,"context_line":"                                            \u0027please upgrade ironic-conductor \u0027"},{"line_number":433,"context_line":"                                            \u0027first\u0027))"},{"line_number":434,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ee4f8b2d_c4bb8462","line":431,"in_reply_to":"90694f97_c38bca7a","updated":"2021-02-03 16:35:11.000000000","message":"not there anymore","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"}],"ironic/conductor/steps.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"a162f455203d5f376e4ba72b56eca529d9e178ec","unresolved":true,"context_lines":[{"line_number":286,"context_line":"    \"\"\""},{"line_number":287,"context_line":"    # Get deploy steps provided by user via argument if any. These steps"},{"line_number":288,"context_line":"    # override template and driver steps when overlap."},{"line_number":289,"context_line":"    user_steps \u003d validate_user_deploy_steps("},{"line_number":290,"context_line":"        task, task.node.driver_internal_info.get(\u0027user_deploy_steps\u0027, []),"},{"line_number":291,"context_line":"        skip_missing\u003dskip_missing)"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"db0b6e43_32bf17f2","line":289,"range":{"start_line":289,"start_character":17,"end_line":289,"end_character":43},"updated":"2021-01-05 15:17:13.000000000","message":"If it returns steps, it should probably be prefixed with get_","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"cc61618d9ca7ef5d8092af2059c83482c38505ed","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    \"\"\""},{"line_number":287,"context_line":"    # Get deploy steps provided by user via argument if any. These steps"},{"line_number":288,"context_line":"    # override template and driver steps when overlap."},{"line_number":289,"context_line":"    user_steps \u003d validate_user_deploy_steps("},{"line_number":290,"context_line":"        task, task.node.driver_internal_info.get(\u0027user_deploy_steps\u0027, []),"},{"line_number":291,"context_line":"        skip_missing\u003dskip_missing)"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1fc5661d_2c8a7a91","line":289,"range":{"start_line":289,"start_character":17,"end_line":289,"end_character":43},"in_reply_to":"db0b6e43_32bf17f2","updated":"2021-01-08 09:05:12.000000000","message":"Done","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"a162f455203d5f376e4ba72b56eca529d9e178ec","unresolved":true,"context_lines":[{"line_number":643,"context_line":"    _get_validated_steps_from_templates(task, skip_missing\u003dskip_missing)"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"def validate_user_deploy_steps(task, deploy_steps, skip_missing\u003dFalse):"},{"line_number":647,"context_line":"    \"\"\"Validate the deploy steps for a node."},{"line_number":648,"context_line":""},{"line_number":649,"context_line":"    :param task: A TaskManager object"}],"source_content_type":"text/x-python","patch_set":2,"id":"b79a8bf2_49524cb7","line":646,"range":{"start_line":646,"start_character":4,"end_line":646,"end_character":30},"updated":"2021-01-05 15:17:13.000000000","message":"You might consider combining this with validate_deploy_templates, since they are always called together. They could still be split in this file.","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"cc61618d9ca7ef5d8092af2059c83482c38505ed","unresolved":true,"context_lines":[{"line_number":643,"context_line":"    _get_validated_steps_from_templates(task, skip_missing\u003dskip_missing)"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"def validate_user_deploy_steps(task, deploy_steps, skip_missing\u003dFalse):"},{"line_number":647,"context_line":"    \"\"\"Validate the deploy steps for a node."},{"line_number":648,"context_line":""},{"line_number":649,"context_line":"    :param task: A TaskManager object"}],"source_content_type":"text/x-python","patch_set":2,"id":"bb34eb73_ad08d5b2","line":646,"range":{"start_line":646,"start_character":4,"end_line":646,"end_character":30},"in_reply_to":"b79a8bf2_49524cb7","updated":"2021-01-08 09:05:12.000000000","message":"combined and restructured a bit, unit tests updated","commit_id":"af6e08eb69e747745067fc7c294abaaa9aaf7e75"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"f6d66a1a825159251c7b17b713d9646b2f1d8c28","unresolved":true,"context_lines":[{"line_number":636,"context_line":"    :param task: A TaskManager object"},{"line_number":637,"context_line":"    :param deploy_steps: Deploy steps to validate. Optional. If not provided"},{"line_number":638,"context_line":"        then will check node\u0027s driver internal info."},{"line_number":639,"context_line":"    :raises: InvalidParameterValue if deploy steps are unsupported by the"},{"line_number":640,"context_line":"        node\u0027s driver interfaces."},{"line_number":641,"context_line":"    :raises: InstanceDeployFailure if there was a problem getting the deploy"},{"line_number":642,"context_line":"        steps from the driver."}],"source_content_type":"text/x-python","patch_set":6,"id":"0eb7575f_6c58dbb9","line":639,"updated":"2021-01-26 09:01:52.000000000","message":"missing param skip_missing","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"f6d66a1a825159251c7b17b713d9646b2f1d8c28","unresolved":true,"context_lines":[{"line_number":660,"context_line":""},{"line_number":661,"context_line":"    :param task: A TaskManager object"},{"line_number":662,"context_line":"    :param deploy_steps: Deploy steps to validate. Optional. If not provided"},{"line_number":663,"context_line":"        then will check node\u0027s driver internal info."},{"line_number":664,"context_line":"    :raises: InvalidParameterValue if the instance has traits that map to"},{"line_number":665,"context_line":"        deploy steps that are unsupported by the node\u0027s driver interfaces or"},{"line_number":666,"context_line":"        user deploy steps are unsupported by the node\u0027s driver interfaces"}],"source_content_type":"text/x-python","patch_set":6,"id":"ea9d28be_076fb6ca","line":663,"updated":"2021-01-26 09:01:52.000000000","message":"ditto","commit_id":"5ac921b08360a19eb2c092c66c62d7760170f10e"}],"ironic/tests/unit/api/controllers/v1/test_node.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1b4bce07b442efd3a88cf9e6cc68683d0fb87319","unresolved":true,"context_lines":[{"line_number":5105,"context_line":"                             \u0027deploy_steps\u0027: deploy_steps},"},{"line_number":5106,"context_line":"                            headers\u003d{api_base.Version.string: \"1.15\"},"},{"line_number":5107,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":5108,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":5109,"context_line":""},{"line_number":5110,"context_line":"    def test_provision_with_rebuild(self):"},{"line_number":5111,"context_line":"        node \u003d self.node"}],"source_content_type":"text/x-python","patch_set":4,"id":"cc94772b_465cbe0b","line":5108,"updated":"2021-01-26 10:09:34.000000000","message":"Why was this one removed?","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"79be7e25d75e2a0ac5ead04f156910d5c1d4698d","unresolved":true,"context_lines":[{"line_number":5105,"context_line":"                             \u0027deploy_steps\u0027: deploy_steps},"},{"line_number":5106,"context_line":"                            headers\u003d{api_base.Version.string: \"1.15\"},"},{"line_number":5107,"context_line":"                            expect_errors\u003dTrue)"},{"line_number":5108,"context_line":"        self.assertEqual(http_client.BAD_REQUEST, ret.status_code)"},{"line_number":5109,"context_line":""},{"line_number":5110,"context_line":"    def test_provision_with_rebuild(self):"},{"line_number":5111,"context_line":"        node \u003d self.node"}],"source_content_type":"text/x-python","patch_set":4,"id":"43cd6a62_c05b8d84","line":5108,"in_reply_to":"cc94772b_465cbe0b","updated":"2021-02-03 16:35:11.000000000","message":"Functionality it was testing was moved to api_utils[1] and that\u0027s now tested by api_utils tests [2]. Didn\u0027t see value to test here it again, it will not increase coverage.\n  \n[1] https://review.opendev.org/c/openstack/ironic/+/768353/4..6/ironic/api/controllers/v1/node.py#b989\n[2] https://review.opendev.org/c/openstack/ironic/+/768353/4..6/ironic/tests/unit/api/controllers/v1/test_utils.py#762","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"}],"ironic/tests/unit/conductor/test_rpcapi.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"4dfa3621d80893821c1109a82adcaa35141b06d1","unresolved":true,"context_lines":[{"line_number":291,"context_line":"                          node_id\u003dself.fake_node[\u0027uuid\u0027],"},{"line_number":292,"context_line":"                          rebuild\u003dFalse,"},{"line_number":293,"context_line":"                          configdrive\u003dNone)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def test_do_node_deploy_with_deploy_steps(self):"},{"line_number":296,"context_line":"        self._test_rpcapi(\u0027do_node_deploy\u0027,"},{"line_number":297,"context_line":"                          \u0027call\u0027,"},{"line_number":298,"context_line":"                          version\u003d\u00271.52\u0027,"},{"line_number":299,"context_line":"                          node_id\u003dself.fake_node[\u0027uuid\u0027],"},{"line_number":300,"context_line":"                          rebuild\u003dFalse,"},{"line_number":301,"context_line":"                          configdrive\u003dNone,"},{"line_number":302,"context_line":"                          deploy_steps\u003d{\u0027key\u0027: \u0027value\u0027})"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    def test_do_node_tear_down(self):"},{"line_number":305,"context_line":"        self._test_rpcapi(\u0027do_node_tear_down\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"12e3530c_f8776cce","line":302,"range":{"start_line":294,"start_character":0,"end_line":302,"end_character":56},"updated":"2021-01-11 10:56:05.000000000","message":"Can you add a test where deploy steps is passed and 1.52 is not supported?","commit_id":"89b2942434182941d855a0f1961d3109a87aea2d"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"299eac4d8b4edd3e41b8491148daa2e9bc5e44dc","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                          node_id\u003dself.fake_node[\u0027uuid\u0027],"},{"line_number":292,"context_line":"                          rebuild\u003dFalse,"},{"line_number":293,"context_line":"                          configdrive\u003dNone)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def test_do_node_deploy_with_deploy_steps(self):"},{"line_number":296,"context_line":"        self._test_rpcapi(\u0027do_node_deploy\u0027,"},{"line_number":297,"context_line":"                          \u0027call\u0027,"},{"line_number":298,"context_line":"                          version\u003d\u00271.52\u0027,"},{"line_number":299,"context_line":"                          node_id\u003dself.fake_node[\u0027uuid\u0027],"},{"line_number":300,"context_line":"                          rebuild\u003dFalse,"},{"line_number":301,"context_line":"                          configdrive\u003dNone,"},{"line_number":302,"context_line":"                          deploy_steps\u003d{\u0027key\u0027: \u0027value\u0027})"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    def test_do_node_tear_down(self):"},{"line_number":305,"context_line":"        self._test_rpcapi(\u0027do_node_tear_down\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"255ff21c_3e858e6d","line":302,"range":{"start_line":294,"start_character":0,"end_line":302,"end_character":56},"in_reply_to":"12e3530c_f8776cce","updated":"2021-01-11 14:04:12.000000000","message":"Done","commit_id":"89b2942434182941d855a0f1961d3109a87aea2d"}],"ironic/tests/unit/conductor/test_steps.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a944749e31c581279d67c417112681b0c3aaeba1","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        template_steps[0].update({\u0027priority\u0027: 200})"},{"line_number":331,"context_line":"        template_steps[1].update({\u0027priority\u0027: 100})"},{"line_number":332,"context_line":"        driver_steps \u003d self.deploy_steps"},{"line_number":333,"context_line":"        expected_steps \u003d\\"},{"line_number":334,"context_line":"            user_steps[:1] + template_steps[1:2] + self.deploy_steps[2:]"},{"line_number":335,"context_line":"        self._test__get_all_deployment_steps(user_steps, template_steps,"},{"line_number":336,"context_line":"                                             driver_steps, expected_steps)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3cea72d3_db90aa18","line":333,"updated":"2021-01-11 18:04:57.000000000","message":"nit: use brackets instead of \\","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"2174638f56e703c0081320bec8bf37a5bac7be6d","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        template_steps[0].update({\u0027priority\u0027: 200})"},{"line_number":331,"context_line":"        template_steps[1].update({\u0027priority\u0027: 100})"},{"line_number":332,"context_line":"        driver_steps \u003d self.deploy_steps"},{"line_number":333,"context_line":"        expected_steps \u003d\\"},{"line_number":334,"context_line":"            user_steps[:1] + template_steps[1:2] + self.deploy_steps[2:]"},{"line_number":335,"context_line":"        self._test__get_all_deployment_steps(user_steps, template_steps,"},{"line_number":336,"context_line":"                                             driver_steps, expected_steps)"}],"source_content_type":"text/x-python","patch_set":4,"id":"dc52a13b_e811fd46","line":333,"in_reply_to":"3cea72d3_db90aa18","updated":"2021-01-15 16:12:37.000000000","message":"done","commit_id":"90d75281a2eabfe31c028024fef27e006210d6a7"}],"releasenotes/notes/add-deploy-steps-arg-9d8c58559c14288c.yaml":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"c644b38b6644c7415542f6b2451965c897ca794f","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Adds support for ``deploy_steps`` parameter to provisioning endpoint"},{"line_number":5,"context_line":"    ``/v1/nodes/{node_ident}/states/provision``. Available and optional when"},{"line_number":6,"context_line":"    target is \u0027active\u0027 or \u0027rebuild\u0027. When overlapping, these steps override"},{"line_number":7,"context_line":"    deploy template and driver steps. ``deploy_steps`` is a list of"},{"line_number":8,"context_line":"    dictionaries with required keys \u0027interface\u0027, \u0027step\u0027, \u0027priority\u0027 and \u0027args\u0027."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"34e1bb4e_3d5dc3fb","line":7,"range":{"start_line":7,"start_character":38,"end_line":7,"end_character":54},"updated":"2021-02-12 13:20:00.000000000","message":"nit: The ``deploy_steps`` parameter","commit_id":"3138acc836c933aa179b9a92c14a226a8b903fe5"}]}
