)]}'
{"cyborg/api/controllers/v2/arqs.py":[{"author":{"_account_id":25738,"name":"Xinran WANG","email":"xin-ran.wang@intel.com","username":"Xinran"},"change_message_id":"f6650ecb6d160ea5ea2c797d9788ceeae9df424f","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        return ret"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    # @policy.authorize_wsgi(\"cyborg:arq\", \"get_one\")"},{"line_number":154,"context_line":"    @expose.expose(ARQ, wtypes.text)"},{"line_number":155,"context_line":"    def get_one(self, uuid):"},{"line_number":156,"context_line":"        \"\"\"Get a single ARQ by UUID.\"\"\""},{"line_number":157,"context_line":"        context \u003d pecan.request.context"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_61207fad","line":154,"range":{"start_line":154,"start_character":24,"end_line":154,"end_character":35},"updated":"2019-07-31 14:34:46.000000000","message":"should change to uuid.","commit_id":"0075f7c95402ae0f45b326cd1a76c0b8d5249b79"},{"author":{"_account_id":25738,"name":"Xinran WANG","email":"xin-ran.wang@intel.com","username":"Xinran"},"change_message_id":"f6650ecb6d160ea5ea2c797d9788ceeae9df424f","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                if (arq[\u0027state\u0027] !\u003d \u0027Bound\u0027 and"},{"line_number":184,"context_line":"                        arq[\u0027state\u0027] !\u003d \u0027BindFailed\u0027):"},{"line_number":185,"context_line":"                    unbound_flag \u003d True"},{"line_number":186,"context_line":"            if instance is not None and unbound_flag:"},{"line_number":187,"context_line":"                # Return HTTP code \u0027Locked\u0027"},{"line_number":188,"context_line":"                # FIXME This should return HTTP code 423 if any ARQ for"},{"line_number":189,"context_line":"                #   this instance is not resolved. But that\u0027s not"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_a4b20548","line":186,"range":{"start_line":186,"start_character":12,"end_line":186,"end_character":14},"updated":"2019-07-31 14:34:46.000000000","message":"how about instance \u003d None and unbound_flag \u003d True ?","commit_id":"0075f7c95402ae0f45b326cd1a76c0b8d5249b79"},{"author":{"_account_id":25738,"name":"Xinran WANG","email":"xin-ran.wang@intel.com","username":"Xinran"},"change_message_id":"f6650ecb6d160ea5ea2c797d9788ceeae9df424f","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        context \u003d pecan.request.context"},{"line_number":212,"context_line":"        if arqs is not None:"},{"line_number":213,"context_line":"            arqlist \u003d arqs.split(\u0027,\u0027)"},{"line_number":214,"context_line":"            objects.ExtARQ.delete_by_uuid(context, arqlist)"},{"line_number":215,"context_line":"        elif instance is not None:"},{"line_number":216,"context_line":"            objects.ExtARQ.delete_by_instance(context, instance)"},{"line_number":217,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_848ee976","line":214,"range":{"start_line":214,"start_character":27,"end_line":214,"end_character":41},"updated":"2019-07-31 14:34:46.000000000","message":"delete_by_uuids is more precise here.","commit_id":"0075f7c95402ae0f45b326cd1a76c0b8d5249b79"},{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"373e7e70a1ecf8b31e06102cb19d73254c4d4afd","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        \"\"\"Create a new arq."},{"line_number":117,"context_line":"           Request body:"},{"line_number":118,"context_line":"              { \u0027device_profile_name\u0027: \u003cstring\u003e, # required"},{"line_number":119,"context_line":"                \u0027device_profile_group_id\u0027: \u003cinteger\u003e, # opt, default\u003d0"},{"line_number":120,"context_line":"                \u0027image_uuid\u0027: \u003cglance-image-UUID\u003e, #optional"},{"line_number":121,"context_line":"              }"},{"line_number":122,"context_line":"           :param req: request body."}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_741e7f60","line":119,"range":{"start_line":119,"start_character":16,"end_line":119,"end_character":70},"updated":"2019-08-23 12:11:15.000000000","message":"Does this means we split the device_profile?\n\n{ \"name\": \"dp-1\",\n    \"groups\": [\n        {\"resources:CUSTOM_ACCELERATOR_FPGA\": \"1\",\n         \"trait:CUSTOM_FPGA_INTEL_PAC_A10\": \"required\",\n         \"accel:function_id\": \"123456\"\n        }\n        {\"resources:CUSTOM_ACCELERATOR_FPGA\": \"1\",\n         \"trait:CUSTOM_FPGA_INTEL_PAC_S10\": \"required\",\n         \"accel:function_id\": \"7890123\"\n        }\n    ]\n}\nThere are 2 items in the groups. \nA ARQ can only map one group of a device profile?","commit_id":"3f62e086936b6a7cd3d272262a17b01828003f8c"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"151bb17e93970f06bee61f17132c2793e2267ef5","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        \"\"\"Create a new arq."},{"line_number":117,"context_line":"           Request body:"},{"line_number":118,"context_line":"              { \u0027device_profile_name\u0027: \u003cstring\u003e, # required"},{"line_number":119,"context_line":"                \u0027device_profile_group_id\u0027: \u003cinteger\u003e, # opt, default\u003d0"},{"line_number":120,"context_line":"                \u0027image_uuid\u0027: \u003cglance-image-UUID\u003e, #optional"},{"line_number":121,"context_line":"              }"},{"line_number":122,"context_line":"           :param req: request body."}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_31431214","line":119,"range":{"start_line":119,"start_character":16,"end_line":119,"end_character":70},"in_reply_to":"7faddb67_741e7f60","updated":"2019-08-26 21:47:33.000000000","message":"An ARQ represents one accelerator request. If one request group specifies M accelerators, we will create M ARQs for that.\n\nSo, your example should create 2 ARQs. I put a TODO in line 124 below, till we get a working setup with 2 accelerator cards. But I\u0027ll try to remove that TODO to avoid this type of confusion.","commit_id":"3f62e086936b6a7cd3d272262a17b01828003f8c"},{"author":{"_account_id":25738,"name":"Xinran WANG","email":"xin-ran.wang@intel.com","username":"Xinran"},"change_message_id":"5de32ccb968116b07b326bd29995c66b9d025fe5","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        for group_id, group in enumerate(devprof.groups):"},{"line_number":144,"context_line":"            accel_resources \u003d ["},{"line_number":145,"context_line":"                int(val) for key, val in group.items()"},{"line_number":146,"context_line":"                if key.startswith(\u0027resources:ACCELERATOR_\u0027) or"},{"line_number":147,"context_line":"                key.startswith(\u0027resources:CUSTOM_ACCELERATOR_\u0027)]"},{"line_number":148,"context_line":"            num_accels \u003d sum(accel_resources)"},{"line_number":149,"context_line":"            arq_fields \u003d {"},{"line_number":150,"context_line":"                \u0027device_profile_name\u0027: devprof.name,"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_0003f0bf","line":147,"range":{"start_line":146,"start_character":0,"end_line":147,"end_character":64},"updated":"2019-08-29 03:30:16.000000000","message":"As we used os-resource-class lib now, the FPGA RC is FPGA, not ACCELERATOR_FPGA, some case for GPU.","commit_id":"9247199425d04ae05dade5664a77111593dd8a10"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"2b9fccd6985c8bd7083900f9eca4e386e1f8e29c","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        for group_id, group in enumerate(devprof.groups):"},{"line_number":144,"context_line":"            accel_resources \u003d ["},{"line_number":145,"context_line":"                int(val) for key, val in group.items()"},{"line_number":146,"context_line":"                if key.startswith(\u0027resources:ACCELERATOR_\u0027) or"},{"line_number":147,"context_line":"                key.startswith(\u0027resources:CUSTOM_ACCELERATOR_\u0027)]"},{"line_number":148,"context_line":"            num_accels \u003d sum(accel_resources)"},{"line_number":149,"context_line":"            arq_fields \u003d {"},{"line_number":150,"context_line":"                \u0027device_profile_name\u0027: devprof.name,"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_942ff0a5","line":147,"range":{"start_line":146,"start_character":0,"end_line":147,"end_character":64},"in_reply_to":"7faddb67_0003f0bf","updated":"2019-09-02 16:11:07.000000000","message":"Done","commit_id":"9247199425d04ae05dade5664a77111593dd8a10"},{"author":{"_account_id":28748,"name":"chenker","email":"chen.ke14@zte.com.cn","username":"chenke"},"change_message_id":"227a60b6862a9e5ac0f96685e276106f8a082730","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                valid_fields[path] \u003d p[\u0027value\u0027]"},{"line_number":253,"context_line":"        not_found \u003d [field for field, value in valid_fields.items()"},{"line_number":254,"context_line":"                     if value is None]"},{"line_number":255,"context_line":"        if p[\u0027op\u0027] \u003d\u003d \u0027add\u0027 and len(not_found) \u003e 0:"},{"line_number":256,"context_line":"            msg \u003d \u0027,\u0027.join(not_found)"},{"line_number":257,"context_line":"            reason \u003d \u0027Fields absent in patch {}\u0027.format(msg)"},{"line_number":258,"context_line":"            raise exception.PatchError(reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_eece2e82","line":255,"range":{"start_line":255,"start_character":8,"end_line":255,"end_character":51},"updated":"2019-09-06 07:49:23.000000000","message":"Hi Sundar. this var p has expired. because for cycle has over. maybe need to add ident here.\nShould we also consider the case of remove? or Add todo","commit_id":"ac7b4045560a686fc7f0271da9de311c979a962b"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"1a2a904534d433d97feb8ae9e535395f518ab0f6","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                valid_fields[path] \u003d p[\u0027value\u0027]"},{"line_number":253,"context_line":"        not_found \u003d [field for field, value in valid_fields.items()"},{"line_number":254,"context_line":"                     if value is None]"},{"line_number":255,"context_line":"        if p[\u0027op\u0027] \u003d\u003d \u0027add\u0027 and len(not_found) \u003e 0:"},{"line_number":256,"context_line":"            msg \u003d \u0027,\u0027.join(not_found)"},{"line_number":257,"context_line":"            reason \u003d \u0027Fields absent in patch {}\u0027.format(msg)"},{"line_number":258,"context_line":"            raise exception.PatchError(reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_27e9c97f","line":255,"range":{"start_line":255,"start_character":8,"end_line":255,"end_character":51},"in_reply_to":"5faad753_eece2e82","updated":"2019-09-06 11:17:51.000000000","message":"Done","commit_id":"ac7b4045560a686fc7f0271da9de311c979a962b"},{"author":{"_account_id":28748,"name":"chenker","email":"chen.ke14@zte.com.cn","username":"chenke"},"change_message_id":"227a60b6862a9e5ac0f96685e276106f8a082730","unresolved":false,"context_lines":[{"line_number":262,"context_line":"    @expose.expose(None, body\u003dtypes.jsontype,"},{"line_number":263,"context_line":"                   status_code\u003dhttp_client.ACCEPTED)"},{"line_number":264,"context_line":"    def patch(self, patch_list):"},{"line_number":265,"context_line":"        \"\"\"Bind/Unbind an ARQ."},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        Usage: curl -X PATCH .../v2/accelerator_requests"},{"line_number":268,"context_line":"                 -d \u003cpatch_list\u003e -H \"Content-type: application/json\""}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_5aa061a6","line":265,"range":{"start_line":265,"start_character":11,"end_line":265,"end_character":30},"updated":"2019-09-06 07:49:23.000000000","message":"It is possible to pass in multiple arq objects here. Suggest to explain \"an ARQ or more ARQ\"","commit_id":"ac7b4045560a686fc7f0271da9de311c979a962b"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"1a2a904534d433d97feb8ae9e535395f518ab0f6","unresolved":false,"context_lines":[{"line_number":262,"context_line":"    @expose.expose(None, body\u003dtypes.jsontype,"},{"line_number":263,"context_line":"                   status_code\u003dhttp_client.ACCEPTED)"},{"line_number":264,"context_line":"    def patch(self, patch_list):"},{"line_number":265,"context_line":"        \"\"\"Bind/Unbind an ARQ."},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        Usage: curl -X PATCH .../v2/accelerator_requests"},{"line_number":268,"context_line":"                 -d \u003cpatch_list\u003e -H \"Content-type: application/json\""}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_47a3a550","line":265,"range":{"start_line":265,"start_character":11,"end_line":265,"end_character":30},"in_reply_to":"5faad753_5aa061a6","updated":"2019-09-06 11:17:51.000000000","message":"Done","commit_id":"ac7b4045560a686fc7f0271da9de311c979a962b"},{"author":{"_account_id":17813,"name":"wangzhh","email":"wzh_1993@126.com","username":"wangzhh"},"change_message_id":"383885010f01f3dd8c1985b9c81f231253b3d4aa","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        \"\"\""},{"line_number":218,"context_line":"        LOG.info(\"[arqs] delete. arqs\u003d(%s) instance\u003d(%s)\", arqs, instance)"},{"line_number":219,"context_line":"        context \u003d pecan.request.context"},{"line_number":220,"context_line":"        if arqs is not None:"},{"line_number":221,"context_line":"            arqlist \u003d arqs.split(\u0027,\u0027)"},{"line_number":222,"context_line":"            objects.ExtARQ.delete_by_uuid(context, arqlist)"},{"line_number":223,"context_line":"        elif instance is not None:"}],"source_content_type":"text/x-python","patch_set":26,"id":"5faad753_24278767","line":220,"updated":"2019-09-06 09:35:43.000000000","message":"What should happen if DELETE \"127.0.0.1/v2/accelerator_requests?arqs\u003duuid1,uuid2\u0026instance\u003duuid5,uuid6\"?\nThe code like:\nif ...:\n    delete arqs\nelif:\n    delete instance\ncan just execute \u0027delete arqs\u0027, but won\u0027t execute \u0027delete instance\u0027.\nI think it is a set of \u0027arqs\u003duuid1,uuid2, instance\u003duuid5,uuid6\u0027 which user want to delete, right? So we should use \u0027if\u0027 replace \u0027elif\u0027 here?","commit_id":"c3ad2f27859058729fe4441265687c21c986be86"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"58906422dfa289771969ce17e126493b2d41c674","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        \"\"\""},{"line_number":218,"context_line":"        LOG.info(\"[arqs] delete. arqs\u003d(%s) instance\u003d(%s)\", arqs, instance)"},{"line_number":219,"context_line":"        context \u003d pecan.request.context"},{"line_number":220,"context_line":"        if arqs is not None:"},{"line_number":221,"context_line":"            arqlist \u003d arqs.split(\u0027,\u0027)"},{"line_number":222,"context_line":"            objects.ExtARQ.delete_by_uuid(context, arqlist)"},{"line_number":223,"context_line":"        elif instance is not None:"}],"source_content_type":"text/x-python","patch_set":26,"id":"5faad753_8732fda6","line":220,"in_reply_to":"5faad753_24278767","updated":"2019-09-06 10:16:30.000000000","message":"There are 2 possible use cases here:\n* When a VM is terminated or fails to spawn, Nova needs to call Cyborg to delete the ARQs. But Nova does not store the ARQ UUIDs. SO, it calls with \"instance\u003d...\" form.\n\n* An operator or script may want to delete a specific ARQ, may be from cyborg client, if something goes wrong. Also, in the future, if we support hot add/delete of accelerators, we may want to delete specific ARQs for hot-delete. The \u0027uuids\u003d\u0027...\" form helps with that.\n\nI don\u0027t yet see why we need to do both. We are not precluding it for the future, but the current implementation is either/or.","commit_id":"c3ad2f27859058729fe4441265687c21c986be86"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"e64e9ef8668d7e3cfee2fa2ad7a812e4fdc37fc6","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        \"\"\""},{"line_number":218,"context_line":"        LOG.info(\"[arqs] delete. arqs\u003d(%s) instance\u003d(%s)\", arqs, instance)"},{"line_number":219,"context_line":"        context \u003d pecan.request.context"},{"line_number":220,"context_line":"        if arqs is not None:"},{"line_number":221,"context_line":"            arqlist \u003d arqs.split(\u0027,\u0027)"},{"line_number":222,"context_line":"            objects.ExtARQ.delete_by_uuid(context, arqlist)"},{"line_number":223,"context_line":"        elif instance is not None:"}],"source_content_type":"text/x-python","patch_set":26,"id":"5faad753_a37352e7","line":220,"in_reply_to":"5faad753_7812e95a","updated":"2019-09-08 21:13:36.000000000","message":"Done","commit_id":"c3ad2f27859058729fe4441265687c21c986be86"},{"author":{"_account_id":17813,"name":"wangzhh","email":"wzh_1993@126.com","username":"wangzhh"},"change_message_id":"a0a5247d50c3bc90d7cbd0755b098122565b3c46","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        \"\"\""},{"line_number":218,"context_line":"        LOG.info(\"[arqs] delete. arqs\u003d(%s) instance\u003d(%s)\", arqs, instance)"},{"line_number":219,"context_line":"        context \u003d pecan.request.context"},{"line_number":220,"context_line":"        if arqs is not None:"},{"line_number":221,"context_line":"            arqlist \u003d arqs.split(\u0027,\u0027)"},{"line_number":222,"context_line":"            objects.ExtARQ.delete_by_uuid(context, arqlist)"},{"line_number":223,"context_line":"        elif instance is not None:"}],"source_content_type":"text/x-python","patch_set":26,"id":"5faad753_7812e95a","line":220,"in_reply_to":"5faad753_8732fda6","updated":"2019-09-08 14:16:01.000000000","message":"So, what if someone passes two arguments? It\u0027s better to raise an exception like \u0027Too many arguments\u0027? Right?","commit_id":"c3ad2f27859058729fe4441265687c21c986be86"}],"cyborg/objects/arq.py":[{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"88e312744ce508f43c1f53846860d965e3507494","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027uuid\u0027: object_fields.UUIDField(nullable\u003dFalse),"},{"line_number":38,"context_line":"        \u0027state\u0027: object_fields.ARQStateField(nullable\u003dFalse),"},{"line_number":39,"context_line":"        \u0027device_profile_name\u0027: object_fields.StringField(nullable\u003dFalse),"},{"line_number":40,"context_line":"        \u0027device_profile_group_id\u0027:"},{"line_number":41,"context_line":"            object_fields.IntegerField(nullable\u003dFalse),"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # Fields populated by Nova after scheduling for binding"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_318579af","line":40,"range":{"start_line":40,"start_character":9,"end_line":40,"end_character":32},"updated":"2019-08-23 11:59:03.000000000","message":"why we need device_profile_group_id? \n\nthe device pofile looks as follow:\n{ \"name\": \"dp-1\",\n    \"groups\": [\n        {\"resources:CUSTOM_ACCELERATOR_FPGA\": \"1\",\n         \"trait:CUSTOM_FPGA_INTEL_PAC_A10\": \"required\",\n         \"accel:function_id\": \"123456\"\n        }\n        {\"resources:CUSTOM_ACCELERATOR_FPGA\": \"1\",\n         \"trait:CUSTOM_FPGA_INTEL_PAC_S10\": \"required\",\n         \"accel:function_id\": \"7890123\"\n        }\n    ]\n}\n\nThere are 2 groups in prfile, 1. CUSTOM_FPGA_INTEL_PAC_A10 and 2. CUSTOM_FPGA_INTEL_PAC_S10\ndevice_profile_group_id should be 1 or 2?","commit_id":"61157272004a88ec2eb93f3a786d1933582a4e20"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"151bb17e93970f06bee61f17132c2793e2267ef5","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027uuid\u0027: object_fields.UUIDField(nullable\u003dFalse),"},{"line_number":38,"context_line":"        \u0027state\u0027: object_fields.ARQStateField(nullable\u003dFalse),"},{"line_number":39,"context_line":"        \u0027device_profile_name\u0027: object_fields.StringField(nullable\u003dFalse),"},{"line_number":40,"context_line":"        \u0027device_profile_group_id\u0027:"},{"line_number":41,"context_line":"            object_fields.IntegerField(nullable\u003dFalse),"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # Fields populated by Nova after scheduling for binding"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_9181a650","line":40,"range":{"start_line":40,"start_character":9,"end_line":40,"end_character":32},"in_reply_to":"7faddb67_318579af","updated":"2019-08-26 21:47:33.000000000","message":"First, a device profile may have N request groups, each of which asks for more than one (say M) accelerator resource; that would create N *M ARQs as stated in [1].\n\n[1] https://review.opendev.org/gitweb?p\u003dopenstack/nova-specs.git;f\u003dspecs/train/approved/nova-cyborg-interaction.rst;hb\u003drefs/changes/55/603955/15#l175\n\n\u003e Why do we need device_profile_group_id?\n\nThe Nova code maps each request group to a resource provider. The Cyborg code should map each ARQ to a request group, so that Nova can locate the RP for each ARQ, as in [2].\n\n[2] https://review.opendev.org/#/c/631244/36/nova/accelerator/cyborg.py@124\n\n\u003e device_profile_group_id should be 1 or 2?\n\nIn this example, two separate ARQs should be created, one with group_id 1 and other with 2.","commit_id":"61157272004a88ec2eb93f3a786d1933582a4e20"},{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"88e312744ce508f43c1f53846860d965e3507494","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027uuid\u0027: object_fields.UUIDField(nullable\u003dFalse),"},{"line_number":38,"context_line":"        \u0027state\u0027: object_fields.ARQStateField(nullable\u003dFalse),"},{"line_number":39,"context_line":"        \u0027device_profile_name\u0027: object_fields.StringField(nullable\u003dFalse),"},{"line_number":40,"context_line":"        \u0027device_profile_group_id\u0027:"},{"line_number":41,"context_line":"            object_fields.IntegerField(nullable\u003dFalse),"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # Fields populated by Nova after scheduling for binding"},{"line_number":44,"context_line":"        \u0027hostname\u0027: object_fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_31aed92f","line":41,"range":{"start_line":40,"start_character":9,"end_line":41,"end_character":55},"updated":"2019-08-23 11:59:03.000000000","message":"why we need device_profile_group_id? \n\nthe device pofile looks as follow:\n{ \"name\": \"dp-1\",\n    \"groups\": [\n        {\"resources:CUSTOM_ACCELERATOR_FPGA\": \"1\",\n         \"trait:CUSTOM_FPGA_INTEL_PAC_A10\": \"required\",\n         \"accel:function_id\": \"123456\"\n        }\n        {\"resources:CUSTOM_ACCELERATOR_FPGA\": \"1\",\n         \"trait:CUSTOM_FPGA_INTEL_PAC_S10\": \"required\",\n         \"accel:function_id\": \"7890123\"\n        }\n    ]\n}\n\nThere are 2 groups in prfile, 1. CUSTOM_FPGA_INTEL_PAC_A10 and 2. CUSTOM_FPGA_INTEL_PAC_S10\ndevice_profile_group_id should be 1 or 2?","commit_id":"3f62e086936b6a7cd3d272262a17b01828003f8c"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"29d31249f6b00cfa59e2c0f53c3ea2acf8958957","unresolved":false,"context_lines":[{"line_number":29,"context_line":"@base.CyborgObjectRegistry.register"},{"line_number":30,"context_line":"class ARQ(base.CyborgObject, object_base.VersionedObjectDictCompat):"},{"line_number":31,"context_line":"    # Version 1.0: Initial version"},{"line_number":32,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    dbapi \u003d dbapi.get_instance()"},{"line_number":35,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":25,"id":"7faddb67_08b40735","line":32,"range":{"start_line":32,"start_character":0,"end_line":32,"end_character":18},"updated":"2019-09-05 11:54:38.000000000","message":"I guess we need the version upgrade in here, because we modify the obj fields","commit_id":"ac7b4045560a686fc7f0271da9de311c979a962b"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"25fd9184275b4ec9e671a5b4d71c50b4b1a5ea2d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"@base.CyborgObjectRegistry.register"},{"line_number":30,"context_line":"class ARQ(base.CyborgObject, object_base.VersionedObjectDictCompat):"},{"line_number":31,"context_line":"    # Version 1.0: Initial version"},{"line_number":32,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    dbapi \u003d dbapi.get_instance()"},{"line_number":35,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":25,"id":"7faddb67_b6e8b47a","line":32,"range":{"start_line":32,"start_character":0,"end_line":32,"end_character":18},"in_reply_to":"7faddb67_08b40735","updated":"2019-09-05 14:09:22.000000000","message":"Done","commit_id":"ac7b4045560a686fc7f0271da9de311c979a962b"}],"cyborg/objects/attach_handle.py":[{"author":{"_account_id":28748,"name":"chenker","email":"chen.ke14@zte.com.cn","username":"chenke"},"change_message_id":"227a60b6862a9e5ac0f96685e276106f8a082730","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def deallocate(self, context):"},{"line_number":119,"context_line":"        values \u003d {\"in_use\": False}"},{"line_number":120,"context_line":"        _ \u003d self.dbapi.attach_handle_update(context, self.uuid, values)"}],"source_content_type":"text/x-python","patch_set":25,"id":"7faddb67_96f90381","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":11},"updated":"2019-09-06 07:49:23.000000000","message":"We can delete this.","commit_id":"ac7b4045560a686fc7f0271da9de311c979a962b"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"1a2a904534d433d97feb8ae9e535395f518ab0f6","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def deallocate(self, context):"},{"line_number":119,"context_line":"        values \u003d {\"in_use\": False}"},{"line_number":120,"context_line":"        _ \u003d self.dbapi.attach_handle_update(context, self.uuid, values)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_0294bb43","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":11},"in_reply_to":"7faddb67_96f90381","updated":"2019-09-06 11:17:51.000000000","message":"Done","commit_id":"ac7b4045560a686fc7f0271da9de311c979a962b"}],"cyborg/objects/ext_arq.py":[{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"13b21bc98edf94e932fb43afa6bee2690e2cdc88","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            raise RuntimeError(\u0027Programming needed but deployable \u0027 +"},{"line_number":174,"context_line":"                               \u0027%s in use\u0027 % db_deployable.uuid)"},{"line_number":175,"context_line":"        \"\"\""},{"line_number":176,"context_line":"        driver_name \u003d db_deployable.driver_name"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        query_filter \u003d {\"device_id\": db_deployable.device_id}"},{"line_number":179,"context_line":"        cpid_list \u003d self.dbapi.control_path_get_by_filters("}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_2ed49de8","line":176,"range":{"start_line":176,"start_character":22,"end_line":176,"end_character":47},"updated":"2019-08-01 16:50:28.000000000","message":"How do you make sure the db_deployable.driver_name is not Null?","commit_id":"0075f7c95402ae0f45b326cd1a76c0b8d5249b79"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"d027d404c59335cc9c79b31fe898f436be4c4a50","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            raise RuntimeError(\u0027Programming needed but deployable \u0027 +"},{"line_number":174,"context_line":"                               \u0027%s in use\u0027 % db_deployable.uuid)"},{"line_number":175,"context_line":"        \"\"\""},{"line_number":176,"context_line":"        driver_name \u003d db_deployable.driver_name"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        query_filter \u003d {\"device_id\": db_deployable.device_id}"},{"line_number":179,"context_line":"        cpid_list \u003d self.dbapi.control_path_get_by_filters("}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_d69690f0","line":176,"range":{"start_line":176,"start_character":22,"end_line":176,"end_character":47},"in_reply_to":"7faddb67_2ed49de8","updated":"2019-08-09 06:42:41.000000000","message":"It should be set when Cyborg driver reports a device/deployable via the agent to the conductor. The conductor should set it.","commit_id":"0075f7c95402ae0f45b326cd1a76c0b8d5249b79"},{"author":{"_account_id":14131,"name":"shaohef","email":"shaohe.feng@intel.com","username":"shaohefeng"},"change_message_id":"13b21bc98edf94e932fb43afa6bee2690e2cdc88","unresolved":false,"context_lines":[{"line_number":237,"context_line":"                     bitstream_id or \u0027\u0027, function_id or \u0027\u0027,"},{"line_number":238,"context_line":"                     db_deployable.uuid)"},{"line_number":239,"context_line":"            if bitstream_id is not None and function_id is not None:"},{"line_number":240,"context_line":"                raise exception.InvalidParameterValue("},{"line_number":241,"context_line":"                    \u0027In device profile {0}, only one among bitstream_id \u0027"},{"line_number":242,"context_line":"                    \u0027and function_id must be set, but both are set\u0027)"},{"line_number":243,"context_line":"            if bitstream_id is not None:  # FPGA aaS"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_8e31115c","line":240,"range":{"start_line":240,"start_character":15,"end_line":240,"end_character":54},"updated":"2019-08-01 16:50:28.000000000","message":"should we change the arq.state?","commit_id":"0075f7c95402ae0f45b326cd1a76c0b8d5249b79"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"d027d404c59335cc9c79b31fe898f436be4c4a50","unresolved":false,"context_lines":[{"line_number":237,"context_line":"                     bitstream_id or \u0027\u0027, function_id or \u0027\u0027,"},{"line_number":238,"context_line":"                     db_deployable.uuid)"},{"line_number":239,"context_line":"            if bitstream_id is not None and function_id is not None:"},{"line_number":240,"context_line":"                raise exception.InvalidParameterValue("},{"line_number":241,"context_line":"                    \u0027In device profile {0}, only one among bitstream_id \u0027"},{"line_number":242,"context_line":"                    \u0027and function_id must be set, but both are set\u0027)"},{"line_number":243,"context_line":"            if bitstream_id is not None:  # FPGA aaS"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_4725c509","line":240,"range":{"start_line":240,"start_character":15,"end_line":240,"end_character":54},"in_reply_to":"7faddb67_8e31115c","updated":"2019-08-09 06:42:41.000000000","message":"Fixed by moving this logic before setting ARQ state.","commit_id":"0075f7c95402ae0f45b326cd1a76c0b8d5249b79"},{"author":{"_account_id":30159,"name":"chenchunxiu","email":"chenchunxiu_yewu@cmss.chinamobile.com","username":"chenchunxiu"},"change_message_id":"47f01f6774189ca64ee739596176b296db816390","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        bitstream_id \u003d self.device_profile_group.get(\u0027accel:bitstream_id\u0027)"},{"line_number":218,"context_line":"        function_id \u003d self.device_profile_group.get(\u0027accel:function_id\u0027)"},{"line_number":219,"context_line":"        programming_needed \u003d (bitstream_id is not None or"},{"line_number":220,"context_line":"                              function_id is not None)"},{"line_number":221,"context_line":"        if (programming_needed and"},{"line_number":222,"context_line":"           bitstream_id is not None and function_id is not None):"},{"line_number":223,"context_line":"            raise exception.InvalidParameterValue("}],"source_content_type":"text/x-python","patch_set":23,"id":"7faddb67_d9401c38","line":220,"range":{"start_line":219,"start_character":8,"end_line":220,"end_character":54},"updated":"2019-09-04 14:52:44.000000000","message":"hi, do we need to consider the device without programming capabilities(e.g. GPU).","commit_id":"2e7d41a45e7b26aa78148650d90afe44bf77b1f3"},{"author":{"_account_id":30159,"name":"chenchunxiu","email":"chenchunxiu_yewu@cmss.chinamobile.com","username":"chenchunxiu"},"change_message_id":"5ca17524963f8892f12b6b66a867ea93382911f0","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        bitstream_id \u003d self.device_profile_group.get(\u0027accel:bitstream_id\u0027)"},{"line_number":218,"context_line":"        function_id \u003d self.device_profile_group.get(\u0027accel:function_id\u0027)"},{"line_number":219,"context_line":"        programming_needed \u003d (bitstream_id is not None or"},{"line_number":220,"context_line":"                              function_id is not None)"},{"line_number":221,"context_line":"        if (programming_needed and"},{"line_number":222,"context_line":"           bitstream_id is not None and function_id is not None):"},{"line_number":223,"context_line":"            raise exception.InvalidParameterValue("}],"source_content_type":"text/x-python","patch_set":23,"id":"7faddb67_5414f19f","line":220,"range":{"start_line":219,"start_character":8,"end_line":220,"end_character":54},"in_reply_to":"7faddb67_14b2f906","updated":"2019-09-04 15:39:24.000000000","message":"do you mean in GPU case, operators will nerver set \u0027accel:bitstream_id\u0027 or \u0027accel:function_id in device profie group?","commit_id":"2e7d41a45e7b26aa78148650d90afe44bf77b1f3"},{"author":{"_account_id":30159,"name":"chenchunxiu","email":"chenchunxiu_yewu@cmss.chinamobile.com","username":"chenchunxiu"},"change_message_id":"5d8208f5a9748909fb83e67b1bcf18b48e72da7a","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        bitstream_id \u003d self.device_profile_group.get(\u0027accel:bitstream_id\u0027)"},{"line_number":218,"context_line":"        function_id \u003d self.device_profile_group.get(\u0027accel:function_id\u0027)"},{"line_number":219,"context_line":"        programming_needed \u003d (bitstream_id is not None or"},{"line_number":220,"context_line":"                              function_id is not None)"},{"line_number":221,"context_line":"        if (programming_needed and"},{"line_number":222,"context_line":"           bitstream_id is not None and function_id is not None):"},{"line_number":223,"context_line":"            raise exception.InvalidParameterValue("}],"source_content_type":"text/x-python","patch_set":23,"id":"7faddb67_1898dc18","line":220,"range":{"start_line":219,"start_character":8,"end_line":220,"end_character":54},"in_reply_to":"7faddb67_2f98fe66","updated":"2019-09-06 11:30:27.000000000","message":"I got it，thanks for your reply.\nmaybe we can do something to avoid operators\u0027 mistakes here in future","commit_id":"2e7d41a45e7b26aa78148650d90afe44bf77b1f3"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"33ab102ff4623a33ba4e2e1f9203eea95dc39aab","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        bitstream_id \u003d self.device_profile_group.get(\u0027accel:bitstream_id\u0027)"},{"line_number":218,"context_line":"        function_id \u003d self.device_profile_group.get(\u0027accel:function_id\u0027)"},{"line_number":219,"context_line":"        programming_needed \u003d (bitstream_id is not None or"},{"line_number":220,"context_line":"                              function_id is not None)"},{"line_number":221,"context_line":"        if (programming_needed and"},{"line_number":222,"context_line":"           bitstream_id is not None and function_id is not None):"},{"line_number":223,"context_line":"            raise exception.InvalidParameterValue("}],"source_content_type":"text/x-python","patch_set":23,"id":"7faddb67_2f98fe66","line":220,"range":{"start_line":219,"start_character":8,"end_line":220,"end_character":54},"in_reply_to":"7faddb67_5414f19f","updated":"2019-09-04 20:31:59.000000000","message":"Yes. The concept of bitstream_id is specific to FPGAs. For others, like GPU, I believe operators will use traits for scheduling rather than functions. For example, if you want to run some image transcoding or some AI workload, you don\u0027t ask for a GPU which already has that function, but get some GPU with the right traits and then use Cuda/OpenCL to apply a kernel with that workload.","commit_id":"2e7d41a45e7b26aa78148650d90afe44bf77b1f3"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"283296f57d14daa437e59a710a08908a4a524a3f","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        bitstream_id \u003d self.device_profile_group.get(\u0027accel:bitstream_id\u0027)"},{"line_number":218,"context_line":"        function_id \u003d self.device_profile_group.get(\u0027accel:function_id\u0027)"},{"line_number":219,"context_line":"        programming_needed \u003d (bitstream_id is not None or"},{"line_number":220,"context_line":"                              function_id is not None)"},{"line_number":221,"context_line":"        if (programming_needed and"},{"line_number":222,"context_line":"           bitstream_id is not None and function_id is not None):"},{"line_number":223,"context_line":"            raise exception.InvalidParameterValue("}],"source_content_type":"text/x-python","patch_set":23,"id":"7faddb67_14b2f906","line":220,"range":{"start_line":219,"start_character":8,"end_line":220,"end_character":54},"in_reply_to":"7faddb67_d9401c38","updated":"2019-09-04 15:29:18.000000000","message":"Yes, they are already considered. For them, programming_needed will be set to False, and lines 243-281 will be skipped.","commit_id":"2e7d41a45e7b26aa78148650d90afe44bf77b1f3"},{"author":{"_account_id":30159,"name":"chenchunxiu","email":"chenchunxiu_yewu@cmss.chinamobile.com","username":"chenchunxiu"},"change_message_id":"5ca17524963f8892f12b6b66a867ea93382911f0","unresolved":false,"context_lines":[{"line_number":256,"context_line":"                         bitstream_md[\u0027id\u0027])"},{"line_number":257,"context_line":"            bitstream_id \u003d bitstream_md[\u0027id\u0027]"},{"line_number":258,"context_line":"            if deployable.bitstream_id \u003d\u003d bitstream_id:"},{"line_number":259,"context_line":"                LOG.info(\u0027Deployable %s already has the needed bitstream %s.\u0027"},{"line_number":260,"context_line":"                         \u0027Skipping programming.\u0027 %"},{"line_number":261,"context_line":"                         (deployable.uuid, bitstream_id))"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"            ok \u003d self._do_programming(context, hostname,"},{"line_number":264,"context_line":"                                      deployable, bitstream_id)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7faddb67_b4b68524","line":261,"range":{"start_line":259,"start_character":16,"end_line":261,"end_character":57},"updated":"2019-09-04 15:39:24.000000000","message":"where is the skip code？\nand how about the different case(deployable already has other bitstream)?","commit_id":"2e7d41a45e7b26aa78148650d90afe44bf77b1f3"},{"author":{"_account_id":30159,"name":"chenchunxiu","email":"chenchunxiu_yewu@cmss.chinamobile.com","username":"chenchunxiu"},"change_message_id":"5d8208f5a9748909fb83e67b1bcf18b48e72da7a","unresolved":false,"context_lines":[{"line_number":256,"context_line":"                         bitstream_md[\u0027id\u0027])"},{"line_number":257,"context_line":"            bitstream_id \u003d bitstream_md[\u0027id\u0027]"},{"line_number":258,"context_line":"            if deployable.bitstream_id \u003d\u003d bitstream_id:"},{"line_number":259,"context_line":"                LOG.info(\u0027Deployable %s already has the needed bitstream %s.\u0027"},{"line_number":260,"context_line":"                         \u0027Skipping programming.\u0027 %"},{"line_number":261,"context_line":"                         (deployable.uuid, bitstream_id))"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"            ok \u003d self._do_programming(context, hostname,"},{"line_number":264,"context_line":"                                      deployable, bitstream_id)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7faddb67_98504c60","line":261,"range":{"start_line":259,"start_character":16,"end_line":261,"end_character":57},"in_reply_to":"7faddb67_20bb280f","updated":"2019-09-06 11:30:27.000000000","message":"sorry for reply too late.\nif a deployable has multi accelerators, and one of deployable\u0027s accelerator has been attached to vm1 and deployable programmed with bitstream1.\nin this case, if we reprogram the deployable with another bitstream2，i think it should have an impact on VM1.","commit_id":"2e7d41a45e7b26aa78148650d90afe44bf77b1f3"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"7a6bfe2e9335ece5c528b6068b8e31870244ab15","unresolved":false,"context_lines":[{"line_number":256,"context_line":"                         bitstream_md[\u0027id\u0027])"},{"line_number":257,"context_line":"            bitstream_id \u003d bitstream_md[\u0027id\u0027]"},{"line_number":258,"context_line":"            if deployable.bitstream_id \u003d\u003d bitstream_id:"},{"line_number":259,"context_line":"                LOG.info(\u0027Deployable %s already has the needed bitstream %s.\u0027"},{"line_number":260,"context_line":"                         \u0027Skipping programming.\u0027 %"},{"line_number":261,"context_line":"                         (deployable.uuid, bitstream_id))"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"            ok \u003d self._do_programming(context, hostname,"},{"line_number":264,"context_line":"                                      deployable, bitstream_id)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_9d2c8e9a","line":261,"range":{"start_line":259,"start_character":16,"end_line":261,"end_character":57},"in_reply_to":"7faddb67_98504c60","updated":"2019-09-06 11:38:31.000000000","message":"True. Today we only have FPGAs with 1 accelerator. So, if we add some code/checks for multiple accelerators, we cannot test it. Plus, it requires num_accelerators_in_use field in the deployable, which means changes to db schema. We can take this up in the future if needed.","commit_id":"2e7d41a45e7b26aa78148650d90afe44bf77b1f3"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"33ab102ff4623a33ba4e2e1f9203eea95dc39aab","unresolved":false,"context_lines":[{"line_number":256,"context_line":"                         bitstream_md[\u0027id\u0027])"},{"line_number":257,"context_line":"            bitstream_id \u003d bitstream_md[\u0027id\u0027]"},{"line_number":258,"context_line":"            if deployable.bitstream_id \u003d\u003d bitstream_id:"},{"line_number":259,"context_line":"                LOG.info(\u0027Deployable %s already has the needed bitstream %s.\u0027"},{"line_number":260,"context_line":"                         \u0027Skipping programming.\u0027 %"},{"line_number":261,"context_line":"                         (deployable.uuid, bitstream_id))"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"            ok \u003d self._do_programming(context, hostname,"},{"line_number":264,"context_line":"                                      deployable, bitstream_id)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7faddb67_20bb280f","line":261,"range":{"start_line":259,"start_character":16,"end_line":261,"end_character":57},"in_reply_to":"7faddb67_b4b68524","updated":"2019-09-04 20:31:59.000000000","message":"The skip code got, um, skipped but I added it back in next changeset. \n\nIf the deployable has another bitstream, we should program the device.","commit_id":"2e7d41a45e7b26aa78148650d90afe44bf77b1f3"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"29d31249f6b00cfa59e2c0f53c3ea2acf8958957","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        or if the ARQ version changes."},{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":"    # Version 1.0: Initial version"},{"line_number":49,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    dbapi \u003d dbapi.get_instance()"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"7faddb67_e8864b65","line":49,"updated":"2019-09-05 11:54:38.000000000","message":"ditto","commit_id":"ac7b4045560a686fc7f0271da9de311c979a962b"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"25fd9184275b4ec9e671a5b4d71c50b4b1a5ea2d","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        or if the ARQ version changes."},{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":"    # Version 1.0: Initial version"},{"line_number":49,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    dbapi \u003d dbapi.get_instance()"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"7faddb67_d69450ea","line":49,"in_reply_to":"7faddb67_e8864b65","updated":"2019-09-05 14:09:22.000000000","message":"Done","commit_id":"ac7b4045560a686fc7f0271da9de311c979a962b"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"29d31249f6b00cfa59e2c0f53c3ea2acf8958957","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        \u0027device_profile_group\u0027: object_fields.DictOfStringsField("},{"line_number":64,"context_line":"            nullable\u003dTrue),"},{"line_number":65,"context_line":"        # For bound ARQs, we keep the attach handle ID here so that"},{"line_number":66,"context_line":"        #    it is easy to deallocate on unbind or delete."},{"line_number":67,"context_line":"        \u0027attach_handle_id\u0027: object_fields.IntegerField(nullable\u003dTrue),"},{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"7faddb67_48975f91","line":66,"range":{"start_line":66,"start_character":10,"end_line":66,"end_character":13},"updated":"2019-09-05 11:54:38.000000000","message":"nit space","commit_id":"ac7b4045560a686fc7f0271da9de311c979a962b"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"25fd9184275b4ec9e671a5b4d71c50b4b1a5ea2d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        \u0027device_profile_group\u0027: object_fields.DictOfStringsField("},{"line_number":64,"context_line":"            nullable\u003dTrue),"},{"line_number":65,"context_line":"        # For bound ARQs, we keep the attach handle ID here so that"},{"line_number":66,"context_line":"        #    it is easy to deallocate on unbind or delete."},{"line_number":67,"context_line":"        \u0027attach_handle_id\u0027: object_fields.IntegerField(nullable\u003dTrue),"},{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"7faddb67_f6970cea","line":66,"range":{"start_line":66,"start_character":10,"end_line":66,"end_character":13},"in_reply_to":"7faddb67_48975f91","updated":"2019-09-05 14:09:22.000000000","message":"Done","commit_id":"ac7b4045560a686fc7f0271da9de311c979a962b"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"86517d03a5c88fc4406cd4fb624e0bbc0f433a34","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from cyborg.objects.device_profile import DeviceProfile"},{"line_number":31,"context_line":"from cyborg.objects import fields as object_fields"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"import subprocess"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"5faad753_938ebf2c","line":33,"updated":"2019-09-06 14:03:28.000000000","message":"Is anything using subprocess?","commit_id":"c5faa630f8f8dcaa7efebfc37baf05933e294903"},{"author":{"_account_id":21672,"name":"Sundar Nadathur","email":"sundar.nadathur@intel.com","username":"nsundar"},"change_message_id":"96b466ea79ef8acae1ba4a0f9623d3d2b2a6cf41","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from cyborg.objects.device_profile import DeviceProfile"},{"line_number":31,"context_line":"from cyborg.objects import fields as object_fields"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"import subprocess"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"5faad753_99d1fd5a","line":33,"in_reply_to":"5faad753_938ebf2c","updated":"2019-09-06 15:22:45.000000000","message":"Thanks for catching this. We are also moving to flake8 which helps in locating unused imports. Will fix.","commit_id":"c5faa630f8f8dcaa7efebfc37baf05933e294903"}]}
