)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"99fb79c7cfc5384cb8124b9fa819ea6e2800c5aa","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add redfish driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is adding a redfish driver based on the sushy library. This"},{"line_number":10,"context_line":"is just a basic driver that current supports:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"* Power: Hard power on/off/reboot, soft power off/reboot"},{"line_number":13,"context_line":"* Setting the boot device (PXE, disk, cd-rom, bios); Persistent or not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ba2be162_8fb6d63b","line":10,"updated":"2017-02-28 16:45:21.000000000","message":"Nit: \"currently\"","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a6da8fbf8089489ea66fa2eca8353371abf195c0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add redfish driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is adding a redfish driver based on the sushy library. This"},{"line_number":10,"context_line":"is just a basic driver that current supports:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"* Power: Hard power on/off/reboot, soft power off/reboot"},{"line_number":13,"context_line":"* Setting the boot device (PXE, disk, cd-rom, bios); Persistent or not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ba2be162_14d10ace","line":10,"in_reply_to":"ba2be162_8fb6d63b","updated":"2017-02-28 22:14:27.000000000","message":"Done","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"157d88ba7c5cb2469b341dd81af3e32880a39301","unresolved":false,"context_lines":[{"line_number":19,"context_line":"keep it this way (-:"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Documentation and DevStack updates will be done on subsequent patches."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Partial-Bug: #1526477"},{"line_number":24,"context_line":"Change-Id: I14470edff65cd14bb73263ec7310559a8eaa6c84"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"3a1ff146_a18e4925","line":22,"updated":"2017-03-14 17:16:41.000000000","message":"This patch-set is already accommodating the changes described at https://review.openstack.org/#/c/445478/","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"}],"driver-requirements.txt":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"78946da78963b43c6adada84fc8eb6ee0c3f5150","unresolved":false,"context_lines":[{"line_number":17,"context_line":"ImcSdk\u003e\u003d0.7.2"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"# The Redfish hardware type uses the Sushy library"},{"line_number":20,"context_line":"sushy"}],"source_content_type":"text/plain","patch_set":5,"id":"ba2be162_19f2629a","line":20,"updated":"2017-03-04 20:59:09.000000000","message":"this implies that all versions are compatible, right? I wonder if we need at least a top cap (like \u003c\u003d2.0.0)","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"52df6cf287f330ca1dc60e3067e5c640fe14c30c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"ImcSdk\u003e\u003d0.7.2"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"# The Redfish hardware type uses the Sushy library"},{"line_number":20,"context_line":"sushy"}],"source_content_type":"text/plain","patch_set":5,"id":"ba2be162_4db242e6","line":20,"in_reply_to":"ba2be162_19f2629a","updated":"2017-03-06 10:10:44.000000000","message":"Oh yeah, I just left it like this because we haven\u0027t released any version of Sushy yet.","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":16,"context_line":"ImcSdk\u003e\u003d0.7.2"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# The Redfish hardware type uses the Sushy library"},{"line_number":19,"context_line":"sushy"}],"source_content_type":"text/plain","patch_set":15,"id":"bff0334d_f9d72dbe","line":19,"updated":"2017-04-12 17:52:16.000000000","message":"we don\u0027t want to mention any version(s) of sushy?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"ec7131fb701430fbb64efe75692901a7d17b3860","unresolved":false,"context_lines":[{"line_number":16,"context_line":"ImcSdk\u003e\u003d0.7.2"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# The Redfish hardware type uses the Sushy library"},{"line_number":19,"context_line":"sushy"}],"source_content_type":"text/plain","patch_set":15,"id":"9ff52f3f_31910e54","line":19,"in_reply_to":"9ff52f3f_57f7e7f6","updated":"2017-04-13 10:57:43.000000000","message":"Also, btw, I think we can leave it version less for now because saying \u003e\u003d0.1.0 is kinda pointless even after the release. We can pin it to a higher version when needed, for now all versions should work.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":16,"context_line":"ImcSdk\u003e\u003d0.7.2"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# The Redfish hardware type uses the Sushy library"},{"line_number":19,"context_line":"sushy"}],"source_content_type":"text/plain","patch_set":15,"id":"9ff52f3f_57f7e7f6","line":19,"in_reply_to":"bff0334d_f9d72dbe","updated":"2017-04-13 10:21:45.000000000","message":"Yes we do want, the problem is that we don\u0027t have a release yet... I\u0027ve just added a patch to the releases repository for the version 0.1 o/ https://review.openstack.org/#/c/456539/","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"}],"ironic/common/exception.py":[{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"d38d61f7f4d1d53c5a303f6c85fde152bf812240","unresolved":false,"context_lines":[{"line_number":741,"context_line":""},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"class RedfishOperationError(IronicException):"},{"line_number":744,"context_line":"    _msg_fmt \u003d _(\"An error occured when talking to Redfish. Error: %(error)s\")"},{"line_number":745,"context_line":""},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"class RedfishConnectionError(IronicException):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_5331b50a","line":744,"range":{"start_line":744,"start_character":27,"end_line":744,"end_character":34},"updated":"2017-03-01 21:23:29.000000000","message":"s/occured/occurred","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"2a28a8300b17c9d8232186a6c525b10faa684dc5","unresolved":false,"context_lines":[{"line_number":741,"context_line":""},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"class RedfishOperationError(IronicException):"},{"line_number":744,"context_line":"    _msg_fmt \u003d _(\"An error occured when talking to Redfish. Error: %(error)s\")"},{"line_number":745,"context_line":""},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"class RedfishConnectionError(IronicException):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_15ad3a31","line":744,"range":{"start_line":744,"start_character":27,"end_line":744,"end_character":34},"in_reply_to":"ba2be162_5331b50a","updated":"2017-03-02 09:37:48.000000000","message":"Done","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"78946da78963b43c6adada84fc8eb6ee0c3f5150","unresolved":false,"context_lines":[{"line_number":741,"context_line":""},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"class RedfishError(IronicException):"},{"line_number":744,"context_line":"    _msg_fmt \u003d _(\"An error occurred when talking to Redfish. \""},{"line_number":745,"context_line":"                 \"Error: %(error)s\")"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_59077a81","line":744,"updated":"2017-03-04 20:59:09.000000000","message":"nit: \"An error when talking to RedFish: %(error)s\"","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"dca94805fa416b6a32a5cfd64b7366e4ffc506c9","unresolved":false,"context_lines":[{"line_number":741,"context_line":""},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"class RedfishError(IronicException):"},{"line_number":744,"context_line":"    _msg_fmt \u003d _(\"An error occurred when talking to Redfish. \""},{"line_number":745,"context_line":"                 \"Error: %(error)s\")"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_24b35999","line":744,"in_reply_to":"ba2be162_4d37a24c","updated":"2017-03-06 17:21:08.000000000","message":"+1","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"52df6cf287f330ca1dc60e3067e5c640fe14c30c","unresolved":false,"context_lines":[{"line_number":741,"context_line":""},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"class RedfishError(IronicException):"},{"line_number":744,"context_line":"    _msg_fmt \u003d _(\"An error occurred when talking to Redfish. \""},{"line_number":745,"context_line":"                 \"Error: %(error)s\")"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_4d37a24c","line":744,"in_reply_to":"ba2be162_59077a81","updated":"2017-03-06 10:10:44.000000000","message":"Without the \"Error: \" right ?\n\nCause I think the \"occurred when\" bits makes sense still","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"78946da78963b43c6adada84fc8eb6ee0c3f5150","unresolved":false,"context_lines":[{"line_number":746,"context_line":""},{"line_number":747,"context_line":""},{"line_number":748,"context_line":"class RedfishConnectionError(IronicException):"},{"line_number":749,"context_line":"    _msg_fmt \u003d _(\"Redfish connection failed for node %(node)s\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_790a7e8b","line":749,"updated":"2017-03-04 20:59:09.000000000","message":"nit: should it be a subclass of RedfishError?","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"52df6cf287f330ca1dc60e3067e5c640fe14c30c","unresolved":false,"context_lines":[{"line_number":746,"context_line":""},{"line_number":747,"context_line":""},{"line_number":748,"context_line":"class RedfishConnectionError(IronicException):"},{"line_number":749,"context_line":"    _msg_fmt \u003d _(\"Redfish connection failed for node %(node)s\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_cd4392ad","line":749,"in_reply_to":"ba2be162_790a7e8b","updated":"2017-03-06 10:10:44.000000000","message":"Great point, yes!","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"4f35d585b85e013d00c4abe2bd7a4d73cb6bcbda","unresolved":false,"context_lines":[{"line_number":741,"context_line":""},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"class RedfishError(IronicException):"},{"line_number":744,"context_line":"    _msg_fmt \u003d _(\"An error occurred when talking to Redfish: %(error)s\")"},{"line_number":745,"context_line":""},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"class RedfishConnectionError(RedfishError):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_e51c086c","line":744,"range":{"start_line":744,"start_character":41,"end_line":744,"end_character":59},"updated":"2017-03-11 09:29:27.000000000","message":"Should include node uuid as well.","commit_id":"d1295a154314ed73401ad56032293d87e6701f10"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"8e8730f0260703db349a05b8cd294f3b3d317d1c","unresolved":false,"context_lines":[{"line_number":741,"context_line":""},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"class RedfishError(IronicException):"},{"line_number":744,"context_line":"    _msg_fmt \u003d _(\"An error occurred when talking to Redfish: %(error)s\")"},{"line_number":745,"context_line":""},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"class RedfishConnectionError(RedfishError):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_faf73ed0","line":744,"range":{"start_line":744,"start_character":41,"end_line":744,"end_character":59},"in_reply_to":"9a30ddce_e51c086c","updated":"2017-03-11 19:50:51.000000000","message":"++","commit_id":"d1295a154314ed73401ad56032293d87e6701f10"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":745,"context_line":""},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"class RedfishError(IronicException):"},{"line_number":748,"context_line":"    _msg_fmt \u003d _(\"An error occurred when talking to Redfish: %(error)s\")"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":""},{"line_number":751,"context_line":"class RedfishConnectionError(RedfishError):"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_5997393b","line":748,"updated":"2017-04-12 17:52:16.000000000","message":"I\u0027m not crazy about the \u0027when talking to\u0027 part. Cuz, you know, \u0027talking\u0027...\n\nIs this meant to be a generic Redfish error? Maybe something like \u0027Redfish operation error occurred\u0027. Or \u0027Redfish exception occurred.\u0027 (this is similar to OneViewError exception)","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":745,"context_line":""},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"class RedfishError(IronicException):"},{"line_number":748,"context_line":"    _msg_fmt \u003d _(\"An error occurred when talking to Redfish: %(error)s\")"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":""},{"line_number":751,"context_line":"class RedfishConnectionError(RedfishError):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_575ec7e6","line":748,"in_reply_to":"bff0334d_5997393b","updated":"2017-04-13 10:21:45.000000000","message":"Yeah generic, that\u0027s the base exception for the Redfish driver. \n\n++ for not saying \"talking to\", I like the \"Redfish exception occurred\" suggestion, thanks I will update it.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"}],"ironic/conf/redfish.py":[{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"093b57e53df821ab59f34aaa3422d2b2f5eb27c8","unresolved":false,"context_lines":[{"line_number":23,"context_line":"               help\u003d_(\u0027Maximum number of attempts to try to connect \u0027"},{"line_number":24,"context_line":"                      \u0027to Redfish\u0027)),"},{"line_number":25,"context_line":"    cfg.IntOpt(\u0027connection_retry_interval\u0027,"},{"line_number":26,"context_line":"               default\u003d2,"},{"line_number":27,"context_line":"               help\u003d_(\u0027Number of seconds to wait between attempts to \u0027"},{"line_number":28,"context_line":"                      \u0027connect to Redfish\u0027))"},{"line_number":29,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_ab41b13b","line":26,"range":{"start_line":26,"start_character":23,"end_line":26,"end_character":24},"updated":"2017-03-15 07:24:18.000000000","message":"This may be ok for a mockup server, but on an actual hardware (atleast iLO hardwares) there is a delay of 10 seconds for retrial which multiplies by 2 as number of retrials increases.","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":17114,"name":"Hans Feldt","email":"hans.feldt@ericsson.com","username":"hafe"},"change_message_id":"6e29179097b4e6e0c546fd4a4e98142e67f53201","unresolved":false,"context_lines":[{"line_number":23,"context_line":"               help\u003d_(\u0027Maximum number of attempts to try to connect \u0027"},{"line_number":24,"context_line":"                      \u0027to Redfish\u0027)),"},{"line_number":25,"context_line":"    cfg.IntOpt(\u0027connection_retry_interval\u0027,"},{"line_number":26,"context_line":"               default\u003d2,"},{"line_number":27,"context_line":"               help\u003d_(\u0027Number of seconds to wait between attempts to \u0027"},{"line_number":28,"context_line":"                      \u0027connect to Redfish\u0027))"},{"line_number":29,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_0dd2a700","line":26,"range":{"start_line":26,"start_character":23,"end_line":26,"end_character":24},"in_reply_to":"3a1ff146_0259c25a","updated":"2017-03-16 07:59:21.000000000","message":"What about retry-able server side http errors (503). Where should those be retried? I assume in sushy meaning there will be 2 similar retry loops that both should have a configurable back-off algorithm.","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"               help\u003d_(\u0027Maximum number of attempts to try to connect \u0027"},{"line_number":24,"context_line":"                      \u0027to Redfish\u0027)),"},{"line_number":25,"context_line":"    cfg.IntOpt(\u0027connection_retry_interval\u0027,"},{"line_number":26,"context_line":"               default\u003d2,"},{"line_number":27,"context_line":"               help\u003d_(\u0027Number of seconds to wait between attempts to \u0027"},{"line_number":28,"context_line":"                      \u0027connect to Redfish\u0027))"},{"line_number":29,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_0259c25a","line":26,"range":{"start_line":26,"start_character":23,"end_line":26,"end_character":24},"in_reply_to":"3a1ff146_ab41b13b","updated":"2017-03-15 09:39:05.000000000","message":"And how many attempts ?\n\nIt\u0027s tough to come up with such defaults, so I thought that retrying for 10s (like now) would be OK. Perhaps we should increase it a bit, 20s ?","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"}],"ironic/drivers/modules/redfish/management.py":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"99fb79c7cfc5384cb8124b9fa819ea6e2800c5aa","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    def get_boot_device(self, task):"},{"line_number":88,"context_line":"        \"\"\"Get the current boot device for a node."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        Provides the current boot device of the node. Be aware that not"},{"line_number":91,"context_line":"        all drivers support this."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        :param task: a task from TaskManager."}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_8f46d6bd","line":90,"updated":"2017-02-28 16:45:21.000000000","message":"This is copied-and-pasted from drivers/base.py, right? I think you can take this warning out of the docstring for a concrete implementation :-)","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a6da8fbf8089489ea66fa2eca8353371abf195c0","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    def get_boot_device(self, task):"},{"line_number":88,"context_line":"        \"\"\"Get the current boot device for a node."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        Provides the current boot device of the node. Be aware that not"},{"line_number":91,"context_line":"        all drivers support this."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        :param task: a task from TaskManager."}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_149f4a04","line":90,"in_reply_to":"ba2be162_8f46d6bd","updated":"2017-02-28 22:14:27.000000000","message":"Nice catch! Yeah I\u0027ve copied and pasted it from the base interface and started implement the methods, thanks for checking the docstring I will update it.","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"d38d61f7f4d1d53c5a303f6c85fde152bf812240","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        \"\"\""},{"line_number":105,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":106,"context_line":"        return {\u0027boot_device\u0027: BOOT_DEVICE_MAP.get(system.boot.get(\u0027target\u0027)),"},{"line_number":107,"context_line":"                \u0027persistent\u0027: BOOT_DEVICE_PERSISTENT_MAP.get("},{"line_number":108,"context_line":"                    system.boot.get(\u0027enabled\u0027))}"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_6db08a44","line":106,"range":{"start_line":106,"start_character":51,"end_line":106,"end_character":76},"updated":"2017-03-01 21:23:29.000000000","message":"I was just wondering if we can have an API from Sushy like, ``system.get_current_boot_source``. Again, seeing the attributes what ``system.boot`` contains:\n\n    self.boot \u003d {\n      \u0027target\u0027: BOOT_SOURCE_TARGET value,\n      \u0027enabled\u0027: BOOT_SOURCE_ENABLED value,\n      \u0027mode\u0027: BOOT_SOURCE_MODE value\n    }\n\nit kinda convinces me that I can get all boot related values from one data-member, i.e. ``boot``. Thanks!","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"99fb79c7cfc5384cb8124b9fa819ea6e2800c5aa","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                \u0027persistent\u0027: BOOT_DEVICE_PERSISTENT_MAP.get("},{"line_number":108,"context_line":"                    system.boot.get(\u0027enabled\u0027))}"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def get_sensors_data(self, task):"},{"line_number":111,"context_line":"        \"\"\"Get sensors data method."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        :param task: a TaskManager instance."}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_ef8112fd","line":110,"updated":"2017-02-28 16:45:21.000000000","message":"This is out-of-scope for this patch, but I notice that there\u0027s an inconsistency between \"sensors data\" and \"sensor data\" in the naming. I think \"sensor data\" is grammatically preferable.","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a6da8fbf8089489ea66fa2eca8353371abf195c0","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                \u0027persistent\u0027: BOOT_DEVICE_PERSISTENT_MAP.get("},{"line_number":108,"context_line":"                    system.boot.get(\u0027enabled\u0027))}"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def get_sensors_data(self, task):"},{"line_number":111,"context_line":"        \"\"\"Get sensors data method."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        :param task: a TaskManager instance."}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_94933afa","line":110,"in_reply_to":"ba2be162_ef8112fd","updated":"2017-02-28 22:14:27.000000000","message":"Agreed, unfortunately as you rightly pointed out there\u0027s not much I can do in this patch about it.","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"d38d61f7f4d1d53c5a303f6c85fde152bf812240","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                        }"},{"line_number":147,"context_line":"                      }"},{"line_number":148,"context_line":"        \"\"\""},{"line_number":149,"context_line":"        raise NotImplemented()"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def inject_nmi(self, task):"},{"line_number":152,"context_line":"        \"\"\"Inject NMI, Non Maskable Interrupt."}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_cd541623","line":149,"range":{"start_line":149,"start_character":14,"end_line":149,"end_character":28},"updated":"2017-03-01 21:23:29.000000000","message":"is it a TODO item for recent future? if not, then why not use ``exception.UnsupportedDriverExtension`` as of now? I get to see that the msg it embodies is ``disabled or not implemented``\nhttps://github.com/openstack/ironic/blob/master/ironic/common/exception.py#L494","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"8fddd8f62ef9d75d4ce17d716ee21a3232559235","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                        }"},{"line_number":147,"context_line":"                      }"},{"line_number":148,"context_line":"        \"\"\""},{"line_number":149,"context_line":"        raise NotImplemented()"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def inject_nmi(self, task):"},{"line_number":152,"context_line":"        \"\"\"Inject NMI, Non Maskable Interrupt."}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_de948ce3","line":149,"range":{"start_line":149,"start_character":14,"end_line":149,"end_character":28},"in_reply_to":"ba2be162_cd541623","updated":"2017-03-02 15:20:11.000000000","message":"Yeah it\u0027s a TODO, sushy doesn\u0027t yet support getting sensors data, I left an item for it at: http://sushy.readthedocs.io/en/latest/readme.html#todo\n\nI looked at the UnsupportedDriverExtension and it seems that it\u0027s used if a driver doesn\u0027t support a certain interface, methods not implemented seems to be using NotImplemented() like we are doing here [0][1]\n\n[0] https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/ucs/management.py#L148\n\n[1] https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/cimc/management.py#L164","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"78946da78963b43c6adada84fc8eb6ee0c3f5150","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        :raises: NotImplementedError"},{"line_number":121,"context_line":"        \"\"\""},{"line_number":122,"context_line":"        raise NotImplementedError"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def inject_nmi(self, task):"},{"line_number":125,"context_line":"        \"\"\"Inject NMI, Non Maskable Interrupt."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_99fd7270","line":122,"updated":"2017-03-04 20:59:09.000000000","message":"missing () in the end (raising a class is deprecated)","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"52df6cf287f330ca1dc60e3067e5c640fe14c30c","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        :raises: NotImplementedError"},{"line_number":121,"context_line":"        \"\"\""},{"line_number":122,"context_line":"        raise NotImplementedError"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def inject_nmi(self, task):"},{"line_number":125,"context_line":"        \"\"\"Inject NMI, Non Maskable Interrupt."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_ad1f3eb5","line":122,"in_reply_to":"ba2be162_99fd7270","updated":"2017-03-06 10:10:44.000000000","message":"Done","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"093b57e53df821ab59f34aaa3422d2b2f5eb27c8","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"sushy \u003d importutils.try_import(\u0027sushy\u0027)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"if sushy:"},{"line_number":25,"context_line":"    BOOT_DEVICE_MAP \u003d {"},{"line_number":26,"context_line":"        sushy.BOOT_SOURCE_TARGET_PXE: boot_devices.PXE,"},{"line_number":27,"context_line":"        sushy.BOOT_SOURCE_TARGET_HDD: boot_devices.DISK,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_0b6005ce","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":9},"updated":"2017-03-15 07:24:18.000000000","message":"what if \"sushy\" is false?","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"sushy \u003d importutils.try_import(\u0027sushy\u0027)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"if sushy:"},{"line_number":25,"context_line":"    BOOT_DEVICE_MAP \u003d {"},{"line_number":26,"context_line":"        sushy.BOOT_SOURCE_TARGET_PXE: boot_devices.PXE,"},{"line_number":27,"context_line":"        sushy.BOOT_SOURCE_TARGET_HDD: boot_devices.DISK,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_5d047b14","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":9},"in_reply_to":"3a1ff146_0b6005ce","updated":"2017-03-15 09:39:05.000000000","message":"The driver will fail to load. This is similar to what other drivers do, e.g:\n\n* https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/irmc/power.py#L63\n\n* https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/drac/power.py#L37\n\nSome also uses functions to have these options to be lazily evaluated (iLO does I think).","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d8439087e866fee4cd61517e4b3ee660d74e5a08","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        :returns: dictionary of \u003cproperty name\u003e:\u003cproperty description\u003e entries."},{"line_number":49,"context_line":"        \"\"\""},{"line_number":50,"context_line":"        return redfish_utils.COMMON_PROPERTIES"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def validate(self, task):"},{"line_number":53,"context_line":"        \"\"\"Validates the driver_information passed to the redfish driver."}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_bfb6593b","line":50,"updated":"2017-03-14 21:36:48.000000000","message":"Should return a copy() ? Just to be safer, in case caller modified the dict. Or is it desired that they can?","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        :returns: dictionary of \u003cproperty name\u003e:\u003cproperty description\u003e entries."},{"line_number":49,"context_line":"        \"\"\""},{"line_number":50,"context_line":"        return redfish_utils.COMMON_PROPERTIES"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def validate(self, task):"},{"line_number":53,"context_line":"        \"\"\"Validates the driver_information passed to the redfish driver."}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_3d741f9b","line":50,"in_reply_to":"3a1ff146_bfb6593b","updated":"2017-03-15 09:39:05.000000000","message":"Could be, I will change it. The drivers I looked as reference (ipmitool) doesn\u0027t do copy() but we can do it here just o be on the safe side","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d8439087e866fee4cd61517e4b3ee660d74e5a08","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        :raises: InvalidParameterValue on malformed parameter(s)"},{"line_number":82,"context_line":"        :raises: MissingParameterValue on missing parameter(s)"},{"line_number":83,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":84,"context_line":"        :raises: RedfishError on an error from the Sushy library"},{"line_number":85,"context_line":"        \"\"\""},{"line_number":86,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":87,"context_line":"        # TODO(lucasagomes): set_system_boot_source() also supports mode"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_1ff3ed0b","line":84,"updated":"2017-03-14 21:36:48.000000000","message":"Is this true? How does the call to system.set_system_boot_source() catch an error from Sushy?","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        :raises: InvalidParameterValue on malformed parameter(s)"},{"line_number":82,"context_line":"        :raises: MissingParameterValue on missing parameter(s)"},{"line_number":83,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":84,"context_line":"        :raises: RedfishError on an error from the Sushy library"},{"line_number":85,"context_line":"        \"\"\""},{"line_number":86,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":87,"context_line":"        # TODO(lucasagomes): set_system_boot_source() also supports mode"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_7da5b702","line":84,"in_reply_to":"3a1ff146_1ff3ed0b","updated":"2017-03-15 09:39:05.000000000","message":"Yes, the get_system() can raise RedfishError [0], but perhaps I should also guard the other calls here. Will do\n\n[0] https://review.openstack.org/#/c/438982/10/ironic/drivers/modules/redfish/utils.py","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d8439087e866fee4cd61517e4b3ee660d74e5a08","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        :raises: InvalidParameterValue on malformed parameter(s)"},{"line_number":132,"context_line":"        :raises: MissingParameterValue on missing parameter(s)"},{"line_number":133,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":134,"context_line":"        :raises: RedfishError on an error from the Sushy library"},{"line_number":135,"context_line":"        \"\"\""},{"line_number":136,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":137,"context_line":"        system.reset_system(sushy.RESET_NMI)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_ffd45148","line":134,"updated":"2017-03-14 21:36:48.000000000","message":"Is this true? How does the call to system.reset_system() catch an error from Sushy?","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        :raises: InvalidParameterValue on malformed parameter(s)"},{"line_number":132,"context_line":"        :raises: MissingParameterValue on missing parameter(s)"},{"line_number":133,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":134,"context_line":"        :raises: RedfishError on an error from the Sushy library"},{"line_number":135,"context_line":"        \"\"\""},{"line_number":136,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":137,"context_line":"        system.reset_system(sushy.RESET_NMI)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_1db7633a","line":134,"in_reply_to":"3a1ff146_ffd45148","updated":"2017-03-15 09:39:05.000000000","message":"ditto, yes re: get_system() can raise it but I will capture it for other calls as well","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"5009ea39da11fee727c1a8e3e56c3757cf622030","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        :param task: a task from TaskManager."},{"line_number":81,"context_line":"        :param device: the boot device, one of"},{"line_number":82,"context_line":"                       :mod:`ironic.common.boot_devices`."},{"line_number":83,"context_line":"        :param persistent: Boolean value. True if the boot device will"},{"line_number":84,"context_line":"                           persist to all future boots, False if not."},{"line_number":85,"context_line":"                           Default: False."}],"source_content_type":"text/x-python","patch_set":11,"id":"3a1ff146_abd6f4c2","line":82,"updated":"2017-03-15 18:01:59.000000000","message":"TIL about :mod:, nice.","commit_id":"fbc3cdbc5415bf8c482c4852302a6cebfff227d4"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        sushy.BOOT_SOURCE_TARGET_BIOS_SETUP: boot_devices.BIOS"},{"line_number":35,"context_line":"    }"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    BOOT_DEVICE_MAP_REV \u003d {v: k for k, v in BOOT_DEVICE_MAP.items()}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    BOOT_DEVICE_PERSISTENT_MAP \u003d {"},{"line_number":40,"context_line":"        sushy.BOOT_SOURCE_ENABLED_CONTINUOUS: True,"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_5cdba74d","line":37,"updated":"2017-04-12 17:52:16.000000000","message":"what does \u0027REV\u0027 stand for? \u0027reverse\u0027?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        sushy.BOOT_SOURCE_TARGET_BIOS_SETUP: boot_devices.BIOS"},{"line_number":35,"context_line":"    }"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    BOOT_DEVICE_MAP_REV \u003d {v: k for k, v in BOOT_DEVICE_MAP.items()}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    BOOT_DEVICE_PERSISTENT_MAP \u003d {"},{"line_number":40,"context_line":"        sushy.BOOT_SOURCE_ENABLED_CONTINUOUS: True,"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_7221d99f","line":37,"in_reply_to":"bff0334d_5cdba74d","updated":"2017-04-13 10:21:45.000000000","message":"Yes, reverse","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def __init__(self):"},{"line_number":51,"context_line":"        \"\"\"Initialize the Redfish management interface."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        :raises: DriverLoadError if the driver can\u0027t be loaded due"},{"line_number":54,"context_line":"            missing dependencies"},{"line_number":55,"context_line":"        \"\"\""},{"line_number":56,"context_line":"        super(RedfishManagement, self).__init__()"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_9ca36fb2","line":53,"updated":"2017-04-12 17:52:16.000000000","message":"nit s/due/due to/","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def __init__(self):"},{"line_number":51,"context_line":"        \"\"\"Initialize the Redfish management interface."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        :raises: DriverLoadError if the driver can\u0027t be loaded due"},{"line_number":54,"context_line":"            missing dependencies"},{"line_number":55,"context_line":"        \"\"\""},{"line_number":56,"context_line":"        super(RedfishManagement, self).__init__()"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_5226d5b9","line":53,"in_reply_to":"bff0334d_9ca36fb2","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":"        return redfish_utils.COMMON_PROPERTIES.copy()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def validate(self, task):"},{"line_number":70,"context_line":"        \"\"\"Validates the driver_information passed to the redfish driver."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_7cbd4bb5","line":69,"updated":"2017-04-12 17:52:16.000000000","message":"are you going to add metrics to Redfish, or is that in a followup patch?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":"        return redfish_utils.COMMON_PROPERTIES.copy()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def validate(self, task):"},{"line_number":70,"context_line":"        \"\"\"Validates the driver_information passed to the redfish driver."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_9251fd11","line":69,"in_reply_to":"bff0334d_7cbd4bb5","updated":"2017-04-13 10:21:45.000000000","message":"I would prefer to do it in a follow-up patch since it wasn\u0027t included in the spec (and append things to the spec usually takes time)","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        return redfish_utils.COMMON_PROPERTIES.copy()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def validate(self, task):"},{"line_number":70,"context_line":"        \"\"\"Validates the driver_information passed to the redfish driver."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":73,"context_line":"        :raises: InvalidParameterValue on malformed parameter(s)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_1cfcff6d","line":70,"updated":"2017-04-12 17:52:16.000000000","message":"by driver_information, you mean node.driver_info? If you want it to say \u0027driver information\u0027, maybe take out the underscore.\n\n\u0027passed to the redfish driver\u0027 is odd too. You aren\u0027t actually passing any of that info right now. Maybe s/passed to/needed by/ ?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        return redfish_utils.COMMON_PROPERTIES.copy()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def validate(self, task):"},{"line_number":70,"context_line":"        \"\"\"Validates the driver_information passed to the redfish driver."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":73,"context_line":"        :raises: InvalidParameterValue on malformed parameter(s)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_927a1d86","line":70,"in_reply_to":"bff0334d_1cfcff6d","updated":"2017-04-13 10:21:45.000000000","message":"Yes for \"needed by\" and to remove the underscore.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        return list(BOOT_DEVICE_MAP_REV)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def set_boot_device(self, task, device, persistent\u003dFalse):"},{"line_number":88,"context_line":"        \"\"\"Set the boot device for a node."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        Set the boot device to use on next reboot of the node."}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_bc8bd3bd","line":87,"updated":"2017-04-12 17:52:16.000000000","message":"do we need to lock (via @task_manager.require_exclusive_lock)? I see other drivers do that.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        return list(BOOT_DEVICE_MAP_REV)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def set_boot_device(self, task, device, persistent\u003dFalse):"},{"line_number":88,"context_line":"        \"\"\"Set the boot device for a node."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        Set the boot device to use on next reboot of the node."}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_d25f850c","line":87,"in_reply_to":"bff0334d_bc8bd3bd","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":104,"context_line":"        # TODO(lucasagomes): set_system_boot_source() also supports mode"},{"line_number":105,"context_line":"        # for UEFI and BIOS we should get it from instance_info and pass"},{"line_number":106,"context_line":"        # it along this call"},{"line_number":107,"context_line":"        try:"},{"line_number":108,"context_line":"            system.set_system_boot_source("},{"line_number":109,"context_line":"                BOOT_DEVICE_MAP_REV[device],"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_bc1ab3c2","line":106,"updated":"2017-04-12 17:52:16.000000000","message":"is this something that is done in a subsequent patch? If not, how are we going to track that it should be done later?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":104,"context_line":"        # TODO(lucasagomes): set_system_boot_source() also supports mode"},{"line_number":105,"context_line":"        # for UEFI and BIOS we should get it from instance_info and pass"},{"line_number":106,"context_line":"        # it along this call"},{"line_number":107,"context_line":"        try:"},{"line_number":108,"context_line":"            system.set_system_boot_source("},{"line_number":109,"context_line":"                BOOT_DEVICE_MAP_REV[device],"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_12abadd6","line":106,"in_reply_to":"bff0334d_bc1ab3c2","updated":"2017-04-13 10:21:45.000000000","message":"Yes, I would prefer doing this in a separated patch because I haven\u0027t tested it myself (due to lack of hardware). So I don\u0027t want to expose it without know whether it works or not.\n\nAre you OK with this being included in another patch ?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                the boot device, one of :mod:`ironic.common.boot_devices` or"},{"line_number":130,"context_line":"                None if it is unknown."},{"line_number":131,"context_line":"            :persistent:"},{"line_number":132,"context_line":"                Whether the boot device will persist to all future boots or"},{"line_number":133,"context_line":"                not, None if it is unknown."},{"line_number":134,"context_line":"        \"\"\""},{"line_number":135,"context_line":"        system \u003d redfish_utils.get_system(task.node)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_65a00ef5","line":132,"updated":"2017-04-12 17:52:16.000000000","message":"this is a Boolean, right? So True if the boot device will persist..., False otherwise.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                the boot device, one of :mod:`ironic.common.boot_devices` or"},{"line_number":130,"context_line":"                None if it is unknown."},{"line_number":131,"context_line":"            :persistent:"},{"line_number":132,"context_line":"                Whether the boot device will persist to all future boots or"},{"line_number":133,"context_line":"                not, None if it is unknown."},{"line_number":134,"context_line":"        \"\"\""},{"line_number":135,"context_line":"        system \u003d redfish_utils.get_system(task.node)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_3297d193","line":132,"in_reply_to":"bff0334d_65a00ef5","updated":"2017-04-13 10:21:45.000000000","message":"That\u0027s correct, it\u0027s a boolean. I will add some info","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                not, None if it is unknown."},{"line_number":134,"context_line":"        \"\"\""},{"line_number":135,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":136,"context_line":"        return {\u0027boot_device\u0027: BOOT_DEVICE_MAP.get(system.boot.get(\u0027target\u0027)),"},{"line_number":137,"context_line":"                \u0027persistent\u0027: BOOT_DEVICE_PERSISTENT_MAP.get("},{"line_number":138,"context_line":"                    system.boot.get(\u0027enabled\u0027))}"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_6b657fb4","line":136,"updated":"2017-04-12 17:52:16.000000000","message":"so no sushy exceptions will be raised by system.boot.get()?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                not, None if it is unknown."},{"line_number":134,"context_line":"        \"\"\""},{"line_number":135,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":136,"context_line":"        return {\u0027boot_device\u0027: BOOT_DEVICE_MAP.get(system.boot.get(\u0027target\u0027)),"},{"line_number":137,"context_line":"                \u0027persistent\u0027: BOOT_DEVICE_PERSISTENT_MAP.get("},{"line_number":138,"context_line":"                    system.boot.get(\u0027enabled\u0027))}"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_5245b516","line":136,"in_reply_to":"bff0334d_6b657fb4","updated":"2017-04-13 10:21:45.000000000","message":"No, after get_system() succeed the boot.get() is a cached value (it\u0027s a JSON btw) so get() won\u0027t raise any exception from sushy because it doesn\u0027t require talking to the BMC.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"60837f6ff1dc538b5c9020bba6526b9a6168ddc5","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                the boot device, one of :mod:`ironic.common.boot_devices` or"},{"line_number":132,"context_line":"                None if it is unknown."},{"line_number":133,"context_line":"            :persistent:"},{"line_number":134,"context_line":"                Boolean value or None, True if the boot device is persist,"},{"line_number":135,"context_line":"                False otherwise. None if it\u0027s unknown."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9ff52f3f_a9b12ae4","line":134,"updated":"2017-04-13 16:12:42.000000000","message":"nit s/is persist/persists/","commit_id":"ac9fa2d5cd33604f99f7410825695406571d2b18"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"81761f86ee9eea3ce0c8971568fd0569b014ea5d","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                the boot device, one of :mod:`ironic.common.boot_devices` or"},{"line_number":132,"context_line":"                None if it is unknown."},{"line_number":133,"context_line":"            :persistent:"},{"line_number":134,"context_line":"                Boolean value or None, True if the boot device is persist,"},{"line_number":135,"context_line":"                False otherwise. None if it\u0027s unknown."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7ffa3b31_6118f0d2","line":134,"in_reply_to":"9ff52f3f_a9b12ae4","updated":"2017-04-13 20:44:50.000000000","message":"Done","commit_id":"ac9fa2d5cd33604f99f7410825695406571d2b18"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a9cfed0be131386af33d7361ef6e7c58116d5b36","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        :raises: DriverLoadError if the driver can\u0027t be loaded due to"},{"line_number":55,"context_line":"            missing dependencies"},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":"        super(RedfishManagement, self).__init__()"},{"line_number":58,"context_line":"        if not sushy:"},{"line_number":59,"context_line":"            raise exception.DriverLoadError("},{"line_number":60,"context_line":"                driver\u003d\u0027redfish\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_dd3bb5e8","line":57,"updated":"2017-04-19 10:22:42.000000000","message":"Currently it\u0027s not needed.","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bc2f2b37bda68a93cc8cdb3d4ae22cceb3d17e70","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        :raises: DriverLoadError if the driver can\u0027t be loaded due to"},{"line_number":55,"context_line":"            missing dependencies"},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":"        super(RedfishManagement, self).__init__()"},{"line_number":58,"context_line":"        if not sushy:"},{"line_number":59,"context_line":"            raise exception.DriverLoadError("},{"line_number":60,"context_line":"                driver\u003d\u0027redfish\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_481c7e11","line":57,"in_reply_to":"7ffa3b31_dd3bb5e8","updated":"2017-04-19 11:52:02.000000000","message":"It\u0027s just common practice","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1f2dfe18c72b940cbd2c26d31144e6bd552581d4","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        :returns: A list with the supported boot devices defined"},{"line_number":84,"context_line":"                  in :mod:`ironic.common.boot_devices`."},{"line_number":85,"context_line":"        \"\"\""},{"line_number":86,"context_line":"        return list(BOOT_DEVICE_MAP_REV)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @task_manager.require_exclusive_lock"},{"line_number":89,"context_line":"    def set_boot_device(self, task, device, persistent\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":19,"id":"7ffa3b31_f762b4ad","line":86,"updated":"2017-04-21 18:21:39.000000000","message":"If I read the code correctly, during set_boot_device sushy calls get_allowed_system_boot_source_values and checks if a target is supported. It means that if a system does not support one of the states listed in BOOT_DEVICE_MAP_REV, it will fail?","commit_id":"c21149454a02514bd3889a793eadff712e4e6c33"}],"ironic/drivers/modules/redfish/power.py":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"99fb79c7cfc5384cb8124b9fa819ea6e2800c5aa","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":73,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":74,"context_line":"        :param timeout: timeout (in seconds) positive integer (\u003e 0) for any"},{"line_number":75,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":76,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":77,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_055f2573","line":74,"updated":"2017-02-28 16:45:21.000000000","message":"Not sure what you mean by \"for any power state\" here. Also, \"\u003e 0\" means the same as \"positive\", so I\u0027d cut one or the other.","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a6da8fbf8089489ea66fa2eca8353371abf195c0","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":73,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":74,"context_line":"        :param timeout: timeout (in seconds) positive integer (\u003e 0) for any"},{"line_number":75,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":76,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":77,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_f4c0f6e2","line":74,"in_reply_to":"ba2be162_055f2573","updated":"2017-02-28 22:14:27.000000000","message":"Yeah it was the copy\u0026paste problem again, I will update the docstrings on the next patch-set. Thanks for pointing it out.","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"dca94805fa416b6a32a5cfd64b7366e4ffc506c9","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":75,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":76,"context_line":"        :param timeout: timeout (in seconds) positive integer (\u003e 0) for any"},{"line_number":77,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":78,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":79,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":80,"context_line":"        :raises: RedfishError on an error from the Sushy library"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_5f8f3674","line":77,"range":{"start_line":77,"start_character":49,"end_line":77,"end_character":64},"updated":"2017-03-06 17:21:08.000000000","message":"Where is this default timeout set and used?  I don\u0027t see the timeout used anywhere in this method","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aca0c9176c624440e5c2f67b8ace010d245d1bd6","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":75,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":76,"context_line":"        :param timeout: timeout (in seconds) positive integer (\u003e 0) for any"},{"line_number":77,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":78,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":79,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":80,"context_line":"        :raises: RedfishError on an error from the Sushy library"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_1b521414","line":77,"range":{"start_line":77,"start_character":49,"end_line":77,"end_character":64},"in_reply_to":"ba2be162_5f8f3674","updated":"2017-03-07 12:07:24.000000000","message":"This was just a copy\u0026paste from the base driver docstrings. I will update it. Currently, this driver is not using the timeout parameter (should we?)","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"dca94805fa416b6a32a5cfd64b7366e4ffc506c9","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":83,"context_line":"        system.reset_system(SET_POWER_STATE_MAP.get(power_state))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def reboot(self, task, timeout\u003dNone):"},{"line_number":86,"context_line":"        \"\"\"Perform a hard reboot of the task\u0027s node."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_5fbd7600","line":85,"range":{"start_line":85,"start_character":27,"end_line":85,"end_character":34},"updated":"2017-03-06 17:21:08.000000000","message":"ditto. Not referenced anywhere in method.","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aca0c9176c624440e5c2f67b8ace010d245d1bd6","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":83,"context_line":"        system.reset_system(SET_POWER_STATE_MAP.get(power_state))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def reboot(self, task, timeout\u003dNone):"},{"line_number":86,"context_line":"        \"\"\"Perform a hard reboot of the task\u0027s node."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_7b415039","line":85,"range":{"start_line":85,"start_character":27,"end_line":85,"end_character":34},"in_reply_to":"ba2be162_5fbd7600","updated":"2017-03-07 12:07:24.000000000","message":"It\u0027s part of the base interface, so it\u0027s added here just so we can adhere to it.","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"093b57e53df821ab59f34aaa3422d2b2f5eb27c8","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from ironic.drivers import base"},{"line_number":20,"context_line":"from ironic.drivers.modules.redfish import utils as redfish_utils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"sushy \u003d importutils.try_import(\u0027sushy\u0027)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"if sushy:"},{"line_number":25,"context_line":"    GET_POWER_STATE_MAP \u003d {"},{"line_number":26,"context_line":"        sushy.SYSTEM_POWER_STATE_ON: states.POWER_ON,"},{"line_number":27,"context_line":"        sushy.SYSTEM_POWER_STATE_POWERING_ON: states.POWER_ON,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_0b6ac580","line":24,"range":{"start_line":22,"start_character":0,"end_line":24,"end_character":9},"updated":"2017-03-15 07:24:18.000000000","message":"this is iterated over multiple files. can it be in a single location/file like redfish/common or redfish/utils?","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from ironic.drivers import base"},{"line_number":20,"context_line":"from ironic.drivers.modules.redfish import utils as redfish_utils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"sushy \u003d importutils.try_import(\u0027sushy\u0027)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"if sushy:"},{"line_number":25,"context_line":"    GET_POWER_STATE_MAP \u003d {"},{"line_number":26,"context_line":"        sushy.SYSTEM_POWER_STATE_ON: states.POWER_ON,"},{"line_number":27,"context_line":"        sushy.SYSTEM_POWER_STATE_POWERING_ON: states.POWER_ON,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_7dca17a3","line":24,"range":{"start_line":22,"start_character":0,"end_line":24,"end_character":9},"in_reply_to":"3a1ff146_0b6ac580","updated":"2017-03-15 09:39:05.000000000","message":"This is an import, we should import the libraries required in the module they are required not in a single file (which can be done but it\u0027s bad form)","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"093b57e53df821ab59f34aaa3422d2b2f5eb27c8","unresolved":false,"context_lines":[{"line_number":22,"context_line":"sushy \u003d importutils.try_import(\u0027sushy\u0027)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"if sushy:"},{"line_number":25,"context_line":"    GET_POWER_STATE_MAP \u003d {"},{"line_number":26,"context_line":"        sushy.SYSTEM_POWER_STATE_ON: states.POWER_ON,"},{"line_number":27,"context_line":"        sushy.SYSTEM_POWER_STATE_POWERING_ON: states.POWER_ON,"},{"line_number":28,"context_line":"        sushy.SYSTEM_POWER_STATE_OFF: states.POWER_OFF,"},{"line_number":29,"context_line":"        sushy.SYSTEM_POWER_STATE_POWERING_OFF: states.POWER_OFF"},{"line_number":30,"context_line":"    }"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    SET_POWER_STATE_MAP \u003d {"},{"line_number":33,"context_line":"        states.POWER_ON: sushy.RESET_ON,"},{"line_number":34,"context_line":"        states.POWER_OFF: sushy.RESET_FORCE_OFF,"},{"line_number":35,"context_line":"        states.REBOOT: sushy.RESET_FORCE_RESTART,"},{"line_number":36,"context_line":"        states.SOFT_REBOOT: sushy.RESET_GRACEFUL_RESTART,"},{"line_number":37,"context_line":"        states.SOFT_POWER_OFF: sushy.RESET_GRACEFUL_SHUTDOWN"},{"line_number":38,"context_line":"    }"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class RedfishPower(base.PowerInterface):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_cb1d0d11","line":38,"range":{"start_line":25,"start_character":0,"end_line":38,"end_character":5},"updated":"2017-03-15 07:24:18.000000000","message":"the globals can also be part of a common file and can be used by all other modules in redfish. They could be required by other operations as well later.","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":22,"context_line":"sushy \u003d importutils.try_import(\u0027sushy\u0027)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"if sushy:"},{"line_number":25,"context_line":"    GET_POWER_STATE_MAP \u003d {"},{"line_number":26,"context_line":"        sushy.SYSTEM_POWER_STATE_ON: states.POWER_ON,"},{"line_number":27,"context_line":"        sushy.SYSTEM_POWER_STATE_POWERING_ON: states.POWER_ON,"},{"line_number":28,"context_line":"        sushy.SYSTEM_POWER_STATE_OFF: states.POWER_OFF,"},{"line_number":29,"context_line":"        sushy.SYSTEM_POWER_STATE_POWERING_OFF: states.POWER_OFF"},{"line_number":30,"context_line":"    }"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    SET_POWER_STATE_MAP \u003d {"},{"line_number":33,"context_line":"        states.POWER_ON: sushy.RESET_ON,"},{"line_number":34,"context_line":"        states.POWER_OFF: sushy.RESET_FORCE_OFF,"},{"line_number":35,"context_line":"        states.REBOOT: sushy.RESET_FORCE_RESTART,"},{"line_number":36,"context_line":"        states.SOFT_REBOOT: sushy.RESET_GRACEFUL_RESTART,"},{"line_number":37,"context_line":"        states.SOFT_POWER_OFF: sushy.RESET_GRACEFUL_SHUTDOWN"},{"line_number":38,"context_line":"    }"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class RedfishPower(base.PowerInterface):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_9d1433f6","line":38,"range":{"start_line":25,"start_character":0,"end_line":38,"end_character":5},"in_reply_to":"3a1ff146_cb1d0d11","updated":"2017-03-15 09:39:05.000000000","message":"They are not used in any other file, these mappings are related to the power module and should live here. If/when other modules start using it then yes, we should move it.","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d8439087e866fee4cd61517e4b3ee660d74e5a08","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        :returns: dictionary of \u003cproperty name\u003e:\u003cproperty description\u003e entries."},{"line_number":47,"context_line":"        \"\"\""},{"line_number":48,"context_line":"        return redfish_utils.COMMON_PROPERTIES"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def validate(self, task):"},{"line_number":51,"context_line":"        \"\"\"Validates the driver_information passed to the redfish driver."}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_9caa8b18","line":48,"updated":"2017-03-14 21:36:48.000000000","message":"Should return a copy() ? Just to be safer, in case caller modified the dict. Or is it desired that they can?","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        :returns: dictionary of \u003cproperty name\u003e:\u003cproperty description\u003e entries."},{"line_number":47,"context_line":"        \"\"\""},{"line_number":48,"context_line":"        return redfish_utils.COMMON_PROPERTIES"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def validate(self, task):"},{"line_number":51,"context_line":"        \"\"\"Validates the driver_information passed to the redfish driver."}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_1d18431d","line":48,"in_reply_to":"3a1ff146_9caa8b18","updated":"2017-03-15 09:39:05.000000000","message":"ditto","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d8439087e866fee4cd61517e4b3ee660d74e5a08","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        :param timeout: Not used by this driver at the moment."},{"line_number":78,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":79,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":80,"context_line":"        :raises: RedfishError on an error from the Sushy library"},{"line_number":81,"context_line":"        \"\"\""},{"line_number":82,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":83,"context_line":"        system.reset_system(SET_POWER_STATE_MAP.get(power_state))"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_3f7349b3","line":80,"updated":"2017-03-14 21:36:48.000000000","message":"Is this true? How does the call to system.reset_system() catch an error from Sushy?","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        :param timeout: Not used by this driver at the moment."},{"line_number":78,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":79,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":80,"context_line":"        :raises: RedfishError on an error from the Sushy library"},{"line_number":81,"context_line":"        \"\"\""},{"line_number":82,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":83,"context_line":"        system.reset_system(SET_POWER_STATE_MAP.get(power_state))"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_dde4eb0e","line":80,"in_reply_to":"3a1ff146_3f7349b3","updated":"2017-03-15 09:39:05.000000000","message":"ditto","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d8439087e866fee4cd61517e4b3ee660d74e5a08","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        :raises: RedfishError on an error from the Sushy library"},{"line_number":81,"context_line":"        \"\"\""},{"line_number":82,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":83,"context_line":"        system.reset_system(SET_POWER_STATE_MAP.get(power_state))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def reboot(self, task, timeout\u003dNone):"},{"line_number":86,"context_line":"        \"\"\"Perform a hard reboot of the task\u0027s node."}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_bf31f9ee","line":83,"updated":"2017-03-14 21:36:48.000000000","message":"Should it be validating that the requested power_state is valid? What happens if None is passed to reset_system() ?","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        :raises: RedfishError on an error from the Sushy library"},{"line_number":81,"context_line":"        \"\"\""},{"line_number":82,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":83,"context_line":"        system.reset_system(SET_POWER_STATE_MAP.get(power_state))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def reboot(self, task, timeout\u003dNone):"},{"line_number":86,"context_line":"        \"\"\"Perform a hard reboot of the task\u0027s node."}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_dda06b93","line":83,"in_reply_to":"3a1ff146_2bba21e2","updated":"2017-03-15 09:39:05.000000000","message":"These are already validated at the API and conductor level [0], we don\u0027t need to duplicate it here.\n\nIf None ever gets here then it means we have a bug somewhere else in Ironic.\n\n[0] https://github.com/openstack/ironic/blob/5071b99835143ebcae876432e2982fd27faece10/ironic/api/controllers/v1/node.py#L105","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"093b57e53df821ab59f34aaa3422d2b2f5eb27c8","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        :raises: RedfishError on an error from the Sushy library"},{"line_number":81,"context_line":"        \"\"\""},{"line_number":82,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":83,"context_line":"        system.reset_system(SET_POWER_STATE_MAP.get(power_state))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def reboot(self, task, timeout\u003dNone):"},{"line_number":86,"context_line":"        \"\"\"Perform a hard reboot of the task\u0027s node."}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_2bba21e2","line":83,"in_reply_to":"3a1ff146_bf31f9ee","updated":"2017-03-15 07:24:18.000000000","message":"+1","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d8439087e866fee4cd61517e4b3ee660d74e5a08","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        :param timeout: Not used by this driver at the moment."},{"line_number":90,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":91,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":92,"context_line":"        :raises: RedfishError on an error from the Sushy library"},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":95,"context_line":"        current_power_state \u003d GET_POWER_STATE_MAP.get(system.power_state)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_5f6805bb","line":92,"updated":"2017-03-14 21:36:48.000000000","message":"Is this true? How does the call to system.reset_system() catch an error from Sushy?","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        :param timeout: Not used by this driver at the moment."},{"line_number":90,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":91,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":92,"context_line":"        :raises: RedfishError on an error from the Sushy library"},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":95,"context_line":"        current_power_state \u003d GET_POWER_STATE_MAP.get(system.power_state)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_9db513cf","line":92,"in_reply_to":"3a1ff146_5f6805bb","updated":"2017-03-15 09:39:05.000000000","message":"ditto","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d8439087e866fee4cd61517e4b3ee660d74e5a08","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def get_supported_power_states(self, task):"},{"line_number":103,"context_line":"        \"\"\"Get a list of the supported power states."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        :param task: A TaskManager instance containing the node to act on."},{"line_number":106,"context_line":"        :returns: A list with the supported power states defined"},{"line_number":107,"context_line":"                  in :mod:`ironic.common.states`."},{"line_number":108,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_ff9ff1b1","line":105,"updated":"2017-03-14 21:36:48.000000000","message":"Maybe add:\n\n Not used.","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def get_supported_power_states(self, task):"},{"line_number":103,"context_line":"        \"\"\"Get a list of the supported power states."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        :param task: A TaskManager instance containing the node to act on."},{"line_number":106,"context_line":"        :returns: A list with the supported power states defined"},{"line_number":107,"context_line":"                  in :mod:`ironic.common.states`."},{"line_number":108,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_ddc78b43","line":105,"in_reply_to":"3a1ff146_ff9ff1b1","updated":"2017-03-15 09:39:05.000000000","message":"Done","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"9cfe08d6dc95c8fb0e2cab6a197d808423be753c","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":88,"context_line":"        try:"},{"line_number":89,"context_line":"            system.reset_system(SET_POWER_STATE_MAP.get(power_state))"},{"line_number":90,"context_line":"        except sushy.exceptions.SushyError as e:"},{"line_number":91,"context_line":"            error_msg \u003d (_(\u0027Redfish set power state failed for node \u0027"},{"line_number":92,"context_line":"                           \u0027%(node)s. Error: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a1ced50_de8745d5","line":89,"range":{"start_line":89,"start_character":32,"end_line":89,"end_character":51},"updated":"2017-03-20 16:16:27.000000000","message":"The patch will fail with NameError here as this variable is not global.\nI have tested the patch and it fails with error http://paste.openstack.org/show/603461/","commit_id":"fbc3cdbc5415bf8c482c4852302a6cebfff227d4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"385b7226a0ea42c11c3c115390ec557b9d7daa06","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":88,"context_line":"        try:"},{"line_number":89,"context_line":"            system.reset_system(SET_POWER_STATE_MAP.get(power_state))"},{"line_number":90,"context_line":"        except sushy.exceptions.SushyError as e:"},{"line_number":91,"context_line":"            error_msg \u003d (_(\u0027Redfish set power state failed for node \u0027"},{"line_number":92,"context_line":"                           \u0027%(node)s. Error: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a1ced50_5a288f86","line":89,"range":{"start_line":89,"start_character":32,"end_line":89,"end_character":51},"in_reply_to":"1a1ced50_293e65b8","updated":"2017-03-21 15:00:48.000000000","message":"Hi Madhuri,\n\nAn update on this, talking on IRC with other developer we decided that we should have some checks on the constructor of the interfaces verifying if we do have the required libraries installed or raising an exception otherwise.\n\nI will make the necessary changes in the code. Thanks for this comment btw.","commit_id":"fbc3cdbc5415bf8c482c4852302a6cebfff227d4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"cef653588a9c45fea6a31bd83b04c5dbb7562e5f","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":88,"context_line":"        try:"},{"line_number":89,"context_line":"            system.reset_system(SET_POWER_STATE_MAP.get(power_state))"},{"line_number":90,"context_line":"        except sushy.exceptions.SushyError as e:"},{"line_number":91,"context_line":"            error_msg \u003d (_(\u0027Redfish set power state failed for node \u0027"},{"line_number":92,"context_line":"                           \u0027%(node)s. Error: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a1ced50_293e65b8","line":89,"range":{"start_line":89,"start_character":32,"end_line":89,"end_character":51},"in_reply_to":"1a1ced50_de8745d5","updated":"2017-03-20 16:24:24.000000000","message":"I think it\u0027s because sushy is not installed, this variable is \ncreated at L37. Can you try again but this time installing sushy ?\n\nI think the problem here is that, when we had the old-style drivers we checked the dependend library for that driver at load time, for example: https://github.com/openstack/ironic/blob/master/ironic/drivers/irmc.py#L47-L50\n\nNow, redfish is just a hardware type and I don\u0027t think we are checking for that at all (we probably need to address it somehow as part of the driver composition work).","commit_id":"fbc3cdbc5415bf8c482c4852302a6cebfff227d4"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def __init__(self):"},{"line_number":49,"context_line":"        \"\"\"Initialize the Redfish power interface."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        :raises: DriverLoadError if the driver can\u0027t be loaded due"},{"line_number":52,"context_line":"            missing dependencies"},{"line_number":53,"context_line":"        \"\"\""},{"line_number":54,"context_line":"        super(RedfishPower, self).__init__()"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_4ba3db00","line":51,"updated":"2017-04-12 17:52:16.000000000","message":"nit s/due/due to/","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def __init__(self):"},{"line_number":49,"context_line":"        \"\"\"Initialize the Redfish power interface."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        :raises: DriverLoadError if the driver can\u0027t be loaded due"},{"line_number":52,"context_line":"            missing dependencies"},{"line_number":53,"context_line":"        \"\"\""},{"line_number":54,"context_line":"        super(RedfishPower, self).__init__()"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_12472d20","line":51,"in_reply_to":"bff0334d_4ba3db00","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        return redfish_utils.COMMON_PROPERTIES.copy()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def validate(self, task):"},{"line_number":68,"context_line":"        \"\"\"Validates the driver_information passed to the redfish driver."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":71,"context_line":"        :raises: InvalidParameterValue on malformed parameter(s)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_6bee9f22","line":68,"updated":"2017-04-12 17:52:16.000000000","message":"same comments as in management.py","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        return redfish_utils.COMMON_PROPERTIES.copy()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def validate(self, task):"},{"line_number":68,"context_line":"        \"\"\"Validates the driver_information passed to the redfish driver."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":71,"context_line":"        :raises: InvalidParameterValue on malformed parameter(s)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_d250a5d7","line":68,"in_reply_to":"bff0334d_6bee9f22","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":93,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":94,"context_line":"        :param timeout: Not used by this driver at the moment."},{"line_number":95,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":96,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":97,"context_line":"        :raises: RedfishError on an error from the Sushy library"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_8b07a3ca","line":94,"updated":"2017-04-12 17:52:16.000000000","message":"no need for s/at the moment//","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":93,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":94,"context_line":"        :param timeout: Not used by this driver at the moment."},{"line_number":95,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":96,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":97,"context_line":"        :raises: RedfishError on an error from the Sushy library"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_b25f61e4","line":94,"in_reply_to":"bff0334d_8b07a3ca","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        \"\"\"Perform a hard reboot of the task\u0027s node."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":113,"context_line":"        :param timeout: Not used by this driver at the moment."},{"line_number":114,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":115,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":116,"context_line":"        :raises: RedfishError on an error from the Sushy library"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_abfb87bb","line":113,"updated":"2017-04-12 17:52:16.000000000","message":"ditto","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        \"\"\"Perform a hard reboot of the task\u0027s node."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":113,"context_line":"        :param timeout: Not used by this driver at the moment."},{"line_number":114,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":115,"context_line":"        :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":116,"context_line":"        :raises: RedfishError on an error from the Sushy library"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_92645dbb","line":113,"in_reply_to":"bff0334d_abfb87bb","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"60837f6ff1dc538b5c9020bba6526b9a6168ddc5","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":87,"context_line":"        return GET_POWER_STATE_MAP.get(system.power_state)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def set_power_state(self, task, power_state, timeout\u003dNone):"},{"line_number":90,"context_line":"        \"\"\"Set the power state of the task\u0027s node."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":16,"id":"9ff52f3f_c918eed4","line":89,"updated":"2017-04-13 16:12:42.000000000","message":"needs @task_manager.require_exclusive_lock","commit_id":"ac9fa2d5cd33604f99f7410825695406571d2b18"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"81761f86ee9eea3ce0c8971568fd0569b014ea5d","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        system \u003d redfish_utils.get_system(task.node)"},{"line_number":87,"context_line":"        return GET_POWER_STATE_MAP.get(system.power_state)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def set_power_state(self, task, power_state, timeout\u003dNone):"},{"line_number":90,"context_line":"        \"\"\"Set the power state of the task\u0027s node."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":16,"id":"7ffa3b31_81789cf8","line":89,"in_reply_to":"9ff52f3f_c918eed4","updated":"2017-04-13 20:44:50.000000000","message":"Done","commit_id":"ac9fa2d5cd33604f99f7410825695406571d2b18"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"60837f6ff1dc538b5c9020bba6526b9a6168ddc5","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            LOG.error(error_msg)"},{"line_number":107,"context_line":"            raise exception.RedfishError(error\u003derror_msg)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def reboot(self, task, timeout\u003dNone):"},{"line_number":110,"context_line":"        \"\"\"Perform a hard reboot of the task\u0027s node."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":16,"id":"9ff52f3f_a90daa91","line":109,"updated":"2017-04-13 16:12:42.000000000","message":"needs @task_manager.require_exclusive_lock","commit_id":"ac9fa2d5cd33604f99f7410825695406571d2b18"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"81761f86ee9eea3ce0c8971568fd0569b014ea5d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            LOG.error(error_msg)"},{"line_number":107,"context_line":"            raise exception.RedfishError(error\u003derror_msg)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def reboot(self, task, timeout\u003dNone):"},{"line_number":110,"context_line":"        \"\"\"Perform a hard reboot of the task\u0027s node."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":16,"id":"7ffa3b31_617d90e6","line":109,"in_reply_to":"9ff52f3f_a90daa91","updated":"2017-04-13 20:44:50.000000000","message":"Done","commit_id":"ac9fa2d5cd33604f99f7410825695406571d2b18"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a9cfed0be131386af33d7361ef6e7c58116d5b36","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        :raises: DriverLoadError if the driver can\u0027t be loaded due to"},{"line_number":53,"context_line":"            missing dependencies"},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        super(RedfishPower, self).__init__()"},{"line_number":56,"context_line":"        if not sushy:"},{"line_number":57,"context_line":"            raise exception.DriverLoadError("},{"line_number":58,"context_line":"                driver\u003d\u0027redfish\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_4f36c8e8","line":55,"updated":"2017-04-19 10:22:42.000000000","message":"Currently it\u0027s not needed.","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bc2f2b37bda68a93cc8cdb3d4ae22cceb3d17e70","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        :raises: DriverLoadError if the driver can\u0027t be loaded due to"},{"line_number":53,"context_line":"            missing dependencies"},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        super(RedfishPower, self).__init__()"},{"line_number":56,"context_line":"        if not sushy:"},{"line_number":57,"context_line":"            raise exception.DriverLoadError("},{"line_number":58,"context_line":"                driver\u003d\u0027redfish\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_2817f2ef","line":55,"in_reply_to":"7ffa3b31_4f36c8e8","updated":"2017-04-19 11:52:02.000000000","message":"ditto, it\u0027s common practice","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a9cfed0be131386af33d7361ef6e7c58116d5b36","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            if current_power_state \u003d\u003d states.POWER_ON:"},{"line_number":126,"context_line":"                system.reset_system(SET_POWER_STATE_MAP.get(states.REBOOT))"},{"line_number":127,"context_line":"            elif current_power_state \u003d\u003d states.POWER_OFF:"},{"line_number":128,"context_line":"                system.reset_system(SET_POWER_STATE_MAP.get(states.POWER_ON))"},{"line_number":129,"context_line":"        except sushy.exceptions.SushyError as e:"},{"line_number":130,"context_line":"            error_msg \u003d (_(\u0027Redfish reboot failed for node %(node)s. \u0027"},{"line_number":131,"context_line":"                           \u0027Error: %(error)s\u0027) % {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_6f462424","line":128,"updated":"2017-04-19 10:22:42.000000000","message":"Maybe \"else\" case also need here.","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f2bfa21eecc99e99bb2a7e07c480d436d53a34e3","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            if current_power_state \u003d\u003d states.POWER_ON:"},{"line_number":126,"context_line":"                system.reset_system(SET_POWER_STATE_MAP.get(states.REBOOT))"},{"line_number":127,"context_line":"            elif current_power_state \u003d\u003d states.POWER_OFF:"},{"line_number":128,"context_line":"                system.reset_system(SET_POWER_STATE_MAP.get(states.POWER_ON))"},{"line_number":129,"context_line":"        except sushy.exceptions.SushyError as e:"},{"line_number":130,"context_line":"            error_msg \u003d (_(\u0027Redfish reboot failed for node %(node)s. \u0027"},{"line_number":131,"context_line":"                           \u0027Error: %(error)s\u0027) % {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ffa3b31_6d05da10","line":128,"updated":"2017-04-20 16:25:57.000000000","message":"just a nit. i was looking at Yuriy\u0027s comment in previous patch set. I guess  L127 could just be \u0027else\u0027 because there are only two possible values for current_power_state, right?","commit_id":"298e0578313db1adef47dc8c38053dc88659c582"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"22bdb60f060a3d813a65297714e5fb307a300f48","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            if current_power_state \u003d\u003d states.POWER_ON:"},{"line_number":126,"context_line":"                system.reset_system(SET_POWER_STATE_MAP.get(states.REBOOT))"},{"line_number":127,"context_line":"            elif current_power_state \u003d\u003d states.POWER_OFF:"},{"line_number":128,"context_line":"                system.reset_system(SET_POWER_STATE_MAP.get(states.POWER_ON))"},{"line_number":129,"context_line":"        except sushy.exceptions.SushyError as e:"},{"line_number":130,"context_line":"            error_msg \u003d (_(\u0027Redfish reboot failed for node %(node)s. \u0027"},{"line_number":131,"context_line":"                           \u0027Error: %(error)s\u0027) % {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ffa3b31_ef9d490a","line":128,"in_reply_to":"7ffa3b31_6d05da10","updated":"2017-04-21 10:01:16.000000000","message":"Oh I missed it. Yes, we can change it to an else.","commit_id":"298e0578313db1adef47dc8c38053dc88659c582"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1f2dfe18c72b940cbd2c26d31144e6bd552581d4","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        :returns: A list with the supported power states defined"},{"line_number":142,"context_line":"                  in :mod:`ironic.common.states`."},{"line_number":143,"context_line":"        \"\"\""},{"line_number":144,"context_line":"        return list(SET_POWER_STATE_MAP)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7ffa3b31_97101002","line":144,"updated":"2017-04-21 18:21:39.000000000","message":"same comment here.","commit_id":"c21149454a02514bd3889a793eadff712e4e6c33"}],"ironic/drivers/modules/redfish/utils.py":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"99fb79c7cfc5384cb8124b9fa819ea6e2800c5aa","unresolved":false,"context_lines":[{"line_number":24,"context_line":"import rfc3986"},{"line_number":25,"context_line":"from six.moves.urllib import parse as urlparse"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"sushy \u003d importutils.try_import(\u0027sushy\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_a5ed7990","line":27,"updated":"2017-02-28 16:45:21.000000000","message":"Is it too late to change the name to \"sashimi\"? :-)","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a6da8fbf8089489ea66fa2eca8353371abf195c0","unresolved":false,"context_lines":[{"line_number":24,"context_line":"import rfc3986"},{"line_number":25,"context_line":"from six.moves.urllib import parse as urlparse"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"sushy \u003d importutils.try_import(\u0027sushy\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_f4671623","line":27,"in_reply_to":"ba2be162_a5ed7990","updated":"2017-02-28 22:14:27.000000000","message":"lol that would be another good name, but yeah, kinda late now :D","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"99fb79c7cfc5384cb8124b9fa819ea6e2800c5aa","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"REQUIRED_PROPERTIES \u003d {"},{"line_number":32,"context_line":"    \u0027redfish_uri\u0027: _(\u0027The URI of the System to interact with (e.g.: \u0027"},{"line_number":33,"context_line":"                     \u0027http(s)://\u003cIP\u003e:\u003cPORT\u003e/redfish/v1/Systems/CX34R87)\u0027),"},{"line_number":34,"context_line":"}"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_2502693f","line":32,"updated":"2017-02-28 16:45:21.000000000","message":"s/System/system, unless \"System\" is a technical term here.","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a6da8fbf8089489ea66fa2eca8353371abf195c0","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"REQUIRED_PROPERTIES \u003d {"},{"line_number":32,"context_line":"    \u0027redfish_uri\u0027: _(\u0027The URI of the System to interact with (e.g.: \u0027"},{"line_number":33,"context_line":"                     \u0027http(s)://\u003cIP\u003e:\u003cPORT\u003e/redfish/v1/Systems/CX34R87)\u0027),"},{"line_number":34,"context_line":"}"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_34728ee6","line":32,"in_reply_to":"ba2be162_2502693f","updated":"2017-02-28 22:14:27.000000000","message":"so yeah, System is the name of the resource in Redfish that\u0027s why I kept it capitalized.","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"f449fae39e4cc2cd34acda5df68dee99f4b9ce87","unresolved":false,"context_lines":[{"line_number":36,"context_line":"OPTIONAL_PROPERTIES \u003d {"},{"line_number":37,"context_line":"    \u0027redfish_username\u0027: _(\u0027The Redfish Manager username. Optional.\u0027),"},{"line_number":38,"context_line":"    \u0027redfish_password\u0027: _(\u0027The Redfish Manager password. Optional.\u0027),"},{"line_number":39,"context_line":"    \u0027redfish_ssl_certificate\u0027: _(\u0027The Redfish Manager username. Optional.\u0027),"},{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"COMMON_PROPERTIES \u003d REQUIRED_PROPERTIES.copy()"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_bc2f59f5","line":39,"range":{"start_line":39,"start_character":53,"end_line":39,"end_character":62},"updated":"2017-02-28 14:53:23.000000000","message":"copy-paste? :)","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"25b85eff56ee92ed7dc956e082610232951a1bb4","unresolved":false,"context_lines":[{"line_number":36,"context_line":"OPTIONAL_PROPERTIES \u003d {"},{"line_number":37,"context_line":"    \u0027redfish_username\u0027: _(\u0027The Redfish Manager username. Optional.\u0027),"},{"line_number":38,"context_line":"    \u0027redfish_password\u0027: _(\u0027The Redfish Manager password. Optional.\u0027),"},{"line_number":39,"context_line":"    \u0027redfish_ssl_certificate\u0027: _(\u0027The Redfish Manager username. Optional.\u0027),"},{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"COMMON_PROPERTIES \u003d REQUIRED_PROPERTIES.copy()"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_7ce241a1","line":39,"range":{"start_line":39,"start_character":53,"end_line":39,"end_character":62},"in_reply_to":"ba2be162_bc2f59f5","updated":"2017-02-28 14:54:10.000000000","message":"lol yes!","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"99fb79c7cfc5384cb8124b9fa819ea6e2800c5aa","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                    if not driver_info.get(key)]"},{"line_number":53,"context_line":"    if missing_info:"},{"line_number":54,"context_line":"        raise exception.MissingParameterValue(_("},{"line_number":55,"context_line":"            \"Missing the following Redfish properties in node\u0027s\""},{"line_number":56,"context_line":"            \" driver_info: %s.\") % missing_info)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    # Validate the redfish_uri parameter"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_05a48555","line":55,"updated":"2017-02-28 16:45:21.000000000","message":"Please log which node is missing the info.","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a6da8fbf8089489ea66fa2eca8353371abf195c0","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                    if not driver_info.get(key)]"},{"line_number":53,"context_line":"    if missing_info:"},{"line_number":54,"context_line":"        raise exception.MissingParameterValue(_("},{"line_number":55,"context_line":"            \"Missing the following Redfish properties in node\u0027s\""},{"line_number":56,"context_line":"            \" driver_info: %s.\") % missing_info)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    # Validate the redfish_uri parameter"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_1444aa72","line":55,"in_reply_to":"ba2be162_05a48555","updated":"2017-02-28 22:14:27.000000000","message":"Ops, will do","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"99fb79c7cfc5384cb8124b9fa819ea6e2800c5aa","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    username \u003d driver_info.get(\u0027redfish_username\u0027)"},{"line_number":74,"context_line":"    password \u003d driver_info.get(\u0027redfish_password\u0027)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # Log some warnings if the username and password is not specified"},{"line_number":77,"context_line":"    if not username:"},{"line_number":78,"context_line":"        LOG.warning(_LW(\u0027redfish_username is not defined or empty \u0027"},{"line_number":79,"context_line":"                        \u0027for node %s\u0027), node.uuid)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_e5b5b17e","line":76,"updated":"2017-02-28 16:45:21.000000000","message":"s/is/are","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a6da8fbf8089489ea66fa2eca8353371abf195c0","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    username \u003d driver_info.get(\u0027redfish_username\u0027)"},{"line_number":74,"context_line":"    password \u003d driver_info.get(\u0027redfish_password\u0027)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # Log some warnings if the username and password is not specified"},{"line_number":77,"context_line":"    if not username:"},{"line_number":78,"context_line":"        LOG.warning(_LW(\u0027redfish_username is not defined or empty \u0027"},{"line_number":79,"context_line":"                        \u0027for node %s\u0027), node.uuid)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_94589a58","line":76,"in_reply_to":"ba2be162_e5b5b17e","updated":"2017-02-28 22:14:27.000000000","message":"Done","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"d38d61f7f4d1d53c5a303f6c85fde152bf812240","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        LOG.warning(_LW(\u0027redfish_password is not defined or empty \u0027"},{"line_number":82,"context_line":"                        \u0027for node %s\u0027), node.uuid)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    return {\u0027uri\u0027: uri,"},{"line_number":85,"context_line":"            \u0027system_id\u0027: system_id,"},{"line_number":86,"context_line":"            \u0027username\u0027: username,"},{"line_number":87,"context_line":"            \u0027password\u0027: password,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_910c0596","line":84,"range":{"start_line":84,"start_character":13,"end_line":84,"end_character":16},"updated":"2017-03-01 21:23:29.000000000","message":"isn\u0027t ``base_uri``/``root_uri`` a better attribute name to it?","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"99fb79c7cfc5384cb8124b9fa819ea6e2800c5aa","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    :param driver_info: driver info with the redfish parameters"},{"line_number":96,"context_line":"    :raises: RedfishConnectionError"},{"line_number":97,"context_line":"    \"\"\""},{"line_number":98,"context_line":"    global REDFISH_CONNECTION"},{"line_number":99,"context_line":"    if REDFISH_CONNECTION is None or reconnect:"},{"line_number":100,"context_line":"        # Clean the connection in case of a reconnect"},{"line_number":101,"context_line":"        REDFISH_CONNECTION \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_c51c2d7a","line":98,"updated":"2017-02-28 16:45:21.000000000","message":"So we can only connect to one Redfish manager at a time? Is that going to change as the patch matures?","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a6da8fbf8089489ea66fa2eca8353371abf195c0","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    :param driver_info: driver info with the redfish parameters"},{"line_number":96,"context_line":"    :raises: RedfishConnectionError"},{"line_number":97,"context_line":"    \"\"\""},{"line_number":98,"context_line":"    global REDFISH_CONNECTION"},{"line_number":99,"context_line":"    if REDFISH_CONNECTION is None or reconnect:"},{"line_number":100,"context_line":"        # Clean the connection in case of a reconnect"},{"line_number":101,"context_line":"        REDFISH_CONNECTION \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_542542c0","line":98,"in_reply_to":"ba2be162_c51c2d7a","updated":"2017-02-28 22:14:27.000000000","message":"Good catch!\n\nNo this is my bad the driver should handle multiple connections, I will add it in the next patch set.","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"d38d61f7f4d1d53c5a303f6c85fde152bf812240","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        REDFISH_CONNECTION \u003d None"},{"line_number":102,"context_line":"        params \u003d {\u0027username\u0027: driver_info[\u0027username\u0027],"},{"line_number":103,"context_line":"                  \u0027password\u0027: driver_info[\u0027password\u0027],"},{"line_number":104,"context_line":"                  \u0027verify\u0027: driver_info[\u0027ssl_certificate\u0027]}"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            REDFISH_CONNECTION \u003d sushy.Sushy(driver_info[\u0027uri\u0027], **params)"},{"line_number":107,"context_line":"        except sushy.exceptions.ConnectionError as e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_3a8406d3","line":104,"range":{"start_line":104,"start_character":28,"end_line":104,"end_character":58},"updated":"2017-03-01 21:23:29.000000000","message":"will it return a boolean value? I guess the library expects it to be that one (True/False for verify).\nhttps://github.com/openstack/sushy/blob/master/sushy/main.py#L35","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"2a28a8300b17c9d8232186a6c525b10faa684dc5","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        REDFISH_CONNECTION \u003d None"},{"line_number":102,"context_line":"        params \u003d {\u0027username\u0027: driver_info[\u0027username\u0027],"},{"line_number":103,"context_line":"                  \u0027password\u0027: driver_info[\u0027password\u0027],"},{"line_number":104,"context_line":"                  \u0027verify\u0027: driver_info[\u0027ssl_certificate\u0027]}"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            REDFISH_CONNECTION \u003d sushy.Sushy(driver_info[\u0027uri\u0027], **params)"},{"line_number":107,"context_line":"        except sushy.exceptions.ConnectionError as e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_15229ab9","line":104,"range":{"start_line":104,"start_character":28,"end_line":104,"end_character":58},"in_reply_to":"ba2be162_3a8406d3","updated":"2017-03-02 09:37:48.000000000","message":"Yeah, the verify also accepts a path to a certificate. This is the same verify as in the requests library: http://docs.python-requests.org/en/master/user/advanced/#ssl-cert-verification","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":17114,"name":"Hans Feldt","email":"hans.feldt@ericsson.com","username":"hafe"},"change_message_id":"767ef98bf8c69b5d44c45b06c93b1dab7baa88ad","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    parsed_url \u003d urlparse.urlparse(uri)"},{"line_number":85,"context_line":"    if not URI_PATH_PATTERN.match(parsed_url.path):"},{"line_number":86,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":87,"context_line":"            _(\u0027Invalid Redfish URI path %(path)s given to driver_info/\u0027"},{"line_number":88,"context_line":"              \u0027redfish_uri on node %(node)s\u0027) % {\u0027path\u0027: parsed_url.path,"},{"line_number":89,"context_line":"                                                 \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba2be162_2556455c","line":86,"range":{"start_line":86,"start_character":24,"end_line":86,"end_character":45},"updated":"2017-03-03 13:42:09.000000000","message":"I think this is a bit hard and I propose you remove the pattern check completely. It will not work on some systems otherwise. The Redfish standard 1.1.0a states \"The root URI for this version of the Redfish protocol shall be \"/redfish/v1/\".\" But it does not say MUST","commit_id":"01758fd79ff9165eb0d1dc9b07785c77dca95081"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9a6d19c1871a5a8c1d09b7c189238bff223ef676","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    parsed_url \u003d urlparse.urlparse(uri)"},{"line_number":85,"context_line":"    if not URI_PATH_PATTERN.match(parsed_url.path):"},{"line_number":86,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":87,"context_line":"            _(\u0027Invalid Redfish URI path %(path)s given to driver_info/\u0027"},{"line_number":88,"context_line":"              \u0027redfish_uri on node %(node)s\u0027) % {\u0027path\u0027: parsed_url.path,"},{"line_number":89,"context_line":"                                                 \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba2be162_26bd6cb7","line":86,"range":{"start_line":86,"start_character":24,"end_line":86,"end_character":45},"in_reply_to":"ba2be162_2556455c","updated":"2017-03-03 14:17:35.000000000","message":"Agreed, good catch! I thought it was required\n\nReference is here: http://redfish.dmtf.org/schemas/DSP0266_1.1.html (see the 6.2. Protocol version section)","commit_id":"01758fd79ff9165eb0d1dc9b07785c77dca95081"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"1e451cc228c329511f07bb58beb91d8be912ad30","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    parsed_url \u003d urlparse.urlparse(uri)"},{"line_number":85,"context_line":"    if not URI_PATH_PATTERN.match(parsed_url.path):"},{"line_number":86,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":87,"context_line":"            _(\u0027Invalid Redfish URI path %(path)s given to driver_info/\u0027"},{"line_number":88,"context_line":"              \u0027redfish_uri on node %(node)s\u0027) % {\u0027path\u0027: parsed_url.path,"},{"line_number":89,"context_line":"                                                 \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba2be162_4610a059","line":86,"range":{"start_line":86,"start_character":24,"end_line":86,"end_character":45},"in_reply_to":"ba2be162_26bd6cb7","updated":"2017-03-03 14:27:31.000000000","message":"directly link: http://redfish.dmtf.org/schemas/DSP0266_1.1.html#protocol-details","commit_id":"01758fd79ff9165eb0d1dc9b07785c77dca95081"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d1d47cb9550af804443e784c7299361e7708743a","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    parsed_url \u003d urlparse.urlparse(uri)"},{"line_number":85,"context_line":"    if not URI_PATH_PATTERN.match(parsed_url.path):"},{"line_number":86,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":87,"context_line":"            _(\u0027Invalid Redfish URI path %(path)s given to driver_info/\u0027"},{"line_number":88,"context_line":"              \u0027redfish_uri on node %(node)s\u0027) % {\u0027path\u0027: parsed_url.path,"},{"line_number":89,"context_line":"                                                 \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba2be162_c91bc371","line":86,"range":{"start_line":86,"start_character":24,"end_line":86,"end_character":45},"in_reply_to":"ba2be162_4610a059","updated":"2017-03-03 14:28:27.000000000","message":":-( wrong c\u0026p: http://redfish.dmtf.org/schemas/DSP0266_1.1.html#protocol-version","commit_id":"01758fd79ff9165eb0d1dc9b07785c77dca95081"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"dca94805fa416b6a32a5cfd64b7366e4ffc506c9","unresolved":false,"context_lines":[{"line_number":30,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"REQUIRED_PROPERTIES \u003d {"},{"line_number":33,"context_line":"    \u0027redfish_uri\u0027: _(\u0027The URI of the System to interact with (e.g.: \u0027"},{"line_number":34,"context_line":"                     \u0027http(s)://\u003cIP\u003e:\u003cPORT\u003e/redfish/v1/Systems/CX34R87)\u0027)"},{"line_number":35,"context_line":"}"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_ff59cafd","line":33,"updated":"2017-03-06 17:21:08.000000000","message":"nit: Can we mention Redfish here?","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aca0c9176c624440e5c2f67b8ace010d245d1bd6","unresolved":false,"context_lines":[{"line_number":30,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"REQUIRED_PROPERTIES \u003d {"},{"line_number":33,"context_line":"    \u0027redfish_uri\u0027: _(\u0027The URI of the System to interact with (e.g.: \u0027"},{"line_number":34,"context_line":"                     \u0027http(s)://\u003cIP\u003e:\u003cPORT\u003e/redfish/v1/Systems/CX34R87)\u0027)"},{"line_number":35,"context_line":"}"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_9bac44ef","line":33,"in_reply_to":"ba2be162_ff59cafd","updated":"2017-03-07 12:07:24.000000000","message":"The name of the property already contains it. I was actually thinking about removing the word \"redfish\" from the username/password properties since it\u0027s redundant","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":17114,"name":"Hans Feldt","email":"hans.feldt@ericsson.com","username":"hafe"},"change_message_id":"002a4e3af9915fcd6702d7fcee9cd542a2d6f310","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    if not path.startswith(redfish_prefix):"},{"line_number":73,"context_line":"        redfish_prefix \u003d \u0027\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    base_uri \u003d urlparse.urljoin("},{"line_number":76,"context_line":"        parsed_url.scheme + \u0027://\u0027 + parsed_url.netloc, redfish_prefix)"},{"line_number":77,"context_line":"    system_id \u003d os.path.basename(path)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_9c6adc7f","line":74,"updated":"2017-03-03 18:18:28.000000000","message":"This will not work for us. I suggest you change it to:\nredfish_prefix \u003d os.path.dirname(path)\nand remove the above 3 lines","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"a62cc48fa8cb71d71ff4aabe096e98c3733a61be","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    if not path.startswith(redfish_prefix):"},{"line_number":73,"context_line":"        redfish_prefix \u003d \u0027\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    base_uri \u003d urlparse.urljoin("},{"line_number":76,"context_line":"        parsed_url.scheme + \u0027://\u0027 + parsed_url.netloc, redfish_prefix)"},{"line_number":77,"context_line":"    system_id \u003d os.path.basename(path)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_16a02bf4","line":74,"in_reply_to":"ba2be162_0012fe56","updated":"2017-03-07 12:22:48.000000000","message":"Can we reliably parse Redfish URIs at all? The python-redfish implementers think not: https://github.com/openstack/python-redfish/blob/d4b3f046e9d6bf8b5820bf6115806fa1364c5ee6/redfish/main.py#L29","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"5de179c7a07e8e22d55abd3119b88d1831f1f6c1","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    if not path.startswith(redfish_prefix):"},{"line_number":73,"context_line":"        redfish_prefix \u003d \u0027\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    base_uri \u003d urlparse.urljoin("},{"line_number":76,"context_line":"        parsed_url.scheme + \u0027://\u0027 + parsed_url.netloc, redfish_prefix)"},{"line_number":77,"context_line":"    system_id \u003d os.path.basename(path)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_b79a596c","line":74,"in_reply_to":"ba2be162_9c6adc7f","updated":"2017-03-03 18:43:07.000000000","message":"Can you give me an example of what you have ?\n\nI\u0027m starting to think that it would be better to have two properties in the driver_info: 1) The Redfish URI pointing to the root resource; 2) The System\u0027s ID that Ironic is managing.\n\nThat way we don\u0027t need to keep doing this string juggling to separate the root URI and the system\u0027s id. It will make things more flexible.\n\nWhat do you think ?","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":17114,"name":"Hans Feldt","email":"hans.feldt@ericsson.com","username":"hafe"},"change_message_id":"d660297c7d1ad02b2152751ac2b2250dcc813d70","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    if not path.startswith(redfish_prefix):"},{"line_number":73,"context_line":"        redfish_prefix \u003d \u0027\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    base_uri \u003d urlparse.urljoin("},{"line_number":76,"context_line":"        parsed_url.scheme + \u0027://\u0027 + parsed_url.netloc, redfish_prefix)"},{"line_number":77,"context_line":"    system_id \u003d os.path.basename(path)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_b7e09997","line":74,"in_reply_to":"ba2be162_b79a596c","updated":"2017-03-03 18:47:52.000000000","message":"I can just say that we have some extra components in the path before we hit the redfish part. For example:\nhttps://1.2.3.4/a/b/redfish/v1/Systems/qwerty\n\nFor the other question I don\u0027t know, yet... Just started looking at the code","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"445a10c0250878f4159a03130614fe75d77c0083","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    if not path.startswith(redfish_prefix):"},{"line_number":73,"context_line":"        redfish_prefix \u003d \u0027\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    base_uri \u003d urlparse.urljoin("},{"line_number":76,"context_line":"        parsed_url.scheme + \u0027://\u0027 + parsed_url.netloc, redfish_prefix)"},{"line_number":77,"context_line":"    system_id \u003d os.path.basename(path)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_0012fe56","line":74,"in_reply_to":"ba2be162_b7e09997","updated":"2017-03-03 19:03:28.000000000","message":"Gotcha... Ok, lemme know what you think about separating it later because we will need to add it to the spec.","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"78946da78963b43c6adada84fc8eb6ee0c3f5150","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        redfish_prefix \u003d \u0027\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    base_uri \u003d urlparse.urljoin("},{"line_number":76,"context_line":"        parsed_url.scheme + \u0027://\u0027 + parsed_url.netloc, redfish_prefix)"},{"line_number":77,"context_line":"    system_id \u003d os.path.basename(path)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    return (base_uri, system_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_b9007667","line":76,"updated":"2017-03-04 20:59:09.000000000","message":"nit: I suggest using string formatting","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"52df6cf287f330ca1dc60e3067e5c640fe14c30c","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        redfish_prefix \u003d \u0027\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    base_uri \u003d urlparse.urljoin("},{"line_number":76,"context_line":"        parsed_url.scheme + \u0027://\u0027 + parsed_url.netloc, redfish_prefix)"},{"line_number":77,"context_line":"    system_id \u003d os.path.basename(path)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    return (base_uri, system_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_edc93627","line":76,"in_reply_to":"ba2be162_b9007667","updated":"2017-03-06 10:10:44.000000000","message":"Yeah, let\u0027s see what Hans thinks about having the root URI separated from the System\u0027s ID. Given that we don\u0027t know how each URL will look like from all vendors I think that would be a good thing to do instead of trying to come up with a function that tries to parse everything.","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"78946da78963b43c6adada84fc8eb6ee0c3f5150","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        if the connection is already cached. Defaults to False"},{"line_number":131,"context_line":"    :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":132,"context_line":"    \"\"\""},{"line_number":133,"context_line":"    global REDFISH_CONNECTIONS"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    base_uri \u003d driver_info[\u0027base_uri\u0027]"},{"line_number":136,"context_line":"    if base_uri in REDFISH_CONNECTIONS and not reconnect:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_d9fb6a77","line":133,"updated":"2017-03-04 20:59:09.000000000","message":"nit: let\u0027s maybe not have any caches in the version revision please? I suspect it may have its own problems, I\u0027d prefer to think about them separately.","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"52df6cf287f330ca1dc60e3067e5c640fe14c30c","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        if the connection is already cached. Defaults to False"},{"line_number":131,"context_line":"    :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":132,"context_line":"    \"\"\""},{"line_number":133,"context_line":"    global REDFISH_CONNECTIONS"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    base_uri \u003d driver_info[\u0027base_uri\u0027]"},{"line_number":136,"context_line":"    if base_uri in REDFISH_CONNECTIONS and not reconnect:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_ed33f611","line":133,"in_reply_to":"ba2be162_d9fb6a77","updated":"2017-03-06 10:10:44.000000000","message":"We could remove although it may bring it\u0027s own problems too. The caching here is just so we avoid unnecessary requests to the Redfish controller when it\u0027s not needed. And by handling the generic ConnectionError and retying based on that seems to be reliable at least on my tests (after changing credentials, after killing the mockup server, after changing the URI etc...)","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"78946da78963b43c6adada84fc8eb6ee0c3f5150","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            base_uri, username\u003ddriver_info[\u0027username\u0027],"},{"line_number":142,"context_line":"            password\u003ddriver_info[\u0027password\u0027],"},{"line_number":143,"context_line":"            verify\u003ddriver_info[\u0027verify_ca\u0027])"},{"line_number":144,"context_line":"    except sushy.exceptions.ConnectionError:"},{"line_number":145,"context_line":"        raise exception.RedfishConnectionError(node\u003ddriver_info[\u0027node_uuid\u0027])"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_f9f66e8d","line":144,"updated":"2017-03-04 20:59:09.000000000","message":"this needs logging. and preferably passing str(error) into RedfishConnectionError for a user to see it.","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"52df6cf287f330ca1dc60e3067e5c640fe14c30c","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            base_uri, username\u003ddriver_info[\u0027username\u0027],"},{"line_number":142,"context_line":"            password\u003ddriver_info[\u0027password\u0027],"},{"line_number":143,"context_line":"            verify\u003ddriver_info[\u0027verify_ca\u0027])"},{"line_number":144,"context_line":"    except sushy.exceptions.ConnectionError:"},{"line_number":145,"context_line":"        raise exception.RedfishConnectionError(node\u003ddriver_info[\u0027node_uuid\u0027])"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_6d054644","line":144,"in_reply_to":"ba2be162_f9f66e8d","updated":"2017-03-06 10:10:44.000000000","message":"Maybe a DEBUG log ?\n\nCause I didn\u0027t log it here cause the log itself happens at the get_system() method (this one just being a helper class).\n\nSee L187 for retrying and L202 when all attempts were tried already.","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":17114,"name":"Hans Feldt","email":"hans.feldt@ericsson.com","username":"hafe"},"change_message_id":"9a1f9012d55e3360901e95bdae698aeb09fb0645","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        retry_on_exception\u003d("},{"line_number":167,"context_line":"            lambda e: isinstance(e, exception.RedfishConnectionError)),"},{"line_number":168,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":169,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":170,"context_line":"    def _get_system():"},{"line_number":171,"context_line":"        if base_uri not in REDFISH_CONNECTIONS:"},{"line_number":172,"context_line":"            _connect(driver_info)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_2895e087","line":169,"range":{"start_line":169,"start_character":64,"end_line":169,"end_character":65},"updated":"2017-03-06 19:49:33.000000000","message":"Isn\u0027t the retry loop better placed in the driver? The driver can interpret the 5xx status codes and retry as required.\n\nLooks like this will do retries on client side (4xx) errors.","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aca0c9176c624440e5c2f67b8ace010d245d1bd6","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        retry_on_exception\u003d("},{"line_number":167,"context_line":"            lambda e: isinstance(e, exception.RedfishConnectionError)),"},{"line_number":168,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":169,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":170,"context_line":"    def _get_system():"},{"line_number":171,"context_line":"        if base_uri not in REDFISH_CONNECTIONS:"},{"line_number":172,"context_line":"            _connect(driver_info)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_1bbf74d1","line":169,"range":{"start_line":169,"start_character":64,"end_line":169,"end_character":65},"in_reply_to":"ba2be162_2895e087","updated":"2017-03-07 12:07:24.000000000","message":"Like interpreting the \"Retry-After\" header from the exceptions and retry on that ?\n\nThat would be neat actually... My only fear is that, current Ironic already has it\u0027s own retries done on other levels, for example when sync\u0027ing the power state [0]. So I don\u0027t want to overload it with a lot of retries, at least for the first implementation maybe we should only retry on few exceptions (such as ConnectionError) and as the driver is being used we can improve on it, otherwise I\u0027m afraid of end up over-engineering it.\n\n[0] https://github.com/openstack/ironic/blob/master/ironic/conductor/manager.py#L2859","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"dca94805fa416b6a32a5cfd64b7366e4ffc506c9","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    try:"},{"line_number":200,"context_line":"        return _get_system()"},{"line_number":201,"context_line":"    except retrying.RetryError:"},{"line_number":202,"context_line":"        LOG.error(_LE(\u0027Failed to connect to Redfish at %(uri)s for node \u0027"},{"line_number":203,"context_line":"                      \u0027%(node)s\u0027), {\u0027uri\u0027: base_uri, \u0027node\u0027: node.uuid})"},{"line_number":204,"context_line":"        raise exception.RedfishConnectionError(node\u003dnode.uuid)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_9cb455d5","line":201,"updated":"2017-03-06 17:21:08.000000000","message":"_get_system() can raise RedfishConnectionError also at L145. Can you add handling for that also?","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aca0c9176c624440e5c2f67b8ace010d245d1bd6","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    try:"},{"line_number":200,"context_line":"        return _get_system()"},{"line_number":201,"context_line":"    except retrying.RetryError:"},{"line_number":202,"context_line":"        LOG.error(_LE(\u0027Failed to connect to Redfish at %(uri)s for node \u0027"},{"line_number":203,"context_line":"                      \u0027%(node)s\u0027), {\u0027uri\u0027: base_uri, \u0027node\u0027: node.uuid})"},{"line_number":204,"context_line":"        raise exception.RedfishConnectionError(node\u003dnode.uuid)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_7b96b095","line":201,"in_reply_to":"ba2be162_9cb455d5","updated":"2017-03-07 12:07:24.000000000","message":"++","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":10202,"name":"Wan-yen Hsu","email":"wanyenhsu@gmail.com"},"change_message_id":"da5780a891c7871837ece663d830211cb630f538","unresolved":false,"context_lines":[{"line_number":56,"context_line":"# NOTE(lucasagomes): Let\u0027s cache the connections and systems objects to"},{"line_number":57,"context_line":"# avoid GET\u0027ing it again from the Redfish server when not necessary. It"},{"line_number":58,"context_line":"# can be refreshed in places it makes sense, see the \"refresh\" parameter"},{"line_number":59,"context_line":"# for the get_system() method."},{"line_number":60,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":61,"context_line":"REDFISH_SYSTEMS \u003d {}"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_1e839099","line":59,"updated":"2017-03-09 04:39:56.000000000","message":"Will the cached system obj be removed when ironic is tearing down the node?  Any concern about system memory usage if a conductor manages hundreds of nodes?","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"76cb751794a8379a7c4a908efc0bfe79661bf057","unresolved":false,"context_lines":[{"line_number":56,"context_line":"# NOTE(lucasagomes): Let\u0027s cache the connections and systems objects to"},{"line_number":57,"context_line":"# avoid GET\u0027ing it again from the Redfish server when not necessary. It"},{"line_number":58,"context_line":"# can be refreshed in places it makes sense, see the \"refresh\" parameter"},{"line_number":59,"context_line":"# for the get_system() method."},{"line_number":60,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":61,"context_line":"REDFISH_SYSTEMS \u003d {}"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_667a3079","line":59,"in_reply_to":"9a30ddce_0b06e2cd","updated":"2017-03-09 14:00:21.000000000","message":"I\u0027m not sure how much object() takes, but I\u0027m pretty sure that a connection object is several times bigger. I\u0027d prefer we don\u0027t do any caching in the initial version of the patch, but if we do, I\u0027d prefer we use some LRU cache, similar to https://docs.python.org/3/library/functools.html#functools.lru_cache","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"8b7b168e8d91dadba9ea0e482e7f44a600f5b539","unresolved":false,"context_lines":[{"line_number":56,"context_line":"# NOTE(lucasagomes): Let\u0027s cache the connections and systems objects to"},{"line_number":57,"context_line":"# avoid GET\u0027ing it again from the Redfish server when not necessary. It"},{"line_number":58,"context_line":"# can be refreshed in places it makes sense, see the \"refresh\" parameter"},{"line_number":59,"context_line":"# for the get_system() method."},{"line_number":60,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":61,"context_line":"REDFISH_SYSTEMS \u003d {}"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_0b06e2cd","line":59,"in_reply_to":"9a30ddce_1e839099","updated":"2017-03-09 11:18:03.000000000","message":"By tearing down you mean when the node is deleted from the Ironic database ? (We usually say \"tear down\" for removing an instance from the node).\n\nAnyway, with the current implementation the cache won\u0027t be deleted after the node is removed from the db. This is something that we may want to look at cause Ironic doesn\u0027t tell the driver it\u0027s going to delete the node, it just do it.\n\nOne way to fix that problem would be to have a driver periodic task that checks when the log for that node was accessed and delete it if it hasn\u0027t been touch in X period of time (we will need to save the timestamp for each cache in the dict).\n\nThat said, I don\u0027t concern much about memory usage here. A dictionary with hundreds (or even few thousands) of entries is not a big deal memory wise:\n\n(NOTE: This is just an example, I know that memory profiling in python is not that simple)\n\nFor example, a dict containing 100.000 entries holding an instance of object(), will have ~5 MiB in size:\n\nIn [1]: import sys\nIn [2]: a \u003d {k: object() for k in range(100000)}\nIn [3]: sys.getsizeof(a)\nOut[3]: 5242976  # \u003c\u003c\u003c This is in bytes","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"94bdadfe1af7ea5cac2d66e51be1b3e329e0dde2","unresolved":false,"context_lines":[{"line_number":56,"context_line":"# NOTE(lucasagomes): Let\u0027s cache the connections and systems objects to"},{"line_number":57,"context_line":"# avoid GET\u0027ing it again from the Redfish server when not necessary. It"},{"line_number":58,"context_line":"# can be refreshed in places it makes sense, see the \"refresh\" parameter"},{"line_number":59,"context_line":"# for the get_system() method."},{"line_number":60,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":61,"context_line":"REDFISH_SYSTEMS \u003d {}"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_f515d148","line":59,"in_reply_to":"9a30ddce_4cc0e12a","updated":"2017-03-09 21:20:43.000000000","message":"Hi @Bruno,\n\nInteresting and thanks for bringing these things up. The more I think I\u0027ve learnt about Redfish the more I see the amount of things I\u0027ve missed as well.\n\nMy comment was based on things that I read and also comments like [0]. My understand was that most of the time the relation between System and Managers was 1:N and that\u0027s why we comments in the spec asking to have a way to set things like the base URI and credentials in the configuration file (again [0]); otherwise the information would be duplicated on virtually each node in Ironic.\n\nSo, at least for now, with the HPE hardware you\u0027ll have a different base URI [and crendentials] for each the System ?\n\n[0] https://review.openstack.org/#/c/184653/20/specs/approved/ironic-redfish.rst (see comment @ L95)","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"2e4d385771900cf71bafcf4f265cd112e2aac5ba","unresolved":false,"context_lines":[{"line_number":56,"context_line":"# NOTE(lucasagomes): Let\u0027s cache the connections and systems objects to"},{"line_number":57,"context_line":"# avoid GET\u0027ing it again from the Redfish server when not necessary. It"},{"line_number":58,"context_line":"# can be refreshed in places it makes sense, see the \"refresh\" parameter"},{"line_number":59,"context_line":"# for the get_system() method."},{"line_number":60,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":61,"context_line":"REDFISH_SYSTEMS \u003d {}"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_aa38623e","line":59,"in_reply_to":"9a30ddce_667a3079","updated":"2017-03-09 16:55:09.000000000","message":"Right, I agree in parts yeah... I think for connection we def should cache it because we don\u0027t expect to have many Redfish controllers around. Each controller can probably manage thousands of nodes and that would be enough for pretty much all use cases around, so we really expect very few connections to be cached (mostly expected is only 1)\n\nBut, for systems yeah, we will cache 1 system for each node that the ironic-conductor is responsible for managing. So maybe yeah we can remove that cache in the first iteration.\n\nWhat do you think ?","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":15222,"name":"Bruno Cornec","email":"bruno.cornec@hpe.com","username":"bruno-cornec"},"change_message_id":"a7c010d991a55f7923ab40530910bc7fa5e1469f","unresolved":false,"context_lines":[{"line_number":56,"context_line":"# NOTE(lucasagomes): Let\u0027s cache the connections and systems objects to"},{"line_number":57,"context_line":"# avoid GET\u0027ing it again from the Redfish server when not necessary. It"},{"line_number":58,"context_line":"# can be refreshed in places it makes sense, see the \"refresh\" parameter"},{"line_number":59,"context_line":"# for the get_system() method."},{"line_number":60,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":61,"context_line":"REDFISH_SYSTEMS \u003d {}"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_4cc0e12a","line":59,"in_reply_to":"9a30ddce_aa38623e","updated":"2017-03-09 18:07:31.000000000","message":"Well, I tend to disagree with you here. For what I know from HPE HW, if you manage a cloud of 100 Blade nodes or rack mounted servers, you\u0027ll get 100 managers.\n\nNow, that doesn\u0027t mean anything wrt the impact, just the fact that for now you\u0027ll generally have one manager/system to manage for some time still.","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"410297258bdb36a1782259a0dc211e9097a00d67","unresolved":false,"context_lines":[{"line_number":56,"context_line":"# NOTE(lucasagomes): Let\u0027s cache the connections and systems objects to"},{"line_number":57,"context_line":"# avoid GET\u0027ing it again from the Redfish server when not necessary. It"},{"line_number":58,"context_line":"# can be refreshed in places it makes sense, see the \"refresh\" parameter"},{"line_number":59,"context_line":"# for the get_system() method."},{"line_number":60,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":61,"context_line":"REDFISH_SYSTEMS \u003d {}"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_70755df8","line":59,"in_reply_to":"9a30ddce_f515d148","updated":"2017-03-10 08:22:22.000000000","message":"@Lucas can we have a scenario where Systems:Managers::1:N (i.e. one System having multiple managers) exists as mentioned by you? I doubt. Alto we can obviously have the other way round wherein Systems:Managers::N:1\nBut again, I assume what @Bruno is referring to is Systems:Managers::1:1 in Blade nodes and rack mounted servers and moreover (what is more important here within this context) we may have 100,000 connections (uris with their own integral credentials/certificates,) as opposed to Systems. I am all ears for Bruno for more clarifications sought by you. If that is true, @Lucas, then will your idea of keeping caching redfish controllers (or connections) hold good?","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":15222,"name":"Bruno Cornec","email":"bruno.cornec@hpe.com","username":"bruno-cornec"},"change_message_id":"e11cde04d268bc76ce1cb5dbc6728b0371a0bb55","unresolved":false,"context_lines":[{"line_number":56,"context_line":"# NOTE(lucasagomes): Let\u0027s cache the connections and systems objects to"},{"line_number":57,"context_line":"# avoid GET\u0027ing it again from the Redfish server when not necessary. It"},{"line_number":58,"context_line":"# can be refreshed in places it makes sense, see the \"refresh\" parameter"},{"line_number":59,"context_line":"# for the get_system() method."},{"line_number":60,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":61,"context_line":"REDFISH_SYSTEMS \u003d {}"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_616031d0","line":59,"in_reply_to":"9a30ddce_f515d148","updated":"2017-03-10 09:18:14.000000000","message":"Well I said \"If the machine has many nodes (such as what HPE is doing with Moonshot cartridges) a single Chassis Manager can drive multiple cartridges, Redfish has been designed to support that.\"\n\nBut that\u0027s not the majority of what is deployed today (at least for our customer base. In majority in their DC they have rack mountde systems where 1 manager \u003d\u003d  1 server and Blades where for our implementation (not sure for others) it\u0027s the same. Our Onboard Administrator today doesn\u0027t act as the one of the Moonshot chassis, and doesn\u0027t support Redfish for controlling all the blades.\n\nSo for our tests with python-redfish for now, I have as many lines (URIs) in my conf file for managing systems as systems, except for our Moonshot chassis, that we also test.\n\nI don\u0027t see that as a problem per se, but that may influence of course the way you want to design stuff.","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"410297258bdb36a1782259a0dc211e9097a00d67","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    # NOTE(lucasagomes): Create an ID composed by the URI + System\u0027s ID for"},{"line_number":181,"context_line":"    # the cache in case other System with the same ID exists in another"},{"line_number":182,"context_line":"    # Redfish server"},{"line_number":183,"context_line":"    cache_id \u003d \u0027%s@%s\u0027 % (root_uri, system_id)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @retrying.retry("},{"line_number":186,"context_line":"        retry_on_exception\u003d("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_5c0158ae","line":183,"range":{"start_line":183,"start_character":26,"end_line":183,"end_character":45},"updated":"2017-03-10 08:22:22.000000000","message":"nit: shouldn\u0027t this be to be more semantically correct?\n\n    cache_id \u003d \u0027%s@%s\u0027 % (system_id, root_uri)","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":15222,"name":"Bruno Cornec","email":"bruno.cornec@hpe.com","username":"bruno-cornec"},"change_message_id":"e11cde04d268bc76ce1cb5dbc6728b0371a0bb55","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    # NOTE(lucasagomes): Create an ID composed by the URI + System\u0027s ID for"},{"line_number":181,"context_line":"    # the cache in case other System with the same ID exists in another"},{"line_number":182,"context_line":"    # Redfish server"},{"line_number":183,"context_line":"    cache_id \u003d \u0027%s@%s\u0027 % (root_uri, system_id)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @retrying.retry("},{"line_number":186,"context_line":"        retry_on_exception\u003d("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_e1798183","line":183,"range":{"start_line":183,"start_character":26,"end_line":183,"end_character":45},"in_reply_to":"9a30ddce_5c0158ae","updated":"2017-03-10 09:18:14.000000000","message":"At least it corresponds to the comment, and sounds correct to me.","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":15222,"name":"Bruno Cornec","email":"bruno.cornec@hpe.com","username":"bruno-cornec"},"change_message_id":"ccb11fb4ab1b7ec8b966a1ae2787f4f54de0d15c","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    # NOTE(lucasagomes): Create an ID composed by the URI + System\u0027s ID for"},{"line_number":181,"context_line":"    # the cache in case other System with the same ID exists in another"},{"line_number":182,"context_line":"    # Redfish server"},{"line_number":183,"context_line":"    cache_id \u003d \u0027%s@%s\u0027 % (root_uri, system_id)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @retrying.retry("},{"line_number":186,"context_line":"        retry_on_exception\u003d("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_85b1b049","line":183,"range":{"start_line":183,"start_character":26,"end_line":183,"end_character":45},"in_reply_to":"9a30ddce_8101a508","updated":"2017-03-10 09:46:32.000000000","message":"Humm right, missed the \u0027@\u0027 indeed ;-)\nThen the cache ID could also be root_uri-system_id or another separator not requiring (mentally) to reverse members.\nnitpicking, of course, but we try to get the best possible solution ;-)","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"364653be43a8986853038837fd95658be68c9cbd","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    # NOTE(lucasagomes): Create an ID composed by the URI + System\u0027s ID for"},{"line_number":181,"context_line":"    # the cache in case other System with the same ID exists in another"},{"line_number":182,"context_line":"    # Redfish server"},{"line_number":183,"context_line":"    cache_id \u003d \u0027%s@%s\u0027 % (root_uri, system_id)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @retrying.retry("},{"line_number":186,"context_line":"        retry_on_exception\u003d("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_4b5507f8","line":183,"range":{"start_line":183,"start_character":26,"end_line":183,"end_character":45},"in_reply_to":"9a30ddce_85b1b049","updated":"2017-03-10 10:57:12.000000000","message":"Hah agreed, since it was a system cache it makes sense to have the system id first. If we keep this cache, as per discussion at line 59 I will revert the order.\n\nYeah, about the separator I just took @ out of thin air... It\u0027s totally up for discussion. Perhaps \"/\" maybe better since we can\u0027t have a \"/\" in the system\u0027s name where \"-\" (and @ I believe) is possible.","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"b72ad43df7e63bd4e33c2a74c466bebfc531022d","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    # NOTE(lucasagomes): Create an ID composed by the URI + System\u0027s ID for"},{"line_number":181,"context_line":"    # the cache in case other System with the same ID exists in another"},{"line_number":182,"context_line":"    # Redfish server"},{"line_number":183,"context_line":"    cache_id \u003d \u0027%s@%s\u0027 % (root_uri, system_id)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @retrying.retry("},{"line_number":186,"context_line":"        retry_on_exception\u003d("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_8101a508","line":183,"range":{"start_line":183,"start_character":26,"end_line":183,"end_character":45},"in_reply_to":"9a30ddce_e1798183","updated":"2017-03-10 09:42:45.000000000","message":"I was kinda stressing on the ``@`` factor. To me ``sys_id@rf_uri`` sounds more relevant than ``rf_uri@sys_id``. Again, its an absolute nitpicking tho :)","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"4f35d585b85e013d00c4abe2bd7a4d73cb6bcbda","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                          \u0027node %(node)s. Error %(error)s\u0027),"},{"line_number":192,"context_line":"                      {\u0027system\u0027: driver_info[\u0027system_id\u0027],"},{"line_number":193,"context_line":"                       \u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":194,"context_line":"            raise exception.RedfishError(node\u003dnode.uuid, error\u003de)"},{"line_number":195,"context_line":"        except sushy.exceptions.ConnectionError as e:"},{"line_number":196,"context_line":"            LOG.warning("},{"line_number":197,"context_line":"                _LW(\u0027Got a connection error when trying to fetch the System \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_85226ca1","line":194,"range":{"start_line":194,"start_character":41,"end_line":194,"end_character":55},"updated":"2017-03-11 09:29:27.000000000","message":"RedfishError do not log node.uuid","commit_id":"d1295a154314ed73401ad56032293d87e6701f10"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"8e8730f0260703db349a05b8cd294f3b3d317d1c","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                          \u0027node %(node)s. Error %(error)s\u0027),"},{"line_number":192,"context_line":"                      {\u0027system\u0027: driver_info[\u0027system_id\u0027],"},{"line_number":193,"context_line":"                       \u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":194,"context_line":"            raise exception.RedfishError(node\u003dnode.uuid, error\u003de)"},{"line_number":195,"context_line":"        except sushy.exceptions.ConnectionError as e:"},{"line_number":196,"context_line":"            LOG.warning("},{"line_number":197,"context_line":"                _LW(\u0027Got a connection error when trying to fetch the System \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_dafc3aba","line":194,"range":{"start_line":194,"start_character":41,"end_line":194,"end_character":55},"in_reply_to":"9a30ddce_85226ca1","updated":"2017-03-11 19:50:51.000000000","message":"Ops, good catch! Will fix it","commit_id":"d1295a154314ed73401ad56032293d87e6701f10"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aa769f48d4d2e18e502ce720963dc6e4f537b402","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                          \u0027node %(node)s. Error %(error)s\u0027),"},{"line_number":192,"context_line":"                      {\u0027system\u0027: driver_info[\u0027system_id\u0027],"},{"line_number":193,"context_line":"                       \u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":194,"context_line":"            raise exception.RedfishError(node\u003dnode.uuid, error\u003de)"},{"line_number":195,"context_line":"        except sushy.exceptions.ConnectionError as e:"},{"line_number":196,"context_line":"            LOG.warning("},{"line_number":197,"context_line":"                _LW(\u0027Got a connection error when trying to fetch the System \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_24252f5b","line":194,"range":{"start_line":194,"start_character":41,"end_line":194,"end_character":55},"in_reply_to":"9a30ddce_dafc3aba","updated":"2017-03-13 09:42:23.000000000","message":"I just removed the node\u003d parameter from here and left the message in the RedfishError exception as-is. I think it makes sense since we already mention the node uuid as part of the \"error\" parameter.","commit_id":"d1295a154314ed73401ad56032293d87e6701f10"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c794ae1103f3e2384df604c43f6cb8ed32670041","unresolved":false,"context_lines":[{"line_number":57,"context_line":"# Redfish controller. It would be interesting to also cache the System\u0027s"},{"line_number":58,"context_line":"# instances since we don\u0027t always need to refresh them for all actions,"},{"line_number":59,"context_line":"# that would save some GET\u0027s to the controller."},{"line_number":60,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def _extract_root_uri_and_system_id(uri, node):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_fdfd426f","line":60,"updated":"2017-03-14 11:21:18.000000000","message":"I don\u0027t quite really like a persistent cache that in the worst case grows linearly with the number of nodes...","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"64383f44c3eab902a0fba5f285d54abeca133f2c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"# Redfish controller. It would be interesting to also cache the System\u0027s"},{"line_number":58,"context_line":"# instances since we don\u0027t always need to refresh them for all actions,"},{"line_number":59,"context_line":"# that would save some GET\u0027s to the controller."},{"line_number":60,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def _extract_root_uri_and_system_id(uri, node):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_93499ed3","line":60,"in_reply_to":"5a22e58a_13404f56","updated":"2017-03-14 12:21:30.000000000","message":"Yeah, worst case scenario is 1:1. But still, I wouldn\u0027t be concerned about it, the load in Ironic is split around the ironic conductors so the cache will only contains the connections which affects the nodes that a specific conductor is managing.\n\nAnd, even if we have 100,000 objects cached in a single conductor - which btw, I don\u0027t ever think that a single ironic conductor would be able to handle /me thinks about sync\u0027ing power state here - it\u0027s not a problem for a dict in Python to contain that number of elements.","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b57b4eac993232cbe6cbbba64193debacd62031d","unresolved":false,"context_lines":[{"line_number":57,"context_line":"# Redfish controller. It would be interesting to also cache the System\u0027s"},{"line_number":58,"context_line":"# instances since we don\u0027t always need to refresh them for all actions,"},{"line_number":59,"context_line":"# that would save some GET\u0027s to the controller."},{"line_number":60,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def _extract_root_uri_and_system_id(uri, node):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_13404f56","line":60,"in_reply_to":"5a22e58a_f3af337b","updated":"2017-03-14 12:04:16.000000000","message":"\u003e And, the relation between connections to systems is 1:n.\n\nNot always.","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"26e478a5038b9dba18aa980cfbed9f3776b1612d","unresolved":false,"context_lines":[{"line_number":57,"context_line":"# Redfish controller. It would be interesting to also cache the System\u0027s"},{"line_number":58,"context_line":"# instances since we don\u0027t always need to refresh them for all actions,"},{"line_number":59,"context_line":"# that would save some GET\u0027s to the controller."},{"line_number":60,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def _extract_root_uri_and_system_id(uri, node):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_f3af337b","line":60,"in_reply_to":"5a22e58a_fdfd426f","updated":"2017-03-14 11:58:04.000000000","message":"See comment on L155, the cache gets updated. And, the relation between connections to systems is 1:n.","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c794ae1103f3e2384df604c43f6cb8ed32670041","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":78,"context_line":"            _(\u0027Cannot find the /Systems sub-uri in the Redfish URI \u0027"},{"line_number":79,"context_line":"              \u0027%(uri)s given to driver_info/redfish_uri on node \u0027"},{"line_number":80,"context_line":"              \u0027%(node)s\u0027) % {\u0027uri\u0027: uri, \u0027node\u0027: node.uuid})"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    root_uri \u003d (\u0027%(scheme)s://%(netloc)s/%(path)s\u0027 %"},{"line_number":83,"context_line":"                {\u0027scheme\u0027: parsed_url.scheme, \u0027netloc\u0027: parsed_url.netloc,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_1d03fe74","line":80,"updated":"2017-03-14 11:21:18.000000000","message":"This is nice for the beginning, but I\u0027m not sure it\u0027s going to work with all hardware. Due to loose nature of the protocol, /Systems may indeed not be present. As we hardcode /Systems in sushy as well, we may leave it as it is. For more robust approach, however, we probably need the root URL and the system ID, and then walk from root to the given system (which is probably 3 HTTP requests, sigh..).\n\nIdeally, we should not need root_uri at all, and e.g. create a System with a full URL, not with a sub-url. Dunno if it works well with the current architecture of sushy.","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"26e478a5038b9dba18aa980cfbed9f3776b1612d","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":78,"context_line":"            _(\u0027Cannot find the /Systems sub-uri in the Redfish URI \u0027"},{"line_number":79,"context_line":"              \u0027%(uri)s given to driver_info/redfish_uri on node \u0027"},{"line_number":80,"context_line":"              \u0027%(node)s\u0027) % {\u0027uri\u0027: uri, \u0027node\u0027: node.uuid})"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    root_uri \u003d (\u0027%(scheme)s://%(netloc)s/%(path)s\u0027 %"},{"line_number":83,"context_line":"                {\u0027scheme\u0027: parsed_url.scheme, \u0027netloc\u0027: parsed_url.netloc,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_b894b8e8","line":80,"in_reply_to":"5a22e58a_1d03fe74","updated":"2017-03-14 11:58:04.000000000","message":"Yeah, I was following the Redfish specification which explicit call it \"/Systems\" [0]. Now, if some redfish controllers call it \"/Nodes\" they are not following the specification.\n\nBut in any case, all we extract from this URI that is passed is the path to the \"root resource\" and the \"resource ID\". If Sushy learns how to create the objects correctly based on some identification we can get from the root resource, the driver could keep relying on a URI with \"/Systems\" just for parsing-sake and the library will handle the conversion transparently.\n\n[0] http://redfish.dmtf.org/schemas/DSP0266_1.1.html#uris","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c794ae1103f3e2384df604c43f6cb8ed32670041","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    # Log some warnings if the username and password are not specified"},{"line_number":129,"context_line":"    if not username:"},{"line_number":130,"context_line":"        LOG.warning(_LW(\u0027redfish_username is not defined or empty \u0027"},{"line_number":131,"context_line":"                        \u0027for node %s\u0027), node.uuid)"},{"line_number":132,"context_line":"    if not password:"},{"line_number":133,"context_line":"        LOG.warning(_LW(\u0027redfish_password is not defined or empty \u0027"},{"line_number":134,"context_line":"                        \u0027for node %s\u0027), node.uuid)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_3df8ba7c","line":131,"updated":"2017-03-14 11:21:18.000000000","message":"if we think it\u0027s a normal mode of operation, this should be maximum DEBUG. if it\u0027s not normal, it should be an error.","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d5e25d107018f2fe5a89b6d468f579b696230ab1","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    # Log some warnings if the username and password are not specified"},{"line_number":129,"context_line":"    if not username:"},{"line_number":130,"context_line":"        LOG.warning(_LW(\u0027redfish_username is not defined or empty \u0027"},{"line_number":131,"context_line":"                        \u0027for node %s\u0027), node.uuid)"},{"line_number":132,"context_line":"    if not password:"},{"line_number":133,"context_line":"        LOG.warning(_LW(\u0027redfish_password is not defined or empty \u0027"},{"line_number":134,"context_line":"                        \u0027for node %s\u0027), node.uuid)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a1ff146_2a231b07","line":131,"in_reply_to":"5a22e58a_13e84e7c","updated":"2017-03-14 14:41:20.000000000","message":"I started putting some code for this but I think it\u0027s will get kinda complex to guard it to log once per node because the node\u0027s info can be updated and the driver won\u0027t know it etc...\n\nI think it would be better to indicate at the property\u0027s string that even tho they are optional they are highly recommended to be set, instead of logging anything here.","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"64383f44c3eab902a0fba5f285d54abeca133f2c","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    # Log some warnings if the username and password are not specified"},{"line_number":129,"context_line":"    if not username:"},{"line_number":130,"context_line":"        LOG.warning(_LW(\u0027redfish_username is not defined or empty \u0027"},{"line_number":131,"context_line":"                        \u0027for node %s\u0027), node.uuid)"},{"line_number":132,"context_line":"    if not password:"},{"line_number":133,"context_line":"        LOG.warning(_LW(\u0027redfish_password is not defined or empty \u0027"},{"line_number":134,"context_line":"                        \u0027for node %s\u0027), node.uuid)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_13e84e7c","line":131,"in_reply_to":"5a22e58a_33db8bef","updated":"2017-03-14 12:21:30.000000000","message":"Yeah it\u0027s tricky, cause the driver_info can be updated as well. The more I try to think about it the more I see that perhaps DEBUG logs would be better here, unfortunately. (I will look more anyway)","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"26e478a5038b9dba18aa980cfbed9f3776b1612d","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    # Log some warnings if the username and password are not specified"},{"line_number":129,"context_line":"    if not username:"},{"line_number":130,"context_line":"        LOG.warning(_LW(\u0027redfish_username is not defined or empty \u0027"},{"line_number":131,"context_line":"                        \u0027for node %s\u0027), node.uuid)"},{"line_number":132,"context_line":"    if not password:"},{"line_number":133,"context_line":"        LOG.warning(_LW(\u0027redfish_password is not defined or empty \u0027"},{"line_number":134,"context_line":"                        \u0027for node %s\u0027), node.uuid)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_98529cdc","line":131,"in_reply_to":"5a22e58a_3df8ba7c","updated":"2017-03-14 11:58:04.000000000","message":"Hmm I think it\u0027s similar to what we do for the ipmitool driver [0]; on both username/password is not mandatory but recommended therefore we add such warnings.\n\nMaybe logging it everything we parse driver_info may be a bit too much, but I believe the log level is OK. \n\nWhat do you think ? Do you still think we should downgrade the log level or log it only once or ... ?\n\n[0] https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/ipmitool.py#L278-L283","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b57b4eac993232cbe6cbbba64193debacd62031d","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    # Log some warnings if the username and password are not specified"},{"line_number":129,"context_line":"    if not username:"},{"line_number":130,"context_line":"        LOG.warning(_LW(\u0027redfish_username is not defined or empty \u0027"},{"line_number":131,"context_line":"                        \u0027for node %s\u0027), node.uuid)"},{"line_number":132,"context_line":"    if not password:"},{"line_number":133,"context_line":"        LOG.warning(_LW(\u0027redfish_password is not defined or empty \u0027"},{"line_number":134,"context_line":"                        \u0027for node %s\u0027), node.uuid)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_33db8bef","line":131,"in_reply_to":"5a22e58a_98529cdc","updated":"2017-03-14 12:04:16.000000000","message":"Yeah, I\u0027m worried about spamming the logs with warnings on every action. If we can somehow log it once per node (how?), it would be fine.","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c794ae1103f3e2384df604c43f6cb8ed32670041","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                        \u0027for node %s\u0027), node.uuid)"},{"line_number":132,"context_line":"    if not password:"},{"line_number":133,"context_line":"        LOG.warning(_LW(\u0027redfish_password is not defined or empty \u0027"},{"line_number":134,"context_line":"                        \u0027for node %s\u0027), node.uuid)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    return {\u0027root_uri\u0027: root_uri,"},{"line_number":137,"context_line":"            \u0027system_id\u0027: system_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_5df57681","line":134,"updated":"2017-03-14 11:21:18.000000000","message":"ditto","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c794ae1103f3e2384df604c43f6cb8ed32670041","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    global REDFISH_CONNECTIONS"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    root_uri \u003d driver_info[\u0027root_uri\u0027]"},{"line_number":155,"context_line":"    if root_uri in REDFISH_CONNECTIONS and not reconnect:"},{"line_number":156,"context_line":"        return"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_7df2329c","line":155,"updated":"2017-03-14 11:21:18.000000000","message":"ok, if you insist on caching, you need to somehow check that the connection is still alive. Otherwise a network glitch may require an ironic-conductor restart..","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"26e478a5038b9dba18aa980cfbed9f3776b1612d","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    global REDFISH_CONNECTIONS"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    root_uri \u003d driver_info[\u0027root_uri\u0027]"},{"line_number":155,"context_line":"    if root_uri in REDFISH_CONNECTIONS and not reconnect:"},{"line_number":156,"context_line":"        return"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_dd67a623","line":155,"in_reply_to":"5a22e58a_7df2329c","updated":"2017-03-14 11:58:04.000000000","message":"We already do it, the _connect() function is only used by get_system() [0] and in case of any ConnectionError is raised the code will try to reconnect (see L183 and on) to the \nserver and will cache the new connection.\n\nSo we will never need to restart the conductor just because the connection parameters has changed for any reason, it\u0027s kinda like a EAFP approach: Try to use the cached connection, if it fails for some reason, try to reconnect using the latest information we have in the node and cache the new connection (if it succeed).\n\n[0] Maybe we should make it more explicit by having it inside the get_system() function","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"64383f44c3eab902a0fba5f285d54abeca133f2c","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    global REDFISH_CONNECTIONS"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    root_uri \u003d driver_info[\u0027root_uri\u0027]"},{"line_number":155,"context_line":"    if root_uri in REDFISH_CONNECTIONS and not reconnect:"},{"line_number":156,"context_line":"        return"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_5302c63f","line":155,"in_reply_to":"5a22e58a_9390bfee","updated":"2017-03-14 12:21:30.000000000","message":"Yeah, I will add some comments and hope it will be more readable.","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b57b4eac993232cbe6cbbba64193debacd62031d","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    global REDFISH_CONNECTIONS"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    root_uri \u003d driver_info[\u0027root_uri\u0027]"},{"line_number":155,"context_line":"    if root_uri in REDFISH_CONNECTIONS and not reconnect:"},{"line_number":156,"context_line":"        return"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_9390bfee","line":155,"in_reply_to":"5a22e58a_dd67a623","updated":"2017-03-14 12:04:16.000000000","message":"Aha, got it. This is a bit confusing though. Dunno how to make it more obvious for readers..","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b57b4eac993232cbe6cbbba64193debacd62031d","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            root_uri, username\u003ddriver_info[\u0027username\u0027],"},{"line_number":161,"context_line":"            password\u003ddriver_info[\u0027password\u0027],"},{"line_number":162,"context_line":"            verify\u003ddriver_info[\u0027verify_ca\u0027])"},{"line_number":163,"context_line":"    except sushy.exceptions.ConnectionError:"},{"line_number":164,"context_line":"        raise exception.RedfishConnectionError(node\u003ddriver_info[\u0027node_uuid\u0027])"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"def get_system(node):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_b3493b91","line":164,"range":{"start_line":163,"start_character":0,"end_line":164,"end_character":74},"updated":"2017-03-14 12:04:16.000000000","message":"you\u0027re losing the original error message here. please either log it or include into RedfishConnectionError, preferably both.","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"64383f44c3eab902a0fba5f285d54abeca133f2c","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            root_uri, username\u003ddriver_info[\u0027username\u0027],"},{"line_number":161,"context_line":"            password\u003ddriver_info[\u0027password\u0027],"},{"line_number":162,"context_line":"            verify\u003ddriver_info[\u0027verify_ca\u0027])"},{"line_number":163,"context_line":"    except sushy.exceptions.ConnectionError:"},{"line_number":164,"context_line":"        raise exception.RedfishConnectionError(node\u003ddriver_info[\u0027node_uuid\u0027])"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"def get_system(node):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a22e58a_f399f220","line":164,"range":{"start_line":163,"start_character":0,"end_line":164,"end_character":74},"in_reply_to":"5a22e58a_b3493b91","updated":"2017-03-14 12:21:30.000000000","message":"++","commit_id":"eb123c0c272ca0504f13edc17ec5983b8b8b87c2"},{"author":{"_account_id":11297,"name":"Nisha Agarwal","email":"agarwalnisha1980@gmail.com","username":"Nisha"},"change_message_id":"093b57e53df821ab59f34aaa3422d2b2f5eb27c8","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from ironic.common import exception"},{"line_number":26,"context_line":"from ironic.conf import CONF"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"sushy \u003d importutils.try_import(\u0027sushy\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_8bb075f6","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":39},"updated":"2017-03-15 07:24:18.000000000","message":"ditto as in previous files.","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from ironic.common import exception"},{"line_number":26,"context_line":"from ironic.conf import CONF"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"sushy \u003d importutils.try_import(\u0027sushy\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_fdc44741","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":39},"in_reply_to":"3a1ff146_8bb075f6","updated":"2017-03-15 09:39:05.000000000","message":"ditto there as well, this is an import and should be here","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"39cf9b240040ade00db33719aaa97474b9fee844","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    global REDFISH_CONNECTIONS"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    root_uri \u003d driver_info[\u0027root_uri\u0027]"},{"line_number":132,"context_line":"    if root_uri in REDFISH_CONNECTIONS and not reconnect:"},{"line_number":133,"context_line":"        return"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    # In case of reconnect, make sure we remove the current cache"},{"line_number":136,"context_line":"    REDFISH_CONNECTIONS.pop(root_uri, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_7e1a3170","line":133,"range":{"start_line":132,"start_character":4,"end_line":133,"end_character":14},"updated":"2017-03-14 15:51:13.000000000","message":"do u really see this part of code getting hit at any point based on the context of invocation of _connect() [See L169 and L186]? I can see only these 2 points wherein _connect is invoked and invariably this gets passed to the post part of the \u0027this return statement\u0027. Am I wrong in interpreting?","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d8439087e866fee4cd61517e4b3ee660d74e5a08","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    global REDFISH_CONNECTIONS"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    root_uri \u003d driver_info[\u0027root_uri\u0027]"},{"line_number":132,"context_line":"    if root_uri in REDFISH_CONNECTIONS and not reconnect:"},{"line_number":133,"context_line":"        return"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    # In case of reconnect, make sure we remove the current cache"},{"line_number":136,"context_line":"    REDFISH_CONNECTIONS.pop(root_uri, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_fc7d3fe8","line":133,"range":{"start_line":132,"start_character":4,"end_line":133,"end_character":14},"in_reply_to":"3a1ff146_6bb9922e","updated":"2017-03-14 21:36:48.000000000","message":"I like defensive programming myself. And also think about the future, someone else may make changes which this could catch.\n\nNow could do a LOG.XXXXXXX(..) message if desired.","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"6a5cc6dd9a2df1265d0cdae87bc97ee816837012","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    global REDFISH_CONNECTIONS"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    root_uri \u003d driver_info[\u0027root_uri\u0027]"},{"line_number":132,"context_line":"    if root_uri in REDFISH_CONNECTIONS and not reconnect:"},{"line_number":133,"context_line":"        return"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    # In case of reconnect, make sure we remove the current cache"},{"line_number":136,"context_line":"    REDFISH_CONNECTIONS.pop(root_uri, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_b97da3e9","line":133,"range":{"start_line":132,"start_character":4,"end_line":133,"end_character":14},"in_reply_to":"3a1ff146_7e1a3170","updated":"2017-03-14 16:19:45.000000000","message":"Hmm haven\u0027t thought about it, it seems possible to happen although very unlikely.\n\nOne thing that we can do to prevent such a thing would be to decorate the _connect() method with a @lockutils.synchronized() decorator, that will guard the method and make sure we eliminate such race","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"1da10d5cbb6c509a0f16b7de07007e8502550c15","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    global REDFISH_CONNECTIONS"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    root_uri \u003d driver_info[\u0027root_uri\u0027]"},{"line_number":132,"context_line":"    if root_uri in REDFISH_CONNECTIONS and not reconnect:"},{"line_number":133,"context_line":"        return"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    # In case of reconnect, make sure we remove the current cache"},{"line_number":136,"context_line":"    REDFISH_CONNECTIONS.pop(root_uri, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_6bb9922e","line":133,"range":{"start_line":132,"start_character":4,"end_line":133,"end_character":14},"in_reply_to":"3a1ff146_b97da3e9","updated":"2017-03-14 16:27:20.000000000","message":"Btw, I\u0027ve included that change (the decorator) in the code, I will just wait for more comments on the patch before submitting a new patch-set.\n\nThanks, it\u0027s a good point you made here!","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d8439087e866fee4cd61517e4b3ee660d74e5a08","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":166,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":167,"context_line":"    def _get_system():"},{"line_number":168,"context_line":"        if root_uri not in REDFISH_CONNECTIONS:"},{"line_number":169,"context_line":"            _connect(driver_info)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_fcf29f6e","line":168,"updated":"2017-03-14 21:36:48.000000000","message":"Maybe don\u0027t need the if statement. Just call it.","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"71512e6d0fcc3c46e888a9d1ca37527e0e135aea","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":166,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":167,"context_line":"    def _get_system():"},{"line_number":168,"context_line":"        if root_uri not in REDFISH_CONNECTIONS:"},{"line_number":169,"context_line":"            _connect(driver_info)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a1ced50_4ce5d3a6","line":168,"in_reply_to":"3a1ff146_afdd2744","updated":"2017-03-16 17:29:52.000000000","message":"I\u0027ll be honest I don\u0027t see how it makes a difference. If \u0027reconnect\u0027 is not True and root_uri is not in REDFISH_CONNECTIONS, it just returns.\n\nBut it doesn\u0027t hurt to do it this way.","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":166,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":167,"context_line":"    def _get_system():"},{"line_number":168,"context_line":"        if root_uri not in REDFISH_CONNECTIONS:"},{"line_number":169,"context_line":"            _connect(driver_info)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_fddb6719","line":168,"in_reply_to":"3a1ff146_fcf29f6e","updated":"2017-03-15 09:39:05.000000000","message":"True","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"990f2398c90d3268c6fdcf3800c186fafa8b0d43","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":166,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":167,"context_line":"    def _get_system():"},{"line_number":168,"context_line":"        if root_uri not in REDFISH_CONNECTIONS:"},{"line_number":169,"context_line":"            _connect(driver_info)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_afdd2744","line":168,"in_reply_to":"3a1ff146_fddb6719","updated":"2017-03-15 15:10:39.000000000","message":"Actually, I will keep this guard here because in case of retrying it\u0027s better to just call it with refresh\u003dTrue as per L186","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"5009ea39da11fee727c1a8e3e56c3757cf622030","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027redfish_password\u0027: _(\u0027User account password. Although this property is \u0027"},{"line_number":46,"context_line":"                          \u0027not mandatory, it\\\u0027s highly recommended to set a \u0027"},{"line_number":47,"context_line":"                          \u0027password. Optional.\u0027),"},{"line_number":48,"context_line":"    \u0027redfish_verify_ca\u0027: _(\u0027Either a boolean value, a path to a CA_BUNDLE \u0027"},{"line_number":49,"context_line":"                           \u0027file or directory with certificates of trusted \u0027"},{"line_number":50,"context_line":"                           \u0027CAs. If set to True the driver will verify the \u0027"},{"line_number":51,"context_line":"                           \u0027host certificates; if False the driver will \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a1ff146_066d3d98","line":48,"updated":"2017-03-15 18:01:59.000000000","message":"So this option doesn\u0027t make much sense to me as described.\n\nIf I set it to True, which certificates will it verify against, since I didn\u0027t set a path?\n\nDo we need to have a separate path-to-ca (default to system path) + verify-ca options?","commit_id":"fbc3cdbc5415bf8c482c4852302a6cebfff227d4"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"3ffa4b664785b7c14a2dfb5d226644551f531758","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027redfish_password\u0027: _(\u0027User account password. Although this property is \u0027"},{"line_number":46,"context_line":"                          \u0027not mandatory, it\\\u0027s highly recommended to set a \u0027"},{"line_number":47,"context_line":"                          \u0027password. Optional.\u0027),"},{"line_number":48,"context_line":"    \u0027redfish_verify_ca\u0027: _(\u0027Either a boolean value, a path to a CA_BUNDLE \u0027"},{"line_number":49,"context_line":"                           \u0027file or directory with certificates of trusted \u0027"},{"line_number":50,"context_line":"                           \u0027CAs. If set to True the driver will verify the \u0027"},{"line_number":51,"context_line":"                           \u0027host certificates; if False the driver will \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a1ced50_49cac16e","line":48,"in_reply_to":"1a1ced50_296f4593","updated":"2017-03-20 16:32:34.000000000","message":"I wasn\u0027t clear. I guess how it is done now makes sense to me as it is the same way as Python Requests does it. So I personally am fine with leaving it as is.\n\nJust documented better.","commit_id":"fbc3cdbc5415bf8c482c4852302a6cebfff227d4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e285c54e80177e3f64306ab2c8ccfccb913a40c1","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027redfish_password\u0027: _(\u0027User account password. Although this property is \u0027"},{"line_number":46,"context_line":"                          \u0027not mandatory, it\\\u0027s highly recommended to set a \u0027"},{"line_number":47,"context_line":"                          \u0027password. Optional.\u0027),"},{"line_number":48,"context_line":"    \u0027redfish_verify_ca\u0027: _(\u0027Either a boolean value, a path to a CA_BUNDLE \u0027"},{"line_number":49,"context_line":"                           \u0027file or directory with certificates of trusted \u0027"},{"line_number":50,"context_line":"                           \u0027CAs. If set to True the driver will verify the \u0027"},{"line_number":51,"context_line":"                           \u0027host certificates; if False the driver will \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a1ced50_6973fd4d","line":48,"in_reply_to":"1a1ced50_49cac16e","updated":"2017-03-20 16:34:07.000000000","message":"Oh right, thanks @John... Yeah I misinterpreted your previous comment.","commit_id":"fbc3cdbc5415bf8c482c4852302a6cebfff227d4"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"5f6d85e3a5faf1531aa7be0e8184bb9e960e05b7","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027redfish_password\u0027: _(\u0027User account password. Although this property is \u0027"},{"line_number":46,"context_line":"                          \u0027not mandatory, it\\\u0027s highly recommended to set a \u0027"},{"line_number":47,"context_line":"                          \u0027password. Optional.\u0027),"},{"line_number":48,"context_line":"    \u0027redfish_verify_ca\u0027: _(\u0027Either a boolean value, a path to a CA_BUNDLE \u0027"},{"line_number":49,"context_line":"                           \u0027file or directory with certificates of trusted \u0027"},{"line_number":50,"context_line":"                           \u0027CAs. If set to True the driver will verify the \u0027"},{"line_number":51,"context_line":"                           \u0027host certificates; if False the driver will \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a1ced50_90ff83a9","line":48,"in_reply_to":"1a1ced50_50642be4","updated":"2017-03-20 13:50:11.000000000","message":"The idea makes sense to me, since this is how Python requests does it: http://docs.python-requests.org/en/master/user/advanced/#ssl-cert-verification\n\nNot sure on the name.","commit_id":"fbc3cdbc5415bf8c482c4852302a6cebfff227d4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"91ab3d8999e22426f115530c9d902c698968a4ae","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027redfish_password\u0027: _(\u0027User account password. Although this property is \u0027"},{"line_number":46,"context_line":"                          \u0027not mandatory, it\\\u0027s highly recommended to set a \u0027"},{"line_number":47,"context_line":"                          \u0027password. Optional.\u0027),"},{"line_number":48,"context_line":"    \u0027redfish_verify_ca\u0027: _(\u0027Either a boolean value, a path to a CA_BUNDLE \u0027"},{"line_number":49,"context_line":"                           \u0027file or directory with certificates of trusted \u0027"},{"line_number":50,"context_line":"                           \u0027CAs. If set to True the driver will verify the \u0027"},{"line_number":51,"context_line":"                           \u0027host certificates; if False the driver will \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a1ced50_296f4593","line":48,"in_reply_to":"1a1ced50_90ff83a9","updated":"2017-03-20 16:28:38.000000000","message":"@Julia, @John,\n\nThanks for the suggestions ideas... So, I\u0027m OK having two options if people agree with it. Btw, what \"warn\" would do ? Just log warnings ?\n\nAs for the names, indeed it\u0027s kinda difficult to come up with good ones. What about:\n\n* redfish_verify_ca \u003d True/False (or yes/no/warn as proposed)\n* redfish_ca_path \u003d \u003cpath\u003e or None\n\n?","commit_id":"fbc3cdbc5415bf8c482c4852302a6cebfff227d4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"2f12e903586a0772952a939962a40ce349faefe2","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027redfish_password\u0027: _(\u0027User account password. Although this property is \u0027"},{"line_number":46,"context_line":"                          \u0027not mandatory, it\\\u0027s highly recommended to set a \u0027"},{"line_number":47,"context_line":"                          \u0027password. Optional.\u0027),"},{"line_number":48,"context_line":"    \u0027redfish_verify_ca\u0027: _(\u0027Either a boolean value, a path to a CA_BUNDLE \u0027"},{"line_number":49,"context_line":"                           \u0027file or directory with certificates of trusted \u0027"},{"line_number":50,"context_line":"                           \u0027CAs. If set to True the driver will verify the \u0027"},{"line_number":51,"context_line":"                           \u0027host certificates; if False the driver will \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a1ff146_c8d07a56","line":48,"in_reply_to":"3a1ff146_066d3d98","updated":"2017-03-16 09:26:22.000000000","message":"Hi Jay,\n\nYeah, I see your point, it\u0027s a problem to describe this option it\u0027s too complex. Maybe we should indeed shrink it\u0027s scope and turn it into a less confusing configuration.\n\nSo, first thing is that this redfish_verify_ca is just a proxy to the \"verify\" option in python requests [0]. But even that doc can be a bit confusing. What requests does is, if verify is True (or None) it uses some \"strategies\" to look for a cert [1]:\n\n1 - It tries to load the \"where\" function from python-certifi [2]\n\n2 - If python certifi is not installed, requests then look at a the certificate bundle he ships with it [3]\n\n3 - And I think (I should look in the code) it\u0027s also possible to set the REQUESTS_CA_BUNDLE env variable (or CURL_CA_BUNDLE) pointing somewhere and it will look at that too.\n\nNow, it\u0027s a bit confusing and maybe it\u0027s not even needed for our use case.\n\nOne possibility would be to make this option to support only the more explicit configurations like: Users either pointing to a path (of a dir of certs or cert directly) or disable it by setting it to False. The problem then is, which path we should use as default, \"/etc/ssl/certs\" ? Or idk, have it disabled by default (False).\n\nOr should we leave it as is but try to document it better ?\n\nSuggestions are welcome, I also don\u0027t know how to better expose this configuration. \n\n[0] http://docs.python-requests.org/en/master/user/advanced/#ssl-cert-verification\n\n[1] https://github.com/kennethreitz/requests/blob/master/requests/certs.py\n\n[2] https://github.com/certifi/python-certifi\n\n[3] https://github.com/kennethreitz/requests/blob/master/requests/cacert.pem","commit_id":"fbc3cdbc5415bf8c482c4852302a6cebfff227d4"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"83f767d2ff257ac2c8634080def5dbdd101eb87a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u0027redfish_password\u0027: _(\u0027User account password. Although this property is \u0027"},{"line_number":46,"context_line":"                          \u0027not mandatory, it\\\u0027s highly recommended to set a \u0027"},{"line_number":47,"context_line":"                          \u0027password. Optional.\u0027),"},{"line_number":48,"context_line":"    \u0027redfish_verify_ca\u0027: _(\u0027Either a boolean value, a path to a CA_BUNDLE \u0027"},{"line_number":49,"context_line":"                           \u0027file or directory with certificates of trusted \u0027"},{"line_number":50,"context_line":"                           \u0027CAs. If set to True the driver will verify the \u0027"},{"line_number":51,"context_line":"                           \u0027host certificates; if False the driver will \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a1ced50_50642be4","line":48,"in_reply_to":"3a1ff146_c8d07a56","updated":"2017-03-20 13:45:21.000000000","message":"The name seems confusing to me. I think it makes sense to separate it into two distinct options.   One being \"Verify\" yes/no/warn (Warn seems like it should be a valid option...).  The other being \"Where can I find my CA cert bundle?\", which is ultimately optional, or not necessary depending on the operator\u0027s configuration and certificate management procedures.","commit_id":"fbc3cdbc5415bf8c482c4852302a6cebfff227d4"},{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"ff156a74ab9c2bd52c5cf38d9008f87cc3795713","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    address \u003d driver_info[\u0027address\u0027]"},{"line_number":169,"context_line":"    system_id \u003d driver_info[\u0027system_id\u0027]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @retrying.retry("},{"line_number":172,"context_line":"        retry_on_exception\u003d("},{"line_number":173,"context_line":"            lambda e: isinstance(e, exception.RedfishConnectionError)),"},{"line_number":174,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":175,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":176,"context_line":"    def _get_system():"},{"line_number":177,"context_line":"        if address not in REDFISH_CONNECTIONS:"},{"line_number":178,"context_line":"            _connect(driver_info)"}],"source_content_type":"text/x-python","patch_set":13,"id":"dfeb2761_8fd0b3cb","line":175,"range":{"start_line":171,"start_character":4,"end_line":175,"end_character":65},"updated":"2017-03-31 03:09:52.000000000","message":"@Lucas, have u had a chance to look at this?\n\nhttps://github.com/kennethreitz/requests/blob/master/requests/adapters.py#L90-L104\n\nThis, to me, turns out to be a retrying option just out of the box from ``requests`` package. Of course, it doesn\u0027t look like so that it gives you a finer and granular control e.g. customizing your retry interval timing.","commit_id":"33b5b372cce37bfe02bff5c8f03f5c9dd65c8d44"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"952cba1ecc04c0850543acda1735682429f20735","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        if the connection is already cached. Defaults to False"},{"line_number":136,"context_line":"    :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":"    global REDFISH_CONNECTIONS"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    address \u003d driver_info[\u0027address\u0027]"},{"line_number":141,"context_line":"    if address in REDFISH_CONNECTIONS and not reconnect:"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_b4937ca3","line":138,"updated":"2017-04-07 11:01:35.000000000","message":"nit: this is not needed, as you don\u0027t assign to REDFISH_CONNECTIONS directly anywhere here.","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"55aaf19bea7b182fdcd3680c7623001025ebcd30","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        if the connection is already cached. Defaults to False"},{"line_number":136,"context_line":"    :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":"    global REDFISH_CONNECTIONS"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    address \u003d driver_info[\u0027address\u0027]"},{"line_number":141,"context_line":"    if address in REDFISH_CONNECTIONS and not reconnect:"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_b4f49cd0","line":138,"in_reply_to":"bff0334d_b4937ca3","updated":"2017-04-07 11:19:35.000000000","message":"Done","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    \u0027redfish_password\u0027: _(\u0027User account password. Although this property is \u0027"},{"line_number":53,"context_line":"                          \u0027not mandatory, it\\\u0027s highly recommended to set a \u0027"},{"line_number":54,"context_line":"                          \u0027password. Optional\u0027),"},{"line_number":55,"context_line":"    \u0027redfish_verify_ca\u0027: _(\u0027Either a boolean value, a path to a CA_BUNDLE \u0027"},{"line_number":56,"context_line":"                           \u0027file or directory with certificates of trusted \u0027"},{"line_number":57,"context_line":"                           \u0027CAs. If set to True the driver will verify the \u0027"},{"line_number":58,"context_line":"                           \u0027host certificates; if False the driver will \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_5f5a7982","line":55,"updated":"2017-04-12 17:52:16.000000000","message":"nit s/boolean/Boolean/","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    \u0027redfish_password\u0027: _(\u0027User account password. Although this property is \u0027"},{"line_number":53,"context_line":"                          \u0027not mandatory, it\\\u0027s highly recommended to set a \u0027"},{"line_number":54,"context_line":"                          \u0027password. Optional\u0027),"},{"line_number":55,"context_line":"    \u0027redfish_verify_ca\u0027: _(\u0027Either a boolean value, a path to a CA_BUNDLE \u0027"},{"line_number":56,"context_line":"                           \u0027file or directory with certificates of trusted \u0027"},{"line_number":57,"context_line":"                           \u0027CAs. If set to True the driver will verify the \u0027"},{"line_number":58,"context_line":"                           \u0027host certificates; if False the driver will \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_32735183","line":55,"in_reply_to":"bff0334d_5f5a7982","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                           \u0027file or directory with certificates of trusted \u0027"},{"line_number":57,"context_line":"                           \u0027CAs. If set to True the driver will verify the \u0027"},{"line_number":58,"context_line":"                           \u0027host certificates; if False the driver will \u0027"},{"line_number":59,"context_line":"                           \u0027ignore verifying the SSL certificate; if it\\\u0027s \u0027"},{"line_number":60,"context_line":"                           \u0027a path the driver will use the specified \u0027"},{"line_number":61,"context_line":"                           \u0027certificate or one of the certificates in the \u0027"},{"line_number":62,"context_line":"                           \u0027directory. Defaults to True. Optional\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_1fdd11df","line":59,"updated":"2017-04-12 17:52:16.000000000","message":"I\u0027d probably start a new sentence here. s/; if/. If/","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                           \u0027file or directory with certificates of trusted \u0027"},{"line_number":57,"context_line":"                           \u0027CAs. If set to True the driver will verify the \u0027"},{"line_number":58,"context_line":"                           \u0027host certificates; if False the driver will \u0027"},{"line_number":59,"context_line":"                           \u0027ignore verifying the SSL certificate; if it\\\u0027s \u0027"},{"line_number":60,"context_line":"                           \u0027a path the driver will use the specified \u0027"},{"line_number":61,"context_line":"                           \u0027certificate or one of the certificates in the \u0027"},{"line_number":62,"context_line":"                           \u0027directory. Defaults to True. Optional\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_f26cc99d","line":59,"in_reply_to":"bff0334d_1fdd11df","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":69,"context_line":"# Redfish controller. It would be interesting to also cache the System\u0027s"},{"line_number":70,"context_line":"# instances since we don\u0027t always need to refresh them for all actions,"},{"line_number":71,"context_line":"# that would save some GET\u0027s to the controller."},{"line_number":72,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def parse_driver_info(node):"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_50b4a6f1","line":72,"updated":"2017-04-12 17:52:16.000000000","message":"might be good to document what is in this. I think \u0027redfish address\u0027 : \u003csomething-from-sushy\u003e?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":69,"context_line":"# Redfish controller. It would be interesting to also cache the System\u0027s"},{"line_number":70,"context_line":"# instances since we don\u0027t always need to refresh them for all actions,"},{"line_number":71,"context_line":"# that would save some GET\u0027s to the controller."},{"line_number":72,"context_line":"REDFISH_CONNECTIONS \u003d {}"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def parse_driver_info(node):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_72279966","line":72,"in_reply_to":"bff0334d_50b4a6f1","updated":"2017-04-13 10:21:45.000000000","message":"Yeah I can add a comment about the format","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def parse_driver_info(node):"},{"line_number":76,"context_line":"    \"\"\"Parse the information required to Ironic to connect to Redfish."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    :param node: an Ironic node object"},{"line_number":79,"context_line":"    :returns: dictionary of parameters"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_1f7991c6","line":76,"updated":"2017-04-12 17:52:16.000000000","message":"s/to Ironic/for Ironic/","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def parse_driver_info(node):"},{"line_number":76,"context_line":"    \"\"\"Parse the information required to Ironic to connect to Redfish."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    :param node: an Ironic node object"},{"line_number":79,"context_line":"    :returns: dictionary of parameters"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_522c9546","line":76,"in_reply_to":"bff0334d_1f7991c6","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    if missing_info:"},{"line_number":87,"context_line":"        raise exception.MissingParameterValue(_("},{"line_number":88,"context_line":"            \u0027Missing the following Redfish properties in node\\\u0027s \u0027"},{"line_number":89,"context_line":"            \u0027%(node)s driver_info: %(info)s\u0027) % {\u0027node\u0027: node.uuid,"},{"line_number":90,"context_line":"                                                 \u0027info\u0027: missing_info})"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    # Validate the Redfish address"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_ca3369f5","line":89,"updated":"2017-04-12 17:52:16.000000000","message":"this is a really really small nit. This string will look something like ..in node\u0027s 1be26c0b-03f2-4d2e-ae87-c02d7f33c123 driver_info: ...\n\ngrammatically, i think it might be ... from node 1be26c0b-03f2-4d2e-ae87-c02d7f33c123\u0027s driver_info.. :)","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    if missing_info:"},{"line_number":87,"context_line":"        raise exception.MissingParameterValue(_("},{"line_number":88,"context_line":"            \u0027Missing the following Redfish properties in node\\\u0027s \u0027"},{"line_number":89,"context_line":"            \u0027%(node)s driver_info: %(info)s\u0027) % {\u0027node\u0027: node.uuid,"},{"line_number":90,"context_line":"                                                 \u0027info\u0027: missing_info})"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    # Validate the Redfish address"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_121e0d0c","line":89,"in_reply_to":"bff0334d_ca3369f5","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    # Validate the Redfish address"},{"line_number":93,"context_line":"    address \u003d driver_info[\u0027redfish_address\u0027]"},{"line_number":94,"context_line":"    if not rfc3986.is_valid_uri(address, require_scheme\u003dTrue):"},{"line_number":95,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":96,"context_line":"            _(\u0027Invalid Redfish address %(address)s given to \u0027"},{"line_number":97,"context_line":"              \u0027driver_info/redfish_address on node %(node)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_ea9f4d4d","line":94,"updated":"2017-04-12 17:52:16.000000000","message":"nice, i didn\u0027t know about this package.\n\nBased on the description for redfish_address, what about adding require_authority\u003dTrue?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    # Validate the Redfish address"},{"line_number":93,"context_line":"    address \u003d driver_info[\u0027redfish_address\u0027]"},{"line_number":94,"context_line":"    if not rfc3986.is_valid_uri(address, require_scheme\u003dTrue):"},{"line_number":95,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":96,"context_line":"            _(\u0027Invalid Redfish address %(address)s given to \u0027"},{"line_number":97,"context_line":"              \u0027driver_info/redfish_address on node %(node)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_b205217d","line":94,"in_reply_to":"bff0334d_ea9f4d4d","updated":"2017-04-13 10:21:45.000000000","message":"++ for require_authority\n\nYeah this is a handy small library","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    address \u003d driver_info[\u0027redfish_address\u0027]"},{"line_number":94,"context_line":"    if not rfc3986.is_valid_uri(address, require_scheme\u003dTrue):"},{"line_number":95,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":96,"context_line":"            _(\u0027Invalid Redfish address %(address)s given to \u0027"},{"line_number":97,"context_line":"              \u0027driver_info/redfish_address on node %(node)s\u0027) %"},{"line_number":98,"context_line":"            {\u0027address\u0027: address, \u0027node\u0027: node.uuid})"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_6a89fd72","line":96,"updated":"2017-04-12 17:52:16.000000000","message":"nit. maybe s/given to/set in/. I think s/given to/in/ might be ok too but maybe you want to hint to them that they had set it.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    address \u003d driver_info[\u0027redfish_address\u0027]"},{"line_number":94,"context_line":"    if not rfc3986.is_valid_uri(address, require_scheme\u003dTrue):"},{"line_number":95,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":96,"context_line":"            _(\u0027Invalid Redfish address %(address)s given to \u0027"},{"line_number":97,"context_line":"              \u0027driver_info/redfish_address on node %(node)s\u0027) %"},{"line_number":98,"context_line":"            {\u0027address\u0027: address, \u0027node\u0027: node.uuid})"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_32f91180","line":96,"in_reply_to":"bff0334d_6a89fd72","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":97,"context_line":"              \u0027driver_info/redfish_address on node %(node)s\u0027) %"},{"line_number":98,"context_line":"            {\u0027address\u0027: address, \u0027node\u0027: node.uuid})"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    system_id \u003d driver_info[\u0027redfish_system_id\u0027]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    # Check if verify_ca is a boolean or a file/directory in the file-system"},{"line_number":103,"context_line":"    verify_ca \u003d driver_info.get(\u0027redfish_verify_ca\u0027, True)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_2ade553d","line":100,"updated":"2017-04-12 17:52:16.000000000","message":"Do we want to do some minimal check to see if it is a path? If you\u0027re going to generate the complete URI by redfish_address+system_id, you can check that way.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":97,"context_line":"              \u0027driver_info/redfish_address on node %(node)s\u0027) %"},{"line_number":98,"context_line":"            {\u0027address\u0027: address, \u0027node\u0027: node.uuid})"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    system_id \u003d driver_info[\u0027redfish_system_id\u0027]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    # Check if verify_ca is a boolean or a file/directory in the file-system"},{"line_number":103,"context_line":"    verify_ca \u003d driver_info.get(\u0027redfish_verify_ca\u0027, True)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_527135e0","line":100,"in_reply_to":"bff0334d_2ade553d","updated":"2017-04-13 10:21:45.000000000","message":"Yeah, well I intensionally left it open due the different implementations, not sure if someone could have a http://example.com/123456 pointing to a system directly... I doubt but, in any case Ironic will fail validation (from enroll to manageable) if the ID is incorrect...","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    if not isinstance(verify_ca, bool):"},{"line_number":105,"context_line":"        if not os.path.exists(verify_ca):"},{"line_number":106,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":107,"context_line":"                _(\u0027Invalid value \"%(value)s given to \u0027"},{"line_number":108,"context_line":"                  \u0027driver_info/redfish_verify_ca on node %(node)s. \u0027"},{"line_number":109,"context_line":"                  \u0027The value should be either a boolean, a path to a \u0027"},{"line_number":110,"context_line":"                  \u0027CA_BUNDLE file or directory with certificates of \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_6ad7bd4c","line":107,"updated":"2017-04-12 17:52:16.000000000","message":"s/%(value)s/%(value)s\"/\n\ns/given to/set in/","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    if not isinstance(verify_ca, bool):"},{"line_number":105,"context_line":"        if not os.path.exists(verify_ca):"},{"line_number":106,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":107,"context_line":"                _(\u0027Invalid value \"%(value)s given to \u0027"},{"line_number":108,"context_line":"                  \u0027driver_info/redfish_verify_ca on node %(node)s. \u0027"},{"line_number":109,"context_line":"                  \u0027The value should be either a boolean, a path to a \u0027"},{"line_number":110,"context_line":"                  \u0027CA_BUNDLE file or directory with certificates of \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_9250dd34","line":107,"in_reply_to":"bff0334d_6ad7bd4c","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":107,"context_line":"                _(\u0027Invalid value \"%(value)s given to \u0027"},{"line_number":108,"context_line":"                  \u0027driver_info/redfish_verify_ca on node %(node)s. \u0027"},{"line_number":109,"context_line":"                  \u0027The value should be either a boolean, a path to a \u0027"},{"line_number":110,"context_line":"                  \u0027CA_BUNDLE file or directory with certificates of \u0027"},{"line_number":111,"context_line":"                  \u0027trusted CAs\u0027) % {\u0027value\u0027: verify_ca, \u0027node\u0027: node.uuid})"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_8a07a1ca","line":109,"updated":"2017-04-12 17:52:16.000000000","message":"s/boolean/Boolean/","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":107,"context_line":"                _(\u0027Invalid value \"%(value)s given to \u0027"},{"line_number":108,"context_line":"                  \u0027driver_info/redfish_verify_ca on node %(node)s. \u0027"},{"line_number":109,"context_line":"                  \u0027The value should be either a boolean, a path to a \u0027"},{"line_number":110,"context_line":"                  \u0027CA_BUNDLE file or directory with certificates of \u0027"},{"line_number":111,"context_line":"                  \u0027trusted CAs\u0027) % {\u0027value\u0027: verify_ca, \u0027node\u0027: node.uuid})"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_92357dfa","line":109,"in_reply_to":"bff0334d_8a07a1ca","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    \"\"\"Connect to the Redfish Manager System."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    This helper function is part of the get_system() function, it has"},{"line_number":126,"context_line":"    been split out for readability purposes."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    Note that this function caches the connection with Redfish but,"},{"line_number":129,"context_line":"    upon any connection error that might be raised due the cache"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_cafb6944","line":126,"updated":"2017-04-12 17:52:16.000000000","message":"I don\u0027t really see why this comment is needed, but I\u0027m guessing someone wanted it...","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    \"\"\"Connect to the Redfish Manager System."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    This helper function is part of the get_system() function, it has"},{"line_number":126,"context_line":"    been split out for readability purposes."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    Note that this function caches the connection with Redfish but,"},{"line_number":129,"context_line":"    upon any connection error that might be raised due the cache"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_0d0f102f","line":126,"in_reply_to":"bff0334d_cafb6944","updated":"2017-04-13 10:21:45.000000000","message":"This was based on previous reviews, it\u0027s most to clarify that this is just a helper private method bounded to get_system()","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    been split out for readability purposes."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    Note that this function caches the connection with Redfish but,"},{"line_number":129,"context_line":"    upon any connection error that might be raised due the cache"},{"line_number":130,"context_line":"    (e.g. credential changes) the get_system() function will try to"},{"line_number":131,"context_line":"    reconnect and the cache will be updated."},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_4a8199c2","line":129,"updated":"2017-04-12 17:52:16.000000000","message":"maybe you mean s/due/due to/","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    been split out for readability purposes."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    Note that this function caches the connection with Redfish but,"},{"line_number":129,"context_line":"    upon any connection error that might be raised due the cache"},{"line_number":130,"context_line":"    (e.g. credential changes) the get_system() function will try to"},{"line_number":131,"context_line":"    reconnect and the cache will be updated."},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_ad2704b7","line":129,"in_reply_to":"bff0334d_4a8199c2","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    reconnect and the cache will be updated."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    :param driver_info: driver info with the redfish parameters"},{"line_number":134,"context_line":"    :param reconnect: boolean value, tries to reconnect to Redfish even"},{"line_number":135,"context_line":"        if the connection is already cached. Defaults to False"},{"line_number":136,"context_line":"    :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":137,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_0a6f112b","line":134,"updated":"2017-04-12 17:52:16.000000000","message":"s/boolean/Boolean/","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    reconnect and the cache will be updated."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    :param driver_info: driver info with the redfish parameters"},{"line_number":134,"context_line":"    :param reconnect: boolean value, tries to reconnect to Redfish even"},{"line_number":135,"context_line":"        if the connection is already cached. Defaults to False"},{"line_number":136,"context_line":"    :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":137,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_4d2638ba","line":134,"in_reply_to":"bff0334d_0a6f112b","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        retry_on_exception\u003d("},{"line_number":171,"context_line":"            lambda e: isinstance(e, exception.RedfishConnectionError)),"},{"line_number":172,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":173,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":174,"context_line":"    def _get_system():"},{"line_number":175,"context_line":"        if address not in REDFISH_CONNECTIONS:"},{"line_number":176,"context_line":"            _connect(driver_info)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_652dae93","line":173,"updated":"2017-04-12 17:52:16.000000000","message":"I\u0027m always paranoid about 0 and negative values. Do you know if retrying handles those in some reasonable fashion?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        retry_on_exception\u003d("},{"line_number":171,"context_line":"            lambda e: isinstance(e, exception.RedfishConnectionError)),"},{"line_number":172,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":173,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":174,"context_line":"    def _get_system():"},{"line_number":175,"context_line":"        if address not in REDFISH_CONNECTIONS:"},{"line_number":176,"context_line":"            _connect(driver_info)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_cd46c850","line":173,"in_reply_to":"bff0334d_652dae93","updated":"2017-04-13 10:21:45.000000000","message":"I will add a min\u003d1 to the conf option","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"44bb21a14e608d4c300390a3b68e86f797c14d96","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":173,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":174,"context_line":"    def _get_system():"},{"line_number":175,"context_line":"        if address not in REDFISH_CONNECTIONS:"},{"line_number":176,"context_line":"            _connect(driver_info)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_28bc0f68","line":175,"updated":"2017-04-13 00:41:21.000000000","message":"Looks like race condition possible here. Assume that no address in REDFISH_CONNECTIONS and we have multiple nodes with the same address. One green thread execute l175, trying to get connection, green thread switching occurs inside sushy before return, second thread executes l175 and blocked on function lock. After lock released, second thread trying to connect again and maybe etc if multiple thread blocked on the lock.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"68ed42a20c8af2c1be5ba08056ed7498a593d820","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":173,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":174,"context_line":"    def _get_system():"},{"line_number":175,"context_line":"        if address not in REDFISH_CONNECTIONS:"},{"line_number":176,"context_line":"            _connect(driver_info)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_f35bb851","line":175,"in_reply_to":"9ff52f3f_28188f7f","updated":"2017-04-13 01:43:54.000000000","message":"Sorry, there is recheck l139.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4080f69e50e7c0189cfb9a8fdd032ddbc6aee33e","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":173,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":174,"context_line":"    def _get_system():"},{"line_number":175,"context_line":"        if address not in REDFISH_CONNECTIONS:"},{"line_number":176,"context_line":"            _connect(driver_info)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_28188f7f","line":175,"in_reply_to":"9ff52f3f_28bc0f68","updated":"2017-04-13 00:46:07.000000000","message":"This may happens even if first connect attempt was successfully.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"ad62af6660cafec536bd55ee9e12790ddc15ed02","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":173,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":174,"context_line":"    def _get_system():"},{"line_number":175,"context_line":"        if address not in REDFISH_CONNECTIONS:"},{"line_number":176,"context_line":"            _connect(driver_info)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_c0044ac9","line":175,"in_reply_to":"9ff52f3f_6df21c09","updated":"2017-04-13 12:52:54.000000000","message":"I kind of disagree of removing l175 here. The reason being if multiple threads are trying to access the same address in REDFISH_CONNECTIONS and when that address is already existing, then all those threads will keep on starving for the other ones to release the lock and get hold of the _connect func, even tho the address (or the Sushy object) is already initialized long back. please refer: https://en.wikipedia.org/wiki/Double-checked_locking\n\nAltho, I know there is a little risk in double-checking mechanism of possibly getting hold of some half-baked object (partially initialized) but thats a very, very corner case, IMO compared to waiting of all other threads for an already existing address in REDFISH_CONNECTIONS. What say?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":173,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":174,"context_line":"    def _get_system():"},{"line_number":175,"context_line":"        if address not in REDFISH_CONNECTIONS:"},{"line_number":176,"context_line":"            _connect(driver_info)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_6df21c09","line":175,"in_reply_to":"9ff52f3f_f35bb851","updated":"2017-04-13 10:21:45.000000000","message":"Right, actually this if here (l175) is not even needed because as you pointed out, there\u0027s a check inside the function which contains a lock (L139). So, I don\u0027t think we will have this race.\n\nI can remove this L175 if here because in any case, if a connection already exist _connect() will be no-op.\n\nAgreed ?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        try:"},{"line_number":179,"context_line":"            return REDFISH_CONNECTIONS[address].get_system(system_id)"},{"line_number":180,"context_line":"        except sushy.exceptions.ResourceNotFoundError as e:"},{"line_number":181,"context_line":"            LOG.error(_LE(\u0027The Redfish System %(system)s was not found for \u0027"},{"line_number":182,"context_line":"                          \u0027node %(node)s. Error %(error)s\u0027),"},{"line_number":183,"context_line":"                      {\u0027system\u0027: driver_info[\u0027system_id\u0027],"},{"line_number":184,"context_line":"                       \u0027node\u0027: node.uuid, \u0027error\u0027: e})"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_50070619","line":181,"updated":"2017-04-12 17:52:16.000000000","message":"might be useful to s/%(system)s/\"%(system)s\"/ because we don\u0027t know what they set that to. (Unless you check that it is a valid path in parse_driver_info()).","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        try:"},{"line_number":179,"context_line":"            return REDFISH_CONNECTIONS[address].get_system(system_id)"},{"line_number":180,"context_line":"        except sushy.exceptions.ResourceNotFoundError as e:"},{"line_number":181,"context_line":"            LOG.error(_LE(\u0027The Redfish System %(system)s was not found for \u0027"},{"line_number":182,"context_line":"                          \u0027node %(node)s. Error %(error)s\u0027),"},{"line_number":183,"context_line":"                      {\u0027system\u0027: driver_info[\u0027system_id\u0027],"},{"line_number":184,"context_line":"                       \u0027node\u0027: node.uuid, \u0027error\u0027: e})"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_0dd95082","line":181,"in_reply_to":"bff0334d_50070619","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        except sushy.exceptions.ResourceNotFoundError as e:"},{"line_number":181,"context_line":"            LOG.error(_LE(\u0027The Redfish System %(system)s was not found for \u0027"},{"line_number":182,"context_line":"                          \u0027node %(node)s. Error %(error)s\u0027),"},{"line_number":183,"context_line":"                      {\u0027system\u0027: driver_info[\u0027system_id\u0027],"},{"line_number":184,"context_line":"                       \u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":185,"context_line":"            raise exception.RedfishError(error\u003de)"},{"line_number":186,"context_line":"        except sushy.exceptions.ConnectionError as e:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_d03316f5","line":183,"updated":"2017-04-12 17:52:16.000000000","message":"s/driver_info[\u0027system_id\u0027]/system_id/","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        except sushy.exceptions.ResourceNotFoundError as e:"},{"line_number":181,"context_line":"            LOG.error(_LE(\u0027The Redfish System %(system)s was not found for \u0027"},{"line_number":182,"context_line":"                          \u0027node %(node)s. Error %(error)s\u0027),"},{"line_number":183,"context_line":"                      {\u0027system\u0027: driver_info[\u0027system_id\u0027],"},{"line_number":184,"context_line":"                       \u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":185,"context_line":"            raise exception.RedfishError(error\u003de)"},{"line_number":186,"context_line":"        except sushy.exceptions.ConnectionError as e:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_add1445a","line":183,"in_reply_to":"bff0334d_d03316f5","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            raise exception.RedfishError(error\u003de)"},{"line_number":186,"context_line":"        except sushy.exceptions.ConnectionError as e:"},{"line_number":187,"context_line":"            LOG.warning("},{"line_number":188,"context_line":"                _LW(\u0027Got a connection error when trying to fetch the System \u0027"},{"line_number":189,"context_line":"                    \u0027%(system)s from Redfish at %(address)s that represents \u0027"},{"line_number":190,"context_line":"                    \u0027the node %(node)s. Error %(error)s\u0027),"},{"line_number":191,"context_line":"                {\u0027system\u0027: system_id, \u0027address\u0027: address,"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_b043f23e","line":188,"updated":"2017-04-12 17:52:16.000000000","message":"might be clearer as \u0027For node %(node)s, got a connection error from Redfish at address \u0027%address)s\u0027 when fetching System \u0027%(system)s\u0027.\u0027","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            raise exception.RedfishError(error\u003de)"},{"line_number":186,"context_line":"        except sushy.exceptions.ConnectionError as e:"},{"line_number":187,"context_line":"            LOG.warning("},{"line_number":188,"context_line":"                _LW(\u0027Got a connection error when trying to fetch the System \u0027"},{"line_number":189,"context_line":"                    \u0027%(system)s from Redfish at %(address)s that represents \u0027"},{"line_number":190,"context_line":"                    \u0027the node %(node)s. Error %(error)s\u0027),"},{"line_number":191,"context_line":"                {\u0027system\u0027: system_id, \u0027address\u0027: address,"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_8dd6804f","line":188,"in_reply_to":"bff0334d_b043f23e","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                    \u0027the node %(node)s. Error %(error)s\u0027),"},{"line_number":191,"context_line":"                {\u0027system\u0027: system_id, \u0027address\u0027: address,"},{"line_number":192,"context_line":"                 \u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":193,"context_line":"            _connect(driver_info, reconnect\u003dTrue)"},{"line_number":194,"context_line":"            raise exception.RedfishConnectionError(node\u003dnode.uuid, error\u003de)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_505826f8","line":193,"updated":"2017-04-12 17:52:16.000000000","message":"this could raise RedfishConnectionError, we\u0027re good with that? or do we want to handle it?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                    \u0027the node %(node)s. Error %(error)s\u0027),"},{"line_number":191,"context_line":"                {\u0027system\u0027: system_id, \u0027address\u0027: address,"},{"line_number":192,"context_line":"                 \u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":193,"context_line":"            _connect(driver_info, reconnect\u003dTrue)"},{"line_number":194,"context_line":"            raise exception.RedfishConnectionError(node\u003dnode.uuid, error\u003de)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_ed53cce1","line":193,"in_reply_to":"9ff52f3f_8e2a03e5","updated":"2017-04-13 10:21:45.000000000","message":"@Ruby, yes we are good with it, that will trigger the retry again unless all attempts has been tried and then the error will bubble up (which is what we want).\n\n@Yuriy see comment at L175","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"fb645e7d2db13f5de17bea42bf9acaa43a0df79c","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                    \u0027the node %(node)s. Error %(error)s\u0027),"},{"line_number":191,"context_line":"                {\u0027system\u0027: system_id, \u0027address\u0027: address,"},{"line_number":192,"context_line":"                 \u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":193,"context_line":"            _connect(driver_info, reconnect\u003dTrue)"},{"line_number":194,"context_line":"            raise exception.RedfishConnectionError(node\u003dnode.uuid, error\u003de)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_8e2a03e5","line":193,"in_reply_to":"bff0334d_505826f8","updated":"2017-04-13 02:30:05.000000000","message":"I think this reconnect can be dangerous in concurrent environment because we can share the same connection between nodes, nodes can have right and wrong credentials. For example one green thread trying to get_system(), thread switching occurs inside sushy l179, second thread works with node that have wrong creds and does reconnect ... oops connections that uses first thread removed. The same inside power/management operations with get than set.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    try:"},{"line_number":197,"context_line":"        return _get_system()"},{"line_number":198,"context_line":"    except exception.RedfishConnectionError as e:"},{"line_number":199,"context_line":"        with excutils.save_and_reraise_exception():"},{"line_number":200,"context_line":"            LOG.error(_LE(\u0027Failed to connect to Redfish at %(address)s for \u0027"},{"line_number":201,"context_line":"                          \u0027node %(node)s. Error: %(error)s\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_10805ef4","line":198,"updated":"2017-04-12 17:52:16.000000000","message":"besides credential changes, are there other reasons that the connection would error out that retrying will help? Even with credential changes, if we retry once and it still doesn\u0027t work, why would retrying more help?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    try:"},{"line_number":197,"context_line":"        return _get_system()"},{"line_number":198,"context_line":"    except exception.RedfishConnectionError as e:"},{"line_number":199,"context_line":"        with excutils.save_and_reraise_exception():"},{"line_number":200,"context_line":"            LOG.error(_LE(\u0027Failed to connect to Redfish at %(address)s for \u0027"},{"line_number":201,"context_line":"                          \u0027node %(node)s. Error: %(error)s\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_4d13d80e","line":198,"in_reply_to":"9ff52f3f_289d2f59","updated":"2017-04-13 10:21:45.000000000","message":"There probably is Non authorized or SSL error... at the moment I don\u0027t have a real baremetal machine for my tests so if you don\u0027t mind I think we could improve this (by exiting earlier) in a follow up patch. Could be ?","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"44bb21a14e608d4c300390a3b68e86f797c14d96","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    try:"},{"line_number":197,"context_line":"        return _get_system()"},{"line_number":198,"context_line":"    except exception.RedfishConnectionError as e:"},{"line_number":199,"context_line":"        with excutils.save_and_reraise_exception():"},{"line_number":200,"context_line":"            LOG.error(_LE(\u0027Failed to connect to Redfish at %(address)s for \u0027"},{"line_number":201,"context_line":"                          \u0027node %(node)s. Error: %(error)s\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_289d2f59","line":198,"in_reply_to":"bff0334d_10805ef4","updated":"2017-04-13 00:41:21.000000000","message":"Is there \"Non authorized\" error in Redfish? If yes, better implement it internally and stop iteration.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"44bb21a14e608d4c300390a3b68e86f797c14d96","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        return _get_system()"},{"line_number":198,"context_line":"    except exception.RedfishConnectionError as e:"},{"line_number":199,"context_line":"        with excutils.save_and_reraise_exception():"},{"line_number":200,"context_line":"            LOG.error(_LE(\u0027Failed to connect to Redfish at %(address)s for \u0027"},{"line_number":201,"context_line":"                          \u0027node %(node)s. Error: %(error)s\u0027),"},{"line_number":202,"context_line":"                      {\u0027address\u0027: address, \u0027node\u0027: node.uuid, \u0027error\u0027: e})"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_a8b49f36","line":200,"range":{"start_line":200,"start_character":22,"end_line":200,"end_character":26},"updated":"2017-04-13 00:41:21.000000000","message":"Log should not be translated now.","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        return _get_system()"},{"line_number":198,"context_line":"    except exception.RedfishConnectionError as e:"},{"line_number":199,"context_line":"        with excutils.save_and_reraise_exception():"},{"line_number":200,"context_line":"            LOG.error(_LE(\u0027Failed to connect to Redfish at %(address)s for \u0027"},{"line_number":201,"context_line":"                          \u0027node %(node)s. Error: %(error)s\u0027),"},{"line_number":202,"context_line":"                      {\u0027address\u0027: address, \u0027node\u0027: node.uuid, \u0027error\u0027: e})"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_4d5e38e7","line":200,"range":{"start_line":200,"start_character":22,"end_line":200,"end_character":26},"in_reply_to":"9ff52f3f_a8b49f36","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"60837f6ff1dc538b5c9020bba6526b9a6168ddc5","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":175,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":176,"context_line":"    def _get_system():"},{"line_number":177,"context_line":"        # _connect() is noop if the connection already exists"},{"line_number":178,"context_line":"        _connect(driver_info)"},{"line_number":179,"context_line":"        try:"},{"line_number":180,"context_line":"            return REDFISH_CONNECTIONS[address].get_system(system_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"9ff52f3f_29599a59","line":177,"updated":"2017-04-13 16:12:42.000000000","message":"looks like you need a read lock and a write lock :)","commit_id":"ac9fa2d5cd33604f99f7410825695406571d2b18"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"81761f86ee9eea3ce0c8971568fd0569b014ea5d","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        stop_max_attempt_number\u003dCONF.redfish.connection_attempts,"},{"line_number":175,"context_line":"        wait_fixed\u003dCONF.redfish.connection_retry_interval * 1000)"},{"line_number":176,"context_line":"    def _get_system():"},{"line_number":177,"context_line":"        # _connect() is noop if the connection already exists"},{"line_number":178,"context_line":"        _connect(driver_info)"},{"line_number":179,"context_line":"        try:"},{"line_number":180,"context_line":"            return REDFISH_CONNECTIONS[address].get_system(system_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7ffa3b31_a1727810","line":177,"in_reply_to":"9ff52f3f_29599a59","updated":"2017-04-13 20:44:50.000000000","message":"I will remove the cache as asked so I will need no lock :D","commit_id":"ac9fa2d5cd33604f99f7410825695406571d2b18"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a9cfed0be131386af33d7361ef6e7c58116d5b36","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    # Check if verify_ca is a Boolean or a file/directory in the file-system"},{"line_number":97,"context_line":"    verify_ca \u003d driver_info.get(\u0027redfish_verify_ca\u0027, True)"},{"line_number":98,"context_line":"    if not isinstance(verify_ca, bool):"},{"line_number":99,"context_line":"        if not os.path.exists(verify_ca):"},{"line_number":100,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":101,"context_line":"                _(\u0027Invalid value \"%(value)s\" set in \u0027"},{"line_number":102,"context_line":"                  \u0027driver_info/redfish_verify_ca on node %(node)s. \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_bdb909ea","line":99,"updated":"2017-04-19 10:22:42.000000000","message":"There is TypeError exception possible in Python2 if \u0027redfish_verify_ca\u0027 is integer.","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bc2f2b37bda68a93cc8cdb3d4ae22cceb3d17e70","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    # Check if verify_ca is a Boolean or a file/directory in the file-system"},{"line_number":97,"context_line":"    verify_ca \u003d driver_info.get(\u0027redfish_verify_ca\u0027, True)"},{"line_number":98,"context_line":"    if not isinstance(verify_ca, bool):"},{"line_number":99,"context_line":"        if not os.path.exists(verify_ca):"},{"line_number":100,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":101,"context_line":"                _(\u0027Invalid value \"%(value)s\" set in \u0027"},{"line_number":102,"context_line":"                  \u0027driver_info/redfish_verify_ca on node %(node)s. \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_68e29a03","line":99,"in_reply_to":"7ffa3b31_bdb909ea","updated":"2017-04-19 11:52:02.000000000","message":"Oh right, yeah I should probably check whether it\u0027s a boolean or a path here... I will do it in a follow-up patch together with ruby\u0027s requested changes if I don\u0027t happen to submit a new patch set.\n\nWould that be OK ?","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f2bfa21eecc99e99bb2a7e07c480d436d53a34e3","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":112,"context_line":"            _(\u0027Invalid value type set in driver_info/redfish_verify_ca \u0027"},{"line_number":113,"context_line":"              \u0027on node %(node)s. The value should be a Boolean or the path \u0027"},{"line_number":114,"context_line":"              \u0027to a file/directory, not \"%(value)s\"\u0027))"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    return {\u0027address\u0027: address,"},{"line_number":117,"context_line":"            \u0027system_id\u0027: system_id,"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ffa3b31_ad5d2216","line":114,"updated":"2017-04-20 16:25:57.000000000","message":"don\u0027t you need to specify node \u0026 value?","commit_id":"298e0578313db1adef47dc8c38053dc88659c582"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"15b75cf8b77fd97adfe36186acb9c68af2c5f4d6","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":112,"context_line":"            _(\u0027Invalid value type set in driver_info/redfish_verify_ca \u0027"},{"line_number":113,"context_line":"              \u0027on node %(node)s. The value should be a Boolean or the path \u0027"},{"line_number":114,"context_line":"              \u0027to a file/directory, not \"%(value)s\"\u0027))"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    return {\u0027address\u0027: address,"},{"line_number":117,"context_line":"            \u0027system_id\u0027: system_id,"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ffa3b31_cf6e0dff","line":114,"in_reply_to":"7ffa3b31_6f2019f8","updated":"2017-04-21 10:03:49.000000000","message":"Totally forgot it, I think my brain wasn\u0027t working properly when I was making these changes...\n\nSorry for that","commit_id":"298e0578313db1adef47dc8c38053dc88659c582"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"22bdb60f060a3d813a65297714e5fb307a300f48","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":112,"context_line":"            _(\u0027Invalid value type set in driver_info/redfish_verify_ca \u0027"},{"line_number":113,"context_line":"              \u0027on node %(node)s. The value should be a Boolean or the path \u0027"},{"line_number":114,"context_line":"              \u0027to a file/directory, not \"%(value)s\"\u0027))"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    return {\u0027address\u0027: address,"},{"line_number":117,"context_line":"            \u0027system_id\u0027: system_id,"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ffa3b31_6f2019f8","line":114,"in_reply_to":"7ffa3b31_ad5d2216","updated":"2017-04-21 10:01:16.000000000","message":"++","commit_id":"298e0578313db1adef47dc8c38053dc88659c582"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"30c5fa4872b8233b990bc8bdf7c0aa99f6e5894b","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    elif isinstance(verify_ca, bool):"},{"line_number":108,"context_line":"        # If it\u0027s a boolean it\u0027s grand, we don\u0027t need to do anything"},{"line_number":109,"context_line":"        pass"},{"line_number":110,"context_line":"    else:"},{"line_number":111,"context_line":"        raise exception.InvalidParameterValue("},{"line_number":112,"context_line":"            _(\u0027Invalid value type set in driver_info/redfish_verify_ca \u0027"},{"line_number":113,"context_line":"              \u0027on node %(node)s. The value should be a Boolean or the path \u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"7ffa3b31_0124c1ad","line":110,"updated":"2017-04-21 14:44:58.000000000","message":"nit:\n\n elif not isinstance(verify_ca, bool):","commit_id":"c21149454a02514bd3889a793eadff712e4e6c33"}],"ironic/drivers/redfish.py":[{"author":{"_account_id":18781,"name":"vinay50muddu","email":"vinay50muddu@yahoo.com","username":"vmud213"},"change_message_id":"a105903950eab003e2390e85b62a3e6e412c2b52","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class RedfishHardware(generic.GenericHardware):"},{"line_number":23,"context_line":"    \"\"\"Redfish hardware type.\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    @property"},{"line_number":26,"context_line":"    def supported_console_interfaces(self):"},{"line_number":27,"context_line":"        \"\"\"List of supported console interfaces.\"\"\""},{"line_number":28,"context_line":"        return [noop.NoConsole]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @property"},{"line_number":31,"context_line":"    def supported_management_interfaces(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba2be162_efda4e4a","line":28,"range":{"start_line":25,"start_character":4,"end_line":28,"end_character":31},"updated":"2017-03-03 13:05:09.000000000","message":"I think not required here. Already in AbstractHardwareType. Else if kept as a placeholder for future development, suggest to include the other interfaces as well.","commit_id":"01758fd79ff9165eb0d1dc9b07785c77dca95081"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9a6d19c1871a5a8c1d09b7c189238bff223ef676","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class RedfishHardware(generic.GenericHardware):"},{"line_number":23,"context_line":"    \"\"\"Redfish hardware type.\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    @property"},{"line_number":26,"context_line":"    def supported_console_interfaces(self):"},{"line_number":27,"context_line":"        \"\"\"List of supported console interfaces.\"\"\""},{"line_number":28,"context_line":"        return [noop.NoConsole]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @property"},{"line_number":31,"context_line":"    def supported_management_interfaces(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba2be162_66e044fb","line":28,"range":{"start_line":25,"start_character":4,"end_line":28,"end_character":31},"in_reply_to":"ba2be162_efda4e4a","updated":"2017-03-03 14:17:35.000000000","message":"++ can be removed and once we have a redfish console interace we can add it back.\n\nThanks for the review","commit_id":"01758fd79ff9165eb0d1dc9b07785c77dca95081"}],"ironic/tests/unit/drivers/modules/redfish/test_management.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9ecc05b67b5ed6b0174cf9504e3aff5e44c18adf","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                                  shared\u003dTrue) as task:"},{"line_number":60,"context_line":"            properties \u003d task.driver.get_properties()"},{"line_number":61,"context_line":"            for prop in redfish_utils.COMMON_PROPERTIES:"},{"line_number":62,"context_line":"                self.assertIn(prop, properties)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @mock.patch.object(redfish_utils, \u0027parse_driver_info\u0027, autospec\u003dTrue)"},{"line_number":65,"context_line":"    def test_validate(self, mock_parse_driver_info):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_a137b1e3","line":62,"updated":"2017-04-19 01:33:09.000000000","message":"I think we can just do self.assertEqual(redfish_utils.COMMON_PROPERTIES, properties) ?","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"5e96c1545efd16e9d6fa200a707681e943b360d4","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                                  shared\u003dTrue) as task:"},{"line_number":60,"context_line":"            properties \u003d task.driver.get_properties()"},{"line_number":61,"context_line":"            for prop in redfish_utils.COMMON_PROPERTIES:"},{"line_number":62,"context_line":"                self.assertIn(prop, properties)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @mock.patch.object(redfish_utils, \u0027parse_driver_info\u0027, autospec\u003dTrue)"},{"line_number":65,"context_line":"    def test_validate(self, mock_parse_driver_info):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_91ccfc61","line":62,"in_reply_to":"7ffa3b31_a137b1e3","updated":"2017-04-19 08:11:13.000000000","message":"Indeed we could, it\u0027s way better than the current loop here. I will change it if I happen to submit a new patch-set or a follow-up patch if not.\n\nThanks for pointing this out.","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"}],"ironic/tests/unit/drivers/modules/redfish/test_power.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"952cba1ecc04c0850543acda1735682429f20735","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            ]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"            fake_system \u003d mock.Mock()"},{"line_number":101,"context_line":"            mock_get_system.return_value \u003d fake_system"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            for target, expected in expected_values:"},{"line_number":104,"context_line":"                task.driver.power.set_power_state(task, target)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_54855059","line":101,"updated":"2017-04-07 11:01:35.000000000","message":"nit: these two lines do nothing, mock_get_system.return_value is a mock by default","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"55aaf19bea7b182fdcd3680c7623001025ebcd30","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            ]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"            fake_system \u003d mock.Mock()"},{"line_number":101,"context_line":"            mock_get_system.return_value \u003d fake_system"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            for target, expected in expected_values:"},{"line_number":104,"context_line":"                task.driver.power.set_power_state(task, target)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_b4cb7c70","line":101,"in_reply_to":"bff0334d_54855059","updated":"2017-04-07 11:19:35.000000000","message":"Done","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"952cba1ecc04c0850543acda1735682429f20735","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    def test_set_power_state_fail(self, mock_get_system, mock_sushy):"},{"line_number":117,"context_line":"        fake_system \u003d mock.Mock()"},{"line_number":118,"context_line":"        mock_sushy.exceptions.SushyError \u003d MockedSushyError"},{"line_number":119,"context_line":"        fake_system.reset_system.side_effect \u003d MockedSushyError"},{"line_number":120,"context_line":"        mock_get_system.return_value \u003d fake_system"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        with task_manager.acquire(self.context, self.node.uuid,"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_34888c6f","line":119,"updated":"2017-04-07 11:01:35.000000000","message":"nit: MockedSushyError() (because you raise exceptions, not their classes)","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"55aaf19bea7b182fdcd3680c7623001025ebcd30","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    def test_set_power_state_fail(self, mock_get_system, mock_sushy):"},{"line_number":117,"context_line":"        fake_system \u003d mock.Mock()"},{"line_number":118,"context_line":"        mock_sushy.exceptions.SushyError \u003d MockedSushyError"},{"line_number":119,"context_line":"        fake_system.reset_system.side_effect \u003d MockedSushyError"},{"line_number":120,"context_line":"        mock_get_system.return_value \u003d fake_system"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        with task_manager.acquire(self.context, self.node.uuid,"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_94cab86a","line":119,"in_reply_to":"bff0334d_34888c6f","updated":"2017-04-07 11:19:35.000000000","message":"Done","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"952cba1ecc04c0850543acda1735682429f20735","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        fake_system \u003d mock.Mock()"},{"line_number":118,"context_line":"        mock_sushy.exceptions.SushyError \u003d MockedSushyError"},{"line_number":119,"context_line":"        fake_system.reset_system.side_effect \u003d MockedSushyError"},{"line_number":120,"context_line":"        mock_get_system.return_value \u003d fake_system"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        with task_manager.acquire(self.context, self.node.uuid,"},{"line_number":123,"context_line":"                                  shared\u003dTrue) as task:"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_147fc867","line":120,"updated":"2017-04-07 11:01:35.000000000","message":"ditto","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"55aaf19bea7b182fdcd3680c7623001025ebcd30","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        fake_system \u003d mock.Mock()"},{"line_number":118,"context_line":"        mock_sushy.exceptions.SushyError \u003d MockedSushyError"},{"line_number":119,"context_line":"        fake_system.reset_system.side_effect \u003d MockedSushyError"},{"line_number":120,"context_line":"        mock_get_system.return_value \u003d fake_system"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        with task_manager.acquire(self.context, self.node.uuid,"},{"line_number":123,"context_line":"                                  shared\u003dTrue) as task:"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_74c5f45a","line":120,"in_reply_to":"bff0334d_147fc867","updated":"2017-04-07 11:19:35.000000000","message":"Done","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"952cba1ecc04c0850543acda1735682429f20735","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    @mock.patch.object(redfish_utils, \u0027get_system\u0027, autospec\u003dTrue)"},{"line_number":132,"context_line":"    def test_reboot(self, mock_get_system):"},{"line_number":133,"context_line":"        fake_system \u003d mock.Mock()"},{"line_number":134,"context_line":"        mock_get_system.return_value \u003d fake_system"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        with task_manager.acquire(self.context, self.node.uuid,"},{"line_number":137,"context_line":"                                  shared\u003dTrue) as task:"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_f481044c","line":134,"updated":"2017-04-07 11:01:35.000000000","message":"redundant","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"55aaf19bea7b182fdcd3680c7623001025ebcd30","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    @mock.patch.object(redfish_utils, \u0027get_system\u0027, autospec\u003dTrue)"},{"line_number":132,"context_line":"    def test_reboot(self, mock_get_system):"},{"line_number":133,"context_line":"        fake_system \u003d mock.Mock()"},{"line_number":134,"context_line":"        mock_get_system.return_value \u003d fake_system"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        with task_manager.acquire(self.context, self.node.uuid,"},{"line_number":137,"context_line":"                                  shared\u003dTrue) as task:"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_54a2f0af","line":134,"in_reply_to":"bff0334d_f481044c","updated":"2017-04-07 11:19:35.000000000","message":"Done","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"952cba1ecc04c0850543acda1735682429f20735","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        fake_system \u003d mock.Mock()"},{"line_number":159,"context_line":"        mock_sushy.exceptions.SushyError \u003d MockedSushyError"},{"line_number":160,"context_line":"        fake_system.reset_system.side_effect \u003d MockedSushyError"},{"line_number":161,"context_line":"        mock_get_system.return_value \u003d fake_system"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        with task_manager.acquire(self.context, self.node.uuid,"},{"line_number":164,"context_line":"                                  shared\u003dTrue) as task:"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_d49840c1","line":161,"updated":"2017-04-07 11:01:35.000000000","message":"ditto","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"55aaf19bea7b182fdcd3680c7623001025ebcd30","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        fake_system \u003d mock.Mock()"},{"line_number":159,"context_line":"        mock_sushy.exceptions.SushyError \u003d MockedSushyError"},{"line_number":160,"context_line":"        fake_system.reset_system.side_effect \u003d MockedSushyError"},{"line_number":161,"context_line":"        mock_get_system.return_value \u003d fake_system"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        with task_manager.acquire(self.context, self.node.uuid,"},{"line_number":164,"context_line":"                                  shared\u003dTrue) as task:"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_34a52cb6","line":161,"in_reply_to":"bff0334d_d49840c1","updated":"2017-04-07 11:19:35.000000000","message":"Done","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9ecc05b67b5ed6b0174cf9504e3aff5e44c18adf","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                                  shared\u003dTrue) as task:"},{"line_number":60,"context_line":"            properties \u003d task.driver.get_properties()"},{"line_number":61,"context_line":"            for prop in redfish_utils.COMMON_PROPERTIES:"},{"line_number":62,"context_line":"                self.assertIn(prop, properties)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @mock.patch.object(redfish_utils, \u0027parse_driver_info\u0027, autospec\u003dTrue)"},{"line_number":65,"context_line":"    def test_validate(self, mock_parse_driver_info):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_213281a8","line":62,"updated":"2017-04-19 01:33:09.000000000","message":"I think we can just do self.assertEqual(redfish_utils.COMMON_PROPERTIES, properties) ?","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"46a500db69b6b179cd8ea7f8020acdc4f156ecac","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                                  shared\u003dTrue) as task:"},{"line_number":60,"context_line":"            properties \u003d task.driver.get_properties()"},{"line_number":61,"context_line":"            for prop in redfish_utils.COMMON_PROPERTIES:"},{"line_number":62,"context_line":"                self.assertIn(prop, properties)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @mock.patch.object(redfish_utils, \u0027parse_driver_info\u0027, autospec\u003dTrue)"},{"line_number":65,"context_line":"    def test_validate(self, mock_parse_driver_info):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_47ad6099","line":62,"in_reply_to":"7ffa3b31_110a2c89","updated":"2017-04-20 14:36:32.000000000","message":"Actually, apparent get_properties() also returns the properties from other interfaces, like the deploy one which contains \"deploy_kernel\" and \"deploy_ramdisk\"...\n\nThat\u0027s why in the redfish tests we are checking for the redfish ones specifically.","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"5e96c1545efd16e9d6fa200a707681e943b360d4","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                                  shared\u003dTrue) as task:"},{"line_number":60,"context_line":"            properties \u003d task.driver.get_properties()"},{"line_number":61,"context_line":"            for prop in redfish_utils.COMMON_PROPERTIES:"},{"line_number":62,"context_line":"                self.assertIn(prop, properties)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @mock.patch.object(redfish_utils, \u0027parse_driver_info\u0027, autospec\u003dTrue)"},{"line_number":65,"context_line":"    def test_validate(self, mock_parse_driver_info):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_110a2c89","line":62,"in_reply_to":"7ffa3b31_213281a8","updated":"2017-04-19 08:11:13.000000000","message":"++ same as in test_management.py","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"}],"ironic/tests/unit/drivers/modules/redfish/test_utils.py":[{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"a8539095410c4ba74b22c38b96aad32af868d866","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.REDFISH_CONNECTIONS\u0027)"},{"line_number":152,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.sushy\u0027)"},{"line_number":153,"context_line":"    def test__connect(self, mock_sushy, mock_redfish_conns):"},{"line_number":154,"context_line":"        proxy_dict \u003d _create_proxy_dict_for_mock(mock_redfish_conns)"},{"line_number":155,"context_line":"        redfish_utils._connect(self.parsed_driver_info)"},{"line_number":156,"context_line":"        expected_params \u003d {"},{"line_number":157,"context_line":"            \u0027password\u0027: self.parsed_driver_info[\u0027password\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_a1906944","line":154,"range":{"start_line":153,"start_character":40,"end_line":154,"end_character":68},"updated":"2017-03-10 09:34:04.000000000","message":"I haven\u0027t tested tho.. but just an afterthought. You may not have to have ``_create_proxy_dict_for_mock`` if you set the ``spec`` param to ``dict`` of mock.patch [0]\n\n[0] https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e54ce13177b79b7965d4dbf933ce7bf60dbd2f14","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.REDFISH_CONNECTIONS\u0027)"},{"line_number":152,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.sushy\u0027)"},{"line_number":153,"context_line":"    def test__connect(self, mock_sushy, mock_redfish_conns):"},{"line_number":154,"context_line":"        proxy_dict \u003d _create_proxy_dict_for_mock(mock_redfish_conns)"},{"line_number":155,"context_line":"        redfish_utils._connect(self.parsed_driver_info)"},{"line_number":156,"context_line":"        expected_params \u003d {"},{"line_number":157,"context_line":"            \u0027password\u0027: self.parsed_driver_info[\u0027password\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_2e32a15f","line":154,"range":{"start_line":153,"start_character":40,"end_line":154,"end_character":68},"in_reply_to":"9a30ddce_2e2d4195","updated":"2017-03-10 11:13:40.000000000","message":"Tried it locally, no dice. I think the spec\u003ddict causes the mock instance created to only have the dictionary magic methods available (__getitem__, __setitem__ etc...) instead of everything, but doesn\u0027t serve as a proxy.","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":16635,"name":"deray","email":"debayan.ray@gmail.com","username":"deray"},"change_message_id":"3c42bac8b1ca0e3e9e390bce6a3d622f87e9a588","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.REDFISH_CONNECTIONS\u0027)"},{"line_number":152,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.sushy\u0027)"},{"line_number":153,"context_line":"    def test__connect(self, mock_sushy, mock_redfish_conns):"},{"line_number":154,"context_line":"        proxy_dict \u003d _create_proxy_dict_for_mock(mock_redfish_conns)"},{"line_number":155,"context_line":"        redfish_utils._connect(self.parsed_driver_info)"},{"line_number":156,"context_line":"        expected_params \u003d {"},{"line_number":157,"context_line":"            \u0027password\u0027: self.parsed_driver_info[\u0027password\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_64ad6c9a","line":154,"range":{"start_line":153,"start_character":40,"end_line":154,"end_character":68},"in_reply_to":"9a30ddce_2e32a15f","updated":"2017-03-13 06:55:51.000000000","message":"yeah.. true!! my bad, I haven\u0027t paid heed to the fact that you are trying to wrap that around an actual dict and facilitating the assertion. Anyway, if I may want to still insist then it can turn out to be like:\n\n    proxy_dict \u003d {}\n    ...\n    ...\n    def tearDown(self):\n      super(RedfishUtilsTestCase, self).tearDown()\n      proxy_dict.clear()\n    ...\n    ...\n    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.REDFISH_CONNECTIONS\u0027,\n                new\u003dproxy_dict)  # using ``new`` keyword\n    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.sushy\u0027)\n    def test__connect(self, mock_sushy):  # remove ``mock_redfish_conns``\n      # proxy_dict \u003d _create_proxy_dict_for_mock(mock_redfish_conns)  # omit this\n      ...\n      self.assertIn(self.parsed_driver_info[\u0027root_uri\u0027], proxy_dict)\n\n2 more examples from the same file (test_utils.py):\n\n  - \n\n    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.REDFISH_CONNECTIONS\u0027,\n                new\u003dproxy_dict)\n    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.sushy\u0027)\n    def test__connect_cached(self, mock_sushy):\n      # Cache a fake connection\n      proxy_dict[self.parsed_driver_info[\u0027root_uri\u0027]] \u003d mock.Mock()\n      redfish_utils._connect(self.parsed_driver_info)\n      self.assertEqual(0, mock_sushy.Sushy.call_count)\n\n  - \n\n    @mock.patch.object(redfish_utils, \u0027_connect\u0027, autospec\u003dTrue)\n    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.REDFISH_CONNECTIONS\u0027,\n                new\u003dproxy_dict)\n    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.sushy\u0027)\n    def test_get_system(self, mock_sushy, mock__connect):\n      fake_conn \u003d mock.Mock()\n      fake_system \u003d mock.Mock()\n      fake_conn.get_system.return_value \u003d fake_system\n\n      def connect(driver_info):\n            # Cache the fake connection\n            proxy_dict[self.parsed_driver_info[\u0027root_uri\u0027]] \u003d fake_conn\n\n      mock__connect.side_effect \u003d connect\n      response \u003d redfish_utils.get_system(self.node)\n\n      self.assertEqual(fake_system, response)\n      mock__connect.assert_called_once_with(self.parsed_driver_info)\n      fake_conn.get_system.assert_called_once_with(\u0027FAKESYSTEM\u0027)\n\nI have tested locally after modifying all the test cases of the file and it passes :). Again, its your wish if you want to change it or not. Inherently, whatever you are doing with your own sweet handcrafted logic, the same gets done by mock framework.","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"364653be43a8986853038837fd95658be68c9cbd","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.REDFISH_CONNECTIONS\u0027)"},{"line_number":152,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.sushy\u0027)"},{"line_number":153,"context_line":"    def test__connect(self, mock_sushy, mock_redfish_conns):"},{"line_number":154,"context_line":"        proxy_dict \u003d _create_proxy_dict_for_mock(mock_redfish_conns)"},{"line_number":155,"context_line":"        redfish_utils._connect(self.parsed_driver_info)"},{"line_number":156,"context_line":"        expected_params \u003d {"},{"line_number":157,"context_line":"            \u0027password\u0027: self.parsed_driver_info[\u0027password\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a30ddce_2e2d4195","line":154,"range":{"start_line":153,"start_character":40,"end_line":154,"end_character":68},"in_reply_to":"9a30ddce_a1906944","updated":"2017-03-10 10:57:12.000000000","message":"Interesting, I can try that. Thanks!","commit_id":"9c26193ef6876a9ddd75b01ffd990c00def914b6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"952cba1ecc04c0850543acda1735682429f20735","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        self.config(connection_attempts\u003d1, group\u003d\u0027redfish\u0027)"},{"line_number":61,"context_line":"        self.config(connection_retry_interval\u003d0, group\u003d\u0027redfish\u0027)"},{"line_number":62,"context_line":"        mgr_utils.mock_the_extension_manager("},{"line_number":63,"context_line":"            driver\u003d\u0027redfish\u0027, namespace\u003d\u0027ironic.hardware.types\u0027)"},{"line_number":64,"context_line":"        self.node \u003d obj_utils.create_test_node("},{"line_number":65,"context_line":"            self.context, driver\u003d\u0027redfish\u0027, driver_info\u003dINFO_DICT)"},{"line_number":66,"context_line":"        self.parsed_driver_info \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_9492b89d","line":63,"updated":"2017-04-07 11:01:35.000000000","message":"why do yiou need to mock the extenstion manager here? redfish.utils should not involve anything around drivers","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"55aaf19bea7b182fdcd3680c7623001025ebcd30","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        self.config(connection_attempts\u003d1, group\u003d\u0027redfish\u0027)"},{"line_number":61,"context_line":"        self.config(connection_retry_interval\u003d0, group\u003d\u0027redfish\u0027)"},{"line_number":62,"context_line":"        mgr_utils.mock_the_extension_manager("},{"line_number":63,"context_line":"            driver\u003d\u0027redfish\u0027, namespace\u003d\u0027ironic.hardware.types\u0027)"},{"line_number":64,"context_line":"        self.node \u003d obj_utils.create_test_node("},{"line_number":65,"context_line":"            self.context, driver\u003d\u0027redfish\u0027, driver_info\u003dINFO_DICT)"},{"line_number":66,"context_line":"        self.parsed_driver_info \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_7473b44e","line":63,"in_reply_to":"bff0334d_9492b89d","updated":"2017-04-07 11:19:35.000000000","message":"Right, yeah I think this can be removed... I think I added because I thought I needed it in order to enable the hardware type.","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"952cba1ecc04c0850543acda1735682429f20735","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                               redfish_utils.parse_driver_info, self.node)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.REDFISH_CONNECTIONS\u0027)"},{"line_number":112,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.sushy\u0027)"},{"line_number":113,"context_line":"    def test__connect(self, mock_sushy, mock_redfish_conns):"},{"line_number":114,"context_line":"        proxy_dict \u003d _create_proxy_dict_for_mock(mock_redfish_conns)"},{"line_number":115,"context_line":"        redfish_utils._connect(self.parsed_driver_info)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_748df479","line":112,"updated":"2017-04-07 11:01:35.000000000","message":"please split connect tests into a separate test class with these two mocks on top of it","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"55aaf19bea7b182fdcd3680c7623001025ebcd30","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                               redfish_utils.parse_driver_info, self.node)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.REDFISH_CONNECTIONS\u0027)"},{"line_number":112,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.sushy\u0027)"},{"line_number":113,"context_line":"    def test__connect(self, mock_sushy, mock_redfish_conns):"},{"line_number":114,"context_line":"        proxy_dict \u003d _create_proxy_dict_for_mock(mock_redfish_conns)"},{"line_number":115,"context_line":"        redfish_utils._connect(self.parsed_driver_info)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_9478782a","line":112,"in_reply_to":"bff0334d_748df479","updated":"2017-04-07 11:19:35.000000000","message":"Done","commit_id":"0e607a0ac3667886159b3ea8d9c02f173aab13f7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"de086ce415f8fd171d6418b1f0a88488425a6476","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @mock.patch.object(redfish_utils, \u0027_connect\u0027, autospec\u003dTrue)"},{"line_number":109,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.REDFISH_CONNECTIONS\u0027)"},{"line_number":110,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.sushy\u0027)"},{"line_number":111,"context_line":"    def test_get_system(self, mock_sushy, mock_redfish_conns, mock__connect):"},{"line_number":112,"context_line":"        proxy_conns_dict \u003d _create_proxy_dict_for_mock(mock_redfish_conns)"},{"line_number":113,"context_line":"        fake_conn \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_c98425b4","line":110,"updated":"2017-04-07 14:20:43.000000000","message":"nit: I think we can do a similar split with these 3 tests","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"638962bdad15437b380f03fa5b546556d58f6ce2","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @mock.patch.object(redfish_utils, \u0027_connect\u0027, autospec\u003dTrue)"},{"line_number":109,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.REDFISH_CONNECTIONS\u0027)"},{"line_number":110,"context_line":"    @mock.patch(\u0027ironic.drivers.modules.redfish.utils.sushy\u0027)"},{"line_number":111,"context_line":"    def test_get_system(self, mock_sushy, mock_redfish_conns, mock__connect):"},{"line_number":112,"context_line":"        proxy_conns_dict \u003d _create_proxy_dict_for_mock(mock_redfish_conns)"},{"line_number":113,"context_line":"        fake_conn \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_9e3c0ec0","line":110,"in_reply_to":"bff0334d_c98425b4","updated":"2017-04-07 14:50:26.000000000","message":"yeah, if I happen to submit a new patch-set I can split it out","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9ecc05b67b5ed6b0174cf9504e3aff5e44c18adf","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.parsed_driver_info[\u0027verify_ca\u0027] \u003d fake_path"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        response \u003d redfish_utils.parse_driver_info(self.node)"},{"line_number":87,"context_line":"        self.assertEqual(self.parsed_driver_info, response)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @mock.patch.object(os.path, \u0027exists\u0027, autospec\u003dTrue)"},{"line_number":90,"context_line":"    def test_parse_driver_info_invalid_path_verify_ca(self, mock_path_exists):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_a468df20","line":87,"updated":"2017-04-19 01:33:09.000000000","message":"nit, you could check if mock_path got called","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"5e96c1545efd16e9d6fa200a707681e943b360d4","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.parsed_driver_info[\u0027verify_ca\u0027] \u003d fake_path"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        response \u003d redfish_utils.parse_driver_info(self.node)"},{"line_number":87,"context_line":"        self.assertEqual(self.parsed_driver_info, response)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @mock.patch.object(os.path, \u0027exists\u0027, autospec\u003dTrue)"},{"line_number":90,"context_line":"    def test_parse_driver_info_invalid_path_verify_ca(self, mock_path_exists):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_91f51c86","line":87,"in_reply_to":"7ffa3b31_a468df20","updated":"2017-04-19 08:11:13.000000000","message":"++","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9ecc05b67b5ed6b0174cf9504e3aff5e44c18adf","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        mock_sushy.exceptions.ConnectionError \u003d MockedConnectionError"},{"line_number":130,"context_line":"        fake_conn.get_system.side_effect \u003d MockedConnectionError()"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # Cache a fake connection"},{"line_number":133,"context_line":"        self.assertRaises(exception.RedfishConnectionError,"},{"line_number":134,"context_line":"                          redfish_utils.get_system, self.node)"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_44c8fb20","line":132,"updated":"2017-04-19 01:33:09.000000000","message":"?","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"5e96c1545efd16e9d6fa200a707681e943b360d4","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        mock_sushy.exceptions.ConnectionError \u003d MockedConnectionError"},{"line_number":130,"context_line":"        fake_conn.get_system.side_effect \u003d MockedConnectionError()"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # Cache a fake connection"},{"line_number":133,"context_line":"        self.assertRaises(exception.RedfishConnectionError,"},{"line_number":134,"context_line":"                          redfish_utils.get_system, self.node)"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7ffa3b31_f1358047","line":132,"in_reply_to":"7ffa3b31_44c8fb20","updated":"2017-04-19 08:11:13.000000000","message":"Urgh, left over from previous patch-set... This comment makes no sense anymore.\n\nGood catch","commit_id":"d2515d309278e43dad859026e4c1fc886c646df8"}],"ironic/tests/unit/drivers/third_party_driver_mock_specs.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d8439087e866fee4cd61517e4b3ee660d74e5a08","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    \u0027RESET_FORCE_RESTART\u0027,"},{"line_number":155,"context_line":"    \u0027RESET_NMI\u0027,"},{"line_number":156,"context_line":"    \u0027BOOT_SOURCE_ENABLED_CONTINUOUS\u0027,"},{"line_number":157,"context_line":"    \u0027BOOT_SOURCE_ENABLED_ONCE\u0027"},{"line_number":158,"context_line":")"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_1f877410","line":157,"updated":"2017-03-14 21:36:48.000000000","message":"Add trailing comma please","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    \u0027RESET_FORCE_RESTART\u0027,"},{"line_number":155,"context_line":"    \u0027RESET_NMI\u0027,"},{"line_number":156,"context_line":"    \u0027BOOT_SOURCE_ENABLED_CONTINUOUS\u0027,"},{"line_number":157,"context_line":"    \u0027BOOT_SOURCE_ENABLED_ONCE\u0027"},{"line_number":158,"context_line":")"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_7dfe976c","line":157,"in_reply_to":"3a1ff146_1f877410","updated":"2017-03-15 09:39:05.000000000","message":"Done","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"}],"releasenotes/notes/added-redfish-driver-00ff5e3f7e9d6ee8.yaml":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"8d9167c913f1d2e259560d130b0a0f79dfb7387c","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a redfish hardware type, power and management interface. The"},{"line_number":5,"context_line":"    implementation relies on the sushy library which needs to be manually"},{"line_number":6,"context_line":"    in the ``ironic-conductor`` node, see the ``driver-requirements.txt``"},{"line_number":7,"context_line":"    file."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"ba2be162_6d3c9cc8","line":5,"range":{"start_line":5,"start_character":65,"end_line":5,"end_character":73},"updated":"2017-03-03 16:44:23.000000000","message":"s/manually/installed","commit_id":"69c274c2696a87f61b1e1adc4c64170a7da2d9e5"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"d8439087e866fee4cd61517e4b3ee660d74e5a08","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a redfish hardware type, power and management interface. The"},{"line_number":5,"context_line":"    implementation relies on the sushy library which needs to be installed"},{"line_number":6,"context_line":"    in the ``ironic-conductor`` node, see the ``driver-requirements.txt``"},{"line_number":7,"context_line":"    file."}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3a1ff146_7ff6a1d8","line":6,"range":{"start_line":6,"start_character":4,"end_line":6,"end_character":6},"updated":"2017-03-14 21:36:48.000000000","message":"on","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a1b9d2863edb3cc11dd14fd4fa98854ced92100f","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a redfish hardware type, power and management interface. The"},{"line_number":5,"context_line":"    implementation relies on the sushy library which needs to be installed"},{"line_number":6,"context_line":"    in the ``ironic-conductor`` node, see the ``driver-requirements.txt``"},{"line_number":7,"context_line":"    file."}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3a1ff146_ddf5cb83","line":6,"range":{"start_line":6,"start_character":4,"end_line":6,"end_character":6},"in_reply_to":"3a1ff146_7ff6a1d8","updated":"2017-03-15 09:39:05.000000000","message":"Done","commit_id":"94da7ea2224c859149f5bc040192284d38a0cce2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d4853fb887c822eb8a72e0ea29b1640374606f3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a redfish hardware type, power and management interface. The"},{"line_number":5,"context_line":"    implementation relies on the sushy library which needs to be installed"},{"line_number":6,"context_line":"    on the ``ironic-conductor`` node, see the ``driver-requirements.txt``"},{"line_number":7,"context_line":"    file."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"bff0334d_9964a14b","line":4,"updated":"2017-04-12 17:52:16.000000000","message":"s/Added/Adds/. See [1].\n\nI think it might be worth being more verbose since it is a new feature. Eg,\n\nAdds support for Redfish with: \n\n* ``redfish`` hardware type\n* ``redfish`` power interface that provides hard power [on, off, reboot] and soft power [off, reboot]\n* ``redfish`` management interface to set the boot device (PXE, disk, cd-rom and bios) and its frequency (persistent or not); and NMI injection\n* SSL authentication\n\nIf there is user-facing documentation, we could put a link to that.\n\n[1] https://docs.openstack.org/developer/ironic/dev/faq.html#create-a-new-release-note","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"ec7131fb701430fbb64efe75692901a7d17b3860","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a redfish hardware type, power and management interface. The"},{"line_number":5,"context_line":"    implementation relies on the sushy library which needs to be installed"},{"line_number":6,"context_line":"    on the ``ironic-conductor`` node, see the ``driver-requirements.txt``"},{"line_number":7,"context_line":"    file."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"9ff52f3f_f1bba60b","line":4,"in_reply_to":"9ff52f3f_2df894c2","updated":"2017-04-13 10:57:43.000000000","message":"Btw I can\u0027t add \"with:\", the colon causes the release notes generation to error out :-(","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"dfdff8423e72d18ed0e6cc1139b3b553c6f05bfb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a redfish hardware type, power and management interface. The"},{"line_number":5,"context_line":"    implementation relies on the sushy library which needs to be installed"},{"line_number":6,"context_line":"    on the ``ironic-conductor`` node, see the ``driver-requirements.txt``"},{"line_number":7,"context_line":"    file."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"9ff52f3f_7188b61e","line":4,"in_reply_to":"9ff52f3f_f1bba60b","updated":"2017-04-13 10:58:44.000000000","message":"My bad, it seems to have worked... failed due another mistake (bullet points should end with a blank line)","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"9aadd7aacfc140631d670f74f8366ea5ca4582f1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a redfish hardware type, power and management interface. The"},{"line_number":5,"context_line":"    implementation relies on the sushy library which needs to be installed"},{"line_number":6,"context_line":"    on the ``ironic-conductor`` node, see the ``driver-requirements.txt``"},{"line_number":7,"context_line":"    file."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"9ff52f3f_2df894c2","line":4,"in_reply_to":"bff0334d_9964a14b","updated":"2017-04-13 10:21:45.000000000","message":"Done","commit_id":"c2f5abcd34d420b81715105357cb4c0eef102e0e"}],"requirements.txt":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"99fb79c7cfc5384cb8124b9fa819ea6e2800c5aa","unresolved":false,"context_lines":[{"line_number":30,"context_line":"oslo.utils\u003e\u003d3.18.0 # Apache-2.0"},{"line_number":31,"context_line":"pecan!\u003d1.0.2,!\u003d1.0.3,!\u003d1.0.4,!\u003d1.2,\u003e\u003d1.0.0 # BSD"},{"line_number":32,"context_line":"requests!\u003d2.12.2,!\u003d2.13.0,\u003e\u003d2.10.0 # Apache-2.0"},{"line_number":33,"context_line":"rfc3986\u003e\u003d0.3.1 # Apache-2.0"},{"line_number":34,"context_line":"six\u003e\u003d1.9.0 # MIT"},{"line_number":35,"context_line":"jsonpatch\u003e\u003d1.1 # BSD"},{"line_number":36,"context_line":"WSME\u003e\u003d0.8 # MIT"}],"source_content_type":"text/plain","patch_set":1,"id":"ba2be162_c82a847e","line":33,"updated":"2017-02-28 16:45:21.000000000","message":"Are you going to add sushy to driver-requirements.txt?","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d888e328c467bf39b7041bfc41939fc33bcf9df3","unresolved":false,"context_lines":[{"line_number":30,"context_line":"oslo.utils\u003e\u003d3.18.0 # Apache-2.0"},{"line_number":31,"context_line":"pecan!\u003d1.0.2,!\u003d1.0.3,!\u003d1.0.4,!\u003d1.2,\u003e\u003d1.0.0 # BSD"},{"line_number":32,"context_line":"requests!\u003d2.12.2,!\u003d2.13.0,\u003e\u003d2.10.0 # Apache-2.0"},{"line_number":33,"context_line":"rfc3986\u003e\u003d0.3.1 # Apache-2.0"},{"line_number":34,"context_line":"six\u003e\u003d1.9.0 # MIT"},{"line_number":35,"context_line":"jsonpatch\u003e\u003d1.1 # BSD"},{"line_number":36,"context_line":"WSME\u003e\u003d0.8 # MIT"}],"source_content_type":"text/plain","patch_set":1,"id":"ba2be162_ef03c30b","line":33,"in_reply_to":"ba2be162_c82a847e","updated":"2017-02-28 22:17:01.000000000","message":"Correct, at the moment sushy doesn\u0027t have any version released but as soon as we get one we can add it to driver-requirements.txt.\n\nThis whole patch is just a PoC we still need the spec merged in Ironic first.","commit_id":"b7618bbae9d0003e352c815c45ee10fe3aac5f00"}]}
