)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":16,"context_line":"New node field \u0027network_interface\u0027 is introduced. This field specifies"},{"line_number":17,"context_line":"network driver that is used for node. If it is not set default \u0027flat\u0027"},{"line_number":18,"context_line":"driver is used."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Partial-bug: #1526403"},{"line_number":21,"context_line":"Co-Authored-By: Om Kumar \u003com.kumar@hp.com\u003e"},{"line_number":22,"context_line":"Co-Authored-By: Vasyl Saienko \u003cvsaienko@mirantis.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"1a122d0e_971e120a","line":19,"updated":"2016-04-20 19:41:26.000000000","message":"This also adds a new core interface, \u0027network\u0027 to our drivers. Which is a big thing I think. That should be mentioned here. We should update http://docs.openstack.org/developer/ironic/dev/architecture.html#drivers","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":17,"context_line":"network driver that is used for node. If it is not set default \u0027flat\u0027"},{"line_number":18,"context_line":"driver is used."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Partial-bug: #1526403"},{"line_number":21,"context_line":"Co-Authored-By: Om Kumar \u003com.kumar@hp.com\u003e"},{"line_number":22,"context_line":"Co-Authored-By: Vasyl Saienko \u003cvsaienko@mirantis.com\u003e"},{"line_number":23,"context_line":"Co-Authored-By: Sivaramakrishna Garimella \u003csivaramakrishna.garimella@hp.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"1a122d0e_97cc528a","line":20,"updated":"2016-04-20 19:41:26.000000000","message":"I think the commit should also include something about upgrading and how it could break people\u0027s setups since it isn\u0027t backwards compatible.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"  flat: Copies current logic to work with cleaning ports."},{"line_number":12,"context_line":"  none: noop driver"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"New node field \u0027network_interface\u0027 is introduced. This field specifies"},{"line_number":15,"context_line":"network driver that is used for node. If it is not set default \u0027flat\u0027"},{"line_number":16,"context_line":"driver is used."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":49,"id":"dab17558_d5435140","line":14,"updated":"2016-05-17 14:02:11.000000000","message":"Ruby\u0027s comments from PS 39\n\nThis also adds a new core interface, \u0027network\u0027 to our drivers. Which is a big thing I think. That should be mentioned here. We should update http://docs.openstack.org/developer/ironic/dev/architecture.html#drivers\n\nI think the commit should also include something about upgrading and how it could break people\u0027s setups since it isn\u0027t backwards compatible.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":11,"context_line":"  flat: Copies current logic to work with cleaning ports."},{"line_number":12,"context_line":"  none: noop driver"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"New node field \u0027network_interface\u0027 is introduced. This field specifies"},{"line_number":15,"context_line":"network driver that is used for node. If it is not set default \u0027flat\u0027"},{"line_number":16,"context_line":"driver is used."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":49,"id":"bab6814e_f3e0edce","line":14,"in_reply_to":"dab17558_d5435140","updated":"2016-05-24 16:15:18.000000000","message":"Should we update documentation in current patch or it is better to add a new patch in the chain that updates documentation?\n\nAdded information about user impact to commit message also.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"4c65cd2adcd2f74b48b1b282ed5ee49d1e900949","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add network_drivers"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds network drivers logic."},{"line_number":10,"context_line":"It introduces three drivers:"},{"line_number":11,"context_line":"  flat: Copies current logic to work with cleaning ports."},{"line_number":12,"context_line":"  none: noop driver"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":50,"id":"bab6814e_eed0d1cb","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":28},"updated":"2016-05-25 07:47:44.000000000","message":"Only two in the following. A careless deletion?","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"3425b92c992de374b2f86e63908375f613a491ca","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add network_drivers"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds network drivers logic."},{"line_number":10,"context_line":"It introduces three drivers:"},{"line_number":11,"context_line":"  flat: Copies current logic to work with cleaning ports."},{"line_number":12,"context_line":"  none: noop driver"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":50,"id":"bab6814e_3f00f733","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":28},"in_reply_to":"bab6814e_eed0d1cb","updated":"2016-05-26 14:58:06.000000000","message":"Done","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"e637e7dad745a642a5ac2cd236da8555e891d33b","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add network_drivers"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds network drivers logic."},{"line_number":10,"context_line":"It introduces three drivers:"},{"line_number":11,"context_line":"  flat: Copies current logic to work with cleaning ports."},{"line_number":12,"context_line":"  none: noop driver"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":50,"id":"bab6814e_89149f9f","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":28},"in_reply_to":"bab6814e_eed0d1cb","updated":"2016-05-25 07:52:11.000000000","message":"patch has been split and neutron network driver is added at https://review.openstack.org/#/c/317393/. I will fix commit message in next patchset.","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"f3bbfaae690288a440842dacf161de7f1203e315","unresolved":false,"context_lines":[{"line_number":19,"context_line":"that network interface is called instead."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"New node field \u0027network_interface\u0027 is introduced. This field specifies"},{"line_number":22,"context_line":"network driver that is used for node. Exposnig it in the API is done"},{"line_number":23,"context_line":"in the next patch in chain."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Partial-bug: #1526403"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":59,"id":"3aaa91ec_c8491e62","line":22,"updated":"2016-06-24 15:03:30.000000000","message":"Typo: \"exposing\"","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"df313ebfdd3c599f6a296e79b88bb186fdfe1d08","unresolved":false,"context_lines":[{"line_number":19,"context_line":"that network interface is called instead."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"New node field \u0027network_interface\u0027 is introduced. This field specifies"},{"line_number":22,"context_line":"network driver that is used for node. Exposnig it in the API is done"},{"line_number":23,"context_line":"in the next patch in chain."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Partial-bug: #1526403"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":59,"id":"3aaa91ec_d6715879","line":22,"in_reply_to":"3aaa91ec_c8491e62","updated":"2016-07-01 13:10:02.000000000","message":"Done","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\u0027flat\u0027 driver will be used if the deployment currently uses \u0027neutron\u0027"},{"line_number":17,"context_line":"DHCP provider, otherwise \u0027none\u0027 driver will be used."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"create_cleaning_ports and delete_cleaning_ports methods of the DHCP"},{"line_number":20,"context_line":"providers are still being called in case of out-of-tree DHCP"},{"line_number":21,"context_line":"providers, but this possibility will be removed completely in the"},{"line_number":22,"context_line":"next release. If the DHCP provider logic is rewritten into a custom"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":61,"id":"3aaa91ec_e20a6025","line":19,"updated":"2016-06-29 20:07:44.000000000","message":"so we\u0027re deprecating these?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20533d8b623d21c6c934b6677f2bc1cde2860645","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\u0027flat\u0027 driver will be used if the deployment currently uses \u0027neutron\u0027"},{"line_number":17,"context_line":"DHCP provider, otherwise \u0027none\u0027 driver will be used."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"create_cleaning_ports and delete_cleaning_ports methods of the DHCP"},{"line_number":20,"context_line":"providers are still being called in case of out-of-tree DHCP"},{"line_number":21,"context_line":"providers, but this possibility will be removed completely in the"},{"line_number":22,"context_line":"next release. If the DHCP provider logic is rewritten into a custom"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":61,"id":"3aaa91ec_2e71c30c","line":19,"in_reply_to":"3aaa91ec_e20a6025","updated":"2016-06-30 14:51:11.000000000","message":"yup","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":19,"context_line":"create_cleaning_ports and delete_cleaning_ports methods of the DHCP"},{"line_number":20,"context_line":"providers are still being called in case of out-of-tree DHCP"},{"line_number":21,"context_line":"providers, but this possibility will be removed completely in the"},{"line_number":22,"context_line":"next release. If the DHCP provider logic is rewritten into a custom"},{"line_number":23,"context_line":"network driver, please remove those methods from the provider, so"},{"line_number":24,"context_line":"that network driver is called instead."},{"line_number":25,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":61,"id":"3aaa91ec_623790ff","line":22,"updated":"2016-06-29 20:07:44.000000000","message":"what do you mean by \u0027next release\u0027? the ironic release associated with ocata cycle?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20533d8b623d21c6c934b6677f2bc1cde2860645","unresolved":false,"context_lines":[{"line_number":19,"context_line":"create_cleaning_ports and delete_cleaning_ports methods of the DHCP"},{"line_number":20,"context_line":"providers are still being called in case of out-of-tree DHCP"},{"line_number":21,"context_line":"providers, but this possibility will be removed completely in the"},{"line_number":22,"context_line":"next release. If the DHCP provider logic is rewritten into a custom"},{"line_number":23,"context_line":"network driver, please remove those methods from the provider, so"},{"line_number":24,"context_line":"that network driver is called instead."},{"line_number":25,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":61,"id":"3aaa91ec_ae8493d2","line":22,"in_reply_to":"3aaa91ec_623790ff","updated":"2016-06-30 14:51:11.000000000","message":"correct, ocata","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b817d532bf61eac7eedbb49c200f42436596aa65","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The default value of the network_interface is None, meaning that"},{"line_number":16,"context_line":"\u0027flat\u0027 interface will be used if the deployment currently uses"},{"line_number":17,"context_line":"\u0027neutron\u0027 DHCP provider, otherwise \u0027noop\u0027 interface will be used."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"create_cleaning_ports and delete_cleaning_ports methods of the DHCP"},{"line_number":20,"context_line":"providers are still being called in case of out-of-tree DHCP"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":63,"id":"1aa78d24_e0cdc8b8","line":17,"updated":"2016-07-08 01:09:18.000000000","message":"this isn\u0027t true any more because you added that configuration option.","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"}],"etc/ironic/ironic.conf.sample":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"f3bbfaae690288a440842dacf161de7f1203e315","unresolved":false,"context_lines":[{"line_number":36,"context_line":"# starting. The option default is a recommended set of"},{"line_number":37,"context_line":"# production-oriented drivers. A complete list of drivers"},{"line_number":38,"context_line":"# present on your system may be found by enumerating the"},{"line_number":39,"context_line":"# \"ronic.hardware.interfaces.network\" entrypoint. An example"},{"line_number":40,"context_line":"# may be found in the developer documentation online. (list"},{"line_number":41,"context_line":"# value)"},{"line_number":42,"context_line":"#enabled_network_interfaces \u003d flat,none"}],"source_content_type":"application/octet-stream","patch_set":59,"id":"3aaa91ec_089de6bb","line":39,"updated":"2016-06-24 15:03:30.000000000","message":"Typo: \"ironic\"","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"df313ebfdd3c599f6a296e79b88bb186fdfe1d08","unresolved":false,"context_lines":[{"line_number":36,"context_line":"# starting. The option default is a recommended set of"},{"line_number":37,"context_line":"# production-oriented drivers. A complete list of drivers"},{"line_number":38,"context_line":"# present on your system may be found by enumerating the"},{"line_number":39,"context_line":"# \"ronic.hardware.interfaces.network\" entrypoint. An example"},{"line_number":40,"context_line":"# may be found in the developer documentation online. (list"},{"line_number":41,"context_line":"# value)"},{"line_number":42,"context_line":"#enabled_network_interfaces \u003d flat,none"}],"source_content_type":"application/octet-stream","patch_set":59,"id":"3aaa91ec_b3913e55","line":39,"in_reply_to":"3aaa91ec_089de6bb","updated":"2016-07-01 13:10:02.000000000","message":"Done","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"}],"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e4c25ae2079c2b27a15699c28d5381fb454f2760","unresolved":false,"context_lines":[{"line_number":1270,"context_line":"        if self.from_chassis:"},{"line_number":1271,"context_line":"            raise exception.OperationNotPermitted"},{"line_number":1272,"context_line":"        if (not api_utils.allow_network_interface()"},{"line_number":1273,"context_line":"            and api_utils.get_patch_value(patch, \u0027/network_interface\u0027)):"},{"line_number":1274,"context_line":"            raise exception.NotAcceptable()"},{"line_number":1275,"context_line":""},{"line_number":1276,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1af94dfe_6fd0c7c9","line":1273,"updated":"2016-03-18 18:06:16.000000000","message":"As was discussed on the midcycle, this should be allowed in the same set of states as eg updating local link connection is.","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"088fbcd84365baccd9c36f919913f95055bfc43e","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        if self.from_chassis:"},{"line_number":1228,"context_line":"            raise exception.OperationNotPermitted"},{"line_number":1229,"context_line":"        if (not api_utils.allow_network_interface() and"},{"line_number":1230,"context_line":"                node.as_dict().get(\u0027network_interface\u0027)):"},{"line_number":1231,"context_line":"            raise exception.NotAcceptable()"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"        # NOTE(deva): get_topic_for checks if node.driver is in the hash ring"}],"source_content_type":"text/x-python","patch_set":21,"id":"da0c15f0_b645a6b4","line":1230,"range":{"start_line":1230,"start_character":36,"end_line":1230,"end_character":53},"updated":"2016-03-26 14:36:44.000000000","message":"We should also check whether the specified network_interface is valid, I can even create a node with network_interface\u003d\"\", which is apparently wrong.","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"088fbcd84365baccd9c36f919913f95055bfc43e","unresolved":false,"context_lines":[{"line_number":1270,"context_line":"        if self.from_chassis:"},{"line_number":1271,"context_line":"            raise exception.OperationNotPermitted"},{"line_number":1272,"context_line":"        if (not api_utils.allow_network_interface() and"},{"line_number":1273,"context_line":"                api_utils.get_patch_value(patch, \u0027/network_interface\u0027)):"},{"line_number":1274,"context_line":"            raise exception.NotAcceptable()"},{"line_number":1275,"context_line":""},{"line_number":1276,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da0c15f0_966ea22d","line":1273,"range":{"start_line":1273,"start_character":51,"end_line":1273,"end_character":68},"updated":"2016-03-26 14:36:44.000000000","message":"ditto","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"60710ee2eea2d91534bf85bbe93b2da7ee481a85","unresolved":false,"context_lines":[{"line_number":1231,"context_line":"        if (not api_utils.allow_network_interface() and n_interface):"},{"line_number":1232,"context_line":"            raise exception.NotAcceptable()"},{"line_number":1233,"context_line":""},{"line_number":1234,"context_line":"        if (n_interface is not None and"},{"line_number":1235,"context_line":"                not api_utils.is_valid_network_interface(n_interface)):"},{"line_number":1236,"context_line":"            error_msg \u003d _(\"Cannot create node with a invalid network \""},{"line_number":1237,"context_line":"                          \"interface %(n_interface)s\")"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_ab674124","line":1234,"updated":"2016-04-04 09:28:32.000000000","message":"Network interface field is not nullable in node object. It seems that if it is not specified for lower api versions, it should be set to flat. Or maybe this logic should go to Node constructor on L701. If it is not specified for the newest api version it might be worth to error, but I\u0027m not sure about this.","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c50ac722508d0e6cc379deec529a3a0bedaabe54","unresolved":false,"context_lines":[{"line_number":1231,"context_line":"        if (not api_utils.allow_network_interface() and n_interface):"},{"line_number":1232,"context_line":"            raise exception.NotAcceptable()"},{"line_number":1233,"context_line":""},{"line_number":1234,"context_line":"        if (n_interface is not None and"},{"line_number":1235,"context_line":"                not api_utils.is_valid_network_interface(n_interface)):"},{"line_number":1236,"context_line":"            error_msg \u003d _(\"Cannot create node with a invalid network \""},{"line_number":1237,"context_line":"                          \"interface %(n_interface)s\")"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_eb3e07d9","line":1234,"in_reply_to":"9a061dce_4da3d04f","updated":"2016-04-05 14:58:51.000000000","message":"Ah, you\u0027re correct. I thought that it won\u0027t let to create an object on L1264, but it seems to be OK, thanks Sam!","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"8f97a625bda4dca70ec4fc00fe763a00f2cb5083","unresolved":false,"context_lines":[{"line_number":1231,"context_line":"        if (not api_utils.allow_network_interface() and n_interface):"},{"line_number":1232,"context_line":"            raise exception.NotAcceptable()"},{"line_number":1233,"context_line":""},{"line_number":1234,"context_line":"        if (n_interface is not None and"},{"line_number":1235,"context_line":"                not api_utils.is_valid_network_interface(n_interface)):"},{"line_number":1236,"context_line":"            error_msg \u003d _(\"Cannot create node with a invalid network \""},{"line_number":1237,"context_line":"                          \"interface %(n_interface)s\")"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_4da3d04f","line":1234,"in_reply_to":"9a061dce_ab674124","updated":"2016-04-05 13:40:31.000000000","message":"The default is handled by the node model definition, so that if its not defined either because someone is running an older API version or just because they left it out, it should default to flat.\n\nmodels.py: \n    network_interface \u003d Column(String(255), default\u003d\u0027flat\u0027)","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d94f019b272e11c5152f49e849dc2c7a8edcf258","unresolved":false,"context_lines":[{"line_number":1134,"context_line":"        api_utils.check_allow_specify_driver(driver)"},{"line_number":1135,"context_line":"        if fields is None:"},{"line_number":1136,"context_line":"            fields \u003d _DEFAULT_RETURN_FIELDS"},{"line_number":1137,"context_line":"        if (fields and not api_utils.allow_network_interface() and"},{"line_number":1138,"context_line":"                \u0027network_interface\u0027 in fields):"},{"line_number":1139,"context_line":"            raise exception.NotAcceptable()"},{"line_number":1140,"context_line":"        return self._get_nodes_collection(chassis_uuid, instance_uuid,"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_4876d406","line":1137,"updated":"2016-04-20 02:10:46.000000000","message":"nit: we could assume that fields is not None based on above two lines. (I was wondering why you put this but I\u0027m guessing it was a bit of cut/paste from one of the api_utils.check_*() functions.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"d482c1e1076731fa4237f5c66dcd6c24079c0092","unresolved":false,"context_lines":[{"line_number":1134,"context_line":"        api_utils.check_allow_specify_driver(driver)"},{"line_number":1135,"context_line":"        if fields is None:"},{"line_number":1136,"context_line":"            fields \u003d _DEFAULT_RETURN_FIELDS"},{"line_number":1137,"context_line":"        if (fields and not api_utils.allow_network_interface() and"},{"line_number":1138,"context_line":"                \u0027network_interface\u0027 in fields):"},{"line_number":1139,"context_line":"            raise exception.NotAcceptable()"},{"line_number":1140,"context_line":"        return self._get_nodes_collection(chassis_uuid, instance_uuid,"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_dbef301c","line":1137,"in_reply_to":"1a122d0e_4876d406","updated":"2016-04-20 10:39:20.000000000","message":"Since network_interface is not in the _DEFAULT_RETURN_FIELDS, it may be replaced with:\n\nelif (\u0027network_interface\u0027 in fields and not api_utils.allow_network_interface()):","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d94f019b272e11c5152f49e849dc2c7a8edcf258","unresolved":false,"context_lines":[{"line_number":1218,"context_line":"        if self.from_chassis:"},{"line_number":1219,"context_line":"            raise exception.OperationNotPermitted"},{"line_number":1220,"context_line":""},{"line_number":1221,"context_line":"        api_utils.check_allow_specify_fields(fields)"},{"line_number":1222,"context_line":""},{"line_number":1223,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":1224,"context_line":"        return Node.convert_with_links(rpc_node, fields\u003dfields)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_a87048dd","line":1221,"updated":"2016-04-20 02:10:46.000000000","message":"We should also do something similar to what you added in line 1137 above. Makes me wonder if we should throw that logic in api_utils.check_allow_specify_fields().","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"94f5d68e1caf4dca023eff9e5915544503034308","unresolved":false,"context_lines":[{"line_number":1218,"context_line":"        if self.from_chassis:"},{"line_number":1219,"context_line":"            raise exception.OperationNotPermitted"},{"line_number":1220,"context_line":""},{"line_number":1221,"context_line":"        api_utils.check_allow_specify_fields(fields)"},{"line_number":1222,"context_line":""},{"line_number":1223,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":1224,"context_line":"        return Node.convert_with_links(rpc_node, fields\u003dfields)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_5efc9c3d","line":1221,"in_reply_to":"1a122d0e_9bec98f4","updated":"2016-04-20 15:16:34.000000000","message":"See if my comment in utils.py makes sense.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"d482c1e1076731fa4237f5c66dcd6c24079c0092","unresolved":false,"context_lines":[{"line_number":1218,"context_line":"        if self.from_chassis:"},{"line_number":1219,"context_line":"            raise exception.OperationNotPermitted"},{"line_number":1220,"context_line":""},{"line_number":1221,"context_line":"        api_utils.check_allow_specify_fields(fields)"},{"line_number":1222,"context_line":""},{"line_number":1223,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":1224,"context_line":"        return Node.convert_with_links(rpc_node, fields\u003dfields)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_9bec98f4","line":1221,"in_reply_to":"1a122d0e_a87048dd","updated":"2016-04-20 10:39:20.000000000","message":"check_allow_specify_fields() check that fields is set and requested api version is higher than versions.MINOR_8_FETCHING_SUBSET_OF_FIELDS. \n\nhttps://github.com/openstack/ironic/blob/master/ironic/api/controllers/v1/utils.py#L210","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d94f019b272e11c5152f49e849dc2c7a8edcf258","unresolved":false,"context_lines":[{"line_number":1238,"context_line":""},{"line_number":1239,"context_line":"        if (n_interface is not None and"},{"line_number":1240,"context_line":"                not api_utils.is_valid_network_interface(n_interface)):"},{"line_number":1241,"context_line":"            error_msg \u003d _(\"Cannot create node with a invalid network \""},{"line_number":1242,"context_line":"                          \"interface %(n_interface)s\")"},{"line_number":1243,"context_line":"            raise wsme.exc.ClientSideError("},{"line_number":1244,"context_line":"                error_msg % {\u0027n_interface\u0027: n_interface},"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_a3718baa","line":1241,"updated":"2016-04-20 02:10:46.000000000","message":"s/a/an/\n\nAlthough this might make more sense: s/a/the/\n\nThe user may not know the valid values -- should we output those too, eg \u0027Valid network interfaces are: ....\u0027.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d94f019b272e11c5152f49e849dc2c7a8edcf258","unresolved":false,"context_lines":[{"line_number":1291,"context_line":"        if (n_interface is not None and"},{"line_number":1292,"context_line":"                not api_utils.is_valid_network_interface(n_interface)):"},{"line_number":1293,"context_line":"            error_msg \u003d _(\"Node %(node)s: Cannot change network_interface \""},{"line_number":1294,"context_line":"                          \"to invalid %(n_interface)s\")"},{"line_number":1295,"context_line":"            raise wsme.exc.ClientSideError("},{"line_number":1296,"context_line":"                error_msg % {\u0027node\u0027: node_ident, \u0027n_interface\u0027: n_interface},"},{"line_number":1297,"context_line":"                status_code\u003dhttp_client.BAD_REQUEST)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_8360cfa6","line":1294,"updated":"2016-04-20 02:10:46.000000000","message":"maybe put single quotes around the interface value or do something like s/invalid/invalid value: / ?\n\nOtherwise it\u0027ll look something like \u0027to invalid foo\u0027 which might be hard to understand.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7bafa24026562dad4001465dc8c744fcef818108","unresolved":false,"context_lines":[{"line_number":697,"context_line":"    states \u003d wsme.wsattr([link.Link], readonly\u003dTrue)"},{"line_number":698,"context_line":"    \"\"\"Links to endpoint for retrieving and setting node states\"\"\""},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"    network_interface \u003d wsme.wsattr(wtypes.text)"},{"line_number":701,"context_line":"    \"\"\"The network interface to be used for this node\"\"\""},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"    # NOTE(deva): \"conductor_affinity\" shouldn\u0027t be presented on the"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_d7e926b9","line":700,"updated":"2016-05-13 14:17:08.000000000","message":"Is possible to use wtypes.Enum here?","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1161dd6f0aa4894cb876f42f270225f85595355f","unresolved":false,"context_lines":[{"line_number":697,"context_line":"    states \u003d wsme.wsattr([link.Link], readonly\u003dTrue)"},{"line_number":698,"context_line":"    \"\"\"Links to endpoint for retrieving and setting node states\"\"\""},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"    network_interface \u003d wsme.wsattr(wtypes.text)"},{"line_number":701,"context_line":"    \"\"\"The network interface to be used for this node\"\"\""},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"    # NOTE(deva): \"conductor_affinity\" shouldn\u0027t be presented on the"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_b56fac5e","line":700,"in_reply_to":"dab17558_d7e926b9","updated":"2016-05-17 14:03:03.000000000","message":"Hm, why? It is a string.","commit_id":"9f322b904b226db23242737b022dc38661003c8d"}],"ironic/api/controllers/v1/utils.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d94f019b272e11c5152f49e849dc2c7a8edcf258","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"def is_valid_network_interface(network_interface):"},{"line_number":169,"context_line":"    \"\"\"Determine if the provided network_interface is a valid."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    Check to see that the provided network_interface is in the enabled"},{"line_number":172,"context_line":"    network driver list."}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_630c93ed","line":169,"updated":"2016-04-20 02:10:46.000000000","message":"s/a //","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"94f5d68e1caf4dca023eff9e5915544503034308","unresolved":false,"context_lines":[{"line_number":254,"context_line":"    if (fields is not None and pecan.request.version.minor \u003c"},{"line_number":255,"context_line":"            versions.MINOR_8_FETCHING_SUBSET_OF_FIELDS):"},{"line_number":256,"context_line":"        raise exception.NotAcceptable()"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"def check_allow_management_verbs(verb):"},{"line_number":260,"context_line":"    min_version \u003d MIN_VERB_VERSIONS.get(verb)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_1edfc4d9","line":257,"updated":"2016-04-20 15:16:34.000000000","message":"What I was thinking, is that this method could be expanded. So if it is OK to specify the fields, then we could add a check here, something like\n\nWell, before line 254, check this so we don\u0027t have to worry about it again: if fields is None: return\n\nThen here:\n    if \u0027network_interface\u0027 in fields and not api_utils.allow_network_interface():\n        raise exception.NotAcceptable()\n\nHmm. Nothing in this code checks that fields is a list (I\u0027m assuming it is a list?)","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"}],"ironic/common/driver_factory.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6c53bf1463bf40accf087046fce7eff7f8fb50ed","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        if cls._extension_manager:"},{"line_number":166,"context_line":"            return"},{"line_number":167,"context_line":"        cls._enabled_driver_list \u003d CONF.get("},{"line_number":168,"context_line":"            entrypoint_map.get(cls._entrypoint_name), [])"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        # NOTE(deva): Drivers raise \"DriverLoadError\" if they are unable to be"},{"line_number":171,"context_line":"        #             loaded, eg. due to missing external dependencies."}],"source_content_type":"text/x-python","patch_set":11,"id":"3afc51ec_8617cbec","line":168,"updated":"2016-03-11 13:35:44.000000000","message":"This is added because it seems that at the moment this module is imported by something, config file is still not parsed, so if _enabled_driver_list is added e.g. on L217 as\n\n class DriverFactory(BaseDriverFactory):\n     _entrypoint_name \u003d \u0027ironic.drivers\u0027\n     _enabled_driver_list \u003d CONF.enabled_drivers\n\nit will contain default value \u0027pxe_ipmitiool\u0027, not the one that is present in config file.","commit_id":"5e3df6db505739ed0bf82cc1d2ea6bd67e4502c8"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"75c1864d866884b4fac771b388ca0a8f1cd33e46","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                       \u0027be found by enumerating the \"ironic.drivers\" \u0027"},{"line_number":42,"context_line":"                       \u0027entrypoint. An example may be found in the \u0027"},{"line_number":43,"context_line":"                       \u0027developer documentation online.\u0027)),"},{"line_number":44,"context_line":"    cfg.ListOpt(\u0027enabled_network_drivers\u0027,"},{"line_number":45,"context_line":"                default\u003d[\u0027flat\u0027],"},{"line_number":46,"context_line":"                help\u003d_(\u0027Specify the list of network drivers to load during \u0027"},{"line_number":47,"context_line":"                       \u0027service initialization. Missing drivers, or \u0027"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_1b7123a9","line":44,"range":{"start_line":44,"start_character":33,"end_line":44,"end_character":40},"updated":"2016-04-22 15:04:49.000000000","message":"please call it \"interfaces\", not \"drivers\". anyway you\u0027re using interfaces everywhere else (including the node attribute). this make it more consistent with what we have in the driver composition spec right now.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"75c1864d866884b4fac771b388ca0a8f1cd33e46","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"entrypoint_map \u003d {"},{"line_number":64,"context_line":"    \u0027ironic.drivers\u0027: \u0027enabled_drivers\u0027,"},{"line_number":65,"context_line":"    \u0027ironic.drivers.network\u0027: \u0027enabled_network_drivers\u0027"},{"line_number":66,"context_line":"}"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_db84cb5e","line":65,"range":{"start_line":65,"start_character":5,"end_line":65,"end_character":27},"updated":"2016-04-22 15:04:49.000000000","message":"currently in the driver composition spec we have something like \"ironic.hardware.interfaces.network\". Maybe rename this one too? otherwise please comment on the spec.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"591a572199755817e6610072da38d89697f1f1ff","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"entrypoint_map \u003d {"},{"line_number":64,"context_line":"    \u0027ironic.drivers\u0027: \u0027enabled_drivers\u0027,"},{"line_number":65,"context_line":"    \u0027ironic.drivers.network\u0027: \u0027enabled_network_drivers\u0027"},{"line_number":66,"context_line":"}"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_3d0d46e8","line":65,"range":{"start_line":65,"start_character":5,"end_line":65,"end_character":27},"in_reply_to":"1a122d0e_db84cb5e","updated":"2016-04-29 13:54:20.000000000","message":"++","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                       \u0027be found by enumerating the \"ironic.drivers\" \u0027"},{"line_number":42,"context_line":"                       \u0027entrypoint. An example may be found in the \u0027"},{"line_number":43,"context_line":"                       \u0027developer documentation online.\u0027)),"},{"line_number":44,"context_line":"    cfg.ListOpt(\u0027enabled_network_drivers\u0027,"},{"line_number":45,"context_line":"                default\u003d[\u0027flat\u0027],"},{"line_number":46,"context_line":"                help\u003d_(\u0027Specify the list of network drivers to load during \u0027"},{"line_number":47,"context_line":"                       \u0027service initialization. Missing drivers, or \u0027"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_9a6bb6f0","line":44,"updated":"2016-05-17 14:02:11.000000000","message":"Dmitry\u0027s comment from PS 39\n\nplease call it \"interfaces\", not \"drivers\". anyway you\u0027re using interfaces everywhere else (including the node attribute). this make it more consistent with what we have in the driver composition spec right now.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                       \u0027be found by enumerating the \"ironic.drivers\" \u0027"},{"line_number":42,"context_line":"                       \u0027entrypoint. An example may be found in the \u0027"},{"line_number":43,"context_line":"                       \u0027developer documentation online.\u0027)),"},{"line_number":44,"context_line":"    cfg.ListOpt(\u0027enabled_network_drivers\u0027,"},{"line_number":45,"context_line":"                default\u003d[\u0027flat\u0027],"},{"line_number":46,"context_line":"                help\u003d_(\u0027Specify the list of network drivers to load during \u0027"},{"line_number":47,"context_line":"                       \u0027service initialization. Missing drivers, or \u0027"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_2956b705","line":44,"in_reply_to":"dab17558_9a6bb6f0","updated":"2016-05-24 16:15:18.000000000","message":"renamed to enabled_network_interfaces","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                       \u0027entrypoint. An example may be found in the \u0027"},{"line_number":43,"context_line":"                       \u0027developer documentation online.\u0027)),"},{"line_number":44,"context_line":"    cfg.ListOpt(\u0027enabled_network_drivers\u0027,"},{"line_number":45,"context_line":"                default\u003d[\u0027flat\u0027],"},{"line_number":46,"context_line":"                help\u003d_(\u0027Specify the list of network drivers to load during \u0027"},{"line_number":47,"context_line":"                       \u0027service initialization. Missing drivers, or \u0027"},{"line_number":48,"context_line":"                       \u0027interfaces which fail to initialize, will prevent the \u0027"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_9ae616ae","line":45,"updated":"2016-05-17 14:02:11.000000000","message":"I think it makes sense to add none to enabled by default drivers too.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                       \u0027entrypoint. An example may be found in the \u0027"},{"line_number":43,"context_line":"                       \u0027developer documentation online.\u0027)),"},{"line_number":44,"context_line":"    cfg.ListOpt(\u0027enabled_network_drivers\u0027,"},{"line_number":45,"context_line":"                default\u003d[\u0027flat\u0027],"},{"line_number":46,"context_line":"                help\u003d_(\u0027Specify the list of network drivers to load during \u0027"},{"line_number":47,"context_line":"                       \u0027service initialization. Missing drivers, or \u0027"},{"line_number":48,"context_line":"                       \u0027interfaces which fail to initialize, will prevent the \u0027"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_06b2c0e4","line":45,"in_reply_to":"dab17558_9ae616ae","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"entrypoint_map \u003d {"},{"line_number":64,"context_line":"    \u0027ironic.drivers\u0027: \u0027enabled_drivers\u0027,"},{"line_number":65,"context_line":"    \u0027ironic.drivers.network\u0027: \u0027enabled_network_drivers\u0027"},{"line_number":66,"context_line":"}"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_ba5b1a53","line":65,"updated":"2016-05-17 14:02:11.000000000","message":"Dmitry\u0027s comment from PS 39\n\ncurrently in the driver composition spec we have something like \"ironic.hardware.interfaces.network\". Maybe rename this one too? otherwise please comment on the spec.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"entrypoint_map \u003d {"},{"line_number":64,"context_line":"    \u0027ironic.drivers\u0027: \u0027enabled_drivers\u0027,"},{"line_number":65,"context_line":"    \u0027ironic.drivers.network\u0027: \u0027enabled_network_drivers\u0027"},{"line_number":66,"context_line":"}"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_49f7bbd2","line":65,"in_reply_to":"dab17558_ba5b1a53","updated":"2016-05-24 16:15:18.000000000","message":"renamed to \"ironic.hardware.interfaces.network\"","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"2c6e7d91043b81b2ede01abc68a51b5a5d114a21","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                       \u0027is a recommended set of production-oriented \u0027"},{"line_number":51,"context_line":"                       \u0027drivers. A complete list of drivers present on \u0027"},{"line_number":52,"context_line":"                       \u0027your system may be found by enumerating the \u0027"},{"line_number":53,"context_line":"                       \u0027\"ronic.hardware.interfaces.network\" entrypoint. An \u0027"},{"line_number":54,"context_line":"                       \u0027example may be found in the developer documentation \u0027"},{"line_number":55,"context_line":"                       \u0027online.\u0027)),"},{"line_number":56,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":50,"id":"bab6814e_a2e20e9e","line":53,"updated":"2016-05-26 12:17:39.000000000","message":"nit - ironic.","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"3425b92c992de374b2f86e63908375f613a491ca","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                       \u0027is a recommended set of production-oriented \u0027"},{"line_number":51,"context_line":"                       \u0027drivers. A complete list of drivers present on \u0027"},{"line_number":52,"context_line":"                       \u0027your system may be found by enumerating the \u0027"},{"line_number":53,"context_line":"                       \u0027\"ronic.hardware.interfaces.network\" entrypoint. An \u0027"},{"line_number":54,"context_line":"                       \u0027example may be found in the developer documentation \u0027"},{"line_number":55,"context_line":"                       \u0027online.\u0027)),"},{"line_number":56,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":50,"id":"bab6814e_f6a174aa","line":53,"in_reply_to":"bab6814e_a2e20e9e","updated":"2016-05-26 14:58:06.000000000","message":"Done","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"2c6e7d91043b81b2ede01abc68a51b5a5d114a21","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                       \u0027drivers. A complete list of drivers present on \u0027"},{"line_number":52,"context_line":"                       \u0027your system may be found by enumerating the \u0027"},{"line_number":53,"context_line":"                       \u0027\"ronic.hardware.interfaces.network\" entrypoint. An \u0027"},{"line_number":54,"context_line":"                       \u0027example may be found in the developer documentation \u0027"},{"line_number":55,"context_line":"                       \u0027online.\u0027)),"},{"line_number":56,"context_line":"]"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"bab6814e_82f6ea5a","line":54,"updated":"2016-05-26 12:17:39.000000000","message":"I\u0027d remove this \u0027example\u0027 part :)","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"3425b92c992de374b2f86e63908375f613a491ca","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                       \u0027drivers. A complete list of drivers present on \u0027"},{"line_number":52,"context_line":"                       \u0027your system may be found by enumerating the \u0027"},{"line_number":53,"context_line":"                       \u0027\"ronic.hardware.interfaces.network\" entrypoint. An \u0027"},{"line_number":54,"context_line":"                       \u0027example may be found in the developer documentation \u0027"},{"line_number":55,"context_line":"                       \u0027online.\u0027)),"},{"line_number":56,"context_line":"]"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"bab6814e_5693205b","line":54,"in_reply_to":"bab6814e_82f6ea5a","updated":"2016-05-26 14:58:06.000000000","message":"Done","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"fe64d62fe8aad88ffbc619daa2016bcac91828c8","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    _enabled_driver_list \u003d None"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def __init__(self):"},{"line_number":151,"context_line":"        if not self.__class__._extension_manager:"},{"line_number":152,"context_line":"            self.__class__._init_extension_manager()"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def __getitem__(self, name):"},{"line_number":155,"context_line":"        return self._extension_manager[name]"}],"source_content_type":"text/x-python","patch_set":53,"id":"7aa08908_d6a1e347","line":152,"range":{"start_line":151,"start_character":0,"end_line":152,"end_character":52},"updated":"2016-06-13 12:30:27.000000000","message":"This would break stevedore I think.\nIn the case of subclasses of BaseDriverFactory, the self.__class__._extension_manager will always be \"None\" while the __init__() called, as the self.__class__ is a class instance for every subclass.","commit_id":"c490280b968f5c3dc595585301f71d13b95ede1c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"f3defc0d73ea0a4ed7b4910154ecd3425bb76d7a","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    _enabled_driver_list \u003d None"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def __init__(self):"},{"line_number":151,"context_line":"        if not self.__class__._extension_manager:"},{"line_number":152,"context_line":"            self.__class__._init_extension_manager()"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def __getitem__(self, name):"},{"line_number":155,"context_line":"        return self._extension_manager[name]"}],"source_content_type":"text/x-python","patch_set":53,"id":"3aaa91ec_90a4c9a6","line":152,"range":{"start_line":151,"start_character":0,"end_line":152,"end_character":52},"in_reply_to":"3aaa91ec_57f270d3","updated":"2016-06-22 19:01:29.000000000","message":"So what you\u0027re saying is correct and I don\u0027t get why it should break - in case of DriverFactory - self.__class__ is DriverFactory, in case of NetworkInterfaceFactory - NetworkInterfaceFactory. _extension_manager will be distinct and None for both classes only during first __init__ call, afterwards it will be whatever stevedore loads.","commit_id":"c490280b968f5c3dc595585301f71d13b95ede1c"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"6c0fa36e108df545b612f70b432c4f33e71d52e2","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    _enabled_driver_list \u003d None"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def __init__(self):"},{"line_number":151,"context_line":"        if not self.__class__._extension_manager:"},{"line_number":152,"context_line":"            self.__class__._init_extension_manager()"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def __getitem__(self, name):"},{"line_number":155,"context_line":"        return self._extension_manager[name]"}],"source_content_type":"text/x-python","patch_set":53,"id":"3aaa91ec_2ce3f606","line":152,"range":{"start_line":151,"start_character":0,"end_line":152,"end_character":52},"in_reply_to":"3aaa91ec_90a4c9a6","updated":"2016-06-23 02:04:55.000000000","message":"Got it, I misunderstood the meaning of the original NOTE message above - I thought it must also keep the \"the first time DriverFactory.__init__ is called\" in his subclasses.\nSo that\u0027s OK, and thanks for your explanation.","commit_id":"c490280b968f5c3dc595585301f71d13b95ede1c"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"464ca44981eaade106c67843d6cb37597d2bd377","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    _enabled_driver_list \u003d None"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def __init__(self):"},{"line_number":151,"context_line":"        if not self.__class__._extension_manager:"},{"line_number":152,"context_line":"            self.__class__._init_extension_manager()"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def __getitem__(self, name):"},{"line_number":155,"context_line":"        return self._extension_manager[name]"}],"source_content_type":"text/x-python","patch_set":53,"id":"3aaa91ec_57f270d3","line":152,"range":{"start_line":151,"start_character":0,"end_line":152,"end_character":52},"in_reply_to":"7aa08908_d6a1e347","updated":"2016-06-22 12:21:40.000000000","message":"Hi, Vladyslav,\nCould you please explain why it\u0027s correct with self.__class__? Thanks a lot.","commit_id":"c490280b968f5c3dc595585301f71d13b95ede1c"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"f3bbfaae690288a440842dacf161de7f1203e315","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        if not DriverFactory._extension_manager:"},{"line_number":124,"context_line":"            DriverFactory._init_extension_manager()"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def __getitem__(self, name):"},{"line_number":127,"context_line":"        return self._extension_manager[name]"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    # NOTE(deva): Use lockutils to avoid a potential race in eventlet"}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_28f6e2f8","side":"PARENT","line":126,"updated":"2016-06-24 15:03:30.000000000","message":"Can this method now be deleted?","commit_id":"61f078e752c3f908ecdf055ced728c7a66fb4700"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"df313ebfdd3c599f6a296e79b88bb186fdfe1d08","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        if not DriverFactory._extension_manager:"},{"line_number":124,"context_line":"            DriverFactory._init_extension_manager()"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def __getitem__(self, name):"},{"line_number":127,"context_line":"        return self._extension_manager[name]"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    # NOTE(deva): Use lockutils to avoid a potential race in eventlet"}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_53dc5a18","side":"PARENT","line":126,"in_reply_to":"3aaa91ec_28f6e2f8","updated":"2016-07-01 13:10:02.000000000","message":"Huh, good point :) I don\u0027t want to remove anything so will change get_driver to reuse __getitem__.","commit_id":"61f078e752c3f908ecdf055ced728c7a66fb4700"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"f3bbfaae690288a440842dacf161de7f1203e315","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                       \u0027be found by enumerating the \"ironic.drivers\" \u0027"},{"line_number":42,"context_line":"                       \u0027entrypoint. An example may be found in the \u0027"},{"line_number":43,"context_line":"                       \u0027developer documentation online.\u0027)),"},{"line_number":44,"context_line":"    cfg.ListOpt(\u0027enabled_network_interfaces\u0027,"},{"line_number":45,"context_line":"                default\u003d[\u0027flat\u0027, \u0027none\u0027],"},{"line_number":46,"context_line":"                help\u003d_(\u0027Specify the list of network drivers to load during \u0027"},{"line_number":47,"context_line":"                       \u0027service initialization. Missing drivers, or \u0027"}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_287f0267","line":44,"updated":"2016-06-24 15:03:30.000000000","message":"This is slightly different from the text in ironic.conf.sample - do you need to regenerate ironic.conf.sample?","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"df313ebfdd3c599f6a296e79b88bb186fdfe1d08","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                       \u0027be found by enumerating the \"ironic.drivers\" \u0027"},{"line_number":42,"context_line":"                       \u0027entrypoint. An example may be found in the \u0027"},{"line_number":43,"context_line":"                       \u0027developer documentation online.\u0027)),"},{"line_number":44,"context_line":"    cfg.ListOpt(\u0027enabled_network_interfaces\u0027,"},{"line_number":45,"context_line":"                default\u003d[\u0027flat\u0027, \u0027none\u0027],"},{"line_number":46,"context_line":"                help\u003d_(\u0027Specify the list of network drivers to load during \u0027"},{"line_number":47,"context_line":"                       \u0027service initialization. Missing drivers, or \u0027"}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_7386b614","line":44,"in_reply_to":"3aaa91ec_287f0267","updated":"2016-07-01 13:10:02.000000000","message":"Done","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e1265f844c133db4ada2ecfd8c7f288b8f2f116c","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    try:"},{"line_number":96,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"},{"line_number":97,"context_line":"    except KeyError:"},{"line_number":98,"context_line":"        raise exception.DriverNotFound(driver_name\u003dnetwork_iface)"},{"line_number":99,"context_line":"    driver.network \u003d net_driver"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_f001cd05","line":96,"updated":"2016-06-28 15:21:21.000000000","message":"None is a valid value, meaning \"use the default\". it\u0027s unclear how to define \"the default\", but we anyway have to do it for new nodes.","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"cab9818c1316e7abbfdcbe863c2d4adaa7734c83","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    try:"},{"line_number":96,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"},{"line_number":97,"context_line":"    except KeyError:"},{"line_number":98,"context_line":"        raise exception.DriverNotFound(driver_name\u003dnetwork_iface)"},{"line_number":99,"context_line":"    driver.network \u003d net_driver"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_760be024","line":96,"in_reply_to":"3aaa91ec_3737a1b1","updated":"2016-06-29 13:40:07.000000000","message":"Well, we can make it nullable and move that logic here, that should work fine.\n\nIn the future we might want to refactor this not to duplicate this stuff for every interface.","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"31c1b9ad7afdb0c31a042b9256075dca1f754710","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    try:"},{"line_number":96,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"},{"line_number":97,"context_line":"    except KeyError:"},{"line_number":98,"context_line":"        raise exception.DriverNotFound(driver_name\u003dnetwork_iface)"},{"line_number":99,"context_line":"    driver.network \u003d net_driver"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_3737a1b1","line":96,"in_reply_to":"3aaa91ec_f001cd05","updated":"2016-06-29 10:21:45.000000000","message":"Incorrect, this field is a mandatory field for the Node object, it\u0027ll always be defined as something, and the defaults are handled on node creation if the user doesn\u0027t request a specific interface in that request.","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                default\u003d[\u0027flat\u0027, \u0027none\u0027],"},{"line_number":46,"context_line":"                help\u003d_(\u0027Specify the list of network drivers to load during \u0027"},{"line_number":47,"context_line":"                       \u0027service initialization. Missing drivers, or \u0027"},{"line_number":48,"context_line":"                       \u0027interfaces which fail to initialize, will prevent the \u0027"},{"line_number":49,"context_line":"                       \u0027conductor service from starting. The option default \u0027"},{"line_number":50,"context_line":"                       \u0027is a recommended set of production-oriented \u0027"},{"line_number":51,"context_line":"                       \u0027drivers. A complete list of drivers present on \u0027"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_dd38e5d5","line":48,"updated":"2016-06-29 20:07:44.000000000","message":"by \u0027interfaces\u0027, you mean \u0027network interfaces\u0027, or do you mean in general, any interface that fails to initialize?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                default\u003d[\u0027flat\u0027, \u0027none\u0027],"},{"line_number":46,"context_line":"                help\u003d_(\u0027Specify the list of network drivers to load during \u0027"},{"line_number":47,"context_line":"                       \u0027service initialization. Missing drivers, or \u0027"},{"line_number":48,"context_line":"                       \u0027interfaces which fail to initialize, will prevent the \u0027"},{"line_number":49,"context_line":"                       \u0027conductor service from starting. The option default \u0027"},{"line_number":50,"context_line":"                       \u0027is a recommended set of production-oriented \u0027"},{"line_number":51,"context_line":"                       \u0027drivers. A complete list of drivers present on \u0027"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_c0b563ed","line":48,"in_reply_to":"3aaa91ec_dd38e5d5","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                       \u0027is a recommended set of production-oriented \u0027"},{"line_number":51,"context_line":"                       \u0027drivers. A complete list of drivers present on \u0027"},{"line_number":52,"context_line":"                       \u0027your system may be found by enumerating the \u0027"},{"line_number":53,"context_line":"                       \u0027\"ironic.hardware.interfaces.network\" entrypoint.\u0027))"},{"line_number":54,"context_line":"]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_fdcb2151","line":53,"updated":"2016-06-29 20:07:44.000000000","message":"Since these are network interfaces and the config is called \u0027enabled_network_interfaces\u0027, what do you think about deleting/replacing all occurrences of \u0027drivers\u0027 with \u0027interfaces\u0027.\n\nUnless \u0027network driver\u0027 is different from \u0027network interface\u0027 ?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                       \u0027is a recommended set of production-oriented \u0027"},{"line_number":51,"context_line":"                       \u0027drivers. A complete list of drivers present on \u0027"},{"line_number":52,"context_line":"                       \u0027your system may be found by enumerating the \u0027"},{"line_number":53,"context_line":"                       \u0027\"ironic.hardware.interfaces.network\" entrypoint.\u0027))"},{"line_number":54,"context_line":"]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_40c21354","line":53,"in_reply_to":"3aaa91ec_0e75e762","updated":"2016-07-01 13:09:18.000000000","message":"Done with network_interfaces.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20533d8b623d21c6c934b6677f2bc1cde2860645","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                       \u0027is a recommended set of production-oriented \u0027"},{"line_number":51,"context_line":"                       \u0027drivers. A complete list of drivers present on \u0027"},{"line_number":52,"context_line":"                       \u0027your system may be found by enumerating the \u0027"},{"line_number":53,"context_line":"                       \u0027\"ironic.hardware.interfaces.network\" entrypoint.\u0027))"},{"line_number":54,"context_line":"]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_0e75e762","line":53,"in_reply_to":"3aaa91ec_fdcb2151","updated":"2016-06-30 14:51:11.000000000","message":"I\u0027m not sure on that, as network interface is an abstract class in base.py, maybe the other way around - write network drivers everywhere? or network interface implementations?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"EM_SEMAPHORE \u003d \u0027extension_manager\u0027"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"entrypoint_map \u003d {"},{"line_number":62,"context_line":"    \u0027ironic.drivers\u0027: \u0027enabled_drivers\u0027,"},{"line_number":63,"context_line":"    \u0027ironic.hardware.interfaces.network\u0027: \u0027enabled_network_interfaces\u0027"},{"line_number":64,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_08606d00","line":61,"updated":"2016-06-29 20:07:44.000000000","message":"maybe add a comment as to what is in this map. I think key is entrypoint, value is configuration option associated with that (assumed to be in [default]).","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"EM_SEMAPHORE \u003d \u0027extension_manager\u0027"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"entrypoint_map \u003d {"},{"line_number":62,"context_line":"    \u0027ironic.drivers\u0027: \u0027enabled_drivers\u0027,"},{"line_number":63,"context_line":"    \u0027ironic.hardware.interfaces.network\u0027: \u0027enabled_network_interfaces\u0027"},{"line_number":64,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_c08443d4","line":61,"in_reply_to":"3aaa91ec_08606d00","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af57777c8ec41d75d99bf2f945b4c4b56f6a2f5b","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_b2707f41","line":96,"updated":"2016-06-30 11:38:50.000000000","message":"I thinkwe should deprecate dhcp_provider in favor of something called like default_network_interface","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"efdac515df2f294cd1ac58d6b5e36d09d264c2bf","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_6e7e2be5","line":96,"in_reply_to":"3aaa91ec_037ae0bc","updated":"2016-06-30 14:38:12.000000000","message":"A separate option as an override?  that has no default?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20533d8b623d21c6c934b6677f2bc1cde2860645","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_0ed4c7e9","line":96,"in_reply_to":"3aaa91ec_037ae0bc","updated":"2016-06-30 14:51:11.000000000","message":"So, in this case the default will be set in the config, not per hardware type? If it should be per hardware type, I\u0027d prefer to not introduce another option that will have to be deprecated afterwards.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_20dee7dc","line":96,"in_reply_to":"3aaa91ec_0ed4c7e9","updated":"2016-07-01 13:09:18.000000000","message":"I\u0027ll leave it as is here for now, feel free to disagree.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"cf12aba5ff6db9a9fad438bdecd446fc21482603","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_e3a07492","line":96,"in_reply_to":"3aaa91ec_b2707f41","updated":"2016-06-30 14:25:11.000000000","message":"@Dmitry, about dhcp_provider deprecation. How DHCP options should be passed for (i)PXE ramdisk boot if I do not want network isolation? https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/pxe.py#L418-L419","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"eef5a72a45f289681ac39ae313a45171289fea89","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_ddad5732","line":96,"in_reply_to":"3aaa91ec_b2707f41","updated":"2016-06-30 13:56:34.000000000","message":"@Dmitry. IF we deprecate, can we do that in a separate patch? :)\n\nI was also wondering how this might fit in with the driver composition stuff. if node.x_interface\u003dNone, it is supposed to default to using the driver\u0027s default value for x_interface, right? So for hardware_type \u0027foo\u0027, there is going to be a default for network_interface -- what will that be? Is that what this new proposed default_network_interface config will be used for? (Similarly, would we have default_x_interface configs for all the x_interfaces?)","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4fc209cb4f333eaef7c7eca1e66b16cd26885abc","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_037ae0bc","line":96,"in_reply_to":"3aaa91ec_e3a07492","updated":"2016-06-30 14:27:15.000000000","message":"I assumed we don\u0027t need dhcp_provider any more, but I may be wrong. Then I\u0027d prefer a separate option, defaulting to dhcp_provider","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"94b7e4bfe17cc46340ce15e6c52c96c4f96c1000","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"},{"line_number":100,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_ce702aa7","line":97,"updated":"2016-06-29 19:55:44.000000000","message":"I think Dmitry had suggested that maybe this would be better as \u0027manual\u0027 instead of \u0027none\u0027. What do you think?\n\nhttp://lists.openstack.org/pipermail/openstack-dev/2016-June/098431.html","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af57777c8ec41d75d99bf2f945b4c4b56f6a2f5b","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"},{"line_number":100,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_12907342","line":97,"updated":"2016-06-30 11:38:50.000000000","message":"I\u0027m fine with \"noop\" or anything which differs from None more substantially.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3225cccae3dcc93508a7fdd72ea58084408e232a","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"},{"line_number":100,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_7ec5408c","line":97,"in_reply_to":"3aaa91ec_12907342","updated":"2016-06-30 12:53:21.000000000","message":"I think noop works quite well.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20533d8b623d21c6c934b6677f2bc1cde2860645","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"},{"line_number":100,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_6ed8eb53","line":97,"in_reply_to":"3aaa91ec_7ec5408c","updated":"2016-06-30 14:51:11.000000000","message":"OK, will change that.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3c594174be89e1a253f266249e34563e7bfbe359","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"},{"line_number":100,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_1fdd3ae0","line":97,"in_reply_to":"3aaa91ec_84bc41bc","updated":"2016-06-29 21:13:13.000000000","message":"I suggest \u0027noop\u0027 since there *is* an interface (or driver). Operators are familiar with what \u0027noop\u0027 means? I don\u0027t like \u0027manual\u0027 for the reasons Julia mentioned.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6c0e2755cadee82fda29ec398983f9d3f93ac517","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    network_iface \u003d node.network_interface"},{"line_number":95,"context_line":"    if network_iface is None:"},{"line_number":96,"context_line":"        network_iface \u003d (\u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027"},{"line_number":97,"context_line":"                         else \u0027none\u0027)"},{"line_number":98,"context_line":"    try:"},{"line_number":99,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"},{"line_number":100,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_84bc41bc","line":97,"in_reply_to":"3aaa91ec_ce702aa7","updated":"2016-06-29 20:53:49.000000000","message":"I think \u0027none\u0027 better fits the conventions already set and better defines what is being done.  Where as \u0027manual\u0027 may be better for humans, it may still cause confusion because the word \u0027manual\u0027 implies that a human has to do something manually to achieve the end goal, where as most operators _should_ already have their network infrastructure configured such to meet their operational needs.  The bottom line, if they have Neutron managing their switchports, or not, they still have to configure the base infrastructure regardless of what is done, so perhaps the best question is what is Ironic\u0027s interaction in the process. \n\nStarting out, I felt like I was indifferent on the subject, but the more I think about it, the more \u0027none\u0027 seems to be best since there is no driver in use.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                            \u0027configuration file.\u0027),"},{"line_number":184,"context_line":"                        \u0027, \u0027.join(duplicated_drivers))"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        cls._enabled_driver_list \u003d list(item for (item, cnt) in counter)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        # NOTE(deva): Drivers raise \"DriverLoadError\" if they are unable to be"},{"line_number":189,"context_line":"        #             loaded, eg. due to missing external dependencies."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_839c3ec1","line":186,"updated":"2016-06-29 20:07:44.000000000","message":"I\u0027d probably combine this with the above, to only walk through the counter once but the time savings probably makes this a nit :)","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af57777c8ec41d75d99bf2f945b4c4b56f6a2f5b","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                            \u0027configuration file.\u0027),"},{"line_number":184,"context_line":"                        \u0027, \u0027.join(duplicated_drivers))"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        cls._enabled_driver_list \u003d list(item for (item, cnt) in counter)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        # NOTE(deva): Drivers raise \"DriverLoadError\" if they are unable to be"},{"line_number":189,"context_line":"        #             loaded, eg. due to missing external dependencies."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_f294c737","line":186,"updated":"2016-06-30 11:38:50.000000000","message":"nit: list -\u003e []","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            names \u003d [n for n in cls._enabled_driver_list if n not in found]"},{"line_number":220,"context_line":"            # just in case more than one could not be found ..."},{"line_number":221,"context_line":"            names \u003d \u0027, \u0027.join(names)"},{"line_number":222,"context_line":"            raise exception.DriverNotFound(driver_name\u003dnames)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        LOG.info(_LI(\"Loaded the following drivers: %s\"),"},{"line_number":225,"context_line":"                 cls._extension_manager.names())"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_c323e656","line":222,"updated":"2016-06-29 20:07:44.000000000","message":"Do you know if the names have to be unique across all drivers? Eg, can we have \n    ironic.drivers \u003d\n        foo \u003d ironic.drivers.foo:FooDriver    ironic.hardware.interfaces.network \u003d\n        foo \u003d ironic.drivers.modules.network.foo:FooNetwork\n\nIf they aren\u0027t unique, it might be useful to add more info (like the cls._entrypoint_name) to the exception string. Or it might be useful to add the entrypoint name regardless :)","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af57777c8ec41d75d99bf2f945b4c4b56f6a2f5b","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            names \u003d [n for n in cls._enabled_driver_list if n not in found]"},{"line_number":220,"context_line":"            # just in case more than one could not be found ..."},{"line_number":221,"context_line":"            names \u003d \u0027, \u0027.join(names)"},{"line_number":222,"context_line":"            raise exception.DriverNotFound(driver_name\u003dnames)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        LOG.info(_LI(\"Loaded the following drivers: %s\"),"},{"line_number":225,"context_line":"                 cls._extension_manager.names())"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_52967b3e","line":222,"updated":"2016-06-30 11:38:50.000000000","message":"They are not required to be unique, even though I\u0027d recommend not duplicate them for sanity purposes","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"b206ce1c63be10ff0831f57f5d4b987c79220cd5","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            names \u003d [n for n in cls._enabled_driver_list if n not in found]"},{"line_number":220,"context_line":"            # just in case more than one could not be found ..."},{"line_number":221,"context_line":"            names \u003d \u0027, \u0027.join(names)"},{"line_number":222,"context_line":"            raise exception.DriverNotFound(driver_name\u003dnames)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        LOG.info(_LI(\"Loaded the following drivers: %s\"),"},{"line_number":225,"context_line":"                 cls._extension_manager.names())"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_8dcf287e","line":222,"in_reply_to":"3aaa91ec_52967b3e","updated":"2016-06-30 11:51:53.000000000","message":"3-party drivers developers can not follow recommendations, there is no warranty, agree with Ruby.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            names \u003d [n for n in cls._enabled_driver_list if n not in found]"},{"line_number":220,"context_line":"            # just in case more than one could not be found ..."},{"line_number":221,"context_line":"            names \u003d \u0027, \u0027.join(names)"},{"line_number":222,"context_line":"            raise exception.DriverNotFound(driver_name\u003dnames)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        LOG.info(_LI(\"Loaded the following drivers: %s\"),"},{"line_number":225,"context_line":"                 cls._extension_manager.names())"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_804fdb90","line":222,"in_reply_to":"3aaa91ec_8dcf287e","updated":"2016-07-01 13:09:18.000000000","message":"Subclassed a new exception from DriverNotFound just in case someone is handling it.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":235,"context_line":""},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"class NetworkInterfaceFactory(BaseDriverFactory):"},{"line_number":238,"context_line":"    _entrypoint_name \u003d \u0027ironic.hardware.interfaces.network\u0027"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_63c03251","line":238,"updated":"2016-06-29 20:07:44.000000000","message":"instead of having the entrypoint_map, you could add a new _configuration_option_name. Might make it easier for people to remember to add that info when creating a new class. Just a suggestion.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":235,"context_line":""},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"class NetworkInterfaceFactory(BaseDriverFactory):"},{"line_number":238,"context_line":"    _entrypoint_name \u003d \u0027ironic.hardware.interfaces.network\u0027"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_29e253d5","line":238,"in_reply_to":"3aaa91ec_63c03251","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"d08f88446d64fc87de1a80488aa4119e7cf2f7ae","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    try:"},{"line_number":95,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"},{"line_number":96,"context_line":"    except KeyError:"},{"line_number":97,"context_line":"        raise exception.DriverNotFound(driver_name\u003dnetwork_iface)"},{"line_number":98,"context_line":"    driver.network \u003d net_driver"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_84f12a6d","line":97,"updated":"2016-07-05 09:07:58.000000000","message":"Better to use custom message for this exception instead of\n\"Could not find the following driver(s): %(driver_name)s.\", because \"network\" is not mentioned.","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e1407af200eaebbc42ad76108a69fedd9ee3391e","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    try:"},{"line_number":95,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"},{"line_number":96,"context_line":"    except KeyError:"},{"line_number":97,"context_line":"        raise exception.DriverNotFound(driver_name\u003dnetwork_iface)"},{"line_number":98,"context_line":"    driver.network \u003d net_driver"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_a17a46ef","line":97,"in_reply_to":"1aa78d24_84f12a6d","updated":"2016-07-05 14:42:42.000000000","message":"++","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"80de034814e0dbd92136341c2a556c6b619d1e24","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    try:"},{"line_number":95,"context_line":"        net_driver \u003d NetworkInterfaceFactory().get_driver(network_iface)"},{"line_number":96,"context_line":"    except KeyError:"},{"line_number":97,"context_line":"        raise exception.DriverNotFound(driver_name\u003dnetwork_iface)"},{"line_number":98,"context_line":"    driver.network \u003d net_driver"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_33ef511f","line":97,"in_reply_to":"1aa78d24_a17a46ef","updated":"2016-07-07 18:08:14.000000000","message":"Done","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b817d532bf61eac7eedbb49c200f42436596aa65","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                       \u0027list of network interfaces present on your system may \u0027"},{"line_number":53,"context_line":"                       \u0027be found by enumerating the \u0027"},{"line_number":54,"context_line":"                       \u0027\"ironic.hardware.interfaces.network\" entrypoint.\u0027)),"},{"line_number":55,"context_line":"    cfg.StrOpt(\u0027default_network_interface\u0027,"},{"line_number":56,"context_line":"               help\u003d_(\"Default network interface to be used for nodes that \""},{"line_number":57,"context_line":"                      \"don\u0027t have network_interface field set.\"))"},{"line_number":58,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_4095bc86","line":55,"updated":"2016-07-08 01:09:18.000000000","message":"This is new. How is this going to work in conjunction with the new driver composition [1]. According to that: \"For hardware types setting \u003cinterface_name\u003e_interface field to None means using the vendor default defined in the hardware type. If the vendor default is None, the interface will be disabled.\"\n\nWe don\u0027t have hardware types yet, but when we do, how is this config going to interact with that.\n\n[1] http://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/driver-composition-reform.html","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1f3379b64cecec72c23ef3ca283f307c0f1f374b","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                       \u0027list of network interfaces present on your system may \u0027"},{"line_number":53,"context_line":"                       \u0027be found by enumerating the \u0027"},{"line_number":54,"context_line":"                       \u0027\"ironic.hardware.interfaces.network\" entrypoint.\u0027)),"},{"line_number":55,"context_line":"    cfg.StrOpt(\u0027default_network_interface\u0027,"},{"line_number":56,"context_line":"               help\u003d_(\"Default network interface to be used for nodes that \""},{"line_number":57,"context_line":"                      \"don\u0027t have network_interface field set.\"))"},{"line_number":58,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_2e1bd181","line":55,"in_reply_to":"1aa78d24_094a5cac","updated":"2016-07-11 14:51:08.000000000","message":"I am tempted to say yes to updating the driver composition spec, just to bug Dmitry. HOWEVER... I am now wondering whether we made a mistake in trying to fit this new \u0027network_interface\u0027 into the new hardware_type\u0027s set of *_interfaces. I think we need to resolve this. I have put it in as an agenda item in today\u0027s ironic meeting so we can get some quick decision about this. The agenda item:\n\n[rloo] Is network_interface part of a hardware_type\u0027s interface?\nIn the multi-tenant networking feature patch [1], a \u0027network interface\u0027 is added to the base driver class. The idea was to code this so that when the driver composition work was done [2], this new network_interface would be one of the hardware_type\u0027s *_interfaces. HOWEVER, there are some inconsistencies/issues:\n\n- the patch [1] proposes a \u0027default_network_interface\u0027, which is inconsistent with the driver reform spec, in particular: \"For hardware types setting \u003cinterface_name\u003e_interface field to None means using the vendor default defined in the hardware type. If the vendor default is None, the interface will be disabled.\"\n\n- Makes me/dtantsur wonder whether network_interface should be part of a hardware_type\u0027s interface at all, since it is really operator/environment driven.\n\n  [1] https://review.openstack.org/#/c/285852\n\n  [2] http://specs.openstack.org/openstack/ironic-specs/specs/approved/driver-composition-reform.html","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"5b3e854e2cc4f5db409ce947c7a19e0b49c531e3","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                       \u0027list of network interfaces present on your system may \u0027"},{"line_number":53,"context_line":"                       \u0027be found by enumerating the \u0027"},{"line_number":54,"context_line":"                       \u0027\"ironic.hardware.interfaces.network\" entrypoint.\u0027)),"},{"line_number":55,"context_line":"    cfg.StrOpt(\u0027default_network_interface\u0027,"},{"line_number":56,"context_line":"               help\u003d_(\"Default network interface to be used for nodes that \""},{"line_number":57,"context_line":"                      \"don\u0027t have network_interface field set.\"))"},{"line_number":58,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_49d5d6b7","line":55,"in_reply_to":"1aa78d24_4095bc86","updated":"2016-07-08 10:35:11.000000000","message":"How this is all going to interact with the driver comp is a little weird to me, the hardware_types define defaults for the different interfaces, for most of those interfaces its just a preference of one type of deployment against another and how Ironic interacts with the hardware, and the defaults are just recommended configurations.\n\nHowever I think the network interface is a little different from the other interfaces, because it not only defines how Ironic might interact with the hardware, but it also defines how Ironic interacts with other parts of the environment e.g. neutron. This makes it different from the other interfaces because a hardware_type can\u0027t give a recommended configuration that is so highly dependent on the environment its deployed in, e.g. a hardware_type might say default network_interface\u003dMyHardwaresCustomNeutronInterface but then what happens if I want to deploy that hardware_type in Ironic standalone mode? \n\nThere is no way defined for Ironic to determine that neutron isn\u0027t supported in this environment so I can\u0027t use this interface, and I need to override it. And even if there was I\u0027d need to manually override the network_interface for every node I add of that hardware_type.\n\nSo I think we need 2 problems solved:\n\n1. The network_interfaces that require neutron need to validate if neutron is in the environment, so that if they are selected they can indicate they aren\u0027t going to work, and mark the node as invalid.\n\n2. We need some sort of logic that when a nodes network_interface is invalid we either:\n\n- Go through the list of supported network_interfaces for that node until we reach one that does validate, and then choose that one. E.g. if the list is MyHardwaresCustomNeutronInterface, neutron, noop, flat. and neutron isn\u0027t supported then it\u0027ll go through the list until it reachs noop and then choose that one.\n\nOR\n\n- Fall back to the default defined in the configuration option default_network_interface.\n\nIf neither of these lead to a valid network_interface for that node, for example: the hardware_type chosen doesn\u0027t support the default defined in the config file or none of the network_interfaces listed in hardware_type validate (they might require some sort of driver_info for example). Then we must indicate to the user in some way that we\u0027ve tried to pick a sane default for the node but neither the default defined by his hardware_type or the default resolved by Ironic is going to work, and the user must manually set the network_interface and any other information required to get the node to validate.","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6e01bf091551c62978b7857feb91391008ad9b30","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                       \u0027list of network interfaces present on your system may \u0027"},{"line_number":53,"context_line":"                       \u0027be found by enumerating the \u0027"},{"line_number":54,"context_line":"                       \u0027\"ironic.hardware.interfaces.network\" entrypoint.\u0027)),"},{"line_number":55,"context_line":"    cfg.StrOpt(\u0027default_network_interface\u0027,"},{"line_number":56,"context_line":"               help\u003d_(\"Default network interface to be used for nodes that \""},{"line_number":57,"context_line":"                      \"don\u0027t have network_interface field set.\"))"},{"line_number":58,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_dc3bf5e9","line":55,"in_reply_to":"1aa78d24_49d5d6b7","updated":"2016-07-11 10:12:55.000000000","message":"This is different from what we do now. We do not check if swift is present even if the uuid is provided as an image reference and we\u0027re using agent driver. We don\u0027t check if neutron is available in dhcp providers, same for keystone when keystone auth method is used. Why failing is bad in this case? It\u0027s just a misconfiguration. It is similar situation in case of network_interface being invalid - if it\u0027s set by an operator we should fail, if the value came from the default config option, it was also set by an operator, we should fail and it should be changed. In case of the default being set in hardware type this may be different as it\u0027s code, but I think it\u0027s a separate discussion.\n\nAs for difference of network interface with others, deploy interface is similar in some ways, as it also interacts with glance/swift.\n\nAnyway, what we need to decide here is - whether we need the default option or not?","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f9fa7acf5559d032390550afa4c1c90ee8ae447a","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                       \u0027list of network interfaces present on your system may \u0027"},{"line_number":53,"context_line":"                       \u0027be found by enumerating the \u0027"},{"line_number":54,"context_line":"                       \u0027\"ironic.hardware.interfaces.network\" entrypoint.\u0027)),"},{"line_number":55,"context_line":"    cfg.StrOpt(\u0027default_network_interface\u0027,"},{"line_number":56,"context_line":"               help\u003d_(\"Default network interface to be used for nodes that \""},{"line_number":57,"context_line":"                      \"don\u0027t have network_interface field set.\"))"},{"line_number":58,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_094a5cac","line":55,"in_reply_to":"1aa78d24_dc3bf5e9","updated":"2016-07-11 11:21:22.000000000","message":"So, I think when we can\u0027t have a vendor default for the interface, we should have an operator default. So I\u0027m in favor of having this option, and I think it\u0027s in spirit on the driver composition. Do you think we need an update to the driver composition spec (omg, I can\u0027t believe I said that)?","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b817d532bf61eac7eedbb49c200f42436596aa65","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                       \u0027\"ironic.hardware.interfaces.network\" entrypoint.\u0027)),"},{"line_number":55,"context_line":"    cfg.StrOpt(\u0027default_network_interface\u0027,"},{"line_number":56,"context_line":"               help\u003d_(\"Default network interface to be used for nodes that \""},{"line_number":57,"context_line":"                      \"don\u0027t have network_interface field set.\"))"},{"line_number":58,"context_line":"]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_a0caa018","line":57,"updated":"2016-07-08 01:09:18.000000000","message":"can we use choices\u003d[\u0027noop\u0027, \u0027flat\u0027]? Maybe not cuz default is empty string?","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e9cf133759104946271c7dc92029807ca0549779","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                       \u0027\"ironic.hardware.interfaces.network\" entrypoint.\u0027)),"},{"line_number":55,"context_line":"    cfg.StrOpt(\u0027default_network_interface\u0027,"},{"line_number":56,"context_line":"               help\u003d_(\"Default network interface to be used for nodes that \""},{"line_number":57,"context_line":"                      \"don\u0027t have network_interface field set.\"))"},{"line_number":58,"context_line":"]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_f3368d01","line":57,"in_reply_to":"1aa78d24_6ed4b9bc","updated":"2016-07-12 16:14:21.000000000","message":"Done","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6e01bf091551c62978b7857feb91391008ad9b30","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                       \u0027\"ironic.hardware.interfaces.network\" entrypoint.\u0027)),"},{"line_number":55,"context_line":"    cfg.StrOpt(\u0027default_network_interface\u0027,"},{"line_number":56,"context_line":"               help\u003d_(\"Default network interface to be used for nodes that \""},{"line_number":57,"context_line":"                      \"don\u0027t have network_interface field set.\"))"},{"line_number":58,"context_line":"]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_c1479275","line":57,"in_reply_to":"1aa78d24_a0caa018","updated":"2016-07-11 10:12:55.000000000","message":"nope, cutom stuff is also possible here.","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1f3379b64cecec72c23ef3ca283f307c0f1f374b","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                       \u0027\"ironic.hardware.interfaces.network\" entrypoint.\u0027)),"},{"line_number":55,"context_line":"    cfg.StrOpt(\u0027default_network_interface\u0027,"},{"line_number":56,"context_line":"               help\u003d_(\"Default network interface to be used for nodes that \""},{"line_number":57,"context_line":"                      \"don\u0027t have network_interface field set.\"))"},{"line_number":58,"context_line":"]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_6ed4b9bc","line":57,"in_reply_to":"1aa78d24_c1479275","updated":"2016-07-11 14:51:08.000000000","message":"Right... I suppose we could mention the entry points where they could find the possible values.","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"}],"ironic/common/neutron.py":[{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"c7fcea08ce8fe62d5f21b5194d2bfe436749cfbe","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    # operations, we need to check that and populate them only when"},{"line_number":125,"context_line":"    # available"},{"line_number":126,"context_line":"    if task.node.instance_uuid:"},{"line_number":127,"context_line":"        body[\u0027port\u0027][\u0027device_id\u0027] \u003d task.node.instance_uuid"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    ports \u003d {}"},{"line_number":130,"context_line":"    portmap \u003d get_node_portmap(task)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_f9a57ab5","line":127,"updated":"2016-03-21 15:26:26.000000000","message":"Some ml2 drivers expect the device_id to always be populated for a port to be bound, I think we should set this to the task.node.uuid in cases when an instance_uuid isn\u0027t available.","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"1732f987b13a28e3d7557178a5b5dd13950c7587","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    # operations, we need to check that and populate them only when"},{"line_number":125,"context_line":"    # available"},{"line_number":126,"context_line":"    if task.node.instance_uuid:"},{"line_number":127,"context_line":"        body[\u0027port\u0027][\u0027device_id\u0027] \u003d task.node.instance_uuid"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    ports \u003d {}"},{"line_number":130,"context_line":"    portmap \u003d get_node_portmap(task)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_38614c3a","line":127,"in_reply_to":"fa0719c6_f9a57ab5","updated":"2016-03-23 05:05:05.000000000","message":"Done","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"c7fcea08ce8fe62d5f21b5194d2bfe436749cfbe","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        # Backup existing vif"},{"line_number":156,"context_line":"        vif \u003d extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":157,"context_line":"        if vif:"},{"line_number":158,"context_line":"            extra_dict[\u0027tenant_vif_port_id\u0027] \u003d vif"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        failures \u003d []"},{"line_number":161,"context_line":"        # Setting provisioning port as the vif for the ironic port."}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_19630bde","line":158,"updated":"2016-03-21 15:26:26.000000000","message":"I think that copying the vif_port_id into another field and then copying it back when we unconfigure is a bit of a hack, I would prefer if we created a new field for the cleaning/provisioning ports, something like:\n\nextra_dict[\"service_vif_port_id\"]\n\nthen made sure that the DHCP provider checks for that field as well as the vif_port_id field when it configures the DHCP options. Then in the unconfigure code we just need to:\n\nextra_dict.pop(\"service_vif_port_id\")","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"88c0d16de6ed994bde24aa5c24476b3b7875f6e1","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        # Backup existing vif"},{"line_number":156,"context_line":"        vif \u003d extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":157,"context_line":"        if vif:"},{"line_number":158,"context_line":"            extra_dict[\u0027tenant_vif_port_id\u0027] \u003d vif"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        failures \u003d []"},{"line_number":161,"context_line":"        # Setting provisioning port as the vif for the ironic port."}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_1a13c40e","line":158,"in_reply_to":"fa0719c6_19630bde","updated":"2016-03-22 19:39:25.000000000","message":"I agree with this, though it will require more refactoring in other functions, so that the field to use to get vif is an argument to such functions.","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":13702,"name":"yushiro","username":"yushiro","inactive":true},"change_message_id":"f4c6c62fe812933394638e9829909943b831fe82","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        if vif:"},{"line_number":158,"context_line":"            extra_dict[\u0027tenant_vif_port_id\u0027] \u003d vif"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        failures \u003d []"},{"line_number":161,"context_line":"        # Setting provisioning port as the vif for the ironic port."},{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            extra_dict[\u0027vif_port_id\u0027] \u003d port[\u0027port\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_6bf5e9c9","line":160,"range":{"start_line":160,"start_character":8,"end_line":160,"end_character":21},"updated":"2016-03-22 04:34:58.000000000","message":"nit - If a node has no ports, it occurs following exception at L.177:\n\n* local variable \u0027failures\u0027 referenced before assignment\n\nTherefore, please define it out of the loop.(ex. between L.130 and 131)","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"1732f987b13a28e3d7557178a5b5dd13950c7587","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        if vif:"},{"line_number":158,"context_line":"            extra_dict[\u0027tenant_vif_port_id\u0027] \u003d vif"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        failures \u003d []"},{"line_number":161,"context_line":"        # Setting provisioning port as the vif for the ironic port."},{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            extra_dict[\u0027vif_port_id\u0027] \u003d port[\u0027port\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_387aecf1","line":160,"range":{"start_line":160,"start_character":8,"end_line":160,"end_character":21},"in_reply_to":"fa0719c6_6bf5e9c9","updated":"2016-03-23 05:05:05.000000000","message":"Done","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"c7fcea08ce8fe62d5f21b5194d2bfe436749cfbe","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                        \u0027node\u0027: task.node.uuid,"},{"line_number":223,"context_line":"                        \u0027exc\u0027: e})"},{"line_number":224,"context_line":"                LOG.exception(msg)"},{"line_number":225,"context_line":"                raise exception.NetworkError(msg)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"def get_node_portmap(task):"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_d954f355","line":225,"updated":"2016-03-21 15:26:26.000000000","message":"This whole function seems over engineered when we are storing the UUID of the neutron port we created in the extra dict. Can\u0027t we:\n\n    for port in task.ports:\n        client.delete_port(port.extra[\u0027vif_port_id\u0027]","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"1732f987b13a28e3d7557178a5b5dd13950c7587","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                        \u0027node\u0027: task.node.uuid,"},{"line_number":223,"context_line":"                        \u0027exc\u0027: e})"},{"line_number":224,"context_line":"                LOG.exception(msg)"},{"line_number":225,"context_line":"                raise exception.NetworkError(msg)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"def get_node_portmap(task):"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_98d7b8be","line":225,"in_reply_to":"fa0719c6_ac6ecdfe","updated":"2016-03-23 05:05:05.000000000","message":"I guess the intent here is to remove only the ports belonging the specified network.","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"88c0d16de6ed994bde24aa5c24476b3b7875f6e1","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                        \u0027node\u0027: task.node.uuid,"},{"line_number":223,"context_line":"                        \u0027exc\u0027: e})"},{"line_number":224,"context_line":"                LOG.exception(msg)"},{"line_number":225,"context_line":"                raise exception.NetworkError(msg)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"def get_node_portmap(task):"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_ac6ecdfe","line":225,"in_reply_to":"fa0719c6_d954f355","updated":"2016-03-22 19:39:25.000000000","message":"Needs to be cleaned up too, I agree.","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"c7fcea08ce8fe62d5f21b5194d2bfe436749cfbe","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    :param task: a task containing the Node object."},{"line_number":232,"context_line":"    :returns: a dictionary in the form {port.uuid: port.local_link_connection}"},{"line_number":233,"context_line":"    :returns: a list describing the switch ports for the node."},{"line_number":234,"context_line":"    \"\"\""},{"line_number":235,"context_line":"    node \u003d task.node"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_99b0bbdf","line":233,"updated":"2016-03-21 15:26:26.000000000","message":"This doc string needs removing","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"1732f987b13a28e3d7557178a5b5dd13950c7587","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    :param task: a task containing the Node object."},{"line_number":232,"context_line":"    :returns: a dictionary in the form {port.uuid: port.local_link_connection}"},{"line_number":233,"context_line":"    :returns: a list describing the switch ports for the node."},{"line_number":234,"context_line":"    \"\"\""},{"line_number":235,"context_line":"    node \u003d task.node"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_f8e6b4b2","line":233,"in_reply_to":"fa0719c6_99b0bbdf","updated":"2016-03-23 05:05:05.000000000","message":"Done","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"883972dd544d5cccc65d2eb02466c11f68410934","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        # Backup existing vif"},{"line_number":159,"context_line":"        vif \u003d extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":160,"context_line":"        if vif:"},{"line_number":161,"context_line":"            extra_dict[\u0027tenant_vif_port_id\u0027] \u003d vif"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # Setting provisioning port as the vif for the ironic port."},{"line_number":164,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa0719c6_2c311d06","line":161,"updated":"2016-03-22 19:41:15.000000000","message":"Sam Betts\nMar 21 5:26 PM\nI think that copying the vif_port_id into another field and then copying it back when we unconfigure is a bit of a hack, I would prefer if we created a new field for the cleaning/provisioning ports, something like:\n\n extra_dict[\"service_vif_port_id\"]\n\nthen made sure that the DHCP provider checks for that field as well as the vif_port_id field when it configures the DHCP options. Then in the unconfigure code we just need to:\n\n extra_dict.pop(\"service_vif_port_id\")","commit_id":"07084647cc81bdeaacaf71b03b989b9ecea4a72b"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"883972dd544d5cccc65d2eb02466c11f68410934","unresolved":false,"context_lines":[{"line_number":224,"context_line":"                        \u0027node\u0027: task.node.uuid,"},{"line_number":225,"context_line":"                        \u0027exc\u0027: e})"},{"line_number":226,"context_line":"                LOG.exception(msg)"},{"line_number":227,"context_line":"                raise exception.NetworkError(msg)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"def get_node_portmap(task):"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa0719c6_ac136d65","line":227,"updated":"2016-03-22 19:41:15.000000000","message":"Sam Betts\nMar 21 5:26 PM\nThis whole function seems over engineered when we are storing the UUID of the neutron port we created in the extra dict. Can\u0027t we:\n\n    for port in task.ports:\n        client.delete_port(port.extra[\u0027vif_port_id\u0027]","commit_id":"07084647cc81bdeaacaf71b03b989b9ecea4a72b"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1c6c9296430df6e597b672e0b467f80ffb41f57c","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            LOG.exception(msg)"},{"line_number":147,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        if not port.get(\u0027port\u0027) or not port[\u0027port\u0027].get(\u0027id\u0027):"},{"line_number":150,"context_line":"            rollback_ports(task, network_uuid)"},{"line_number":151,"context_line":"            msg \u003d (_(\u0027Failed to create port on given network %(net)s \u0027"},{"line_number":152,"context_line":"                     \u0027from %(node)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":19,"id":"da0c15f0_29f2f9d2","line":149,"updated":"2016-03-25 11:55:59.000000000","message":"This basically duplicates logic on l165","commit_id":"d3a0bf07db4396f7c5cfcb17bfe85e86992bf5fd"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1c6c9296430df6e597b672e0b467f80ffb41f57c","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        # Backup existing vif"},{"line_number":159,"context_line":"        vif \u003d extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":160,"context_line":"        if vif:"},{"line_number":161,"context_line":"            extra_dict[\u0027tenant_vif_port_id\u0027] \u003d vif"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # Setting provisioning port as the vif for the ironic port."},{"line_number":164,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":19,"id":"da0c15f0_49948d36","line":161,"updated":"2016-03-25 11:55:59.000000000","message":"Might be worth do this only in case if vif_port_id can be set correctly.","commit_id":"d3a0bf07db4396f7c5cfcb17bfe85e86992bf5fd"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1c6c9296430df6e597b672e0b467f80ffb41f57c","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            # implementing create_cleaning_ports are supposed to"},{"line_number":169,"context_line":"            # return a VIF port ID for all Ironic ports.  But"},{"line_number":170,"context_line":"            # that doesn\u0027t seem to be true here."},{"line_number":171,"context_line":"            failures.append(vif)"},{"line_number":172,"context_line":"        else:"},{"line_number":173,"context_line":"            ironic_port.extra \u003d extra_dict"},{"line_number":174,"context_line":"            ironic_port.save()"}],"source_content_type":"text/x-python","patch_set":19,"id":"da0c15f0_e9ce4182","line":171,"updated":"2016-03-25 11:55:59.000000000","message":"Seems that we should append port uuids, not vif, vif is the value of tenant_vif_port_id here.","commit_id":"d3a0bf07db4396f7c5cfcb17bfe85e86992bf5fd"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1c6c9296430df6e597b672e0b467f80ffb41f57c","unresolved":false,"context_lines":[{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    if failures:"},{"line_number":180,"context_line":"        if len(failures) \u003d\u003d len(task.ports):"},{"line_number":181,"context_line":"            raise exception.FailedToUpdateVIFPortIdOptOnPort(_("},{"line_number":182,"context_line":"                \"Failed to update vif_port_id for any port \""},{"line_number":183,"context_line":"                \"on node %s.\") % task.node.uuid)"},{"line_number":184,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":19,"id":"da0c15f0_a9aba988","line":181,"updated":"2016-03-25 11:55:59.000000000","message":"There is no such exception","commit_id":"d3a0bf07db4396f7c5cfcb17bfe85e86992bf5fd"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"088fbcd84365baccd9c36f919913f95055bfc43e","unresolved":false,"context_lines":[{"line_number":50,"context_line":"               help\u003d_(\u0027Neutron network UUID for the ramdisk to be booted \u0027"},{"line_number":51,"context_line":"                      \u0027into for cleaning nodes. Required for flat and \u0027"},{"line_number":52,"context_line":"                      \u0027neutron network drivers.\u0027)),"},{"line_number":53,"context_line":"    cfg.StrOpt(\u0027provisioning_network_uuid\u0027,"},{"line_number":54,"context_line":"               help\u003d_(\u0027Neutron network UUID for the ramdisk to be booted \u0027"},{"line_number":55,"context_line":"                      \u0027into for provisioning nodes. Required for neutron \u0027"},{"line_number":56,"context_line":"                      \u0027network drivers.\u0027)),"}],"source_content_type":"text/x-python","patch_set":21,"id":"da0c15f0_d02142fd","line":53,"range":{"start_line":53,"start_character":16,"end_line":53,"end_character":42},"updated":"2016-03-26 14:36:44.000000000","message":"should regenerate the config.sample file to include the new added configure option.","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"088fbcd84365baccd9c36f919913f95055bfc43e","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    ports \u003d {}"},{"line_number":128,"context_line":"    failures \u003d []"},{"line_number":129,"context_line":"    portmap \u003d get_node_portmap(task)"},{"line_number":130,"context_line":"    for ironic_port in task.ports:"},{"line_number":131,"context_line":"        body[\u0027port\u0027][\u0027mac_address\u0027] \u003d ironic_port.address"},{"line_number":132,"context_line":"        binding_profile \u003d {\u0027local_link_information\u0027:"},{"line_number":133,"context_line":"                           [portmap[ironic_port.uuid]]}"}],"source_content_type":"text/x-python","patch_set":21,"id":"da0c15f0_b073ee14","line":130,"range":{"start_line":130,"start_character":4,"end_line":130,"end_character":33},"updated":"2016-03-26 14:36:44.000000000","message":"only pxe_enabled ports should be add to provisioning/cleaning network to boot the ramdisk.","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"da440ec90d6c2f7f38f9d4f90b66f79b4346c45d","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    return ports"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"def remove_ports_from_network(task, network_uuid):"},{"line_number":175,"context_line":"    \"\"\"Deletes the neutron port created for booting the ramdisk."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    :param task: a TaskManager instance."}],"source_content_type":"text/x-python","patch_set":21,"id":"ba0121b8_dbb69189","line":174,"updated":"2016-03-29 14:40:10.000000000","message":"Refactored this one and neutron.unconfigure_tenant_networks as the have a lot in common.","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"da440ec90d6c2f7f38f9d4f90b66f79b4346c45d","unresolved":false,"context_lines":[{"line_number":181,"context_line":"    client \u003d get_client()"},{"line_number":182,"context_line":"    macs \u003d [p.address for p in task.ports]"},{"line_number":183,"context_line":"    params \u003d {"},{"line_number":184,"context_line":"        \u0027network_id\u0027: network_uuid,"},{"line_number":185,"context_line":"    }"},{"line_number":186,"context_line":"    try:"},{"line_number":187,"context_line":"        ports \u003d client.list_ports(**params)"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba0121b8_cd20989e","line":184,"updated":"2016-03-29 14:40:10.000000000","message":"It also seems to be possible to pass a list of mac addresses to filter and avoid it on L199","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"91ae2a1a7b47921552859b9bee3e26b1168d7f8d","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"def add_ports_to_network(task, network_uuid, is_flat\u003dFalse):"},{"line_number":93,"context_line":"    \"\"\"Create Neutron ports for each port on task.node to boot the ramdisk."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    :param task: a TaskManager instance."},{"line_number":96,"context_line":"    :param network_uuid: UUID of a Neutron network where ports will be"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba0121b8_71559af8","line":93,"range":{"start_line":93,"start_character":22,"end_line":93,"end_character":54},"updated":"2016-03-30 15:46:30.000000000","message":"nit: s/each port/each pxe_enabled port","commit_id":"d1fe87eabc6295ba6d60cdf93ef06c4a145bc467"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":42,"context_line":"               default\u003d\u0027keystone\u0027,"},{"line_number":43,"context_line":"               choices\u003d[\u0027keystone\u0027, \u0027noauth\u0027],"},{"line_number":44,"context_line":"               help\u003d_(\u0027Default authentication strategy to use when connecting \u0027"},{"line_number":45,"context_line":"                      \u0027to neutron. Can be either \"keystone\" or \"noauth\". \u0027"},{"line_number":46,"context_line":"                      \u0027Running neutron in noauth mode (related to but not \u0027"},{"line_number":47,"context_line":"                      \u0027affected by this setting) is insecure and should only \u0027"},{"line_number":48,"context_line":"                      \u0027be used for testing.\u0027)),"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_6cdc4d46","line":45,"updated":"2016-04-20 19:41:26.000000000","message":"No need for \u0027Can be either ...\u0027 sentence. The \u0027choices\u0027 in line 43 provides this information.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    else:"},{"line_number":85,"context_line":"        params[\u0027token\u0027] \u003d token"},{"line_number":86,"context_line":"        params[\u0027endpoint_url\u0027] \u003d CONF.neutron.url"},{"line_number":87,"context_line":"        params[\u0027auth_strategy\u0027] \u003d None"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    return clientv20.Client(**params)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_ac70250c","line":87,"updated":"2016-04-20 19:41:26.000000000","message":"I\u0027m not happy that this logic was changed from what it had been in dhcp/neutron.py, _build_client(). Shouldn\u0027t this change be in a separate patch, so that it gets visibility in the commit that the logic was changed?\n\n[the other reason for not being happy is that this patch is huge enough as is, making such additional changes makes it harder for the reviewer to do their job.]","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"3cd2a727ac93f40d39f406e3a2a7bba60e648884","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    else:"},{"line_number":85,"context_line":"        params[\u0027token\u0027] \u003d token"},{"line_number":86,"context_line":"        params[\u0027endpoint_url\u0027] \u003d CONF.neutron.url"},{"line_number":87,"context_line":"        params[\u0027auth_strategy\u0027] \u003d None"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    return clientv20.Client(**params)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"dab17558_b865e1af","line":87,"in_reply_to":"1a122d0e_ac70250c","updated":"2016-05-17 14:03:48.000000000","message":"++ Done now","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    :raises: NetworkError"},{"line_number":103,"context_line":"    :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":104,"context_line":"    \"\"\""},{"line_number":105,"context_line":"    client \u003d get_client()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    LOG.debug(\u0027Using %(net_iface)s network interface for node \u0027"},{"line_number":108,"context_line":"              \u0027%(node)s.\u0027, {\u0027net_iface\u0027: task.node.network_interface,"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_12669050","line":105,"updated":"2016-04-20 19:41:26.000000000","message":"the original code (from dhcp/neutron.py) passed task.context.auth_token. That isn\u0027t needed any more?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    \"\"\""},{"line_number":105,"context_line":"    client \u003d get_client()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    LOG.debug(\u0027Using %(net_iface)s network interface for node \u0027"},{"line_number":108,"context_line":"              \u0027%(node)s.\u0027, {\u0027net_iface\u0027: task.node.network_interface,"},{"line_number":109,"context_line":"                            \u0027node\u0027: task.node.uuid})"},{"line_number":110,"context_line":"    body \u003d {"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_d2525834","line":107,"updated":"2016-04-20 19:41:26.000000000","message":"what about adding additional information like the network uuid and whether flat or not?\n\nEg, \u0027For node .., creating neutron ports on flat network %network_uuid, using ... network interface.\u0027","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    LOG.debug(\u0027Using %(net_iface)s network interface for node \u0027"},{"line_number":108,"context_line":"              \u0027%(node)s.\u0027, {\u0027net_iface\u0027: task.node.network_interface,"},{"line_number":109,"context_line":"                            \u0027node\u0027: task.node.uuid})"},{"line_number":110,"context_line":"    body \u003d {"},{"line_number":111,"context_line":"        \u0027port\u0027: {"},{"line_number":112,"context_line":"            \u0027network_id\u0027: network_uuid,"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_b28cfcda","line":109,"updated":"2016-04-20 19:41:26.000000000","message":"I notice that task.node.* is used fairly often in this method, maybe just do node \u003d task.node first, and use node instead.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    if not is_flat:"},{"line_number":120,"context_line":"        # NOTE(vdrok): It seems that change"},{"line_number":121,"context_line":"        # I437290affd8eb87177d0626bf7935a165859cbdd to Neutron broke the"},{"line_number":122,"context_line":"        # possibility to always bind port, it fails in case of flat network."},{"line_number":123,"context_line":"        body[\u0027port\u0027][\u0027binding:host_id\u0027] \u003d task.node.uuid"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    # Since instance_uuid will not be available during cleaning"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_066775b7","line":122,"updated":"2016-04-20 19:41:26.000000000","message":"Maybe this can be worded differently. I see \u0027if not is_flat:\u0027, so you\u0027re doing something only if it isn\u0027t a flat network, yet your comment seems to indicate that you are doing something \"in case of flat network\".","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        extra_dict \u003d ironic_port.extra"},{"line_number":150,"context_line":"        # Backup existing vif"},{"line_number":151,"context_line":"        vif \u003d extra_dict.get(\u0027vif_port_id\u0027)"},{"line_number":152,"context_line":"        # Setting provisioning port as the vif for the ironic port."},{"line_number":153,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_1c586255","line":150,"updated":"2016-04-20 19:41:26.000000000","message":"I don\u0027t like the non-symmetrical part of this. Ie, this method adds/manipulates port.extra, BUT it is in drivers/modules/network/flat \u0026 neutron that it is \u0027undone\u0027.\nIf this is always needed, maybe we can add parameters to remove_ports_from_network() so that the undoing is done in remove_ports_from_network(). What do you think?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        extra_dict \u003d ironic_port.extra"},{"line_number":150,"context_line":"        # Backup existing vif"},{"line_number":151,"context_line":"        vif \u003d extra_dict.get(\u0027vif_port_id\u0027)"},{"line_number":152,"context_line":"        # Setting provisioning port as the vif for the ironic port."},{"line_number":153,"context_line":"        try:"},{"line_number":154,"context_line":"            extra_dict[\u0027vif_port_id\u0027] \u003d port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":155,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_46cded2f","line":152,"updated":"2016-04-20 19:41:26.000000000","message":"I think of provisioning and cleaning and tenant. This \u0027provisioning\u0027 is referring to provisioning and cleaning, right?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"3cd2a727ac93f40d39f406e3a2a7bba60e648884","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        extra_dict \u003d ironic_port.extra"},{"line_number":150,"context_line":"        # Backup existing vif"},{"line_number":151,"context_line":"        vif \u003d extra_dict.get(\u0027vif_port_id\u0027)"},{"line_number":152,"context_line":"        # Setting provisioning port as the vif for the ironic port."},{"line_number":153,"context_line":"        try:"},{"line_number":154,"context_line":"            extra_dict[\u0027vif_port_id\u0027] \u003d port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":155,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":39,"id":"dab17558_35a61dc1","line":152,"in_reply_to":"1a122d0e_46cded2f","updated":"2016-05-17 14:03:48.000000000","message":"Correct.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            failures.append(ironic_port.uuid)"},{"line_number":157,"context_line":"        else:"},{"line_number":158,"context_line":"            if vif:"},{"line_number":159,"context_line":"                extra_dict[\u0027tenant_vif_port_id\u0027] \u003d vif"},{"line_number":160,"context_line":"            ironic_port.extra \u003d extra_dict"},{"line_number":161,"context_line":"            ironic_port.save()"},{"line_number":162,"context_line":"            # Match return value of get_node_vif_ids()"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_e67a39bc","line":159,"updated":"2016-04-20 19:41:26.000000000","message":"Assumes that if a vif had been specified before, it was a tenant vif. Is that a valid assumption?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"3cd2a727ac93f40d39f406e3a2a7bba60e648884","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            failures.append(ironic_port.uuid)"},{"line_number":157,"context_line":"        else:"},{"line_number":158,"context_line":"            if vif:"},{"line_number":159,"context_line":"                extra_dict[\u0027tenant_vif_port_id\u0027] \u003d vif"},{"line_number":160,"context_line":"            ironic_port.extra \u003d extra_dict"},{"line_number":161,"context_line":"            ironic_port.save()"},{"line_number":162,"context_line":"            # Match return value of get_node_vif_ids()"}],"source_content_type":"text/x-python","patch_set":39,"id":"dab17558_d5ccf16b","line":159,"in_reply_to":"1a122d0e_e67a39bc","updated":"2016-05-17 14:03:48.000000000","message":"We back it up, whatever it is... In case of standalone ironic, it can be in any network as it is created by hand.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"def remove_ports_from_network(task, network_uuid):"},{"line_number":179,"context_line":"    \"\"\"Deletes the neutron port created for booting the ramdisk."},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    :param task: a TaskManager instance."},{"line_number":182,"context_line":"    :param network_uuid: UUID of a Neutron network ports will be deleted from."}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_46504d32","line":179,"updated":"2016-04-20 19:41:26.000000000","message":"s/port/ports/","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"def remove_neutron_ports(params, node_uuid):"},{"line_number":197,"context_line":"    client \u003d get_client()"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    try:"},{"line_number":200,"context_line":"        response \u003d client.list_ports(**params)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_6961daa8","line":197,"updated":"2016-04-20 19:41:26.000000000","message":"would be nice to have a docstring here to describe the method.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        portmap[port.uuid] \u003d port.local_link_connection"},{"line_number":248,"context_line":"    return portmap"},{"line_number":249,"context_line":"    # TODO(jroll) raise InvalidParameterValue if a port doesn\u0027t have the"},{"line_number":250,"context_line":"    # necessary info? (probably)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"def rollback_ports(task, network_uuid):"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_09fe66ad","line":250,"updated":"2016-04-20 19:41:26.000000000","message":"We should probably just address this in this patch.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":261,"context_line":"    \"\"\""},{"line_number":262,"context_line":"    try:"},{"line_number":263,"context_line":"        remove_ports_from_network(task, network_uuid)"},{"line_number":264,"context_line":"    except Exception:"},{"line_number":265,"context_line":"        # Log the error, but let the caller invoke the"},{"line_number":266,"context_line":"        # manager.cleaning_error_handler()."},{"line_number":267,"context_line":"        LOG.exception(_LE("}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_299fe25f","line":264,"updated":"2016-04-20 19:41:26.000000000","message":"s/Exception/NetworkError/ ?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7bafa24026562dad4001465dc8c744fcef818108","unresolved":false,"context_lines":[{"line_number":41,"context_line":"               help\u003d_(\u0027Delay value to wait for Neutron agents to setup \u0027"},{"line_number":42,"context_line":"                      \u0027sufficient DHCP configuration for port.\u0027)),"},{"line_number":43,"context_line":"    cfg.IntOpt(\u0027retries\u0027,"},{"line_number":44,"context_line":"               default\u003d3,"},{"line_number":45,"context_line":"               help\u003d_(\u0027Client retries in the case of a failed request.\u0027)),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027,"},{"line_number":47,"context_line":"               default\u003d\u0027keystone\u0027,"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_97331e13","line":44,"updated":"2016-05-13 14:17:08.000000000","message":"min?","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7bafa24026562dad4001465dc8c744fcef818108","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    if CONF.neutron.auth_strategy \u003d\u003d \u0027noauth\u0027:"},{"line_number":77,"context_line":"        params[\u0027endpoint_url\u0027] \u003d CONF.neutron.url"},{"line_number":78,"context_line":"        params[\u0027auth_strategy\u0027] \u003d \u0027noauth\u0027"},{"line_number":79,"context_line":"    elif (CONF.neutron.auth_strategy \u003d\u003d \u0027keystone\u0027 and"},{"line_number":80,"context_line":"          token is None):"},{"line_number":81,"context_line":"        params[\u0027endpoint_url\u0027] \u003d (CONF.neutron.url or"},{"line_number":82,"context_line":"                                  keystone.get_service_url(\u0027neutron\u0027))"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_ba5d67ee","line":79,"updated":"2016-05-13 14:17:08.000000000","message":"nit: this will be more readable like\n\n elif CONF.neutron.auth_strategy \u003d\u003d \u0027keystone\u0027:\n     if token is None:\n         ...\n     else:\n         ...","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7bafa24026562dad4001465dc8c744fcef818108","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                \"Failed to update vif_port_id for any PXE enabled port \""},{"line_number":174,"context_line":"                \"on node %s.\") % task.node.uuid)"},{"line_number":175,"context_line":"        else:"},{"line_number":176,"context_line":"            LOG.warning(_LW(\"Some errors were encountered when updating \""},{"line_number":177,"context_line":"                            \"vif_port_id for node %(node)s on \""},{"line_number":178,"context_line":"                            \"the following ports: %(ports)s.\"),"},{"line_number":179,"context_line":"                        {\u0027node\u0027: task.node.uuid, \u0027ports\u0027: failures})"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_a039b6a5","line":176,"updated":"2016-05-13 14:17:08.000000000","message":"\"Some errors\" is abstract, looks like we append to failures if port id missing.","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7bafa24026562dad4001465dc8c744fcef818108","unresolved":false,"context_lines":[{"line_number":218,"context_line":"    for port in ports:"},{"line_number":219,"context_line":"        if not port[\u0027id\u0027]:"},{"line_number":220,"context_line":"            # TODO(morgabra) client.list_ports() sometimes returns"},{"line_number":221,"context_line":"            # port objects with null ids. It\u0027s unclear why this happens."},{"line_number":222,"context_line":"            LOG.warning(_LW(\"Deleting neutron port failed, missing \u0027id\u0027. \""},{"line_number":223,"context_line":"                            \"Node: %(node)s, neutron port: %(port)s.\"),"},{"line_number":224,"context_line":"                        {\u0027node\u0027: node_uuid, \u0027port\u0027: port})"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_80f2b298","line":221,"updated":"2016-05-13 14:17:08.000000000","message":"Please provide link to a bug if it registered.","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7bafa24026562dad4001465dc8c744fcef818108","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        remove_ports_from_network(task, network_uuid)"},{"line_number":269,"context_line":"    except Exception:"},{"line_number":270,"context_line":"        # Log the error, but let the caller invoke the"},{"line_number":271,"context_line":"        # manager.cleaning_error_handler()."},{"line_number":272,"context_line":"        LOG.exception(_LE("},{"line_number":273,"context_line":"            \u0027Failed to rollback port changes for node %(node)s \u0027"},{"line_number":274,"context_line":"            \u0027on network %(network)s\u0027), {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_ddb82578","line":271,"range":{"start_line":271,"start_character":18,"end_line":271,"end_character":40},"updated":"2016-05-13 14:17:08.000000000","message":"This is not only for cleaning.","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7bafa24026562dad4001465dc8c744fcef818108","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    except Exception:"},{"line_number":270,"context_line":"        # Log the error, but let the caller invoke the"},{"line_number":271,"context_line":"        # manager.cleaning_error_handler()."},{"line_number":272,"context_line":"        LOG.exception(_LE("},{"line_number":273,"context_line":"            \u0027Failed to rollback port changes for node %(node)s \u0027"},{"line_number":274,"context_line":"            \u0027on network %(network)s\u0027), {\u0027node\u0027: task.node.uuid,"},{"line_number":275,"context_line":"                                        \u0027network\u0027: network_uuid})"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_6046ae50","line":272,"updated":"2016-05-13 14:17:08.000000000","message":"Not sure that exception log level should be here, port can be not created yet, this is not \"main\" error.","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":13702,"name":"yushiro","username":"yushiro","inactive":true},"change_message_id":"24ae5bfc8bb9defb0ba9d4e8fa951447900455d3","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    :param network_uuid: UUID of a Neutron network ports will be deleted from."},{"line_number":188,"context_line":"    :raises: NetworkError"},{"line_number":189,"context_line":"    \"\"\""},{"line_number":190,"context_line":"    macs \u003d [p.address for p in task.ports if p.pxe_enabled]"},{"line_number":191,"context_line":"    params \u003d {"},{"line_number":192,"context_line":"        \u0027network_id\u0027: network_uuid,"},{"line_number":193,"context_line":"        \u0027mac_address\u0027: macs,"}],"source_content_type":"text/x-python","patch_set":48,"id":"dab17558_a8ff6b64","line":190,"range":{"start_line":190,"start_character":4,"end_line":190,"end_character":59},"updated":"2016-05-17 06:09:55.000000000","message":"If no ironic ports exist for an ironic-node or doesn\u0027t have \u0027pxe_enabled\u003dTrue\u0027, \u0027macs\u0027 should be set [].  In this case, there is no filter for mac_address.","commit_id":"4a0773a773d9e81e7a7267504fd56e6823d132d4"},{"author":{"_account_id":13702,"name":"yushiro","username":"yushiro","inactive":true},"change_message_id":"24ae5bfc8bb9defb0ba9d4e8fa951447900455d3","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    LOG.debug(\"Removing ports on network %(net)s on node %(node)s.\","},{"line_number":196,"context_line":"              {\u0027net\u0027: network_uuid, \u0027node\u0027: task.node.uuid})"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    remove_neutron_ports(params, task.node.uuid)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"def remove_neutron_ports(params, node_uuid):"}],"source_content_type":"text/x-python","patch_set":48,"id":"dab17558_b321a0a0","line":198,"range":{"start_line":198,"start_character":4,"end_line":198,"end_character":48},"updated":"2016-05-17 06:09:55.000000000","message":"If this method is called with above condition, ironic will remove all neutron ports on cleaning_network_uuid. Therefore, how about calling this method when the \"macs\" is not empty?","commit_id":"4a0773a773d9e81e7a7267504fd56e6823d132d4"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    :raises: NetworkError"},{"line_number":100,"context_line":"    :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":101,"context_line":"    \"\"\""},{"line_number":102,"context_line":"    client \u003d get_client()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    LOG.debug(\u0027Using %(net_iface)s network interface for node \u0027"},{"line_number":105,"context_line":"              \u0027%(node)s.\u0027, {\u0027net_iface\u0027: task.node.network_interface,"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_d54d113f","line":102,"updated":"2016-05-17 14:02:11.000000000","message":"All the Ruby\u0027s comments in this file :)\n\nthe original code (from dhcp/neutron.py) passed task.context.auth_token. That isn\u0027t needed any more?","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    \"\"\""},{"line_number":102,"context_line":"    client \u003d get_client()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    LOG.debug(\u0027Using %(net_iface)s network interface for node \u0027"},{"line_number":105,"context_line":"              \u0027%(node)s.\u0027, {\u0027net_iface\u0027: task.node.network_interface,"},{"line_number":106,"context_line":"                            \u0027node\u0027: task.node.uuid})"},{"line_number":107,"context_line":"    body \u003d {"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_556001a5","line":104,"updated":"2016-05-17 14:02:11.000000000","message":"what about adding additional information like the network uuid and whether flat or not?\nEg, \u0027For node .., creating neutron ports on flat network %network_uuid, using ... network interface.\u0027","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    \"\"\""},{"line_number":102,"context_line":"    client \u003d get_client()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    LOG.debug(\u0027Using %(net_iface)s network interface for node \u0027"},{"line_number":105,"context_line":"              \u0027%(node)s.\u0027, {\u0027net_iface\u0027: task.node.network_interface,"},{"line_number":106,"context_line":"                            \u0027node\u0027: task.node.uuid})"},{"line_number":107,"context_line":"    body \u003d {"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_3af6f38e","line":104,"in_reply_to":"dab17558_556001a5","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    LOG.debug(\u0027Using %(net_iface)s network interface for node \u0027"},{"line_number":105,"context_line":"              \u0027%(node)s.\u0027, {\u0027net_iface\u0027: task.node.network_interface,"},{"line_number":106,"context_line":"                            \u0027node\u0027: task.node.uuid})"},{"line_number":107,"context_line":"    body \u003d {"},{"line_number":108,"context_line":"        \u0027port\u0027: {"},{"line_number":109,"context_line":"            \u0027network_id\u0027: network_uuid,"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_7559c5fc","line":106,"updated":"2016-05-17 14:02:11.000000000","message":"I notice that task.node.* is used fairly often in this method, maybe just do node \u003d task.node first, and use node instead.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    LOG.debug(\u0027Using %(net_iface)s network interface for node \u0027"},{"line_number":105,"context_line":"              \u0027%(node)s.\u0027, {\u0027net_iface\u0027: task.node.network_interface,"},{"line_number":106,"context_line":"                            \u0027node\u0027: task.node.uuid})"},{"line_number":107,"context_line":"    body \u003d {"},{"line_number":108,"context_line":"        \u0027port\u0027: {"},{"line_number":109,"context_line":"            \u0027network_id\u0027: network_uuid,"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_9a48bfcd","line":106,"in_reply_to":"dab17558_7559c5fc","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    if not is_flat:"},{"line_number":117,"context_line":"        # NOTE(vdrok): It seems that change"},{"line_number":118,"context_line":"        # I437290affd8eb87177d0626bf7935a165859cbdd to Neutron broke the"},{"line_number":119,"context_line":"        # possibility to always bind port, it fails in case of flat network."},{"line_number":120,"context_line":"        body[\u0027port\u0027][\u0027binding:host_id\u0027] \u003d task.node.uuid"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    # Since instance_uuid will not be available during cleaning"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_550761c9","line":119,"updated":"2016-05-17 14:02:11.000000000","message":"Maybe this can be worded differently. I see \u0027if not is_flat:\u0027, so you\u0027re doing something only if it isn\u0027t a flat network, yet your comment seems to indicate that you are doing something \"in case of flat network\".","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    if not is_flat:"},{"line_number":117,"context_line":"        # NOTE(vdrok): It seems that change"},{"line_number":118,"context_line":"        # I437290affd8eb87177d0626bf7935a165859cbdd to Neutron broke the"},{"line_number":119,"context_line":"        # possibility to always bind port, it fails in case of flat network."},{"line_number":120,"context_line":"        body[\u0027port\u0027][\u0027binding:host_id\u0027] \u003d task.node.uuid"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    # Since instance_uuid will not be available during cleaning"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_80e1702c","line":119,"in_reply_to":"dab17558_550761c9","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"03b1cfcf93b91fcfbc09ccc88b75d81201d7b06a","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        body[\u0027port\u0027][\u0027mac_address\u0027] \u003d ironic_port.address"},{"line_number":133,"context_line":"        binding_profile \u003d {\u0027local_link_information\u0027:"},{"line_number":134,"context_line":"                           [portmap[ironic_port.uuid]]}"},{"line_number":135,"context_line":"        body[\u0027port\u0027][\u0027binding:profile\u0027] \u003d binding_profile"},{"line_number":136,"context_line":"        try:"},{"line_number":137,"context_line":"            port \u003d client.create_port(body)"},{"line_number":138,"context_line":"        except neutron_exceptions.ConnectionFailed as e:"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_0e0d6737","line":135,"range":{"start_line":135,"start_character":42,"end_line":135,"end_character":57},"updated":"2016-05-19 01:11:18.000000000","message":"nit - you could combine these two statements into:\n\nbody[\u0027port\u0027][\u0027binding:profile\u0027] \u003d {\u0027local_link_information\u0027:[portmap[ironic_port.uuid]]}","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"03b1cfcf93b91fcfbc09ccc88b75d81201d7b06a","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        body[\u0027port\u0027][\u0027binding:profile\u0027] \u003d binding_profile"},{"line_number":136,"context_line":"        try:"},{"line_number":137,"context_line":"            port \u003d client.create_port(body)"},{"line_number":138,"context_line":"        except neutron_exceptions.ConnectionFailed as e:"},{"line_number":139,"context_line":"            rollback_ports(task, network_uuid)"},{"line_number":140,"context_line":"            msg \u003d (_(\u0027Could not create port on given network %(net)s \u0027"},{"line_number":141,"context_line":"                     \u0027from %(node)s. %(exc)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_4ed92f83","line":138,"range":{"start_line":138,"start_character":34,"end_line":138,"end_character":50},"updated":"2016-05-19 01:11:18.000000000","message":"I could be missing something but after a quick look through the neutron client code, I\u0027m pretty sure that create_port would never raise ConnectionFailed.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        body[\u0027port\u0027][\u0027binding:profile\u0027] \u003d binding_profile"},{"line_number":136,"context_line":"        try:"},{"line_number":137,"context_line":"            port \u003d client.create_port(body)"},{"line_number":138,"context_line":"        except neutron_exceptions.ConnectionFailed as e:"},{"line_number":139,"context_line":"            rollback_ports(task, network_uuid)"},{"line_number":140,"context_line":"            msg \u003d (_(\u0027Could not create port on given network %(net)s \u0027"},{"line_number":141,"context_line":"                     \u0027from %(node)s. %(exc)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_60b3ac98","line":138,"range":{"start_line":138,"start_character":34,"end_line":138,"end_character":50},"in_reply_to":"bab6814e_4ed92f83","updated":"2016-05-24 16:15:18.000000000","message":"NeutronClientException will be raised here.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        extra_dict \u003d ironic_port.extra"},{"line_number":147,"context_line":"        # Backup existing vif"},{"line_number":148,"context_line":"        vif \u003d extra_dict.get(\u0027vif_port_id\u0027)"},{"line_number":149,"context_line":"        # Setting provisioning port as the vif for the ironic port."},{"line_number":150,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_75270563","line":147,"updated":"2016-05-17 14:02:11.000000000","message":"I don\u0027t like the non-symmetrical part of this. Ie, this method adds/manipulates port.extra, BUT it is in drivers/modules/network/flat \u0026 neutron that it is \u0027undone\u0027.\nIf this is always needed, maybe we can add parameters to remove_ports_from_network() so that the undoing is done in remove_ports_from_network(). What do you think?","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        extra_dict \u003d ironic_port.extra"},{"line_number":147,"context_line":"        # Backup existing vif"},{"line_number":148,"context_line":"        vif \u003d extra_dict.get(\u0027vif_port_id\u0027)"},{"line_number":149,"context_line":"        # Setting provisioning port as the vif for the ironic port."},{"line_number":150,"context_line":"        try:"},{"line_number":151,"context_line":"            extra_dict[\u0027vif_port_id\u0027] \u003d port[\u0027port\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_15c79964","line":148,"updated":"2016-05-17 14:02:11.000000000","message":"Also, Sam thinks that we should not do this hack and introduce a new field.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        extra_dict \u003d ironic_port.extra"},{"line_number":147,"context_line":"        # Backup existing vif"},{"line_number":148,"context_line":"        vif \u003d extra_dict.get(\u0027vif_port_id\u0027)"},{"line_number":149,"context_line":"        # Setting provisioning port as the vif for the ironic port."},{"line_number":150,"context_line":"        try:"},{"line_number":151,"context_line":"            extra_dict[\u0027vif_port_id\u0027] \u003d port[\u0027port\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_402308bd","line":148,"in_reply_to":"dab17558_15c79964","updated":"2016-05-24 16:15:18.000000000","message":"+1 for new field.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                \"Failed to update vif_port_id for any PXE enabled port \""},{"line_number":166,"context_line":"                \"on node %s.\") % task.node.uuid)"},{"line_number":167,"context_line":"        else:"},{"line_number":168,"context_line":"            LOG.warning(_LW(\"Some errors were encountered when updating \""},{"line_number":169,"context_line":"                            \"vif_port_id for node %(node)s on \""},{"line_number":170,"context_line":"                            \"the following ports: %(ports)s.\"),"},{"line_number":171,"context_line":"                        {\u0027node\u0027: task.node.uuid, \u0027ports\u0027: failures})"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_356e1c00","line":168,"updated":"2016-05-17 14:02:11.000000000","message":"Yuriy\u0027s comment from PS 47\n\n\"Some errors\" is abstract, looks like we append to failures if port id missing.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                \"Failed to update vif_port_id for any PXE enabled port \""},{"line_number":166,"context_line":"                \"on node %s.\") % task.node.uuid)"},{"line_number":167,"context_line":"        else:"},{"line_number":168,"context_line":"            LOG.warning(_LW(\"Some errors were encountered when updating \""},{"line_number":169,"context_line":"                            \"vif_port_id for node %(node)s on \""},{"line_number":170,"context_line":"                            \"the following ports: %(ports)s.\"),"},{"line_number":171,"context_line":"                        {\u0027node\u0027: task.node.uuid, \u0027ports\u0027: failures})"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_5bb2d94c","line":168,"in_reply_to":"dab17558_356e1c00","updated":"2016-05-24 16:15:18.000000000","message":"We don\u0027t know why port id is missing. It might be neutron internal failures.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def remove_ports_from_network(task, network_uuid):"},{"line_number":176,"context_line":"    \"\"\"Deletes the neutron port created for booting the ramdisk."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    :param task: a TaskManager instance."},{"line_number":179,"context_line":"    :param network_uuid: UUID of a Neutron network ports will be deleted from."}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_f5d495e9","line":176,"updated":"2016-05-17 14:02:11.000000000","message":"s/port/ports/","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def remove_ports_from_network(task, network_uuid):"},{"line_number":176,"context_line":"    \"\"\"Deletes the neutron port created for booting the ramdisk."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    :param task: a TaskManager instance."},{"line_number":179,"context_line":"    :param network_uuid: UUID of a Neutron network ports will be deleted from."}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_7b8a3d65","line":176,"in_reply_to":"dab17558_f5d495e9","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":179,"context_line":"    :param network_uuid: UUID of a Neutron network ports will be deleted from."},{"line_number":180,"context_line":"    :raises: NetworkError"},{"line_number":181,"context_line":"    \"\"\""},{"line_number":182,"context_line":"    macs \u003d [p.address for p in task.ports if p.pxe_enabled]"},{"line_number":183,"context_line":"    params \u003d {"},{"line_number":184,"context_line":"        \u0027network_id\u0027: network_uuid,"},{"line_number":185,"context_line":"        \u0027mac_address\u0027: macs,"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_35b57cec","line":182,"updated":"2016-05-17 14:02:11.000000000","message":"Comment from Yushiro on PS 48\n\nIf no ironic ports exist for an ironic-node or doesn\u0027t have \u0027pxe_enabled\u003dTrue\u0027, \u0027macs\u0027 should be set [].  In this case, there is no filter for mac_address.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":179,"context_line":"    :param network_uuid: UUID of a Neutron network ports will be deleted from."},{"line_number":180,"context_line":"    :raises: NetworkError"},{"line_number":181,"context_line":"    \"\"\""},{"line_number":182,"context_line":"    macs \u003d [p.address for p in task.ports if p.pxe_enabled]"},{"line_number":183,"context_line":"    params \u003d {"},{"line_number":184,"context_line":"        \u0027network_id\u0027: network_uuid,"},{"line_number":185,"context_line":"        \u0027mac_address\u0027: macs,"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_fb274d60","line":182,"in_reply_to":"dab17558_35b57cec","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    LOG.debug(\"Removing ports on network %(net)s on node %(node)s.\","},{"line_number":188,"context_line":"              {\u0027net\u0027: network_uuid, \u0027node\u0027: task.node.uuid})"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    remove_neutron_ports(params, task.node.uuid)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"def remove_neutron_ports(params, node_uuid):"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_55a9208f","line":190,"updated":"2016-05-17 14:02:11.000000000","message":"Comment from Yushiro on PS 48\n\nIf this method is called with above condition, ironic will remove all neutron ports on cleaning_network_uuid. Therefore, how about calling this method when the \"macs\" is not empty?","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    LOG.debug(\"Removing ports on network %(net)s on node %(node)s.\","},{"line_number":188,"context_line":"              {\u0027net\u0027: network_uuid, \u0027node\u0027: task.node.uuid})"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    remove_neutron_ports(params, task.node.uuid)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"def remove_neutron_ports(params, node_uuid):"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_5bead9db","line":190,"in_reply_to":"dab17558_55a9208f","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    remove_neutron_ports(params, task.node.uuid)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"def remove_neutron_ports(params, node_uuid):"},{"line_number":194,"context_line":"    client \u003d get_client()"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_75ff0566","line":193,"updated":"2016-05-17 14:02:11.000000000","message":"would be nice to have a docstring here to describe the method.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    remove_neutron_ports(params, task.node.uuid)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"def remove_neutron_ports(params, node_uuid):"},{"line_number":194,"context_line":"    client \u003d get_client()"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_3b24350b","line":193,"in_reply_to":"dab17558_75ff0566","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    for port in ports:"},{"line_number":211,"context_line":"        if not port[\u0027id\u0027]:"},{"line_number":212,"context_line":"            # TODO(morgabra) client.list_ports() sometimes returns"},{"line_number":213,"context_line":"            # port objects with null ids. It\u0027s unclear why this happens."},{"line_number":214,"context_line":"            LOG.warning(_LW(\"Deleting neutron port failed, missing \u0027id\u0027. \""},{"line_number":215,"context_line":"                            \"Node: %(node)s, neutron port: %(port)s.\"),"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_755b8454","line":212,"updated":"2016-05-17 14:02:11.000000000","message":"Yuriy\u0027s comment from PS 47\n\nPlease provide link to a bug if it registered.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    for port in ports:"},{"line_number":211,"context_line":"        if not port[\u0027id\u0027]:"},{"line_number":212,"context_line":"            # TODO(morgabra) client.list_ports() sometimes returns"},{"line_number":213,"context_line":"            # port objects with null ids. It\u0027s unclear why this happens."},{"line_number":214,"context_line":"            LOG.warning(_LW(\"Deleting neutron port failed, missing \u0027id\u0027. \""},{"line_number":215,"context_line":"                            \"Node: %(node)s, neutron port: %(port)s.\"),"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_dbc9a927","line":212,"in_reply_to":"dab17558_755b8454","updated":"2016-05-24 16:15:18.000000000","message":"@morgabra: could you please provide a link to the bug that you describing?","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"c916c202a313d409304f79bba73e7a41e3f24018","unresolved":false,"context_lines":[{"line_number":238,"context_line":"    \"\"\""},{"line_number":239,"context_line":"    node \u003d task.node"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    ports \u003d objects.Port.list_by_node_id(task.context, node.id)"},{"line_number":242,"context_line":"    portmap \u003d {}"},{"line_number":243,"context_line":"    for port in ports:"},{"line_number":244,"context_line":"        portmap[port.uuid] \u003d port.local_link_connection"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_c24ec4c0","line":241,"updated":"2016-05-18 10:18:18.000000000","message":"There is already ports attribute in task, is important to refresh here? https://github.com/openstack/ironic/blob/master/ironic/conductor/task_manager.py#L216","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":238,"context_line":"    \"\"\""},{"line_number":239,"context_line":"    node \u003d task.node"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    ports \u003d objects.Port.list_by_node_id(task.context, node.id)"},{"line_number":242,"context_line":"    portmap \u003d {}"},{"line_number":243,"context_line":"    for port in ports:"},{"line_number":244,"context_line":"        portmap[port.uuid] \u003d port.local_link_connection"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_cdc9f027","line":241,"in_reply_to":"bab6814e_c24ec4c0","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        portmap[port.uuid] \u003d port.local_link_connection"},{"line_number":245,"context_line":"    return portmap"},{"line_number":246,"context_line":"    # TODO(jroll) raise InvalidParameterValue if a port doesn\u0027t have the"},{"line_number":247,"context_line":"    # necessary info? (probably)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"def rollback_ports(task, network_uuid):"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_f5ebf5a1","line":247,"updated":"2016-05-17 14:02:11.000000000","message":"We should probably just address this in this patch.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        portmap[port.uuid] \u003d port.local_link_connection"},{"line_number":245,"context_line":"    return portmap"},{"line_number":246,"context_line":"    # TODO(jroll) raise InvalidParameterValue if a port doesn\u0027t have the"},{"line_number":247,"context_line":"    # necessary info? (probably)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"def rollback_ports(task, network_uuid):"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_ad090c97","line":247,"in_reply_to":"dab17558_f5ebf5a1","updated":"2016-05-24 16:15:18.000000000","message":"Maybe raise an exception only of all ports doesn\u0027t contain llc info? In other cases LOG.warning should be enough.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":257,"context_line":"    :param network_uuid: UUID of a Neutron network."},{"line_number":258,"context_line":"    \"\"\""},{"line_number":259,"context_line":"    try:"},{"line_number":260,"context_line":"        remove_ports_from_network(task, network_uuid)"},{"line_number":261,"context_line":"    except Exception:"},{"line_number":262,"context_line":"        # Log the error, but let the caller invoke the"},{"line_number":263,"context_line":"        # manager.cleaning_error_handler()."}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_3530dd55","line":260,"updated":"2016-05-17 14:02:11.000000000","message":"s/Exception/NetworkError/ ?","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":257,"context_line":"    :param network_uuid: UUID of a Neutron network."},{"line_number":258,"context_line":"    \"\"\""},{"line_number":259,"context_line":"    try:"},{"line_number":260,"context_line":"        remove_ports_from_network(task, network_uuid)"},{"line_number":261,"context_line":"    except Exception:"},{"line_number":262,"context_line":"        # Log the error, but let the caller invoke the"},{"line_number":263,"context_line":"        # manager.cleaning_error_handler()."}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_edf4b4f1","line":260,"in_reply_to":"dab17558_3530dd55","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        remove_ports_from_network(task, network_uuid)"},{"line_number":261,"context_line":"    except Exception:"},{"line_number":262,"context_line":"        # Log the error, but let the caller invoke the"},{"line_number":263,"context_line":"        # manager.cleaning_error_handler()."},{"line_number":264,"context_line":"        LOG.exception(_LE("},{"line_number":265,"context_line":"            \u0027Failed to rollback port changes for node %(node)s \u0027"},{"line_number":266,"context_line":"            \u0027on network %(network)s\u0027), {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_950ee838","line":263,"updated":"2016-05-17 14:02:11.000000000","message":"Yuriy\u0027s comment from PS 47\n\nThis is not only for cleaning.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        remove_ports_from_network(task, network_uuid)"},{"line_number":261,"context_line":"    except Exception:"},{"line_number":262,"context_line":"        # Log the error, but let the caller invoke the"},{"line_number":263,"context_line":"        # manager.cleaning_error_handler()."},{"line_number":264,"context_line":"        LOG.exception(_LE("},{"line_number":265,"context_line":"            \u0027Failed to rollback port changes for node %(node)s \u0027"},{"line_number":266,"context_line":"            \u0027on network %(network)s\u0027), {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_4d750062","line":263,"in_reply_to":"dab17558_950ee838","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":261,"context_line":"    except Exception:"},{"line_number":262,"context_line":"        # Log the error, but let the caller invoke the"},{"line_number":263,"context_line":"        # manager.cleaning_error_handler()."},{"line_number":264,"context_line":"        LOG.exception(_LE("},{"line_number":265,"context_line":"            \u0027Failed to rollback port changes for node %(node)s \u0027"},{"line_number":266,"context_line":"            \u0027on network %(network)s\u0027), {\u0027node\u0027: task.node.uuid,"},{"line_number":267,"context_line":"                                        \u0027network\u0027: network_uuid})"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_d81b8571","line":264,"updated":"2016-05-17 14:02:11.000000000","message":"Yuriy\u0027s comment from PS 47\n\nNot sure that exception log level should be here, port can be not created yet, this is not \"main\" error.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":261,"context_line":"    except Exception:"},{"line_number":262,"context_line":"        # Log the error, but let the caller invoke the"},{"line_number":263,"context_line":"        # manager.cleaning_error_handler()."},{"line_number":264,"context_line":"        LOG.exception(_LE("},{"line_number":265,"context_line":"            \u0027Failed to rollback port changes for node %(node)s \u0027"},{"line_number":266,"context_line":"            \u0027on network %(network)s\u0027), {\u0027node\u0027: task.node.uuid,"},{"line_number":267,"context_line":"                                        \u0027network\u0027: network_uuid})"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_0db3f80a","line":264,"in_reply_to":"dab17558_d81b8571","updated":"2016-05-24 16:15:18.000000000","message":"LOG.exception is used at the moment\nhttps://github.com/openstack/ironic/blob/master/ironic/dhcp/neutron.py#L420","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"0883c3b7bf011f848a5f4bceb2ea4bc168b8d443","unresolved":false,"context_lines":[{"line_number":267,"context_line":"    try:"},{"line_number":268,"context_line":"        remove_ports_from_network(task, network_uuid)"},{"line_number":269,"context_line":"    except exception.NetworkError:"},{"line_number":270,"context_line":"        # Log the error, but let the caller invoke the"},{"line_number":271,"context_line":"        # error handler."},{"line_number":272,"context_line":"        LOG.exception(_LE("},{"line_number":273,"context_line":"            \u0027Failed to rollback port changes for node %(node)s \u0027"},{"line_number":274,"context_line":"            \u0027on network %(network)s\u0027), {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":54,"id":"7aa08908_dd14f74e","line":271,"range":{"start_line":270,"start_character":29,"end_line":271,"end_character":24},"updated":"2016-06-15 09:34:01.000000000","message":"How caller knows about error here, because exception is not reraised?","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"077fe3d618911bf73ea4047a4ca6b0aed7c64141","unresolved":false,"context_lines":[{"line_number":267,"context_line":"    try:"},{"line_number":268,"context_line":"        remove_ports_from_network(task, network_uuid)"},{"line_number":269,"context_line":"    except exception.NetworkError:"},{"line_number":270,"context_line":"        # Log the error, but let the caller invoke the"},{"line_number":271,"context_line":"        # error handler."},{"line_number":272,"context_line":"        LOG.exception(_LE("},{"line_number":273,"context_line":"            \u0027Failed to rollback port changes for node %(node)s \u0027"},{"line_number":274,"context_line":"            \u0027on network %(network)s\u0027), {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a9d85d2_2b859aac","line":271,"range":{"start_line":270,"start_character":29,"end_line":271,"end_character":24},"in_reply_to":"7aa08908_dd14f74e","updated":"2016-06-21 14:51:42.000000000","message":"Done","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"207a908306851bb70ae5050504d22db4998f7839","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def add_ports_to_network(task, network_uuid, is_flat\u003dFalse):"},{"line_number":90,"context_line":"    \"\"\"Create Neutron ports to boot the ramdisk."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    Create Neutron ports for each pxe_enabled port on task.node to boot"},{"line_number":93,"context_line":"    the ramdisk."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_41e73de4","line":90,"range":{"start_line":90,"start_character":14,"end_line":90,"end_character":21},"updated":"2016-06-28 15:16:00.000000000","message":"nit: s/Neutron/neutron/","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b3b2621b18f17ab98c879fb2140da3b9888d4230","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def add_ports_to_network(task, network_uuid, is_flat\u003dFalse):"},{"line_number":90,"context_line":"    \"\"\"Create Neutron ports to boot the ramdisk."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    Create Neutron ports for each pxe_enabled port on task.node to boot"},{"line_number":93,"context_line":"    the ramdisk."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_dcd2b2ff","line":90,"range":{"start_line":90,"start_character":14,"end_line":90,"end_character":21},"in_reply_to":"3aaa91ec_41e73de4","updated":"2016-06-29 15:07:01.000000000","message":"Done","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"207a908306851bb70ae5050504d22db4998f7839","unresolved":false,"context_lines":[{"line_number":89,"context_line":"def add_ports_to_network(task, network_uuid, is_flat\u003dFalse):"},{"line_number":90,"context_line":"    \"\"\"Create Neutron ports to boot the ramdisk."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    Create Neutron ports for each pxe_enabled port on task.node to boot"},{"line_number":93,"context_line":"    the ramdisk."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    :param task: a TaskManager instance."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_01dd3514","line":92,"range":{"start_line":92,"start_character":11,"end_line":92,"end_character":18},"updated":"2016-06-28 15:16:00.000000000","message":"nit: s/Neutron/neutron/","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b3b2621b18f17ab98c879fb2140da3b9888d4230","unresolved":false,"context_lines":[{"line_number":89,"context_line":"def add_ports_to_network(task, network_uuid, is_flat\u003dFalse):"},{"line_number":90,"context_line":"    \"\"\"Create Neutron ports to boot the ramdisk."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    Create Neutron ports for each pxe_enabled port on task.node to boot"},{"line_number":93,"context_line":"    the ramdisk."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    :param task: a TaskManager instance."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_bccfe654","line":92,"range":{"start_line":92,"start_character":11,"end_line":92,"end_character":18},"in_reply_to":"3aaa91ec_01dd3514","updated":"2016-06-29 15:07:01.000000000","message":"Done","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"207a908306851bb70ae5050504d22db4998f7839","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    the ramdisk."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    :param task: a TaskManager instance."},{"line_number":96,"context_line":"    :param network_uuid: UUID of a Neutron network where ports will be"},{"line_number":97,"context_line":"        created."},{"line_number":98,"context_line":"    :param is_flat: Indicates whether it is a flat network or not."},{"line_number":99,"context_line":"    :raises: NetworkError"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_61ccf961","line":96,"range":{"start_line":96,"start_character":35,"end_line":96,"end_character":42},"updated":"2016-06-28 15:16:00.000000000","message":"nit: s/Neutron/neutron/","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b3b2621b18f17ab98c879fb2140da3b9888d4230","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    the ramdisk."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    :param task: a TaskManager instance."},{"line_number":96,"context_line":"    :param network_uuid: UUID of a Neutron network where ports will be"},{"line_number":97,"context_line":"        created."},{"line_number":98,"context_line":"    :param is_flat: Indicates whether it is a flat network or not."},{"line_number":99,"context_line":"    :raises: NetworkError"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_1cd9da22","line":96,"range":{"start_line":96,"start_character":35,"end_line":96,"end_character":42},"in_reply_to":"3aaa91ec_61ccf961","updated":"2016-06-29 15:07:01.000000000","message":"Done","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"207a908306851bb70ae5050504d22db4998f7839","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def remove_ports_from_network(task, network_uuid):"},{"line_number":180,"context_line":"    \"\"\"Deletes the Neutron ports created for booting the ramdisk."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    :param task: a TaskManager instance."},{"line_number":183,"context_line":"    :param network_uuid: UUID of a Neutron network ports will be deleted from."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_21b311eb","line":180,"range":{"start_line":180,"start_character":19,"end_line":180,"end_character":26},"updated":"2016-06-28 15:16:00.000000000","message":"nit: s/Neutron/neutron/","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b3b2621b18f17ab98c879fb2140da3b9888d4230","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def remove_ports_from_network(task, network_uuid):"},{"line_number":180,"context_line":"    \"\"\"Deletes the Neutron ports created for booting the ramdisk."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    :param task: a TaskManager instance."},{"line_number":183,"context_line":"    :param network_uuid: UUID of a Neutron network ports will be deleted from."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_5c052278","line":180,"range":{"start_line":180,"start_character":19,"end_line":180,"end_character":26},"in_reply_to":"3aaa91ec_21b311eb","updated":"2016-06-29 15:07:01.000000000","message":"Done","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"207a908306851bb70ae5050504d22db4998f7839","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    \"\"\"Deletes the Neutron ports created for booting the ramdisk."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    :param task: a TaskManager instance."},{"line_number":183,"context_line":"    :param network_uuid: UUID of a Neutron network ports will be deleted from."},{"line_number":184,"context_line":"    :raises: NetworkError"},{"line_number":185,"context_line":"    \"\"\""},{"line_number":186,"context_line":"    macs \u003d [p.address for p in task.ports if p.pxe_enabled]"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_61c5193c","line":183,"range":{"start_line":183,"start_character":35,"end_line":183,"end_character":42},"updated":"2016-06-28 15:16:00.000000000","message":"nit: s/Neutron/neutron/","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b3b2621b18f17ab98c879fb2140da3b9888d4230","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    \"\"\"Deletes the Neutron ports created for booting the ramdisk."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    :param task: a TaskManager instance."},{"line_number":183,"context_line":"    :param network_uuid: UUID of a Neutron network ports will be deleted from."},{"line_number":184,"context_line":"    :raises: NetworkError"},{"line_number":185,"context_line":"    \"\"\""},{"line_number":186,"context_line":"    macs \u003d [p.address for p in task.ports if p.pxe_enabled]"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_3c0ad68a","line":183,"range":{"start_line":183,"start_character":35,"end_line":183,"end_character":42},"in_reply_to":"3aaa91ec_61c5193c","updated":"2016-06-29 15:07:01.000000000","message":"Done","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"207a908306851bb70ae5050504d22db4998f7839","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        response \u003d client.list_ports(**params)"},{"line_number":210,"context_line":"    except neutron_exceptions.NeutronClientException as e:"},{"line_number":211,"context_line":"        msg \u003d (_(\u0027Could not get given network vif for %(node)s \u0027"},{"line_number":212,"context_line":"                 \u0027from Neutron, possible network issue. %(exc)s\u0027) %"},{"line_number":213,"context_line":"               {\u0027node\u0027: node_uuid, \u0027exc\u0027: e})"},{"line_number":214,"context_line":"        LOG.exception(msg)"},{"line_number":215,"context_line":"        raise exception.NetworkError(msg)"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_a1a8a178","line":212,"range":{"start_line":212,"start_character":23,"end_line":212,"end_character":30},"updated":"2016-06-28 15:16:00.000000000","message":"nit: s/Neutron/neutron/","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b3b2621b18f17ab98c879fb2140da3b9888d4230","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        response \u003d client.list_ports(**params)"},{"line_number":210,"context_line":"    except neutron_exceptions.NeutronClientException as e:"},{"line_number":211,"context_line":"        msg \u003d (_(\u0027Could not get given network vif for %(node)s \u0027"},{"line_number":212,"context_line":"                 \u0027from Neutron, possible network issue. %(exc)s\u0027) %"},{"line_number":213,"context_line":"               {\u0027node\u0027: node_uuid, \u0027exc\u0027: e})"},{"line_number":214,"context_line":"        LOG.exception(msg)"},{"line_number":215,"context_line":"        raise exception.NetworkError(msg)"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_9cfb0a7b","line":212,"range":{"start_line":212,"start_character":23,"end_line":212,"end_character":30},"in_reply_to":"3aaa91ec_a1a8a178","updated":"2016-06-29 15:07:01.000000000","message":"Done","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"207a908306851bb70ae5050504d22db4998f7839","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    continue."},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    :param task: a TaskManager instance."},{"line_number":267,"context_line":"    :param network_uuid: UUID of a Neutron network."},{"line_number":268,"context_line":"    \"\"\""},{"line_number":269,"context_line":"    try:"},{"line_number":270,"context_line":"        remove_ports_from_network(task, network_uuid)"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_6177d93b","line":267,"range":{"start_line":267,"start_character":35,"end_line":267,"end_character":42},"updated":"2016-06-28 15:16:00.000000000","message":"nit: s/Neutron/neutron/","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b3b2621b18f17ab98c879fb2140da3b9888d4230","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    continue."},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    :param task: a TaskManager instance."},{"line_number":267,"context_line":"    :param network_uuid: UUID of a Neutron network."},{"line_number":268,"context_line":"    \"\"\""},{"line_number":269,"context_line":"    try:"},{"line_number":270,"context_line":"        remove_ports_from_network(task, network_uuid)"}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_7c00de66","line":267,"range":{"start_line":267,"start_character":35,"end_line":267,"end_character":42},"in_reply_to":"3aaa91ec_6177d93b","updated":"2016-06-29 15:07:01.000000000","message":"Done","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"baa5af565f9049da593a24862997eda1711dfe22","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                      \u0027but not affected by this setting) is insecure and \u0027"},{"line_number":51,"context_line":"                      \u0027should only be used for testing.\u0027)),"},{"line_number":52,"context_line":"    cfg.StrOpt(\u0027cleaning_network_uuid\u0027,"},{"line_number":53,"context_line":"               help\u003d_(\u0027Neutron network UUID for the ramdisk to be booted \u0027"},{"line_number":54,"context_line":"                      \u0027into for cleaning nodes. Required for flat \u0027"},{"line_number":55,"context_line":"                      \u0027network driver, and, if DHCP providers are still \u0027"},{"line_number":56,"context_line":"                      \u0027being used and cleaning is enabled, it is also \u0027"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_97b2c3e3","line":53,"updated":"2016-06-29 15:14:22.000000000","message":"Forgot to change this :( Will wait for some more review comment and fix all together.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                      \u0027but not affected by this setting) is insecure and \u0027"},{"line_number":51,"context_line":"                      \u0027should only be used for testing.\u0027)),"},{"line_number":52,"context_line":"    cfg.StrOpt(\u0027cleaning_network_uuid\u0027,"},{"line_number":53,"context_line":"               help\u003d_(\u0027Neutron network UUID for the ramdisk to be booted \u0027"},{"line_number":54,"context_line":"                      \u0027into for cleaning nodes. Required for flat \u0027"},{"line_number":55,"context_line":"                      \u0027network driver, and, if DHCP providers are still \u0027"},{"line_number":56,"context_line":"                      \u0027being used and cleaning is enabled, it is also \u0027"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_599829c0","line":53,"in_reply_to":"3aaa91ec_97b2c3e3","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    client \u003d get_client(task.context.auth_token)"},{"line_number":103,"context_line":"    node \u003d task.node"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    LOG.debug(\u0027For node %(node)s creating neutron ports on flat network\u0027"},{"line_number":106,"context_line":"              \u0027%(network_uuid)s using %(net_iface)s network interface.\u0027,"},{"line_number":107,"context_line":"              {\u0027net_iface\u0027: task.node.network_interface,"},{"line_number":108,"context_line":"               \u0027node\u0027: node.uuid,"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_18a27899","line":105,"updated":"2016-06-29 20:07:44.000000000","message":"maybe s/(node)s/(node)s,/\n\nmissing blank space at end of this (or beginning of next line)\n\nIt isn\u0027t necessarily a flat network; it depends on \u0027is_flat\u0027 value, right?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    client \u003d get_client(task.context.auth_token)"},{"line_number":103,"context_line":"    node \u003d task.node"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    LOG.debug(\u0027For node %(node)s creating neutron ports on flat network\u0027"},{"line_number":106,"context_line":"              \u0027%(network_uuid)s using %(net_iface)s network interface.\u0027,"},{"line_number":107,"context_line":"              {\u0027net_iface\u0027: task.node.network_interface,"},{"line_number":108,"context_line":"               \u0027node\u0027: node.uuid,"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_a4048417","line":105,"in_reply_to":"3aaa91ec_18a27899","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    LOG.debug(\u0027For node %(node)s creating neutron ports on flat network\u0027"},{"line_number":106,"context_line":"              \u0027%(network_uuid)s using %(net_iface)s network interface.\u0027,"},{"line_number":107,"context_line":"              {\u0027net_iface\u0027: task.node.network_interface,"},{"line_number":108,"context_line":"               \u0027node\u0027: node.uuid,"},{"line_number":109,"context_line":"               \u0027network_uuid\u0027: network_uuid})"},{"line_number":110,"context_line":"    body \u003d {"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_38d3f405","line":107,"updated":"2016-06-29 20:07:44.000000000","message":"I have to wonder how useful this is. Wouldn\u0027t it be better to see task.driver.network? (Although from the user\u0027s point of view, node.network_interface is the only thing they can correlate.)","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    LOG.debug(\u0027For node %(node)s creating neutron ports on flat network\u0027"},{"line_number":106,"context_line":"              \u0027%(network_uuid)s using %(net_iface)s network interface.\u0027,"},{"line_number":107,"context_line":"              {\u0027net_iface\u0027: task.node.network_interface,"},{"line_number":108,"context_line":"               \u0027node\u0027: node.uuid,"},{"line_number":109,"context_line":"               \u0027network_uuid\u0027: network_uuid})"},{"line_number":110,"context_line":"    body \u003d {"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_f97c7572","line":107,"in_reply_to":"3aaa91ec_38d3f405","updated":"2016-07-01 13:09:18.000000000","message":"Yeah, driver.network should be here now, as network_interface can be None.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        except neutron_exceptions.NeutronClientException as e:"},{"line_number":143,"context_line":"            rollback_ports(task, network_uuid)"},{"line_number":144,"context_line":"            msg \u003d (_(\u0027Could not create port on given network %(net)s \u0027"},{"line_number":145,"context_line":"                     \u0027from %(node)s. %(exc)s\u0027) %"},{"line_number":146,"context_line":"                   {\u0027net\u0027: network_uuid, \u0027node\u0027: node.uuid, \u0027exc\u0027: e})"},{"line_number":147,"context_line":"            LOG.exception(msg)"},{"line_number":148,"context_line":"            raise exception.NetworkError(msg)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_cb701ca7","line":145,"updated":"2016-06-29 20:07:44.000000000","message":"maybe s/from/from node/  (Otherwise i think you see two UUIDs and it might not be clear.)\n\nyou\u0027re going to hate this, but would it be useful to also spit out the port UUID (ironic_port.uuid)? :)","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        except neutron_exceptions.NeutronClientException as e:"},{"line_number":143,"context_line":"            rollback_ports(task, network_uuid)"},{"line_number":144,"context_line":"            msg \u003d (_(\u0027Could not create port on given network %(net)s \u0027"},{"line_number":145,"context_line":"                     \u0027from %(node)s. %(exc)s\u0027) %"},{"line_number":146,"context_line":"                   {\u0027net\u0027: network_uuid, \u0027node\u0027: node.uuid, \u0027exc\u0027: e})"},{"line_number":147,"context_line":"            LOG.exception(msg)"},{"line_number":148,"context_line":"            raise exception.NetworkError(msg)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_b91cad77","line":145,"in_reply_to":"3aaa91ec_cb701ca7","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af57777c8ec41d75d99bf2f945b4c4b56f6a2f5b","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                   {\u0027net\u0027: network_uuid, \u0027node\u0027: node.uuid, \u0027exc\u0027: e})"},{"line_number":147,"context_line":"            LOG.exception(msg)"},{"line_number":148,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        extra_dict \u003d ironic_port.extra"},{"line_number":151,"context_line":"        # Backup existing vif"},{"line_number":152,"context_line":"        vif \u003d extra_dict.get(\u0027vif_port_id\u0027)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_329bef67","line":149,"updated":"2016-06-30 11:38:50.000000000","message":"lets have LOG.info about successfully created ports","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                   {\u0027net\u0027: network_uuid, \u0027node\u0027: node.uuid, \u0027exc\u0027: e})"},{"line_number":147,"context_line":"            LOG.exception(msg)"},{"line_number":148,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        extra_dict \u003d ironic_port.extra"},{"line_number":151,"context_line":"        # Backup existing vif"},{"line_number":152,"context_line":"        vif \u003d extra_dict.get(\u0027vif_port_id\u0027)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_64b29c95","line":149,"in_reply_to":"3aaa91ec_329bef67","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        LOG.debug(\"Removing ports on network %(net)s on node %(node)s.\","},{"line_number":193,"context_line":"                  {\u0027net\u0027: network_uuid, \u0027node\u0027: task.node.uuid})"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        remove_neutron_ports(task, params, task.node.uuid)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"def remove_neutron_ports(task, params, node_uuid):"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_4b1b8cca","line":195,"updated":"2016-06-29 20:07:44.000000000","message":"I find it interesting that add_ports_to_network() contains all/most of the work, yet you split up remove_ports_from_network() to call remove_neutron_ports().","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        LOG.debug(\"Removing ports on network %(net)s on node %(node)s.\","},{"line_number":193,"context_line":"                  {\u0027net\u0027: network_uuid, \u0027node\u0027: task.node.uuid})"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        remove_neutron_ports(task, params, task.node.uuid)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"def remove_neutron_ports(task, params, node_uuid):"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_7fd4e5e7","line":195,"in_reply_to":"3aaa91ec_4b1b8cca","updated":"2016-07-01 13:09:18.000000000","message":"It\u0027s used in subsequent patch in the neutron network driver","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"def remove_neutron_ports(task, params, node_uuid):"},{"line_number":199,"context_line":"    \"\"\"Deletes the neutron ports matched by params."},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    :param task: a TaskManager instance."},{"line_number":202,"context_line":"    :param params: Dict of params to filter ports."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_cbe93cb9","line":199,"updated":"2016-06-29 20:07:44.000000000","message":"the node is available from the task, but this is fine.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"def remove_neutron_ports(task, params, node_uuid):"},{"line_number":199,"context_line":"    \"\"\"Deletes the neutron ports matched by params."},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    :param task: a TaskManager instance."},{"line_number":202,"context_line":"    :param params: Dict of params to filter ports."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_5fd0091f","line":199,"in_reply_to":"3aaa91ec_cbe93cb9","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af57777c8ec41d75d99bf2f945b4c4b56f6a2f5b","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    :param task: a TaskManager instance."},{"line_number":202,"context_line":"    :param params: Dict of params to filter ports."},{"line_number":203,"context_line":"    :param node_uuid:  Node UUID."},{"line_number":204,"context_line":"    :raises: NetworkError"},{"line_number":205,"context_line":"    \"\"\""},{"line_number":206,"context_line":"    client \u003d get_client(task.context.auth_token)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_92a463a6","line":203,"updated":"2016-06-30 11:38:50.000000000","message":"I think we should remove it and use task.node.uuid","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    :param task: a TaskManager instance."},{"line_number":202,"context_line":"    :param params: Dict of params to filter ports."},{"line_number":203,"context_line":"    :param node_uuid:  Node UUID."},{"line_number":204,"context_line":"    :raises: NetworkError"},{"line_number":205,"context_line":"    \"\"\""},{"line_number":206,"context_line":"    client \u003d get_client(task.context.auth_token)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_3fcb7d73","line":203,"in_reply_to":"3aaa91ec_92a463a6","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"af57777c8ec41d75d99bf2f945b4c4b56f6a2f5b","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                   {\u0027vif\u0027: port[\u0027id\u0027], \u0027node\u0027: node_uuid, \u0027exc\u0027: e})"},{"line_number":241,"context_line":"            LOG.exception(msg)"},{"line_number":242,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"def get_node_portmap(task):"},{"line_number":246,"context_line":"    \"\"\"Extract the switch port information for the node."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_72a1f793","line":243,"updated":"2016-06-30 11:38:50.000000000","message":"lets have LOG.info with a success message","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                   {\u0027vif\u0027: port[\u0027id\u0027], \u0027node\u0027: node_uuid, \u0027exc\u0027: e})"},{"line_number":241,"context_line":"            LOG.exception(msg)"},{"line_number":242,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"def get_node_portmap(task):"},{"line_number":246,"context_line":"    \"\"\"Extract the switch port information for the node."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_d1a22dad","line":243,"in_reply_to":"3aaa91ec_72a1f793","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        portmap[port.uuid] \u003d port.local_link_connection"},{"line_number":255,"context_line":"    return portmap"},{"line_number":256,"context_line":"    # TODO(jroll) raise InvalidParameterValue if a port doesn\u0027t have the"},{"line_number":257,"context_line":"    # necessary info? (probably)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"def rollback_ports(task, network_uuid):"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_4b670cb7","line":257,"updated":"2016-06-29 20:07:44.000000000","message":"Is this something we want to try to address now?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20533d8b623d21c6c934b6677f2bc1cde2860645","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        portmap[port.uuid] \u003d port.local_link_connection"},{"line_number":255,"context_line":"    return portmap"},{"line_number":256,"context_line":"    # TODO(jroll) raise InvalidParameterValue if a port doesn\u0027t have the"},{"line_number":257,"context_line":"    # necessary info? (probably)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"def rollback_ports(task, network_uuid):"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_8e4c379f","line":257,"in_reply_to":"3aaa91ec_4b670cb7","updated":"2016-06-30 14:51:11.000000000","message":"Assuming that the API for this is added in the following patches, we should not do it here :)","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    LOG.info(_LI(\u0027Successfully removed node %(node_uuid)s neutron ports.\u0027),"},{"line_number":252,"context_line":"             {\u0027node_uuid\u0027: node_uuid})"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"def get_node_portmap(task):"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_29fe3837","line":252,"updated":"2016-07-05 17:43:03.000000000","message":"nit: I don\u0027t know whether it is worth outputting the params dict.\n\nnit: grammatically it is \"node \u003cnodeUUID\u003e\u0027s\". But I\u0027m not sure I care because I think it might look ugly :)","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"80de034814e0dbd92136341c2a556c6b619d1e24","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    LOG.info(_LI(\u0027Successfully removed node %(node_uuid)s neutron ports.\u0027),"},{"line_number":252,"context_line":"             {\u0027node_uuid\u0027: node_uuid})"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"def get_node_portmap(task):"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_53d65d28","line":252,"in_reply_to":"1aa78d24_29fe3837","updated":"2016-07-07 18:08:14.000000000","message":"We print the log message about ports being removed, params value is kind of an internal thing. We might want to output it in case of error during list_ports, but I\u0027m pretty sure neutron client exception will contain it.","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b817d532bf61eac7eedbb49c200f42436596aa65","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        try:"},{"line_number":152,"context_line":"            # Match return value of get_node_vif_ids()"},{"line_number":153,"context_line":"            ports[ironic_port.uuid] \u003d port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":154,"context_line":"        except KeyError:"},{"line_number":155,"context_line":"            failures.append(ironic_port.uuid)"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_2008702d","line":152,"updated":"2016-07-08 01:09:18.000000000","message":"Is this true? I mean, this isn\u0027t the same as the return value of network.get_node_vif_ids(), which is eg\n\n               {\u0027ports\u0027: {\u0027port.uuid\u0027: vif.id},\n                \u0027portgroups\u0027: {\u0027portgroup.uuid\u0027: vif.id}}","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6e01bf091551c62978b7857feb91391008ad9b30","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        try:"},{"line_number":152,"context_line":"            # Match return value of get_node_vif_ids()"},{"line_number":153,"context_line":"            ports[ironic_port.uuid] \u003d port[\u0027port\u0027][\u0027id\u0027]"},{"line_number":154,"context_line":"        except KeyError:"},{"line_number":155,"context_line":"            failures.append(ironic_port.uuid)"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_905af128","line":152,"in_reply_to":"1aa78d24_2008702d","updated":"2016-07-11 10:12:55.000000000","message":"Yeah, I\u0027ll remove this.","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"}],"ironic/conductor/base_manager.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        # all the network drivers are loaded at the very beginning, and"},{"line_number":103,"context_line":"        # failures prevent the conductor to start."},{"line_number":104,"context_line":"        driver_factory.NetworkInterfaceFactory()"},{"line_number":105,"context_line":"        if not drivers:"},{"line_number":106,"context_line":"            msg \u003d _LE(\"Conductor %s cannot be started because no drivers \""},{"line_number":107,"context_line":"                      \"were loaded.  This could be because no drivers were \""},{"line_number":108,"context_line":"                      \"specified in \u0027enabled_drivers\u0027 config option.\")"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_c3b2944b","line":105,"updated":"2016-04-20 19:41:26.000000000","message":"This is related to driver_factory.drivers(). I\u0027d rather keep the code together.\n\nWhat do you think about moving line 104+comments to before line 99 or after line 110? I\u0027m guessing you put it there because it could also raise DriverLoadError/DriverNotFound but when you read the comments, it isn\u0027t clear that line 99 also applies to line 104 anyway.\n\nI am also wondering, why don\u0027t you check to see if there are any network drivers loaded? Can things work if there are none loaded?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        # NOTE(vdrok): instantiate network interface factory on startup so that"},{"line_number":103,"context_line":"        # all the network drivers are loaded at the very beginning, and"},{"line_number":104,"context_line":"        # failures prevent the conductor to start."},{"line_number":105,"context_line":"        driver_factory.NetworkInterfaceFactory()"},{"line_number":106,"context_line":"        if not drivers:"},{"line_number":107,"context_line":"            msg \u003d _LE(\"Conductor %s cannot be started because no drivers \""},{"line_number":108,"context_line":"                      \"were loaded.  This could be because no drivers were \""}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_b56a0d18","line":105,"updated":"2016-05-17 14:02:11.000000000","message":"Ruby\u0027s comment from PS 39\n\nThis is related to driver_factory.drivers(). I\u0027d rather keep the code together.\nWhat do you think about moving line 104+comments to before line 99 or after line 110? I\u0027m guessing you put it there because it could also raise DriverLoadError/DriverNotFound but when you read the comments, it isn\u0027t clear that line 99 also applies to line 104 anyway.\nI am also wondering, why don\u0027t you check to see if there are any network drivers loaded? Can things work if there are none loaded?","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        # NOTE(vdrok): instantiate network interface factory on startup so that"},{"line_number":103,"context_line":"        # all the network drivers are loaded at the very beginning, and"},{"line_number":104,"context_line":"        # failures prevent the conductor to start."},{"line_number":105,"context_line":"        driver_factory.NetworkInterfaceFactory()"},{"line_number":106,"context_line":"        if not drivers:"},{"line_number":107,"context_line":"            msg \u003d _LE(\"Conductor %s cannot be started because no drivers \""},{"line_number":108,"context_line":"                      \"were loaded.  This could be because no drivers were \""}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_f0a6470d","line":105,"in_reply_to":"dab17558_b56a0d18","updated":"2016-05-24 16:15:18.000000000","message":"L106 checks that at least one driver is loaded, otherwise conductor won\u0027t start.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        # NOTE(deva): these calls may raise DriverLoadError or DriverNotFound"},{"line_number":87,"context_line":"        # NOTE(vdrok): instantiate network interface factory on startup so that"},{"line_number":88,"context_line":"        # all the network drivers are loaded at the very beginning, and"},{"line_number":89,"context_line":"        # failures prevent the conductor to start."},{"line_number":90,"context_line":"        drivers \u003d driver_factory.drivers()"},{"line_number":91,"context_line":"        driver_factory.NetworkInterfaceFactory()"},{"line_number":92,"context_line":"        if not drivers:"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_18955886","line":89,"updated":"2016-06-29 20:07:44.000000000","message":"s/to start/from starting/","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        # NOTE(deva): these calls may raise DriverLoadError or DriverNotFound"},{"line_number":87,"context_line":"        # NOTE(vdrok): instantiate network interface factory on startup so that"},{"line_number":88,"context_line":"        # all the network drivers are loaded at the very beginning, and"},{"line_number":89,"context_line":"        # failures prevent the conductor to start."},{"line_number":90,"context_line":"        drivers \u003d driver_factory.drivers()"},{"line_number":91,"context_line":"        driver_factory.NetworkInterfaceFactory()"},{"line_number":92,"context_line":"        if not drivers:"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_d12ced03","line":89,"in_reply_to":"3aaa91ec_18955886","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                      \"specified in \u0027enabled_drivers\u0027 config option.\")"},{"line_number":96,"context_line":"            LOG.error(msg, self.host)"},{"line_number":97,"context_line":"            raise exception.NoDriversLoaded(conductor\u003dself.host)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        # NOTE(jroll) this is passed to the dbapi, which requires a list, not"},{"line_number":100,"context_line":"        # a generator (which keys() returns in py3)"},{"line_number":101,"context_line":"        driver_names \u003d list(drivers)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_581520e3","line":98,"updated":"2016-06-29 20:07:44.000000000","message":"Should we also check if any network interfaces/drivers were loaded? If none were loaded, will things still work?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                      \"specified in \u0027enabled_drivers\u0027 config option.\")"},{"line_number":96,"context_line":"            LOG.error(msg, self.host)"},{"line_number":97,"context_line":"            raise exception.NoDriversLoaded(conductor\u003dself.host)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        # NOTE(jroll) this is passed to the dbapi, which requires a list, not"},{"line_number":100,"context_line":"        # a generator (which keys() returns in py3)"},{"line_number":101,"context_line":"        driver_names \u003d list(drivers)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_51d3dd03","line":98,"in_reply_to":"3aaa91ec_581520e3","updated":"2016-07-01 13:09:18.000000000","message":"For now, we still don\u0027t remove dhcp providers, so yes, it should work.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"}],"ironic/conductor/manager.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        if \u0027maintenance\u0027 in delta and not node_obj.maintenance:"},{"line_number":223,"context_line":"            node_obj.maintenance_reason \u003d None"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        allowed_update_states \u003d [states.ENROLL, states.INSPECTING,"},{"line_number":226,"context_line":"                                 states.MANAGEABLE]"},{"line_number":227,"context_line":"        if (\u0027network_interface\u0027 in delta and"},{"line_number":228,"context_line":"                not (node_obj.provision_state in allowed_update_states or"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_a31e7809","line":225,"updated":"2016-04-20 19:41:26.000000000","message":"My concern with this is that I worry in the future, someone will see this and think that these are the only states that allow *any* updates to the node.\n\nMaybe move this, eg:\n\n    if (\u0027network_interface\u0027 in delta):\n        allowed_update_states \u003d ...\n        etc.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        allowed_update_states \u003d [states.ENROLL, states.INSPECTING,"},{"line_number":223,"context_line":"                                 states.MANAGEABLE]"},{"line_number":224,"context_line":"        if (\u0027network_interface\u0027 in delta and"},{"line_number":225,"context_line":"                not (node_obj.provision_state in allowed_update_states or"},{"line_number":226,"context_line":"                     node_obj.maintenance)):"},{"line_number":227,"context_line":"            action \u003d _(\"Node %(node)s can not have network_interface updated \""}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_f54775a0","line":224,"updated":"2016-05-17 14:02:11.000000000","message":"Ruby\u0027s comment from PS 39\n\nMy concern with this is that I worry in the future, someone will see this and think that these are the only states that allow *any* updates to the node.\nMaybe move this, eg:\n    if (\u0027network_interface\u0027 in delta):\n        allowed_update_states \u003d ...\n        etc.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        allowed_update_states \u003d [states.ENROLL, states.INSPECTING,"},{"line_number":223,"context_line":"                                 states.MANAGEABLE]"},{"line_number":224,"context_line":"        if (\u0027network_interface\u0027 in delta and"},{"line_number":225,"context_line":"                not (node_obj.provision_state in allowed_update_states or"},{"line_number":226,"context_line":"                     node_obj.maintenance)):"},{"line_number":227,"context_line":"            action \u003d _(\"Node %(node)s can not have network_interface updated \""}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_83197724","line":224,"in_reply_to":"dab17558_f54775a0","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"2c6e7d91043b81b2ede01abc68a51b5a5d114a21","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        if \u0027maintenance\u0027 in delta and not node_obj.maintenance:"},{"line_number":220,"context_line":"            node_obj.maintenance_reason \u003d None"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        if \u0027network_interface\u0027 in delta:"},{"line_number":223,"context_line":"            allowed_update_states \u003d [states.ENROLL, states.INSPECTING,"},{"line_number":224,"context_line":"                                     states.MANAGEABLE]"},{"line_number":225,"context_line":"            if not (node_obj.provision_state in allowed_update_states or"}],"source_content_type":"text/x-python","patch_set":50,"id":"bab6814e_85455444","line":222,"updated":"2016-05-26 12:17:39.000000000","message":"You can move this to API patch.","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"3425b92c992de374b2f86e63908375f613a491ca","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        if \u0027maintenance\u0027 in delta and not node_obj.maintenance:"},{"line_number":220,"context_line":"            node_obj.maintenance_reason \u003d None"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        if \u0027network_interface\u0027 in delta:"},{"line_number":223,"context_line":"            allowed_update_states \u003d [states.ENROLL, states.INSPECTING,"},{"line_number":224,"context_line":"                                     states.MANAGEABLE]"},{"line_number":225,"context_line":"            if not (node_obj.provision_state in allowed_update_states or"}],"source_content_type":"text/x-python","patch_set":50,"id":"bab6814e_b6736c4d","line":222,"in_reply_to":"bab6814e_85455444","updated":"2016-05-26 14:58:06.000000000","message":"Done","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"0883c3b7bf011f848a5f4bceb2ea4bc168b8d443","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    @messaging.expected_exceptions(exception.InvalidParameterValue,"},{"line_number":198,"context_line":"                                   exception.MissingParameterValue,"},{"line_number":199,"context_line":"                                   exception.NodeLocked,"},{"line_number":200,"context_line":"                                   exception.InvalidState)"},{"line_number":201,"context_line":"    def update_node(self, context, node_obj):"},{"line_number":202,"context_line":"        \"\"\"Update a node with the supplied data."},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"7aa08908_88750bfc","line":200,"range":{"start_line":200,"start_character":35,"end_line":200,"end_character":57},"updated":"2016-06-15 09:34:01.000000000","message":"Sorry I do not see that this exception is raised inside this method.","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"077fe3d618911bf73ea4047a4ca6b0aed7c64141","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    @messaging.expected_exceptions(exception.InvalidParameterValue,"},{"line_number":198,"context_line":"                                   exception.MissingParameterValue,"},{"line_number":199,"context_line":"                                   exception.NodeLocked,"},{"line_number":200,"context_line":"                                   exception.InvalidState)"},{"line_number":201,"context_line":"    def update_node(self, context, node_obj):"},{"line_number":202,"context_line":"        \"\"\"Update a node with the supplied data."},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"5a9d85d2_a629c18b","line":200,"range":{"start_line":200,"start_character":35,"end_line":200,"end_character":57},"in_reply_to":"7aa08908_88750bfc","updated":"2016-06-21 14:51:42.000000000","message":"Done","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"}],"ironic/db/sqlalchemy/alembic/versions/e294876e8028_add_node_network_interface.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ca62191bcefc3cbc987a4b5a347932e06e604667","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"def upgrade():"},{"line_number":19,"context_line":"    op.add_column(\u0027nodes\u0027, sa.Column(\u0027network_interface\u0027,"},{"line_number":20,"context_line":"                                     sa.String(255)))"},{"line_number":21,"context_line":"    nodes \u003d table(\u0027nodes\u0027,"},{"line_number":22,"context_line":"                  column(\u0027uuid\u0027, sa.String(36)),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_f84a1a25","line":19,"updated":"2016-03-09 15:55:44.000000000","message":"Migration test needed too.","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"aa6419f8d9e1fc787613c2008a7dffa893909c2c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                  column(\u0027network_interface\u0027, sa.String(255)))"},{"line_number":36,"context_line":"    op.execute("},{"line_number":37,"context_line":"        nodes.update().values("},{"line_number":38,"context_line":"            {\u0027network_interface\u0027: \u0027flat\u0027}))"}],"source_content_type":"text/x-python","patch_set":44,"id":"dab17558_f126dfcc","line":38,"updated":"2016-05-09 16:47:51.000000000","message":"This will break people who have dhcp_provider \u003d None we probably need to add a conditional in here e.g.\n\n    if CONF.dhcp.dhcp_provider \u003d\u003d Neutron:\n        op.execute(\n            nodes.update().values(\n                {\u0027network_interface\u0027: \u0027flat\u0027}))\n    elif CONF.dhcp.dhcp_provider \u003d\u003d None:\n        op.execute(\n            nodes.update().values(\n                {\u0027network_interface\u0027: \u0027none\u0027}))","commit_id":"6e452b351e7079ff4c4590bfcd10819dcf57bf20"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"66c5499437a981c9748c6b1da45f4f78590d879a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                  column(\u0027network_interface\u0027, sa.String(255)))"},{"line_number":36,"context_line":"    op.execute("},{"line_number":37,"context_line":"        nodes.update().values("},{"line_number":38,"context_line":"            {\u0027network_interface\u0027: \u0027flat\u0027}))"}],"source_content_type":"text/x-python","patch_set":44,"id":"dab17558_bd43b86b","line":38,"in_reply_to":"dab17558_f126dfcc","updated":"2016-05-13 05:58:27.000000000","message":"Done","commit_id":"6e452b351e7079ff4c4590bfcd10819dcf57bf20"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7bafa24026562dad4001465dc8c744fcef818108","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    nodes \u003d table(\u0027nodes\u0027,"},{"line_number":39,"context_line":"                  column(\u0027uuid\u0027, sa.String(36)),"},{"line_number":40,"context_line":"                  column(\u0027network_interface\u0027, sa.String(255)))"},{"line_number":41,"context_line":"    if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027:"},{"line_number":42,"context_line":"        op.execute("},{"line_number":43,"context_line":"            nodes.update().values("},{"line_number":44,"context_line":"                {\u0027network_interface\u0027: \u0027flat\u0027}))"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_0b90a34d","line":41,"updated":"2016-05-13 14:17:08.000000000","message":"nit:\n\n net_iface \u003d \u0027flat\u0027 if CONF.dhcp.dhcp_provider \u003d\u003d \u0027neutron\u0027 else \u0027none\u0027\n op.execute(nodes.update().values({\u0027network_interface\u0027: net_iface}))","commit_id":"9f322b904b226db23242737b022dc38661003c8d"}],"ironic/dhcp/neutron.py":[{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"34c36d40453a39d6f7cc3bac1e929540eaecd140","unresolved":false,"context_lines":[{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"},{"line_number":279,"context_line":"        return neutron.add_ports_to_network(task,"},{"line_number":280,"context_line":"                                            CONF.neutron.cleaning_network_uuid)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def delete_cleaning_ports(self, task):"},{"line_number":283,"context_line":"        \"\"\"Deletes the neutron port created for booting the ramdisk."}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_81cad56c","line":280,"updated":"2016-03-08 10:57:09.000000000","message":"This should call to the network provider not the neutron function directly.","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1bb990f7f4ce5c928ccfc3f64f6340a7350da6d2","unresolved":false,"context_lines":[{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"},{"line_number":279,"context_line":"        return neutron.add_ports_to_network(task,"},{"line_number":280,"context_line":"                                            CONF.neutron.cleaning_network_uuid)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def delete_cleaning_ports(self, task):"},{"line_number":283,"context_line":"        \"\"\"Deletes the neutron port created for booting the ramdisk."}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_15114304","line":280,"in_reply_to":"5aef4532_81cad56c","updated":"2016-03-10 17:46:42.000000000","message":"Done","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"34c36d40453a39d6f7cc3bac1e929540eaecd140","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                        \u0027used instead.\u0027))"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        neutron.remove_ports_from_network(task,"},{"line_number":292,"context_line":"                                          CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_e1c9197a","line":292,"updated":"2016-03-08 10:57:09.000000000","message":"Ditto.","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1bb990f7f4ce5c928ccfc3f64f6340a7350da6d2","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                        \u0027used instead.\u0027))"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        neutron.remove_ports_from_network(task,"},{"line_number":292,"context_line":"                                          CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_95fd53b3","line":292,"in_reply_to":"5aef4532_e1c9197a","updated":"2016-03-10 17:46:42.000000000","message":"Done","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e4c25ae2079c2b27a15699c28d5381fb454f2760","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        :raises: InvalidParameterValue if the cleaning network is None"},{"line_number":268,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":269,"context_line":"        \"\"\""},{"line_number":270,"context_line":"        LOG.warning(_LW(\u0027create_cleaning_ports via dhcp provider is \u0027"},{"line_number":271,"context_line":"                        \u0027deprecated. The network provider should be \u0027"},{"line_number":272,"context_line":"                        \u0027used instead.\u0027))"},{"line_number":273,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1af94dfe_6482aec9","line":270,"updated":"2016-03-18 18:06:16.000000000","message":"network interface should be used instead of these methods, which should be done in deploy_utils, need to move it from old patch too.","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"c7fcea08ce8fe62d5f21b5194d2bfe436749cfbe","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":269,"context_line":"        \"\"\""},{"line_number":270,"context_line":"        LOG.warning(_LW(\u0027create_cleaning_ports via dhcp provider is \u0027"},{"line_number":271,"context_line":"                        \u0027deprecated. The network provider should be \u0027"},{"line_number":272,"context_line":"                        \u0027used instead.\u0027))"},{"line_number":273,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"},{"line_number":274,"context_line":"        return task.driver.network.add_cleaning_network(task)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_1cbad923","line":271,"range":{"start_line":271,"start_character":49,"end_line":271,"end_character":57},"updated":"2016-03-21 15:26:26.000000000","message":"s/provider/interface","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"214f97658bcd2056d07f5b0c2017580ad57ff473","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        :raises: InvalidParameterValue if the cleaning network is None"},{"line_number":268,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":269,"context_line":"        \"\"\""},{"line_number":270,"context_line":"        LOG.warning(_LW(\u0027create_cleaning_ports via dhcp provider is \u0027"},{"line_number":271,"context_line":"                        \u0027deprecated. The network interface should be \u0027"},{"line_number":272,"context_line":"                        \u0027used instead.\u0027))"},{"line_number":273,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba0121b8_28c0894f","line":270,"updated":"2016-03-31 22:13:10.000000000","message":"You may want to ensure this log only prints once, not on every method call for this since it\u0027s a deprecation.","commit_id":"16b1b70f4937347f32e6322139f5c6a485b3ab9c"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"cf3d9f38a091e41a850d5db8ba8e2814cf32f71c","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        :raises: InvalidParameterValue if the cleaning network is None"},{"line_number":268,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":269,"context_line":"        \"\"\""},{"line_number":270,"context_line":"        LOG.warning(_LW(\u0027create_cleaning_ports via dhcp provider is \u0027"},{"line_number":271,"context_line":"                        \u0027deprecated. The network interface should be \u0027"},{"line_number":272,"context_line":"                        \u0027used instead.\u0027))"},{"line_number":273,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba0121b8_b3c35337","line":270,"in_reply_to":"ba0121b8_28c0894f","updated":"2016-04-01 12:45:55.000000000","message":"I think it is ok to warn user about deprecation every time method is called.","commit_id":"16b1b70f4937347f32e6322139f5c6a485b3ab9c"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"5c7e42358bc03cc8ce5a4929b20cfc9883889e09","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        :raises: InvalidParameterValue if the cleaning network is None"},{"line_number":268,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":269,"context_line":"        \"\"\""},{"line_number":270,"context_line":"        LOG.warning(_LW(\u0027create_cleaning_ports via dhcp provider is \u0027"},{"line_number":271,"context_line":"                        \u0027deprecated. The network interface should be \u0027"},{"line_number":272,"context_line":"                        \u0027used instead.\u0027))"},{"line_number":273,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba0121b8_0c98076a","line":270,"in_reply_to":"ba0121b8_b3c35337","updated":"2016-04-01 20:14:50.000000000","message":"Frankly, the reason I put this comment here is because I got a similar comment from Devananda about a deprecation in this patch https://review.openstack.org/#/c/263842/\n\nHonestly, from operating OpenStack in production, I find logs already extremely spammy. I think it\u0027s sensible to prevent this from spamming up logs more than once per run.","commit_id":"16b1b70f4937347f32e6322139f5c6a485b3ab9c"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"214f97658bcd2056d07f5b0c2017580ad57ff473","unresolved":false,"context_lines":[{"line_number":278,"context_line":""},{"line_number":279,"context_line":"        :param task: a TaskManager instance."},{"line_number":280,"context_line":"        \"\"\""},{"line_number":281,"context_line":"        LOG.warning(_LW(\u0027delete_cleaning_ports via dhcp provider is \u0027"},{"line_number":282,"context_line":"                        \u0027deprecated. The network interface should be \u0027"},{"line_number":283,"context_line":"                        \u0027used instead.\u0027))"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"ba0121b8_68b601fa","line":281,"updated":"2016-03-31 22:13:10.000000000","message":"ditto","commit_id":"16b1b70f4937347f32e6322139f5c6a485b3ab9c"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"78ba06556eaac7130cfa623e33f0401d42e7c2e0","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        :raises: InvalidParameterValue if the cleaning network is None"},{"line_number":268,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":269,"context_line":"        \"\"\""},{"line_number":270,"context_line":"        LOG.warning(_LW(\u0027create_cleaning_ports via dhcp provider is \u0027"},{"line_number":271,"context_line":"                        \u0027deprecated. The network interface should be \u0027"},{"line_number":272,"context_line":"                        \u0027used instead.\u0027))"},{"line_number":273,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":36,"id":"5a18252c_3b953f40","line":270,"updated":"2016-04-11 22:28:31.000000000","message":"Per https://specs.openstack.org/openstack/openstack-specs/specs/log-guidelines.html#operator-deprecation-warnings this should be printed only exactly once. As it is it will print as many times as this is called.","commit_id":"c6fb4fe5e9fe304076acdc3cee09d900c1fcf985"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"78ba06556eaac7130cfa623e33f0401d42e7c2e0","unresolved":false,"context_lines":[{"line_number":278,"context_line":""},{"line_number":279,"context_line":"        :param task: a TaskManager instance."},{"line_number":280,"context_line":"        \"\"\""},{"line_number":281,"context_line":"        LOG.warning(_LW(\u0027delete_cleaning_ports via dhcp provider is \u0027"},{"line_number":282,"context_line":"                        \u0027deprecated. The network interface should be \u0027"},{"line_number":283,"context_line":"                        \u0027used instead.\u0027))"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"5a18252c_7b9fb75f","line":281,"updated":"2016-04-11 22:28:31.000000000","message":"same, see https://specs.openstack.org/openstack/openstack-specs/specs/log-guidelines.html#operator-deprecation-warnings","commit_id":"c6fb4fe5e9fe304076acdc3cee09d900c1fcf985"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"17ceb41063a301c6a0291f376a4bb89168535dc6","unresolved":false,"context_lines":[{"line_number":266,"context_line":"        \"\"\"Create neutron ports for each port on task.node to boot the ramdisk."},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        :param task: a TaskManager instance."},{"line_number":269,"context_line":"        :raises: InvalidParameterValue if the cleaning network is None"},{"line_number":270,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":271,"context_line":"        \"\"\""},{"line_number":272,"context_line":"        global create_cleaning_ports_deprecation"}],"source_content_type":"text/x-python","patch_set":38,"id":"5a18252c_f4854807","line":269,"range":{"start_line":269,"start_character":17,"end_line":269,"end_character":38},"updated":"2016-04-13 12:02:47.000000000","message":"Here should be NetworkError as the add_cleaning_network() only raise that exception but not InvalidParameterValue.","commit_id":"d7cc4b85a8e7025a5d07626dc55dba064f602b26"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"5bf29370ff82d8bf0a551b5ebd204cec6016863a","unresolved":false,"context_lines":[{"line_number":266,"context_line":"        \"\"\"Create neutron ports for each port on task.node to boot the ramdisk."},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        :param task: a TaskManager instance."},{"line_number":269,"context_line":"        :raises: InvalidParameterValue if the cleaning network is None"},{"line_number":270,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":271,"context_line":"        \"\"\""},{"line_number":272,"context_line":"        global create_cleaning_ports_deprecation"}],"source_content_type":"text/x-python","patch_set":38,"id":"5a18252c_4d0b8b8e","line":269,"range":{"start_line":269,"start_character":17,"end_line":269,"end_character":38},"in_reply_to":"5a18252c_f4854807","updated":"2016-04-14 15:10:39.000000000","message":"Done","commit_id":"d7cc4b85a8e7025a5d07626dc55dba064f602b26"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"74acd92b73e26a2fe84d2919ef5c82998c66a23c","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        global create_cleaning_ports_deprecation"},{"line_number":273,"context_line":"        if not create_cleaning_ports_deprecation:"},{"line_number":274,"context_line":"            LOG.warning(_LW(\u0027create_cleaning_ports via dhcp provider is \u0027"},{"line_number":275,"context_line":"                            \u0027deprecated. The network interface should be \u0027"},{"line_number":276,"context_line":"                            \u0027used instead.\u0027))"},{"line_number":277,"context_line":"            create_cleaning_ports_deprecation \u003d True"},{"line_number":278,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_01af9fe2","line":275,"range":{"start_line":275,"start_character":52,"end_line":275,"end_character":53},"updated":"2016-04-19 19:37:28.000000000","message":"nit: s/network\\ interface/node\\ network_interface\\ setting/","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                            \u0027used instead.\u0027))"},{"line_number":277,"context_line":"            create_cleaning_ports_deprecation \u003d True"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"        return task.driver.network.add_cleaning_network(task)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def delete_cleaning_ports(self, task):"},{"line_number":282,"context_line":"        \"\"\"Deletes the neutron port created for booting the ramdisk."}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_3750de0a","line":279,"updated":"2016-04-20 19:41:26.000000000","message":"I take it that we\u0027re actually going to delete this method in the future. It would be useful to add a TODO: with some time frame as to when it will be deleted. And mention that in the warning. That the method will be deleted/removed in the future.\n\nAssuming this gets into Newton, when will we remove this method?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                            \u0027used instead.\u0027))"},{"line_number":291,"context_line":"            delete_cleaning_ports_deprecation \u003d True"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        task.driver.network.remove_cleaning_network(task)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_890b9623","line":293,"updated":"2016-04-20 19:41:26.000000000","message":"ditto about a TODO/removal of this method.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        \"\"\"Create neutron ports for each port on task.node to boot the ramdisk."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        :param task: a TaskManager instance."},{"line_number":279,"context_line":"        :raises: NetworkError"},{"line_number":280,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":281,"context_line":"        \"\"\""},{"line_number":282,"context_line":"        global create_cleaning_ports_deprecation"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_95e6e9ad","line":279,"updated":"2016-05-17 14:02:11.000000000","message":"Ruby\u0027s comment from PS 39\n\nI take it that we\u0027re actually going to delete this method in the future. It would be useful to add a TODO: with some time frame as to when it will be deleted. And mention that in the warning. That the method will be deleted/removed in the future.\nAssuming this gets into Newton, when will we remove this method?","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        \"\"\"Create neutron ports for each port on task.node to boot the ramdisk."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        :param task: a TaskManager instance."},{"line_number":279,"context_line":"        :raises: NetworkError"},{"line_number":280,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":281,"context_line":"        \"\"\""},{"line_number":282,"context_line":"        global create_cleaning_ports_deprecation"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_030bc77d","line":279,"in_reply_to":"dab17558_95e6e9ad","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        global create_cleaning_ports_deprecation"},{"line_number":283,"context_line":"        if not create_cleaning_ports_deprecation:"},{"line_number":284,"context_line":"            LOG.warning(_LW(\u0027create_cleaning_ports via dhcp provider is \u0027"},{"line_number":285,"context_line":"                            \u0027deprecated. The network interface should be \u0027"},{"line_number":286,"context_line":"                            \u0027used instead.\u0027))"},{"line_number":287,"context_line":"            create_cleaning_ports_deprecation \u003d True"},{"line_number":288,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_ff7ab4b8","line":285,"updated":"2016-05-17 14:02:11.000000000","message":"Comment from Julia on PS 39:\n\nnit: s/network\\ interface/node\\ network_interface\\ setting/","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        global create_cleaning_ports_deprecation"},{"line_number":283,"context_line":"        if not create_cleaning_ports_deprecation:"},{"line_number":284,"context_line":"            LOG.warning(_LW(\u0027create_cleaning_ports via dhcp provider is \u0027"},{"line_number":285,"context_line":"                            \u0027deprecated. The network interface should be \u0027"},{"line_number":286,"context_line":"                            \u0027used instead.\u0027))"},{"line_number":287,"context_line":"            create_cleaning_ports_deprecation \u003d True"},{"line_number":288,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_6371f30b","line":285,"in_reply_to":"dab17558_ff7ab4b8","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":291,"context_line":"    def delete_cleaning_ports(self, task):"},{"line_number":292,"context_line":"        \"\"\"Deletes the neutron port created for booting the ramdisk."},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        :param task: a TaskManager instance."},{"line_number":295,"context_line":"        \"\"\""},{"line_number":296,"context_line":"        global delete_cleaning_ports_deprecation"},{"line_number":297,"context_line":"        if not delete_cleaning_ports_deprecation:"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_359a9d14","line":294,"updated":"2016-05-17 14:02:11.000000000","message":"ditto","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":291,"context_line":"    def delete_cleaning_ports(self, task):"},{"line_number":292,"context_line":"        \"\"\"Deletes the neutron port created for booting the ramdisk."},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        :param task: a TaskManager instance."},{"line_number":295,"context_line":"        \"\"\""},{"line_number":296,"context_line":"        global delete_cleaning_ports_deprecation"},{"line_number":297,"context_line":"        if not delete_cleaning_ports_deprecation:"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_03e747ac","line":294,"in_reply_to":"dab17558_359a9d14","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        global delete_cleaning_ports_deprecation"},{"line_number":297,"context_line":"        if not delete_cleaning_ports_deprecation:"},{"line_number":298,"context_line":"            LOG.warning(_LW(\u0027delete_cleaning_ports via dhcp provider is \u0027"},{"line_number":299,"context_line":"                            \u0027deprecated. The network interface should be \u0027"},{"line_number":300,"context_line":"                            \u0027used instead.\u0027))"},{"line_number":301,"context_line":"            delete_cleaning_ports_deprecation \u003d True"},{"line_number":302,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_5f4ca09d","line":299,"updated":"2016-05-17 14:02:11.000000000","message":"ditto","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        global delete_cleaning_ports_deprecation"},{"line_number":297,"context_line":"        if not delete_cleaning_ports_deprecation:"},{"line_number":298,"context_line":"            LOG.warning(_LW(\u0027delete_cleaning_ports via dhcp provider is \u0027"},{"line_number":299,"context_line":"                            \u0027deprecated. The network interface should be \u0027"},{"line_number":300,"context_line":"                            \u0027used instead.\u0027))"},{"line_number":301,"context_line":"            delete_cleaning_ports_deprecation \u003d True"},{"line_number":302,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_a3f3db71","line":299,"in_reply_to":"dab17558_5f4ca09d","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        global create_cleaning_ports_deprecation"},{"line_number":284,"context_line":"        if not create_cleaning_ports_deprecation:"},{"line_number":285,"context_line":"            LOG.warning(_LW(\u0027create_cleaning_ports via dhcp provider is \u0027"},{"line_number":286,"context_line":"                            \u0027deprecated. The node network_interface setting \u0027"},{"line_number":287,"context_line":"                            \u0027should be used instead.\u0027))"},{"line_number":288,"context_line":"            create_cleaning_ports_deprecation \u003d True"},{"line_number":289,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_35277dcb","line":286,"updated":"2016-06-29 20:07:44.000000000","message":"either \"node.network_interface\" or \"node\u0027s network_interface\".","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        global create_cleaning_ports_deprecation"},{"line_number":284,"context_line":"        if not create_cleaning_ports_deprecation:"},{"line_number":285,"context_line":"            LOG.warning(_LW(\u0027create_cleaning_ports via dhcp provider is \u0027"},{"line_number":286,"context_line":"                            \u0027deprecated. The node network_interface setting \u0027"},{"line_number":287,"context_line":"                            \u0027should be used instead.\u0027))"},{"line_number":288,"context_line":"            create_cleaning_ports_deprecation \u003d True"},{"line_number":289,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_7147f9a2","line":286,"in_reply_to":"3aaa91ec_35277dcb","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":287,"context_line":"                            \u0027should be used instead.\u0027))"},{"line_number":288,"context_line":"            create_cleaning_ports_deprecation \u003d True"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        return task.driver.network.add_cleaning_network(task)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    # TODO(vsaienko) Remove this method when deprecation period is passed"},{"line_number":293,"context_line":"    # in Ocata."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_78b73c3a","line":290,"updated":"2016-06-29 20:07:44.000000000","message":"So maybe I\u0027ll figure it out when I look at more of the patches, because I am not sure how someone that called this method, will know to call the node\u0027s driver\u0027s network.add_cleaning_network() method. (They shouldn\u0027t actually have to call that from their code?)","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":287,"context_line":"                            \u0027should be used instead.\u0027))"},{"line_number":288,"context_line":"            create_cleaning_ports_deprecation \u003d True"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        return task.driver.network.add_cleaning_network(task)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    # TODO(vsaienko) Remove this method when deprecation period is passed"},{"line_number":293,"context_line":"    # in Ocata."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_d1618d3a","line":290,"in_reply_to":"3aaa91ec_78b73c3a","updated":"2016-07-01 13:09:18.000000000","message":"From deprecation warnings, docs and release notes.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"}],"ironic/drivers/base.py":[{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"c7c69424358269b3499d9af88ccb65b457dea0ea","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    A reference to an instance of :class:NetworkInterface."},{"line_number":167,"context_line":"    \"\"\""},{"line_number":168,"context_line":"    core_interfaces.append(\u0027network\u0027)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def __init__(self):"},{"line_number":171,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_4476d206","line":168,"updated":"2016-02-29 12:14:41.000000000","message":"Any reason why this couldn\u0027t be in the BaseDriver class above?","commit_id":"67583130139cc25e948322678918f0305781a8d3"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7df63d2856c5e4b658160b8c032cf0838dc5805e","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    A reference to an instance of :class:NetworkInterface."},{"line_number":167,"context_line":"    \"\"\""},{"line_number":168,"context_line":"    core_interfaces.append(\u0027network\u0027)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def __init__(self):"},{"line_number":171,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_1e29aae6","line":168,"in_reply_to":"9aed3d3a_4476d206","updated":"2016-02-29 14:03:47.000000000","message":"Because this is only available to instances of the BareDriver class, the old driver stuff won\u0027t be able to use it. If we put it on BaseDriver, it will be copied over from that driver in build_driver_for_task","commit_id":"67583130139cc25e948322678918f0305781a8d3"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"c7fcea08ce8fe62d5f21b5194d2bfe436749cfbe","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    \"\"\"A bare driver object which will have interfaces attached later."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    Any composable interfaces should be added as class attributes of this"},{"line_number":160,"context_line":"    class, as well as appended to core_interfaces or standard_interfaces here."},{"line_number":161,"context_line":"    \"\"\""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_bc512d65","line":160,"updated":"2016-03-21 15:26:26.000000000","message":"Now we\u0027re adding the network interface attribute and appending the core_interface list at object instantiation, should we change this doc string?","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"17ceb41063a301c6a0291f376a4bb89168535dc6","unresolved":false,"context_lines":[{"line_number":1034,"context_line":"        \"\"\"Add the provisioning network to a node."},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":"        :param task: A TaskManager instance."},{"line_number":1037,"context_line":"        :raises: InvalidParameterValue"},{"line_number":1038,"context_line":"        :raises: NetworkError"},{"line_number":1039,"context_line":"        \"\"\""},{"line_number":1040,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"5a18252c_34c6a049","line":1037,"range":{"start_line":1037,"start_character":17,"end_line":1037,"end_character":38},"updated":"2016-04-13 12:02:47.000000000","message":"It should be NetworkError.","commit_id":"d7cc4b85a8e7025a5d07626dc55dba064f602b26"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"5bf29370ff82d8bf0a551b5ebd204cec6016863a","unresolved":false,"context_lines":[{"line_number":1034,"context_line":"        \"\"\"Add the provisioning network to a node."},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":"        :param task: A TaskManager instance."},{"line_number":1037,"context_line":"        :raises: InvalidParameterValue"},{"line_number":1038,"context_line":"        :raises: NetworkError"},{"line_number":1039,"context_line":"        \"\"\""},{"line_number":1040,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"5a18252c_28e6fd43","line":1037,"range":{"start_line":1037,"start_character":17,"end_line":1037,"end_character":38},"in_reply_to":"5a18252c_34c6a049","updated":"2016-04-14 15:10:39.000000000","message":"Done","commit_id":"d7cc4b85a8e7025a5d07626dc55dba064f602b26"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"17ceb41063a301c6a0291f376a4bb89168535dc6","unresolved":false,"context_lines":[{"line_number":1066,"context_line":""},{"line_number":1067,"context_line":"        :param task: A TaskManager instance."},{"line_number":1068,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":1069,"context_line":"        :raises: InvalidParameterValue"},{"line_number":1070,"context_line":"        \"\"\""},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":38,"id":"5a18252c_b4e0f0cd","line":1069,"range":{"start_line":1069,"start_character":17,"end_line":1069,"end_character":38},"updated":"2016-04-13 12:02:47.000000000","message":"ditto","commit_id":"d7cc4b85a8e7025a5d07626dc55dba064f602b26"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"5bf29370ff82d8bf0a551b5ebd204cec6016863a","unresolved":false,"context_lines":[{"line_number":1066,"context_line":""},{"line_number":1067,"context_line":"        :param task: A TaskManager instance."},{"line_number":1068,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":1069,"context_line":"        :raises: InvalidParameterValue"},{"line_number":1070,"context_line":"        \"\"\""},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":38,"id":"5a18252c_087d01b1","line":1069,"range":{"start_line":1069,"start_character":17,"end_line":1069,"end_character":38},"in_reply_to":"5a18252c_b4e0f0cd","updated":"2016-04-14 15:10:39.000000000","message":"Done","commit_id":"d7cc4b85a8e7025a5d07626dc55dba064f602b26"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7bafa24026562dad4001465dc8c744fcef818108","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"    @abc.abstractmethod"},{"line_number":1043,"context_line":"    def remove_provisioning_network(self, task):"},{"line_number":1044,"context_line":"        \"\"\"Remove the provisioning network from a node."},{"line_number":1045,"context_line":""},{"line_number":1046,"context_line":"        :param task: A TaskManager instance."},{"line_number":1047,"context_line":"        \"\"\""},{"line_number":1048,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_bd8e0125","line":1045,"updated":"2016-05-13 14:17:08.000000000","message":"in Neutron implementation :raises: NetworkError","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7bafa24026562dad4001465dc8c744fcef818108","unresolved":false,"context_lines":[{"line_number":1057,"context_line":"    @abc.abstractmethod"},{"line_number":1058,"context_line":"    def unconfigure_tenant_networks(self, task):"},{"line_number":1059,"context_line":"        \"\"\"Unconfigure tenant networks for a node."},{"line_number":1060,"context_line":""},{"line_number":1061,"context_line":"        :param task: A TaskManager instance."},{"line_number":1062,"context_line":"        \"\"\""},{"line_number":1063,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_dd9b0565","line":1060,"updated":"2016-05-13 14:17:08.000000000","message":"ditto","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1030,"context_line":"class NetworkInterface(object):"},{"line_number":1031,"context_line":"    \"\"\"Base class for network drivers.\"\"\""},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"    def get_properties(self):"},{"line_number":1034,"context_line":"        \"\"\"Return the properties of the interface."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_158881c4","line":1031,"updated":"2016-06-29 20:07:44.000000000","message":"s/drivers/interfaces/","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1030,"context_line":"class NetworkInterface(object):"},{"line_number":1031,"context_line":"    \"\"\"Base class for network drivers.\"\"\""},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"    def get_properties(self):"},{"line_number":1034,"context_line":"        \"\"\"Return the properties of the interface."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_5160fd00","line":1031,"in_reply_to":"3aaa91ec_158881c4","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"}],"ironic/drivers/modules/agent.py":[{"author":{"_account_id":12459,"name":"Stephanie Miller","email":"stephane@alum.mit.edu","username":"cinerama"},"change_message_id":"74dc3f005b167bee115e7bf9c4696793506339b1","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        \"\"\"Clean up the PXE and DHCP files after cleaning."},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        :param task: a TaskManager object containing the node"},{"line_number":396,"context_line":"        :raises: NodeCleaningFailure, NetwokError if the cleaning ports cannot"},{"line_number":397,"context_line":"            be removed"},{"line_number":398,"context_line":"        \"\"\""},{"line_number":399,"context_line":"        deploy_utils.tear_down_inband_cleaning("}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_3977d403","line":396,"range":{"start_line":396,"start_character":38,"end_line":396,"end_character":49},"updated":"2016-07-08 21:51:44.000000000","message":"typo: NetworkError","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6e01bf091551c62978b7857feb91391008ad9b30","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        \"\"\"Clean up the PXE and DHCP files after cleaning."},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        :param task: a TaskManager object containing the node"},{"line_number":396,"context_line":"        :raises: NodeCleaningFailure, NetwokError if the cleaning ports cannot"},{"line_number":397,"context_line":"            be removed"},{"line_number":398,"context_line":"        \"\"\""},{"line_number":399,"context_line":"        deploy_utils.tear_down_inband_cleaning("}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_7074a59b","line":396,"range":{"start_line":396,"start_character":38,"end_line":396,"end_character":49},"in_reply_to":"1aa78d24_3977d403","updated":"2016-07-11 10:12:55.000000000","message":"Will do, thanks!","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"}],"ironic/drivers/modules/deploy_utils.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":895,"context_line":"    capabilities \u003d parse_instance_info_capabilities(node)"},{"line_number":896,"context_line":"    return capabilities.get(\u0027boot_option\u0027, \u0027netboot\u0027).lower()"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":""},{"line_number":899,"context_line":"def build_agent_options(node):"},{"line_number":900,"context_line":"    \"\"\"Build the options to be passed to the agent ramdisk."},{"line_number":901,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_1ac86273","line":898,"updated":"2016-04-20 19:41:26.000000000","message":"Do we have a list of supported APIs? Just want to make sure that it is OK to delete prepare_cleaning_ports() and tear_down_cleaning_ports(). Why is it OK to delete these, but we have to deprecate dhcp/neutron.py, create_cleaning_ports()/delete_cleaning_ports()? Oh, probably because dhcp stuff has a dhcp/base class...","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"74acd92b73e26a2fe84d2919ef5c82998c66a23c","unresolved":false,"context_lines":[{"line_number":939,"context_line":"    :raises NodeCleaningFailure: if the previous cleaning ports cannot"},{"line_number":940,"context_line":"        be removed or if new cleaning ports cannot be created"},{"line_number":941,"context_line":"    \"\"\""},{"line_number":942,"context_line":"    task.driver.network.add_cleaning_network(task)"},{"line_number":943,"context_line":""},{"line_number":944,"context_line":"    # Append required config parameters to node\u0027s driver_internal_info"},{"line_number":945,"context_line":"    # to pass to IPA."}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_f4c33f87","line":942,"updated":"2016-04-19 19:37:28.000000000","message":"Since this would be effectively a breaking change for anyone who has upgraded, but not seen the upgrade note or performed database/node changes to continue operation, wouldn\u0027t it make sense to only allow this call to trigger if dhcp_provider is not set to None?\n\nOr embed it in the flat network driver logic since that is the default, and without it being set to neutron, it would have been non-functional previously?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":939,"context_line":"    :raises NodeCleaningFailure: if the previous cleaning ports cannot"},{"line_number":940,"context_line":"        be removed or if new cleaning ports cannot be created"},{"line_number":941,"context_line":"    \"\"\""},{"line_number":942,"context_line":"    task.driver.network.add_cleaning_network(task)"},{"line_number":943,"context_line":""},{"line_number":944,"context_line":"    # Append required config parameters to node\u0027s driver_internal_info"},{"line_number":945,"context_line":"    # to pass to IPA."}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_8914364d","line":942,"in_reply_to":"1a122d0e_36dbdb50","updated":"2016-04-20 19:41:26.000000000","message":"So this is an interesting question. I think that if someone is calling this method, they would/should have followed the upgrade. It may be similar to the change in code in dhcp/neutron.py, create_cleaning_ports().","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0deda79dc1179657cdeef1fe7cfc5312efddd880","unresolved":false,"context_lines":[{"line_number":939,"context_line":"    :raises NodeCleaningFailure: if the previous cleaning ports cannot"},{"line_number":940,"context_line":"        be removed or if new cleaning ports cannot be created"},{"line_number":941,"context_line":"    \"\"\""},{"line_number":942,"context_line":"    task.driver.network.add_cleaning_network(task)"},{"line_number":943,"context_line":""},{"line_number":944,"context_line":"    # Append required config parameters to node\u0027s driver_internal_info"},{"line_number":945,"context_line":"    # to pass to IPA."}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_36dbdb50","line":942,"in_reply_to":"1a122d0e_f4c33f87","updated":"2016-04-20 10:39:00.000000000","message":"Hi Julia, thanks for review. I think it does not make sense - if someone have not seen an upgrade note - conductor won\u0027t start at all and won\u0027t get here. If someone has not upgraded the DB - I think it\u0027s too much bikeshedding to support this - to add some ifs on every DB upgrade. And I think we should not assume anything about the intentions as we don\u0027t know exactly what operator wanted to do :)","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"74acd92b73e26a2fe84d2919ef5c82998c66a23c","unresolved":false,"context_lines":[{"line_number":986,"context_line":"    if manage_boot:"},{"line_number":987,"context_line":"        task.driver.boot.clean_up_ramdisk(task)"},{"line_number":988,"context_line":""},{"line_number":989,"context_line":"    task.driver.network.remove_cleaning_network(task)"},{"line_number":990,"context_line":""},{"line_number":991,"context_line":""},{"line_number":992,"context_line":"def get_image_instance_info(node):"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_94392ba7","line":989,"range":{"start_line":989,"start_character":3,"end_line":989,"end_character":53},"updated":"2016-04-19 19:37:28.000000000","message":"Same concern as above.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0deda79dc1179657cdeef1fe7cfc5312efddd880","unresolved":false,"context_lines":[{"line_number":986,"context_line":"    if manage_boot:"},{"line_number":987,"context_line":"        task.driver.boot.clean_up_ramdisk(task)"},{"line_number":988,"context_line":""},{"line_number":989,"context_line":"    task.driver.network.remove_cleaning_network(task)"},{"line_number":990,"context_line":""},{"line_number":991,"context_line":""},{"line_number":992,"context_line":"def get_image_instance_info(node):"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_76e9d3e5","line":989,"range":{"start_line":989,"start_character":3,"end_line":989,"end_character":53},"in_reply_to":"1a122d0e_94392ba7","updated":"2016-04-20 10:39:00.000000000","message":"ditto","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"0883c3b7bf011f848a5f4bceb2ea4bc168b8d443","unresolved":false,"context_lines":[{"line_number":950,"context_line":"        automatically boot agent ramdisk every time bare metal node is"},{"line_number":951,"context_line":"        rebooted."},{"line_number":952,"context_line":"    :returns: states.CLEANWAIT to signify an asynchronous prepare."},{"line_number":953,"context_line":"    :raises NodeCleaningFailure: if the previous cleaning ports cannot"},{"line_number":954,"context_line":"        be removed or if new cleaning ports cannot be created"},{"line_number":955,"context_line":"    \"\"\""},{"line_number":956,"context_line":"    task.driver.network.add_cleaning_network(task)"}],"source_content_type":"text/x-python","patch_set":54,"id":"7aa08908_2807b71e","line":953,"range":{"start_line":953,"start_character":12,"end_line":953,"end_character":31},"updated":"2016-06-15 09:34:01.000000000","message":"This exception is not raised now, NetworkError should be here.","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"077fe3d618911bf73ea4047a4ca6b0aed7c64141","unresolved":false,"context_lines":[{"line_number":950,"context_line":"        automatically boot agent ramdisk every time bare metal node is"},{"line_number":951,"context_line":"        rebooted."},{"line_number":952,"context_line":"    :returns: states.CLEANWAIT to signify an asynchronous prepare."},{"line_number":953,"context_line":"    :raises NodeCleaningFailure: if the previous cleaning ports cannot"},{"line_number":954,"context_line":"        be removed or if new cleaning ports cannot be created"},{"line_number":955,"context_line":"    \"\"\""},{"line_number":956,"context_line":"    task.driver.network.add_cleaning_network(task)"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a9d85d2_e65aa929","line":953,"range":{"start_line":953,"start_character":12,"end_line":953,"end_character":31},"in_reply_to":"7aa08908_2807b71e","updated":"2016-06-21 14:51:42.000000000","message":"Done","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"0883c3b7bf011f848a5f4bceb2ea4bc168b8d443","unresolved":false,"context_lines":[{"line_number":984,"context_line":"    :param manage_boot: If this is set to True, this method calls the"},{"line_number":985,"context_line":"        \u0027clean_up_ramdisk\u0027 method of boot interface to boot the agent"},{"line_number":986,"context_line":"        ramdisk. If False, it skips this step."},{"line_number":987,"context_line":"    :raises NodeCleaningFailure: if the cleaning ports cannot be"},{"line_number":988,"context_line":"        removed."},{"line_number":989,"context_line":"    \"\"\""},{"line_number":990,"context_line":"    manager_utils.node_power_action(task, states.POWER_OFF)"}],"source_content_type":"text/x-python","patch_set":54,"id":"7aa08908_83320cf1","line":987,"range":{"start_line":987,"start_character":12,"end_line":987,"end_character":32},"updated":"2016-06-15 09:34:01.000000000","message":"ditto","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"077fe3d618911bf73ea4047a4ca6b0aed7c64141","unresolved":false,"context_lines":[{"line_number":984,"context_line":"    :param manage_boot: If this is set to True, this method calls the"},{"line_number":985,"context_line":"        \u0027clean_up_ramdisk\u0027 method of boot interface to boot the agent"},{"line_number":986,"context_line":"        ramdisk. If False, it skips this step."},{"line_number":987,"context_line":"    :raises NodeCleaningFailure: if the cleaning ports cannot be"},{"line_number":988,"context_line":"        removed."},{"line_number":989,"context_line":"    \"\"\""},{"line_number":990,"context_line":"    manager_utils.node_power_action(task, states.POWER_OFF)"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a9d85d2_46429d3f","line":987,"range":{"start_line":987,"start_character":12,"end_line":987,"end_character":32},"in_reply_to":"7aa08908_83320cf1","updated":"2016-06-21 14:51:42.000000000","message":"Done","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"413d17daa8b0695f0342f3f65322bfd9c77b4525","unresolved":false,"context_lines":[{"line_number":959,"context_line":"    # deprecated"},{"line_number":960,"context_line":"    if CONF.dhcp.dhcp_provider \u003d\u003d \u0027none\u0027:"},{"line_number":961,"context_line":"        LOG.warning(_LW(\u0027You are using \"none\" DHCP provider. DHCP providers \u0027"},{"line_number":962,"context_line":"                        \u0027will be deprecated in ???. Please update your client \u0027"},{"line_number":963,"context_line":"                        \u0027to use newer API microversion and switch to \"none\" \u0027"},{"line_number":964,"context_line":"                        \u0027network_interface set per node\u0027))"},{"line_number":965,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":55,"id":"5a9d85d2_5df387d6","line":962,"range":{"start_line":962,"start_character":47,"end_line":962,"end_character":51},"updated":"2016-06-21 14:54:03.000000000","message":"Not sure when this should happen.","commit_id":"bb2c3320afc47764b34657a07e3fb4b4b9ff7005"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"816252ab06da98a504a72daca9772131bc511f93","unresolved":false,"context_lines":[{"line_number":953,"context_line":"    :raises NetworkError: if the previous cleaning ports cannot"},{"line_number":954,"context_line":"        be removed or if new cleaning ports cannot be created"},{"line_number":955,"context_line":"    \"\"\""},{"line_number":956,"context_line":"    task.driver.network.add_cleaning_network(task)"},{"line_number":957,"context_line":""},{"line_number":958,"context_line":"    # Append required config parameters to node\u0027s driver_internal_info"},{"line_number":959,"context_line":"    # to pass to IPA."}],"source_content_type":"text/x-python","patch_set":57,"id":"3aaa91ec_095a534f","line":956,"updated":"2016-06-23 12:22:07.000000000","message":"This change breaks all custom 3-party DHCP providers (but not sure that they exist) which implement create/delete cleaning ports. Maybe add info to release note?","commit_id":"018adb14e709a7a0a00ae894059c8f1aa2268cdb"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"cb054f2ef0d2db6e76528e8cab8a88d6af99686a","unresolved":false,"context_lines":[{"line_number":909,"context_line":"    return capabilities.get(\u0027boot_option\u0027, \u0027netboot\u0027).lower()"},{"line_number":910,"context_line":""},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"def prepare_cleaning_ports(task):"},{"line_number":913,"context_line":"    \"\"\"Prepare the Ironic ports of the node for cleaning."},{"line_number":914,"context_line":""},{"line_number":915,"context_line":"    This method deletes the cleaning ports currently existing"}],"source_content_type":"text/x-python","patch_set":58,"id":"3aaa91ec_fc1b2ec8","side":"PARENT","line":912,"updated":"2016-06-23 17:08:35.000000000","message":"It is possible to retain backwards compatibility with dhcp providers if we leave prepare_cleaning_ports and tear_down_cleaning_ports functions here as is. We can call driver.network only in case when the cleaning methods are undefined in dhcp provider. This will allow a proper deprecation but will mean that we\u0027ll have some duplicated code in common.neutron and here.","commit_id":"982773da4fabc862c60df849de57218c72657d92"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"f6ee338e40a026aaf7450e3e74cc3a9c1b519ff0","unresolved":false,"context_lines":[{"line_number":909,"context_line":"    return capabilities.get(\u0027boot_option\u0027, \u0027netboot\u0027).lower()"},{"line_number":910,"context_line":""},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"def prepare_cleaning_ports(task):"},{"line_number":913,"context_line":"    \"\"\"Prepare the Ironic ports of the node for cleaning."},{"line_number":914,"context_line":""},{"line_number":915,"context_line":"    This method deletes the cleaning ports currently existing"}],"source_content_type":"text/x-python","patch_set":58,"id":"3aaa91ec_2db394ea","side":"PARENT","line":912,"in_reply_to":"3aaa91ec_fc1b2ec8","updated":"2016-06-24 14:04:06.000000000","message":"Changed this to properly do the deprecation of dhcp providers with using these methods.","commit_id":"982773da4fabc862c60df849de57218c72657d92"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"f3bbfaae690288a440842dacf161de7f1203e315","unresolved":false,"context_lines":[{"line_number":909,"context_line":"    return capabilities.get(\u0027boot_option\u0027, \u0027netboot\u0027).lower()"},{"line_number":910,"context_line":""},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"# TODO(vdrok): Remove the following two methods in Ocata"},{"line_number":913,"context_line":"def prepare_cleaning_ports(task):"},{"line_number":914,"context_line":"    \"\"\"Prepare the Ironic ports of the node for cleaning."},{"line_number":915,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_28e0a2f9","line":912,"updated":"2016-06-24 15:03:30.000000000","message":"Maybe worth naming the methods to be removed, in case someone adds another method in between them.","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e52759cfc24f80db1e43b2c2446d4fe90b7b7f06","unresolved":false,"context_lines":[{"line_number":909,"context_line":"    return capabilities.get(\u0027boot_option\u0027, \u0027netboot\u0027).lower()"},{"line_number":910,"context_line":""},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"# TODO(vdrok): Remove the following two methods in Ocata"},{"line_number":913,"context_line":"def prepare_cleaning_ports(task):"},{"line_number":914,"context_line":"    \"\"\"Prepare the Ironic ports of the node for cleaning."},{"line_number":915,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_8a618ed5","line":912,"in_reply_to":"3aaa91ec_28e0a2f9","updated":"2016-06-27 10:49:22.000000000","message":"+1, and please describe shortly about backward compatibility here.","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"df313ebfdd3c599f6a296e79b88bb186fdfe1d08","unresolved":false,"context_lines":[{"line_number":909,"context_line":"    return capabilities.get(\u0027boot_option\u0027, \u0027netboot\u0027).lower()"},{"line_number":910,"context_line":""},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"# TODO(vdrok): Remove the following two methods in Ocata"},{"line_number":913,"context_line":"def prepare_cleaning_ports(task):"},{"line_number":914,"context_line":"    \"\"\"Prepare the Ironic ports of the node for cleaning."},{"line_number":915,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_9334024b","line":912,"in_reply_to":"3aaa91ec_8a618ed5","updated":"2016-07-01 13:10:02.000000000","message":"Done","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e52759cfc24f80db1e43b2c2446d4fe90b7b7f06","unresolved":false,"context_lines":[{"line_number":919,"context_line":"    of each Ironic port, after creating the cleaning ports."},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"    :param task: a TaskManager object containing the node"},{"line_number":922,"context_line":"    :raises NodeCleaningFailure: if the previous cleaning ports cannot"},{"line_number":923,"context_line":"        be removed or if new cleaning ports cannot be created"},{"line_number":924,"context_line":"    \"\"\""},{"line_number":925,"context_line":"    provider \u003d dhcp_factory.DHCPFactory()"}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_2aae9a2d","line":922,"updated":"2016-06-27 10:49:22.000000000","message":"also raises NetworkError","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"df313ebfdd3c599f6a296e79b88bb186fdfe1d08","unresolved":false,"context_lines":[{"line_number":919,"context_line":"    of each Ironic port, after creating the cleaning ports."},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"    :param task: a TaskManager object containing the node"},{"line_number":922,"context_line":"    :raises NodeCleaningFailure: if the previous cleaning ports cannot"},{"line_number":923,"context_line":"        be removed or if new cleaning ports cannot be created"},{"line_number":924,"context_line":"    \"\"\""},{"line_number":925,"context_line":"    provider \u003d dhcp_factory.DHCPFactory()"}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_13f2d29a","line":922,"in_reply_to":"3aaa91ec_2aae9a2d","updated":"2016-07-01 13:10:02.000000000","message":"Ugh, correct.","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e52759cfc24f80db1e43b2c2446d4fe90b7b7f06","unresolved":false,"context_lines":[{"line_number":980,"context_line":"    was started."},{"line_number":981,"context_line":""},{"line_number":982,"context_line":"    :param task: a TaskManager object containing the node"},{"line_number":983,"context_line":"    :raises NodeCleaningFailure: if the cleaning ports cannot be"},{"line_number":984,"context_line":"        removed."},{"line_number":985,"context_line":"    \"\"\""},{"line_number":986,"context_line":"    # If we created cleaning ports, delete them"}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_4a616604","line":983,"updated":"2016-06-27 10:49:22.000000000","message":"also raises NetworkError","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"df313ebfdd3c599f6a296e79b88bb186fdfe1d08","unresolved":false,"context_lines":[{"line_number":980,"context_line":"    was started."},{"line_number":981,"context_line":""},{"line_number":982,"context_line":"    :param task: a TaskManager object containing the node"},{"line_number":983,"context_line":"    :raises NodeCleaningFailure: if the cleaning ports cannot be"},{"line_number":984,"context_line":"        removed."},{"line_number":985,"context_line":"    \"\"\""},{"line_number":986,"context_line":"    # If we created cleaning ports, delete them"}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_b3f49e87","line":983,"in_reply_to":"3aaa91ec_4a616604","updated":"2016-07-01 13:10:02.000000000","message":"Done","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"207a908306851bb70ae5050504d22db4998f7839","unresolved":false,"context_lines":[{"line_number":909,"context_line":"    return capabilities.get(\u0027boot_option\u0027, \u0027netboot\u0027).lower()"},{"line_number":910,"context_line":""},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"# TODO(vdrok): This metod is left here for backwards compatibility with out of"},{"line_number":913,"context_line":"# tree DHCP providers implementing cleaning methods. Remove it in Ocata"},{"line_number":914,"context_line":"def prepare_cleaning_ports(task):"},{"line_number":915,"context_line":"    \"\"\"Prepare the Ironic ports of the node for cleaning."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_ae2a508e","line":912,"updated":"2016-06-28 15:16:00.000000000","message":"nit: s/metod/method/","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b3b2621b18f17ab98c879fb2140da3b9888d4230","unresolved":false,"context_lines":[{"line_number":909,"context_line":"    return capabilities.get(\u0027boot_option\u0027, \u0027netboot\u0027).lower()"},{"line_number":910,"context_line":""},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"# TODO(vdrok): This metod is left here for backwards compatibility with out of"},{"line_number":913,"context_line":"# tree DHCP providers implementing cleaning methods. Remove it in Ocata"},{"line_number":914,"context_line":"def prepare_cleaning_ports(task):"},{"line_number":915,"context_line":"    \"\"\"Prepare the Ironic ports of the node for cleaning."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_bcf6c68c","line":912,"in_reply_to":"3aaa91ec_ae2a508e","updated":"2016-06-29 15:07:01.000000000","message":"Done","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"207a908306851bb70ae5050504d22db4998f7839","unresolved":false,"context_lines":[{"line_number":974,"context_line":"                port.save()"},{"line_number":975,"context_line":""},{"line_number":976,"context_line":""},{"line_number":977,"context_line":"# TODO(vdrok): This metod is left here for backwards compatibility with out of"},{"line_number":978,"context_line":"# tree DHCP providers implementing cleaning methods. Remove it in Ocata"},{"line_number":979,"context_line":"def tear_down_cleaning_ports(task):"},{"line_number":980,"context_line":"    \"\"\"Deletes the cleaning ports created for each of the Ironic ports."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_ce06bc1f","line":977,"range":{"start_line":977,"start_character":20,"end_line":977,"end_character":25},"updated":"2016-06-28 15:16:00.000000000","message":"nit: s/metod/method/","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b3b2621b18f17ab98c879fb2140da3b9888d4230","unresolved":false,"context_lines":[{"line_number":974,"context_line":"                port.save()"},{"line_number":975,"context_line":""},{"line_number":976,"context_line":""},{"line_number":977,"context_line":"# TODO(vdrok): This metod is left here for backwards compatibility with out of"},{"line_number":978,"context_line":"# tree DHCP providers implementing cleaning methods. Remove it in Ocata"},{"line_number":979,"context_line":"def tear_down_cleaning_ports(task):"},{"line_number":980,"context_line":"    \"\"\"Deletes the cleaning ports created for each of the Ironic ports."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_fceccebc","line":977,"range":{"start_line":977,"start_character":20,"end_line":977,"end_character":25},"in_reply_to":"3aaa91ec_ce06bc1f","updated":"2016-06-29 15:07:01.000000000","message":"Done","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":935,"context_line":"            (not provider_manages_delete_cleaning and"},{"line_number":936,"context_line":"             not provider_manages_create_cleaning)):"},{"line_number":937,"context_line":"        task.driver.network.add_cleaning_network(task)"},{"line_number":938,"context_line":"        return"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"    LOG.warning(_LW(\"delete_cleaning_ports and create_cleaning_ports \""},{"line_number":941,"context_line":"                    \"functions in DHCP providers are deprecated, please move \""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_f51df562","line":938,"updated":"2016-06-29 20:07:44.000000000","message":"This method was called, even though no cleaning would have been done cuz they didn\u0027t provide the expected cleaning methods. Should we still log a warning though -- since the method was called and it shouldn\u0027t be?\n\nwhat will happen when this method is deleted? task.driver.network.add_cleaning_network() won\u0027t be called at all? Will that be a problem?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":935,"context_line":"            (not provider_manages_delete_cleaning and"},{"line_number":936,"context_line":"             not provider_manages_create_cleaning)):"},{"line_number":937,"context_line":"        task.driver.network.add_cleaning_network(task)"},{"line_number":938,"context_line":"        return"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"    LOG.warning(_LW(\"delete_cleaning_ports and create_cleaning_ports \""},{"line_number":941,"context_line":"                    \"functions in DHCP providers are deprecated, please move \""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_11103558","line":938,"in_reply_to":"3aaa91ec_44b41934","updated":"2016-07-01 13:09:18.000000000","message":"What Julia says :)","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6c0e2755cadee82fda29ec398983f9d3f93ac517","unresolved":false,"context_lines":[{"line_number":935,"context_line":"            (not provider_manages_delete_cleaning and"},{"line_number":936,"context_line":"             not provider_manages_create_cleaning)):"},{"line_number":937,"context_line":"        task.driver.network.add_cleaning_network(task)"},{"line_number":938,"context_line":"        return"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"    LOG.warning(_LW(\"delete_cleaning_ports and create_cleaning_ports \""},{"line_number":941,"context_line":"                    \"functions in DHCP providers are deprecated, please move \""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_44b41934","line":938,"in_reply_to":"3aaa91ec_f51df562","updated":"2016-06-29 20:53:49.000000000","message":"I believe in a later change set, the wiring is changed to route through task.driver.network.add_cleaning_network() directly instead of routing through deploy_utils, which is only being maintained for compatibility.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":975,"context_line":""},{"line_number":976,"context_line":""},{"line_number":977,"context_line":"# TODO(vdrok): This method is left here for backwards compatibility with out of"},{"line_number":978,"context_line":"# tree DHCP providers implementing cleaning methods. Remove it in Ocata"},{"line_number":979,"context_line":"def tear_down_cleaning_ports(task):"},{"line_number":980,"context_line":"    \"\"\"Deletes the cleaning ports created for each of the Ironic ports."},{"line_number":981,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_55c32957","line":978,"updated":"2016-06-29 20:07:44.000000000","message":"this is in deploy_utils.py, so it isn\u0027t a method that is public facing, is it? We don\u0027t really have to keep it around/deprecate properly, but we will cuz we\u0027re nice?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20533d8b623d21c6c934b6677f2bc1cde2860645","unresolved":false,"context_lines":[{"line_number":975,"context_line":""},{"line_number":976,"context_line":""},{"line_number":977,"context_line":"# TODO(vdrok): This method is left here for backwards compatibility with out of"},{"line_number":978,"context_line":"# tree DHCP providers implementing cleaning methods. Remove it in Ocata"},{"line_number":979,"context_line":"def tear_down_cleaning_ports(task):"},{"line_number":980,"context_line":"    \"\"\"Deletes the cleaning ports created for each of the Ironic ports."},{"line_number":981,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_899d51be","line":978,"in_reply_to":"3aaa91ec_55c32957","updated":"2016-06-30 14:51:11.000000000","message":"We do this because otherwise we\u0027ll break out-of-tree dhcp providers, that are relying on what is happening here.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":"    # NOTE(vdrok): No need for another deprecation warning here, if"},{"line_number":1002,"context_line":"    # delete_cleaning_ports is in the DHCP provider the warning was"},{"line_number":1003,"context_line":"    # printed in prepare_cleaning_ports"},{"line_number":1004,"context_line":"    # Allow to raise if it fails, is caught and handled in conductor"},{"line_number":1005,"context_line":"    provider.provider.delete_cleaning_ports(task)"},{"line_number":1006,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_35c65d9a","line":1003,"updated":"2016-06-29 20:07:44.000000000","message":"I guess no one would be upgrading ironic after a node\u0027s prepare_cleaning_ports() was called (so no warning from that), and before this method is called?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20533d8b623d21c6c934b6677f2bc1cde2860645","unresolved":false,"context_lines":[{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":"    # NOTE(vdrok): No need for another deprecation warning here, if"},{"line_number":1002,"context_line":"    # delete_cleaning_ports is in the DHCP provider the warning was"},{"line_number":1003,"context_line":"    # printed in prepare_cleaning_ports"},{"line_number":1004,"context_line":"    # Allow to raise if it fails, is caught and handled in conductor"},{"line_number":1005,"context_line":"    provider.provider.delete_cleaning_ports(task)"},{"line_number":1006,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_099961c4","line":1003,"in_reply_to":"3aaa91ec_35c65d9a","updated":"2016-06-30 14:51:11.000000000","message":"that would mean that they have interrupted the cleaning and they\u0027ll have much bigger problems than deprecation warning not printed here :)","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"}],"ironic/drivers/modules/network/flat.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ca62191bcefc3cbc987a4b5a347932e06e604667","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from ironic.common import exception"},{"line_number":24,"context_line":"from ironic.common.i18n import _"},{"line_number":25,"context_line":"from ironic.common.i18n import _LI"},{"line_number":26,"context_line":"from ironic.common import network"},{"line_number":27,"context_line":"from ironic.drivers import base"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_1d053845","line":26,"updated":"2016-03-09 15:55:44.000000000","message":"Should be neutron :)","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1bb990f7f4ce5c928ccfc3f64f6340a7350da6d2","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from ironic.common import exception"},{"line_number":24,"context_line":"from ironic.common.i18n import _"},{"line_number":25,"context_line":"from ironic.common.i18n import _LI"},{"line_number":26,"context_line":"from ironic.common import network"},{"line_number":27,"context_line":"from ironic.drivers import base"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_f52e5741","line":26,"in_reply_to":"5aef4532_1d053845","updated":"2016-03-10 17:46:42.000000000","message":"Done","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"34c36d40453a39d6f7cc3bac1e929540eaecd140","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        \"\"\""},{"line_number":81,"context_line":"        if not CONF.neutron.cleaning_network_uuid:"},{"line_number":82,"context_line":"            raise exception.MissingParameterValue(_(\u0027Cleaning network \u0027"},{"line_number":83,"context_line":"                                                    \u0027UUID not provided\u0027))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":86,"context_line":"        network.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_41d56db7","line":83,"updated":"2016-03-08 10:57:09.000000000","message":"We shouldn\u0027t need to catch this here now as its caught when the interface is loaded.","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1bb990f7f4ce5c928ccfc3f64f6340a7350da6d2","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        \"\"\""},{"line_number":81,"context_line":"        if not CONF.neutron.cleaning_network_uuid:"},{"line_number":82,"context_line":"            raise exception.MissingParameterValue(_(\u0027Cleaning network \u0027"},{"line_number":83,"context_line":"                                                    \u0027UUID not provided\u0027))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":86,"context_line":"        network.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_d5319ba3","line":83,"in_reply_to":"5aef4532_41d56db7","updated":"2016-03-10 17:46:42.000000000","message":"Done","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"c7fcea08ce8fe62d5f21b5194d2bfe436749cfbe","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        for port in task.ports:"},{"line_number":95,"context_line":"            extra_dict \u003d port.extra"},{"line_number":96,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":97,"context_line":"            port.extra \u003d extra_dict"},{"line_number":98,"context_line":"            port.save()"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_85ede88d","line":96,"updated":"2016-03-21 15:26:26.000000000","message":"This appears to be removing the tenant port from the port extra dict, not the vif_port_id which is storing the cleaning port uuid.","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"88c0d16de6ed994bde24aa5c24476b3b7875f6e1","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        for port in task.ports:"},{"line_number":95,"context_line":"            extra_dict \u003d port.extra"},{"line_number":96,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":97,"context_line":"            port.extra \u003d extra_dict"},{"line_number":98,"context_line":"            port.save()"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_babf38fa","line":96,"in_reply_to":"fa0719c6_85ede88d","updated":"2016-03-22 19:39:25.000000000","message":"vif_port_id is removed by nova, tenant_vif_port_id is not, this was the reason. OTOH, during manageable -\u003e available transition, there is no tenant port, and nova won\u0027t clean up anything, so both should be removed.","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"1732f987b13a28e3d7557178a5b5dd13950c7587","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        for port in task.ports:"},{"line_number":95,"context_line":"            extra_dict \u003d port.extra"},{"line_number":96,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":97,"context_line":"            port.extra \u003d extra_dict"},{"line_number":98,"context_line":"            port.save()"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_d88f70ca","line":96,"in_reply_to":"fa0719c6_babf38fa","updated":"2016-03-23 05:05:05.000000000","message":"I guess nova isn\u0027t aware of cleaning network..good catch.. vdrok :)","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"f220d18d14dbb6394845826c32089a4ab0160f7a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"\"\"Flat network driver.\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            raise exception.DriverLoadError("},{"line_number":40,"context_line":"                driver\u003dself.__class__.__name__,"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_b0962aee","line":37,"updated":"2016-04-05 19:53:52.000000000","message":"I don\u0027t understand why the FlatNetwork requires a separate cleaning network. If present, it should use one, but could we make it optional rather than required?\n\nAs it stands, this patch breaks upgrades. Because this is now the default driver, and this driver requires the CONF.neutron.cleaning_network_uuid option to be set (which was not required before), an upgrade without a config change will cause problems.\n\nAs soon as this patch is deployed and the conductor restarted, it refuses to instantiate any Nodes. It is impossible to delete or update (or even set into maintenance mode) any Node at this point.\n\nIt would be better to allow operators to opt-in to this change when upgrading.\n\nAlternatively, we must be very clear in notifying users during an upgrade that this patch requires them to update configuration in order to apply it.","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6a09f88df754b836a8ea695fd81ae03cfd9c372c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"\"\"Flat network driver.\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            raise exception.DriverLoadError("},{"line_number":40,"context_line":"                driver\u003dself.__class__.__name__,"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_49b98d2d","line":37,"in_reply_to":"9a061dce_4fc87fa8","updated":"2016-04-07 10:36:19.000000000","message":"We could just move this check to add/remove_cleaning_network methods, but then it will be inconsistent with neutron provider. WDYT?","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"8f8569ba00f0f09f9b741bcf0f2193633a3df2dc","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"\"\"Flat network driver.\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            raise exception.DriverLoadError("},{"line_number":40,"context_line":"                driver\u003dself.__class__.__name__,"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_4fc87fa8","line":37,"in_reply_to":"9a061dce_b0962aee","updated":"2016-04-07 05:05:47.000000000","message":"The cleaning network uuid as part of ironic configuration options should be populated during the upgrade process. It should not be a plain replacement of the code.","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        \"\"\"Add the cleaning network to a node."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        :param task: A TaskManager instance."},{"line_number":76,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":79,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_1cfce23c","line":76,"updated":"2016-04-20 19:41:26.000000000","message":":raises: ?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \"\"\"Remove the cleaning network from a node."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param task: A TaskManager instance."},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        neutron.remove_ports_from_network("},{"line_number":90,"context_line":"            task, CONF.neutron.cleaning_network_uuid)"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_5c981a1c","line":88,"updated":"2016-04-20 19:41:26.000000000","message":":raises: ?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"fad77a4de5afeb14dac4b4e4f6fcf1c705434af0","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        \"\"\"Add the cleaning network to a node."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        :param task: A TaskManager instance."},{"line_number":76,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":79,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_46710244","line":76,"updated":"2016-05-13 14:43:46.000000000","message":"raises?","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"fad77a4de5afeb14dac4b4e4f6fcf1c705434af0","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def remove_cleaning_network(self, task):"},{"line_number":85,"context_line":"        \"\"\"Remove the cleaning network from a node."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param task: A TaskManager instance."},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        neutron.remove_ports_from_network("},{"line_number":90,"context_line":"            task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_46a58245","line":87,"updated":"2016-05-13 14:43:46.000000000","message":"raises?","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"fad77a4de5afeb14dac4b4e4f6fcf1c705434af0","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        for port in task.ports:"},{"line_number":93,"context_line":"            extra_dict \u003d port.extra"},{"line_number":94,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":95,"context_line":"            extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":96,"context_line":"            port.extra \u003d extra_dict"},{"line_number":97,"context_line":"            port.save()"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_3196ba94","line":95,"updated":"2016-05-13 14:43:46.000000000","message":"Maybe this should be also in unconfigure_tenant_networks()?","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"8d9fa2a398a69698fb1e806a3e269a358da6f021","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        for port in task.ports:"},{"line_number":93,"context_line":"            extra_dict \u003d port.extra"},{"line_number":94,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":95,"context_line":"            extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":96,"context_line":"            port.extra \u003d extra_dict"},{"line_number":97,"context_line":"            port.save()"}],"source_content_type":"text/x-python","patch_set":47,"id":"dab17558_a0db711a","line":95,"in_reply_to":"dab17558_3196ba94","updated":"2016-05-13 15:25:15.000000000","message":"I personally think that we shouldn\u0027t be playing with the vif_port_id at all as part of this process. I would much prefer if we added a separate item into the metadata service_vif_port_id to contain the port ids that are used purely inside ironic, e.g. provisioning and cleaning ports, adding and removing that during these functions.","commit_id":"9f322b904b226db23242737b022dc38661003c8d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        \"\"\"Add the cleaning network to a node."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        :param task: A TaskManager instance."},{"line_number":76,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":79,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_351d7d73","line":76,"updated":"2016-05-17 14:02:11.000000000","message":":raises: ?","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        \"\"\"Add the cleaning network to a node."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        :param task: A TaskManager instance."},{"line_number":76,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":79,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_71cd2086","line":76,"in_reply_to":"dab17558_351d7d73","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def remove_cleaning_network(self, task):"},{"line_number":85,"context_line":"        \"\"\"Remove the cleaning network from a node."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param task: A TaskManager instance."},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        neutron.remove_ports_from_network("},{"line_number":90,"context_line":"            task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_9510a95a","line":87,"updated":"2016-05-17 14:02:11.000000000","message":":raises: ?","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def remove_cleaning_network(self, task):"},{"line_number":85,"context_line":"        \"\"\"Remove the cleaning network from a node."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param task: A TaskManager instance."},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        neutron.remove_ports_from_network("},{"line_number":90,"context_line":"            task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_31fd586f","line":87,"in_reply_to":"dab17558_9510a95a","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        for port in task.ports:"},{"line_number":93,"context_line":"            extra_dict \u003d port.extra"},{"line_number":94,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":95,"context_line":"            extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":96,"context_line":"            port.extra \u003d extra_dict"},{"line_number":97,"context_line":"            port.save()"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_f5e134d1","line":95,"updated":"2016-05-17 14:02:11.000000000","message":"Yuriy\u0027s comment from ps 47\n\nMaybe this should be also in unconfigure_tenant_networks()?","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        for port in task.ports:"},{"line_number":93,"context_line":"            extra_dict \u003d port.extra"},{"line_number":94,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":95,"context_line":"            extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":96,"context_line":"            port.extra \u003d extra_dict"},{"line_number":97,"context_line":"            port.save()"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_fc80c74b","line":95,"in_reply_to":"dab17558_f5e134d1","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"2c6e7d91043b81b2ede01abc68a51b5a5d114a21","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        :param task: A TaskManager instance."},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        neutron.remove_ports_from_network("},{"line_number":95,"context_line":"            task, CONF.neutron.cleaning_network_uuid)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        for port in task.ports:"}],"source_content_type":"text/x-python","patch_set":50,"id":"bab6814e_a58df87d","line":94,"updated":"2016-05-26 12:17:39.000000000","message":"I\u0027m pretty sure there was a comment somewhere to add log.info similar to the one on L85 and I did add it. Might be lost during rebases.","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"3425b92c992de374b2f86e63908375f613a491ca","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        :param task: A TaskManager instance."},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        neutron.remove_ports_from_network("},{"line_number":95,"context_line":"            task, CONF.neutron.cleaning_network_uuid)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        for port in task.ports:"}],"source_content_type":"text/x-python","patch_set":50,"id":"bab6814e_f695f4e3","line":94,"in_reply_to":"bab6814e_a58df87d","updated":"2016-05-26 14:58:06.000000000","message":"I can\u0027t find it in the histroy, might be I\u0027m missing something a lot of changes. Added a log.info.","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"5da5aa03c2cfcf8077ac574bf3b133074d1b0ea2","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":73,"context_line":"            port.extra \u003d extra_dict"},{"line_number":74,"context_line":"            port.save()"},{"line_number":75,"context_line":"        pass"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def add_cleaning_network(self, task):"},{"line_number":78,"context_line":"        \"\"\"Add the cleaning network to a node."}],"source_content_type":"text/x-python","patch_set":53,"id":"9abb7d3a_9dae192c","line":75,"range":{"start_line":75,"start_character":8,"end_line":75,"end_character":12},"updated":"2016-06-01 14:36:20.000000000","message":"Here the \u0027pass\u0027 is not needed anymore.","commit_id":"c490280b968f5c3dc595585301f71d13b95ede1c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22a693443d971572cab36bc33d69c9995bdb115f","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            raise exception.DriverLoadError("},{"line_number":40,"context_line":"                driver\u003dself.__class__.__name__,"},{"line_number":41,"context_line":"                reason\u003d_(\u0027[neutron]/cleaning_network_uuid configuration is \u0027"},{"line_number":42,"context_line":"                         \u0027required for this driver and must be a UUID\u0027))"}],"source_content_type":"text/x-python","patch_set":54,"id":"7aa08908_accf1b28","line":39,"updated":"2016-06-15 20:57:36.000000000","message":"This is an operationally breaking change for stand-alone users.  An older protocol client adds what appears a new node.  By default, apparently due to the database from what I can make out, the host ends up with the FlatNetwork driver.\n\nThat is fine with neutron in the mix, but in stand-alone, there is no cleaning network defined, and if the client is older, the user has no capability to even assert a network_interface.  This ultimately breaks clients added via shade for users unless they are solely neutron users.  TL;DR, This is the point at which bifrost breaks with this patch set because shade is version locking it\u0027s invocation of python-ironicclient... which it it\u0027s self is also version locked.\n\nRecommendation: We appear not to be deprecating dhcp_provider in this feature set, but essentially that seems to be exactly what we are ultimately doing.  If that is ultimately what we\u0027re doing We should deprecate it, but still have it\u0027s configuration meaningful during the deprecation period, i.e. have similar logic to the guard provided in deploy_utils, or simpily if the dhcp_provider is set to \"none\" to no-op the port operations while running in order to not break stand along users.  Example of the guard mechanism currently provided to stand-alone deployments with the flat networking model.   https://github.com/openstack/ironic/blob/stable/mitaka/ironic/drivers/modules/deploy_utils.py#L921\n\nExample test run logs from bifrost, version 1.9 client locked for node creation which is what failed, of the breakage can be found at: \nhttp://logs.openstack.org/38/330138/2/check/gate-bifrost-integration-coreosipa-cirros/8837a42/logs/ironic-conductor.log\nhttp://logs.openstack.org/38/330138/2/check/gate-bifrost-integration-coreosipa-cirros/8837a42/logs/ironic-api.log","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"0883c3b7bf011f848a5f4bceb2ea4bc168b8d443","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \"\"\"Add the cleaning network to a node."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        :param task: A TaskManager instance."},{"line_number":81,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":82,"context_line":"        \"\"\""},{"line_number":83,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":84,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":54,"id":"7aa08908_03561cce","line":81,"updated":"2016-06-15 09:34:01.000000000","message":"raises?","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"077fe3d618911bf73ea4047a4ca6b0aed7c64141","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \"\"\"Add the cleaning network to a node."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        :param task: A TaskManager instance."},{"line_number":81,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":82,"context_line":"        \"\"\""},{"line_number":83,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":84,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a9d85d2_e60f4986","line":81,"in_reply_to":"7aa08908_03561cce","updated":"2016-06-21 14:51:42.000000000","message":"Done","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22a693443d971572cab36bc33d69c9995bdb115f","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        :returns: a dictionary in the form {port.uuid: neutron_port[\u0027id\u0027]}"},{"line_number":82,"context_line":"        \"\"\""},{"line_number":83,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":84,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"},{"line_number":85,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"},{"line_number":86,"context_line":"        return neutron.add_ports_to_network("},{"line_number":87,"context_line":"            task, CONF.neutron.cleaning_network_uuid, is_flat\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":54,"id":"7aa08908_4f15c647","line":84,"updated":"2016-06-15 20:57:36.000000000","message":"This will break in the stand-alone configurations where older clients, rightfully enroll or create a new node in ironic, which defaults now to flat, since the case of that seems to only be covered in the database migration.","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22a693443d971572cab36bc33d69c9995bdb115f","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":84,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"},{"line_number":85,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"},{"line_number":86,"context_line":"        return neutron.add_ports_to_network("},{"line_number":87,"context_line":"            task, CONF.neutron.cleaning_network_uuid, is_flat\u003dTrue)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def remove_cleaning_network(self, task):"}],"source_content_type":"text/x-python","patch_set":54,"id":"7aa08908_32026173","line":86,"updated":"2016-06-15 20:57:36.000000000","message":"Same as above.","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"0883c3b7bf011f848a5f4bceb2ea4bc168b8d443","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    def remove_cleaning_network(self, task):"},{"line_number":90,"context_line":"        \"\"\"Remove the cleaning network from a node."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        :param task: A TaskManager instance."},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        LOG.info(_LI(\u0027Removing ports from cleaning network for node %s\u0027),"},{"line_number":95,"context_line":"                 task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":54,"id":"7aa08908_43702474","line":92,"updated":"2016-06-15 09:34:01.000000000","message":"raises?","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"077fe3d618911bf73ea4047a4ca6b0aed7c64141","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    def remove_cleaning_network(self, task):"},{"line_number":90,"context_line":"        \"\"\"Remove the cleaning network from a node."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        :param task: A TaskManager instance."},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        LOG.info(_LI(\u0027Removing ports from cleaning network for node %s\u0027),"},{"line_number":95,"context_line":"                 task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a9d85d2_46273d12","line":92,"in_reply_to":"7aa08908_43702474","updated":"2016-06-21 14:51:42.000000000","message":"Done","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22a693443d971572cab36bc33d69c9995bdb115f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        LOG.info(_LI(\u0027Removing ports from cleaning network for node %s\u0027),"},{"line_number":95,"context_line":"                 task.node.uuid)"},{"line_number":96,"context_line":"        neutron.remove_ports_from_network("},{"line_number":97,"context_line":"            task, CONF.neutron.cleaning_network_uuid)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        for port in task.ports:"}],"source_content_type":"text/x-python","patch_set":54,"id":"7aa08908_f2f0d993","line":96,"updated":"2016-06-15 20:57:36.000000000","message":"Same issue as noted on lines 84 and 39 of this file.","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a21e07030721153b00ac1099b52232bfd1e3ecfd","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            raise exception.DriverLoadError("},{"line_number":40,"context_line":"                driver\u003dself.__class__.__name__,"},{"line_number":41,"context_line":"                reason\u003d_(\u0027[neutron]/cleaning_network_uuid configuration is \u0027"}],"source_content_type":"text/x-python","patch_set":56,"id":"3aaa91ec_39cb4155","line":38,"updated":"2016-06-22 19:46:17.000000000","message":"So to satisfy bifrost it seems that we have to do if CONF.dhcp.dhcp_provider \u003d\u003d \u0027none\u0027 too here.","commit_id":"4e6295a5a9cff8d05bb2610bf53e37292b130852"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19b7f947ae1f403f1b11251fedbb992e0c5618a","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            raise exception.DriverLoadError("},{"line_number":40,"context_line":"                driver\u003dself.__class__.__name__,"},{"line_number":41,"context_line":"                reason\u003d_(\u0027[neutron]/cleaning_network_uuid configuration is \u0027"}],"source_content_type":"text/x-python","patch_set":56,"id":"3aaa91ec_598f2dcc","line":38,"in_reply_to":"3aaa91ec_39cb4155","updated":"2016-06-22 20:01:42.000000000","message":"I don\u0027t think so, see my comment here -\u003e https://review.openstack.org/#/c/317391/8/ironic/db/sqlalchemy/models.py@146\n\nStandalone mode should never end up using this network interface as far as I\u0027m concerned, unless they are explicit about enabling it.","commit_id":"4e6295a5a9cff8d05bb2610bf53e37292b130852"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4d6ad682c854c16e521f8ab3ec1eb10cff33364c","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            raise exception.DriverLoadError("},{"line_number":40,"context_line":"                driver\u003dself.__class__.__name__,"},{"line_number":41,"context_line":"                reason\u003d_(\u0027[neutron]/cleaning_network_uuid configuration is \u0027"}],"source_content_type":"text/x-python","patch_set":56,"id":"3aaa91ec_9af98acb","line":38,"in_reply_to":"3aaa91ec_481620a8","updated":"2016-06-28 14:54:57.000000000","message":"While I agree with the sentiment, we are kind of committed to support version upgrades, and if a user has to go fix their config file due to an introduced default in order to complete that upgrade and have a working system, then we have broken that commitment.  Example being in stand-alone mode, I can start the conductor with the prior revision on this chain of revisions.  Without changing the configuration file with this revision, the conductor fails to start.","commit_id":"4e6295a5a9cff8d05bb2610bf53e37292b130852"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"763cc40f4e9de15c14a0c6a0bab7b5805b75d4f0","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            raise exception.DriverLoadError("},{"line_number":40,"context_line":"                driver\u003dself.__class__.__name__,"},{"line_number":41,"context_line":"                reason\u003d_(\u0027[neutron]/cleaning_network_uuid configuration is \u0027"}],"source_content_type":"text/x-python","patch_set":56,"id":"3aaa91ec_481620a8","line":38,"in_reply_to":"3aaa91ec_598f2dcc","updated":"2016-06-23 09:20:02.000000000","message":"++ made it this way.","commit_id":"4e6295a5a9cff8d05bb2610bf53e37292b130852"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"cb054f2ef0d2db6e76528e8cab8a88d6af99686a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"\"\"Flat network driver.\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            raise exception.DriverLoadError("},{"line_number":40,"context_line":"                driver\u003dself.__class__.__name__,"}],"source_content_type":"text/x-python","patch_set":58,"id":"3aaa91ec_1c1c3a69","line":37,"updated":"2016-06-23 17:08:35.000000000","message":"This is in the release note, feel free to disagree this is needed here.","commit_id":"23ab1e66c0e67bad57f576a30f0393310e8eb974"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"207a908306851bb70ae5050504d22db4998f7839","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"\"\"Flat network driver.\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            raise exception.DriverLoadError("},{"line_number":40,"context_line":"                driver\u003dself.__class__.__name__,"},{"line_number":41,"context_line":"                reason\u003d_(\u0027[neutron]/cleaning_network_uuid configuration is \u0027"},{"line_number":42,"context_line":"                         \u0027required for this driver and must be a UUID\u0027))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def add_provisioning_network(self, task):"},{"line_number":45,"context_line":"        \"\"\"Add the provisioning network to a node."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_dff2e499","line":42,"range":{"start_line":37,"start_character":0,"end_line":42,"end_character":72},"updated":"2016-06-28 15:16:00.000000000","message":"I feel like this, operationally, breaks the ability for a user to upgrade without having to modify the configuration file.  I\u0027ve posted a revision to bifrost to address it for new installations, but prior installations will need to edit their configuration files.  If the group wants to treat this as \"tough luck\" for stand-alone users, I\u0027ll let this go, but I\u0027m fairly certain we will get questions from stand-alone users, bifrost or other, about why their deployments are not working after upgrading. :(\n\nThis refers back to the discussion on https://review.openstack.org/#/c/285852/56","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"b74471ccba2facb87f8ba5afc1a84b782405ab54","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"\"\"Flat network driver.\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            raise exception.DriverLoadError("},{"line_number":40,"context_line":"                driver\u003dself.__class__.__name__,"},{"line_number":41,"context_line":"                reason\u003d_(\u0027[neutron]/cleaning_network_uuid configuration is \u0027"},{"line_number":42,"context_line":"                         \u0027required for this driver and must be a UUID\u0027))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def add_provisioning_network(self, task):"},{"line_number":45,"context_line":"        \"\"\"Add the provisioning network to a node."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_843bc5ea","line":42,"range":{"start_line":37,"start_character":0,"end_line":42,"end_character":72},"in_reply_to":"3aaa91ec_250cb241","updated":"2016-06-29 10:17:45.000000000","message":"If you go through the upgrade process correctly and we\u0027ve implemented the defaults logic correctly, I believe standalone users should never end up using this network interface. \n\nPerhaps we could comment this raise out now with a TODO to uncomment it next cycle, and add a deprecation warning telling them to remove flat network from their enabled network interfaces configuration or be broken next time they upgrade.\n\nThis would allow users to upgrade without being broken, none of their existing or new Nodes should be configured to use the Flat network interface because of the logic we\u0027ve added surrounding the defaults, allowing them to remove flat from their enabled network interfaces at their leisure before next cycle.","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"f7d7f1776dba12fe2a1528fa88ea87658ab2807a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"\"\"Flat network driver.\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            raise exception.DriverLoadError("},{"line_number":40,"context_line":"                driver\u003dself.__class__.__name__,"},{"line_number":41,"context_line":"                reason\u003d_(\u0027[neutron]/cleaning_network_uuid configuration is \u0027"},{"line_number":42,"context_line":"                         \u0027required for this driver and must be a UUID\u0027))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def add_provisioning_network(self, task):"},{"line_number":45,"context_line":"        \"\"\"Add the provisioning network to a node."}],"source_content_type":"text/x-python","patch_set":60,"id":"3aaa91ec_250cb241","line":42,"range":{"start_line":37,"start_character":0,"end_line":42,"end_character":72},"in_reply_to":"3aaa91ec_dff2e499","updated":"2016-06-28 17:11:34.000000000","message":"I\u0027ll bring it to the next meeting, or to the ML, so that we can decide it at last and make everyone happy :)","commit_id":"a765c6060a39827e94db527e9e92a6d3ceb4dc7c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\""},{"line_number":14,"context_line":"Flat network driver. Useful for shared, flat networks."},{"line_number":15,"context_line":"\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_eb0fd836","line":14,"updated":"2016-06-29 20:07:44.000000000","message":"can we call these things \u0027interfaces\u0027 instead of \u0027drivers\u0027?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"311f0617fa06ce99a996a83888a91cab1e1bc0f8","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self):"},{"line_number":36,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":37,"context_line":"        # TODO(vdrok): Switch to DriverLoadError in Ocata"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            LOG.warning(_LW(\u0027Please provide [neutron]/cleaning_network_uuid \u0027"},{"line_number":40,"context_line":"                            \u0027configuration option so that this driver is able \u0027"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_08798dc8","line":37,"updated":"2016-06-29 19:08:29.000000000","message":"Works for me, I kind of feel like it could still raise an exception if the dhcp provider is not set to \"none\" though, but this does work.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self):"},{"line_number":36,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":37,"context_line":"        # TODO(vdrok): Switch to DriverLoadError in Ocata"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            LOG.warning(_LW(\u0027Please provide [neutron]/cleaning_network_uuid \u0027"},{"line_number":40,"context_line":"                            \u0027configuration option so that this driver is able \u0027"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_d4ea1b0e","line":37,"in_reply_to":"3aaa91ec_08798dc8","updated":"2016-07-01 13:09:18.000000000","message":"Then still there are people using neutron dhcp but without cleaning and everything works for them, so as we do this already, let\u0027s not break anyone at all :)","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":37,"context_line":"        # TODO(vdrok): Switch to DriverLoadError in Ocata"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            LOG.warning(_LW(\u0027Please provide [neutron]/cleaning_network_uuid \u0027"},{"line_number":40,"context_line":"                            \u0027configuration option so that this driver is able \u0027"},{"line_number":41,"context_line":"                            \u0027to perform cleaning. It will become required in \u0027"},{"line_number":42,"context_line":"                            \u0027Ocata, and, if not specified, conductor will \u0027"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_aed15e59","line":39,"updated":"2016-06-29 20:07:44.000000000","message":"so either it wasn\u0027t specified, or it was specified but not a UUID.\n\nmaybe \u0027Please specify a valid UUID for [neutron]/...\u0027","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":37,"context_line":"        # TODO(vdrok): Switch to DriverLoadError in Ocata"},{"line_number":38,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":39,"context_line":"            LOG.warning(_LW(\u0027Please provide [neutron]/cleaning_network_uuid \u0027"},{"line_number":40,"context_line":"                            \u0027configuration option so that this driver is able \u0027"},{"line_number":41,"context_line":"                            \u0027to perform cleaning. It will become required in \u0027"},{"line_number":42,"context_line":"                            \u0027Ocata, and, if not specified, conductor will \u0027"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_3448bf2c","line":39,"in_reply_to":"3aaa91ec_aed15e59","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            LOG.warning(_LW(\u0027Please provide [neutron]/cleaning_network_uuid \u0027"},{"line_number":40,"context_line":"                            \u0027configuration option so that this driver is able \u0027"},{"line_number":41,"context_line":"                            \u0027to perform cleaning. It will become required in \u0027"},{"line_number":42,"context_line":"                            \u0027Ocata, and, if not specified, conductor will \u0027"},{"line_number":43,"context_line":"                            \u0027fail to start if \"flat\" is in the \u0027"},{"line_number":44,"context_line":"                            \u0027[DEFAULT]enabled_network_interfaces list.\u0027))"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_2e4d6e3e","line":42,"updated":"2016-06-29 20:07:44.000000000","message":"maybe \u0027It will be required starting with the Ocata release, and if not specified then, the conductor service will fail to start...\u0027\n\nWhew, what a mouthful :)","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            LOG.warning(_LW(\u0027Please provide [neutron]/cleaning_network_uuid \u0027"},{"line_number":40,"context_line":"                            \u0027configuration option so that this driver is able \u0027"},{"line_number":41,"context_line":"                            \u0027to perform cleaning. It will become required in \u0027"},{"line_number":42,"context_line":"                            \u0027Ocata, and, if not specified, conductor will \u0027"},{"line_number":43,"context_line":"                            \u0027fail to start if \"flat\" is in the \u0027"},{"line_number":44,"context_line":"                            \u0027[DEFAULT]enabled_network_interfaces list.\u0027))"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_9418931f","line":42,"in_reply_to":"3aaa91ec_2e4d6e3e","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                            \u0027to perform cleaning. It will become required in \u0027"},{"line_number":42,"context_line":"                            \u0027Ocata, and, if not specified, conductor will \u0027"},{"line_number":43,"context_line":"                            \u0027fail to start if \"flat\" is in the \u0027"},{"line_number":44,"context_line":"                            \u0027[DEFAULT]enabled_network_interfaces list.\u0027))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def add_provisioning_network(self, task):"},{"line_number":47,"context_line":"        \"\"\"Add the provisioning network to a node."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_6e9db665","line":44,"updated":"2016-06-29 20:07:44.000000000","message":"maybe \u0027\"flat\"\u0027 is in the list of values for [..]enabled_network_interfaces configuration option.\u0027","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                            \u0027to perform cleaning. It will become required in \u0027"},{"line_number":42,"context_line":"                            \u0027Ocata, and, if not specified, conductor will \u0027"},{"line_number":43,"context_line":"                            \u0027fail to start if \"flat\" is in the \u0027"},{"line_number":44,"context_line":"                            \u0027[DEFAULT]enabled_network_interfaces list.\u0027))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def add_provisioning_network(self, task):"},{"line_number":47,"context_line":"        \"\"\"Add the provisioning network to a node."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_74136701","line":44,"in_reply_to":"3aaa91ec_6e9db665","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        \"\"\""},{"line_number":72,"context_line":"        for port in task.ports:"},{"line_number":73,"context_line":"            extra_dict \u003d port.extra"},{"line_number":74,"context_line":"            extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":75,"context_line":"            port.extra \u003d extra_dict"},{"line_number":76,"context_line":"            port.save()"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_8ee3c2d8","line":74,"updated":"2016-06-29 20:07:44.000000000","message":"I find it odd (non-symmetrical) that here, we remove it. BUT configure_tenant_networks() didn\u0027t add it :-(","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3225cccae3dcc93508a7fdd72ea58084408e232a","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        \"\"\""},{"line_number":72,"context_line":"        for port in task.ports:"},{"line_number":73,"context_line":"            extra_dict \u003d port.extra"},{"line_number":74,"context_line":"            extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":75,"context_line":"            port.extra \u003d extra_dict"},{"line_number":76,"context_line":"            port.save()"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_de1714a1","line":74,"in_reply_to":"3aaa91ec_8ee3c2d8","updated":"2016-06-30 12:53:21.000000000","message":"If memory serves, the nova ironic virt driver adds it. :(","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"311f0617fa06ce99a996a83888a91cab1e1bc0f8","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        :raises: NetworkError"},{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":86,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"},{"line_number":87,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"},{"line_number":88,"context_line":"        return neutron.add_ports_to_network("},{"line_number":89,"context_line":"            task, CONF.neutron.cleaning_network_uuid, is_flat\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_d8591037","line":86,"updated":"2016-06-29 19:08:29.000000000","message":"So silly question, what if the cleaning_network_uuid is undefined?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        :raises: NetworkError"},{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":86,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"},{"line_number":87,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"},{"line_number":88,"context_line":"        return neutron.add_ports_to_network("},{"line_number":89,"context_line":"            task, CONF.neutron.cleaning_network_uuid, is_flat\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_25c7eb45","line":86,"in_reply_to":"3aaa91ec_29fd3db1","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20533d8b623d21c6c934b6677f2bc1cde2860645","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        :raises: NetworkError"},{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":86,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"},{"line_number":87,"context_line":"        LOG.info(_LI(\u0027Adding cleaning network to node %s\u0027), task.node.uuid)"},{"line_number":88,"context_line":"        return neutron.add_ports_to_network("},{"line_number":89,"context_line":"            task, CONF.neutron.cleaning_network_uuid, is_flat\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_29fd3db1","line":86,"in_reply_to":"3aaa91ec_d8591037","updated":"2016-06-30 14:51:11.000000000","message":"++, validation has to be here.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            extra_dict \u003d port.extra"},{"line_number":104,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":105,"context_line":"            port.extra \u003d extra_dict"},{"line_number":106,"context_line":"            port.save()"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_ceb82a78","line":106,"updated":"2016-06-29 20:07:44.000000000","message":"here is the non-symmetry again. If neutron.add_ports_to_network() moves port.extra[\u0027vif_port_id\u0027] to port.extra[\u0027tenant_vif_port_id\u0027], shouldn\u0027t neutron.remove_ports_from_network() do the reverse? Not just remove tenant_vif_port_id, but put it back to port.extra[\u0027vif_port_id\u0027]?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20533d8b623d21c6c934b6677f2bc1cde2860645","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            extra_dict \u003d port.extra"},{"line_number":104,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":105,"context_line":"            port.extra \u003d extra_dict"},{"line_number":106,"context_line":"            port.save()"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_c9975938","line":106,"in_reply_to":"3aaa91ec_ceb82a78","updated":"2016-06-30 14:51:11.000000000","message":"it is called at the end of cleaning procedure, at which point there should be no vif_port_id in extra, it either did not exist in case of manual cleaning or was removed by nova in case of auto cleaning.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        if not uuidutils.is_uuid_like(CONF.neutron.cleaning_network_uuid):"},{"line_number":90,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":91,"context_line":"                \u0027You must to provide a valid cleaning network UUID in \u0027"},{"line_number":92,"context_line":"                \u0027[neutron]cleaning_network_uuid configuration option.\u0027))"},{"line_number":93,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":94,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_bf36d64f","line":91,"updated":"2016-07-05 17:43:03.000000000","message":"nit: s/to //","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"80de034814e0dbd92136341c2a556c6b619d1e24","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        if not uuidutils.is_uuid_like(CONF.neutron.cleaning_network_uuid):"},{"line_number":90,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":91,"context_line":"                \u0027You must to provide a valid cleaning network UUID in \u0027"},{"line_number":92,"context_line":"                \u0027[neutron]cleaning_network_uuid configuration option.\u0027))"},{"line_number":93,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":94,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_93b3a509","line":91,"in_reply_to":"1aa78d24_bf36d64f","updated":"2016-07-07 18:08:14.000000000","message":"Done","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"}],"ironic/drivers/modules/network/neutron.py":[{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"01cce4700c439456f77e2bc8dd0fb26ec0dcf39e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from ironic.common.i18n import _LE"},{"line_number":24,"context_line":"from ironic.common.i18n import _LI"},{"line_number":25,"context_line":"from ironic.common.i18n import _LW"},{"line_number":26,"context_line":"from ironic.common import neutron"},{"line_number":27,"context_line":"from ironic.drivers import base"},{"line_number":28,"context_line":"from ironic import objects"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9aed3d3a_f1efc21b","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":33},"updated":"2016-02-29 19:41:54.000000000","message":"maybe add \"as network\" here?","commit_id":"418f4e9d6adfde543abf7f87d3b43afbe9f637ff"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"01cce4700c439456f77e2bc8dd0fb26ec0dcf39e","unresolved":false,"context_lines":[{"line_number":197,"context_line":"            if not port[\u0027id\u0027]:"},{"line_number":198,"context_line":"                # TODO(morgabra) client.list_ports() sometimes returns"},{"line_number":199,"context_line":"                # port objects with null ids. It\u0027s unclear why this happens."},{"line_number":200,"context_line":"                LOG.warn(_LW(\"Unmapping port failed, missing \u0027id\u0027. \""},{"line_number":201,"context_line":"                             \"Node: %(node)s Port: %(port)s\"), {\u0027node\u0027: node,"},{"line_number":202,"context_line":"                                                                \u0027port\u0027: port})"},{"line_number":203,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aed3d3a_e67f0aa9","line":200,"range":{"start_line":200,"start_character":20,"end_line":200,"end_character":24},"updated":"2016-02-29 19:41:54.000000000","message":"should be warning here.\nbug #1508442","commit_id":"418f4e9d6adfde543abf7f87d3b43afbe9f637ff"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ca62191bcefc3cbc987a4b5a347932e06e604667","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONF \u003d cfg.CONF"},{"line_number":34,"context_line":"CONF.import_opt(\u0027provisioning_network_uuid\u0027, \u0027ironic.common.neutron\u0027)"},{"line_number":35,"context_line":"CONF.import_opt(\u0027cleaning_network_uuid\u0027, \u0027ironic.common.neutron\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_5d6b4085","line":34,"updated":"2016-03-09 15:55:44.000000000","message":"No need to import opts as the whole ironic.common.neutron module is imported.","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1bb990f7f4ce5c928ccfc3f64f6340a7350da6d2","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONF \u003d cfg.CONF"},{"line_number":34,"context_line":"CONF.import_opt(\u0027provisioning_network_uuid\u0027, \u0027ironic.common.neutron\u0027)"},{"line_number":35,"context_line":"CONF.import_opt(\u0027cleaning_network_uuid\u0027, \u0027ironic.common.neutron\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_75236756","line":34,"in_reply_to":"5aef4532_5d6b4085","updated":"2016-03-10 17:46:42.000000000","message":"Done","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":6558,"name":"Sukhdev Kapur","email":"sukhdevkapur@gmail.com","username":"sukhdev-8"},"change_message_id":"9aeca57e90697de85bf123a4aed7c9ec61c53258","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    client \u003d neutron.get_neutron_client()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    params \u003d {\u0027device_id\u0027: node.instance_uuid}"},{"line_number":48,"context_line":"    instance_ports \u003d client.list_ports(**params).get(\u0027ports\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    return instance_ports"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7af24918_5d78d0f8","line":48,"updated":"2016-03-06 22:38:45.000000000","message":"Do we need to care about the failure from neutron? \nThe original patch had a provision for checking the failure - see line 46 here - https://review.openstack.org/#/c/139687/73/ironic/networks/neutron_plugin.py","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1bb990f7f4ce5c928ccfc3f64f6340a7350da6d2","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    client \u003d neutron.get_neutron_client()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    params \u003d {\u0027device_id\u0027: node.instance_uuid}"},{"line_number":48,"context_line":"    instance_ports \u003d client.list_ports(**params).get(\u0027ports\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    return instance_ports"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_551e2b0c","line":48,"in_reply_to":"7af24918_5d78d0f8","updated":"2016-03-10 17:46:42.000000000","message":"Done","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"34c36d40453a39d6f7cc3bac1e929540eaecd140","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        if not CONF.neutron.provisioning_network_uuid:"},{"line_number":80,"context_line":"            raise exception.MissingParameterValue("},{"line_number":81,"context_line":"                _(\u0027Valid provisioning network UUID not provided\u0027))"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        LOG.info(_LI(\u0027Adding provisioning network to node %s\u0027),"},{"line_number":84,"context_line":"                 task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_c1f85d4c","line":81,"updated":"2016-03-08 10:57:09.000000000","message":"We shouldn\u0027t need to catch this at runtime, as its checked at interface load.","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1bb990f7f4ce5c928ccfc3f64f6340a7350da6d2","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        if not CONF.neutron.provisioning_network_uuid:"},{"line_number":80,"context_line":"            raise exception.MissingParameterValue("},{"line_number":81,"context_line":"                _(\u0027Valid provisioning network UUID not provided\u0027))"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        LOG.info(_LI(\u0027Adding provisioning network to node %s\u0027),"},{"line_number":84,"context_line":"                 task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_b5196f24","line":81,"in_reply_to":"5aef4532_c1f85d4c","updated":"2016-03-10 17:46:42.000000000","message":"Done","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"34c36d40453a39d6f7cc3bac1e929540eaecd140","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        \"\"\""},{"line_number":112,"context_line":"        if not CONF.neutron.cleaning_network_uuid:"},{"line_number":113,"context_line":"            raise exception.MissingParameterValue(_(\u0027Cleaning network \u0027"},{"line_number":114,"context_line":"                                                    \u0027UUID not provided\u0027))"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":117,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_41a3ad4f","line":114,"updated":"2016-03-08 10:57:09.000000000","message":"Ditto","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1bb990f7f4ce5c928ccfc3f64f6340a7350da6d2","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        \"\"\""},{"line_number":112,"context_line":"        if not CONF.neutron.cleaning_network_uuid:"},{"line_number":113,"context_line":"            raise exception.MissingParameterValue(_(\u0027Cleaning network \u0027"},{"line_number":114,"context_line":"                                                    \u0027UUID not provided\u0027))"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        # If we have left over ports from a previous cleaning, remove them"},{"line_number":117,"context_line":"        neutron.rollback_ports(task, CONF.neutron.cleaning_network_uuid)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_951433e9","line":114,"in_reply_to":"5aef4532_41a3ad4f","updated":"2016-03-10 17:46:42.000000000","message":"Done","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ca62191bcefc3cbc987a4b5a347932e06e604667","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"            LOG.debug(\u0027Mapping tenant port %(vif_port_id)s to node \u0027"},{"line_number":171,"context_line":"                      \u0027%(node_id)s\u0027,"},{"line_number":172,"context_line":"                      {\u0027vif_port_id\u0027: vif_port_id, \u0027node_id\u0027: node.id})"},{"line_number":173,"context_line":"            body \u003d {"},{"line_number":174,"context_line":"                \u0027port\u0027: {"},{"line_number":175,"context_line":"                    \u0027device_owner\u0027: \u0027baremetal:none\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_9d91484a","line":172,"updated":"2016-03-09 15:55:44.000000000","message":"Should be uuid instead of id.","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1bb990f7f4ce5c928ccfc3f64f6340a7350da6d2","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"            LOG.debug(\u0027Mapping tenant port %(vif_port_id)s to node \u0027"},{"line_number":171,"context_line":"                      \u0027%(node_id)s\u0027,"},{"line_number":172,"context_line":"                      {\u0027vif_port_id\u0027: vif_port_id, \u0027node_id\u0027: node.id})"},{"line_number":173,"context_line":"            body \u003d {"},{"line_number":174,"context_line":"                \u0027port\u0027: {"},{"line_number":175,"context_line":"                    \u0027device_owner\u0027: \u0027baremetal:none\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_d5d87b55","line":172,"in_reply_to":"5aef4532_9d91484a","updated":"2016-03-10 17:46:42.000000000","message":"Done","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"c7fcea08ce8fe62d5f21b5194d2bfe436749cfbe","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        for port in task.ports:"},{"line_number":130,"context_line":"            extra_dict \u003d port.extra"},{"line_number":131,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":132,"context_line":"            port.extra \u003d extra_dict"},{"line_number":133,"context_line":"            port.save()"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_2b6dcd98","line":131,"updated":"2016-03-21 15:26:26.000000000","message":"Ditto, as in the flat network provider","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"88c0d16de6ed994bde24aa5c24476b3b7875f6e1","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        for port in task.ports:"},{"line_number":130,"context_line":"            extra_dict \u003d port.extra"},{"line_number":131,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":132,"context_line":"            port.extra \u003d extra_dict"},{"line_number":133,"context_line":"            port.save()"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_ba0458c0","line":131,"in_reply_to":"fa0719c6_2b6dcd98","updated":"2016-03-22 19:39:25.000000000","message":"ditto","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"1732f987b13a28e3d7557178a5b5dd13950c7587","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        for port in task.ports:"},{"line_number":130,"context_line":"            extra_dict \u003d port.extra"},{"line_number":131,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":132,"context_line":"            port.extra \u003d extra_dict"},{"line_number":133,"context_line":"            port.save()"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_b8b1dc91","line":131,"in_reply_to":"fa0719c6_ba0458c0","updated":"2016-03-23 05:05:05.000000000","message":"Done","commit_id":"1a9e15912869a9b141418a15756b9cb254d41d4b"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"088fbcd84365baccd9c36f919913f95055bfc43e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    \"\"\"Neutron v2 network driver\"\"\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def __init__(self):"},{"line_number":62,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":63,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":64,"context_line":"            raise exception.DriverLoadError("},{"line_number":65,"context_line":"                driver\u003dself.__class__.__name__,"},{"line_number":66,"context_line":"                reason\u003d_(\u0027[neutron]/cleaning_network_uuid configuration is \u0027"},{"line_number":67,"context_line":"                         \u0027required for this driver and must be a UUID\u0027))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        provisioning_net \u003d CONF.neutron.provisioning_network_uuid"},{"line_number":70,"context_line":"        if not uuidutils.is_uuid_like(provisioning_net):"},{"line_number":71,"context_line":"            raise exception.DriverLoadError("},{"line_number":72,"context_line":"                driver\u003dself.__class__.__name__,"},{"line_number":73,"context_line":"                reason\u003d_(\u0027[neutron]/provisioning_network_uuid configuration \u0027"},{"line_number":74,"context_line":"                         \u0027is required for this driver and must be a UUID\u0027))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def add_provisioning_network(self, task):"},{"line_number":77,"context_line":"        \"\"\"Add the provisioning network to a node."}],"source_content_type":"text/x-python","patch_set":21,"id":"da0c15f0_15bd6c68","line":74,"range":{"start_line":62,"start_character":8,"end_line":74,"end_character":75},"updated":"2016-03-26 14:36:44.000000000","message":"how about squashing these together, and raising exception with the full reason if both cleaning_network_uuid and provisioning_network uuid are invalid, otherwise only cleaning_network_uuid can be verified, and it\u0027s even better if we can check whether the network uuid really exists in neutron, IIRC, neutron doesn\u0027t support to create a network with a specified uuid.","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"204950989f050d893bbb6566386ba916001fb4af","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    \"\"\"Neutron v2 network driver\"\"\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def __init__(self):"},{"line_number":62,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":63,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":64,"context_line":"            raise exception.DriverLoadError("},{"line_number":65,"context_line":"                driver\u003dself.__class__.__name__,"},{"line_number":66,"context_line":"                reason\u003d_(\u0027[neutron]/cleaning_network_uuid configuration is \u0027"},{"line_number":67,"context_line":"                         \u0027required for this driver and must be a UUID\u0027))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        provisioning_net \u003d CONF.neutron.provisioning_network_uuid"},{"line_number":70,"context_line":"        if not uuidutils.is_uuid_like(provisioning_net):"},{"line_number":71,"context_line":"            raise exception.DriverLoadError("},{"line_number":72,"context_line":"                driver\u003dself.__class__.__name__,"},{"line_number":73,"context_line":"                reason\u003d_(\u0027[neutron]/provisioning_network_uuid configuration \u0027"},{"line_number":74,"context_line":"                         \u0027is required for this driver and must be a UUID\u0027))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def add_provisioning_network(self, task):"},{"line_number":77,"context_line":"        \"\"\"Add the provisioning network to a node."}],"source_content_type":"text/x-python","patch_set":21,"id":"ba0121b8_fbd8b5f1","line":74,"range":{"start_line":62,"start_character":8,"end_line":74,"end_character":75},"in_reply_to":"da0c15f0_15bd6c68","updated":"2016-03-29 14:36:38.000000000","message":"Done","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"088fbcd84365baccd9c36f919913f95055bfc43e","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        # TODO(russell_h): this is based on the broken assumption that the"},{"line_number":150,"context_line":"        # number of Neutron ports will match the number of physical ports."},{"line_number":151,"context_line":"        # Instead, we should probably list ports for this this instance in"},{"line_number":152,"context_line":"        # Neutron and update all of those with the appropriate portmap."},{"line_number":153,"context_line":"        ports \u003d objects.Port.list_by_node_id(task.context, node.id)"},{"line_number":154,"context_line":"        if not ports:"}],"source_content_type":"text/x-python","patch_set":21,"id":"da0c15f0_8ade776b","line":151,"range":{"start_line":151,"start_character":58,"end_line":151,"end_character":62},"updated":"2016-03-26 14:36:44.000000000","message":"nit: s/this this/this","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"204950989f050d893bbb6566386ba916001fb4af","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        # TODO(russell_h): this is based on the broken assumption that the"},{"line_number":150,"context_line":"        # number of Neutron ports will match the number of physical ports."},{"line_number":151,"context_line":"        # Instead, we should probably list ports for this this instance in"},{"line_number":152,"context_line":"        # Neutron and update all of those with the appropriate portmap."},{"line_number":153,"context_line":"        ports \u003d objects.Port.list_by_node_id(task.context, node.id)"},{"line_number":154,"context_line":"        if not ports:"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba0121b8_5be601b5","line":151,"range":{"start_line":151,"start_character":58,"end_line":151,"end_character":62},"in_reply_to":"da0c15f0_8ade776b","updated":"2016-03-29 14:36:38.000000000","message":"Done","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"da440ec90d6c2f7f38f9d4f90b66f79b4346c45d","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        # Instead, we should probably list ports for this this instance in"},{"line_number":152,"context_line":"        # Neutron and update all of those with the appropriate portmap."},{"line_number":153,"context_line":"        ports \u003d objects.Port.list_by_node_id(task.context, node.id)"},{"line_number":154,"context_line":"        if not ports:"},{"line_number":155,"context_line":"            raise exception.NetworkError(_LE("},{"line_number":156,"context_line":"                \"No public network ports to activate attached to \""},{"line_number":157,"context_line":"                \"node %s\") % node.uuid)"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba0121b8_9b31b90e","line":154,"updated":"2016-03-29 14:40:10.000000000","message":"This check is not needed, it would fail on L146 if it was empty.","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"088fbcd84365baccd9c36f919913f95055bfc43e","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            body \u003d {"},{"line_number":172,"context_line":"                \u0027port\u0027: {"},{"line_number":173,"context_line":"                    \u0027device_owner\u0027: \u0027baremetal:none\u0027,"},{"line_number":174,"context_line":"                    \u0027device_id\u0027: task.node.instance_uuid,"},{"line_number":175,"context_line":"                    \u0027admin_state_up\u0027: True,"},{"line_number":176,"context_line":"                    \u0027binding:vnic_type\u0027: \u0027baremetal\u0027,"},{"line_number":177,"context_line":"                    \u0027binding:host_id\u0027: node.uuid,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da0c15f0_cabfcff9","line":174,"range":{"start_line":174,"start_character":33,"end_line":174,"end_character":42},"updated":"2016-03-26 14:36:44.000000000","message":"nit: s/task.node/node","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"204950989f050d893bbb6566386ba916001fb4af","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            body \u003d {"},{"line_number":172,"context_line":"                \u0027port\u0027: {"},{"line_number":173,"context_line":"                    \u0027device_owner\u0027: \u0027baremetal:none\u0027,"},{"line_number":174,"context_line":"                    \u0027device_id\u0027: task.node.instance_uuid,"},{"line_number":175,"context_line":"                    \u0027admin_state_up\u0027: True,"},{"line_number":176,"context_line":"                    \u0027binding:vnic_type\u0027: \u0027baremetal\u0027,"},{"line_number":177,"context_line":"                    \u0027binding:host_id\u0027: node.uuid,"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba0121b8_3be34da5","line":174,"range":{"start_line":174,"start_character":33,"end_line":174,"end_character":42},"in_reply_to":"da0c15f0_cabfcff9","updated":"2016-03-29 14:36:38.000000000","message":"Done","commit_id":"82b8ce93a5eaad865568fc13eb8cf94ea46e9741"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"34c99fd909f0ab1ebcd8384f5813bcf4936dd226","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        for item in task.ports:"},{"line_number":78,"context_line":"            extra_dict \u003d item.extra"},{"line_number":79,"context_line":"            vif \u003d extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":80,"context_line":"            if vif:"},{"line_number":81,"context_line":"                extra_dict[\u0027vif_port_id\u0027] \u003d vif"},{"line_number":82,"context_line":"                item.extra \u003d extra_dict"},{"line_number":83,"context_line":"                item.save()"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba0121b8_4a6fe32a","line":80,"updated":"2016-03-31 08:01:08.000000000","message":"It would be better to overwrite vif_port_id with tenant_vif_port_id anytime.\n\nWhen using portgroup, tenant_vif_port_id of ports are None and vif_port_id contains port id for provisioning network.\nIn this case, port id for provisioning network remains in vif_port_id of ports though neutron ports for provisioning network are deleted.\nIt may cause a problem.","commit_id":"e5f58dc3bc04152a4a3357fd2193382d58263c84"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"afc9e437163ce80dc5fc2242fdc62d811e85cc35","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        for item in task.ports:"},{"line_number":78,"context_line":"            extra_dict \u003d item.extra"},{"line_number":79,"context_line":"            vif \u003d extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":80,"context_line":"            if vif:"},{"line_number":81,"context_line":"                extra_dict[\u0027vif_port_id\u0027] \u003d vif"},{"line_number":82,"context_line":"                item.extra \u003d extra_dict"},{"line_number":83,"context_line":"                item.save()"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba0121b8_9f7f70df","line":80,"in_reply_to":"ba0121b8_4a6fe32a","updated":"2016-03-31 11:21:27.000000000","message":"You are totally right here. Fixed in next patchset.","commit_id":"e5f58dc3bc04152a4a3357fd2193382d58263c84"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"f220d18d14dbb6394845826c32089a4ab0160f7a","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        :param task: A TaskManager instance."},{"line_number":71,"context_line":"        :raises: NetworkError"},{"line_number":72,"context_line":"        \"\"\""},{"line_number":73,"context_line":"        neutron.remove_ports_from_network("},{"line_number":74,"context_line":"            task, CONF.neutron.provisioning_network_uuid)"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_90996622","line":72,"updated":"2016-04-05 19:53:52.000000000","message":"we should LOG.info here, too","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"8f8569ba00f0f09f9b741bcf0f2193633a3df2dc","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        :param task: A TaskManager instance."},{"line_number":71,"context_line":"        :raises: NetworkError"},{"line_number":72,"context_line":"        \"\"\""},{"line_number":73,"context_line":"        neutron.remove_ports_from_network("},{"line_number":74,"context_line":"            task, CONF.neutron.provisioning_network_uuid)"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_afb95b17","line":72,"in_reply_to":"9a061dce_90996622","updated":"2016-04-07 05:05:47.000000000","message":"Done","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"f220d18d14dbb6394845826c32089a4ab0160f7a","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        neutron.remove_ports_from_network("},{"line_number":74,"context_line":"            task, CONF.neutron.provisioning_network_uuid)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # Restoring the tenant vif to the ironic port."},{"line_number":77,"context_line":"        for item in task.ports:"},{"line_number":78,"context_line":"            extra_dict \u003d item.extra"},{"line_number":79,"context_line":"            vif \u003d extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_f0a0a245","line":76,"updated":"2016-04-05 19:53:52.000000000","message":"where is the value for tenant_vif_port_id set? Why does this key need to be renamed?","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6a09f88df754b836a8ea695fd81ae03cfd9c372c","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        neutron.remove_ports_from_network("},{"line_number":74,"context_line":"            task, CONF.neutron.provisioning_network_uuid)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # Restoring the tenant vif to the ironic port."},{"line_number":77,"context_line":"        for item in task.ports:"},{"line_number":78,"context_line":"            extra_dict \u003d item.extra"},{"line_number":79,"context_line":"            vif \u003d extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_38c4653e","line":76,"in_reply_to":"9a061dce_f0a0a245","updated":"2016-04-07 10:36:19.000000000","message":"Please take a look at common.neutron.add_ports_to_network. In this field we backup the port id created by nova.","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"f220d18d14dbb6394845826c32089a4ab0160f7a","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # Restoring the tenant vif to the ironic port."},{"line_number":77,"context_line":"        for item in task.ports:"},{"line_number":78,"context_line":"            extra_dict \u003d item.extra"},{"line_number":79,"context_line":"            vif \u003d extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":80,"context_line":"            extra_dict[\u0027vif_port_id\u0027] \u003d vif"},{"line_number":81,"context_line":"            item.extra \u003d extra_dict"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_d0a3de4d","line":78,"updated":"2016-04-05 19:53:52.000000000","message":"couldn\u0027t this whole block be written in a single line, like so, and be much easier to read?\n\n  item.extra[\u0027vif_port_id\u0027] \u003d item.extra.pop(\u0027tenant_vif_port_id\u0027, None)\n  item.save","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"8f8569ba00f0f09f9b741bcf0f2193633a3df2dc","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # Restoring the tenant vif to the ironic port."},{"line_number":77,"context_line":"        for item in task.ports:"},{"line_number":78,"context_line":"            extra_dict \u003d item.extra"},{"line_number":79,"context_line":"            vif \u003d extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":80,"context_line":"            extra_dict[\u0027vif_port_id\u0027] \u003d vif"},{"line_number":81,"context_line":"            item.extra \u003d extra_dict"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_ef3d1390","line":78,"in_reply_to":"9a061dce_d0a3de4d","updated":"2016-04-07 05:05:47.000000000","message":"Done","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6a09f88df754b836a8ea695fd81ae03cfd9c372c","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # Restoring the tenant vif to the ironic port."},{"line_number":77,"context_line":"        for item in task.ports:"},{"line_number":78,"context_line":"            extra_dict \u003d item.extra"},{"line_number":79,"context_line":"            vif \u003d extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":80,"context_line":"            extra_dict[\u0027vif_port_id\u0027] \u003d vif"},{"line_number":81,"context_line":"            item.extra \u003d extra_dict"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_78153d9a","line":78,"in_reply_to":"9a061dce_d0a3de4d","updated":"2016-04-07 10:36:19.000000000","message":"I guess this way port object will not recognize that extra was updated, there was an old bug about it (this is the case for all dict fields). We have to reassign the whole extra for the change to be noticed.","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"f220d18d14dbb6394845826c32089a4ab0160f7a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        neutron.remove_ports_from_network("},{"line_number":104,"context_line":"            task, CONF.neutron.cleaning_network_uuid)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        for port in task.ports:"},{"line_number":107,"context_line":"            extra_dict \u003d port.extra"},{"line_number":108,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":109,"context_line":"            extra_dict.pop(\u0027vif_port_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_308b3ac5","line":106,"updated":"2016-04-05 19:53:52.000000000","message":"ditto for the question about these settings... where are they coming from, and why rename the key?","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"f220d18d14dbb6394845826c32089a4ab0160f7a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            task, CONF.neutron.cleaning_network_uuid)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        for port in task.ports:"},{"line_number":107,"context_line":"            extra_dict \u003d port.extra"},{"line_number":108,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":109,"context_line":"            extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":110,"context_line":"            port.extra \u003d extra_dict"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_1086f6b8","line":107,"updated":"2016-04-05 19:53:52.000000000","message":"ditto for simplifying this into one line","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"8f8569ba00f0f09f9b741bcf0f2193633a3df2dc","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            task, CONF.neutron.cleaning_network_uuid)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        for port in task.ports:"},{"line_number":107,"context_line":"            extra_dict \u003d port.extra"},{"line_number":108,"context_line":"            extra_dict.pop(\u0027tenant_vif_port_id\u0027, None)"},{"line_number":109,"context_line":"            extra_dict.pop(\u0027vif_port_id\u0027, None)"},{"line_number":110,"context_line":"            port.extra \u003d extra_dict"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_4f3fdf86","line":107,"in_reply_to":"9a061dce_1086f6b8","updated":"2016-04-07 05:05:47.000000000","message":"Done","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"f220d18d14dbb6394845826c32089a4ab0160f7a","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        if not ports:"},{"line_number":128,"context_line":"            msg \u003d _(\"No public network ports to activate attached to \""},{"line_number":129,"context_line":"                    \"node %s\") % node.uuid"},{"line_number":130,"context_line":"            LOG.error(msg)"},{"line_number":131,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        portmap \u003d neutron.get_node_portmap(task)"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_7095b2dc","line":130,"updated":"2016-04-05 19:53:52.000000000","message":"why log and raise the same message?","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"8f8569ba00f0f09f9b741bcf0f2193633a3df2dc","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        if not ports:"},{"line_number":128,"context_line":"            msg \u003d _(\"No public network ports to activate attached to \""},{"line_number":129,"context_line":"                    \"node %s\") % node.uuid"},{"line_number":130,"context_line":"            LOG.error(msg)"},{"line_number":131,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        portmap \u003d neutron.get_node_portmap(task)"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_af503bd5","line":130,"in_reply_to":"9a061dce_7095b2dc","updated":"2016-04-07 05:05:47.000000000","message":"Fixed.","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6a09f88df754b836a8ea695fd81ae03cfd9c372c","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        if not ports:"},{"line_number":128,"context_line":"            msg \u003d _(\"No public network ports to activate attached to \""},{"line_number":129,"context_line":"                    \"node %s\") % node.uuid"},{"line_number":130,"context_line":"            LOG.error(msg)"},{"line_number":131,"context_line":"            raise exception.NetworkError(msg)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        portmap \u003d neutron.get_node_portmap(task)"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_58883971","line":130,"in_reply_to":"9a061dce_7095b2dc","updated":"2016-04-07 10:36:19.000000000","message":"I think that if exception is just raised, it goes only to stdout, not to log. This way it is output in log too.","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"5ee169bbf4ddc9ee3ea146c911e6f379d7b0dfc6","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        portmap \u003d neutron.get_node_portmap(task)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        client \u003d neutron.get_client()"},{"line_number":136,"context_line":"        for port in ports:"},{"line_number":137,"context_line":"            vif_port_id \u003d port.extra.get(\u0027vif_port_id\u0027)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            if not vif_port_id:"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_64af6a2a","line":136,"updated":"2016-04-07 04:51:38.000000000","message":"This loop should include ports without portgroup_id and portgroups for going along with Nova\u0027s patch[1].\n\n\n[1] https://review.openstack.org/#/c/206163/4/nova/virt/ironic/driver.py@1018","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6a09f88df754b836a8ea695fd81ae03cfd9c372c","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        portmap \u003d neutron.get_node_portmap(task)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        client \u003d neutron.get_client()"},{"line_number":136,"context_line":"        for port in ports:"},{"line_number":137,"context_line":"            vif_port_id \u003d port.extra.get(\u0027vif_port_id\u0027)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            if not vif_port_id:"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_9e463979","line":136,"in_reply_to":"9a061dce_64af6a2a","updated":"2016-04-07 10:36:19.000000000","message":"Done","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"f220d18d14dbb6394845826c32089a4ab0160f7a","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                LOG.error(_LE(\u0027Node %(node)s port has no vif id in extra: \u0027"},{"line_number":141,"context_line":"                              \u0027%(extra)s\u0027),"},{"line_number":142,"context_line":"                          {\u0027extra\u0027: port.extra, \u0027node\u0027: node.uuid})"},{"line_number":143,"context_line":"                continue"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            LOG.debug(\u0027Mapping tenant port %(vif_port_id)s to node \u0027"},{"line_number":146,"context_line":"                      \u0027%(node_id)s\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_50906eec","line":143,"updated":"2016-04-05 19:53:52.000000000","message":"if this is actually an error, why continue?\n\nI think this should either be logged as a warning, or -- if it is really that serious -- the method should abort.","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"8f8569ba00f0f09f9b741bcf0f2193633a3df2dc","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                LOG.error(_LE(\u0027Node %(node)s port has no vif id in extra: \u0027"},{"line_number":141,"context_line":"                              \u0027%(extra)s\u0027),"},{"line_number":142,"context_line":"                          {\u0027extra\u0027: port.extra, \u0027node\u0027: node.uuid})"},{"line_number":143,"context_line":"                continue"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            LOG.debug(\u0027Mapping tenant port %(vif_port_id)s to node \u0027"},{"line_number":146,"context_line":"                      \u0027%(node_id)s\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_2f5b8bf7","line":143,"in_reply_to":"9a061dce_50906eec","updated":"2016-04-07 05:05:47.000000000","message":"Done","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"f220d18d14dbb6394845826c32089a4ab0160f7a","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                       {\u0027vif\u0027: vif_port_id,"},{"line_number":167,"context_line":"                        \u0027node\u0027: node.uuid,"},{"line_number":168,"context_line":"                        \u0027exc\u0027: e})"},{"line_number":169,"context_line":"                LOG.error(msg)"},{"line_number":170,"context_line":"                raise exception.NetworkError(msg)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def unconfigure_tenant_networks(self, task):"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_b0bd8a6a","line":169,"updated":"2016-04-05 19:53:52.000000000","message":"OK, again, why log the error and then raise an exception for the same message -- won\u0027t this result in it being logged twice?","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":9628,"name":"Sivaramakrishna Garimella","email":"sivaramakrishna_g@yahoo.in","username":"sivaramakrishna-g"},"change_message_id":"8f8569ba00f0f09f9b741bcf0f2193633a3df2dc","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                       {\u0027vif\u0027: vif_port_id,"},{"line_number":167,"context_line":"                        \u0027node\u0027: node.uuid,"},{"line_number":168,"context_line":"                        \u0027exc\u0027: e})"},{"line_number":169,"context_line":"                LOG.error(msg)"},{"line_number":170,"context_line":"                raise exception.NetworkError(msg)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def unconfigure_tenant_networks(self, task):"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a061dce_6f710376","line":169,"in_reply_to":"9a061dce_b0bd8a6a","updated":"2016-04-07 05:05:47.000000000","message":"Done","commit_id":"f54cdd8d160a1ce920edb05fcadc175f1e539be6"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"17ceb41063a301c6a0291f376a4bb89168535dc6","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def __init__(self):"},{"line_number":39,"context_line":"        failures \u003d []"},{"line_number":40,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":41,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":42,"context_line":"            failures.append(\u0027cleaning_network_uuid\u003d%s\u0027 % cleaning_net)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"5a18252c_20ac9634","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":20},"updated":"2016-04-13 12:02:47.000000000","message":"Could we make it as an instance variable so that it can be refered by the other instance methods? And which can also  simplify the code.","commit_id":"d7cc4b85a8e7025a5d07626dc55dba064f602b26"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"5bf29370ff82d8bf0a551b5ebd204cec6016863a","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def __init__(self):"},{"line_number":39,"context_line":"        failures \u003d []"},{"line_number":40,"context_line":"        cleaning_net \u003d CONF.neutron.cleaning_network_uuid"},{"line_number":41,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":42,"context_line":"            failures.append(\u0027cleaning_network_uuid\u003d%s\u0027 % cleaning_net)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"5a18252c_5ce4deaa","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":20},"in_reply_to":"5a18252c_20ac9634","updated":"2016-04-14 15:10:39.000000000","message":"I don\u0027t think that it is needed.","commit_id":"d7cc4b85a8e7025a5d07626dc55dba064f602b26"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"17ceb41063a301c6a0291f376a4bb89168535dc6","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        if not uuidutils.is_uuid_like(cleaning_net):"},{"line_number":42,"context_line":"            failures.append(\u0027cleaning_network_uuid\u003d%s\u0027 % cleaning_net)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        provisioning_net \u003d CONF.neutron.provisioning_network_uuid"},{"line_number":45,"context_line":"        if not uuidutils.is_uuid_like(provisioning_net):"},{"line_number":46,"context_line":"            failures.append(\u0027provisioning_network_uuid\u003d%s\u0027 % provisioning_net)"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"5a18252c_c0632219","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":24},"updated":"2016-04-13 12:02:47.000000000","message":"ditto.","commit_id":"d7cc4b85a8e7025a5d07626dc55dba064f602b26"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            if not vif_port_id:"},{"line_number":146,"context_line":"                LOG.warning(_LW(\u0027Node %(node)s port has no vif id in extra: \u0027"},{"line_number":147,"context_line":"                                \u0027%(extra)s\u0027),"},{"line_number":148,"context_line":"                            {\u0027extra\u0027: port_like_obj.extra, \u0027node\u0027: node.uuid})"},{"line_number":149,"context_line":"                continue"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"            LOG.debug(\u0027Mapping tenant port %(vif_port_id)s to node \u0027"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_1f76943d","line":148,"updated":"2016-04-20 19:41:26.000000000","message":"would it be useful to have the ID or UUID of the questionable port_like_obj? Hmm, and/or if it is a port or a portgroup?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        Nova takes care of port removal from tenant network, but we should"},{"line_number":192,"context_line":"        remove it ourselves, so that ironic port could not be bound to tenant"},{"line_number":193,"context_line":"        and cleaning network at the same time."},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        :param task: A TaskManager instance."},{"line_number":196,"context_line":"        :raises: NetworkError"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_9f82a4c6","line":193,"updated":"2016-04-20 19:41:26.000000000","message":"How about \u0027Even though nova takes care of port removal from tenant network, we remove it here/now to avoid the possibility of the ironic port being bound to the tenant and cleaning networks at the same time.\u0027","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"}],"ironic/drivers/modules/network/none.py":[{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"5bf29370ff82d8bf0a551b5ebd204cec6016863a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":38,"id":"5a18252c_1f16d84b","line":1,"updated":"2016-04-14 15:10:39.000000000","message":"Sam, we using none for other drivers please have look:\nhttps://github.com/openstack/ironic/blob/master/ironic/dhcp/none.py","commit_id":"d7cc4b85a8e7025a5d07626dc55dba064f602b26"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"f3bbfaae690288a440842dacf161de7f1203e315","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def unconfigure_tenant_networks(self, task):"},{"line_number":41,"context_line":"        \"\"\"Unconfigure tenant networks for a node."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        :param task: A TaskManager instance."},{"line_number":44,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_431eaf5f","line":41,"updated":"2016-06-24 15:03:30.000000000","message":"\"Unconfigure\" isn\u0027t very clear, IMHO - what do you mean here? Remove a node from any tenant networks to which it\u0027s attached? If so, `remove_tenant_networks` would be better (and more consistent with the naming of the other methods).","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"df313ebfdd3c599f6a296e79b88bb186fdfe1d08","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def unconfigure_tenant_networks(self, task):"},{"line_number":41,"context_line":"        \"\"\"Unconfigure tenant networks for a node."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        :param task: A TaskManager instance."},{"line_number":44,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":59,"id":"3aaa91ec_33670e27","line":41,"in_reply_to":"3aaa91ec_431eaf5f","updated":"2016-07-01 13:10:02.000000000","message":"Please see the spec http://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/network-provider.html","commit_id":"7032e8b0119fe99fed09230145b62bb20b91e9dc"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":13,"context_line":"from ironic.drivers import base"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"class NoneNetwork(base.NetworkInterface):"},{"line_number":17,"context_line":"    \"\"\"Noop network driver.\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    def add_provisioning_network(self, task):"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_a385facf","line":16,"updated":"2016-06-29 20:07:44.000000000","message":"what about calling this \u0027NoopNetwork\u0027?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":13,"context_line":"from ironic.drivers import base"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"class NoneNetwork(base.NetworkInterface):"},{"line_number":17,"context_line":"    \"\"\"Noop network driver.\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    def add_provisioning_network(self, task):"}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_941b7372","line":16,"in_reply_to":"3aaa91ec_a385facf","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"class NoneNetwork(base.NetworkInterface):"},{"line_number":17,"context_line":"    \"\"\"Noop network driver.\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    def add_provisioning_network(self, task):"},{"line_number":20,"context_line":"        \"\"\"Add the provisioning network to a node."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_637f92e0","line":17,"updated":"2016-06-29 20:07:44.000000000","message":"Do we need to call these things drivers? I\u0027d rather we stick to \u0027interface\u0027.","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6bb109890d143e1928233f92c2681734973a1f18","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"class NoneNetwork(base.NetworkInterface):"},{"line_number":17,"context_line":"    \"\"\"Noop network driver.\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    def add_provisioning_network(self, task):"},{"line_number":20,"context_line":"        \"\"\"Add the provisioning network to a node."}],"source_content_type":"text/x-python","patch_set":61,"id":"3aaa91ec_54158b3d","line":17,"in_reply_to":"3aaa91ec_637f92e0","updated":"2016-07-01 13:09:18.000000000","message":"Done","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"}],"ironic/objects/node.py":[{"author":{"_account_id":6558,"name":"Sukhdev Kapur","email":"sukhdevkapur@gmail.com","username":"sukhdev-8"},"change_message_id":"9aeca57e90697de85bf123a4aed7c9ec61c53258","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        \u0027extra\u0027: object_fields.FlexibleDictField(nullable\u003dTrue),"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # composable interfaces"},{"line_number":107,"context_line":"        \u0027network_interface\u0027: object_fields.StringField(),"},{"line_number":108,"context_line":"    }"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _validate_property_values(self, properties):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7af24918_3d64e447","line":107,"updated":"2016-03-06 22:38:45.000000000","message":"Should it be nullable?","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"34c36d40453a39d6f7cc3bac1e929540eaecd140","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        \u0027extra\u0027: object_fields.FlexibleDictField(nullable\u003dTrue),"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # composable interfaces"},{"line_number":107,"context_line":"        \u0027network_interface\u0027: object_fields.StringField(),"},{"line_number":108,"context_line":"    }"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _validate_property_values(self, properties):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_142725b7","line":107,"in_reply_to":"7af24918_3d64e447","updated":"2016-03-08 10:57:09.000000000","message":"I believe its a required node entity so should never be null, the migrations update all existing nodes to have the \u0027flat\u0027 network type.","commit_id":"65122fd1b12e3f56235de5a39bb99b0ff937fd5f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        \u0027extra\u0027: object_fields.FlexibleDictField(nullable\u003dTrue),"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # composable interfaces"},{"line_number":107,"context_line":"        \u0027network_interface\u0027: object_fields.StringField(),"},{"line_number":108,"context_line":"    }"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_f97ae222","line":106,"updated":"2016-04-20 19:41:26.000000000","message":"what do you mean by \u0027composable\u0027? Isn\u0027t this going to be one of the values from CONF.enabled_network_drivers?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"}],"ironic/tests/base.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5a4832852a8425ed0b448696125514ef8b230ebb","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        self.config(use_stderr\u003dFalse,"},{"line_number":117,"context_line":"                    fatal_exception_format_errors\u003dTrue,"},{"line_number":118,"context_line":"                    tempdir\u003dtempfile.tempdir)"},{"line_number":119,"context_line":"        self.config(cleaning_network_uuid\u003duuidutils.generate_uuid(),"},{"line_number":120,"context_line":"                    group\u003d\u0027neutron\u0027)"},{"line_number":121,"context_line":"        self.config(provisioning_network_uuid\u003duuidutils.generate_uuid(),"},{"line_number":122,"context_line":"                    group\u003d\u0027neutron\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_951a73c4","line":119,"updated":"2016-03-10 17:51:21.000000000","message":"This is bad and should be moved to respective unittests.","commit_id":"46bd48963eff1232a5d90ceab2988548280679db"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"74acd92b73e26a2fe84d2919ef5c82998c66a23c","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    group\u003d\u0027neutron\u0027)"},{"line_number":121,"context_line":"        self.config(provisioning_network_uuid\u003duuidutils.generate_uuid(),"},{"line_number":122,"context_line":"                    group\u003d\u0027neutron\u0027)"},{"line_number":123,"context_line":"        self.config(enabled_network_drivers\u003d[\u0027flat\u0027, \u0027neutron\u0027])"},{"line_number":124,"context_line":"        self.set_defaults(host\u003d\u0027fake-mini\u0027,"},{"line_number":125,"context_line":"                          verbose\u003dTrue)"},{"line_number":126,"context_line":"        self.set_defaults(connection\u003d\"sqlite://\","}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_e10a6378","line":123,"range":{"start_line":123,"start_character":44,"end_line":123,"end_character":64},"updated":"2016-04-19 19:37:28.000000000","message":"Would we want none in this list as well?  Granted, this just controls what is available to be sent to the API in the tests, but I think a user defining none is going to be perfectly valid in normal operation.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    group\u003d\u0027neutron\u0027)"},{"line_number":121,"context_line":"        self.config(provisioning_network_uuid\u003duuidutils.generate_uuid(),"},{"line_number":122,"context_line":"                    group\u003d\u0027neutron\u0027)"},{"line_number":123,"context_line":"        self.config(enabled_network_drivers\u003d[\u0027flat\u0027, \u0027neutron\u0027])"},{"line_number":124,"context_line":"        self.set_defaults(host\u003d\u0027fake-mini\u0027,"},{"line_number":125,"context_line":"                          verbose\u003dTrue)"},{"line_number":126,"context_line":"        self.set_defaults(connection\u003d\"sqlite://\","}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_5f330014","line":123,"updated":"2016-05-17 14:02:11.000000000","message":"Comment from Julia on PS 39\n\nWould we want none in this list as well?  Granted, this just controls what is available to be sent to the API in the tests, but I think a user defining none is going to be perfectly valid in normal operation.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    group\u003d\u0027neutron\u0027)"},{"line_number":121,"context_line":"        self.config(provisioning_network_uuid\u003duuidutils.generate_uuid(),"},{"line_number":122,"context_line":"                    group\u003d\u0027neutron\u0027)"},{"line_number":123,"context_line":"        self.config(enabled_network_drivers\u003d[\u0027flat\u0027, \u0027neutron\u0027])"},{"line_number":124,"context_line":"        self.set_defaults(host\u003d\u0027fake-mini\u0027,"},{"line_number":125,"context_line":"                          verbose\u003dTrue)"},{"line_number":126,"context_line":"        self.set_defaults(connection\u003d\"sqlite://\","}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_da4fe768","line":123,"in_reply_to":"dab17558_5f330014","updated":"2016-05-24 16:15:18.000000000","message":"Added \u0027none\u0027","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"}],"ironic/tests/unit/api/v1/test_utils.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c6717ea897ebf7ba612c66e74c4058c9701439d0","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        self.assertFalse(utils.allow_network_interface())"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def test_is_valid_network_interface(self):"},{"line_number":192,"context_line":"        CONF.set_override(\u0027enabled_network_drivers\u0027, [\u0027flat\u0027, \u0027neutron\u0027])"},{"line_number":193,"context_line":"        self.assertTrue(utils.is_valid_network_interface(\u0027flat\u0027))"},{"line_number":194,"context_line":"        self.assertTrue(utils.is_valid_network_interface(\u0027neutron\u0027))"},{"line_number":195,"context_line":"        self.assertFalse(utils.is_valid_network_interface(\u0027foo\u0027))"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba0121b8_85780c91","line":192,"updated":"2016-03-30 09:26:43.000000000","message":"nit - this line is not needed, both are enabled in base test class.","commit_id":"61742f1a19be18a9fd67cadd868be796fe07219a"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"76e537d5ed04ff3439b26c88eb39eee2bc53e566","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        self.assertFalse(utils.allow_network_interface())"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def test_is_valid_network_interface(self):"},{"line_number":192,"context_line":"        CONF.set_override(\u0027enabled_network_drivers\u0027, [\u0027flat\u0027, \u0027neutron\u0027])"},{"line_number":193,"context_line":"        self.assertTrue(utils.is_valid_network_interface(\u0027flat\u0027))"},{"line_number":194,"context_line":"        self.assertTrue(utils.is_valid_network_interface(\u0027neutron\u0027))"},{"line_number":195,"context_line":"        self.assertFalse(utils.is_valid_network_interface(\u0027foo\u0027))"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba0121b8_f63c1ce4","line":192,"in_reply_to":"ba0121b8_85780c91","updated":"2016-03-30 10:41:21.000000000","message":"Done","commit_id":"61742f1a19be18a9fd67cadd868be796fe07219a"}],"ironic/tests/unit/common/test_driver_factory.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                                          network_interface\u003d\u0027flat\u0027)"},{"line_number":106,"context_line":"        with task_manager.acquire(self.context, node.id) as task:"},{"line_number":107,"context_line":"            extension_mgr \u003d factory._extension_manager"},{"line_number":108,"context_line":"            self.assertIn(\u0027flat\u0027, extension_mgr)"},{"line_number":109,"context_line":"            self.assertEqual(extension_mgr[\u0027flat\u0027].obj, task.driver.network)"},{"line_number":110,"context_line":"        self.assertEqual(\u0027ironic.hardware.interfaces.network\u0027,"},{"line_number":111,"context_line":"                         factory._entrypoint_name)"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_f514ff44","line":108,"updated":"2016-07-05 17:43:03.000000000","message":"flat and noop are in extension_mgr, right?","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"80de034814e0dbd92136341c2a556c6b619d1e24","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                                          network_interface\u003d\u0027flat\u0027)"},{"line_number":106,"context_line":"        with task_manager.acquire(self.context, node.id) as task:"},{"line_number":107,"context_line":"            extension_mgr \u003d factory._extension_manager"},{"line_number":108,"context_line":"            self.assertIn(\u0027flat\u0027, extension_mgr)"},{"line_number":109,"context_line":"            self.assertEqual(extension_mgr[\u0027flat\u0027].obj, task.driver.network)"},{"line_number":110,"context_line":"        self.assertEqual(\u0027ironic.hardware.interfaces.network\u0027,"},{"line_number":111,"context_line":"                         factory._entrypoint_name)"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_532e5dfb","line":108,"in_reply_to":"1aa78d24_f514ff44","updated":"2016-07-07 18:08:14.000000000","message":"Done","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"},{"line_number":120,"context_line":"        with task_manager.acquire(self.context, node.id) as task:"},{"line_number":121,"context_line":"            extension_mgr \u003d factory._extension_manager"},{"line_number":122,"context_line":"            self.assertIn(\u0027noop\u0027, extension_mgr)"},{"line_number":123,"context_line":"            self.assertEqual(extension_mgr[\u0027noop\u0027].obj, task.driver.network)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def test_build_driver_for_task_default_is_flat(self):"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_5578738f","line":122,"updated":"2016-07-05 17:43:03.000000000","message":"ditto, \u0027flat\u0027 is in extension_mgr too.","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"80de034814e0dbd92136341c2a556c6b619d1e24","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"},{"line_number":120,"context_line":"        with task_manager.acquire(self.context, node.id) as task:"},{"line_number":121,"context_line":"            extension_mgr \u003d factory._extension_manager"},{"line_number":122,"context_line":"            self.assertIn(\u0027noop\u0027, extension_mgr)"},{"line_number":123,"context_line":"            self.assertEqual(extension_mgr[\u0027noop\u0027].obj, task.driver.network)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def test_build_driver_for_task_default_is_flat(self):"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_f3eca9bc","line":122,"in_reply_to":"1aa78d24_5578738f","updated":"2016-07-07 18:08:14.000000000","message":"Done","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        self.assertRaises(exception.DriverNotFound, task_manager.acquire,"},{"line_number":138,"context_line":"                          self.context, node.id)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"class NewDriverFactory(driver_factory.BaseDriverFactory):"},{"line_number":142,"context_line":"    _entrypoint_name \u003d \u0027woof\u0027"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_595f0de5","line":140,"updated":"2016-07-05 17:43:03.000000000","message":"there aren\u0027t any tests for enabled_network_interfaces config, but maybe we don\u0027t need any.","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"80de034814e0dbd92136341c2a556c6b619d1e24","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        self.assertRaises(exception.DriverNotFound, task_manager.acquire,"},{"line_number":138,"context_line":"                          self.context, node.id)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"class NewDriverFactory(driver_factory.BaseDriverFactory):"},{"line_number":142,"context_line":"    _entrypoint_name \u003d \u0027woof\u0027"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_7300b966","line":140,"in_reply_to":"1aa78d24_595f0de5","updated":"2016-07-07 18:08:14.000000000","message":"I don\u0027t know how to write these tests without mocking a bunch of stevedore internals, as if we eg set it to only noop in one test, other tests executed in parallel that need flat will all fail. We do have the mock_the_extension_manager method, but the last time I tried I was not able to make it work :( If people are OK with it, I\u0027d prefer to try to add those in the followup.","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"}],"ironic/tests/unit/common/test_neutron.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    @mock.patch.object(client.Client, \u0027list_ports\u0027)"},{"line_number":344,"context_line":"    def test_remove_neutron_ports_list_fail(self, list_mock):"},{"line_number":345,"context_line":"        # Check that if listing ports fails, the node goes to cleanfail"},{"line_number":346,"context_line":"        with task_manager.acquire(self.context, self.node.uuid) as task:"},{"line_number":347,"context_line":"            list_mock.side_effect \u003d neutron_client_exc.ConnectionFailed"},{"line_number":348,"context_line":"            self.assertRaises(exception.NetworkError,"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_7c391741","line":345,"updated":"2016-07-05 17:43:03.000000000","message":"No cleanfail here :-(","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"80de034814e0dbd92136341c2a556c6b619d1e24","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    @mock.patch.object(client.Client, \u0027list_ports\u0027)"},{"line_number":344,"context_line":"    def test_remove_neutron_ports_list_fail(self, list_mock):"},{"line_number":345,"context_line":"        # Check that if listing ports fails, the node goes to cleanfail"},{"line_number":346,"context_line":"        with task_manager.acquire(self.context, self.node.uuid) as task:"},{"line_number":347,"context_line":"            list_mock.side_effect \u003d neutron_client_exc.ConnectionFailed"},{"line_number":348,"context_line":"            self.assertRaises(exception.NetworkError,"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_d30fed34","line":345,"in_reply_to":"1aa78d24_7c391741","updated":"2016-07-07 18:08:14.000000000","message":"Done","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":353,"context_line":"    @mock.patch.object(client.Client, \u0027delete_port\u0027)"},{"line_number":354,"context_line":"    @mock.patch.object(client.Client, \u0027list_ports\u0027)"},{"line_number":355,"context_line":"    def test_remove_neutron_ports_delete_fail(self, list_mock, delete_mock):"},{"line_number":356,"context_line":"        # Check that if deleting ports fails, the node goes to cleanfail"},{"line_number":357,"context_line":"        with task_manager.acquire(self.context, self.node.uuid) as task:"},{"line_number":358,"context_line":"            delete_mock.side_effect \u003d neutron_client_exc.ConnectionFailed"},{"line_number":359,"context_line":"            list_mock.return_value \u003d {\u0027ports\u0027: [self.neutron_port]}"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_7c10f7a8","line":356,"updated":"2016-07-05 17:43:03.000000000","message":"ditto","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"80de034814e0dbd92136341c2a556c6b619d1e24","unresolved":false,"context_lines":[{"line_number":353,"context_line":"    @mock.patch.object(client.Client, \u0027delete_port\u0027)"},{"line_number":354,"context_line":"    @mock.patch.object(client.Client, \u0027list_ports\u0027)"},{"line_number":355,"context_line":"    def test_remove_neutron_ports_delete_fail(self, list_mock, delete_mock):"},{"line_number":356,"context_line":"        # Check that if deleting ports fails, the node goes to cleanfail"},{"line_number":357,"context_line":"        with task_manager.acquire(self.context, self.node.uuid) as task:"},{"line_number":358,"context_line":"            delete_mock.side_effect \u003d neutron_client_exc.ConnectionFailed"},{"line_number":359,"context_line":"            list_mock.return_value \u003d {\u0027ports\u0027: [self.neutron_port]}"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_7314394c","line":356,"in_reply_to":"1aa78d24_7c10f7a8","updated":"2016-07-07 18:08:14.000000000","message":"Done","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        with task_manager.acquire(self.context, self.node.uuid) as task:"},{"line_number":358,"context_line":"            delete_mock.side_effect \u003d neutron_client_exc.ConnectionFailed"},{"line_number":359,"context_line":"            list_mock.return_value \u003d {\u0027ports\u0027: [self.neutron_port]}"},{"line_number":360,"context_line":"            self.assertRaises(exception.NetworkError,"},{"line_number":361,"context_line":"                              neutron.remove_neutron_ports, task,"},{"line_number":362,"context_line":"                              {\u0027param\u0027: \u0027value\u0027})"},{"line_number":363,"context_line":"        list_mock.assert_called_once_with(**{\u0027param\u0027: \u0027value\u0027})"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_fca6a751","line":360,"updated":"2016-07-05 17:43:03.000000000","message":"might want to do assertRaisesRegex() to distinguish between this exception and the one in the test above.","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"80de034814e0dbd92136341c2a556c6b619d1e24","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        with task_manager.acquire(self.context, self.node.uuid) as task:"},{"line_number":358,"context_line":"            delete_mock.side_effect \u003d neutron_client_exc.ConnectionFailed"},{"line_number":359,"context_line":"            list_mock.return_value \u003d {\u0027ports\u0027: [self.neutron_port]}"},{"line_number":360,"context_line":"            self.assertRaises(exception.NetworkError,"},{"line_number":361,"context_line":"                              neutron.remove_neutron_ports, task,"},{"line_number":362,"context_line":"                              {\u0027param\u0027: \u0027value\u0027})"},{"line_number":363,"context_line":"        list_mock.assert_called_once_with(**{\u0027param\u0027: \u0027value\u0027})"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_9311e55f","line":360,"in_reply_to":"1aa78d24_fca6a751","updated":"2016-07-07 18:08:14.000000000","message":"Done","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"}],"ironic/tests/unit/conductor/test_manager.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    def test_update_network_node_deleting_state(self):"},{"line_number":289,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"},{"line_number":290,"context_line":"                                          provision_state\u003dstates.DELETING)"},{"line_number":291,"context_line":"        old_iface \u003d node.network_interface"},{"line_number":292,"context_line":"        node.network_interface \u003d \u0027neutron\u0027"},{"line_number":293,"context_line":"        exc \u003d self.assertRaises(messaging.rpc.ExpectedException,"},{"line_number":294,"context_line":"                                self.service.update_node,"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_a3ae782b","line":291,"updated":"2016-04-20 19:41:26.000000000","message":"just a nit. I think the default is for this to be \u0027flat\u0027, but it seems to me that the test would be clearer (easier to understand for someone that doesn\u0027t know the default), to just set the node\u0027s network_interface to \u0027flat\u0027 as part of line 289.\n\nOtherwise, if something changes down the road, it is possible for old_iface to \u003d \u0027neutron\u0027, which would make this test a bit odd.\n\nI suspect we have this pattern in other tests (not just yours).","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    def test_update_network_node_deleting_state(self):"},{"line_number":289,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"},{"line_number":290,"context_line":"                                          provision_state\u003dstates.DELETING)"},{"line_number":291,"context_line":"        old_iface \u003d node.network_interface"},{"line_number":292,"context_line":"        node.network_interface \u003d \u0027neutron\u0027"},{"line_number":293,"context_line":"        exc \u003d self.assertRaises(messaging.rpc.ExpectedException,"},{"line_number":294,"context_line":"                                self.service.update_node,"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_55c800a8","line":291,"updated":"2016-05-17 14:02:11.000000000","message":"Ruby\u0027s comment from PS 39\n\njust a nit. I think the default is for this to be \u0027flat\u0027, but it seems to me that the test would be clearer (easier to understand for someone that doesn\u0027t know the default), to just set the node\u0027s network_interface to \u0027flat\u0027 as part of line 289.\nOtherwise, if something changes down the road, it is possible for old_iface to \u003d \u0027neutron\u0027, which would make this test a bit odd.\nI suspect we have this pattern in other tests (not just yours).","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    def test_update_network_node_deleting_state(self):"},{"line_number":289,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"},{"line_number":290,"context_line":"                                          provision_state\u003dstates.DELETING)"},{"line_number":291,"context_line":"        old_iface \u003d node.network_interface"},{"line_number":292,"context_line":"        node.network_interface \u003d \u0027neutron\u0027"},{"line_number":293,"context_line":"        exc \u003d self.assertRaises(messaging.rpc.ExpectedException,"},{"line_number":294,"context_line":"                                self.service.update_node,"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_9ca9bb7e","line":291,"in_reply_to":"dab17558_55c800a8","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"}],"ironic/tests/unit/db/sqlalchemy/test_migrations.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":420,"context_line":"        self.assertIn(\u0027network_interface\u0027, col_names)"},{"line_number":421,"context_line":"        self.assertIsInstance(nodes.c.network_interface.type,"},{"line_number":422,"context_line":"                              sqlalchemy.types.String)"},{"line_number":423,"context_line":"        # TODO(vdrok): add a check that vaulue is \u0027flat\u0027"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    def test_upgrade_and_version(self):"},{"line_number":426,"context_line":"        with patch_with_engine(self.engine):"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a122d0e_0062c2d7","line":423,"updated":"2016-04-20 19:41:26.000000000","message":"Are you planning on adding this before this patch merges, or in a different patch?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"}],"ironic/tests/unit/dhcp/test_neutron.py":[{"author":{"_account_id":7080,"name":"Mathieu Mitchell","email":"mat128@gmail.com","username":"mat128"},"change_message_id":"1d5935dcd6491a0a67b26aa170e2b7e782474d91","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from ironic.tests.unit.db import base as db_base"},{"line_number":32,"context_line":"from ironic.tests.unit.objects import utils as object_utils"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"CONF \u003d cfg.CONF"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class TestNeutron(db_base.DbTestCase):"}],"source_content_type":"text/x-python","patch_set":49,"id":"dab17558_f3979545","line":34,"updated":"2016-05-17 12:06:03.000000000","message":"This test does not seem to use CONF anywhere.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from ironic.tests.unit.db import base as db_base"},{"line_number":32,"context_line":"from ironic.tests.unit.objects import utils as object_utils"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"CONF \u003d cfg.CONF"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class TestNeutron(db_base.DbTestCase):"}],"source_content_type":"text/x-python","patch_set":49,"id":"bab6814e_dc07c37f","line":34,"in_reply_to":"dab17558_f3979545","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"2c6e7d91043b81b2ede01abc68a51b5a5d114a21","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import mock"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from neutronclient.common import exceptions as neutron_client_exc"},{"line_number":21,"context_line":"from neutronclient.v2_0 import client"},{"line_number":22,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":50,"id":"bab6814e_45f7ecd2","line":19,"updated":"2016-05-26 12:17:39.000000000","message":"unnecessary change.","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"3425b92c992de374b2f86e63908375f613a491ca","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import mock"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from neutronclient.common import exceptions as neutron_client_exc"},{"line_number":21,"context_line":"from neutronclient.v2_0 import client"},{"line_number":22,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":50,"id":"bab6814e_d6c1d0e5","line":19,"in_reply_to":"bab6814e_45f7ecd2","updated":"2016-05-26 14:58:06.000000000","message":"Done","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":467,"context_line":"                                   \u0027add_cleaning_network\u0027) as add_net_mock:"},{"line_number":468,"context_line":"                api.create_cleaning_ports(task)"},{"line_number":469,"context_line":"                add_net_mock.assert_called_once_with(task)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def test_delete_cleaning_ports(self):"},{"line_number":472,"context_line":"        api \u003d dhcp_factory.DHCPFactory().provider"},{"line_number":473,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_dfa47da7","line":470,"updated":"2016-07-05 17:43:03.000000000","message":"Do we want to test that we are logging a warning the first time (only) that api.create_cleaning_ports() is called?","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"80de034814e0dbd92136341c2a556c6b619d1e24","unresolved":false,"context_lines":[{"line_number":467,"context_line":"                                   \u0027add_cleaning_network\u0027) as add_net_mock:"},{"line_number":468,"context_line":"                api.create_cleaning_ports(task)"},{"line_number":469,"context_line":"                add_net_mock.assert_called_once_with(task)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def test_delete_cleaning_ports(self):"},{"line_number":472,"context_line":"        api \u003d dhcp_factory.DHCPFactory().provider"},{"line_number":473,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_37229ca3","line":470,"in_reply_to":"1aa78d24_dfa47da7","updated":"2016-07-07 18:08:14.000000000","message":"Ugh, personally, I don\u0027t like all this bikeshedding with logging only once, but will do.","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":475,"context_line":"            with mock.patch.object(task.driver.network,"},{"line_number":476,"context_line":"                                   \u0027remove_cleaning_network\u0027) as rm_net_mock:"},{"line_number":477,"context_line":"                api.delete_cleaning_ports(task)"},{"line_number":478,"context_line":"                rm_net_mock.assert_called_once_with(task)"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_bff41187","line":478,"updated":"2016-07-05 17:43:03.000000000","message":"ditto about testing of logging deprecation.","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"}],"ironic/tests/unit/drivers/modules/network/test_flat.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":79,"context_line":"            self.interface.unconfigure_tenant_networks(task)"},{"line_number":80,"context_line":"            self.port.refresh()"},{"line_number":81,"context_line":"            self.assertNotIn(\u0027vif_port_id\u0027, self.port.extra)"}],"source_content_type":"text/x-python","patch_set":62,"id":"1aa78d24_02c18e2e","line":81,"updated":"2016-07-05 17:43:03.000000000","message":"\u0027tenant_vif_port_id\u0027 is in self.port.extra. Which is confusing, given that the method name is .unconfigure_tenant_networks()","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b817d532bf61eac7eedbb49c200f42436596aa65","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            remove_mock.assert_called_once_with("},{"line_number":77,"context_line":"                task, CONF.neutron.cleaning_network_uuid)"},{"line_number":78,"context_line":"        self.port.refresh()"},{"line_number":79,"context_line":"        self.assertNotIn(\u0027cleaing_vif_port_id\u0027, self.port.internal_info)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def test_unconfigure_tenant_networks(self):"},{"line_number":82,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_14c935ad","line":79,"updated":"2016-07-08 01:09:18.000000000","message":"typo here; s/cleaing/cleaning/","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6e01bf091551c62978b7857feb91391008ad9b30","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            remove_mock.assert_called_once_with("},{"line_number":77,"context_line":"                task, CONF.neutron.cleaning_network_uuid)"},{"line_number":78,"context_line":"        self.port.refresh()"},{"line_number":79,"context_line":"        self.assertNotIn(\u0027cleaing_vif_port_id\u0027, self.port.internal_info)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def test_unconfigure_tenant_networks(self):"},{"line_number":82,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"}],"source_content_type":"text/x-python","patch_set":63,"id":"1aa78d24_709b05ca","line":79,"in_reply_to":"1aa78d24_14c935ad","updated":"2016-07-11 10:12:55.000000000","message":"good catch!","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"}],"releasenotes/notes/add-network-drivers-0a13c4aba252573e.yaml":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8f42d4131416cf8dd932cf5cfbdd8d9f8599228a","unresolved":false,"context_lines":[{"line_number":10,"context_line":"  - create_cleaning_ports and delete_cleaning_ports via dhcp provider is"},{"line_number":11,"context_line":"    deprecated. The network interface driver should be used instead."},{"line_number":12,"context_line":"upgrade:"},{"line_number":13,"context_line":"  - Deployments not using neutron should switch the nodes to use ``none``"},{"line_number":14,"context_line":"    network interface, as ``flat`` interface now requires"},{"line_number":15,"context_line":"    ``[neutron]cleaning_network_uuid`` to be present in config. Also ``flat``"},{"line_number":16,"context_line":"    interface is in the list of ``enabled_network_drivers`` by default, in case"}],"source_content_type":"text/x-yaml","patch_set":49,"id":"dab17558_fa4762a0","line":13,"updated":"2016-05-17 14:02:11.000000000","message":"Should also mention introduction of enabled_network_drivers option separately.","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"6491d8dc7ce86384fa7c5afddf2d7cf4d77068ea","unresolved":false,"context_lines":[{"line_number":10,"context_line":"  - create_cleaning_ports and delete_cleaning_ports via dhcp provider is"},{"line_number":11,"context_line":"    deprecated. The network interface driver should be used instead."},{"line_number":12,"context_line":"upgrade:"},{"line_number":13,"context_line":"  - Deployments not using neutron should switch the nodes to use ``none``"},{"line_number":14,"context_line":"    network interface, as ``flat`` interface now requires"},{"line_number":15,"context_line":"    ``[neutron]cleaning_network_uuid`` to be present in config. Also ``flat``"},{"line_number":16,"context_line":"    interface is in the list of ``enabled_network_drivers`` by default, in case"}],"source_content_type":"text/x-yaml","patch_set":49,"id":"bab6814e_5fd0e2c9","line":13,"in_reply_to":"dab17558_fa4762a0","updated":"2016-05-24 16:15:18.000000000","message":"Done","commit_id":"f6dd9af491857401f46d7c766ad2b02a027fe7f6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"0883c3b7bf011f848a5f4bceb2ea4bc168b8d443","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added network drivers interface. Introduce three network drivers: ``flat``,"},{"line_number":5,"context_line":"    which is the default and replicates the flat network behavior present"},{"line_number":6,"context_line":"    previously and ``none`` when neutron is not used, which is basically a"},{"line_number":7,"context_line":"    noop driver. The network driver is used to switch network for node during"}],"source_content_type":"text/x-yaml","patch_set":54,"id":"7aa08908_5dc3e757","line":4,"range":{"start_line":4,"start_character":47,"end_line":4,"end_character":52},"updated":"2016-06-15 09:34:01.000000000","message":"Only two drivers mentioned.","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"077fe3d618911bf73ea4047a4ca6b0aed7c64141","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added network drivers interface. Introduce three network drivers: ``flat``,"},{"line_number":5,"context_line":"    which is the default and replicates the flat network behavior present"},{"line_number":6,"context_line":"    previously and ``none`` when neutron is not used, which is basically a"},{"line_number":7,"context_line":"    noop driver. The network driver is used to switch network for node during"}],"source_content_type":"text/x-yaml","patch_set":54,"id":"5a9d85d2_665199d8","line":4,"range":{"start_line":4,"start_character":47,"end_line":4,"end_character":52},"in_reply_to":"7aa08908_5dc3e757","updated":"2016-06-21 14:51:42.000000000","message":"Done","commit_id":"5ebb8a8f48371e73f678693020f72b32d224231c"}],"releasenotes/notes/add-network-interfaces-0a13c4aba252573e.yaml":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    network interfaces on conductor."},{"line_number":11,"context_line":"deprecations:"},{"line_number":12,"context_line":"  - |"},{"line_number":13,"context_line":"    ``create_cleaning_ports`` and ``delete_cleaning_ports`` in DHCP providers"},{"line_number":14,"context_line":"    are deprecated and will be removed completely in the Ocata. The logic they"},{"line_number":15,"context_line":"    are implementing should be moved to a custom network interface\u0027s"},{"line_number":16,"context_line":"    ``add_cleaning_network`` and ``remove_cleaning_network`` functions"}],"source_content_type":"text/x-yaml","patch_set":62,"id":"1aa78d24_1fa72a50","line":13,"updated":"2016-07-05 17:43:03.000000000","message":"nit: maybe \u0027Methods\u0027 or I guess you could do create_cleaning_ports() to make it obvious.","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"80de034814e0dbd92136341c2a556c6b619d1e24","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    network interfaces on conductor."},{"line_number":11,"context_line":"deprecations:"},{"line_number":12,"context_line":"  - |"},{"line_number":13,"context_line":"    ``create_cleaning_ports`` and ``delete_cleaning_ports`` in DHCP providers"},{"line_number":14,"context_line":"    are deprecated and will be removed completely in the Ocata. The logic they"},{"line_number":15,"context_line":"    are implementing should be moved to a custom network interface\u0027s"},{"line_number":16,"context_line":"    ``add_cleaning_network`` and ``remove_cleaning_network`` functions"}],"source_content_type":"text/x-yaml","patch_set":62,"id":"1aa78d24_7ae52907","line":13,"in_reply_to":"1aa78d24_1fa72a50","updated":"2016-07-07 18:08:14.000000000","message":"Done","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab6ccc19f94a9d5ba087205a0241d76ae2362877","unresolved":false,"context_lines":[{"line_number":11,"context_line":"deprecations:"},{"line_number":12,"context_line":"  - |"},{"line_number":13,"context_line":"    ``create_cleaning_ports`` and ``delete_cleaning_ports`` in DHCP providers"},{"line_number":14,"context_line":"    are deprecated and will be removed completely in the Ocata. The logic they"},{"line_number":15,"context_line":"    are implementing should be moved to a custom network interface\u0027s"},{"line_number":16,"context_line":"    ``add_cleaning_network`` and ``remove_cleaning_network`` functions"},{"line_number":17,"context_line":"    respectively. After that, the methods themselves should be removed from"}],"source_content_type":"text/x-yaml","patch_set":62,"id":"1aa78d24_3ffe6637","line":14,"updated":"2016-07-05 17:43:03.000000000","message":"nit: s/the Ocata/the Ocata release/","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"80de034814e0dbd92136341c2a556c6b619d1e24","unresolved":false,"context_lines":[{"line_number":11,"context_line":"deprecations:"},{"line_number":12,"context_line":"  - |"},{"line_number":13,"context_line":"    ``create_cleaning_ports`` and ``delete_cleaning_ports`` in DHCP providers"},{"line_number":14,"context_line":"    are deprecated and will be removed completely in the Ocata. The logic they"},{"line_number":15,"context_line":"    are implementing should be moved to a custom network interface\u0027s"},{"line_number":16,"context_line":"    ``add_cleaning_network`` and ``remove_cleaning_network`` functions"},{"line_number":17,"context_line":"    respectively. After that, the methods themselves should be removed from"}],"source_content_type":"text/x-yaml","patch_set":62,"id":"1aa78d24_9aea95d9","line":14,"in_reply_to":"1aa78d24_3ffe6637","updated":"2016-07-07 18:08:14.000000000","message":"Done","commit_id":"4cdc11189aeaa05c0c2d6b42786a8d693052438c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b817d532bf61eac7eedbb49c200f42436596aa65","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    deployments, but it will be required in the Ocata release."},{"line_number":22,"context_line":"upgrade:"},{"line_number":23,"context_line":"  - |"},{"line_number":24,"context_line":"    ``[DEFAULT]default_network_interface`` option is introduced, without the"},{"line_number":25,"context_line":"    default value. If set, the specified interface will be used as the network"},{"line_number":26,"context_line":"    interface for nodes that don\u0027t have ``network_interface`` field set. If it"},{"line_number":27,"context_line":"    is not set, the default network interface is determined by looking at the"}],"source_content_type":"text/x-yaml","patch_set":63,"id":"1aa78d24_1498156a","line":24,"updated":"2016-07-08 01:09:18.000000000","message":"s/option/configuration option/","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6e01bf091551c62978b7857feb91391008ad9b30","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    deployments, but it will be required in the Ocata release."},{"line_number":22,"context_line":"upgrade:"},{"line_number":23,"context_line":"  - |"},{"line_number":24,"context_line":"    ``[DEFAULT]default_network_interface`` option is introduced, without the"},{"line_number":25,"context_line":"    default value. If set, the specified interface will be used as the network"},{"line_number":26,"context_line":"    interface for nodes that don\u0027t have ``network_interface`` field set. If it"},{"line_number":27,"context_line":"    is not set, the default network interface is determined by looking at the"}],"source_content_type":"text/x-yaml","patch_set":63,"id":"1aa78d24_b0a56d05","line":24,"in_reply_to":"1aa78d24_1498156a","updated":"2016-07-11 10:12:55.000000000","message":"Done","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b817d532bf61eac7eedbb49c200f42436596aa65","unresolved":false,"context_lines":[{"line_number":22,"context_line":"upgrade:"},{"line_number":23,"context_line":"  - |"},{"line_number":24,"context_line":"    ``[DEFAULT]default_network_interface`` option is introduced, without the"},{"line_number":25,"context_line":"    default value. If set, the specified interface will be used as the network"},{"line_number":26,"context_line":"    interface for nodes that don\u0027t have ``network_interface`` field set. If it"},{"line_number":27,"context_line":"    is not set, the default network interface is determined by looking at the"},{"line_number":28,"context_line":"    ``[dhcp]dhcp_provider`` value - if it is ``neutron`` - ``flat`` network"}],"source_content_type":"text/x-yaml","patch_set":63,"id":"1aa78d24_74a9997b","line":25,"updated":"2016-07-08 01:09:18.000000000","message":"what does \u0027without the default value\u0027 mean? Maybe you mean that the default value is empty or nothing.","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6e01bf091551c62978b7857feb91391008ad9b30","unresolved":false,"context_lines":[{"line_number":22,"context_line":"upgrade:"},{"line_number":23,"context_line":"  - |"},{"line_number":24,"context_line":"    ``[DEFAULT]default_network_interface`` option is introduced, without the"},{"line_number":25,"context_line":"    default value. If set, the specified interface will be used as the network"},{"line_number":26,"context_line":"    interface for nodes that don\u0027t have ``network_interface`` field set. If it"},{"line_number":27,"context_line":"    is not set, the default network interface is determined by looking at the"},{"line_number":28,"context_line":"    ``[dhcp]dhcp_provider`` value - if it is ``neutron`` - ``flat`` network"}],"source_content_type":"text/x-yaml","patch_set":63,"id":"1aa78d24_f0aff5e0","line":25,"in_reply_to":"1aa78d24_74a9997b","updated":"2016-07-11 10:12:55.000000000","message":"Done","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b817d532bf61eac7eedbb49c200f42436596aa65","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    ``[DEFAULT]default_network_interface`` option is introduced, without the"},{"line_number":25,"context_line":"    default value. If set, the specified interface will be used as the network"},{"line_number":26,"context_line":"    interface for nodes that don\u0027t have ``network_interface`` field set. If it"},{"line_number":27,"context_line":"    is not set, the default network interface is determined by looking at the"},{"line_number":28,"context_line":"    ``[dhcp]dhcp_provider`` value - if it is ``neutron`` - ``flat`` network"},{"line_number":29,"context_line":"    interface is the default, ``noop`` otherwise."}],"source_content_type":"text/x-yaml","patch_set":63,"id":"1aa78d24_94c36538","line":27,"updated":"2016-07-08 01:09:18.000000000","message":"s/default// It isn\u0027t default any more, you\u0027re describing how the value is determined.","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6e01bf091551c62978b7857feb91391008ad9b30","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    ``[DEFAULT]default_network_interface`` option is introduced, without the"},{"line_number":25,"context_line":"    default value. If set, the specified interface will be used as the network"},{"line_number":26,"context_line":"    interface for nodes that don\u0027t have ``network_interface`` field set. If it"},{"line_number":27,"context_line":"    is not set, the default network interface is determined by looking at the"},{"line_number":28,"context_line":"    ``[dhcp]dhcp_provider`` value - if it is ``neutron`` - ``flat`` network"},{"line_number":29,"context_line":"    interface is the default, ``noop`` otherwise."}],"source_content_type":"text/x-yaml","patch_set":63,"id":"1aa78d24_30ba1d24","line":27,"in_reply_to":"1aa78d24_94c36538","updated":"2016-07-11 10:12:55.000000000","message":"Done","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b817d532bf61eac7eedbb49c200f42436596aa65","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    default value. If set, the specified interface will be used as the network"},{"line_number":26,"context_line":"    interface for nodes that don\u0027t have ``network_interface`` field set. If it"},{"line_number":27,"context_line":"    is not set, the default network interface is determined by looking at the"},{"line_number":28,"context_line":"    ``[dhcp]dhcp_provider`` value - if it is ``neutron`` - ``flat`` network"},{"line_number":29,"context_line":"    interface is the default, ``noop`` otherwise."}],"source_content_type":"text/x-yaml","patch_set":63,"id":"1aa78d24_94da4516","line":28,"updated":"2016-07-08 01:09:18.000000000","message":"I think the two \u0027-\u0027 might be confusing. You could replace the first s/ - if/. If/","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6e01bf091551c62978b7857feb91391008ad9b30","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    default value. If set, the specified interface will be used as the network"},{"line_number":26,"context_line":"    interface for nodes that don\u0027t have ``network_interface`` field set. If it"},{"line_number":27,"context_line":"    is not set, the default network interface is determined by looking at the"},{"line_number":28,"context_line":"    ``[dhcp]dhcp_provider`` value - if it is ``neutron`` - ``flat`` network"},{"line_number":29,"context_line":"    interface is the default, ``noop`` otherwise."}],"source_content_type":"text/x-yaml","patch_set":63,"id":"1aa78d24_907f9165","line":28,"in_reply_to":"1aa78d24_94da4516","updated":"2016-07-11 10:12:55.000000000","message":"Done","commit_id":"94be9b2e57258537a23f15a68f56b795a57b5a64"}],"releasenotes/notes/add_network_drivers-0a13c4aba252573e.yaml":[{"author":{"_account_id":7080,"name":"Mathieu Mitchell","email":"mat128@gmail.com","username":"mat128"},"change_message_id":"6679d320db4d7c3452c8b4d88ed3d6cb79299d43","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    drivers ``flat``, which is default and ``neutron``."},{"line_number":5,"context_line":"    The network driver is used to switch network for node"},{"line_number":6,"context_line":"    during provisioning/cleaning."},{"line_number":7,"context_line":"    Added new node field ``network_interfa`` that allows"},{"line_number":8,"context_line":"    to specify network driver to use."}],"source_content_type":"text/x-yaml","patch_set":29,"id":"ba0121b8_b0a89a78","line":7,"updated":"2016-03-31 13:51:51.000000000","message":"network_interface","commit_id":"16b1b70f4937347f32e6322139f5c6a485b3ab9c"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"cf3d9f38a091e41a850d5db8ba8e2814cf32f71c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    drivers ``flat``, which is default and ``neutron``."},{"line_number":5,"context_line":"    The network driver is used to switch network for node"},{"line_number":6,"context_line":"    during provisioning/cleaning."},{"line_number":7,"context_line":"    Added new node field ``network_interfa`` that allows"},{"line_number":8,"context_line":"    to specify network driver to use."}],"source_content_type":"text/x-yaml","patch_set":29,"id":"ba0121b8_53e59706","line":7,"in_reply_to":"ba0121b8_b0a89a78","updated":"2016-04-01 12:45:55.000000000","message":"Done","commit_id":"16b1b70f4937347f32e6322139f5c6a485b3ab9c"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"214f97658bcd2056d07f5b0c2017580ad57ff473","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"ba0121b8_68b281e6","line":9,"updated":"2016-03-31 22:13:10.000000000","message":"Please add the various method deprecations to a deprecations: section here, since we\u0027re deprecating things out of the DHCP interface.","commit_id":"16b1b70f4937347f32e6322139f5c6a485b3ab9c"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"cf3d9f38a091e41a850d5db8ba8e2814cf32f71c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"ba0121b8_13addf9a","line":9,"in_reply_to":"ba0121b8_68b281e6","updated":"2016-04-01 12:45:55.000000000","message":"Done","commit_id":"16b1b70f4937347f32e6322139f5c6a485b3ab9c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d94f019b272e11c5152f49e849dc2c7a8edcf258","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    ``none`` when neutron is not used, which is basically a noop driver. The"},{"line_number":8,"context_line":"    network driver is used to switch network for node during"},{"line_number":9,"context_line":"    provisioning/cleaning. Added new node field ``network_interface`` that"},{"line_number":10,"context_line":"    allows to specify network driver to use."},{"line_number":11,"context_line":"deprecations:"},{"line_number":12,"context_line":"  - create_cleaning_ports and delete_cleaning_ports via dhcp provider is"},{"line_number":13,"context_line":"    deprecated. The network interface driver should be used instead."}],"source_content_type":"text/x-yaml","patch_set":39,"id":"1a122d0e_4357d725","line":10,"updated":"2016-04-20 02:10:46.000000000","message":"how about s/that allows to specify network driver to use/that specifies the network driver to use for that node/","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d94f019b272e11c5152f49e849dc2c7a8edcf258","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    ``[neutron]cleaning_network_uuid`` to be present in config. Also ``flat``"},{"line_number":18,"context_line":"    interface is in the list of ``enabled_network_drivers`` by default, in case"},{"line_number":19,"context_line":"    of non-neutron deployment, it should be changed to ``none``, as all the"},{"line_number":20,"context_line":"    enabled interfaces are loaded on conductor startup."}],"source_content_type":"text/x-yaml","patch_set":39,"id":"1a122d0e_473c02c8","line":20,"updated":"2016-04-20 02:10:46.000000000","message":"I\u0027m not sure I understand. Does this mean that this isn\u0027t backwards compatible? Ie, if the operator does nothing and just upgrades to use this code, it could break their setup?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0deda79dc1179657cdeef1fe7cfc5312efddd880","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    ``[neutron]cleaning_network_uuid`` to be present in config. Also ``flat``"},{"line_number":18,"context_line":"    interface is in the list of ``enabled_network_drivers`` by default, in case"},{"line_number":19,"context_line":"    of non-neutron deployment, it should be changed to ``none``, as all the"},{"line_number":20,"context_line":"    enabled interfaces are loaded on conductor startup."}],"source_content_type":"text/x-yaml","patch_set":39,"id":"1a122d0e_56d017f6","line":20,"in_reply_to":"1a122d0e_473c02c8","updated":"2016-04-20 10:39:00.000000000","message":"Yep, the conductor won\u0027t start. After that I think people will look at release notes :) Alternative to that I suggested earlier - to check cleaning_net_uuid in methods, not in __init__ of flat interface, it brings inconsistency with neutron interface, but preserves the behavior that is currently present.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    ``[neutron]cleaning_network_uuid`` to be present in config. Also ``flat``"},{"line_number":18,"context_line":"    interface is in the list of ``enabled_network_drivers`` by default, in case"},{"line_number":19,"context_line":"    of non-neutron deployment, it should be changed to ``none``, as all the"},{"line_number":20,"context_line":"    enabled interfaces are loaded on conductor startup."}],"source_content_type":"text/x-yaml","patch_set":39,"id":"1a122d0e_d56b5db5","line":20,"in_reply_to":"1a122d0e_56d017f6","updated":"2016-04-20 19:41:26.000000000","message":"So dumb question. Is the only difference between a \u0027none\u0027 network and a \u0027flat\u0027 network -- that a \u0027flat\u0027 network supports cleaning in a separate network (using neutron)?","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"0ff2a34184e94c9942f86989fad413391f656a97","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    ``[neutron]cleaning_network_uuid`` to be present in config. Also ``flat``"},{"line_number":18,"context_line":"    interface is in the list of ``enabled_network_drivers`` by default, in case"},{"line_number":19,"context_line":"    of non-neutron deployment, it should be changed to ``none``, as all the"},{"line_number":20,"context_line":"    enabled interfaces are loaded on conductor startup."}],"source_content_type":"text/x-yaml","patch_set":39,"id":"1a122d0e_fc0a9d78","line":20,"in_reply_to":"1a122d0e_99d61b26","updated":"2016-04-21 13:03:50.000000000","message":"I wonder if we can cover this as part of the upgrade procedure, e.g. right now the migration adds the new column and then sets all existing nodes to use the Flat network driver to however couldn\u0027t we add a conditional to check the dhcp provider loaded in the configuration file, and set them to all use the None network driver if the none dhcp provider is configured.\n\n/me hopes that the dhcp provider and network drivers get merged soon because they are quite heavily tied together.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"65da11377bb589ba9fcc4a57b545a4aca787e255","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    ``[neutron]cleaning_network_uuid`` to be present in config. Also ``flat``"},{"line_number":18,"context_line":"    interface is in the list of ``enabled_network_drivers`` by default, in case"},{"line_number":19,"context_line":"    of non-neutron deployment, it should be changed to ``none``, as all the"},{"line_number":20,"context_line":"    enabled interfaces are loaded on conductor startup."}],"source_content_type":"text/x-yaml","patch_set":39,"id":"1a122d0e_99d61b26","line":20,"in_reply_to":"1a122d0e_d56b5db5","updated":"2016-04-21 12:38:50.000000000","message":"That is my understanding.  As such, it seems silly to remove the logic that the dhcp provider provided to guard standalone users with a dhcp provider of none from being engaged in the cleaning logic.  it seems like something we would want to keep, then remove the conditional as part of a deprecation period.","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"291c67edfd2317a75ed3a93c8c9a25e0b317cd04","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"1a122d0e_9af2b204","line":21,"updated":"2016-04-20 19:41:26.000000000","message":"It looks like we tend to mention config changes in the upgrade section. So there should probably be separate bullets for:\n- new config enabled_network_drivers\n- config [neutron]/cleaning_network_uuid now needs to be specified/valid because it is required for flat/neutron networks\n- new [neutron]/config provisioning_network_uuid is required for neutron networks","commit_id":"f2128db9e10214ed33ec1845db1718e9236de78f"}],"setup.cfg":[{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"4c65cd2adcd2f74b48b1b282ed5ee49d1e900949","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"ironic.hardware.interfaces.network \u003d"},{"line_number":88,"context_line":"    flat \u003d ironic.drivers.modules.network.flat:FlatNetwork"},{"line_number":89,"context_line":"    neutron \u003d ironic.drivers.modules.network.neutron:NeutronV2Network"},{"line_number":90,"context_line":"    none \u003d ironic.drivers.modules.network.none:NoneNetwork"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"ironic.database.migration_backend \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":50,"id":"bab6814e_69769b3f","line":89,"range":{"start_line":89,"start_character":53,"end_line":89,"end_character":69},"updated":"2016-05-25 07:47:44.000000000","message":"Did i miss something? There is no NeutronV2Network in the PS50.","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"3425b92c992de374b2f86e63908375f613a491ca","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"ironic.hardware.interfaces.network \u003d"},{"line_number":88,"context_line":"    flat \u003d ironic.drivers.modules.network.flat:FlatNetwork"},{"line_number":89,"context_line":"    neutron \u003d ironic.drivers.modules.network.neutron:NeutronV2Network"},{"line_number":90,"context_line":"    none \u003d ironic.drivers.modules.network.none:NoneNetwork"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"ironic.database.migration_backend \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":50,"id":"bab6814e_3f8757b6","line":89,"range":{"start_line":89,"start_character":53,"end_line":89,"end_character":69},"in_reply_to":"bab6814e_69769b3f","updated":"2016-05-26 14:58:06.000000000","message":"Done","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"e637e7dad745a642a5ac2cd236da8555e891d33b","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"ironic.hardware.interfaces.network \u003d"},{"line_number":88,"context_line":"    flat \u003d ironic.drivers.modules.network.flat:FlatNetwork"},{"line_number":89,"context_line":"    neutron \u003d ironic.drivers.modules.network.neutron:NeutronV2Network"},{"line_number":90,"context_line":"    none \u003d ironic.drivers.modules.network.none:NoneNetwork"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"ironic.database.migration_backend \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":50,"id":"bab6814e_49ed97b6","line":89,"range":{"start_line":89,"start_character":53,"end_line":89,"end_character":69},"in_reply_to":"bab6814e_69769b3f","updated":"2016-05-25 07:52:11.000000000","message":"It should be moved to https://review.openstack.org/#/c/317393/","commit_id":"976acc2eb5fa3f1a08febb5ef45a9c00c920dcce"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c177529416db14f382cb90975204a1aa73fe9b32","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"ironic.hardware.interfaces.network \u003d"},{"line_number":91,"context_line":"    flat \u003d ironic.drivers.modules.network.flat:FlatNetwork"},{"line_number":92,"context_line":"    none \u003d ironic.drivers.modules.network.none:NoneNetwork"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"ironic.database.migration_backend \u003d"},{"line_number":95,"context_line":"    sqlalchemy \u003d ironic.db.sqlalchemy.migration"}],"source_content_type":"text/x-ttcn-cfg","patch_set":61,"id":"3aaa91ec_832c3e03","line":92,"updated":"2016-06-29 20:07:44.000000000","message":"this is the controversial \u0027none\u0027, right? that Dmitry suggested \u0027manual\u0027 ?\n\nCould we call it \u0027noop\u0027, and the network would be NoopNetwork?","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6c0e2755cadee82fda29ec398983f9d3f93ac517","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"ironic.hardware.interfaces.network \u003d"},{"line_number":91,"context_line":"    flat \u003d ironic.drivers.modules.network.flat:FlatNetwork"},{"line_number":92,"context_line":"    none \u003d ironic.drivers.modules.network.none:NoneNetwork"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"ironic.database.migration_backend \u003d"},{"line_number":95,"context_line":"    sqlalchemy \u003d ironic.db.sqlalchemy.migration"}],"source_content_type":"text/x-ttcn-cfg","patch_set":61,"id":"3aaa91ec_891e1c6e","line":92,"in_reply_to":"3aaa91ec_832c3e03","updated":"2016-06-29 20:53:49.000000000","message":"Essentially, yes.\n\nAnother thread on the the topic in this change set.   https://review.openstack.org/#/c/285852/61/ironic/common/driver_factory.py@97","commit_id":"0012c4e23802b4ac72e01d8aa10f8173716db6c2"}]}
