)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"9. Keepalived/HAproxy check scripts"},{"line_number":18,"context_line":"10. Unit/Functional Tests"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: Ic4e04594e114ba682088d68d5f1af3f8f376db83"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"fa1b9901_6fc5358c","line":20,"updated":"2015-08-26 04:17:04.000000000","message":"i think this commit message should be an entire white paper considering the reviews size :).\n\nAnyway, as someone who reviews a decent amount, I\u0027ve grown to really rely on commit messages explaining at a high level what the review is supposed to do and some decisions behind it.  I\u0027ve realized that bulleted lists of what was done isn\u0027t very informative.  I\u0027m guilty of doing those in the past as well.  Could you give a more detailed, paragraph form commit message?  Being that this is a ginormous review, I understand you can\u0027t explain everything, but touching on some of the major pieces and decisions would go a long way.\n\nI\u0027m as guilty as anyone about pushing up giant code reviews, I\u0027ve done many myself and sometimes it is a necessity.  I suppose this is my penance.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"9. Keepalived/HAproxy check scripts"},{"line_number":18,"context_line":"10. Unit/Functional Tests"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: Ic4e04594e114ba682088d68d5f1af3f8f376db83"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"da20952f_d324ccb0","line":20,"in_reply_to":"fa1b9901_6fc5358c","updated":"2015-08-26 19:57:59.000000000","message":"The only reason for this sinful enormous patch is my limited time to have a decent working patch rather than an easily reviewable small ones :)\n\nI will rewrite the commit message as you suggested. And If you would like, we can have a short meeting discussing important parts of this patch with all potential reviewers.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17419,"name":"Banashankar k","email":"banveerad@gmail.com","username":"banveerad"},"change_message_id":"f92b687c1e37c9d8dd07d28381f3c160730ed530","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"1. The patch introduces new flows and subflows to create M amphorae. The"},{"line_number":15,"context_line":"controller worker parses the loadbalancer_topology configuration. If the"},{"line_number":16,"context_line":"oadbalancer_topology value is ACTIVE_STANDBY, the controller invokes a new flow"},{"line_number":17,"context_line":"independent from the SINGLE topology case, which is left untouched. The new"},{"line_number":18,"context_line":"flow uses conditional taskflows to check for spare amphorae at runtime. This"},{"line_number":19,"context_line":"removes the need for the exception workaround we earlier had. The controller"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":27,"id":"da20952f_6d81e64c","line":16,"updated":"2015-09-10 23:35:36.000000000","message":"typo oadbalancer_topology.","commit_id":"6e314f509776e53edf0bfbacf840573834437c58"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"5eabe8948d7dec1bd6f09a34fe21a6f3fec77a85","unresolved":false,"context_lines":[{"line_number":44,"context_line":"lightweight check script for Haproxy were introduced along with changes in the"},{"line_number":45,"context_line":"amphora agent installation script."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"5. The VRRP requires enabling protocol 112 for Master/Backup advertisments, and"},{"line_number":48,"context_line":"enabling protocol 51 for authentication header. This patch enables these"},{"line_number":49,"context_line":"protocols as needed in the loadbalancer security group."},{"line_number":50,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"da85f559_a8209d4a","line":47,"updated":"2015-11-08 08:59:05.000000000","message":"s/advertisments/advertisements/","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead3eb8af632b898332c40daaf8be8e74a742d42","unresolved":false,"context_lines":[{"line_number":44,"context_line":"lightweight check script for Haproxy were introduced along with changes in the"},{"line_number":45,"context_line":"amphora agent installation script."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"5. The VRRP requires enabling protocol 112 for Master/Backup advertisments, and"},{"line_number":48,"context_line":"enabling protocol 51 for authentication header. This patch enables these"},{"line_number":49,"context_line":"protocols as needed in the loadbalancer security group."},{"line_number":50,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"da85f559_600dae3d","line":47,"in_reply_to":"da85f559_a8209d4a","updated":"2015-11-10 00:57:45.000000000","message":"Done","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":41,"context_line":"scripts found in a predefined directory. The keepalived driver is a Mixin that"},{"line_number":42,"context_line":"can be plugged in other services\u0027 drivers. It is the responsibility of these"},{"line_number":43,"context_line":"services drivers to introduce their own check scripts. In this patch a"},{"line_number":44,"context_line":"lightweight check script for Haproxy were introduced along with changes in the"},{"line_number":45,"context_line":"amphora agent installation script."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"5. The VRRP requires enabling protocol 112 for Master/Backup advertisements,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"ba8a016a_5ef5d980","line":44,"updated":"2015-11-17 21:56:10.000000000","message":"s/were/was/","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":41,"context_line":"scripts found in a predefined directory. The keepalived driver is a Mixin that"},{"line_number":42,"context_line":"can be plugged in other services\u0027 drivers. It is the responsibility of these"},{"line_number":43,"context_line":"services drivers to introduce their own check scripts. In this patch a"},{"line_number":44,"context_line":"lightweight check script for Haproxy were introduced along with changes in the"},{"line_number":45,"context_line":"amphora agent installation script."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"5. The VRRP requires enabling protocol 112 for Master/Backup advertisements,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"ba8a016a_b9f62ef7","line":44,"in_reply_to":"ba8a016a_5ef5d980","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":34,"context_line":"configuration renders the peer section in the Haproxy configuration and assigns"},{"line_number":35,"context_line":"short names to the amphorae as listener peers. As listeners implies different"},{"line_number":36,"context_line":"Haproxy process, each listener synchronizes on a different port evaluated as"},{"line_number":37,"context_line":"BASE_PORT (1024) + NUMBER_OF_LISTENERS"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"4. This patch introduces a new Jinja configuration templater and a REST driver"},{"line_number":40,"context_line":"for Keepalived (developed as a Mixin). By default, Keepalived runs \"all\" check"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":43,"id":"ba8a016a_3fc00c7c","line":37,"updated":"2015-11-23 22:08:37.000000000","message":"Will check on this later in the code, but what is the appropriate behavior if a user does the following:\n\n 1. Create Listener A\n 2. Create Listener B\n 3. Delete Listener A\n 4. Create Listener C\n\nWon\u0027t listener B and C end up with the same peer port?  (ie. shouldn\u0027t we simply be tracking the synchronization port per listener instead of going with a rule which breaks pretty quickly like the above?","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"}],"elements/amphora-agent/install.d/75-run_setup_install":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"36ff09efc393bc2de172e7e9e3571890b07155cc","unresolved":false,"context_lines":[{"line_number":4,"context_line":"install-packages libffi-dev libssl-dev"},{"line_number":5,"context_line":"cd /opt/amphora-agent/"},{"line_number":6,"context_line":"git fetch https://review.openstack.org/openstack/octavia refs/changes/52/206252/7 \u0026\u0026 git checkout FETCH_HEAD"},{"line_number":7,"context_line":"git checkout -b active_standby_test"},{"line_number":8,"context_line":"pip install -r requirements.txt"},{"line_number":9,"context_line":"python setup.py install"},{"line_number":10,"context_line":"cp etc/init/octavia-agent.conf /etc/init/"}],"source_content_type":"application/x-shellscript","patch_set":8,"id":"1a4dcd0f_42b97d2d","line":7,"updated":"2015-08-11 00:05:58.000000000","message":"mmh, better leave that off the review","commit_id":"70c62a42fb11a61c6da7a848b734e00484feda4a"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"715fd497c12c3f1dd0c01e1f58cc18a25b757b09","unresolved":false,"context_lines":[{"line_number":4,"context_line":"install-packages libffi-dev libssl-dev"},{"line_number":5,"context_line":"cd /opt/amphora-agent/"},{"line_number":6,"context_line":"git fetch https://review.openstack.org/openstack/octavia refs/changes/52/206252/7 \u0026\u0026 git checkout FETCH_HEAD"},{"line_number":7,"context_line":"git checkout -b active_standby_test"},{"line_number":8,"context_line":"pip install -r requirements.txt"},{"line_number":9,"context_line":"python setup.py install"},{"line_number":10,"context_line":"cp etc/init/octavia-agent.conf /etc/init/"}],"source_content_type":"application/x-shellscript","patch_set":8,"id":"1a4dcd0f_835af4f0","line":7,"in_reply_to":"1a4dcd0f_42b97d2d","updated":"2015-08-11 18:26:07.000000000","message":"Just there for testing, I will remove it in the next batch.","commit_id":"70c62a42fb11a61c6da7a848b734e00484feda4a"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"f5e0d0d1c35cb704c7e467b325f178d6fe200e50","unresolved":false,"context_lines":[{"line_number":9,"context_line":"mkdir /etc/octavia"},{"line_number":10,"context_line":"# we assume certs, etc will come in through the config drive"},{"line_number":11,"context_line":"mkdir /etc/octavia/certs"},{"line_number":12,"context_line":"mkdir /var/lib/octavia"}],"source_content_type":"application/x-shellscript","patch_set":33,"id":"da85f559_88e4b93b","line":12,"updated":"2015-11-08 08:51:04.000000000","message":"Not related.","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead3eb8af632b898332c40daaf8be8e74a742d42","unresolved":false,"context_lines":[{"line_number":9,"context_line":"mkdir /etc/octavia"},{"line_number":10,"context_line":"# we assume certs, etc will come in through the config drive"},{"line_number":11,"context_line":"mkdir /etc/octavia/certs"},{"line_number":12,"context_line":"mkdir /var/lib/octavia"}],"source_content_type":"application/x-shellscript","patch_set":33,"id":"da85f559_2007a61d","line":12,"in_reply_to":"da85f559_88e4b93b","updated":"2015-11-10 00:57:45.000000000","message":"Done","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"}],"elements/amphora-agent/source-repository-amphora-agent":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"eb4e38ca609466fe863119312df0cfdef3c61037","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# This is temporary until we have a pip package"},{"line_number":2,"context_line":"amphora-agent git /opt/amphora-agent https://review.openstack.org/openstack/octavia refs/changes/52/206252/52"}],"source_content_type":"application/octet-stream","patch_set":53,"id":"7a740942_a631a5ee","line":2,"updated":"2015-12-03 22:36:40.000000000","message":"Do we want to merge this in this form? I guess it was important for testing but this would essentially pin our agent...","commit_id":"15d018bc73270e100588048c94e4f82178c25987"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"8ab4f3fa2d629ad7c5d9784a2e60a53b7d9f98f2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# This is temporary until we have a pip package"},{"line_number":2,"context_line":"amphora-agent git /opt/amphora-agent https://review.openstack.org/openstack/octavia refs/changes/52/206252/52"}],"source_content_type":"application/octet-stream","patch_set":53,"id":"7a740942_3904fa7c","line":2,"in_reply_to":"7a740942_a631a5ee","updated":"2015-12-03 22:42:49.000000000","message":"Nevermind, Brandon pointed out this is the thing you were talking about earlier in IRC, and is done on purpose and fixed in a followup. Got it.","commit_id":"15d018bc73270e100588048c94e4f82178c25987"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"58a9967c894af16ebb1ea2a517df4f3044b3baf1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# This is temporary until we have a pip package"},{"line_number":2,"context_line":"amphora-agent git /opt/amphora-agent https://review.openstack.org/openstack/octavia refs/changes/52/206252/52"}],"source_content_type":"application/octet-stream","patch_set":53,"id":"7a740942_59e226d7","line":2,"in_reply_to":"7a740942_a631a5ee","updated":"2015-12-03 22:50:38.000000000","message":"This was requested by your colleague blogan so it would pass the scenario gate.  I put in a dependent patch that pulls it out.","commit_id":"15d018bc73270e100588048c94e4f82178c25987"}],"elements/vrrp-octavia/source-repository-vrrp-octavia":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"eb4e38ca609466fe863119312df0cfdef3c61037","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Clone source for keepalived version 1.2.19. Correct version is in"},{"line_number":2,"context_line":"# the installation script"},{"line_number":3,"context_line":"vrrp-octavia git /opt/vrrp-octavia https://github.com/acassen/keepalived"}],"source_content_type":"application/octet-stream","patch_set":53,"id":"7a740942_a65f650d","line":1,"updated":"2015-12-03 22:36:40.000000000","message":"Really no point in specifying a version here -- since that is taken care of in the other file, and technically all you\u0027re doing is checking out a repo which is versionless.","commit_id":"15d018bc73270e100588048c94e4f82178c25987"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"58a9967c894af16ebb1ea2a517df4f3044b3baf1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Clone source for keepalived version 1.2.19. Correct version is in"},{"line_number":2,"context_line":"# the installation script"},{"line_number":3,"context_line":"vrrp-octavia git /opt/vrrp-octavia https://github.com/acassen/keepalived"}],"source_content_type":"application/octet-stream","patch_set":53,"id":"7a740942_19033e75","line":1,"in_reply_to":"7a740942_a65f650d","updated":"2015-12-03 22:50:38.000000000","message":"Yeah.  Plus, this goes away in the dependent patch now that Ubuntu backported for us.","commit_id":"15d018bc73270e100588048c94e4f82178c25987"}],"etc/octavia.conf":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":117,"context_line":"# cert_generator \u003d local_cert_generator"},{"line_number":118,"context_line":"#"},{"line_number":119,"context_line":"# Load balancer topology options are SINGLE, ACTIVE_STANDBY"},{"line_number":120,"context_line":"# loadbalancer_topology \u003d ACTIVE_STANDBY"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"[task_flow]"},{"line_number":123,"context_line":"# engine \u003d serial"}],"source_content_type":"text/plain","patch_set":23,"id":"da20952f_106d47cc","line":120,"updated":"2015-09-02 00:49:43.000000000","message":"The default should be SINGLE","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":117,"context_line":"# cert_generator \u003d local_cert_generator"},{"line_number":118,"context_line":"#"},{"line_number":119,"context_line":"# Load balancer topology options are SINGLE, ACTIVE_STANDBY"},{"line_number":120,"context_line":"# loadbalancer_topology \u003d ACTIVE_STANDBY"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"[task_flow]"},{"line_number":123,"context_line":"# engine \u003d serial"}],"source_content_type":"text/plain","patch_set":23,"id":"da20952f_7e950531","line":120,"in_reply_to":"da20952f_106d47cc","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":107,"context_line":"# Change for production to a ram drive"},{"line_number":108,"context_line":"# haproxy_cert_dir \u003d /tmp"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"# Maximum number of entries that can fit in the stick table."},{"line_number":111,"context_line":"# The size supports \"k\", \"m\", \"g\" suffixes."},{"line_number":112,"context_line":"# haproxy_stick_table_size \u003d 10k"},{"line_number":113,"context_line":""}],"source_content_type":"text/plain","patch_set":43,"id":"ba8a016a_fa8e12cf","line":110,"updated":"2015-11-23 22:08:37.000000000","message":"I assume by \"stick table\" we\u0027re referring to the maximum number of tracked connections, correct? Perhaps this comment could be more explicit about that?","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"be40a4acee0927d1a0f37434112443f69a4e1d82","unresolved":false,"context_lines":[{"line_number":107,"context_line":"# Change for production to a ram drive"},{"line_number":108,"context_line":"# haproxy_cert_dir \u003d /tmp"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"# Maximum number of entries that can fit in the stick table."},{"line_number":111,"context_line":"# The size supports \"k\", \"m\", \"g\" suffixes."},{"line_number":112,"context_line":"# haproxy_stick_table_size \u003d 10k"},{"line_number":113,"context_line":""}],"source_content_type":"text/plain","patch_set":43,"id":"9a8ffd7b_187772a0","line":110,"in_reply_to":"ba8a016a_fa8e12cf","updated":"2015-12-01 22:18:31.000000000","message":"\"stick table\" is the terminology from the HAProxy documentation and configuration file.  As this is in the haproxy specific part of the config I wanted to use consistent terminology.\nhttp://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4-stick-table","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"eb4e38ca609466fe863119312df0cfdef3c61037","unresolved":false,"context_lines":[{"line_number":190,"context_line":"# Service health check interval and success/fail count"},{"line_number":191,"context_line":"# VRRP_CHECK_INTERVAL \u003d 5"},{"line_number":192,"context_line":"# VRRP_FAIL_COUNT \u003d 2"},{"line_number":193,"context_line":"# VRRP_SUCCESS_COUNT \u003d 2"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"# Amphora MASTER gratuitous ARP refresh settings"},{"line_number":196,"context_line":"# vrrp_garp_refresh_interval \u003d 5"}],"source_content_type":"text/plain","patch_set":53,"id":"7a740942_26f855e5","line":193,"updated":"2015-12-03 22:36:40.000000000","message":"Are these all capitalized (inconsistent with the rest of our configs) because they are DIRECTLY from VRRP configs? I guess I\u0027m ok with that if that\u0027s the case, which I assume is right?","commit_id":"15d018bc73270e100588048c94e4f82178c25987"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"58a9967c894af16ebb1ea2a517df4f3044b3baf1","unresolved":false,"context_lines":[{"line_number":190,"context_line":"# Service health check interval and success/fail count"},{"line_number":191,"context_line":"# VRRP_CHECK_INTERVAL \u003d 5"},{"line_number":192,"context_line":"# VRRP_FAIL_COUNT \u003d 2"},{"line_number":193,"context_line":"# VRRP_SUCCESS_COUNT \u003d 2"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"# Amphora MASTER gratuitous ARP refresh settings"},{"line_number":196,"context_line":"# vrrp_garp_refresh_interval \u003d 5"}],"source_content_type":"text/plain","patch_set":53,"id":"7a740942_d9237604","line":193,"in_reply_to":"7a740942_26f855e5","updated":"2015-12-03 22:50:38.000000000","message":"They are settings that are passed through to the keepalived config.  Not sure why they are capitalized.  Enough for another patchset?","commit_id":"15d018bc73270e100588048c94e4f82178c25987"}],"octavia/amphorae/backends/agent/api_server/amphora_info.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"36ff09efc393bc2de172e7e9e3571890b07155cc","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        for i in netifaces.ifaddresses(interface)[netifaces.AF_INET]:"},{"line_number":146,"context_line":"            if i[\u0027addr\u0027] \u003d\u003d ip_addr:"},{"line_number":147,"context_line":"                return flask.make_response("},{"line_number":148,"context_line":"                    flask.jsonify(dict(message\u003d\u0027OK\u0027, interface\u003dinterface)), 202)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    return flask.make_response("},{"line_number":151,"context_line":"        flask.jsonify(dict(message\u003d\"Error IP address is not defined\")), 500)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_8296a592","line":148,"updated":"2015-08-11 00:05:58.000000000","message":"why does something named get return a 202?","commit_id":"70c62a42fb11a61c6da7a848b734e00484feda4a"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"715fd497c12c3f1dd0c01e1f58cc18a25b757b09","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        for i in netifaces.ifaddresses(interface)[netifaces.AF_INET]:"},{"line_number":146,"context_line":"            if i[\u0027addr\u0027] \u003d\u003d ip_addr:"},{"line_number":147,"context_line":"                return flask.make_response("},{"line_number":148,"context_line":"                    flask.jsonify(dict(message\u003d\u0027OK\u0027, interface\u003dinterface)), 202)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    return flask.make_response("},{"line_number":151,"context_line":"        flask.jsonify(dict(message\u003d\"Error IP address is not defined\")), 500)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_c38ebc2d","line":148,"in_reply_to":"1a4dcd0f_8296a592","updated":"2015-08-11 18:26:07.000000000","message":"It should be 200 though. I wanted to catch error cases if the IP is not defined on an interface.","commit_id":"70c62a42fb11a61c6da7a848b734e00484feda4a"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"715fd497c12c3f1dd0c01e1f58cc18a25b757b09","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        for i in netifaces.ifaddresses(interface)[netifaces.AF_INET]:"},{"line_number":146,"context_line":"            if i[\u0027addr\u0027] \u003d\u003d ip_addr:"},{"line_number":147,"context_line":"                return flask.make_response("},{"line_number":148,"context_line":"                    flask.jsonify(dict(message\u003d\u0027OK\u0027, interface\u003dinterface)), 202)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    return flask.make_response("},{"line_number":151,"context_line":"        flask.jsonify(dict(message\u003d\"Error IP address is not defined\")), 500)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_63cec82e","line":148,"in_reply_to":"1a4dcd0f_8296a592","updated":"2015-08-11 18:26:07.000000000","message":"It should be 200. There is an error case here that I wanted to catch","commit_id":"70c62a42fb11a61c6da7a848b734e00484feda4a"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"def get_interface(ip_addr):"},{"line_number":144,"context_line":"    for interface in netifaces.interfaces():"},{"line_number":145,"context_line":"        for i in netifaces.ifaddresses(interface)[netifaces.AF_INET]:"},{"line_number":146,"context_line":"            if i[\u0027addr\u0027] \u003d\u003d ip_addr:"},{"line_number":147,"context_line":"                return flask.make_response("}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_6d846b0a","line":144,"updated":"2015-08-25 21:32:31.000000000","message":"I think we should use pyroute2 to cut back on dependencies -- but that is minor and I probably need to do a refactor of all the netifaces code eventually","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"def get_interface(ip_addr):"},{"line_number":144,"context_line":"    for interface in netifaces.interfaces():"},{"line_number":145,"context_line":"        for i in netifaces.ifaddresses(interface)[netifaces.AF_INET]:"},{"line_number":146,"context_line":"            if i[\u0027addr\u0027] \u003d\u003d ip_addr:"},{"line_number":147,"context_line":"                return flask.make_response("}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_f34c7078","line":144,"in_reply_to":"fa1b9901_6d846b0a","updated":"2015-08-26 19:57:59.000000000","message":"Done","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    return networks"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"def get_interface(ip_addr):"},{"line_number":144,"context_line":"    for interface in netifaces.interfaces():"},{"line_number":145,"context_line":"        for i in netifaces.ifaddresses(interface)[netifaces.AF_INET]:"},{"line_number":146,"context_line":"            if i[\u0027addr\u0027] \u003d\u003d ip_addr:"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_e4ed368f","line":143,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    return networks"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"def get_interface(ip_addr):"},{"line_number":144,"context_line":"    for interface in netifaces.interfaces():"},{"line_number":145,"context_line":"        for i in netifaces.ifaddresses(interface)[netifaces.AF_INET]:"},{"line_number":146,"context_line":"            if i[\u0027addr\u0027] \u003d\u003d ip_addr:"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_72bd3967","line":143,"in_reply_to":"da20952f_e4ed368f","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"def get_interface(ip_addr):"},{"line_number":144,"context_line":"    for interface in netifaces.interfaces():"},{"line_number":145,"context_line":"        for i in netifaces.ifaddresses(interface)[netifaces.AF_INET]:"},{"line_number":146,"context_line":"            if i[\u0027addr\u0027] \u003d\u003d ip_addr:"},{"line_number":147,"context_line":"                return flask.make_response("},{"line_number":148,"context_line":"                    flask.jsonify(dict(message\u003d\u0027OK\u0027, interface\u003dinterface)),"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_d3a2799a","line":145,"updated":"2015-09-02 00:49:43.000000000","message":"We need to support IPv6 addresses as well, so AF_INET6 as well.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"def get_interface(ip_addr):"},{"line_number":144,"context_line":"    for interface in netifaces.interfaces():"},{"line_number":145,"context_line":"        for i in netifaces.ifaddresses(interface)[netifaces.AF_INET]:"},{"line_number":146,"context_line":"            if i[\u0027addr\u0027] \u003d\u003d ip_addr:"},{"line_number":147,"context_line":"                return flask.make_response("},{"line_number":148,"context_line":"                    flask.jsonify(dict(message\u003d\u0027OK\u0027, interface\u003dinterface)),"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_92c24de8","line":145,"in_reply_to":"da20952f_d3a2799a","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            flask.jsonify(dict(message\u003d\"Bad IP address version\")), 400)"},{"line_number":157,"context_line":"    for interface in netifaces.interfaces():"},{"line_number":158,"context_line":"        for i in netifaces.ifaddresses(interface)[address_format]:"},{"line_number":159,"context_line":"            if i[\u0027addr\u0027] \u003d\u003d ip_addr:"},{"line_number":160,"context_line":"                return flask.make_response("},{"line_number":161,"context_line":"                    flask.jsonify(dict(message\u003d\u0027OK\u0027, interface\u003dinterface)),"},{"line_number":162,"context_line":"                    200)"}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_fa2a928f","line":159,"updated":"2015-11-23 22:08:37.000000000","message":"Does this work for interfaces with multiple IP addresses as well?","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"be40a4acee0927d1a0f37434112443f69a4e1d82","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            flask.jsonify(dict(message\u003d\"Bad IP address version\")), 400)"},{"line_number":157,"context_line":"    for interface in netifaces.interfaces():"},{"line_number":158,"context_line":"        for i in netifaces.ifaddresses(interface)[address_format]:"},{"line_number":159,"context_line":"            if i[\u0027addr\u0027] \u003d\u003d ip_addr:"},{"line_number":160,"context_line":"                return flask.make_response("},{"line_number":161,"context_line":"                    flask.jsonify(dict(message\u003d\u0027OK\u0027, interface\u003dinterface)),"},{"line_number":162,"context_line":"                    200)"}],"source_content_type":"text/x-python","patch_set":43,"id":"9a8ffd7b_58ec1af3","line":159,"in_reply_to":"ba8a016a_fa2a928f","updated":"2015-12-01 22:18:31.000000000","message":"Yes.  The \"for i in netifaces.ifaddresses\" will iterate over all of the addresses on the interface.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"}],"octavia/amphorae/backends/agent/api_server/keepalived.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"36ff09efc393bc2de172e7e9e3571890b07155cc","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            text_file.write(text)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    res \u003d flask.make_response(flask.jsonify({"},{"line_number":60,"context_line":"        \u0027message\u0027: \u0027OK\u0027}), 202)"},{"line_number":61,"context_line":"    res.headers[\u0027ETag\u0027] \u003d stream.get_md5()"},{"line_number":62,"context_line":"    return res"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_e2cc49bd","line":60,"updated":"2015-08-11 00:05:58.000000000","message":"I think we can do 200 -- since it\u0027s uploaded...","commit_id":"70c62a42fb11a61c6da7a848b734e00484feda4a"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"715fd497c12c3f1dd0c01e1f58cc18a25b757b09","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            text_file.write(text)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    res \u003d flask.make_response(flask.jsonify({"},{"line_number":60,"context_line":"        \u0027message\u0027: \u0027OK\u0027}), 202)"},{"line_number":61,"context_line":"    res.headers[\u0027ETag\u0027] \u003d stream.get_md5()"},{"line_number":62,"context_line":"    return res"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_8384340b","line":60,"in_reply_to":"1a4dcd0f_e2cc49bd","updated":"2015-08-11 18:26:07.000000000","message":"Yeh 200","commit_id":"70c62a42fb11a61c6da7a848b734e00484feda4a"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"36ff09efc393bc2de172e7e9e3571890b07155cc","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    res \u003d flask.make_response(flask.jsonify({"},{"line_number":60,"context_line":"        \u0027message\u0027: \u0027OK\u0027}), 202)"},{"line_number":61,"context_line":"    res.headers[\u0027ETag\u0027] \u003d stream.get_md5()"},{"line_number":62,"context_line":"    return res"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_a2bf21fb","line":61,"updated":"2015-08-11 00:05:58.000000000","message":"not sure if you need the Etag for that one...","commit_id":"70c62a42fb11a61c6da7a848b734e00484feda4a"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"715fd497c12c3f1dd0c01e1f58cc18a25b757b09","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    res \u003d flask.make_response(flask.jsonify({"},{"line_number":60,"context_line":"        \u0027message\u0027: \u0027OK\u0027}), 202)"},{"line_number":61,"context_line":"    res.headers[\u0027ETag\u0027] \u003d stream.get_md5()"},{"line_number":62,"context_line":"    return res"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_23044048","line":61,"in_reply_to":"1a4dcd0f_a2bf21fb","updated":"2015-08-11 18:26:07.000000000","message":"I thought to have it as the keepalived configuration might change by another module that is extending the base configuration. May be too sophisticated (need to think about it)","commit_id":"70c62a42fb11a61c6da7a848b734e00484feda4a"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def upload_keepalived_config():"},{"line_number":40,"context_line":"    stream \u003d listener.Wrapped(flask.request.stream)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    if not os.path.exists(util.keepalived_dir()):"},{"line_number":43,"context_line":"        os.makedirs(util.keepalived_dir())"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_ed715b0d","line":40,"updated":"2015-08-25 21:32:31.000000000","message":"only needed if you need the md5 (see below)","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                details\u003de.output)), 500)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    res \u003d flask.make_response(flask.jsonify({"},{"line_number":87,"context_line":"        \u0027message\u0027: \u0027OK\u0027}), 200)"},{"line_number":88,"context_line":"    return res"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_4d8087bf","line":87,"updated":"2015-08-25 21:32:31.000000000","message":"Since you wrapped the stream you might want to return the etag -- otherwise no need to wrap...","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                details\u003de.output)), 500)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    res \u003d flask.make_response(flask.jsonify({"},{"line_number":87,"context_line":"        \u0027message\u0027: \u0027OK\u0027}), 200)"},{"line_number":88,"context_line":"    return res"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_538d1c7a","line":87,"in_reply_to":"fa1b9901_4d8087bf","updated":"2015-08-26 19:57:59.000000000","message":"Done","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":"KEEPALIVED_CONF \u003d \u0027keepalived.conf.j2\u0027"},{"line_number":31,"context_line":"CHECK_SCRIPT_CONF \u003d \u0027keepalived_check_script.conf.j2\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"j2_env \u003d jinja2.Environment(loader\u003djinja2.FileSystemLoader("},{"line_number":34,"context_line":"    os.path.dirname(os.path.realpath(__file__)) + consts.AGENT_API_TEMPLATES))"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_9380818d","line":31,"updated":"2015-09-02 00:49:43.000000000","message":"These should be in the constants file.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":"KEEPALIVED_CONF \u003d \u0027keepalived.conf.j2\u0027"},{"line_number":31,"context_line":"CHECK_SCRIPT_CONF \u003d \u0027keepalived_check_script.conf.j2\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"j2_env \u003d jinja2.Environment(loader\u003djinja2.FileSystemLoader("},{"line_number":34,"context_line":"    os.path.dirname(os.path.realpath(__file__)) + consts.AGENT_API_TEMPLATES))"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_d229a59c","line":31,"in_reply_to":"da20952f_9380818d","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":36,"context_line":"check_script_template \u003d j2_env.get_template(CHECK_SCRIPT_CONF)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def upload_keepalived_config():"},{"line_number":40,"context_line":"    stream \u003d listener.Wrapped(flask.request.stream)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    if not os.path.exists(util.keepalived_dir()):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_84fd5a3d","line":39,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":36,"context_line":"check_script_template \u003d j2_env.get_template(CHECK_SCRIPT_CONF)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def upload_keepalived_config():"},{"line_number":40,"context_line":"    stream \u003d listener.Wrapped(flask.request.stream)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    if not os.path.exists(util.keepalived_dir()):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_6b06a0cf","line":39,"in_reply_to":"da20952f_84fd5a3d","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        try:"},{"line_number":64,"context_line":"            subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":65,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":66,"context_line":"            LOG.debug(\"Failed to uplod keepalived configuration\")"},{"line_number":67,"context_line":"            return flask.make_response(flask.jsonify(dict("},{"line_number":68,"context_line":"                message\u003d\"Failed to uplod keepalived configuration\","},{"line_number":69,"context_line":"                details\u003de.output)), 500)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_661649a9","line":66,"updated":"2015-09-02 00:49:43.000000000","message":"nit: upload","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        try:"},{"line_number":64,"context_line":"            subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":65,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":66,"context_line":"            LOG.debug(\"Failed to uplod keepalived configuration\")"},{"line_number":67,"context_line":"            return flask.make_response(flask.jsonify(dict("},{"line_number":68,"context_line":"                message\u003d\"Failed to uplod keepalived configuration\","},{"line_number":69,"context_line":"                details\u003de.output)), 500)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_5214b54b","line":66,"in_reply_to":"da20952f_661649a9","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    try:"},{"line_number":104,"context_line":"        subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":105,"context_line":"    except subprocess.CalledProcessError as e:"},{"line_number":106,"context_line":"        LOG.debug(\"Failed to {0} keepalived service: {1}\".format(action, e))"},{"line_number":107,"context_line":"        return flask.make_response(flask.jsonify(dict("},{"line_number":108,"context_line":"            message\u003d\"Error {0}ing keepalived\".format(action),"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_44f74259","line":105,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test code branch","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    try:"},{"line_number":104,"context_line":"        subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":105,"context_line":"    except subprocess.CalledProcessError as e:"},{"line_number":106,"context_line":"        LOG.debug(\"Failed to {0} keepalived service: {1}\".format(action, e))"},{"line_number":107,"context_line":"        return flask.make_response(flask.jsonify(dict("},{"line_number":108,"context_line":"            message\u003d\"Error {0}ing keepalived\".format(action),"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_158867c4","line":105,"in_reply_to":"da20952f_44f74259","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17419,"name":"Banashankar k","email":"banveerad@gmail.com","username":"banveerad"},"change_message_id":"f92b687c1e37c9d8dd07d28381f3c160730ed530","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":63,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":64,"context_line":"            LOG.debug(\"Failed to upload keepalived configuration\")"},{"line_number":65,"context_line":"            return flask.make_response(flask.jsonify(dict("},{"line_number":66,"context_line":"                message\u003d\"Failed to upload keepalived configuration\","},{"line_number":67,"context_line":"                details\u003de.output)), 500)"}],"source_content_type":"text/x-python","patch_set":27,"id":"da20952f_09c6199c","line":64,"updated":"2015-09-10 23:35:36.000000000","message":"Isn\u0027t that better to have failed messages as the error logs ? it will be way easier to find them at the time of debugging.","commit_id":"6e314f509776e53edf0bfbacf840573834437c58"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2838cde8f120999babf024fcd5179f722b967e6","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":63,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":64,"context_line":"            LOG.debug(\"Failed to upload keepalived configuration\")"},{"line_number":65,"context_line":"            return flask.make_response(flask.jsonify(dict("},{"line_number":66,"context_line":"                message\u003d\"Failed to upload keepalived configuration\","},{"line_number":67,"context_line":"                details\u003de.output)), 500)"}],"source_content_type":"text/x-python","patch_set":27,"id":"da20952f_985111dc","line":64,"in_reply_to":"da20952f_09c6199c","updated":"2015-09-11 01:51:49.000000000","message":"We have REST response 500, which logs the error message.","commit_id":"6e314f509776e53edf0bfbacf840573834437c58"},{"author":{"_account_id":17419,"name":"Banashankar k","email":"banveerad@gmail.com","username":"banveerad"},"change_message_id":"f92b687c1e37c9d8dd07d28381f3c160730ed530","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            message\u003d\u0027Invalid Request\u0027,"},{"line_number":96,"context_line":"            details\u003d\"Unknown action: {0}\".format(action))), 400)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    cmd \u003d (\"/usr/sbin/service octavia-keepalived {action}\".format("},{"line_number":99,"context_line":"        action\u003daction))"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":27,"id":"da20952f_69cc7535","line":98,"updated":"2015-09-10 23:35:36.000000000","message":"should do something like util.keepalived_init_path() for this location also. Just to be consistent","commit_id":"6e314f509776e53edf0bfbacf840573834437c58"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"0ceb1ea6a4c46da6638db2d8edbd573489e4a8ac","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_35ceeb5a","line":1,"updated":"2015-11-18 00:33:48.000000000","message":"Enterprise","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_ac9d91bd","line":1,"in_reply_to":"ba8a016a_35ceeb5a","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":63,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":64,"context_line":"            LOG.debug(\"Failed to upload keepalived configuration\")"},{"line_number":65,"context_line":"            return flask.make_response(flask.jsonify(dict("},{"line_number":66,"context_line":"                message\u003d\"Failed to upload keepalived configuration\","},{"line_number":67,"context_line":"                details\u003de.output)), 500)"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_99ecbb90","line":64,"updated":"2015-11-17 21:56:10.000000000","message":"Wrong message. Exception is about chmod execution not upload process","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":63,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":64,"context_line":"            LOG.debug(\"Failed to upload keepalived configuration\")"},{"line_number":65,"context_line":"            return flask.make_response(flask.jsonify(dict("},{"line_number":66,"context_line":"                message\u003d\"Failed to upload keepalived configuration\","},{"line_number":67,"context_line":"                details\u003de.output)), 500)"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_acc91128","line":64,"in_reply_to":"ba8a016a_99ecbb90","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":64,"context_line":"            LOG.debug(\"Failed to upload keepalived configuration\")"},{"line_number":65,"context_line":"            return flask.make_response(flask.jsonify(dict("},{"line_number":66,"context_line":"                message\u003d\"Failed to upload keepalived configuration\","},{"line_number":67,"context_line":"                details\u003de.output)), 500)"},{"line_number":68,"context_line":"        # Renders the Keepalived check script"},{"line_number":69,"context_line":"        with open(util.keepalived_check_script_path(), \u0027w\u0027) as text_file:"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_f9fdc73a","line":66,"updated":"2015-11-17 21:56:10.000000000","message":"itto","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":64,"context_line":"            LOG.debug(\"Failed to upload keepalived configuration\")"},{"line_number":65,"context_line":"            return flask.make_response(flask.jsonify(dict("},{"line_number":66,"context_line":"                message\u003d\"Failed to upload keepalived configuration\","},{"line_number":67,"context_line":"                details\u003de.output)), 500)"},{"line_number":68,"context_line":"        # Renders the Keepalived check script"},{"line_number":69,"context_line":"        with open(util.keepalived_check_script_path(), \u0027w\u0027) as text_file:"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_6ccfa929","line":66,"in_reply_to":"ba8a016a_f9fdc73a","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        try:"},{"line_number":77,"context_line":"            subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":78,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":79,"context_line":"            LOG.debug(\"Failed to render VRRP check script\")"},{"line_number":80,"context_line":"            return flask.make_response(flask.jsonify(dict("},{"line_number":81,"context_line":"                message\u003d\"Failed to render VRRP check script\","},{"line_number":82,"context_line":"                details\u003de.output)), 500)"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_993fdbd5","line":79,"updated":"2015-11-17 21:56:10.000000000","message":"Wrong message. Render was already perform before.\nException here is about chmod only.","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        try:"},{"line_number":77,"context_line":"            subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":78,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":79,"context_line":"            LOG.debug(\"Failed to render VRRP check script\")"},{"line_number":80,"context_line":"            return flask.make_response(flask.jsonify(dict("},{"line_number":81,"context_line":"                message\u003d\"Failed to render VRRP check script\","},{"line_number":82,"context_line":"                details\u003de.output)), 500)"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_8cd44dbd","line":79,"in_reply_to":"ba8a016a_993fdbd5","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":79,"context_line":"            LOG.debug(\"Failed to render VRRP check script\")"},{"line_number":80,"context_line":"            return flask.make_response(flask.jsonify(dict("},{"line_number":81,"context_line":"                message\u003d\"Failed to render VRRP check script\","},{"line_number":82,"context_line":"                details\u003de.output)), 500)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    res \u003d flask.make_response(flask.jsonify({"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_99711be3","line":81,"updated":"2015-11-17 21:56:10.000000000","message":"itto","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":79,"context_line":"            LOG.debug(\"Failed to render VRRP check script\")"},{"line_number":80,"context_line":"            return flask.make_response(flask.jsonify(dict("},{"line_number":81,"context_line":"                message\u003d\"Failed to render VRRP check script\","},{"line_number":82,"context_line":"                details\u003de.output)), 500)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    res \u003d flask.make_response(flask.jsonify({"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_2cde81dd","line":81,"in_reply_to":"ba8a016a_99711be3","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    except subprocess.CalledProcessError as e:"},{"line_number":104,"context_line":"        LOG.debug(\"Failed to {0} keepalived service: {1}\".format(action, e))"},{"line_number":105,"context_line":"        return flask.make_response(flask.jsonify(dict("},{"line_number":106,"context_line":"            message\u003d\"Error {0}ing keepalived\".format(action),"},{"line_number":107,"context_line":"            details\u003de.output)), 500)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    return flask.make_response(flask.jsonify("}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_192c4baa","line":106,"updated":"2015-11-17 21:56:10.000000000","message":"spelling issue in case of stop action \u003d\u003e stoping","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    except subprocess.CalledProcessError as e:"},{"line_number":104,"context_line":"        LOG.debug(\"Failed to {0} keepalived service: {1}\".format(action, e))"},{"line_number":105,"context_line":"        return flask.make_response(flask.jsonify(dict("},{"line_number":106,"context_line":"            message\u003d\"Error {0}ing keepalived\".format(action),"},{"line_number":107,"context_line":"            details\u003de.output)), 500)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    return flask.make_response(flask.jsonify("}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_eca87922","line":106,"in_reply_to":"ba8a016a_192c4baa","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        cmd \u003d \"chmod +x {file}\".format(file\u003dutil.keepalived_init_path())"},{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":63,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":64,"context_line":"            LOG.debug(\"Failed to upload keepalived configuration. \""},{"line_number":65,"context_line":"                      \"Unable to chmod init script.\")"},{"line_number":66,"context_line":"            return flask.make_response(flask.jsonify(dict("}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_b5d65b25","line":63,"updated":"2015-11-23 22:08:37.000000000","message":"Should we attempt to roll back the keepalived configuration to whatever it was before?","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"be40a4acee0927d1a0f37434112443f69a4e1d82","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        cmd \u003d \"chmod +x {file}\".format(file\u003dutil.keepalived_init_path())"},{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":63,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":64,"context_line":"            LOG.debug(\"Failed to upload keepalived configuration. \""},{"line_number":65,"context_line":"                      \"Unable to chmod init script.\")"},{"line_number":66,"context_line":"            return flask.make_response(flask.jsonify(dict("}],"source_content_type":"text/x-python","patch_set":43,"id":"9a8ffd7b_167743a0","line":63,"in_reply_to":"ba8a016a_b5d65b25","updated":"2015-12-01 22:18:31.000000000","message":"Cattle not pets.  This failure will roll up to the flow which should handle failed amps.  In this case, if we can\u0027t chmod, I think nuke from above and build a new amp is the right answer.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            file\u003dutil.keepalived_check_script_path()))"},{"line_number":78,"context_line":"        try:"},{"line_number":79,"context_line":"            subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":80,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":81,"context_line":"            LOG.debug(\"Failed to upload keepalived configuration. \""},{"line_number":82,"context_line":"                      \"Unable to chmod check script.\")"},{"line_number":83,"context_line":"            return flask.make_response(flask.jsonify(dict("}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_b52f3b3d","line":80,"updated":"2015-11-23 22:08:37.000000000","message":"Should we also be attempting to remove the check script here as well? If the chmod fails (which, admittedly, is unlikely), we leave the check script around, right?)","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"be40a4acee0927d1a0f37434112443f69a4e1d82","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            file\u003dutil.keepalived_check_script_path()))"},{"line_number":78,"context_line":"        try:"},{"line_number":79,"context_line":"            subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":80,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":81,"context_line":"            LOG.debug(\"Failed to upload keepalived configuration. \""},{"line_number":82,"context_line":"                      \"Unable to chmod check script.\")"},{"line_number":83,"context_line":"            return flask.make_response(flask.jsonify(dict("}],"source_content_type":"text/x-python","patch_set":43,"id":"9a8ffd7b_366287d9","line":80,"in_reply_to":"ba8a016a_b52f3b3d","updated":"2015-12-01 22:18:31.000000000","message":"Same as above.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"}],"octavia/amphorae/backends/agent/api_server/listener.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":82,"context_line":"\"\"\""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def upload_haproxy_config(amphora_id, listener_id, peer_name):"},{"line_number":86,"context_line":"    stream \u003d Wrapped(flask.request.stream)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    if not os.path.exists(util.haproxy_dir(listener_id)):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_661c0978","line":85,"updated":"2015-09-02 00:49:43.000000000","message":"As noted in the spec, I would prefer peer_name to be in the VRRP code and not mixed in here where it may not be necessary.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":82,"context_line":"\"\"\""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def upload_haproxy_config(amphora_id, listener_id, peer_name):"},{"line_number":86,"context_line":"    stream \u003d Wrapped(flask.request.stream)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    if not os.path.exists(util.haproxy_dir(listener_id)):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_68d8b91e","line":85,"in_reply_to":"da20952f_661c0978","updated":"2015-09-04 23:24:59.000000000","message":"Removed","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    if not os.path.exists(util.upstart_path(listener_id)):"},{"line_number":115,"context_line":"        with open(util.upstart_path(listener_id), \u0027w\u0027) as text_file:"},{"line_number":116,"context_line":"            text \u003d template.render("},{"line_number":117,"context_line":"                amphora_id\u003dpeer_name,"},{"line_number":118,"context_line":"                haproxy_pid\u003dutil.pid_path(listener_id),"},{"line_number":119,"context_line":"                haproxy_cmd\u003dutil.CONF.haproxy_amphora.haproxy_cmd,"},{"line_number":120,"context_line":"                haproxy_cfg\u003dutil.config_path(listener_id),"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_a15d304a","line":117,"updated":"2015-09-02 00:49:43.000000000","message":"This should not be amphora_id as it is not the amphora UUID.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    if not os.path.exists(util.upstart_path(listener_id)):"},{"line_number":115,"context_line":"        with open(util.upstart_path(listener_id), \u0027w\u0027) as text_file:"},{"line_number":116,"context_line":"            text \u003d template.render("},{"line_number":117,"context_line":"                amphora_id\u003dpeer_name,"},{"line_number":118,"context_line":"                haproxy_pid\u003dutil.pid_path(listener_id),"},{"line_number":119,"context_line":"                haproxy_cmd\u003dutil.CONF.haproxy_amphora.haproxy_cmd,"},{"line_number":120,"context_line":"                haproxy_cfg\u003dutil.config_path(listener_id),"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_e8fa8976","line":117,"in_reply_to":"da20952f_a15d304a","updated":"2015-09-04 23:24:59.000000000","message":"Changed amphora_id to peer_name","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":384,"context_line":"    for listener_id in listener_ids:"},{"line_number":385,"context_line":"        args.append(util.haproxy_sock_path(listener_id))"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"    if not os.path.exists(util.keepalived_dir()):"},{"line_number":388,"context_line":"        os.makedirs(util.keepalived_dir())"},{"line_number":389,"context_line":"        os.makedirs(util.keepalived_check_scripts_dir())"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_a49e5e05","line":387,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test code branch","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":384,"context_line":"    for listener_id in listener_ids:"},{"line_number":385,"context_line":"        args.append(util.haproxy_sock_path(listener_id))"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"    if not os.path.exists(util.keepalived_dir()):"},{"line_number":388,"context_line":"        os.makedirs(util.keepalived_dir())"},{"line_number":389,"context_line":"        os.makedirs(util.keepalived_check_scripts_dir())"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_4bdf1c3a","line":387,"in_reply_to":"da20952f_a49e5e05","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"\"\"\"Upload the haproxy config"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":":param listener_id: The id of the listener"},{"line_number":83,"context_line":"\"\"\""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_f9c94779","line":82,"updated":"2015-11-17 21:56:10.000000000","message":":param amphora_id must be added","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"\"\"\"Upload the haproxy config"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":":param listener_id: The id of the listener"},{"line_number":83,"context_line":"\"\"\""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_073036e7","line":82,"in_reply_to":"ba8a016a_f9c94779","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    try:"},{"line_number":148,"context_line":"        subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":149,"context_line":"    except subprocess.CalledProcessError as e:"},{"line_number":150,"context_line":"        if \u0027Job is already running\u0027 not in e.output:"},{"line_number":151,"context_line":"            LOG.debug(\"Failed to %(action)s HAProxy service: %(err)s\","},{"line_number":152,"context_line":"                      {\u0027action\u0027: action, \u0027err\u0027: e})"},{"line_number":153,"context_line":"            return flask.make_response(flask.jsonify(dict("}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_995cbbee","line":150,"updated":"2015-11-17 21:56:10.000000000","message":"Not related","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"703f3245843353e8d841bcebe8058ad5ab418089","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    try:"},{"line_number":148,"context_line":"        subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":149,"context_line":"    except subprocess.CalledProcessError as e:"},{"line_number":150,"context_line":"        if \u0027Job is already running\u0027 not in e.output:"},{"line_number":151,"context_line":"            LOG.debug(\"Failed to %(action)s HAProxy service: %(err)s\","},{"line_number":152,"context_line":"                      {\u0027action\u0027: action, \u0027err\u0027: e})"},{"line_number":153,"context_line":"            return flask.make_response(flask.jsonify(dict("}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_0ed3a005","line":150,"in_reply_to":"ba8a016a_995cbbee","updated":"2015-11-17 22:27:54.000000000","message":"Actually it is related to this patch.  Without this the config deployment will fail for the secondary amphora.","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"def upload_haproxy_config(amphora_id, listener_id):"},{"line_number":88,"context_line":"    stream \u003d Wrapped(flask.request.stream)"},{"line_number":89,"context_line":"    peer_name \u003d octavia_utils.base64_sha1_string(amphora_id).rstrip(\u0027\u003d\u0027)"},{"line_number":90,"context_line":"    if not os.path.exists(util.haproxy_dir(listener_id)):"},{"line_number":91,"context_line":"        os.makedirs(util.haproxy_dir(listener_id))"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_52517e61","line":89,"updated":"2015-11-22 05:41:18.000000000","message":"why not just use the amphora id?  i tested out the -L option and it accepted an amphora\u0027s uuid.  not a thorough test by any means, but do tell the reason.  maybe it doesn\u0027t accept it in the config in that format?","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"def upload_haproxy_config(amphora_id, listener_id):"},{"line_number":88,"context_line":"    stream \u003d Wrapped(flask.request.stream)"},{"line_number":89,"context_line":"    peer_name \u003d octavia_utils.base64_sha1_string(amphora_id).rstrip(\u0027\u003d\u0027)"},{"line_number":90,"context_line":"    if not os.path.exists(util.haproxy_dir(listener_id)):"},{"line_number":91,"context_line":"        os.makedirs(util.haproxy_dir(listener_id))"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_79a902df","line":89,"in_reply_to":"ba8a016a_52517e61","updated":"2015-11-23 02:01:39.000000000","message":"Yeah, he was using the amphora ID before, however haproxy has a limit on the length of the peer string in the config and it will fail to start.  Thus the hashing games to get a unique string small enough and reproducible.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        os.makedirs(util.keepalived_dir())"},{"line_number":391,"context_line":"        os.makedirs(util.keepalived_check_scripts_dir())"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    cmd \u003d \u0027haproxy-vrrp-check \u0027 + \u0027 \u0027.join(args) + \u0027; exit $?\u0027"},{"line_number":394,"context_line":"    with open(util.haproxy_check_script_path(), \u0027w\u0027) as text_file:"},{"line_number":395,"context_line":"        text_file.write(cmd)"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_f248b2ce","line":393,"range":{"start_line":393,"start_character":38,"end_line":393,"end_character":42},"updated":"2015-11-22 05:41:18.000000000","message":"nit: string.format?","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        os.makedirs(util.keepalived_dir())"},{"line_number":391,"context_line":"        os.makedirs(util.keepalived_check_scripts_dir())"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    cmd \u003d \u0027haproxy-vrrp-check \u0027 + \u0027 \u0027.join(args) + \u0027; exit $?\u0027"},{"line_number":394,"context_line":"    with open(util.haproxy_check_script_path(), \u0027w\u0027) as text_file:"},{"line_number":395,"context_line":"        text_file.write(cmd)"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_79f7c2f5","line":393,"range":{"start_line":393,"start_character":38,"end_line":393,"end_character":42},"in_reply_to":"ba8a016a_f248b2ce","updated":"2015-11-23 02:01:39.000000000","message":"Done","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    cmd \u003d \u0027haproxy-vrrp-check \u0027 + \u0027 \u0027.join(args) + \u0027; exit $?\u0027"},{"line_number":394,"context_line":"    with open(util.haproxy_check_script_path(), \u0027w\u0027) as text_file:"},{"line_number":395,"context_line":"        text_file.write(cmd)"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_d2f24e6f","line":395,"updated":"2015-11-22 05:41:18.000000000","message":"a minor issue with this is that no matter what the topology is, these directories and files will be created.  might be confusing for debugging purposes.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    cmd \u003d \u0027haproxy-vrrp-check \u0027 + \u0027 \u0027.join(args) + \u0027; exit $?\u0027"},{"line_number":394,"context_line":"    with open(util.haproxy_check_script_path(), \u0027w\u0027) as text_file:"},{"line_number":395,"context_line":"        text_file.write(cmd)"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_d96b4e84","line":395,"in_reply_to":"ba8a016a_d2f24e6f","updated":"2015-11-23 02:01:39.000000000","message":"Done","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"e369c705870c192bd83c2ffcf9608ca0db6b8b28","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"def upload_haproxy_config(amphora_id, listener_id):"},{"line_number":88,"context_line":"    stream \u003d Wrapped(flask.request.stream)"},{"line_number":89,"context_line":"    peer_name \u003d octavia_utils.base64_sha1_string(amphora_id).rstrip(\u0027\u003d\u0027)"},{"line_number":90,"context_line":"    if not os.path.exists(util.haproxy_dir(listener_id)):"},{"line_number":91,"context_line":"        os.makedirs(util.haproxy_dir(listener_id))"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_0ac41690","line":89,"updated":"2015-11-23 05:53:21.000000000","message":"I think adding a # NOTE here would be very beneficial to anyone going through the code in the future and understanding why.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"def upload_haproxy_config(amphora_id, listener_id):"},{"line_number":88,"context_line":"    stream \u003d Wrapped(flask.request.stream)"},{"line_number":89,"context_line":"    peer_name \u003d octavia_utils.base64_sha1_string(amphora_id).rstrip(\u0027\u003d\u0027)"},{"line_number":90,"context_line":"    if not os.path.exists(util.haproxy_dir(listener_id)):"},{"line_number":91,"context_line":"        os.makedirs(util.haproxy_dir(listener_id))"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_f59aa36d","line":89,"in_reply_to":"ba8a016a_0ac41690","updated":"2015-11-23 22:08:37.000000000","message":"+1","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"be40a4acee0927d1a0f37434112443f69a4e1d82","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"def upload_haproxy_config(amphora_id, listener_id):"},{"line_number":88,"context_line":"    stream \u003d Wrapped(flask.request.stream)"},{"line_number":89,"context_line":"    peer_name \u003d octavia_utils.base64_sha1_string(amphora_id).rstrip(\u0027\u003d\u0027)"},{"line_number":90,"context_line":"    if not os.path.exists(util.haproxy_dir(listener_id)):"},{"line_number":91,"context_line":"        os.makedirs(util.haproxy_dir(listener_id))"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"9a8ffd7b_ee1f8307","line":89,"in_reply_to":"ba8a016a_0ac41690","updated":"2015-12-01 22:18:31.000000000","message":"Done","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    _check_listener_exists(listener_id)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    # Since this script should be created a LB create time"},{"line_number":144,"context_line":"    # we can check for this path to see if VRRP is enabled"},{"line_number":145,"context_line":"    # on this amphora and not write the file if VRRP is not in use"},{"line_number":146,"context_line":"    if os.path.exists(util.keepalived_check_script_path()):"}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_15cba754","line":143,"updated":"2015-11-23 22:08:37.000000000","message":"s/created a/created at/","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"be40a4acee0927d1a0f37434112443f69a4e1d82","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    _check_listener_exists(listener_id)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    # Since this script should be created a LB create time"},{"line_number":144,"context_line":"    # we can check for this path to see if VRRP is enabled"},{"line_number":145,"context_line":"    # on this amphora and not write the file if VRRP is not in use"},{"line_number":146,"context_line":"    if os.path.exists(util.keepalived_check_script_path()):"}],"source_content_type":"text/x-python","patch_set":43,"id":"9a8ffd7b_4e2a4f2e","line":143,"in_reply_to":"ba8a016a_15cba754","updated":"2015-12-01 22:18:31.000000000","message":"Done","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    try:"},{"line_number":153,"context_line":"        subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":154,"context_line":"    except subprocess.CalledProcessError as e:"},{"line_number":155,"context_line":"        if \u0027Job is already running\u0027 not in e.output:"},{"line_number":156,"context_line":"            LOG.debug(\"Failed to %(action)s HAProxy service: %(err)s\","},{"line_number":157,"context_line":"                      {\u0027action\u0027: action, \u0027err\u0027: e})"},{"line_number":158,"context_line":"            return flask.make_response(flask.jsonify(dict("}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_35f4ab85","line":155,"updated":"2015-11-23 22:08:37.000000000","message":"Is there an error code we could be checking instead of a string literal here? (Just a minor gripe-- but if there\u0027s a distinct error code, I find these are less likely to change with new versions of software than human-readable error strings.)","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"be40a4acee0927d1a0f37434112443f69a4e1d82","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    try:"},{"line_number":153,"context_line":"        subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":154,"context_line":"    except subprocess.CalledProcessError as e:"},{"line_number":155,"context_line":"        if \u0027Job is already running\u0027 not in e.output:"},{"line_number":156,"context_line":"            LOG.debug(\"Failed to %(action)s HAProxy service: %(err)s\","},{"line_number":157,"context_line":"                      {\u0027action\u0027: action, \u0027err\u0027: e})"},{"line_number":158,"context_line":"            return flask.make_response(flask.jsonify(dict("}],"source_content_type":"text/x-python","patch_set":43,"id":"9a8ffd7b_6e2ab3e9","line":155,"in_reply_to":"ba8a016a_35f4ab85","updated":"2015-12-01 22:18:31.000000000","message":"Sadly no.  I likewise prefer codes.\nExample output:\nstart: Job is already running: haproxy-{listener_id}","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"eb4e38ca609466fe863119312df0cfdef3c61037","unresolved":false,"context_lines":[{"line_number":82,"context_line":":param amphora_id: The id of the amphora to update"},{"line_number":83,"context_line":":param listener_id: The id of the listener"},{"line_number":84,"context_line":"\"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"def upload_haproxy_config(amphora_id, listener_id):"},{"line_number":88,"context_line":"    stream \u003d Wrapped(flask.request.stream)"}],"source_content_type":"text/x-python","patch_set":53,"id":"7a740942_4637a1b0","line":85,"updated":"2015-12-03 22:36:40.000000000","message":"Why are there blank lines between a docstring and the function it describes? I guess this isn\u0027t your problem, as it existed before your change...","commit_id":"15d018bc73270e100588048c94e4f82178c25987"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"58a9967c894af16ebb1ea2a517df4f3044b3baf1","unresolved":false,"context_lines":[{"line_number":82,"context_line":":param amphora_id: The id of the amphora to update"},{"line_number":83,"context_line":":param listener_id: The id of the listener"},{"line_number":84,"context_line":"\"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"def upload_haproxy_config(amphora_id, listener_id):"},{"line_number":88,"context_line":"    stream \u003d Wrapped(flask.request.stream)"}],"source_content_type":"text/x-python","patch_set":53,"id":"7a740942_597ea6e5","line":85,"in_reply_to":"7a740942_4637a1b0","updated":"2015-12-03 22:50:38.000000000","message":"Yeah, don\u0027t know but not added in this patch.  Surprised pep8 doesn\u0027t whine...","commit_id":"15d018bc73270e100588048c94e4f82178c25987"}],"octavia/amphorae/backends/agent/api_server/server.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":46,"context_line":"# Tested with curl -k -XPUT --data-binary @/tmp/test.txt"},{"line_number":47,"context_line":"# https://127.0.0.1:8443/0.5/listeners/123/haproxy"},{"line_number":48,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION +"},{"line_number":49,"context_line":"           \u0027/listeners/\u003camphora_id\u003e/\u003clistener_id\u003e/\u003cpeer_name\u003e/haproxy\u0027,"},{"line_number":50,"context_line":"           methods\u003d[\u0027PUT\u0027])"},{"line_number":51,"context_line":"def upload_haproxy_config(amphora_id, listener_id, peer_name):"},{"line_number":52,"context_line":"    return listener.upload_haproxy_config(amphora_id, listener_id, peer_name)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_c912c658","line":49,"updated":"2015-09-02 00:49:43.000000000","message":"As noted in the spec, I would prefer peer_name to be in the VRRP code and not mixed in here where it may not be necessary.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":46,"context_line":"# Tested with curl -k -XPUT --data-binary @/tmp/test.txt"},{"line_number":47,"context_line":"# https://127.0.0.1:8443/0.5/listeners/123/haproxy"},{"line_number":48,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION +"},{"line_number":49,"context_line":"           \u0027/listeners/\u003camphora_id\u003e/\u003clistener_id\u003e/\u003cpeer_name\u003e/haproxy\u0027,"},{"line_number":50,"context_line":"           methods\u003d[\u0027PUT\u0027])"},{"line_number":51,"context_line":"def upload_haproxy_config(amphora_id, listener_id, peer_name):"},{"line_number":52,"context_line":"    return listener.upload_haproxy_config(amphora_id, listener_id, peer_name)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_a8f9f181","line":49,"in_reply_to":"da20952f_c912c658","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    return certificate_update.upload_server_cert()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/vrrp/upload\u0027, methods\u003d[\u0027PUT\u0027])"},{"line_number":142,"context_line":"def upload_vrrp_config():"},{"line_number":143,"context_line":"    return keepalived.upload_keepalived_config()"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_24932efc","line":141,"updated":"2015-09-03 00:52:55.000000000","message":"All three of these have missing unit tests","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    return certificate_update.upload_server_cert()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/vrrp/upload\u0027, methods\u003d[\u0027PUT\u0027])"},{"line_number":142,"context_line":"def upload_vrrp_config():"},{"line_number":143,"context_line":"    return keepalived.upload_keepalived_config()"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_c6e4833d","line":141,"in_reply_to":"da20952f_24932efc","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17419,"name":"Banashankar k","email":"banveerad@gmail.com","username":"banveerad"},"change_message_id":"f92b687c1e37c9d8dd07d28381f3c160730ed530","unresolved":false,"context_lines":[{"line_number":137,"context_line":"def upload_cert():"},{"line_number":138,"context_line":"    return certificate_update.upload_server_cert()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/vrrp/upload\u0027, methods\u003d[\u0027PUT\u0027])"},{"line_number":142,"context_line":"def upload_vrrp_config():"},{"line_number":143,"context_line":"    return keepalived.upload_keepalived_config()"}],"source_content_type":"text/x-python","patch_set":27,"id":"da20952f_4f04117d","line":140,"updated":"2015-09-10 23:35:36.000000000","message":"If you can add Tested with comment for these, that will be great.","commit_id":"6e314f509776e53edf0bfbacf840573834437c58"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2838cde8f120999babf024fcd5179f722b967e6","unresolved":false,"context_lines":[{"line_number":137,"context_line":"def upload_cert():"},{"line_number":138,"context_line":"    return certificate_update.upload_server_cert()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/vrrp/upload\u0027, methods\u003d[\u0027PUT\u0027])"},{"line_number":142,"context_line":"def upload_vrrp_config():"},{"line_number":143,"context_line":"    return keepalived.upload_keepalived_config()"}],"source_content_type":"text/x-python","patch_set":27,"id":"da20952f_3827a564","line":140,"in_reply_to":"da20952f_4f04117d","updated":"2015-09-11 01:51:49.000000000","message":"Done","commit_id":"6e314f509776e53edf0bfbacf840573834437c58"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"# Tested with curl -k -XPUT --data-binary @/tmp/test.txt"},{"line_number":47,"context_line":"# https://127.0.0.1:8443/0.5/listeners/123/haproxy"},{"line_number":48,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION +"},{"line_number":49,"context_line":"           \u0027/listeners/\u003camphora_id\u003e/\u003clistener_id\u003e/haproxy\u0027,"},{"line_number":50,"context_line":"           methods\u003d[\u0027PUT\u0027])"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_d8a561b5","line":47,"updated":"2015-11-17 21:56:10.000000000","message":"Why changing port?\n\nonly 9443 will be open in security groups rules","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"# Tested with curl -k -XPUT --data-binary @/tmp/test.txt"},{"line_number":47,"context_line":"# https://127.0.0.1:8443/0.5/listeners/123/haproxy"},{"line_number":48,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION +"},{"line_number":49,"context_line":"           \u0027/listeners/\u003camphora_id\u003e/\u003clistener_id\u003e/haproxy\u0027,"},{"line_number":50,"context_line":"           methods\u003d[\u0027PUT\u0027])"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_477cfe1e","line":47,"in_reply_to":"ba8a016a_d8a561b5","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"# Tested with curl -k -XPUT --data-binary @/tmp/test.txt"},{"line_number":150,"context_line":"# https://127.0.0.1:8443/0.5/vrrp/upload"},{"line_number":151,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/vrrp/upload\u0027, methods\u003d[\u0027PUT\u0027])"},{"line_number":152,"context_line":"def upload_vrrp_config():"},{"line_number":153,"context_line":"    return keepalived.upload_keepalived_config()"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_3897cd49","line":150,"updated":"2015-11-17 21:56:10.000000000","message":"Why changing port?\nonly 9443 will be open in security groups rules","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"# Tested with curl -k -XPUT --data-binary @/tmp/test.txt"},{"line_number":150,"context_line":"# https://127.0.0.1:8443/0.5/vrrp/upload"},{"line_number":151,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/vrrp/upload\u0027, methods\u003d[\u0027PUT\u0027])"},{"line_number":152,"context_line":"def upload_vrrp_config():"},{"line_number":153,"context_line":"    return keepalived.upload_keepalived_config()"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_e7741237","line":150,"in_reply_to":"ba8a016a_3897cd49","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"# Tested with curl -k -XPUT --data-binary @/tmp/test.txt"},{"line_number":47,"context_line":"# https://127.0.0.1:9443/0.5/listeners/123/haproxy"},{"line_number":48,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION +"},{"line_number":49,"context_line":"           \u0027/listeners/\u003camphora_id\u003e/\u003clistener_id\u003e/haproxy\u0027,"},{"line_number":50,"context_line":"           methods\u003d[\u0027PUT\u0027])"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_326dda32","line":47,"range":{"start_line":47,"start_character":7,"end_line":47,"end_character":10},"updated":"2015-11-22 05:41:18.000000000","message":"not useful comments (not part of this change but there is one similar below)","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"# Tested with curl -k -XPUT --data-binary @/tmp/test.txt"},{"line_number":47,"context_line":"# https://127.0.0.1:9443/0.5/listeners/123/haproxy"},{"line_number":48,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION +"},{"line_number":49,"context_line":"           \u0027/listeners/\u003camphora_id\u003e/\u003clistener_id\u003e/haproxy\u0027,"},{"line_number":50,"context_line":"           methods\u003d[\u0027PUT\u0027])"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_9904e6c6","line":47,"range":{"start_line":47,"start_character":7,"end_line":47,"end_character":10},"in_reply_to":"ba8a016a_326dda32","updated":"2015-11-23 02:01:39.000000000","message":"Done","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"# Tested with curl -k -XPUT --data-binary @/tmp/test.txt"},{"line_number":150,"context_line":"# https://127.0.0.1:9443/0.5/vrrp/upload"},{"line_number":151,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/vrrp/upload\u0027, methods\u003d[\u0027PUT\u0027])"},{"line_number":152,"context_line":"def upload_vrrp_config():"},{"line_number":153,"context_line":"    return keepalived.upload_keepalived_config()"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_728282ca","line":150,"updated":"2015-11-22 05:41:18.000000000","message":"not useful comments","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"# Tested with curl -k -XPUT --data-binary @/tmp/test.txt"},{"line_number":150,"context_line":"# https://127.0.0.1:9443/0.5/vrrp/upload"},{"line_number":151,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/vrrp/upload\u0027, methods\u003d[\u0027PUT\u0027])"},{"line_number":152,"context_line":"def upload_vrrp_config():"},{"line_number":153,"context_line":"    return keepalived.upload_keepalived_config()"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_b909aadf","line":150,"in_reply_to":"ba8a016a_728282ca","updated":"2015-11-23 02:01:39.000000000","message":"Done","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"}],"octavia/amphorae/backends/agent/api_server/templates/haproxy.conf.j2":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"4ddb1c43b192d44f650e3ab60fd56ee1d8547ac3","unresolved":false,"context_lines":[{"line_number":23,"context_line":"env PID_PATH\u003d{{ haproxy_pid }}"},{"line_number":24,"context_line":"env BIN_PATH\u003d{{ haproxy_cmd }}"},{"line_number":25,"context_line":"env CONF_PATH\u003d{{ haproxy_cfg }}"},{"line_number":26,"context_line":"env AMP_ID\u003d`hostname | sed -e \u0027s/amphora-//g\u0027 | sed -e \u0027s/-//g\u0027`"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"respawn"},{"line_number":29,"context_line":"respawn limit {{ respawn_count }} {{respawn_interval}}"}],"source_content_type":"text/x-jinja2","patch_set":3,"id":"1a4dcd0f_47ad6187","line":26,"updated":"2015-08-03 16:18:57.000000000","message":"Can\u0027t we get that from the database/REST API parameters? Using this seems heavy handed and creates an unnecessary dependency on the hostname format","commit_id":"3b42635a12aeff16565e5f51c1fc47e1b42de93a"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":23,"context_line":"env PID_PATH\u003d{{ haproxy_pid }}"},{"line_number":24,"context_line":"env BIN_PATH\u003d{{ haproxy_cmd }}"},{"line_number":25,"context_line":"env CONF_PATH\u003d{{ haproxy_cfg }}"},{"line_number":26,"context_line":"env AMP_ID\u003d{{ amphora_id }}"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"respawn"},{"line_number":29,"context_line":"respawn limit {{ respawn_count }} {{respawn_interval}}"}],"source_content_type":"text/x-jinja2","patch_set":23,"id":"da20952f_817d8cb3","line":26,"updated":"2015-09-02 00:49:43.000000000","message":"This should not be amphora_id as it is not the amphora UUID.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":23,"context_line":"env PID_PATH\u003d{{ haproxy_pid }}"},{"line_number":24,"context_line":"env BIN_PATH\u003d{{ haproxy_cmd }}"},{"line_number":25,"context_line":"env CONF_PATH\u003d{{ haproxy_cfg }}"},{"line_number":26,"context_line":"env AMP_ID\u003d{{ amphora_id }}"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"respawn"},{"line_number":29,"context_line":"respawn limit {{ respawn_count }} {{respawn_interval}}"}],"source_content_type":"text/x-jinja2","patch_set":23,"id":"da20952f_88ec2dbc","line":26,"in_reply_to":"da20952f_817d8cb3","updated":"2015-09-04 23:24:59.000000000","message":"Changed to peer_name","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":36,"context_line":"exec /bin/bash \u003c\u003cEOF"},{"line_number":37,"context_line":"echo \\$(date) Starting HAProxy"},{"line_number":38,"context_line":"# The -L trick fixes the HAProxy limitation to have long peer names"},{"line_number":39,"context_line":"$BIN_PATH -f $CONF_PATH -L $PEER_NAME -D -p $PID_PATH"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"trap \"$BIN_PATH -f $CONF_PATH -L $PEER_NAME -p $PID_PATH -sf \\\\\\$(cat $PID_PATH)\" SIGHUP"},{"line_number":42,"context_line":"trap \"kill -TERM \\\\\\$(cat $PID_PATH) \u0026\u0026 rm $PID_PATH;echo \\\\\\$(date) Exiting HAProxy; exit 0\" SIGTERM SIGINT"}],"source_content_type":"text/x-jinja2","patch_set":41,"id":"ba8a016a_92d5a6ba","line":39,"updated":"2015-11-22 05:41:18.000000000","message":"Since this peer name is just setting the peer name of the process this spawns, I\u0027m assuming there won\u0027t be any issues with single topology.  I\u0027ve tested with single topology and it appears to work, but wonder if this might cause some unforeseen side effects.  Just verify that I understand what this is doing or totally smack me down if I am totally off.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"67e05b2bd0dc6a7eb9b433a94b8500e12b0afedd","unresolved":false,"context_lines":[{"line_number":36,"context_line":"exec /bin/bash \u003c\u003cEOF"},{"line_number":37,"context_line":"echo \\$(date) Starting HAProxy"},{"line_number":38,"context_line":"# The -L trick fixes the HAProxy limitation to have long peer names"},{"line_number":39,"context_line":"$BIN_PATH -f $CONF_PATH -L $PEER_NAME -D -p $PID_PATH"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"trap \"$BIN_PATH -f $CONF_PATH -L $PEER_NAME -p $PID_PATH -sf \\\\\\$(cat $PID_PATH)\" SIGHUP"},{"line_number":42,"context_line":"trap \"kill -TERM \\\\\\$(cat $PID_PATH) \u0026\u0026 rm $PID_PATH;echo \\\\\\$(date) Exiting HAProxy; exit 0\" SIGTERM SIGINT"}],"source_content_type":"text/x-jinja2","patch_set":41,"id":"ba8a016a_aaedca26","line":39,"in_reply_to":"ba8a016a_792a622e","updated":"2015-11-23 05:50:31.000000000","message":"ah always gets set to hostname, good to know.  thanks for explaining","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"exec /bin/bash \u003c\u003cEOF"},{"line_number":37,"context_line":"echo \\$(date) Starting HAProxy"},{"line_number":38,"context_line":"# The -L trick fixes the HAProxy limitation to have long peer names"},{"line_number":39,"context_line":"$BIN_PATH -f $CONF_PATH -L $PEER_NAME -D -p $PID_PATH"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"trap \"$BIN_PATH -f $CONF_PATH -L $PEER_NAME -p $PID_PATH -sf \\\\\\$(cat $PID_PATH)\" SIGHUP"},{"line_number":42,"context_line":"trap \"kill -TERM \\\\\\$(cat $PID_PATH) \u0026\u0026 rm $PID_PATH;echo \\\\\\$(date) Exiting HAProxy; exit 0\" SIGTERM SIGINT"}],"source_content_type":"text/x-jinja2","patch_set":41,"id":"ba8a016a_792a622e","line":39,"in_reply_to":"ba8a016a_92d5a6ba","updated":"2015-11-23 02:01:39.000000000","message":"No harm should come of this.  By default it is always set to the hostname, so setting an arbitrary name here should not do any harm if peers are not used in the config.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"}],"octavia/amphorae/backends/agent/api_server/templates/keepalived.conf.j2":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"36ff09efc393bc2de172e7e9e3571890b07155cc","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"start on startup"},{"line_number":22,"context_line":"stop on shutdown"},{"line_number":23,"context_line":"respawn"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"env PID_PATH\u003d{{ keepalived_pid }}"},{"line_number":26,"context_line":"env BIN_PATH\u003d{{ keepalived_cmd }}"}],"source_content_type":"text/x-jinja2","patch_set":8,"id":"1a4dcd0f_0205b5c0","line":23,"updated":"2015-08-11 00:05:58.000000000","message":"we prefer some limits on respawn not that things spawn forever","commit_id":"70c62a42fb11a61c6da7a848b734e00484feda4a"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"715fd497c12c3f1dd0c01e1f58cc18a25b757b09","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"start on startup"},{"line_number":22,"context_line":"stop on shutdown"},{"line_number":23,"context_line":"respawn"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"env PID_PATH\u003d{{ keepalived_pid }}"},{"line_number":26,"context_line":"env BIN_PATH\u003d{{ keepalived_cmd }}"}],"source_content_type":"text/x-jinja2","patch_set":8,"id":"1a4dcd0f_63b3289b","line":23,"in_reply_to":"1a4dcd0f_0205b5c0","updated":"2015-08-11 18:26:07.000000000","message":"OK","commit_id":"70c62a42fb11a61c6da7a848b734e00484feda4a"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"#   Inspired by https://gist.github.com/gfrey/8472007"},{"line_number":17,"context_line":"#}"},{"line_number":18,"context_line":"#!/bin/sh"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":23,"id":"da20952f_495d56eb","line":16,"updated":"2015-09-02 00:49:43.000000000","message":"This should be removed.  It is only valid for the HAProxy upstart script.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"#   Inspired by https://gist.github.com/gfrey/8472007"},{"line_number":17,"context_line":"#}"},{"line_number":18,"context_line":"#!/bin/sh"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":23,"id":"da20952f_26c3ff8a","line":16,"in_reply_to":"da20952f_495d56eb","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"}],"octavia/amphorae/backends/agent/api_server/templates/keepalived_check_script.conf.j2":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"#   Inspired by https://gist.github.com/gfrey/8472007"},{"line_number":17,"context_line":"#}"},{"line_number":18,"context_line":"#!/bin/sh"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":23,"id":"da20952f_29458216","line":16,"updated":"2015-09-02 00:49:43.000000000","message":"This should be removed.  It is only valid for the HAProxy upstart script.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"#   Inspired by https://gist.github.com/gfrey/8472007"},{"line_number":17,"context_line":"#}"},{"line_number":18,"context_line":"#!/bin/sh"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":23,"id":"da20952f_8638cba1","line":16,"in_reply_to":"da20952f_29458216","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"ba8a016a_52d89eef","updated":"2015-11-22 05:41:18.000000000","message":"couldn\u0027t this have been written in python?","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"ba8a016a_99b946ef","in_reply_to":"ba8a016a_52d89eef","updated":"2015-11-23 02:01:39.000000000","message":"I could...  I\u0027m not sure what value it would bring other than another python instance starting and stopping on the amp (python uses more memory for example, python rss\u003d5436, sh rss\u003d396).  This is called by keepalived.\nSo, I don\u0027t see the value in this being python.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"67e05b2bd0dc6a7eb9b433a94b8500e12b0afedd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"ba8a016a_8a0486c6","in_reply_to":"ba8a016a_99b946ef","updated":"2015-11-23 05:50:31.000000000","message":"well i would argue keeping the code in this project as much python as possible to maintain consistency is valuable.  5KB memory usage is negligible IMHO.  however, this is so inconsequential that I really don\u0027t care too much (i.e. I wouldn\u0027t not +2 for it).","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"}],"octavia/amphorae/backends/agent/api_server/util.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        return f.readline().rstrip()"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def haproxy_sock_path(listener_id):"},{"line_number":48,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path, listener_id + \u0027.sock\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_a4b5fe7e","line":47,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        return f.readline().rstrip()"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def haproxy_sock_path(listener_id):"},{"line_number":48,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path, listener_id + \u0027.sock\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_51b74f3a","line":47,"in_reply_to":"da20952f_a4b5fe7e","updated":"2015-09-08 21:46:58.000000000","message":"Covered in vrrp_check_script_update test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path, \u0027vrrp\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def keepalived_upstart_path():"},{"line_number":61,"context_line":"    return os.path.join(KEEPALIVED_INIT_DIR, \u0027octavia-keepalived\u0027)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_c4b83278","line":60,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path, \u0027vrrp\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def keepalived_upstart_path():"},{"line_number":61,"context_line":"    return os.path.join(KEEPALIVED_INIT_DIR, \u0027octavia-keepalived\u0027)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_e91c6a15","line":60,"updated":"2015-09-02 00:49:43.000000000","message":"Upstart scripts are in /etc/init but this script seems to be in /etc/init.d\nEither the script location needs to be update or the name of this method should be changed.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path, \u0027vrrp\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def keepalived_upstart_path():"},{"line_number":61,"context_line":"    return os.path.join(KEEPALIVED_INIT_DIR, \u0027octavia-keepalived\u0027)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_c65243de","line":60,"in_reply_to":"da20952f_e91c6a15","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    return os.path.join(KEEPALIVED_INIT_DIR, \u0027octavia-keepalived\u0027)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def keepalived_pid_path():"},{"line_number":65,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path,"},{"line_number":66,"context_line":"                        \u0027vrrp/octavia-keepalived.pid\u0027)"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_64b0468c","line":64,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    return os.path.join(KEEPALIVED_INIT_DIR, \u0027octavia-keepalived\u0027)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def keepalived_pid_path():"},{"line_number":65,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path,"},{"line_number":66,"context_line":"                        \u0027vrrp/octavia-keepalived.pid\u0027)"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_f128e335","line":64,"in_reply_to":"da20952f_64b0468c","updated":"2015-09-08 21:46:58.000000000","message":"Covered in test_upload_keepalived_config","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                        \u0027vrrp/octavia-keepalived.pid\u0027)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def keepalived_cfg_path():"},{"line_number":70,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path,"},{"line_number":71,"context_line":"                        \u0027vrrp/octavia-keepalived.conf\u0027)"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_84ab1a1e","line":69,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                        \u0027vrrp/octavia-keepalived.pid\u0027)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def keepalived_cfg_path():"},{"line_number":70,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path,"},{"line_number":71,"context_line":"                        \u0027vrrp/octavia-keepalived.conf\u0027)"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_31d65b28","line":69,"in_reply_to":"da20952f_84ab1a1e","updated":"2015-09-08 21:46:58.000000000","message":"Covered in test_upload_keepalived_config","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                        \u0027vrrp/octavia-keepalived.conf\u0027)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def keepalived_log_path():"},{"line_number":75,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path,"},{"line_number":76,"context_line":"                        \u0027vrrp/octavia-keepalived.log\u0027)"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_24aa4e1a","line":74,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                        \u0027vrrp/octavia-keepalived.conf\u0027)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def keepalived_log_path():"},{"line_number":75,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path,"},{"line_number":76,"context_line":"                        \u0027vrrp/octavia-keepalived.log\u0027)"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_11b8f7e7","line":74,"in_reply_to":"da20952f_24aa4e1a","updated":"2015-09-08 21:46:58.000000000","message":"Covered in test_upload_keepalived_config","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                        \u0027vrrp/check_scripts\u0027)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"def keepalived_check_script_path():"},{"line_number":85,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path,"},{"line_number":86,"context_line":"                        \u0027vrrp/check_script.sh\u0027)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_44a50245","line":84,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                        \u0027vrrp/check_scripts\u0027)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"def keepalived_check_script_path():"},{"line_number":85,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path,"},{"line_number":86,"context_line":"                        \u0027vrrp/check_script.sh\u0027)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_31a41bb8","line":84,"in_reply_to":"da20952f_44a50245","updated":"2015-09-08 21:46:58.000000000","message":"Covered in test_upload_keepalived_config","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":21,"context_line":"CONF.import_group(\u0027amphora_agent\u0027, \u0027octavia.common.config\u0027)"},{"line_number":22,"context_line":"CONF.import_group(\u0027haproxy_amphora\u0027, \u0027octavia.common.config\u0027)"},{"line_number":23,"context_line":"UPSTART_DIR \u003d \u0027/etc/init\u0027"},{"line_number":24,"context_line":"KEEPALIVED_INIT_DIR \u003d \u0027/etc/init.d\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def upstart_path(listener_id):"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_72e7e2ac","line":24,"updated":"2015-11-22 05:41:18.000000000","message":"curious, why is this not using upstart?  I have a suspicion that it is because thats how the image builds it, but not sure.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":21,"context_line":"CONF.import_group(\u0027amphora_agent\u0027, \u0027octavia.common.config\u0027)"},{"line_number":22,"context_line":"CONF.import_group(\u0027haproxy_amphora\u0027, \u0027octavia.common.config\u0027)"},{"line_number":23,"context_line":"UPSTART_DIR \u003d \u0027/etc/init\u0027"},{"line_number":24,"context_line":"KEEPALIVED_INIT_DIR \u003d \u0027/etc/init.d\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def upstart_path(listener_id):"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_99a066a7","line":24,"in_reply_to":"ba8a016a_72e7e2ac","updated":"2015-11-23 02:01:39.000000000","message":"The Ubuntu package for keepalived isn\u0027t using upstart for some reason.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def keepalived_check_script_path():"},{"line_number":86,"context_line":"    return os.path.join(CONF.haproxy_amphora.base_path,"},{"line_number":87,"context_line":"                        \u0027vrrp/check_script.sh\u0027)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"\"\"\"Get Listeners"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_3202ba3f","line":87,"updated":"2015-11-22 05:41:18.000000000","message":"a minor improvement would be to have the \"vrrp\" directory be a constant.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"}],"octavia/amphorae/drivers/base.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"da20952f_64c081e1","updated":"2015-09-02 00:49:43.000000000","message":"I don\u0027t think this is the right filename for this.\nI also see this same code in multiple places:\noctavia/amphorae/drivers/keepalived/jinja/jinja_cfg.py\noctavia/amphorae/drivers/haproxy/jinja/jinja_cfg.py\nCan we consolidate into a better named file somewhere?","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"da20952f_26945f41","in_reply_to":"da20952f_64c081e1","updated":"2015-09-04 23:24:59.000000000","message":"I wanted to have minimal changes to the existing Haproxy driver, which has a similar code. So I thought to keep that untouched and create another base class that for other drivers (not only keepalived). I ended up writing this function in the keepalived function and kept the base class for a future code cleaning patch (it will impact several parts as you said).","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17419,"name":"Banashankar k","email":"banveerad@gmail.com","username":"banveerad"},"change_message_id":"f92b687c1e37c9d8dd07d28381f3c160730ed530","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def get_template(self, template_file):"},{"line_number":27,"context_line":"        \"\"\"Returns the specified Jinja configuration template.\"\"\""},{"line_number":28,"context_line":"        if not self._jinja_env:"},{"line_number":29,"context_line":"            template_loader \u003d jinja2.FileSystemLoader("},{"line_number":30,"context_line":"                searchpath\u003dos.path.dirname(template_file))"},{"line_number":31,"context_line":"            self._jinja_env \u003d jinja2.Environment("}],"source_content_type":"text/x-python","patch_set":27,"id":"da20952f_4f7971fb","line":28,"updated":"2015-09-10 23:35:36.000000000","message":"do we need to handle the case where config file is not found ?","commit_id":"6e314f509776e53edf0bfbacf840573834437c58"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2838cde8f120999babf024fcd5179f722b967e6","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def get_template(self, template_file):"},{"line_number":27,"context_line":"        \"\"\"Returns the specified Jinja configuration template.\"\"\""},{"line_number":28,"context_line":"        if not self._jinja_env:"},{"line_number":29,"context_line":"            template_loader \u003d jinja2.FileSystemLoader("},{"line_number":30,"context_line":"                searchpath\u003dos.path.dirname(template_file))"},{"line_number":31,"context_line":"            self._jinja_env \u003d jinja2.Environment("}],"source_content_type":"text/x-python","patch_set":27,"id":"da20952f_18b0a1fc","line":28,"in_reply_to":"da20952f_4f7971fb","updated":"2015-09-11 01:51:49.000000000","message":"It is too tight practice I think. Having the template_file missing is like having a class or a function missing!","commit_id":"6e314f509776e53edf0bfbacf840573834437c58"}],"octavia/amphorae/drivers/driver_base.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2011-2014 OpenStack Foundation,author: Min Wang, German"},{"line_number":2,"context_line":"# Eichberger, Sherif Abdelwahab"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_d3e3d5d7","line":1,"updated":"2015-08-26 04:17:04.000000000","message":"why is this starting in 2011?","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2011-2014 OpenStack Foundation,author: Min Wang, German"},{"line_number":2,"context_line":"# Eichberger, Sherif Abdelwahab"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_53175ced","line":1,"in_reply_to":"fa1b9901_d3e3d5d7","updated":"2015-08-26 19:57:59.000000000","message":"I have no history. Included the normal copyright","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def plug_mixin(*mixins):"},{"line_number":42,"context_line":"    \"\"\"A factory decorator that plugs mixins to existing classes.\"\"\""},{"line_number":43,"context_line":"    def decorator(cls):"},{"line_number":44,"context_line":"        for mixin in mixins:"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_3341f1a9","line":41,"updated":"2015-08-26 04:17:04.000000000","message":"is the reason for doing a decorator so that this MixIn does not override methods of a driver that may have already defined these methods?","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def plug_mixin(*mixins):"},{"line_number":42,"context_line":"    \"\"\"A factory decorator that plugs mixins to existing classes.\"\"\""},{"line_number":43,"context_line":"    def decorator(cls):"},{"line_number":44,"context_line":"        for mixin in mixins:"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_334988d1","line":41,"in_reply_to":"fa1b9901_3341f1a9","updated":"2015-08-26 19:57:59.000000000","message":"This is one reason. I understood the Mixin as a plugin that augments the current implemented methods of a driver, that is why I found decorators minimize unexpected results. The other reason, is just readability since python does not support Mixins natively and inheritance here really confused me. It is easy for me now to force a driver to have its specific keepalived templater if needed (needs some changes though). Finally, these two functions can be reused blindly to implement future mixins.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_8457d525","line":1,"updated":"2015-09-02 00:49:43.000000000","message":"Even though the old one is wrong, we should only add ours to it.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_016a65b3","line":1,"in_reply_to":"da20952f_8457d525","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    method that the Mixin defines"},{"line_number":26,"context_line":"    \"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    for name, value in mixin.__dict__.items():"},{"line_number":29,"context_line":"        if name.startswith(\"_\"):"},{"line_number":30,"context_line":"            continue"},{"line_number":31,"context_line":"        if hasattr(cls, name):"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_52ff3e34","line":28,"updated":"2015-11-22 05:41:18.000000000","message":"nit: py2 will build the full list in memory, py3 will just be an iterator.  I suppose using six should happen.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    method that the Mixin defines"},{"line_number":26,"context_line":"    \"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    for name, value in mixin.__dict__.items():"},{"line_number":29,"context_line":"        if name.startswith(\"_\"):"},{"line_number":30,"context_line":"            continue"},{"line_number":31,"context_line":"        if hasattr(cls, name):"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_d99eee62","line":28,"in_reply_to":"ba8a016a_52ff3e34","updated":"2015-11-23 02:01:39.000000000","message":"Done","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def plug_mixin(*mixins):"},{"line_number":42,"context_line":"    \"\"\"A factory decorator that plugs mixins to existing classes.\"\"\""},{"line_number":43,"context_line":"    def decorator(cls):"},{"line_number":44,"context_line":"        for mixin in mixins:"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_92a3664f","line":41,"updated":"2015-11-22 05:41:18.000000000","message":"I\u0027m curious as to why this is needed over simply adding the mixin to be inherited from normally?","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"a6b849891fff5c4b2013d1e9cc0b69ab93422342","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def plug_mixin(*mixins):"},{"line_number":42,"context_line":"    \"\"\"A factory decorator that plugs mixins to existing classes.\"\"\""},{"line_number":43,"context_line":"    def decorator(cls):"},{"line_number":44,"context_line":"        for mixin in mixins:"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_94a02ba7","line":41,"in_reply_to":"ba8a016a_197c761f","updated":"2015-11-23 03:31:35.000000000","message":"Why are we using mixins? The idea is that a topology would apply to a normal driver. That made more sense when we had two driver ssh and REST but we might get back to that.\n\nWhy is it loadable/configurable? We were thinking that ACTICE-PASSIVE would just be one topology to mix in. Another obvious one could be ACTIVE-ACTIVE... hence, allowing which mixin to be loaded in the configuration file and then with the _register trick...","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def plug_mixin(*mixins):"},{"line_number":42,"context_line":"    \"\"\"A factory decorator that plugs mixins to existing classes.\"\"\""},{"line_number":43,"context_line":"    def decorator(cls):"},{"line_number":44,"context_line":"        for mixin in mixins:"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_197c761f","line":41,"in_reply_to":"ba8a016a_92a3664f","updated":"2015-11-23 02:01:39.000000000","message":"Good question.  I will let German answer as I think he helped Sherif with this.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"67e05b2bd0dc6a7eb9b433a94b8500e12b0afedd","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def plug_mixin(*mixins):"},{"line_number":42,"context_line":"    \"\"\"A factory decorator that plugs mixins to existing classes.\"\"\""},{"line_number":43,"context_line":"    def decorator(cls):"},{"line_number":44,"context_line":"        for mixin in mixins:"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_4a0e9ee6","line":41,"in_reply_to":"ba8a016a_94a02ba7","updated":"2015-11-23 05:50:31.000000000","message":"I responded to this on PS 43 in the rest_api_driver.py module.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"}],"octavia/amphorae/drivers/haproxy/exceptions.py":[{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    responses \u003d {"},{"line_number":22,"context_line":"        400: InvalidRequest,"},{"line_number":23,"context_line":"        401: Unauthorized,"},{"line_number":24,"context_line":"        403: Forbidden,"},{"line_number":25,"context_line":"        404: NotFound,"},{"line_number":26,"context_line":"        405: InvalidRequest,"},{"line_number":27,"context_line":"        409: Conflict,"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_53c71245","line":24,"updated":"2015-11-17 21:56:10.000000000","message":"unrelated,  should be done in done in another patch. \nFurthermore, not specify in commit message...\nBut doesn\u0027t require -1","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    responses \u003d {"},{"line_number":22,"context_line":"        400: InvalidRequest,"},{"line_number":23,"context_line":"        401: Unauthorized,"},{"line_number":24,"context_line":"        403: Forbidden,"},{"line_number":25,"context_line":"        404: NotFound,"},{"line_number":26,"context_line":"        405: InvalidRequest,"},{"line_number":27,"context_line":"        409: Conflict,"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_67fca272","line":24,"in_reply_to":"ba8a016a_53c71245","updated":"2015-11-18 18:10:19.000000000","message":"This was done here because this patch fires InvalidRequest and this incorrect file caused it to fail by not raising the right exception.","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"}],"octavia/amphorae/drivers/haproxy/jinja/templates/haproxy_proxies.template":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":19,"context_line":"{% if listener.topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY %}"},{"line_number":20,"context_line":"peers {{ \"%s_peers\"|format(listener.id.replace(\"-\", \"\"))|trim() }}"},{"line_number":21,"context_line":"{% for amp in listener.amphorae %}"},{"line_number":22,"context_line":"    peer {{ amp.id|hash_amp_id|replace(\u0027\u003d\u0027, \u0027\u0027) }} {{ amp.vrrp_ip }}:{{ listener.sync_port }}"},{"line_number":23,"context_line":"{% endfor %}"},{"line_number":24,"context_line":"{% endif %}"},{"line_number":25,"context_line":"{% endmacro %}"}],"source_content_type":"application/octet-stream","patch_set":41,"id":"ba8a016a_d299ee20","line":22,"updated":"2015-11-22 05:41:18.000000000","message":"I\u0027m going to assume that haproxy doesn\u0027t take too kindly to -\u0027s and \u003d\u0027s in the peer section.  Relates to a comment I already posted.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":19,"context_line":"{% if listener.topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY %}"},{"line_number":20,"context_line":"peers {{ \"%s_peers\"|format(listener.id.replace(\"-\", \"\"))|trim() }}"},{"line_number":21,"context_line":"{% for amp in listener.amphorae %}"},{"line_number":22,"context_line":"    peer {{ amp.id|hash_amp_id|replace(\u0027\u003d\u0027, \u0027\u0027) }} {{ amp.vrrp_ip }}:{{ listener.sync_port }}"},{"line_number":23,"context_line":"{% endfor %}"},{"line_number":24,"context_line":"{% endif %}"},{"line_number":25,"context_line":"{% endmacro %}"}],"source_content_type":"application/octet-stream","patch_set":41,"id":"ba8a016a_f972d248","line":22,"in_reply_to":"ba8a016a_d299ee20","updated":"2015-11-23 02:01:39.000000000","message":"Correct.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"e369c705870c192bd83c2ffcf9608ca0db6b8b28","unresolved":false,"context_lines":[{"line_number":19,"context_line":"{% if listener.topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY %}"},{"line_number":20,"context_line":"peers {{ \"%s_peers\"|format(listener.id.replace(\"-\", \"\"))|trim() }}"},{"line_number":21,"context_line":"{% for amp in listener.amphorae %}"},{"line_number":22,"context_line":"    peer {{ amp.id|hash_amp_id|replace(\u0027\u003d\u0027, \u0027\u0027) }} {{ amp.vrrp_ip }}:{{ listener.peer_port }}"},{"line_number":23,"context_line":"{% endfor %}"},{"line_number":24,"context_line":"{% endif %}"},{"line_number":25,"context_line":"{% endmacro %}"}],"source_content_type":"application/octet-stream","patch_set":43,"id":"ba8a016a_6a2a822e","line":22,"updated":"2015-11-23 05:53:21.000000000","message":"I think a # NOTE comment here about why this is done would also be beneficial.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":19,"context_line":"{% if listener.topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY %}"},{"line_number":20,"context_line":"peers {{ \"%s_peers\"|format(listener.id.replace(\"-\", \"\"))|trim() }}"},{"line_number":21,"context_line":"{% for amp in listener.amphorae %}"},{"line_number":22,"context_line":"    peer {{ amp.id|hash_amp_id|replace(\u0027\u003d\u0027, \u0027\u0027) }} {{ amp.vrrp_ip }}:{{ listener.peer_port }}"},{"line_number":23,"context_line":"{% endfor %}"},{"line_number":24,"context_line":"{% endif %}"},{"line_number":25,"context_line":"{% endmacro %}"}],"source_content_type":"application/octet-stream","patch_set":43,"id":"ba8a016a_b029898b","line":22,"in_reply_to":"ba8a016a_6a2a822e","updated":"2015-11-23 22:08:37.000000000","message":"+1","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"be40a4acee0927d1a0f37434112443f69a4e1d82","unresolved":false,"context_lines":[{"line_number":19,"context_line":"{% if listener.topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY %}"},{"line_number":20,"context_line":"peers {{ \"%s_peers\"|format(listener.id.replace(\"-\", \"\"))|trim() }}"},{"line_number":21,"context_line":"{% for amp in listener.amphorae %}"},{"line_number":22,"context_line":"    peer {{ amp.id|hash_amp_id|replace(\u0027\u003d\u0027, \u0027\u0027) }} {{ amp.vrrp_ip }}:{{ listener.peer_port }}"},{"line_number":23,"context_line":"{% endfor %}"},{"line_number":24,"context_line":"{% endif %}"},{"line_number":25,"context_line":"{% endmacro %}"}],"source_content_type":"application/octet-stream","patch_set":43,"id":"9a8ffd7b_0e8687b9","line":22,"in_reply_to":"ba8a016a_6a2a822e","updated":"2015-12-01 22:18:31.000000000","message":"Done","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"}],"octavia/amphorae/drivers/haproxy/rest_api_driver.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from octavia.amphorae.drivers import driver_base as driver_base"},{"line_number":26,"context_line":"from octavia.amphorae.drivers.haproxy import exceptions as exc"},{"line_number":27,"context_line":"from octavia.amphorae.drivers.haproxy.jinja import jinja_cfg"},{"line_number":28,"context_line":"from octavia.amphorae.drivers.keepalived import rest_api_driver"},{"line_number":29,"context_line":"from octavia.common.config import cfg"},{"line_number":30,"context_line":"from octavia.common import constants"},{"line_number":31,"context_line":"from octavia.common import data_models as data_models"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_5fcbc81e","line":28,"updated":"2015-09-02 00:49:43.000000000","message":"I don\u0027t think rest_api_driver is the best name here.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from octavia.amphorae.drivers import driver_base as driver_base"},{"line_number":26,"context_line":"from octavia.amphorae.drivers.haproxy import exceptions as exc"},{"line_number":27,"context_line":"from octavia.amphorae.drivers.haproxy.jinja import jinja_cfg"},{"line_number":28,"context_line":"from octavia.amphorae.drivers.keepalived import rest_api_driver"},{"line_number":29,"context_line":"from octavia.common.config import cfg"},{"line_number":30,"context_line":"from octavia.common import constants"},{"line_number":31,"context_line":"from octavia.common import data_models as data_models"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_26d0dff5","line":28,"in_reply_to":"da20952f_5fcbc81e","updated":"2015-09-04 23:24:59.000000000","message":"imported as vrrp_driver","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                                         certs[\u0027sni_certs\u0027])"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        for amp in listener.load_balancer.amphorae:"},{"line_number":72,"context_line":"            peer_name \u003d \u0027amp-\u0027 + str(amp.vrrp_ip)"},{"line_number":73,"context_line":"            self.client.upload_config(amp, listener.id, peer_name, config)"},{"line_number":74,"context_line":"            # todo (german): add a method to REST interface to reload or start"},{"line_number":75,"context_line":"            #                without having to check"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_1c9483e6","line":72,"updated":"2015-09-02 00:49:43.000000000","message":"I don\u0027t like that \"amp-\" is used if Octavia is not in Active/Standy","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                                         certs[\u0027sni_certs\u0027])"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        for amp in listener.load_balancer.amphorae:"},{"line_number":72,"context_line":"            peer_name \u003d \u0027amp-\u0027 + str(amp.vrrp_ip)"},{"line_number":73,"context_line":"            self.client.upload_config(amp, listener.id, peer_name, config)"},{"line_number":74,"context_line":"            # todo (german): add a method to REST interface to reload or start"},{"line_number":75,"context_line":"            #                without having to check"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_481855d3","line":72,"in_reply_to":"da20952f_1c9483e6","updated":"2015-09-04 23:24:59.000000000","message":"peer_name is implicitly md5(amphora_id)","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    def post_network_plug(self, amphora):"},{"line_number":116,"context_line":"        self.client.plug_network(amphora)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def get_vrrp_interface(self, amphora):"},{"line_number":119,"context_line":"        return self.client.get_interface(amphora, amphora.vrrp_ip)[\u0027interface\u0027]"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _process_tls_certificates(self, listener):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_a43adee5","line":118,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    def post_network_plug(self, amphora):"},{"line_number":116,"context_line":"        self.client.plug_network(amphora)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def get_vrrp_interface(self, amphora):"},{"line_number":119,"context_line":"        return self.client.get_interface(amphora, amphora.vrrp_ip)[\u0027interface\u0027]"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _process_tls_certificates(self, listener):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_51c2ef35","line":118,"in_reply_to":"da20952f_a43adee5","updated":"2015-09-08 21:46:58.000000000","message":"Covered in test_amphora_update_vrrp_interface","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        for a in six.moves.xrange(CONF.haproxy_amphora.connection_max_retries):"},{"line_number":238,"context_line":"            try:"},{"line_number":239,"context_line":"                r \u003d _request(**reqargs)"},{"line_number":240,"context_line":"                LOG.debug(r)"},{"line_number":241,"context_line":"            except requests.ConnectionError:"},{"line_number":242,"context_line":"                LOG.warn(_LW(\"Could not talk  to instance\"))"},{"line_number":243,"context_line":"                time.sleep(CONF.haproxy_amphora.connection_retry_interval)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_1a80fe45","line":240,"updated":"2015-09-02 00:49:43.000000000","message":"This is not a descriptive log message.  Update or remove.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        for a in six.moves.xrange(CONF.haproxy_amphora.connection_max_retries):"},{"line_number":238,"context_line":"            try:"},{"line_number":239,"context_line":"                r \u003d _request(**reqargs)"},{"line_number":240,"context_line":"                LOG.debug(r)"},{"line_number":241,"context_line":"            except requests.ConnectionError:"},{"line_number":242,"context_line":"                LOG.warn(_LW(\"Could not talk  to instance\"))"},{"line_number":243,"context_line":"                time.sleep(CONF.haproxy_amphora.connection_retry_interval)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_263e9f28","line":240,"in_reply_to":"da20952f_1a80fe45","updated":"2015-09-04 23:24:59.000000000","message":"Removed. It causes unnecessary errors.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    def get_interface(self, amp, ip_addr):"},{"line_number":332,"context_line":"        r \u003d self.get(amp, \u0027interface/{ip_addr}\u0027.format(ip_addr\u003dip_addr))"},{"line_number":333,"context_line":"        if exc.check_exception(r):"},{"line_number":334,"context_line":"            return r.json()"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_041b8a81","line":333,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test code branch","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    def get_interface(self, amp, ip_addr):"},{"line_number":332,"context_line":"        r \u003d self.get(amp, \u0027interface/{ip_addr}\u0027.format(ip_addr\u003dip_addr))"},{"line_number":333,"context_line":"        if exc.check_exception(r):"},{"line_number":334,"context_line":"            return r.json()"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_d10fdf37","line":333,"in_reply_to":"da20952f_041b8a81","updated":"2015-09-08 21:46:58.000000000","message":"Covered in test_get_interface in test_server.py","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import functools"},{"line_number":16,"context_line":"import hashlib"},{"line_number":17,"context_line":"import time"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo_log import log as logging"},{"line_number":21,"context_line":"import requests"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_729e0209","line":18,"updated":"2015-11-22 05:41:18.000000000","message":"unnecessary blank line","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import functools"},{"line_number":16,"context_line":"import hashlib"},{"line_number":17,"context_line":"import time"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo_log import log as logging"},{"line_number":21,"context_line":"import requests"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_5998be6a","line":18,"in_reply_to":"ba8a016a_729e0209","updated":"2015-11-23 02:01:39.000000000","message":"Done","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"# Add support of VRRP to the Haproxy driver."},{"line_number":45,"context_line":"@driver_base.plug_mixin(vrrp_rest_driver.KeepalivedAmphoraDriverMixin)"},{"line_number":46,"context_line":"class HaproxyAmphoraLoadBalancerDriver(driver_base.AmphoraLoadBalancerDriver):"},{"line_number":47,"context_line":"    def __init__(self):"},{"line_number":48,"context_line":"        super(HaproxyAmphoraLoadBalancerDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_32895acb","line":45,"updated":"2015-11-22 05:41:18.000000000","message":"i posed this same question in the base driver, but reiterating here, why can\u0027t this just be on the line below with multiple inheritance?","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"# Add support of VRRP to the Haproxy driver."},{"line_number":45,"context_line":"@driver_base.plug_mixin(vrrp_rest_driver.KeepalivedAmphoraDriverMixin)"},{"line_number":46,"context_line":"class HaproxyAmphoraLoadBalancerDriver(driver_base.AmphoraLoadBalancerDriver):"},{"line_number":47,"context_line":"    def __init__(self):"},{"line_number":48,"context_line":"        super(HaproxyAmphoraLoadBalancerDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_b993ea4e","line":45,"in_reply_to":"ba8a016a_32895acb","updated":"2015-11-23 02:01:39.000000000","message":"Same answer from me, I will let German speak to this.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"e369c705870c192bd83c2ffcf9608ca0db6b8b28","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"# Add support of VRRP to the Haproxy driver."},{"line_number":45,"context_line":"@driver_base.plug_mixin(vrrp_rest_driver.KeepalivedAmphoraDriverMixin)"},{"line_number":46,"context_line":"class HaproxyAmphoraLoadBalancerDriver(driver_base.AmphoraLoadBalancerDriver):"},{"line_number":47,"context_line":"    def __init__(self):"},{"line_number":48,"context_line":"        super(HaproxyAmphoraLoadBalancerDriver, self).__init__()"},{"line_number":49,"context_line":"        self.client \u003d AmphoraAPIClient()"}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_2a655ae0","line":46,"updated":"2015-11-23 05:53:21.000000000","message":"Responding to German\u0027s comments in PS 41 about the decorator here and why its needed\n\n\nSo I know why we want a mixin and those reasons make sense.  However, doing the mixin here the normal way of multiple inheritance is easier to read and requires no additional code.  For example:\n\n\nclass HaproxyAmphoraLoadBalancerDriver(driver_base.AmphoraLoadBalancerDriver, vrrp_rest_driver.KeepalivedAmphoraDriverMixin)\n\n\nSo, I don\u0027t get what this decorator and registry add that multiple inheritance doesn\u0027t.  Well I can see one, and only one, and that is that the decorator will raise an exception if the class having a mixin added to it already implements a method that the mixin defines.  I don\u0027t see much value in that, though, so I don\u0027t see what it adds.  I might be overlooking something, though.\n\nAlso, you mentioned the mixin being loadable/configurable.  I don\u0027t see that happening here.  Actually loading the correct HA mixin class based on the topology isn\u0027t a bad idea though.  However, that\u0027s not happening here.  This driver will now always work for active standby and single, no matter what topology has been specified.\n\nAnyway, sorry for the long comment again.  Let me know if I\u0027m making sense or if I\u0027m just insane.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"# Add support of VRRP to the Haproxy driver."},{"line_number":45,"context_line":"@driver_base.plug_mixin(vrrp_rest_driver.KeepalivedAmphoraDriverMixin)"},{"line_number":46,"context_line":"class HaproxyAmphoraLoadBalancerDriver(driver_base.AmphoraLoadBalancerDriver):"},{"line_number":47,"context_line":"    def __init__(self):"},{"line_number":48,"context_line":"        super(HaproxyAmphoraLoadBalancerDriver, self).__init__()"},{"line_number":49,"context_line":"        self.client \u003d AmphoraAPIClient()"}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_b085095a","line":46,"in_reply_to":"ba8a016a_18ba090b","updated":"2015-11-23 22:08:37.000000000","message":"Let\u0027s try to have that discussion soon, then-- so that we don\u0027t have a ton of cruft to update (where we might have chosen different strategies for this) in order to use the same pattern in most places.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"0243b71ad5a7cb9f74ff2ea946341df0fb57da02","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"# Add support of VRRP to the Haproxy driver."},{"line_number":45,"context_line":"@driver_base.plug_mixin(vrrp_rest_driver.KeepalivedAmphoraDriverMixin)"},{"line_number":46,"context_line":"class HaproxyAmphoraLoadBalancerDriver(driver_base.AmphoraLoadBalancerDriver):"},{"line_number":47,"context_line":"    def __init__(self):"},{"line_number":48,"context_line":"        super(HaproxyAmphoraLoadBalancerDriver, self).__init__()"},{"line_number":49,"context_line":"        self.client \u003d AmphoraAPIClient()"}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_18ba090b","line":46,"in_reply_to":"ba8a016a_2a655ae0","updated":"2015-11-23 17:32:02.000000000","message":"@Brandon I spend some more time with the code and the plan was to provide a generalized VRRP interface which got implemented by keepalived but would be pluggable enough to also accommodate Ryan\u0027s keepalived replacement. That clearly didn\u0027t come to fruition. Now if we use a standard mixin it doesn\u0027t have a way to run an init function to load the keepalived driver. So the annotation could be jerry-rigged to do that. \n\nI briefly chatted with Adam and he prefers to make more drivers having that functionality which in my opinion increases boilerplate code but might be easier to manage. \n\nI think ultimately we probably need to have a more thorough discussion on how we envision different extensions to be composited in the drivers. So I think the most expediantis to follow your suggestion and hook up the Keepalived mixin as is and figure out pluggability once we cross that bridge.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"}],"octavia/amphorae/drivers/keepalived/jinja/jinja_cfg.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                                    KEEPALIVED_TEMPLATE)"},{"line_number":40,"context_line":"        self._jinja_env \u003d None"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def get_template(self, template_file):"},{"line_number":43,"context_line":"        \"\"\"Returns the specified Jinja configuration template.\"\"\""},{"line_number":44,"context_line":"        if not self._jinja_env:"},{"line_number":45,"context_line":"            template_loader \u003d jinja2.FileSystemLoader("}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_3a2b8235","line":42,"updated":"2015-09-02 00:49:43.000000000","message":"Duplicate code with octavia/amphorae/drivers/base.py","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                                    KEEPALIVED_TEMPLATE)"},{"line_number":40,"context_line":"        self._jinja_env \u003d None"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def get_template(self, template_file):"},{"line_number":43,"context_line":"        \"\"\"Returns the specified Jinja configuration template.\"\"\""},{"line_number":44,"context_line":"        if not self._jinja_env:"},{"line_number":45,"context_line":"            template_loader \u003d jinja2.FileSystemLoader("}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_2406ce20","line":42,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                                    KEEPALIVED_TEMPLATE)"},{"line_number":40,"context_line":"        self._jinja_env \u003d None"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def get_template(self, template_file):"},{"line_number":43,"context_line":"        \"\"\"Returns the specified Jinja configuration template.\"\"\""},{"line_number":44,"context_line":"        if not self._jinja_env:"},{"line_number":45,"context_line":"            template_loader \u003d jinja2.FileSystemLoader("}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_0d29b337","line":42,"in_reply_to":"da20952f_2406ce20","updated":"2015-09-08 21:46:58.000000000","message":"Covered in test_build_keepalived_config","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                lstrip_blocks\u003dTrue)"},{"line_number":51,"context_line":"        return self._jinja_env.get_template(os.path.basename(template_file))"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def build_keepalived_config(self, loadbalancer, amphora):"},{"line_number":54,"context_line":"        \"\"\"Renders the loadblanacer keepalived configuration for Active/Standby"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        :param loadbalancer: A lodabalancer object"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_44018205","line":53,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                lstrip_blocks\u003dTrue)"},{"line_number":51,"context_line":"        return self._jinja_env.get_template(os.path.basename(template_file))"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def build_keepalived_config(self, loadbalancer, amphora):"},{"line_number":54,"context_line":"        \"\"\"Renders the loadblanacer keepalived configuration for Active/Standby"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        :param loadbalancer: A lodabalancer object"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_4d2fab3e","line":53,"in_reply_to":"da20952f_44018205","updated":"2015-09-08 21:46:58.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":68,"context_line":"             \u0027amp_priority\u0027: amphora.vrrp_priority,"},{"line_number":69,"context_line":"             \u0027vrrp_auth_type\u0027: loadbalancer.vrrp_group.vrrp_auth_type,"},{"line_number":70,"context_line":"             \u0027vrrp_auth_pass\u0027: loadbalancer.vrrp_group.vrrp_auth_pass,"},{"line_number":71,"context_line":"             \u0027amp_ip\u0027: amphora.vrrp_ip,"},{"line_number":72,"context_line":"             \u0027peers_vrrp_ips\u0027: peers_ips,"},{"line_number":73,"context_line":"             \u0027vip_ip_address\u0027: loadbalancer.vip.ip_address,"},{"line_number":74,"context_line":"             \u0027advert_int\u0027: loadbalancer.vrrp_group.advert_int,"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_fa974a38","line":71,"updated":"2015-09-02 00:49:43.000000000","message":"Should this be amp_vrrp_ip?","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":68,"context_line":"             \u0027amp_priority\u0027: amphora.vrrp_priority,"},{"line_number":69,"context_line":"             \u0027vrrp_auth_type\u0027: loadbalancer.vrrp_group.vrrp_auth_type,"},{"line_number":70,"context_line":"             \u0027vrrp_auth_pass\u0027: loadbalancer.vrrp_group.vrrp_auth_pass,"},{"line_number":71,"context_line":"             \u0027amp_ip\u0027: amphora.vrrp_ip,"},{"line_number":72,"context_line":"             \u0027peers_vrrp_ips\u0027: peers_ips,"},{"line_number":73,"context_line":"             \u0027vip_ip_address\u0027: loadbalancer.vip.ip_address,"},{"line_number":74,"context_line":"             \u0027advert_int\u0027: loadbalancer.vrrp_group.advert_int,"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_e8cda930","line":71,"in_reply_to":"da20952f_fa974a38","updated":"2015-09-04 23:24:59.000000000","message":"Yes. Changed","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":75,"context_line":"             \u0027check_script_path\u0027: util.keepalived_check_script_path(),"},{"line_number":76,"context_line":"             \u0027vrrp_check_interval\u0027: constants.VRRP_CHECK_INTERVAL,"},{"line_number":77,"context_line":"             \u0027vrrp_fail_count\u0027: constants.VRRP_FAIL_COUNT,"},{"line_number":78,"context_line":"             \u0027vrrp_success_count\u0027: constants.VRRP_SUCCESS_COUNT},"},{"line_number":79,"context_line":"            constants\u003dconstants)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_9aa96e7e","line":78,"updated":"2015-09-02 00:49:43.000000000","message":"These should probably be configuration settings instead of constants.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"0ceb1ea6a4c46da6638db2d8edbd573489e4a8ac","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_3af6dad7","line":1,"updated":"2015-11-18 00:33:48.000000000","message":"Enterprise","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_a714ca9f","line":1,"in_reply_to":"ba8a016a_3af6dad7","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"}],"octavia/amphorae/drivers/keepalived/jinja/templates/keepalived_base.template":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":27,"context_line":"  rise {{ vrrp_success_count }}"},{"line_number":28,"context_line":"}"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"vrrp_instance {{ vrrp_group_name }} {"},{"line_number":31,"context_line":" state {{ amp_role }}"},{"line_number":32,"context_line":" interface {{ amp_intf }}"},{"line_number":33,"context_line":" virtual_router_id {{ amp_vrrp_id }}"}],"source_content_type":"application/octet-stream","patch_set":23,"id":"da20952f_5acbd61e","line":30,"updated":"2015-09-02 00:49:43.000000000","message":"I think we should set the \"nopreempt\" flag here.  Note it can only be set on the backup.\nSSL sessions will be interrupted (until fixed in haproxy) on VRRP failover, so we should not failover unless it is necessary.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":27,"context_line":"  rise {{ vrrp_success_count }}"},{"line_number":28,"context_line":"}"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"vrrp_instance {{ vrrp_group_name }} {"},{"line_number":31,"context_line":" state {{ amp_role }}"},{"line_number":32,"context_line":" interface {{ amp_intf }}"},{"line_number":33,"context_line":" virtual_router_id {{ amp_vrrp_id }}"}],"source_content_type":"application/octet-stream","patch_set":23,"id":"da20952f_615398e3","line":30,"in_reply_to":"da20952f_5acbd61e","updated":"2015-09-08 21:46:58.000000000","message":"There are some issues here with nopreempt. The master election is enforced and it fallback anyway. There are some discussions on the instability of the \"nopreempt\" option and a possible workaround to set all VRRP instances to backup with the same priority ( see http://serverfault.com/questions/497182/keepalived-nopreempt-option-not-working). It needs further intensive testing indeed. For the moment, I will write a comment in the code about this and I will update the blueprint accordingly. I developed the base keepalived configuration to be extensible by other drivers that mix the keepalived driver in, hence the preempt option can be added in an extended keepalived configuration.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"0ceb1ea6a4c46da6638db2d8edbd573489e4a8ac","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{#"},{"line_number":2,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"application/octet-stream","patch_set":40,"id":"ba8a016a_7a2a222e","line":2,"updated":"2015-11-18 00:33:48.000000000","message":"Enterprise","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{#"},{"line_number":2,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"application/octet-stream","patch_set":40,"id":"ba8a016a_4754fe51","line":2,"in_reply_to":"ba8a016a_7a2a222e","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"}],"octavia/amphorae/drivers/keepalived/rest_api_driver.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        super(KeepalivedAmphoraDriverMixin, self).__init__()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        # TODO(sherif): create a configuration entry for keepalived template"},{"line_number":36,"context_line":"        # file"},{"line_number":37,"context_line":"        # The Mixed class must define a self.client object for the"},{"line_number":38,"context_line":"        # AmphoraApiClient"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_cd03370f","line":36,"updated":"2015-08-25 21:32:31.000000000","message":"do we still need that TODO?","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        super(KeepalivedAmphoraDriverMixin, self).__init__()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        # TODO(sherif): create a configuration entry for keepalived template"},{"line_number":36,"context_line":"        # file"},{"line_number":37,"context_line":"        # The Mixed class must define a self.client object for the"},{"line_number":38,"context_line":"        # AmphoraApiClient"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_ce13bf0c","line":36,"in_reply_to":"fa1b9901_cd03370f","updated":"2015-08-26 19:57:59.000000000","message":"No. The keepalived configuration only need service specific checks which do not impact the template itself. Removed.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"da20952f_9fe1609d","updated":"2015-09-02 00:49:43.000000000","message":"I don\u0027t think rest_api_driver is the best name here.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"# Copyright (c) 2015 Rackspace"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_1aa31e51","line":2,"updated":"2015-09-02 00:49:43.000000000","message":"Did Rackspace contribute to this?","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"# Copyright (c) 2015 Rackspace"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_066fdb2b","line":2,"in_reply_to":"da20952f_1aa31e51","updated":"2015-09-04 23:24:59.000000000","message":"Removed","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":24,"context_line":"API_VERSION \u003d constants.API_VERSION"},{"line_number":25,"context_line":"OCTAVIA_API_CLIENT \u003d ("},{"line_number":26,"context_line":"    \"Octavia Keepalived Rest Client/{version} \""},{"line_number":27,"context_line":"    \"(https://wiki.openstack.org/wiki/Octavia)\").format(version\u003dAPI_VERSION)"},{"line_number":28,"context_line":"CONF \u003d cfg.CONF"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_5a3516f5","line":27,"updated":"2015-09-02 00:49:43.000000000","message":"These doesn\u0027t seem to be used","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":24,"context_line":"API_VERSION \u003d constants.API_VERSION"},{"line_number":25,"context_line":"OCTAVIA_API_CLIENT \u003d ("},{"line_number":26,"context_line":"    \"Octavia Keepalived Rest Client/{version} \""},{"line_number":27,"context_line":"    \"(https://wiki.openstack.org/wiki/Octavia)\").format(version\u003dAPI_VERSION)"},{"line_number":28,"context_line":"CONF \u003d cfg.CONF"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_46e5d3a1","line":27,"in_reply_to":"da20952f_5a3516f5","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        # The Mixed class must define a self.client object for the"},{"line_number":36,"context_line":"        # AmphoraApiClient"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def update_vrrp_conf(self, loadbalancer):"},{"line_number":39,"context_line":"        \"\"\"Update amphorae of the loadbalancer with a new VRRP configuration"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        :param loadbalancer: loadbalancer object"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_f80b9a22","line":38,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        # The Mixed class must define a self.client object for the"},{"line_number":36,"context_line":"        # AmphoraApiClient"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def update_vrrp_conf(self, loadbalancer):"},{"line_number":39,"context_line":"        \"\"\"Update amphorae of the loadbalancer with a new VRRP configuration"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        :param loadbalancer: loadbalancer object"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_21db6023","line":38,"in_reply_to":"da20952f_f80b9a22","updated":"2015-09-08 21:46:58.000000000","message":"Covered in test_upload_keepalived_config","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            config \u003d templater.build_keepalived_config(loadbalancer, amp)"},{"line_number":51,"context_line":"            self.client.upload_vrrp_config(amp, config)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def stop_vrrp_service(self, loadbalancer):"},{"line_number":54,"context_line":"        \"\"\"Stop the vrrp services running on the loadbalancer\u0027s amphorae"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        :param loadbalancer: loadbalancer object"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_98137e5c","line":53,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            config \u003d templater.build_keepalived_config(loadbalancer, amp)"},{"line_number":51,"context_line":"            self.client.upload_vrrp_config(amp, config)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def stop_vrrp_service(self, loadbalancer):"},{"line_number":54,"context_line":"        \"\"\"Stop the vrrp services running on the loadbalancer\u0027s amphorae"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        :param loadbalancer: loadbalancer object"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_01b3bcea","line":53,"in_reply_to":"da20952f_98137e5c","updated":"2015-09-08 21:46:58.000000000","message":"Covered in test_manage_service_vrrp","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        :param loadbalancer: loadbalancer object"},{"line_number":57,"context_line":"        \"\"\""},{"line_number":58,"context_line":"        for amp in loadbalancer.amphorae:"},{"line_number":59,"context_line":"            self.client.stop_vrrp(amp)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def start_vrrp_service(self, loadbalancer):"},{"line_number":62,"context_line":"        \"\"\"Start the VRRP services of all amphorae of the loadbalancer"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_751cad6a","line":59,"updated":"2015-09-02 00:49:43.000000000","message":"Should log this too","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        :param loadbalancer: loadbalancer object"},{"line_number":57,"context_line":"        \"\"\""},{"line_number":58,"context_line":"        for amp in loadbalancer.amphorae:"},{"line_number":59,"context_line":"            self.client.stop_vrrp(amp)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def start_vrrp_service(self, loadbalancer):"},{"line_number":62,"context_line":"        \"\"\"Start the VRRP services of all amphorae of the loadbalancer"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_466ab3ee","line":59,"in_reply_to":"da20952f_751cad6a","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        for amp in loadbalancer.amphorae:"},{"line_number":59,"context_line":"            self.client.stop_vrrp(amp)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def start_vrrp_service(self, loadbalancer):"},{"line_number":62,"context_line":"        \"\"\"Start the VRRP services of all amphorae of the loadbalancer"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        :param loadbalancer: loadbalancer object"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_b80e8230","line":61,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        for amp in loadbalancer.amphorae:"},{"line_number":59,"context_line":"            self.client.stop_vrrp(amp)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def start_vrrp_service(self, loadbalancer):"},{"line_number":62,"context_line":"        \"\"\"Start the VRRP services of all amphorae of the loadbalancer"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        :param loadbalancer: loadbalancer object"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_c1cce463","line":61,"in_reply_to":"da20952f_b80e8230","updated":"2015-09-08 21:46:58.000000000","message":"Covered in test_manage_service_vrrp","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        LOG.debug(\"Start loadbalancer % amphora VRRP Service.\","},{"line_number":67,"context_line":"                  loadbalancer.id)"},{"line_number":68,"context_line":"        for amp in loadbalancer.amphorae:"},{"line_number":69,"context_line":"            LOG.debug(\"Start VRRP Service on amphora %s .\", amp.lb_network_ip)"},{"line_number":70,"context_line":"            self.client.start_vrrp(amp)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def reload_vrrp_service(self, loadbalancer):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_f5075d16","line":69,"updated":"2015-09-02 00:49:43.000000000","message":"This could be info level","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        LOG.debug(\"Start loadbalancer % amphora VRRP Service.\","},{"line_number":67,"context_line":"                  loadbalancer.id)"},{"line_number":68,"context_line":"        for amp in loadbalancer.amphorae:"},{"line_number":69,"context_line":"            LOG.debug(\"Start VRRP Service on amphora %s .\", amp.lb_network_ip)"},{"line_number":70,"context_line":"            self.client.start_vrrp(amp)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def reload_vrrp_service(self, loadbalancer):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_86644b22","line":69,"in_reply_to":"da20952f_f5075d16","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            LOG.debug(\"Start VRRP Service on amphora %s .\", amp.lb_network_ip)"},{"line_number":70,"context_line":"            self.client.start_vrrp(amp)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def reload_vrrp_service(self, loadbalancer):"},{"line_number":73,"context_line":"        \"\"\"Reload the VRRP services of all amphorae of the loadbalancer"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        :param loadbalancer: loadbalancer object"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_581de664","line":72,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            LOG.debug(\"Start VRRP Service on amphora %s .\", amp.lb_network_ip)"},{"line_number":70,"context_line":"            self.client.start_vrrp(amp)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def reload_vrrp_service(self, loadbalancer):"},{"line_number":73,"context_line":"        \"\"\"Reload the VRRP services of all amphorae of the loadbalancer"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        :param loadbalancer: loadbalancer object"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_c1c5c43d","line":72,"in_reply_to":"da20952f_581de664","updated":"2015-09-08 21:46:58.000000000","message":"Covered in test_manage_service_vrrp","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        :param loadbalancer: loadbalancer object"},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        for amp in loadbalancer.amphorae:"},{"line_number":78,"context_line":"            self.client.reload_vrrp(amp)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def delete_vrrp_service(self, loadbalancer):"},{"line_number":81,"context_line":"        \"\"\"Delete the VRRP services from all amphorae of the loadbalancer"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_9519417c","line":78,"updated":"2015-09-02 00:49:43.000000000","message":"Should log this too","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        :param loadbalancer: loadbalancer object"},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        for amp in loadbalancer.amphorae:"},{"line_number":78,"context_line":"            self.client.reload_vrrp(amp)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def delete_vrrp_service(self, loadbalancer):"},{"line_number":81,"context_line":"        \"\"\"Delete the VRRP services from all amphorae of the loadbalancer"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_26af7f2b","line":78,"in_reply_to":"da20952f_9519417c","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        for amp in loadbalancer.amphorae:"},{"line_number":78,"context_line":"            self.client.reload_vrrp(amp)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def delete_vrrp_service(self, loadbalancer):"},{"line_number":81,"context_line":"        \"\"\"Delete the VRRP services from all amphorae of the loadbalancer"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        :param loadbalancer: loadbalancer object"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_75334df7","line":80,"updated":"2015-09-02 00:49:43.000000000","message":"If this is not needed we should remove all of the code stubs for it.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        for amp in loadbalancer.amphorae:"},{"line_number":78,"context_line":"            self.client.reload_vrrp(amp)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def delete_vrrp_service(self, loadbalancer):"},{"line_number":81,"context_line":"        \"\"\"Delete the VRRP services from all amphorae of the loadbalancer"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        :param loadbalancer: loadbalancer object"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_66b81776","line":80,"in_reply_to":"da20952f_75334df7","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"}],"octavia/amphorae/drivers/keepalived/vrrp_rest_driver.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"0ceb1ea6a4c46da6638db2d8edbd573489e4a8ac","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_fac4d25f","line":1,"updated":"2015-11-18 00:33:48.000000000","message":"Enterprise","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_4702be3e","line":1,"in_reply_to":"ba8a016a_fac4d25f","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"}],"octavia/cmd/haproxy_vrrp_check.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"fa1b9901_73a8c98c","updated":"2015-08-26 04:17:04.000000000","message":"I need a better explanation for the existence of this file.  Isn\u0027t keepalived supposed to do vrrp checks? This is going a step further and querying the haproxy stats socket for each listener.  Will this initiate a failover?","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    :param sock_address: unix socket file"},{"line_number":23,"context_line":"    :return: 0 if haproxy frontend status is OPEN, and 1 otherwise"},{"line_number":24,"context_line":"    \"\"\""},{"line_number":25,"context_line":"    s \u003d socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)"},{"line_number":26,"context_line":"    s.connect(sock_address)"},{"line_number":27,"context_line":"    s.send(\u0027show stat -1 1 -1\u0027 + \u0027\\n\u0027)"},{"line_number":28,"context_line":"    data \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_1f46364f","line":25,"updated":"2015-08-25 21:32:31.000000000","message":"Any reason we don\u0027t us the stuff in amphora/backend/utils?","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    :param sock_address: unix socket file"},{"line_number":23,"context_line":"    :return: 0 if haproxy frontend status is OPEN, and 1 otherwise"},{"line_number":24,"context_line":"    \"\"\""},{"line_number":25,"context_line":"    s \u003d socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)"},{"line_number":26,"context_line":"    s.connect(sock_address)"},{"line_number":27,"context_line":"    s.send(\u0027show stat -1 1 -1\u0027 + \u0027\\n\u0027)"},{"line_number":28,"context_line":"    data \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_2ec4bb3e","line":25,"in_reply_to":"fa1b9901_1f46364f","updated":"2015-08-26 19:57:59.000000000","message":"Yes. This script runs at a very high frequency (every 1 sec or so). Keepalived loads it from scratch every time and using the amphora/backend/utils will make it very slow as it loads a lot of modules. In such case we will have undesirable restriction on the timing (e.g. check period \u003e\u003d 10 seconds). \n\nWe really need these check scripts to be as lightweight as possible. If this was not a python based project, I would write it in c :)\n\nThere are some other optimizations that can be done here. But it would very sophisticated at this  stage.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def get_status(sock_address):"},{"line_number":20,"context_line":"    \"\"\"Query haproxy stat socket and parse the frontend status"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    :param sock_address: unix socket file"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_184d2e72","line":19,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def get_status(sock_address):"},{"line_number":20,"context_line":"    \"\"\"Query haproxy stat socket and parse the frontend status"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    :param sock_address: unix socket file"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_558648dc","line":19,"in_reply_to":"da20952f_184d2e72","updated":"2015-09-08 21:46:58.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    :param sock_address: unix socket file"},{"line_number":23,"context_line":"    :return: 0 if haproxy frontend status is OPEN, and 1 otherwise"},{"line_number":24,"context_line":"    \"\"\""},{"line_number":25,"context_line":"    s \u003d socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)"},{"line_number":26,"context_line":"    s.connect(sock_address)"},{"line_number":27,"context_line":"    s.send(\u0027show stat -1 1 -1\u0027 + \u0027\\n\u0027)"},{"line_number":28,"context_line":"    data \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_15af7195","line":25,"updated":"2015-09-02 00:49:43.000000000","message":"We probably need to set some connect timeouts here.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    :param sock_address: unix socket file"},{"line_number":23,"context_line":"    :return: 0 if haproxy frontend status is OPEN, and 1 otherwise"},{"line_number":24,"context_line":"    \"\"\""},{"line_number":25,"context_line":"    s \u003d socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)"},{"line_number":26,"context_line":"    s.connect(sock_address)"},{"line_number":27,"context_line":"    s.send(\u0027show stat -1 1 -1\u0027 + \u0027\\n\u0027)"},{"line_number":28,"context_line":"    data \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_b046db4d","line":25,"in_reply_to":"da20952f_15af7195","updated":"2015-09-08 21:46:58.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    for row in data.split(\u0027\\n\u0027):"},{"line_number":35,"context_line":"        t \u003d row.split(\u0027,\u0027)"},{"line_number":36,"context_line":"        if t[1] \u003d\u003d \u0027FRONTEND\u0027:"},{"line_number":37,"context_line":"            if t[17] \u003d\u003d \u0027OPEN\u0027:"},{"line_number":38,"context_line":"                return 0"},{"line_number":39,"context_line":"            return 1"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_f5fc3d74","line":37,"updated":"2015-09-02 00:49:43.000000000","message":"This will fail over the haproxy if the connection limit has been met.  I don\u0027t think that is the right answer as it will just make the connection issue worse.  We should probably look for backend(pool) in ERROR.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    for row in data.split(\u0027\\n\u0027):"},{"line_number":35,"context_line":"        t \u003d row.split(\u0027,\u0027)"},{"line_number":36,"context_line":"        if t[1] \u003d\u003d \u0027FRONTEND\u0027:"},{"line_number":37,"context_line":"            if t[17] \u003d\u003d \u0027OPEN\u0027:"},{"line_number":38,"context_line":"                return 0"},{"line_number":39,"context_line":"            return 1"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_5072dfb1","line":37,"in_reply_to":"da20952f_f5fc3d74","updated":"2015-09-08 21:46:58.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            return 1"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def health_check(sock_addresses):"},{"line_number":43,"context_line":"    \"\"\"Invoke queries for all defined listeners"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    :param sock_addresses:"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_583406dd","line":42,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":"    status \u003d 0"},{"line_number":49,"context_line":"    for address in sock_addresses:"},{"line_number":50,"context_line":"        status +\u003d get_status(address)"},{"line_number":51,"context_line":"    return status"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_759eed64","line":50,"updated":"2015-09-02 00:49:43.000000000","message":"What about exception handling?\nExample, timeouts, error, etc.\nMaybe letting the exception bubble up is the right answer here when any one of them raises an exception.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":"    status \u003d 0"},{"line_number":49,"context_line":"    for address in sock_addresses:"},{"line_number":50,"context_line":"        status +\u003d get_status(address)"},{"line_number":51,"context_line":"    return status"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_7085a357","line":50,"in_reply_to":"da20952f_759eed64","updated":"2015-09-08 21:46:58.000000000","message":"Yeah I have the exception handling in main(). If any exception was raised, exist status is 1 . I think this is all what we need.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    return status"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def main():"},{"line_number":55,"context_line":"    # usage python haproxy_health_check.py \u003clist_of_stat_sockets\u003e"},{"line_number":56,"context_line":"    # Note: for performance, this script loads minimal number of module."},{"line_number":57,"context_line":"    # Loading octavia modules or any other complex construct MUST be avoided."}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_b83522dc","line":54,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    return status"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def main():"},{"line_number":55,"context_line":"    # usage python haproxy_health_check.py \u003clist_of_stat_sockets\u003e"},{"line_number":56,"context_line":"    # Note: for performance, this script loads minimal number of module."},{"line_number":57,"context_line":"    # Loading octavia modules or any other complex construct MUST be avoided."}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_35a39402","line":54,"in_reply_to":"da20952f_b83522dc","updated":"2015-09-08 21:46:58.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"0ceb1ea6a4c46da6638db2d8edbd573489e4a8ac","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_9a890629","line":1,"updated":"2015-11-18 00:33:48.000000000","message":"Enterprise","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_e7565229","line":1,"in_reply_to":"ba8a016a_9a890629","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    Only VRRP fail over if the stats socket is not responding."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    :param sock_address: unix socket file"},{"line_number":27,"context_line":"    :return: 0 if haproxy responded"},{"line_number":28,"context_line":"    \"\"\""},{"line_number":29,"context_line":"    s \u003d socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)"},{"line_number":30,"context_line":"    s.settimeout(SOCKET_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_59ac13ed","line":27,"updated":"2015-11-17 21:56:10.000000000","message":"Always return 0 or I miss something?","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"0ceb1ea6a4c46da6638db2d8edbd573489e4a8ac","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    Only VRRP fail over if the stats socket is not responding."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    :param sock_address: unix socket file"},{"line_number":27,"context_line":"    :return: 0 if haproxy responded"},{"line_number":28,"context_line":"    \"\"\""},{"line_number":29,"context_line":"    s \u003d socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)"},{"line_number":30,"context_line":"    s.settimeout(SOCKET_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_3aa01a90","line":27,"in_reply_to":"ba8a016a_59ac13ed","updated":"2015-11-18 00:33:48.000000000","message":"Will throw an exception if the socket is missing/closed","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":"    status \u003d 0"},{"line_number":49,"context_line":"    for address in sock_addresses:"},{"line_number":50,"context_line":"        status +\u003d get_status(address)"},{"line_number":51,"context_line":"    return status"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_99803b48","line":50,"updated":"2015-11-17 21:56:10.000000000","message":"get_status() seems always return 0...","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":"    status \u003d 0"},{"line_number":49,"context_line":"    for address in sock_addresses:"},{"line_number":50,"context_line":"        status +\u003d get_status(address)"},{"line_number":51,"context_line":"    return status"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_e72df2a8","line":50,"in_reply_to":"ba8a016a_99803b48","updated":"2015-11-18 18:10:19.000000000","message":"Yes, this is simply to check that there are live haproxy processes responding on the socket","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def main():"},{"line_number":55,"context_line":"    # usage python haproxy_health_check.py \u003clist_of_stat_sockets\u003e"},{"line_number":56,"context_line":"    # Note: for performance, this script loads minimal number of module."},{"line_number":57,"context_line":"    # Loading octavia modules or any other complex construct MUST be avoided."},{"line_number":58,"context_line":"    listeners_sockets \u003d sys.argv[1:]"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_9e02616e","line":55,"updated":"2015-11-17 21:56:10.000000000","message":"wrong script name: haproxy_vrrp_check.py","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def main():"},{"line_number":55,"context_line":"    # usage python haproxy_health_check.py \u003clist_of_stat_sockets\u003e"},{"line_number":56,"context_line":"    # Note: for performance, this script loads minimal number of module."},{"line_number":57,"context_line":"    # Loading octavia modules or any other complex construct MUST be avoided."},{"line_number":58,"context_line":"    listeners_sockets \u003d sys.argv[1:]"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_991eca5d","line":55,"in_reply_to":"ba8a016a_9e02616e","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"eb4e38ca609466fe863119312df0cfdef3c61037","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        x \u003d s.recv(1024)"},{"line_number":36,"context_line":"        if not x:"},{"line_number":37,"context_line":"            break"},{"line_number":38,"context_line":"        data +\u003d x"},{"line_number":39,"context_line":"    return 0"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":53,"id":"7a740942_86db491b","line":38,"updated":"2015-12-03 22:36:40.000000000","message":"Since we don\u0027t do anything with this data, do we actually need to read it all? Couldn\u0027t we just send the command, see that ANYTHING comes back, and then close the socket and return 0?\n\nSpeaking of close the socket... Doesn\u0027t that need to happen?","commit_id":"15d018bc73270e100588048c94e4f82178c25987"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"c07ed4d6bdcc6bb34875549882b181923b669b4e","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        x \u003d s.recv(1024)"},{"line_number":36,"context_line":"        if not x:"},{"line_number":37,"context_line":"            break"},{"line_number":38,"context_line":"        data +\u003d x"},{"line_number":39,"context_line":"    return 0"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":53,"id":"7a740942_5c1774a3","line":38,"in_reply_to":"7a740942_86db491b","updated":"2015-12-03 23:28:36.000000000","message":"Ah, per the docs sockets are automatically close when garbage collected, so it would close on the return call.\nI will still update with an explicit close.","commit_id":"15d018bc73270e100588048c94e4f82178c25987"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"58a9967c894af16ebb1ea2a517df4f3044b3baf1","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        x \u003d s.recv(1024)"},{"line_number":36,"context_line":"        if not x:"},{"line_number":37,"context_line":"            break"},{"line_number":38,"context_line":"        data +\u003d x"},{"line_number":39,"context_line":"    return 0"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":53,"id":"7a740942_b9022a3d","line":38,"in_reply_to":"7a740942_86db491b","updated":"2015-12-03 22:50:38.000000000","message":"Interesting point about the close.  I will look at that.","commit_id":"15d018bc73270e100588048c94e4f82178c25987"}],"octavia/common/config.py":[{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"14197eb596d6a812444361732423bbd6c62e913e","unresolved":false,"context_lines":[{"line_number":234,"context_line":"               help\u003d_(\u0027Name of the cert generator to use\u0027)),"},{"line_number":235,"context_line":"    cfg.StrOpt(\u0027loadbalancer_topology\u0027,"},{"line_number":236,"context_line":"               default\u003dconstants.TOPOLOGY_SINGLE,"},{"line_number":237,"context_line":"               help\u003d_(\u0027Load balancer topology configuration\u0027))"},{"line_number":238,"context_line":"]"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"task_flow_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_88d8391f","line":237,"updated":"2015-11-08 09:54:48.000000000","message":"\"help\" param can be enhanced by listing proposed options with a small description for each.\n\nSINGLE: ...\n\nACTIVE_STANDBY: ...","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead3eb8af632b898332c40daaf8be8e74a742d42","unresolved":false,"context_lines":[{"line_number":234,"context_line":"               help\u003d_(\u0027Name of the cert generator to use\u0027)),"},{"line_number":235,"context_line":"    cfg.StrOpt(\u0027loadbalancer_topology\u0027,"},{"line_number":236,"context_line":"               default\u003dconstants.TOPOLOGY_SINGLE,"},{"line_number":237,"context_line":"               help\u003d_(\u0027Load balancer topology configuration\u0027))"},{"line_number":238,"context_line":"]"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"task_flow_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_2bba270b","line":237,"in_reply_to":"da85f559_88d8391f","updated":"2015-11-10 00:57:45.000000000","message":"Done","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"14197eb596d6a812444361732423bbd6c62e913e","unresolved":false,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"]"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"keepalived_vrrp_opts \u003d ["},{"line_number":277,"context_line":"    cfg.IntOpt(\u0027VRRP_ADVERT_INT\u0027,"},{"line_number":278,"context_line":"               default\u003d1,"},{"line_number":279,"context_line":"               help\u003d_(\u0027Amphora role and priority advertisement interval.\u0027)),"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_083a0937","line":276,"updated":"2015-11-08 09:54:48.000000000","message":"Why not proposing VRRP authentication?","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead3eb8af632b898332c40daaf8be8e74a742d42","unresolved":false,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"]"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"keepalived_vrrp_opts \u003d ["},{"line_number":277,"context_line":"    cfg.IntOpt(\u0027VRRP_ADVERT_INT\u0027,"},{"line_number":278,"context_line":"               default\u003d1,"},{"line_number":279,"context_line":"               help\u003d_(\u0027Amphora role and priority advertisement interval.\u0027)),"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_6b3d8fba","line":276,"in_reply_to":"da85f559_083a0937","updated":"2015-11-10 00:57:45.000000000","message":"We enable VRRP authentication, but we generate a unique password for each amphora pair automatically.  Since this is really just a VRRP router ID collision avoidance tool we think this is appropriate here and preferable to a deployment wide setting.","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"14197eb596d6a812444361732423bbd6c62e913e","unresolved":false,"context_lines":[{"line_number":276,"context_line":"keepalived_vrrp_opts \u003d ["},{"line_number":277,"context_line":"    cfg.IntOpt(\u0027VRRP_ADVERT_INT\u0027,"},{"line_number":278,"context_line":"               default\u003d1,"},{"line_number":279,"context_line":"               help\u003d_(\u0027Amphora role and priority advertisement interval.\u0027)),"},{"line_number":280,"context_line":"    cfg.IntOpt(\u0027VRRP_CHECK_INTERVAL\u0027,"},{"line_number":281,"context_line":"               default\u003d5,"},{"line_number":282,"context_line":"               help\u003d_(\u0027VRRP health check script run interval.\u0027)),"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_68f2b59c","line":279,"updated":"2015-11-08 09:54:48.000000000","message":"unit MUST be specify (seconds)","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead3eb8af632b898332c40daaf8be8e74a742d42","unresolved":false,"context_lines":[{"line_number":276,"context_line":"keepalived_vrrp_opts \u003d ["},{"line_number":277,"context_line":"    cfg.IntOpt(\u0027VRRP_ADVERT_INT\u0027,"},{"line_number":278,"context_line":"               default\u003d1,"},{"line_number":279,"context_line":"               help\u003d_(\u0027Amphora role and priority advertisement interval.\u0027)),"},{"line_number":280,"context_line":"    cfg.IntOpt(\u0027VRRP_CHECK_INTERVAL\u0027,"},{"line_number":281,"context_line":"               default\u003d5,"},{"line_number":282,"context_line":"               help\u003d_(\u0027VRRP health check script run interval.\u0027)),"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_eb773f9d","line":279,"in_reply_to":"da85f559_68f2b59c","updated":"2015-11-10 00:57:45.000000000","message":"Done","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"14197eb596d6a812444361732423bbd6c62e913e","unresolved":false,"context_lines":[{"line_number":279,"context_line":"               help\u003d_(\u0027Amphora role and priority advertisement interval.\u0027)),"},{"line_number":280,"context_line":"    cfg.IntOpt(\u0027VRRP_CHECK_INTERVAL\u0027,"},{"line_number":281,"context_line":"               default\u003d5,"},{"line_number":282,"context_line":"               help\u003d_(\u0027VRRP health check script run interval.\u0027)),"},{"line_number":283,"context_line":"    cfg.IntOpt(\u0027VRRP_FAIL_COUNT\u0027,"},{"line_number":284,"context_line":"               default\u003d2,"},{"line_number":285,"context_line":"               help\u003d_(\u0027Number of successive failure before transition to a \u0027"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_88efd9af","line":282,"updated":"2015-11-08 09:54:48.000000000","message":"itto","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead3eb8af632b898332c40daaf8be8e74a742d42","unresolved":false,"context_lines":[{"line_number":279,"context_line":"               help\u003d_(\u0027Amphora role and priority advertisement interval.\u0027)),"},{"line_number":280,"context_line":"    cfg.IntOpt(\u0027VRRP_CHECK_INTERVAL\u0027,"},{"line_number":281,"context_line":"               default\u003d5,"},{"line_number":282,"context_line":"               help\u003d_(\u0027VRRP health check script run interval.\u0027)),"},{"line_number":283,"context_line":"    cfg.IntOpt(\u0027VRRP_FAIL_COUNT\u0027,"},{"line_number":284,"context_line":"               default\u003d2,"},{"line_number":285,"context_line":"               help\u003d_(\u0027Number of successive failure before transition to a \u0027"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_8b6eb3c7","line":282,"in_reply_to":"da85f559_88efd9af","updated":"2015-11-10 00:57:45.000000000","message":"Done","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":247,"context_line":"               default\u003dconstants.TOPOLOGY_SINGLE,"},{"line_number":248,"context_line":"               help\u003d_(\u0027Load balancer topology configuration. \u0027"},{"line_number":249,"context_line":"                      \u0027SINGLE - One amphora per load balancer. \u0027"},{"line_number":250,"context_line":"                      \u0027ACTIVE_STANDBY - Two amphora per load balancer.\u0027))"},{"line_number":251,"context_line":"]"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"task_flow_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_723a82e9","line":250,"updated":"2015-11-22 05:41:18.000000000","message":"there\u0027s a choices kwarg you can use here so that oslo_config will validate that the option chose is correct.\n\nchoices\u003d(constants.TOPOLOGY_SINGLE, constants.TOPOLOGY_ACTIVE_STANDBY)\n\nThis way if a nonexistent topology is chosen, it\u0027ll fail on start.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":247,"context_line":"               default\u003dconstants.TOPOLOGY_SINGLE,"},{"line_number":248,"context_line":"               help\u003d_(\u0027Load balancer topology configuration. \u0027"},{"line_number":249,"context_line":"                      \u0027SINGLE - One amphora per load balancer. \u0027"},{"line_number":250,"context_line":"                      \u0027ACTIVE_STANDBY - Two amphora per load balancer.\u0027))"},{"line_number":251,"context_line":"]"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"task_flow_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_39c7fa46","line":250,"in_reply_to":"ba8a016a_723a82e9","updated":"2015-11-23 02:01:39.000000000","message":"Done","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"}],"octavia/common/constants.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":192,"context_line":"AGENT_API_TEMPLATES \u003d \u0027/templates\u0027"},{"line_number":193,"context_line":"API_VERSION \u003d \u00270.5\u0027"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"HAPROXY_PEER_PORT \u003d 1024"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_1fb4f632","line":195,"updated":"2015-08-25 21:32:31.000000000","message":"should that be configurable?","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":192,"context_line":"AGENT_API_TEMPLATES \u003d \u0027/templates\u0027"},{"line_number":193,"context_line":"API_VERSION \u003d \u00270.5\u0027"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"HAPROXY_PEER_PORT \u003d 1024"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_6e54f353","line":195,"in_reply_to":"fa1b9901_1fb4f632","updated":"2015-08-26 19:57:59.000000000","message":"Yes there are several variables here that should be configurable:\n\nVRRP_CHECK_INTERVAL \nVRRP_FAIL_COUNT\nVRRP_SUCCESS_COUNT\nHAPROXY_PEER_PORT\n\nI will work on that in a separate commit.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":178,"context_line":"ROLE_MASTER_PRIORITY \u003d 100"},{"line_number":179,"context_line":"ROLE_BACKUP_PRIORITY \u003d 50"},{"line_number":180,"context_line":"VRRP_AUTH_DEFAULT \u003d \u0027PASS\u0027"},{"line_number":181,"context_line":"VRRP_ADVERT_INT \u003d 1"},{"line_number":182,"context_line":"KEEPALIVED_CMD \u003d \u0027/usr/local/sbin/keepalived \u0027"},{"line_number":183,"context_line":"# The DEFAULT_VRRP_ID value needs to be variable for multi tenant support"},{"line_number":184,"context_line":"# per amphora in the future"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_954aa1ab","line":181,"updated":"2015-09-02 00:49:43.000000000","message":"Should be a config setting.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":185,"context_line":"DEFAULT_VRRP_ID \u003d 1"},{"line_number":186,"context_line":"VRRP_PROTOCOL_NUM \u003d 112"},{"line_number":187,"context_line":"AUTH_HEADER_PROTOCOL_NUMBER \u003d 51"},{"line_number":188,"context_line":"VRRP_CHECK_INTERVAL \u003d 5"},{"line_number":189,"context_line":"VRRP_FAIL_COUNT \u003d 2"},{"line_number":190,"context_line":"VRRP_SUCCESS_COUNT \u003d 2"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_55cba91e","line":188,"updated":"2015-09-02 00:49:43.000000000","message":"Should be a config setting.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":186,"context_line":"VRRP_PROTOCOL_NUM \u003d 112"},{"line_number":187,"context_line":"AUTH_HEADER_PROTOCOL_NUMBER \u003d 51"},{"line_number":188,"context_line":"VRRP_CHECK_INTERVAL \u003d 5"},{"line_number":189,"context_line":"VRRP_FAIL_COUNT \u003d 2"},{"line_number":190,"context_line":"VRRP_SUCCESS_COUNT \u003d 2"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"SUPPORTED_LB_TOPOLOGIES \u003d (TOPOLOGY_ACTIVE_STANDBY, TOPOLOGY_SINGLE)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_f5cf5d27","line":189,"updated":"2015-09-02 00:49:43.000000000","message":"Should be a config setting.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":187,"context_line":"AUTH_HEADER_PROTOCOL_NUMBER \u003d 51"},{"line_number":188,"context_line":"VRRP_CHECK_INTERVAL \u003d 5"},{"line_number":189,"context_line":"VRRP_FAIL_COUNT \u003d 2"},{"line_number":190,"context_line":"VRRP_SUCCESS_COUNT \u003d 2"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"SUPPORTED_LB_TOPOLOGIES \u003d (TOPOLOGY_ACTIVE_STANDBY, TOPOLOGY_SINGLE)"},{"line_number":193,"context_line":"SUPPORTED_AMPHORA_ROLES \u003d (ROLE_BACKUP, ROLE_MASTER, ROLE_STANDALONE)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_d5d7b9bd","line":190,"updated":"2015-09-02 00:49:43.000000000","message":"Should be a config setting.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"}],"octavia/common/data_models.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        self.vrrp_port_id \u003d vrrp_port_id"},{"line_number":257,"context_line":"        self.ha_port_id \u003d ha_port_id"},{"line_number":258,"context_line":"        self.role \u003d role"},{"line_number":259,"context_line":"        self.vrrp_intf \u003d vrrp_intf"},{"line_number":260,"context_line":"        self.vrrp_id \u003d vrrp_id"},{"line_number":261,"context_line":"        self.vrrp_priority \u003d vrrp_priority"},{"line_number":262,"context_line":"        self.load_balancer \u003d load_balancer"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_d37f55de","line":259,"updated":"2015-08-26 04:17:04.000000000","message":"is intf interface? if so can we just type out interface so its more clear?","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        self.vrrp_port_id \u003d vrrp_port_id"},{"line_number":257,"context_line":"        self.ha_port_id \u003d ha_port_id"},{"line_number":258,"context_line":"        self.role \u003d role"},{"line_number":259,"context_line":"        self.vrrp_intf \u003d vrrp_intf"},{"line_number":260,"context_line":"        self.vrrp_id \u003d vrrp_id"},{"line_number":261,"context_line":"        self.vrrp_priority \u003d vrrp_priority"},{"line_number":262,"context_line":"        self.load_balancer \u003d load_balancer"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_c208732b","line":259,"in_reply_to":"fa1b9901_d37f55de","updated":"2015-08-26 19:57:59.000000000","message":"Done","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        self.amphorae \u003d amphorae or []"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class VrrpGroup(BaseDataModel):"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def __init__(self, load_balancer_id\u003dNone, vrrp_group_name\u003dNone,"},{"line_number":196,"context_line":"                 vrrp_auth_type\u003dNone, vrrp_auth_pass\u003dNone, advert_int\u003dNone,"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_d86d76cd","line":193,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        self.vrrp_auth_pass \u003d vrrp_auth_pass"},{"line_number":203,"context_line":"        self.advert_int \u003d advert_int"},{"line_number":204,"context_line":"        self.smtp_server \u003d smtp_server"},{"line_number":205,"context_line":"        self.smtp_connect_timeout \u003d smtp_connect_timeout"},{"line_number":206,"context_line":"        self.load_balancer \u003d load_balancer"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_3562b517","line":205,"updated":"2015-09-02 00:49:43.000000000","message":"Remove these as they are not implemented","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        self.vrrp_auth_pass \u003d vrrp_auth_pass"},{"line_number":203,"context_line":"        self.advert_int \u003d advert_int"},{"line_number":204,"context_line":"        self.smtp_server \u003d smtp_server"},{"line_number":205,"context_line":"        self.smtp_connect_timeout \u003d smtp_connect_timeout"},{"line_number":206,"context_line":"        self.load_balancer \u003d load_balancer"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_bc7a9622","line":205,"in_reply_to":"da20952f_3562b517","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        self.default_pool \u003d default_pool"},{"line_number":168,"context_line":"        self.load_balancer \u003d load_balancer"},{"line_number":169,"context_line":"        self.sni_containers \u003d sni_containers"},{"line_number":170,"context_line":"        self.sync_port \u003d sync_port"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class LoadBalancer(BaseDataModel):"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_1255361c","line":170,"updated":"2015-11-22 05:41:18.000000000","message":"can we rename this to peer_sync_port or just peer_port? it wasn\u0027t overtly obvious to me what this was at first.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        self.default_pool \u003d default_pool"},{"line_number":168,"context_line":"        self.load_balancer \u003d load_balancer"},{"line_number":169,"context_line":"        self.sni_containers \u003d sni_containers"},{"line_number":170,"context_line":"        self.sync_port \u003d sync_port"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class LoadBalancer(BaseDataModel):"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_f91c12c3","line":170,"in_reply_to":"ba8a016a_1255361c","updated":"2015-11-23 02:01:39.000000000","message":"Done","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"}],"octavia/common/utils.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    return rndstr[0:length]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def get_vrrp_id_from_ip(ip_addr):"},{"line_number":55,"context_line":"    \"\"\"Get a unique vrrp id from 0 to 255 based on a given ip address.\"\"\""},{"line_number":56,"context_line":"    try:"},{"line_number":57,"context_line":"        i \u003d binascii.hexlify(socket.inet_pton(socket.AF_INET, ip_addr))[-2:]"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_5862c6d9","line":54,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"37f63da463afebef03a6f29b6e7b8fb6e2fde450","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    return rndstr[0:length]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def get_vrrp_id_from_ip(ip_addr):"},{"line_number":55,"context_line":"    \"\"\"Get a unique vrrp id from 0 to 255 based on a given ip address.\"\"\""},{"line_number":56,"context_line":"    try:"},{"line_number":57,"context_line":"        i \u003d binascii.hexlify(socket.inet_pton(socket.AF_INET, ip_addr))[-2:]"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_dc792b84","line":54,"in_reply_to":"da20952f_5862c6d9","updated":"2015-09-08 21:46:58.000000000","message":"Removed this function.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41cd7b3f8a0d48544941cd0ed42f4bda9b3f19ce","unresolved":false,"context_lines":[{"line_number":54,"context_line":"def get_vrrp_id_from_ip(ip_addr):"},{"line_number":55,"context_line":"    \"\"\"Get a unique vrrp id from 0 to 255 based on a given ip address.\"\"\""},{"line_number":56,"context_line":"    try:"},{"line_number":57,"context_line":"        i \u003d binascii.hexlify(socket.inet_pton(socket.AF_INET, ip_addr))[-2:]"},{"line_number":58,"context_line":"    except socket.error:"},{"line_number":59,"context_line":"        i \u003d binascii.hexlify(socket.inet_pton(socket.AF_INET6, ip_addr))[-2:]"},{"line_number":60,"context_line":"    return int(i, 16)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_754cac76","line":57,"updated":"2015-09-02 00:49:43.000000000","message":"This will not produce unique ids.\nExample \u002710.1.1.1\u0027 and \u002710.1.2.1\u0027 both return 01","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":54,"context_line":"def get_vrrp_id_from_ip(ip_addr):"},{"line_number":55,"context_line":"    \"\"\"Get a unique vrrp id from 0 to 255 based on a given ip address.\"\"\""},{"line_number":56,"context_line":"    try:"},{"line_number":57,"context_line":"        i \u003d binascii.hexlify(socket.inet_pton(socket.AF_INET, ip_addr))[-2:]"},{"line_number":58,"context_line":"    except socket.error:"},{"line_number":59,"context_line":"        i \u003d binascii.hexlify(socket.inet_pton(socket.AF_INET6, ip_addr))[-2:]"},{"line_number":60,"context_line":"    return int(i, 16)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_c655631e","line":57,"in_reply_to":"da20952f_754cac76","updated":"2015-09-04 23:24:59.000000000","message":"Removed this function as it is not needed any more. VRRP_ID must be constant for both master and backup.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"}],"octavia/controller/worker/controller_worker.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":262,"context_line":"                store\u003dstore)"},{"line_number":263,"context_line":"            with tf_logging.DynamicLoggingListener(create_active_standby_lb_tf,"},{"line_number":264,"context_line":"                                                   log\u003dLOG):"},{"line_number":265,"context_line":"                # TODO(sherif): Exception handling required"},{"line_number":266,"context_line":"                create_active_standby_lb_tf.run()"},{"line_number":267,"context_line":"                post_lb_amp_assoc \u003d self._taskflow_load("},{"line_number":268,"context_line":"                    self._amphora_flows.get_post_lb_amp_association_flow("}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_1fb95615","line":265,"updated":"2015-08-25 21:32:31.000000000","message":"is this still necessary? please add that prior to merging","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":262,"context_line":"                store\u003dstore)"},{"line_number":263,"context_line":"            with tf_logging.DynamicLoggingListener(create_active_standby_lb_tf,"},{"line_number":264,"context_line":"                                                   log\u003dLOG):"},{"line_number":265,"context_line":"                # TODO(sherif): Exception handling required"},{"line_number":266,"context_line":"                create_active_standby_lb_tf.run()"},{"line_number":267,"context_line":"                post_lb_amp_assoc \u003d self._taskflow_load("},{"line_number":268,"context_line":"                    self._amphora_flows.get_post_lb_amp_association_flow("}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_e2f7b7f3","line":265,"in_reply_to":"fa1b9901_1fb95615","updated":"2015-08-26 19:57:59.000000000","message":"No this was before the conditional flow thing.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                            create_amp_lb_tf.run()"},{"line_number":295,"context_line":"                        except exceptions.ComputeBuildException as e:"},{"line_number":296,"context_line":"                            raise exceptions.NoSuitableAmphoraException("},{"line_number":297,"context_line":"                                msg\u003de.msg)"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    def delete_load_balancer(self, load_balancer_id):"},{"line_number":300,"context_line":"        \"\"\"Deletes a load balancer by de-allocating Amphorae."}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_53010537","line":297,"updated":"2015-08-26 04:17:04.000000000","message":"the large if statements begin :(.  This is going to get messy in the.  I hope we can eventually devise a better way to do this, utilizing the pluggable controller worker maybe.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                            create_amp_lb_tf.run()"},{"line_number":295,"context_line":"                        except exceptions.ComputeBuildException as e:"},{"line_number":296,"context_line":"                            raise exceptions.NoSuitableAmphoraException("},{"line_number":297,"context_line":"                                msg\u003de.msg)"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    def delete_load_balancer(self, load_balancer_id):"},{"line_number":300,"context_line":"        \"\"\"Deletes a load balancer by de-allocating Amphorae."}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_e213370c","line":297,"in_reply_to":"fa1b9901_53010537","updated":"2015-08-26 19:57:59.000000000","message":"For this patch, this would be way cleaner after:\n# TODO(sherif): Use the new conditional flow as create_active_standby_lb_tf \n\nThe If conditions here would be deciders in the conditional taskflow.\n\nThis taskflow bug (https://bugs.launchpad.net/taskflow/+bug/1479466) prevents me from doing it at this point without  a messier workaround.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        store \u003d {constants.LOADBALANCER_ID: load_balancer_id}"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        if self.IS_ACTIVE_STANDBY:"},{"line_number":257,"context_line":"            store[constants.UPDATE_DICT] \u003d {"},{"line_number":258,"context_line":"                constants.LOADBALANCER_TOPOLOGY:"},{"line_number":259,"context_line":"                    constants.TOPOLOGY_ACTIVE_STANDBY}"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_58b9662d","line":256,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test for this code block","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                                                   log\u003dLOG):"},{"line_number":265,"context_line":"                create_active_standby_lb_tf.run()"},{"line_number":266,"context_line":"                post_lb_amp_assoc \u003d self._taskflow_load("},{"line_number":267,"context_line":"                    self._amphora_flows.get_post_lb_amp_association_flow("},{"line_number":268,"context_line":"                        prefix\u003d\u0027post-amphora-association\u0027), store\u003dstore)"},{"line_number":269,"context_line":"                with tf_logging.DynamicLoggingListener(post_lb_amp_assoc,"},{"line_number":270,"context_line":"                                                       log\u003dLOG):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_d06322dc","line":267,"updated":"2015-09-02 23:20:48.000000000","message":"This should be one flow","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                                                   log\u003dLOG):"},{"line_number":265,"context_line":"                create_active_standby_lb_tf.run()"},{"line_number":266,"context_line":"                post_lb_amp_assoc \u003d self._taskflow_load("},{"line_number":267,"context_line":"                    self._amphora_flows.get_post_lb_amp_association_flow("},{"line_number":268,"context_line":"                        prefix\u003d\u0027post-amphora-association\u0027), store\u003dstore)"},{"line_number":269,"context_line":"                with tf_logging.DynamicLoggingListener(post_lb_amp_assoc,"},{"line_number":270,"context_line":"                                                       log\u003dLOG):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_bcc85656","line":267,"in_reply_to":"da20952f_d06322dc","updated":"2015-09-04 23:24:59.000000000","message":"This is not possible with current taskflow version, until this bug is solved \nhttps://bugs.launchpad.net/taskflow/+bug/1479466. I added a comment for this.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"14197eb596d6a812444361732423bbd6c62e913e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self._member_repo \u003d repo.MemberRepository()"},{"line_number":53,"context_line":"        self._pool_repo \u003d repo.PoolRepository()"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        self.IS_ACTIVE_STANDBY \u003d ("},{"line_number":56,"context_line":"            CONF.controller_worker.loadbalancer_topology \u003d\u003d"},{"line_number":57,"context_line":"            constants.TOPOLOGY_ACTIVE_STANDBY)"},{"line_number":58,"context_line":"        super(ControllerWorker, self).__init__()"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_0811a9ac","line":55,"updated":"2015-11-08 09:54:48.000000000","message":"Is IS_ACTIVE_STANDBY needs to be an Instance variable as CONF.controller_worker.loadbalancer_topology is a global configuration ?","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead3eb8af632b898332c40daaf8be8e74a742d42","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self._member_repo \u003d repo.MemberRepository()"},{"line_number":53,"context_line":"        self._pool_repo \u003d repo.PoolRepository()"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        self.IS_ACTIVE_STANDBY \u003d ("},{"line_number":56,"context_line":"            CONF.controller_worker.loadbalancer_topology \u003d\u003d"},{"line_number":57,"context_line":"            constants.TOPOLOGY_ACTIVE_STANDBY)"},{"line_number":58,"context_line":"        super(ControllerWorker, self).__init__()"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_8bb0f3de","line":55,"in_reply_to":"da85f559_0811a9ac","updated":"2015-11-10 00:57:45.000000000","message":"We will likely be updating the code to support the active/standby setting via flavors when they are ready.","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"14197eb596d6a812444361732423bbd6c62e913e","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        if self.IS_ACTIVE_STANDBY:"},{"line_number":261,"context_line":"            store[constants.UPDATE_DICT] \u003d {"},{"line_number":262,"context_line":"                constants.LOADBALANCER_TOPOLOGY:"},{"line_number":263,"context_line":"                    constants.TOPOLOGY_ACTIVE_STANDBY}"},{"line_number":264,"context_line":"            create_active_standby_lb_tf \u003d self._taskflow_load("},{"line_number":265,"context_line":"                self._amphora_flows.get_create_active_standby_lb_flow(),"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_0888c9e6","line":262,"updated":"2015-11-08 09:54:48.000000000","message":"Wrong indentation","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead3eb8af632b898332c40daaf8be8e74a742d42","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        if self.IS_ACTIVE_STANDBY:"},{"line_number":261,"context_line":"            store[constants.UPDATE_DICT] \u003d {"},{"line_number":262,"context_line":"                constants.LOADBALANCER_TOPOLOGY:"},{"line_number":263,"context_line":"                    constants.TOPOLOGY_ACTIVE_STANDBY}"},{"line_number":264,"context_line":"            create_active_standby_lb_tf \u003d self._taskflow_load("},{"line_number":265,"context_line":"                self._amphora_flows.get_create_active_standby_lb_flow(),"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_0ba0839e","line":262,"in_reply_to":"da85f559_0888c9e6","updated":"2015-11-10 00:57:45.000000000","message":"Done","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":266,"context_line":"        else:"},{"line_number":267,"context_line":"            LOG.error(_LE(\"Unknown topology: %s.  Unable to build load \""},{"line_number":268,"context_line":"                          \"balancer.\"), topology)"},{"line_number":269,"context_line":"            raise exceptions.InvalidTopology(topology\u003dtopology)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        create_active_standby_lb_tf \u003d self._taskflow_load("},{"line_number":272,"context_line":"            self._lb_flows.get_create_load_balancer_flow("}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_d2356ef7","line":269,"updated":"2015-11-22 05:41:18.000000000","message":"with the suggestion i made in the config.py module, this else statement should never be hit.  However, I can understand the caution if you still wanted to keep it.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":266,"context_line":"        else:"},{"line_number":267,"context_line":"            LOG.error(_LE(\"Unknown topology: %s.  Unable to build load \""},{"line_number":268,"context_line":"                          \"balancer.\"), topology)"},{"line_number":269,"context_line":"            raise exceptions.InvalidTopology(topology\u003dtopology)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        create_active_standby_lb_tf \u003d self._taskflow_load("},{"line_number":272,"context_line":"            self._lb_flows.get_create_load_balancer_flow("}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_5982fec9","line":269,"in_reply_to":"ba8a016a_d2356ef7","updated":"2015-11-23 02:01:39.000000000","message":"Let\u0027s leave it for now as I think this might come from flavors rather than the config at some point in the future.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        create_active_standby_lb_tf \u003d self._taskflow_load("},{"line_number":272,"context_line":"            self._lb_flows.get_create_load_balancer_flow("},{"line_number":273,"context_line":"                topology\u003dCONF.controller_worker.loadbalancer_topology),"},{"line_number":274,"context_line":"            store\u003dstore)"},{"line_number":275,"context_line":"        with tf_logging.DynamicLoggingListener(create_active_standby_lb_tf,"},{"line_number":276,"context_line":"                                               log\u003dLOG):"},{"line_number":277,"context_line":"            create_active_standby_lb_tf.run()"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_f22e72a4","line":274,"range":{"start_line":274,"start_character":18,"end_line":274,"end_character":23},"updated":"2015-11-22 05:41:18.000000000","message":"why is this being called create_active_standby_lb_tf when the flow its loading could be any acceptable topology?","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        create_active_standby_lb_tf \u003d self._taskflow_load("},{"line_number":272,"context_line":"            self._lb_flows.get_create_load_balancer_flow("},{"line_number":273,"context_line":"                topology\u003dCONF.controller_worker.loadbalancer_topology),"},{"line_number":274,"context_line":"            store\u003dstore)"},{"line_number":275,"context_line":"        with tf_logging.DynamicLoggingListener(create_active_standby_lb_tf,"},{"line_number":276,"context_line":"                                               log\u003dLOG):"},{"line_number":277,"context_line":"            create_active_standby_lb_tf.run()"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_396a9a1b","line":274,"range":{"start_line":274,"start_character":18,"end_line":274,"end_character":23},"in_reply_to":"ba8a016a_f22e72a4","updated":"2015-11-23 02:01:39.000000000","message":"Done","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"e369c705870c192bd83c2ffcf9608ca0db6b8b28","unresolved":false,"context_lines":[{"line_number":266,"context_line":"        else:"},{"line_number":267,"context_line":"            LOG.error(_LE(\"Unknown topology: %s.  Unable to build load \""},{"line_number":268,"context_line":"                          \"balancer.\"), topology)"},{"line_number":269,"context_line":"            raise exceptions.InvalidTopology(topology\u003dtopology)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        create_lb_tf \u003d self._taskflow_load("},{"line_number":272,"context_line":"            self._lb_flows.get_create_load_balancer_flow("}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_cf2e20a5","line":269,"updated":"2015-11-23 05:53:21.000000000","message":"i prefer to remove this exception raising and keeping the one in the create_load_balancer_flow.  This same exception will get raised on line 273.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":266,"context_line":"        else:"},{"line_number":267,"context_line":"            LOG.error(_LE(\"Unknown topology: %s.  Unable to build load \""},{"line_number":268,"context_line":"                          \"balancer.\"), topology)"},{"line_number":269,"context_line":"            raise exceptions.InvalidTopology(topology\u003dtopology)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        create_lb_tf \u003d self._taskflow_load("},{"line_number":272,"context_line":"            self._lb_flows.get_create_load_balancer_flow("}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_90ba45e0","line":269,"in_reply_to":"ba8a016a_cf2e20a5","updated":"2015-11-23 22:08:37.000000000","message":"If we do that, then please add a comment here instead noting why we don\u0027t need to check for an exception here (ie. \u0027topology\u0027 is already sanitized)","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"be40a4acee0927d1a0f37434112443f69a4e1d82","unresolved":false,"context_lines":[{"line_number":266,"context_line":"        else:"},{"line_number":267,"context_line":"            LOG.error(_LE(\"Unknown topology: %s.  Unable to build load \""},{"line_number":268,"context_line":"                          \"balancer.\"), topology)"},{"line_number":269,"context_line":"            raise exceptions.InvalidTopology(topology\u003dtopology)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        create_lb_tf \u003d self._taskflow_load("},{"line_number":272,"context_line":"            self._lb_flows.get_create_load_balancer_flow("}],"source_content_type":"text/x-python","patch_set":43,"id":"9a8ffd7b_b1547cca","line":269,"in_reply_to":"ba8a016a_cf2e20a5","updated":"2015-12-01 22:18:31.000000000","message":"This was done for two reasons.\n1. Some code quality tools will flag this as an open ended conditional.  Currently it doesn\u0027t harm anything if it falls off this conditional until the flow is created, but I like to catch these issues early and often, especially when this is an entry point to the controller worker.\n2. I also included it in the flow as flows are intended to be reusable.  Currently that isn\u0027t happening with this flow.\nSo, with that, since two folks feel the same I will remove it and leave a blame comment \u003cgrin\u003e","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"}],"octavia/controller/worker/flows/amphora_flows.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        # Note: If any task in this flow failed, the created amphorae will be"},{"line_number":171,"context_line":"        #  left \u0027\u0027incorrectly\u0027\u0027 allocated to the loadbalancer. Likely,"},{"line_number":172,"context_line":"        # the get_new_LB_networking_subflow is the most prune to failure"},{"line_number":173,"context_line":"# TODO(sherif): If any revert method in PlugVIP (or any task below),"},{"line_number":174,"context_line":"        # shall deallocate the amphora from its loadbalancer and put it in a"},{"line_number":175,"context_line":"        # READY state."},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_5f710e75","line":173,"updated":"2015-08-25 21:32:31.000000000","message":"format? also please do what you said in todo or remove todo","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            map_amp_to_lb.add(database_tasks.MarkAmphoraMasterInDB("},{"line_number":232,"context_line":"                name\u003dsf_name + \u0027-\u0027 + constants.MARK_AMP_MASTER_INDB,"},{"line_number":233,"context_line":"                requires\u003dconstants.AMPHORA))"},{"line_number":234,"context_line":"        elif role \u003d\u003d constants.ROLE_BACKUP:"},{"line_number":235,"context_line":"            map_amp_to_lb.add(database_tasks.MarkAmphoraBackupInDB("},{"line_number":236,"context_line":"                name\u003dsf_name + \u0027-\u0027 + constants.MARK_AMP_BACKUP_INDB,"},{"line_number":237,"context_line":"                requires\u003dconstants.AMPHORA))"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_f87e3a69","line":234,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test for code branch","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":235,"context_line":"            map_amp_to_lb.add(database_tasks.MarkAmphoraBackupInDB("},{"line_number":236,"context_line":"                name\u003dsf_name + \u0027-\u0027 + constants.MARK_AMP_BACKUP_INDB,"},{"line_number":237,"context_line":"                requires\u003dconstants.AMPHORA))"},{"line_number":238,"context_line":"        elif role \u003d\u003d constants.ROLE_STANDALONE:"},{"line_number":239,"context_line":"            map_amp_to_lb.add(database_tasks.MarkAmphoraStandAloneInDB("},{"line_number":240,"context_line":"                name\u003dsf_name + \u0027-\u0027 + constants.MARK_AMP_STANDALONE_INDB,"},{"line_number":241,"context_line":"                requires\u003dconstants.AMPHORA))"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_b891a29c","line":238,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test for code branch","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        return map_amp_to_lb"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def _get_create_amp_for_lb_subflow(self, prefix, role):"},{"line_number":246,"context_line":"        \"\"\"Create a new amphora for lb.\"\"\""},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        sf_name \u003d prefix + \u0027-\u0027 + constants.CREATE_AMP_FOR_LB_SUBFLOW"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_1e6d2404","line":245,"updated":"2015-09-02 23:20:48.000000000","message":"This is duplicate code to the get_create_amphora_for_lb_flow flow.  Can\u0027t we consolidate these?","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        return map_amp_to_lb"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def _get_create_amp_for_lb_subflow(self, prefix, role):"},{"line_number":246,"context_line":"        \"\"\"Create a new amphora for lb.\"\"\""},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        sf_name \u003d prefix + \u0027-\u0027 + constants.CREATE_AMP_FOR_LB_SUBFLOW"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_9cdc72e5","line":245,"in_reply_to":"da20952f_1e6d2404","updated":"2015-09-04 23:24:59.000000000","message":"This will require major changes to the existing code of the SINGLE topology. It needs to support non-duplicate naming. I prefer to have a separate patch for this. However, this subflow is written for such purpose such that this new patch will reuse this function.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":300,"context_line":"            create_amp_for_lb_subflow.add(database_tasks.MarkAmphoraMasterInDB("},{"line_number":301,"context_line":"                name\u003dsf_name + \u0027-\u0027 + constants.MARK_AMP_MASTER_INDB,"},{"line_number":302,"context_line":"                requires\u003dconstants.AMPHORA))"},{"line_number":303,"context_line":"        elif role \u003d\u003d constants.ROLE_BACKUP:"},{"line_number":304,"context_line":"            create_amp_for_lb_subflow.add(database_tasks.MarkAmphoraBackupInDB("},{"line_number":305,"context_line":"                name\u003dsf_name + \u0027-\u0027 + constants.MARK_AMP_BACKUP_INDB,"},{"line_number":306,"context_line":"                requires\u003dconstants.AMPHORA))"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_18e9ae1a","line":303,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test for code branch","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":304,"context_line":"            create_amp_for_lb_subflow.add(database_tasks.MarkAmphoraBackupInDB("},{"line_number":305,"context_line":"                name\u003dsf_name + \u0027-\u0027 + constants.MARK_AMP_BACKUP_INDB,"},{"line_number":306,"context_line":"                requires\u003dconstants.AMPHORA))"},{"line_number":307,"context_line":"        elif role \u003d\u003d constants.ROLE_STANDALONE:"},{"line_number":308,"context_line":"            create_amp_for_lb_subflow.add("},{"line_number":309,"context_line":"                database_tasks.MarkAmphoraStandAloneInDB("},{"line_number":310,"context_line":"                    name\u003dsf_name + \u0027-\u0027 + constants.MARK_AMP_STANDALONE_INDB,"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_38ecb228","line":307,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test for code branch","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":311,"context_line":"                    requires\u003dconstants.AMPHORA))"},{"line_number":312,"context_line":"        return create_amp_for_lb_subflow"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def _allocate_amp_to_lb_decider(self, history):"},{"line_number":315,"context_line":"        \"\"\"decides if the lb shall be mapped to a spare amphora"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        :return: True if a spare amphora exists in DB"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_d8f25606","line":314,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        :return: True if a spare amphora exists in DB"},{"line_number":318,"context_line":"        \"\"\""},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        return history.values()[0]"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def _create_new_amp_for_lb_decider(self, history):"},{"line_number":323,"context_line":"        \"\"\"decides if a new amphora must be created for the lb"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_b64b062b","line":320,"updated":"2015-09-02 23:20:48.000000000","message":"This seems generic.  Maybe we can name this generic.\nprevious_bool_decider or something that makes sense.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        return history.values()[0]"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def _create_new_amp_for_lb_decider(self, history):"},{"line_number":323,"context_line":"        \"\"\"decides if a new amphora must be created for the lb"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        :return: True"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_98ddbe72","line":322,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def _get_create_allocate_amphora_for_lb_subflow("},{"line_number":331,"context_line":"            self, prefix, role\u003dconstants.ROLE_STANDALONE):"},{"line_number":332,"context_line":"        \"\"\"Tries to allocate a spare amphora to a loadbalancer if non"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"        exists, create a new amphora."},{"line_number":335,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_700336b9","line":332,"updated":"2015-09-02 23:20:48.000000000","message":"nit: none","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def _get_create_allocate_amphora_for_lb_subflow("},{"line_number":331,"context_line":"            self, prefix, role\u003dconstants.ROLE_STANDALONE):"},{"line_number":332,"context_line":"        \"\"\"Tries to allocate a spare amphora to a loadbalancer if non"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"        exists, create a new amphora."},{"line_number":335,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_dce42aa9","line":332,"in_reply_to":"da20952f_700336b9","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":338,"context_line":"                   constants.CREATE_ALLOCATE_AMPHORA_FOR_LB_SUBFLOW)"},{"line_number":339,"context_line":"        amp_for_lb_flow \u003d graph_flow.Flow("},{"line_number":340,"context_line":"            sf_name)"},{"line_number":341,"context_line":"        check_spare_amp \u003d database_tasks.CheckForSpareAmphora("},{"line_number":342,"context_line":"            name\u003dsf_name + \u0027-\u0027 + constants.CHECK_FOR_SPARE_AMPHORA,"},{"line_number":343,"context_line":"            requires\u003dconstants.LOADBALANCER_ID)"},{"line_number":344,"context_line":"        map_lb_to_amp \u003d self._get_map_lb_subflow(prefix, role)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_7b4eb7c2","line":341,"updated":"2015-09-02 23:20:48.000000000","message":"This should check and allocate inside one database transaction.\nIf it is not inside one transaction you have a race condition where the spares may be used before you attempt to allocate here.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"eaf52fd2c92a8763aca02ba612ab27aeb19d3aca","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        return create_amphora_flow"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _get_post_map_lb_subflow(self, prefix, role):"},{"line_number":85,"context_line":"        \"\"\"Set amphora type after mapped to lb.\"\"\""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        sf_name \u003d prefix + \u0027-\u0027 + constants.POST_MAP_AMP_TO_LB_SUBFLOW"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_15c1b280","line":84,"updated":"2015-11-20 22:03:32.000000000","message":"prefix param needed?","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"eaf52fd2c92a8763aca02ba612ab27aeb19d3aca","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        return post_map_amp_to_lb"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _get_create_amp_for_lb_subflow(self, prefix, role):"},{"line_number":112,"context_line":"        \"\"\"Create a new amphora for lb.\"\"\""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        sf_name \u003d prefix + \u0027-\u0027 + constants.CREATE_AMP_FOR_LB_SUBFLOW"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_f5c3ce88","line":111,"updated":"2015-11-20 22:03:32.000000000","message":"prefix param needed?","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"eaf52fd2c92a8763aca02ba612ab27aeb19d3aca","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        return history.values()[0] is None"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def get_amphora_for_lb_subflow("},{"line_number":200,"context_line":"            self, prefix, role\u003dconstants.ROLE_STANDALONE):"},{"line_number":201,"context_line":"        \"\"\"Tries to allocate a spare amphora to a loadbalancer if none"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        exists, create a new amphora."}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_d58c8a81","line":200,"updated":"2015-11-20 22:03:32.000000000","message":"prefix param needed?","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"eb4e38ca609466fe863119312df0cfdef3c61037","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        return create_amp_for_lb_subflow"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def _allocate_amp_to_lb_decider(self, history):"},{"line_number":194,"context_line":"        \"\"\"decides if the lb shall be mapped to a spare amphora"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        :return: True if a spare amphora exists in DB"}],"source_content_type":"text/x-python","patch_set":53,"id":"7a740942_8677c901","line":193,"updated":"2015-12-03 22:36:40.000000000","message":"http://i.imgur.com/tvxp4xx.jpg","commit_id":"15d018bc73270e100588048c94e4f82178c25987"}],"octavia/controller/worker/flows/load_balancer_flows.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        :return: The graph flow for creating an active_standby loadbalancer."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        f_name \u003d constants.CREATE_ACTIVE_STANDBY_LOADBALANCER_FLOW"},{"line_number":51,"context_line":"        lb_create_flow \u003d unordered_flow.Flow(f_name)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY:"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_b2178a53","line":50,"updated":"2015-11-22 05:41:18.000000000","message":"why would the flow name always be ACTIVE_STANDBY if this also supports other topologies like SINGLE?","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        :return: The graph flow for creating an active_standby loadbalancer."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        f_name \u003d constants.CREATE_ACTIVE_STANDBY_LOADBALANCER_FLOW"},{"line_number":51,"context_line":"        lb_create_flow \u003d unordered_flow.Flow(f_name)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY:"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_5908be28","line":50,"in_reply_to":"ba8a016a_b2178a53","updated":"2015-11-23 02:01:39.000000000","message":"Done","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        else:"},{"line_number":65,"context_line":"            LOG.error(_LE(\"Unknown topology: %s.  Unable to build load \""},{"line_number":66,"context_line":"                          \"balancer.\"), topology)"},{"line_number":67,"context_line":"            raise exceptions.InvalidTopology(topology\u003dtopology)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        return lb_create_flow"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_7211225d","line":67,"updated":"2015-11-22 05:41:18.000000000","message":"I understand the caution, but this is duplicate here.  I think its better to be raised here honestly, and not in the controller worker.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        # shall deallocate the amphora from its loadbalancer and put it in a"},{"line_number":82,"context_line":"        # READY state."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        sf_name \u003d prefix + \u0027-\u0027 + constants.POST_LB_AMP_ASSOCIATION_SUBFLOW"},{"line_number":85,"context_line":"        post_create_LB_flow \u003d linear_flow.Flow(sf_name)"},{"line_number":86,"context_line":"        post_create_LB_flow.add("},{"line_number":87,"context_line":"            database_tasks.ReloadLoadBalancer("}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_f2051214","line":84,"updated":"2015-11-22 05:41:18.000000000","message":"i know in the end the speed increase of using .join or .format will probably be negligible for what we are doing, but i always cringe when I see string concat with +.  if at all possible, use .join or .format?  in these cases .join would make the most since.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"eaf52fd2c92a8763aca02ba612ab27aeb19d3aca","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        :return: The graph flow for creating an active_standby loadbalancer."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        f_name \u003d constants.CREATE_ACTIVE_STANDBY_LOADBALANCER_FLOW"},{"line_number":51,"context_line":"        lb_create_flow \u003d unordered_flow.Flow(f_name)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY:"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_f253e46a","line":50,"updated":"2015-11-20 22:03:32.000000000","message":"loadbalancer flow will be called \"\u0027octavia-create-active-standby-loadbalancer-flow\" even if topology is set to SINGLE and not ACTIVE_STANDBY.\nIs it normal?","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"866fa5036674a697aaaa72d881e16611113fed6e","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        :return: The graph flow for creating an active_standby loadbalancer."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        f_name \u003d constants.CREATE_ACTIVE_STANDBY_LOADBALANCER_FLOW"},{"line_number":51,"context_line":"        lb_create_flow \u003d unordered_flow.Flow(f_name)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY:"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_b903ea0c","line":50,"in_reply_to":"ba8a016a_6645f615","updated":"2015-11-23 02:05:42.000000000","message":"Done","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3fdf09dcc1a02a7ad5661a247a56109babba77e7","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        :return: The graph flow for creating an active_standby loadbalancer."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        f_name \u003d constants.CREATE_ACTIVE_STANDBY_LOADBALANCER_FLOW"},{"line_number":51,"context_line":"        lb_create_flow \u003d unordered_flow.Flow(f_name)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY:"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_6645f615","line":50,"in_reply_to":"ba8a016a_f253e46a","updated":"2015-11-21 00:03:57.000000000","message":"Good point.  I will fix this.","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"eaf52fd2c92a8763aca02ba612ab27aeb19d3aca","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY:"},{"line_number":54,"context_line":"            master_amp_sf \u003d self.amp_flows.get_amphora_for_lb_subflow("},{"line_number":55,"context_line":"                prefix\u003dconstants.ROLE_MASTER, role\u003dconstants.ROLE_MASTER)"},{"line_number":56,"context_line":"            backup_amp_sf \u003d self.amp_flows.get_amphora_for_lb_subflow("},{"line_number":57,"context_line":"                prefix\u003dconstants.ROLE_BACKUP, role\u003dconstants.ROLE_BACKUP)"},{"line_number":58,"context_line":"            lb_create_flow.add(master_amp_sf, backup_amp_sf)"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_952a827d","line":55,"updated":"2015-11-20 22:03:32.000000000","message":"is \u0027prefix\u0027 param really needed?\nActually \u0027prefix\u0027 and \u0027role\u0027 params are always equals.","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3fdf09dcc1a02a7ad5661a247a56109babba77e7","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY:"},{"line_number":54,"context_line":"            master_amp_sf \u003d self.amp_flows.get_amphora_for_lb_subflow("},{"line_number":55,"context_line":"                prefix\u003dconstants.ROLE_MASTER, role\u003dconstants.ROLE_MASTER)"},{"line_number":56,"context_line":"            backup_amp_sf \u003d self.amp_flows.get_amphora_for_lb_subflow("},{"line_number":57,"context_line":"                prefix\u003dconstants.ROLE_BACKUP, role\u003dconstants.ROLE_BACKUP)"},{"line_number":58,"context_line":"            lb_create_flow.add(master_amp_sf, backup_amp_sf)"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_a63bde9b","line":55,"in_reply_to":"ba8a016a_952a827d","updated":"2015-11-21 00:03:57.000000000","message":"prefix is needed to make sure parallel sub-flows have unique names (TaskFlow rules for resumption) and for debug log clarity.  It is a coincidence that these happen to be the same here.\nYou will see in the dependent patch, that updates the failover flow, that this subflow is reused there with a different prefix (FAILOVER_AMPHORA_FLOW).\nIf using MASTER AND BACKUP to label the subflows is a problem I can create MASTER_SUBFLOW and BACKUP_SUBFLOW constants.  I\u0027m just not sure it brings much value and it would make the debug logging lines even longer.","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"5c20c05ff6030af1ac7ee807d834fbcd64f2c1c5","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if topology \u003d\u003d constants.TOPOLOGY_ACTIVE_STANDBY:"},{"line_number":54,"context_line":"            master_amp_sf \u003d self.amp_flows.get_amphora_for_lb_subflow("},{"line_number":55,"context_line":"                prefix\u003dconstants.ROLE_MASTER, role\u003dconstants.ROLE_MASTER)"},{"line_number":56,"context_line":"            backup_amp_sf \u003d self.amp_flows.get_amphora_for_lb_subflow("},{"line_number":57,"context_line":"                prefix\u003dconstants.ROLE_BACKUP, role\u003dconstants.ROLE_BACKUP)"},{"line_number":58,"context_line":"            lb_create_flow.add(master_amp_sf, backup_amp_sf)"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_0cd0c8c8","line":55,"in_reply_to":"ba8a016a_a63bde9b","updated":"2015-11-21 07:56:26.000000000","message":"@Michael thank you for your detail clarifications. I was not aware of this \"naming\" requirements. \nI agree with you we can keep the code like this.","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"eaf52fd2c92a8763aca02ba612ab27aeb19d3aca","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            master_amp_sf \u003d self.amp_flows.get_amphora_for_lb_subflow("},{"line_number":55,"context_line":"                prefix\u003dconstants.ROLE_MASTER, role\u003dconstants.ROLE_MASTER)"},{"line_number":56,"context_line":"            backup_amp_sf \u003d self.amp_flows.get_amphora_for_lb_subflow("},{"line_number":57,"context_line":"                prefix\u003dconstants.ROLE_BACKUP, role\u003dconstants.ROLE_BACKUP)"},{"line_number":58,"context_line":"            lb_create_flow.add(master_amp_sf, backup_amp_sf)"},{"line_number":59,"context_line":"        elif topology \u003d\u003d constants.TOPOLOGY_SINGLE:"},{"line_number":60,"context_line":"            amphora_sf \u003d self.amp_flows.get_amphora_for_lb_subflow("}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_75259eac","line":57,"updated":"2015-11-20 22:03:32.000000000","message":"itto","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"eaf52fd2c92a8763aca02ba612ab27aeb19d3aca","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            lb_create_flow.add(master_amp_sf, backup_amp_sf)"},{"line_number":59,"context_line":"        elif topology \u003d\u003d constants.TOPOLOGY_SINGLE:"},{"line_number":60,"context_line":"            amphora_sf \u003d self.amp_flows.get_amphora_for_lb_subflow("},{"line_number":61,"context_line":"                prefix\u003dconstants.ROLE_STANDALONE,"},{"line_number":62,"context_line":"                role\u003dconstants.ROLE_STANDALONE)"},{"line_number":63,"context_line":"            lb_create_flow.add(amphora_sf)"},{"line_number":64,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_55241aae","line":61,"updated":"2015-11-20 22:03:32.000000000","message":"itto","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"1eddccafe2c83d518436298d8690f36df5ad15fe","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            name\u003dsf_name + \u0027-\u0027 + constants.CREATE_VRRP_GROUP_FOR_LB,"},{"line_number":115,"context_line":"            requires\u003dconstants.LOADBALANCER,"},{"line_number":116,"context_line":"            provides\u003dconstants.LOADBALANCER))"},{"line_number":117,"context_line":"        vrrp_subflow.add(amphora_driver_tasks.AmphoraVRRPUpdate("},{"line_number":118,"context_line":"            name\u003dsf_name + \u0027-\u0027 + constants.AMP_VRRP_UPDATE,"},{"line_number":119,"context_line":"            requires\u003dconstants.LOADBALANCER))"},{"line_number":120,"context_line":"        vrrp_subflow.add(amphora_driver_tasks.AmphoraVrrpStart("}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_a4450c18","line":117,"range":{"start_line":117,"start_character":46,"end_line":117,"end_character":63},"updated":"2015-11-21 21:10:40.000000000","message":"kind of a nit but I\u0027ve mostly seen Vrrp, this is VRRP.  If another PS is rolled could you change this?","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"866fa5036674a697aaaa72d881e16611113fed6e","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            name\u003dsf_name + \u0027-\u0027 + constants.CREATE_VRRP_GROUP_FOR_LB,"},{"line_number":115,"context_line":"            requires\u003dconstants.LOADBALANCER,"},{"line_number":116,"context_line":"            provides\u003dconstants.LOADBALANCER))"},{"line_number":117,"context_line":"        vrrp_subflow.add(amphora_driver_tasks.AmphoraVRRPUpdate("},{"line_number":118,"context_line":"            name\u003dsf_name + \u0027-\u0027 + constants.AMP_VRRP_UPDATE,"},{"line_number":119,"context_line":"            requires\u003dconstants.LOADBALANCER))"},{"line_number":120,"context_line":"        vrrp_subflow.add(amphora_driver_tasks.AmphoraVrrpStart("}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_b92a0a7d","line":117,"range":{"start_line":117,"start_character":46,"end_line":117,"end_character":63},"in_reply_to":"ba8a016a_a4450c18","updated":"2015-11-23 02:05:42.000000000","message":"Done","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"e369c705870c192bd83c2ffcf9608ca0db6b8b28","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        else:"},{"line_number":65,"context_line":"            LOG.error(_LE(\"Unknown topology: %s.  Unable to build load \""},{"line_number":66,"context_line":"                          \"balancer.\"), topology)"},{"line_number":67,"context_line":"            raise exceptions.InvalidTopology(topology\u003dtopology)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        return lb_create_flow"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_af35dcf7","line":67,"range":{"start_line":67,"start_character":29,"end_line":67,"end_character":44},"updated":"2015-11-23 05:53:21.000000000","message":"had a comment about this in the PS 41.  Basically this flow is doing the check and raise of this exception, and so is the controller worker calling this.  If the controller worker does that check, it\u0027ll never get to this point.  If this does the check then it\u0027ll bubble up to the controller worker.  So I think keeping this one here and removing the one in the controller worker is more appropriate.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        else:"},{"line_number":65,"context_line":"            LOG.error(_LE(\"Unknown topology: %s.  Unable to build load \""},{"line_number":66,"context_line":"                          \"balancer.\"), topology)"},{"line_number":67,"context_line":"            raise exceptions.InvalidTopology(topology\u003dtopology)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        return lb_create_flow"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_d049add1","line":67,"in_reply_to":"ba8a016a_af35dcf7","updated":"2015-11-23 22:08:37.000000000","message":"Agreed, with the addition that I would like to see a comment added where the topology check happens in the controller worker right now explaining why we don\u0027t need to do that check there (otherwise, it seems to be obviously missing from the code there).","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"}],"octavia/controller/worker/tasks/amphora_driver_tasks.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \"\"\"Execute listener update routines for an amphora.\"\"\""},{"line_number":53,"context_line":"        # Ideally this shouldn\u0027t be needed!"},{"line_number":54,"context_line":"        listener \u003d self.listener_repo.get(db_apis.get_session(),"},{"line_number":55,"context_line":"                                          id\u003dlistener.id)"},{"line_number":56,"context_line":"        self.amphora_driver.update(listener, vip)"},{"line_number":57,"context_line":"        LOG.debug(\"Updated amphora with new configuration for listener\")"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_cf27a161","line":55,"updated":"2015-08-26 04:17:04.000000000","message":"whatever flow is including this Task would need to have a ReloadListener task or something and provide listener.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \"\"\"Execute listener update routines for an amphora.\"\"\""},{"line_number":53,"context_line":"        # Ideally this shouldn\u0027t be needed!"},{"line_number":54,"context_line":"        listener \u003d self.listener_repo.get(db_apis.get_session(),"},{"line_number":55,"context_line":"                                          id\u003dlistener.id)"},{"line_number":56,"context_line":"        self.amphora_driver.update(listener, vip)"},{"line_number":57,"context_line":"        LOG.debug(\"Updated amphora with new configuration for listener\")"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_82a35b9e","line":55,"in_reply_to":"fa1b9901_cf27a161","updated":"2015-08-26 19:57:59.000000000","message":"Done","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    def execute(self, loadbalancer, deltas):"},{"line_number":172,"context_line":"        \"\"\"Execute post_network_plug routine.\"\"\""},{"line_number":173,"context_line":"        for amphora in loadbalancer.amphorae:"},{"line_number":174,"context_line":"            delta \u003d deltas[amphora.id]"},{"line_number":175,"context_line":"            is_plug_net \u003d len(delta.add_nics) + len(delta.delete_nics)"},{"line_number":176,"context_line":"            if is_plug_net:"},{"line_number":177,"context_line":"                self.amphora_driver.post_network_plug(amphora)"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_dfd99e58","line":174,"updated":"2015-08-25 21:32:31.000000000","message":"I remember that this was a workaround for some delta problem. Please put the necessary comments around it or handle in an extra commit","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    def execute(self, loadbalancer, deltas):"},{"line_number":172,"context_line":"        \"\"\"Execute post_network_plug routine.\"\"\""},{"line_number":173,"context_line":"        for amphora in loadbalancer.amphorae:"},{"line_number":174,"context_line":"            delta \u003d deltas[amphora.id]"},{"line_number":175,"context_line":"            is_plug_net \u003d len(delta.add_nics) + len(delta.delete_nics)"},{"line_number":176,"context_line":"            if is_plug_net:"},{"line_number":177,"context_line":"                self.amphora_driver.post_network_plug(amphora)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_c5a4fd09","line":174,"in_reply_to":"fa1b9901_2fee5ded","updated":"2015-08-26 19:57:59.000000000","message":"I have an explanation: the ssh driver returns nicely if there is no down interface. The REST driver is really aggressive though and responds with a 500 error.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    def execute(self, loadbalancer, deltas):"},{"line_number":172,"context_line":"        \"\"\"Execute post_network_plug routine.\"\"\""},{"line_number":173,"context_line":"        for amphora in loadbalancer.amphorae:"},{"line_number":174,"context_line":"            delta \u003d deltas[amphora.id]"},{"line_number":175,"context_line":"            is_plug_net \u003d len(delta.add_nics) + len(delta.delete_nics)"},{"line_number":176,"context_line":"            if is_plug_net:"},{"line_number":177,"context_line":"                self.amphora_driver.post_network_plug(amphora)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_c2b5d37e","line":174,"in_reply_to":"fa1b9901_dfd99e58","updated":"2015-08-26 19:57:59.000000000","message":"Done","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    def execute(self, loadbalancer, deltas):"},{"line_number":172,"context_line":"        \"\"\"Execute post_network_plug routine.\"\"\""},{"line_number":173,"context_line":"        for amphora in loadbalancer.amphorae:"},{"line_number":174,"context_line":"            delta \u003d deltas[amphora.id]"},{"line_number":175,"context_line":"            is_plug_net \u003d len(delta.add_nics) + len(delta.delete_nics)"},{"line_number":176,"context_line":"            if is_plug_net:"},{"line_number":177,"context_line":"                self.amphora_driver.post_network_plug(amphora)"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_2fee5ded","line":174,"in_reply_to":"fa1b9901_dfd99e58","updated":"2015-08-26 04:17:04.000000000","message":"i\u0027d like to find out more as to why the ssh driver doesn\u0027t have an issue with this.  Might be some magic its doing or something else.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    def execute(self, listener, vip):"},{"line_number":52,"context_line":"        \"\"\"Execute listener update routines for an amphora.\"\"\""},{"line_number":53,"context_line":"        # Ideally this shouldn\u0027t be needed. This is a workaround, for a not"},{"line_number":54,"context_line":"        # very well understood bug not related to Octavia."},{"line_number":55,"context_line":"        listener \u003d self.listener_repo.get(db_apis.get_session(),"},{"line_number":56,"context_line":"                                          id\u003dlistener.id)"},{"line_number":57,"context_line":"        self.amphora_driver.update(listener, vip)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_592656bb","line":54,"updated":"2015-09-02 23:20:48.000000000","message":"I would like more information here, or a bug number.\nlistener is passed in, but right away overwritten, so something is wrong here.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    def execute(self, listener, vip):"},{"line_number":52,"context_line":"        \"\"\"Execute listener update routines for an amphora.\"\"\""},{"line_number":53,"context_line":"        # Ideally this shouldn\u0027t be needed. This is a workaround, for a not"},{"line_number":54,"context_line":"        # very well understood bug not related to Octavia."},{"line_number":55,"context_line":"        listener \u003d self.listener_repo.get(db_apis.get_session(),"},{"line_number":56,"context_line":"                                          id\u003dlistener.id)"},{"line_number":57,"context_line":"        self.amphora_driver.update(listener, vip)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_5f69ec8a","line":54,"in_reply_to":"da20952f_592656bb","updated":"2015-09-04 23:24:59.000000000","message":"reported this bug: https://bugs.launchpad.net/octavia/+bug/1492493","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            # reported in: https://bugs.launchpad.net/octavia/+bug/1488279"},{"line_number":178,"context_line":"            delta \u003d deltas[amphora.id]"},{"line_number":179,"context_line":"            is_plug_net \u003d len(delta.add_nics) + len(delta.delete_nics)"},{"line_number":180,"context_line":"            if is_plug_net:"},{"line_number":181,"context_line":"                self.amphora_driver.post_network_plug(amphora)"},{"line_number":182,"context_line":"                LOG.debug(\"Posted network plug for the compute instance\")"},{"line_number":183,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_b8bf62fb","line":180,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test for code branch","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        loadbalancer.amphorae \u003d amps"},{"line_number":227,"context_line":"        return loadbalancer"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def revert(self, result, loadbalancer, *args, **kwargs):"},{"line_number":230,"context_line":"        \"\"\"Handle a failed amphora vip plug notification.\"\"\""},{"line_number":231,"context_line":"        if isinstance(result, failure.Failure):"},{"line_number":232,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_5855e6c3","line":229,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                  loadbalancer.id)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def revert(self, result, loadbalancer, *args, **kwargs):"},{"line_number":262,"context_line":"        pass"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"class AmphoraVrrpStart(BaseAmphoraTask):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_98ab831e","line":262,"updated":"2015-09-02 23:20:48.000000000","message":"If we don\u0027t need to do anything for revert, just remove the method","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                  loadbalancer.id)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def revert(self, result, loadbalancer, *args, **kwargs):"},{"line_number":262,"context_line":"        pass"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"class AmphoraVrrpStart(BaseAmphoraTask):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_df22dc53","line":262,"in_reply_to":"da20952f_98ab831e","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"}],"octavia/controller/worker/tasks/database_tasks.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":255,"context_line":"                                      ha_ip\u003damp_data.ha_ip,"},{"line_number":256,"context_line":"                                      vrrp_port_id\u003damp_data.vrrp_port_id,"},{"line_number":257,"context_line":"                                      ha_port_id\u003damp_data.ha_port_id,"},{"line_number":258,"context_line":"                                      vrrp_id\u003d1)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"class MapLoadbalancerToAmphora(BaseDatabaseTask):"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_4f995178","line":258,"updated":"2015-08-26 04:17:04.000000000","message":"is this always going to be 1? either way, this should be a constant.  DEFAULT_VRRP_ID or something","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":255,"context_line":"                                      ha_ip\u003damp_data.ha_ip,"},{"line_number":256,"context_line":"                                      vrrp_port_id\u003damp_data.vrrp_port_id,"},{"line_number":257,"context_line":"                                      ha_port_id\u003damp_data.ha_port_id,"},{"line_number":258,"context_line":"                                      vrrp_id\u003d1)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"class MapLoadbalancerToAmphora(BaseDatabaseTask):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_05d0b552","line":258,"in_reply_to":"fa1b9901_4f995178","updated":"2015-08-26 19:57:59.000000000","message":"Yes it is always a common value. This will need to be variable if multi tenant per amphora support is needed in the future. Added a constant DEFAULT_VRRP_ID.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        return amp.id"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"class CheckForSpareAmphora(BaseDatabaseTask):"},{"line_number":290,"context_line":"    \"\"\"Maps and assigns a load balancer to an amphora in the database.\"\"\""},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def execute(self, loadbalancer_id):"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_1fc39658","line":289,"updated":"2015-08-25 21:32:31.000000000","message":"Not sure what that has to do with VRRP - might be better in a separate patch","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        return amp.id"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"class CheckForSpareAmphora(BaseDatabaseTask):"},{"line_number":290,"context_line":"    \"\"\"Maps and assigns a load balancer to an amphora in the database.\"\"\""},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def execute(self, loadbalancer_id):"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_8f7a0923","line":289,"in_reply_to":"fa1b9901_1fc39658","updated":"2015-08-26 04:17:04.000000000","message":"+1","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            db_apis.get_session())"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"class MarkAmphoraMasterInDB(BaseDatabaseTask):"},{"line_number":307,"context_line":"    \"\"\"Alter the amphora role to: MASTER.\"\"\""},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def execute(self, amphora):"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_1f715644","line":306,"updated":"2015-08-25 21:32:31.000000000","message":"wonder if there is a way to refactor MsasterInDb,  BackupinDB, and Standalone. Maybe use a common base class and then have the constants as self? As it is now it looks like we are duplicating quite some code...","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            db_apis.get_session())"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"class MarkAmphoraMasterInDB(BaseDatabaseTask):"},{"line_number":307,"context_line":"    \"\"\"Alter the amphora role to: MASTER.\"\"\""},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def execute(self, amphora):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_e5eb41af","line":306,"in_reply_to":"fa1b9901_1f715644","updated":"2015-08-26 19:57:59.000000000","message":"Done","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            db_apis.get_session())"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"class MarkAmphoraMasterInDB(BaseDatabaseTask):"},{"line_number":307,"context_line":"    \"\"\"Alter the amphora role to: MASTER.\"\"\""},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def execute(self, amphora):"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_afacad88","line":306,"in_reply_to":"fa1b9901_1f715644","updated":"2015-08-26 04:17:04.000000000","message":"yeah, number of ways to do this.  class variable, instance variable, abstractpropert, etc.  class variable seems the easiest.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            db_apis.get_session())"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"class MarkAmphoraMasterInDB(BaseDatabaseTask):"},{"line_number":307,"context_line":"    \"\"\"Alter the amphora role to: MASTER.\"\"\""},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def execute(self, amphora):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_a5cea958","line":306,"in_reply_to":"fa1b9901_afacad88","updated":"2015-08-26 19:57:59.000000000","message":"The base class would work best. If I used variables I still need to write another providers for these variables which will look messy. \n\nDone","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":255,"context_line":"                                      ha_ip\u003damp_data.ha_ip,"},{"line_number":256,"context_line":"                                      vrrp_port_id\u003damp_data.vrrp_port_id,"},{"line_number":257,"context_line":"                                      ha_port_id\u003damp_data.ha_port_id,"},{"line_number":258,"context_line":"                                      vrrp_id\u003d1)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"class MapLoadbalancerToAmphora(BaseDatabaseTask):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_f8495f8f","line":258,"updated":"2015-09-02 23:20:48.000000000","message":"Should this always be ID 1?","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":255,"context_line":"                                      ha_ip\u003damp_data.ha_ip,"},{"line_number":256,"context_line":"                                      vrrp_port_id\u003damp_data.vrrp_port_id,"},{"line_number":257,"context_line":"                                      ha_port_id\u003damp_data.ha_port_id,"},{"line_number":258,"context_line":"                                      vrrp_id\u003d1)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"class MapLoadbalancerToAmphora(BaseDatabaseTask):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_ffb560ec","line":258,"in_reply_to":"da20952f_f8495f8f","updated":"2015-09-04 23:24:59.000000000","message":"Yes at least for the requirements of this patch as we have a single VRRP group per amphore pair.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        return amp.id"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"class CheckForSpareAmphora(BaseDatabaseTask):"},{"line_number":290,"context_line":"    \"\"\"Maps and assigns a load balancer to an amphora in the database.\"\"\""},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def execute(self, loadbalancer_id):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_037704a0","line":289,"updated":"2015-09-02 23:20:48.000000000","message":"As mentioned in another file, there is a race condition with this.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            db_apis.get_session())"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"class _MarkAmphoraRoleInDB(BaseDatabaseTask):"},{"line_number":307,"context_line":"    \"\"\"Alter the amphora role in DB.\"\"\""},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def _execute(self, amphora, amp_role, vrrp_priority):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_a37bb87a","line":306,"updated":"2015-09-02 23:20:48.000000000","message":"This is setting the priority too","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            db_apis.get_session())"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"class _MarkAmphoraRoleInDB(BaseDatabaseTask):"},{"line_number":307,"context_line":"    \"\"\"Alter the amphora role in DB.\"\"\""},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def _execute(self, amphora, amp_role, vrrp_priority):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_9f7d441e","line":306,"in_reply_to":"da20952f_a37bb87a","updated":"2015-09-04 23:24:59.000000000","message":"Changed to MarkAmphoraRoleAndPriorityInDB","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":313,"context_line":"                                 role\u003damp_role,"},{"line_number":314,"context_line":"                                 vrrp_priority\u003dvrrp_priority)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def _revert(self, result, amphora):"},{"line_number":317,"context_line":"        \"\"\"Mark the amphora as broken and ready to be cleaned up.\"\"\""},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        if isinstance(result, failure.Failure):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_18ba0ee2","line":316,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                                 vrrp_priority\u003dvrrp_priority)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def _revert(self, result, amphora):"},{"line_number":317,"context_line":"        \"\"\"Mark the amphora as broken and ready to be cleaned up.\"\"\""},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        if isinstance(result, failure.Failure):"},{"line_number":320,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_e3e8d018","line":317,"updated":"2015-09-02 23:20:48.000000000","message":"This comment is probably not valid","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                                 vrrp_priority\u003dvrrp_priority)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def _revert(self, result, amphora):"},{"line_number":317,"context_line":"        \"\"\"Mark the amphora as broken and ready to be cleaned up.\"\"\""},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        if isinstance(result, failure.Failure):"},{"line_number":320,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_3f951832","line":317,"in_reply_to":"da20952f_e3e8d018","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        amp_role \u003d constants.ROLE_MASTER"},{"line_number":336,"context_line":"        self._execute(amphora, amp_role, constants.ROLE_MASTER_PRIORITY)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def revert(self, result, amphora):"},{"line_number":339,"context_line":"        self._revert(result, amphora)"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_78c30a58","line":338,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        self._execute(amphora, amp_role, constants.ROLE_MASTER_PRIORITY)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def revert(self, result, amphora):"},{"line_number":339,"context_line":"        self._revert(result, amphora)"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"class MarkAmphoraBackupInDB(_MarkAmphoraRoleInDB):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_a3c978ae","line":339,"updated":"2015-09-02 23:20:48.000000000","message":"Again, if there is nothing to do in revert, just drop it","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        self._execute(amphora, amp_role, constants.ROLE_MASTER_PRIORITY)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def revert(self, result, amphora):"},{"line_number":339,"context_line":"        self._revert(result, amphora)"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"class MarkAmphoraBackupInDB(_MarkAmphoraRoleInDB):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_ff9a4061","line":339,"in_reply_to":"da20952f_a3c978ae","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        amp_role \u003d constants.ROLE_BACKUP"},{"line_number":347,"context_line":"        self._execute(amphora, amp_role, constants.ROLE_BACKUP_PRIORITY)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def revert(self, result, amphora):"},{"line_number":350,"context_line":"        self._revert(result, amphora)"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_58c88674","line":349,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        amp_role \u003d constants.ROLE_STANDALONE"},{"line_number":358,"context_line":"        self._execute(amphora, amp_role, None)"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"    def revert(self, result, amphora):"},{"line_number":361,"context_line":"        self._revert(result, amphora)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_b8c9a27b","line":360,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":918,"context_line":"                                  sync_port\u003dport)"},{"line_number":919,"context_line":"        return self.listener_repo.get(db_apis.get_session(), id\u003dlistener.id)"},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"    def revert(self, listener, *args, **kwargs):"},{"line_number":922,"context_line":"        \"\"\"nulls the sync port"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"        :returns: None"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_18dd2e14","line":921,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":927,"context_line":"                                  sync_port\u003dNone)"},{"line_number":928,"context_line":""},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"class ReloadListener(BaseDatabaseTask):"},{"line_number":931,"context_line":"    \"\"\"Get a new sync port number for a listener.\"\"\""},{"line_number":932,"context_line":""},{"line_number":933,"context_line":"    def execute(self, listener):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_43441cb6","line":930,"updated":"2015-09-02 23:20:48.000000000","message":"Nit: group this with the other reload classes above.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":927,"context_line":"                                  sync_port\u003dNone)"},{"line_number":928,"context_line":""},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"class ReloadListener(BaseDatabaseTask):"},{"line_number":931,"context_line":"    \"\"\"Get a new sync port number for a listener.\"\"\""},{"line_number":932,"context_line":""},{"line_number":933,"context_line":"    def execute(self, listener):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_bfa12896","line":930,"in_reply_to":"da20952f_43441cb6","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":930,"context_line":"class ReloadListener(BaseDatabaseTask):"},{"line_number":931,"context_line":"    \"\"\"Get a new sync port number for a listener.\"\"\""},{"line_number":932,"context_line":""},{"line_number":933,"context_line":"    def execute(self, listener):"},{"line_number":934,"context_line":"        \"\"\"Reloads listener in DB.\"\"\""},{"line_number":935,"context_line":"        return self.listener_repo.get(db_apis.get_session(), id\u003dlistener.id)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_38e032cc","line":933,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d8e815b0a4d7436695bcd71baf1469a430748b7f","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                                      ha_ip\u003damp_data.ha_ip,"},{"line_number":264,"context_line":"                                      vrrp_port_id\u003damp_data.vrrp_port_id,"},{"line_number":265,"context_line":"                                      ha_port_id\u003damp_data.ha_port_id,"},{"line_number":266,"context_line":"                                      vrrp_id\u003d1)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"class AssociateFailoverAmphoraWithLBID(BaseDatabaseTask):"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_7243626d","line":266,"updated":"2015-11-22 05:41:18.000000000","message":"since this will be the virtual_router_id in the keepalived script, is there a possibility for issues if two load balancers exist on the same network using vrrp and the same virtual_router_id?  I\u0027m kind of thinking that since we\u0027re setting keepalived to do unicast instead of multicast, this won\u0027t be an issue, but just curious.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"018b8139e3c5cd4c31d0398403459377de19abc7","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                                      ha_ip\u003damp_data.ha_ip,"},{"line_number":264,"context_line":"                                      vrrp_port_id\u003damp_data.vrrp_port_id,"},{"line_number":265,"context_line":"                                      ha_port_id\u003damp_data.ha_port_id,"},{"line_number":266,"context_line":"                                      vrrp_id\u003d1)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"class AssociateFailoverAmphoraWithLBID(BaseDatabaseTask):"}],"source_content_type":"text/x-python","patch_set":41,"id":"ba8a016a_19db16ef","line":266,"in_reply_to":"ba8a016a_7243626d","updated":"2015-11-23 02:01:39.000000000","message":"Since these are unicast using 1 is not a problem.","commit_id":"3a843650ef2858b00e9c7a00b87a25cd39890bdf"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":941,"context_line":"        :returns: None"},{"line_number":942,"context_line":"        \"\"\""},{"line_number":943,"context_line":"        port \u003d constants.HAPROXY_PEER_PORT + len("},{"line_number":944,"context_line":"            listener.load_balancer.listeners)"},{"line_number":945,"context_line":"        self.listener_repo.update(db_apis.get_session(), listener.id,"},{"line_number":946,"context_line":"                                  peer_port\u003dport)"},{"line_number":947,"context_line":"        return self.listener_repo.get(db_apis.get_session(), id\u003dlistener.id)"}],"source_content_type":"text/x-python","patch_set":43,"id":"ba8a016a_108ad5bf","line":944,"updated":"2015-11-23 22:08:37.000000000","message":"Aah--  so this will lead to a problem if a user does this:\n\n 1. Create Listener A\n 2. Create Listener B\n 3. Delete Listener A\n 4. Create Listener C\n\n(B and C end up with the same port.) Perhaps we should check in the DB to see whether any other listeners on this load_balancer are using this peer port? (and if so, increment until we get to a free port)?\n\nFurther, we\u0027re making a huge assumption that the user will never want to use that allocated peer_port for load balancing another service. This makes me think we ought to make the peer_port configurable (and go with an incrementing default if not specified) by the user-- though at that point we\u0027re exposing implementation details to the user, and have to justify this happening in the Neutron LBaaS API. :P","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"94baaa1be11320c4feba697cf1347672b8c151f6","unresolved":false,"context_lines":[{"line_number":941,"context_line":"        :returns: None"},{"line_number":942,"context_line":"        \"\"\""},{"line_number":943,"context_line":"        port \u003d constants.HAPROXY_PEER_PORT + len("},{"line_number":944,"context_line":"            listener.load_balancer.listeners)"},{"line_number":945,"context_line":"        self.listener_repo.update(db_apis.get_session(), listener.id,"},{"line_number":946,"context_line":"                                  peer_port\u003dport)"},{"line_number":947,"context_line":"        return self.listener_repo.get(db_apis.get_session(), id\u003dlistener.id)"}],"source_content_type":"text/x-python","patch_set":43,"id":"9a8ffd7b_cfdb541a","line":944,"in_reply_to":"9a8ffd7b_ac43886b","updated":"2015-12-02 00:56:23.000000000","message":"Yeah, i couldn\u0027t remember if the peering was happening over the same network as the vip in the network driver we have now, and it is.  Better to fix in a follow up review though.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"be40a4acee0927d1a0f37434112443f69a4e1d82","unresolved":false,"context_lines":[{"line_number":941,"context_line":"        :returns: None"},{"line_number":942,"context_line":"        \"\"\""},{"line_number":943,"context_line":"        port \u003d constants.HAPROXY_PEER_PORT + len("},{"line_number":944,"context_line":"            listener.load_balancer.listeners)"},{"line_number":945,"context_line":"        self.listener_repo.update(db_apis.get_session(), listener.id,"},{"line_number":946,"context_line":"                                  peer_port\u003dport)"},{"line_number":947,"context_line":"        return self.listener_repo.get(db_apis.get_session(), id\u003dlistener.id)"}],"source_content_type":"text/x-python","patch_set":43,"id":"9a8ffd7b_ac43886b","line":944,"in_reply_to":"ba8a016a_108ad5bf","updated":"2015-12-01 22:18:31.000000000","message":"On the last point, this is why I advocate for using a separate network and ipv6 for things like this.\nAnother approach that has been proposed is to use namespaces now that HAProxy is namespace aware.  However, that is a newer version than the distros are shipping, so we would be committing to dealing with packaging issues until the distros catch up.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"16a6d5b7aa6f1e5b682cb6146b9fd098d4470566","unresolved":false,"context_lines":[{"line_number":941,"context_line":"        :returns: None"},{"line_number":942,"context_line":"        \"\"\""},{"line_number":943,"context_line":"        port \u003d constants.HAPROXY_PEER_PORT + len("},{"line_number":944,"context_line":"            listener.load_balancer.listeners)"},{"line_number":945,"context_line":"        self.listener_repo.update(db_apis.get_session(), listener.id,"},{"line_number":946,"context_line":"                                  peer_port\u003dport)"},{"line_number":947,"context_line":"        return self.listener_repo.get(db_apis.get_session(), id\u003dlistener.id)"}],"source_content_type":"text/x-python","patch_set":43,"id":"9a8ffd7b_3f7e9819","line":944,"in_reply_to":"ba8a016a_108ad5bf","updated":"2015-12-03 00:54:57.000000000","message":"This is also where having a single haproxy process per amphora would also benefit us.\nI have fixed this to be safe.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"0fa48b8a3c624bf51a96e8c2e7f57642c75511fc","unresolved":false,"context_lines":[{"line_number":963,"context_line":"        max_peer_port \u003d 0"},{"line_number":964,"context_line":"        for listener in listener.load_balancer.listeners:"},{"line_number":965,"context_line":"            if listener.peer_port \u003e max_peer_port:"},{"line_number":966,"context_line":"                max_peer_port \u003d listener.peer_port"},{"line_number":967,"context_line":""},{"line_number":968,"context_line":"        if max_peer_port \u003d\u003d 0:"},{"line_number":969,"context_line":"            port \u003d constants.HAPROXY_BASE_PEER_PORT"}],"source_content_type":"text/x-python","patch_set":53,"id":"7a740942_ebba1b6e","line":966,"updated":"2015-12-03 21:06:28.000000000","message":"this could be simplified with:\nmax_peer_port \u003d max([listener.peer_port for listener in listener.load_balancer.listeners])","commit_id":"15d018bc73270e100588048c94e4f82178c25987"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"0fa48b8a3c624bf51a96e8c2e7f57642c75511fc","unresolved":false,"context_lines":[{"line_number":965,"context_line":"            if listener.peer_port \u003e max_peer_port:"},{"line_number":966,"context_line":"                max_peer_port \u003d listener.peer_port"},{"line_number":967,"context_line":""},{"line_number":968,"context_line":"        if max_peer_port \u003d\u003d 0:"},{"line_number":969,"context_line":"            port \u003d constants.HAPROXY_BASE_PEER_PORT"},{"line_number":970,"context_line":"        else:"},{"line_number":971,"context_line":"            port \u003d max_peer_port + 1"}],"source_content_type":"text/x-python","patch_set":53,"id":"7a740942_6ba70b50","line":968,"updated":"2015-12-03 21:06:28.000000000","message":"then just do here:\nif not max_peer_port:\n\n\nor if really need 0 there\u0027s another way to do the one above but at that point readability starts to trend downards.","commit_id":"15d018bc73270e100588048c94e4f82178c25987"}],"octavia/controller/worker/tasks/network_tasks.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":349,"context_line":"    def execute(self, loadbalancer):"},{"line_number":350,"context_line":"        LOG.debug(\"Updating VRRP Security Rules of load_balancer %s.\" %"},{"line_number":351,"context_line":"                  loadbalancer.id)"},{"line_number":352,"context_line":"        self.network_driver.update_vrr_security_rules(loadbalancer)"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_4fd5d1e2","line":352,"updated":"2015-08-26 04:17:04.000000000","message":"is this missing a p after vrr?","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":349,"context_line":"    def execute(self, loadbalancer):"},{"line_number":350,"context_line":"        LOG.debug(\"Updating VRRP Security Rules of load_balancer %s.\" %"},{"line_number":351,"context_line":"                  loadbalancer.id)"},{"line_number":352,"context_line":"        self.network_driver.update_vrr_security_rules(loadbalancer)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_b6cee158","line":352,"in_reply_to":"fa1b9901_4fd5d1e2","updated":"2015-08-26 19:57:59.000000000","message":"That\u0027s embarrassing :)","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        return amp_net_configs"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"class CreateVrrpSecurityRules(BaseNetworkTask):"},{"line_number":347,"context_line":"    \"\"\"Task to create VRRP and Auth Header security Rules.\"\"\""},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def execute(self, loadbalancer):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_f8e95ab8","line":346,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"}],"octavia/db/migration/alembic.ini":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"4ddb1c43b192d44f650e3ab60fd56ee1d8547ac3","unresolved":false,"context_lines":[{"line_number":20,"context_line":"# versions/ directory"},{"line_number":21,"context_line":"# sourceless \u003d false"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"sqlalchemy.url \u003d mysql+pymysql://root:stack123@127.0.0.1:3306/octavia"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# Logging configuration"}],"source_content_type":"text/x-properties","patch_set":3,"id":"1a4dcd0f_27f37575","line":23,"updated":"2015-08-03 16:18:57.000000000","message":"not sure why this is changing...","commit_id":"3b42635a12aeff16565e5f51c1fc47e1b42de93a"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"2622ed43795dbb78ae0a6fba9b933a31fd428250","unresolved":false,"context_lines":[{"line_number":20,"context_line":"# versions/ directory"},{"line_number":21,"context_line":"# sourceless \u003d false"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"sqlalchemy.url \u003d mysql+pymysql://root:stack123@127.0.0.1:3306/octavia"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# Logging configuration"}],"source_content_type":"text/x-properties","patch_set":3,"id":"1a4dcd0f_9a865cb8","line":23,"in_reply_to":"1a4dcd0f_27f37575","updated":"2015-08-03 16:36:51.000000000","message":"It shouldn\u0027t, it substitutes the value from my local rep. I will remove this file from next commit.","commit_id":"3b42635a12aeff16565e5f51c1fc47e1b42de93a"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"# versions/ directory"},{"line_number":21,"context_line":"# sourceless \u003d false"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"sqlalchemy.url \u003d mysql+pymysql://root:stack123@127.0.0.1:3306/octavia"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# Logging configuration"}],"source_content_type":"text/x-properties","patch_set":17,"id":"fa1b9901_7ffbb27b","line":23,"updated":"2015-08-25 21:32:31.000000000","message":"this should not change in a commit...","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":20,"context_line":"# versions/ directory"},{"line_number":21,"context_line":"# sourceless \u003d false"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"sqlalchemy.url \u003d mysql+pymysql://root:stack123@127.0.0.1:3306/octavia"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# Logging configuration"}],"source_content_type":"text/x-properties","patch_set":17,"id":"da20952f_d6fd956f","line":23,"in_reply_to":"fa1b9901_7ffbb27b","updated":"2015-08-26 19:57:59.000000000","message":"Done","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":20,"context_line":"# versions/ directory"},{"line_number":21,"context_line":"# sourceless \u003d false"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"sqlalchemy.url \u003d mysql+pymysql://root:stack123@127.0.0.1:3306/octavia"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# Logging configuration"}],"source_content_type":"text/x-properties","patch_set":17,"id":"fa1b9901_af310d5b","line":23,"in_reply_to":"fa1b9901_7ffbb27b","updated":"2015-08-26 04:17:04.000000000","message":"we really need an octavia-db-manage client.  one day after Liberty.","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"}],"octavia/db/migration/alembic_migrations/versions/1e4c1d83044c_keepalived_configuration_datamodel.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    op.add_column("},{"line_number":75,"context_line":"        u\u0027amphora\u0027,"},{"line_number":76,"context_line":"        sa.Column(u\u0027vrrp_intf\u0027, sa.String(16), nullable\u003dTrue)"},{"line_number":77,"context_line":"    )"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    op.add_column("}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_6f6e9530","line":76,"updated":"2015-08-26 04:17:04.000000000","message":"please, please, just do vrrp_interface","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    op.add_column("},{"line_number":75,"context_line":"        u\u0027amphora\u0027,"},{"line_number":76,"context_line":"        sa.Column(u\u0027vrrp_intf\u0027, sa.String(16), nullable\u003dTrue)"},{"line_number":77,"context_line":"    )"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    op.add_column("}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_96f87d7e","line":76,"in_reply_to":"fa1b9901_6f6e9530","updated":"2015-08-26 19:57:59.000000000","message":"Done","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        sa.Column(u\u0027vrrp_auth_type\u0027, sa.String(16), nullable\u003dTrue),"},{"line_number":57,"context_line":"        sa.Column(u\u0027vrrp_auth_pass\u0027, sa.String(36), nullable\u003dTrue),"},{"line_number":58,"context_line":"        sa.Column(u\u0027advert_int\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":59,"context_line":"        sa.Column(u\u0027smtp_server\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":60,"context_line":"        sa.Column(u\u0027smtp_connect_timeout\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":61,"context_line":"        sa.PrimaryKeyConstraint(u\u0027load_balancer_id\u0027),"},{"line_number":62,"context_line":"        sa.ForeignKeyConstraint([u\u0027load_balancer_id\u0027], [u\u0027load_balancer.id\u0027],"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_031b8481","line":59,"updated":"2015-09-02 23:20:48.000000000","message":"Not used, so drop the smtp columns","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        sa.Column(u\u0027vrrp_auth_type\u0027, sa.String(16), nullable\u003dTrue),"},{"line_number":57,"context_line":"        sa.Column(u\u0027vrrp_auth_pass\u0027, sa.String(36), nullable\u003dTrue),"},{"line_number":58,"context_line":"        sa.Column(u\u0027advert_int\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":59,"context_line":"        sa.Column(u\u0027smtp_server\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":60,"context_line":"        sa.Column(u\u0027smtp_connect_timeout\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":61,"context_line":"        sa.PrimaryKeyConstraint(u\u0027load_balancer_id\u0027),"},{"line_number":62,"context_line":"        sa.ForeignKeyConstraint([u\u0027load_balancer_id\u0027], [u\u0027load_balancer.id\u0027],"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_7fa710a7","line":59,"in_reply_to":"da20952f_031b8481","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"0ceb1ea6a4c46da6638db2d8edbd573489e4a8ac","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_35e4ab0b","line":1,"updated":"2015-11-18 00:33:48.000000000","message":"Enterprise","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_996c8ad1","line":1,"in_reply_to":"ba8a016a_35e4ab0b","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"}],"octavia/db/models.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        sa.String(36),"},{"line_number":381,"context_line":"        sa.ForeignKey(\"provisioning_status.name\","},{"line_number":382,"context_line":"                      name\u003d\"fk_container_provisioning_status_name\"))"},{"line_number":383,"context_line":"    vrrp_intf \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":384,"context_line":"    vrrp_id \u003d sa.Column(sa.Integer(), nullable\u003dTrue)"},{"line_number":385,"context_line":"    vrrp_priority \u003d sa.Column(sa.Integer(), nullable\u003dTrue)"},{"line_number":386,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_4f71510b","line":383,"updated":"2015-08-26 04:17:04.000000000","message":"vrrp_interface :)","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        sa.String(36),"},{"line_number":381,"context_line":"        sa.ForeignKey(\"provisioning_status.name\","},{"line_number":382,"context_line":"                      name\u003d\"fk_container_provisioning_status_name\"))"},{"line_number":383,"context_line":"    vrrp_intf \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":384,"context_line":"    vrrp_id \u003d sa.Column(sa.Integer(), nullable\u003dTrue)"},{"line_number":385,"context_line":"    vrrp_priority \u003d sa.Column(sa.Integer(), nullable\u003dTrue)"},{"line_number":386,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_162b0ded","line":383,"in_reply_to":"fa1b9901_4f71510b","updated":"2015-08-26 19:57:59.000000000","message":"Done","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        name\u003d\"fk_load_balancer_vrrp_auth_method_name\"))"},{"line_number":256,"context_line":"    vrrp_auth_pass \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":257,"context_line":"    advert_int \u003d sa.Column(sa.Integer(), nullable\u003dTrue)"},{"line_number":258,"context_line":"    smtp_server \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":259,"context_line":"    smtp_connect_timeout \u003d sa.Column(sa.Integer(), nullable\u003dTrue)"},{"line_number":260,"context_line":"    load_balancer \u003d orm.relationship(\"LoadBalancer\", uselist\u003dFalse,"},{"line_number":261,"context_line":"                                     backref\u003dorm.backref(\"vrrp_group\","}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_9e1feb5a","line":258,"updated":"2015-09-02 23:20:48.000000000","message":"Drop the SMTP","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        name\u003d\"fk_load_balancer_vrrp_auth_method_name\"))"},{"line_number":256,"context_line":"    vrrp_auth_pass \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":257,"context_line":"    advert_int \u003d sa.Column(sa.Integer(), nullable\u003dTrue)"},{"line_number":258,"context_line":"    smtp_server \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":259,"context_line":"    smtp_connect_timeout \u003d sa.Column(sa.Integer(), nullable\u003dTrue)"},{"line_number":260,"context_line":"    load_balancer \u003d orm.relationship(\"LoadBalancer\", uselist\u003dFalse,"},{"line_number":261,"context_line":"                                     backref\u003dorm.backref(\"vrrp_group\","}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_3fbc38ba","line":258,"in_reply_to":"da20952f_9e1feb5a","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"}],"octavia/db/repositories.py":[{"author":{"_account_id":10477,"name":"min wang","email":"swiftwangster@gmail.com","username":"minwang"},"change_message_id":"dc107bb14315035271fc4a5708473eee0a4431df","unresolved":false,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"        return amp.to_data_model()"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def is_spare_amp(self, session):"},{"line_number":341,"context_line":"        \"\"\"Checks if there is a spare amphora"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        :returns: True if there is an ampohra with status READY and not"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_dad01756","line":340,"updated":"2015-08-04 20:10:42.000000000","message":"I found in Bharath\u0027s code, it has a similar method do the same thing, while different name, wonder is that possible for keeping only one version, in that case, you and Bharath\u0027s code will have a dependent relationship, you guys need to figure out that.\n\nhttps://review.openstack.org/#/c/202829/10/octavia/db/repositories.py","commit_id":"f603be230e12a9b196f2fd3c92096fcd1233c4d9"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"07037b60dd22f56a4b1d2c9ef3ce920215dbe63a","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        return amp.to_data_model()"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    def is_spare_amp(self, session):"},{"line_number":342,"context_line":"        \"\"\"Checks if there is a spare amphora"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        :returns: True if there is an ampohra with status READY and not"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_df319e5b","line":341,"updated":"2015-08-25 21:32:31.000000000","message":"again feels unrelated to that patch","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        return amp.to_data_model()"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    def is_spare_amp(self, session):"},{"line_number":342,"context_line":"        \"\"\"Checks if there is a spare amphora"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        :returns: True if there is an ampohra with status READY and not"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_f639b942","line":341,"in_reply_to":"fa1b9901_df319e5b","updated":"2015-08-26 19:57:59.000000000","message":"Need it for the condition flows","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        return amp.to_data_model()"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    def is_spare_amp(self, session):"},{"line_number":342,"context_line":"        \"\"\"Checks if there is a spare amphora"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        :returns: True if there is an ampohra with status READY and not"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_5e415338","line":341,"updated":"2015-09-02 23:20:48.000000000","message":"As previously mentioned, there is a race condition with this.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        return amp.to_data_model()"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    def is_spare_amp(self, session):"},{"line_number":342,"context_line":"        \"\"\"Checks if there is a spare amphora"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        :returns: True if there is an ampohra with status READY and not"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_78d6aaf2","line":341,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":443,"context_line":"class VrrpGroupRepository(BaseRepository):"},{"line_number":444,"context_line":"    model_class \u003d models.VrrpGroup"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def update(self, session, load_balancer_id, **model_kwargs):"},{"line_number":447,"context_line":"        \"\"\"Updates a VrrpGroup entry for by load_balancer_id.\"\"\""},{"line_number":448,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":449,"context_line":"            session.query(self.model_class).filter_by("}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_3807d282","line":446,"updated":"2015-09-03 00:52:55.000000000","message":"Missing unit test","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"}],"octavia/network/base.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"1eddccafe2c83d518436298d8690f36df5ad15fe","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        pass"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @abc.abstractmethod"},{"line_number":229,"context_line":"    def update_vrrp_security_rules(self, load_balancer):"},{"line_number":230,"context_line":"        \"\"\"Sets up security groups for VRRP."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        :param load_balancer: The load balancer needing security group update"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_24c59c5a","line":229,"updated":"2015-11-21 21:10:40.000000000","message":"I\u0027m concerned about this method being in the interface.  I\u0027ve always hoped that the controller worker would be topology unaware.  What this method does could just be called in the plug vip method couldn\u0027t it?  The driver implementation could just call this method based on what topology is being used no?\n\nI know its easier said than done, but having the controller worker be topology aware makes it more complicated.  I feel like the network driver implementation should be the one to decide how to set the network resources up based on topology instead of the controller worker guessing what methods every implementation will need to be called.\n\nIt\u0027s not a big deal right now since this is the only network driver we have, but I have a feeling with the more implementations we get, the more complicated its going to make the controller worker (i.e. more permutations to check for).\n\nGoing this route would cause a mindshift in the compute and amphora drivers as well.  Because to make the controller worker truly topology unaware, the compute driver and amphora driver implementations would also need to handle multiple topologies.\n\nRight now, I still think its a good goal to have.  Not something that should be done in this review though.  Also, not something that should block this from being merged.  Although, if you wanted to start with the network driver...it could probably be done in this review.  What are your thoughts on it?","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"7a3ebb61babb2276a82c982d553d9a015641ab1e","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        pass"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @abc.abstractmethod"},{"line_number":229,"context_line":"    def update_vrrp_security_rules(self, load_balancer):"},{"line_number":230,"context_line":"        \"\"\"Sets up security groups for VRRP."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        :param load_balancer: The load balancer needing security group update"}],"source_content_type":"text/x-python","patch_set":42,"id":"9a8ffd7b_0e7fdae0","line":229,"in_reply_to":"ba8a016a_24c59c5a","updated":"2015-12-03 00:54:04.000000000","message":"Done","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"866fa5036674a697aaaa72d881e16611113fed6e","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        pass"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @abc.abstractmethod"},{"line_number":229,"context_line":"    def update_vrrp_security_rules(self, load_balancer):"},{"line_number":230,"context_line":"        \"\"\"Sets up security groups for VRRP."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        :param load_balancer: The load balancer needing security group update"}],"source_content_type":"text/x-python","patch_set":42,"id":"ba8a016a_3965bae0","line":229,"in_reply_to":"ba8a016a_24c59c5a","updated":"2015-11-23 02:05:42.000000000","message":"I agree with you on this, it should not be in this interface.","commit_id":"47b211fe68fe1df6b0f2baf8cc2ab97ba1e1c2f0"}],"octavia/network/drivers/neutron/allowed_address_pairs.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"649f98e164aa4bc182c2038425c73d8f5886537c","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        sec_grp \u003d self._get_lb_security_group(load_balancer.id)"},{"line_number":307,"context_line":"        self._update_security_group_rules(load_balancer, sec_grp.get(\u0027id\u0027))"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def update_vrr_security_rules(self, load_balancer):"},{"line_number":310,"context_line":"        sec_grp_id \u003d self._get_lb_security_group(load_balancer.id).get(\u0027id\u0027)"},{"line_number":311,"context_line":"        vrrp_rule \u003d {\u0027security_group_rule\u0027: {"},{"line_number":312,"context_line":"            \u0027security_group_id\u0027: sec_grp_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa1b9901_cfffa164","line":309,"updated":"2015-08-26 04:17:04.000000000","message":"vrrp?","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"b2f7b38b05c0cc0ed82b261cce52b4100588020d","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        sec_grp \u003d self._get_lb_security_group(load_balancer.id)"},{"line_number":307,"context_line":"        self._update_security_group_rules(load_balancer, sec_grp.get(\u0027id\u0027))"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def update_vrr_security_rules(self, load_balancer):"},{"line_number":310,"context_line":"        sec_grp_id \u003d self._get_lb_security_group(load_balancer.id).get(\u0027id\u0027)"},{"line_number":311,"context_line":"        vrrp_rule \u003d {\u0027security_group_rule\u0027: {"},{"line_number":312,"context_line":"            \u0027security_group_id\u0027: sec_grp_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"da20952f_361731a5","line":309,"in_reply_to":"fa1b9901_cfffa164","updated":"2015-08-26 19:57:59.000000000","message":"Done","commit_id":"4ba470318e687a4ca320e08236e7bade5e82f0de"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            if listener.provisioning_status !\u003d constants.PENDING_DELETE]"},{"line_number":107,"context_line":"        sync_ports \u003d ["},{"line_number":108,"context_line":"            listener.sync_port for listener in load_balancer.listeners"},{"line_number":109,"context_line":"            if listener.provisioning_status !\u003d constants.PENDING_DELETE]"},{"line_number":110,"context_line":"        updated_ports.extend(sync_ports)"},{"line_number":111,"context_line":"        # Just going to use port_range_max for now because we can assume that"},{"line_number":112,"context_line":"        # port_range_max and min will be the same since this driver is"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_9ea4cb08","line":109,"updated":"2015-09-02 23:20:48.000000000","message":"Should this be DELETED as well?","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            if listener.provisioning_status !\u003d constants.PENDING_DELETE]"},{"line_number":107,"context_line":"        sync_ports \u003d ["},{"line_number":108,"context_line":"            listener.sync_port for listener in load_balancer.listeners"},{"line_number":109,"context_line":"            if listener.provisioning_status !\u003d constants.PENDING_DELETE]"},{"line_number":110,"context_line":"        updated_ports.extend(sync_ports)"},{"line_number":111,"context_line":"        # Just going to use port_range_max for now because we can assume that"},{"line_number":112,"context_line":"        # port_range_max and min will be the same since this driver is"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_9fd224ff","line":109,"in_reply_to":"da20952f_9ea4cb08","updated":"2015-09-04 23:24:59.000000000","message":"I think so. We shall still update the sync_ports for PENDING_CREATE and PENDING_UPDATE statuses.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce761e2aa589349e3dc8bf933d9ab08e4271deea","unresolved":false,"context_lines":[{"line_number":307,"context_line":"        sec_grp \u003d self._get_lb_security_group(load_balancer.id)"},{"line_number":308,"context_line":"        self._update_security_group_rules(load_balancer, sec_grp.get(\u0027id\u0027))"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def update_vrrp_security_rules(self, load_balancer):"},{"line_number":311,"context_line":"        sec_grp_id \u003d self._get_lb_security_group(load_balancer.id).get(\u0027id\u0027)"},{"line_number":312,"context_line":"        vrrp_rule \u003d {\u0027security_group_rule\u0027: {"},{"line_number":313,"context_line":"            \u0027security_group_id\u0027: sec_grp_id,"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_03caa41a","line":310,"updated":"2015-09-02 23:20:48.000000000","message":"The base driver, noop, and spec need to be updated for this new method.","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"}],"octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"364f2f8a8e184c41f9e3635115046c1d8913ab45","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @mock.patch(\u0027os.path.exists\u0027)"},{"line_number":122,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.agent.api_server.listener.\u0027"},{"line_number":123,"context_line":"                + \u0027vrrp_check_script_update\u0027)"},{"line_number":124,"context_line":"    @mock.patch(\u0027subprocess.check_output\u0027)"},{"line_number":125,"context_line":"    def test_start(self, mock_subprocess, mock_vrrp, mock_exists):"},{"line_number":126,"context_line":"        rv \u003d self.app.put(\u0027/\u0027 + api_server.VERSION + \u0027/listeners/123/error\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_be9bcf65","line":123,"updated":"2015-09-03 00:52:55.000000000","message":"nit: the \u0027+\u0027 isn\u0027t necessary","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":17041,"name":"Sherif Abdelwahab","email":"selgohari@ieee.org","username":"sherif"},"change_message_id":"95de3b50ea7f3369bb2e26ab4aba23cd8a4f1d01","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @mock.patch(\u0027os.path.exists\u0027)"},{"line_number":122,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.agent.api_server.listener.\u0027"},{"line_number":123,"context_line":"                + \u0027vrrp_check_script_update\u0027)"},{"line_number":124,"context_line":"    @mock.patch(\u0027subprocess.check_output\u0027)"},{"line_number":125,"context_line":"    def test_start(self, mock_subprocess, mock_vrrp, mock_exists):"},{"line_number":126,"context_line":"        rv \u003d self.app.put(\u0027/\u0027 + api_server.VERSION + \u0027/listeners/123/error\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da20952f_7fd5d0e2","line":123,"in_reply_to":"da20952f_be9bcf65","updated":"2015-09-04 23:24:59.000000000","message":"Done","commit_id":"f92a3b2ff005938408fcc72e89c45b7c0edfc4bb"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"5325286f566dbee774ff84c9bead8deecf0423d3","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import subprocess"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":"import netifaces"},{"line_number":21,"context_line":"import six"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from octavia.amphorae.backends.agent import api_server"}],"source_content_type":"text/x-python","patch_set":45,"id":"9a8ffd7b_2f78e02a","line":20,"updated":"2015-12-02 00:54:11.000000000","message":"Shouldn\u0027t that file have been done by a dependency. Since it is merged I am confused why it shows up here.","commit_id":"5a9463a9354e5840bb0e6b1a4a777eb6a8d4c88d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"058f3f7f1d9b264bed0dc06b111d246e951c4061","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import subprocess"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":"import netifaces"},{"line_number":21,"context_line":"import six"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from octavia.amphorae.backends.agent import api_server"}],"source_content_type":"text/x-python","patch_set":45,"id":"9a8ffd7b_1dc2c434","line":20,"in_reply_to":"9a8ffd7b_2f78e02a","updated":"2015-12-02 17:24:35.000000000","message":"Ignore.","commit_id":"5a9463a9354e5840bb0e6b1a4a777eb6a8d4c88d"}],"octavia/tests/unit/amphorae/backends/agent/api_server/test_keepalived.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"0ceb1ea6a4c46da6638db2d8edbd573489e4a8ac","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_15972749","line":1,"updated":"2015-11-18 00:33:48.000000000","message":"Enterprise","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"51fbc55133af2173b0d24398d752e3fc6ae76256","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"ba8a016a_59b2a24d","line":1,"in_reply_to":"ba8a016a_15972749","updated":"2015-11-18 18:10:19.000000000","message":"Done","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"}],"octavia/tests/unit/controller/worker/flows/test_amphora_flows.py":[{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"f5e0d0d1c35cb704c7e467b325f178d6fe200e50","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        self.assertIn(constants.UPDATE_DICT, amp_flow.requires)"},{"line_number":154,"context_line":"        self.assertIn(constants.LOADBALANCER, amp_flow.provides)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        self.assertEqual(len(amp_flow.provides), 4)"},{"line_number":157,"context_line":"        self.assertEqual(len(amp_flow.requires), 2)"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_e8f22506","line":156,"updated":"2015-11-08 08:51:04.000000000","message":"self.assertEqual(4, len(amp_flow.provides))","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead3eb8af632b898332c40daaf8be8e74a742d42","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        self.assertIn(constants.UPDATE_DICT, amp_flow.requires)"},{"line_number":154,"context_line":"        self.assertIn(constants.LOADBALANCER, amp_flow.provides)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        self.assertEqual(len(amp_flow.provides), 4)"},{"line_number":157,"context_line":"        self.assertEqual(len(amp_flow.requires), 2)"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_ebe09fce","line":156,"in_reply_to":"da85f559_e8f22506","updated":"2015-11-10 00:57:45.000000000","message":"Done","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"f5e0d0d1c35cb704c7e467b325f178d6fe200e50","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        self.assertIn(constants.LOADBALANCER, amp_flow.provides)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        self.assertEqual(len(amp_flow.provides), 4)"},{"line_number":157,"context_line":"        self.assertEqual(len(amp_flow.requires), 2)"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_08f8c9e4","line":157,"updated":"2015-11-08 08:51:04.000000000","message":"self.assertEqual(2, len(amp_flow.requires))","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead3eb8af632b898332c40daaf8be8e74a742d42","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        self.assertIn(constants.LOADBALANCER, amp_flow.provides)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        self.assertEqual(len(amp_flow.provides), 4)"},{"line_number":157,"context_line":"        self.assertEqual(len(amp_flow.requires), 2)"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_8be793e3","line":157,"in_reply_to":"da85f559_08f8c9e4","updated":"2015-11-10 00:57:45.000000000","message":"Done","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"}],"specs/version0.5/network-driver-interface.rst":[{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"14197eb596d6a812444361732423bbd6c62e913e","unresolved":false,"context_lines":[{"line_number":243,"context_line":"    * returns \u003d None"},{"line_number":244,"context_line":"    * raises PortNotFound"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"* update_vrrp_security_rules(load_balancer):"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    * Setup security groups for VRRP"},{"line_number":249,"context_line":"    * load_balancer \u003d The load balancer needing security group update"}],"source_content_type":"text/x-rst","patch_set":33,"id":"da85f559_88aa796f","line":246,"updated":"2015-11-08 09:54:48.000000000","message":"This change should\u0027t be in a version1.0 section? or I miss something...","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead3eb8af632b898332c40daaf8be8e74a742d42","unresolved":false,"context_lines":[{"line_number":243,"context_line":"    * returns \u003d None"},{"line_number":244,"context_line":"    * raises PortNotFound"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"* update_vrrp_security_rules(load_balancer):"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    * Setup security groups for VRRP"},{"line_number":249,"context_line":"    * load_balancer \u003d The load balancer needing security group update"}],"source_content_type":"text/x-rst","patch_set":33,"id":"da85f559_6b690f25","line":246,"in_reply_to":"da85f559_88aa796f","updated":"2015-11-10 00:57:45.000000000","message":"Done","commit_id":"0eb2783911c27c62f74b6f8352950ca5a7473ab3"}],"specs/version1/network-driver-interface.rst":[{"author":{"_account_id":8157,"name":"Bertrand LALLAU","email":"bertrand.lallau@gmail.com","username":"blallau"},"change_message_id":"2fab98cb09199579112a52fdd3a4430c940ad7b8","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":" This work is licensed under a Creative Commons Attribution 3.0 Unported"},{"line_number":3,"context_line":" License."},{"line_number":4,"context_line":""}],"source_content_type":"text/x-rst","patch_set":40,"id":"ba8a016a_ab9fe6b2","line":1,"updated":"2015-11-17 21:56:10.000000000","message":"Is this file related to this change?","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"703f3245843353e8d841bcebe8058ad5ab418089","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":" This work is licensed under a Creative Commons Attribution 3.0 Unported"},{"line_number":3,"context_line":" License."},{"line_number":4,"context_line":""}],"source_content_type":"text/x-rst","patch_set":40,"id":"ba8a016a_2e3c642e","line":1,"in_reply_to":"ba8a016a_ab9fe6b2","updated":"2015-11-17 22:27:54.000000000","message":"It is a new version of the file for octavia version 1 that includes new interface components to support the active/standby (vrrp).\n\nI think it was your comment to move it here before.  grin","commit_id":"77edcac981aa61ae390b959a4f4c32fce1bd4a8e"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"d2d89e13b02aa39ee13112d72956d85731601186","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"https://blueprints.launchpad.net/octavia/+spec/network-driver-interface"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"We need a generic interface in which to create networking resources.  This is"},{"line_number":16,"context_line":"to allow implementations that can support different networking infrastructures"},{"line_number":17,"context_line":"that accomplish frontend and backend connectivity."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-rst","patch_set":43,"id":"ba8a016a_b6e7423f","line":15,"updated":"2015-11-23 22:08:37.000000000","message":"Nit: Proper English grammar rules dictate one space after periods. :P","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"be40a4acee0927d1a0f37434112443f69a4e1d82","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"https://blueprints.launchpad.net/octavia/+spec/network-driver-interface"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"We need a generic interface in which to create networking resources.  This is"},{"line_number":16,"context_line":"to allow implementations that can support different networking infrastructures"},{"line_number":17,"context_line":"that accomplish frontend and backend connectivity."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-rst","patch_set":43,"id":"9a8ffd7b_d6cc5bbd","line":15,"in_reply_to":"ba8a016a_b6e7423f","updated":"2015-12-01 22:18:31.000000000","message":"It depends on your style guide.","commit_id":"aa1af02a05159a7da18537915aaa1f3c8e87e014"}]}
