)]}'
{"doc/api_samples/os-extended-services-delete/services-get-resp.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            \"binary\": \"nova-compute\","},{"line_number":33,"context_line":"            \"host\": \"host2\","},{"line_number":34,"context_line":"            \"state\": \"down\","},{"line_number":35,"context_line":"            \"status\": \"disabled\","},{"line_number":36,"context_line":"            \"updated_at\": \"2012-09-18T08:03:38.000000\","},{"line_number":37,"context_line":"            \"zone\": \"nova\""},{"line_number":38,"context_line":"        }"}],"source_content_type":"application/json","patch_set":19,"id":"AAAAUX%2F%2BXxA%3D","line":35,"updated":"2014-02-21 16:09:57.000000000","message":"Should this be enabled?  I\u0027m trying to follow the pattern you have here, the first two for host1 are up/disabled so was expecting host2 to be down/enabled for both, or are you just doing permutations?\n\nNow that I\u0027ve gone through the full review it looks like this is just coming from the v3 sample response so nevermind.","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"}],"doc/v3/api_samples/os-services/services-list-get-resp.json":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"168e880613d5ab68d17c5bfeb8cbc7312260298e","unresolved":false,"context_lines":[{"line_number":4,"context_line":"            \"binary\": \"nova-scheduler\","},{"line_number":5,"context_line":"            \"disabled_reason\": \"test1\","},{"line_number":6,"context_line":"            \"host\": \"host1\","},{"line_number":7,"context_line":"            \"id\": 1,"},{"line_number":8,"context_line":"            \"state\": \"up\","},{"line_number":9,"context_line":"            \"status\": \"disabled\","},{"line_number":10,"context_line":"            \"updated_at\": \"2012-10-29T13:42:02.000000\","}],"source_content_type":"application/json","patch_set":11,"id":"AAAATn%2F%2BiO4%3D","line":7,"updated":"2013-11-25 00:44:02.000000000","message":"I think you should be generating os-services-extended-foo api samples. The os-services ones (without os-services-delete enabled) should remain the same","commit_id":"4f9281dbc2a084fd54f28380084e6eae94c5ca71"}],"nova/api/openstack/compute/contrib/extended_services.py":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"168e880613d5ab68d17c5bfeb8cbc7312260298e","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    alias \u003d \"os-extended-services\""},{"line_number":9,"context_line":"    namespace \u003d (\"http://docs.openstack.org/compute/ext/\""},{"line_number":10,"context_line":"                \"extended_services/api/v2\")"},{"line_number":11,"context_line":"    updated \u003d \"2013-11-18T00:00:00-00:00\""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BiOM%3D","line":11,"updated":"2013-11-25 00:44:02.000000000","message":"Sorry you can\u0027t just update the timestamp on this, you\u0027ll need to create a new extension on which the presence of the id is dependent on","commit_id":"4f9281dbc2a084fd54f28380084e6eae94c5ca71"}],"nova/api/openstack/compute/contrib/extended_services_delete.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f823409507d82f63cfa0e9abbc99dbf34443cd99","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from nova.api.openstack import extensions"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"class Extended_services_delete(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fvik%3D","line":1,"updated":"2014-01-02 15:29:56.000000000","message":"this is missing the license header","commit_id":"ef61cbbf0c351f9dc889f32e55aa6183ba730e97"}],"nova/api/openstack/compute/contrib/services.py":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"dce358237a7a1fea42358253b6bbff15254d6a54","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        \"\"\"Deletes the specified service.\"\"\""},{"line_number":137,"context_line":"        if (not self.ext_mgr or"},{"line_number":138,"context_line":"                not self.ext_mgr.is_loaded(\u0027os-services-delete\u0027)):"},{"line_number":139,"context_line":"            raise webob.exc.HTTPBadRequest()"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":142,"context_line":"        authorize(context)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAARn%2F%2F2Rg%3D","line":139,"updated":"2013-08-21 07:44:43.000000000","message":"I think HTTPNotFound is more appropriate","commit_id":"2d2366c3d08421d39e69e4ca3c2a51051f9a72b5"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"168e880613d5ab68d17c5bfeb8cbc7312260298e","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def construct(self):"},{"line_number":36,"context_line":"        root \u003d xmlutil.TemplateElement(\u0027services\u0027)"},{"line_number":37,"context_line":"        elem \u003d xmlutil.SubTemplateElement(root, \u0027service\u0027, selector\u003d\u0027services\u0027)"},{"line_number":38,"context_line":"        elem.set(\u0027id\u0027)"},{"line_number":39,"context_line":"        elem.set(\u0027binary\u0027)"},{"line_number":40,"context_line":"        elem.set(\u0027host\u0027)"},{"line_number":41,"context_line":"        elem.set(\u0027zone\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BiPI%3D","line":38,"updated":"2013-11-25 00:44:02.000000000","message":"This should only be added if os-extended-services-foo is present","commit_id":"4f9281dbc2a084fd54f28380084e6eae94c5ca71"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"c661493fc6c73d5b133bb32ce76908f980b00a2c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def construct(self):"},{"line_number":36,"context_line":"        root \u003d xmlutil.TemplateElement(\u0027services\u0027)"},{"line_number":37,"context_line":"        elem \u003d xmlutil.SubTemplateElement(root, \u0027service\u0027, selector\u003d\u0027services\u0027)"},{"line_number":38,"context_line":"        elem.set(\u0027id\u0027)"},{"line_number":39,"context_line":"        elem.set(\u0027binary\u0027)"},{"line_number":40,"context_line":"        elem.set(\u0027host\u0027)"},{"line_number":41,"context_line":"        elem.set(\u0027zone\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2Bh0U%3D","line":38,"in_reply_to":"AAAATn%2F%2BiNk%3D","updated":"2013-11-25 03:28:16.000000000","message":"ah yep, as long as a check is added below so id is not added to the JSON, this should be fine.","commit_id":"4f9281dbc2a084fd54f28380084e6eae94c5ca71"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"39258cee46565c988d6eb00732eeb295da8c0a50","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def construct(self):"},{"line_number":36,"context_line":"        root \u003d xmlutil.TemplateElement(\u0027services\u0027)"},{"line_number":37,"context_line":"        elem \u003d xmlutil.SubTemplateElement(root, \u0027service\u0027, selector\u003d\u0027services\u0027)"},{"line_number":38,"context_line":"        elem.set(\u0027id\u0027)"},{"line_number":39,"context_line":"        elem.set(\u0027binary\u0027)"},{"line_number":40,"context_line":"        elem.set(\u0027host\u0027)"},{"line_number":41,"context_line":"        elem.set(\u0027zone\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BiNk%3D","line":38,"in_reply_to":"AAAATn%2F%2BiPI%3D","updated":"2013-11-25 00:53:41.000000000","message":"Chris, I think that we can keep here as it is for now, as the related logic will help handle if id will be used considering if extension is loaded or not. Comments?\n\nI noticed that patch I87a4affc45160796ff11c7b03e591e6aba73d62a is also using same logic.","commit_id":"4f9281dbc2a084fd54f28380084e6eae94c5ca71"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"168e880613d5ab68d17c5bfeb8cbc7312260298e","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                     \u0027status\u0027: active, \u0027state\u0027: state,"},{"line_number":111,"context_line":"                     \u0027updated_at\u0027: svc[\u0027updated_at\u0027]}"},{"line_number":112,"context_line":"        if detailed:"},{"line_number":113,"context_line":"            service_detail[\u0027id\u0027] \u003d svc[\u0027id\u0027]"},{"line_number":114,"context_line":"            service_detail[\u0027disabled_reason\u0027] \u003d svc[\u0027disabled_reason\u0027]"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        return service_detail"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BiPM%3D","line":113,"updated":"2013-11-25 00:44:02.000000000","message":"This should only be added if os-extended-services is present","commit_id":"4f9281dbc2a084fd54f28380084e6eae94c5ca71"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f823409507d82f63cfa0e9abbc99dbf34443cd99","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        try:"},{"line_number":146,"context_line":"            self.host_api.service_delete(context, id)"},{"line_number":147,"context_line":"        except exception.ServiceNotFound:"},{"line_number":148,"context_line":"            explanation \u003d _(\"Service not found.\")"},{"line_number":149,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003dexplanation)"},{"line_number":150,"context_line":"        return webob.exc.HTTPNoContent()"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2FviI%3D","line":148,"updated":"2014-01-02 15:29:56.000000000","message":"it may be worthwhile to show the id here","commit_id":"ef61cbbf0c351f9dc889f32e55aa6183ba730e97"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"4a962e7f117eea6be5824e2ad12e019ce18ccb8c","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        authorize(context)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        try:"},{"line_number":146,"context_line":"            id \u003d int(id)"},{"line_number":147,"context_line":"        except ValueError:"},{"line_number":148,"context_line":"            msg \u003d _(\"\u0027id\u0027 must be an integer\")"},{"line_number":149,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2FtGk%3D","line":146,"updated":"2014-01-09 12:00:33.000000000","message":"Is this going to work in the case of cells ?\n\nLooking at the code in cells/manager.py it looks as if a service id in the context of cells is expressed as \"Cell@service_id\"","commit_id":"86c11b61974453746b686b5ee401a67453859339"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"95a0daba3f5c6ea4affd0a499875f647f696d95b","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        \"\"\"Deletes the specified service.\"\"\""},{"line_number":136,"context_line":"        if (not self.ext_mgr or"},{"line_number":137,"context_line":"                not self.ext_mgr.is_loaded(\u0027os-extended-services-delete\u0027)):"},{"line_number":138,"context_line":"            raise webob.exc.HTTPNotFound()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":141,"context_line":"        authorize(context)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2BYmw%3D","line":138,"updated":"2014-02-21 14:01:17.000000000","message":"I think 405 Method Not Allowed is more appropriate than 404 Not Found here","commit_id":"af618657d22ba8162604f048d4c86b2269ac1341"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"95a0daba3f5c6ea4affd0a499875f647f696d95b","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        except exception.ServiceNotFound:"},{"line_number":146,"context_line":"            explanation \u003d _(\"Service %s not found.\") % id"},{"line_number":147,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003dexplanation)"},{"line_number":148,"context_line":"        return webob.exc.HTTPNoContent()"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    @wsgi.serializers(xml\u003dServicesIndexTemplate)"},{"line_number":151,"context_line":"    def index(self, req):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2BYls%3D","line":148,"updated":"2014-02-21 14:01:17.000000000","message":"You can also use the @wsgi.response(204) decorator on this method instead of this return ... both appear to work fine though","commit_id":"af618657d22ba8162604f048d4c86b2269ac1341"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def delete(self, req, id):"},{"line_number":135,"context_line":"        \"\"\"Deletes the specified service.\"\"\""},{"line_number":136,"context_line":"        if (not self.ext_mgr or"},{"line_number":137,"context_line":"                not self.ext_mgr.is_loaded(\u0027os-extended-services-delete\u0027)):"},{"line_number":138,"context_line":"            raise webob.exc.HTTPMethodNotAllowed()"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXu8%3D","line":136,"updated":"2014-02-21 16:09:57.000000000","message":"Why would self.ext_mgr be None here and not in say index (_get_service_detail)?","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ac544606bba16979bbd49432b21e205d92d65c85","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    @wsgi.response(204)"},{"line_number":135,"context_line":"    def delete(self, req, id):"},{"line_number":136,"context_line":"        \"\"\"Deletes the specified service.\"\"\""},{"line_number":137,"context_line":"        if not self.ext_mgr.is_loaded(\u0027os-extended-services-delete\u0027):"},{"line_number":138,"context_line":"            raise webob.exc.HTTPMethodNotAllowed()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2BTSw%3D","line":137,"updated":"2014-02-22 03:00:05.000000000","message":"Can you explain why it was checking if self.ext_mgr was None before?","commit_id":"ac3972b0bc44fbda4d3669ae3fbb740969758de0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c6b805dfc98ec63ddd2919ad30cd8314f04034f3","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    @wsgi.response(204)"},{"line_number":135,"context_line":"    def delete(self, req, id):"},{"line_number":136,"context_line":"        \"\"\"Deletes the specified service.\"\"\""},{"line_number":137,"context_line":"        if not self.ext_mgr.is_loaded(\u0027os-extended-services-delete\u0027):"},{"line_number":138,"context_line":"            raise webob.exc.HTTPMethodNotAllowed()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2BR%2Bw%3D","line":137,"in_reply_to":"AAAAUX%2F%2BS%2Fg%3D","updated":"2014-02-22 14:04:37.000000000","message":"Chris, thanks for the history on this, I feel safe about it now.","commit_id":"ac3972b0bc44fbda4d3669ae3fbb740969758de0"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"685cbc60089d625ccb04ab1132d0285669ad15da","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    @wsgi.response(204)"},{"line_number":135,"context_line":"    def delete(self, req, id):"},{"line_number":136,"context_line":"        \"\"\"Deletes the specified service.\"\"\""},{"line_number":137,"context_line":"        if not self.ext_mgr.is_loaded(\u0027os-extended-services-delete\u0027):"},{"line_number":138,"context_line":"            raise webob.exc.HTTPMethodNotAllowed()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2BS%2Fg%3D","line":137,"in_reply_to":"AAAAUX%2F%2BTBo%3D","updated":"2014-02-22 04:28:17.000000000","message":"So I\u0027m guessing this default None is a cut-and-paste issue that used to be a problem with an older V2 api extension. ext_mgr should never be None in any real situation. But somewhere along the line someone took a shortcut with a unittest and not wanting to initialise an ext_mgr, just allowed None to passed instead. And then that spread around by cut and paste as people created new extensions even where it wasn\u0027t really needed.","commit_id":"ac3972b0bc44fbda4d3669ae3fbb740969758de0"},{"author":{"_account_id":7231,"name":"Jason Dillaman","username":"jdillaman","inactive":true},"change_message_id":"a667ebfc16966c039e77722ff63ca18635efa0ab","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    @wsgi.response(204)"},{"line_number":135,"context_line":"    def delete(self, req, id):"},{"line_number":136,"context_line":"        \"\"\"Deletes the specified service.\"\"\""},{"line_number":137,"context_line":"        if not self.ext_mgr.is_loaded(\u0027os-extended-services-delete\u0027):"},{"line_number":138,"context_line":"            raise webob.exc.HTTPMethodNotAllowed()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2BTBo%3D","line":137,"in_reply_to":"AAAAUX%2F%2BTSw%3D","updated":"2014-02-22 04:16:54.000000000","message":"I felt dirty about the constructor defaulting it to None so I attempted to protect it. However, no other classes perform the same verification check (even when they also default to None) so I have yanked it here as well.  This file already had a check for ext_mgr.is_loaded(\u0027os-extended-services\u0027) that is unprotected.","commit_id":"ac3972b0bc44fbda4d3669ae3fbb740969758de0"}],"nova/api/openstack/compute/contrib/services_delete.py":[{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"98d19acc9d24dd24299f84cd69f582f7957c21bf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from nova.api.openstack import extensions"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"class ServicesDelete(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2F%2F0g%3D","line":1,"updated":"2013-08-27 01:36:54.000000000","message":"May I know why do we need this new file? Thanks!","commit_id":"2d2366c3d08421d39e69e4ca3c2a51051f9a72b5"},{"author":{"_account_id":7231,"name":"Jason Dillaman","username":"jdillaman","inactive":true},"change_message_id":"397339f120375d00ea707807fb1433ddf9a08437","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from nova.api.openstack import extensions"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"class ServicesDelete(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2F6rE%3D","line":1,"in_reply_to":"AAAASn%2F%2F%2F0g%3D","updated":"2013-08-28 00:20:05.000000000","message":"See the comment from Christopher Yeoh re: allowing clients to discover that the delete service capability is available for the v2 API","commit_id":"2d2366c3d08421d39e69e4ca3c2a51051f9a72b5"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"8213869be1d819cd06896f3a555e5ea5bf51efd1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from nova.api.openstack import extensions"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"class Services_delete(extensions.ExtensionDescriptor):"},{"line_number":5,"context_line":"    \"\"\"Services deletion support.\"\"\""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    name \u003d \"ServicesDelete\""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BiyA%3D","line":4,"updated":"2013-11-24 16:10:09.000000000","message":"Suggest change a more meaningful name for this file, such as extended_services_delete.py","commit_id":"4f9281dbc2a084fd54f28380084e6eae94c5ca71"}],"nova/api/openstack/compute/plugins/v3/services.py":[{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"5232d272eed9d1207491afda92eb362a84071b2f","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        authorize(context)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        try:"},{"line_number":126,"context_line":"            self.host_api.service_delete(context, id)"},{"line_number":127,"context_line":"        except exception.ServiceNotFound:"},{"line_number":128,"context_line":"            explanation \u003d _(\"Service not found.\")"},{"line_number":129,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003dexplanation)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2FQrY%3D","line":126,"updated":"2013-08-03 02:46:40.000000000","message":"What about add some checking to see if the service is up or not? I think that it is useless to delete an service if the service is still running as the service will come back  after deleted.\n\nI think that we should only support delete services which are stopped or disabled, comments?","commit_id":"047515666cc8521d3d2985ed68ad29aae45ea702"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"168e880613d5ab68d17c5bfeb8cbc7312260298e","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        except exception.ServiceNotFound:"},{"line_number":128,"context_line":"            explanation \u003d _(\"Service not found.\")"},{"line_number":129,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003dexplanation)"},{"line_number":130,"context_line":"        return webob.exc.HTTPNoContent()"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    @extensions.expected_errors(())"},{"line_number":133,"context_line":"    @wsgi.serializers(xml\u003dServicesIndexTemplate)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B37I%3D","line":130,"updated":"2013-11-25 00:44:02.000000000","message":"Convention for extensions is that we use the @wsgi.response(204) decorator\nand then not need to return HTTPNoContent","commit_id":"4f9281dbc2a084fd54f28380084e6eae94c5ca71"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"4a962e7f117eea6be5824e2ad12e019ce18ccb8c","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        authorize(context)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        try:"},{"line_number":127,"context_line":"            id \u003d int(id)"},{"line_number":128,"context_line":"        except ValueError:"},{"line_number":129,"context_line":"            msg \u003d _(\"\u0027id\u0027 must be an integer\")"},{"line_number":130,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2FtGY%3D","line":127,"updated":"2014-01-09 12:00:33.000000000","message":"Same comment as in the V2 API - I think in the case of cells the id will be \"cell@id\"","commit_id":"86c11b61974453746b686b5ee401a67453859339"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            self.host_api.service_delete(context, id)"},{"line_number":98,"context_line":"        except exception.ServiceNotFound:"},{"line_number":99,"context_line":"            explanation \u003d _(\"Service not found.\")"},{"line_number":100,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003dexplanation)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @extensions.expected_errors(())"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXls%3D","line":99,"updated":"2014-02-21 16:09:57.000000000","message":"nit: throw the id in the message like you did in the v2 API.","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"}],"nova/cells/messaging.py":[{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f16729f45538280eca2a7811fc0dffbc3e778083","unresolved":false,"context_lines":[{"line_number":1420,"context_line":""},{"line_number":1421,"context_line":"    def service_delete(self, ctxt, cell_name, service_id):"},{"line_number":1422,"context_line":"        \"\"\"Deletes the specified service.\"\"\""},{"line_number":1423,"context_line":"        method_kwargs \u003d dict(service_id\u003dservice_id)"},{"line_number":1424,"context_line":"        message \u003d _TargetedMessage(self, ctxt,"},{"line_number":1425,"context_line":"                                   \u0027service_delete\u0027,"},{"line_number":1426,"context_line":"                                   method_kwargs, \u0027down\u0027, cell_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAARH%2F%2F6I4%3D","line":1423,"updated":"2013-08-15 12:26:40.000000000","message":"why are you using this variable and dict() instead of just {} dictionary inline?","commit_id":"6d06145066a92c8fc70a62c5aecc4c798dc90e57"}],"nova/cells/rpcapi.py":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"827086cfa2540d2927cd747ae2fdd9b230e9ecaf","unresolved":false,"context_lines":[{"line_number":254,"context_line":"    def service_delete(self, ctxt, cell_service_id):"},{"line_number":255,"context_line":"        \"\"\"Deletes the specified service.\"\"\""},{"line_number":256,"context_line":"        self.call(ctxt, self.make_msg(\u0027service_delete\u0027,"},{"line_number":257,"context_line":"                  cell_service_id\u003dcell_service_id), version\u003d\u00271.20\u0027)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def proxy_rpc_to_manager(self, ctxt, rpc_message, topic, call\u003dFalse,"},{"line_number":260,"context_line":"                             timeout\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAASn%2F%2F1Ag%3D","line":257,"updated":"2013-08-29 03:21:51.000000000","message":"Looks like 1.20 and 1.21 have been taken now already","commit_id":"4556d05f251123d7bd7b09bbc3e9708df6eb1042"}],"nova/compute/api.py":[{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"2c22eed30c3c6babaf7769d2f1d3718c9973fa67","unresolved":false,"context_lines":[{"line_number":3071,"context_line":""},{"line_number":3072,"context_line":"    def service_delete(self, context, service_id):"},{"line_number":3073,"context_line":"        \"\"\"Deletes the specified service.\"\"\""},{"line_number":3074,"context_line":"        self.db.service_destroy(context, int(service_id))"},{"line_number":3075,"context_line":""},{"line_number":3076,"context_line":"    def instance_get_all_by_host(self, context, host_name):"},{"line_number":3077,"context_line":"        \"\"\"Return all instances on the given host.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B1YM%3D","line":3074,"updated":"2013-11-19 15:38:10.000000000","message":"Feels that this should be using the Service Object now","commit_id":"4f9281dbc2a084fd54f28380084e6eae94c5ca71"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"ac0c05d6e4d0d904c2e4bb6c30364dad37b5885f","unresolved":false,"context_lines":[{"line_number":3109,"context_line":""},{"line_number":3110,"context_line":"    def service_delete(self, context, service_id):"},{"line_number":3111,"context_line":"        \"\"\"Deletes the specified service.\"\"\""},{"line_number":3112,"context_line":"        service_obj.Service.get_by_id(context, int(service_id)).destroy()"},{"line_number":3113,"context_line":""},{"line_number":3114,"context_line":"    def instance_get_all_by_host(self, context, host_name):"},{"line_number":3115,"context_line":"        \"\"\"Return all instances on the given host.\"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAT3%2F%2FtP4%3D","line":3112,"updated":"2014-01-03 05:17:27.000000000","message":"How about we check service_id is integer at api layer? If \u0027service_id\u0027 isn\u0027t integer, it will raise exception and can\u0027t catch by decorator expected_errors. it will return unexpected error to the user.","commit_id":"12e2ed532d6d1d35e06e92f4407bf82139862d7c"}],"nova/tests/api/openstack/compute/contrib/test_services.py":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"dce358237a7a1fea42358253b6bbff15254d6a54","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        self.ext_mgr.extensions[\u0027os-services-delete\u0027] \u003d True"},{"line_number":407,"context_line":"        self.controller \u003d services.ServiceController(self.ext_mgr)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        request \u003d fakes.HTTPRequestV3.blank(\u0027/v2/fakes/os-services/1\u0027,"},{"line_number":410,"context_line":"                                            use_admin_context\u003dTrue)"},{"line_number":411,"context_line":"        request.method \u003d \u0027DELETE\u0027"},{"line_number":412,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAARn%2F%2F2QQ%3D","line":409,"updated":"2013-08-21 07:44:43.000000000","message":"This is for the V2 API so should be HTTPRequest not HTTPRequestV3\nsimilar examples below.","commit_id":"2d2366c3d08421d39e69e4ca3c2a51051f9a72b5"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"98d19acc9d24dd24299f84cd69f582f7957c21bf","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        self.ext_mgr.extensions[\u0027os-services-delete\u0027] \u003d True"},{"line_number":422,"context_line":"        self.controller \u003d services.ServiceController(self.ext_mgr)"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        request \u003d fakes.HTTPRequestV3.blank(\u0027/v2/fakes/os-services/300\u0027,"},{"line_number":425,"context_line":"                                            use_admin_context\u003dTrue)"},{"line_number":426,"context_line":"        request.method \u003d \u0027DELETE\u0027"},{"line_number":427,"context_line":"        self.assertRaises(webob.exc.HTTPNotFound,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2F%2F1c%3D","line":424,"updated":"2013-08-27 01:36:54.000000000","message":"ditto","commit_id":"2d2366c3d08421d39e69e4ca3c2a51051f9a72b5"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"98d19acc9d24dd24299f84cd69f582f7957c21bf","unresolved":false,"context_lines":[{"line_number":428,"context_line":"                          self.controller.delete, request, \u0027300\u0027)"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    def test_services_delete_not_enabled(self):"},{"line_number":431,"context_line":"        request \u003d fakes.HTTPRequestV3.blank(\u0027/v2/fakes/os-services/300\u0027,"},{"line_number":432,"context_line":"                                            use_admin_context\u003dTrue)"},{"line_number":433,"context_line":"        request.method \u003d \u0027DELETE\u0027"},{"line_number":434,"context_line":"        self.assertRaises(webob.exc.HTTPBadRequest,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2F%2F1Y%3D","line":431,"updated":"2013-08-27 01:36:54.000000000","message":"ditto","commit_id":"2d2366c3d08421d39e69e4ca3c2a51051f9a72b5"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f823409507d82f63cfa0e9abbc99dbf34443cd99","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import calendar"},{"line_number":17,"context_line":"import datetime"},{"line_number":18,"context_line":"import mock"},{"line_number":19,"context_line":"import webob.exc"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from nova.api.openstack.compute.contrib import services"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2FviA%3D","line":18,"updated":"2014-01-02 15:29:56.000000000","message":"the mock and webob should be in a separate section","commit_id":"ef61cbbf0c351f9dc889f32e55aa6183ba730e97"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":337,"context_line":"    def test_services_detail_with_delete_extension(self):"},{"line_number":338,"context_line":"        self.ext_mgr.extensions[\u0027os-extended-services-delete\u0027] \u003d True"},{"line_number":339,"context_line":"        self.controller \u003d services.ServiceController(self.ext_mgr)"},{"line_number":340,"context_line":"        self.stubs.Set(self.controller.host_api, \"service_get_all\","},{"line_number":341,"context_line":"                       fake_host_api_service_get_all)"},{"line_number":342,"context_line":"        req \u003d FakeRequest()"},{"line_number":343,"context_line":"        res_dict \u003d self.controller.index(req)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXho%3D","line":340,"updated":"2014-02-21 16:09:57.000000000","message":"Use mock instead of stubs (mox).  This is mainly a nit given how all of the other tests are doing the same thing, but you could easily use mock here.","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":448,"context_line":"        with mock.patch.object(self.controller.host_api,"},{"line_number":449,"context_line":"                               \u0027service_delete\u0027) as service_delete:"},{"line_number":450,"context_line":"            response \u003d self.controller.delete(request, \u00271\u0027)"},{"line_number":451,"context_line":"            service_delete.assert_has_calls(["},{"line_number":452,"context_line":"                mock.call(request.environ[\u0027nova.context\u0027], \u00271\u0027)])"},{"line_number":453,"context_line":"            self.assertEqual(response.status_int, 204)"},{"line_number":454,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXgI%3D","line":451,"updated":"2014-02-21 16:09:57.000000000","message":"Using assert_called_once_with is probably more appropriate...","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ac544606bba16979bbd49432b21e205d92d65c85","unresolved":false,"context_lines":[{"line_number":337,"context_line":"    def test_services_detail_with_delete_extension(self):"},{"line_number":338,"context_line":"        self.ext_mgr.extensions[\u0027os-extended-services-delete\u0027] \u003d True"},{"line_number":339,"context_line":"        self.controller \u003d services.ServiceController(self.ext_mgr)"},{"line_number":340,"context_line":"        with mock.patch.object(self.controller.host_api, \u0027service_get_all\u0027,"},{"line_number":341,"context_line":"                               side_effect\u003dfake_host_api_service_get_all):"},{"line_number":342,"context_line":"            req \u003d FakeRequest()"},{"line_number":343,"context_line":"            res_dict \u003d self.controller.index(req)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2BTSc%3D","line":340,"updated":"2014-02-22 03:00:05.000000000","message":"thanks for using mock now","commit_id":"ac3972b0bc44fbda4d3669ae3fbb740969758de0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ac544606bba16979bbd49432b21e205d92d65c85","unresolved":false,"context_lines":[{"line_number":448,"context_line":"        with mock.patch.object(self.controller.host_api,"},{"line_number":449,"context_line":"                               \u0027service_delete\u0027) as service_delete:"},{"line_number":450,"context_line":"            self.controller.delete(request, \u00271\u0027)"},{"line_number":451,"context_line":"            service_delete.assert_called_once_with("},{"line_number":452,"context_line":"                request.environ[\u0027nova.context\u0027], \u00271\u0027)"},{"line_number":453,"context_line":"            self.assertEqual(self.controller.delete.wsgi_code, 204)"},{"line_number":454,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2BTSY%3D","line":451,"updated":"2014-02-22 03:00:05.000000000","message":"thanks","commit_id":"ac3972b0bc44fbda4d3669ae3fbb740969758de0"}],"nova/tests/api/openstack/compute/plugins/v3/test_services.py":[{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f16729f45538280eca2a7811fc0dffbc3e778083","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                                            use_admin_context\u003dTrue)"},{"line_number":297,"context_line":"        request.method \u003d \u0027DELETE\u0027"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        self.mox.StubOutWithMock(self.controller.host_api, \u0027service_delete\u0027)"},{"line_number":300,"context_line":"        self.controller.host_api.service_delete("},{"line_number":301,"context_line":"            request.environ[\u0027nova.context\u0027], \u00271\u0027)"},{"line_number":302,"context_line":"        self.mox.ReplayAll()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAARH%2F%2F6Ic%3D","line":299,"updated":"2013-08-15 12:26:40.000000000","message":"please don\u0027t use mox. use mock instead","commit_id":"6d06145066a92c8fc70a62c5aecc4c798dc90e57"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f823409507d82f63cfa0e9abbc99dbf34443cd99","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import calendar"},{"line_number":16,"context_line":"import datetime"},{"line_number":17,"context_line":"import mock"},{"line_number":18,"context_line":"import webob.exc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from nova.api.openstack.compute.plugins.v3 import services"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fvh0%3D","line":17,"updated":"2014-01-02 15:29:56.000000000","message":"ditto - that is, the mock and webob should be in a separate section","commit_id":"ef61cbbf0c351f9dc889f32e55aa6183ba730e97"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f07b48298fc2eff7616f807a57bd282132a09d4d","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        self.assertFalse(self.controller._is_valid_as_reason(reason))"},{"line_number":311,"context_line":"        reason \u003d \u0027it\\\u0027s a valid reason.\u0027"},{"line_number":312,"context_line":"        self.assertTrue(self.controller._is_valid_as_reason(reason))"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def test_services_delete(self):"},{"line_number":315,"context_line":"        request \u003d fakes.HTTPRequestV3.blank(\u0027/v3/os-services/1\u0027,"},{"line_number":316,"context_line":"                                            use_admin_context\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F6RA%3D","line":313,"updated":"2014-01-06 22:15:38.000000000","message":"Would be nice to also have the test_services_delete_not_enabled unit tests here for v3 also, unless that doesn\u0027t work for some reason?","commit_id":"cfb85b539bfa8ee53e24867502fc45eacd7d9c22"},{"author":{"_account_id":7231,"name":"Jason Dillaman","username":"jdillaman","inactive":true},"change_message_id":"c7c065eefcad05a7d6173a03486fd2b65ef8c965","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        self.assertFalse(self.controller._is_valid_as_reason(reason))"},{"line_number":311,"context_line":"        reason \u003d \u0027it\\\u0027s a valid reason.\u0027"},{"line_number":312,"context_line":"        self.assertTrue(self.controller._is_valid_as_reason(reason))"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def test_services_delete(self):"},{"line_number":315,"context_line":"        request \u003d fakes.HTTPRequestV3.blank(\u0027/v3/os-services/1\u0027,"},{"line_number":316,"context_line":"                                            use_admin_context\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F3TU%3D","line":313,"in_reply_to":"AAAAUH%2F%2F6RA%3D","updated":"2014-01-07 15:21:05.000000000","message":"v2 was implemented as an extension, so it could be enabled/disabled separately from the core service API.  For v3, it is built-in to the service plugin (since at the time it was written, v3 wasn\u0027t locked down), so there is no additional extension to enable/disable.","commit_id":"cfb85b539bfa8ee53e24867502fc45eacd7d9c22"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        with mock.patch.object(self.controller.host_api,"},{"line_number":320,"context_line":"                               \u0027service_delete\u0027) as service_delete:"},{"line_number":321,"context_line":"            response \u003d self.controller.delete(request, \u00271\u0027)"},{"line_number":322,"context_line":"            service_delete.assert_has_calls(["},{"line_number":323,"context_line":"                mock.call(request.environ[\u0027nova.context\u0027], \u00271\u0027)])"},{"line_number":324,"context_line":"            self.assertEqual(self.controller.delete.wsgi_code, 204)"},{"line_number":325,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXdc%3D","line":322,"updated":"2014-02-21 16:09:57.000000000","message":"use assert_called_once_with instead","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"}],"nova/tests/cells/test_cells_manager.py":[{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f16729f45538280eca2a7811fc0dffbc3e778083","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        service_id \u003d \u00271\u0027"},{"line_number":348,"context_line":"        cell_service_id \u003d cells_utils.cell_with_item(fake_cell, service_id)"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        self.mox.StubOutWithMock(self.msg_runner, \u0027service_delete\u0027)"},{"line_number":351,"context_line":"        self.msg_runner.service_delete(self.ctxt, fake_cell, service_id)"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        self.mox.ReplayAll()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAARH%2F%2F6IY%3D","line":350,"updated":"2013-08-15 12:26:40.000000000","message":"same about mox -\u003e mock","commit_id":"6d06145066a92c8fc70a62c5aecc4c798dc90e57"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f823409507d82f63cfa0e9abbc99dbf34443cd99","unresolved":false,"context_lines":[{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":"import copy"},{"line_number":19,"context_line":"import datetime"},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from oslo.config import cfg"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fvic%3D","line":20,"updated":"2014-01-02 15:29:56.000000000","message":"this should be int he cfg section","commit_id":"ef61cbbf0c351f9dc889f32e55aa6183ba730e97"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":350,"context_line":"        with mock.patch.object(self.msg_runner,"},{"line_number":351,"context_line":"                               \u0027service_delete\u0027) as service_delete:"},{"line_number":352,"context_line":"            self.cells_manager.service_delete(self.ctxt, cell_service_id)"},{"line_number":353,"context_line":"            service_delete.assert_has_calls(["},{"line_number":354,"context_line":"                mock.call(self.ctxt, fake_cell, service_id)])"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def test_proxy_rpc_to_manager(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXcg%3D","line":353,"updated":"2014-02-21 16:09:57.000000000","message":"use assert_called_once_with","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"}],"nova/tests/cells/test_cells_rpcapi.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        expected_args \u003d {\u0027cell_service_id\u0027: cell_service_id}"},{"line_number":320,"context_line":"        self._check_result(call_info, \u0027service_delete\u0027,"},{"line_number":321,"context_line":"                           expected_args, version\u003d\u00271.26\u0027)"},{"line_number":322,"context_line":"        self.assertEqual(result, expected_result)"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def test_proxy_rpc_to_manager(self):"},{"line_number":325,"context_line":"        call_info \u003d self._stub_rpc_method(\u0027call\u0027, \u0027fake_response\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXYs%3D","line":322,"updated":"2014-02-21 16:09:57.000000000","message":"This is a roundabout way of getting around this hacking check now:\n\nhttps://review.openstack.org/#/c/73502/\n\nSo please use assertIsNone now.","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"}],"nova/tests/compute/test_host_api.py":[{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f16729f45538280eca2a7811fc0dffbc3e778083","unresolved":false,"context_lines":[{"line_number":266,"context_line":"        self.assertEqual(\u0027fake-response\u0027, result)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def test_service_delete(self):"},{"line_number":269,"context_line":"        self.mox.StubOutWithMock(self.host_api.db, \u0027service_destroy\u0027)"},{"line_number":270,"context_line":"        self.host_api.db.service_destroy(self.ctxt, 1)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        self.mox.ReplayAll()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAARH%2F%2F6IM%3D","line":269,"updated":"2013-08-15 12:26:40.000000000","message":"mox -\u003e mock","commit_id":"6d06145066a92c8fc70a62c5aecc4c798dc90e57"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f16729f45538280eca2a7811fc0dffbc3e778083","unresolved":false,"context_lines":[{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def test_service_delete(self):"},{"line_number":379,"context_line":"        cell_service_id \u003d cells_utils.cell_with_item(\u0027cell1\u0027, 1)"},{"line_number":380,"context_line":"        self.mox.StubOutWithMock(self.host_api.cells_rpcapi, \u0027service_delete\u0027)"},{"line_number":381,"context_line":"        self.host_api.cells_rpcapi.service_delete(self.ctxt, cell_service_id)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        self.mox.ReplayAll()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAARH%2F%2F6IA%3D","line":380,"updated":"2013-08-15 12:26:40.000000000","message":"same","commit_id":"6d06145066a92c8fc70a62c5aecc4c798dc90e57"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f823409507d82f63cfa0e9abbc99dbf34443cd99","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import contextlib"},{"line_number":17,"context_line":"import mock"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from nova.cells import utils as cells_utils"},{"line_number":20,"context_line":"from nova import compute"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2FviU%3D","line":17,"updated":"2014-01-02 15:29:56.000000000","message":"the import mock should be in a separate section","commit_id":"ef61cbbf0c351f9dc889f32e55aa6183ba730e97"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            get_by_id, destroy"},{"line_number":320,"context_line":"        ):"},{"line_number":321,"context_line":"            self.host_api.service_delete(self.ctxt, 1)"},{"line_number":322,"context_line":"            get_by_id.assert_has_calls([mock.call(self.ctxt, 1)])"},{"line_number":323,"context_line":"            destroy.assert_has_calls([mock.call()])"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXYI%3D","line":322,"updated":"2014-02-21 16:09:57.000000000","message":"assert_called_once_with","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        ):"},{"line_number":321,"context_line":"            self.host_api.service_delete(self.ctxt, 1)"},{"line_number":322,"context_line":"            get_by_id.assert_has_calls([mock.call(self.ctxt, 1)])"},{"line_number":323,"context_line":"            destroy.assert_has_calls([mock.call()])"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"class ComputeHostAPICellsTestCase(ComputeHostAPITestCase):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXYA%3D","line":323,"updated":"2014-02-21 16:09:57.000000000","message":"ditto","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        with mock.patch.object(self.host_api.cells_rpcapi,"},{"line_number":436,"context_line":"                               \u0027service_delete\u0027) as service_delete:"},{"line_number":437,"context_line":"            self.host_api.service_delete(self.ctxt, cell_service_id)"},{"line_number":438,"context_line":"            service_delete.assert_has_calls(["},{"line_number":439,"context_line":"                mock.call(self.ctxt, cell_service_id)])"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"    def test_instance_get_all_by_host(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXXs%3D","line":438,"updated":"2014-02-21 16:09:57.000000000","message":"assert_called_once_with","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"}],"nova/tests/integrated/test_api_samples.py":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"168e880613d5ab68d17c5bfeb8cbc7312260298e","unresolved":false,"context_lines":[{"line_number":1807,"context_line":"    extension_name \u003d (\"nova.api.openstack.compute.contrib.services_delete.\""},{"line_number":1808,"context_line":"                      \"Services_delete\")"},{"line_number":1809,"context_line":""},{"line_number":1810,"context_line":"    def test_service_delete(self):"},{"line_number":1811,"context_line":"        def fake_service_destroy(self, *args):"},{"line_number":1812,"context_line":"            pass"},{"line_number":1813,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BiO0%3D","line":1810,"updated":"2013-11-25 00:44:02.000000000","message":"The api samples from this test appear to be missing from this patch?","commit_id":"4f9281dbc2a084fd54f28380084e6eae94c5ca71"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"f980d1ee9e6aca1d13810cd745efd4af3474812b","unresolved":false,"context_lines":[{"line_number":1655,"context_line":"        timeutils.clear_time_override()"},{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"    def fake_load(self, service_name):"},{"line_number":1658,"context_line":"        return service_name \u003d\u003d \u0027os-extended-services\u0027"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"    def test_services_list(self):"},{"line_number":1661,"context_line":"        \"\"\"Return a list of all agent builds.\"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9cAo%3D","line":1658,"updated":"2013-12-11 14:46:54.000000000","message":"Why change this?","commit_id":"ad295f67b97568af6a24cf9780e54271eb9a5eb8"},{"author":{"_account_id":7231,"name":"Jason Dillaman","username":"jdillaman","inactive":true},"change_message_id":"c8077e36de12f19bacc697ae6b346368aae5a1d4","unresolved":false,"context_lines":[{"line_number":1655,"context_line":"        timeutils.clear_time_override()"},{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"    def fake_load(self, service_name):"},{"line_number":1658,"context_line":"        return service_name \u003d\u003d \u0027os-extended-services\u0027"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"    def test_services_list(self):"},{"line_number":1661,"context_line":"        \"\"\"Return a list of all agent builds.\"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9ahk%3D","line":1658,"in_reply_to":"AAAATn%2F9cAo%3D","updated":"2013-12-11 19:28:15.000000000","message":"This is required because this test case covers both the basic services API and the os-extended-services extension.  Without this change, this test would expand to also include the new delete service extension, which is tested by its own test cases.","commit_id":"ad295f67b97568af6a24cf9780e54271eb9a5eb8"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"f980d1ee9e6aca1d13810cd745efd4af3474812b","unresolved":false,"context_lines":[{"line_number":1734,"context_line":"                      \"extended_services.Extended_services\")"},{"line_number":1735,"context_line":""},{"line_number":1736,"context_line":""},{"line_number":1737,"context_line":"class ExtendedServicesDeleteJsonTest(ApiSampleTestBaseV2):"},{"line_number":1738,"context_line":"    extends_name \u003d (\"nova.api.openstack.compute.contrib.services.Services\")"},{"line_number":1739,"context_line":"    extension_name \u003d (\"nova.api.openstack.compute.contrib.\""},{"line_number":1740,"context_line":"                      \"extended_services_delete.Extended_services_delete\")"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9b8A%3D","line":1737,"updated":"2013-12-11 14:46:54.000000000","message":"It is better to move this class to Line 1791 to make sure group together ExtendedServicesJsonTest \u0026 ExtendedServicesXmlTest","commit_id":"ad295f67b97568af6a24cf9780e54271eb9a5eb8"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"f980d1ee9e6aca1d13810cd745efd4af3474812b","unresolved":false,"context_lines":[{"line_number":1752,"context_line":"        super(ExtendedServicesDeleteJsonTest, self).tearDown()"},{"line_number":1753,"context_line":"        timeutils.clear_time_override()"},{"line_number":1754,"context_line":""},{"line_number":1755,"context_line":"    def fake_load(self, service_name):"},{"line_number":1756,"context_line":"        return service_name \u003d\u003d \u0027os-extended-services-delete\u0027"},{"line_number":1757,"context_line":""},{"line_number":1758,"context_line":"    def test_service_detail(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9b8o%3D","line":1755,"updated":"2013-12-11 14:46:54.000000000","message":"Do we really need this as the extension should already been loaded in https://github.com/openstack/nova/blob/master/nova/tests/integrated/test_api_samples.py#L96","commit_id":"ad295f67b97568af6a24cf9780e54271eb9a5eb8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f07b48298fc2eff7616f807a57bd282132a09d4d","unresolved":false,"context_lines":[{"line_number":1748,"context_line":"        super(ExtendedServicesDeleteJsonTest, self).setUp()"},{"line_number":1749,"context_line":"        self.stubs.Set(db, \"service_get_all\","},{"line_number":1750,"context_line":"                       test_services.fake_db_api_service_get_all)"},{"line_number":1751,"context_line":"        self.stubs.Set(timeutils, \"utcnow\", test_services.fake_utcnow)"},{"line_number":1752,"context_line":"        self.stubs.Set(timeutils, \"utcnow_ts\", test_services.fake_utcnow_ts)"},{"line_number":1753,"context_line":"        self.stubs.Set(db, \"service_get_by_args\","},{"line_number":1754,"context_line":"                       test_services.fake_service_get_by_host_binary)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F6Q0%3D","line":1751,"updated":"2014-01-06 22:15:38.000000000","message":"I think you should be using timeutils.set_time_override and clear_time_override, see the SimpleTenantUsage tests for how that\u0027s used.","commit_id":"cfb85b539bfa8ee53e24867502fc45eacd7d9c22"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f07b48298fc2eff7616f807a57bd282132a09d4d","unresolved":false,"context_lines":[{"line_number":1755,"context_line":""},{"line_number":1756,"context_line":"    def tearDown(self):"},{"line_number":1757,"context_line":"        super(ExtendedServicesDeleteJsonTest, self).tearDown()"},{"line_number":1758,"context_line":"        timeutils.clear_time_override()"},{"line_number":1759,"context_line":""},{"line_number":1760,"context_line":"    def test_service_detail(self):"},{"line_number":1761,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F6Qg%3D","line":1758,"updated":"2014-01-06 22:15:38.000000000","message":"See this is already being used, but set_time_override isn\u0027t being done in setUp?","commit_id":"cfb85b539bfa8ee53e24867502fc45eacd7d9c22"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":1745,"context_line":""},{"line_number":1746,"context_line":"    def setUp(self):"},{"line_number":1747,"context_line":"        super(ExtendedServicesDeleteJsonTest, self).setUp()"},{"line_number":1748,"context_line":"        self.stubs.Set(db, \"service_get_all\","},{"line_number":1749,"context_line":"                       test_services.fake_db_api_service_get_all)"},{"line_number":1750,"context_line":"        timeutils.set_time_override(test_services.fake_utcnow())"},{"line_number":1751,"context_line":"        self.stubs.Set(db, \"service_get_by_args\","}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXWA%3D","line":1748,"updated":"2014-02-21 16:09:57.000000000","message":"Should be able to move these stubs to the class level with mock.patch.object decorators.","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":1747,"context_line":"        super(ExtendedServicesDeleteJsonTest, self).setUp()"},{"line_number":1748,"context_line":"        self.stubs.Set(db, \"service_get_all\","},{"line_number":1749,"context_line":"                       test_services.fake_db_api_service_get_all)"},{"line_number":1750,"context_line":"        timeutils.set_time_override(test_services.fake_utcnow())"},{"line_number":1751,"context_line":"        self.stubs.Set(db, \"service_get_by_args\","},{"line_number":1752,"context_line":"                       test_services.fake_service_get_by_host_binary)"},{"line_number":1753,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXVQ%3D","line":1750,"updated":"2014-02-21 16:09:57.000000000","message":"Why is this necessary?","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1205b0b7cf17cb29e3f5f2cf700688375f1ecd9","unresolved":false,"context_lines":[{"line_number":1762,"context_line":"        \"\"\""},{"line_number":1763,"context_line":"        response \u003d self._do_get(\u0027os-services\u0027)"},{"line_number":1764,"context_line":"        self.assertEqual(response.status, 200)"},{"line_number":1765,"context_line":"        subs \u003d {\u0027binary\u0027: \u0027nova-compute\u0027,"},{"line_number":1766,"context_line":"                \u0027host\u0027: \u0027host1\u0027,"},{"line_number":1767,"context_line":"                \u0027zone\u0027: \u0027nova\u0027,"},{"line_number":1768,"context_line":"                \u0027status\u0027: \u0027disabled\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXU4%3D","line":1765,"updated":"2014-02-21 16:09:57.000000000","message":"Shouldn\u0027t there be an id field in here now?  Otherwise this is a direct copy of the same test in ServicesJsonTest right?","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ac544606bba16979bbd49432b21e205d92d65c85","unresolved":false,"context_lines":[{"line_number":1750,"context_line":""},{"line_number":1751,"context_line":"    def setUp(self):"},{"line_number":1752,"context_line":"        super(ExtendedServicesDeleteJsonTest, self).setUp()"},{"line_number":1753,"context_line":"        timeutils.set_time_override(test_services.fake_utcnow())"},{"line_number":1754,"context_line":""},{"line_number":1755,"context_line":"    def tearDown(self):"},{"line_number":1756,"context_line":"        super(ExtendedServicesDeleteJsonTest, self).tearDown()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2BTSE%3D","line":1753,"updated":"2014-02-22 03:00:05.000000000","message":"still not sure why this is necessary","commit_id":"ac3972b0bc44fbda4d3669ae3fbb740969758de0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c6b805dfc98ec63ddd2919ad30cd8314f04034f3","unresolved":false,"context_lines":[{"line_number":1750,"context_line":""},{"line_number":1751,"context_line":"    def setUp(self):"},{"line_number":1752,"context_line":"        super(ExtendedServicesDeleteJsonTest, self).setUp()"},{"line_number":1753,"context_line":"        timeutils.set_time_override(test_services.fake_utcnow())"},{"line_number":1754,"context_line":""},{"line_number":1755,"context_line":"    def tearDown(self):"},{"line_number":1756,"context_line":"        super(ExtendedServicesDeleteJsonTest, self).tearDown()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2BR%2Bk%3D","line":1753,"in_reply_to":"AAAAUX%2F%2BTBc%3D","updated":"2014-02-22 14:04:37.000000000","message":"OK, figured it was something like that.","commit_id":"ac3972b0bc44fbda4d3669ae3fbb740969758de0"},{"author":{"_account_id":7231,"name":"Jason Dillaman","username":"jdillaman","inactive":true},"change_message_id":"a667ebfc16966c039e77722ff63ca18635efa0ab","unresolved":false,"context_lines":[{"line_number":1750,"context_line":""},{"line_number":1751,"context_line":"    def setUp(self):"},{"line_number":1752,"context_line":"        super(ExtendedServicesDeleteJsonTest, self).setUp()"},{"line_number":1753,"context_line":"        timeutils.set_time_override(test_services.fake_utcnow())"},{"line_number":1754,"context_line":""},{"line_number":1755,"context_line":"    def tearDown(self):"},{"line_number":1756,"context_line":"        super(ExtendedServicesDeleteJsonTest, self).tearDown()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2BTBc%3D","line":1753,"in_reply_to":"AAAAUX%2F%2BTSE%3D","updated":"2014-02-22 04:16:54.000000000","message":"It is required for the response template matching (i.e. commenting it out will cause the test to fail to properly verify the response).  As a result, the time override is  present in all other unit tests in this file using _verfify_response.","commit_id":"ac3972b0bc44fbda4d3669ae3fbb740969758de0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ac544606bba16979bbd49432b21e205d92d65c85","unresolved":false,"context_lines":[{"line_number":1756,"context_line":"        super(ExtendedServicesDeleteJsonTest, self).tearDown()"},{"line_number":1757,"context_line":"        timeutils.clear_time_override()"},{"line_number":1758,"context_line":""},{"line_number":1759,"context_line":"    def test_service_detail(self, *mocks):"},{"line_number":1760,"context_line":"        \"\"\""},{"line_number":1761,"context_line":"        Return a list of all running services with the disable reason"},{"line_number":1762,"context_line":"        information if that exists."}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2BTSA%3D","line":1759,"updated":"2014-02-22 03:00:05.000000000","message":"since you\u0027re not checking if the mocks are used you don\u0027t really need to pass this in, but it\u0027s fine to have it","commit_id":"ac3972b0bc44fbda4d3669ae3fbb740969758de0"}],"nova/tests/integrated/v3/test_services.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"185009aa6001922cd31dacdd0f8b6b969aa435a5","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        return self._verify_response(\u0027service-disable-log-put-resp\u0027,"},{"line_number":80,"context_line":"                                     subs, response, 200)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def test_service_delete(self):"},{"line_number":83,"context_line":"        \"\"\"Delete an existing service.\"\"\""},{"line_number":84,"context_line":"        response \u003d self._do_delete(\u0027os-services/1\u0027)"},{"line_number":85,"context_line":"        self.assertEqual(response.status, 204)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2BXQc%3D","line":82,"updated":"2014-02-21 16:13:34.000000000","message":"Ah this is the v3 api samples test I was missing.","commit_id":"038d28df5870d26f93b37fdc65cdfa149451a741"}]}
