)]}'
{"ironic/common/utils.py":[{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"3a98b56ca205e0c2120d7d444296ab6d2074db7f","unresolved":false,"context_lines":[{"line_number":308,"context_line":"                        {\u0027source\u0027: source, \u0027link\u0027: link, \u0027e\u0027: e})"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"def unlink_without_raise(path):"},{"line_number":312,"context_line":"    try:"},{"line_number":313,"context_line":"        if os.path.isfile(path):"},{"line_number":314,"context_line":"            os.unlink(path)"},{"line_number":315,"context_line":"    except OSError as e:"},{"line_number":316,"context_line":"        LOG.warning(\u0027Failed to remove file %(path)s, error: %(e)s\u0027,"},{"line_number":317,"context_line":"                    {\u0027path\u0027: path, \u0027e\u0027: e})"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"def safe_rstrip(value, chars\u003dNone):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_5158ec2f","line":317,"range":{"start_line":311,"start_character":1,"end_line":317,"end_character":43},"updated":"2018-08-31 10:27:59.000000000","message":"You need not define this. You can use it from ironic-lib [1] as we do here [2] and other places in Ironic.\n[1] https://github.com/openstack/ironic-lib/blob/master/ironic_lib/utils.py#L145-L153\n[2] https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/pxe.py#L421","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":308,"context_line":"                        {\u0027source\u0027: source, \u0027link\u0027: link, \u0027e\u0027: e})"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"def unlink_without_raise(path):"},{"line_number":312,"context_line":"    try:"},{"line_number":313,"context_line":"        if os.path.isfile(path):"},{"line_number":314,"context_line":"            os.unlink(path)"},{"line_number":315,"context_line":"    except OSError as e:"},{"line_number":316,"context_line":"        LOG.warning(\u0027Failed to remove file %(path)s, error: %(e)s\u0027,"},{"line_number":317,"context_line":"                    {\u0027path\u0027: path, \u0027e\u0027: e})"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"def safe_rstrip(value, chars\u003dNone):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_a75ecd42","line":317,"range":{"start_line":311,"start_character":1,"end_line":317,"end_character":43},"in_reply_to":"3f79a3b5_5158ec2f","updated":"2018-09-01 08:23:40.000000000","message":"Done","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"47e2c2e920dc1a372370c2b3430cad363650350f","unresolved":false,"context_lines":[{"line_number":567,"context_line":""},{"line_number":568,"context_line":"def calculate_md5_checksum(file_path):"},{"line_number":569,"context_line":"    \"\"\"Calculate md5 checksum for specified file.\"\"\""},{"line_number":570,"context_line":"    if not os.path.exists(file_path) or not os.path.isfile(file_path):"},{"line_number":571,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":572,"context_line":"            _(\u0027Invalid file %(path)s is specified for \u0027"},{"line_number":573,"context_line":"              \u0027md5 checksum \u0027) % {\u0027path\u0027: file_path})"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_914d249b","line":570,"updated":"2018-08-31 10:28:05.000000000","message":"nit: exist is redundant, it\u0027s implied by isfile","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":567,"context_line":""},{"line_number":568,"context_line":"def calculate_md5_checksum(file_path):"},{"line_number":569,"context_line":"    \"\"\"Calculate md5 checksum for specified file.\"\"\""},{"line_number":570,"context_line":"    if not os.path.exists(file_path) or not os.path.isfile(file_path):"},{"line_number":571,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":572,"context_line":"            _(\u0027Invalid file %(path)s is specified for \u0027"},{"line_number":573,"context_line":"              \u0027md5 checksum \u0027) % {\u0027path\u0027: file_path})"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_672d15a7","line":570,"in_reply_to":"3f79a3b5_914d249b","updated":"2018-09-01 08:23:40.000000000","message":"Done","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"996060f951638d67c2a06c20dcd6d1fcb8c83bfc","unresolved":false,"context_lines":[{"line_number":571,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":572,"context_line":"            _(\u0027Invalid file %(path)s is specified for \u0027"},{"line_number":573,"context_line":"              \u0027md5 checksum \u0027) % {\u0027path\u0027: file_path})"},{"line_number":574,"context_line":"    args \u003d (\u0027md5sum\u0027, \u0027-b\u0027, file_path)"},{"line_number":575,"context_line":"    out, err \u003d execute(*args, check_exit_code\u003d[0])"},{"line_number":576,"context_line":"    return out.split()[0]"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_e6d60e54","line":574,"updated":"2018-08-31 20:22:03.000000000","message":"do we want to consider oslo_utils.fileutils.compute_file_checksum?  It defaults to sha256, and _does_ read the file into the process... which has some negatives imho.","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"e925f120ea94770c52bef1222d58236480d11f46","unresolved":false,"context_lines":[{"line_number":571,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":572,"context_line":"            _(\u0027Invalid file %(path)s is specified for \u0027"},{"line_number":573,"context_line":"              \u0027md5 checksum \u0027) % {\u0027path\u0027: file_path})"},{"line_number":574,"context_line":"    args \u003d (\u0027md5sum\u0027, \u0027-b\u0027, file_path)"},{"line_number":575,"context_line":"    out, err \u003d execute(*args, check_exit_code\u003d[0])"},{"line_number":576,"context_line":"    return out.split()[0]"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_1ca344b3","line":574,"in_reply_to":"3f79a3b5_e6d60e54","updated":"2018-09-03 12:10:53.000000000","message":"Done","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":571,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":572,"context_line":"            _(\u0027Invalid file %(path)s is specified for \u0027"},{"line_number":573,"context_line":"              \u0027md5 checksum \u0027) % {\u0027path\u0027: file_path})"},{"line_number":574,"context_line":"    args \u003d (\u0027md5sum\u0027, \u0027-b\u0027, file_path)"},{"line_number":575,"context_line":"    out, err \u003d execute(*args, check_exit_code\u003d[0])"},{"line_number":576,"context_line":"    return out.split()[0]"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_8a163849","line":574,"in_reply_to":"3f79a3b5_e6d60e54","updated":"2018-09-01 08:23:40.000000000","message":"Good to know, it supports md5 too.\nIn theory it will be faster by creating a process, I\u0027ll do a test to see the performance gap, if the difference is trivial, I\u0027ll change to use oslo one. Inserted a TODO as a reminder.","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"99280462f9d1f57d6388e90500275d8d416aab94","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        raise exception.InvalidConductorGroup(group\u003dconductor_group)"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"def calculate_md5_checksum(file_path):"},{"line_number":560,"context_line":"    \"\"\"Calculate md5 checksum for specified file.\"\"\""},{"line_number":561,"context_line":"    # TODO(kaifeng) Compare performance to"},{"line_number":562,"context_line":"    # oslo_utils.fileutils.compute_file_checksum"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_5bbea9ff","line":559,"range":{"start_line":559,"start_character":0,"end_line":559,"end_character":38},"updated":"2018-09-03 05:42:37.000000000","message":"Instead of redefining, can we use [1] to compute checksum ?\n[1] https://github.com/openstack/ironic/blob/master/ironic/common/utils.py#L232-L251","commit_id":"c7994bda607619bf31ef21051e1682b7398da885"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"e925f120ea94770c52bef1222d58236480d11f46","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        raise exception.InvalidConductorGroup(group\u003dconductor_group)"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"def calculate_md5_checksum(file_path):"},{"line_number":560,"context_line":"    \"\"\"Calculate md5 checksum for specified file.\"\"\""},{"line_number":561,"context_line":"    # TODO(kaifeng) Compare performance to"},{"line_number":562,"context_line":"    # oslo_utils.fileutils.compute_file_checksum"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_9cc9947a","line":559,"range":{"start_line":559,"start_character":0,"end_line":559,"end_character":38},"in_reply_to":"3f79a3b5_5bbea9ff","updated":"2018-09-03 12:10:53.000000000","message":"Yes, Julia said oslo also provides this, [1] is the same approach (reading file chunk) with a smaller buffer size.\n\nI just did some test on the performance, looks similar, so I decide to use oslo one :)","commit_id":"c7994bda607619bf31ef21051e1682b7398da885"}],"ironic/conf/agent.py":[{"author":{"_account_id":22623,"name":"Erik Olof Gunnar Andersson","email":"eandersson@blizzard.com","username":"eoandersson"},"change_message_id":"53102893a53d4d97346184450714045c518bdb76","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                help\u003d_(\u0027Specifies whether direct deploy should try to use \u0027"},{"line_number":95,"context_line":"                       \u0027the image source directly or if ironic should cache \u0027"},{"line_number":96,"context_line":"                       \u0027the image on the conductor and serve it from \u0027"},{"line_number":97,"context_line":"                       \u0027ironic\\\u0027s own http server\u0027))"},{"line_number":98,"context_line":"]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_88ced260","line":97,"updated":"2018-08-15 06:09:42.000000000","message":"Nit: Always good to end with a colon , so that future patches won\u0027t need to touch this line.","commit_id":"e88a2a3b75a96dec712533f494073b0e0f29e6a1"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"a4595e76f1a84994b8d90950f625847de8aadd00","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                help\u003d_(\u0027Specifies whether direct deploy should try to use \u0027"},{"line_number":95,"context_line":"                       \u0027the image source directly or if ironic should cache \u0027"},{"line_number":96,"context_line":"                       \u0027the image on the conductor and serve it from \u0027"},{"line_number":97,"context_line":"                       \u0027ironic\\\u0027s own http server\u0027))"},{"line_number":98,"context_line":"]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_c0bd4b03","line":97,"in_reply_to":"3f79a3b5_88ced260","updated":"2018-08-17 06:04:01.000000000","message":"Done","commit_id":"e88a2a3b75a96dec712533f494073b0e0f29e6a1"}],"ironic/conf/deploy.py":[{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"3a98b56ca205e0c2120d7d444296ab6d2074db7f","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                       \u0027in a swift endpoint.\u0027)),"},{"line_number":99,"context_line":"    cfg.StrOpt(\u0027http_image_subdir\u0027,"},{"line_number":100,"context_line":"               default\u003d\u0027agent_images\u0027,"},{"line_number":101,"context_line":"               help\u003d_(\u0027The name of subdirectory under http root which is \u0027"},{"line_number":102,"context_line":"                      \u0027used to place instance images for the direct deploy \u0027"},{"line_number":103,"context_line":"                      \u0027interface, when local HTTP service is incorporated to \u0027"},{"line_number":104,"context_line":"                      \u0027provide instance image instead of swift tempurls.\u0027)),"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_d1b15c46","line":101,"range":{"start_line":101,"start_character":54,"end_line":101,"end_character":62},"updated":"2018-08-31 10:27:59.000000000","message":"s/ http root / ironic-conductor node\u0027s HTTP root path /","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                       \u0027in a swift endpoint.\u0027)),"},{"line_number":99,"context_line":"    cfg.StrOpt(\u0027http_image_subdir\u0027,"},{"line_number":100,"context_line":"               default\u003d\u0027agent_images\u0027,"},{"line_number":101,"context_line":"               help\u003d_(\u0027The name of subdirectory under http root which is \u0027"},{"line_number":102,"context_line":"                      \u0027used to place instance images for the direct deploy \u0027"},{"line_number":103,"context_line":"                      \u0027interface, when local HTTP service is incorporated to \u0027"},{"line_number":104,"context_line":"                      \u0027provide instance image instead of swift tempurls.\u0027)),"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_aa3f74b3","line":101,"range":{"start_line":101,"start_character":54,"end_line":101,"end_character":62},"in_reply_to":"3f79a3b5_d1b15c46","updated":"2018-09-01 08:23:40.000000000","message":"Done","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"}],"ironic/drivers/modules/agent.py":[{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"3a98b56ca205e0c2120d7d444296ab6d2074db7f","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        raise exception.InvalidParameterValue(msg)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"def validate_http_provisioning_configuration(node):"},{"line_number":149,"context_line":"    image_source \u003d node.instance_info.get(\u0027image_source\u0027)"},{"line_number":150,"context_line":"    if (not service_utils.is_glance_image(image_source) or"},{"line_number":151,"context_line":"            CONF.agent.image_download_source !\u003d \u0027http\u0027):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_712c084a","line":148,"range":{"start_line":148,"start_character":4,"end_line":148,"end_character":44},"updated":"2018-08-31 10:27:59.000000000","message":"Please add docstring for this method.","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        raise exception.InvalidParameterValue(msg)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"def validate_http_provisioning_configuration(node):"},{"line_number":149,"context_line":"    image_source \u003d node.instance_info.get(\u0027image_source\u0027)"},{"line_number":150,"context_line":"    if (not service_utils.is_glance_image(image_source) or"},{"line_number":151,"context_line":"            CONF.agent.image_download_source !\u003d \u0027http\u0027):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_ea7c8c73","line":148,"range":{"start_line":148,"start_character":4,"end_line":148,"end_character":44},"in_reply_to":"3f79a3b5_712c084a","updated":"2018-09-01 08:23:40.000000000","message":"Done","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"996060f951638d67c2a06c20dcd6d1fcb8c83bfc","unresolved":false,"context_lines":[{"line_number":148,"context_line":"def validate_http_provisioning_configuration(node):"},{"line_number":149,"context_line":"    image_source \u003d node.instance_info.get(\u0027image_source\u0027)"},{"line_number":150,"context_line":"    if (not service_utils.is_glance_image(image_source) or"},{"line_number":151,"context_line":"            CONF.agent.image_download_source !\u003d \u0027http\u0027):"},{"line_number":152,"context_line":"        return"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    params \u003d {}"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_e66dae99","line":151,"updated":"2018-08-31 20:22:03.000000000","message":"I feel like we might want to rewrite the conditional since a user providing an explicit image_source is valid. I guess it is kind of confusing to look at a glance.","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":148,"context_line":"def validate_http_provisioning_configuration(node):"},{"line_number":149,"context_line":"    image_source \u003d node.instance_info.get(\u0027image_source\u0027)"},{"line_number":150,"context_line":"    if (not service_utils.is_glance_image(image_source) or"},{"line_number":151,"context_line":"            CONF.agent.image_download_source !\u003d \u0027http\u0027):"},{"line_number":152,"context_line":"        return"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    params \u003d {}"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_2a3604b6","line":151,"in_reply_to":"3f79a3b5_e66dae99","updated":"2018-09-01 08:23:40.000000000","message":"We are not going through the http provision logic if the image is user provided, it only works for glance image.\nIf you feel the check here is kind of misleading, I\u0027ll find a place to do this check from an upper layer.","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"3a98b56ca205e0c2120d7d444296ab6d2074db7f","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                               {\u0027type_uuid\u0027: type_uuid,"},{"line_number":264,"context_line":"                                \u0027node\u0027: task.node.uuid})"},{"line_number":265,"context_line":"                        LOG.error(msg)"},{"line_number":266,"context_line":"                        deploy_utils.set_failed_state(task, msg)"},{"line_number":267,"context_line":"                        return"},{"line_number":268,"context_line":"                    return result"},{"line_number":269,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_919684ef","line":266,"range":{"start_line":266,"start_character":24,"end_line":266,"end_character":64},"updated":"2018-08-31 10:27:59.000000000","message":"Need to clean-up the images in case of deploy failure as this method [1] does not invoke deploy.clean_up()\n[1] https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/deploy_utils.py#L534","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                               {\u0027type_uuid\u0027: type_uuid,"},{"line_number":264,"context_line":"                                \u0027node\u0027: task.node.uuid})"},{"line_number":265,"context_line":"                        LOG.error(msg)"},{"line_number":266,"context_line":"                        deploy_utils.set_failed_state(task, msg)"},{"line_number":267,"context_line":"                        return"},{"line_number":268,"context_line":"                    return result"},{"line_number":269,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_eadb2c4c","line":266,"range":{"start_line":266,"start_character":24,"end_line":266,"end_character":64},"in_reply_to":"3f79a3b5_919684ef","updated":"2018-09-01 08:23:40.000000000","message":"I think it\u0027s captured at L358","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"99280462f9d1f57d6388e90500275d8d416aab94","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                               {\u0027type_uuid\u0027: type_uuid,"},{"line_number":264,"context_line":"                                \u0027node\u0027: task.node.uuid})"},{"line_number":265,"context_line":"                        LOG.error(msg)"},{"line_number":266,"context_line":"                        deploy_utils.set_failed_state(task, msg)"},{"line_number":267,"context_line":"                        return"},{"line_number":268,"context_line":"                    return result"},{"line_number":269,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_1b2d9145","line":266,"range":{"start_line":266,"start_character":24,"end_line":266,"end_character":64},"in_reply_to":"3f79a3b5_eadb2c4c","updated":"2018-09-03 05:42:37.000000000","message":"oh, ok. Thanks.","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"47e2c2e920dc1a372370c2b3430cad363650350f","unresolved":false,"context_lines":[{"line_number":354,"context_line":"            manager_utils.node_set_boot_device(task, \u0027disk\u0027, persistent\u003dTrue)"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        # Remove symbolic link when deploy is done."},{"line_number":357,"context_line":"        if CONF.agent.image_download_source \u003d\u003d \u0027http\u0027:"},{"line_number":358,"context_line":"            deploy_utils.remove_http_instance_symlink(task.node.uuid)"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        LOG.debug(\u0027Rebooting node %s to instance\u0027, node.uuid)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_d1795cc5","line":357,"updated":"2018-08-31 10:28:05.000000000","message":"nit: no need for this check since it uses unlike_without_raise","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":354,"context_line":"            manager_utils.node_set_boot_device(task, \u0027disk\u0027, persistent\u003dTrue)"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        # Remove symbolic link when deploy is done."},{"line_number":357,"context_line":"        if CONF.agent.image_download_source \u003d\u003d \u0027http\u0027:"},{"line_number":358,"context_line":"            deploy_utils.remove_http_instance_symlink(task.node.uuid)"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        LOG.debug(\u0027Rebooting node %s to instance\u0027, node.uuid)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_0ab8e8e2","line":357,"in_reply_to":"3f79a3b5_d1795cc5","updated":"2018-09-01 08:23:40.000000000","message":"My thought is to avoid undo something not done before, we might accidentally remove files not belong to us, wdyt?","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"47e2c2e920dc1a372370c2b3430cad363650350f","unresolved":false,"context_lines":[{"line_number":583,"context_line":"        task.driver.boot.clean_up_instance(task)"},{"line_number":584,"context_line":"        provider \u003d dhcp_factory.DHCPFactory()"},{"line_number":585,"context_line":"        provider.clean_dhcp(task)"},{"line_number":586,"context_line":"        if CONF.agent.image_download_source \u003d\u003d \u0027http\u0027:"},{"line_number":587,"context_line":"            deploy_utils.destroy_http_instance_images(task.node)"},{"line_number":588,"context_line":""},{"line_number":589,"context_line":"    def take_over(self, task):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_714ac883","line":586,"updated":"2018-08-31 10:28:05.000000000","message":"ditto","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"3a98b56ca205e0c2120d7d444296ab6d2074db7f","unresolved":false,"context_lines":[{"line_number":584,"context_line":"        provider \u003d dhcp_factory.DHCPFactory()"},{"line_number":585,"context_line":"        provider.clean_dhcp(task)"},{"line_number":586,"context_line":"        if CONF.agent.image_download_source \u003d\u003d \u0027http\u0027:"},{"line_number":587,"context_line":"            deploy_utils.destroy_http_instance_images(task.node)"},{"line_number":588,"context_line":""},{"line_number":589,"context_line":"    def take_over(self, task):"},{"line_number":590,"context_line":"        \"\"\"Take over management of this node from a dead conductor."}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_118ef431","line":587,"range":{"start_line":587,"start_character":12,"end_line":587,"end_character":64},"updated":"2018-08-31 10:27:59.000000000","message":"As per the spec [1] it should remove only symbolic links.\n\"The symbolic link will be removed at AgentDeploy.deploy when a node deploy is done, or AgentDeploy.clean_up when a node is teared down from the state deploy failed.\"\n\n[1] https://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/agent-http-provisioning.html","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":584,"context_line":"        provider \u003d dhcp_factory.DHCPFactory()"},{"line_number":585,"context_line":"        provider.clean_dhcp(task)"},{"line_number":586,"context_line":"        if CONF.agent.image_download_source \u003d\u003d \u0027http\u0027:"},{"line_number":587,"context_line":"            deploy_utils.destroy_http_instance_images(task.node)"},{"line_number":588,"context_line":""},{"line_number":589,"context_line":"    def take_over(self, task):"},{"line_number":590,"context_line":"        \"\"\"Take over management of this node from a dead conductor."}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_2aa044a5","line":587,"range":{"start_line":587,"start_character":12,"end_line":587,"end_character":64},"in_reply_to":"3f79a3b5_118ef431","updated":"2018-09-01 08:23:40.000000000","message":"Yeah, it puts emphasis on the symbolic link, but actually we need to remove image file here, otherwise the image will not get cleaned up by cache. I\u0027m sorry this is not clearly stated in the spec :(","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"}],"ironic/drivers/modules/deploy_utils.py":[{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"481e2620054631f271b41767a71eee8d54e98772","unresolved":false,"context_lines":[{"line_number":1175,"context_line":"class HTTPInstanceImageCache(image_cache.ImageCache):"},{"line_number":1176,"context_line":"    def __init__(self):"},{"line_number":1177,"context_line":"        super(HTTPInstanceImageCache, self).__init__("},{"line_number":1178,"context_line":"            CONF.pxe.instance_master_path,"},{"line_number":1179,"context_line":"            # MiB -\u003e B"},{"line_number":1180,"context_line":"            cache_size\u003dCONF.pxe.image_cache_size * 1024 * 1024,"},{"line_number":1181,"context_line":"            # min -\u003e sec"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_c80d5b41","line":1178,"range":{"start_line":1178,"start_character":12,"end_line":1178,"end_character":42},"updated":"2018-07-24 03:19:18.000000000","message":"This is mixed with instance cached used by iscsi, fetching image to CONF.deploy.http_root will still cause this cache be cleaned up, I strongly suggest replacing it with CONF.pxe.http_root or something else.","commit_id":"33c3784776da78649db52e5b5bb4eafba071c521"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"481e2620054631f271b41767a71eee8d54e98772","unresolved":false,"context_lines":[{"line_number":1185,"context_line":"def destroy_http_instance_images(node_uuid):"},{"line_number":1186,"context_line":"    image_dir_path \u003d os.path.join(CONF.deploy.http_root, node_uuid)"},{"line_number":1187,"context_line":"    image_file_path \u003d os.path.join(image_dir_path, \"disk\")"},{"line_number":1188,"context_line":"    il_utils.unlink_without_raise(image_file_path)"},{"line_number":1189,"context_line":"    HTTPInstanceImageCache().clean_up()"},{"line_number":1190,"context_line":""},{"line_number":1191,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_68dbe7e9","line":1188,"range":{"start_line":1188,"start_character":4,"end_line":1188,"end_character":50},"updated":"2018-07-24 03:19:18.000000000","message":"I didn\u0027t see symlink action when caching instance image, this is a real file, I think we need to directly remove it here if we don\u0027t want to expose it to http service for uncertain time.\n\nclean_up() below can\u0027t assure this image been removed, the cache remove oldest first.","commit_id":"33c3784776da78649db52e5b5bb4eafba071c521"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"64f20bf0cc8a861e631ac260105c9f1e122161b3","unresolved":false,"context_lines":[{"line_number":1185,"context_line":"def destroy_http_instance_images(node_uuid):"},{"line_number":1186,"context_line":"    image_dir_path \u003d os.path.join(CONF.deploy.http_root, node_uuid)"},{"line_number":1187,"context_line":"    image_file_path \u003d os.path.join(image_dir_path, \"disk\")"},{"line_number":1188,"context_line":"    il_utils.unlink_without_raise(image_file_path)"},{"line_number":1189,"context_line":"    HTTPInstanceImageCache().clean_up()"},{"line_number":1190,"context_line":""},{"line_number":1191,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_024c8f73","line":1188,"range":{"start_line":1188,"start_character":4,"end_line":1188,"end_character":50},"in_reply_to":"5f7c97a3_33c6c417","updated":"2018-07-24 05:37:20.000000000","message":"Oops, I mistake it as symlink, sorry, please ignore this comment","commit_id":"33c3784776da78649db52e5b5bb4eafba071c521"},{"author":{"_account_id":7080,"name":"Mathieu Mitchell","email":"mat128@gmail.com","username":"mat128"},"change_message_id":"cf88f60f720d4c5475ce8d6b827d8939e1314475","unresolved":false,"context_lines":[{"line_number":1185,"context_line":"def destroy_http_instance_images(node_uuid):"},{"line_number":1186,"context_line":"    image_dir_path \u003d os.path.join(CONF.deploy.http_root, node_uuid)"},{"line_number":1187,"context_line":"    image_file_path \u003d os.path.join(image_dir_path, \"disk\")"},{"line_number":1188,"context_line":"    il_utils.unlink_without_raise(image_file_path)"},{"line_number":1189,"context_line":"    HTTPInstanceImageCache().clean_up()"},{"line_number":1190,"context_line":""},{"line_number":1191,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_33c6c417","line":1188,"range":{"start_line":1188,"start_character":4,"end_line":1188,"end_character":50},"in_reply_to":"5f7c97a3_68dbe7e9","updated":"2018-07-24 03:57:41.000000000","message":"@Kaifeng unlink works on regular files, too.","commit_id":"33c3784776da78649db52e5b5bb4eafba071c521"},{"author":{"_account_id":22623,"name":"Erik Olof Gunnar Andersson","email":"eandersson@blizzard.com","username":"eoandersson"},"change_message_id":"53102893a53d4d97346184450714045c518bdb76","unresolved":false,"context_lines":[{"line_number":1120,"context_line":"    image_source \u003d instance_info[\u0027image_source\u0027]"},{"line_number":1121,"context_line":""},{"line_number":1122,"context_line":"    if CONF.agent.get(\"direct_download\", True):"},{"line_number":1123,"context_line":"        if service_utils.is_glance_image(image_source):"},{"line_number":1124,"context_line":"            glance \u003d image_service.GlanceImageService(version\u003d2,"},{"line_number":1125,"context_line":"                                                      context\u003dtask.context)"},{"line_number":1126,"context_line":"            image_info \u003d glance.show(image_source)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_c8e5aadd","line":1123,"updated":"2018-08-15 06:09:42.000000000","message":"Could we just move these two into new functions? I feel like two well named functions could add some clarity here, and in general make the code easier to read.","commit_id":"e88a2a3b75a96dec712533f494073b0e0f29e6a1"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"ea6b489d2847d14e8c8bb22ac7b79f5f623609a1","unresolved":false,"context_lines":[{"line_number":1120,"context_line":"    image_source \u003d instance_info[\u0027image_source\u0027]"},{"line_number":1121,"context_line":""},{"line_number":1122,"context_line":"    if CONF.agent.get(\"direct_download\", True):"},{"line_number":1123,"context_line":"        if service_utils.is_glance_image(image_source):"},{"line_number":1124,"context_line":"            glance \u003d image_service.GlanceImageService(version\u003d2,"},{"line_number":1125,"context_line":"                                                      context\u003dtask.context)"},{"line_number":1126,"context_line":"            image_info \u003d glance.show(image_source)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_3efc943c","line":1123,"in_reply_to":"3f79a3b5_c8e5aadd","updated":"2018-08-15 08:31:07.000000000","message":"Sure, this patch in current form is a poc, we\u0027ll refactor in following updates.","commit_id":"e88a2a3b75a96dec712533f494073b0e0f29e6a1"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"2c6eae69871826be35692e1968609c08308b9308","unresolved":false,"context_lines":[{"line_number":1170,"context_line":"            instance_info[\u0027image_url\u0027] \u003d http_image_url"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"        instance_info[\u0027image_checksum\u0027] \u003d image_info[\u0027checksum\u0027]"},{"line_number":1173,"context_line":"        instance_info[\u0027image_disk_format\u0027] \u003d image_info[\u0027disk_format\u0027]"},{"line_number":1174,"context_line":"        instance_info[\u0027image_container_format\u0027] \u003d ("},{"line_number":1175,"context_line":"            image_info[\u0027container_format\u0027])"},{"line_number":1176,"context_line":"        instance_info[\u0027image_tags\u0027] \u003d image_info.get(\u0027tags\u0027, [])"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_e5f492f3","line":1173,"range":{"start_line":1173,"start_character":8,"end_line":1173,"end_character":70},"updated":"2018-08-23 02:14:45.000000000","message":"this should be treated separately, set to raw if converted.","commit_id":"6ffe4eba563ea9ea1f0c0ebfb8313041f6550b8d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"996060f951638d67c2a06c20dcd6d1fcb8c83bfc","unresolved":false,"context_lines":[{"line_number":1130,"context_line":"    image_path \u003d _get_image_file_path(node.uuid)"},{"line_number":1131,"context_line":"    uuid \u003d i_info[\u0027image_source\u0027]"},{"line_number":1132,"context_line":""},{"line_number":1133,"context_line":"    LOG.debug(\"Fetching image %(ami)s for node %(uuid)s\","},{"line_number":1134,"context_line":"              {\u0027ami\u0027: uuid, \u0027uuid\u0027: node.uuid})"},{"line_number":1135,"context_line":""},{"line_number":1136,"context_line":"    fetch_images(ctx, InstanceImageCache(), [(uuid, image_path)],"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_66be7ed5","line":1133,"range":{"start_line":1133,"start_character":32,"end_line":1133,"end_character":35},"updated":"2018-08-31 20:22:03.000000000","message":"nit: s/ami/image/","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":1130,"context_line":"    image_path \u003d _get_image_file_path(node.uuid)"},{"line_number":1131,"context_line":"    uuid \u003d i_info[\u0027image_source\u0027]"},{"line_number":1132,"context_line":""},{"line_number":1133,"context_line":"    LOG.debug(\"Fetching image %(ami)s for node %(uuid)s\","},{"line_number":1134,"context_line":"              {\u0027ami\u0027: uuid, \u0027uuid\u0027: node.uuid})"},{"line_number":1135,"context_line":""},{"line_number":1136,"context_line":"    fetch_images(ctx, InstanceImageCache(), [(uuid, image_path)],"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_0aad489a","line":1133,"range":{"start_line":1133,"start_character":32,"end_line":1133,"end_character":35},"in_reply_to":"3f79a3b5_66be7ed5","updated":"2018-09-01 08:23:40.000000000","message":"Done\n\nSome antique digged out of pxe :)\nami stands for amazon image?","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"47e2c2e920dc1a372370c2b3430cad363650350f","unresolved":false,"context_lines":[{"line_number":1210,"context_line":"            force_raw \u003d direct_deploy_should_convert_raw_image(node)"},{"line_number":1211,"context_line":"            _, image_path \u003d cache_instance_image(task.context, node,"},{"line_number":1212,"context_line":"                                                 force_raw\u003dforce_raw)"},{"line_number":1213,"context_line":"            if force_raw:"},{"line_number":1214,"context_line":"                checksum \u003d utils.calculate_md5_checksum(image_path)"},{"line_number":1215,"context_line":"                LOG.debug(\u0027Recalculated checksum for image %(image)s, \u0027"},{"line_number":1216,"context_line":"                          \u0027checksum %(checksum)s.\u0027, {\u0027image\u0027: image_path,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_516eac00","line":1213,"updated":"2018-08-31 10:28:05.000000000","message":"nit: Let\u0027s also insert LOG.debug befure checksumming, since it\u0027s a long operation","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":1210,"context_line":"            force_raw \u003d direct_deploy_should_convert_raw_image(node)"},{"line_number":1211,"context_line":"            _, image_path \u003d cache_instance_image(task.context, node,"},{"line_number":1212,"context_line":"                                                 force_raw\u003dforce_raw)"},{"line_number":1213,"context_line":"            if force_raw:"},{"line_number":1214,"context_line":"                checksum \u003d utils.calculate_md5_checksum(image_path)"},{"line_number":1215,"context_line":"                LOG.debug(\u0027Recalculated checksum for image %(image)s, \u0027"},{"line_number":1216,"context_line":"                          \u0027checksum %(checksum)s.\u0027, {\u0027image\u0027: image_path,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_ca667056","line":1213,"in_reply_to":"3f79a3b5_516eac00","updated":"2018-09-01 08:23:40.000000000","message":"Done\n\nCome on, 3 seconds is not a long operation for you :D","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"47e2c2e920dc1a372370c2b3430cad363650350f","unresolved":false,"context_lines":[{"line_number":1211,"context_line":"            _, image_path \u003d cache_instance_image(task.context, node,"},{"line_number":1212,"context_line":"                                                 force_raw\u003dforce_raw)"},{"line_number":1213,"context_line":"            if force_raw:"},{"line_number":1214,"context_line":"                checksum \u003d utils.calculate_md5_checksum(image_path)"},{"line_number":1215,"context_line":"                LOG.debug(\u0027Recalculated checksum for image %(image)s, \u0027"},{"line_number":1216,"context_line":"                          \u0027checksum %(checksum)s.\u0027, {\u0027image\u0027: image_path,"},{"line_number":1217,"context_line":"                                                     \u0027checksum\u0027: checksum})"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_f17498d2","line":1214,"updated":"2018-08-31 10:28:05.000000000","message":"I wonder if we can check whether the image was raw initially to avoid recalculating the checksum","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":1211,"context_line":"            _, image_path \u003d cache_instance_image(task.context, node,"},{"line_number":1212,"context_line":"                                                 force_raw\u003dforce_raw)"},{"line_number":1213,"context_line":"            if force_raw:"},{"line_number":1214,"context_line":"                checksum \u003d utils.calculate_md5_checksum(image_path)"},{"line_number":1215,"context_line":"                LOG.debug(\u0027Recalculated checksum for image %(image)s, \u0027"},{"line_number":1216,"context_line":"                          \u0027checksum %(checksum)s.\u0027, {\u0027image\u0027: image_path,"},{"line_number":1217,"context_line":"                                                     \u0027checksum\u0027: checksum})"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_8aa638ab","line":1214,"in_reply_to":"3f79a3b5_f17498d2","updated":"2018-09-01 08:23:40.000000000","message":"I thought about this, but what I\u0027m not sure about is, if the image can be altered after a raw converted to raw.\n\nI did some test on it, seems my concern could be false, but I\u0027m haven\u0027t tried all the options to confirm this is safe.","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"47e2c2e920dc1a372370c2b3430cad363650350f","unresolved":false,"context_lines":[{"line_number":1214,"context_line":"                checksum \u003d utils.calculate_md5_checksum(image_path)"},{"line_number":1215,"context_line":"                LOG.debug(\u0027Recalculated checksum for image %(image)s, \u0027"},{"line_number":1216,"context_line":"                          \u0027checksum %(checksum)s.\u0027, {\u0027image\u0027: image_path,"},{"line_number":1217,"context_line":"                                                     \u0027checksum\u0027: checksum})"},{"line_number":1218,"context_line":"                instance_info[\u0027image_checksum\u0027] \u003d checksum"},{"line_number":1219,"context_line":"                instance_info[\u0027image_disk_format\u0027] \u003d \u0027raw\u0027"},{"line_number":1220,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_117034da","line":1217,"updated":"2018-08-31 10:28:05.000000000","message":"nit: maybe include how much it took to recalculate it?","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":1214,"context_line":"                checksum \u003d utils.calculate_md5_checksum(image_path)"},{"line_number":1215,"context_line":"                LOG.debug(\u0027Recalculated checksum for image %(image)s, \u0027"},{"line_number":1216,"context_line":"                          \u0027checksum %(checksum)s.\u0027, {\u0027image\u0027: image_path,"},{"line_number":1217,"context_line":"                                                     \u0027checksum\u0027: checksum})"},{"line_number":1218,"context_line":"                instance_info[\u0027image_checksum\u0027] \u003d checksum"},{"line_number":1219,"context_line":"                instance_info[\u0027image_disk_format\u0027] \u003d \u0027raw\u0027"},{"line_number":1220,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_6a75dcf9","line":1217,"in_reply_to":"3f79a3b5_117034da","updated":"2018-09-01 08:23:40.000000000","message":"Done","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"47e2c2e920dc1a372370c2b3430cad363650350f","unresolved":false,"context_lines":[{"line_number":1244,"context_line":"            instance_info[\u0027kernel\u0027] \u003d ("},{"line_number":1245,"context_line":"                image_info[\u0027properties\u0027][\u0027kernel_id\u0027])"},{"line_number":1246,"context_line":"            instance_info[\u0027ramdisk\u0027] \u003d ("},{"line_number":1247,"context_line":"                image_info[\u0027properties\u0027][\u0027ramdisk_id\u0027])"},{"line_number":1248,"context_line":"    else:"},{"line_number":1249,"context_line":"        validate_image_url(image_source)"},{"line_number":1250,"context_line":"        instance_info[\u0027image_url\u0027] \u003d image_source"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_b17e20ad","line":1247,"updated":"2018-08-31 10:28:05.000000000","message":"nit: unrelated change?","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":1244,"context_line":"            instance_info[\u0027kernel\u0027] \u003d ("},{"line_number":1245,"context_line":"                image_info[\u0027properties\u0027][\u0027kernel_id\u0027])"},{"line_number":1246,"context_line":"            instance_info[\u0027ramdisk\u0027] \u003d ("},{"line_number":1247,"context_line":"                image_info[\u0027properties\u0027][\u0027ramdisk_id\u0027])"},{"line_number":1248,"context_line":"    else:"},{"line_number":1249,"context_line":"        validate_image_url(image_source)"},{"line_number":1250,"context_line":"        instance_info[\u0027image_url\u0027] \u003d image_source"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_0a5ea875","line":1247,"in_reply_to":"3f79a3b5_b17e20ad","updated":"2018-09-01 08:23:40.000000000","message":"Done\n\nyup, caused by several indent operations","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"}],"releasenotes/notes/agent-http-provisioning-d116b3ff36669d16.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9d06b403d064913cc6045fbde143a4bdd7ede632","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds the ability to provision with ``direct`` deploy interface and custom"},{"line_number":4,"context_line":"    HTTP service running at ironic conductor node. A new configuration option"},{"line_number":5,"context_line":"    ``[agent]image_download_source`` is introduced, when set to ``swift``,"},{"line_number":6,"context_line":"    the ``direct`` deploy interface uses tempurl generated via the Object"},{"line_number":7,"context_line":"    service as the source of instance image during provisioning, this is the"},{"line_number":8,"context_line":"    default configuration. When set to ``http``, the ``direct`` deploy"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3f79a3b5_55c6266a","line":5,"updated":"2018-09-06 11:00:04.000000000","message":"nit: \"introduced. When it is set ...\"","commit_id":"92a02d6f206d9de218664ce80b9e4b37eddefffb"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b7e07d853e93f14f6b2b4937bb983f0a2e9986ff","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds the ability to provision with ``direct`` deploy interface and custom"},{"line_number":4,"context_line":"    HTTP service running at ironic conductor node. A new configuration option"},{"line_number":5,"context_line":"    ``[agent]image_download_source`` is introduced, when set to ``swift``,"},{"line_number":6,"context_line":"    the ``direct`` deploy interface uses tempurl generated via the Object"},{"line_number":7,"context_line":"    service as the source of instance image during provisioning, this is the"},{"line_number":8,"context_line":"    default configuration. When set to ``http``, the ``direct`` deploy"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3f79a3b5_e883c601","line":5,"in_reply_to":"3f79a3b5_55c6266a","updated":"2018-09-07 09:11:08.000000000","message":"Done","commit_id":"92a02d6f206d9de218664ce80b9e4b37eddefffb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9d06b403d064913cc6045fbde143a4bdd7ede632","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    interface downloads instance image from the Image service, and caches the"},{"line_number":10,"context_line":"    image in the ironic conductor node. The cached instance images are"},{"line_number":11,"context_line":"    referenced by symbolic links located at subdirectory"},{"line_number":12,"context_line":"    ``[deploy]http_image_subdir`` under path ``[deploy]http_root``. The rule"},{"line_number":13,"context_line":"    for the instance image URL generated is"},{"line_number":14,"context_line":"    ``[deploy]http_url``/``[deploy]http_image_subdir``/node_uuid. The custom"},{"line_number":15,"context_line":"    HTTP server running at ironic conductor node is supposed to be configured"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3f79a3b5_75c1e24d","line":12,"updated":"2018-09-06 11:00:04.000000000","message":"s/rule/pattern/. actually, I\u0027d skip this sentence, it does not add much value to the previous one.","commit_id":"92a02d6f206d9de218664ce80b9e4b37eddefffb"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b7e07d853e93f14f6b2b4937bb983f0a2e9986ff","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    interface downloads instance image from the Image service, and caches the"},{"line_number":10,"context_line":"    image in the ironic conductor node. The cached instance images are"},{"line_number":11,"context_line":"    referenced by symbolic links located at subdirectory"},{"line_number":12,"context_line":"    ``[deploy]http_image_subdir`` under path ``[deploy]http_root``. The rule"},{"line_number":13,"context_line":"    for the instance image URL generated is"},{"line_number":14,"context_line":"    ``[deploy]http_url``/``[deploy]http_image_subdir``/node_uuid. The custom"},{"line_number":15,"context_line":"    HTTP server running at ironic conductor node is supposed to be configured"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3f79a3b5_48a99a79","line":12,"in_reply_to":"3f79a3b5_75c1e24d","updated":"2018-09-07 09:11:08.000000000","message":"Done\n\nremoved this sentence.","commit_id":"92a02d6f206d9de218664ce80b9e4b37eddefffb"}],"zuul.d/ironic-jobs.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"47e2c2e920dc1a372370c2b3430cad363650350f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"3f79a3b5_91644423","line":259,"updated":"2018-08-31 10:28:05.000000000","message":"nit: no newline at end of file","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"3f79a3b5_eacfac26","line":259,"in_reply_to":"3f79a3b5_91644423","updated":"2018-09-01 08:23:40.000000000","message":"Done","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"}],"zuul.d/project.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"47e2c2e920dc1a372370c2b3430cad363650350f","unresolved":false,"context_lines":[{"line_number":17,"context_line":"        - ironic-tempest-dsvm-bfv"},{"line_number":18,"context_line":"        - ironic-tempest-dsvm-ipa-partition-pxe_ipmitool-tinyipa-python3"},{"line_number":19,"context_line":"        - ironic-tempest-dsvm-ipa-partition-redfish-tinyipa"},{"line_number":20,"context_line":"        - ironic-tempest-dsvm-ipa-partition-uefi-pxe_ipmitool-tinyipa"},{"line_number":21,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-agent_ipmitool-tinyipa-multinode"},{"line_number":22,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-bios-agent_ipmitool-tinyipa"},{"line_number":23,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-bios-agent_ipmitool-tinyipa-indirect"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"3f79a3b5_316bf0f1","line":20,"updated":"2018-08-31 10:28:05.000000000","message":"maybe also create a variant of a partition job to make sure we do everything right?","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"996060f951638d67c2a06c20dcd6d1fcb8c83bfc","unresolved":false,"context_lines":[{"line_number":17,"context_line":"        - ironic-tempest-dsvm-bfv"},{"line_number":18,"context_line":"        - ironic-tempest-dsvm-ipa-partition-pxe_ipmitool-tinyipa-python3"},{"line_number":19,"context_line":"        - ironic-tempest-dsvm-ipa-partition-redfish-tinyipa"},{"line_number":20,"context_line":"        - ironic-tempest-dsvm-ipa-partition-uefi-pxe_ipmitool-tinyipa"},{"line_number":21,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-agent_ipmitool-tinyipa-multinode"},{"line_number":22,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-bios-agent_ipmitool-tinyipa"},{"line_number":23,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-bios-agent_ipmitool-tinyipa-indirect"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"3f79a3b5_c6caf24d","line":20,"in_reply_to":"3f79a3b5_316bf0f1","updated":"2018-08-31 20:22:03.000000000","message":"I would highly prefer if we perform it as a single slightly longer running testing both a partition image and a wholedisk image.","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"e925f120ea94770c52bef1222d58236480d11f46","unresolved":false,"context_lines":[{"line_number":17,"context_line":"        - ironic-tempest-dsvm-bfv"},{"line_number":18,"context_line":"        - ironic-tempest-dsvm-ipa-partition-pxe_ipmitool-tinyipa-python3"},{"line_number":19,"context_line":"        - ironic-tempest-dsvm-ipa-partition-redfish-tinyipa"},{"line_number":20,"context_line":"        - ironic-tempest-dsvm-ipa-partition-uefi-pxe_ipmitool-tinyipa"},{"line_number":21,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-agent_ipmitool-tinyipa-multinode"},{"line_number":22,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-bios-agent_ipmitool-tinyipa"},{"line_number":23,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-bios-agent_ipmitool-tinyipa-indirect"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"3f79a3b5_3c9de065","line":20,"in_reply_to":"3f79a3b5_316bf0f1","updated":"2018-09-03 12:10:53.000000000","message":"added a job to test against partition image.","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b3b1cffc7e921b34c57aac27c0d55894f6f48bbc","unresolved":false,"context_lines":[{"line_number":17,"context_line":"        - ironic-tempest-dsvm-bfv"},{"line_number":18,"context_line":"        - ironic-tempest-dsvm-ipa-partition-pxe_ipmitool-tinyipa-python3"},{"line_number":19,"context_line":"        - ironic-tempest-dsvm-ipa-partition-redfish-tinyipa"},{"line_number":20,"context_line":"        - ironic-tempest-dsvm-ipa-partition-uefi-pxe_ipmitool-tinyipa"},{"line_number":21,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-agent_ipmitool-tinyipa-multinode"},{"line_number":22,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-bios-agent_ipmitool-tinyipa"},{"line_number":23,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-bios-agent_ipmitool-tinyipa-indirect"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"3f79a3b5_0aec688d","line":20,"in_reply_to":"3f79a3b5_c6caf24d","updated":"2018-09-01 08:23:40.000000000","message":"I\u0027m not sure I know how to achieve that in one job, is there any example for a reference?","commit_id":"416a7170f764e031a5799cedd7845c920bcd5ec7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9d06b403d064913cc6045fbde143a4bdd7ede632","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        - ironic-tempest-dsvm-ipa-partition-redfish-tinyipa"},{"line_number":45,"context_line":"        - ironic-tempest-dsvm-ipa-partition-uefi-pxe_ipmitool-tinyipa"},{"line_number":46,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-agent_ipmitool-tinyipa-multinode"},{"line_number":47,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-bios-agent_ipmitool-tinyipa"},{"line_number":48,"context_line":"        - openstack-tox-lower-constraints"},{"line_number":49,"context_line":"        - openstack-tox-cover"},{"line_number":50,"context_line":"    experimental:"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3f79a3b5_b5cbfa6f","line":47,"updated":"2018-09-06 11:00:04.000000000","message":"any voting check jobs have to be added here as well","commit_id":"92a02d6f206d9de218664ce80b9e4b37eddefffb"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"b7e07d853e93f14f6b2b4937bb983f0a2e9986ff","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        - ironic-tempest-dsvm-ipa-partition-redfish-tinyipa"},{"line_number":45,"context_line":"        - ironic-tempest-dsvm-ipa-partition-uefi-pxe_ipmitool-tinyipa"},{"line_number":46,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-agent_ipmitool-tinyipa-multinode"},{"line_number":47,"context_line":"        - ironic-tempest-dsvm-ipa-wholedisk-bios-agent_ipmitool-tinyipa"},{"line_number":48,"context_line":"        - openstack-tox-lower-constraints"},{"line_number":49,"context_line":"        - openstack-tox-cover"},{"line_number":50,"context_line":"    experimental:"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3f79a3b5_a8ccee60","line":47,"in_reply_to":"3f79a3b5_b5cbfa6f","updated":"2018-09-07 09:11:08.000000000","message":"Done","commit_id":"92a02d6f206d9de218664ce80b9e4b37eddefffb"}]}
