)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":48,"context_line":"due to default logging system there)."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Neutron is mandatory."},{"line_number":51,"context_line":"Tested with and targets Ansible \u003e 2.1"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Current deploy ramdisk requirements:"},{"line_number":54,"context_line":"- password-less sudo permissions for the user used by Ansible"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1aa78d24_c9685424","line":51,"updated":"2016-07-11 16:17:59.000000000","message":"\u003e\u003d","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":48,"context_line":"due to default logging system there)."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Neutron is mandatory."},{"line_number":51,"context_line":"Tested with and targets Ansible \u003e 2.1"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Current deploy ramdisk requirements:"},{"line_number":54,"context_line":"- password-less sudo permissions for the user used by Ansible"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1aa78d24_104ba62c","line":51,"in_reply_to":"1aa78d24_c9685424","updated":"2016-07-15 11:47:39.000000000","message":"Done","commit_id":"1191d3f827375d9de043f33caeabe82852362945"}],"ironic_staging_drivers/ansible/__init__.py":[{"author":{"_account_id":10391,"name":"Ihor Kalnytskyi","email":"ihor@kalnytskyi.com","username":"ikalnitsky"},"change_message_id":"3db1bb6d64bf76ca11a7f767e7cdf61311f55e17","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def __init__(self):"},{"line_number":41,"context_line":"        self.power \u003d ipmitool.IPMIPower()"},{"line_number":42,"context_line":"        self.boot \u003d pxe.PXEBoot()"},{"line_number":43,"context_line":"        self.deploy \u003d ansible_deploy.AnsibleDeploy()"},{"line_number":44,"context_line":"        self.management \u003d ipmitool.IPMIManagement()"},{"line_number":45,"context_line":"        self.vendor \u003d ansible_deploy.AnsibleVendor()"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_79edf38a","line":43,"updated":"2016-07-18 14:56:43.000000000","message":"I saw \"inspect.yml\" playbook.. here, in this patch. So why there\u0027s no \"inspect\" driver ?","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":10391,"name":"Ihor Kalnytskyi","email":"ihor@kalnytskyi.com","username":"ikalnitsky"},"change_message_id":"014e8e3cac784930292fe006119b11f04e80d5f0","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def __init__(self):"},{"line_number":41,"context_line":"        self.power \u003d ipmitool.IPMIPower()"},{"line_number":42,"context_line":"        self.boot \u003d pxe.PXEBoot()"},{"line_number":43,"context_line":"        self.deploy \u003d ansible_deploy.AnsibleDeploy()"},{"line_number":44,"context_line":"        self.management \u003d ipmitool.IPMIManagement()"},{"line_number":45,"context_line":"        self.vendor \u003d ansible_deploy.AnsibleVendor()"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_8ec17683","line":43,"in_reply_to":"dada55a8_7917b351","updated":"2016-07-18 15:49:15.000000000","message":"Thanks! :)","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":13636,"name":"Anton A","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"424e245fca9e771498c93070f1542ef7bb280223","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def __init__(self):"},{"line_number":41,"context_line":"        self.power \u003d ipmitool.IPMIPower()"},{"line_number":42,"context_line":"        self.boot \u003d pxe.PXEBoot()"},{"line_number":43,"context_line":"        self.deploy \u003d ansible_deploy.AnsibleDeploy()"},{"line_number":44,"context_line":"        self.management \u003d ipmitool.IPMIManagement()"},{"line_number":45,"context_line":"        self.vendor \u003d ansible_deploy.AnsibleVendor()"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_7917b351","line":43,"in_reply_to":"dada55a8_79edf38a","updated":"2016-07-18 15:00:26.000000000","message":"inspect interface here https://review.openstack.org/#/c/342801/","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":22405,"name":"Vitaliy Nogin","email":"shadoff1982@gmail.com","username":"vnogin"},"change_message_id":"8b858eff999598bab5bc8b1550a3b41b4fda7062","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from ironic.drivers.modules import ssh"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from ironic_staging_drivers.ansible import deploy as ansible_deploy"},{"line_number":20,"context_line":"from ironic_staging_drivers.libvirt import power as libvirt_power"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class AnsibleAndSSHDriver(base.BaseDriver):"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ac06dbe_abf77657","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":65},"updated":"2016-08-23 14:33:51.000000000","message":"Please make this a conditional import so that python-libvirt is not required when setting up Ansible-deploy driver with Bifrost when targeting real baremetal.","commit_id":"b93a930885e395ce30303e9dca54bee446a61cb3"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"853e62bdb47ac859120d10fee2cc145590ec774c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from ironic.drivers.modules import ssh"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from ironic_staging_drivers.ansible import deploy as ansible_deploy"},{"line_number":20,"context_line":"from ironic_staging_drivers.libvirt import power as libvirt_power"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class AnsibleAndSSHDriver(base.BaseDriver):"}],"source_content_type":"text/x-python","patch_set":13,"id":"1ac06dbe_af9e4204","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":65},"in_reply_to":"1ac06dbe_abf77657","updated":"2016-08-23 21:39:50.000000000","message":"Done","commit_id":"b93a930885e395ce30303e9dca54bee446a61cb3"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"56f34c31b00bfce21f051efd66fafdc38c84b992","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self.power \u003d ipmitool.IPMIPower()"},{"line_number":41,"context_line":"        self.boot \u003d pxe.PXEBoot()"},{"line_number":42,"context_line":"        self.deploy \u003d ansible_deploy.AnsibleDeploy()"},{"line_number":43,"context_line":"        self.management \u003d ipmitool.IPMIManagement()"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class FakeAnsibleDriver(base.BaseDriver):"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_5f2dc0a6","line":43,"updated":"2016-08-30 10:08:04.000000000","message":"would be nice to include ipmitool.VendorPassthru","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self.power \u003d ipmitool.IPMIPower()"},{"line_number":41,"context_line":"        self.boot \u003d pxe.PXEBoot()"},{"line_number":42,"context_line":"        self.deploy \u003d ansible_deploy.AnsibleDeploy()"},{"line_number":43,"context_line":"        self.management \u003d ipmitool.IPMIManagement()"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class FakeAnsibleDriver(base.BaseDriver):"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_9842dfac","line":43,"in_reply_to":"fa7ab95a_5f2dc0a6","updated":"2016-08-31 10:32:05.000000000","message":"Done","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"31d95f904088911cfae2c229dfc9b50b40776879","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        self.power \u003d fake.FakePower()"},{"line_number":52,"context_line":"        self.boot \u003d pxe.PXEBoot()"},{"line_number":53,"context_line":"        self.deploy \u003d ansible_deploy.AnsibleDeploy()"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class AnsibleAndLibvirtDriver(base.BaseDriver):"},{"line_number":57,"context_line":"    \"\"\"Ansible + Libvirt driver."}],"source_content_type":"text/x-python","patch_set":23,"id":"fa7ab95a_cbebcbda","line":54,"updated":"2016-09-02 16:00:25.000000000","message":"nit: self.management \u003d fake.FakeManagement()","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        self.power \u003d fake.FakePower()"},{"line_number":52,"context_line":"        self.boot \u003d pxe.PXEBoot()"},{"line_number":53,"context_line":"        self.deploy \u003d ansible_deploy.AnsibleDeploy()"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class AnsibleAndLibvirtDriver(base.BaseDriver):"},{"line_number":57,"context_line":"    \"\"\"Ansible + Libvirt driver."}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_953bef9b","line":54,"in_reply_to":"fa7ab95a_cbebcbda","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"f908dd3a8c281e932ce7adf8ae9163ce7dd434ce","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from ironic.drivers.modules import fake"},{"line_number":15,"context_line":"from ironic.drivers.modules import ipmitool"},{"line_number":16,"context_line":"from ironic.drivers.modules import pxe"},{"line_number":17,"context_line":"from ironic.drivers.modules import ssh"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from ironic_staging_drivers.ansible import deploy as ansible_deploy"},{"line_number":20,"context_line":"from ironic_staging_drivers.libvirt import power as libvirt_power"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a8bc5a2_41b209e6","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":38},"updated":"2016-09-27 13:01:14.000000000","message":"I wonder if we need an try_import here, this will break once we remove the SSH driver from Ironic right?\n\n(We can do it later as well)","commit_id":"ffd006e098abf32c2d830194fa7fbb778b3b2742"}],"ironic_staging_drivers/ansible/deploy.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":53,"context_line":"CONF \u003d cfg.CONF"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"ansible_opts \u003d ["},{"line_number":56,"context_line":"    cfg.StrOpt(\u0027ansible_extra_args\u0027,"},{"line_number":57,"context_line":"               help\u003d_(\u0027Extra arguments to pass on every \u0027"},{"line_number":58,"context_line":"                      \u0027invocation of Ansible.\u0027)),"},{"line_number":59,"context_line":"    cfg.IntOpt(\u0027verbosity\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_1bec5028","line":56,"updated":"2016-07-11 16:17:59.000000000","message":"What\u0027s the format here?","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":53,"context_line":"CONF \u003d cfg.CONF"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"ansible_opts \u003d ["},{"line_number":56,"context_line":"    cfg.StrOpt(\u0027ansible_extra_args\u0027,"},{"line_number":57,"context_line":"               help\u003d_(\u0027Extra arguments to pass on every \u0027"},{"line_number":58,"context_line":"                      \u0027invocation of Ansible.\u0027)),"},{"line_number":59,"context_line":"    cfg.IntOpt(\u0027verbosity\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_a75a5ef0","line":56,"in_reply_to":"1aa78d24_1bec5028","updated":"2016-07-15 11:47:39.000000000","message":"This is string with args (StrOpt).","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    cfg.IntOpt(\u0027verbosity\u0027,"},{"line_number":60,"context_line":"               default\u003d0, min\u003d0, max\u003d4,"},{"line_number":61,"context_line":"               help\u003d_(\u0027Set ansible verbosity level. \u0027"},{"line_number":62,"context_line":"                      \u00274 includes detailed SSH debug logging.\u0027"},{"line_number":63,"context_line":"                      \u0027If set, this setting takes precedence over \u0027"},{"line_number":64,"context_line":"                      \u0027global \"debug\" config option.\u0027)),"},{"line_number":65,"context_line":"    cfg.StrOpt(\u0027playbooks_path\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_a5aa3fd0","line":62,"updated":"2016-07-11 16:17:59.000000000","message":"Missing space at the end.","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    cfg.IntOpt(\u0027verbosity\u0027,"},{"line_number":60,"context_line":"               default\u003d0, min\u003d0, max\u003d4,"},{"line_number":61,"context_line":"               help\u003d_(\u0027Set ansible verbosity level. \u0027"},{"line_number":62,"context_line":"                      \u00274 includes detailed SSH debug logging.\u0027"},{"line_number":63,"context_line":"                      \u0027If set, this setting takes precedence over \u0027"},{"line_number":64,"context_line":"                      \u0027global \"debug\" config option.\u0027)),"},{"line_number":65,"context_line":"    cfg.StrOpt(\u0027playbooks_path\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_27678eb8","line":62,"in_reply_to":"1aa78d24_a5aa3fd0","updated":"2016-07-15 11:47:39.000000000","message":"Done","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":83,"context_line":"               default\u003d10,"},{"line_number":84,"context_line":"               help\u003d_(\u0027The memory amount in MiB: free memory minus image \u0027"},{"line_number":85,"context_line":"                      \u0027size.\u0027)),"},{"line_number":86,"context_line":"    cfg.BoolOpt(\u0027use_ramdisk_callback\u0027,"},{"line_number":87,"context_line":"                default\u003dTrue,"},{"line_number":88,"context_line":"                help\u003d_(\u0027Use callback request from ramdisk for start deploy or\u0027"},{"line_number":89,"context_line":"                       \u0027cleaning.\u0027)),"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_b1cefd80","line":86,"updated":"2016-07-11 16:17:59.000000000","message":"I\u0027m not sure I get what\u0027s the reason to keep it if the callback is already here?","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":83,"context_line":"               default\u003d10,"},{"line_number":84,"context_line":"               help\u003d_(\u0027The memory amount in MiB: free memory minus image \u0027"},{"line_number":85,"context_line":"                      \u0027size.\u0027)),"},{"line_number":86,"context_line":"    cfg.BoolOpt(\u0027use_ramdisk_callback\u0027,"},{"line_number":87,"context_line":"                default\u003dTrue,"},{"line_number":88,"context_line":"                help\u003d_(\u0027Use callback request from ramdisk for start deploy or\u0027"},{"line_number":89,"context_line":"                       \u0027cleaning.\u0027)),"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_87d2c232","line":86,"in_reply_to":"1aa78d24_b1cefd80","updated":"2016-07-15 11:47:39.000000000","message":"The reason is possibility of using minimal ramdisk only with Python and utilities.","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                      \u0027size.\u0027)),"},{"line_number":86,"context_line":"    cfg.BoolOpt(\u0027use_ramdisk_callback\u0027,"},{"line_number":87,"context_line":"                default\u003dTrue,"},{"line_number":88,"context_line":"                help\u003d_(\u0027Use callback request from ramdisk for start deploy or\u0027"},{"line_number":89,"context_line":"                       \u0027cleaning.\u0027)),"},{"line_number":90,"context_line":"]"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_45827b53","line":88,"updated":"2016-07-11 16:17:59.000000000","message":"ditto, missing space","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                      \u0027size.\u0027)),"},{"line_number":86,"context_line":"    cfg.BoolOpt(\u0027use_ramdisk_callback\u0027,"},{"line_number":87,"context_line":"                default\u003dTrue,"},{"line_number":88,"context_line":"                help\u003d_(\u0027Use callback request from ramdisk for start deploy or\u0027"},{"line_number":89,"context_line":"                       \u0027cleaning.\u0027)),"},{"line_number":90,"context_line":"]"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_87b922ef","line":88,"in_reply_to":"1aa78d24_45827b53","updated":"2016-07-15 11:47:39.000000000","message":"Done","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                         \u0027process will be used. \u0027"},{"line_number":113,"context_line":"                         \u0027Note that for keys with password, those must be \u0027"},{"line_number":114,"context_line":"                         \u0027pre-loaded into ssh-agent.\u0027),"},{"line_number":115,"context_line":"    \u0027deploy_playbook\u0027: _(\u0027Name of the Ansible playbook used for deployment. \u0027"},{"line_number":116,"context_line":"                         \u0027Default is %s.\u0027) % DEFAULT_PLAYBOOKS[\u0027deploy\u0027],"},{"line_number":117,"context_line":"    \u0027clean_playbook\u0027: _(\u0027Name of the Ansible playbook used for cleaning. \u0027"},{"line_number":118,"context_line":"                        \u0027Default is %s.\u0027) % DEFAULT_PLAYBOOKS[\u0027clean\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_455efbe9","line":115,"updated":"2016-07-11 16:17:59.000000000","message":"Seems like all of these are optional, not required.","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                         \u0027process will be used. \u0027"},{"line_number":113,"context_line":"                         \u0027Note that for keys with password, those must be \u0027"},{"line_number":114,"context_line":"                         \u0027pre-loaded into ssh-agent.\u0027),"},{"line_number":115,"context_line":"    \u0027deploy_playbook\u0027: _(\u0027Name of the Ansible playbook used for deployment. \u0027"},{"line_number":116,"context_line":"                         \u0027Default is %s.\u0027) % DEFAULT_PLAYBOOKS[\u0027deploy\u0027],"},{"line_number":117,"context_line":"    \u0027clean_playbook\u0027: _(\u0027Name of the Ansible playbook used for cleaning. \u0027"},{"line_number":118,"context_line":"                        \u0027Default is %s.\u0027) % DEFAULT_PLAYBOOKS[\u0027clean\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_c7fdea6f","line":115,"in_reply_to":"1aa78d24_455efbe9","updated":"2016-07-15 11:47:39.000000000","message":"Done","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        \u0027url\u0027: i_info[\u0027image_url\u0027],"},{"line_number":352,"context_line":"        \u0027mem_req\u0027: _calculate_memory_req(task),"},{"line_number":353,"context_line":"        \u0027checksum\u0027: i_info.get(\u0027image_checksum\u0027),"},{"line_number":354,"context_line":"        \u0027disk_format\u0027: i_info.get(\u0027image_disk_format\u0027),"},{"line_number":355,"context_line":"        \u0027container_format\u0027: i_info.get(\u0027image_container_format\u0027)"},{"line_number":356,"context_line":"    }"},{"line_number":357,"context_line":"    return {\u0027image\u0027: variables}"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_fbe504a8","line":354,"updated":"2016-07-11 16:17:59.000000000","message":"Is container_format used anywhere?","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        \u0027url\u0027: i_info[\u0027image_url\u0027],"},{"line_number":352,"context_line":"        \u0027mem_req\u0027: _calculate_memory_req(task),"},{"line_number":353,"context_line":"        \u0027checksum\u0027: i_info.get(\u0027image_checksum\u0027),"},{"line_number":354,"context_line":"        \u0027disk_format\u0027: i_info.get(\u0027image_disk_format\u0027),"},{"line_number":355,"context_line":"        \u0027container_format\u0027: i_info.get(\u0027image_container_format\u0027)"},{"line_number":356,"context_line":"    }"},{"line_number":357,"context_line":"    return {\u0027image\u0027: variables}"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_8afe4703","line":354,"in_reply_to":"1aa78d24_fbe504a8","updated":"2016-07-15 11:47:39.000000000","message":"No, removed.","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":391,"context_line":"    return steps"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"# taken from agent driver"},{"line_number":395,"context_line":"def _notify_conductor_resume_clean(task):"},{"line_number":396,"context_line":"    LOG.debug(\u0027Sending RPC to conductor to resume cleaning for node %s\u0027,"},{"line_number":397,"context_line":"              task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_169ee7b7","line":394,"updated":"2016-07-11 16:17:59.000000000","message":"I\u0027d prefer all the copypaste to be moved to some common module, likely deploy_utils, but that\u0027s not a blocker for me :)","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":10391,"name":"Ihor Kalnytskyi","email":"ihor@kalnytskyi.com","username":"ikalnitsky"},"change_message_id":"9c0981e0a90ec84d8ddf7a779fe8538b5f63c51d","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        try:"},{"line_number":625,"context_line":"            callback_url \u003d kwargs[\u0027callback_url\u0027]"},{"line_number":626,"context_line":"        except KeyError:"},{"line_number":627,"context_line":"            raise exception.MissingParameterValue(_(\u0027For heartbeat operation, \u0027"},{"line_number":628,"context_line":"                                                    \u0027\"callback_url\" must be \u0027"},{"line_number":629,"context_line":"                                                    \u0027specified.\u0027))"},{"line_number":630,"context_line":"        # use port from netloc?"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_5f31ad0a","line":627,"updated":"2016-07-11 16:33:50.000000000","message":"If I\u0027m not mistaken, \"validate\" method is called before any of \"passthru\" methods. Hence, I think it would be better to check \"callback_url\" for presence there in order to achieve separation of concerns.\n\nExample:\n\n  if method \u003d\u003d \"heartbeat\":\n      if \"callback_url\" not in kwargs:\n          raise exception.MissingParameterValue(...)\n\nOn the other hand, I see that a lot of built-in drivers don\u0027t use \"validate\" method. So what\u0027s the best way to do it?","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        try:"},{"line_number":625,"context_line":"            callback_url \u003d kwargs[\u0027callback_url\u0027]"},{"line_number":626,"context_line":"        except KeyError:"},{"line_number":627,"context_line":"            raise exception.MissingParameterValue(_(\u0027For heartbeat operation, \u0027"},{"line_number":628,"context_line":"                                                    \u0027\"callback_url\" must be \u0027"},{"line_number":629,"context_line":"                                                    \u0027specified.\u0027))"},{"line_number":630,"context_line":"        # use port from netloc?"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_0a96d793","line":627,"in_reply_to":"1aa78d24_5f31ad0a","updated":"2016-07-15 11:47:39.000000000","message":"There is only one passthru method.","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":628,"context_line":"                                                    \u0027\"callback_url\" must be \u0027"},{"line_number":629,"context_line":"                                                    \u0027specified.\u0027))"},{"line_number":630,"context_line":"        # use port from netloc?"},{"line_number":631,"context_line":"        address \u003d urlparse.urlparse(callback_url).netloc.split(\u0027:\u0027)[0]"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"        if node.provision_state \u003d\u003d states.DEPLOYWAIT:"},{"line_number":634,"context_line":"            task.process_event(\u0027resume\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_31e96d1b","line":631,"updated":"2016-07-11 16:17:59.000000000","message":"Um, there is port attribute already.","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":628,"context_line":"                                                    \u0027\"callback_url\" must be \u0027"},{"line_number":629,"context_line":"                                                    \u0027specified.\u0027))"},{"line_number":630,"context_line":"        # use port from netloc?"},{"line_number":631,"context_line":"        address \u003d urlparse.urlparse(callback_url).netloc.split(\u0027:\u0027)[0]"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"        if node.provision_state \u003d\u003d states.DEPLOYWAIT:"},{"line_number":634,"context_line":"            task.process_event(\u0027resume\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_ea76eb3d","line":631,"in_reply_to":"1aa78d24_31e96d1b","updated":"2016-07-15 11:47:39.000000000","message":"I think \"ssh_port\" option should be added to driver properties in the future.","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[{"line_number":57,"context_line":"               help\u003d_(\u0027Extra arguments to pass on every \u0027"},{"line_number":58,"context_line":"                      \u0027invocation of Ansible.\u0027)),"},{"line_number":59,"context_line":"    cfg.IntOpt(\u0027verbosity\u0027,"},{"line_number":60,"context_line":"               default\u003d0, min\u003d0, max\u003d4,"},{"line_number":61,"context_line":"               help\u003d_(\u0027Set ansible verbosity level. \u0027"},{"line_number":62,"context_line":"                      \u00274 includes detailed SSH debug logging. \u0027"},{"line_number":63,"context_line":"                      \u0027If set, this setting takes precedence over \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_ffdd1943","line":60,"updated":"2016-07-19 09:56:05.000000000","message":"I wonder if we want a higher default... something corresponding to INFO level","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[{"line_number":57,"context_line":"               help\u003d_(\u0027Extra arguments to pass on every \u0027"},{"line_number":58,"context_line":"                      \u0027invocation of Ansible.\u0027)),"},{"line_number":59,"context_line":"    cfg.IntOpt(\u0027verbosity\u0027,"},{"line_number":60,"context_line":"               default\u003d0, min\u003d0, max\u003d4,"},{"line_number":61,"context_line":"               help\u003d_(\u0027Set ansible verbosity level. \u0027"},{"line_number":62,"context_line":"                      \u00274 includes detailed SSH debug logging. \u0027"},{"line_number":63,"context_line":"                      \u0027If set, this setting takes precedence over \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_5eb21595","line":60,"in_reply_to":"dada55a8_ffdd1943","updated":"2016-07-20 16:57:23.000000000","message":"This is ansible verbosity, default like INFO here.","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                        ) % DEFAULT_PLAYBOOKS[\u0027clean\u0027],"},{"line_number":121,"context_line":"    \u0027clean_steps_config\u0027: _(\u0027Name of the file with default cleaning steps \u0027"},{"line_number":122,"context_line":"                            \u0027configuration. Default is %s. Optional\u0027"},{"line_number":123,"context_line":"                            ) % DEFAULT_CLEAN_STEPS"},{"line_number":124,"context_line":"}"},{"line_number":125,"context_line":"COMMON_PROPERTIES \u003d REQUIRED_PROPERTIES"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_dfe015fd","line":123,"updated":"2016-07-19 09:56:05.000000000","message":"properties are stored in driver_info and should be prefixed with your driver name, i.e. ansible_...","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                        ) % DEFAULT_PLAYBOOKS[\u0027clean\u0027],"},{"line_number":121,"context_line":"    \u0027clean_steps_config\u0027: _(\u0027Name of the file with default cleaning steps \u0027"},{"line_number":122,"context_line":"                            \u0027configuration. Default is %s. Optional\u0027"},{"line_number":123,"context_line":"                            ) % DEFAULT_CLEAN_STEPS"},{"line_number":124,"context_line":"}"},{"line_number":125,"context_line":"COMMON_PROPERTIES \u003d REQUIRED_PROPERTIES"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_246c70cf","line":123,"in_reply_to":"dada55a8_dfe015fd","updated":"2016-07-20 16:57:23.000000000","message":"Done","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    playbook \u003d node.driver_info.get(\u0027%s_playbook\u0027 % action, default_playbook)"},{"line_number":137,"context_line":"    if not playbook:"},{"line_number":138,"context_line":"        raise exception.IronicException("},{"line_number":139,"context_line":"            message\u003d\u0027Failed to set ansible playbook for action %(action)s\u0027,"},{"line_number":140,"context_line":"            action\u003daction)"},{"line_number":141,"context_line":"    return playbook, user, key"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_3fe851e2","line":139,"updated":"2016-07-19 09:56:05.000000000","message":"this needs _()","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    playbook \u003d node.driver_info.get(\u0027%s_playbook\u0027 % action, default_playbook)"},{"line_number":137,"context_line":"    if not playbook:"},{"line_number":138,"context_line":"        raise exception.IronicException("},{"line_number":139,"context_line":"            message\u003d\u0027Failed to set ansible playbook for action %(action)s\u0027,"},{"line_number":140,"context_line":"            action\u003daction)"},{"line_number":141,"context_line":"    return playbook, user, key"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_84b43c35","line":139,"in_reply_to":"dada55a8_3fe851e2","updated":"2016-07-20 16:57:23.000000000","message":"Done","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"# some good code from agent"},{"line_number":195,"context_line":"def _reboot_and_finish_deploy(task):"},{"line_number":196,"context_line":"    wait \u003d CONF.ansible.post_deploy_get_power_state_retry_interval * 1000"},{"line_number":197,"context_line":"    attempts \u003d CONF.ansible.post_deploy_get_power_state_retries + 1"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_1fe3cd06","line":195,"updated":"2016-07-19 09:56:05.000000000","message":"what about just calling into ironic here? otherwise you\u0027re missing things like network separation","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"# some good code from agent"},{"line_number":195,"context_line":"def _reboot_and_finish_deploy(task):"},{"line_number":196,"context_line":"    wait \u003d CONF.ansible.post_deploy_get_power_state_retry_interval * 1000"},{"line_number":197,"context_line":"    attempts \u003d CONF.ansible.post_deploy_get_power_state_retries + 1"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_6f2801e3","line":195,"in_reply_to":"dada55a8_1fe3cd06","updated":"2016-07-20 16:57:23.000000000","message":"This is AgentDeployMixin (after refactoring) method in Ironic and not needed here (it creates also IPA client instance), and it uses IPA method for soft off.","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        out, err \u003d utils.execute(*args)"},{"line_number":259,"context_line":"        return out, err"},{"line_number":260,"context_line":"    except processutils.ProcessExecutionError as e:"},{"line_number":261,"context_line":"        raise exception.InstanceDeployFailure(reason\u003dsix.text_type(e))"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"def _calculate_memory_req(task):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_7ff2c9d3","line":261,"updated":"2016-07-19 09:56:05.000000000","message":"six.text_type is not needed","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        out, err \u003d utils.execute(*args)"},{"line_number":259,"context_line":"        return out, err"},{"line_number":260,"context_line":"    except processutils.ProcessExecutionError as e:"},{"line_number":261,"context_line":"        raise exception.InstanceDeployFailure(reason\u003dsix.text_type(e))"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"def _calculate_memory_req(task):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_84a55c48","line":261,"in_reply_to":"dada55a8_7ff2c9d3","updated":"2016-07-20 16:57:23.000000000","message":"Done","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        try:"},{"line_number":286,"context_line":"            i_info[param] \u003d int(i_info[param])"},{"line_number":287,"context_line":"        except ValueError:"},{"line_number":288,"context_line":"            reason \u003d _(\"%s is not an integer value.\") % i_info[param]"},{"line_number":289,"context_line":"            raise exception.InvalidParameterValue(err_msg_invalid %"},{"line_number":290,"context_line":"                                                  {\u0027param\u0027: param,"},{"line_number":291,"context_line":"                                                   \u0027reason\u0027: reason})"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_5fed45ee","line":288,"updated":"2016-07-19 09:56:05.000000000","message":"not dot in the end please","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        try:"},{"line_number":286,"context_line":"            i_info[param] \u003d int(i_info[param])"},{"line_number":287,"context_line":"        except ValueError:"},{"line_number":288,"context_line":"            reason \u003d _(\"%s is not an integer value.\") % i_info[param]"},{"line_number":289,"context_line":"            raise exception.InvalidParameterValue(err_msg_invalid %"},{"line_number":290,"context_line":"                                                  {\u0027param\u0027: param,"},{"line_number":291,"context_line":"                                                   \u0027reason\u0027: reason})"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_043e8cd9","line":288,"in_reply_to":"dada55a8_5fed45ee","updated":"2016-07-20 16:57:23.000000000","message":"Done","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[{"line_number":391,"context_line":""},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"# taken from agent driver"},{"line_number":394,"context_line":"def _notify_conductor_resume_clean(task):"},{"line_number":395,"context_line":"    LOG.debug(\u0027Sending RPC to conductor to resume cleaning for node %s\u0027,"},{"line_number":396,"context_line":"              task.node.uuid)"},{"line_number":397,"context_line":"    uuid \u003d task.node.uuid"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_bfba81df","line":394,"updated":"2016-07-19 09:56:05.000000000","message":"ditto","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[{"line_number":391,"context_line":""},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"# taken from agent driver"},{"line_number":394,"context_line":"def _notify_conductor_resume_clean(task):"},{"line_number":395,"context_line":"    LOG.debug(\u0027Sending RPC to conductor to resume cleaning for node %s\u0027,"},{"line_number":396,"context_line":"              task.node.uuid)"},{"line_number":397,"context_line":"    uuid \u003d task.node.uuid"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_ca3d9b90","line":394,"in_reply_to":"dada55a8_bfba81df","updated":"2016-07-20 16:57:23.000000000","message":"Can be done after your nice refactoring.","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[{"line_number":430,"context_line":"    extra_vars \u003d _prepare_extra_vars(node_list, variables\u003dvariables)"},{"line_number":431,"context_line":"    notags \u003d [\u0027parted\u0027] if iwdi else []"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    LOG.info(_LI(\u0027Starting deploy on node %s\u0027), node.uuid)"},{"line_number":434,"context_line":"    _run_playbook(playbook, extra_vars, key, notags\u003dnotags)"},{"line_number":435,"context_line":"    LOG.info(_LI(\u0027Ansible complete deploy on node %s\u0027), node.uuid)"},{"line_number":436,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_9fbdfdd9","line":433,"updated":"2016-07-19 09:56:05.000000000","message":"should be LOG.debug (as usual with everything ***ing)","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[{"line_number":430,"context_line":"    extra_vars \u003d _prepare_extra_vars(node_list, variables\u003dvariables)"},{"line_number":431,"context_line":"    notags \u003d [\u0027parted\u0027] if iwdi else []"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    LOG.info(_LI(\u0027Starting deploy on node %s\u0027), node.uuid)"},{"line_number":434,"context_line":"    _run_playbook(playbook, extra_vars, key, notags\u003dnotags)"},{"line_number":435,"context_line":"    LOG.info(_LI(\u0027Ansible complete deploy on node %s\u0027), node.uuid)"},{"line_number":436,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_0a5b33f7","line":433,"in_reply_to":"dada55a8_9fbdfdd9","updated":"2016-07-20 16:57:23.000000000","message":"Done","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[{"line_number":573,"context_line":"        node_list \u003d [(node.uuid, ip_addr, user)]"},{"line_number":574,"context_line":"        extra_vars \u003d _prepare_extra_vars(node_list)"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":"        LOG.info(_LI(\u0027Wait ramdisk on node %s for cleaning\u0027), node.uuid)"},{"line_number":577,"context_line":"        _run_playbook(playbook, extra_vars, key, tags\u003d[\u0027wait\u0027])"},{"line_number":578,"context_line":"        LOG.info(_LI(\u0027Node %s is ready for cleaning\u0027), node.uuid)"},{"line_number":579,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_ffb4f9f2","line":576,"updated":"2016-07-19 09:56:05.000000000","message":"I think it should be debug","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[{"line_number":573,"context_line":"        node_list \u003d [(node.uuid, ip_addr, user)]"},{"line_number":574,"context_line":"        extra_vars \u003d _prepare_extra_vars(node_list)"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":"        LOG.info(_LI(\u0027Wait ramdisk on node %s for cleaning\u0027), node.uuid)"},{"line_number":577,"context_line":"        _run_playbook(playbook, extra_vars, key, tags\u003d[\u0027wait\u0027])"},{"line_number":578,"context_line":"        LOG.info(_LI(\u0027Node %s is ready for cleaning\u0027), node.uuid)"},{"line_number":579,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_8afe03ac","line":576,"in_reply_to":"dada55a8_ffb4f9f2","updated":"2016-07-20 16:57:23.000000000","message":"Done","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[{"line_number":615,"context_line":""},{"line_number":616,"context_line":"    @base.passthru([\u0027POST\u0027])"},{"line_number":617,"context_line":"    @task_manager.require_exclusive_lock"},{"line_number":618,"context_line":"    def heartbeat(self, task, **kwargs):"},{"line_number":619,"context_line":"        \"\"\"Method for ansible ramdisk callback.\"\"\""},{"line_number":620,"context_line":"        node \u003d task.node"},{"line_number":621,"context_line":"        LOG.debug(\u0027Call back from %(node)s.\u0027, {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_dfb775f3","line":618,"updated":"2016-07-19 09:56:05.000000000","message":"it\u0027s sad we have to do it, I\u0027d prefer this new driver to implement new API instead...","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[{"line_number":615,"context_line":""},{"line_number":616,"context_line":"    @base.passthru([\u0027POST\u0027])"},{"line_number":617,"context_line":"    @task_manager.require_exclusive_lock"},{"line_number":618,"context_line":"    def heartbeat(self, task, **kwargs):"},{"line_number":619,"context_line":"        \"\"\"Method for ansible ramdisk callback.\"\"\""},{"line_number":620,"context_line":"        node \u003d task.node"},{"line_number":621,"context_line":"        LOG.debug(\u0027Call back from %(node)s.\u0027, {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_6ae90fe6","line":618,"in_reply_to":"dada55a8_dfb775f3","updated":"2016-07-20 16:57:23.000000000","message":"Agree, will be done quickly after merging of new API into Ironic.","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"56f34c31b00bfce21f051efd66fafdc38c84b992","unresolved":false,"context_lines":[{"line_number":60,"context_line":"               help\u003d_(\u0027Set ansible verbosity level requested when invoking \u0027"},{"line_number":61,"context_line":"                      \u0027\"ansible-playbook\" command. \u0027"},{"line_number":62,"context_line":"                      \u00274 includes detailed SSH session logging. \u0027"},{"line_number":63,"context_line":"                      \u0027Default means 4 when global debug is enabled \u0027"},{"line_number":64,"context_line":"                      \u0027and 0 otherwise.\u0027)),"},{"line_number":65,"context_line":"    cfg.StrOpt(\u0027ansible_playbook_script\u0027,"},{"line_number":66,"context_line":"               default\u003d\u0027ansible-playbook\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_9a759699","line":63,"range":{"start_line":63,"start_character":31,"end_line":63,"end_character":36},"updated":"2016-08-30 10:08:04.000000000","message":"s/means/is","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":60,"context_line":"               help\u003d_(\u0027Set ansible verbosity level requested when invoking \u0027"},{"line_number":61,"context_line":"                      \u0027\"ansible-playbook\" command. \u0027"},{"line_number":62,"context_line":"                      \u00274 includes detailed SSH session logging. \u0027"},{"line_number":63,"context_line":"                      \u0027Default means 4 when global debug is enabled \u0027"},{"line_number":64,"context_line":"                      \u0027and 0 otherwise.\u0027)),"},{"line_number":65,"context_line":"    cfg.StrOpt(\u0027ansible_playbook_script\u0027,"},{"line_number":66,"context_line":"               default\u003d\u0027ansible-playbook\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_7508b928","line":63,"range":{"start_line":63,"start_character":31,"end_line":63,"end_character":36},"in_reply_to":"fa7ab95a_9a759699","updated":"2016-08-31 10:32:05.000000000","message":"Done","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"56f34c31b00bfce21f051efd66fafdc38c84b992","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                      \u0027power state after trigger soft poweroff.\u0027)),"},{"line_number":90,"context_line":"    cfg.IntOpt(\u0027extra_memory\u0027,"},{"line_number":91,"context_line":"               default\u003d10,"},{"line_number":92,"context_line":"               help\u003d_(\u0027The memory amount in MiB: free memory minus image \u0027"},{"line_number":93,"context_line":"                      \u0027size.\u0027)),"},{"line_number":94,"context_line":"    cfg.BoolOpt(\u0027use_ramdisk_callback\u0027,"},{"line_number":95,"context_line":"                default\u003dTrue,"},{"line_number":96,"context_line":"                help\u003d_(\u0027Use callback request from ramdisk for start deploy or \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_1ac6e699","line":93,"range":{"start_line":92,"start_character":22,"end_line":93,"end_character":29},"updated":"2016-08-30 10:08:04.000000000","message":"Seems to be incorrect, this is an image size. the fact that usabel amount of memory is considered to be total memory minus this should go to the docs instead.","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                      \u0027power state after trigger soft poweroff.\u0027)),"},{"line_number":90,"context_line":"    cfg.IntOpt(\u0027extra_memory\u0027,"},{"line_number":91,"context_line":"               default\u003d10,"},{"line_number":92,"context_line":"               help\u003d_(\u0027The memory amount in MiB: free memory minus image \u0027"},{"line_number":93,"context_line":"                      \u0027size.\u0027)),"},{"line_number":94,"context_line":"    cfg.BoolOpt(\u0027use_ramdisk_callback\u0027,"},{"line_number":95,"context_line":"                default\u003dTrue,"},{"line_number":96,"context_line":"                help\u003d_(\u0027Use callback request from ramdisk for start deploy or \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_95dffd38","line":93,"range":{"start_line":92,"start_character":22,"end_line":93,"end_character":29},"in_reply_to":"fa7ab95a_1ac6e699","updated":"2016-08-31 10:32:05.000000000","message":"Done","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"56f34c31b00bfce21f051efd66fafdc38c84b992","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    cfg.BoolOpt(\u0027use_ramdisk_callback\u0027,"},{"line_number":95,"context_line":"                default\u003dTrue,"},{"line_number":96,"context_line":"                help\u003d_(\u0027Use callback request from ramdisk for start deploy or \u0027"},{"line_number":97,"context_line":"                       \u0027cleaning.\u0027)),"},{"line_number":98,"context_line":"]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"CONF.register_opts(ansible_opts, group\u003d\u0027ansible\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_1a4d063e","line":97,"updated":"2016-08-30 10:08:04.000000000","message":"IIUC the only reason to disable this is for custom ramdisks, please mention it too.","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    cfg.BoolOpt(\u0027use_ramdisk_callback\u0027,"},{"line_number":95,"context_line":"                default\u003dTrue,"},{"line_number":96,"context_line":"                help\u003d_(\u0027Use callback request from ramdisk for start deploy or \u0027"},{"line_number":97,"context_line":"                       \u0027cleaning.\u0027)),"},{"line_number":98,"context_line":"]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"CONF.register_opts(ansible_opts, group\u003d\u0027ansible\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_b5ea41d9","line":97,"in_reply_to":"fa7ab95a_1a4d063e","updated":"2016-08-31 10:32:05.000000000","message":"Done","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"56f34c31b00bfce21f051efd66fafdc38c84b992","unresolved":false,"context_lines":[{"line_number":108,"context_line":"}"},{"line_number":109,"context_line":"DEFAULT_CLEAN_STEPS \u003d \u0027clean_steps.yaml\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"REQUIRED_PROPERTIES \u003d {"},{"line_number":112,"context_line":"    \u0027ansible_deploy_username\u0027: _(\u0027Deploy ramdisk username for Ansible. \u0027"},{"line_number":113,"context_line":"                                 \u0027This user must have passwordless sudo \u0027"},{"line_number":114,"context_line":"                                 \u0027permissions. Default is \"ansible\". \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_fa114205","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":19},"updated":"2016-08-30 10:08:04.000000000","message":"These are all optional, why REQUIRED?","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":108,"context_line":"}"},{"line_number":109,"context_line":"DEFAULT_CLEAN_STEPS \u003d \u0027clean_steps.yaml\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"REQUIRED_PROPERTIES \u003d {"},{"line_number":112,"context_line":"    \u0027ansible_deploy_username\u0027: _(\u0027Deploy ramdisk username for Ansible. \u0027"},{"line_number":113,"context_line":"                                 \u0027This user must have passwordless sudo \u0027"},{"line_number":114,"context_line":"                                 \u0027permissions. Default is \"ansible\". \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_f5192923","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":19},"in_reply_to":"fa7ab95a_fa114205","updated":"2016-08-31 10:32:05.000000000","message":"Done","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"56f34c31b00bfce21f051efd66fafdc38c84b992","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            missing.append({\u0027name\u0027: name, \u0027field\u0027: \u0027interface\u0027})"},{"line_number":373,"context_line":"        args \u003d step.get(\u0027args\u0027, {})"},{"line_number":374,"context_line":"        for arg_name, arg in args.items():"},{"line_number":375,"context_line":"            if args.get(\u0027required\u0027, False) and \u0027value\u0027 not in arg:"},{"line_number":376,"context_line":"                missing.append({\u0027name\u0027: name,"},{"line_number":377,"context_line":"                                \u0027field\u0027: \u0027%s.value\u0027 % arg_name})"},{"line_number":378,"context_line":"    if missing:"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_5c294b36","line":375,"range":{"start_line":375,"start_character":15,"end_line":375,"end_character":19},"updated":"2016-08-30 10:08:04.000000000","message":"Should it be arg.get here?","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            missing.append({\u0027name\u0027: name, \u0027field\u0027: \u0027interface\u0027})"},{"line_number":373,"context_line":"        args \u003d step.get(\u0027args\u0027, {})"},{"line_number":374,"context_line":"        for arg_name, arg in args.items():"},{"line_number":375,"context_line":"            if args.get(\u0027required\u0027, False) and \u0027value\u0027 not in arg:"},{"line_number":376,"context_line":"                missing.append({\u0027name\u0027: name,"},{"line_number":377,"context_line":"                                \u0027field\u0027: \u0027%s.value\u0027 % arg_name})"},{"line_number":378,"context_line":"    if missing:"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_78fd106d","line":375,"range":{"start_line":375,"start_character":15,"end_line":375,"end_character":19},"in_reply_to":"fa7ab95a_5c294b36","updated":"2016-08-31 10:32:05.000000000","message":"Done","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"56f34c31b00bfce21f051efd66fafdc38c84b992","unresolved":false,"context_lines":[{"line_number":463,"context_line":""},{"line_number":464,"context_line":"    LOG.debug(\u0027Starting deploy on node %s\u0027, node.uuid)"},{"line_number":465,"context_line":"    try:"},{"line_number":466,"context_line":"        _run_playbook(playbook, extra_vars, key, notags\u003dnotags)"},{"line_number":467,"context_line":"    except exception.InstanceDeployFailure as e:"},{"line_number":468,"context_line":"        deploy_utils.set_failed_state(task, six.text_type(e))"},{"line_number":469,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_14da21e8","line":466,"range":{"start_line":466,"start_character":32,"end_line":466,"end_character":42},"updated":"2016-08-30 10:08:04.000000000","message":"Passing the whole node.extra in might not be a good thing, but maybe that\u0027s OK for an initial implementation.","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":463,"context_line":""},{"line_number":464,"context_line":"    LOG.debug(\u0027Starting deploy on node %s\u0027, node.uuid)"},{"line_number":465,"context_line":"    try:"},{"line_number":466,"context_line":"        _run_playbook(playbook, extra_vars, key, notags\u003dnotags)"},{"line_number":467,"context_line":"    except exception.InstanceDeployFailure as e:"},{"line_number":468,"context_line":"        deploy_utils.set_failed_state(task, six.text_type(e))"},{"line_number":469,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_d587c5b2","line":466,"range":{"start_line":466,"start_character":32,"end_line":466,"end_character":42},"in_reply_to":"fa7ab95a_14da21e8","updated":"2016-08-31 10:32:05.000000000","message":"why not? if playbooks do not use those, they would have no effect. This is mostly meant for heterogeneous parks of nodes with different hardware, and basically sets host_vars for Ansible to use in playbooks.","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"56f34c31b00bfce21f051efd66fafdc38c84b992","unresolved":false,"context_lines":[{"line_number":521,"context_line":"    def prepare(self, task):"},{"line_number":522,"context_line":"        \"\"\"Prepare the deployment environment for this node.\"\"\""},{"line_number":523,"context_line":"        node \u003d task.node"},{"line_number":524,"context_line":"        if node.provision_state !\u003d states.ACTIVE:"},{"line_number":525,"context_line":"            use_callback \u003d CONF.ansible.use_ramdisk_callback"},{"line_number":526,"context_line":"            node.instance_info \u003d build_instance_info_for_deploy(task)"},{"line_number":527,"context_line":"            node.save()"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_e7b26d4b","line":524,"range":{"start_line":524,"start_character":42,"end_line":524,"end_character":48},"updated":"2016-08-30 10:08:04.000000000","message":"in case of adopt state we should not modify instance_info I think, please take a look on how it\u0027s done in e.g. agent deploy driver.","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":521,"context_line":"    def prepare(self, task):"},{"line_number":522,"context_line":"        \"\"\"Prepare the deployment environment for this node.\"\"\""},{"line_number":523,"context_line":"        node \u003d task.node"},{"line_number":524,"context_line":"        if node.provision_state !\u003d states.ACTIVE:"},{"line_number":525,"context_line":"            use_callback \u003d CONF.ansible.use_ramdisk_callback"},{"line_number":526,"context_line":"            node.instance_info \u003d build_instance_info_for_deploy(task)"},{"line_number":527,"context_line":"            node.save()"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_78e6f0e8","line":524,"range":{"start_line":524,"start_character":42,"end_line":524,"end_character":48},"in_reply_to":"fa7ab95a_e7b26d4b","updated":"2016-08-31 10:32:05.000000000","message":"Done","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"56f34c31b00bfce21f051efd66fafdc38c84b992","unresolved":false,"context_lines":[{"line_number":582,"context_line":"                          \"on node %(node)s.\"), {"},{"line_number":583,"context_line":"                              \u0027node\u0027: node.uuid, \u0027step\u0027: stepname})"},{"line_number":584,"context_line":"            manager_utils.cleaning_error_handler(task, six.text_type(e))"},{"line_number":585,"context_line":"        LOG.info(_LI(\u0027Ansible complete cleaning step %(step)s \u0027"},{"line_number":586,"context_line":"                     \u0027on node %(node)s.\u0027),"},{"line_number":587,"context_line":"                 {\u0027node\u0027: node.uuid, \u0027step\u0027: stepname})"},{"line_number":588,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_859ef9b6","line":585,"updated":"2016-08-30 10:08:04.000000000","message":"completed.","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":582,"context_line":"                          \"on node %(node)s.\"), {"},{"line_number":583,"context_line":"                              \u0027node\u0027: node.uuid, \u0027step\u0027: stepname})"},{"line_number":584,"context_line":"            manager_utils.cleaning_error_handler(task, six.text_type(e))"},{"line_number":585,"context_line":"        LOG.info(_LI(\u0027Ansible complete cleaning step %(step)s \u0027"},{"line_number":586,"context_line":"                     \u0027on node %(node)s.\u0027),"},{"line_number":587,"context_line":"                 {\u0027node\u0027: node.uuid, \u0027step\u0027: stepname})"},{"line_number":588,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_d57505cb","line":585,"in_reply_to":"fa7ab95a_859ef9b6","updated":"2016-08-31 10:32:05.000000000","message":"Done","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"56f34c31b00bfce21f051efd66fafdc38c84b992","unresolved":false,"context_lines":[{"line_number":620,"context_line":"        node_list \u003d [(node.uuid, ip_addr, user, node.extra)]"},{"line_number":621,"context_line":"        extra_vars \u003d _prepare_extra_vars(node_list)"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"        LOG.debug(\u0027Wait ramdisk on node %s for cleaning\u0027, node.uuid)"},{"line_number":624,"context_line":"        _run_playbook(playbook, extra_vars, key, tags\u003d[\u0027wait\u0027])"},{"line_number":625,"context_line":"        LOG.info(_LI(\u0027Node %s is ready for cleaning\u0027), node.uuid)"},{"line_number":626,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_65e2d530","line":623,"updated":"2016-08-30 10:08:04.000000000","message":"waiting","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":620,"context_line":"        node_list \u003d [(node.uuid, ip_addr, user, node.extra)]"},{"line_number":621,"context_line":"        extra_vars \u003d _prepare_extra_vars(node_list)"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"        LOG.debug(\u0027Wait ramdisk on node %s for cleaning\u0027, node.uuid)"},{"line_number":624,"context_line":"        _run_playbook(playbook, extra_vars, key, tags\u003d[\u0027wait\u0027])"},{"line_number":625,"context_line":"        LOG.info(_LI(\u0027Node %s is ready for cleaning\u0027), node.uuid)"},{"line_number":626,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_b83dd8c5","line":623,"in_reply_to":"fa7ab95a_65e2d530","updated":"2016-08-31 10:32:05.000000000","message":"Done","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"72af26c36943ecfee1ed07be130c8da5cd6475d6","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        # deal with nodes in DEPLOYING state here."},{"line_number":528,"context_line":"        if node.provision_state not in [states.ACTIVE, states.ADOPTING]:"},{"line_number":529,"context_line":"            use_callback \u003d CONF.ansible.use_ramdisk_callback"},{"line_number":530,"context_line":"            node.instance_info \u003d build_instance_info_for_deploy(task)"},{"line_number":531,"context_line":"            node.save()"},{"line_number":532,"context_line":"            boot_opt \u003d _build_ramdisk_options(node) if use_callback else {}"},{"line_number":533,"context_line":"            task.driver.boot.prepare_ramdisk(task, boot_opt)"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_86cf78b2","line":530,"updated":"2016-08-31 16:20:13.000000000","message":"We don\u0027t switch to provision network here. Please either add it here now, or some time later, saying that multitenancy is not supported for now in reno/docs.","commit_id":"8eb5310281b61aa83eeafba33c2d990f59bd50e2"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4d035d9a9d2c16fb45690b552dfd3857adb6c6e1","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        # deal with nodes in DEPLOYING state here."},{"line_number":528,"context_line":"        if node.provision_state not in [states.ACTIVE, states.ADOPTING]:"},{"line_number":529,"context_line":"            use_callback \u003d CONF.ansible.use_ramdisk_callback"},{"line_number":530,"context_line":"            node.instance_info \u003d build_instance_info_for_deploy(task)"},{"line_number":531,"context_line":"            node.save()"},{"line_number":532,"context_line":"            boot_opt \u003d _build_ramdisk_options(node) if use_callback else {}"},{"line_number":533,"context_line":"            task.driver.boot.prepare_ramdisk(task, boot_opt)"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_98aa7084","line":530,"in_reply_to":"fa7ab95a_86cf78b2","updated":"2016-08-31 18:31:54.000000000","message":"added appropriate multi-tenancy support in the next patch set,\nplease review","commit_id":"8eb5310281b61aa83eeafba33c2d990f59bd50e2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b47db8973a00d336fefae59c074b36a68c3bc5ab","unresolved":false,"context_lines":[{"line_number":463,"context_line":"        notags.append(\u0027parted\u0027)"},{"line_number":464,"context_line":"    else:"},{"line_number":465,"context_line":"        variables.update(_parse_partitioning_info(task.node))"},{"line_number":466,"context_line":"        if deploy_utils.get_boot_option(node) !\u003d \"local\":"},{"line_number":467,"context_line":"            notags.append(\u0027localboot\u0027)"},{"line_number":468,"context_line":"    playbook, user, key \u003d _parse_ansible_driver_info(task.node)"},{"line_number":469,"context_line":"    node_list \u003d [(node.uuid, node_address, user, node.extra)]"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa7ab95a_052cc200","line":466,"updated":"2016-09-02 13:46:57.000000000","message":"LGTM apart from this strange thing and another entry in the playbook.","commit_id":"5956cf34bbd7c745e62c1939df090bfc9ba699ba"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"cbcc261355620b346f783d7cf0045cff49534a01","unresolved":false,"context_lines":[{"line_number":463,"context_line":"        notags.append(\u0027parted\u0027)"},{"line_number":464,"context_line":"    else:"},{"line_number":465,"context_line":"        variables.update(_parse_partitioning_info(task.node))"},{"line_number":466,"context_line":"        if deploy_utils.get_boot_option(node) !\u003d \"local\":"},{"line_number":467,"context_line":"            notags.append(\u0027localboot\u0027)"},{"line_number":468,"context_line":"    playbook, user, key \u003d _parse_ansible_driver_info(task.node)"},{"line_number":469,"context_line":"    node_list \u003d [(node.uuid, node_address, user, node.extra)]"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa7ab95a_4b46db7b","line":466,"in_reply_to":"fa7ab95a_052cc200","updated":"2016-09-02 14:18:47.000000000","message":"yep, leftover from experiments with localboot, removed","commit_id":"5956cf34bbd7c745e62c1939df090bfc9ba699ba"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"31d95f904088911cfae2c229dfc9b50b40776879","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                   os.path.dirname(__file__), \u0027playbooks\u0027, \u0027ansible.cfg\u0027),"},{"line_number":79,"context_line":"               help\u003d_(\u0027Path to ansible configuration file. If set to empty, \u0027"},{"line_number":80,"context_line":"                      \u0027system default will be used.\u0027)),"},{"line_number":81,"context_line":"    cfg.IntOpt(\u0027post_deploy_get_power_state_retries\u0027,"},{"line_number":82,"context_line":"               default\u003d6,"},{"line_number":83,"context_line":"               help\u003d_(\u0027Number of times to retry getting power state to check \u0027"},{"line_number":84,"context_line":"                      \u0027if bare metal node has been powered off after a soft \u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"da7fb54a_0781da4a","line":81,"updated":"2016-09-02 16:00:25.000000000","message":"min should be defined to prohibit setting \u003c0 values","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                   os.path.dirname(__file__), \u0027playbooks\u0027, \u0027ansible.cfg\u0027),"},{"line_number":79,"context_line":"               help\u003d_(\u0027Path to ansible configuration file. If set to empty, \u0027"},{"line_number":80,"context_line":"                      \u0027system default will be used.\u0027)),"},{"line_number":81,"context_line":"    cfg.IntOpt(\u0027post_deploy_get_power_state_retries\u0027,"},{"line_number":82,"context_line":"               default\u003d6,"},{"line_number":83,"context_line":"               help\u003d_(\u0027Number of times to retry getting power state to check \u0027"},{"line_number":84,"context_line":"                      \u0027if bare metal node has been powered off after a soft \u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_55aa4771","line":81,"in_reply_to":"da7fb54a_0781da4a","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"31d95f904088911cfae2c229dfc9b50b40776879","unresolved":false,"context_lines":[{"line_number":83,"context_line":"               help\u003d_(\u0027Number of times to retry getting power state to check \u0027"},{"line_number":84,"context_line":"                      \u0027if bare metal node has been powered off after a soft \u0027"},{"line_number":85,"context_line":"                      \u0027power off.\u0027)),"},{"line_number":86,"context_line":"    cfg.IntOpt(\u0027post_deploy_get_power_state_retry_interval\u0027,"},{"line_number":87,"context_line":"               default\u003d5,"},{"line_number":88,"context_line":"               help\u003d_(\u0027Amount of time (in seconds) to wait between polling \u0027"},{"line_number":89,"context_line":"                      \u0027power state after trigger soft poweroff.\u0027)),"}],"source_content_type":"text/x-python","patch_set":23,"id":"da7fb54a_4793e2a3","line":86,"updated":"2016-09-02 16:00:25.000000000","message":"ditto","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":83,"context_line":"               help\u003d_(\u0027Number of times to retry getting power state to check \u0027"},{"line_number":84,"context_line":"                      \u0027if bare metal node has been powered off after a soft \u0027"},{"line_number":85,"context_line":"                      \u0027power off.\u0027)),"},{"line_number":86,"context_line":"    cfg.IntOpt(\u0027post_deploy_get_power_state_retry_interval\u0027,"},{"line_number":87,"context_line":"               default\u003d5,"},{"line_number":88,"context_line":"               help\u003d_(\u0027Amount of time (in seconds) to wait between polling \u0027"},{"line_number":89,"context_line":"                      \u0027power state after trigger soft poweroff.\u0027)),"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_95ba0fbf","line":86,"in_reply_to":"da7fb54a_4793e2a3","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"47b9c46b96d809f61542d394aa340321f7490643","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                default\u003dTrue,"},{"line_number":97,"context_line":"                help\u003d_(\u0027Use callback request from ramdisk for start deploy or \u0027"},{"line_number":98,"context_line":"                       \u0027cleaning. Disable it when using custom ramdisk \u0027"},{"line_number":99,"context_line":"                       \u0027without callback script.\u0027)),"},{"line_number":100,"context_line":"]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"CONF.register_opts(ansible_opts, group\u003d\u0027ansible\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a89bdaa_4279b0f5","line":99,"updated":"2016-09-06 14:32:03.000000000","message":"OpenStack neutron service is mandatory if callback not used. And maybe deprecate this option?","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                default\u003dTrue,"},{"line_number":97,"context_line":"                help\u003d_(\u0027Use callback request from ramdisk for start deploy or \u0027"},{"line_number":98,"context_line":"                       \u0027cleaning. Disable it when using custom ramdisk \u0027"},{"line_number":99,"context_line":"                       \u0027without callback script.\u0027)),"},{"line_number":100,"context_line":"]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"CONF.register_opts(ansible_opts, group\u003d\u0027ansible\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_d5b497d2","line":99,"in_reply_to":"9a89bdaa_4279b0f5","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"47b9c46b96d809f61542d394aa340321f7490643","unresolved":false,"context_lines":[{"line_number":145,"context_line":"    playbook \u003d node.driver_info.get(\u0027ansible_%s_playbook\u0027 % action,"},{"line_number":146,"context_line":"                                    DEFAULT_PLAYBOOKS.get(action))"},{"line_number":147,"context_line":"    if not playbook:"},{"line_number":148,"context_line":"        raise exception.IronicException("},{"line_number":149,"context_line":"            message\u003d_(\u0027Failed to set ansible playbook for action %(action)s\u0027),"},{"line_number":150,"context_line":"            action\u003daction)"},{"line_number":151,"context_line":"    return playbook, user, key"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a89bdaa_2d101d4e","line":148,"updated":"2016-09-06 14:32:03.000000000","message":"Better create custom exception for this case.","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":145,"context_line":"    playbook \u003d node.driver_info.get(\u0027ansible_%s_playbook\u0027 % action,"},{"line_number":146,"context_line":"                                    DEFAULT_PLAYBOOKS.get(action))"},{"line_number":147,"context_line":"    if not playbook:"},{"line_number":148,"context_line":"        raise exception.IronicException("},{"line_number":149,"context_line":"            message\u003d_(\u0027Failed to set ansible playbook for action %(action)s\u0027),"},{"line_number":150,"context_line":"            action\u003daction)"},{"line_number":151,"context_line":"    return playbook, user, key"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_084d016c","line":148,"in_reply_to":"9a89bdaa_2d101d4e","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"77b2dc0949ae8eb1f2d55ca2391b165f7d9cd336","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    return ip_addrs[0]"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"# some good code from agent"},{"line_number":205,"context_line":"def _reboot_and_finish_deploy(task):"},{"line_number":206,"context_line":"    wait \u003d CONF.ansible.post_deploy_get_power_state_retry_interval * 1000"},{"line_number":207,"context_line":"    attempts \u003d CONF.ansible.post_deploy_get_power_state_retries + 1"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a89bdaa_d2d53ce5","line":204,"range":{"start_line":204,"start_character":0,"end_line":204,"end_character":27},"updated":"2016-09-13 12:03:32.000000000","message":"is there a plan in place to making these calls public in ironic and reusing them?","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    return ip_addrs[0]"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"# some good code from agent"},{"line_number":205,"context_line":"def _reboot_and_finish_deploy(task):"},{"line_number":206,"context_line":"    wait \u003d CONF.ansible.post_deploy_get_power_state_retry_interval * 1000"},{"line_number":207,"context_line":"    attempts \u003d CONF.ansible.post_deploy_get_power_state_retries + 1"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_b0e8f9b5","line":204,"range":{"start_line":204,"start_character":0,"end_line":204,"end_character":27},"in_reply_to":"9a89bdaa_d2d53ce5","updated":"2016-09-15 16:40:53.000000000","message":"I am not aware of such plans, but we could surely propose that \n(as well as several other methods/functions copy-pasted here).","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"47b9c46b96d809f61542d394aa340321f7490643","unresolved":false,"context_lines":[{"line_number":279,"context_line":"def _calculate_memory_req(task):"},{"line_number":280,"context_line":"    image_source \u003d task.node.instance_info[\u0027image_source\u0027]"},{"line_number":281,"context_line":"    image_size \u003d images.download_size(task.context, image_source)"},{"line_number":282,"context_line":"    return int(image_size / units.Mi) + CONF.ansible.extra_memory"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"def _parse_partitioning_info(node):"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a89bdaa_cdded13e","line":282,"updated":"2016-09-06 14:32:03.000000000","message":"nit: int() not needed if change to integer division (//).","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":279,"context_line":"def _calculate_memory_req(task):"},{"line_number":280,"context_line":"    image_source \u003d task.node.instance_info[\u0027image_source\u0027]"},{"line_number":281,"context_line":"    image_size \u003d images.download_size(task.context, image_source)"},{"line_number":282,"context_line":"    return int(image_size / units.Mi) + CONF.ansible.extra_memory"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"def _parse_partitioning_info(node):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_48838956","line":282,"in_reply_to":"9a89bdaa_cdded13e","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"47b9c46b96d809f61542d394aa340321f7490643","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    ephemeral_mib \u003d 1024 * i_info.pop(\u0027ephemeral_gb\u0027)"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    partitions \u003d ["},{"line_number":313,"context_line":"        dict(name\u003d\u0027root\u0027,"},{"line_number":314,"context_line":"             size_mib\u003droot_mib,"},{"line_number":315,"context_line":"             boot\u003d\u0027yes\u0027,"},{"line_number":316,"context_line":"             swap\u003d\u0027no\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a89bdaa_4ddd610d","line":313,"updated":"2016-09-06 14:32:03.000000000","message":"nit: in ironic practice we use {k: v, ...} for creating dicts in place.","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    ephemeral_mib \u003d 1024 * i_info.pop(\u0027ephemeral_gb\u0027)"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    partitions \u003d ["},{"line_number":313,"context_line":"        dict(name\u003d\u0027root\u0027,"},{"line_number":314,"context_line":"             size_mib\u003droot_mib,"},{"line_number":315,"context_line":"             boot\u003d\u0027yes\u0027,"},{"line_number":316,"context_line":"             swap\u003d\u0027no\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_c8cb1952","line":313,"in_reply_to":"9a89bdaa_4ddd610d","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"77b2dc0949ae8eb1f2d55ca2391b165f7d9cd336","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                                \u0027field\u0027: \u0027%s.value\u0027 % arg_name})"},{"line_number":388,"context_line":"    if missing:"},{"line_number":389,"context_line":"        err_string \u003d \u0027, \u0027.join("},{"line_number":390,"context_line":"            [\u0027name %(name)s, field %(field)s\u0027 % i for i in missing])"},{"line_number":391,"context_line":"        msg \u003d _(\"Malformed clean_steps file: %s\") % err_string"},{"line_number":392,"context_line":"        LOG.error(msg)"},{"line_number":393,"context_line":"        raise exception.NodeCleaningFailure(node\u003dnode_uuid,"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a89bdaa_128ec42d","line":390,"updated":"2016-09-13 12:03:32.000000000","message":"nit: [] is redundant","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                                \u0027field\u0027: \u0027%s.value\u0027 % arg_name})"},{"line_number":388,"context_line":"    if missing:"},{"line_number":389,"context_line":"        err_string \u003d \u0027, \u0027.join("},{"line_number":390,"context_line":"            [\u0027name %(name)s, field %(field)s\u0027 % i for i in missing])"},{"line_number":391,"context_line":"        msg \u003d _(\"Malformed clean_steps file: %s\") % err_string"},{"line_number":392,"context_line":"        LOG.error(msg)"},{"line_number":393,"context_line":"        raise exception.NodeCleaningFailure(node\u003dnode_uuid,"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_a8ec0d90","line":390,"in_reply_to":"9a89bdaa_128ec42d","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"77b2dc0949ae8eb1f2d55ca2391b165f7d9cd336","unresolved":false,"context_lines":[{"line_number":403,"context_line":"        with open(path) as f:"},{"line_number":404,"context_line":"            internal_steps \u003d yaml.safe_load(f)"},{"line_number":405,"context_line":"    except Exception as e:"},{"line_number":406,"context_line":"        raise exception.NodeCleaningFailure(node\u003dtask.node.uuid, reason\u003de)"},{"line_number":407,"context_line":"    _validate_clean_steps(internal_steps, task.node.uuid)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    steps \u003d []"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a89bdaa_12bc04ba","line":406,"range":{"start_line":406,"start_character":72,"end_line":406,"end_character":73},"updated":"2016-09-13 12:03:32.000000000","message":"This could use a more detailed error message, e.g.\n\n msg \u003d _(\u0027Failed to load clean steps from file %(file)s: %(exc)s\u0027)","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":403,"context_line":"        with open(path) as f:"},{"line_number":404,"context_line":"            internal_steps \u003d yaml.safe_load(f)"},{"line_number":405,"context_line":"    except Exception as e:"},{"line_number":406,"context_line":"        raise exception.NodeCleaningFailure(node\u003dtask.node.uuid, reason\u003de)"},{"line_number":407,"context_line":"    _validate_clean_steps(internal_steps, task.node.uuid)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    steps \u003d []"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_0b4dfb6b","line":406,"range":{"start_line":406,"start_character":72,"end_line":406,"end_character":73},"in_reply_to":"9a89bdaa_12bc04ba","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"77b2dc0949ae8eb1f2d55ca2391b165f7d9cd336","unresolved":false,"context_lines":[{"line_number":443,"context_line":"    # Need to release the lock to let the conductor take it"},{"line_number":444,"context_line":"    task.release_resources()"},{"line_number":445,"context_line":"    rpc.continue_node_clean(task.context, uuid, topic\u003dtopic)"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"def _build_ramdisk_options(node):"},{"line_number":449,"context_line":"    \"\"\"Build the ramdisk config options for a node.\"\"\""},{"line_number":450,"context_line":"    deploy_options \u003d {"},{"line_number":451,"context_line":"        \u0027deployment_id\u0027: node.uuid,"},{"line_number":452,"context_line":"        \u0027ironic_api_url\u0027: deploy_utils.get_ironic_api_url(),"},{"line_number":453,"context_line":"    }"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"    return deploy_options"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"def _deploy(task, node_address):"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a89bdaa_52d3ecd4","line":455,"range":{"start_line":446,"start_character":0,"end_line":455,"end_character":25},"updated":"2016-09-13 12:03:32.000000000","message":"is it possible to use IPA-compatible options instead? e.g. ipa-api-url. also deployment_id sounds strange to me.","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":443,"context_line":"    # Need to release the lock to let the conductor take it"},{"line_number":444,"context_line":"    task.release_resources()"},{"line_number":445,"context_line":"    rpc.continue_node_clean(task.context, uuid, topic\u003dtopic)"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"def _build_ramdisk_options(node):"},{"line_number":449,"context_line":"    \"\"\"Build the ramdisk config options for a node.\"\"\""},{"line_number":450,"context_line":"    deploy_options \u003d {"},{"line_number":451,"context_line":"        \u0027deployment_id\u0027: node.uuid,"},{"line_number":452,"context_line":"        \u0027ironic_api_url\u0027: deploy_utils.get_ironic_api_url(),"},{"line_number":453,"context_line":"    }"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"    return deploy_options"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"def _deploy(task, node_address):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_b70d4840","line":455,"range":{"start_line":446,"start_character":0,"end_line":455,"end_character":25},"in_reply_to":"9a89bdaa_52d3ecd4","updated":"2016-09-15 16:40:53.000000000","message":"both ironic_api_url and deployment_id are fields present in all Ironic\u0027s boot config templates (ironic/driver/modules/*_config.template) and which are handled correctly by pxe_options in PXE driver.\nIt seems though this is some code crust from \"before lookup\" days as I can\u0027t find them anywhere else except in unit tests.\n\nSo for now I am a bit confused over ironic_api_url vs ipa-api-url, but I could change that to be more compliant with current state of Ironic. OTOH I find ironic_api_url to be a more suiting name, ipa-api-url seems like an address the IPA has to run on (or is it denoting that the API is IPA-compliant, with lookup/heartbeat?).\n\nFor now our ramdisks do not use lookup, only a single heartbeat. That\u0027s why we have to pass the node UUID in, and deployment_id looks like a filed to use for this.\n\nBTW, do you know if it is possible to force IPA to start only the lookup+heartbeater service w/o spinning up the HTTP listener/REST API to save some memory/CPU?\n\nBut even with full IPA we could probably use the IPA ramdisk just for the sake of not duplicating the lookup/heartbeat part given we add SSH server and keys to the image (should be easy for dib and coreos, tinyipa will have lots of quirks to to TC).\nI\u0027ll see what could be done, but in next patches if you do not mind.\n\nUntil then please do not dump deployment_id from Ironic\u0027s boot templates.","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"77b2dc0949ae8eb1f2d55ca2391b165f7d9cd336","unresolved":false,"context_lines":[{"line_number":561,"context_line":"            _get_configdrive_path(task.node.uuid))"},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"    def take_over(self, task):"},{"line_number":564,"context_line":"        pass"},{"line_number":565,"context_line":""},{"line_number":566,"context_line":"    def get_clean_steps(self, task):"},{"line_number":567,"context_line":"        \"\"\"Get the list of clean steps from the file."}],"source_content_type":"text/x-python","patch_set":23,"id":"9a89bdaa_b2a7d84e","line":564,"range":{"start_line":564,"start_character":7,"end_line":564,"end_character":12},"updated":"2016-09-13 12:03:32.000000000","message":"let us raise something here or at least log an exception","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":561,"context_line":"            _get_configdrive_path(task.node.uuid))"},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"    def take_over(self, task):"},{"line_number":564,"context_line":"        pass"},{"line_number":565,"context_line":""},{"line_number":566,"context_line":"    def get_clean_steps(self, task):"},{"line_number":567,"context_line":"        \"\"\"Get the list of clean steps from the file."}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_17699c8b","line":564,"range":{"start_line":564,"start_character":7,"end_line":564,"end_character":12},"in_reply_to":"9a89bdaa_b2a7d84e","updated":"2016-09-15 16:40:53.000000000","message":"adding log.error message","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"77b2dc0949ae8eb1f2d55ca2391b165f7d9cd336","unresolved":false,"context_lines":[{"line_number":597,"context_line":"        node_list \u003d [(node.uuid, ip_addr, user, node.extra)]"},{"line_number":598,"context_line":"        extra_vars \u003d _prepare_extra_vars(node_list)"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        LOG.info(_LI(\u0027Starting cleaning step %(step)s on node %(node)s\u0027),"},{"line_number":601,"context_line":"                 {\u0027node\u0027: node.uuid, \u0027step\u0027: stepname})"},{"line_number":602,"context_line":"        step_tags \u003d step[\u0027args\u0027].get(\u0027tags\u0027, [])"},{"line_number":603,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a89bdaa_9223b4bc","line":600,"range":{"start_line":600,"start_character":22,"end_line":600,"end_character":30},"updated":"2016-09-13 12:03:32.000000000","message":"anything *ing should be LOG.debug","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":597,"context_line":"        node_list \u003d [(node.uuid, ip_addr, user, node.extra)]"},{"line_number":598,"context_line":"        extra_vars \u003d _prepare_extra_vars(node_list)"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        LOG.info(_LI(\u0027Starting cleaning step %(step)s on node %(node)s\u0027),"},{"line_number":601,"context_line":"                 {\u0027node\u0027: node.uuid, \u0027step\u0027: stepname})"},{"line_number":602,"context_line":"        step_tags \u003d step[\u0027args\u0027].get(\u0027tags\u0027, [])"},{"line_number":603,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_3775b897","line":600,"range":{"start_line":600,"start_character":22,"end_line":600,"end_character":30},"in_reply_to":"9a89bdaa_9223b4bc","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"77b2dc0949ae8eb1f2d55ca2391b165f7d9cd336","unresolved":false,"context_lines":[{"line_number":690,"context_line":"                            \"bb62f256f7aa55c292ebeae73ca25a4a9f0ec8c0.\"))"},{"line_number":691,"context_line":"            deploy_utils.set_failed_state(task, error)"},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"    def heartbeat(self, task, callback_url):"},{"line_number":694,"context_line":"        \"\"\"Method for ansible ramdisk callback.\"\"\""},{"line_number":695,"context_line":"        node \u003d task.node"},{"line_number":696,"context_line":"        address \u003d urlparse.urlparse(callback_url).netloc.split(\u0027:\u0027)[0]"},{"line_number":697,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"9a89bdaa_467091a4","line":694,"range":{"start_line":693,"start_character":0,"end_line":694,"end_character":50},"updated":"2016-09-13 12:03:32.000000000","message":"note for the future: we should refactor the base heartbeat, so that drivers don\u0027t have to copy-paste the whole code..","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":690,"context_line":"                            \"bb62f256f7aa55c292ebeae73ca25a4a9f0ec8c0.\"))"},{"line_number":691,"context_line":"            deploy_utils.set_failed_state(task, error)"},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"    def heartbeat(self, task, callback_url):"},{"line_number":694,"context_line":"        \"\"\"Method for ansible ramdisk callback.\"\"\""},{"line_number":695,"context_line":"        node \u003d task.node"},{"line_number":696,"context_line":"        address \u003d urlparse.urlparse(callback_url).netloc.split(\u0027:\u0027)[0]"},{"line_number":697,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_d70f342c","line":694,"range":{"start_line":693,"start_character":0,"end_line":694,"end_character":50},"in_reply_to":"9a89bdaa_467091a4","updated":"2016-09-15 16:40:53.000000000","message":"++, I might start proposing such changes soon.","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"f908dd3a8c281e932ce7adf8ae9163ce7dd434ce","unresolved":false,"context_lines":[{"line_number":673,"context_line":""},{"line_number":674,"context_line":"    # FIXME(pas-ha): remove this workaround after nearest Ironic release"},{"line_number":675,"context_line":"    # that contains the specified commit (next after 6.1.0)"},{"line_number":676,"context_line":"    # and require this Ironic release"},{"line_number":677,"context_line":"    def _upgrade_lock(self, task, purpose\u003dNone):"},{"line_number":678,"context_line":"        try:"},{"line_number":679,"context_line":"            task.upgrade_lock(purpose\u003dpurpose)"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a8bc5a2_21825dc8","line":676,"updated":"2016-09-27 13:01:14.000000000","message":"6.2.0 is already released\n\nhttp://docs.openstack.org/releasenotes/ironic/newton.html","commit_id":"ffd006e098abf32c2d830194fa7fbb778b3b2742"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"f908dd3a8c281e932ce7adf8ae9163ce7dd434ce","unresolved":false,"context_lines":[{"line_number":685,"context_line":""},{"line_number":686,"context_line":"    # FIXME(pas-ha): remove this workaround after nearest Ironic release"},{"line_number":687,"context_line":"    # that contains the specified commit (next after 6.1.0)"},{"line_number":688,"context_line":"    # and require this Ironic release"},{"line_number":689,"context_line":"    def _set_failed_state(self, task, error):"},{"line_number":690,"context_line":"        try:"},{"line_number":691,"context_line":"            deploy_utils.set_failed_state(task, error, collect_logs\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a8bc5a2_4185a9cc","line":688,"updated":"2016-09-27 13:01:14.000000000","message":"ditto","commit_id":"ffd006e098abf32c2d830194fa7fbb778b3b2742"}],"ironic_staging_drivers/ansible/playbooks/ansible.cfg":[{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"31d95f904088911cfae2c229dfc9b50b40776879","unresolved":false,"context_lines":[{"line_number":17,"context_line":"[ssh_connection]"},{"line_number":18,"context_line":"# pipelining greatly increases speed of deployment, disable it only when"},{"line_number":19,"context_line":"# your version of ssh client on ironic node or server in bootstrap image"},{"line_number":20,"context_line":"# do not suport it or if you can not disable \"requiretty\" for the "},{"line_number":21,"context_line":"# passwordless sudoer user in the bootstrap image."},{"line_number":22,"context_line":"# See Ansible documentation for more info:"},{"line_number":23,"context_line":"# http://docs.ansible.com/ansible/intro_configuration.html#pipelining"}],"source_content_type":"text/x-ttcn-cfg","patch_set":23,"id":"fa7ab95a_0b0bf3d6","line":20,"range":{"start_line":20,"start_character":65,"end_line":20,"end_character":66},"updated":"2016-09-02 16:00:25.000000000","message":"big red rectangle","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"31d95f904088911cfae2c229dfc9b50b40776879","unresolved":false,"context_lines":[{"line_number":17,"context_line":"[ssh_connection]"},{"line_number":18,"context_line":"# pipelining greatly increases speed of deployment, disable it only when"},{"line_number":19,"context_line":"# your version of ssh client on ironic node or server in bootstrap image"},{"line_number":20,"context_line":"# do not suport it or if you can not disable \"requiretty\" for the "},{"line_number":21,"context_line":"# passwordless sudoer user in the bootstrap image."},{"line_number":22,"context_line":"# See Ansible documentation for more info:"},{"line_number":23,"context_line":"# http://docs.ansible.com/ansible/intro_configuration.html#pipelining"}],"source_content_type":"text/x-ttcn-cfg","patch_set":23,"id":"fa7ab95a_8b1e230a","line":20,"range":{"start_line":20,"start_character":9,"end_line":20,"end_character":15},"updated":"2016-09-02 16:00:25.000000000","message":"s/suport/support/","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"[ssh_connection]"},{"line_number":18,"context_line":"# pipelining greatly increases speed of deployment, disable it only when"},{"line_number":19,"context_line":"# your version of ssh client on ironic node or server in bootstrap image"},{"line_number":20,"context_line":"# do not suport it or if you can not disable \"requiretty\" for the "},{"line_number":21,"context_line":"# passwordless sudoer user in the bootstrap image."},{"line_number":22,"context_line":"# See Ansible documentation for more info:"},{"line_number":23,"context_line":"# http://docs.ansible.com/ansible/intro_configuration.html#pipelining"}],"source_content_type":"text/x-ttcn-cfg","patch_set":23,"id":"7a8ec9b2_95620fac","line":20,"range":{"start_line":20,"start_character":65,"end_line":20,"end_character":66},"in_reply_to":"fa7ab95a_0b0bf3d6","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"[ssh_connection]"},{"line_number":18,"context_line":"# pipelining greatly increases speed of deployment, disable it only when"},{"line_number":19,"context_line":"# your version of ssh client on ironic node or server in bootstrap image"},{"line_number":20,"context_line":"# do not suport it or if you can not disable \"requiretty\" for the "},{"line_number":21,"context_line":"# passwordless sudoer user in the bootstrap image."},{"line_number":22,"context_line":"# See Ansible documentation for more info:"},{"line_number":23,"context_line":"# http://docs.ansible.com/ansible/intro_configuration.html#pipelining"}],"source_content_type":"text/x-ttcn-cfg","patch_set":23,"id":"7a8ec9b2_555247de","line":20,"range":{"start_line":20,"start_character":9,"end_line":20,"end_character":15},"in_reply_to":"fa7ab95a_8b1e230a","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"}],"ironic_staging_drivers/ansible/playbooks/callback_plugins/ironic_log.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        name \u003d task.get_name()"},{"line_number":77,"context_line":"        if name \u003d\u003d \u0027setup\u0027:"},{"line_number":78,"context_line":"            LOG.info(i18n._LI("},{"line_number":79,"context_line":"                \"Processing task %(name)s.\"), dict(name\u003dname, node\u003dnode))"},{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            LOG.info(i18n._LI("},{"line_number":82,"context_line":"                \"Processing task %(name)s on node %(node)s.\"),"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_3f5666d2","line":79,"range":{"start_line":79,"start_character":62,"end_line":79,"end_character":71},"updated":"2016-07-11 16:17:59.000000000","message":"erm, this should not be here?","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        name \u003d task.get_name()"},{"line_number":77,"context_line":"        if name \u003d\u003d \u0027setup\u0027:"},{"line_number":78,"context_line":"            LOG.info(i18n._LI("},{"line_number":79,"context_line":"                \"Processing task %(name)s.\"), dict(name\u003dname, node\u003dnode))"},{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            LOG.info(i18n._LI("},{"line_number":82,"context_line":"                \"Processing task %(name)s on node %(node)s.\"),"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_eaaa6b19","line":79,"range":{"start_line":79,"start_character":62,"end_line":79,"end_character":71},"in_reply_to":"1aa78d24_3f5666d2","updated":"2016-07-15 11:47:39.000000000","message":"Done","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            LOG.info(i18n._LI("},{"line_number":82,"context_line":"                \"Processing task %(name)s on node %(node)s.\"),"},{"line_number":83,"context_line":"                dict(name\u003dname, node\u003dnode))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def v2_runner_on_failed(self, result, ignore_errors\u003dFalse):"},{"line_number":86,"context_line":"        if ignore_errors:"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_1fcaad6e","line":83,"updated":"2016-07-19 09:56:05.000000000","message":"both should be LOG.debug","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            LOG.info(i18n._LI("},{"line_number":82,"context_line":"                \"Processing task %(name)s on node %(node)s.\"),"},{"line_number":83,"context_line":"                dict(name\u003dname, node\u003dnode))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def v2_runner_on_failed(self, result, ignore_errors\u003dFalse):"},{"line_number":86,"context_line":"        if ignore_errors:"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_98ab0575","line":83,"in_reply_to":"dada55a8_1fcaad6e","updated":"2016-07-20 16:57:23.000000000","message":"Done","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def v2_runner_on_failed(self, result, ignore_errors\u003dFalse):"},{"line_number":86,"context_line":"        if ignore_errors:"},{"line_number":87,"context_line":"            LOG.warning(i18n._LW("},{"line_number":88,"context_line":"                \"Ansible task %(name)s failed on node %(node)s: %(res)s\"),"},{"line_number":89,"context_line":"                self.runner_msg_dict(result))"},{"line_number":90,"context_line":"        else:"},{"line_number":91,"context_line":"            LOG.error(i18n._LE("}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_7fc92978","line":88,"updated":"2016-07-19 09:56:05.000000000","message":"let\u0027s somehow mention that this error is ignored","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def v2_runner_on_failed(self, result, ignore_errors\u003dFalse):"},{"line_number":86,"context_line":"        if ignore_errors:"},{"line_number":87,"context_line":"            LOG.warning(i18n._LW("},{"line_number":88,"context_line":"                \"Ansible task %(name)s failed on node %(node)s: %(res)s\"),"},{"line_number":89,"context_line":"                self.runner_msg_dict(result))"},{"line_number":90,"context_line":"        else:"},{"line_number":91,"context_line":"            LOG.error(i18n._LE("}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_18a9d590","line":88,"in_reply_to":"dada55a8_7fc92978","updated":"2016-07-20 16:57:23.000000000","message":"Done","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"}],"ironic_staging_drivers/ansible/playbooks/clean_steps.yaml":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ab894c2ff18b44954014ab394b9617ef012de347","unresolved":false,"context_lines":[{"line_number":2,"context_line":"  priority: 99"},{"line_number":3,"context_line":"  interface: deploy"},{"line_number":4,"context_line":"  args:"},{"line_number":5,"context_line":"    tags:"},{"line_number":6,"context_line":"      required: true"},{"line_number":7,"context_line":"      description: list of playbook tags used to erase partition table on disk devices"},{"line_number":8,"context_line":"      value:"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"fa7ab95a_36900595","line":5,"range":{"start_line":5,"start_character":4,"end_line":5,"end_character":9},"updated":"2016-08-30 10:48:41.000000000","message":"Not sure I get this, in code you just iterate on args.items, what\u0027s this \u0027tags\u0027 for?","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":2,"context_line":"  priority: 99"},{"line_number":3,"context_line":"  interface: deploy"},{"line_number":4,"context_line":"  args:"},{"line_number":5,"context_line":"    tags:"},{"line_number":6,"context_line":"      required: true"},{"line_number":7,"context_line":"      description: list of playbook tags used to erase partition table on disk devices"},{"line_number":8,"context_line":"      value:"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"fa7ab95a_eefb1645","line":5,"range":{"start_line":5,"start_character":4,"end_line":5,"end_character":9},"in_reply_to":"fa7ab95a_36900595","updated":"2016-08-31 10:32:05.000000000","message":"this is a bit tricky.\n\nThe way BaseDriver works with cleaning steps, we\u0027d have to define a method in the driver\u0027s Python code for each step (and decorate it). \n\nIn our case logic is contained in playbooks, and we want to make it extendable without changing the driver itself. Thus each cleaning step is defined by a list of tags in Ansible playbook being run on cleaning. So basically this very file provides extendable (as with other playbooks) list of cleaning steps, *with default tags for them* (the \u0027value\u0027 field) to be run during automated clean, as well as a schema for arguments when those steps are invoked during manual cleaning. Thus it is possible to run some extra part of playbooks during manual cleaning by providing other tags.\n\nso in the code, these steps (but without \u0027value\u0027 field) are returned as args_info expected by clean steps-related code, and args are either used from \u0027value\u0027 field during automated clean, or received from API during manual clean step execution.\n\ncheck deploy.py, lines 409-423 and line 576","commit_id":"359783a992b7dec98d273f772eee261423f9731d"}],"ironic_staging_drivers/ansible/playbooks/deploy.yaml":[{"author":{"_account_id":10391,"name":"Ihor Kalnytskyi","email":"ihor@kalnytskyi.com","username":"ikalnitsky"},"change_message_id":"3db1bb6d64bf76ca11a7f767e7cdf61311f55e17","unresolved":false,"context_lines":[{"line_number":9,"context_line":"- hosts: ironic"},{"line_number":10,"context_line":"  roles:"},{"line_number":11,"context_line":"    - deploy"},{"line_number":12,"context_line":"    - shutdown"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dada55a8_d9f85f7f","line":12,"updated":"2016-07-18 14:56:43.000000000","message":"Hm.. What if one wants to use FakePower driver together with Ansible deploy driver? I think it shouldn\u0027t be a part of deployment playbook, or at least be customizable.\n\nWhat do you think?","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f22fb3175ed708cbda38cc51d94641e106caa2bf","unresolved":false,"context_lines":[{"line_number":9,"context_line":"- hosts: ironic"},{"line_number":10,"context_line":"  roles:"},{"line_number":11,"context_line":"    - deploy"},{"line_number":12,"context_line":"    - shutdown"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dada55a8_e907281a","line":12,"in_reply_to":"dada55a8_d9f85f7f","updated":"2016-07-19 09:18:06.000000000","message":"Sorry, I do not fully understand your use case. Node should be rebooted (hard or soft reboot) after deploy for loading \"user\" (instance) OS.","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":10391,"name":"Ihor Kalnytskyi","email":"ihor@kalnytskyi.com","username":"ikalnitsky"},"change_message_id":"bce53e8e1a533c1aec2a9ebdaff82952f259518d","unresolved":false,"context_lines":[{"line_number":9,"context_line":"- hosts: ironic"},{"line_number":10,"context_line":"  roles:"},{"line_number":11,"context_line":"    - deploy"},{"line_number":12,"context_line":"    - shutdown"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dada55a8_24a207af","line":12,"in_reply_to":"dada55a8_e907281a","updated":"2016-07-19 09:41:31.000000000","message":"It\u0027s not about the case.. It\u0027s about responsibility. I thought PowerDriver should be used to power on/off the node, but instead I see that shutdown is hardcoded into deployment driver.\n\nI\u0027ve followed Agent\u0027s execution flow, and if I\u0027m not mistaken it makes the whole power management thing thought Power driver. This allows us to use different power drivers to achieve different goals (e.g. to use fake driver, if we want some external tool to do power management, etc). So I think Ansible driver needs to call shutdown/reboot thought \"power\" driver either. Does it make sense?","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"}],"ironic_staging_drivers/ansible/playbooks/inspect.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"87342f2a5f950c48dbc1e702b433c596e12032a1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"dada55a8_3fcfb180","updated":"2016-07-19 09:56:05.000000000","message":"please move this file to the patch introducing inspection","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4daded8c530e717d051eb923fcbbbd91c173e6ef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"dada55a8_8aec43f4","in_reply_to":"dada55a8_3fcfb180","updated":"2016-07-20 16:57:23.000000000","message":"Done","commit_id":"fe12507b3d63140566f44a45492ff9c89ced49ae"}],"ironic_staging_drivers/ansible/playbooks/library/parted.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ab894c2ff18b44954014ab394b9617ef012de347","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    for ind, partition in enumerate(partitions):"},{"line_number":49,"context_line":"        # partition name might be an empty string"},{"line_number":50,"context_line":"        partition[\u0027name\u0027] \u003d ("},{"line_number":51,"context_line":"            partition.get(\u0027name\u0027, str(ind + 1)) or str(ind + 1))"},{"line_number":52,"context_line":"        size \u003d partition.get(\u0027size_mib\u0027, None)"},{"line_number":53,"context_line":"        if not size:"},{"line_number":54,"context_line":"            module.fail_json(msg\u003d\"Partition size must be provided\")"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_9bef3c1d","line":51,"range":{"start_line":51,"start_character":34,"end_line":51,"end_character":46},"updated":"2016-08-30 10:48:41.000000000","message":"This one is not needed as there is an \u0027or\u0027","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    for ind, partition in enumerate(partitions):"},{"line_number":49,"context_line":"        # partition name might be an empty string"},{"line_number":50,"context_line":"        partition[\u0027name\u0027] \u003d ("},{"line_number":51,"context_line":"            partition.get(\u0027name\u0027, str(ind + 1)) or str(ind + 1))"},{"line_number":52,"context_line":"        size \u003d partition.get(\u0027size_mib\u0027, None)"},{"line_number":53,"context_line":"        if not size:"},{"line_number":54,"context_line":"            module.fail_json(msg\u003d\"Partition size must be provided\")"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_73a45107","line":51,"range":{"start_line":51,"start_character":34,"end_line":51,"end_character":46},"in_reply_to":"fa7ab95a_9bef3c1d","updated":"2016-08-31 10:32:05.000000000","message":"Done","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ab894c2ff18b44954014ab394b9617ef012de347","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    module.exit_json(changed\u003dnot dryrun, created\u003dpartitions_created)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"from ansible.module_utils.basic import *  # noqa"},{"line_number":111,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":112,"context_line":"    main()"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_9b3d7c91","line":110,"updated":"2016-08-30 10:48:41.000000000","message":"Why is it here?","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    module.exit_json(changed\u003dnot dryrun, created\u003dpartitions_created)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"from ansible.module_utils.basic import *  # noqa"},{"line_number":111,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":112,"context_line":"    main()"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_2107da82","line":110,"in_reply_to":"fa7ab95a_9b3d7c91","updated":"2016-08-31 10:32:05.000000000","message":"that\u0027s a general way of writing modules for Ansible, most of those in ansible-modules-core (https://github.com/ansible/ansible-modules-core) use such import at the end of the module file.\n\nI suspect this stems from how Ansible used to create the final file uploaded to remote by inlining all the imported things inside the module script. Probably it does not have to be that way already, but for the sake of conformity with other Ansible stuff out there, I\u0027ve put it in the end too.\n\nAlso, importing * instead of only what\u0027s needed is to support older Ansible versions (\u003c 2.1.0), where only such constructs work\n(see the note at http://docs.ansible.com/ansible/developing_modules.html#common-module-boilerplate)","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"f908dd3a8c281e932ce7adf8ae9163ce7dd434ce","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            module.fail_json(msg\u003d\"Can not set partition to \""},{"line_number":66,"context_line":"                                 \"boot and swap simultaneously.\")"},{"line_number":67,"context_line":"    # TODO(pas-ha) add more validation, e.g."},{"line_number":68,"context_line":"    # - only one boot partition?"},{"line_number":69,"context_line":"    # - no more than 4 primary partitions on msdos table"},{"line_number":70,"context_line":"    # - no more that one extended partition on msdos table"},{"line_number":71,"context_line":"    # - estimate and validate available space"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a8bc5a2_011e416f","line":68,"updated":"2016-09-27 13:01:14.000000000","message":"Yes, only one bootable flag should be present","commit_id":"ffd006e098abf32c2d830194fa7fbb778b3b2742"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"f908dd3a8c281e932ce7adf8ae9163ce7dd434ce","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    # - only one boot partition?"},{"line_number":69,"context_line":"    # - no more than 4 primary partitions on msdos table"},{"line_number":70,"context_line":"    # - no more that one extended partition on msdos table"},{"line_number":71,"context_line":"    # - estimate and validate available space"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def main():"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a8bc5a2_617aa5be","line":71,"updated":"2016-09-27 13:01:14.000000000","message":"++\n\nI would also add validation for disks \u003e 2TB.\n\nAlso, we could theoretically always default to GPT, even when Legacy BIOS is used because GPT is suppose to be backward compatible [0].\n\n[0] I\u0027ve seem problems already with that \"backward compatible\" support tho, it\u0027s hard to quantify because we are dependent on closed-source firmwares.","commit_id":"ffd006e098abf32c2d830194fa7fbb778b3b2742"}],"ironic_staging_drivers/ansible/playbooks/library/stream_url.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    try:"},{"line_number":87,"context_line":"        actual_checksum \u003d stream_to_dest("},{"line_number":88,"context_line":"            url, dest, chunksize, hash_algo)"},{"line_number":89,"context_line":"    except Exception as e:"},{"line_number":90,"context_line":"        module.fail_json(msg\u003dstr(e))"},{"line_number":91,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_0e3535d9","line":88,"range":{"start_line":88,"start_character":34,"end_line":88,"end_character":43},"updated":"2016-07-11 16:17:59.000000000","message":"If hash_algo is not set, sha1 hash will still be computed by stream_to_dest, I\u0027d prefer to avoid it.","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    try:"},{"line_number":87,"context_line":"        actual_checksum \u003d stream_to_dest("},{"line_number":88,"context_line":"            url, dest, chunksize, hash_algo)"},{"line_number":89,"context_line":"    except Exception as e:"},{"line_number":90,"context_line":"        module.fail_json(msg\u003dstr(e))"},{"line_number":91,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_ed67254f","line":88,"range":{"start_line":88,"start_character":34,"end_line":88,"end_character":43},"in_reply_to":"1aa78d24_0e3535d9","updated":"2016-07-15 11:47:39.000000000","message":"Done","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"# NOTE(pas-ha) Ansible\u0027s module_utils.basic is licensed under BSD (2 clause)"},{"line_number":99,"context_line":"from ansible.module_utils.basic import *  # noqa"},{"line_number":100,"context_line":"main()"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_d37756d2","line":100,"updated":"2016-07-11 16:17:59.000000000","message":"In the other module it is if __name__ \u003d\u003d \u0027__main__\u0027...","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"# NOTE(pas-ha) Ansible\u0027s module_utils.basic is licensed under BSD (2 clause)"},{"line_number":99,"context_line":"from ansible.module_utils.basic import *  # noqa"},{"line_number":100,"context_line":"main()"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_2d72cd11","line":100,"in_reply_to":"1aa78d24_d37756d2","updated":"2016-07-15 11:47:39.000000000","message":"Done","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ab894c2ff18b44954014ab394b9617ef012de347","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"# NOTE(pas-ha) Ansible\u0027s module_utils.basic is licensed under BSD (2 clause)"},{"line_number":102,"context_line":"from ansible.module_utils.basic import *  # noqa"},{"line_number":103,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":104,"context_line":"    main()"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_7b8b581f","line":102,"updated":"2016-08-30 10:48:41.000000000","message":"ditto","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"f908dd3a8c281e932ce7adf8ae9163ce7dd434ce","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import requests"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# adapted from IPA"},{"line_number":22,"context_line":"DEFAULT_CHUNK_SIZE \u003d 1024 * 1024  # 1MB"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class StreamingDownloader(object):"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a8bc5a2_dc28c088","line":22,"updated":"2016-09-27 13:01:14.000000000","message":"nit oslo_utils.units ?","commit_id":"ffd006e098abf32c2d830194fa7fbb778b3b2742"}],"ironic_staging_drivers/ansible/playbooks/roles/clean/tasks/wipefs.yaml":[{"author":{"_account_id":15784,"name":"Igor Pukha","email":"ipukha@mirantis.com","username":"ingwarr"},"change_message_id":"efa957a0723e65cc64d928571792526e2e870a59","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# it might suffice to wipe only the partition table to speed up cleaning"},{"line_number":3,"context_line":"- name: wipe partition metadata"},{"line_number":4,"context_line":"  become: yes"},{"line_number":5,"context_line":"  command: wipefs -qfa /dev/{{ item }}"},{"line_number":6,"context_line":"  with_items: \"{{ ansible_devices }}\""}],"source_content_type":"text/x-yaml","patch_set":17,"id":"fa7ab95a_fbee2ceb","line":5,"range":{"start_line":5,"start_character":2,"end_line":5,"end_character":38},"updated":"2016-08-26 12:32:41.000000000","message":"I think we should check the validity of parameters for wipefs. For example in ubuntu 14.04 options -q and -f is absent.\n# wipefs --help\n\nUsage:\n wipefs [options] \u003cdevice\u003e\n\nOptions:\n -a, --all           wipe all magic strings (BE CAREFUL!)\n -h, --help          show this help text\n -n, --no-act        do everything except the actual write() call\n -o, --offset \u003cnum\u003e  offset to erase, in bytes\n -p, --parsable      print out in parsable instead of printable format\n -V, --version       output version information and exit","commit_id":"2611c888dc8f10387cab468baedcc7d0406976d2"},{"author":{"_account_id":15784,"name":"Igor Pukha","email":"ipukha@mirantis.com","username":"ingwarr"},"change_message_id":"160b4bf7f5838390083f02d0fd126c1178cd4c9f","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# it might suffice to wipe only the partition table to speed up cleaning"},{"line_number":3,"context_line":"- name: wipe partition metadata"},{"line_number":4,"context_line":"  become: yes"},{"line_number":5,"context_line":"  command: wipefs -qfa /dev/{{ item }}"},{"line_number":6,"context_line":"  with_items: \"{{ ansible_devices }}\""}],"source_content_type":"text/x-yaml","patch_set":17,"id":"fa7ab95a_9424a660","line":5,"range":{"start_line":5,"start_character":2,"end_line":5,"end_character":38},"in_reply_to":"fa7ab95a_e182ab93","updated":"2016-08-29 14:58:26.000000000","message":"Simple and clear.","commit_id":"2611c888dc8f10387cab468baedcc7d0406976d2"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"3d6fde525cc4dc58ffe7a76ecf9b5489837128b6","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# it might suffice to wipe only the partition table to speed up cleaning"},{"line_number":3,"context_line":"- name: wipe partition metadata"},{"line_number":4,"context_line":"  become: yes"},{"line_number":5,"context_line":"  command: wipefs -qfa /dev/{{ item }}"},{"line_number":6,"context_line":"  with_items: \"{{ ansible_devices }}\""}],"source_content_type":"text/x-yaml","patch_set":17,"id":"fa7ab95a_e182ab93","line":5,"range":{"start_line":5,"start_character":2,"end_line":5,"end_character":38},"in_reply_to":"fa7ab95a_fbee2ceb","updated":"2016-08-29 14:12:44.000000000","message":"fair, I was mostly testing this on TC7-based ramdisk, which probably has newer version.\n\nAs now we demand/expect gdisk to be installed in the ramdisk (for configdrive creation), I\u0027ll change that to \n\n  sgdisk -Z\n\nwhich should as well wipe all MBR and GPT partition metadata on disks","commit_id":"2611c888dc8f10387cab468baedcc7d0406976d2"}],"ironic_staging_drivers/ansible/playbooks/roles/deploy/files/partition_configdrive.sh":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ab894c2ff18b44954014ab394b9617ef012de347","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/bin/sh"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Rackspace, Inc."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-sh","patch_set":18,"id":"fa7ab95a_5b8e94d0","line":1,"updated":"2016-08-30 10:48:41.000000000","message":"This is all copypaste from IPA, might be worth adding a note about mocing to ironic_lib.","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5246eb1bb1e9475a3cffa097b0709c07c14651e4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/bin/sh"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Rackspace, Inc."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-sh","patch_set":18,"id":"fa7ab95a_e96b1083","line":1,"in_reply_to":"fa7ab95a_2c7a7188","updated":"2016-08-31 10:32:05.000000000","message":"I\u0027ve added couple more comments in this regard","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"eee6d03a3d08ca6fbe8ceea81227025730e360cc","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/bin/sh"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Rackspace, Inc."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-sh","patch_set":18,"id":"fa7ab95a_2c7a7188","line":1,"in_reply_to":"fa7ab95a_5b8e94d0","updated":"2016-08-30 12:00:27.000000000","message":"Nevermind :)","commit_id":"359783a992b7dec98d273f772eee261423f9731d"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"d2847500ad669fa355df4abc07ebbdc595225c3c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/bin/sh"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Rackspace, Inc."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-sh","patch_set":25,"id":"7a8ec9b2_1d56dacd","line":1,"updated":"2016-09-16 15:09:50.000000000","message":"file is full of bashisms, and while strangely working in busybox\u0027s sh on TinyCore, it does not work on ubuntu\u0027s sh at all","commit_id":"0b87db8071c753ad822db293072947c732fcf166"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"f5b75079e79461d6ceaf71342807a4a10ade07ef","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/bin/sh"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Rackspace, Inc."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-sh","patch_set":28,"id":"7a8ec9b2_bb288334","line":1,"updated":"2016-09-16 19:48:18.000000000","message":"why not use /bin/bash here?","commit_id":"ffd006e098abf32c2d830194fa7fbb778b3b2742"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"6a94c96dc1ede5d3124b9af57b5deb9f428d743c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/bin/sh"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Rackspace, Inc."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-sh","patch_set":28,"id":"7a8ec9b2_ad43e66a","line":1,"in_reply_to":"7a8ec9b2_bb288334","updated":"2016-09-16 20:34:08.000000000","message":"this script is not part of a deploy disk (where we control how it is build) but is run on remote instead.\n\nBash might be absent from a minimally built deploy ramdisk, and the script is not that complex to complicate sh-compliance.\n\nBy keeping in POSIX/sh-compatible we ensure maximum portability (who knows, someone might want a FreeBSD-based deploy kernel :) ).","commit_id":"ffd006e098abf32c2d830194fa7fbb778b3b2742"}],"ironic_staging_drivers/ansible/playbooks/roles/deploy/tasks/download.yaml":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c7c28a757c72872338b325d48b05282664a71767","unresolved":false,"context_lines":[{"line_number":6,"context_line":"  get_url:"},{"line_number":7,"context_line":"    url: \"{{ image.url }}\""},{"line_number":8,"context_line":"    dest: /tmp/{{ inventory_hostname }}.img"},{"line_number":9,"context_line":"    checksum: \"md5:{{ image.checksum }}\""},{"line_number":10,"context_line":"  async: 600"},{"line_number":11,"context_line":"  poll: 15"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"1aa78d24_912021b2","line":9,"updated":"2016-07-11 16:17:59.000000000","message":"Not sure what happens when checksum is not provided and image is an http link. this becomes \u0027md5:\u0027 and the checksum validation fails because \u003creal deployed image checksum\u003e !\u003d \u0027\u0027?","commit_id":"1191d3f827375d9de043f33caeabe82852362945"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"db0611f7a87ecc57cbae69ed60717b0b86f77504","unresolved":false,"context_lines":[{"line_number":6,"context_line":"  get_url:"},{"line_number":7,"context_line":"    url: \"{{ image.url }}\""},{"line_number":8,"context_line":"    dest: /tmp/{{ inventory_hostname }}.img"},{"line_number":9,"context_line":"    checksum: \"md5:{{ image.checksum }}\""},{"line_number":10,"context_line":"  async: 600"},{"line_number":11,"context_line":"  poll: 15"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"1aa78d24_b0a7320a","line":9,"in_reply_to":"1aa78d24_912021b2","updated":"2016-07-15 11:47:39.000000000","message":"Done, should be tested.","commit_id":"1191d3f827375d9de043f33caeabe82852362945"}],"ironic_staging_drivers/ansible/playbooks/roles/deploy/tasks/grub.yaml":[{"author":{"_account_id":22405,"name":"Vitaliy Nogin","email":"shadoff1982@gmail.com","username":"vnogin"},"change_message_id":"77071b85430d08370ea9588b8eb8c052c2af3362","unresolved":false,"context_lines":[{"line_number":1,"context_line":"- name: configure bootloader"},{"line_number":2,"context_line":"  become: yes"},{"line_number":3,"context_line":"  script: install_grub.sh {{ ironic_root_device }} {{ parts.created.root }}"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"da7fb54a_aa1aae6c","line":3,"range":{"start_line":3,"start_character":54,"end_line":3,"end_character":72},"updated":"2016-09-02 17:40:51.000000000","message":"Please consider replacing this variable to \"image_target\" instead of parts.created.root","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4e9f4659173762b1265d66a2fbd4f5a8c009294b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"- name: configure bootloader"},{"line_number":2,"context_line":"  become: yes"},{"line_number":3,"context_line":"  script: install_grub.sh {{ ironic_root_device }} {{ parts.created.root }}"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"7a8ec9b2_b5270b63","line":3,"range":{"start_line":3,"start_character":54,"end_line":3,"end_character":72},"in_reply_to":"da7fb54a_aa1aae6c","updated":"2016-09-15 16:40:53.000000000","message":"Done","commit_id":"ed1db756fac57f165cbf8bbd62345902f9191725"}],"ironic_staging_drivers/ansible/playbooks/roles/deploy/tasks/parted.yaml":[{"author":{"_account_id":22405,"name":"Vitaliy Nogin","email":"shadoff1982@gmail.com","username":"vnogin"},"change_message_id":"421e1bc20b3d9bb93383b3160ce6e6a8322853dc","unresolved":false,"context_lines":[{"line_number":31,"context_line":"      all_partitions: \"{{ ironic_partitions + configdrive_partition }}\""},{"line_number":32,"context_line":"  when: configdrive is defined"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"- name: erase partition table"},{"line_number":35,"context_line":"  become: yes"},{"line_number":36,"context_line":"  command: dd if\u003d/dev/zero of\u003d{{ ironic_root_device }} bs\u003d512 count\u003d36"},{"line_number":37,"context_line":"  when: \"{{ not preserve_ephemeral|default(\u0027no\u0027)|bool }}\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"- name: run parted"},{"line_number":40,"context_line":"  become: yes"}],"source_content_type":"text/x-yaml","patch_set":9,"id":"bacf61ea_39d3223a","line":37,"range":{"start_line":34,"start_character":0,"end_line":37,"end_character":57},"updated":"2016-08-04 11:36:10.000000000","message":"Please move the following functionality to \"clean\" section as we don\u0027t expect it here or add check that partition(s) exist and stop the playbook running with appropriate notification. For instance \"Please run cleaning prior deploy\".","commit_id":"7d13665543d92ba392946c6ae8b3eeeda296d10b"}]}
