)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7987,"name":"Ivar Lazzaro","email":"ivarlazzaro@gmail.com","username":"Ivar"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"Other changes:"},{"line_number":19,"context_line":" - provider attribute has moved to loadbalancer resource from the pool"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"blueprint bp/lbaas-service-instance"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I2bcd98002ad359c713ba128cebe9125767ae88f8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F9gEM%3D","line":21,"updated":"2013-12-10 23:01:55.000000000","message":"Implements blueprint lbaas-service-instance \n(link is broken as is now)","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":18,"context_line":"Other changes:"},{"line_number":19,"context_line":" - provider attribute has moved to loadbalancer resource from the pool"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"blueprint bp/lbaas-service-instance"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I2bcd98002ad359c713ba128cebe9125767ae88f8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAUH%2F%2Fyrs%3D","line":21,"in_reply_to":"AAAATn%2F9gEM%3D","updated":"2014-01-08 13:30:12.000000000","message":"Done","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":8449,"name":"Marios Andreou","email":"marios.andreou@gmail.com","username":"marios"},"unresolved":false,"context_lines":[{"line_number":19,"context_line":" - provider attribute has moved to loadbalancer resource from the pool"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"implements blueprint lbaas-service-instance"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I2bcd98002ad359c713ba128cebe9125767ae88f8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAUH%2F%2Fs8Y%3D","line":22,"updated":"2014-01-09 12:40:55.000000000","message":"DocImpact?","commit_id":"2a0ff34835fed16f88599a87d2431ce2a41005b3"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":19,"context_line":" - provider attribute has moved to loadbalancer resource from the pool"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"implements blueprint lbaas-service-instance"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I2bcd98002ad359c713ba128cebe9125767ae88f8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAUH%2F%2Fszg%3D","line":22,"in_reply_to":"AAAAUH%2F%2Fs8Y%3D","updated":"2014-01-09 13:21:40.000000000","message":"yes, you\u0027re right","commit_id":"2a0ff34835fed16f88599a87d2431ce2a41005b3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"unresolved":false,"context_lines":[{"line_number":16,"context_line":" (needed for API compatibility)"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Other changes:"},{"line_number":19,"context_line":" - provider attribute has moved to loadbalancer resource from the pool"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"implements blueprint lbaas-service-instance"},{"line_number":22,"context_line":"DocImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAAUH%2F%2Bnh4%3D","line":19,"updated":"2014-01-24 00:56:55.000000000","message":"This commit message merely lists the code changes in the patch. Commit messages need to explain the *why*, not the what. For instance, the commit message should explain what the concept of a loadbalancer resource in the API actually represents. Do not assume the reviewer knows what this is or is familiar with the entire blueprint (per https://wiki.openstack.org/wiki/GitCommitMessages).\n\nExplain the reason why the load balancer API resource object is necessary as well as why this particular implementation of that resource was chosen. Include any relevant links to etherpad or ML discussion threads that pertain to decisions about what the load balancer resource object looks like.","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":16,"context_line":" (needed for API compatibility)"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Other changes:"},{"line_number":19,"context_line":" - provider attribute has moved to loadbalancer resource from the pool"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"implements blueprint lbaas-service-instance"},{"line_number":22,"context_line":"DocImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAAUH%2F%2BCgw%3D","line":19,"in_reply_to":"AAAAUH%2F%2BhI4%3D","updated":"2014-02-03 10:56:56.000000000","message":"I\u0027ll try to improve commit message but I think It is still implied that reviewer follows the blueprint link (at the bottom of commit message)","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"unresolved":false,"context_lines":[{"line_number":16,"context_line":" (needed for API compatibility)"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Other changes:"},{"line_number":19,"context_line":" - provider attribute has moved to loadbalancer resource from the pool"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"implements blueprint lbaas-service-instance"},{"line_number":22,"context_line":"DocImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAAUH%2F%2BhI4%3D","line":19,"in_reply_to":"AAAAUH%2F%2Blc4%3D","updated":"2014-01-24 20:34:47.000000000","message":"Eugene, please read the GitCommitMessages wiki page, specifically the section Information in Commit Messages.\n\nYour commit message violates a bunch of the recommendations, including:\n\n * Do not assume the code is self-evident/self-documenting.\n * Describe /why/ a change is being made.\n * Do not assume the reviewer understands what the original problem was.\n\nThere is no indication in either the commit message nor the model what \"problem\" this patch is fixing. There is no indication what value the loadbalancer resource gives to the API.","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":16,"context_line":" (needed for API compatibility)"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Other changes:"},{"line_number":19,"context_line":" - provider attribute has moved to loadbalancer resource from the pool"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"implements blueprint lbaas-service-instance"},{"line_number":22,"context_line":"DocImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAAUH%2F%2Blc4%3D","line":19,"in_reply_to":"AAAAUH%2F%2Bnh4%3D","updated":"2014-01-24 10:18:36.000000000","message":"Jay, that might be relevant for bug fixes, however the patch implements a blueprint (a link in the bottom of commit msg), so it is expected that reviewer goes and reads the design and motivation. Also, commit messages should not contain links as they are usually subject to change","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":10,"context_line":"object model, driver interface, unit tests."},{"line_number":11,"context_line":"The purpose of LB instance:"},{"line_number":12,"context_line":"1) envelope other main balancer resources such as vips and pools"},{"line_number":13,"context_line":"That is needed to retain loadbalancer configuration as a tree"},{"line_number":14,"context_line":"instead of a graph when multiple pools-vips relationship is"},{"line_number":15,"context_line":"introduced. So Loadbalancer object becomes the root of the tree"},{"line_number":16,"context_line":"instead of the Pool"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAUH%2F9idw%3D","line":13,"updated":"2014-02-06 07:49:23.000000000","message":"A tree is a special case of a graph.\nIt might be understandable but technically it\u0027s not correct.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":10,"context_line":"object model, driver interface, unit tests."},{"line_number":11,"context_line":"The purpose of LB instance:"},{"line_number":12,"context_line":"1) envelope other main balancer resources such as vips and pools"},{"line_number":13,"context_line":"That is needed to retain loadbalancer configuration as a tree"},{"line_number":14,"context_line":"instead of a graph when multiple pools-vips relationship is"},{"line_number":15,"context_line":"introduced. So Loadbalancer object becomes the root of the tree"},{"line_number":16,"context_line":"instead of the Pool"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAUH%2F9ZO0%3D","line":13,"in_reply_to":"AAAAUH%2F9gmM%3D","updated":"2014-02-07 08:27:37.000000000","message":"I found it\u0027s not even a tree.  For example if we have a loadbalancer, a pool and a vip, they form a fully connected graph.\nFrom IRC meeting logs, loadbalancer instances are meant to avoid graph traversals, and I guess loadbalancer instances are introduced to do something with graph connectivity, but I have no idea how it works.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":10,"context_line":"object model, driver interface, unit tests."},{"line_number":11,"context_line":"The purpose of LB instance:"},{"line_number":12,"context_line":"1) envelope other main balancer resources such as vips and pools"},{"line_number":13,"context_line":"That is needed to retain loadbalancer configuration as a tree"},{"line_number":14,"context_line":"instead of a graph when multiple pools-vips relationship is"},{"line_number":15,"context_line":"introduced. So Loadbalancer object becomes the root of the tree"},{"line_number":16,"context_line":"instead of the Pool"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAUH%2F9gmM%3D","line":13,"in_reply_to":"AAAAUH%2F9idw%3D","updated":"2014-02-06 12:41:07.000000000","message":"It\u0027s technically correct, and i\u0027m not saying tree is not a graph.  Tree and Graph terms have established understanding that implies possible structure of data for those cases.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"introduced. So Loadbalancer object becomes the root of the tree"},{"line_number":16,"context_line":"instead of the Pool"},{"line_number":17,"context_line":"2) Provide clear boundaries for loadbalancer configuration."},{"line_number":18,"context_line":"All objects that belong to one loadbalancer are deployed to one"},{"line_number":19,"context_line":"device or agent and are handled with the same provider (driver)"},{"line_number":20,"context_line":"3) Loadbalancer object becomes a \u0027mounting point\u0027 of attributes"},{"line_number":21,"context_line":"associated with configuration such as provider, device, agent,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAUH%2F9ibY%3D","line":18,"updated":"2014-02-06 07:49:23.000000000","message":"Do \"objects\" refer to pools and vips?\nMoreover, it\u0027s a bit vague how to use loadbalancer instances.\nFor example, if a user wants to loadbalance 1.2.3.4:80 to 1.3.5.6 and 1.3.5.7, and 1.2.3.5:25 to 1.3.5.10 and 1.3.5.11, should there be two loadbalancer instances (one for 1.2.3.4:80 and one for 1.2.3.5:25)? Or can one loadbalancer instance host these two vips?","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"introduced. So Loadbalancer object becomes the root of the tree"},{"line_number":16,"context_line":"instead of the Pool"},{"line_number":17,"context_line":"2) Provide clear boundaries for loadbalancer configuration."},{"line_number":18,"context_line":"All objects that belong to one loadbalancer are deployed to one"},{"line_number":19,"context_line":"device or agent and are handled with the same provider (driver)"},{"line_number":20,"context_line":"3) Loadbalancer object becomes a \u0027mounting point\u0027 of attributes"},{"line_number":21,"context_line":"associated with configuration such as provider, device, agent,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAUH%2F9ZI8%3D","line":18,"in_reply_to":"AAAAUH%2F9gj4%3D","updated":"2014-02-07 08:27:37.000000000","message":"Are there differences in these configurations? Are users recommended to use 1 instance config or 2 instances config?","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":15,"context_line":"introduced. So Loadbalancer object becomes the root of the tree"},{"line_number":16,"context_line":"instead of the Pool"},{"line_number":17,"context_line":"2) Provide clear boundaries for loadbalancer configuration."},{"line_number":18,"context_line":"All objects that belong to one loadbalancer are deployed to one"},{"line_number":19,"context_line":"device or agent and are handled with the same provider (driver)"},{"line_number":20,"context_line":"3) Loadbalancer object becomes a \u0027mounting point\u0027 of attributes"},{"line_number":21,"context_line":"associated with configuration such as provider, device, agent,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAUH%2F9gj4%3D","line":18,"in_reply_to":"AAAAUH%2F9ibY%3D","updated":"2014-02-06 12:41:07.000000000","message":"here \"objects\" are pools, vips, members and pool health monitors.\nAs for the question - it\u0027s up to user\u0027s choice. It could be 1 instance handling both or 2 instances.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"2) Provide clear boundaries for loadbalancer configuration."},{"line_number":18,"context_line":"All objects that belong to one loadbalancer are deployed to one"},{"line_number":19,"context_line":"device or agent and are handled with the same provider (driver)"},{"line_number":20,"context_line":"3) Loadbalancer object becomes a \u0027mounting point\u0027 of attributes"},{"line_number":21,"context_line":"associated with configuration such as provider, device, agent,"},{"line_number":22,"context_line":"router."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAUH%2F9iak%3D","line":20,"updated":"2014-02-06 07:49:23.000000000","message":"Is a loadbalancer object different from a loadbalancer instance?","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"2) Provide clear boundaries for loadbalancer configuration."},{"line_number":18,"context_line":"All objects that belong to one loadbalancer are deployed to one"},{"line_number":19,"context_line":"device or agent and are handled with the same provider (driver)"},{"line_number":20,"context_line":"3) Loadbalancer object becomes a \u0027mounting point\u0027 of attributes"},{"line_number":21,"context_line":"associated with configuration such as provider, device, agent,"},{"line_number":22,"context_line":"router."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAUH%2F9ZOQ%3D","line":20,"in_reply_to":"AAAAUH%2F9gi0%3D","updated":"2014-02-07 08:27:37.000000000","message":"I\u0027d suggest to use the same word for a specific subject to minimize confusion.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":17,"context_line":"2) Provide clear boundaries for loadbalancer configuration."},{"line_number":18,"context_line":"All objects that belong to one loadbalancer are deployed to one"},{"line_number":19,"context_line":"device or agent and are handled with the same provider (driver)"},{"line_number":20,"context_line":"3) Loadbalancer object becomes a \u0027mounting point\u0027 of attributes"},{"line_number":21,"context_line":"associated with configuration such as provider, device, agent,"},{"line_number":22,"context_line":"router."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAUH%2F9gi0%3D","line":20,"in_reply_to":"AAAAUH%2F9iak%3D","updated":"2014-02-06 12:41:07.000000000","message":"There is just a subtle difference between object, instance, entity words.\nI could have written \u0027loadbalancer instance object\u0027, so lb instance as an object in python is a root node of lb configuration.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":22,"context_line":"router."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"The patch contains the following changes:"},{"line_number":25,"context_line":" - CRUD operations for loadbalancer resource"},{"line_number":26,"context_line":" - Autocreation of loadbalancer resource with the pool"},{"line_number":27,"context_line":" - Autodeletion of loadbalancer resource with vip or pool deletion"},{"line_number":28,"context_line":" (needed for API compatibility)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAUH%2F9iZs%3D","line":25,"updated":"2014-02-06 07:49:23.000000000","message":"Now we have loadbalancer instances, objects, and resources.\nAre they different or same? It\u0027s confusing.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":22,"context_line":"router."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"The patch contains the following changes:"},{"line_number":25,"context_line":" - CRUD operations for loadbalancer resource"},{"line_number":26,"context_line":" - Autocreation of loadbalancer resource with the pool"},{"line_number":27,"context_line":" - Autodeletion of loadbalancer resource with vip or pool deletion"},{"line_number":28,"context_line":" (needed for API compatibility)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAUH%2F9gh0%3D","line":25,"in_reply_to":"AAAAUH%2F9iZs%3D","updated":"2014-02-06 12:41:07.000000000","message":"resource is a notion of API. We are working with resources at API level.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":11,"context_line":"The purpose of LB instance:"},{"line_number":12,"context_line":"1) envelope other main balancer resources such as vips and pools"},{"line_number":13,"context_line":"That is needed to retain loadbalancer configuration as a tree"},{"line_number":14,"context_line":"instead of a graph when multiple pools-vips relationship is"},{"line_number":15,"context_line":"introduced. So Loadbalancer object becomes the root of the tree"},{"line_number":16,"context_line":"instead of the Pool"},{"line_number":17,"context_line":"2) Provide clear boundaries for loadbalancer configuration."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAAUX%2F%2FQFE%3D","line":14,"updated":"2014-02-14 14:45:29.000000000","message":"As I commented earlier, \"a tree instead of a graph\" is technically nonsense.\nHow about saying \"A loadbalancer instance has references to all component pools and vips. Introduction of loadbalancer instances allows easier lookup of pools and vips without following multiple pool-vip references\", for example?","commit_id":"febc1b8188d8ae7366e2796c891b30b95b96b0be"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":11,"context_line":"The purpose of LB instance:"},{"line_number":12,"context_line":"1) envelope other main balancer resources such as vips and pools"},{"line_number":13,"context_line":"That is needed to retain loadbalancer configuration as a tree"},{"line_number":14,"context_line":"instead of a graph when multiple pools-vips relationship is"},{"line_number":15,"context_line":"introduced. So Loadbalancer object becomes the root of the tree"},{"line_number":16,"context_line":"instead of the Pool"},{"line_number":17,"context_line":"2) Provide clear boundaries for loadbalancer configuration."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAAUX%2F%2FNF0%3D","line":14,"in_reply_to":"AAAAUX%2F%2FQFE%3D","updated":"2014-02-14 21:41:53.000000000","message":"that makes sense","commit_id":"febc1b8188d8ae7366e2796c891b30b95b96b0be"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":" - CRUD operations for loadbalancer resource"},{"line_number":26,"context_line":" - Autocreation of loadbalancer resource with the pool"},{"line_number":27,"context_line":" - Autodeletion of loadbalancer resource with vip or pool deletion"},{"line_number":28,"context_line":" (needed for API compatibility)"},{"line_number":29,"context_line":" - Corresponding changes in the driver API"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Other changes:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAAUX%2F%2FQCY%3D","line":28,"updated":"2014-02-14 14:45:29.000000000","message":"As I commented on Feb 10, it will introduce (probably nonstandard) a DB resource with autodeletion behavior as an Icehouse API. Autodeletion will remain after Havana API gets deprecated.","commit_id":"febc1b8188d8ae7366e2796c891b30b95b96b0be"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":25,"context_line":" - CRUD operations for loadbalancer resource"},{"line_number":26,"context_line":" - Autocreation of loadbalancer resource with the pool"},{"line_number":27,"context_line":" - Autodeletion of loadbalancer resource with vip or pool deletion"},{"line_number":28,"context_line":" (needed for API compatibility)"},{"line_number":29,"context_line":" - Corresponding changes in the driver API"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Other changes:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAAUX%2F%2FNFA%3D","line":28,"in_reply_to":"AAAAUX%2F%2FQCY%3D","updated":"2014-02-14 21:41:53.000000000","message":"that\u0027s right, it\u0027s needed for bw compatibility.","commit_id":"febc1b8188d8ae7366e2796c891b30b95b96b0be"}],"neutron/db/loadbalancer/loadbalancer_db.py":[{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"change_message_id":"a13781785713b16341b156e8a5502dc29a8b55a1","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    weight \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":111,"context_line":"    admin_state_up \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":112,"context_line":"    loadbalancer_id \u003d sa.Column(sa.String(36),"},{"line_number":113,"context_line":"                                sa.ForeignKey(\u0027loadbalancers.id\u0027))"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"class Pool(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9yDA%3D","line":113,"updated":"2013-12-05 23:52:55.000000000","message":"Is this (and member\u0027s \u0027loadblancer_id\u0027 attribute) necessary ?\n\nI think a member belongs to a pool (unlike vips).","commit_id":"b864fcd27f046661a38b44c117fae1ce150a5006"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    weight \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":111,"context_line":"    admin_state_up \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":112,"context_line":"    loadbalancer_id \u003d sa.Column(sa.String(36),"},{"line_number":113,"context_line":"                                sa.ForeignKey(\u0027loadbalancers.id\u0027))"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"class Pool(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9xcY%3D","line":113,"in_reply_to":"AAAATn%2F9yDA%3D","updated":"2013-12-06 04:14:52.000000000","message":"That\u0027s right, member belongs to a pool, which belongs to a loadbalancer.\nWith existing code \u0027provider\u0027 attribute, which is used for driver dispatching, is in the pool, but this patch moves is into loadbalancer.\nSo in order to dispatch the call for create/update/delete member, we would need to fetch pool, then fetch the loadbalancer and get the provider. Adding loadbaalncer_id here saves 1 step in this sequence.","commit_id":"b864fcd27f046661a38b44c117fae1ce150a5006"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"change_message_id":"a13781785713b16341b156e8a5502dc29a8b55a1","unresolved":false,"context_lines":[{"line_number":272,"context_line":"    def get_loadbalancers(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":273,"context_line":"        return self._get_collection(context, Vip,"},{"line_number":274,"context_line":"                                    self._make_vip_dict,"},{"line_number":275,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def get_loadbalancer(self, context, id, fields\u003dNone):"},{"line_number":278,"context_line":"        loadbalancer \u003d self._get_resource(context, Loadbalancer, id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9yEM%3D","line":275,"updated":"2013-12-05 23:52:55.000000000","message":"Vip -\u003e Loadblancer\n\n_make_vip_dict -\u003e _make_loadblancer_dict","commit_id":"b864fcd27f046661a38b44c117fae1ce150a5006"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":272,"context_line":"    def get_loadbalancers(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":273,"context_line":"        return self._get_collection(context, Vip,"},{"line_number":274,"context_line":"                                    self._make_vip_dict,"},{"line_number":275,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def get_loadbalancer(self, context, id, fields\u003dNone):"},{"line_number":278,"context_line":"        loadbalancer \u003d self._get_resource(context, Loadbalancer, id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9xcU%3D","line":275,"in_reply_to":"AAAATn%2F9yEM%3D","updated":"2013-12-06 04:14:52.000000000","message":"yeah, thanks!","commit_id":"b864fcd27f046661a38b44c117fae1ce150a5006"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"f8119cadbe74cee3650b1e476beef84993dafb32","unresolved":false,"context_lines":[{"line_number":426,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":427,"context_line":"            if v[\u0027pool_id\u0027]:"},{"line_number":428,"context_line":"                pool \u003d self._get_resource(context, Pool, v[\u0027pool_id\u0027])"},{"line_number":429,"context_line":"                v[\u0027loadbalancer_id\u0027] \u003d pool[\u0027loadbalancer_id\u0027]"},{"line_number":430,"context_line":"                # validate that the pool has same tenant"},{"line_number":431,"context_line":"                if pool[\u0027tenant_id\u0027] !\u003d tenant_id:"},{"line_number":432,"context_line":"                    raise q_exc.NotAuthorized()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9xpU%3D","line":429,"updated":"2013-12-06 03:20:31.000000000","message":"Shoudn\u0027t it be an error when v[\u0027loadbalancer_id\u0027] isn\u0027t None and different from pool[\u0027loadbalancer_id\u0027]?","commit_id":"b864fcd27f046661a38b44c117fae1ce150a5006"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":426,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":427,"context_line":"            if v[\u0027pool_id\u0027]:"},{"line_number":428,"context_line":"                pool \u003d self._get_resource(context, Pool, v[\u0027pool_id\u0027])"},{"line_number":429,"context_line":"                v[\u0027loadbalancer_id\u0027] \u003d pool[\u0027loadbalancer_id\u0027]"},{"line_number":430,"context_line":"                # validate that the pool has same tenant"},{"line_number":431,"context_line":"                if pool[\u0027tenant_id\u0027] !\u003d tenant_id:"},{"line_number":432,"context_line":"                    raise q_exc.NotAuthorized()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9xcQ%3D","line":429,"in_reply_to":"AAAATn%2F9xpU%3D","updated":"2013-12-06 04:14:52.000000000","message":"Yes, such check must be added.","commit_id":"b864fcd27f046661a38b44c117fae1ce150a5006"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":285,"context_line":"        return self._create_loadbalancer(context, loadbalancer)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def _create_loadbalancer(self, context, loadbalancer):"},{"line_number":288,"context_line":"        # need this to avoid calleing run-time bound create_loadbalancer"},{"line_number":289,"context_line":"        # of child class"},{"line_number":290,"context_line":"        v \u003d loadbalancer[\u0027loadbalancer\u0027]"},{"line_number":291,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, v)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pNM%3D","line":288,"updated":"2013-12-10 09:43:46.000000000","message":"typo: calling","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        return self._create_loadbalancer(context, loadbalancer)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def _create_loadbalancer(self, context, loadbalancer):"},{"line_number":288,"context_line":"        # need this to avoid calleing run-time bound create_loadbalancer"},{"line_number":289,"context_line":"        # of child class"},{"line_number":290,"context_line":"        v \u003d loadbalancer[\u0027loadbalancer\u0027]"},{"line_number":291,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, v)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9iz8%3D","line":288,"in_reply_to":"AAAATn%2F9pNM%3D","updated":"2013-12-10 13:21:12.000000000","message":"Done","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":287,"context_line":"    def _create_loadbalancer(self, context, loadbalancer):"},{"line_number":288,"context_line":"        # need this to avoid calleing run-time bound create_loadbalancer"},{"line_number":289,"context_line":"        # of child class"},{"line_number":290,"context_line":"        v \u003d loadbalancer[\u0027loadbalancer\u0027]"},{"line_number":291,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, v)"},{"line_number":292,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":293,"context_line":"            lb_db \u003d Loadbalancer(id\u003duuidutils.generate_uuid(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pM8%3D","line":290,"updated":"2013-12-10 09:43:46.000000000","message":"what stands for \u0027v\u0027?","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":287,"context_line":"    def _create_loadbalancer(self, context, loadbalancer):"},{"line_number":288,"context_line":"        # need this to avoid calleing run-time bound create_loadbalancer"},{"line_number":289,"context_line":"        # of child class"},{"line_number":290,"context_line":"        v \u003d loadbalancer[\u0027loadbalancer\u0027]"},{"line_number":291,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, v)"},{"line_number":292,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":293,"context_line":"            lb_db \u003d Loadbalancer(id\u003duuidutils.generate_uuid(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9iz4%3D","line":290,"in_reply_to":"AAAATn%2F9pM8%3D","updated":"2013-12-10 13:21:12.000000000","message":"just copypasted from some other method. this is just a shortcut, could be changed to \u0027lb\u0027, but i\u0027d prefer to see it something really short","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":310,"context_line":"    def _ensure_loadbalancer_delete_conditions(self, context, id):"},{"line_number":311,"context_line":"        lb_db \u003d self._get_resource(context, Loadbalancer, id)"},{"line_number":312,"context_line":"        if lb_db.vips or lb_db.pools:"},{"line_number":313,"context_line":"            print \"vips\", lb_db.vips, \"pools\", lb_db.pools"},{"line_number":314,"context_line":"            raise loadbalancer.LoadbalancerInUse(loadbalancer_id\u003did)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def delete_loadbalancer(self, context, id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pMw%3D","line":313,"updated":"2013-12-10 09:43:46.000000000","message":"please don\u0027t forget to remove","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    def _ensure_loadbalancer_delete_conditions(self, context, id):"},{"line_number":311,"context_line":"        lb_db \u003d self._get_resource(context, Loadbalancer, id)"},{"line_number":312,"context_line":"        if lb_db.vips or lb_db.pools:"},{"line_number":313,"context_line":"            print \"vips\", lb_db.vips, \"pools\", lb_db.pools"},{"line_number":314,"context_line":"            raise loadbalancer.LoadbalancerInUse(loadbalancer_id\u003did)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def delete_loadbalancer(self, context, id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9izQ%3D","line":313,"in_reply_to":"AAAATn%2F9pMw%3D","updated":"2013-12-10 13:21:12.000000000","message":"Done","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":565,"context_line":"            self.delete_loadbalancer(context, lb_id)"},{"line_number":566,"context_line":"        except loadbalancer.LoadbalancerInUse:"},{"line_number":567,"context_line":"            # It\u0027s okay, not autodelete used resource. just log it."},{"line_number":568,"context_line":"            LOG.debug(_(\u0027Could not delete loadbalancer %s\u0027),"},{"line_number":569,"context_line":"                      lb_id)"},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"    def get_vip(self, context, id, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pKc%3D","line":568,"updated":"2013-12-10 09:43:46.000000000","message":"nit: ... which is in use.","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":565,"context_line":"            self.delete_loadbalancer(context, lb_id)"},{"line_number":566,"context_line":"        except loadbalancer.LoadbalancerInUse:"},{"line_number":567,"context_line":"            # It\u0027s okay, not autodelete used resource. just log it."},{"line_number":568,"context_line":"            LOG.debug(_(\u0027Could not delete loadbalancer %s\u0027),"},{"line_number":569,"context_line":"                      lb_id)"},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"    def get_vip(self, context, id, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9izI%3D","line":568,"in_reply_to":"AAAATn%2F9pKc%3D","updated":"2013-12-10 13:21:12.000000000","message":"Done","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":661,"context_line":"                           \u0027tenant_id\u0027: tenant_id,"},{"line_number":662,"context_line":"                           \u0027description\u0027: v[\u0027description\u0027],"},{"line_number":663,"context_line":"                           \u0027admin_state_up\u0027: v[\u0027admin_state_up\u0027],"},{"line_number":664,"context_line":"                           #TODO(enikanorov): change to PENDING CREATE later"},{"line_number":665,"context_line":"                           \u0027status\u0027: constants.ACTIVE}"},{"line_number":666,"context_line":"                lb \u003d self._create_loadbalancer("},{"line_number":667,"context_line":"                    context, {\u0027loadbalancer\u0027: lb_data})"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pHw%3D","line":664,"updated":"2013-12-10 09:43:46.000000000","message":"when/why?","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":661,"context_line":"                           \u0027tenant_id\u0027: tenant_id,"},{"line_number":662,"context_line":"                           \u0027description\u0027: v[\u0027description\u0027],"},{"line_number":663,"context_line":"                           \u0027admin_state_up\u0027: v[\u0027admin_state_up\u0027],"},{"line_number":664,"context_line":"                           #TODO(enikanorov): change to PENDING CREATE later"},{"line_number":665,"context_line":"                           \u0027status\u0027: constants.ACTIVE}"},{"line_number":666,"context_line":"                lb \u003d self._create_loadbalancer("},{"line_number":667,"context_line":"                    context, {\u0027loadbalancer\u0027: lb_data})"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9ixA%3D","line":664,"in_reply_to":"AAAATn%2F9pHw%3D","updated":"2013-12-10 13:21:12.000000000","message":"Done","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"class Loadbalancer(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant,"},{"line_number":186,"context_line":"                   models_v2.HasStatusDescription):"},{"line_number":187,"context_line":"    \"\"\"Loadbalancer represents service instance."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    Loadbalancer may have multiple vips and pools."},{"line_number":190,"context_line":"    Other objects such as members and health monitors are returned"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9eHw%3D","line":187,"updated":"2013-12-11 07:04:56.000000000","message":"Represents a v2 neutron loadbalancer service instance.","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"class Loadbalancer(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant,"},{"line_number":186,"context_line":"                   models_v2.HasStatusDescription):"},{"line_number":187,"context_line":"    \"\"\"Loadbalancer represents service instance."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    Loadbalancer may have multiple vips and pools."},{"line_number":190,"context_line":"    Other objects such as members and health monitors are returned"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2Fyrg%3D","line":187,"in_reply_to":"AAAATn%2F9eHw%3D","updated":"2014-01-08 13:30:12.000000000","message":"Done","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":266,"context_line":"               }"},{"line_number":267,"context_line":"        if loadbalancer.provider:"},{"line_number":268,"context_line":"            res[\u0027provider\u0027] \u003d loadbalancer.provider.provider_name"},{"line_number":269,"context_line":"        #TODO(enikanorov): also return a list of vips and pools"},{"line_number":270,"context_line":"        return res"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def get_loadbalancers(self, context, filters\u003dNone, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9dfg%3D","line":269,"updated":"2013-12-11 09:43:30.000000000","message":"just wondering whether you want to address this todo in scope of this patch or later?","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":266,"context_line":"               }"},{"line_number":267,"context_line":"        if loadbalancer.provider:"},{"line_number":268,"context_line":"            res[\u0027provider\u0027] \u003d loadbalancer.provider.provider_name"},{"line_number":269,"context_line":"        #TODO(enikanorov): also return a list of vips and pools"},{"line_number":270,"context_line":"        return res"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def get_loadbalancers(self, context, filters\u003dNone, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2Fyqg%3D","line":269,"in_reply_to":"AAAATn%2F9dfg%3D","updated":"2014-01-08 13:30:12.000000000","message":"will be in the scope of this change.","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":7987,"name":"Ivar Lazzaro","email":"ivarlazzaro@gmail.com","username":"Ivar"},"unresolved":false,"context_lines":[{"line_number":267,"context_line":"        if loadbalancer.provider:"},{"line_number":268,"context_line":"            res[\u0027provider\u0027] \u003d loadbalancer.provider.provider_name"},{"line_number":269,"context_line":"        #TODO(enikanorov): also return a list of vips and pools"},{"line_number":270,"context_line":"        return res"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def get_loadbalancers(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":273,"context_line":"        return self._get_collection(context, Vip,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9f%2FE%3D","line":270,"updated":"2013-12-10 23:01:55.000000000","message":"fields is never used, should return self._fields(res, fields) instead?","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        if loadbalancer.provider:"},{"line_number":268,"context_line":"            res[\u0027provider\u0027] \u003d loadbalancer.provider.provider_name"},{"line_number":269,"context_line":"        #TODO(enikanorov): also return a list of vips and pools"},{"line_number":270,"context_line":"        return res"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def get_loadbalancers(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":273,"context_line":"        return self._get_collection(context, Vip,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9eb8%3D","line":270,"in_reply_to":"AAAATn%2F9f%2FE%3D","updated":"2013-12-14 15:16:02.000000000","message":"right, missed it","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":270,"context_line":"        return res"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def get_loadbalancers(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":273,"context_line":"        return self._get_collection(context, Vip,"},{"line_number":274,"context_line":"                                    self._make_loadbalancer_dict,"},{"line_number":275,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"},{"line_number":276,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9eyc%3D","line":273,"updated":"2013-12-11 02:38:02.000000000","message":"Vip -\u003e Loadbalancer","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        return res"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def get_loadbalancers(self, context, filters\u003dNone, fields\u003dNone):"},{"line_number":273,"context_line":"        return self._get_collection(context, Vip,"},{"line_number":274,"context_line":"                                    self._make_loadbalancer_dict,"},{"line_number":275,"context_line":"                                    filters\u003dfilters, fields\u003dfields)"},{"line_number":276,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9eb0%3D","line":273,"in_reply_to":"AAAATn%2F9eyc%3D","updated":"2013-12-14 15:16:02.000000000","message":"sure","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":7987,"name":"Ivar Lazzaro","email":"ivarlazzaro@gmail.com","username":"Ivar"},"unresolved":false,"context_lines":[{"line_number":278,"context_line":"        loadbalancer \u003d self._get_resource(context, Loadbalancer, id)"},{"line_number":279,"context_line":"        return self._make_loadbalancer_dict(loadbalancer, fields)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def create_loadbalancer(self, context, loadbalancer):"},{"line_number":282,"context_line":"        return self._create_loadbalancer(context, loadbalancer)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _create_loadbalancer(self, context, loadbalancer):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9f9o%3D","line":281,"updated":"2013-12-10 23:01:55.000000000","message":"What\u0027s the value of hiding _create_loadbalancer(...)? Seems redundant... Should probably remove this and change the below\n\n _create_loadbalancer(...) to create_loadbalancer(...)","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        loadbalancer \u003d self._get_resource(context, Loadbalancer, id)"},{"line_number":279,"context_line":"        return self._make_loadbalancer_dict(loadbalancer, fields)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def create_loadbalancer(self, context, loadbalancer):"},{"line_number":282,"context_line":"        return self._create_loadbalancer(context, loadbalancer)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _create_loadbalancer(self, context, loadbalancer):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FyqA%3D","line":281,"in_reply_to":"AAAATn%2F9f9o%3D","updated":"2014-01-08 13:30:12.000000000","message":"It is needed when loadbalancer is automatically created by create_pool. Otherwise create_loadbalancer of derived plugin will be called. So I need a way to mangle it.","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"unresolved":false,"context_lines":[{"line_number":287,"context_line":"        lb \u003d loadbalancer[\u0027loadbalancer\u0027]"},{"line_number":288,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, lb)"},{"line_number":289,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":290,"context_line":"            lb_db \u003d Loadbalancer(id\u003duuidutils.generate_uuid(),"},{"line_number":291,"context_line":"                                 tenant_id\u003dtenant_id,"},{"line_number":292,"context_line":"                                 name\u003dlb[\u0027name\u0027],"},{"line_number":293,"context_line":"                                 description\u003dlb[\u0027description\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9eF8%3D","line":290,"updated":"2013-12-11 07:04:56.000000000","message":"uuidutils has been outdated referring to https://review.openstack.org/#/c/58234/","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        lb \u003d loadbalancer[\u0027loadbalancer\u0027]"},{"line_number":288,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, lb)"},{"line_number":289,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":290,"context_line":"            lb_db \u003d Loadbalancer(id\u003duuidutils.generate_uuid(),"},{"line_number":291,"context_line":"                                 tenant_id\u003dtenant_id,"},{"line_number":292,"context_line":"                                 name\u003dlb[\u0027name\u0027],"},{"line_number":293,"context_line":"                                 description\u003dlb[\u0027description\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2Fymk%3D","line":290,"in_reply_to":"AAAATn%2F9eF8%3D","updated":"2014-01-08 13:30:12.000000000","message":"looks like corresponding patch received -1 from many. I\u0027ll leave this as is for now","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":7987,"name":"Ivar Lazzaro","email":"ivarlazzaro@gmail.com","username":"Ivar"},"unresolved":false,"context_lines":[{"line_number":434,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":435,"context_line":"            if v[\u0027pool_id\u0027]:"},{"line_number":436,"context_line":"                pool \u003d self._get_resource(context, Pool, v[\u0027pool_id\u0027])"},{"line_number":437,"context_line":"                v[\u0027loadbalancer_id\u0027] \u003d pool[\u0027loadbalancer_id\u0027]"},{"line_number":438,"context_line":"                # validate that the pool has same tenant"},{"line_number":439,"context_line":"                if pool[\u0027tenant_id\u0027] !\u003d tenant_id:"},{"line_number":440,"context_line":"                    raise q_exc.NotAuthorized()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9fvU%3D","line":437,"updated":"2013-12-10 23:01:55.000000000","message":"Looks like vip[\u0027loadbalancer_id\u0027] can also be set at creation time.\n\nI have a couple of questions later about that, but in any case... Should log somewhere whether the value is ignored and overridden by the pool[\u0027loadbalancer_id\u0027]?","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":434,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":435,"context_line":"            if v[\u0027pool_id\u0027]:"},{"line_number":436,"context_line":"                pool \u003d self._get_resource(context, Pool, v[\u0027pool_id\u0027])"},{"line_number":437,"context_line":"                v[\u0027loadbalancer_id\u0027] \u003d pool[\u0027loadbalancer_id\u0027]"},{"line_number":438,"context_line":"                # validate that the pool has same tenant"},{"line_number":439,"context_line":"                if pool[\u0027tenant_id\u0027] !\u003d tenant_id:"},{"line_number":440,"context_line":"                    raise q_exc.NotAuthorized()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2Fylg%3D","line":437,"in_reply_to":"AAAATn%2F9fvU%3D","updated":"2014-01-08 13:30:12.000000000","message":"I\u0027ll add consistency check, thanks.","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":7987,"name":"Ivar Lazzaro","email":"ivarlazzaro@gmail.com","username":"Ivar"},"unresolved":false,"context_lines":[{"line_number":448,"context_line":"                                                    id\u003dpool[\u0027id\u0027])"},{"line_number":449,"context_line":"            else:"},{"line_number":450,"context_line":"                pool \u003d None"},{"line_number":451,"context_line":"                #TODO(enikanorov): require loadbalancer_id"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"            vip_db \u003d Vip(id\u003duuidutils.generate_uuid(),"},{"line_number":454,"context_line":"                         tenant_id\u003dtenant_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9f1Q%3D","line":451,"updated":"2013-12-10 23:01:55.000000000","message":"Looks like a VIP can exist without a Pool and gets a \"loadbalancer_id\" at creation time, correct? I guess that the rationale for creating a VIP object without a pool is to reserve a port (and therefore an address). But why do we need to give a LB id to the VIP before it gets associated to any Pool? which is the downside of creating a VIP without any LB id and then just waiting for a pool to be added in order to set it (and eventually understanding which provider should implement that VIP)?","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":448,"context_line":"                                                    id\u003dpool[\u0027id\u0027])"},{"line_number":449,"context_line":"            else:"},{"line_number":450,"context_line":"                pool \u003d None"},{"line_number":451,"context_line":"                #TODO(enikanorov): require loadbalancer_id"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"            vip_db \u003d Vip(id\u003duuidutils.generate_uuid(),"},{"line_number":454,"context_line":"                         tenant_id\u003dtenant_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2Fylw%3D","line":451,"in_reply_to":"AAAATn%2F9f1Q%3D","updated":"2014-01-08 13:30:12.000000000","message":"We can\u0027t really create vip without loadbalancer_id, because any pool operation requires knowing which driver (provider) to use. Without pool_id and loadbalancer_id we would not have the knowledge of provider and would not be able to do the wiring, or the logic will be much more complex.","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":560,"context_line":"        # operation will fail if it is in use"},{"line_number":561,"context_line":"        # that may and must be done outside the transaction"},{"line_number":562,"context_line":"        try:"},{"line_number":563,"context_line":"            self.delete_loadbalancer(context, lb_id)"},{"line_number":564,"context_line":"        except loadbalancer.LoadbalancerInUse:"},{"line_number":565,"context_line":"            # It\u0027s okay, not autodelete used resource. just log it."},{"line_number":566,"context_line":"            LOG.debug(_(\u0027Could not delete Loadbalancer %s which is in use\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9eyg%3D","line":563,"updated":"2013-12-11 02:38:02.000000000","message":"It seems a loadblancer is deleted automatically when the last vip or pool is deleted. (It means only use case of delete loadblancer API is deleting just after creating a loadblancer.)\n\nIs this an intended feature ? \n(even if so, it should be documented.)","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":560,"context_line":"        # operation will fail if it is in use"},{"line_number":561,"context_line":"        # that may and must be done outside the transaction"},{"line_number":562,"context_line":"        try:"},{"line_number":563,"context_line":"            self.delete_loadbalancer(context, lb_id)"},{"line_number":564,"context_line":"        except loadbalancer.LoadbalancerInUse:"},{"line_number":565,"context_line":"            # It\u0027s okay, not autodelete used resource. just log it."},{"line_number":566,"context_line":"            LOG.debug(_(\u0027Could not delete Loadbalancer %s which is in use\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9Mu8%3D","line":563,"in_reply_to":"AAAATn%2F9eyg%3D","updated":"2013-12-14 15:16:02.000000000","message":"Yes, It is indented and will be documented.","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":7987,"name":"Ivar Lazzaro","email":"ivarlazzaro@gmail.com","username":"Ivar"},"unresolved":false,"context_lines":[{"line_number":807,"context_line":""},{"line_number":808,"context_line":"        try:"},{"line_number":809,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":810,"context_line":"                # ensuring that pool exists"},{"line_number":811,"context_line":"                member_db \u003d Member(id\u003duuidutils.generate_uuid(),"},{"line_number":812,"context_line":"                                   tenant_id\u003dtenant_id,"},{"line_number":813,"context_line":"                                   pool_id\u003dv[\u0027pool_id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9fyI%3D","line":810,"updated":"2013-12-10 23:01:55.000000000","message":"I guess this comment should go away as well","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":807,"context_line":""},{"line_number":808,"context_line":"        try:"},{"line_number":809,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":810,"context_line":"                # ensuring that pool exists"},{"line_number":811,"context_line":"                member_db \u003d Member(id\u003duuidutils.generate_uuid(),"},{"line_number":812,"context_line":"                                   tenant_id\u003dtenant_id,"},{"line_number":813,"context_line":"                                   pool_id\u003dv[\u0027pool_id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FyYQ%3D","line":810,"in_reply_to":"AAAATn%2F9fyI%3D","updated":"2014-01-08 13:30:12.000000000","message":"Done","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":286,"context_line":"        return self._create_loadbalancer(context, loadbalancer)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def _create_loadbalancer(self, context, loadbalancer):"},{"line_number":289,"context_line":"        # need this to avoid calling run-time bound create_loadbalancer"},{"line_number":290,"context_line":"        # of child class"},{"line_number":291,"context_line":"        lb \u003d loadbalancer[\u0027loadbalancer\u0027]"},{"line_number":292,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, lb)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtT8%3D","line":289,"updated":"2014-01-09 11:59:18.000000000","message":"dosctring?","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        return self._create_loadbalancer(context, loadbalancer)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def _create_loadbalancer(self, context, loadbalancer):"},{"line_number":289,"context_line":"        # need this to avoid calling run-time bound create_loadbalancer"},{"line_number":290,"context_line":"        # of child class"},{"line_number":291,"context_line":"        lb \u003d loadbalancer[\u0027loadbalancer\u0027]"},{"line_number":292,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, lb)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtA8%3D","line":289,"in_reply_to":"AAAAUH%2F%2FtT8%3D","updated":"2014-01-09 12:35:16.000000000","message":"no, comment","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":301,"context_line":"        return self._make_loadbalancer_dict(lb_db)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def update_loadbalancer(self, context, id, loadbalancer):"},{"line_number":304,"context_line":"        v \u003d loadbalancer[\u0027loadbalancer\u0027]"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":307,"context_line":"            lb_db \u003d self._get_resource(context, Loadbalancer, id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtdU%3D","line":304,"updated":"2014-01-09 11:59:18.000000000","message":"nit: v -\u003e lb","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":301,"context_line":"        return self._make_loadbalancer_dict(lb_db)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def update_loadbalancer(self, context, id, loadbalancer):"},{"line_number":304,"context_line":"        v \u003d loadbalancer[\u0027loadbalancer\u0027]"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":307,"context_line":"            lb_db \u003d self._get_resource(context, Loadbalancer, id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtAw%3D","line":304,"in_reply_to":"AAAAUH%2F%2FtdU%3D","updated":"2014-01-09 12:35:16.000000000","message":"Done","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":434,"context_line":"    def create_vip(self, context, vip):"},{"line_number":435,"context_line":"        v \u003d vip[\u0027vip\u0027]"},{"line_number":436,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, v)"},{"line_number":437,"context_line":"        vip_lb_id \u003d v.get(\u0027loadbalancer_id\u0027,"},{"line_number":438,"context_line":"                          attributes.ATTR_NOT_SPECIFIED)"},{"line_number":439,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":440,"context_line":"            if v[\u0027pool_id\u0027]:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtUI%3D","line":437,"updated":"2014-01-09 11:59:18.000000000","message":"consider\n vip_lb_id \u003d v[\u0027loadbalancer_id\u0027] \nas it will be set to attributes.ATTR_NOT_SPECIFIED by default in the extension","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":434,"context_line":"    def create_vip(self, context, vip):"},{"line_number":435,"context_line":"        v \u003d vip[\u0027vip\u0027]"},{"line_number":436,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, v)"},{"line_number":437,"context_line":"        vip_lb_id \u003d v.get(\u0027loadbalancer_id\u0027,"},{"line_number":438,"context_line":"                          attributes.ATTR_NOT_SPECIFIED)"},{"line_number":439,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":440,"context_line":"            if v[\u0027pool_id\u0027]:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtAU%3D","line":437,"in_reply_to":"AAAAUH%2F%2FtUI%3D","updated":"2014-01-09 12:35:16.000000000","message":"I think I\u0027ll leave it as is since the method could be called from other places which would not care about ATTR_NOT_SPECIFIED","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":449,"context_line":"                    vip_lb_id !\u003d pool[\u0027loadbalancer_id\u0027]):"},{"line_number":450,"context_line":"                    raise q_exc.BadRequest("},{"line_number":451,"context_line":"                        resource\u003d\"vip\","},{"line_number":452,"context_line":"                        msg\u003d(\"pool\u0027s loadbalancer_id doesn\u0027t match provided \""},{"line_number":453,"context_line":"                             \"loadbalancer_id\"))"},{"line_number":454,"context_line":"                v[\u0027loadbalancer_id\u0027] \u003d pool[\u0027loadbalancer_id\u0027]"},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2Ftfs%3D","line":452,"updated":"2014-01-09 11:59:18.000000000","message":"i18n missed","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":449,"context_line":"                    vip_lb_id !\u003d pool[\u0027loadbalancer_id\u0027]):"},{"line_number":450,"context_line":"                    raise q_exc.BadRequest("},{"line_number":451,"context_line":"                        resource\u003d\"vip\","},{"line_number":452,"context_line":"                        msg\u003d(\"pool\u0027s loadbalancer_id doesn\u0027t match provided \""},{"line_number":453,"context_line":"                             \"loadbalancer_id\"))"},{"line_number":454,"context_line":"                v[\u0027loadbalancer_id\u0027] \u003d pool[\u0027loadbalancer_id\u0027]"},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtAI%3D","line":452,"in_reply_to":"AAAAUH%2F%2Ftfs%3D","updated":"2014-01-09 12:35:16.000000000","message":"Done","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":466,"context_line":"                if vip_lb_id \u003d\u003d attributes.ATTR_NOT_SPECIFIED:"},{"line_number":467,"context_line":"                    raise q_exc.BadRequest("},{"line_number":468,"context_line":"                        resource\u003d\"vip\","},{"line_number":469,"context_line":"                        msg\u003d(\"loadbalancer_id or pool_id must be provided\"))"},{"line_number":470,"context_line":"                v[\u0027loadbalancer_id\u0027] \u003d vip_lb_id"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"            vip_db \u003d Vip(id\u003duuidutils.generate_uuid(),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2Ftfo%3D","line":469,"updated":"2014-01-09 11:59:18.000000000","message":"ditto","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":466,"context_line":"                if vip_lb_id \u003d\u003d attributes.ATTR_NOT_SPECIFIED:"},{"line_number":467,"context_line":"                    raise q_exc.BadRequest("},{"line_number":468,"context_line":"                        resource\u003d\"vip\","},{"line_number":469,"context_line":"                        msg\u003d(\"loadbalancer_id or pool_id must be provided\"))"},{"line_number":470,"context_line":"                v[\u0027loadbalancer_id\u0027] \u003d vip_lb_id"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"            vip_db \u003d Vip(id\u003duuidutils.generate_uuid(),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtAE%3D","line":469,"in_reply_to":"AAAAUH%2F%2Ftfo%3D","updated":"2014-01-09 12:35:16.000000000","message":"Done","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":671,"context_line":""},{"line_number":672,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, v)"},{"line_number":673,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":674,"context_line":"            if (v.get(\u0027loadbalancer_id\u0027,"},{"line_number":675,"context_line":"                      attributes.ATTR_NOT_SPECIFIED) \u003d\u003d"},{"line_number":676,"context_line":"                attributes.ATTR_NOT_SPECIFIED):"},{"line_number":677,"context_line":"                lb_data \u003d {\u0027name\u0027: v[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtNs%3D","line":674,"updated":"2014-01-09 11:59:18.000000000","message":"v[\u0027loadbalancer_id\u0027]?","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":671,"context_line":""},{"line_number":672,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, v)"},{"line_number":673,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":674,"context_line":"            if (v.get(\u0027loadbalancer_id\u0027,"},{"line_number":675,"context_line":"                      attributes.ATTR_NOT_SPECIFIED) \u003d\u003d"},{"line_number":676,"context_line":"                attributes.ATTR_NOT_SPECIFIED):"},{"line_number":677,"context_line":"                lb_data \u003d {\u0027name\u0027: v[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtAA%3D","line":674,"in_reply_to":"AAAAUH%2F%2FtNs%3D","updated":"2014-01-09 12:35:16.000000000","message":"same as above","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"class Loadbalancer(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant,"},{"line_number":186,"context_line":"                   models_v2.HasStatusDescription):"},{"line_number":187,"context_line":"    \"\"\"Represents a v2 neutron loadbalancer service instance."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    Loadbalancer may have multiple vips and pools."},{"line_number":190,"context_line":"    Other objects such as members and health monitors are returned"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BnhE%3D","line":187,"updated":"2014-01-24 00:56:55.000000000","message":"Is the \"neutron loadbalancer service instance\" different from the notion of a \"neutron service provider\"? If so, please explain the relationship/difference here. Put another way: currently the **neutron service provider** is the thing that \"owns\" pools, members, VIPs, etc. Explain how this new loadbalancer resource object is related to the service provider.","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"class Loadbalancer(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant,"},{"line_number":186,"context_line":"                   models_v2.HasStatusDescription):"},{"line_number":187,"context_line":"    \"\"\"Represents a v2 neutron loadbalancer service instance."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    Loadbalancer may have multiple vips and pools."},{"line_number":190,"context_line":"    Other objects such as members and health monitors are returned"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2Beoo%3D","line":187,"in_reply_to":"AAAAUH%2F%2BhH4%3D","updated":"2014-01-27 10:47:25.000000000","message":"Jay, I\u0027m happy to improve comments, but I think that answering particular questions or duplication what is already on the wiki doesn\u0027t make much sense.\n\nHow would you suggest to improve docstring for this particular class?\n\nMy suggestion is something like \"loadbalancer serves as an envelope to other lbaas resources, and becomes the root of object tree instead of the pool\"","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"class Loadbalancer(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant,"},{"line_number":186,"context_line":"                   models_v2.HasStatusDescription):"},{"line_number":187,"context_line":"    \"\"\"Represents a v2 neutron loadbalancer service instance."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    Loadbalancer may have multiple vips and pools."},{"line_number":190,"context_line":"    Other objects such as members and health monitors are returned"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BhH4%3D","line":187,"in_reply_to":"AAAAUH%2F%2Blb8%3D","updated":"2014-01-24 20:39:21.000000000","message":"\"no one in lbaas community questions it\"\n\nThis is part of the problem with the LBaaS code. It is written by very few people and in a way that assumes reviewers and readers of the code should magically understand all concepts without any meaningful code comments explaining how certain objects and classes relate to each other.\n\nPlease remember that code is read 100 times more often than it is written. If I\u0027m bringing up these questions in reviews, it means that it\u0027s not obvious what the code is doing. It may be obvious to *you*, but you wrote the code and have a whole bunch of tribal knowledge regarding the load balancer as a service implementation in Neutron.","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"class Loadbalancer(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant,"},{"line_number":186,"context_line":"                   models_v2.HasStatusDescription):"},{"line_number":187,"context_line":"    \"\"\"Represents a v2 neutron loadbalancer service instance."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    Loadbalancer may have multiple vips and pools."},{"line_number":190,"context_line":"    Other objects such as members and health monitors are returned"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2Blb8%3D","line":187,"in_reply_to":"AAAAUH%2F%2BnhE%3D","updated":"2014-01-24 10:18:36.000000000","message":"I don\u0027t think the explanation needs to go into the docstring or comment, since Loadbalancer and \u0027service provider\u0027 are so different entities that no one in lbaas community questions it.\nHow ever it might make sense to add comments explaining why both pool and loabalancer have \u0027provider\u0027 attribute\n\nAnswering your question, i\u0027m not sure \u0027owns pools\u0027 is correct name for what provider does. Provider is an attribute related to a  resource which selects how (with what driver) the resource is handled.\nCurrently, provider is bound to the pool, since the pool is the root of LB configuration tree. Loadbalancer supposed to get this role from the pool, and binding to provider is one of roles that goes from Pool to Loadbalancer.\nMore on this: https://wiki.openstack.org/wiki/Neutron/LBaaS/LoadbalancerInstance#Rationale","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"unresolved":false,"context_lines":[{"line_number":202,"context_line":"        lazy\u003d\"joined\","},{"line_number":203,"context_line":"        primaryjoin\u003d(\"Loadbalancer.id\u003d\u003d\""},{"line_number":204,"context_line":"                     \"ProviderResourceAssociation.resource_id\"),"},{"line_number":205,"context_line":"        foreign_keys\u003d[st_db.ProviderResourceAssociation.resource_id]"},{"line_number":206,"context_line":"    )"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BngI%3D","line":205,"updated":"2014-01-24 00:56:55.000000000","message":"OK, so a LB service provider can have \u003e1 loadbalancer objects... is the intention that a user will create a load balancer and specify the provider name upon creation? Because right now, the user is supposed to specify the provider name when creating a *pool*. Is the current relationship between a pool and a provider going to be removed in favour of using a relationship between a loadbalancer and a pool? Same question for the current relationship between VIPs and the provider vs. VIPs and the loadbalancer object.","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        lazy\u003d\"joined\","},{"line_number":203,"context_line":"        primaryjoin\u003d(\"Loadbalancer.id\u003d\u003d\""},{"line_number":204,"context_line":"                     \"ProviderResourceAssociation.resource_id\"),"},{"line_number":205,"context_line":"        foreign_keys\u003d[st_db.ProviderResourceAssociation.resource_id]"},{"line_number":206,"context_line":"    )"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BlAA%3D","line":205,"in_reply_to":"AAAAUH%2F%2BngI%3D","updated":"2014-01-24 10:18:36.000000000","message":"Just to clarify once again: we have to close notions - provider and driver, and the mapping is 1:1 where provider is user-facing notion and driver is cloud admin-facing notion.\n\n\u003e is the intention that a user will create a load balancer and specify the provider name upon creation\n\n It is one of the use cases. If user doesn\u0027t specify provider, then default one is used (default for loadbalancer service). \nIt\u0027s exactly the same workflow as for pool creation right now.\n\n\u003e  Is the current relationship between a pool and a provider going to be removed in favor of using a relationship between a loadbalancer and a pool?\n\nNot exactly. It will be removed eventually from the pool (need to maintain backward compatibility). \nCurrently association provider-pool is removed from db (moved to provider-loadbalancer).\n\n\u0027provider\u0027 attribute remains in the pool as a relationship to maintain that compatibility - both for the code simplicity and for the API.","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"unresolved":false,"context_lines":[{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        res[\u0027vips\u0027] \u003d [v[\u0027id\u0027] for v in loadbalancer.vips]"},{"line_number":272,"context_line":"        res[\u0027pools\u0027] \u003d [p[\u0027id\u0027] for p in loadbalancer.pools]"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        return self._fields(res, fields)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def get_loadbalancers(self, context, filters\u003dNone, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BfcY%3D","line":273,"updated":"2014-01-25 01:15:51.000000000","message":"Line 271-272 can be right below line 265.\nThere is no reason that those two lines as separated.","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        res[\u0027vips\u0027] \u003d [v[\u0027id\u0027] for v in loadbalancer.vips]"},{"line_number":272,"context_line":"        res[\u0027pools\u0027] \u003d [p[\u0027id\u0027] for p in loadbalancer.pools]"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        return self._fields(res, fields)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def get_loadbalancers(self, context, filters\u003dNone, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BeoM%3D","line":273,"in_reply_to":"AAAAUH%2F%2BfcY%3D","updated":"2014-01-27 10:47:25.000000000","message":"I think It\u0027s up to one\u0027s taste. Other _make_dict methods put such  lines out of dict initialization.","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"unresolved":false,"context_lines":[{"line_number":468,"context_line":"                        resource\u003d\"vip\","},{"line_number":469,"context_line":"                        msg\u003d(_(\"loadbalancer_id or pool_id must be provided\"))"},{"line_number":470,"context_line":"                    )"},{"line_number":471,"context_line":"                v[\u0027loadbalancer_id\u0027] \u003d vip_lb_id"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"            vip_db \u003d Vip(id\u003duuidutils.generate_uuid(),"},{"line_number":474,"context_line":"                         tenant_id\u003dtenant_id,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BfZk%3D","line":471,"updated":"2014-01-25 01:15:51.000000000","message":"nitpick:\nThis line can be shifted to right. then the line454 can be deleted.","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                        resource\u003d\"vip\","},{"line_number":469,"context_line":"                        msg\u003d(_(\"loadbalancer_id or pool_id must be provided\"))"},{"line_number":470,"context_line":"                    )"},{"line_number":471,"context_line":"                v[\u0027loadbalancer_id\u0027] \u003d vip_lb_id"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"            vip_db \u003d Vip(id\u003duuidutils.generate_uuid(),"},{"line_number":474,"context_line":"                         tenant_id\u003dtenant_id,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BCUA%3D","line":471,"in_reply_to":"AAAAUH%2F%2BfZk%3D","updated":"2014-02-03 10:56:56.000000000","message":"not really. on 454 i\u0027m getting loadbalancer_id from the pool, not vip","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"unresolved":false,"context_lines":[{"line_number":580,"context_line":"        # operation will fail if it is in use"},{"line_number":581,"context_line":"        # that may and must be done outside the transaction"},{"line_number":582,"context_line":"        try:"},{"line_number":583,"context_line":"            self.delete_loadbalancer(context, lb_id)"},{"line_number":584,"context_line":"        except loadbalancer.LoadbalancerInUse:"},{"line_number":585,"context_line":"            # It\u0027s okay, not autodelete used resource. just log it."},{"line_number":586,"context_line":"            LOG.debug(_(\u0027Could not delete Loadbalancer %s which is in use\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BfZQ%3D","line":583,"updated":"2014-01-25 01:15:51.000000000","message":"Is there any reason to not put this transaction into the single above transaction?","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":580,"context_line":"        # operation will fail if it is in use"},{"line_number":581,"context_line":"        # that may and must be done outside the transaction"},{"line_number":582,"context_line":"        try:"},{"line_number":583,"context_line":"            self.delete_loadbalancer(context, lb_id)"},{"line_number":584,"context_line":"        except loadbalancer.LoadbalancerInUse:"},{"line_number":585,"context_line":"            # It\u0027s okay, not autodelete used resource. just log it."},{"line_number":586,"context_line":"            LOG.debug(_(\u0027Could not delete Loadbalancer %s which is in use\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F92K8%3D","line":583,"in_reply_to":"AAAAUH%2F%2BCSo%3D","updated":"2014-02-03 11:28:41.000000000","message":"On the second thought I had to change it back.\nIt\u0027s undesirable to do both operations within a transaction since calling delete_loadbalancer() includes communication with agent over amqp. Such operations are better to be kept out of transactions.","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":580,"context_line":"        # operation will fail if it is in use"},{"line_number":581,"context_line":"        # that may and must be done outside the transaction"},{"line_number":582,"context_line":"        try:"},{"line_number":583,"context_line":"            self.delete_loadbalancer(context, lb_id)"},{"line_number":584,"context_line":"        except loadbalancer.LoadbalancerInUse:"},{"line_number":585,"context_line":"            # It\u0027s okay, not autodelete used resource. just log it."},{"line_number":586,"context_line":"            LOG.debug(_(\u0027Could not delete Loadbalancer %s which is in use\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BCSo%3D","line":583,"in_reply_to":"AAAAUH%2F%2BfZQ%3D","updated":"2014-02-03 10:56:56.000000000","message":"Done","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":333,"name":"Isaku Yamahata","email":"isaku.yamahata@gmail.com","username":"yamahata"},"unresolved":false,"context_lines":[{"line_number":726,"context_line":"        # call delete_loadbalancer from derived class"},{"line_number":727,"context_line":"        # operation will fail if it is in use"},{"line_number":728,"context_line":"        try:"},{"line_number":729,"context_line":"            self.delete_loadbalancer(context, pool_db.loadbalancer_id)"},{"line_number":730,"context_line":"        except loadbalancer.LoadbalancerInUse:"},{"line_number":731,"context_line":"            # It\u0027s okay, no autodelete of used resource. just log it"},{"line_number":732,"context_line":"            LOG.debug(_(\u0027Could not delete loadbalancer %s\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BfY0%3D","line":729,"updated":"2014-01-25 01:15:51.000000000","message":"ditto. Is there any reason to split db operation into two transaction?","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":726,"context_line":"        # call delete_loadbalancer from derived class"},{"line_number":727,"context_line":"        # operation will fail if it is in use"},{"line_number":728,"context_line":"        try:"},{"line_number":729,"context_line":"            self.delete_loadbalancer(context, pool_db.loadbalancer_id)"},{"line_number":730,"context_line":"        except loadbalancer.LoadbalancerInUse:"},{"line_number":731,"context_line":"            # It\u0027s okay, no autodelete of used resource. just log it"},{"line_number":732,"context_line":"            LOG.debug(_(\u0027Could not delete loadbalancer %s\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F92Ko%3D","line":729,"in_reply_to":"AAAAUH%2F%2BCSc%3D","updated":"2014-02-03 11:28:41.000000000","message":"same","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":726,"context_line":"        # call delete_loadbalancer from derived class"},{"line_number":727,"context_line":"        # operation will fail if it is in use"},{"line_number":728,"context_line":"        try:"},{"line_number":729,"context_line":"            self.delete_loadbalancer(context, pool_db.loadbalancer_id)"},{"line_number":730,"context_line":"        except loadbalancer.LoadbalancerInUse:"},{"line_number":731,"context_line":"            # It\u0027s okay, no autodelete of used resource. just log it"},{"line_number":732,"context_line":"            LOG.debug(_(\u0027Could not delete loadbalancer %s\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BCSc%3D","line":729,"in_reply_to":"AAAAUH%2F%2BfY0%3D","updated":"2014-02-03 10:56:56.000000000","message":"Done","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":666,"context_line":""},{"line_number":667,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, v)"},{"line_number":668,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":669,"context_line":"            \"\"\""},{"line_number":670,"context_line":"            if (v.get(\u0027loadbalancer_id\u0027,"},{"line_number":671,"context_line":"                      attributes.ATTR_NOT_SPECIFIED) \u003d\u003d"},{"line_number":672,"context_line":"                attributes.ATTR_NOT_SPECIFIED):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F91pE%3D","line":669,"updated":"2014-02-03 13:24:15.000000000","message":"to be removed","commit_id":"9e7de89fdc0cbe1485b05a533a865c363003b934"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":703,"context_line":"            self._delete_pool_stats(context, pool_id)"},{"line_number":704,"context_line":"            pool_db \u003d self._get_resource(context, Pool, pool_id)"},{"line_number":705,"context_line":"            context.session.delete(pool_db)"},{"line_number":706,"context_line":"            \"\"\""},{"line_number":707,"context_line":"            # call delete_loadbalancer from derived class"},{"line_number":708,"context_line":"            # operation will fail if it is in use"},{"line_number":709,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9ZXU%3D","line":706,"updated":"2014-02-07 08:27:37.000000000","message":"Please remove this commented out code.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":703,"context_line":"            self._delete_pool_stats(context, pool_id)"},{"line_number":704,"context_line":"            pool_db \u003d self._get_resource(context, Pool, pool_id)"},{"line_number":705,"context_line":"            context.session.delete(pool_db)"},{"line_number":706,"context_line":"            \"\"\""},{"line_number":707,"context_line":"            # call delete_loadbalancer from derived class"},{"line_number":708,"context_line":"            # operation will fail if it is in use"},{"line_number":709,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9Xhs%3D","line":706,"in_reply_to":"AAAAUH%2F9ZXU%3D","updated":"2014-02-08 13:37:41.000000000","message":"Done","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"}],"neutron/db/migration/alembic_migrations/versions/5479c4752b13_lbaas_instance.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":30,"context_line":"# Change to [\u0027*\u0027] if this migration applies to all plugins"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"migration_for_plugins \u003d ["},{"line_number":33,"context_line":"    \u0027*\u0027"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from alembic import op"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9des%3D","line":33,"updated":"2013-12-11 09:43:30.000000000","message":"I think LBaaS service plugin should be here","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":30,"context_line":"# Change to [\u0027*\u0027] if this migration applies to all plugins"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"migration_for_plugins \u003d ["},{"line_number":33,"context_line":"    \u0027*\u0027"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from alembic import op"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FyX4%3D","line":33,"in_reply_to":"AAAATn%2F9des%3D","updated":"2014-01-08 13:30:12.000000000","message":"Done","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"from neutron.db import migration"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def upgrade(active_plugins\u003dNone, options\u003dNone):"},{"line_number":44,"context_line":"    if not migration.should_run(active_plugins, migration_for_plugins):"},{"line_number":45,"context_line":"        return"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F9oic%3D","line":43,"updated":"2014-02-05 14:08:14.000000000","message":"looks like migration doesn\u0027t work:\nINFO  [alembic.migration] Running upgrade 49f5e553f61f -\u003e 5479c4752b13, Introduce Loadbalancer model to the LBaaS object model\nTraceback (most recent call last):\n  File \"/usr/local/bin/neutron-db-manage\", line 10, in \u003cmodule\u003e\n    sys.exit(main())\n  File \"/opt/stack/neutron/neutron/db/migration/cli.py\", line 143, in main\n    CONF.command.func(config, CONF.command.name)\n  File \"/opt/stack/neutron/neutron/db/migration/cli.py\", line 80, in do_upgrade_downgrade\n    do_alembic_command(config, cmd, revision, sql\u003dCONF.command.sql)\n  File \"/opt/stack/neutron/neutron/db/migration/cli.py\", line 59, in do_alembic_command\n    getattr(alembic_command, cmd)(config, *args, **kwargs)\n  File \"/usr/local/lib/python2.7/dist-packages/alembic/command.py\", line 124, in upgrade\n    script.run_env()\n  File \"/usr/local/lib/python2.7/dist-packages/alembic/script.py\", line 193, in run_env\n    util.load_python_file(self.dir, \u0027env.py\u0027)\n  File \"/usr/local/lib/python2.7/dist-packages/alembic/util.py\", line 177, in load_python_file\n    module \u003d load_module(module_id, path)\n  File \"/usr/local/lib/python2.7/dist-packages/alembic/compat.py\", line 39, in load_module\n    return imp.load_source(module_id, path, fp)\n  File \"/opt/stack/neutron/neutron/db/migration/alembic_migrations/env.py\", line 105, in \u003cmodule\u003e\n    run_migrations_online()\n  File \"/opt/stack/neutron/neutron/db/migration/alembic_migrations/env.py\", line 89, in run_migrations_online\n    options\u003dbuild_options())\n  File \"\u003cstring\u003e\", line 7, in run_migrations\n  File \"/usr/local/lib/python2.7/dist-packages/alembic/environment.py\", line 652, in run_migrations\n    self.get_context().run_migrations(**kw)\n  File \"/usr/local/lib/python2.7/dist-packages/alembic/migration.py\", line 224, in run_migrations\n    change(**kw)\n  File \"/opt/stack/neutron/neutron/db/migration/alembic_migrations/versions/5479c4752b13_lbaas_instance.py\", line 61, in upgrade\n    sa.ForeignKey(\u0027loadbalancers.id\u0027), nullable\u003dFalse))\n  File \"\u003cstring\u003e\", line 7, in add_column\n  File \"/usr/local/lib/python2.7/dist-packages/alembic/operations.py\", line 367, in add_column\n    self.impl.add_constraint(constraint)\n  File \"/usr/local/lib/python2.7/dist-packages/alembic/ddl/impl.py\", line 135, in add_constraint\n    self._exec(schema.AddConstraint(const))\n  File \"/usr/local/lib/python2.7/dist-packages/alembic/ddl/impl.py\", line 76, in _exec\n    conn.execute(construct, *multiparams, **params)\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py\", line 1449, in execute\n    params)\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py\", line 1542, in _execute_ddl\n    compiled\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py\", line 1698, in _execute_context\n    context)\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py\", line 1691, in _execute_context\n    context)\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py\", line 331, in do_execute\n    cursor.execute(statement, parameters)\n  File \"/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py\", line 174, in execute\n    self.errorhandler(self, exc, value)\n  File \"/usr/lib/python2.7/dist-packages/MySQLdb/connections.py\", line 36, in defaulterrorhandler\n    raise errorclass, errorvalue\nsqlalchemy.exc.IntegrityError: (IntegrityError) (1452, \u0027Cannot add or update a child row: a foreign key constraint fails (`neutron_ml2`.`#sql-5115_70`, CONSTRAINT `#sql-5115_70_ibfk_2` FOREIGN KEY (`loadbalancer_id`) REFERENCES `loadbalancers` (`id`))\u0027) \u0027ALTER TABLE pools ADD FOREIGN KEY(loadbalancer_id) REFERENCES loadbalancers (id)\u0027 ()","commit_id":"b631b01f6f5cfdb753afe69e2bcbf8749f38f4f1"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"unresolved":false,"context_lines":[{"line_number":78,"context_line":"    # update loadbalancer_id simply to vip\u0027s pool_id"},{"line_number":79,"context_line":"    op.execute(\"UPDATE vips SET loadbalancer_id\u003dpool_id\")"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    op.alter_column(\u0027pools\u0027, \u0027loadbalancer_id\u0027, nullable\u003dFalse)"},{"line_number":82,"context_line":"    op.alter_column(\u0027vips\u0027, \u0027loadbalancer_id\u0027, nullable\u003dFalse)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F9jAs%3D","line":81,"updated":"2014-02-06 05:40:15.000000000","message":"It seems this introduce a new bug. jenkins log said \"All MySQL ALTER COLUMN operations require the existing type.\". Although there is no problem for PostgreSQL.","commit_id":"ef985bff31fcc09a5f4aa90e1e6a53bbc3a44dbc"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# revision identifiers, used by Alembic."},{"line_number":27,"context_line":"revision \u003d \u00275479c4752b13\u0027"},{"line_number":28,"context_line":"down_revision \u003d \u002749f5e553f61f\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"# Change to [\u0027*\u0027] if this migration applies to all plugins"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2F2bE%3D","line":28,"updated":"2014-02-10 12:29:08.000000000","message":"need to update down revision as https://review.openstack.org/#/c/65245/ was merged","commit_id":"83e287513efb283a8da4f7d952a6dba8924a3907"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# revision identifiers, used by Alembic."},{"line_number":27,"context_line":"revision \u003d \u00275479c4752b13\u0027"},{"line_number":28,"context_line":"down_revision \u003d \u002749f5e553f61f\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"# Change to [\u0027*\u0027] if this migration applies to all plugins"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2F2Co%3D","line":28,"in_reply_to":"AAAAUX%2F%2F2bE%3D","updated":"2014-02-10 13:23:11.000000000","message":"Done","commit_id":"83e287513efb283a8da4f7d952a6dba8924a3907"},{"author":{"_account_id":8446,"name":"Evgeny Fedoruk","email":"evgenyf@radware.com","username":"evgenyfedoruk"},"unresolved":false,"context_lines":[{"line_number":87,"context_line":"def downgrade(active_plugins\u003dNone, options\u003dNone):"},{"line_number":88,"context_line":"    if not migration.should_run(active_plugins, migration_for_plugins):"},{"line_number":89,"context_line":"        return"},{"line_number":90,"context_line":"    op.drop_column(\u0027vips\u0027, \u0027loadbalancer_id\u0027)"},{"line_number":91,"context_line":"    op.drop_column(\u0027pools\u0027, \u0027loadbalancer_id\u0027)"},{"line_number":92,"context_line":"    op.drop_table(\u0027loadbalancers\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2FAXg%3D","line":90,"updated":"2014-02-17 17:29:05.000000000","message":"the downgrade will fail because \u0027loadbalancer_id\u0027 for \u0027pools\u0027 and \u0027vips\u0027 is a foreign key constraint.\nYou should create those FKs with name and when delete constraints before deleting column.\nYou can do:\nop.add_column(\u0027vips\u0027,\n                       sa.Column(u\u0027loadbalancer_id\u0027, sa.String(36),\n                       sa.ForeignKey(\u0027loadbalancers.id\u0027, name\u003d\u0027fk-1\u0027),       nullable\u003dTrue))\n\nAnd on downgrade, before drop_column do:\n\nop.drop_constraint(\u0027fk-1\u0027, \u0027vips\u0027, type_\u003d\u0027foreignkey\u0027)\n\n(same for pools)","commit_id":"febc1b8188d8ae7366e2796c891b30b95b96b0be"}],"neutron/extensions/loadbalancer.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":114,"context_line":"                   \u0027is_visible\u0027: True},"},{"line_number":115,"context_line":"        \u0027provider\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":116,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":117,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: attr.ATTR_NOT_SPECIFIED},"},{"line_number":118,"context_line":"    },"},{"line_number":119,"context_line":"    \u0027vips\u0027: {"},{"line_number":120,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pGA%3D","line":117,"updated":"2013-12-10 09:43:46.000000000","message":"status_description?","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                   \u0027is_visible\u0027: True},"},{"line_number":115,"context_line":"        \u0027provider\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":116,"context_line":"                     \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":117,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: attr.ATTR_NOT_SPECIFIED},"},{"line_number":118,"context_line":"    },"},{"line_number":119,"context_line":"    \u0027vips\u0027: {"},{"line_number":120,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9iwY%3D","line":117,"in_reply_to":"AAAATn%2F9pGA%3D","updated":"2013-12-10 13:21:12.000000000","message":"Done","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":9461,"name":"Vijay Kumar Venkatachalam","email":"vijay.venkatachalam@citrix.com","username":"vijayvenkatachalam"},"unresolved":false,"context_lines":[{"line_number":107,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":108,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":109,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"},{"line_number":110,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":111,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":112,"context_line":"                           \u0027is_visible\u0027: True, \u0027default\u0027: True},"},{"line_number":113,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2F22Q%3D","line":110,"updated":"2014-02-10 11:37:38.000000000","message":"What is the expectation of admin_stat_up of loadbalancer? Will it change the status of all the VIPs and Pools in the loadbalancer? How does it work along with vip or pool\u0027s admin_state_up property?","commit_id":"83e287513efb283a8da4f7d952a6dba8924a3907"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":108,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":109,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"},{"line_number":110,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":111,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":112,"context_line":"                           \u0027is_visible\u0027: True, \u0027default\u0027: True},"},{"line_number":113,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2F1bg%3D","line":110,"in_reply_to":"AAAAUX%2F%2F1ew%3D","updated":"2014-02-10 14:18:00.000000000","message":"Yes, I think it should be independent. When whole instance is down, you\u0027re still able to change state of subresources and that will be reflected when instance is up","commit_id":"83e287513efb283a8da4f7d952a6dba8924a3907"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":108,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":109,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"},{"line_number":110,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":111,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":112,"context_line":"                           \u0027is_visible\u0027: True, \u0027default\u0027: True},"},{"line_number":113,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2F2Do%3D","line":110,"in_reply_to":"AAAAUX%2F%2F22Q%3D","updated":"2014-02-10 13:23:11.000000000","message":"The plan is to use it to enable/disable whole device while preserving admin_states of vips/pools","commit_id":"83e287513efb283a8da4f7d952a6dba8924a3907"},{"author":{"_account_id":9461,"name":"Vijay Kumar Venkatachalam","email":"vijay.venkatachalam@citrix.com","username":"vijayvenkatachalam"},"unresolved":false,"context_lines":[{"line_number":107,"context_line":"        \u0027description\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":108,"context_line":"                        \u0027validate\u0027: {\u0027type:string\u0027: None},"},{"line_number":109,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: \u0027\u0027},"},{"line_number":110,"context_line":"        \u0027admin_state_up\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":111,"context_line":"                           \u0027convert_to\u0027: attr.convert_to_boolean,"},{"line_number":112,"context_line":"                           \u0027is_visible\u0027: True, \u0027default\u0027: True},"},{"line_number":113,"context_line":"        \u0027status\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2F1ew%3D","line":110,"in_reply_to":"AAAAUX%2F%2F2Do%3D","updated":"2014-02-10 14:12:35.000000000","message":"Will modification of pool/vip properties (including admin_state_up) be allowed when the loadbalancer\u0027s admin_state_up is DISABLED?","commit_id":"83e287513efb283a8da4f7d952a6dba8924a3907"}],"neutron/plugins/nicira/NeutronServicePlugin.py":[{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":1125,"context_line":"                      lb_id)"},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"    # TODO(enikanorov): add autodeletion for delete_vip"},{"line_number":1128,"context_line":"    # That will be needed whin multiple vips per pool are available"},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    def delete_pool(self, context, pool_id):"},{"line_number":1131,"context_line":"        pool \u003d self.get_pool(context, pool_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9Zl4%3D","line":1128,"updated":"2014-02-07 08:27:37.000000000","message":"whin -\u003e when","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":1125,"context_line":"                      lb_id)"},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"    # TODO(enikanorov): add autodeletion for delete_vip"},{"line_number":1128,"context_line":"    # That will be needed whin multiple vips per pool are available"},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    def delete_pool(self, context, pool_id):"},{"line_number":1131,"context_line":"        pool \u003d self.get_pool(context, pool_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9XYA%3D","line":1128,"in_reply_to":"AAAAUH%2F9Zl4%3D","updated":"2014-02-08 13:37:41.000000000","message":"Done","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"}],"neutron/services/loadbalancer/drivers/abstract_driver.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @abc.abstractmethod"},{"line_number":35,"context_line":"    def create_loadbalancer(self, context, vip):"},{"line_number":36,"context_line":"        pass"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F92%2Bs%3D","line":35,"updated":"2014-02-03 08:36:17.000000000","message":"the parameter should be loadbalancer, not vip. Same for below methods","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @abc.abstractmethod"},{"line_number":35,"context_line":"    def create_loadbalancer(self, context, vip):"},{"line_number":36,"context_line":"        pass"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F92KE%3D","line":35,"in_reply_to":"AAAAUH%2F92%2Bs%3D","updated":"2014-02-03 11:28:41.000000000","message":"Done","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":36,"context_line":"        pass"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @abc.abstractmethod"},{"line_number":39,"context_line":"    def update_loadbalancer(self, context, vip):"},{"line_number":40,"context_line":"        pass"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F92%2Bk%3D","line":39,"updated":"2014-02-03 08:36:17.000000000","message":"(..., old_loadbalancer, loadbalancer):","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        pass"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @abc.abstractmethod"},{"line_number":39,"context_line":"    def update_loadbalancer(self, context, vip):"},{"line_number":40,"context_line":"        pass"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F92KA%3D","line":39,"in_reply_to":"AAAAUH%2F92%2Bk%3D","updated":"2014-02-03 11:28:41.000000000","message":"Done","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"}],"neutron/services/loadbalancer/drivers/haproxy/plugin_driver.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":364,"context_line":"        # call create_loadbalancer on the agent"},{"line_number":365,"context_line":"        pass"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    def update_loadbalancer(self, context, loadbalancer):"},{"line_number":368,"context_line":"        # TODO(enikanorov): send update_loadbalancer message to the agent"},{"line_number":369,"context_line":"        pass"},{"line_number":370,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F92%2BU%3D","line":367,"updated":"2014-02-03 08:36:17.000000000","message":"need to pass old_loadbalancer too","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        # call create_loadbalancer on the agent"},{"line_number":365,"context_line":"        pass"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    def update_loadbalancer(self, context, loadbalancer):"},{"line_number":368,"context_line":"        # TODO(enikanorov): send update_loadbalancer message to the agent"},{"line_number":369,"context_line":"        pass"},{"line_number":370,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F92Jg%3D","line":367,"in_reply_to":"AAAAUH%2F92%2BU%3D","updated":"2014-02-03 11:28:41.000000000","message":"Done","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"}],"neutron/services/loadbalancer/drivers/noop/noop_driver.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Radware LTD."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pEY%3D","line":1,"updated":"2013-12-10 09:43:46.000000000","message":"the file added by mistake I believe","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Radware LTD."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9ifw%3D","line":1,"in_reply_to":"AAAATn%2F9pEY%3D","updated":"2013-12-10 13:21:12.000000000","message":"Done","commit_id":"b24363323d1dcf7a3eb1fe153ecb0961fa7ed1bf"}],"neutron/services/loadbalancer/plugin.py":[{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"f8119cadbe74cee3650b1e476beef84993dafb32","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        provider_name \u003d self._get_provider_name(context, p)"},{"line_number":201,"context_line":"        if p.get(\u0027loadbalancer_id\u0027,"},{"line_number":202,"context_line":"                 attrs.ATTR_NOT_SPECIFIED) \u003d\u003d attrs.ATTR_NOT_SPECIFIED:"},{"line_number":203,"context_line":"            # create loadbalancer first"},{"line_number":204,"context_line":"            lb_data \u003d {\u0027name\u0027: p[\u0027name\u0027],"},{"line_number":205,"context_line":"                       \u0027description\u0027: p[\u0027description\u0027],"},{"line_number":206,"context_line":"                       \u0027admin_state_up\u0027: p[\u0027admin_state_up\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9xmc%3D","line":203,"updated":"2013-12-06 03:20:31.000000000","message":"How about adding a comment saying this is for Havana API compatibility?\nIf a loadbalancer is automatically created this way, is it necessary to automatically delete it on delete_pool?","commit_id":"b864fcd27f046661a38b44c117fae1ce150a5006"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        provider_name \u003d self._get_provider_name(context, p)"},{"line_number":201,"context_line":"        if p.get(\u0027loadbalancer_id\u0027,"},{"line_number":202,"context_line":"                 attrs.ATTR_NOT_SPECIFIED) \u003d\u003d attrs.ATTR_NOT_SPECIFIED:"},{"line_number":203,"context_line":"            # create loadbalancer first"},{"line_number":204,"context_line":"            lb_data \u003d {\u0027name\u0027: p[\u0027name\u0027],"},{"line_number":205,"context_line":"                       \u0027description\u0027: p[\u0027description\u0027],"},{"line_number":206,"context_line":"                       \u0027admin_state_up\u0027: p[\u0027admin_state_up\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9xb4%3D","line":203,"in_reply_to":"AAAATn%2F9xmc%3D","updated":"2013-12-06 04:14:52.000000000","message":"I\u0027ll update the comment.\nNo, I think it should not be deleted automatically. In fact it could be used after pool deletion.","commit_id":"b864fcd27f046661a38b44c117fae1ce150a5006"},{"author":{"_account_id":7987,"name":"Ivar Lazzaro","email":"ivarlazzaro@gmail.com","username":"Ivar"},"unresolved":false,"context_lines":[{"line_number":86,"context_line":"    def _get_driver_for_provider(self, provider):"},{"line_number":87,"context_line":"        if provider in self.drivers:"},{"line_number":88,"context_line":"            return self.drivers[provider]"},{"line_number":89,"context_line":"        #print self.drivers"},{"line_number":90,"context_line":"        # raise if not associated (should never be reached)"},{"line_number":91,"context_line":"        raise n_exc.Invalid(_(\"Error retrieving driver for provider %s\") %"},{"line_number":92,"context_line":"                            provider)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9fr4%3D","line":89,"updated":"2013-12-10 23:01:55.000000000","message":"nit: space at the start of the comment","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    def _get_driver_for_provider(self, provider):"},{"line_number":87,"context_line":"        if provider in self.drivers:"},{"line_number":88,"context_line":"            return self.drivers[provider]"},{"line_number":89,"context_line":"        #print self.drivers"},{"line_number":90,"context_line":"        # raise if not associated (should never be reached)"},{"line_number":91,"context_line":"        raise n_exc.Invalid(_(\"Error retrieving driver for provider %s\") %"},{"line_number":92,"context_line":"                            provider)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FyXs%3D","line":89,"in_reply_to":"AAAATn%2F9fr4%3D","updated":"2014-01-08 13:30:12.000000000","message":"the comment is unnecessary","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _get_driver_for_loadbalancer(self, context, lb_id):"},{"line_number":103,"context_line":"        lb \u003d self.get_loadbalancer(context, lb_id)"},{"line_number":104,"context_line":"        #print \"LB\", lb"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            return self.drivers[lb[\u0027provider\u0027]]"},{"line_number":107,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9ddE%3D","line":104,"updated":"2013-12-11 09:43:30.000000000","message":"please remove","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _get_driver_for_loadbalancer(self, context, lb_id):"},{"line_number":103,"context_line":"        lb \u003d self.get_loadbalancer(context, lb_id)"},{"line_number":104,"context_line":"        #print \"LB\", lb"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            return self.drivers[lb[\u0027provider\u0027]]"},{"line_number":107,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FyXo%3D","line":104,"in_reply_to":"AAAATn%2F9ddE%3D","updated":"2014-01-08 13:30:12.000000000","message":"Done","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":7987,"name":"Ivar Lazzaro","email":"ivarlazzaro@gmail.com","username":"Ivar"},"unresolved":false,"context_lines":[{"line_number":156,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":157,"context_line":"            self.update_status(context, ldb.Loadbalancer,"},{"line_number":158,"context_line":"                               id, constants.PENDING_DELETE)"},{"line_number":159,"context_line":"            self._ensure_loadbalancer_delete_conditions("},{"line_number":160,"context_line":"                context, id)"},{"line_number":161,"context_line":"        lb \u003d self.get_loadbalancer(context, id)"},{"line_number":162,"context_line":"        driver \u003d self._get_driver_for_provider(lb[\u0027provider\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9fqs%3D","line":159,"updated":"2013-12-10 23:01:55.000000000","message":"The status update should not go through if the above method raises an exception... However, why calling update_status before validating that a delete is actually possible?","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":157,"context_line":"            self.update_status(context, ldb.Loadbalancer,"},{"line_number":158,"context_line":"                               id, constants.PENDING_DELETE)"},{"line_number":159,"context_line":"            self._ensure_loadbalancer_delete_conditions("},{"line_number":160,"context_line":"                context, id)"},{"line_number":161,"context_line":"        lb \u003d self.get_loadbalancer(context, id)"},{"line_number":162,"context_line":"        driver \u003d self._get_driver_for_provider(lb[\u0027provider\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FyXA%3D","line":159,"in_reply_to":"AAAATn%2F9fqs%3D","updated":"2014-01-08 13:30:12.000000000","message":"This is done specifically because actual status update happens when the transaction is committed at the end of with block.\nChecking delete conditions right before committing the transactions slightly reduces the chance of possible race (though it is unlikely case).","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":7987,"name":"Ivar Lazzaro","email":"ivarlazzaro@gmail.com","username":"Ivar"},"unresolved":false,"context_lines":[{"line_number":261,"context_line":"                               id, constants.PENDING_DELETE)"},{"line_number":262,"context_line":"            self._ensure_pool_delete_conditions(context, id)"},{"line_number":263,"context_line":"        p \u003d self.get_pool(context, id)"},{"line_number":264,"context_line":"        print \"FETCHED POOL: \", p"},{"line_number":265,"context_line":"        driver \u003d self._get_driver_for_provider(p[\u0027provider\u0027])"},{"line_number":266,"context_line":"        driver.delete_pool(context, p)"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9fps%3D","line":264,"updated":"2013-12-10 23:01:55.000000000","message":"should log it instead?","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":261,"context_line":"                               id, constants.PENDING_DELETE)"},{"line_number":262,"context_line":"            self._ensure_pool_delete_conditions(context, id)"},{"line_number":263,"context_line":"        p \u003d self.get_pool(context, id)"},{"line_number":264,"context_line":"        print \"FETCHED POOL: \", p"},{"line_number":265,"context_line":"        driver \u003d self._get_driver_for_provider(p[\u0027provider\u0027])"},{"line_number":266,"context_line":"        driver.delete_pool(context, p)"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FyW8%3D","line":264,"in_reply_to":"AAAATn%2F9fps%3D","updated":"2014-01-08 13:30:12.000000000","message":"will remove","commit_id":"a76fc652bfe7db382f5190cd0a8a7fe88167b40f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":103,"context_line":"        try:"},{"line_number":104,"context_line":"            return self.drivers[lb[\u0027provider\u0027]]"},{"line_number":105,"context_line":"        except KeyError:"},{"line_number":106,"context_line":"            raise n_exc.Invalid(_(\"Error retrieving provider for \""},{"line_number":107,"context_line":"                                  \"load balancer %s\") % lb_id)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def get_plugin_type(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtMA%3D","line":106,"updated":"2014-01-09 11:59:18.000000000","message":"retrieving driver?","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        try:"},{"line_number":104,"context_line":"            return self.drivers[lb[\u0027provider\u0027]]"},{"line_number":105,"context_line":"        except KeyError:"},{"line_number":106,"context_line":"            raise n_exc.Invalid(_(\"Error retrieving provider for \""},{"line_number":107,"context_line":"                                  \"load balancer %s\") % lb_id)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def get_plugin_type(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2Fs%2Fc%3D","line":106,"in_reply_to":"AAAAUH%2F%2FtMA%3D","updated":"2014-01-09 12:35:16.000000000","message":"i think both variants make sense. this one copies line 98","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":146,"context_line":"        except Exception:"},{"line_number":147,"context_line":"            # that should not happen"},{"line_number":148,"context_line":"            # if it\u0027s still a case - something goes wrong"},{"line_number":149,"context_line":"            # log the error and mark the pool as ERROR"},{"line_number":150,"context_line":"            LOG.error(_(\u0027Failed to delete loadbalancer %s, \u0027"},{"line_number":151,"context_line":"                        \u0027putting it in ERROR state\u0027), id)"},{"line_number":152,"context_line":"            with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtK8%3D","line":149,"updated":"2014-01-09 11:59:18.000000000","message":"nit: mark the loadbalancer ...","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        except Exception:"},{"line_number":147,"context_line":"            # that should not happen"},{"line_number":148,"context_line":"            # if it\u0027s still a case - something goes wrong"},{"line_number":149,"context_line":"            # log the error and mark the pool as ERROR"},{"line_number":150,"context_line":"            LOG.error(_(\u0027Failed to delete loadbalancer %s, \u0027"},{"line_number":151,"context_line":"                        \u0027putting it in ERROR state\u0027), id)"},{"line_number":152,"context_line":"            with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2Fs%2FY%3D","line":149,"in_reply_to":"AAAAUH%2F%2FtK8%3D","updated":"2014-01-09 12:35:16.000000000","message":"Done","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        #is removed from pool resource"},{"line_number":227,"context_line":"        p[\u0027provider\u0027] \u003d provider_name"},{"line_number":228,"context_line":"        driver \u003d self.drivers[provider_name]"},{"line_number":229,"context_line":"        driver.create_pool(context, p)"},{"line_number":230,"context_line":"        return p"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def update_pool(self, context, id, pool):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BE%2F8%3D","line":229,"updated":"2014-01-30 11:57:06.000000000","message":"need to call driver.create_loadbalancer() as well","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":226,"context_line":"        #is removed from pool resource"},{"line_number":227,"context_line":"        p[\u0027provider\u0027] \u003d provider_name"},{"line_number":228,"context_line":"        driver \u003d self.drivers[provider_name]"},{"line_number":229,"context_line":"        driver.create_pool(context, p)"},{"line_number":230,"context_line":"        return p"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def update_pool(self, context, id, pool):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F92%2BQ%3D","line":229,"in_reply_to":"AAAAUH%2F%2BE%2F8%3D","updated":"2014-02-03 08:36:17.000000000","message":"please also call driver.delete_loadbalancer() on pool deletion","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        #is removed from pool resource"},{"line_number":227,"context_line":"        p[\u0027provider\u0027] \u003d provider_name"},{"line_number":228,"context_line":"        driver \u003d self.drivers[provider_name]"},{"line_number":229,"context_line":"        driver.create_pool(context, p)"},{"line_number":230,"context_line":"        return p"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def update_pool(self, context, id, pool):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F92JY%3D","line":229,"in_reply_to":"AAAAUH%2F92%2BQ%3D","updated":"2014-02-03 11:28:41.000000000","message":"sure","commit_id":"fbb3ce57ae02de0af27674793682cac872d3025e"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":228,"context_line":"                }"},{"line_number":229,"context_line":"                lb \u003d self.create_loadbalancer(context,"},{"line_number":230,"context_line":"                                              {\u0027loadbalancer\u0027: lb_data})"},{"line_number":231,"context_line":"                p[\u0027loadbalancer_id\u0027] \u003d lb[\u0027id\u0027]"},{"line_number":232,"context_line":"            p \u003d super(LoadBalancerPlugin, self).create_pool(context, pool)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        #TODO(enikanorov): remove this line in future when provider attribute"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9ZT0%3D","line":231,"updated":"2014-02-07 08:27:37.000000000","message":"Need to mark if a loadbalancer was automatically created here.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":228,"context_line":"                }"},{"line_number":229,"context_line":"                lb \u003d self.create_loadbalancer(context,"},{"line_number":230,"context_line":"                                              {\u0027loadbalancer\u0027: lb_data})"},{"line_number":231,"context_line":"                p[\u0027loadbalancer_id\u0027] \u003d lb[\u0027id\u0027]"},{"line_number":232,"context_line":"            p \u003d super(LoadBalancerPlugin, self).create_pool(context, pool)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        #TODO(enikanorov): remove this line in future when provider attribute"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F5f0%3D","line":231,"in_reply_to":"AAAAUH%2F9XYM%3D","updated":"2014-02-10 04:27:29.000000000","message":"Add a DB column such as \u0027autocreated\u0027 and set it True here.\nThen use the column to decide whether to call _try_delete_loadbalancer or not.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":228,"context_line":"                }"},{"line_number":229,"context_line":"                lb \u003d self.create_loadbalancer(context,"},{"line_number":230,"context_line":"                                              {\u0027loadbalancer\u0027: lb_data})"},{"line_number":231,"context_line":"                p[\u0027loadbalancer_id\u0027] \u003d lb[\u0027id\u0027]"},{"line_number":232,"context_line":"            p \u003d super(LoadBalancerPlugin, self).create_pool(context, pool)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        #TODO(enikanorov): remove this line in future when provider attribute"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9XYM%3D","line":231,"in_reply_to":"AAAAUH%2F9ZT0%3D","updated":"2014-02-08 13:37:41.000000000","message":"what do you mean?","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"unresolved":false,"context_lines":[{"line_number":228,"context_line":"                }"},{"line_number":229,"context_line":"                lb \u003d self.create_loadbalancer(context,"},{"line_number":230,"context_line":"                                              {\u0027loadbalancer\u0027: lb_data})"},{"line_number":231,"context_line":"                p[\u0027loadbalancer_id\u0027] \u003d lb[\u0027id\u0027]"},{"line_number":232,"context_line":"            p \u003d super(LoadBalancerPlugin, self).create_pool(context, pool)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        #TODO(enikanorov): remove this line in future when provider attribute"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F2Sc%3D","line":231,"in_reply_to":"AAAAUX%2F%2F3jI%3D","updated":"2014-02-10 13:06:20.000000000","message":"Then you might want to avoid publishing /loadbalancers API and keep the loadbalancer DB resource as implementation detail for now.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":228,"context_line":"                }"},{"line_number":229,"context_line":"                lb \u003d self.create_loadbalancer(context,"},{"line_number":230,"context_line":"                                              {\u0027loadbalancer\u0027: lb_data})"},{"line_number":231,"context_line":"                p[\u0027loadbalancer_id\u0027] \u003d lb[\u0027id\u0027]"},{"line_number":232,"context_line":"            p \u003d super(LoadBalancerPlugin, self).create_pool(context, pool)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        #TODO(enikanorov): remove this line in future when provider attribute"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2F3jI%3D","line":231,"in_reply_to":"AAAAUX%2F%2F5f0%3D","updated":"2014-02-10 09:29:58.000000000","message":"No, I think we don\u0027t need this. We can move to more explicit workflow in the next release, but current workflow that starts with creating the pool, is more convenient and has less steps. LB instance is only used when you create more complex configuration (several pools, vips). I\u0027m not sure support for more complex configurations will land in Icehouse, so preserving existing workflow is an important goal of this patch.","commit_id":"5c327c24f20764741cd8988e21ff45e9632b0ee3"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":226,"context_line":"                    \u0027description\u0027: p[\u0027description\u0027],"},{"line_number":227,"context_line":"                    \u0027admin_state_up\u0027: p[\u0027admin_state_up\u0027]"},{"line_number":228,"context_line":"                }"},{"line_number":229,"context_line":"                lb \u003d self.create_loadbalancer(context,"},{"line_number":230,"context_line":"                                              {\u0027loadbalancer\u0027: lb_data})"},{"line_number":231,"context_line":"                p[\u0027loadbalancer_id\u0027] \u003d lb[\u0027id\u0027]"},{"line_number":232,"context_line":"            p \u003d super(LoadBalancerPlugin, self).create_pool(context, pool)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2F2Ko%3D","line":229,"updated":"2014-02-10 13:06:37.000000000","message":"This method has calls to driver which may have rpc calls to agent which is not a good thing to do inside a transaction","commit_id":"83e287513efb283a8da4f7d952a6dba8924a3907"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":226,"context_line":"                    \u0027description\u0027: p[\u0027description\u0027],"},{"line_number":227,"context_line":"                    \u0027admin_state_up\u0027: p[\u0027admin_state_up\u0027]"},{"line_number":228,"context_line":"                }"},{"line_number":229,"context_line":"                lb \u003d self.create_loadbalancer(context,"},{"line_number":230,"context_line":"                                              {\u0027loadbalancer\u0027: lb_data})"},{"line_number":231,"context_line":"                p[\u0027loadbalancer_id\u0027] \u003d lb[\u0027id\u0027]"},{"line_number":232,"context_line":"            p \u003d super(LoadBalancerPlugin, self).create_pool(context, pool)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2F2Ck%3D","line":229,"in_reply_to":"AAAAUX%2F%2F2Ko%3D","updated":"2014-02-10 13:23:11.000000000","message":"Done","commit_id":"83e287513efb283a8da4f7d952a6dba8924a3907"}],"neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":293,"context_line":"        if not fmt:"},{"line_number":294,"context_line":"            fmt \u003d self.fmt"},{"line_number":295,"context_line":"        res \u003d self._create_pool(fmt,"},{"line_number":296,"context_line":"                                None,"},{"line_number":297,"context_line":"                                name,"},{"line_number":298,"context_line":"                                lb_method,"},{"line_number":299,"context_line":"                                protocol,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtII%3D","line":296,"updated":"2014-01-09 11:59:18.000000000","message":"loadbalancer_id?","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        if not fmt:"},{"line_number":294,"context_line":"            fmt \u003d self.fmt"},{"line_number":295,"context_line":"        res \u003d self._create_pool(fmt,"},{"line_number":296,"context_line":"                                None,"},{"line_number":297,"context_line":"                                name,"},{"line_number":298,"context_line":"                                lb_method,"},{"line_number":299,"context_line":"                                protocol,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2Fs%2Bc%3D","line":296,"in_reply_to":"AAAAUH%2F%2FtII%3D","updated":"2014-01-09 12:35:16.000000000","message":"Done","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":770,"context_line":"            l \u003d self.deserialize("},{"line_number":771,"context_line":"                self.fmt,"},{"line_number":772,"context_line":"                req.get_response(self.ext_api))"},{"line_number":773,"context_line":"            print l"},{"line_number":774,"context_line":"            self.assertEqual(len(l[\u0027loadbalancer\u0027][\u0027pools\u0027]), 1)"},{"line_number":775,"context_line":"            self.assertEqual(l[\u0027loadbalancer\u0027][\u0027pools\u0027][0], pool[\u0027pool\u0027][\u0027id\u0027])"},{"line_number":776,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtHs%3D","line":773,"updated":"2014-01-09 11:59:18.000000000","message":"please cleanup","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":770,"context_line":"            l \u003d self.deserialize("},{"line_number":771,"context_line":"                self.fmt,"},{"line_number":772,"context_line":"                req.get_response(self.ext_api))"},{"line_number":773,"context_line":"            print l"},{"line_number":774,"context_line":"            self.assertEqual(len(l[\u0027loadbalancer\u0027][\u0027pools\u0027]), 1)"},{"line_number":775,"context_line":"            self.assertEqual(l[\u0027loadbalancer\u0027][\u0027pools\u0027][0], pool[\u0027pool\u0027][\u0027id\u0027])"},{"line_number":776,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2Fs%2BM%3D","line":773,"in_reply_to":"AAAAUH%2F%2FtHs%3D","updated":"2014-01-09 12:35:16.000000000","message":"Done","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":1633,"context_line":"                SystemExit,"},{"line_number":1634,"context_line":"                loadbalancer_plugin.LoadBalancerPlugin"},{"line_number":1635,"context_line":"            )"},{"line_number":1636,"context_line":"        #self.fail()"},{"line_number":1637,"context_line":""},{"line_number":1638,"context_line":"    def test_create_loadbalancer(self):"},{"line_number":1639,"context_line":"        with self.loadbalancer() as lb:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FtHc%3D","line":1636,"updated":"2014-01-09 11:59:18.000000000","message":"ditto","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":1633,"context_line":"                SystemExit,"},{"line_number":1634,"context_line":"                loadbalancer_plugin.LoadBalancerPlugin"},{"line_number":1635,"context_line":"            )"},{"line_number":1636,"context_line":"        #self.fail()"},{"line_number":1637,"context_line":""},{"line_number":1638,"context_line":"    def test_create_loadbalancer(self):"},{"line_number":1639,"context_line":"        with self.loadbalancer() as lb:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2Fs%2BA%3D","line":1636,"in_reply_to":"AAAAUH%2F%2FtHc%3D","updated":"2014-01-09 12:35:16.000000000","message":"Done","commit_id":"81d3757f69b27ce8d36671094942b52653cf8e80"}],"neutron/tests/unit/services/loadbalancer/test_loadbalancer_plugin.py":[{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"f8119cadbe74cee3650b1e476beef84993dafb32","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        data \u003d {\u0027pool\u0027: {\u0027name\u0027: \u0027pool1\u0027,"},{"line_number":199,"context_line":"                         \u0027description\u0027: \u0027descr_pool1\u0027,"},{"line_number":200,"context_line":"                         \u0027subnet_id\u0027: _uuid(),"},{"line_number":201,"context_line":"                         \u0027loadbalancer_id\u0027: _uuid(),"},{"line_number":202,"context_line":"                         \u0027protocol\u0027: \u0027HTTP\u0027,"},{"line_number":203,"context_line":"                         \u0027lb_method\u0027: \u0027ROUND_ROBIN\u0027,"},{"line_number":204,"context_line":"                         \u0027health_monitors\u0027: [hm_id],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9xlw%3D","line":201,"updated":"2013-12-06 03:20:31.000000000","message":"I think this test code should remain to test the old API, and another test function needs to be created for the new API with a loadbalancer_id.","commit_id":"b864fcd27f046661a38b44c117fae1ce150a5006"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"92f04e1bca7b8e49646459fa2c9a97d3423a0a94","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        data \u003d {\u0027pool\u0027: {\u0027name\u0027: \u0027pool1\u0027,"},{"line_number":199,"context_line":"                         \u0027description\u0027: \u0027descr_pool1\u0027,"},{"line_number":200,"context_line":"                         \u0027subnet_id\u0027: _uuid(),"},{"line_number":201,"context_line":"                         \u0027loadbalancer_id\u0027: _uuid(),"},{"line_number":202,"context_line":"                         \u0027protocol\u0027: \u0027HTTP\u0027,"},{"line_number":203,"context_line":"                         \u0027lb_method\u0027: \u0027ROUND_ROBIN\u0027,"},{"line_number":204,"context_line":"                         \u0027health_monitors\u0027: [hm_id],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9xbo%3D","line":201,"in_reply_to":"AAAATn%2F9xlw%3D","updated":"2013-12-06 04:14:52.000000000","message":"agree","commit_id":"b864fcd27f046661a38b44c117fae1ce150a5006"}]}
