)]}'
{"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"bb5371912c45135e745499c5614c10aeef33bc2f","unresolved":false,"context_lines":[{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"        rpc_node \u003d _get_rpc_node(node_ident)"},{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"        # Check if node is transitioning state, although nodes in DEPLOYFAIL"},{"line_number":1014,"context_line":"        # can be updated."},{"line_number":1015,"context_line":"        if ((rpc_node.target_power_state or rpc_node.target_provision_state)"},{"line_number":1016,"context_line":"                and rpc_node.provision_state not in"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_477a0825","line":1013,"updated":"2015-03-02 22:01:26.000000000","message":"Does this comment need to be updated?","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1268484e64ff945358dcc3a420de660792a2ea89","unresolved":false,"context_lines":[{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"        rpc_node \u003d _get_rpc_node(node_ident)"},{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"        # Check if node is transitioning state, although nodes in DEPLOYFAIL"},{"line_number":1014,"context_line":"        # can be updated."},{"line_number":1015,"context_line":"        if ((rpc_node.target_power_state or rpc_node.target_provision_state)"},{"line_number":1016,"context_line":"                and rpc_node.provision_state not in"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_d4c12f30","line":1013,"in_reply_to":"ba7be1f8_477a0825","updated":"2015-03-03 08:52:51.000000000","message":"Done","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"}],"ironic/common/states.py":[{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"aa1b842752856d661979c8d9ca1cb0b003896954","unresolved":false,"context_lines":[{"line_number":146,"context_line":"\"\"\" Node inspection failed. \"\"\""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"UPDATE_ALLOWED_STATES \u003d (DEPLOYFAIL, INSPECTING)"},{"line_number":150,"context_line":"\"\"\"Transitional states in which we allow updating a node.\"\"\""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_077314b2","line":149,"updated":"2015-02-27 11:16:07.000000000","message":"May be INSPECTFAIL as well ? Because somebody gave wrong power credentials, inspect failed and they want to update it ?","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bdc5cc44739104863d667d24adf7e499c51afebb","unresolved":false,"context_lines":[{"line_number":146,"context_line":"\"\"\" Node inspection failed. \"\"\""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"UPDATE_ALLOWED_STATES \u003d (DEPLOYFAIL, INSPECTING)"},{"line_number":150,"context_line":"\"\"\"Transitional states in which we allow updating a node.\"\"\""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_ed1fc159","line":149,"in_reply_to":"ba7be1f8_077314b2","updated":"2015-02-27 12:01:55.000000000","message":"Done","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"}],"ironic/drivers/fake.py":[{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"aa1b842752856d661979c8d9ca1cb0b003896954","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        self.management \u003d virtualbox.VirtualBoxManagement()"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"class FakeDiscoverdDriver(base.BaseDriver):"},{"line_number":206,"context_line":"    \"\"\"Example implementation of a Driver.\"\"\""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_d56aad18","line":205,"updated":"2015-02-27 11:16:07.000000000","message":"nit: may be FakeIpmiToolDiscoverdDriver","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bdc5cc44739104863d667d24adf7e499c51afebb","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        self.management \u003d virtualbox.VirtualBoxManagement()"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"class FakeDiscoverdDriver(base.BaseDriver):"},{"line_number":206,"context_line":"    \"\"\"Example implementation of a Driver.\"\"\""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_6d33d1f6","line":205,"in_reply_to":"ba7be1f8_d56aad18","updated":"2015-02-27 12:01:55.000000000","message":"Done","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"06a7c59fcc41d2513938d5d440bbeabe1571fe4d","unresolved":false,"context_lines":[{"line_number":205,"context_line":""},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"class FakeIPMIToolDiscoverdDriver(base.BaseDriver):"},{"line_number":208,"context_line":"    \"\"\"Example implementation of a Driver.\"\"\""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def __init__(self):"},{"line_number":211,"context_line":"        self.power \u003d ipmitool.IPMIPower()"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_ecec1eca","line":208,"updated":"2015-03-04 22:10:31.000000000","message":"Nit: could we change this to \"\"\"Fake Discoverd driver.\"\"\"","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":205,"context_line":""},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"class FakeIPMIToolDiscoverdDriver(base.BaseDriver):"},{"line_number":208,"context_line":"    \"\"\"Example implementation of a Driver.\"\"\""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def __init__(self):"},{"line_number":211,"context_line":"        self.power \u003d ipmitool.IPMIPower()"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_6379072f","line":208,"in_reply_to":"9a80dd14_ecec1eca","updated":"2015-03-05 09:22:59.000000000","message":"Done","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"077e78afa69a2162394e91937698da0d405e6690","unresolved":false,"context_lines":[{"line_number":207,"context_line":"class FakeIPMIToolDiscoverdDriver(base.BaseDriver):"},{"line_number":208,"context_line":"    \"\"\"Fake Discoverd driver.\"\"\""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def __init__(self):"},{"line_number":211,"context_line":"        self.power \u003d ipmitool.IPMIPower()"},{"line_number":212,"context_line":"        self.console \u003d ipmitool.IPMIShellinaboxConsole()"},{"line_number":213,"context_line":"        self.deploy \u003d fake.FakeDeploy()"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_a1a196f9","line":210,"updated":"2015-03-10 00:52:50.000000000","message":"Dmitry, I was just wondering why there isn\u0027t a check here for \n\nif not importutils.try_import(\u0027ironic_discoverd\u0027): raise...\n\nIt might be a nit, but for other drivers where libraries can\u0027t be loaded, the msg to the user is something like \u0027Driver XXX could not be loaded. Reason: Unable to import yyy library.\u0027\n\nWhereas with discoverd, it has to be enabled first, and then I get this msg: \"DriverLoadError: ironic-discoverd Python module not found.\" This will make it harder for the user to figure out which driver has the problem.","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"}],"ironic/drivers/modules/discoverd.py":[{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"5a5a44b1d9fad35d1943163219a66df7442cee78","unresolved":false,"context_lines":[{"line_number":15,"context_line":"    https://pypi.python.org/pypi/ironic-discoverd"},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo.utils import importutils"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from ironic.common import states"},{"line_number":21,"context_line":"from ironic.drivers import base"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_cb20229e","line":18,"updated":"2015-02-20 18:55:02.000000000","message":"replace oslo.* with oslo_*","commit_id":"ceb74461c14998cbab543f7affdbffa174cd055f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"5085a73efe0da885a54a50703e9b97697fff9edc","unresolved":false,"context_lines":[{"line_number":15,"context_line":"    https://pypi.python.org/pypi/ironic-discoverd"},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo.utils import importutils"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from ironic.common import states"},{"line_number":21,"context_line":"from ironic.drivers import base"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_aebf7ccf","line":18,"in_reply_to":"ba7be1f8_cb20229e","updated":"2015-02-20 19:35:34.000000000","message":"Done","commit_id":"ceb74461c14998cbab543f7affdbffa174cd055f"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"5a5a44b1d9fad35d1943163219a66df7442cee78","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        # TODO(dtantsur): error handling"},{"line_number":62,"context_line":"        # TODO(dtantsur): configurable URL"},{"line_number":63,"context_line":"        client.introspect(task.uuid, auth_token\u003dtask.context.auth_token)"},{"line_number":64,"context_line":"        return states.INSPECTING"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @base.driver_periodic_task()"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_2b10de4d","line":63,"updated":"2015-02-20 18:55:02.000000000","message":"nit: s/introspect/inspect","commit_id":"ceb74461c14998cbab543f7affdbffa174cd055f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"5085a73efe0da885a54a50703e9b97697fff9edc","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        # TODO(dtantsur): error handling"},{"line_number":62,"context_line":"        # TODO(dtantsur): configurable URL"},{"line_number":63,"context_line":"        client.introspect(task.uuid, auth_token\u003dtask.context.auth_token)"},{"line_number":64,"context_line":"        return states.INSPECTING"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @base.driver_periodic_task()"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_8ebab8df","line":63,"in_reply_to":"ba7be1f8_2b10de4d","updated":"2015-02-20 19:35:34.000000000","message":"that\u0027s part of ironic_discoverd and it\u0027s actually called \u0027introspect\u0027 :)","commit_id":"ceb74461c14998cbab543f7affdbffa174cd055f"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"338353b373f031da18d2b612cb42d405647f0118","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027err\u0027: exc})"},{"line_number":123,"context_line":"            raise exception.HardwareInspectionFailure(error\u003dexc)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        LOG.info(_LI(\u0027Node %s was sent on inspection to ironic-discoverd\u0027),"},{"line_number":126,"context_line":"                 node.uuid)"},{"line_number":127,"context_line":"        return states.INSPECTING"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_aef71858","line":125,"updated":"2015-02-24 16:39:21.000000000","message":"nit: s/on/to/","commit_id":"b4e20446dce0208b2188dd2afdf0c792fbcdd82e"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"338353b373f031da18d2b612cb42d405647f0118","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    @base.driver_periodic_task(spacing\u003dCONF.discoverd.status_check_period)"},{"line_number":130,"context_line":"    def _periodic_check_result(manager, context):"},{"line_number":131,"context_line":"        node_list \u003d manager.dbapi.get_nodeinfo_list("},{"line_number":132,"context_line":"            columns\u003d[\u0027id\u0027, \u0027uuid\u0027, \u0027driver\u0027],"},{"line_number":133,"context_line":"            filters\u003d{\u0027provision_state\u0027: states.INSPECTING})"},{"line_number":134,"context_line":"        for node_uuid, driver in node_list:"},{"line_number":135,"context_line":"            if not manager._mapped_to_this_conductor(node_uuid, driver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_e954aa00","line":132,"updated":"2015-02-24 16:39:21.000000000","message":"is \"id\" needed?","commit_id":"b4e20446dce0208b2188dd2afdf0c792fbcdd82e"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"746c50890c876d7ff09fc387926d0f8f7fed3054","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        If invalid, raises an exception; otherwise returns None."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        :param task: a task from TaskManager."},{"line_number":71,"context_line":"        :raises: InvalidParameterValue"},{"line_number":72,"context_line":"        :raises: MissingParameterValue"},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":"        if not CONF.discoverd.enabled:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_86ce8d2c","line":71,"updated":"2015-02-25 15:02:07.000000000","message":"It raises only HardwareInspectionFailure","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"733302c6207516d14ba8d34e0851b8b083632d3d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        If invalid, raises an exception; otherwise returns None."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        :param task: a task from TaskManager."},{"line_number":71,"context_line":"        :raises: InvalidParameterValue"},{"line_number":72,"context_line":"        :raises: MissingParameterValue"},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":"        if not CONF.discoverd.enabled:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_12ef33ea","line":71,"in_reply_to":"ba7be1f8_86ce8d2c","updated":"2015-02-25 15:14:53.000000000","message":"Done","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"746c50890c876d7ff09fc387926d0f8f7fed3054","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        :raises: MissingParameterValue"},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":75,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":76,"context_line":"                _(\u0027ironic-discoverd support is disabled in configuration, \u0027"},{"line_number":77,"context_line":"                  \u0027set [discoverd]enabled to true to enable\u0027))"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_c1cdcfb8","line":75,"updated":"2015-02-25 15:02:07.000000000","message":"error\u003d","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"733302c6207516d14ba8d34e0851b8b083632d3d","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        :raises: MissingParameterValue"},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":75,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":76,"context_line":"                _(\u0027ironic-discoverd support is disabled in configuration, \u0027"},{"line_number":77,"context_line":"                  \u0027set [discoverd]enabled to true to enable\u0027))"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_f2e53f09","line":75,"in_reply_to":"ba7be1f8_c1cdcfb8","updated":"2015-02-25 15:14:53.000000000","message":"that was intentional to overwrite the whole message, but I can fix it","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"746c50890c876d7ff09fc387926d0f8f7fed3054","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                _(\u0027ironic-discoverd support is disabled in configuration, \u0027"},{"line_number":77,"context_line":"                  \u0027set [discoverd]enabled to true to enable\u0027))"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if not ironic_discoverd:"},{"line_number":80,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":81,"context_line":"                _(\u0027ironic-discoverd Python module not found\u0027))"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_f7e53109","line":79,"updated":"2015-02-25 15:02:07.000000000","message":"Aren\u0027t these checks better suited in an __init__ method of DiscoverdInspect ? I mean we can have an __init__ where\n\n  if CONF.discoverd.enabled:\n    \u003ccheck for ironic_discoverd\u003e\n    \u003ccheck for version\u003e","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"733302c6207516d14ba8d34e0851b8b083632d3d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                _(\u0027ironic-discoverd support is disabled in configuration, \u0027"},{"line_number":77,"context_line":"                  \u0027set [discoverd]enabled to true to enable\u0027))"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if not ironic_discoverd:"},{"line_number":80,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":81,"context_line":"                _(\u0027ironic-discoverd Python module not found\u0027))"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_d2cf5b7d","line":79,"in_reply_to":"ba7be1f8_f7e53109","updated":"2015-02-25 15:14:53.000000000","message":"Done","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"746c50890c876d7ff09fc387926d0f8f7fed3054","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                  \u0027set [discoverd]enabled to true to enable\u0027))"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if not ironic_discoverd:"},{"line_number":80,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":81,"context_line":"                _(\u0027ironic-discoverd Python module not found\u0027))"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        # NOTE(dtantsur): __version_info__ attribute appeared in 1.0.0"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_21bceb05","line":80,"updated":"2015-02-25 15:02:07.000000000","message":"error\u003d","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"733302c6207516d14ba8d34e0851b8b083632d3d","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                  \u0027set [discoverd]enabled to true to enable\u0027))"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if not ironic_discoverd:"},{"line_number":80,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":81,"context_line":"                _(\u0027ironic-discoverd Python module not found\u0027))"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        # NOTE(dtantsur): __version_info__ attribute appeared in 1.0.0"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_d27d9b1d","line":80,"in_reply_to":"ba7be1f8_21bceb05","updated":"2015-02-25 15:14:53.000000000","message":"If I move it to __init__, I\u0027ll leave it overwriting the whole message","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"746c50890c876d7ff09fc387926d0f8f7fed3054","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        # NOTE(dtantsur): __version_info__ attribute appeared in 1.0.0"},{"line_number":84,"context_line":"        version \u003d getattr(ironic_discoverd, \u0027__version_info__\u0027, (0, 2))"},{"line_number":85,"context_line":"        if version \u003c (1, 0):"},{"line_number":86,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":87,"context_line":"                _(\u0027ironic-discoverd version is too old: required \u003e\u003d 1.0.0 \u0027"},{"line_number":88,"context_line":"                  \u0027got %s\u0027) % \u0027.\u0027.join(str(x) for x in version))"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_813e778a","line":86,"updated":"2015-02-25 15:02:07.000000000","message":"error\u003d","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"733302c6207516d14ba8d34e0851b8b083632d3d","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        # NOTE(dtantsur): __version_info__ attribute appeared in 1.0.0"},{"line_number":84,"context_line":"        version \u003d getattr(ironic_discoverd, \u0027__version_info__\u0027, (0, 2))"},{"line_number":85,"context_line":"        if version \u003c (1, 0):"},{"line_number":86,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":87,"context_line":"                _(\u0027ironic-discoverd version is too old: required \u003e\u003d 1.0.0 \u0027"},{"line_number":88,"context_line":"                  \u0027got %s\u0027) % \u0027.\u0027.join(str(x) for x in version))"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_12749334","line":86,"in_reply_to":"ba7be1f8_813e778a","updated":"2015-02-25 15:14:53.000000000","message":"ditto","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"746c50890c876d7ff09fc387926d0f8f7fed3054","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        :param task: a task from TaskManager."},{"line_number":94,"context_line":"        :raises: HardwareInspectionFailure, if unable to get essential"},{"line_number":95,"context_line":"                 hardware properties."},{"line_number":96,"context_line":"        :returns: resulting state of the inspection i.e. INSPECTED,"},{"line_number":97,"context_line":"                  INSPECTFAIL or INSPECTING."},{"line_number":98,"context_line":"        \"\"\""},{"line_number":99,"context_line":"        node \u003d task.node"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_771941d6","line":96,"updated":"2015-02-25 15:02:07.000000000","message":"I guess always returns INSPECTING","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"733302c6207516d14ba8d34e0851b8b083632d3d","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        :param task: a task from TaskManager."},{"line_number":94,"context_line":"        :raises: HardwareInspectionFailure, if unable to get essential"},{"line_number":95,"context_line":"                 hardware properties."},{"line_number":96,"context_line":"        :returns: resulting state of the inspection i.e. INSPECTED,"},{"line_number":97,"context_line":"                  INSPECTFAIL or INSPECTING."},{"line_number":98,"context_line":"        \"\"\""},{"line_number":99,"context_line":"        node \u003d task.node"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_32719744","line":96,"in_reply_to":"ba7be1f8_771941d6","updated":"2015-02-25 15:14:53.000000000","message":"Done","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"746c50890c876d7ff09fc387926d0f8f7fed3054","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # NOTE(dtantsur): this is needed so that ironic-discoverd"},{"line_number":107,"context_line":"        # can access the node via our API"},{"line_number":108,"context_line":"        task.release_resources()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        try:"},{"line_number":111,"context_line":"            client.introspect(node.uuid,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_77c301ed","line":108,"updated":"2015-02-25 15:02:07.000000000","message":"I see a problem if it\u0027s released here.  If it raises HardwareInspectionFailure, the manager.inspect_hardware() seems to catch it and tries to set the status as \u0027fail\u0027.  It will find task.fsm \u003d None and I think it would fail.  May be do this just before returning ?","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"733302c6207516d14ba8d34e0851b8b083632d3d","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # NOTE(dtantsur): this is needed so that ironic-discoverd"},{"line_number":107,"context_line":"        # can access the node via our API"},{"line_number":108,"context_line":"        task.release_resources()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        try:"},{"line_number":111,"context_line":"            client.introspect(node.uuid,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_f2c8df56","line":108,"in_reply_to":"ba7be1f8_77c301ed","updated":"2015-02-25 15:14:53.000000000","message":"that\u0027s an interesting idea, I didn\u0027t think about it. I was planning on releasing resources, but as discoverd is able to retry on conflict, I guess we can drop it completely.","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"746c50890c876d7ff09fc387926d0f8f7fed3054","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                                                states.INSPECTING})"},{"line_number":133,"context_line":"        for node_uuid, driver in node_iter:"},{"line_number":134,"context_line":"            try:"},{"line_number":135,"context_line":"                with task_manager.acquire(context, node_uuid) as task:"},{"line_number":136,"context_line":"                    _check_status(task)"},{"line_number":137,"context_line":"            except (exception.NodeLocked, exception.NodeNotFound):"},{"line_number":138,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_77514135","line":135,"updated":"2015-02-25 15:02:07.000000000","message":"What if discoverd tries to access the node via API when we try to check the status ?","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"733302c6207516d14ba8d34e0851b8b083632d3d","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                                                states.INSPECTING})"},{"line_number":133,"context_line":"        for node_uuid, driver in node_iter:"},{"line_number":134,"context_line":"            try:"},{"line_number":135,"context_line":"                with task_manager.acquire(context, node_uuid) as task:"},{"line_number":136,"context_line":"                    _check_status(task)"},{"line_number":137,"context_line":"            except (exception.NodeLocked, exception.NodeNotFound):"},{"line_number":138,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_12c2d333","line":135,"in_reply_to":"ba7be1f8_77514135","updated":"2015-02-25 15:14:53.000000000","message":"It will fail and retry","commit_id":"723cc3675dfe929c6efbdf55337050692a9a8837"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a216fb62cd656585465c9df2cb11972ff7ad2a","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                  \u0027ironic-discoverd %(version)s\u0027,"},{"line_number":109,"context_line":"                  {\u0027uuid\u0027: node.uuid, \u0027version\u0027:"},{"line_number":110,"context_line":"                   ironic_discoverd.__version__})"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        try:"},{"line_number":113,"context_line":"            client.introspect(node.uuid,"},{"line_number":114,"context_line":"                              auth_token\u003dcontext.auth_token,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_5aa8ddda","line":111,"updated":"2015-02-25 17:01:37.000000000","message":"ok, we need to release lock here, as discoverd tries to update in a sync fashion. need something like\n\n with task.lift_lock():\n   ...","commit_id":"589af85f4feb34aef884ef79e013ade62eb2665b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d2e43e291231a9d5cf2a025f7781ff1cff7e8ffd","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        try:"},{"line_number":113,"context_line":"            client.introspect(node.uuid,"},{"line_number":114,"context_line":"                              auth_token\u003dcontext.auth_token,"},{"line_number":115,"context_line":"                              base_url\u003dCONF.discoverd.service_url)"},{"line_number":116,"context_line":"        # NOTE(dtantsur): there will be a specific exception in 1.1.0,"},{"line_number":117,"context_line":"        # but for now it\u0027s just requests one."},{"line_number":118,"context_line":"        except requests.HTTPError as exc:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_0f67094e","line":115,"updated":"2015-02-25 16:52:51.000000000","message":"None is not supported (bug in client), need to omit base_url completely","commit_id":"589af85f4feb34aef884ef79e013ade62eb2665b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d2e43e291231a9d5cf2a025f7781ff1cff7e8ffd","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        return states.INSPECTING"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    @base.driver_periodic_task(spacing\u003dCONF.discoverd.status_check_period)"},{"line_number":132,"context_line":"    def _periodic_check_result(self, manager, context):"},{"line_number":133,"context_line":"        filters \u003d {\u0027provision_state\u0027: states.INSPECTING}"},{"line_number":134,"context_line":"        node_iter \u003d manager.find_nodes(filters\u003dfilters)"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_8f521965","line":132,"updated":"2015-02-25 16:52:51.000000000","message":"disable when discoverd support is disabled","commit_id":"589af85f4feb34aef884ef79e013ade62eb2665b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"43a216fb62cd656585465c9df2cb11972ff7ad2a","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    try:"},{"line_number":154,"context_line":"        status \u003d client.get_status(node.uuid,"},{"line_number":155,"context_line":"                                   auth_token\u003dtask.context.auth_token,"},{"line_number":156,"context_line":"                                   base_url\u003dCONF.discoverd.service_url)"},{"line_number":157,"context_line":"    except Exception:"},{"line_number":158,"context_line":"        # NOTE(dtantsur): get_status should not normally raise"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_cf29719c","line":155,"updated":"2015-02-25 17:01:37.000000000","message":"looks like this token is incorrect, need to get a proper one from keystone","commit_id":"589af85f4feb34aef884ef79e013ade62eb2665b"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"aa1b842752856d661979c8d9ca1cb0b003896954","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            return"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not ironic_discoverd:"},{"line_number":64,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":65,"context_line":"                _(\u0027ironic-discoverd Python module not found\u0027))"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # NOTE(dtantsur): __version_info__ attribute appeared in 1.0.0"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_d5862db8","line":64,"updated":"2015-02-27 11:16:07.000000000","message":"May be exception.DriverLoadError ??","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bdc5cc44739104863d667d24adf7e499c51afebb","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            return"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not ironic_discoverd:"},{"line_number":64,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":65,"context_line":"                _(\u0027ironic-discoverd Python module not found\u0027))"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # NOTE(dtantsur): __version_info__ attribute appeared in 1.0.0"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_8d3005ea","line":64,"in_reply_to":"ba7be1f8_d5862db8","updated":"2015-02-27 12:01:55.000000000","message":"Done","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"aa1b842752856d661979c8d9ca1cb0b003896954","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                _(\u0027ironic-discoverd Python module not found\u0027))"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # NOTE(dtantsur): __version_info__ attribute appeared in 1.0.0"},{"line_number":68,"context_line":"        version \u003d getattr(ironic_discoverd, \u0027__version_info__\u0027, (0, 2))"},{"line_number":69,"context_line":"        if version \u003c (1, 0):"},{"line_number":70,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":71,"context_line":"                _(\u0027ironic-discoverd version is too old: required \u003e\u003d 1.0.0 \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_6694d5e8","line":68,"updated":"2015-02-27 11:16:07.000000000","message":"I assume this is the client version and not the server ? Shouldn\u0027t we print the server version as well ?","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bdc5cc44739104863d667d24adf7e499c51afebb","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                _(\u0027ironic-discoverd Python module not found\u0027))"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # NOTE(dtantsur): __version_info__ attribute appeared in 1.0.0"},{"line_number":68,"context_line":"        version \u003d getattr(ironic_discoverd, \u0027__version_info__\u0027, (0, 2))"},{"line_number":69,"context_line":"        if version \u003c (1, 0):"},{"line_number":70,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":71,"context_line":"                _(\u0027ironic-discoverd version is too old: required \u003e\u003d 1.0.0 \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_ed56e105","line":68,"in_reply_to":"ba7be1f8_6694d5e8","updated":"2015-02-27 12:01:55.000000000","message":"We have no means of figuring out a server version, unfortunately.","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"aa1b842752856d661979c8d9ca1cb0b003896954","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        # NOTE(dtantsur): __version_info__ attribute appeared in 1.0.0"},{"line_number":68,"context_line":"        version \u003d getattr(ironic_discoverd, \u0027__version_info__\u0027, (0, 2))"},{"line_number":69,"context_line":"        if version \u003c (1, 0):"},{"line_number":70,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":71,"context_line":"                _(\u0027ironic-discoverd version is too old: required \u003e\u003d 1.0.0 \u0027"},{"line_number":72,"context_line":"                  \u0027got %s\u0027) % \u0027.\u0027.join(str(x) for x in version))"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_f59171f1","line":70,"updated":"2015-02-27 11:16:07.000000000","message":"ditto, may be exception.DriverLoadError","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bdc5cc44739104863d667d24adf7e499c51afebb","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        # NOTE(dtantsur): __version_info__ attribute appeared in 1.0.0"},{"line_number":68,"context_line":"        version \u003d getattr(ironic_discoverd, \u0027__version_info__\u0027, (0, 2))"},{"line_number":69,"context_line":"        if version \u003c (1, 0):"},{"line_number":70,"context_line":"            raise exception.HardwareInspectionFailure("},{"line_number":71,"context_line":"                _(\u0027ironic-discoverd version is too old: required \u003e\u003d 1.0.0 \u0027"},{"line_number":72,"context_line":"                  \u0027got %s\u0027) % \u0027.\u0027.join(str(x) for x in version))"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_0d5c1525","line":70,"in_reply_to":"ba7be1f8_f59171f1","updated":"2015-02-27 12:01:55.000000000","message":"Done","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"aa1b842752856d661979c8d9ca1cb0b003896954","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        # NOTE(dtantsur): we\u0027re spawning a short-living green thread so that"},{"line_number":110,"context_line":"        # we can release a lock as soon as possible and allow ironic-discoverd"},{"line_number":111,"context_line":"        # to operate on a node."},{"line_number":112,"context_line":"        eventlet.spawn_n(_start_inspection, task.node.uuid, task.context)"},{"line_number":113,"context_line":"        return states.INSPECTING"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @base.driver_periodic_task(spacing\u003dCONF.discoverd.status_check_period)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_a625ed5d","line":112,"updated":"2015-02-27 11:16:07.000000000","message":"Why not take from conductor\u0027s worker pool ?","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bdc5cc44739104863d667d24adf7e499c51afebb","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        # NOTE(dtantsur): we\u0027re spawning a short-living green thread so that"},{"line_number":110,"context_line":"        # we can release a lock as soon as possible and allow ironic-discoverd"},{"line_number":111,"context_line":"        # to operate on a node."},{"line_number":112,"context_line":"        eventlet.spawn_n(_start_inspection, task.node.uuid, task.context)"},{"line_number":113,"context_line":"        return states.INSPECTING"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @base.driver_periodic_task(spacing\u003dCONF.discoverd.status_check_period)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_0d7335b2","line":112,"in_reply_to":"ba7be1f8_a625ed5d","updated":"2015-02-27 12:01:55.000000000","message":"because drivers do not have direct access to conductor (which is unfortunate). Anyway, it\u0027s such a short-living task, we don\u0027t need to bother too much.","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"aa1b842752856d661979c8d9ca1cb0b003896954","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        LOG.exception(_LE(\u0027Exception during contacting ironic-discoverd \u0027"},{"line_number":143,"context_line":"                          \u0027for inspection of node %(node)s: %(err)s\u0027),"},{"line_number":144,"context_line":"                      {\u0027node\u0027: node_uuid, \u0027err\u0027: exc})"},{"line_number":145,"context_line":"        with task_manager.acquire(context, node_uuid) as task:"},{"line_number":146,"context_line":"            task.node.last_error \u003d _(\u0027Failed to start inspection: %s\u0027) % exc"},{"line_number":147,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":148,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_c6b4a1d3","line":145,"updated":"2015-02-27 11:16:07.000000000","message":"What if we cannot get lock ? I assume we will fail updating the status and eventually will timeout will set it to fail.  But we might loost the exception, but it\u0027s there in the logs.","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bdc5cc44739104863d667d24adf7e499c51afebb","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        LOG.exception(_LE(\u0027Exception during contacting ironic-discoverd \u0027"},{"line_number":143,"context_line":"                          \u0027for inspection of node %(node)s: %(err)s\u0027),"},{"line_number":144,"context_line":"                      {\u0027node\u0027: node_uuid, \u0027err\u0027: exc})"},{"line_number":145,"context_line":"        with task_manager.acquire(context, node_uuid) as task:"},{"line_number":146,"context_line":"            task.node.last_error \u003d _(\u0027Failed to start inspection: %s\u0027) % exc"},{"line_number":147,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":148,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_ed7b4179","line":145,"in_reply_to":"ba7be1f8_c6b4a1d3","updated":"2015-02-27 12:01:55.000000000","message":"I don\u0027t know how to deal with such a situation, so I think we rely on logging on #142. Better ideas?","commit_id":"746417b2c8aaaec56d6e7ed91289f5d8975ac4c1"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"bb5371912c45135e745499c5614c10aeef33bc2f","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                help\u003d\u0027whether to enable inspection using ironic-discoverd\u0027),"},{"line_number":39,"context_line":"    # NOTE(dtantsur): default value is provided by ironic_discoverd.client"},{"line_number":40,"context_line":"    cfg.StrOpt(\u0027service_url\u0027,"},{"line_number":41,"context_line":"               help\u003d\u0027ironic-discoverd HTTP endpoint, defaults to localhost\u0027),"},{"line_number":42,"context_line":"    cfg.IntOpt(\u0027status_check_period\u0027, default\u003d60,"},{"line_number":43,"context_line":"               help\u003d\u0027period (in seconds) to check status of nodes \u0027"},{"line_number":44,"context_line":"               \u0027on inspection\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_87ec00bd","line":41,"updated":"2015-03-02 22:01:26.000000000","message":"Why not:\n default\u003d\"localhost\"\n\nTo match help text.","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1268484e64ff945358dcc3a420de660792a2ea89","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                help\u003d\u0027whether to enable inspection using ironic-discoverd\u0027),"},{"line_number":39,"context_line":"    # NOTE(dtantsur): default value is provided by ironic_discoverd.client"},{"line_number":40,"context_line":"    cfg.StrOpt(\u0027service_url\u0027,"},{"line_number":41,"context_line":"               help\u003d\u0027ironic-discoverd HTTP endpoint, defaults to localhost\u0027),"},{"line_number":42,"context_line":"    cfg.IntOpt(\u0027status_check_period\u0027, default\u003d60,"},{"line_number":43,"context_line":"               help\u003d\u0027period (in seconds) to check status of nodes \u0027"},{"line_number":44,"context_line":"               \u0027on inspection\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_34c1ab54","line":41,"in_reply_to":"ba7be1f8_87ec00bd","updated":"2015-03-03 08:52:51.000000000","message":"\"localhost\" (i.e. 127.0.0.1:80) is unlikely to be a valid value. I\u0027ll change the comment","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"bb5371912c45135e745499c5614c10aeef33bc2f","unresolved":false,"context_lines":[{"line_number":41,"context_line":"               help\u003d\u0027ironic-discoverd HTTP endpoint, defaults to localhost\u0027),"},{"line_number":42,"context_line":"    cfg.IntOpt(\u0027status_check_period\u0027, default\u003d60,"},{"line_number":43,"context_line":"               help\u003d\u0027period (in seconds) to check status of nodes \u0027"},{"line_number":44,"context_line":"               \u0027on inspection\u0027)"},{"line_number":45,"context_line":"]"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_a713c4b6","line":44,"updated":"2015-03-02 22:01:26.000000000","message":"Should the default be mentioned?","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1268484e64ff945358dcc3a420de660792a2ea89","unresolved":false,"context_lines":[{"line_number":41,"context_line":"               help\u003d\u0027ironic-discoverd HTTP endpoint, defaults to localhost\u0027),"},{"line_number":42,"context_line":"    cfg.IntOpt(\u0027status_check_period\u0027, default\u003d60,"},{"line_number":43,"context_line":"               help\u003d\u0027period (in seconds) to check status of nodes \u0027"},{"line_number":44,"context_line":"               \u0027on inspection\u0027)"},{"line_number":45,"context_line":"]"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_74b7a3f5","line":44,"in_reply_to":"ba7be1f8_a713c4b6","updated":"2015-03-03 08:52:51.000000000","message":"Done","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"bb5371912c45135e745499c5614c10aeef33bc2f","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":60,"context_line":"            LOG.debug(\u0027ironic-discoverd support is disabled\u0027)"},{"line_number":61,"context_line":"            return"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not ironic_discoverd:"},{"line_number":64,"context_line":"            raise exception.DriverLoadError("},{"line_number":65,"context_line":"                _(\u0027ironic-discoverd Python module not found\u0027))"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_c737d8fd","line":62,"updated":"2015-03-02 22:01:26.000000000","message":"It seems like it is possible for the next two checks to not get run.  If discoverd is not enabled when this is first init, then this check is not run.\n\nBut it appears that later discoverd could be enabled, and this check would not have been run.\n\nNot sure if there should be some valid_state variable or something.  That is set after these checks have been completed successfully.  Would probably require some refactoring.","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1268484e64ff945358dcc3a420de660792a2ea89","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":60,"context_line":"            LOG.debug(\u0027ironic-discoverd support is disabled\u0027)"},{"line_number":61,"context_line":"            return"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not ironic_discoverd:"},{"line_number":64,"context_line":"            raise exception.DriverLoadError("},{"line_number":65,"context_line":"                _(\u0027ironic-discoverd Python module not found\u0027))"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_d49ccf6c","line":62,"in_reply_to":"ba7be1f8_c737d8fd","updated":"2015-03-03 08:52:51.000000000","message":"Sorry, I\u0027m not sure what you mean. Currently configuration can\u0027t be changed in runtime (otherwise a lot of code would break)","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d5410d26a544ba66de7771d3f07873cf7236929c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":60,"context_line":"            LOG.debug(\u0027ironic-discoverd support is disabled\u0027)"},{"line_number":61,"context_line":"            return"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not ironic_discoverd:"},{"line_number":64,"context_line":"            raise exception.DriverLoadError("},{"line_number":65,"context_line":"                _(\u0027ironic-discoverd Python module not found\u0027))"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_008a8f63","line":62,"in_reply_to":"ba7be1f8_d49ccf6c","updated":"2015-03-03 15:56:53.000000000","message":"Makes sense then if config is not changeable at runtime.","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"8de897664c88095f455bdc36278d1771467d3ccd","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                  {\u0027uuid\u0027: task.node.uuid, \u0027version\u0027:"},{"line_number":107,"context_line":"                   ironic_discoverd.__version__})"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # NOTE(dtantsur): we\u0027re spawning a short-living green thread so that"},{"line_number":110,"context_line":"        # we can release a lock as soon as possible and allow ironic-discoverd"},{"line_number":111,"context_line":"        # to operate on a node."},{"line_number":112,"context_line":"        eventlet.spawn_n(_start_inspection, task.node.uuid, task.context)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_a444e274","line":109,"updated":"2015-02-28 02:47:22.000000000","message":"Hmm, I am still of the opinion that we should take a loan from conductors worker pool, so that we never spawn more than the allowed number of workers in the conductor.","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1268484e64ff945358dcc3a420de660792a2ea89","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                  {\u0027uuid\u0027: task.node.uuid, \u0027version\u0027:"},{"line_number":107,"context_line":"                   ironic_discoverd.__version__})"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # NOTE(dtantsur): we\u0027re spawning a short-living green thread so that"},{"line_number":110,"context_line":"        # we can release a lock as soon as possible and allow ironic-discoverd"},{"line_number":111,"context_line":"        # to operate on a node."},{"line_number":112,"context_line":"        eventlet.spawn_n(_start_inspection, task.node.uuid, task.context)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_d4aa0f70","line":109,"in_reply_to":"ba7be1f8_247187a8","updated":"2015-03-03 08:52:51.000000000","message":"\u003e But what if it can take time for some reason tomorrow?\n\nThen we\u0027ll fix it :) for now 99% of time in this thread is IO wait on socket, which is exactly what green threads are good at.","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"2e0726ca1cfba40ded76cff8567920747cb20151","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                  {\u0027uuid\u0027: task.node.uuid, \u0027version\u0027:"},{"line_number":107,"context_line":"                   ironic_discoverd.__version__})"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # NOTE(dtantsur): we\u0027re spawning a short-living green thread so that"},{"line_number":110,"context_line":"        # we can release a lock as soon as possible and allow ironic-discoverd"},{"line_number":111,"context_line":"        # to operate on a node."},{"line_number":112,"context_line":"        eventlet.spawn_n(_start_inspection, task.node.uuid, task.context)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_247187a8","line":109,"in_reply_to":"ba7be1f8_50183975","updated":"2015-03-03 02:28:06.000000000","message":"Dmitry, I agree.  It\u0027s 100ms for today.  But what if it can take time for some reason tomorrow ? We have an upper bar for for some of the things like CONF.conductor.periodic_max_workers and CONF.conductor.workers_pool_size.  I assume these are efforts to make sure that the number of threads spawned at any point of time is within a limit.  May be not something to do for now, but in my opinion it would be better if we try to control things using some upper limit.","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cb44742fb3663573e53315cfb763a1e694d8357c","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                  {\u0027uuid\u0027: task.node.uuid, \u0027version\u0027:"},{"line_number":107,"context_line":"                   ironic_discoverd.__version__})"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # NOTE(dtantsur): we\u0027re spawning a short-living green thread so that"},{"line_number":110,"context_line":"        # we can release a lock as soon as possible and allow ironic-discoverd"},{"line_number":111,"context_line":"        # to operate on a node."},{"line_number":112,"context_line":"        eventlet.spawn_n(_start_inspection, task.node.uuid, task.context)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_50183975","line":109,"in_reply_to":"ba7be1f8_a444e274","updated":"2015-02-28 11:15:45.000000000","message":"What\u0027s the point? I don\u0027t see any disastrous in having worker_count + 1 threads for 100ms. Also not that @base.driver_periodic_task also works via eventlet.spawn_n, not via conductor.\n\nNote that you\u0027re suggesting change the driver interface, not just \u0027use the conductor\u0027. We don\u0027t have access to a conductor instance here IIRC","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"8de897664c88095f455bdc36278d1771467d3ccd","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        eventlet.spawn_n(_start_inspection, task.node.uuid, task.context)"},{"line_number":113,"context_line":"        return states.INSPECTING"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @base.driver_periodic_task(spacing\u003dCONF.discoverd.status_check_period)"},{"line_number":116,"context_line":"    def _periodic_check_result(self, manager, context):"},{"line_number":117,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":118,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_04076e1e","line":115,"updated":"2015-02-28 02:47:22.000000000","message":"Why not make a change in periodic_task adding a enabled parameter, so that we can call something like:\n\n  @base.driver_periodic_task(spacing\u003dCONF.discoverd.status_check_period, enabled\u003dCONF.discoverd.enabled)\n\nIf we are never going to run when discoverd in not enabled, why waste energy in spawning it ? :-)","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cb44742fb3663573e53315cfb763a1e694d8357c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        eventlet.spawn_n(_start_inspection, task.node.uuid, task.context)"},{"line_number":113,"context_line":"        return states.INSPECTING"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @base.driver_periodic_task(spacing\u003dCONF.discoverd.status_check_period)"},{"line_number":116,"context_line":"    def _periodic_check_result(self, manager, context):"},{"line_number":117,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":118,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_d00c293e","line":115,"in_reply_to":"ba7be1f8_04076e1e","updated":"2015-02-28 11:15:45.000000000","message":"I can\u0027t make a change in periodic_task (it\u0027s in Oslo and it\u0027s under graduation now), but I suspect we actually have such a parameter already. Good catch!","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"2e0726ca1cfba40ded76cff8567920747cb20151","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        eventlet.spawn_n(_start_inspection, task.node.uuid, task.context)"},{"line_number":113,"context_line":"        return states.INSPECTING"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @base.driver_periodic_task(spacing\u003dCONF.discoverd.status_check_period)"},{"line_number":116,"context_line":"    def _periodic_check_result(self, manager, context):"},{"line_number":117,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":118,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_c49c2bc3","line":115,"in_reply_to":"ba7be1f8_d00c293e","updated":"2015-03-03 02:28:06.000000000","message":"Yeah, I meant in someway if we could disable spawning this periodic task itself, it would be good. :)","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"8de897664c88095f455bdc36278d1771467d3ccd","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        LOG.exception(_LE(\u0027Exception during contacting ironic-discoverd \u0027"},{"line_number":143,"context_line":"                          \u0027for inspection of node %(node)s: %(err)s\u0027),"},{"line_number":144,"context_line":"                      {\u0027node\u0027: node_uuid, \u0027err\u0027: exc})"},{"line_number":145,"context_line":"        with task_manager.acquire(context, node_uuid) as task:"},{"line_number":146,"context_line":"            task.node.last_error \u003d _(\u0027Failed to start inspection: %s\u0027) % exc"},{"line_number":147,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":148,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_e4241ac8","line":145,"updated":"2015-02-28 02:47:22.000000000","message":"We can put this in retry once, that might help a bit.","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"2e0726ca1cfba40ded76cff8567920747cb20151","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        LOG.exception(_LE(\u0027Exception during contacting ironic-discoverd \u0027"},{"line_number":143,"context_line":"                          \u0027for inspection of node %(node)s: %(err)s\u0027),"},{"line_number":144,"context_line":"                      {\u0027node\u0027: node_uuid, \u0027err\u0027: exc})"},{"line_number":145,"context_line":"        with task_manager.acquire(context, node_uuid) as task:"},{"line_number":146,"context_line":"            task.node.last_error \u003d _(\u0027Failed to start inspection: %s\u0027) % exc"},{"line_number":147,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":148,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_c4834b54","line":145,"in_reply_to":"ba7be1f8_9029d18b","updated":"2015-03-03 02:28:06.000000000","message":"Missed it, thanks :)","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cb44742fb3663573e53315cfb763a1e694d8357c","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        LOG.exception(_LE(\u0027Exception during contacting ironic-discoverd \u0027"},{"line_number":143,"context_line":"                          \u0027for inspection of node %(node)s: %(err)s\u0027),"},{"line_number":144,"context_line":"                      {\u0027node\u0027: node_uuid, \u0027err\u0027: exc})"},{"line_number":145,"context_line":"        with task_manager.acquire(context, node_uuid) as task:"},{"line_number":146,"context_line":"            task.node.last_error \u003d _(\u0027Failed to start inspection: %s\u0027) % exc"},{"line_number":147,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":148,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_9029d18b","line":145,"in_reply_to":"ba7be1f8_e4241ac8","updated":"2015-02-28 11:15:45.000000000","message":"task_manager.acquire has retries inside already :)","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"8de897664c88095f455bdc36278d1771467d3ccd","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def _check_status(task):"},{"line_number":154,"context_line":"    node \u003d task.node"},{"line_number":155,"context_line":"    if node.provision_state !\u003d states.INSPECTING:"},{"line_number":156,"context_line":"        return"},{"line_number":157,"context_line":"    if not isinstance(task.driver.inspect, DiscoverdInspect):"},{"line_number":158,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_ff34a3e0","line":155,"updated":"2015-02-28 02:47:22.000000000","message":"Isn\u0027t this check redundant because nobody else can change it from INSPECTING to INSPECTFAIL or MANAGEABLE.  \n\nIf operator could stop the inspection, then we don\u0027t have a state transition for it right now.\nhttps://github.com/openstack/ironic/blob/master/ironic/common/states.py#L286-L290","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"2e0726ca1cfba40ded76cff8567920747cb20151","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def _check_status(task):"},{"line_number":154,"context_line":"    node \u003d task.node"},{"line_number":155,"context_line":"    if node.provision_state !\u003d states.INSPECTING:"},{"line_number":156,"context_line":"        return"},{"line_number":157,"context_line":"    if not isinstance(task.driver.inspect, DiscoverdInspect):"},{"line_number":158,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_44975b90","line":155,"in_reply_to":"ba7be1f8_d02349a5","updated":"2015-03-03 02:28:06.000000000","message":"Missed it as well.  The periodic task could have moved it to INSPECTFAIL. I agree.","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cb44742fb3663573e53315cfb763a1e694d8357c","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def _check_status(task):"},{"line_number":154,"context_line":"    node \u003d task.node"},{"line_number":155,"context_line":"    if node.provision_state !\u003d states.INSPECTING:"},{"line_number":156,"context_line":"        return"},{"line_number":157,"context_line":"    if not isinstance(task.driver.inspect, DiscoverdInspect):"},{"line_number":158,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_d02349a5","line":155,"in_reply_to":"ba7be1f8_ff34a3e0","updated":"2015-02-28 11:15:45.000000000","message":"It could e.g. timeout and go INSPECTFAIL already while we were not holding a lock. I don\u0027t insist on this check, but it does not seem to hurt as well.","commit_id":"b01babbc9c472e76810f89b7c7e43298229806c6"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"3e28e3f87d1e9d8adc6395e69652bf782f883210","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    cfg.BoolOpt(\u0027enabled\u0027, default\u003dFalse,"},{"line_number":38,"context_line":"                help\u003d\u0027whether to enable inspection using ironic-discoverd\u0027),"},{"line_number":39,"context_line":"    cfg.StrOpt(\u0027service_url\u0027,"},{"line_number":40,"context_line":"               help\u003d\u0027ironic-discoverd HTTP endpoint, if not set use discoverd \u0027"},{"line_number":41,"context_line":"               \u0027client default (locahost, port 5050)\u0027),"},{"line_number":42,"context_line":"    cfg.IntOpt(\u0027status_check_period\u0027, default\u003d60,"},{"line_number":43,"context_line":"               help\u003d\u0027period (in seconds) to check status of nodes \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_7b961996","line":40,"updated":"2015-03-05 03:14:11.000000000","message":"nit: how about\n\nironic-discoverd HTTP endpoint.  If this is not set, the ironic-discoverd client default (http://localhost:5050) will be used.","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    cfg.BoolOpt(\u0027enabled\u0027, default\u003dFalse,"},{"line_number":38,"context_line":"                help\u003d\u0027whether to enable inspection using ironic-discoverd\u0027),"},{"line_number":39,"context_line":"    cfg.StrOpt(\u0027service_url\u0027,"},{"line_number":40,"context_line":"               help\u003d\u0027ironic-discoverd HTTP endpoint, if not set use discoverd \u0027"},{"line_number":41,"context_line":"               \u0027client default (locahost, port 5050)\u0027),"},{"line_number":42,"context_line":"    cfg.IntOpt(\u0027status_check_period\u0027, default\u003d60,"},{"line_number":43,"context_line":"               help\u003d\u0027period (in seconds) to check status of nodes \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_a373ff4b","line":40,"in_reply_to":"9a80dd14_7b961996","updated":"2015-03-05 09:22:59.000000000","message":"Done","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"3e28e3f87d1e9d8adc6395e69652bf782f883210","unresolved":false,"context_lines":[{"line_number":41,"context_line":"               \u0027client default (locahost, port 5050)\u0027),"},{"line_number":42,"context_line":"    cfg.IntOpt(\u0027status_check_period\u0027, default\u003d60,"},{"line_number":43,"context_line":"               help\u003d\u0027period (in seconds) to check status of nodes \u0027"},{"line_number":44,"context_line":"               \u0027on inspection, defaults to 60\u0027)"},{"line_number":45,"context_line":"]"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_9bdaed76","line":44,"updated":"2015-03-05 03:14:11.000000000","message":"nit: i am not sure if it makes sense to specify CONF specified default values in the help string, because they will be printed anyway in the conf file.\n\nfor example:\nhttps://github.com/openstack/ironic/blob/master/etc/ironic/ironic.conf.sample#L81-L83","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":41,"context_line":"               \u0027client default (locahost, port 5050)\u0027),"},{"line_number":42,"context_line":"    cfg.IntOpt(\u0027status_check_period\u0027, default\u003d60,"},{"line_number":43,"context_line":"               help\u003d\u0027period (in seconds) to check status of nodes \u0027"},{"line_number":44,"context_line":"               \u0027on inspection, defaults to 60\u0027)"},{"line_number":45,"context_line":"]"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_039a0b63","line":44,"in_reply_to":"9a80dd14_9bdaed76","updated":"2015-03-05 09:22:59.000000000","message":"Done","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"06a7c59fcc41d2513938d5d440bbeabe1571fe4d","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    \"\"\"In-band inspection via ironic-discoverd project.\"\"\""},{"line_number":58,"context_line":"    def __init__(self):"},{"line_number":59,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":60,"context_line":"            LOG.debug(\u0027ironic-discoverd support is disabled\u0027)"},{"line_number":61,"context_line":"            return"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not ironic_discoverd:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_3d266317","line":60,"updated":"2015-03-04 22:10:31.000000000","message":"Nit would like to see this at Info level.","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    \"\"\"In-band inspection via ironic-discoverd project.\"\"\""},{"line_number":58,"context_line":"    def __init__(self):"},{"line_number":59,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":60,"context_line":"            LOG.debug(\u0027ironic-discoverd support is disabled\u0027)"},{"line_number":61,"context_line":"            return"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not ironic_discoverd:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_63a02791","line":60,"in_reply_to":"9a80dd14_1bd6fd4f","updated":"2015-03-05 09:22:59.000000000","message":"Done","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"3e28e3f87d1e9d8adc6395e69652bf782f883210","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    \"\"\"In-band inspection via ironic-discoverd project.\"\"\""},{"line_number":58,"context_line":"    def __init__(self):"},{"line_number":59,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":60,"context_line":"            LOG.debug(\u0027ironic-discoverd support is disabled\u0027)"},{"line_number":61,"context_line":"            return"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not ironic_discoverd:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_1bd6fd4f","line":60,"in_reply_to":"9a80dd14_3d266317","updated":"2015-03-05 03:14:11.000000000","message":"+1","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"3e28e3f87d1e9d8adc6395e69652bf782f883210","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        If invalid, raises an exception; otherwise returns None."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param task: a task from TaskManager."},{"line_number":87,"context_line":"        :raises: HardwareInspectionFailure"},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":90,"context_line":"            raise exception.UnsupportedDriverExtension("}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_fb5e89e8","line":87,"updated":"2015-03-05 03:14:11.000000000","message":"s/HardwareInspectionFailure/UnsupportedDriverExtension","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        If invalid, raises an exception; otherwise returns None."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param task: a task from TaskManager."},{"line_number":87,"context_line":"        :raises: HardwareInspectionFailure"},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":90,"context_line":"            raise exception.UnsupportedDriverExtension("}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_83ad1b8b","line":87,"in_reply_to":"9a80dd14_fb5e89e8","updated":"2015-03-05 09:22:59.000000000","message":"Done","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4b673c5a364f9381b6477c9331ad53b939084159","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":90,"context_line":"            raise exception.UnsupportedDriverExtension("},{"line_number":91,"context_line":"                (\u0027ironic-discoverd support is disabled in \u0027"},{"line_number":92,"context_line":"                 \u0027configuration, set [discoverd]enabled to true \u0027"},{"line_number":93,"context_line":"                 \u0027to enable\u0027))"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_cfb4acf4","line":91,"updated":"2015-03-04 22:22:49.000000000","message":"missing _ here","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":90,"context_line":"            raise exception.UnsupportedDriverExtension("},{"line_number":91,"context_line":"                (\u0027ironic-discoverd support is disabled in \u0027"},{"line_number":92,"context_line":"                 \u0027configuration, set [discoverd]enabled to true \u0027"},{"line_number":93,"context_line":"                 \u0027to enable\u0027))"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_a3aa1f6e","line":91,"in_reply_to":"9a80dd14_cfb4acf4","updated":"2015-03-05 09:22:59.000000000","message":"Done","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"3e28e3f87d1e9d8adc6395e69652bf782f883210","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @base.driver_periodic_task(spacing\u003dCONF.discoverd.status_check_period,"},{"line_number":116,"context_line":"                               enabled\u003dCONF.discoverd.enabled)"},{"line_number":117,"context_line":"    def _periodic_check_result(self, manager, context):"},{"line_number":118,"context_line":"        filters \u003d {\u0027provision_state\u0027: states.INSPECTING}"},{"line_number":119,"context_line":"        node_iter \u003d manager.iter_nodes(filters\u003dfilters)"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_9be4ad0e","line":117,"updated":"2015-03-05 03:14:11.000000000","message":"May be a one-line docstring for all these 4 methods might help for someone taking a look quickly.","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @base.driver_periodic_task(spacing\u003dCONF.discoverd.status_check_period,"},{"line_number":116,"context_line":"                               enabled\u003dCONF.discoverd.enabled)"},{"line_number":117,"context_line":"    def _periodic_check_result(self, manager, context):"},{"line_number":118,"context_line":"        filters \u003d {\u0027provision_state\u0027: states.INSPECTING}"},{"line_number":119,"context_line":"        node_iter \u003d manager.iter_nodes(filters\u003dfilters)"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_23b62fda","line":117,"in_reply_to":"9a80dd14_9be4ad0e","updated":"2015-03-05 09:22:59.000000000","message":"Done","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"06a7c59fcc41d2513938d5d440bbeabe1571fe4d","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"def _call_discoverd(func, uuid, context):"},{"line_number":132,"context_line":"    # NOTE(dtantsur): due to a bug, client does not accept None as base_url."},{"line_number":133,"context_line":"    kwargs \u003d {}"},{"line_number":134,"context_line":"    if CONF.discoverd.service_url:"},{"line_number":135,"context_line":"        kwargs[\u0027base_url\u0027] \u003d CONF.discoverd.service_url"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_ddf38771","line":132,"updated":"2015-03-04 22:10:31.000000000","message":"is there a bug # we can add here too?","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"def _call_discoverd(func, uuid, context):"},{"line_number":132,"context_line":"    # NOTE(dtantsur): due to a bug, client does not accept None as base_url."},{"line_number":133,"context_line":"    kwargs \u003d {}"},{"line_number":134,"context_line":"    if CONF.discoverd.service_url:"},{"line_number":135,"context_line":"        kwargs[\u0027base_url\u0027] \u003d CONF.discoverd.service_url"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_43ca4350","line":132,"in_reply_to":"9a80dd14_ddf38771","updated":"2015-03-05 09:22:59.000000000","message":"Done","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"3e28e3f87d1e9d8adc6395e69652bf782f883210","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        # NOTE(dtantsur): get_status should not normally raise"},{"line_number":172,"context_line":"        # let\u0027s assume it\u0027s a transient failure and retry later"},{"line_number":173,"context_line":"        LOG.exception(_LE(\u0027Unexpected exception while getting \u0027"},{"line_number":174,"context_line":"                          \u0027inspection status for node %s, retrying later\u0027),"},{"line_number":175,"context_line":"                      node.uuid)"},{"line_number":176,"context_line":"        return"},{"line_number":177,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_7b7c5921","line":174,"updated":"2015-03-05 03:14:11.000000000","message":"nit: s/retrying later/will retry later","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        # NOTE(dtantsur): get_status should not normally raise"},{"line_number":172,"context_line":"        # let\u0027s assume it\u0027s a transient failure and retry later"},{"line_number":173,"context_line":"        LOG.exception(_LE(\u0027Unexpected exception while getting \u0027"},{"line_number":174,"context_line":"                          \u0027inspection status for node %s, retrying later\u0027),"},{"line_number":175,"context_line":"                      node.uuid)"},{"line_number":176,"context_line":"        return"},{"line_number":177,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_83c43b41","line":174,"in_reply_to":"9a80dd14_7b7c5921","updated":"2015-03-05 09:22:59.000000000","message":"Done","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"980b017ae86cb4dd9925a89b1cf3010590c80d2f","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__(self):"},{"line_number":61,"context_line":"        if not CONF.discoverd.enabled:"},{"line_number":62,"context_line":"            LOG.info(\u0027ironic-discoverd support is disabled\u0027)"},{"line_number":63,"context_line":"            return"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        if not ironic_discoverd:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_4ee24704","line":62,"updated":"2015-03-05 19:25:09.000000000","message":"nit: _LI needed here","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"077e78afa69a2162394e91937698da0d405e6690","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        version \u003d getattr(ironic_discoverd, \u0027__version_info__\u0027, (0, 2))"},{"line_number":71,"context_line":"        if version \u003c (1, 0):"},{"line_number":72,"context_line":"            raise exception.DriverLoadError("},{"line_number":73,"context_line":"                _(\u0027ironic-discoverd version is too old: required \u003e\u003d 1.0.0 \u0027"},{"line_number":74,"context_line":"                  \u0027got %s\u0027) % \u0027.\u0027.join(str(x) for x in version))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def get_properties(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_a10a7687","line":73,"updated":"2015-03-10 00:52:50.000000000","message":"nit, need a semicolon or comma after \u00271.0.0\u0027","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb6e7bdd69dc6af7aa53a499bac2adf4efb2552b","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        version \u003d getattr(ironic_discoverd, \u0027__version_info__\u0027, (0, 2))"},{"line_number":71,"context_line":"        if version \u003c (1, 0):"},{"line_number":72,"context_line":"            raise exception.DriverLoadError("},{"line_number":73,"context_line":"                _(\u0027ironic-discoverd version is too old: required \u003e\u003d 1.0.0 \u0027"},{"line_number":74,"context_line":"                  \u0027got %s\u0027) % \u0027.\u0027.join(str(x) for x in version))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def get_properties(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_a9db304d","line":73,"in_reply_to":"9a80dd14_a10a7687","updated":"2015-03-16 12:29:20.000000000","message":"Done","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"077e78afa69a2162394e91937698da0d405e6690","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        return {}  # no properties"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def validate(self, task):"},{"line_number":84,"context_line":"        \"\"\"Validate the driver-specific management information."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        If invalid, raises an exception; otherwise returns None."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_21f6868f","line":84,"updated":"2015-03-10 00:52:50.000000000","message":"s/management/inspection/ ?","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb6e7bdd69dc6af7aa53a499bac2adf4efb2552b","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        return {}  # no properties"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def validate(self, task):"},{"line_number":84,"context_line":"        \"\"\"Validate the driver-specific management information."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        If invalid, raises an exception; otherwise returns None."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_c9dea43d","line":84,"in_reply_to":"9a80dd14_21f6868f","updated":"2015-03-16 12:29:20.000000000","message":"Done","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"077e78afa69a2162394e91937698da0d405e6690","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            raise exception.UnsupportedDriverExtension("},{"line_number":93,"context_line":"                _(\u0027ironic-discoverd support is disabled in \u0027"},{"line_number":94,"context_line":"                  \u0027configuration, set [discoverd]enabled to true \u0027"},{"line_number":95,"context_line":"                  \u0027to enable\u0027))"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def inspect_hardware(self, task):"},{"line_number":98,"context_line":"        \"\"\"Inspect hardware to obtain the hardware properties."}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_21520667","line":95,"updated":"2015-03-10 00:52:50.000000000","message":"Seems like an odd exception to be raising. This extension *IS* supported, it just isn\u0027t enabled?","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb6e7bdd69dc6af7aa53a499bac2adf4efb2552b","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            raise exception.UnsupportedDriverExtension("},{"line_number":93,"context_line":"                _(\u0027ironic-discoverd support is disabled in \u0027"},{"line_number":94,"context_line":"                  \u0027configuration, set [discoverd]enabled to true \u0027"},{"line_number":95,"context_line":"                  \u0027to enable\u0027))"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def inspect_hardware(self, task):"},{"line_number":98,"context_line":"        \"\"\"Inspect hardware to obtain the hardware properties."}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_e9cfe87c","line":95,"in_reply_to":"9a80dd14_21520667","updated":"2015-03-16 12:29:20.000000000","message":"Unfortunately, the only valid exceptions for validate are {Invalid,Missing}ParameterValue and UnsupportedDriverExtension. Anyway, Devananda wants to change the whole logic in the next patch.","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"ce8ed0b8ee1b538321bd4acf020108319483be82","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        # NOTE(dtantsur): if acquire fails our last option is to rely on"},{"line_number":152,"context_line":"        # timeout"},{"line_number":153,"context_line":"        with task_manager.acquire(context, node_uuid) as task:"},{"line_number":154,"context_line":"            task.node.last_error \u003d _(\u0027Failed to start inspection: %s\u0027) % exc"},{"line_number":155,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":156,"context_line":"    else:"},{"line_number":157,"context_line":"        LOG.info(_LI(\u0027Node %s was sent to inspection to ironic-discoverd\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_90546855","line":154,"updated":"2015-03-05 15:53:40.000000000","message":"nit: better if error message was same like below:\n\n  task.node.last_error \u003d_(\"ironic-discoverd inspection failed: %s\") % exc","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"21ed63d6507ffa4e95bebb1ee3b594ff11bdf60b","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        # NOTE(dtantsur): if acquire fails our last option is to rely on"},{"line_number":152,"context_line":"        # timeout"},{"line_number":153,"context_line":"        with task_manager.acquire(context, node_uuid) as task:"},{"line_number":154,"context_line":"            task.node.last_error \u003d _(\u0027Failed to start inspection: %s\u0027) % exc"},{"line_number":155,"context_line":"            task.process_event(\u0027fail\u0027)"},{"line_number":156,"context_line":"    else:"},{"line_number":157,"context_line":"        LOG.info(_LI(\u0027Node %s was sent to inspection to ironic-discoverd\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_9b13a95b","line":154,"in_reply_to":"9a80dd14_90546855","updated":"2015-03-05 15:57:29.000000000","message":"IMO current variant is a bit more precise :)","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"ce8ed0b8ee1b538321bd4acf020108319483be82","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        LOG.error(_LE(\u0027Inspection failed for node %(uuid)s \u0027"},{"line_number":186,"context_line":"                      \u0027with error: %(err)s\u0027),"},{"line_number":187,"context_line":"                  {\u0027uuid\u0027: node.uuid, \u0027err\u0027: status[\u0027error\u0027]})"},{"line_number":188,"context_line":"        node.last_error \u003d _(\u0027ironic-discoverd: %s\u0027) % status[\u0027error\u0027]"},{"line_number":189,"context_line":"        task.process_event(\u0027fail\u0027)"},{"line_number":190,"context_line":"    elif status.get(\u0027finished\u0027):"},{"line_number":191,"context_line":"        LOG.info(_LI(\u0027Inspection finished successfully for node %s\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_70861415","line":188,"updated":"2015-03-05 15:53:40.000000000","message":"nit: i am assuming error like \"node didn\u0027t get back\". is it worth adding inspection failed somewhere ?\n\n  _(\"ironic-discoverd inspection failed: %s\") % status[\u0027error\u0027]","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"21ed63d6507ffa4e95bebb1ee3b594ff11bdf60b","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        LOG.error(_LE(\u0027Inspection failed for node %(uuid)s \u0027"},{"line_number":186,"context_line":"                      \u0027with error: %(err)s\u0027),"},{"line_number":187,"context_line":"                  {\u0027uuid\u0027: node.uuid, \u0027err\u0027: status[\u0027error\u0027]})"},{"line_number":188,"context_line":"        node.last_error \u003d _(\u0027ironic-discoverd: %s\u0027) % status[\u0027error\u0027]"},{"line_number":189,"context_line":"        task.process_event(\u0027fail\u0027)"},{"line_number":190,"context_line":"    elif status.get(\u0027finished\u0027):"},{"line_number":191,"context_line":"        LOG.info(_LI(\u0027Inspection finished successfully for node %s\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_3b2abd7e","line":188,"in_reply_to":"9a80dd14_70861415","updated":"2015-03-05 15:57:29.000000000","message":"Will fix, if I make more revisions","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"}],"ironic/tests/drivers/test_discoverd.py":[{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"3e28e3f87d1e9d8adc6395e69652bf782f883210","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def test_init_ok(self):"},{"line_number":54,"context_line":"        discoverd.DiscoverdInspect()"},{"line_number":55,"context_line":"        self.config(enabled\u003dFalse, group\u003d\u0027discoverd\u0027)"},{"line_number":56,"context_line":"        discoverd.DiscoverdInspect()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch.object(ironic_discoverd, \u0027__version_info__\u0027, (0, 2, 2))"},{"line_number":59,"context_line":"    def test_old_version(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_9b23cd04","line":56,"updated":"2015-03-05 03:14:11.000000000","message":"better if unit tests did one thing. may be better if it was two test cases and if we assert something:\n\n  def test_init_ok(self):\n    discoverd_inspect \u003d discoverd.DiscoverdInspect()\n    self.assertIsNotNone(discoverd_inspect)\n\n  def test_init_conf_disabled(self):\n    discoverd_inspect \u003d discoverd.DiscoverdInspect()\n    self.assertIsNotNone(discoverd_inspect)","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def test_init_ok(self):"},{"line_number":54,"context_line":"        discoverd.DiscoverdInspect()"},{"line_number":55,"context_line":"        self.config(enabled\u003dFalse, group\u003d\u0027discoverd\u0027)"},{"line_number":56,"context_line":"        discoverd.DiscoverdInspect()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch.object(ironic_discoverd, \u0027__version_info__\u0027, (0, 2, 2))"},{"line_number":59,"context_line":"    def test_old_version(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_c3dd5316","line":56,"in_reply_to":"9a80dd14_9b23cd04","updated":"2015-03-05 09:22:59.000000000","message":"Done","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"3e28e3f87d1e9d8adc6395e69652bf782f883210","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        discoverd.DiscoverdInspect()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch.object(ironic_discoverd, \u0027__version_info__\u0027, (0, 2, 2))"},{"line_number":59,"context_line":"    def test_old_version(self):"},{"line_number":60,"context_line":"        self.assertRaises(exception.DriverLoadError,"},{"line_number":61,"context_line":"                          discoverd.DiscoverdInspect)"},{"line_number":62,"context_line":"        self.config(enabled\u003dFalse, group\u003d\u0027discoverd\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_db1d45bf","line":59,"updated":"2015-03-05 03:14:11.000000000","message":"test_init_old_version","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        discoverd.DiscoverdInspect()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch.object(ironic_discoverd, \u0027__version_info__\u0027, (0, 2, 2))"},{"line_number":59,"context_line":"    def test_old_version(self):"},{"line_number":60,"context_line":"        self.assertRaises(exception.DriverLoadError,"},{"line_number":61,"context_line":"                          discoverd.DiscoverdInspect)"},{"line_number":62,"context_line":"        self.config(enabled\u003dFalse, group\u003d\u0027discoverd\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_e3e257d4","line":59,"in_reply_to":"9a80dd14_db1d45bf","updated":"2015-03-05 09:22:59.000000000","message":"Done","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"3e28e3f87d1e9d8adc6395e69652bf782f883210","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        discoverd.DiscoverdInspect()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @mock.patch.object(discoverd, \u0027ironic_discoverd\u0027, None)"},{"line_number":66,"context_line":"    def test_not_imported(self):"},{"line_number":67,"context_line":"        self.assertRaises(exception.DriverLoadError,"},{"line_number":68,"context_line":"                          discoverd.DiscoverdInspect)"},{"line_number":69,"context_line":"        self.config(enabled\u003dFalse, group\u003d\u0027discoverd\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_bb2091f8","line":66,"updated":"2015-03-05 03:14:11.000000000","message":"test_init_not_imported","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        discoverd.DiscoverdInspect()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @mock.patch.object(discoverd, \u0027ironic_discoverd\u0027, None)"},{"line_number":66,"context_line":"    def test_not_imported(self):"},{"line_number":67,"context_line":"        self.assertRaises(exception.DriverLoadError,"},{"line_number":68,"context_line":"                          discoverd.DiscoverdInspect)"},{"line_number":69,"context_line":"        self.config(enabled\u003dFalse, group\u003d\u0027discoverd\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_03e84bb3","line":66,"in_reply_to":"9a80dd14_bb2091f8","updated":"2015-03-05 09:22:59.000000000","message":"Done","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"3e28e3f87d1e9d8adc6395e69652bf782f883210","unresolved":false,"context_lines":[{"line_number":73,"context_line":"@mock.patch.object(eventlet, \u0027spawn_n\u0027, lambda f, *a, **kw: f(*a, **kw))"},{"line_number":74,"context_line":"@mock.patch.object(client, \u0027introspect\u0027)"},{"line_number":75,"context_line":"class InspectHardwareTestCase(BaseTestCase):"},{"line_number":76,"context_line":"    def test_ok(self, mock_introspect):"},{"line_number":77,"context_line":"        self.assertEqual(states.INSPECTING,"},{"line_number":78,"context_line":"                         self.driver.inspect.inspect_hardware(self.task))"},{"line_number":79,"context_line":"        mock_introspect.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_9b6aed18","line":76,"updated":"2015-03-05 03:14:11.000000000","message":"nit: better if it was test_inspect_hardware_okay. ditto for all below. easy readability in my opinion and common pattern in ironic.","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5e39d2456b00eef1fbd3e950cd54d7d24bc0a58","unresolved":false,"context_lines":[{"line_number":73,"context_line":"@mock.patch.object(eventlet, \u0027spawn_n\u0027, lambda f, *a, **kw: f(*a, **kw))"},{"line_number":74,"context_line":"@mock.patch.object(client, \u0027introspect\u0027)"},{"line_number":75,"context_line":"class InspectHardwareTestCase(BaseTestCase):"},{"line_number":76,"context_line":"    def test_ok(self, mock_introspect):"},{"line_number":77,"context_line":"        self.assertEqual(states.INSPECTING,"},{"line_number":78,"context_line":"                         self.driver.inspect.inspect_hardware(self.task))"},{"line_number":79,"context_line":"        mock_introspect.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_c3047380","line":76,"in_reply_to":"9a80dd14_9b6aed18","updated":"2015-03-05 09:22:59.000000000","message":"I\u0027m pretty much against repeating test case name in test names, so I think I\u0027ll leave it as it is.","commit_id":"b56462eabaec9e2f06e66f316a573394d58e856d"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"ce8ed0b8ee1b538321bd4acf020108319483be82","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        discoverd.DiscoverdInspect()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch.object(ironic_discoverd, \u0027__version_info__\u0027, (0, 2, 2))"},{"line_number":59,"context_line":"    def test_old_version(self):"},{"line_number":60,"context_line":"        self.assertRaises(exception.DriverLoadError,"},{"line_number":61,"context_line":"                          discoverd.DiscoverdInspect)"},{"line_number":62,"context_line":"        self.config(enabled\u003dFalse, group\u003d\u0027discoverd\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_50e9107f","line":59,"updated":"2015-03-05 15:53:40.000000000","message":"missed to change to test_init_old_version and test_init_not_imported :)","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"21ed63d6507ffa4e95bebb1ee3b594ff11bdf60b","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        discoverd.DiscoverdInspect()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch.object(ironic_discoverd, \u0027__version_info__\u0027, (0, 2, 2))"},{"line_number":59,"context_line":"    def test_old_version(self):"},{"line_number":60,"context_line":"        self.assertRaises(exception.DriverLoadError,"},{"line_number":61,"context_line":"                          discoverd.DiscoverdInspect)"},{"line_number":62,"context_line":"        self.config(enabled\u003dFalse, group\u003d\u0027discoverd\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_db4b6157","line":59,"in_reply_to":"9a80dd14_50e9107f","updated":"2015-03-05 15:57:29.000000000","message":"sorry, will fix when I have a chance to","commit_id":"03eb9e022e1a9bc15d6e90b6e163d27102da412f"}]}
