)]}'
{"nodedb.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    def print_state(self):"},{"line_number":151,"context_line":"        #import logging"},{"line_number":152,"context_line":"        #logging.basicConfig()"},{"line_number":153,"context_line":"        #logging.getLogger(\u0027sqlalchemy.engine\u0027).setLevel(logging.INFO)"},{"line_number":154,"context_line":"        for provider_name in self.getProviders():"},{"line_number":155,"context_line":"            print \u0027Provider:\u0027, provider_name"},{"line_number":156,"context_line":"            for image_name in self.getImages(provider_name):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F%2FGk%3D","line":153,"updated":"2013-08-11 22:51:44.000000000","message":"Is sqlalchemy logging something that we should make toggleable and not via uncommenting code?","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"f94cc673d19ad61323b863c5fa7a52926e03c99d","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    def print_state(self):"},{"line_number":151,"context_line":"        #import logging"},{"line_number":152,"context_line":"        #logging.basicConfig()"},{"line_number":153,"context_line":"        #logging.getLogger(\u0027sqlalchemy.engine\u0027).setLevel(logging.INFO)"},{"line_number":154,"context_line":"        for provider_name in self.getProviders():"},{"line_number":155,"context_line":"            print \u0027Provider:\u0027, provider_name"},{"line_number":156,"context_line":"            for image_name in self.getImages(provider_name):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F7r0%3D","line":153,"in_reply_to":"AAAAQ3%2F%2F%2FGk%3D","updated":"2013-08-12 20:49:35.000000000","message":"Nah, this was a sqlalchemy wtf moment during development.  The usage of this module to print the current state of the db doesn\u0027t really need logging.\n\nIf we want actual runtime logging, that can be done in the usual manner.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        self.session.commit()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def delete(self, obj):"},{"line_number":179,"context_line":"        self.session.delete(obj)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def getProviders(self):"},{"line_number":182,"context_line":"        return [x.provider_name for x in"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F%2FGE%3D","line":179,"updated":"2013-08-11 22:51:44.000000000","message":"Are these three methods used? (abort, commit, delete)","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"f94cc673d19ad61323b863c5fa7a52926e03c99d","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        self.session.commit()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def delete(self, obj):"},{"line_number":179,"context_line":"        self.session.delete(obj)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def getProviders(self):"},{"line_number":182,"context_line":"        return [x.provider_name for x in"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F7rk%3D","line":179,"in_reply_to":"AAAAQ3%2F%2F%2FGE%3D","updated":"2013-08-12 20:49:35.000000000","message":"Commit is, at least.  I want to keep all of them around.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        return [x.image_name for x in"},{"line_number":188,"context_line":"                self.session.query(SnapshotImage).filter("},{"line_number":189,"context_line":"                snapshot_image_table.c.provider_name\u003d\u003dprovider_name).distinct("},{"line_number":190,"context_line":"                snapshot_image_table.c.image_name).all()]"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def getSnapshotImages(self):"},{"line_number":193,"context_line":"        return self.session.query(SnapshotImage).order_by("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F%2FGc%3D","line":190,"updated":"2013-08-11 22:51:44.000000000","message":"Is it not easier to select only image_name (and provider_name above) to select only that field? These tables are small so probably doesn\u0027t make a huge different to filter out the fields in pythonl","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"f94cc673d19ad61323b863c5fa7a52926e03c99d","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        return [x.image_name for x in"},{"line_number":188,"context_line":"                self.session.query(SnapshotImage).filter("},{"line_number":189,"context_line":"                snapshot_image_table.c.provider_name\u003d\u003dprovider_name).distinct("},{"line_number":190,"context_line":"                snapshot_image_table.c.image_name).all()]"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def getSnapshotImages(self):"},{"line_number":193,"context_line":"        return self.session.query(SnapshotImage).order_by("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F7rU%3D","line":190,"in_reply_to":"AAAAQ3%2F%2F%2FGc%3D","updated":"2013-08-12 20:49:35.000000000","message":"That wasn\u0027t working terribly well, possibly due to the rest of the query.  At any rate, yeah, I cut my losses here.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"}],"nodepool.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":35,"context_line":"WATERMARK_SLEEP \u003d 5    # Interval between checking if new servers needed"},{"line_number":36,"context_line":"IMAGE_TIMEOUT \u003d 21600  # How long to wait for an image save"},{"line_number":37,"context_line":"CONNECT_TIMEOUT \u003d 600  # How long to try to connect after a server is ACTIVE"},{"line_number":38,"context_line":"NODE_CLEANUP \u003d 28800   # When to start deleting a non-ready or hold node"},{"line_number":39,"context_line":"KEEP_OLD_IMAGE \u003d 86400  # How long to keep an old (good) image"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class NodeCompleteThread(threading.Thread):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F%2FFk%3D","line":38,"updated":"2013-08-11 22:51:44.000000000","message":"Do we ever want to delete hold nodes? the nodedb.py file indicates HOLD state means hold indefinitely.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"f94cc673d19ad61323b863c5fa7a52926e03c99d","unresolved":false,"context_lines":[{"line_number":35,"context_line":"WATERMARK_SLEEP \u003d 5    # Interval between checking if new servers needed"},{"line_number":36,"context_line":"IMAGE_TIMEOUT \u003d 21600  # How long to wait for an image save"},{"line_number":37,"context_line":"CONNECT_TIMEOUT \u003d 600  # How long to try to connect after a server is ACTIVE"},{"line_number":38,"context_line":"NODE_CLEANUP \u003d 28800   # When to start deleting a non-ready or hold node"},{"line_number":39,"context_line":"KEEP_OLD_IMAGE \u003d 86400  # How long to keep an old (good) image"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class NodeCompleteThread(threading.Thread):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F7rM%3D","line":38,"in_reply_to":"AAAAQ3%2F%2F%2FFk%3D","updated":"2013-08-12 20:49:35.000000000","message":"I think with our current usage, indefinite hold is the way to go.  I think the bug here is the comment should say \"when to delete a node that is not either READY or HOLD\".","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":36,"context_line":"IMAGE_TIMEOUT \u003d 21600  # How long to wait for an image save"},{"line_number":37,"context_line":"CONNECT_TIMEOUT \u003d 600  # How long to try to connect after a server is ACTIVE"},{"line_number":38,"context_line":"NODE_CLEANUP \u003d 28800   # When to start deleting a non-ready or hold node"},{"line_number":39,"context_line":"KEEP_OLD_IMAGE \u003d 86400  # How long to keep an old (good) image"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class NodeCompleteThread(threading.Thread):"},{"line_number":42,"context_line":"    log \u003d logging.getLogger(\"nodepool.NodeCompleteThread\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F%2FFo%3D","line":39,"updated":"2013-08-11 22:51:44.000000000","message":"What do you think about writing these values out as 60 * X to make the number of minutes clearer?","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"f94cc673d19ad61323b863c5fa7a52926e03c99d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"IMAGE_TIMEOUT \u003d 21600  # How long to wait for an image save"},{"line_number":37,"context_line":"CONNECT_TIMEOUT \u003d 600  # How long to try to connect after a server is ACTIVE"},{"line_number":38,"context_line":"NODE_CLEANUP \u003d 28800   # When to start deleting a non-ready or hold node"},{"line_number":39,"context_line":"KEEP_OLD_IMAGE \u003d 86400  # How long to keep an old (good) image"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class NodeCompleteThread(threading.Thread):"},{"line_number":42,"context_line":"    log \u003d logging.getLogger(\"nodepool.NodeCompleteThread\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F7qY%3D","line":39,"in_reply_to":"AAAAQ3%2F%2F%2FFo%3D","updated":"2013-08-12 20:49:35.000000000","message":"I\u0027ll do better than that.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            except Exception:"},{"line_number":60,"context_line":"                self.log.exception(\"Further exception sending job failure:\")"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def handleJob(self):"},{"line_number":63,"context_line":"        node \u003d self.db.getNodeByHostname(self.hostname)"},{"line_number":64,"context_line":"        if not node:"},{"line_number":65,"context_line":"            raise Exception(\"Unable to find node with hostname: %s\" %"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F%2FFg%3D","line":62,"updated":"2013-08-11 22:51:44.000000000","message":"Shouldn\u0027t this be a private method to avoid potential trouble with the thread class? Same question for the thread classes below.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"f94cc673d19ad61323b863c5fa7a52926e03c99d","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            except Exception:"},{"line_number":60,"context_line":"                self.log.exception(\"Further exception sending job failure:\")"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def handleJob(self):"},{"line_number":63,"context_line":"        node \u003d self.db.getNodeByHostname(self.hostname)"},{"line_number":64,"context_line":"        if not node:"},{"line_number":65,"context_line":"            raise Exception(\"Unable to find node with hostname: %s\" %"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F7pY%3D","line":62,"in_reply_to":"AAAAQ3%2F%2F%2FFg%3D","updated":"2013-08-12 20:49:35.000000000","message":"I\u0027m not worried about it sprouting a handleJob method.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def handleCompletePhase(self, job, args, hostname):"},{"line_number":120,"context_line":"        t \u003d NodeCompleteThread(self.nodepool, job, args, hostname)"},{"line_number":121,"context_line":"        t.start()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def stop(self):"},{"line_number":124,"context_line":"        self._stopped \u003d True"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F%2FFc%3D","line":121,"updated":"2013-08-11 22:51:44.000000000","message":"Is there a specific reason the node complete phase gets a thread per job?","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"f94cc673d19ad61323b863c5fa7a52926e03c99d","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def handleCompletePhase(self, job, args, hostname):"},{"line_number":120,"context_line":"        t \u003d NodeCompleteThread(self.nodepool, job, args, hostname)"},{"line_number":121,"context_line":"        t.start()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def stop(self):"},{"line_number":124,"context_line":"        self._stopped \u003d True"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F7p8%3D","line":121,"in_reply_to":"AAAAQ3%2F%2F%2FFc%3D","updated":"2013-08-12 20:49:35.000000000","message":"It removes the node from jenkins and deletes the server synchronously.  Either of those can take a long time.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        self.log.debug(\"Launching node id: %s\" % self.node_id)"},{"line_number":139,"context_line":"        try:"},{"line_number":140,"context_line":"            self.db \u003d nodedb.NodeDatabase()"},{"line_number":141,"context_line":"            self.node \u003d self.db.getNode(self.node_id)"},{"line_number":142,"context_line":"            self.client \u003d utils.get_client(self.provider)"},{"line_number":143,"context_line":"        except Exception:"},{"line_number":144,"context_line":"            self.log.exception(\"Exception preparing to launch node id: %s:\" %"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F%2FFY%3D","line":141,"updated":"2013-08-11 22:51:44.000000000","message":"The provider, image, and target are passed in directly but not the node. Instead we must look up the node. Should we be consistent and pass in an already instantiated node object?","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"f94cc673d19ad61323b863c5fa7a52926e03c99d","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        self.log.debug(\"Launching node id: %s\" % self.node_id)"},{"line_number":139,"context_line":"        try:"},{"line_number":140,"context_line":"            self.db \u003d nodedb.NodeDatabase()"},{"line_number":141,"context_line":"            self.node \u003d self.db.getNode(self.node_id)"},{"line_number":142,"context_line":"            self.client \u003d utils.get_client(self.provider)"},{"line_number":143,"context_line":"        except Exception:"},{"line_number":144,"context_line":"            self.log.exception(\"Exception preparing to launch node id: %s:\" %"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F7p4%3D","line":141,"in_reply_to":"AAAAQ3%2F%2F%2FFY%3D","updated":"2013-08-12 20:49:35.000000000","message":"SqlAlchemy thread safety dictates no.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        threading.Thread.__init__(self)"},{"line_number":256,"context_line":"        self.provider \u003d provider"},{"line_number":257,"context_line":"        self.image \u003d image"},{"line_number":258,"context_line":"        self.snap_image_id \u003d snap_image_id"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def run(self):"},{"line_number":261,"context_line":"        self.log.debug(\"Updating image %s in %s \" % (self.image.name,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F%2FFU%3D","line":258,"updated":"2013-08-11 22:51:44.000000000","message":"Same question as in node. Should we pass in the snap_image object instead of the id?","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"}],"nodeutils.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            return addr[\u0027addr\u0027]"},{"line_number":90,"context_line":"    for addr in server.addresses.get(\u0027private\u0027, []):"},{"line_number":91,"context_line":"        # HPcloud"},{"line_number":92,"context_line":"        if addr[\u0027version\u0027] \u003d\u003d version and not addr[\u0027addr\u0027].startswith(\u002710.\u0027):"},{"line_number":93,"context_line":"            return addr[\u0027addr\u0027]"},{"line_number":94,"context_line":"    return None"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F%2FFQ%3D","line":92,"updated":"2013-08-11 22:51:44.000000000","message":"Should we exclude the other private address spaces as well? (192.168/16 and 172.16/12)","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"f94cc673d19ad61323b863c5fa7a52926e03c99d","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            return addr[\u0027addr\u0027]"},{"line_number":90,"context_line":"    for addr in server.addresses.get(\u0027private\u0027, []):"},{"line_number":91,"context_line":"        # HPcloud"},{"line_number":92,"context_line":"        if addr[\u0027version\u0027] \u003d\u003d version and not addr[\u0027addr\u0027].startswith(\u002710.\u0027):"},{"line_number":93,"context_line":"            return addr[\u0027addr\u0027]"},{"line_number":94,"context_line":"    return None"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F7oE%3D","line":92,"in_reply_to":"AAAAQ3%2F%2F%2FFQ%3D","updated":"2013-08-12 20:49:35.000000000","message":"Why not?","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        nodedb.READY: \u0027ready\u0027,"},{"line_number":251,"context_line":"        nodedb.USED: \u0027used\u0027,"},{"line_number":252,"context_line":"        nodedb.DELETE: \u0027delete\u0027,"},{"line_number":253,"context_line":"        nodedb.HOLD: \u0027hold\u0027,"},{"line_number":254,"context_line":"        }"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    for base_image in provider.base_images:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F%2FFM%3D","line":253,"updated":"2013-08-11 22:51:44.000000000","message":"We seem to have removed the ERROR state. Is that intentional? Should we try to track those nodes and keep them in the DB?","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"f94cc673d19ad61323b863c5fa7a52926e03c99d","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        nodedb.READY: \u0027ready\u0027,"},{"line_number":251,"context_line":"        nodedb.USED: \u0027used\u0027,"},{"line_number":252,"context_line":"        nodedb.DELETE: \u0027delete\u0027,"},{"line_number":253,"context_line":"        nodedb.HOLD: \u0027hold\u0027,"},{"line_number":254,"context_line":"        }"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    for base_image in provider.base_images:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F7ng%3D","line":253,"in_reply_to":"AAAAQ3%2F%2F%2FFM%3D","updated":"2013-08-12 20:49:35.000000000","message":"It didn\u0027t seem useful.  It complicates the code, and in general, whenever we report errors to providers, they just want to know the ids, they don\u0027t care if the machines are around.  So it makes sense to me to just start trying to delete them ASAP.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"}],"scripts/devstack-cache.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        for fn in os.listdir(debdir):"},{"line_number":65,"context_line":"            fn \u003d os.path.join(debdir, fn)"},{"line_number":66,"context_line":"            tokenize(fn, debs, distribution, comment\u003d\u0027#\u0027)"},{"line_number":67,"context_line":"        branch_data[\u0027debs\u0027] \u003d debs"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        images \u003d []"},{"line_number":70,"context_line":"        for line in open(os.path.join(DEVSTACK, \u0027stackrc\u0027)):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F%2FFI%3D","line":67,"updated":"2013-08-11 22:51:44.000000000","message":"This seems pretty ubuntu/debian specific. Probably fine for now but will need to be addressed if we add RHEL/CentOS/Fedora images to the gate.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"f94cc673d19ad61323b863c5fa7a52926e03c99d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        for fn in os.listdir(debdir):"},{"line_number":65,"context_line":"            fn \u003d os.path.join(debdir, fn)"},{"line_number":66,"context_line":"            tokenize(fn, debs, distribution, comment\u003d\u0027#\u0027)"},{"line_number":67,"context_line":"        branch_data[\u0027debs\u0027] \u003d debs"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        images \u003d []"},{"line_number":70,"context_line":"        for line in open(os.path.join(DEVSTACK, \u0027stackrc\u0027)):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F7nI%3D","line":67,"in_reply_to":"AAAAQ3%2F%2F%2FFI%3D","updated":"2013-08-12 20:49:35.000000000","message":"This is all current devstack-gate code; changing it is out of scope (and switching to dib is probably the way to go about changing it).","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"}],"scripts/prepare_devstack.sh":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"528d0e4e9aaeba817ed931ca255d8d1e22d545df","unresolved":false,"context_lines":[{"line_number":21,"context_line":"sudo DEBIAN_FRONTEND\u003dnoninteractive apt-get \\"},{"line_number":22,"context_line":"  --option \"Dpkg::Options::\u003d--force-confold\" \\"},{"line_number":23,"context_line":"  --assume-yes install build-essential python-dev \\"},{"line_number":24,"context_line":"  linux-headers-virtual linux-headers-`uname -r`"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"rm -rf ~/workspace-cache"},{"line_number":27,"context_line":"mkdir -p ~/workspace-cache"}],"source_content_type":"text/x-sh","patch_set":2,"id":"AAAAQ3%2F%2F%2FFE%3D","line":24,"updated":"2013-08-11 22:51:44.000000000","message":"Do we need to run apt-get update and apt-get dist-upgrade as well? Also, this is very debian specific too.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"f94cc673d19ad61323b863c5fa7a52926e03c99d","unresolved":false,"context_lines":[{"line_number":21,"context_line":"sudo DEBIAN_FRONTEND\u003dnoninteractive apt-get \\"},{"line_number":22,"context_line":"  --option \"Dpkg::Options::\u003d--force-confold\" \\"},{"line_number":23,"context_line":"  --assume-yes install build-essential python-dev \\"},{"line_number":24,"context_line":"  linux-headers-virtual linux-headers-`uname -r`"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"rm -rf ~/workspace-cache"},{"line_number":27,"context_line":"mkdir -p ~/workspace-cache"}],"source_content_type":"text/x-sh","patch_set":2,"id":"AAAAQ3%2F%2F7mw%3D","line":24,"in_reply_to":"AAAAQ3%2F%2F%2FFE%3D","updated":"2013-08-12 20:49:35.000000000","message":"This is current devstack-gate code, from the update image script.","commit_id":"ee169b6bbae0ae16364e1cde9211f4382ea56f69"}]}
