)]}'
{"neutron/agent/linux/keepalived.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1db15c4bb31bf91dc2890a8fc373d15d7eb16cf2","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OPTS \u003d ["},{"line_number":40,"context_line":"    cfg.StrOpt(\u0027keepalived_email_from\u0027,"},{"line_number":41,"context_line":"               default\u003dNone,"},{"line_number":42,"context_line":"               help\u003d_(\u0027Keepalived email address use in the From header\u0027)),"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_d416bb4a","line":39,"updated":"2016-04-07 16:00:48.000000000","message":"no need to add more config knobs, let me explain:\n\n\nthe keepalived_router_id has to be dynamic, you can probably base it on the router id, doing it here: \nhttps://review.openstack.org/#/c/302766/2/neutron/agent/linux/keepalived.py@279\n\n\nThe keepalived_email_from, does not need to be a valid email, we don\u0027t use the keepalive notification, just provide a dummy email address ( insert the dummy address as a constant up in L36 or so KEEPALIVED_EMAIL_FROM\u003d\u0027dummy@address.com\u0027 for example)\n\nThe purpose of providing those two parameters are, that if not provided, keepalived will try to reverse-resolve the hostname from the IP address, if DNS is not accessible, ... it will get locked, and MASTER replaced...","commit_id":"2606f057354c6f97fe3a44d23b0285b087d39164"},{"author":{"_account_id":2424,"name":"Felipe Reyes","email":"felipe.reyes@canonical.com","username":"freyes"},"change_message_id":"bd7f43c0f416249c2db692c5f47fcbc37ee8e722","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OPTS \u003d ["},{"line_number":40,"context_line":"    cfg.StrOpt(\u0027keepalived_email_from\u0027,"},{"line_number":41,"context_line":"               default\u003dNone,"},{"line_number":42,"context_line":"               help\u003d_(\u0027Keepalived email address use in the From header\u0027)),"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_11041716","line":39,"in_reply_to":"9a061dce_d416bb4a","updated":"2016-04-26 13:59:11.000000000","message":"agree","commit_id":"2606f057354c6f97fe3a44d23b0285b087d39164"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"09725f83a1a9c0f3e900e398b1f3aeb0a66617c1","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OPTS \u003d ["},{"line_number":40,"context_line":"    cfg.StrOpt(\u0027keepalived_email_from\u0027,"},{"line_number":41,"context_line":"               default\u003dNone,"},{"line_number":42,"context_line":"               help\u003d_(\u0027Keepalived email address use in the From header\u0027)),"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_e66fbdc1","line":39,"in_reply_to":"9a061dce_d416bb4a","updated":"2016-04-08 01:17:01.000000000","message":"agree with Miguel, we don\u0027t need to add more config knobs here.","commit_id":"2606f057354c6f97fe3a44d23b0285b087d39164"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1db15c4bb31bf91dc2890a8fc373d15d7eb16cf2","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                                for route in self.virtual_routes),"},{"line_number":277,"context_line":"                               [\u0027    }\u0027])"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def build_config(self):"},{"line_number":280,"context_line":"        config \u003d [\u0027vrrp_instance %s {\u0027 % self.name,"},{"line_number":281,"context_line":"                  \u0027    state %s\u0027 % self.state,"},{"line_number":282,"context_line":"                  \u0027    interface %s\u0027 % self.interface,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_94f28304","line":279,"updated":"2016-04-07 16:00:48.000000000","message":"\u003c\u003c\u003c\n\nbuild the new config details here, since here you will have access to the router id.","commit_id":"2606f057354c6f97fe3a44d23b0285b087d39164"},{"author":{"_account_id":2424,"name":"Felipe Reyes","email":"felipe.reyes@canonical.com","username":"freyes"},"change_message_id":"bd7f43c0f416249c2db692c5f47fcbc37ee8e722","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                                for route in self.virtual_routes),"},{"line_number":277,"context_line":"                               [\u0027    }\u0027])"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def build_config(self):"},{"line_number":280,"context_line":"        config \u003d [\u0027vrrp_instance %s {\u0027 % self.name,"},{"line_number":281,"context_line":"                  \u0027    state %s\u0027 % self.state,"},{"line_number":282,"context_line":"                  \u0027    interface %s\u0027 % self.interface,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_c32b9080","line":279,"in_reply_to":"9a061dce_94f28304","updated":"2016-04-26 13:59:11.000000000","message":"Inserting the generation of the global_defs section will lead to duplicates for cases where more than one vrrp_instance are defined, something that according to https://github.com/openstack/neutron/blob/master/neutron/tests/unit/agent/linux/test_keepalived.py#L140 is a valid use case.","commit_id":"2606f057354c6f97fe3a44d23b0285b087d39164"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1db15c4bb31bf91dc2890a8fc373d15d7eb16cf2","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        return self.instances.get(vrouter_id)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def build_config(self):"},{"line_number":333,"context_line":"        config \u003d [\u0027global_defs {\u0027,"},{"line_number":334,"context_line":"                  ]"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        if cfg.CONF.keepalived_email_from:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_749b6f66","line":333,"updated":"2016-04-07 16:00:48.000000000","message":"put them in the other function.","commit_id":"2606f057354c6f97fe3a44d23b0285b087d39164"},{"author":{"_account_id":2424,"name":"Felipe Reyes","email":"felipe.reyes@canonical.com","username":"freyes"},"change_message_id":"bd7f43c0f416249c2db692c5f47fcbc37ee8e722","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        return self.instances.get(vrouter_id)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def build_config(self):"},{"line_number":333,"context_line":"        config \u003d [\u0027global_defs {\u0027,"},{"line_number":334,"context_line":"                  ]"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        if cfg.CONF.keepalived_email_from:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_f542263d","line":333,"in_reply_to":"9a061dce_749b6f66","updated":"2016-04-26 13:59:11.000000000","message":"see comment above","commit_id":"2606f057354c6f97fe3a44d23b0285b087d39164"}]}
