)]}'
{"etc/octavia.conf":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"76e3805a9f33f3e30d21028564bb61f73d697cd8","unresolved":false,"context_lines":[{"line_number":227,"context_line":"#"},{"line_number":228,"context_line":"# distributor_driver \u003d distributor_noop_driver"},{"line_number":229,"context_line":"#"},{"line_number":230,"context_line":"# Load balancer topology options are SINGLE, ACTIVE_STANDBY"},{"line_number":231,"context_line":"# loadbalancer_topology \u003d SINGLE"},{"line_number":232,"context_line":"# user_data_config_drive \u003d False"},{"line_number":233,"context_line":""}],"source_content_type":"text/plain","patch_set":2,"id":"1f485f77_0360dc00","line":230,"updated":"2017-11-14 04:33:56.000000000","message":"You would assume, once we have a distributor, that we support ACTIVE-ACTIVE....","commit_id":"71b28408d17575bfefda127398e1a2a92454545d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"eed892d9cac2aeb724a29910110ed6dc49a769e9","unresolved":false,"context_lines":[{"line_number":227,"context_line":"#"},{"line_number":228,"context_line":"# distributor_driver \u003d distributor_noop_driver"},{"line_number":229,"context_line":"#"},{"line_number":230,"context_line":"# Load balancer topology options are SINGLE, ACTIVE_STANDBY"},{"line_number":231,"context_line":"# loadbalancer_topology \u003d SINGLE"},{"line_number":232,"context_line":"# user_data_config_drive \u003d False"},{"line_number":233,"context_line":""}],"source_content_type":"text/plain","patch_set":2,"id":"1f485f77_cc6adab1","line":230,"in_reply_to":"1f485f77_0360dc00","updated":"2017-11-15 07:08:28.000000000","message":"Yes, but this patch does not add ACTIVE/ACTIVE support.  Another patch will update this, update the config.py/constants.py for that.","commit_id":"71b28408d17575bfefda127398e1a2a92454545d"}],"octavia/distributor/drivers/driver_base.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"76e3805a9f33f3e30d21028564bb61f73d697cd8","unresolved":false,"context_lines":[{"line_number":25,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":26,"context_line":"class DistributorDriver(object):"},{"line_number":27,"context_line":"    @abc.abstractmethod"},{"line_number":28,"context_line":"    def create_distributor(self, load_balancer):"},{"line_number":29,"context_line":"        \"\"\"Creates the required resources for a distributor"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :param load_balancer: Load balancer object associated with this"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f485f77_86ff3a00","line":28,"updated":"2017-11-14 04:33:56.000000000","message":"In Denver we talked about have the distributor return sub-flows...","commit_id":"71b28408d17575bfefda127398e1a2a92454545d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"76e3805a9f33f3e30d21028564bb61f73d697cd8","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        :type distributor_id: string"},{"line_number":95,"context_line":"        :param amphorae: List of amphora objects to register with the"},{"line_number":96,"context_line":"        distributor."},{"line_number":97,"context_line":"        :param type: array"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        This method registers amphorae with the distributor so it can begin to"},{"line_number":100,"context_line":"        receive requests from the distributor. Amphora should be ready to"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f485f77_86d29a5b","line":97,"updated":"2017-11-14 04:33:56.000000000","message":"tuple (see below)","commit_id":"71b28408d17575bfefda127398e1a2a92454545d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"76e3805a9f33f3e30d21028564bb61f73d697cd8","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        :param distributor_id: The ID of the distributor to uregister amphorae"},{"line_number":110,"context_line":"        from"},{"line_number":111,"context_line":"        :type distributor_id: string"},{"line_number":112,"context_line":"        :param amphorae: List of amphora objects to unregister from"},{"line_number":113,"context_line":"        distributor."},{"line_number":114,"context_line":"        :param type: array"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1f485f77_669e7eb9","line":112,"updated":"2017-11-14 04:33:56.000000000","message":"drain - not unregister","commit_id":"71b28408d17575bfefda127398e1a2a92454545d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"76e3805a9f33f3e30d21028564bb61f73d697cd8","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        :type distributor_id: string"},{"line_number":112,"context_line":"        :param amphorae: List of amphora objects to unregister from"},{"line_number":113,"context_line":"        distributor."},{"line_number":114,"context_line":"        :param type: array"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        This method will configure the distributor to stop sending new"},{"line_number":117,"context_line":"        connections to the amphorae in the list. Existing connections will"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f485f77_e6d70e4f","line":114,"updated":"2017-11-14 04:33:56.000000000","message":"rm_work is a big fan of using tuples instead of array/list because they are immutable and in that case am I","commit_id":"71b28408d17575bfefda127398e1a2a92454545d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"3ee119dc4081df420f929ecc463e40b0189b09bf","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        pass"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @abc.abstractmethod"},{"line_number":45,"context_line":"    def get_delete_distributor_subflow(self, distributor_id):"},{"line_number":46,"context_line":"        \"\"\"Get a subflow that deletes a distributor"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        :param distributor_id: The ID of the distributor to delete"}],"source_content_type":"text/x-python","patch_set":4,"id":"1f485f77_3f4f3235","line":45,"updated":"2017-11-15 17:52:47.000000000","message":"wouldn\u0027t the distributor_id stored in the task-engine? So instead it being a parameter on the method it should be part of the params in the flow? This applies to the other methods as well...","commit_id":"6c24ae7948487b36c312af21f34ff8b1faa0e66e"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"3ee119dc4081df420f929ecc463e40b0189b09bf","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        This method will return a TaskFlow Flow that registers amphorae with"},{"line_number":110,"context_line":"        the distributor so it can begin to receive requests from the"},{"line_number":111,"context_line":"        distributor. Amphora should be ready to receive requests prior to"},{"line_number":112,"context_line":"        this call being made."},{"line_number":113,"context_line":"        \"\"\""},{"line_number":114,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"1f485f77_1f2a367e","line":111,"range":{"start_line":111,"start_character":29,"end_line":111,"end_character":35},"updated":"2017-11-15 17:52:47.000000000","message":"will -- this is stuff happening outside of this code","commit_id":"6c24ae7948487b36c312af21f34ff8b1faa0e66e"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"3ee119dc4081df420f929ecc463e40b0189b09bf","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        This method will return a TaskFlow Flow that configures the"},{"line_number":130,"context_line":"        distributor to stop sending new connections to the amphorae in the"},{"line_number":131,"context_line":"        list. Existing connections will continue to pass traffic to the"},{"line_number":132,"context_line":"        amphorae in this list."},{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"1f485f77_9f14e645","line":131,"range":{"start_line":131,"start_character":8,"end_line":131,"end_character":12},"updated":"2017-11-15 17:52:47.000000000","message":"tuple","commit_id":"6c24ae7948487b36c312af21f34ff8b1faa0e66e"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"3ee119dc4081df420f929ecc463e40b0189b09bf","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                  distributor"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        This method will return a TaskFlow Flow that unregisters amphorae"},{"line_number":150,"context_line":"        from the distributor. Amphorae in this list will immediately stop"},{"line_number":151,"context_line":"        receiving traffic."},{"line_number":152,"context_line":"        \"\"\""},{"line_number":153,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"1f485f77_bf0b2222","line":150,"range":{"start_line":150,"start_character":47,"end_line":150,"end_character":51},"updated":"2017-11-15 17:52:47.000000000","message":"tuple","commit_id":"6c24ae7948487b36c312af21f34ff8b1faa0e66e"},{"author":{"_account_id":27303,"name":"Bar Elharar","email":"elhararb@gmail.com","username":"elhararb"},"change_message_id":"59802c6560a4fdd1a2abdfe959b3ff164a588ae7","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def get_create_distributor_subflow(self):"},{"line_number":29,"context_line":"        \"\"\"Get a subflow to create a distributor"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :requires: **load_balancer** (object) - Load balancer object"},{"line_number":32,"context_line":"                   associated with this distributor"},{"line_number":33,"context_line":"        :provides: **distributor_id** (string) - The created distributor ID"},{"line_number":34,"context_line":"        :returns: A TaskFlow Flow that will create the distributor"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_683e902a","line":32,"range":{"start_line":31,"start_character":0,"end_line":32,"end_character":51},"updated":"2017-11-21 11:18:31.000000000","message":"Unless distributor is associated with load balancer object, perhaps add an optional argument here, to specify distributor_type/name.\nThat way one could choose an alternative over the global configuration.","commit_id":"0ff343acf6a6fdf0add66b195cb1805b2f0a1137"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"f686679951a6876390088db56c1e9a17f1d1448c","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def get_create_distributor_subflow(self):"},{"line_number":29,"context_line":"        \"\"\"Get a subflow to create a distributor"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :requires: **load_balancer** (object) - Load balancer object"},{"line_number":32,"context_line":"                   associated with this distributor"},{"line_number":33,"context_line":"        :provides: **distributor_id** (string) - The created distributor ID"},{"line_number":34,"context_line":"        :returns: A TaskFlow Flow that will create the distributor"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_876acf7d","line":32,"range":{"start_line":31,"start_character":0,"end_line":32,"end_character":51},"in_reply_to":"ff82abbf_683e902a","updated":"2017-11-21 22:55:59.000000000","message":"The type of distributor should be selected by specifying which driver implementation was selected prior to this method being called.  I.e. no-op, amphora distributor, l3, LVS, etc. are all drivers implementing this interface.","commit_id":"0ff343acf6a6fdf0add66b195cb1805b2f0a1137"},{"author":{"_account_id":27303,"name":"Bar Elharar","email":"elhararb@gmail.com","username":"elhararb"},"change_message_id":"59802c6560a4fdd1a2abdfe959b3ff164a588ae7","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        \"\"\"Get a subflow that drains connections from amphorae"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        :requires: **distributor_id** (string) - The ID of the distributor"},{"line_number":116,"context_line":"                   to uregister amphorae from"},{"line_number":117,"context_line":"        :requires: **amphorae** (tuple) - Tuple of amphora objects to drain"},{"line_number":118,"context_line":"                   from distributor."},{"line_number":119,"context_line":"        :returns: A TaskFlow Flow that will drain the listed amphorae on the"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_85cdfd5e","line":116,"range":{"start_line":116,"start_character":22,"end_line":116,"end_character":31},"updated":"2017-11-21 11:18:31.000000000","message":"typo?","commit_id":"0ff343acf6a6fdf0add66b195cb1805b2f0a1137"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"f686679951a6876390088db56c1e9a17f1d1448c","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        \"\"\"Get a subflow that drains connections from amphorae"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        :requires: **distributor_id** (string) - The ID of the distributor"},{"line_number":116,"context_line":"                   to uregister amphorae from"},{"line_number":117,"context_line":"        :requires: **amphorae** (tuple) - Tuple of amphora objects to drain"},{"line_number":118,"context_line":"                   from distributor."},{"line_number":119,"context_line":"        :returns: A TaskFlow Flow that will drain the listed amphorae on the"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_e70e3be4","line":116,"range":{"start_line":116,"start_character":22,"end_line":116,"end_character":31},"in_reply_to":"ff82abbf_85cdfd5e","updated":"2017-11-21 22:55:59.000000000","message":"Done","commit_id":"0ff343acf6a6fdf0add66b195cb1805b2f0a1137"},{"author":{"_account_id":27303,"name":"Bar Elharar","email":"elhararb@gmail.com","username":"elhararb"},"change_message_id":"59802c6560a4fdd1a2abdfe959b3ff164a588ae7","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        \"\"\"Get a subflow that unregisters amphorae from a distributor"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        :requires: **distributor_id** (string) - The ID of the distributor"},{"line_number":134,"context_line":"                   to uregister amphorae from"},{"line_number":135,"context_line":"        :requires: **amphorae** (tuple) - Tuple of amphora objects to"},{"line_number":136,"context_line":"                   unregister from distributor."},{"line_number":137,"context_line":"        :returns: A TaskFlow Flow that will unregister amphorae from the"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_25daf116","line":134,"range":{"start_line":134,"start_character":22,"end_line":134,"end_character":31},"updated":"2017-11-21 11:18:31.000000000","message":"typo?","commit_id":"0ff343acf6a6fdf0add66b195cb1805b2f0a1137"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"f686679951a6876390088db56c1e9a17f1d1448c","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        \"\"\"Get a subflow that unregisters amphorae from a distributor"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        :requires: **distributor_id** (string) - The ID of the distributor"},{"line_number":134,"context_line":"                   to uregister amphorae from"},{"line_number":135,"context_line":"        :requires: **amphorae** (tuple) - Tuple of amphora objects to"},{"line_number":136,"context_line":"                   unregister from distributor."},{"line_number":137,"context_line":"        :returns: A TaskFlow Flow that will unregister amphorae from the"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_07147ff4","line":134,"range":{"start_line":134,"start_character":22,"end_line":134,"end_character":31},"in_reply_to":"ff82abbf_25daf116","updated":"2017-11-21 22:55:59.000000000","message":"Done","commit_id":"0ff343acf6a6fdf0add66b195cb1805b2f0a1137"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"0f44350198d1c89333e26edb0e567daedd2fb6bb","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import six"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# This class describes the abstraction of a distributor interface."},{"line_number":21,"context_line":"# Distributor implementations may be: a noop, a single hardware device,"},{"line_number":22,"context_line":"# a single amphora, or multiple amphora among other options."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_716f0992","line":20,"updated":"2017-12-06 23:25:38.000000000","message":"Should this be a docstring for the class?","commit_id":"7b1621789c545adedcffdd65bc953ee618c96ba0"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"0f44350198d1c89333e26edb0e567daedd2fb6bb","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        pass"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    @abc.abstractmethod"},{"line_number":130,"context_line":"    def get_unregister_amphorae_subflow(self):"},{"line_number":131,"context_line":"        \"\"\"Get a subflow that unregisters amphorae from a distributor"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        :requires: **distributor_id** (string) - The ID of the distributor"}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_b15d91ea","line":130,"updated":"2017-12-06 23:25:38.000000000","message":"I guess these function names are the most accurate, but it is a little ridiculous that we\u0027ve managed to use three different verbs for the three objects involved. \n\nNot saying I\u0027d do it any differently, just pointing it out. :P","commit_id":"7b1621789c545adedcffdd65bc953ee618c96ba0"}],"octavia/distributor/drivers/noop_driver/driver.py":[{"author":{"_account_id":27303,"name":"Bar Elharar","email":"elhararb@gmail.com","username":"elhararb"},"change_message_id":"59802c6560a4fdd1a2abdfe959b3ff164a588ae7","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def __init__(self, name, provides_dicts\u003dNone, requires\u003dNone):"},{"line_number":29,"context_line":"        super(NoopProvidesRequiresTask, self).__init__("},{"line_number":30,"context_line":"            name\u003dname,"},{"line_number":31,"context_line":"            provides\u003dprovides_dicts.keys(),"},{"line_number":32,"context_line":"            requires\u003drequires)"},{"line_number":33,"context_line":"        self.provides_dict \u003d provides_dicts"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_e562c916","line":31,"range":{"start_line":31,"start_character":21,"end_line":31,"end_character":42},"updated":"2017-11-21 11:18:31.000000000","message":"1. It will fail to iterate the default None value, if not specified.\n2. PY3: would you consider list(dict) or dict.iterkeys() instead? I think either would be better fit here.","commit_id":"0ff343acf6a6fdf0add66b195cb1805b2f0a1137"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"f686679951a6876390088db56c1e9a17f1d1448c","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def __init__(self, name, provides_dicts\u003dNone, requires\u003dNone):"},{"line_number":29,"context_line":"        super(NoopProvidesRequiresTask, self).__init__("},{"line_number":30,"context_line":"            name\u003dname,"},{"line_number":31,"context_line":"            provides\u003dprovides_dicts.keys(),"},{"line_number":32,"context_line":"            requires\u003drequires)"},{"line_number":33,"context_line":"        self.provides_dict \u003d provides_dicts"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_47f5a756","line":31,"range":{"start_line":31,"start_character":21,"end_line":31,"end_character":42},"in_reply_to":"ff82abbf_e562c916","updated":"2017-11-21 22:55:59.000000000","message":"Done","commit_id":"0ff343acf6a6fdf0add66b195cb1805b2f0a1137"}]}
