)]}'
{".python-version":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"3515974c12423664f2e97236567e9b6c2c609d50","unresolved":false,"context_lines":[{"line_number":1,"context_line":"2.7.3"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"9a41bdd9_904aab54","line":1,"updated":"2015-07-16 23:41:20.000000000","message":"Remove that file --","commit_id":"bb6b308483821bcf2e1dfb80d32f18e01e1be54f"}],"octavia/cmd/house_keeping.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"da1223208dbc21e6e5be24814e00845e6d5d91a1","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":"import time"},{"line_number":18,"context_line":"import threading"},{"line_number":19,"context_line":"from oslo_log import log as logging"},{"line_number":20,"context_line":"from oslo_config import cfg"},{"line_number":21,"context_line":"from octavia.common import service"},{"line_number":22,"context_line":"from octavia.controller.housekeeping import spare_check"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_742ec9fb","line":19,"updated":"2015-07-17 19:40:24.000000000","message":"group imports","commit_id":"aab2e1795d496d14a72638e956915d4511e0c636"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    # Read the interval from CONF"},{"line_number":50,"context_line":"    interval \u003d CONF.house_keeping.housekeeping_interval"},{"line_number":51,"context_line":"    LOG.info(_LI(\"House-Keeping interval : %d sec\") % interval)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    # Thread to perform amphora spare check"},{"line_number":54,"context_line":"    thread \u003d threading.Thread(target\u003dinterval_check, args\u003d(interval,))"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_f57a4e23","line":51,"updated":"2015-08-06 22:11:11.000000000","message":"A \"Starting house keeping manager \u003ctimestamp\u003e\" log might be nice as well.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    # Thread to perform amphora spare check"},{"line_number":54,"context_line":"    thread \u003d threading.Thread(target\u003dinterval_check, args\u003d(interval,))"},{"line_number":55,"context_line":"    thread.setDaemon(True)"},{"line_number":56,"context_line":"    thread_event.set()"},{"line_number":57,"context_line":"    thread.start()"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_3528b632","line":55,"updated":"2015-08-06 22:11:11.000000000","message":"I think this should now be:\nthread.daemon \u003d True","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        while True:"},{"line_number":62,"context_line":"            time.sleep(1)"},{"line_number":63,"context_line":"    except KeyboardInterrupt:"},{"line_number":64,"context_line":"        LOG.info(_LI(\"Attempting to gracefully terminate. Max time: %d sec\")"},{"line_number":65,"context_line":"                 % interval)"},{"line_number":66,"context_line":"        thread_event.clear()"},{"line_number":67,"context_line":"        thread.join()"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_15e6dae7","line":64,"updated":"2015-08-06 22:11:11.000000000","message":"I would remove the \"Max time\" statement as you can\u0027t guarantee that interval if the thread is busy.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"179a00780099cc0411636ca4ba1c4257c341d7ae","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    \"\"\""},{"line_number":41,"context_line":"    # Read the interval from CONF"},{"line_number":42,"context_line":"    interval \u003d CONF.house_keeping.spare_check_interval"},{"line_number":43,"context_line":"    LOG.info(_LI(\"Spare check interval is set to %d sec\") % interval)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    spare_amp \u003d house_keeping.SpareAmphora()"},{"line_number":46,"context_line":"    while True and spare_amp_thread_event.is_set():"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_9d94dce2","line":43,"updated":"2015-08-18 17:13:44.000000000","message":"Nice logging.  It\u0027s easy to forget about the logging you would like to have until you have it in prod.","commit_id":"a9dca7feefa52331b94984dbd8a1ce075980b8e2"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"179a00780099cc0411636ca4ba1c4257c341d7ae","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    spare_amp \u003d house_keeping.SpareAmphora()"},{"line_number":46,"context_line":"    while True and spare_amp_thread_event.is_set():"},{"line_number":47,"context_line":"        time.sleep(interval)"},{"line_number":48,"context_line":"        LOG.info(_LI(\"Initiating spare amphora check...\"))"},{"line_number":49,"context_line":"        spare_amp.spare_check()"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_fdd718bd","line":47,"updated":"2015-08-18 17:13:44.000000000","message":"nit: I prefer to have the sleep after the work so that it runs on startup.\nFor example if someone set the spares pool check to ten minutes, it could be a long wait to initially build the spares pool.","commit_id":"a9dca7feefa52331b94984dbd8a1ce075980b8e2"},{"author":{"_account_id":15226,"name":"Bharath M","email":"bharath.stacker@gmail.com","username":"bharath"},"change_message_id":"cbcc4f214780d0f267c3e06dbfefd9481903e8d9","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    spare_amp \u003d house_keeping.SpareAmphora()"},{"line_number":46,"context_line":"    while True and spare_amp_thread_event.is_set():"},{"line_number":47,"context_line":"        time.sleep(interval)"},{"line_number":48,"context_line":"        LOG.info(_LI(\"Initiating spare amphora check...\"))"},{"line_number":49,"context_line":"        spare_amp.spare_check()"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_8e94a0e2","line":47,"in_reply_to":"fa1b9901_fdd718bd","updated":"2015-08-18 18:08:09.000000000","message":"Sure.. Will do in next patch.","commit_id":"a9dca7feefa52331b94984dbd8a1ce075980b8e2"},{"author":{"_account_id":10477,"name":"min wang","email":"swiftwangster@gmail.com","username":"minwang"},"change_message_id":"898d54c8d4811be1ae979122b7e3f7930efb760e","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    LOG.info(_LI(\"DB cleanup interval is set to %d sec\") % interval)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    db_cleanup \u003d house_keeping.DatabaseCleanup()"},{"line_number":59,"context_line":"    while True and db_cleanup_thread_event.is_set():"},{"line_number":60,"context_line":"        time.sleep(interval)"},{"line_number":61,"context_line":"        LOG.info(_LI(\"Initiating the cleanup of old amphora...\"))"},{"line_number":62,"context_line":"        db_cleanup.delete_old_amphorae()"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_98dcea13","line":59,"updated":"2015-08-18 17:22:27.000000000","message":"do we need True here?","commit_id":"a9dca7feefa52331b94984dbd8a1ce075980b8e2"},{"author":{"_account_id":15226,"name":"Bharath M","email":"bharath.stacker@gmail.com","username":"bharath"},"change_message_id":"cbcc4f214780d0f267c3e06dbfefd9481903e8d9","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    LOG.info(_LI(\"DB cleanup interval is set to %d sec\") % interval)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    db_cleanup \u003d house_keeping.DatabaseCleanup()"},{"line_number":59,"context_line":"    while True and db_cleanup_thread_event.is_set():"},{"line_number":60,"context_line":"        time.sleep(interval)"},{"line_number":61,"context_line":"        LOG.info(_LI(\"Initiating the cleanup of old amphora...\"))"},{"line_number":62,"context_line":"        db_cleanup.delete_old_amphorae()"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_6ef26c71","line":59,"in_reply_to":"fa1b9901_98dcea13","updated":"2015-08-18 18:08:09.000000000","message":"Oops.. Funny I missed that.. Thanks for pointing out.. Will update it next patch.","commit_id":"a9dca7feefa52331b94984dbd8a1ce075980b8e2"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"1c2503a497d8b1d80fe9a2ccf033f799e41b7528","unresolved":false,"context_lines":[{"line_number":36,"context_line":"def spare_amphora_check():"},{"line_number":37,"context_line":"    \"\"\"At the end of defined interval in seconds, performs spare"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    amphorae check."},{"line_number":40,"context_line":"    \"\"\""},{"line_number":41,"context_line":"    # Read the interval from CONF"},{"line_number":42,"context_line":"    interval \u003d CONF.house_keeping.spare_check_interval"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_7b8bb7c3","line":39,"updated":"2015-08-20 08:27:13.000000000","message":"This is is technically valid for the purposes of passing pep8/hacking, but totally violates the spirit of the rule (H405). :(\n\nIt\u0027s supposed to be a summary on the first line, and then further details after a blank line.\n\nhttp://docs.openstack.org/developer/hacking/#docstrings","commit_id":"04720a775af5d5fcfab258affdbf56266a1e6246"},{"author":{"_account_id":15226,"name":"Bharath M","email":"bharath.stacker@gmail.com","username":"bharath"},"change_message_id":"51b42b580400a75a06991ef7c5744d2b653b9a8e","unresolved":false,"context_lines":[{"line_number":36,"context_line":"def spare_amphora_check():"},{"line_number":37,"context_line":"    \"\"\"At the end of defined interval in seconds, performs spare"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    amphorae check."},{"line_number":40,"context_line":"    \"\"\""},{"line_number":41,"context_line":"    # Read the interval from CONF"},{"line_number":42,"context_line":"    interval \u003d CONF.house_keeping.spare_check_interval"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_062d7ba7","line":39,"in_reply_to":"fa1b9901_7b8bb7c3","updated":"2015-08-20 09:48:49.000000000","message":"I can change this to \"Performs Spare amp check according to configured interval\"","commit_id":"04720a775af5d5fcfab258affdbf56266a1e6246"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"1c2503a497d8b1d80fe9a2ccf033f799e41b7528","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    # Try-Exception block should be at the end to gracefully exit threads"},{"line_number":84,"context_line":"    try:"},{"line_number":85,"context_line":"        while True:"},{"line_number":86,"context_line":"            time.sleep(1)"},{"line_number":87,"context_line":"    except KeyboardInterrupt:"},{"line_number":88,"context_line":"        LOG.info(_LI(\"Attempting to gracefully terminate House-Keeping\"))"},{"line_number":89,"context_line":"        spare_amp_thread_event.clear()"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_ed7aaa87","line":86,"updated":"2015-08-20 08:27:13.000000000","message":"This sleep-loop *will* work, but I think the more accepted approach is to wait for the threads to finish (even if you never expect them to), no loop needed:\n\n spare_amp_thread.join()\n db_cleanup_thread.join()","commit_id":"04720a775af5d5fcfab258affdbf56266a1e6246"},{"author":{"_account_id":15226,"name":"Bharath M","email":"bharath.stacker@gmail.com","username":"bharath"},"change_message_id":"51b42b580400a75a06991ef7c5744d2b653b9a8e","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    # Try-Exception block should be at the end to gracefully exit threads"},{"line_number":84,"context_line":"    try:"},{"line_number":85,"context_line":"        while True:"},{"line_number":86,"context_line":"            time.sleep(1)"},{"line_number":87,"context_line":"    except KeyboardInterrupt:"},{"line_number":88,"context_line":"        LOG.info(_LI(\"Attempting to gracefully terminate House-Keeping\"))"},{"line_number":89,"context_line":"        spare_amp_thread_event.clear()"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_468b73c3","line":86,"in_reply_to":"fa1b9901_ed7aaa87","updated":"2015-08-20 09:48:49.000000000","message":"If we directly use join() without exception handling, even though the thread is set as Daemon, we couldn\u0027t terminate the housekeeping process because there\u0027s no way to catch an interrupt to gracefully terminate the thread.","commit_id":"04720a775af5d5fcfab258affdbf56266a1e6246"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"ca7de9757b65be70b266af28a0bea21940a9a2e2","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    # Try-Exception block should be at the end to gracefully exit threads"},{"line_number":82,"context_line":"    try:"},{"line_number":83,"context_line":"        while True:"},{"line_number":84,"context_line":"            time.sleep(1)"},{"line_number":85,"context_line":"    except KeyboardInterrupt:"},{"line_number":86,"context_line":"        LOG.info(_LI(\"Attempting to gracefully terminate House-Keeping\"))"},{"line_number":87,"context_line":"        spare_amp_thread_event.clear()"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa1b9901_9946b479","line":84,"updated":"2015-08-20 18:17:55.000000000","message":"I didn\u0027t mean to use it without the try/except, I meant literally JUST remove the while True: time.sleep(1).\nAn interrupt while it\u0027s sitting on a join() should still kick it into the except KeyboardInterrupt, i think. But, I am ok with putting this in as-is, I might take a look at optimizing it later, in another patch, if I care enough.\n\nAlso, there IS a way to do it by using signals to cleanly interrupt, but it\u0027s not actually that much cleaner...\nhttps://github.com/lbrackspace/glb/blob/master/manager/processes/worker.py#L31\nhttps://github.com/lbrackspace/glb/blob/master/manager/__init__.py#L111","commit_id":"d74ef6b1383add804917933bd66d4b0a2ded5222"}],"octavia/common/config.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"1c2503a497d8b1d80fe9a2ccf033f799e41b7528","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    cfg.IntOpt(\u0027cleanup_interval\u0027,"},{"line_number":216,"context_line":"               default\u003d30,"},{"line_number":217,"context_line":"               help\u003d_(\u0027DB cleanup interval in seconds\u0027)),"},{"line_number":218,"context_line":"    cfg.IntOpt(\u0027amphora_expire_age\u0027,"},{"line_number":219,"context_line":"               default\u003d604800,"},{"line_number":220,"context_line":"               help\u003d_(\u0027Amphora expire age in seconds\u0027))"},{"line_number":221,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_8d79ae84","line":218,"updated":"2015-08-20 08:27:13.000000000","message":"I wish this was \"amphora_expiry_age\", but that\u0027s just me being pedantic.","commit_id":"04720a775af5d5fcfab258affdbf56266a1e6246"},{"author":{"_account_id":15226,"name":"Bharath M","email":"bharath.stacker@gmail.com","username":"bharath"},"change_message_id":"51b42b580400a75a06991ef7c5744d2b653b9a8e","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    cfg.IntOpt(\u0027cleanup_interval\u0027,"},{"line_number":216,"context_line":"               default\u003d30,"},{"line_number":217,"context_line":"               help\u003d_(\u0027DB cleanup interval in seconds\u0027)),"},{"line_number":218,"context_line":"    cfg.IntOpt(\u0027amphora_expire_age\u0027,"},{"line_number":219,"context_line":"               default\u003d604800,"},{"line_number":220,"context_line":"               help\u003d_(\u0027Amphora expire age in seconds\u0027))"},{"line_number":221,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_211bc974","line":218,"in_reply_to":"fa1b9901_8d79ae84","updated":"2015-08-20 09:48:49.000000000","message":"Sounds apt. I shall update it.","commit_id":"04720a775af5d5fcfab258affdbf56266a1e6246"}],"octavia/controller/housekeeping/house_keeping.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.cw \u003d cw.ControllerWorker()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def spare_check(self):"},{"line_number":36,"context_line":"        \"\"\"Checks the DB for the active Spare amphora."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        If it\u0027s less than the requirement, start new amphora."},{"line_number":39,"context_line":"        :return:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_f5524e66","line":36,"updated":"2015-08-06 22:11:11.000000000","message":"Does it determine they are \"active\".\n\n\"active\" is confusing here.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        # When the current spare amphora is less than required"},{"line_number":47,"context_line":"        if diff_count \u003e 0:"},{"line_number":48,"context_line":"            LOG.info(_LI(\"Current spare amphora are fewer than required\"))"},{"line_number":49,"context_line":"            LOG.info(_LI(\"Initiating creation of %d amphora ...\") % diff_count)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"            # Call Amphora Create Flow diff_count times"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_f5aece2c","line":48,"updated":"2015-08-06 22:11:11.000000000","message":"Logging the current count and config spare size is handy.  That way you can see in the log what the setting was at the time and how many it needed to build.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"2ceda90070736dfa64fcbd55a285fa1e4775dc88","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            LOG.info(_LI(\"Initiating creation of %d amphora ...\") % diff_count)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"            # Call Amphora Create Flow diff_count times"},{"line_number":52,"context_line":"            for i in range(1, diff_count + 1):"},{"line_number":53,"context_line":"                LOG.info(_LI(\"Starting amphorae number %d ...\") % i)"},{"line_number":54,"context_line":"                self.cw.create_amphora()"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_7b563207","line":52,"updated":"2015-08-06 19:18:28.000000000","message":"How do we handle multiple of them running? I think it would be better to check how many are in the DB before building more. \n\nIn libra there was a special table where each worker indicated how many they were trying to build so other instances wouldn\u0027t build them.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":15226,"name":"Bharath M","email":"bharath.stacker@gmail.com","username":"bharath"},"change_message_id":"2451babc68e156eafa405ffa1497db673336b6c7","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            LOG.info(_LI(\"Initiating creation of %d amphora ...\") % diff_count)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"            # Call Amphora Create Flow diff_count times"},{"line_number":52,"context_line":"            for i in range(1, diff_count + 1):"},{"line_number":53,"context_line":"                LOG.info(_LI(\"Starting amphorae number %d ...\") % i)"},{"line_number":54,"context_line":"                self.cw.create_amphora()"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_fb4d62c4","line":52,"in_reply_to":"1a4dcd0f_7b563207","updated":"2015-08-06 19:44:41.000000000","message":"That\u0027s a good point. As I understand, if multiple of them running, one should act as Master and invoke this, isn\u0027t it?\n\nIf not, the right way is to poll the DB inside the for loop and repeat the create_amphora() until the condition is satisfied. However, in case some error occurs in writing the information into DB, this might result in infinite loop if we have no other break conditions.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            LOG.info(_LI(\"Initiating creation of %d amphora ...\") % diff_count)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"            # Call Amphora Create Flow diff_count times"},{"line_number":52,"context_line":"            for i in range(1, diff_count + 1):"},{"line_number":53,"context_line":"                LOG.info(_LI(\"Starting amphorae number %d ...\") % i)"},{"line_number":54,"context_line":"                self.cw.create_amphora()"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_353d16dd","line":52,"in_reply_to":"1a4dcd0f_fb4d62c4","updated":"2015-08-06 22:11:11.000000000","message":"I agree with German this is an issue.\n\nWe should build these inside a database transaction to make sure we have consistency and don\u0027t over build.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                         \"requirement of %d\") % conf_spare_size)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class DatabaseCleanup(object):"},{"line_number":62,"context_line":"    def __init__(self):"},{"line_number":63,"context_line":"        self.amp_repo \u003d repo.AmphoraRepository()"},{"line_number":64,"context_line":"        self.amp_health_repo \u003d repo.AmphoraHealthRepository()"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_18084f27","line":61,"updated":"2015-08-06 22:11:11.000000000","message":"This is not called from the service.  Should it be here or another patchset?","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":10477,"name":"min wang","email":"swiftwangster@gmail.com","username":"minwang"},"change_message_id":"f9dfbc9a768dde1b9b7b462e80abab6dd08e8222","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                         \"requirement of %d\") % conf_spare_size)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class DatabaseCleanup(object):"},{"line_number":62,"context_line":"    def __init__(self):"},{"line_number":63,"context_line":"        self.amp_repo \u003d repo.AmphoraRepository()"},{"line_number":64,"context_line":"        self.amp_health_repo \u003d repo.AmphoraHealthRepository()"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_6ff7198d","line":61,"in_reply_to":"1a4dcd0f_18084f27","updated":"2015-08-07 18:56:52.000000000","message":"I remembered that in the midcycle that Trevor and Brandon decides to move this class my code to house_keep","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.amp_health_repo \u003d repo.AmphoraHealthRepository()"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def delete_old_amphorae(self):"},{"line_number":67,"context_line":"        LOG.info(_LI(\u0027House Keeping Agent is now running...\u0027))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        session \u003d db_api.get_session()"},{"line_number":70,"context_line":"        amphorae \u003d self.amp_repo.get(session, status\u003dconstants.DELETED)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_5829f788","line":67,"updated":"2015-08-06 22:11:11.000000000","message":"This is the wrong log message for this method.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"2ceda90070736dfa64fcbd55a285fa1e4775dc88","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        LOG.info(_LI(\u0027House Keeping Agent is now running...\u0027))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        session \u003d db_api.get_session()"},{"line_number":70,"context_line":"        amphorae \u003d self.amp_repo.get(session, status\u003dconstants.DELETED)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        for amp in amphorae:"},{"line_number":73,"context_line":"            if self.amp_health_repo.check_amphora_expired(session, amp.id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_bb291a8c","line":70,"updated":"2015-08-06 19:18:28.000000000","message":"I think we want to keep DELETED entries around like 24 hours for debugging and not delete right away","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":15226,"name":"Bharath M","email":"bharath.stacker@gmail.com","username":"bharath"},"change_message_id":"2451babc68e156eafa405ffa1497db673336b6c7","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        LOG.info(_LI(\u0027House Keeping Agent is now running...\u0027))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        session \u003d db_api.get_session()"},{"line_number":70,"context_line":"        amphorae \u003d self.amp_repo.get(session, status\u003dconstants.DELETED)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        for amp in amphorae:"},{"line_number":73,"context_line":"            if self.amp_health_repo.check_amphora_expired(session, amp.id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_bbf11a6d","line":70,"in_reply_to":"1a4dcd0f_bb291a8c","updated":"2015-08-06 19:44:41.000000000","message":"I am not aware of this. I copied the DB code as is from Min\u0027s patch. Please let me know of any other changes to this and I shall update.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        LOG.info(_LI(\u0027House Keeping Agent is now running...\u0027))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        session \u003d db_api.get_session()"},{"line_number":70,"context_line":"        amphorae \u003d self.amp_repo.get(session, status\u003dconstants.DELETED)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        for amp in amphorae:"},{"line_number":73,"context_line":"            if self.amp_health_repo.check_amphora_expired(session, amp.id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_b82efb89","line":70,"in_reply_to":"1a4dcd0f_bbf11a6d","updated":"2015-08-06 22:11:11.000000000","message":"It should be a configurable interval.\n\nIs this check done in check_amphora_expired?  Is the database query needed here?\n\nThis should also be put in a database transaction to handle multiple controllers updating.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        amphorae \u003d self.amp_repo.get(session, status\u003dconstants.DELETED)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        for amp in amphorae:"},{"line_number":73,"context_line":"            if self.amp_health_repo.check_amphora_expired(session, amp.id):"},{"line_number":74,"context_line":"                self.amp_repo.delete(session, id\u003damp.id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_988f7f74","line":73,"updated":"2015-08-06 22:11:11.000000000","message":"I think this is the wrong code.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"179a00780099cc0411636ca4ba1c4257c341d7ae","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            if self.amp_health_repo.check_amphora_expired(session, amp.id,"},{"line_number":79,"context_line":"                                                          exp_age):"},{"line_number":80,"context_line":"                LOG.info(_LI(\u0027Deleting Amphora id : %s\u0027) % amp.id)"},{"line_number":81,"context_line":"                self.amp_repo.delete(session, id\u003damp.id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_7878f68f","line":81,"updated":"2015-08-18 17:13:44.000000000","message":"We could add a delete for the amphora health table unless it gets cleaned up with the delete from the amphora table.","commit_id":"a9dca7feefa52331b94984dbd8a1ce075980b8e2"},{"author":{"_account_id":15226,"name":"Bharath M","email":"bharath.stacker@gmail.com","username":"bharath"},"change_message_id":"cbcc4f214780d0f267c3e06dbfefd9481903e8d9","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            if self.amp_health_repo.check_amphora_expired(session, amp.id,"},{"line_number":79,"context_line":"                                                          exp_age):"},{"line_number":80,"context_line":"                LOG.info(_LI(\u0027Deleting Amphora id : %s\u0027) % amp.id)"},{"line_number":81,"context_line":"                self.amp_repo.delete(session, id\u003damp.id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_0e6e5001","line":81,"in_reply_to":"fa1b9901_7878f68f","updated":"2015-08-18 18:08:09.000000000","message":"Sure. Should it be a separate patch If we are going to do that?","commit_id":"a9dca7feefa52331b94984dbd8a1ce075980b8e2"}],"octavia/controller/housekeeping/spare_check.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"3515974c12423664f2e97236567e9b6c2c609d50","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    #When the current spare amphora is less than required"},{"line_number":38,"context_line":"    if conf_count \u003c db_count:"},{"line_number":39,"context_line":"        diff_count \u003d db_count - conf_count"},{"line_number":40,"context_line":"        worker \u003d controller_worker.ControllerWorker()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        # Call Amphora Create Flow diff_count times"},{"line_number":43,"context_line":"        for i in range(0,diff_count):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_90aceb8d","line":40,"updated":"2015-07-16 23:41:20.000000000","message":"Should be outside the method","commit_id":"bb6b308483821bcf2e1dfb80d32f18e01e1be54f"}],"octavia/db/repositories.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"3515974c12423664f2e97236567e9b6c2c609d50","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        :returns: Number of current spare amphora."},{"line_number":358,"context_line":"        \"\"\""},{"line_number":359,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":360,"context_line":"            count \u003d session.query(self.model_class).with_for_update().filter_by("},{"line_number":361,"context_line":"                status\u003d\u0027READY\u0027, load_balancer_id\u003dNone).count()"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"        return count"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_d03ef328","line":360,"updated":"2015-07-16 23:41:20.000000000","message":"take that off (with_for_update)","commit_id":"bb6b308483821bcf2e1dfb80d32f18e01e1be54f"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"1c2503a497d8b1d80fe9a2ccf033f799e41b7528","unresolved":false,"context_lines":[{"line_number":359,"context_line":"        \"\"\""},{"line_number":360,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":361,"context_line":"            count \u003d session.query(self.model_class).filter_by("},{"line_number":362,"context_line":"                status\u003d\u0027READY\u0027, load_balancer_id\u003dNone).count()"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        return count"},{"line_number":365,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_0d535ee3","line":362,"updated":"2015-08-20 08:27:13.000000000","message":"Isn\u0027t there a constant somewhere for this status?","commit_id":"04720a775af5d5fcfab258affdbf56266a1e6246"},{"author":{"_account_id":15226,"name":"Bharath M","email":"bharath.stacker@gmail.com","username":"bharath"},"change_message_id":"51b42b580400a75a06991ef7c5744d2b653b9a8e","unresolved":false,"context_lines":[{"line_number":359,"context_line":"        \"\"\""},{"line_number":360,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":361,"context_line":"            count \u003d session.query(self.model_class).filter_by("},{"line_number":362,"context_line":"                status\u003d\u0027READY\u0027, load_balancer_id\u003dNone).count()"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        return count"},{"line_number":365,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_e10631cd","line":362,"in_reply_to":"fa1b9901_0d535ee3","updated":"2015-08-20 09:48:49.000000000","message":"You are right. I shall update it.","commit_id":"04720a775af5d5fcfab258affdbf56266a1e6246"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"1c2503a497d8b1d80fe9a2ccf033f799e41b7528","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        \"\"\""},{"line_number":402,"context_line":"        if not exp_age:"},{"line_number":403,"context_line":"            timestamp \u003d datetime.datetime.utcnow() - datetime.timedelta("},{"line_number":404,"context_line":"                seconds\u003d10)"},{"line_number":405,"context_line":"        else:"},{"line_number":406,"context_line":"            timestamp \u003d datetime.datetime.utcnow() - exp_age"},{"line_number":407,"context_line":"        amphora_health \u003d self.get(session, amphora_id\u003damphora_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_4d22b653","line":404,"updated":"2015-08-20 08:27:13.000000000","message":"Should this \"10 seconds\" be configured somewhere? Is it expected that the configuration value would be what comes in as exp_age, and this is just a last-ditch catch-all in case it isn\u0027t passed in? I am curious whether we should not just *require* exp_age for this function, or else just do the configuration value loading here.","commit_id":"04720a775af5d5fcfab258affdbf56266a1e6246"},{"author":{"_account_id":15226,"name":"Bharath M","email":"bharath.stacker@gmail.com","username":"bharath"},"change_message_id":"51b42b580400a75a06991ef7c5744d2b653b9a8e","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        \"\"\""},{"line_number":402,"context_line":"        if not exp_age:"},{"line_number":403,"context_line":"            timestamp \u003d datetime.datetime.utcnow() - datetime.timedelta("},{"line_number":404,"context_line":"                seconds\u003d10)"},{"line_number":405,"context_line":"        else:"},{"line_number":406,"context_line":"            timestamp \u003d datetime.datetime.utcnow() - exp_age"},{"line_number":407,"context_line":"        amphora_health \u003d self.get(session, amphora_id\u003damphora_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_81c3b588","line":404,"in_reply_to":"fa1b9901_4d22b653","updated":"2015-08-20 09:48:49.000000000","message":"My initial ideas were to make the exp_age mandatory for this function call. However, I thought it would break the system, as other patchsets/existing source may be calling the method with this argument.","commit_id":"04720a775af5d5fcfab258affdbf56266a1e6246"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"ca7de9757b65be70b266af28a0bea21940a9a2e2","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        \"\"\""},{"line_number":402,"context_line":"        if not exp_age:"},{"line_number":403,"context_line":"            timestamp \u003d datetime.datetime.utcnow() - datetime.timedelta("},{"line_number":404,"context_line":"                seconds\u003d10)"},{"line_number":405,"context_line":"        else:"},{"line_number":406,"context_line":"            timestamp \u003d datetime.datetime.utcnow() - exp_age"},{"line_number":407,"context_line":"        amphora_health \u003d self.get(session, amphora_id\u003damphora_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa1b9901_bc9e06b7","line":404,"updated":"2015-08-20 18:17:55.000000000","message":"You could take a look at the usages for this if you\u0027re using PyCharm by right clicking the method name and using Find Usage, and see what\u0027s happening elsewhere. But, similar to the other issue I mentioned, I don\u0027t think this is a showstopper, and I\u0027ll look at fixing it myself at a later date if I remember and care enough.","commit_id":"d74ef6b1383add804917933bd66d4b0a2ded5222"}],"octavia/tests/functional/db/test_repositories.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"2ceda90070736dfa64fcbd55a285fa1e4775dc88","unresolved":false,"context_lines":[{"line_number":1137,"context_line":"    def test_get_spare_amphora_count(self):"},{"line_number":1138,"context_line":"        count \u003d self.amphora_repo.get_spare_amphora_count(self.session)"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"        self.assertEqual(count, 0)"},{"line_number":1141,"context_line":""},{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"class AmphoraHealthRepositoryTest(BaseRepositoryTest):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_7ba4f206","line":1140,"updated":"2015-08-06 19:18:28.000000000","message":"Is there a reason we only need to test the 0 case? What about more than 0.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":15226,"name":"Bharath M","email":"bharath.stacker@gmail.com","username":"bharath"},"change_message_id":"2451babc68e156eafa405ffa1497db673336b6c7","unresolved":false,"context_lines":[{"line_number":1137,"context_line":"    def test_get_spare_amphora_count(self):"},{"line_number":1138,"context_line":"        count \u003d self.amphora_repo.get_spare_amphora_count(self.session)"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"        self.assertEqual(count, 0)"},{"line_number":1141,"context_line":""},{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"class AmphoraHealthRepositoryTest(BaseRepositoryTest):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_7b11525c","line":1140,"in_reply_to":"1a4dcd0f_7ba4f206","updated":"2015-08-06 19:44:41.000000000","message":"I thought checking the base condition of method call would be suffice. Let me know if you want me to add a new test_method that checks for some \u0027x\u0027 count or include under the same above method.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"}],"octavia/tests/unit/controller/housekeeping/test_house_keeping.py":[{"author":{"_account_id":10477,"name":"min wang","email":"swiftwangster@gmail.com","username":"minwang"},"change_message_id":"c07ba0740d9caa1e9b2b7b49c76ca1205ad8f2d4","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    FAKE_IP \u003d \"10.0.0.1\""},{"line_number":65,"context_line":"    FAKE_UUID_1 \u003d uuidutils.generate_uuid()"},{"line_number":66,"context_line":"    FAKE_UUID_3 \u003d uuidutils.generate_uuid()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def setUp(self):"},{"line_number":69,"context_line":"        super(TestDatabaseCleanup, self).setUp()"},{"line_number":70,"context_line":"        self.dbclean \u003d house_keeping.DatabaseCleanup()"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_4b68c387","line":67,"updated":"2015-08-04 18:32:01.000000000","message":"it might be better to  change from  FAKE_UUID_3 to FAKE_UUID_2","commit_id":"be378829789059a1979b01f3599cb942d16b5046"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.hk.spare_check()"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        self.assertTrue(self.amp_repo.get_spare_amphora_count.called)"},{"line_number":56,"context_line":"        self.cw.create_amphora.assert_any_call()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_spare_check_no_diff_count(self):"},{"line_number":59,"context_line":"        \"\"\"For Future Use.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_be1a63c4","line":56,"updated":"2015-08-06 22:11:11.000000000","message":"You could check that this was called the right number of times.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"2ceda90070736dfa64fcbd55a285fa1e4775dc88","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_spare_check_no_diff_count(self):"},{"line_number":59,"context_line":"        \"\"\"For Future Use.\"\"\""},{"line_number":60,"context_line":"        pass"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class TestDatabaseCleanup(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_3bc8aaa5","line":60,"updated":"2015-08-06 19:18:28.000000000","message":"I think I would like to see that test","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_spare_check_no_diff_count(self):"},{"line_number":59,"context_line":"        \"\"\"For Future Use.\"\"\""},{"line_number":60,"context_line":"        pass"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class TestDatabaseCleanup(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_7ee37bd9","line":60,"in_reply_to":"1a4dcd0f_16b4a532","updated":"2015-08-06 22:11:11.000000000","message":"Yes, it should still take the code path other wise it counts against the coverage numbers.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":15226,"name":"Bharath M","email":"bharath.stacker@gmail.com","username":"bharath"},"change_message_id":"2451babc68e156eafa405ffa1497db673336b6c7","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_spare_check_no_diff_count(self):"},{"line_number":59,"context_line":"        \"\"\"For Future Use.\"\"\""},{"line_number":60,"context_line":"        pass"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class TestDatabaseCleanup(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_16b4a532","line":60,"in_reply_to":"1a4dcd0f_3bc8aaa5","updated":"2015-08-06 19:44:41.000000000","message":"Currently the \u0027else\u0027 block (when the spare amphora count is satisfied) has just one line that prints LOG output. So may be we don\u0027t have to test that?","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"afa47cfb6b11cbcd16d399931accd1dc450283e5","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        pass"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class TestDatabaseCleanup(base.TestCase):"},{"line_number":64,"context_line":"    FAKE_IP \u003d \"10.0.0.1\""},{"line_number":65,"context_line":"    FAKE_UUID_1 \u003d uuidutils.generate_uuid()"},{"line_number":66,"context_line":"    FAKE_UUID_2 \u003d uuidutils.generate_uuid()"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_be71030e","line":63,"updated":"2015-08-06 22:11:11.000000000","message":"Same comments here as in the main code.","commit_id":"b4a61a5815d96a363d96d64a8879a502fce1b6ae"}]}
