)]}'
{"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"ed2615a54dfa5dd69d76e682f5afcdd29e6713ca","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                        use_slave\u003duse_slave)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"def service_get_minimum_version(context, binary, use_slave\u003dFalse):"},{"line_number":444,"context_line":"    session \u003d get_session()"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_4dfd2439","line":443,"updated":"2015-09-15 15:43:45.000000000","message":"Do you think we need a mechanism for filtering out \"down\" services?  You could have an older, malfunctioning service host where it still has a DB entry, but service group API already knows it\u0027s dead/unresponsive.  In that case, you could have one screwed up compute in a pool of thousands and it would hold back the auto rpc versioning bit.  \n\nYou could also make the argument that the service record should be deleted at that point, but it might be nice to filter out dead services.","commit_id":"4f7fca6e69a686a6bb943ef2b7dea9dc6716ff60"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"feb02c5624dc1483cf3512e797d37fc18b65f695","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                        use_slave\u003duse_slave)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"def service_get_minimum_version(context, binary, use_slave\u003dFalse):"},{"line_number":444,"context_line":"    session \u003d get_session()"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_eaeff784","line":443,"in_reply_to":"ba15a1d1_1054df1e","updated":"2015-09-17 00:17:30.000000000","message":"So, right now, you can choose whatever version you want by setting the pin, and this code is only used if you set it to auto.\n\nI think my preference is that we:\n\n 1. Don\u0027t filter downed services\n 2. Do filter force_down services\n 3. Punt too much thinking about this until we\n see how that goes, and before we default to auto.\n We\u0027re likely to get some feedback before then, and\n perhaps we need another flag to say \"down for a\n while, don\u0027t let this service hold you back\".\n\nReasonable?","commit_id":"4f7fca6e69a686a6bb943ef2b7dea9dc6716ff60"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0fd1d8980b4ff10ab143321857b8889393d50897","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                        use_slave\u003duse_slave)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"def service_get_minimum_version(context, binary, use_slave\u003dFalse):"},{"line_number":444,"context_line":"    session \u003d get_session()"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_656011a6","line":443,"in_reply_to":"ba15a1d1_4dfd2439","updated":"2015-09-16 13:55:07.000000000","message":"Well, I don\u0027t think that filtering down services is what we normally want. A service is down because it hasn\u0027t reported in a minute or whatever. If the cluster decides to start sending newer RPC than that node can handle because it briefly goes down for a minute, that seems problematic to me. We have a force_down flag, so we could filter those for sure, or we could come up with some different scheme. However, just filtering downed nodes doesn\u0027t seem right to me.","commit_id":"4f7fca6e69a686a6bb943ef2b7dea9dc6716ff60"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"402d3497e232101abfa5438031ae7a865d8ea74b","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                        use_slave\u003duse_slave)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"def service_get_minimum_version(context, binary, use_slave\u003dFalse):"},{"line_number":444,"context_line":"    session \u003d get_session()"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_1054df1e","line":443,"in_reply_to":"ba15a1d1_656011a6","updated":"2015-09-16 21:24:01.000000000","message":"So, I\u0027m torn here. That really depends on what the operator wants. Say that I have 100+ compute nodes to upgrade but I don\u0027t want to wait for all of them to be newer in order to have the latest RPC version (like having 10 of them being disabled), I could prefer to only check by active services (ie. not disabled) and make sure that I would upgrade my disabled nodes before putting them back \u0027in rotation\u0027 (to act like roundrobin load-balancers).\n\nOn the other hand, since I could be a lazy operator, I would prefer not to trust me and really make sure that the RPC version is changed only when all my nodes (incl. disabled) are upgraded.\n\n\nAnyway, all of that is about disabled services, not about up services since I agree with Dan, flapping services could be bad for that.","commit_id":"4f7fca6e69a686a6bb943ef2b7dea9dc6716ff60"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cabd1eed6bad3e7a0e1e76c992fde5f1348843a8","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                        use_slave\u003duse_slave)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"def service_get_minimum_version(context, binary, use_slave\u003dFalse):"},{"line_number":444,"context_line":"    session \u003d get_session()"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_750bbb2a","line":443,"in_reply_to":"ba15a1d1_eaeff784","updated":"2015-09-17 08:17:16.000000000","message":"Yeah, I considered that and if operators want to filter out by disabled services, we could discuss that later, not do that now because it\u0027s not yet really needed by those (and they can actually do what they want just by setting the upgrade level)\n\nAnd yeah, we should filter out by force_down.","commit_id":"4f7fca6e69a686a6bb943ef2b7dea9dc6716ff60"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"ed2615a54dfa5dd69d76e682f5afcdd29e6713ca","unresolved":false,"context_lines":[{"line_number":444,"context_line":"    session \u003d get_session()"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("},{"line_number":447,"context_line":"            func.min(models.Service.version).label(\"min_ver\")).filter("},{"line_number":448,"context_line":"                models.Service.binary \u003d\u003d binary).first()[0]"},{"line_number":449,"context_line":"    return min_version"},{"line_number":450,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_88148a44","line":447,"updated":"2015-09-15 15:43:45.000000000","message":"The label isn\u0027t used?","commit_id":"4f7fca6e69a686a6bb943ef2b7dea9dc6716ff60"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0fd1d8980b4ff10ab143321857b8889393d50897","unresolved":false,"context_lines":[{"line_number":444,"context_line":"    session \u003d get_session()"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("},{"line_number":447,"context_line":"            func.min(models.Service.version).label(\"min_ver\")).filter("},{"line_number":448,"context_line":"                models.Service.binary \u003d\u003d binary).first()[0]"},{"line_number":449,"context_line":"    return min_version"},{"line_number":450,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_a56aa97f","line":447,"in_reply_to":"ba15a1d1_88148a44","updated":"2015-09-16 13:55:07.000000000","message":"Yeah, was just copying and pasting from something else :)","commit_id":"4f7fca6e69a686a6bb943ef2b7dea9dc6716ff60"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"402d3497e232101abfa5438031ae7a865d8ea74b","unresolved":false,"context_lines":[{"line_number":444,"context_line":"    session \u003d get_session()"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("},{"line_number":447,"context_line":"            func.min(models.Service.version).label(\"min_ver\")).filter("},{"line_number":448,"context_line":"                models.Service.binary \u003d\u003d binary).first()[0]"},{"line_number":449,"context_line":"    return min_version"},{"line_number":450,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_3028039a","line":447,"in_reply_to":"ba15a1d1_a56aa97f","updated":"2015-09-16 21:24:01.000000000","message":"Yeah, that\u0027s not necessary","commit_id":"4f7fca6e69a686a6bb943ef2b7dea9dc6716ff60"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"0735cbb47d58d9d1c556f39817dcd565bfedbe2c","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                        use_slave\u003duse_slave)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"def service_get_minimum_version(context, binary, use_slave\u003dFalse):"},{"line_number":444,"context_line":"    session \u003d get_session()"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("}],"source_content_type":"text/x-python","patch_set":3,"id":"9a1a9d01_5bbd61d6","line":443,"updated":"2015-09-30 14:49:21.000000000","message":"This use_slave kwarg isn\u0027t used anywhere\n\n(Not that I really understand what this slavery business is all about)","commit_id":"11e25013f6737012ff94d4ef75466d647ce4f800"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"101452ef9cea39ff5de8ea037d3dcd08a51402a1","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                        use_slave\u003duse_slave)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"def service_get_minimum_version(context, binary, use_slave\u003dFalse):"},{"line_number":444,"context_line":"    session \u003d get_session()"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("}],"source_content_type":"text/x-python","patch_set":3,"id":"9a1a9d01_b975a032","line":443,"in_reply_to":"9a1a9d01_36df643b","updated":"2015-09-30 16:46:41.000000000","message":"Honoring use_slave seems appropriate here.  At worst a service would end up finding a min that\u0027s no longer the min, but our upgrade rules mean that it should still work.","commit_id":"11e25013f6737012ff94d4ef75466d647ce4f800"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"65252454f79912d0f79572af09909feb45fe774b","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                        use_slave\u003duse_slave)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"def service_get_minimum_version(context, binary, use_slave\u003dFalse):"},{"line_number":444,"context_line":"    session \u003d get_session()"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("}],"source_content_type":"text/x-python","patch_set":3,"id":"9a1a9d01_36df643b","line":443,"in_reply_to":"9a1a9d01_5bbd61d6","updated":"2015-09-30 15:03:33.000000000","message":"I know it\u0027s not, but it\u0027s been something we\u0027ve been trying to add universally. I\u0027m not sure if this should really honor the flag or not. However, since the object is part of the RPC API, I wanted to make sure it was there so we didn\u0027t have to rev the versions to get it. The client may ask for slaveness or not, but it doesn\u0027t actually know (or need to know) whether it was honored.\n\nSo, keeping with my goal, I could either:\n\n 1. Remove it from this and just ignore it at the object layer until later if/when we care\n 2. Make this code honor it now\n\nI guess I should go with #2 until someone complains. Reading a stale version from the DB could make things choose poorly, but it won\u0027t change much and being a few seconds late wouldn\u0027t likely be a tight enough window to cause trouble. You\u0027d have to upgrade a bunch of code and SIGHUP services inside the window of replication delay from your master to slave servers.","commit_id":"11e25013f6737012ff94d4ef75466d647ce4f800"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"20f5fe7cd1c9121a119e6c0eba94ce867a76daf5","unresolved":false,"context_lines":[{"line_number":444,"context_line":"    session \u003d get_session(use_slave\u003duse_slave)"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("},{"line_number":447,"context_line":"            func.min(models.Service.version)).\\"},{"line_number":448,"context_line":"                             filter(models.Service.binary \u003d\u003d binary).\\"},{"line_number":449,"context_line":"                             filter(models.Service.forced_down \u003d\u003d false()).\\"},{"line_number":450,"context_line":"                             first()[0]"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_c0cdf066","line":447,"updated":"2015-09-30 20:26:14.000000000","message":"Would this fail on the first service check of a particular type?  It doesn\u0027t seem to cause an issue in the later patch using it, but I\u0027m not sure if there\u0027s any reason this couldn\u0027t be empty.  Or is the service record for the current service created before querying this?","commit_id":"49a5989f78ec87bafdf3d0e185750f33854ddf28"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"332c321c33afb55a27eb61c195baf3a437fe29c0","unresolved":false,"context_lines":[{"line_number":444,"context_line":"    session \u003d get_session(use_slave\u003duse_slave)"},{"line_number":445,"context_line":"    with session.begin():"},{"line_number":446,"context_line":"        min_version \u003d session.query("},{"line_number":447,"context_line":"            func.min(models.Service.version)).\\"},{"line_number":448,"context_line":"                             filter(models.Service.binary \u003d\u003d binary).\\"},{"line_number":449,"context_line":"                             filter(models.Service.forced_down \u003d\u003d false()).\\"},{"line_number":450,"context_line":"                             first()[0]"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_b1335062","line":447,"in_reply_to":"9a1a9d01_c0cdf066","updated":"2015-10-01 13:56:01.000000000","message":"you\u0027ll always get a row back for the aggregate function, even if NULL, but also, instead of `query.first()[0]`, call `query.scalar()`.","commit_id":"49a5989f78ec87bafdf3d0e185750f33854ddf28"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46f820ed67553b7b55def17683d5fc1093d3fa05","unresolved":false,"context_lines":[{"line_number":446,"context_line":"        min_version \u003d session.query("},{"line_number":447,"context_line":"            func.min(models.Service.version)).\\"},{"line_number":448,"context_line":"                             filter(models.Service.binary \u003d\u003d binary).\\"},{"line_number":449,"context_line":"                             filter(models.Service.forced_down \u003d\u003d false()).\\"},{"line_number":450,"context_line":"                             scalar()"},{"line_number":451,"context_line":"    return min_version"},{"line_number":452,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_bea3d89d","line":449,"updated":"2015-10-02 20:51:38.000000000","message":"++","commit_id":"67e5738556d48a19d3d7a6566c7dc1b6886eeb5b"}],"nova/objects/service.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"402d3497e232101abfa5438031ae7a865d8ea74b","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        version \u003d db.service_get_minimum_version(context, binary,"},{"line_number":259,"context_line":"                                                 use_slave\u003duse_slave)"},{"line_number":260,"context_line":"        # NOTE(danms): Since our return value is not controlled by object"},{"line_number":261,"context_line":"        # schema, be explicit here."},{"line_number":262,"context_line":"        return int(version)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_eb8e2078","line":261,"updated":"2015-09-16 21:24:01.000000000","message":"fair to say that but I wonder if it\u0027s really necessary to cast into an integer since the DB model is an integer and defaulted to 0, nope?\n\nWe could just add an unittest in the DB for making sure that\u0027s still an integer if needed ?","commit_id":"4f7fca6e69a686a6bb943ef2b7dea9dc6716ff60"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cabd1eed6bad3e7a0e1e76c992fde5f1348843a8","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        version \u003d db.service_get_minimum_version(context, binary,"},{"line_number":259,"context_line":"                                                 use_slave\u003duse_slave)"},{"line_number":260,"context_line":"        # NOTE(danms): Since our return value is not controlled by object"},{"line_number":261,"context_line":"        # schema, be explicit here."},{"line_number":262,"context_line":"        return int(version)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_b5463379","line":261,"in_reply_to":"ba15a1d1_8a53db6a","updated":"2015-09-17 08:17:16.000000000","message":"Fair enough, I see your point. Casting to an integer isn\u0027t that greedy (both in memory and CPU) so we can leave that explicit","commit_id":"4f7fca6e69a686a6bb943ef2b7dea9dc6716ff60"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"feb02c5624dc1483cf3512e797d37fc18b65f695","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        version \u003d db.service_get_minimum_version(context, binary,"},{"line_number":259,"context_line":"                                                 use_slave\u003duse_slave)"},{"line_number":260,"context_line":"        # NOTE(danms): Since our return value is not controlled by object"},{"line_number":261,"context_line":"        # schema, be explicit here."},{"line_number":262,"context_line":"        return int(version)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_8a53db6a","line":261,"in_reply_to":"ba15a1d1_eb8e2078","updated":"2015-09-17 00:17:30.000000000","message":"Yeah, maybe I\u0027m being too pedantic here, but I wanted to avoid the kind of situation we had previously where we returned the value from, or coerced the value in the persistence layer. For example, postgres could return a long here, and maybe some other db could return a float or a string for some reason. But, maybe too literal I guess.","commit_id":"4f7fca6e69a686a6bb943ef2b7dea9dc6716ff60"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"20f5fe7cd1c9121a119e6c0eba94ce867a76daf5","unresolved":false,"context_lines":[{"line_number":49,"context_line":"# in the cluster are at the same level."},{"line_number":50,"context_line":"SERVICE_VERSION_HISTORY \u003d ("},{"line_number":51,"context_line":"    # Version 0: Pre-history"},{"line_number":52,"context_line":"    {\u0027compute_rpc\u0027: \u00274.0\u0027},"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    # Version 1: Introduction of SERVICE_VERSION"},{"line_number":55,"context_line":"    {\u0027compute_rpc\u0027: \u00274.4\u0027},"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_c0fbb077","line":52,"updated":"2015-09-30 20:26:14.000000000","message":"Is this related?","commit_id":"49a5989f78ec87bafdf3d0e185750f33854ddf28"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"f088e8038d0e41ed67698261e05580d438eabec7","unresolved":false,"context_lines":[{"line_number":49,"context_line":"# in the cluster are at the same level."},{"line_number":50,"context_line":"SERVICE_VERSION_HISTORY \u003d ("},{"line_number":51,"context_line":"    # Version 0: Pre-history"},{"line_number":52,"context_line":"    {\u0027compute_rpc\u0027: \u00274.0\u0027},"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    # Version 1: Introduction of SERVICE_VERSION"},{"line_number":55,"context_line":"    {\u0027compute_rpc\u0027: \u00274.4\u0027},"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a2fa921_bca9e9e1","line":52,"updated":"2015-10-05 14:40:39.000000000","message":"back dating pre-history isn\u0027t a problem?","commit_id":"d4e4a5f744b445ac86a5d06f8c6f95c9ebb77199"}],"nova/tests/unit/db/test_db_api.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"39c2d99ccc616f067af07e1a7c039cfc3159ad79","unresolved":false,"context_lines":[{"line_number":3177,"context_line":"        self._create_service({\u0027version\u0027: 3,"},{"line_number":3178,"context_line":"                              \u0027host\u0027: \u0027host3\u0027,"},{"line_number":3179,"context_line":"                              \u0027binary\u0027: \u0027compute\u0027,"},{"line_number":3180,"context_line":"                              \u0027forced_down\u0027: True})"},{"line_number":3181,"context_line":"        self.assertEqual(2, db.service_get_minimum_version(self.ctxt,"},{"line_number":3182,"context_line":"                                                           \u0027compute\u0027))"},{"line_number":3183,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_19c7a746","line":3180,"updated":"2015-10-02 01:50:24.000000000","message":"It doesn\u0027t seem helpful to put forced_down \u003d True on a higher version since the query filters out forced_down services. Maybe we would want to set it True on a service with version 1 to verify that version 1 isn\u0027t chosen as the minimum","commit_id":"31d2f247d17b89f0bfefe9ae1916b22ad545ae00"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"9240236318a28e3d397d562339a32d21dd0167d9","unresolved":false,"context_lines":[{"line_number":3177,"context_line":"        self._create_service({\u0027version\u0027: 3,"},{"line_number":3178,"context_line":"                              \u0027host\u0027: \u0027host3\u0027,"},{"line_number":3179,"context_line":"                              \u0027binary\u0027: \u0027compute\u0027,"},{"line_number":3180,"context_line":"                              \u0027forced_down\u0027: True})"},{"line_number":3181,"context_line":"        self.assertEqual(2, db.service_get_minimum_version(self.ctxt,"},{"line_number":3182,"context_line":"                                                           \u0027compute\u0027))"},{"line_number":3183,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_6bd6e428","line":3180,"in_reply_to":"9a1a9d01_19c7a746","updated":"2015-10-02 20:06:48.000000000","message":"Ah, yep, this is what I intended to do of course.","commit_id":"31d2f247d17b89f0bfefe9ae1916b22ad545ae00"}]}
