)]}'
{"bin/agent":[{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"a073b1622def50c704b561dad16afa3811fc7b92","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    server.app.run(host\u003dCONF.amphora.bind_host,"},{"line_number":70,"context_line":"                   port\u003dCONF.amphora.bind_port,"},{"line_number":71,"context_line":"                   debug\u003dCONF.debug,"},{"line_number":72,"context_line":"                   # replace with \u0027adhoc\u0027 if you don\u0027t have certs"},{"line_number":73,"context_line":"                   ssl_context\u003dctx)"}],"source_content_type":"application/octet-stream","patch_set":24,"id":"dac4157f_fb99c220","line":72,"updated":"2015-04-20 03:59:53.000000000","message":"I\u0027m not sure what this comment is saying.  Replace what with \u0027adhoc\u0027?  Does this mean we expect someone to actually edit code in certain instances?","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"13f7904033718de13a613f23821bef21087e9c51","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    server.app.run(host\u003dCONF.amphora.bind_host,"},{"line_number":70,"context_line":"                   port\u003dCONF.amphora.bind_port,"},{"line_number":71,"context_line":"                   debug\u003dCONF.debug,"},{"line_number":72,"context_line":"                   # replace with \u0027adhoc\u0027 if you don\u0027t have certs"},{"line_number":73,"context_line":"                   ssl_context\u003dctx)"}],"source_content_type":"application/octet-stream","patch_set":24,"id":"dac4157f_77ec7ec7","line":72,"in_reply_to":"dac4157f_fb99c220","updated":"2015-04-20 22:53:22.000000000","message":"Removed that comment. Given the script everybody should have certs","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"}],"bin/agent.py":[{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"b889d8763904e29b49996bd93a9b8c2ff37a11aa","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2014 Hewlett-Packard Development Company, L.P."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_e5a2834a","line":3,"updated":"2015-03-17 04:32:37.000000000","message":"2015","commit_id":"fa9a5d6bf5777da2ebd9af372cb909d01d4aa962"},{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"b889d8763904e29b49996bd93a9b8c2ff37a11aa","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import logging"},{"line_number":20,"context_line":"import sys"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from oslo.config import cfg"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from octavia.amphorae.backends.agent.api_server import server"},{"line_number":25,"context_line":"from octavia.common import service"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_bfa25d49","line":22,"updated":"2015-03-17 04:32:37.000000000","message":"I think the \"modern\" way to  do this is oslo_config instead of oslo.config.","commit_id":"fa9a5d6bf5777da2ebd9af372cb909d01d4aa962"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"1000c8d2edbbdd911413ebf22c1cefe950985a71","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"1a6ced46_3fff2969","updated":"2015-03-23 21:08:16.000000000","message":"name this file without the .py (there\u0027s a review that does the same for the bin/octavia-api.py file)","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# Hack: Use werkzeugs context"},{"line_number":35,"context_line":"# also http://stackoverflow.com/questions/23262768/"},{"line_number":36,"context_line":"# two-way-ssl-authentication-for-flask"},{"line_number":37,"context_line":"class Octavia_SSL_Context(serving._SSLContext):"},{"line_number":38,"context_line":"    def __init__(self, protocol):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_550090aa","line":35,"updated":"2015-03-20 21:39:31.000000000","message":"Interesting -- that kinda sucks, but I guess as long as this works, for now...","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"1000c8d2edbbdd911413ebf22c1cefe950985a71","unresolved":false,"context_lines":[{"line_number":34,"context_line":"# Hack: Use werkzeugs context"},{"line_number":35,"context_line":"# also http://stackoverflow.com/questions/23262768/"},{"line_number":36,"context_line":"# two-way-ssl-authentication-for-flask"},{"line_number":37,"context_line":"class Octavia_SSL_Context(serving._SSLContext):"},{"line_number":38,"context_line":"    def __init__(self, protocol):"},{"line_number":39,"context_line":"        self._ca_certs \u003d None"},{"line_number":40,"context_line":"        super(Octavia_SSL_Context, self).__init__(protocol)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_3fb1e9e1","line":37,"updated":"2015-03-23 21:08:16.000000000","message":"remove the _\u0027s","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":34,"context_line":"# Hack: Use werkzeugs context"},{"line_number":35,"context_line":"# also http://stackoverflow.com/questions/23262768/"},{"line_number":36,"context_line":"# two-way-ssl-authentication-for-flask"},{"line_number":37,"context_line":"class Octavia_SSL_Context(serving._SSLContext):"},{"line_number":38,"context_line":"    def __init__(self, protocol):"},{"line_number":39,"context_line":"        self._ca_certs \u003d None"},{"line_number":40,"context_line":"        super(Octavia_SSL_Context, self).__init__(protocol)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_7bca5e6f","line":37,"in_reply_to":"1a6ced46_3fb1e9e1","updated":"2015-03-24 23:54:18.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def wrap_socket(self, sock, **kwargs):"},{"line_number":48,"context_line":"        return super(Octavia_SSL_Context, self).wrap_socket("},{"line_number":49,"context_line":"            sock,"},{"line_number":50,"context_line":"            # Comment out for debugging if yiu want to connect without"},{"line_number":51,"context_line":"            # a client cert"},{"line_number":52,"context_line":"            cert_reqs\u003dssl.CERT_REQUIRED,"},{"line_number":53,"context_line":"            ca_certs\u003dself._ca_certs"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_3a2784c8","line":50,"updated":"2015-03-20 23:08:14.000000000","message":"NIt: typo yiu-\u003eyou","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"9cb3f7a7b15c8ed6870546bbeb05ab03a28d0a82","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def wrap_socket(self, sock, **kwargs):"},{"line_number":48,"context_line":"        return super(Octavia_SSL_Context, self).wrap_socket("},{"line_number":49,"context_line":"            sock,"},{"line_number":50,"context_line":"            # Comment out for debugging if yiu want to connect without"},{"line_number":51,"context_line":"            # a client cert"},{"line_number":52,"context_line":"            cert_reqs\u003dssl.CERT_REQUIRED,"},{"line_number":53,"context_line":"            ca_certs\u003dself._ca_certs"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_7aaa9471","line":50,"in_reply_to":"9a80dd14_3a2784c8","updated":"2015-03-23 22:10:25.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    service.prepare_service(sys.argv)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # We will only enforce that the client cert is from the good authority"},{"line_number":63,"context_line":"    ctx \u003d Octavia_SSL_Context(ssl.PROTOCOL_SSLv23)"},{"line_number":64,"context_line":"    ctx.load_cert_chain(CONF.agent.agent_server_cert,"},{"line_number":65,"context_line":"                        ca\u003dCONF.agent.agent_server_ca)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_7d2ad67e","line":63,"updated":"2015-03-20 23:08:14.000000000","message":"Being picky here, you should disable SSL v2 and v3 and only leave TLS\n\nctx.options |\u003d ssl.OP_NO_SSLv2\nctx.options |\u003d ssl.OP_NO_SSLv3","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"9cb3f7a7b15c8ed6870546bbeb05ab03a28d0a82","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    service.prepare_service(sys.argv)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # We will only enforce that the client cert is from the good authority"},{"line_number":63,"context_line":"    ctx \u003d Octavia_SSL_Context(ssl.PROTOCOL_SSLv23)"},{"line_number":64,"context_line":"    ctx.load_cert_chain(CONF.agent.agent_server_cert,"},{"line_number":65,"context_line":"                        ca\u003dCONF.agent.agent_server_ca)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_da0c6897","line":63,"in_reply_to":"9a80dd14_7d2ad67e","updated":"2015-03-23 22:10:25.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"}],"bin/create_certificates.sh":[{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"a073b1622def50c704b561dad16afa3811fc7b92","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#! bin/bash"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# USAGE: \u003ccertificate directory\u003e \u003copenssl.cnf (example in etc/certificate)"},{"line_number":4,"context_line":"#Those are certificates for testing will be generated"}],"source_content_type":"text/x-sh","patch_set":24,"id":"dac4157f_db6cbe0a","line":1,"updated":"2015-04-20 03:59:53.000000000","message":"Should be \n#!/bin/bash","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"a073b1622def50c704b561dad16afa3811fc7b92","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#! bin/bash"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# USAGE: \u003ccertificate directory\u003e \u003copenssl.cnf (example in etc/certificate)"},{"line_number":4,"context_line":"#Those are certificates for testing will be generated"},{"line_number":5,"context_line":"#"},{"line_number":6,"context_line":"#* ca_01.pem is a certificate authority file"}],"source_content_type":"text/x-sh","patch_set":24,"id":"dac4157f_5b2f8ea1","line":3,"updated":"2015-04-20 03:59:53.000000000","message":"Missing \u003e after openssl.cnf","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"a073b1622def50c704b561dad16afa3811fc7b92","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# Create directories"},{"line_number":34,"context_line":"CERT_DIR\u003d$1"},{"line_number":35,"context_line":"OPEN_SSL_CONF\u003d$2 # et/certificates/openssl.cnf"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"echo $CERT_DIR"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-sh","patch_set":24,"id":"dac4157f_3b905aec","line":35,"updated":"2015-04-20 03:59:53.000000000","message":"\"et/\"?  Should this be \"etc/\"?","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"13f7904033718de13a613f23821bef21087e9c51","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# Create directories"},{"line_number":34,"context_line":"CERT_DIR\u003d$1"},{"line_number":35,"context_line":"OPEN_SSL_CONF\u003d$2 # et/certificates/openssl.cnf"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"echo $CERT_DIR"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-sh","patch_set":24,"id":"dac4157f_f7464ebe","line":35,"in_reply_to":"dac4157f_3b905aec","updated":"2015-04-20 22:53:22.000000000","message":"Done","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"a073b1622def50c704b561dad16afa3811fc7b92","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"mkdir $CERT_DIR"},{"line_number":41,"context_line":"cd $CERT_DIR"},{"line_number":42,"context_line":"mkdir newcerts private"},{"line_number":43,"context_line":"chmod 700 private"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# prepare files"}],"source_content_type":"text/x-sh","patch_set":24,"id":"dac4157f_bb3fcad5","line":42,"updated":"2015-04-20 03:59:53.000000000","message":"Is \"newcerts\" used?  I don\u0027t see it below.  If it is used implicitly by something, a comment here would be good.","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"13f7904033718de13a613f23821bef21087e9c51","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"mkdir $CERT_DIR"},{"line_number":41,"context_line":"cd $CERT_DIR"},{"line_number":42,"context_line":"mkdir newcerts private"},{"line_number":43,"context_line":"chmod 700 private"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# prepare files"}],"source_content_type":"text/x-sh","patch_set":24,"id":"dac4157f_576e1a30","line":42,"in_reply_to":"dac4157f_bb3fcad5","updated":"2015-04-20 22:53:22.000000000","message":"It\u0027s specified in the openssl.cfg I ship in etc","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"a073b1622def50c704b561dad16afa3811fc7b92","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# prepare files"},{"line_number":46,"context_line":"touch index.txt"},{"line_number":47,"context_line":"echo 01 \u003e serial"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"echo \"Create the CA\u0027s private and public keypair (2k long)\""}],"source_content_type":"text/x-sh","patch_set":24,"id":"dac4157f_1b4a3684","line":47,"updated":"2015-04-20 03:59:53.000000000","message":"What do the two lines above do?  I don\u0027t see these files used anywhere.","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"13f7904033718de13a613f23821bef21087e9c51","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# prepare files"},{"line_number":46,"context_line":"touch index.txt"},{"line_number":47,"context_line":"echo 01 \u003e serial"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"echo \"Create the CA\u0027s private and public keypair (2k long)\""}],"source_content_type":"text/x-sh","patch_set":24,"id":"dac4157f_1778a2f1","line":47,"in_reply_to":"dac4157f_1b4a3684","updated":"2015-04-20 22:53:22.000000000","message":"they initizlize stuff for Openssl, again they are specified in the sample OpenSSL file","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"}],"elements/amphora-agent/source-repository-amphora-agent":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","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/stackforge/octavia refs/changes/34/160034/30"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"7a016987_8c2c409a","line":2,"updated":"2015-05-28 22:22:48.000000000","message":"Should we change this to be master for the merge?","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"}],"etc/certificates/README":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Those are certificates for testing"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"* ca_01.pem is a certificate authority file"},{"line_number":4,"context_line":"* server.pem combines a key and a cert from this certificate authority"}],"source_content_type":"application/octet-stream","patch_set":12,"id":"9a80dd14_fdaa46d0","line":1,"updated":"2015-03-20 23:08:14.000000000","message":"I am typically not a fan of including keys and certs.\nMaybe include a little script that creates them?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"9cb3f7a7b15c8ed6870546bbeb05ab03a28d0a82","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Those are certificates for testing"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"* ca_01.pem is a certificate authority file"},{"line_number":4,"context_line":"* server.pem combines a key and a cert from this certificate authority"}],"source_content_type":"application/octet-stream","patch_set":12,"id":"1a6ced46_cdd82f20","line":1,"in_reply_to":"9a80dd14_fdaa46d0","updated":"2015-03-23 22:10:25.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":5,"context_line":"* client.key the client key"},{"line_number":6,"context_line":"* client.pem the client certificate"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"You will need to copy them to places tge agent_api server can find and"},{"line_number":9,"context_line":"specify it in the config."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Example for client use:"}],"source_content_type":"application/octet-stream","patch_set":12,"id":"9a80dd14_1d31daec","line":8,"updated":"2015-03-20 23:08:14.000000000","message":"NIT tge-\u003ethe","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"curl -k -v --key client.key --cacert ca_01.pem --cert client.pem https://0.0.0.0:8443/"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Notes:"},{"line_number":16,"context_line":"* For production use the ca issuing the client certificate and the ca issueuing the server cetrificate"},{"line_number":17,"context_line":"need to be different so a hacker can\u0027t just use the server certificate form a compromised amphora"},{"line_number":18,"context_line":"to control all the others."},{"line_number":19,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":12,"id":"9a80dd14_7d51f60c","line":16,"updated":"2015-03-20 23:08:14.000000000","message":"NIT: line is too long","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Notes:"},{"line_number":16,"context_line":"* For production use the ca issuing the client certificate and the ca issueuing the server cetrificate"},{"line_number":17,"context_line":"need to be different so a hacker can\u0027t just use the server certificate form a compromised amphora"},{"line_number":18,"context_line":"to control all the others."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"* The server cert was created by concatenating a server .pem and a server.key, e.g."}],"source_content_type":"application/octet-stream","patch_set":12,"id":"9a80dd14_1d48fa5a","line":17,"updated":"2015-03-20 23:08:14.000000000","message":"NIT form-\u003efrom","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"}],"etc/certificates/openssl.cnf":[{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"a073b1622def50c704b561dad16afa3811fc7b92","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# OpenSSL example configuration file."},{"line_number":3,"context_line":"# This is mostly being used for generation of certificate requests."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":24,"id":"dac4157f_fb1c2279","line":2,"updated":"2015-04-20 03:59:53.000000000","message":"This file has tons of tabs and some trailing whitespace.  Surprised pep8 doesn\u0027t through a fit.","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"13f7904033718de13a613f23821bef21087e9c51","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# OpenSSL example configuration file."},{"line_number":3,"context_line":"# This is mostly being used for generation of certificate requests."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":24,"id":"dac4157f_d7c7ca10","line":2,"in_reply_to":"dac4157f_fb1c2279","updated":"2015-04-20 22:53:22.000000000","message":"I copied the one which was on my system from /etc/ so maybe they need it...","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# To use this configuration file with the \"-extfile\" option of the"},{"line_number":16,"context_line":"# \"openssl x509\" utility, name here the section containing the"},{"line_number":17,"context_line":"# X.509v3 extensions to use:"},{"line_number":18,"context_line":"# extensions\t\t\u003d "},{"line_number":19,"context_line":"# (Alternatively, use a configuration file that has only"},{"line_number":20,"context_line":"# X.509v3 extensions in its main [\u003d default] section.)"},{"line_number":21,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":32,"id":"7a016987_0c405033","line":18,"updated":"2015-05-28 22:22:48.000000000","message":"Nit: spaces","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"}],"etc/octavia.conf":[{"author":{"_account_id":6437,"name":"Susanne Balle","email":"sleipnir012@gmail.com","username":"susanne-balle"},"change_message_id":"1b4e55b82645c1ab71c59d7438427f03d8a53fc0","unresolved":false,"context_lines":[{"line_number":41,"context_line":"# Network to communicate with amphora"},{"line_number":42,"context_line":"# lb_network_name \u003d"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"[agent]"},{"line_number":45,"context_line":"# bind_host \u003d 0.0.0.0"},{"line_number":46,"context_line":"# bind_port \u003d 9191"},{"line_number":47,"context_line":"# haproxy_cfg_dir \u003d /tmp"}],"source_content_type":"text/plain","patch_set":12,"id":"1a6ced46_e5041f80","line":44,"updated":"2015-03-23 22:32:54.000000000","message":"agent doesn\u0027t tell the admin anything about hwat this is. As I am poking around and doing work on the api_client I was going to add some params into the octavia.conf as well. Could we change the \"agent\" to something more specific? We could end up with many agents.","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":54,"context_line":"# lb_network_name \u003d"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"[haproxy_amphora]"},{"line_number":58,"context_line":"# username \u003d ubuntu"},{"line_number":59,"context_line":"# key_path \u003d /opt/stack/.ssh/id_rsa"},{"line_number":60,"context_line":"# base_path \u003d /var/lib/octavia"}],"source_content_type":"text/plain","patch_set":32,"id":"7a016987_4c7088a4","line":57,"updated":"2015-05-28 22:22:48.000000000","message":"This is confusing.  Can we clarify which config items are for which amphora driver?","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"}],"octavia/amphorae/backends/agent/api_server/__init__.py":[{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"b889d8763904e29b49996bd93a9b8c2ff37a11aa","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 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"},{"line_number":5,"context_line":"# a copy of the License at"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_05aeb72f","line":2,"updated":"2015-03-17 04:32:37.000000000","message":"2015","commit_id":"fa9a5d6bf5777da2ebd9af372cb909d01d4aa962"}],"octavia/amphorae/backends/agent/api_server/amphora_info.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from octavia.amphorae.backends.agent.api_server import util"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":"NETWORK_DEVICE \u003d \u0027eth0\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def compile_amphora_info():"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_9dceaa2b","line":27,"updated":"2015-03-20 23:08:14.000000000","message":"hmmm, this will only be the load balancer network right?\nShould we iterate over the interfaces?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"9cb3f7a7b15c8ed6870546bbeb05ab03a28d0a82","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from octavia.amphorae.backends.agent.api_server import util"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":"NETWORK_DEVICE \u003d \u0027eth0\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def compile_amphora_info():"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_ae6cc99d","line":27,"in_reply_to":"9a80dd14_9dceaa2b","updated":"2015-03-23 22:10:25.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"1000c8d2edbbdd911413ebf22c1cefe950985a71","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from octavia.amphorae.backends.agent.api_server import util"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":"NETWORK_DEVICE \u003d \u0027eth0\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def compile_amphora_info():"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_1f7fcde1","line":27,"in_reply_to":"9a80dd14_9dceaa2b","updated":"2015-03-23 21:08:16.000000000","message":"there will possibly be N interfaces with the need to plug amphorae to member subnets.","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"         \u0027load\u0027: ["},{"line_number":71,"context_line":"             _load()],"},{"line_number":72,"context_line":"         \u0027topology\u0027: \u0027SINGLE\u0027,  # todo(german): const"},{"line_number":73,"context_line":"         \u0027topology_status\u0027: \u0027OK\u0027,  # todo(german): const"},{"line_number":74,"context_line":"         \u0027listeners\u0027: listener_list,"},{"line_number":75,"context_line":"         \u0027packages\u0027: {}})"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_7df2d66f","line":73,"updated":"2015-03-20 23:08:14.000000000","message":"NIT: TODOs","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"9cb3f7a7b15c8ed6870546bbeb05ab03a28d0a82","unresolved":false,"context_lines":[{"line_number":70,"context_line":"         \u0027load\u0027: ["},{"line_number":71,"context_line":"             _load()],"},{"line_number":72,"context_line":"         \u0027topology\u0027: \u0027SINGLE\u0027,  # todo(german): const"},{"line_number":73,"context_line":"         \u0027topology_status\u0027: \u0027OK\u0027,  # todo(german): const"},{"line_number":74,"context_line":"         \u0027listeners\u0027: listener_list,"},{"line_number":75,"context_line":"         \u0027packages\u0027: {}})"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_ce9ca56c","line":73,"in_reply_to":"9a80dd14_7df2d66f","updated":"2015-03-23 22:10:25.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":72,"context_line":"         \u0027topology\u0027: \u0027SINGLE\u0027,  # todo(german): const"},{"line_number":73,"context_line":"         \u0027topology_status\u0027: \u0027OK\u0027,  # todo(german): const"},{"line_number":74,"context_line":"         \u0027listeners\u0027: listener_list,"},{"line_number":75,"context_line":"         \u0027packages\u0027: {}})"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"def _get_version_of_installed_package(name):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_dd8902cb","line":75,"updated":"2015-03-20 23:08:14.000000000","message":"What about the package list?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"9cb3f7a7b15c8ed6870546bbeb05ab03a28d0a82","unresolved":false,"context_lines":[{"line_number":72,"context_line":"         \u0027topology\u0027: \u0027SINGLE\u0027,  # todo(german): const"},{"line_number":73,"context_line":"         \u0027topology_status\u0027: \u0027OK\u0027,  # todo(german): const"},{"line_number":74,"context_line":"         \u0027listeners\u0027: listener_list,"},{"line_number":75,"context_line":"         \u0027packages\u0027: {}})"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"def _get_version_of_installed_package(name):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_4e88b51f","line":75,"in_reply_to":"9a80dd14_dd8902cb","updated":"2015-03-23 22:10:25.000000000","message":"Not sure what we like to track or we just ship back all packages","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":75,"context_line":"         \u0027packages\u0027: {}})"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"def _get_version_of_installed_package(name):"},{"line_number":79,"context_line":"    cmd \u003d \"dpkg --status \" + name"},{"line_number":80,"context_line":"    out \u003d subprocess.check_output(cmd.split())"},{"line_number":81,"context_line":"    m \u003d re.search(\u0027Version: .*\u0027, out)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_10de266d","line":78,"updated":"2015-03-20 21:39:31.000000000","message":"I don\u0027t know if we want to go this route, but I have done this before using https://apt.alioth.debian.org/python-apt-doc/index.html (just so you are aware of the alternative):\n\napt-get install python-apt or python3-apt (system req)\n\nimport apt_pkg\n\napt_pkg.init()\ncache \u003d apt_pkg.Cache()\ntry:\n    return cache[\u0027haproxy\u0027].current_ver.ver_str\nexcept KeyError, AttributeError:\n    return","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"94d1f44a6763b0cca5fca07bb41395470bccb6aa","unresolved":false,"context_lines":[{"line_number":75,"context_line":"         \u0027packages\u0027: {}})"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"def _get_version_of_installed_package(name):"},{"line_number":79,"context_line":"    cmd \u003d \"dpkg --status \" + name"},{"line_number":80,"context_line":"    out \u003d subprocess.check_output(cmd.split())"},{"line_number":81,"context_line":"    m \u003d re.search(\u0027Version: .*\u0027, out)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_95cd3060","line":78,"in_reply_to":"1a6ced46_0e507d31","updated":"2015-03-24 18:21:01.000000000","message":"Yes -- I pointed out in my comment, the package is \"python-apt\". We already will be installing packages with apt anyway for haproxy, so adding this to the list wouldn\u0027t be a big deal, but I don\u0027t care a whole lot. Just wanted you to be aware of the alternative. ;)","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"9cb3f7a7b15c8ed6870546bbeb05ab03a28d0a82","unresolved":false,"context_lines":[{"line_number":75,"context_line":"         \u0027packages\u0027: {}})"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"def _get_version_of_installed_package(name):"},{"line_number":79,"context_line":"    cmd \u003d \"dpkg --status \" + name"},{"line_number":80,"context_line":"    out \u003d subprocess.check_output(cmd.split())"},{"line_number":81,"context_line":"    m \u003d re.search(\u0027Version: .*\u0027, out)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_0e507d31","line":78,"in_reply_to":"9a80dd14_10de266d","updated":"2015-03-23 22:10:25.000000000","message":"from what I sense is that you would need to install it with apt-get -- \npip install apt\nDownloading/unpacking apt\n  Could not find any downloads that satisfy the requirement apt\n  Some externally hosted files were ignored (use --allow-external apt to allow).\n\nso will stick to my way","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"94d1f44a6763b0cca5fca07bb41395470bccb6aa","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    cmd \u003d \"dpkg --status \" + name"},{"line_number":80,"context_line":"    out \u003d subprocess.check_output(cmd.split())"},{"line_number":81,"context_line":"    m \u003d re.search(\u0027Version: .*\u0027, out)"},{"line_number":82,"context_line":"    return m.group(0)[len(\u0027Version: \u0027):]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def _get_network_bytes(interface, type):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_95f45088","line":82,"updated":"2015-03-24 18:21:01.000000000","message":"Ah, again you could do this more succinctly with regex groups:\n\nm \u003d re.search(\u0027Version: (.*)\u0027, out)\n\nreturn m.group(1)","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def _get_network_bytes(interface, type):"},{"line_number":86,"context_line":"    file_name \u003d \"/sys/class/net/%s/statistics/%s_bytes\" % (interface, type)"},{"line_number":87,"context_line":"    with open(file_name, \u0027r\u0027) as f:"},{"line_number":88,"context_line":"        return f.readline()"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_f041920a","line":86,"updated":"2015-03-20 21:39:31.000000000","message":"I believe we prefer \u0027\u0027.format() now, but I think blogan might disagree. :P\n\nfile_name \u003d \"/sys/class/net/{interface}/statistics/{type}_bytes\".format(interface\u003dinterface, type\u003dtype)","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"9cb3f7a7b15c8ed6870546bbeb05ab03a28d0a82","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def _get_network_bytes(interface, type):"},{"line_number":86,"context_line":"    file_name \u003d \"/sys/class/net/%s/statistics/%s_bytes\" % (interface, type)"},{"line_number":87,"context_line":"    with open(file_name, \u0027r\u0027) as f:"},{"line_number":88,"context_line":"        return f.readline()"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_ae06891e","line":86,"in_reply_to":"9a80dd14_f041920a","updated":"2015-03-23 22:10:25.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"1000c8d2edbbdd911413ebf22c1cefe950985a71","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def _get_network_bytes(interface, type):"},{"line_number":86,"context_line":"    file_name \u003d \"/sys/class/net/%s/statistics/%s_bytes\" % (interface, type)"},{"line_number":87,"context_line":"    with open(file_name, \u0027r\u0027) as f:"},{"line_number":88,"context_line":"        return f.readline()"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_3fb72988","line":86,"in_reply_to":"9a80dd14_f041920a","updated":"2015-03-23 21:08:16.000000000","message":"i just want it to be consistent.  whatever the majority wants.  I\u0027m slightly in favor of .format though.  It is more robust.  We could also just say its up to the creator of the module, but to remain consistent with updates to modules.","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":31,"context_line":"def compile_amphora_info():"},{"line_number":32,"context_line":"    return flask.jsonify("},{"line_number":33,"context_line":"        {\u0027hostname\u0027: socket.gethostname(),"},{"line_number":34,"context_line":"         # \u0027uuid\u0027 : \u0027N/A\u0027,"},{"line_number":35,"context_line":"         \u0027haproxy_version\u0027: _get_version_of_installed_package(\u0027haproxy\u0027),"},{"line_number":36,"context_line":"         \u0027api_version\u0027: api_server.VERSION})"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_6c790482","line":34,"updated":"2015-05-28 22:22:48.000000000","message":"Aren\u0027t we passing this in via config drive?\nIf we are assuming that this requests comes because we already provided the uuid, we should remove this.","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    st \u003d os.statvfs(\u0027/\u0027)"},{"line_number":44,"context_line":"    return flask.jsonify("},{"line_number":45,"context_line":"        {\u0027hostname\u0027: socket.gethostname(),"},{"line_number":46,"context_line":"         # \u0027uuid\u0027 : \u0027N/A\u0027,"},{"line_number":47,"context_line":"         \u0027haproxy_version\u0027: _get_version_of_installed_package(\u0027haproxy\u0027),"},{"line_number":48,"context_line":"         \u0027api_version\u0027: api_server.VERSION,"},{"line_number":49,"context_line":"         \u0027networks\u0027: _get_networks(),"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_0c95f085","line":46,"updated":"2015-05-28 22:22:48.000000000","message":"Same as above","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":58,"context_line":"             \u0027total\u0027: meminfo[\u0027MemTotal\u0027],"},{"line_number":59,"context_line":"             \u0027free\u0027: meminfo[\u0027MemFree\u0027],"},{"line_number":60,"context_line":"             # \u0027available\u0027: \u0027?\u0027,"},{"line_number":61,"context_line":"             # \u0027committed_as\u0027: \u0027?"},{"line_number":62,"context_line":"             \u0027buffers\u0027: meminfo[\u0027Buffers\u0027],"},{"line_number":63,"context_line":"             \u0027cached\u0027: meminfo[\u0027Cached\u0027],"},{"line_number":64,"context_line":"             \u0027swap_used\u0027: meminfo[\u0027SwapCached\u0027],"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_cce1182c","line":61,"updated":"2015-05-28 22:22:48.000000000","message":"Just remove these","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":72,"context_line":"         \u0027topology\u0027: consts.TOPOLOGY_SINGLE,"},{"line_number":73,"context_line":"         \u0027topology_status\u0027: consts.TOPOLOGY_STATUS_OK,"},{"line_number":74,"context_line":"         \u0027listeners\u0027: listener_list,"},{"line_number":75,"context_line":"         \u0027packages\u0027: {}})"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"def _get_version_of_installed_package(name):"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_0cc3b08a","line":75,"updated":"2015-05-28 22:22:48.000000000","message":"Did we decide to drop packages?","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"}],"octavia/amphorae/backends/agent/api_server/listener.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    pass"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def get_haproxy_config(listener_id):"},{"line_number":45,"context_line":"    _check_listener_exists(listener_id)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    with open(util.config_path(listener_id), \u0027r\u0027) as file:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_d85750ff","line":44,"updated":"2015-03-20 23:08:14.000000000","message":"doc strings","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    with open(util.config_path(listener_id), \u0027r\u0027) as file:"},{"line_number":48,"context_line":"        cfg \u003d file.read()"},{"line_number":49,"context_line":"        return flask.Response(cfg, mimetype\u003d\u0027text/plain\u0027)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def upload_haproxy_config(listener_id):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_585a801e","line":49,"updated":"2015-03-20 23:08:14.000000000","message":"Would UTF8 be safer here?  I think we control everything that goes into the config and all user input strings are URL encoded or non-double byte, but not 100% sure.  Maybe check with bedis?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    with open(util.config_path(listener_id), \u0027r\u0027) as file:"},{"line_number":48,"context_line":"        cfg \u003d file.read()"},{"line_number":49,"context_line":"        return flask.Response(cfg, mimetype\u003d\u0027text/plain\u0027)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def upload_haproxy_config(listener_id):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_e5125fb3","line":49,"in_reply_to":"9a80dd14_585a801e","updated":"2015-03-24 23:54:18.000000000","message":"Flask uses UTF8 internally so that should be fine... but still something to test","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    if not os.path.exists(util.haproxy_dir(listener_id)):"},{"line_number":56,"context_line":"        os.makedirs(util.haproxy_dir(listener_id))"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    # todo(german) check configuration file"},{"line_number":59,"context_line":"    with open(util.config_path(listener_id), \u0027w\u0027) as file:"},{"line_number":60,"context_line":"        b \u003d stream.read(BUFFER)"},{"line_number":61,"context_line":"        while (b):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_58b1a042","line":58,"updated":"2015-03-20 23:08:14.000000000","message":"TODO\nhaproxy -c","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    if not os.path.exists(util.haproxy_dir(listener_id)):"},{"line_number":56,"context_line":"        os.makedirs(util.haproxy_dir(listener_id))"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    # todo(german) check configuration file"},{"line_number":59,"context_line":"    with open(util.config_path(listener_id), \u0027w\u0027) as file:"},{"line_number":60,"context_line":"        b \u003d stream.read(BUFFER)"},{"line_number":61,"context_line":"        while (b):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_1b37aa4f","line":58,"in_reply_to":"9a80dd14_58b1a042","updated":"2015-03-24 23:54:18.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    _check_listener_exists(listener_id)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    if action \u003d\u003d \u0027reload\u0027:"},{"line_number":91,"context_line":"        action \u003d \u0027restart\u0027"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    cmd \u003d (\"/usr/sbin/service haproxy-%s %s\""},{"line_number":94,"context_line":"           % (str(listener_id), action))"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_47a5459d","line":91,"updated":"2015-03-20 21:39:31.000000000","message":"So you\u0027re not supporting soft-reload for now? Only a hard restart?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    _check_listener_exists(listener_id)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    if action \u003d\u003d \u0027reload\u0027:"},{"line_number":91,"context_line":"        action \u003d \u0027restart\u0027"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    cmd \u003d (\"/usr/sbin/service haproxy-%s %s\""},{"line_number":94,"context_line":"           % (str(listener_id), action))"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_58b60026","line":91,"in_reply_to":"9a80dd14_47a5459d","updated":"2015-03-20 23:08:14.000000000","message":"+1 upstart reload sends SIGHUP which my upstart script will trigger a soft reload meaning it won\u0027t kill existing flows.\nrestart to upstart sends SIGTERM which is a hard restart killing existing flows.\nNote though, reload handles pids differently","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    _check_listener_exists(listener_id)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    if action \u003d\u003d \u0027reload\u0027:"},{"line_number":91,"context_line":"        action \u003d \u0027restart\u0027"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    cmd \u003d (\"/usr/sbin/service haproxy-%s %s\""},{"line_number":94,"context_line":"           % (str(listener_id), action))"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_dbefd285","line":91,"in_reply_to":"9a80dd14_58b60026","updated":"2015-03-24 23:54:18.000000000","message":"fixed and it will now properly reload","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        action \u003d \u0027restart\u0027"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    cmd \u003d (\"/usr/sbin/service haproxy-%s %s\""},{"line_number":94,"context_line":"           % (str(listener_id), action))"},{"line_number":95,"context_line":"    try:"},{"line_number":96,"context_line":"        subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":97,"context_line":"    except subprocess.CalledProcessError as e:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_d06aceeb","line":94,"updated":"2015-03-20 21:39:31.000000000","message":"If you use .format() you don\u0027t need to do an explicit str() cast here. I recommend using .format() everywhere actually, but I don\u0027t think we ever came to an official consensus, and it would be good to be consistent. Right now I believe there are significant uses of both styles in our codebase.","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        action \u003d \u0027restart\u0027"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    cmd \u003d (\"/usr/sbin/service haproxy-%s %s\""},{"line_number":94,"context_line":"           % (str(listener_id), action))"},{"line_number":95,"context_line":"    try:"},{"line_number":96,"context_line":"        subprocess.check_output(cmd.split(), stderr\u003dsubprocess.STDOUT)"},{"line_number":97,"context_line":"    except subprocess.CalledProcessError as e:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_3bbb8673","line":94,"in_reply_to":"9a80dd14_d06aceeb","updated":"2015-03-24 23:54:18.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            details\u003de.output)), 500)"},{"line_number":102,"context_line":"    if action in [\u0027start\u0027, \u0027restart\u0027]:"},{"line_number":103,"context_line":"        i \u003d 0  # sleep 30s for the pid to appear"},{"line_number":104,"context_line":"        while not os.path.exists(util.pid_path(listener_id)):"},{"line_number":105,"context_line":"            time.sleep(3)"},{"line_number":106,"context_line":"            i +\u003d 1"},{"line_number":107,"context_line":"            if i \u003e\u003d 10:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_e7f8f97d","line":104,"updated":"2015-03-20 21:39:31.000000000","message":"Are we certain that this file couldn\u0027t be left-over from a past run if we were restarting after a failure?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    if action in [\u0027start\u0027, \u0027restart\u0027]:"},{"line_number":103,"context_line":"        i \u003d 0  # sleep 30s for the pid to appear"},{"line_number":104,"context_line":"        while not os.path.exists(util.pid_path(listener_id)):"},{"line_number":105,"context_line":"            time.sleep(3)"},{"line_number":106,"context_line":"            i +\u003d 1"},{"line_number":107,"context_line":"            if i \u003e\u003d 10:"},{"line_number":108,"context_line":"                LOG.debug(\"%s does not exist. Start failed.\" %"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_671329b8","line":105,"updated":"2015-03-20 21:39:31.000000000","message":"And we\u0027re ok doing this synchronously and having up to a 30s delay on the return?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"9cb3f7a7b15c8ed6870546bbeb05ab03a28d0a82","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    if action in [\u0027start\u0027, \u0027restart\u0027]:"},{"line_number":103,"context_line":"        i \u003d 0  # sleep 30s for the pid to appear"},{"line_number":104,"context_line":"        while not os.path.exists(util.pid_path(listener_id)):"},{"line_number":105,"context_line":"            time.sleep(3)"},{"line_number":106,"context_line":"            i +\u003d 1"},{"line_number":107,"context_line":"            if i \u003e\u003d 10:"},{"line_number":108,"context_line":"                LOG.debug(\"%s does not exist. Start failed.\" %"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_42d7a9c1","line":105,"in_reply_to":"1a6ced46_22e392da","updated":"2015-03-23 22:10:25.000000000","message":"changes spec accordingly: https://review.openstack.org/#/c/163625/","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"1000c8d2edbbdd911413ebf22c1cefe950985a71","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    if action in [\u0027start\u0027, \u0027restart\u0027]:"},{"line_number":103,"context_line":"        i \u003d 0  # sleep 30s for the pid to appear"},{"line_number":104,"context_line":"        while not os.path.exists(util.pid_path(listener_id)):"},{"line_number":105,"context_line":"            time.sleep(3)"},{"line_number":106,"context_line":"            i +\u003d 1"},{"line_number":107,"context_line":"            if i \u003e\u003d 10:"},{"line_number":108,"context_line":"                LOG.debug(\"%s does not exist. Start failed.\" %"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_22e392da","line":105,"in_reply_to":"9a80dd14_671329b8","updated":"2015-03-23 21:08:16.000000000","message":"i agree with adam.  if its possible to just have this code start it and move on.  Then the heartbeat agent or some other check can check whether it started or not, and act on it if it didn\u0027t.","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                         + \u0027haproxy daemon for %s started (pid %s)\u0027"},{"line_number":117,"context_line":"                           % (listener_id, util.get_haproxy_pid(listener_id))))"},{"line_number":118,"context_line":"    elif action \u003d\u003d \u0027stop\u0027:"},{"line_number":119,"context_line":"        return flask.jsonify("},{"line_number":120,"context_line":"            dict(message\u003d\u0027OK\u0027,"},{"line_number":121,"context_line":"                 details\u003d\u0027Listener %s stopped\u0027 % (listener_id)))"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_c70cd595","line":119,"updated":"2015-03-20 21:39:31.000000000","message":"Is the check_output above enough to validate that the process is in fact stopped?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                         + \u0027haproxy daemon for %s started (pid %s)\u0027"},{"line_number":117,"context_line":"                           % (listener_id, util.get_haproxy_pid(listener_id))))"},{"line_number":118,"context_line":"    elif action \u003d\u003d \u0027stop\u0027:"},{"line_number":119,"context_line":"        return flask.jsonify("},{"line_number":120,"context_line":"            dict(message\u003d\u0027OK\u0027,"},{"line_number":121,"context_line":"                 details\u003d\u0027Listener %s stopped\u0027 % (listener_id)))"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_ce4e326f","line":119,"in_reply_to":"9a80dd14_c70cd595","updated":"2015-03-24 23:54:18.000000000","message":"likely not but now as we do it asynchronously it\u0027s the best we can ;-)","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    if os.path.exists(util.upstart_path(listener_id)):"},{"line_number":154,"context_line":"        os.remove(util.upstart_path(listener_id))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    return flask.jsonify({\u0027message\u0027: \u0027OK\u0027})"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"\"\"\"Gets the status of all listeners"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_78d4a41f","line":156,"updated":"2015-03-20 23:08:14.000000000","message":"What about cleaning up logs?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    if os.path.exists(util.upstart_path(listener_id)):"},{"line_number":154,"context_line":"        os.remove(util.upstart_path(listener_id))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    return flask.jsonify({\u0027message\u0027: \u0027OK\u0027})"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"\"\"\"Gets the status of all listeners"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_4efa42be","line":156,"in_reply_to":"9a80dd14_78d4a41f","updated":"2015-03-24 23:54:18.000000000","message":"It seems that haproxy is using syslog so we need some agreement where we log and how. I added a todo - and will leave it out to move that forward","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"This method will not consult the stats socket"},{"line_number":162,"context_line":"so a listener might show as ACTIVE but still be"},{"line_number":163,"context_line":"in ERROR"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"Currently type\u003d\u003dSSL is also not detected"},{"line_number":166,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_18cac86d","line":163,"updated":"2015-03-20 23:08:14.000000000","message":"Why the difference between the functionality of get_all_listeners_status and get_listener_status?  Why doesn\u0027t get_all_listeners_status also get the stats socket status?\nSeems like it would be confusing to user/operator","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"This method will not consult the stats socket"},{"line_number":162,"context_line":"so a listener might show as ACTIVE but still be"},{"line_number":163,"context_line":"in ERROR"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"Currently type\u003d\u003dSSL is also not detected"},{"line_number":166,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_2e2b4631","line":163,"in_reply_to":"9a80dd14_18cac86d","updated":"2015-03-24 23:54:18.000000000","message":"we don\u0027t need info from the stats socket so I didn\u0027t open it - but I can add that... thoughts?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            b \u003d stream.read(BUFFER)"},{"line_number":227,"context_line":"        os.fchmod(crt_file, 0o060)  # only accessible by owner"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    # todo(german): validate certificate and raise 400 errors"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    return flask.jsonify(dict(message\u003d\u0027OK\u0027))"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_e70c7944","line":229,"updated":"2015-03-20 21:39:31.000000000","message":"Theoretically the certificate would be validated by the controller before it is sent to the Amphora -- I don\u0027t think you need to worry about validation here.","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            b \u003d stream.read(BUFFER)"},{"line_number":227,"context_line":"        os.fchmod(crt_file, 0o060)  # only accessible by owner"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    # todo(german): validate certificate and raise 400 errors"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    return flask.jsonify(dict(message\u003d\u0027OK\u0027))"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_0edf6a3c","line":229,"in_reply_to":"9a80dd14_d8abd085","updated":"2015-03-24 23:54:18.000000000","message":"the spec asks for a validation of the cert... will remove todo and error from the spec","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            b \u003d stream.read(BUFFER)"},{"line_number":227,"context_line":"        os.fchmod(crt_file, 0o060)  # only accessible by owner"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    # todo(german): validate certificate and raise 400 errors"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    return flask.jsonify(dict(message\u003d\u0027OK\u0027))"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_d8abd085","line":229,"in_reply_to":"9a80dd14_e70c7944","updated":"2015-03-20 23:08:14.000000000","message":"True, there is a validation step upstream","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    with open(util.config_path(listener_id), \u0027r\u0027) as file:"},{"line_number":270,"context_line":"        cfg \u003d file.read()"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        m \u003d re.search(\u0027mode\\s+http|tcp\u0027, cfg)"},{"line_number":273,"context_line":"        if not m:"},{"line_number":274,"context_line":"            raise ParsingError()"},{"line_number":275,"context_line":"        mode \u003d m.group(0)[len(\u0027mode \u0027):].strip()"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_9aa230fa","line":272,"updated":"2015-03-20 21:39:31.000000000","message":"This regex is incorrect -- it matches \"mode\\s+http\" OR \"tcp\".\n\nIf the string is \"mode tcp\", group(0) is \"tcp\"\n\nIf the string is \"mode http\", group(0) is \"mode http\"\n\nYou want: \n\nm \u003d re.search(\u0027mode\\s+(http|tcp)\u0027, cfg)\n\nThen:\n\nmode \u003d m.group(1)","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    with open(util.config_path(listener_id), \u0027r\u0027) as file:"},{"line_number":270,"context_line":"        cfg \u003d file.read()"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        m \u003d re.search(\u0027mode\\s+http|tcp\u0027, cfg)"},{"line_number":273,"context_line":"        if not m:"},{"line_number":274,"context_line":"            raise ParsingError()"},{"line_number":275,"context_line":"        mode \u003d m.group(0)[len(\u0027mode \u0027):].strip()"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_2eb986e9","line":272,"in_reply_to":"9a80dd14_9aa230fa","updated":"2015-03-24 23:54:18.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            raise ParsingError()"},{"line_number":275,"context_line":"        mode \u003d m.group(0)[len(\u0027mode \u0027):].strip()"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"        m \u003d re.search(\u0027stats socket\\s+\\S+\u0027, cfg)"},{"line_number":278,"context_line":"        if not m:"},{"line_number":279,"context_line":"            raise ParsingError()"},{"line_number":280,"context_line":"        stats_socket \u003d m.group(0)[len(\u0027stats socket \u0027):].strip()"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_7aed7c24","line":277,"updated":"2015-03-20 21:39:31.000000000","message":"Here if you do:\n\nm \u003d re.search(\u0027stats socket\\s+(\\S+)\u0027, cfg)\n\nYou can do:\n\nstats_socket \u003d m.group(1)","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":279,"context_line":"            raise ParsingError()"},{"line_number":280,"context_line":"        stats_socket \u003d m.group(0)[len(\u0027stats socket \u0027):].strip()"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        m \u003d re.search(\u0027ssl crt\\s+\\S+\u0027, cfg)"},{"line_number":283,"context_line":"        ssl_crt \u003d m.group(0)[len(\u0027ssl crt \u0027):].strip() if m else None"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        # todo(german) parse also logs, etc. and check for SSL"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_da72e87a","line":282,"updated":"2015-03-20 21:39:31.000000000","message":"Similar to above, use regex groups and you won\u0027t have to parse out the string manually afterwards.","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":279,"context_line":"            raise ParsingError()"},{"line_number":280,"context_line":"        stats_socket \u003d m.group(0)[len(\u0027stats socket \u0027):].strip()"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        m \u003d re.search(\u0027ssl crt\\s+\\S+\u0027, cfg)"},{"line_number":283,"context_line":"        ssl_crt \u003d m.group(0)[len(\u0027ssl crt \u0027):].strip() if m else None"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        # todo(german) parse also logs, etc. and check for SSL"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_aec4965f","line":282,"in_reply_to":"9a80dd14_da72e87a","updated":"2015-03-24 23:54:18.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"e49addf5069f78542965227f344a92622790e712","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    if os.path.exists(util.upstart_path(listener_id)):"},{"line_number":171,"context_line":"        os.remove(util.upstart_path(listener_id))"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    # todo(german): delete the log files"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    return flask.jsonify({\u0027message\u0027: \u0027OK\u0027})"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"9aa53dc9_6abda267","line":173,"updated":"2015-04-08 00:29:04.000000000","message":"Still a TODO here","commit_id":"ef659b4a7b6fc9d13fdca67576bf460af9c85238"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"983be30100ea5f5f146987c66702fcf278664199","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    if os.path.exists(util.upstart_path(listener_id)):"},{"line_number":171,"context_line":"        os.remove(util.upstart_path(listener_id))"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    # todo(german): delete the log files"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    return flask.jsonify({\u0027message\u0027: \u0027OK\u0027})"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"9aa53dc9_77facf76","line":173,"in_reply_to":"9aa53dc9_6abda267","updated":"2015-04-09 21:53:47.000000000","message":"Done","commit_id":"ef659b4a7b6fc9d13fdca67576bf460af9c85238"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"e49addf5069f78542965227f344a92622790e712","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        m \u003d re.search(\u0027ssl crt\\s+(\\S+)\u0027, cfg)"},{"line_number":309,"context_line":"        ssl_crt \u003d m.group(1) if m else None"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        # todo(german) check for SSL"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        return dict(mode\u003dmode,"},{"line_number":314,"context_line":"                    stats_socket\u003dstats_socket,"}],"source_content_type":"text/x-python","patch_set":20,"id":"9aa53dc9_6a4b6288","line":311,"updated":"2015-04-08 00:29:04.000000000","message":"Still a TODO here","commit_id":"ef659b4a7b6fc9d13fdca67576bf460af9c85238"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"983be30100ea5f5f146987c66702fcf278664199","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        m \u003d re.search(\u0027ssl crt\\s+(\\S+)\u0027, cfg)"},{"line_number":309,"context_line":"        ssl_crt \u003d m.group(1) if m else None"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        # todo(german) check for SSL"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        return dict(mode\u003dmode,"},{"line_number":314,"context_line":"                    stats_socket\u003dstats_socket,"}],"source_content_type":"text/x-python","patch_set":20,"id":"9aa53dc9_37f0c790","line":311,"in_reply_to":"9aa53dc9_6a4b6288","updated":"2015-04-09 21:53:47.000000000","message":"Done","commit_id":"ef659b4a7b6fc9d13fdca67576bf460af9c85238"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from octavia.common import constants as consts"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":"BUFFER \u003d 100"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"j2_env \u003d jinja2.Environment(loader\u003djinja2.FileSystemLoader("},{"line_number":35,"context_line":"    os.path.dirname(os.path.realpath(__file__)) + \u0027/templates\u0027))"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_ec5294dd","line":32,"updated":"2015-05-28 22:22:48.000000000","message":"constants?","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"j2_env \u003d jinja2.Environment(loader\u003djinja2.FileSystemLoader("},{"line_number":35,"context_line":"    os.path.dirname(os.path.realpath(__file__)) + \u0027/templates\u0027))"},{"line_number":36,"context_line":"template \u003d j2_env.get_template(\u0027haproxy.conf.j2\u0027)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class ParsingError(Exception):"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_8c6440b9","line":36,"updated":"2015-05-28 22:22:48.000000000","message":"constants or config?","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":227,"context_line":"This method will consult the stats socket"},{"line_number":228,"context_line":"so calling this method will interfere with"},{"line_number":229,"context_line":"the health daemon with the risk of the amphora"},{"line_number":230,"context_line":"shut down"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"Currently type\u003d\u003dSSL is not detected"},{"line_number":233,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_8ca7a0bc","line":230,"updated":"2015-05-28 22:22:48.000000000","message":"This is a scary comment.  Maybe talk to the config setting intended to make the amphora shut down not happen?","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":229,"context_line":"the health daemon with the risk of the amphora"},{"line_number":230,"context_line":"shut down"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"Currently type\u003d\u003dSSL is not detected"},{"line_number":233,"context_line":"\"\"\""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_ec9cd46b","line":232,"updated":"2015-05-28 22:22:48.000000000","message":"Should we tell the user as much?  What is the user experience here?","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"}],"octavia/amphorae/backends/agent/api_server/plug.py":[{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"a073b1622def50c704b561dad16afa3811fc7b92","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    sections \u003d vip.split(\u0027.\u0027)[:3]"},{"line_number":45,"context_line":"    sections.append(\u0027255\u0027)"},{"line_number":46,"context_line":"    broadcast \u003d \u0027.\u0027.join(sections)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    # write interface file"},{"line_number":49,"context_line":"    with open(os.path.join(NETWORK_DIR, interface), \u0027w\u0027) as text_file:"}],"source_content_type":"text/x-python","patch_set":24,"id":"dac4157f_3674f19a","line":46,"updated":"2015-04-20 03:59:53.000000000","message":"Same comment as the netmask below, this is assuming a fixed subnet size.  Is this correct and safe?  I\u0027m skeptical...","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"13f7904033718de13a613f23821bef21087e9c51","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    sections \u003d vip.split(\u0027.\u0027)[:3]"},{"line_number":45,"context_line":"    sections.append(\u0027255\u0027)"},{"line_number":46,"context_line":"    broadcast \u003d \u0027.\u0027.join(sections)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    # write interface file"},{"line_number":49,"context_line":"    with open(os.path.join(NETWORK_DIR, interface), \u0027w\u0027) as text_file:"}],"source_content_type":"text/x-python","patch_set":24,"id":"dac4157f_378726b7","line":46,"in_reply_to":"dac4157f_3674f19a","updated":"2015-04-20 22:53:22.000000000","message":"Done","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"a073b1622def50c704b561dad16afa3811fc7b92","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            interface\u003dinterface,"},{"line_number":52,"context_line":"            vip\u003dvip,"},{"line_number":53,"context_line":"            broadcast\u003dbroadcast,"},{"line_number":54,"context_line":"            netmask\u003d\u0027255.255.255.0\u0027)"},{"line_number":55,"context_line":"        text_file.write(text)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    # bring interfaces up"}],"source_content_type":"text/x-python","patch_set":24,"id":"dac4157f_16520d14","line":54,"updated":"2015-04-20 03:59:53.000000000","message":"Is it safe to assume a fixed netmask here?  That seems sketchy to me.  If this is safe, then a comment explaining why would be good.","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"13f7904033718de13a613f23821bef21087e9c51","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            interface\u003dinterface,"},{"line_number":52,"context_line":"            vip\u003dvip,"},{"line_number":53,"context_line":"            broadcast\u003dbroadcast,"},{"line_number":54,"context_line":"            netmask\u003d\u0027255.255.255.0\u0027)"},{"line_number":55,"context_line":"        text_file.write(text)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    # bring interfaces up"}],"source_content_type":"text/x-python","patch_set":24,"id":"dac4157f_179422e0","line":54,"in_reply_to":"dac4157f_16520d14","updated":"2015-04-20 22:53:22.000000000","message":"Done","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"a073b1622def50c704b561dad16afa3811fc7b92","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    # todo(german) Once network driver has the MAC address use that to identify"},{"line_number":86,"context_line":"    down \u003d [interface for interface in netifaces.interfaces() if"},{"line_number":87,"context_line":"            netifaces.AF_INET in netifaces.ifaddresses(interface)]"},{"line_number":88,"context_line":"    if not down or len(down) \u003e 1:"},{"line_number":89,"context_line":"        raise exceptions.HTTPException("},{"line_number":90,"context_line":"            response\u003dflask.make_response(flask.jsonify(dict("},{"line_number":91,"context_line":"                details\u003d\"No network interface down\")), 404))"}],"source_content_type":"text/x-python","patch_set":24,"id":"dac4157f_36d07153","line":88,"updated":"2015-04-20 03:59:53.000000000","message":"What this line is saying is \"raise an exception unless there is exactly 1 down interface.\"","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"13f7904033718de13a613f23821bef21087e9c51","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    # todo(german) Once network driver has the MAC address use that to identify"},{"line_number":86,"context_line":"    down \u003d [interface for interface in netifaces.interfaces() if"},{"line_number":87,"context_line":"            netifaces.AF_INET in netifaces.ifaddresses(interface)]"},{"line_number":88,"context_line":"    if not down or len(down) \u003e 1:"},{"line_number":89,"context_line":"        raise exceptions.HTTPException("},{"line_number":90,"context_line":"            response\u003dflask.make_response(flask.jsonify(dict("},{"line_number":91,"context_line":"                details\u003d\"No network interface down\")), 404))"}],"source_content_type":"text/x-python","patch_set":24,"id":"dac4157f_b74fb691","line":88,"in_reply_to":"dac4157f_36d07153","updated":"2015-04-20 22:53:22.000000000","message":"Done","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"a073b1622def50c704b561dad16afa3811fc7b92","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    if not down or len(down) \u003e 1:"},{"line_number":89,"context_line":"        raise exceptions.HTTPException("},{"line_number":90,"context_line":"            response\u003dflask.make_response(flask.jsonify(dict("},{"line_number":91,"context_line":"                details\u003d\"No network interface down\")), 404))"},{"line_number":92,"context_line":"    return down[0]"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"dac4157f_d65c95ef","line":91,"updated":"2015-04-20 03:59:53.000000000","message":"I\u0027m not sure what this message is trying to tell the user, in the context of my comment above.  It could conceivably appear when there are 2 or more down interfaces, which I think is possible.  In any case, I think we need a better message here.","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"13f7904033718de13a613f23821bef21087e9c51","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    if not down or len(down) \u003e 1:"},{"line_number":89,"context_line":"        raise exceptions.HTTPException("},{"line_number":90,"context_line":"            response\u003dflask.make_response(flask.jsonify(dict("},{"line_number":91,"context_line":"                details\u003d\"No network interface down\")), 404))"},{"line_number":92,"context_line":"    return down[0]"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"dac4157f_f7a76e4d","line":91,"in_reply_to":"dac4157f_d65c95ef","updated":"2015-04-20 22:53:22.000000000","message":"Done","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from werkzeug import exceptions"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":"NETWORK_DIR \u003d \u0027/etc/network/interfaces.d/\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"j2_env \u003d jinja2.Environment(loader\u003djinja2.FileSystemLoader("},{"line_number":29,"context_line":"    os.path.dirname(os.path.realpath(__file__)) + \u0027/templates\u0027))"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_4c008866","line":26,"updated":"2015-05-28 22:22:48.000000000","message":"constants or config?","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"j2_env \u003d jinja2.Environment(loader\u003djinja2.FileSystemLoader("},{"line_number":29,"context_line":"    os.path.dirname(os.path.realpath(__file__)) + \u0027/templates\u0027))"},{"line_number":30,"context_line":"template_port \u003d j2_env.get_template(\u0027plug_port_ethX.conf.j2\u0027)"},{"line_number":31,"context_line":"template_vip \u003d j2_env.get_template(\u0027plug_vip_ethX.conf.j2\u0027)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_0cf7308c","line":30,"updated":"2015-05-28 22:22:48.000000000","message":"constants or config?","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":28,"context_line":"j2_env \u003d jinja2.Environment(loader\u003djinja2.FileSystemLoader("},{"line_number":29,"context_line":"    os.path.dirname(os.path.realpath(__file__)) + \u0027/templates\u0027))"},{"line_number":30,"context_line":"template_port \u003d j2_env.get_template(\u0027plug_port_ethX.conf.j2\u0027)"},{"line_number":31,"context_line":"template_vip \u003d j2_env.get_template(\u0027plug_vip_ethX.conf.j2\u0027)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def plug_vip(vip):"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_ecef34af","line":31,"updated":"2015-05-28 22:22:48.000000000","message":"constants or config?","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"def _interface_down():"},{"line_number":89,"context_line":"    # Find the interface which is down"},{"line_number":90,"context_line":"    # todo(german) Once network driver has the MAC address use that to identify"},{"line_number":91,"context_line":"    down \u003d [interface for interface in netifaces.interfaces() if"},{"line_number":92,"context_line":"            netifaces.AF_INET not in netifaces.ifaddresses(interface)]"},{"line_number":93,"context_line":"    if len(down) !\u003d 1:"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_2c41cca9","line":90,"updated":"2015-05-28 22:22:48.000000000","message":"Can we fix this todo now?","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"}],"octavia/amphorae/backends/agent/api_server/server.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/listeners/\u003clistener_id\u003e/certificates\u0027"},{"line_number":95,"context_line":"           + \u0027/\u003cfilename\u003e\u0027, methods\u003d[\u0027PUT\u0027])"},{"line_number":96,"context_line":"def upload_certificate(listener_id, filename):"},{"line_number":97,"context_line":"    return listener.upload_certificate(listener_id, filename)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_b8961c3c","line":96,"updated":"2015-03-20 23:08:14.000000000","message":"Shouldn\u0027t there be some sort of validation on the filename?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/listeners/\u003clistener_id\u003e/certificates\u0027"},{"line_number":95,"context_line":"           + \u0027/\u003cfilename\u003e\u0027, methods\u003d[\u0027PUT\u0027])"},{"line_number":96,"context_line":"def upload_certificate(listener_id, filename):"},{"line_number":97,"context_line":"    return listener.upload_certificate(listener_id, filename)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_0e85aacf","line":96,"in_reply_to":"1a6ced46_b5941f38","updated":"2015-03-24 23:54:18.000000000","message":"added check - will add to spec","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"3d2c2f4db2f530af32676b098697dc70775e6241","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/listeners/\u003clistener_id\u003e/certificates\u0027"},{"line_number":95,"context_line":"           + \u0027/\u003cfilename\u003e\u0027, methods\u003d[\u0027PUT\u0027])"},{"line_number":96,"context_line":"def upload_certificate(listener_id, filename):"},{"line_number":97,"context_line":"    return listener.upload_certificate(listener_id, filename)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_b5941f38","line":96,"in_reply_to":"9a80dd14_b8961c3c","updated":"2015-03-23 18:20:03.000000000","message":"I think we control the filename, because we\u0027re responsible for generating it upstream? That said, something simple might be a good idea just for good measure?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/listeners/\u003clistener_id\u003e/certificates\u0027"},{"line_number":107,"context_line":"           + \u0027/\u003cfilename\u003e\u0027, methods\u003d[\u0027DELETE\u0027])"},{"line_number":108,"context_line":"def delete_certificate(listener_id, filename):"},{"line_number":109,"context_line":"    return listener.delete_certificate(listener_id, filename)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_987dd8e9","line":108,"updated":"2015-03-20 23:08:14.000000000","message":"Shouldn\u0027t there be some sort of validation on the filename?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"@app.route(\u0027/\u0027 + api_server.VERSION + \u0027/listeners/\u003clistener_id\u003e/certificates\u0027"},{"line_number":107,"context_line":"           + \u0027/\u003cfilename\u003e\u0027, methods\u003d[\u0027DELETE\u0027])"},{"line_number":108,"context_line":"def delete_certificate(listener_id, filename):"},{"line_number":109,"context_line":"    return listener.delete_certificate(listener_id, filename)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_ce61d23a","line":108,"in_reply_to":"9a80dd14_987dd8e9","updated":"2015-03-24 23:54:18.000000000","message":"added check - will add to spec","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"e49addf5069f78542965227f344a92622790e712","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    app.error_handler_spec[None][code] \u003d make_json_error"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# put controllers code here - refactor later"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Tested with curl -k -XPUT --data-binary @/tmp/test.txt"},{"line_number":44,"context_line":"# https://127.0.0.1:8443/0.5/listeners/123/haproxy"}],"source_content_type":"text/x-python","patch_set":20,"id":"9aa53dc9_aa304a02","line":41,"updated":"2015-04-08 00:29:04.000000000","message":"Is this a TODO or comment?","commit_id":"ef659b4a7b6fc9d13fdca67576bf460af9c85238"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"983be30100ea5f5f146987c66702fcf278664199","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    app.error_handler_spec[None][code] \u003d make_json_error"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# put controllers code here - refactor later"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Tested with curl -k -XPUT --data-binary @/tmp/test.txt"},{"line_number":44,"context_line":"# https://127.0.0.1:8443/0.5/listeners/123/haproxy"}],"source_content_type":"text/x-python","patch_set":20,"id":"9aa53dc9_b732975c","line":41,"in_reply_to":"9aa53dc9_aa304a02","updated":"2015-04-09 21:53:47.000000000","message":"Done","commit_id":"ef659b4a7b6fc9d13fdca67576bf460af9c85238"}],"octavia/amphorae/backends/agent/api_server/templates/haproxy.conf.j2":[{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"b889d8763904e29b49996bd93a9b8c2ff37a11aa","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{#"},{"line_number":2,"context_line":"# Copyright 2014 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":"text/x-jinja2","patch_set":9,"id":"9a80dd14_657cd3b6","line":2,"updated":"2015-03-17 04:32:37.000000000","message":"2015","commit_id":"fa9a5d6bf5777da2ebd9af372cb909d01d4aa962"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3d5aab6e13c23a8b39fcfb4bbfab29cba59c5f04","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"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":""},{"line_number":17,"context_line":"description \"Properly handle haproxy\""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":32,"id":"7a016987_67c7dd98","line":15,"updated":"2015-05-28 22:22:48.000000000","message":"Please attribute inspired by:\nhttps://gist.github.com/gfrey/8472007","commit_id":"6081eba10bbc27f55fa6bed5a3152d10eab108c4"}],"octavia/amphorae/backends/agent/api_server/util.py":[{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"b889d8763904e29b49996bd93a9b8c2ff37a11aa","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 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":9,"id":"9a80dd14_7f4d4599","line":1,"updated":"2015-03-17 04:32:37.000000000","message":"copyright date 2015","commit_id":"fa9a5d6bf5777da2ebd9af372cb909d01d4aa962"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        return f.readline().rstrip()"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def get_listeners():"},{"line_number":47,"context_line":"    return [f for f in os.listdir(CONF.agent.haproxy_cfg_dir)"},{"line_number":48,"context_line":"            if os.path.exists(config_path(f))]"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_dda3c29b","line":46,"updated":"2015-03-20 23:08:14.000000000","message":"NIT: doc strings and :returns:\n\nget_listeners could mean a lot of things","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        return f.readline().rstrip()"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def get_listeners():"},{"line_number":47,"context_line":"    return [f for f in os.listdir(CONF.agent.haproxy_cfg_dir)"},{"line_number":48,"context_line":"            if os.path.exists(config_path(f))]"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_0eb84a75","line":46,"in_reply_to":"9a80dd14_dda3c29b","updated":"2015-03-24 23:54:18.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"}],"octavia/amphorae/backends/utils/haproxy_query.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        Return the output of a successful query as a string with trailing"},{"line_number":40,"context_line":"        newlines removed, or raise an Exception if the query fails."},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        cmd \u003d (\u0027echo \"%s\" | /usr/bin/socat stdio %s\u0027 %"},{"line_number":44,"context_line":"               (query, self.socket))"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_3d121efd","line":41,"updated":"2015-03-20 23:08:14.000000000","message":"NIT:\n:param :\n:returns:","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        Return the output of a successful query as a string with trailing"},{"line_number":40,"context_line":"        newlines removed, or raise an Exception if the query fails."},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        cmd \u003d (\u0027echo \"%s\" | /usr/bin/socat stdio %s\u0027 %"},{"line_number":44,"context_line":"               (query, self.socket))"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_674c8143","line":41,"in_reply_to":"9a80dd14_3d121efd","updated":"2015-03-24 23:54:18.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        newlines removed, or raise an Exception if the query fails."},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        cmd \u003d (\u0027echo \"%s\" | /usr/bin/socat stdio %s\u0027 %"},{"line_number":44,"context_line":"               (query, self.socket))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_fdf406d0","line":43,"updated":"2015-03-20 23:08:14.000000000","message":"Why not use the python socket module to access this directly instead of using the shell?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        newlines removed, or raise an Exception if the query fails."},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        cmd \u003d (\u0027echo \"%s\" | /usr/bin/socat stdio %s\u0027 %"},{"line_number":44,"context_line":"               (query, self.socket))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_c78c5582","line":43,"in_reply_to":"1a6ced46_8d5b9753","updated":"2015-03-24 23:54:18.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"1000c8d2edbbdd911413ebf22c1cefe950985a71","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        newlines removed, or raise an Exception if the query fails."},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        cmd \u003d (\u0027echo \"%s\" | /usr/bin/socat stdio %s\u0027 %"},{"line_number":44,"context_line":"               (query, self.socket))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_8d5b9753","line":43,"in_reply_to":"1a6ced46_f5b937ea","updated":"2015-03-23 21:08:16.000000000","message":"+1","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"3d2c2f4db2f530af32676b098697dc70775e6241","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        newlines removed, or raise an Exception if the query fails."},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        cmd \u003d (\u0027echo \"%s\" | /usr/bin/socat stdio %s\u0027 %"},{"line_number":44,"context_line":"               (query, self.socket))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_f5b937ea","line":43,"in_reply_to":"9a80dd14_fdf406d0","updated":"2015-03-23 18:20:03.000000000","message":"Yeah, in general there is a LOT of shell execution happening, and I think a bit of it could be avoided by going a bit more native python.","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        \"\"\"Get and parse output from \u0027show info\u0027 command.\"\"\""},{"line_number":55,"context_line":"        results \u003d self._query(\u0027show info\u0027)"},{"line_number":56,"context_line":"        list_results \u003d results.split(\u0027\\n\u0027)"},{"line_number":57,"context_line":"        # TODO(german): Parse the results into a well defined format."},{"line_number":58,"context_line":"        return list_results"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def show_stat(self, proxy_iid\u003d-1, object_type\u003d-1, server_id\u003d-1):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_5d2d1245","line":57,"updated":"2015-03-20 23:08:14.000000000","message":"Open TODO","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        \"\"\"Get and parse output from \u0027show info\u0027 command.\"\"\""},{"line_number":55,"context_line":"        results \u003d self._query(\u0027show info\u0027)"},{"line_number":56,"context_line":"        list_results \u003d results.split(\u0027\\n\u0027)"},{"line_number":57,"context_line":"        # TODO(german): Parse the results into a well defined format."},{"line_number":58,"context_line":"        return list_results"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def show_stat(self, proxy_iid\u003d-1, object_type\u003d-1, server_id\u003d-1):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_c7e37531","line":57,"in_reply_to":"9a80dd14_5d2d1245","updated":"2015-03-24 23:54:18.000000000","message":"We don\u0027t need that part of the stats functionality... so deferred","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        server_id"},{"line_number":74,"context_line":"          Server ID (column 28 in CSV output?), or -1 for everything."},{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        results \u003d self._query(\u0027show stat %d %d %d\u0027"},{"line_number":78,"context_line":"                              % (proxy_iid, object_type, server_id))"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_9dda2a49","line":75,"updated":"2015-03-20 23:08:14.000000000","message":"NIT: :param : :returns:","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        or all protocols if not specified."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        Return a dictionary keyed by protocol with bytes out as the value."},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        if protocol:"},{"line_number":91,"context_line":"            filter_string \u003d protocol.lower() + \"-servers\""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_3de93ee3","line":88,"updated":"2015-03-20 23:08:14.000000000","message":"NIT: :param : :returns:","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"e78a14d522460e3daad4e42d5892c19586206e5e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        or all protocols if not specified."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        Return a dictionary keyed by protocol with bytes out as the value."},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        if protocol:"},{"line_number":91,"context_line":"            filter_string \u003d protocol.lower() + \"-servers\""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_4714e5f4","line":88,"in_reply_to":"9a80dd14_3de93ee3","updated":"2015-03-24 23:54:18.000000000","message":"Method is not needed so removed","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":114,"context_line":"          \u0027members\u0027: ["},{"line_number":115,"context_line":"            \u003cname\u003e: \u0027UP\u0027|\u0027DOWN\u0027"},{"line_number":116,"context_line":"          ]"},{"line_number":117,"context_line":"        \"\"\""},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        results \u003d self.show_stat(object_type\u003d6)  # servers + pool"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_3dc05e49","line":117,"updated":"2015-03-20 23:08:14.000000000","message":"NIT:  :returns:","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"e49addf5069f78542965227f344a92622790e712","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        \"\"\"Get and parse output from \u0027show info\u0027 command.\"\"\""},{"line_number":64,"context_line":"        results \u003d self._query(\u0027show info\u0027)"},{"line_number":65,"context_line":"        list_results \u003d results.split(\u0027\\n\u0027)"},{"line_number":66,"context_line":"        # TODO(german): Parse the results into a well defined format."},{"line_number":67,"context_line":"        return list_results"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def show_stat(self, proxy_iid\u003d-1, object_type\u003d-1, server_id\u003d-1):"}],"source_content_type":"text/x-python","patch_set":20,"id":"9aa53dc9_c5ab81d5","line":66,"updated":"2015-04-08 00:29:04.000000000","message":"Still a TODO here","commit_id":"ef659b4a7b6fc9d13fdca67576bf460af9c85238"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"983be30100ea5f5f146987c66702fcf278664199","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        \"\"\"Get and parse output from \u0027show info\u0027 command.\"\"\""},{"line_number":64,"context_line":"        results \u003d self._query(\u0027show info\u0027)"},{"line_number":65,"context_line":"        list_results \u003d results.split(\u0027\\n\u0027)"},{"line_number":66,"context_line":"        # TODO(german): Parse the results into a well defined format."},{"line_number":67,"context_line":"        return list_results"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def show_stat(self, proxy_iid\u003d-1, object_type\u003d-1, server_id\u003d-1):"}],"source_content_type":"text/x-python","patch_set":20,"id":"9aa53dc9_171b83cb","line":66,"in_reply_to":"9aa53dc9_c5ab81d5","updated":"2015-04-09 21:53:47.000000000","message":"Done","commit_id":"ef659b4a7b6fc9d13fdca67576bf460af9c85238"}],"octavia/common/config.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"aaf613247878e824b3296f45701cbae4244afe24","unresolved":false,"context_lines":[{"line_number":114,"context_line":"               default\u003d5,"},{"line_number":115,"context_line":"               help\u003d_(\u0027Retry timeout between attempts in seconds.\u0027)),"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    # REST server"},{"line_number":118,"context_line":"    cfg.StrOpt(\u0027bind_host\u0027, default\u003d\u00270.0.0.0\u0027,"},{"line_number":119,"context_line":"               help\u003d_(\"The host IP to bind to\")),"},{"line_number":120,"context_line":"    cfg.IntOpt(\u0027bind_port\u0027, default\u003d8443,"}],"source_content_type":"text/x-python","patch_set":34,"id":"3afb71cf_161d7a73","line":117,"range":{"start_line":117,"start_character":11,"end_line":117,"end_character":17},"updated":"2015-06-05 06:11:03.000000000","message":"Should we split these into rest_amphora_opts and ssh_amphora opts or something? I feel like there will end up being one section per amphora driver, and while it\u0027s possible these will be the only two, they might deserve their own sections instead of just globbing them together.","commit_id":"40440b8a0b97fc119762c37187e57f0e5b634a51"}],"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":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    # def test_details(self):"},{"line_number":138,"context_line":"    #     rv \u003d self.app.get(\u0027/\u0027 + api_server.VERSION + \u0027/details\u0027)"},{"line_number":139,"context_line":"    #     # todo(german) more tests"},{"line_number":140,"context_line":"    #     self.assertEqual(200, rv.status_code)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    @mock.patch(\u0027socket.gethostname\u0027)"},{"line_number":143,"context_line":"    @mock.patch(\u0027subprocess.check_output\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_d86d9004","line":140,"updated":"2015-03-20 23:08:14.000000000","message":"clean up?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"30dd5cb8ac94ac6c6dc988871f6d8f1569f18b03","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    # def test_details(self):"},{"line_number":138,"context_line":"    #     rv \u003d self.app.get(\u0027/\u0027 + api_server.VERSION + \u0027/details\u0027)"},{"line_number":139,"context_line":"    #     # todo(german) more tests"},{"line_number":140,"context_line":"    #     self.assertEqual(200, rv.status_code)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    @mock.patch(\u0027socket.gethostname\u0027)"},{"line_number":143,"context_line":"    @mock.patch(\u0027subprocess.check_output\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_0298ed1a","line":140,"in_reply_to":"9a80dd14_d86d9004","updated":"2015-03-25 21:31:48.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"e49addf5069f78542965227f344a92622790e712","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            Version: 1.4.24-2"},{"line_number":160,"context_line":"            \"\"\"]"},{"line_number":161,"context_line":"        rv \u003d self.app.get(\u0027/\u0027 + api_server.VERSION + \u0027/info\u0027)"},{"line_number":162,"context_line":"        # todo(german) more tests"},{"line_number":163,"context_line":"        self.assertEqual(200, rv.status_code)"},{"line_number":164,"context_line":"        self.assertEqual(dict("},{"line_number":165,"context_line":"            api_version\u003d\u00270.5\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"9aa53dc9_c592619f","line":162,"updated":"2015-04-08 00:29:04.000000000","message":"Still a bunch of TODOs here","commit_id":"ef659b4a7b6fc9d13fdca67576bf460af9c85238"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"983be30100ea5f5f146987c66702fcf278664199","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            Version: 1.4.24-2"},{"line_number":160,"context_line":"            \"\"\"]"},{"line_number":161,"context_line":"        rv \u003d self.app.get(\u0027/\u0027 + api_server.VERSION + \u0027/info\u0027)"},{"line_number":162,"context_line":"        # todo(german) more tests"},{"line_number":163,"context_line":"        self.assertEqual(200, rv.status_code)"},{"line_number":164,"context_line":"        self.assertEqual(dict("},{"line_number":165,"context_line":"            api_version\u003d\u00270.5\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"9aa53dc9_77564f5d","line":162,"in_reply_to":"9aa53dc9_c592619f","updated":"2015-04-09 21:53:47.000000000","message":"Done","commit_id":"ef659b4a7b6fc9d13fdca67576bf460af9c85238"},{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"a073b1622def50c704b561dad16afa3811fc7b92","unresolved":false,"context_lines":[{"line_number":508,"context_line":"        self.assertEqual(dict(details\u003d\"No network interface down\"),"},{"line_number":509,"context_line":"                         json.loads(rv.data))"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"        # One Interface down, Happy Path"},{"line_number":512,"context_line":"        mock_interfaces.side_effect \u003d [[\u0027blah\u0027]]"},{"line_number":513,"context_line":"        mock_ifaddress.side_effect \u003d [[netifaces.AF_INET]]"},{"line_number":514,"context_line":"        m \u003d mock.mock_open()"}],"source_content_type":"text/x-python","patch_set":24,"id":"dac4157f_76f149cd","line":511,"updated":"2015-04-20 03:59:53.000000000","message":"Is it at all possible that there could be multiple down interfaces?  If so, there should be a test case for that.  If not, why not?","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"13f7904033718de13a613f23821bef21087e9c51","unresolved":false,"context_lines":[{"line_number":508,"context_line":"        self.assertEqual(dict(details\u003d\"No network interface down\"),"},{"line_number":509,"context_line":"                         json.loads(rv.data))"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"        # One Interface down, Happy Path"},{"line_number":512,"context_line":"        mock_interfaces.side_effect \u003d [[\u0027blah\u0027]]"},{"line_number":513,"context_line":"        mock_ifaddress.side_effect \u003d [[netifaces.AF_INET]]"},{"line_number":514,"context_line":"        m \u003d mock.mock_open()"}],"source_content_type":"text/x-python","patch_set":24,"id":"dac4157f_920cc095","line":511,"in_reply_to":"dac4157f_76f149cd","updated":"2015-04-20 22:53:22.000000000","message":"Done","commit_id":"30c46e457f51b1b6ce19122b49438859fdbcb63d"}],"octavia/tests/unit/amphorae/backends/agent/api_server/test_listener.py":[{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"b889d8763904e29b49996bd93a9b8c2ff37a11aa","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# todo(german) use our tenplate engine to generate examples"},{"line_number":22,"context_line":"HAPROXY_SAMPLE_CONFIG \u003d ("},{"line_number":23,"context_line":"    \"\"\" global"},{"line_number":24,"context_line":"        log /dev/log\tlocal0"},{"line_number":25,"context_line":"        log /dev/log\tlocal1 notice"},{"line_number":26,"context_line":"        chroot /var/lib/haproxy"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_c5581f8d","line":23,"updated":"2015-03-17 04:32:37.000000000","message":"tabs","commit_id":"fa9a5d6bf5777da2ebd9af372cb909d01d4aa962"},{"author":{"_account_id":12403,"name":"Al Miller","email":"al.miller@ajmiller.net","username":"ajmiller"},"change_message_id":"b889d8763904e29b49996bd93a9b8c2ff37a11aa","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:"},{"line_number":40,"context_line":"            ssl-default-bind-options no-sslv3"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    defaults"},{"line_number":43,"context_line":"        log\tglobal"},{"line_number":44,"context_line":"        mode\thttp"},{"line_number":45,"context_line":"        option\thttplog"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_05d957f4","line":42,"updated":"2015-03-17 04:32:37.000000000","message":"tabs","commit_id":"fa9a5d6bf5777da2ebd9af372cb909d01d4aa962"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5d80dd074ea289248c45f5d5e1721c707ae2f78a","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from octavia.common import constants as consts"},{"line_number":19,"context_line":"import octavia.tests.unit.base as base"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# todo(german) use our tenplate engine to generate examples"},{"line_number":22,"context_line":"HAPROXY_SAMPLE_CONFIG \u003d ("},{"line_number":23,"context_line":"    \"\"\" global"},{"line_number":24,"context_line":"        log /dev/log    local0"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_d8e8307d","line":21,"updated":"2015-03-20 23:08:14.000000000","message":"TODO","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"30dd5cb8ac94ac6c6dc988871f6d8f1569f18b03","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from octavia.common import constants as consts"},{"line_number":19,"context_line":"import octavia.tests.unit.base as base"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# todo(german) use our tenplate engine to generate examples"},{"line_number":22,"context_line":"HAPROXY_SAMPLE_CONFIG \u003d ("},{"line_number":23,"context_line":"    \"\"\" global"},{"line_number":24,"context_line":"        log /dev/log    local0"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_82b21d92","line":21,"in_reply_to":"9a80dd14_d8e8307d","updated":"2015-03-25 21:31:48.000000000","message":"Done","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"}],"requirements.txt":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"6379a37e91f495ed8455f593610e18b9bee004b8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"pyasn1_modules"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"#for the amphora api"},{"line_number":36,"context_line":"Flask"},{"line_number":37,"context_line":""}],"source_content_type":"text/plain","patch_set":12,"id":"9a80dd14_5a2c3802","line":36,"updated":"2015-03-20 21:39:31.000000000","message":"Do we need this in our main requirements file? Is there precedent for having a different requirements file for a different part of the project? Flask will be installed on our controller-nodes and api-nodes if this is not split out. Don\u0027t know if we care.","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"30dd5cb8ac94ac6c6dc988871f6d8f1569f18b03","unresolved":false,"context_lines":[{"line_number":33,"context_line":"pyasn1_modules"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"#for the amphora api"},{"line_number":36,"context_line":"Flask"},{"line_number":37,"context_line":""}],"source_content_type":"text/plain","patch_set":12,"id":"1a6ced46_2252493b","line":36,"in_reply_to":"9a80dd14_5a2c3802","updated":"2015-03-25 21:31:48.000000000","message":"not sure how to solve that practically. Have an extra requirements firl for the api agent server?","commit_id":"e5595ed44938c59ec9bb03dce3fd64ae93c63cdc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"aaf613247878e824b3296f45701cbae4244afe24","unresolved":false,"context_lines":[{"line_number":41,"context_line":"taskflow\u003e\u003d0.7.1"},{"line_number":42,"context_line":"networkx\u003e\u003d1.8"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"#for the amphora api"},{"line_number":45,"context_line":"Flask"},{"line_number":46,"context_line":"netifaces"},{"line_number":47,"context_line":""}],"source_content_type":"text/plain","patch_set":34,"id":"3afb71cf_7934a1dd","line":44,"range":{"start_line":44,"start_character":5,"end_line":44,"end_character":8},"updated":"2015-06-05 06:11:03.000000000","message":"Since these won\u0027t be running on any of the main (control) hosts, should these actually be in our requirements.txt? Maybe put them in test-requirements.txt so the tests can work, but just document that they should be installed on the base image? This just seems awkward.","commit_id":"40440b8a0b97fc119762c37187e57f0e5b634a51"}]}
