)]}'
{"ironic_python_agent/extensions/standby.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ecf593ba3b2230a3ca167d1f3ce065ba8161fe42","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def _path_to_script(script):"},{"line_number":54,"context_line":"    \"\"\"Get the location of a script in the local file system."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    :param script: The script name as a string."},{"line_number":57,"context_line":"    :returns: The relative path to the script."}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_88ba3809","line":54,"updated":"2016-03-04 20:11:37.000000000","message":"I\u0027d actually change this up; this gets the path to a script relative to the ironic-python-agent package location (as it\u0027s designed to get the patch to the bash scripts we ship in the package).","commit_id":"5cd714f06dda9abc3d1df6307069cca24970445b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ecf593ba3b2230a3ca167d1f3ce065ba8161fe42","unresolved":false,"context_lines":[{"line_number":107,"context_line":"def _write_configdrive_to_file(configdrive, filename):"},{"line_number":108,"context_line":"    \"\"\"Writes the configdrive to a file."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    :param configdrive: Contents of the configdrive file."},{"line_number":111,"context_line":"    :param filename: The filename of where to write the configdrive."},{"line_number":112,"context_line":"    \"\"\""},{"line_number":113,"context_line":"    LOG.debug(\u0027Writing configdrive to {0}\u0027.format(filename))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_e85c9cf2","line":110,"updated":"2016-03-04 20:11:37.000000000","message":"I\u0027d add \"gzipped and base64 encoded\" somewhere here, maybe even outside of this param thing.","commit_id":"5cd714f06dda9abc3d1df6307069cca24970445b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ecf593ba3b2230a3ca167d1f3ce065ba8161fe42","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        Trys each URL in image_info successively until a URL returns a"},{"line_number":176,"context_line":"        successful request code. Once the object is initialized, the user may"},{"line_number":177,"context_line":"        retrieve chunks of the image through the standard python interator"},{"line_number":178,"context_line":"        interface until either the image is fully downloaded, or an error is"},{"line_number":179,"context_line":"        encountered."},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_486e7097","line":177,"updated":"2016-03-04 20:11:37.000000000","message":"Nit: s/interator/iterator/","commit_id":"5cd714f06dda9abc3d1df6307069cca24970445b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ecf593ba3b2230a3ca167d1f3ce065ba8161fe42","unresolved":false,"context_lines":[{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        :returns: A chunk of the image. Size of chunk is IMAGE_CHUNK_SIZE"},{"line_number":234,"context_line":"                  which is set in this module."},{"line_number":235,"context_line":"        \"\"\""},{"line_number":236,"context_line":"        for chunk in self._request.iter_content(IMAGE_CHUNK_SIZE):"},{"line_number":237,"context_line":"            self._md5checksum.update(chunk)"},{"line_number":238,"context_line":"            yield chunk"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_681fec09","line":235,"updated":"2016-03-04 20:11:37.000000000","message":"I\u0027m surprised to see __iter__ docstring\u0027d, but I guess it\u0027s nice to have. :P","commit_id":"5cd714f06dda9abc3d1df6307069cca24970445b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ecf593ba3b2230a3ca167d1f3ce065ba8161fe42","unresolved":false,"context_lines":[{"line_number":240,"context_line":"    def md5sum(self):"},{"line_number":241,"context_line":"        \"\"\"Computes and returns the md5 checksum of the downloaded image."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        Note that md5sum will not return the true checksum of the image unti"},{"line_number":244,"context_line":"        the download has been fully completed through this object\u0027s"},{"line_number":245,"context_line":"        iterator inferface."},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_a8f0d4ca","line":243,"updated":"2016-03-04 20:11:37.000000000","message":"Nit: s/unti/until/","commit_id":"5cd714f06dda9abc3d1df6307069cca24970445b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ecf593ba3b2230a3ca167d1f3ce065ba8161fe42","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        the download has been fully completed through this object\u0027s"},{"line_number":245,"context_line":"        iterator inferface."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"        :returns: The md5 checksum of the image as a string in hexidecimal."},{"line_number":248,"context_line":"        \"\"\""},{"line_number":249,"context_line":"        return self._md5checksum.hexdigest()"},{"line_number":250,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_a8c73463","line":247,"updated":"2016-03-04 20:11:37.000000000","message":"Nit: s/hexidecimal/hexadecimal/","commit_id":"5cd714f06dda9abc3d1df6307069cca24970445b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ecf593ba3b2230a3ca167d1f3ce065ba8161fe42","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"def _verify_image(image_info, image_location, checksum):"},{"line_number":253,"context_line":"    \"\"\"Verifys the checksum of the local images matches expectations."},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    If this function does not raise ImageChecksumError then it is very likely"},{"line_number":256,"context_line":"    that the local copy of the image was transmitted and stored correctly."}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_c8a440bb","line":253,"updated":"2016-03-04 20:11:37.000000000","message":"Nit: s/verifys/verifies/","commit_id":"5cd714f06dda9abc3d1df6307069cca24970445b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ecf593ba3b2230a3ca167d1f3ce065ba8161fe42","unresolved":false,"context_lines":[{"line_number":332,"context_line":"    def __init__(self, agent\u003dNone):"},{"line_number":333,"context_line":"        \"\"\"Constructs an instance of StandbyExtension."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        :param agent: Optional. IronicPythonAgent object. Defaults to None."},{"line_number":336,"context_line":"        \"\"\""},{"line_number":337,"context_line":"        super(StandbyExtension, self).__init__(agent\u003dagent)"},{"line_number":338,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_e8b49cd5","line":335,"updated":"2016-03-04 20:11:37.000000000","message":"nit, I\u0027d remove the period after optional, or add \"an\" before IronicPythonAgent. Or maybe: An optional IronicPythonAgent object...","commit_id":"5cd714f06dda9abc3d1df6307069cca24970445b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ecf593ba3b2230a3ca167d1f3ce065ba8161fe42","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        \"\"\"Asynchronously prepares specified image on local OS install device."},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        In this case, \u0027prepare\u0027 means make local machine completely ready to"},{"line_number":422,"context_line":"        reboot to the image specified by image_info."},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        :param image_info: Image information dictionary as returned by glance."},{"line_number":425,"context_line":"        :param configdrive: Location of the configdrive as a string. Can be"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_48f4b086","line":422,"updated":"2016-03-04 20:11:37.000000000","message":"Can we add some words that this will download and write the image if necessary, and write a configdrive if one is given?","commit_id":"5cd714f06dda9abc3d1df6307069cca24970445b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ecf593ba3b2230a3ca167d1f3ce065ba8161fe42","unresolved":false,"context_lines":[{"line_number":458,"context_line":"        return msg"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"    def _run_shutdown_script(self, parameter):"},{"line_number":461,"context_line":"        \"\"\"Runs the agent\u0027s shutdown script with the specified parameter."},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"        :param parameter: The parameter to send to the shutdown script."},{"line_number":464,"context_line":"        :raises: SystemRebootError if calling the shutdown script returns an"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_c87c40ee","line":461,"updated":"2016-03-04 20:11:37.000000000","message":"Maybe note that the parameter may be \u0027-h\u0027 for halt or \u0027-r\u0027 for reboot, others will have no effect.","commit_id":"5cd714f06dda9abc3d1df6307069cca24970445b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ecf593ba3b2230a3ca167d1f3ce065ba8161fe42","unresolved":false,"context_lines":[{"line_number":474,"context_line":""},{"line_number":475,"context_line":"    @base.async_command(\u0027run_image\u0027)"},{"line_number":476,"context_line":"    def run_image(self):"},{"line_number":477,"context_line":"        \"\"\"Reboots agent\u0027s system into the locally stored OS image.\"\"\""},{"line_number":478,"context_line":"        LOG.info(\u0027Rebooting system\u0027)"},{"line_number":479,"context_line":"        self._run_shutdown_script(\u0027-r\u0027)"},{"line_number":480,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_085e2876","line":477,"updated":"2016-03-04 20:11:37.000000000","message":"Maybe \"reboots agent\u0027s system in-band via sysrq-trigger\", I think \"locally stored image\" isn\u0027t always true (iscsi driver case).","commit_id":"5cd714f06dda9abc3d1df6307069cca24970445b"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"ecf593ba3b2230a3ca167d1f3ce065ba8161fe42","unresolved":false,"context_lines":[{"line_number":480,"context_line":""},{"line_number":481,"context_line":"    @base.async_command(\u0027power_off\u0027)"},{"line_number":482,"context_line":"    def power_off(self):"},{"line_number":483,"context_line":"        \"\"\"Powers off the agent\u0027s system.\"\"\""},{"line_number":484,"context_line":"        LOG.info(\u0027Powering off system\u0027)"},{"line_number":485,"context_line":"        self._run_shutdown_script(\u0027-h\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7af24918_68da4ceb","line":483,"updated":"2016-03-04 20:11:37.000000000","message":"Maybe add \"via sysrq-trigger\"","commit_id":"5cd714f06dda9abc3d1df6307069cca24970445b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2eb8c8acf8be1333beaf2d5c06332798bdd4fd12","unresolved":false,"context_lines":[{"line_number":125,"context_line":"def _write_configdrive_to_partition(configdrive, device):"},{"line_number":126,"context_line":"    \"\"\"Writes the configdrive to a partition."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    :param configdrive: The location of the configdrive as a string."},{"line_number":129,"context_line":"    :param device: The device name, as a string, on which to store the image."},{"line_number":130,"context_line":"                   Example: \u0027/dev/sda1\u0027"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_9dc9b8af","line":128,"updated":"2016-03-06 20:45:59.000000000","message":"hmm, it looks like on line #139 we pass this configdrive to _write_configdrive_to_file, which accepts the contents. It looks like this function can accept both contents and URL.","commit_id":"e8e0a8439f5e26dcc4b187cde491ae59fbd75a02"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2eb8c8acf8be1333beaf2d5c06332798bdd4fd12","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        \"\"\"Downloads and returns the next chunk of the image."},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        :returns: A chunk of the image. Size of chunk is IMAGE_CHUNK_SIZE"},{"line_number":237,"context_line":"                  which is set in this module."},{"line_number":238,"context_line":"        \"\"\""},{"line_number":239,"context_line":"        for chunk in self._request.iter_content(IMAGE_CHUNK_SIZE):"},{"line_number":240,"context_line":"            self._md5checksum.update(chunk)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_7dce6cb5","line":237,"updated":"2016-03-06 20:45:59.000000000","message":"nit: s/is set/is a constant/","commit_id":"e8e0a8439f5e26dcc4b187cde491ae59fbd75a02"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2eb8c8acf8be1333beaf2d5c06332798bdd4fd12","unresolved":false,"context_lines":[{"line_number":304,"context_line":"def _validate_image_info(ext, image_info\u003dNone, **kwargs):"},{"line_number":305,"context_line":"    \"\"\"Validates the image_info dictionary has all required information."},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    :param ext: Object \u0027self\u0027. Unused by this function directly. Unused, but"},{"line_number":308,"context_line":"                here for compatability with async_command validation."},{"line_number":309,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":310,"context_line":"    :param kwargs: Additional keyword arguments. Unused, but here for"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_ddc34089","line":307,"updated":"2016-03-06 20:45:59.000000000","message":"Twice \"unused\" here. maybe you meant \"Unused by this function directly, but left for compatibility...\"","commit_id":"e8e0a8439f5e26dcc4b187cde491ae59fbd75a02"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2eb8c8acf8be1333beaf2d5c06332798bdd4fd12","unresolved":false,"context_lines":[{"line_number":430,"context_line":"        :param image_info: Image information dictionary as returned by glance."},{"line_number":431,"context_line":"        :param configdrive: Location of the configdrive as a string. Can be"},{"line_number":432,"context_line":"                            URL or local file system location. Optional,"},{"line_number":433,"context_line":"                            defaults to None."},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        :raises: ImageDownloadError if the image download encounters an error."},{"line_number":436,"context_line":"        :raises: ImageChecksumError if the checksum of the local image does not"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_bdc0f47d","line":433,"updated":"2016-03-06 20:45:59.000000000","message":"I don\u0027t think we accept a local file system location, it would be weird for a remote command. Instead, judging by the call to _write_configdrive_to_partition, it may accept the contents. Could you check please?","commit_id":"e8e0a8439f5e26dcc4b187cde491ae59fbd75a02"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"fbe42de3ee1230dcd705ad6926e18f7fbd67d04f","unresolved":false,"context_lines":[{"line_number":430,"context_line":"        :param image_info: Image information dictionary as returned by glance."},{"line_number":431,"context_line":"        :param configdrive: Location of the configdrive as a string. Can be"},{"line_number":432,"context_line":"                            URL or local file system location. Optional,"},{"line_number":433,"context_line":"                            defaults to None."},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        :raises: ImageDownloadError if the image download encounters an error."},{"line_number":436,"context_line":"        :raises: ImageChecksumError if the checksum of the local image does not"}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_4b10244f","line":433,"in_reply_to":"7af24918_bdc0f47d","updated":"2016-03-07 12:12:04.000000000","message":"+1, it\u0027s the (gzip/base64) contents or a url.","commit_id":"e8e0a8439f5e26dcc4b187cde491ae59fbd75a02"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b2006b0c67913032025deb8c610624908aff698c","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def _path_to_script(script):"},{"line_number":55,"context_line":"    \"\"\"Get the location of a script which ships with the ironic-python-agent."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    :param script: The script name as a string."},{"line_number":58,"context_line":"    :returns: The relative path to the script."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_d62c239b","line":55,"updated":"2016-03-31 15:07:10.000000000","message":"Nit: s/the//","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"9ef27f948b1a5f088501ad3ad05ee6d03a3464ef","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def _path_to_script(script):"},{"line_number":55,"context_line":"    \"\"\"Get the location of a script which ships with the ironic-python-agent."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    :param script: The script name as a string."},{"line_number":58,"context_line":"    :returns: The relative path to the script."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_d0cf0454","line":55,"in_reply_to":"ba0121b8_d62c239b","updated":"2016-03-31 16:26:17.000000000","message":"Done","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b2006b0c67913032025deb8c610624908aff698c","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    \"\"\"Call disk_util to create partition and write the partition image."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    :param image: Local path to image file to be written to the partition."},{"line_number":68,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":69,"context_line":"    :param device: The device name, as a string, on which to store the image."},{"line_number":70,"context_line":"                   Example: \u0027/dev/sda1\u0027"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_16717ba8","line":68,"updated":"2016-03-31 15:07:10.000000000","message":"Nit: it\u0027s the dictionary passed into the command using this. We\u0027ve successfully butchered it enough that it doesn\u0027t look like the info coming back from glance. :)","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"9ef27f948b1a5f088501ad3ad05ee6d03a3464ef","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    \"\"\"Call disk_util to create partition and write the partition image."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    :param image: Local path to image file to be written to the partition."},{"line_number":68,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":69,"context_line":"    :param device: The device name, as a string, on which to store the image."},{"line_number":70,"context_line":"                   Example: \u0027/dev/sda1\u0027"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_b08250c6","line":68,"in_reply_to":"ba0121b8_16717ba8","updated":"2016-03-31 16:26:17.000000000","message":"Done","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b2006b0c67913032025deb8c610624908aff698c","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    :param image: Local path to image file to be written to the partition."},{"line_number":68,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":69,"context_line":"    :param device: The device name, as a string, on which to store the image."},{"line_number":70,"context_line":"                   Example: \u0027/dev/sda1\u0027"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :raises: InvalidCommandParamsError if the partition is too small for the"},{"line_number":73,"context_line":"             provided image."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_b6e52f39","line":70,"updated":"2016-03-31 15:07:10.000000000","message":"Nit: this is intended to be written to a disk, e.g. /dev/sda.","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"9ef27f948b1a5f088501ad3ad05ee6d03a3464ef","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    :param image: Local path to image file to be written to the partition."},{"line_number":68,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":69,"context_line":"    :param device: The device name, as a string, on which to store the image."},{"line_number":70,"context_line":"                   Example: \u0027/dev/sda1\u0027"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :raises: InvalidCommandParamsError if the partition is too small for the"},{"line_number":73,"context_line":"             provided image."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_50665451","line":70,"in_reply_to":"ba0121b8_b6e52f39","updated":"2016-03-31 16:26:17.000000000","message":"Done","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b2006b0c67913032025deb8c610624908aff698c","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":109,"context_line":"                       This parameter is currently unused by the function."},{"line_number":110,"context_line":"    :param device: The device name, as a string, on which to store the image."},{"line_number":111,"context_line":"                   Example: \u0027/dev/sda1\u0027"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    :raises: ImageWriteError if the command to write the image encounters an"},{"line_number":114,"context_line":"             error."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_16f69bf8","line":111,"updated":"2016-03-31 15:07:10.000000000","message":"Nit: this is intended to be written to a disk, e.g. /dev/sda.","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"9ef27f948b1a5f088501ad3ad05ee6d03a3464ef","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":109,"context_line":"                       This parameter is currently unused by the function."},{"line_number":110,"context_line":"    :param device: The device name, as a string, on which to store the image."},{"line_number":111,"context_line":"                   Example: \u0027/dev/sda1\u0027"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    :raises: ImageWriteError if the command to write the image encounters an"},{"line_number":114,"context_line":"             error."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_d0526466","line":111,"in_reply_to":"ba0121b8_16f69bf8","updated":"2016-03-31 16:26:17.000000000","message":"Done","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b2006b0c67913032025deb8c610624908aff698c","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":129,"context_line":"    :param device: The device name, as a string, on which to store the image."},{"line_number":130,"context_line":"                   Example: \u0027/dev/sda1\u0027"},{"line_number":131,"context_line":"    :raises: ImageWriteError if the command to write the image encounters an"},{"line_number":132,"context_line":"             error."},{"line_number":133,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_76df1769","line":130,"updated":"2016-03-31 15:07:10.000000000","message":"Nit: this is intended to be written to a disk, e.g. /dev/sda.","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"9ef27f948b1a5f088501ad3ad05ee6d03a3464ef","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":129,"context_line":"    :param device: The device name, as a string, on which to store the image."},{"line_number":130,"context_line":"                   Example: \u0027/dev/sda1\u0027"},{"line_number":131,"context_line":"    :raises: ImageWriteError if the command to write the image encounters an"},{"line_number":132,"context_line":"             error."},{"line_number":133,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_10497cb7","line":130,"in_reply_to":"ba0121b8_76df1769","updated":"2016-03-31 16:26:17.000000000","message":"Done","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b2006b0c67913032025deb8c610624908aff698c","unresolved":false,"context_lines":[{"line_number":389,"context_line":"    \"\"\"Validates the image_info dictionary has all required information."},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    :param ext: Object \u0027self\u0027. Unused by this function directly, but left for"},{"line_number":392,"context_line":"                compatability with async_command validation."},{"line_number":393,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":394,"context_line":"    :param kwargs: Additional keyword arguments. Unused, but here for"},{"line_number":395,"context_line":"                   compatability with async_command validation."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_d63d4390","line":392,"updated":"2016-03-31 15:07:10.000000000","message":"Nit: compatibility","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"9ef27f948b1a5f088501ad3ad05ee6d03a3464ef","unresolved":false,"context_lines":[{"line_number":389,"context_line":"    \"\"\"Validates the image_info dictionary has all required information."},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    :param ext: Object \u0027self\u0027. Unused by this function directly, but left for"},{"line_number":392,"context_line":"                compatability with async_command validation."},{"line_number":393,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":394,"context_line":"    :param kwargs: Additional keyword arguments. Unused, but here for"},{"line_number":395,"context_line":"                   compatability with async_command validation."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_50cdb42f","line":392,"in_reply_to":"ba0121b8_d63d4390","updated":"2016-03-31 16:26:17.000000000","message":"Done","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b2006b0c67913032025deb8c610624908aff698c","unresolved":false,"context_lines":[{"line_number":392,"context_line":"                compatability with async_command validation."},{"line_number":393,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":394,"context_line":"    :param kwargs: Additional keyword arguments. Unused, but here for"},{"line_number":395,"context_line":"                   compatability with async_command validation."},{"line_number":396,"context_line":"    :raises: InvalidCommandParamsError if the data contained in image_info"},{"line_number":397,"context_line":"             does not match type and key:value pair requirements and"},{"line_number":398,"context_line":"             expectations."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_363f5f88","line":395,"updated":"2016-03-31 15:07:10.000000000","message":"compatibility","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"9ef27f948b1a5f088501ad3ad05ee6d03a3464ef","unresolved":false,"context_lines":[{"line_number":392,"context_line":"                compatability with async_command validation."},{"line_number":393,"context_line":"    :param image_info: Image information dictionary as returned by glance."},{"line_number":394,"context_line":"    :param kwargs: Additional keyword arguments. Unused, but here for"},{"line_number":395,"context_line":"                   compatability with async_command validation."},{"line_number":396,"context_line":"    :raises: InvalidCommandParamsError if the data contained in image_info"},{"line_number":397,"context_line":"             does not match type and key:value pair requirements and"},{"line_number":398,"context_line":"             expectations."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_b0d090ca","line":395,"in_reply_to":"ba0121b8_363f5f88","updated":"2016-03-31 16:26:17.000000000","message":"Done","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b2006b0c67913032025deb8c610624908aff698c","unresolved":false,"context_lines":[{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        :param image_info: Image information dictionary as returned by glance."},{"line_number":449,"context_line":"        :param device: The device name, as a string, on which to store the"},{"line_number":450,"context_line":"                       image.  Example: \u0027/dev/sda1\u0027"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        :raises: ImageDownloadError if the image download encounters an error."},{"line_number":453,"context_line":"        :raises: ImageChecksumError if the checksum of the local image does not"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_36563fce","line":450,"updated":"2016-03-31 15:07:10.000000000","message":"Again, I believe this is intended to be a disk device e.g. /dev/sda","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"9ef27f948b1a5f088501ad3ad05ee6d03a3464ef","unresolved":false,"context_lines":[{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        :param image_info: Image information dictionary as returned by glance."},{"line_number":449,"context_line":"        :param device: The device name, as a string, on which to store the"},{"line_number":450,"context_line":"                       image.  Example: \u0027/dev/sda1\u0027"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        :raises: ImageDownloadError if the image download encounters an error."},{"line_number":453,"context_line":"        :raises: ImageChecksumError if the checksum of the local image does not"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_90d3ccd4","line":450,"in_reply_to":"ba0121b8_36563fce","updated":"2016-03-31 16:26:17.000000000","message":"Done","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b2006b0c67913032025deb8c610624908aff698c","unresolved":false,"context_lines":[{"line_number":580,"context_line":""},{"line_number":581,"context_line":"    @base.async_command(\u0027run_image\u0027)"},{"line_number":582,"context_line":"    def run_image(self):"},{"line_number":583,"context_line":"        \"\"\"Runs image on agent\u0027s system using reboot via sysrq-trigger.\"\"\""},{"line_number":584,"context_line":"        LOG.info(\u0027Rebooting system\u0027)"},{"line_number":585,"context_line":"        self._run_shutdown_script(\u0027-r\u0027)"},{"line_number":586,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_b601afb1","line":583,"updated":"2016-03-31 15:07:10.000000000","message":"No longer true :/ https://github.com/openstack/ironic-python-agent/commit/cbd90c1c14e083c5cc563cfd94f55266d28f77be","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"9ef27f948b1a5f088501ad3ad05ee6d03a3464ef","unresolved":false,"context_lines":[{"line_number":580,"context_line":""},{"line_number":581,"context_line":"    @base.async_command(\u0027run_image\u0027)"},{"line_number":582,"context_line":"    def run_image(self):"},{"line_number":583,"context_line":"        \"\"\"Runs image on agent\u0027s system using reboot via sysrq-trigger.\"\"\""},{"line_number":584,"context_line":"        LOG.info(\u0027Rebooting system\u0027)"},{"line_number":585,"context_line":"        self._run_shutdown_script(\u0027-r\u0027)"},{"line_number":586,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_10533c3a","line":583,"in_reply_to":"ba0121b8_b601afb1","updated":"2016-03-31 16:26:17.000000000","message":"Done","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b2006b0c67913032025deb8c610624908aff698c","unresolved":false,"context_lines":[{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    @base.async_command(\u0027power_off\u0027)"},{"line_number":588,"context_line":"    def power_off(self):"},{"line_number":589,"context_line":"        \"\"\"Powers off the agent\u0027s system via sysrq-trigger.\"\"\""},{"line_number":590,"context_line":"        LOG.info(\u0027Powering off system\u0027)"},{"line_number":591,"context_line":"        self._run_shutdown_script(\u0027-h\u0027)"},{"line_number":592,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_96fe2bac","line":589,"updated":"2016-03-31 15:07:10.000000000","message":"No longer true :/ https://github.com/openstack/ironic-python-agent/commit/cbd90c1c14e083c5cc563cfd94f55266d28f77be","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"9ef27f948b1a5f088501ad3ad05ee6d03a3464ef","unresolved":false,"context_lines":[{"line_number":586,"context_line":""},{"line_number":587,"context_line":"    @base.async_command(\u0027power_off\u0027)"},{"line_number":588,"context_line":"    def power_off(self):"},{"line_number":589,"context_line":"        \"\"\"Powers off the agent\u0027s system via sysrq-trigger.\"\"\""},{"line_number":590,"context_line":"        LOG.info(\u0027Powering off system\u0027)"},{"line_number":591,"context_line":"        self._run_shutdown_script(\u0027-h\u0027)"},{"line_number":592,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_503774fe","line":589,"in_reply_to":"ba0121b8_96fe2bac","updated":"2016-03-31 16:26:17.000000000","message":"Done","commit_id":"a0042f2f17d9d073f8cbc9d7bae9b2dfe125739f"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"035868825af7973dc935c9a6ce8774d1d2d15436","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                        as a URL OR the contents of the configdrive which"},{"line_number":190,"context_line":"                        must be gzipped and base64 encoded."},{"line_number":191,"context_line":"    :param device: The disk name, as a string, on which to store the image."},{"line_number":192,"context_line":"                   Example: \u0027/dev/sda\u0027"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    :raises: ConfigDriveTooLargeError if the configdrive contents are too"},{"line_number":195,"context_line":"             large to store on the given device."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba0121b8_b36d3ace","line":192,"updated":"2016-03-31 16:28:31.000000000","message":"Well, this one is a partition :)","commit_id":"1a7b1ad3e220a2f729377e3796af53dc19aa59a3"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"0a32e4f094e5de1f890029337a707a26301cf8e2","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                        as a URL OR the contents of the configdrive which"},{"line_number":190,"context_line":"                        must be gzipped and base64 encoded."},{"line_number":191,"context_line":"    :param device: The disk name, as a string, on which to store the image."},{"line_number":192,"context_line":"                   Example: \u0027/dev/sda\u0027"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    :raises: ConfigDriveTooLargeError if the configdrive contents are too"},{"line_number":195,"context_line":"             large to store on the given device."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba0121b8_53cdbe2f","line":192,"in_reply_to":"ba0121b8_b36d3ace","updated":"2016-03-31 16:42:32.000000000","message":"Bah, I\u0027m wrong, this takes a disk.","commit_id":"1a7b1ad3e220a2f729377e3796af53dc19aa59a3"}]}
