)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"f8233575297d800ed420b09905d1fd4c2f58851d","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Depends-On: Ib3e8b41202f56ea1f5efd83b28932eb8edcbbbc3"},{"line_number":18,"context_line":"Change-Id: Id4bc7f1a2f20936a02395f0f2147381b4649beea"},{"line_number":19,"context_line":"Implements: blueprint ironic-libvirt-api"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a7e1126_ac95eae4","line":19,"updated":"2015-12-17 12:40:44.000000000","message":"Please use an RFE bug instead of blueprint here.","commit_id":"e6558fc632a638c0a6446732b2295a06bd6404fb"}],"ironic/common/exception.py":[{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"09621093b9d55fdecb2723df9bcd351995d0977c","unresolved":false,"context_lines":[{"line_number":610,"context_line":"    _msg_fmt \u003d _(\"OneView exception occurred. Error: %(error)s\")"},{"line_number":611,"context_line":""},{"line_number":612,"context_line":""},{"line_number":613,"context_line":"class LibvirtErr(IronicException):"},{"line_number":614,"context_line":"    _msg_fmt \u003d _(\"Libvirt call failed: %(err)s.\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a710552_c8a02ea2","line":613,"updated":"2015-12-16 10:05:23.000000000","message":"s/LibvirtErr/LibvirtError to be more consistent","commit_id":"e6558fc632a638c0a6446732b2295a06bd6404fb"}],"ironic/drivers/modules/lib_virt.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f306a0bed4a245830efa7c2ab3073983d12d3543","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Ironic Libvirt power manager."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Provides basic power control of virtual machines via Libvirt API."},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_cdc34556","line":17,"updated":"2015-12-07 13:57:27.000000000","message":"And management interface.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f306a0bed4a245830efa7c2ab3073983d12d3543","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Ironic Libvirt power manager."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Provides basic power control of virtual machines via Libvirt API."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"For use in dev and test environments."},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_4db755f5","line":19,"updated":"2015-12-07 13:57:27.000000000","message":"And management.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"950842aef15b2353cd5c2b6eac5dc2c17bd502fe","unresolved":false,"context_lines":[{"line_number":45,"context_line":"import xml.etree.ElementTree as ET"},{"line_number":46,"context_line":"from xml.etree.ElementTree import SubElement"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"libvirt_opts \u003d ["},{"line_number":49,"context_line":"    cfg.IntOpt(\u0027get_vm_name_attempts\u0027,"},{"line_number":50,"context_line":"               default\u003d3,"},{"line_number":51,"context_line":"               help\u003d_(\"Number of attempts to try to get VM name used by the \""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_fab50ed0","line":48,"updated":"2015-12-03 18:45:36.000000000","message":"This is not used and can be removed if you didn\u0027t hit a bug with sometimes reporting wrong mac addresses.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f306a0bed4a245830efa7c2ab3073983d12d3543","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    \u0027libvirt_uri\u0027: _(\"libvirt URI. Example: qemu+unix:///system . \""},{"line_number":67,"context_line":"                     \"Required.\"),"},{"line_number":68,"context_line":"}"},{"line_number":69,"context_line":"OTHER_PROPERTIES \u003d {"},{"line_number":70,"context_line":"}"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"COMMON_PROPERTIES \u003d REQUIRED_PROPERTIES.copy()"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_ed972146","line":69,"updated":"2015-12-07 13:57:27.000000000","message":"This is not needed.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f306a0bed4a245830efa7c2ab3073983d12d3543","unresolved":false,"context_lines":[{"line_number":70,"context_line":"}"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"COMMON_PROPERTIES \u003d REQUIRED_PROPERTIES.copy()"},{"line_number":73,"context_line":"COMMON_PROPERTIES.update(OTHER_PROPERTIES)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"_BOOT_DEVICES_MAP \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_ad9d9967","line":73,"updated":"2015-12-07 13:57:27.000000000","message":"This is not needed.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"8dc7450f40a499de1e800801357102a32bf91eff","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    :returns: the libvirt domain object."},{"line_number":99,"context_line":"    :raises: NodeNotFound if could not find a VM corresponding to any of"},{"line_number":100,"context_line":"        the provided MACs"},{"line_number":101,"context_line":"    :raises: NodeNotFound if could not find a VM corresponding to any"},{"line_number":102,"context_line":"            of the provided MACs."},{"line_number":103,"context_line":"    \"\"\""},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_77a8ad20","line":101,"updated":"2015-12-08 09:59:11.000000000","message":"duplicate lines","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f306a0bed4a245830efa7c2ab3073983d12d3543","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    full_node_list \u003d conn.listAllDomains()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    for domain in full_node_list:"},{"line_number":108,"context_line":"        LOG.debug(\"Checking Node: %s\u0027s Mac address.\" % domain.name())"},{"line_number":109,"context_line":"        parsed \u003d ET.fromstring(domain.XMLDesc())"},{"line_number":110,"context_line":"        for domain_mac in parsed.findall(\u0027.//mac\u0027):"},{"line_number":111,"context_line":"            for node_mac in node_info[\u0027macs\u0027]:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_edd3a102","line":108,"updated":"2015-12-07 13:57:27.000000000","message":"Node here is a domain name, not Ironic node. This can misinforms user.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"8dc7450f40a499de1e800801357102a32bf91eff","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    for domain in full_node_list:"},{"line_number":108,"context_line":"        LOG.debug(\"Checking Node: %s\u0027s Mac address.\" % domain.name())"},{"line_number":109,"context_line":"        parsed \u003d ET.fromstring(domain.XMLDesc())"},{"line_number":110,"context_line":"        for domain_mac in parsed.findall(\u0027.//mac\u0027):"},{"line_number":111,"context_line":"            for node_mac in node_info[\u0027macs\u0027]:"},{"line_number":112,"context_line":"                dn_mac \u003d _normalize_mac(domain_mac.attrib[\u0027address\u0027])"},{"line_number":113,"context_line":"                nn_mac \u003d _normalize_mac(node_mac)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_da7bc826","line":110,"updated":"2015-12-08 09:59:11.000000000","message":"we can make it more clear and Pythonic with other way of searching XML and some sets math without nested for-loops:\n\n  domain_macs \u003d {_normalize_mac(el.attrib[\u0027address\u0027]) for el in parsed.iter(\u0027mac\u0027)}\n  node_macs \u003d {_normalize_mac(mac) for mac in node_info[\u0027macs\u0027]}\n  found_macs \u003d domain_macs \u0026 node_macs  # this is intersection of sets\n  if found_macs:\n      LOG.debug(\"Found MAC addresses: %s\" % found_macs)\n      return domain","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"dfa74c75f4284c97d7d0dd3e80d316a734bec966","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        for domain_mac in parsed.findall(\u0027.//mac\u0027):"},{"line_number":111,"context_line":"            for node_mac in node_info[\u0027macs\u0027]:"},{"line_number":112,"context_line":"                dn_mac \u003d _normalize_mac(domain_mac.attrib[\u0027address\u0027])"},{"line_number":113,"context_line":"                nn_mac \u003d _normalize_mac(node_mac)"},{"line_number":114,"context_line":"                if dn_mac \u003d\u003d nn_mac:"},{"line_number":115,"context_line":"                    LOG.debug(\"Found Mac address: %s\" % node_mac)"},{"line_number":116,"context_line":"                    return domain"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_f6b3384b","line":113,"updated":"2015-12-08 11:29:05.000000000","message":"you should move the parsing and normalization of known macs from node-info out of all for loops - it does not change and should not be recalculated every time.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f306a0bed4a245830efa7c2ab3073983d12d3543","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                dn_mac \u003d _normalize_mac(domain_mac.attrib[\u0027address\u0027])"},{"line_number":113,"context_line":"                nn_mac \u003d _normalize_mac(node_mac)"},{"line_number":114,"context_line":"                if dn_mac \u003d\u003d nn_mac:"},{"line_number":115,"context_line":"                    LOG.debug(\"Found Mac address: %s\" % node_mac)"},{"line_number":116,"context_line":"                    return domain"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    raise exception.NodeNotFound("}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_4d38b53d","line":115,"updated":"2015-12-07 13:57:27.000000000","message":"Better add also \"...for node \u003cuuid\u003e\"","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f306a0bed4a245830efa7c2ab3073983d12d3543","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    :param node: the Node of interest."},{"line_number":128,"context_line":"    :returns: dictionary of information."},{"line_number":129,"context_line":"    :raises: InvalidParameterValue if any required parameters are incorrect."},{"line_number":130,"context_line":"    :raises: MissingParameterValue if any required parameters are missing."},{"line_number":131,"context_line":"    \"\"\""},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_585ab52b","line":129,"updated":"2015-12-07 13:57:27.000000000","message":"Does not raised.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f306a0bed4a245830efa7c2ab3073983d12d3543","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    if current_pstate \u003d\u003d states.POWER_ON:"},{"line_number":159,"context_line":"        return current_pstate"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    domain.create()"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    current_pstate \u003d _get_power_state(domain)"},{"line_number":164,"context_line":"    if current_pstate \u003d\u003d states.POWER_ON:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_58b95578","line":161,"updated":"2015-12-07 13:57:27.000000000","message":"Please check that domain is booted as in examples http://libvirt.org/docs/libvirt-appdev-guide-python/en-US/html/libvirt_application_development_guide_using_python-Guest_Domains-Lifecycle_Control.html","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"8dc7450f40a499de1e800801357102a32bf91eff","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    if current_pstate \u003d\u003d states.POWER_OFF:"},{"line_number":179,"context_line":"        return current_pstate"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    domain.destroy()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    current_pstate \u003d _get_power_state(domain)"},{"line_number":184,"context_line":"    if current_pstate \u003d\u003d states.POWER_OFF:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_1aa2b04b","line":181,"updated":"2015-12-08 09:59:11.000000000","message":"also might consider checking the return status of this operation as suggested by Yuri in `_power_on`","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"8dc7450f40a499de1e800801357102a32bf91eff","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    :param conn: active libvirt connection."},{"line_number":239,"context_line":"    :param domain: libvirt domain object."},{"line_number":240,"context_line":"    :raises: NodeNotFound if could not find a VM corresponding to any"},{"line_number":241,"context_line":"        of the provided MACs."},{"line_number":242,"context_line":"    \"\"\""},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_cdaeb0e5","line":240,"updated":"2015-12-08 09:59:11.000000000","message":"is not raised from what I can see","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"950842aef15b2353cd5c2b6eac5dc2c17bd502fe","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    os \u003d parsed.find(\u0027os\u0027)"},{"line_number":246,"context_line":"    boot_list \u003d os.findall(\u0027boot\u0027)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    # Clear boot list"},{"line_number":249,"context_line":"    for boot_el in boot_list:"},{"line_number":250,"context_line":"        os.remove(boot_el)"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_5a9c6269","line":248,"updated":"2015-12-03 18:45:36.000000000","message":"Is there a reason to clean it completely rather than add the one needed as first one?","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"950842aef15b2353cd5c2b6eac5dc2c17bd502fe","unresolved":false,"context_lines":[{"line_number":252,"context_line":"    boot_el \u003d SubElement(os, \u0027boot\u0027)"},{"line_number":253,"context_line":"    boot_el.set(\u0027dev\u0027, device)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    conn.defineXML(ET.tostring(parsed))"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"class LibvirtPower(base.PowerInterface):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_bf6c5809","line":255,"updated":"2015-12-03 18:45:36.000000000","message":"Does it support only persistent setting of boot device, or is it possible to  set it for one boot?","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"8dc7450f40a499de1e800801357102a32bf91eff","unresolved":false,"context_lines":[{"line_number":252,"context_line":"    boot_el \u003d SubElement(os, \u0027boot\u0027)"},{"line_number":253,"context_line":"    boot_el.set(\u0027dev\u0027, device)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    conn.defineXML(ET.tostring(parsed))"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"class LibvirtPower(base.PowerInterface):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_2da3b4b3","line":255,"in_reply_to":"7a740942_bf6c5809","updated":"2015-12-08 09:59:11.000000000","message":"only persistent setting is supported. from the docstring of defineXML:\n\n  Signature: conn.defineXML(xml)\n  Docstring:\n  Define a domain, but does not start it.\n  This definition is persistent, until explicitly undefined\n  with virDomainUndefine(). A previous definition for this\n  domain would be overridden if it already exists.\n\n  Some hypervisors may prevent this operation if there is a\n  current block copy operation on a transient domain with the\n  same id as the domain being defined; in that case, use\n  virDomainBlockJobAbort() to stop the block copy first.\n\nso it seems there is a need for some check/try-except/retry here for the case this operation does not succeed","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f306a0bed4a245830efa7c2ab3073983d12d3543","unresolved":false,"context_lines":[{"line_number":288,"context_line":"                  ) % task.node.uuid)"},{"line_number":289,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":290,"context_line":"        uri \u003d driver_info[\u0027libvirt_uri\u0027]"},{"line_number":291,"context_line":"        if not _get_libvirt_connection(uri):"},{"line_number":292,"context_line":"            LOG.error(_LE(\"Failed to get libvirt connection node %(node)s\"),"},{"line_number":293,"context_line":"                      {\u0027node\u0027: task.node.uuid})"},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_d346864e","line":291,"updated":"2015-12-07 13:57:27.000000000","message":"We should also raise exception.InvalidParameterValue here.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"950842aef15b2353cd5c2b6eac5dc2c17bd502fe","unresolved":false,"context_lines":[{"line_number":305,"context_line":"            of the provided MACs."},{"line_number":306,"context_line":"        \"\"\""},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":309,"context_line":"        conn \u003d _get_libvirt_connection(driver_info[\u0027libvirt_uri\u0027])"},{"line_number":310,"context_line":"        driver_info[\u0027macs\u0027] \u003d driver_utils.get_node_mac_addresses(task)"},{"line_number":311,"context_line":"        domain \u003d _get_domain_for_node(conn, driver_info)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_7a135e5d","line":308,"updated":"2015-12-03 18:45:36.000000000","message":"These 4 lines are present in almost every function in these interfaces, it should be refactored.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"8dc7450f40a499de1e800801357102a32bf91eff","unresolved":false,"context_lines":[{"line_number":305,"context_line":"            of the provided MACs."},{"line_number":306,"context_line":"        \"\"\""},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":309,"context_line":"        conn \u003d _get_libvirt_connection(driver_info[\u0027libvirt_uri\u0027])"},{"line_number":310,"context_line":"        driver_info[\u0027macs\u0027] \u003d driver_utils.get_node_mac_addresses(task)"},{"line_number":311,"context_line":"        domain \u003d _get_domain_for_node(conn, driver_info)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_da53c869","line":308,"in_reply_to":"7a740942_7a135e5d","updated":"2015-12-08 09:59:11.000000000","message":"yes, rename the current `_get_domain_for_node` to `_get_domain_by_macs` and refactor this 4 lines to a new `_get_domain_for_node` that accepts the task.node and returns the corresponding libvirt domain object.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f306a0bed4a245830efa7c2ab3073983d12d3543","unresolved":false,"context_lines":[{"line_number":379,"context_line":"        return COMMON_PROPERTIES"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    def validate(self, task):"},{"line_number":382,"context_line":"        \"\"\"Check that \u0027driver_info\u0027 contains SSH credentials."},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        Validates whether the \u0027driver_info\u0027 property of the supplied"},{"line_number":385,"context_line":"        task\u0027s node contains the required credentials information."}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_784f716b","line":382,"updated":"2015-12-07 13:57:27.000000000","message":"There are no ssh cred.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f306a0bed4a245830efa7c2ab3073983d12d3543","unresolved":false,"context_lines":[{"line_number":385,"context_line":"        task\u0027s node contains the required credentials information."},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        :param task: a task from TaskManager."},{"line_number":388,"context_line":"        :raises: InvalidParameterValue if any connection parameters are"},{"line_number":389,"context_line":"            incorrect."},{"line_number":390,"context_line":"        :raises: MissingParameterValue if a required parameter is missing"},{"line_number":391,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_f86a81b2","line":388,"updated":"2015-12-07 13:57:27.000000000","message":"Does not raised.","commit_id":"75ca60e59b26857fed9d3ca58d64247632d81df6"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"30f7e1d1534c66f8127d2c5f076fa511b143d3ea","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        parsed \u003d ET.fromstring(domain.XMLDesc())"},{"line_number":140,"context_line":"        domain_macs \u003d {_normalize_mac("},{"line_number":141,"context_line":"                       el.attrib[\u0027address\u0027]) for el in parsed.iter(\u0027mac\u0027)}"},{"line_number":142,"context_line":"        node_macs \u003d {_normalize_mac(mac) for mac in driver_info[\u0027macs\u0027]}"},{"line_number":143,"context_line":"        found_macs \u003d domain_macs \u0026 node_macs  # this is intersection of sets"},{"line_number":144,"context_line":"        if found_macs:"},{"line_number":145,"context_line":"            LOG.debug(\"Found MAC addresses: %s \""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_195c9eec","line":142,"updated":"2015-12-09 18:47:37.000000000","message":"move it out of for loop, it does not to be recalculated on every pass","commit_id":"7dfef3bbb60d54d3d37a43e68354a8e880b7429a"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"8a32406cbe0015a89e135d8b401c58ab038776c8","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        parsed \u003d ET.fromstring(domain.XMLDesc())"},{"line_number":140,"context_line":"        domain_macs \u003d {_normalize_mac("},{"line_number":141,"context_line":"                       el.attrib[\u0027address\u0027]) for el in parsed.iter(\u0027mac\u0027)}"},{"line_number":142,"context_line":"        node_macs \u003d {_normalize_mac(mac) for mac in driver_info[\u0027macs\u0027]}"},{"line_number":143,"context_line":"        found_macs \u003d domain_macs \u0026 node_macs  # this is intersection of sets"},{"line_number":144,"context_line":"        if found_macs:"},{"line_number":145,"context_line":"            LOG.debug(\"Found MAC addresses: %s \""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_4ff1cdcc","line":142,"in_reply_to":"7a740942_195c9eec","updated":"2015-12-10 11:50:47.000000000","message":"Done","commit_id":"7dfef3bbb60d54d3d37a43e68354a8e880b7429a"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"09621093b9d55fdecb2723df9bcd351995d0977c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a710552_08ccf668","line":1,"updated":"2015-12-16 10:05:23.000000000","message":"wrong Copyright","commit_id":"e6558fc632a638c0a6446732b2295a06bd6404fb"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"09621093b9d55fdecb2723df9bcd351995d0977c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"import os"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"from ironic.common import boot_devices"},{"line_number":45,"context_line":"from ironic.common import exception"},{"line_number":46,"context_line":"from ironic.common.i18n import _"},{"line_number":47,"context_line":"from ironic.common.i18n import _LE"},{"line_number":48,"context_line":"from ironic.common import states"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a710552_6871fadf","line":45,"updated":"2015-12-16 10:05:23.000000000","message":"Import order should be:\n\nstdlib imports \n\nthird-party lib\n\nproject imports","commit_id":"e6558fc632a638c0a6446732b2295a06bd6404fb"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"09621093b9d55fdecb2723df9bcd351995d0977c","unresolved":false,"context_lines":[{"line_number":53,"context_line":"from oslo_config import cfg"},{"line_number":54,"context_line":"from oslo_log import log as logging"},{"line_number":55,"context_line":"import xml.etree.ElementTree as ET"},{"line_number":56,"context_line":"from xml.etree.ElementTree import SubElement"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"CONF \u003d cfg.CONF"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a710552_4bac38a0","line":56,"updated":"2015-12-16 10:05:23.000000000","message":"Please, don\u0027t import objects, only modules","commit_id":"e6558fc632a638c0a6446732b2295a06bd6404fb"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"13c013b0f30d5b63e0ff069220a376baff7d1e59","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                     \"Required.\"),"},{"line_number":65,"context_line":"}"},{"line_number":66,"context_line":"OTHER_PROPERTIES \u003d {"},{"line_number":67,"context_line":"    \u0027sasl_username\u0027: _(\"username to authenticate as.\"),"},{"line_number":68,"context_line":"    \u0027sasl_password\u0027: _(\"password to use for SASL authentication\"),"},{"line_number":69,"context_line":"    \u0027ssh_key_filename\u0027: _(\"filename of optional private key \""},{"line_number":70,"context_line":"                          \"for authentication.\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_d35e9144","line":67,"updated":"2015-12-15 07:44:00.000000000","message":"can we consider making it a general \"username\" and mangle with uri in case of ssh transport to insert \"username@\" in it?","commit_id":"e6558fc632a638c0a6446732b2295a06bd6404fb"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"3422bb5381988afd36ba7bcf3fd51385c76a2f68","unresolved":false,"context_lines":[{"line_number":65,"context_line":"}"},{"line_number":66,"context_line":"OTHER_PROPERTIES \u003d {"},{"line_number":67,"context_line":"    \u0027sasl_username\u0027: _(\"username to authenticate as.\"),"},{"line_number":68,"context_line":"    \u0027sasl_password\u0027: _(\"password to use for SASL authentication\"),"},{"line_number":69,"context_line":"    \u0027ssh_key_filename\u0027: _(\"filename of optional private key \""},{"line_number":70,"context_line":"                          \"for authentication.\")"},{"line_number":71,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a710552_57805a46","line":68,"updated":"2015-12-16 12:08:07.000000000","message":"Are \u0027sasl_username\u0027 and \u0027sasl_password\u0027 mandatory? If not please include \"Optional\" into descriptions.","commit_id":"e6558fc632a638c0a6446732b2295a06bd6404fb"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"3422bb5381988afd36ba7bcf3fd51385c76a2f68","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    :raises: LibvirtErr if failed to connect to the Libvirt uri."},{"line_number":90,"context_line":"    \"\"\""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    try:"},{"line_number":93,"context_line":"        uri \u003d driver_info[\u0027libvirt_uri\u0027]"},{"line_number":94,"context_line":"        sasl_username \u003d driver_info.get(\u0027sasl_username\u0027)"},{"line_number":95,"context_line":"        sasl_password \u003d driver_info.get(\u0027sasl_password\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a710552_37acae9f","line":92,"updated":"2015-12-16 12:08:07.000000000","message":"Please move \"try\" before the line where exception raised.","commit_id":"e6558fc632a638c0a6446732b2295a06bd6404fb"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"3422bb5381988afd36ba7bcf3fd51385c76a2f68","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    :param node: the Node of interest."},{"line_number":162,"context_line":"    :returns: dictionary of information."},{"line_number":163,"context_line":"    :raises: MissingParameterValue if any required parameters are missing."},{"line_number":164,"context_line":"    \"\"\""},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    info \u003d node.driver_info or {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a710552_baa083a0","line":163,"updated":"2015-12-16 12:08:07.000000000","message":"also InvalidParameterValue","commit_id":"e6558fc632a638c0a6446732b2295a06bd6404fb"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"6602a4ab55148b4a0128da8a23b9c41b04ada75d","unresolved":false,"context_lines":[{"line_number":347,"context_line":"                _(\"Node %s does not have any port associated with it.\""},{"line_number":348,"context_line":"                  ) % task.node.uuid)"},{"line_number":349,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":350,"context_line":"        if not _get_libvirt_connection(driver_info):"},{"line_number":351,"context_line":"            LOG.error(_LE(\"Failed to get libvirt connection node %(node)s\"),"},{"line_number":352,"context_line":"                      {\u0027node\u0027: task.node.uuid})"},{"line_number":353,"context_line":"            raise exception.InvalidParameterValue(_(\"Libvirt connection cannot\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a710552_8680c0c1","line":350,"updated":"2015-12-16 16:44:53.000000000","message":"also need to validate that ssh and sasl related options are not used at once.\n\nor be smart enough and figure out which to choose by the url schema (\"+ssh\" or \"+tcp\")","commit_id":"e6558fc632a638c0a6446732b2295a06bd6404fb"}],"requirements.txt":[{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"13c013b0f30d5b63e0ff069220a376baff7d1e59","unresolved":false,"context_lines":[{"line_number":42,"context_line":"oslo.versionedobjects\u003e\u003d0.13.0"},{"line_number":43,"context_line":"jsonschema!\u003d2.5.0,\u003c3.0.0,\u003e\u003d2.0.0"},{"line_number":44,"context_line":"psutil\u003c2.0.0,\u003e\u003d1.1.1"},{"line_number":45,"context_line":"libvirt-python\u003e\u003d1.2.5"}],"source_content_type":"text/plain","patch_set":4,"id":"5a710552_d4eed6eb","line":45,"updated":"2015-12-15 07:44:00.000000000","message":"need to add # LGPLv2+ comment to make gate happy","commit_id":"e6558fc632a638c0a6446732b2295a06bd6404fb"}]}
