)]}'
{"octavia/amphorae/backends/health_daemon/config.py":[{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"b2360006feb91f4eb78ffec6c0c65a217bb86c29","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def __len__(self):"},{"line_number":33,"context_line":"        return len(self.conf)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def add_observer(self, obs):"},{"line_number":36,"context_line":"        self.observers.add(obs)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def check_update(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_71742afe","line":35,"updated":"2014-12-19 01:11:25.000000000","message":"If we can add observers, shouldn\u0027t we also be able to remove observers?","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"}],"octavia/amphorae/backends/health_daemon/health_daemon.py":[{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"b2360006feb91f4eb78ffec6c0c65a217bb86c29","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#! /usr/bin/env python2.7"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Copyright 2014 Hewlett-Packard Development Company, L.P."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_510ace26","line":1,"updated":"2014-12-19 01:11:25.000000000","message":"Let\u0027s try to avoid calling python2.7 specifically, and instead just go with \u0027python\u0027","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"b2360006feb91f4eb78ffec6c0c65a217bb86c29","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            sighup_received \u003d False"},{"line_number":36,"context_line":"            cfg.check_update()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        e \u003d {\u0027test1\u0027: 42, \u0027seq\u0027: seq}"},{"line_number":39,"context_line":"        seq \u003d seq + 1"},{"line_number":40,"context_line":"        sender.dosend(e)"},{"line_number":41,"context_line":"        time.sleep(2)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_717eeab0","line":38,"updated":"2014-12-19 01:11:25.000000000","message":"Nit: s/test1/answer/\n\nLet\u0027s also add the amphora ID, as read from the config. In the raw, it would look something like:\n\u0027id\u0027: \u0027d50bd20a-9b2a-4f1a-bc2e-e91541d7a755\u0027\n\nAnd a version number, something like:\n\u0027version\u0027: 0.1\n\nPlease also add a TODO here to do the following basic checks:\n1. Make sure API daemon is running.\n2. Make sure that any configured listeners have a corresponding haproxy process running.","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"b2360006feb91f4eb78ffec6c0c65a217bb86c29","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        e \u003d {\u0027test1\u0027: 42, \u0027seq\u0027: seq}"},{"line_number":39,"context_line":"        seq \u003d seq + 1"},{"line_number":40,"context_line":"        sender.dosend(e)"},{"line_number":41,"context_line":"        time.sleep(2)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def parse_args():"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_315f0243","line":41,"updated":"2014-12-19 01:11:25.000000000","message":"This should be configurable (but you already know that).","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"07f110d124aa2135c36cfb284753d9519e4f5759","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#! /usr/bin/env python2.7"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Copyright 2014 Hewlett-Packard Development Company, L.P."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_ef3739e1","line":1,"updated":"2014-12-19 21:57:50.000000000","message":"Carried forward from last PS:  Let\u0027s try to avoid calling python2.7 specifically, and instead just go with \u0027python\u0027","commit_id":"2c5c0e998c1dc4d9bcf415ce077c8c17ac4df299"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"07f110d124aa2135c36cfb284753d9519e4f5759","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            sighup_received \u003d False"},{"line_number":35,"context_line":"            cfg.check_update()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        e \u003d {\u0027not the answer\u0027: 43,"},{"line_number":38,"context_line":"             \u0027id\u0027: cfg[\u0027id\u0027],"},{"line_number":39,"context_line":"             \u0027seq\u0027: seq}"},{"line_number":40,"context_line":"        seq \u003d seq + 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_cf419d3a","line":37,"updated":"2014-12-19 21:57:50.000000000","message":":)","commit_id":"2c5c0e998c1dc4d9bcf415ce077c8c17ac4df299"}],"octavia/amphorae/backends/health_daemon/health_sender.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"f77d130098ca8297099ec5e65b5fc189acebd125","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# TODO(Hookup) Need to decide how this hooks into rest of system,"},{"line_number":16,"context_line":"# e.g. daemon, subprocess, thread etc."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import socket"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_03555df9","line":15,"updated":"2014-12-19 01:11:36.000000000","message":"Not technically enforceable, but it should be TODO(username), so TODO(barclaac)","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"b2360006feb91f4eb78ffec6c0c65a217bb86c29","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# TODO(Hookup) Need to decide how this hooks into rest of system,"},{"line_number":16,"context_line":"# e.g. daemon, subprocess, thread etc."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import socket"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_c3d19558","line":16,"updated":"2014-12-19 01:11:25.000000000","message":"I\u0027m thinking the heartbeat daemon should be its own stand-alone daemon.","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"b2360006feb91f4eb78ffec6c0c65a217bb86c29","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        self.dests \u003d {}"},{"line_number":27,"context_line":"        self.update(self.config[\u0027destination\u0027], self.config[\u0027port\u0027])"},{"line_number":28,"context_line":"        self.v4sock \u003d socket.socket(socket.AF_INET, socket.SOCK_DGRAM)"},{"line_number":29,"context_line":"        self.v6sock \u003d socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)"},{"line_number":30,"context_line":"        self.key \u003d str(config[\u0027key\u0027])"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def config_change(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_434cc542","line":29,"updated":"2014-12-19 01:11:25.000000000","message":"I love that you\u0027re already IPv6 ready with this. Nice!","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"f77d130098ca8297099ec5e65b5fc189acebd125","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        pass"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def update(self, dest_list, port):"},{"line_number":36,"context_line":"        for i in dest_list:"},{"line_number":37,"context_line":"            a \u003d socket.getaddrinfo(i, port, 0, socket.SOCK_DGRAM)"},{"line_number":38,"context_line":"            for j in a:"},{"line_number":39,"context_line":"                self.dests[j[4]] \u003d j"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_c32c3505","line":36,"updated":"2014-12-19 01:11:36.000000000","message":"Using descriptive names for loop variables helps a lot for readability.","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"b2360006feb91f4eb78ffec6c0c65a217bb86c29","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        for i in dest_list:"},{"line_number":37,"context_line":"            a \u003d socket.getaddrinfo(i, port, 0, socket.SOCK_DGRAM)"},{"line_number":38,"context_line":"            for j in a:"},{"line_number":39,"context_line":"                self.dests[j[4]] \u003d j"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def dosend(self, envelope):"},{"line_number":42,"context_line":"        msg \u003d status_message.encode(envelope, self.key)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_a3b80912","line":39,"updated":"2014-12-19 01:11:25.000000000","message":"While I realize this is documented elsewhere, a short comment here explaining what index 4 is would be great.","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"f77d130098ca8297099ec5e65b5fc189acebd125","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            elif i[0] \u003d\u003d socket.AF_INET6:"},{"line_number":47,"context_line":"                self.v6sock.sendto(msg, i[4])"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":50,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_03339d62","line":49,"updated":"2014-12-19 01:11:36.000000000","message":"No need for this block to exist unless you actually want to do something on run.","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"}],"octavia/amphorae/backends/health_daemon/sample_config.json":[{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"b2360006feb91f4eb78ffec6c0c65a217bb86c29","unresolved":false,"context_lines":[{"line_number":2,"context_line":"    \"key\" : \"asamplekey\","},{"line_number":3,"context_line":"    \"delay\" : 2.5,"},{"line_number":4,"context_line":"    \"destination\" : [ \"::1\", \"127.1\" ],"},{"line_number":5,"context_line":"    \"port\" : 12345"},{"line_number":6,"context_line":"}"}],"source_content_type":"application/json","patch_set":1,"id":"3a961159_e364d1ba","line":5,"updated":"2014-12-19 01:11:25.000000000","message":"Add in:  \u0027id\u0027 (amphora ID)\n\nVersion should probably be baked into the amphora image. Hmmm....","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"}],"octavia/amphorae/backends/health_daemon/status_message.py":[{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"b2360006feb91f4eb78ffec6c0c65a217bb86c29","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import json"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def encode(msg, key):"},{"line_number":21,"context_line":"    rslt \u003d {}"},{"line_number":22,"context_line":"    src \u003d json.dumps(msg)"},{"line_number":23,"context_line":"    h \u003d hmac.new(key, src, hashlib.sha1)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_c32d1548","line":20,"updated":"2014-12-19 01:11:25.000000000","message":"We\u0027re not encoding so much as signing, right?","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"f77d130098ca8297099ec5e65b5fc189acebd125","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def encode(msg, key):"},{"line_number":21,"context_line":"    rslt \u003d {}"},{"line_number":22,"context_line":"    src \u003d json.dumps(msg)"},{"line_number":23,"context_line":"    h \u003d hmac.new(key, src, hashlib.sha1)"},{"line_number":24,"context_line":"    rslt[\u0027msg\u0027] \u003d msg"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_033f1d88","line":21,"updated":"2014-12-19 01:11:36.000000000","message":"This is 2014, your variable names can be more than 4 letters. :)","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"f77d130098ca8297099ec5e65b5fc189acebd125","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    return h.hexdigest() \u003d\u003d e[\u0027hmac\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":37,"context_line":"    m \u003d {\u0027test1\u0027: \u0027foo\u0027}"},{"line_number":38,"context_line":"    m[\u0027foo\u0027] \u003d 42"},{"line_number":39,"context_line":"    e \u003d encode(m, \u0027asamplekey\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_030abd78","line":36,"updated":"2014-12-19 01:11:36.000000000","message":"So these are little built-in tests? I don\u0027t know if this is really necessary when we have real tests elsewhere.","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"}],"tox.ini":[{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"b2360006feb91f4eb78ffec6c0c65a217bb86c29","unresolved":false,"context_lines":[{"line_number":20,"context_line":"commands \u003d python setup.py build_sphinx"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"[flake8]"},{"line_number":23,"context_line":"# Ignoring O321 because it\u0027s unnecessarily restricting use of json package. jsonutils version doesn\u0027t add additional value"},{"line_number":24,"context_line":"ignore \u003d O321"},{"line_number":25,"context_line":"show-source \u003d true"},{"line_number":26,"context_line":"builtins \u003d _"}],"source_content_type":"text/x-properties","patch_set":1,"id":"3a961159_434045a5","line":23,"updated":"2014-12-19 01:11:25.000000000","message":"Nit: Please split comment into two lines.","commit_id":"48b7517fd32b6dce96b616439e32efb833367451"}]}
