)]}'
{"tripleo_ansible/ansible_plugins/modules/baremetal_introspection.py":[{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"39259c10e7a285e9363dc2b24087db8b9e1b9722","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    result \u003d {}"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def introspect_node(node_uuid):"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        retry_count \u003d 0"},{"line_number":39,"context_line":"        status \u003d None"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_b50a3823","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":35},"updated":"2019-10-28 13:11:02.000000000","message":"more of a question than anything else, but why are we using a nested method? Maybe `introspect_nodes` would be better written as a class?","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"a9ec4d99e358079e87e5e9a148636bc99cbadcf4","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    result \u003d {}"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def introspect_node(node_uuid):"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        retry_count \u003d 0"},{"line_number":39,"context_line":"        status \u003d None"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_209b68c9","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":35},"in_reply_to":"3fa7e38b_b50a3823","updated":"2019-10-29 13:25:06.000000000","message":"No particular reason, it seemed like the simplest way at the time. However, I did consider a class and that might be easier to then write tests for.","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"f6ab82f241f558c0c284c36a62f95cb4f43b8e18","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from concurrent import futures"},{"line_number":17,"context_line":"import os"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystoneauth1.identity import generic"},{"line_number":20,"context_line":"from keystoneauth1 import session"},{"line_number":21,"context_line":"from ansible.module_utils.basic import AnsibleModule"},{"line_number":22,"context_line":"import ironic_inspector_client"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_de5cfb4d","line":20,"range":{"start_line":19,"start_character":0,"end_line":20,"end_character":33},"updated":"2019-11-13 01:22:31.000000000","message":"why not to use openstack client?","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"5862eb0c598be84b44f0346550943db51cc75061","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from concurrent import futures"},{"line_number":17,"context_line":"import os"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystoneauth1.identity import generic"},{"line_number":20,"context_line":"from keystoneauth1 import session"},{"line_number":21,"context_line":"from ansible.module_utils.basic import AnsibleModule"},{"line_number":22,"context_line":"import ironic_inspector_client"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_2075a898","line":20,"range":{"start_line":19,"start_character":0,"end_line":20,"end_character":33},"in_reply_to":"3fa7e38b_b4b59334","updated":"2019-11-18 16:49:37.000000000","message":"just to throw yet another wrench in this, I would really like us to use the openstacksdk for as much of these interactions as we can. The sdk is, for the most part, openstack version agnostic, which will allow us to loosely maintain this code across major releases.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"765528a6185c6b4aeb96c9f9bc4dde1bbce478ca","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from concurrent import futures"},{"line_number":17,"context_line":"import os"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystoneauth1.identity import generic"},{"line_number":20,"context_line":"from keystoneauth1 import session"},{"line_number":21,"context_line":"from ansible.module_utils.basic import AnsibleModule"},{"line_number":22,"context_line":"import ironic_inspector_client"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_f994668e","line":20,"range":{"start_line":19,"start_character":0,"end_line":20,"end_character":33},"in_reply_to":"3fa7e38b_de5cfb4d","updated":"2019-11-13 15:55:34.000000000","message":"No reason really. Is there a reason that it is better than the clients? Essentially I used what I was familiar with.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"e174f527f89badfb9d68a343005ffaf5957734dd","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from concurrent import futures"},{"line_number":17,"context_line":"import os"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystoneauth1.identity import generic"},{"line_number":20,"context_line":"from keystoneauth1 import session"},{"line_number":21,"context_line":"from ansible.module_utils.basic import AnsibleModule"},{"line_number":22,"context_line":"import ironic_inspector_client"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_b4b59334","line":20,"range":{"start_line":19,"start_character":0,"end_line":20,"end_character":33},"in_reply_to":"3fa7e38b_de5cfb4d","updated":"2019-11-13 16:29:51.000000000","message":"There is one other thing that is worth considering.\n\nWe want to re-use python code for mistral actions in tripleo-common. These are written to use the native Python clients. So while we can likely change this file, we will need to find a way to use native clients elsewhere.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"f6ab82f241f558c0c284c36a62f95cb4f43b8e18","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from keystoneauth1.identity import generic"},{"line_number":20,"context_line":"from keystoneauth1 import session"},{"line_number":21,"context_line":"from ansible.module_utils.basic import AnsibleModule"},{"line_number":22,"context_line":"import ironic_inspector_client"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def _introspection_client():"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_9e56832a","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":30},"updated":"2019-11-13 01:22:31.000000000","message":"ditto. \n\nhttps://docs.openstack.org/openstacksdk/train/user/proxies/baremetal_introspection.html","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"5862eb0c598be84b44f0346550943db51cc75061","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from keystoneauth1.identity import generic"},{"line_number":20,"context_line":"from keystoneauth1 import session"},{"line_number":21,"context_line":"from ansible.module_utils.basic import AnsibleModule"},{"line_number":22,"context_line":"import ironic_inspector_client"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def _introspection_client():"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_0070aca3","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":30},"in_reply_to":"3fa7e38b_9e56832a","updated":"2019-11-18 16:49:37.000000000","message":"same as above. If we can do this with the SDK we should.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"f6ab82f241f558c0c284c36a62f95cb4f43b8e18","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from keystoneauth1 import session"},{"line_number":21,"context_line":"from ansible.module_utils.basic import AnsibleModule"},{"line_number":22,"context_line":"import ironic_inspector_client"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def _introspection_client():"},{"line_number":26,"context_line":"    auth \u003d generic.Password("},{"line_number":27,"context_line":"        auth_url\u003dos.environ[\"OS_AUTH_URL\"],"},{"line_number":28,"context_line":"        username\u003dos.environ[\"OS_USERNAME\"],"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_be8a5fb9","line":25,"range":{"start_line":23,"start_character":0,"end_line":25,"end_character":2},"updated":"2019-11-13 01:22:31.000000000","message":"Can\u0027t we use os_ironic_inspect module? Is something missed there that we need? https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/cloud/openstack/os_ironic_inspect.py","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"765528a6185c6b4aeb96c9f9bc4dde1bbce478ca","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from keystoneauth1 import session"},{"line_number":21,"context_line":"from ansible.module_utils.basic import AnsibleModule"},{"line_number":22,"context_line":"import ironic_inspector_client"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def _introspection_client():"},{"line_number":26,"context_line":"    auth \u003d generic.Password("},{"line_number":27,"context_line":"        auth_url\u003dos.environ[\"OS_AUTH_URL\"],"},{"line_number":28,"context_line":"        username\u003dos.environ[\"OS_USERNAME\"],"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_397bde7b","line":25,"range":{"start_line":23,"start_character":0,"end_line":25,"end_character":2},"in_reply_to":"3fa7e38b_be8a5fb9","updated":"2019-11-13 15:55:34.000000000","message":"The module itself is probably okay, however the limit is more Ansible generally.\n\nThere is no way for us to introspect nodes in a pool of X nodes at a time.\n\nI believe we need something like this proposal; https://github.com/ansible/proposals/issues/129\n\nIf you know of a way to do that I\u0027d love to hear it.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":14985,"name":"Alex Schultz","email":"aschultz@next-development.com","username":"mwhahaha"},"change_message_id":"431c3222ab89caef154062c407d2e5ba2e7bd756","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        auth_url\u003dos.environ[\"OS_AUTH_URL\"],"},{"line_number":28,"context_line":"        username\u003dos.environ[\"OS_USERNAME\"],"},{"line_number":29,"context_line":"        password\u003dos.environ[\"OS_PASSWORD\"],"},{"line_number":30,"context_line":"        project_name\u003dos.environ[\"OS_PROJECT_NAME\"],"},{"line_number":31,"context_line":"        project_domain_name\u003d\"Default\","},{"line_number":32,"context_line":"        user_domain_name\u003d\"Default\","},{"line_number":33,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_6e77d9d5","line":30,"updated":"2019-10-31 17:02:12.000000000","message":"This assumes *rc files were used instead of clouds.yaml.  Might want to create a helper function to determine which to use","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":14985,"name":"Alex Schultz","email":"aschultz@next-development.com","username":"mwhahaha"},"change_message_id":"8f07199354af44402859c2e97767de5d0abf7daa","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        auth_url\u003dos.environ[\"OS_AUTH_URL\"],"},{"line_number":28,"context_line":"        username\u003dos.environ[\"OS_USERNAME\"],"},{"line_number":29,"context_line":"        password\u003dos.environ[\"OS_PASSWORD\"],"},{"line_number":30,"context_line":"        project_name\u003dos.environ[\"OS_PROJECT_NAME\"],"},{"line_number":31,"context_line":"        project_domain_name\u003d\"Default\","},{"line_number":32,"context_line":"        user_domain_name\u003d\"Default\","},{"line_number":33,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_1db53532","line":30,"in_reply_to":"3fa7e38b_1d60d5ce","updated":"2019-10-31 22:46:07.000000000","message":"You mean loads it into the environment? we aren\u0027t expecting the user to have these vars defined?","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"f6ab82f241f558c0c284c36a62f95cb4f43b8e18","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        auth_url\u003dos.environ[\"OS_AUTH_URL\"],"},{"line_number":28,"context_line":"        username\u003dos.environ[\"OS_USERNAME\"],"},{"line_number":29,"context_line":"        password\u003dos.environ[\"OS_PASSWORD\"],"},{"line_number":30,"context_line":"        project_name\u003dos.environ[\"OS_PROJECT_NAME\"],"},{"line_number":31,"context_line":"        project_domain_name\u003d\"Default\","},{"line_number":32,"context_line":"        user_domain_name\u003d\"Default\","},{"line_number":33,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_3eb8af73","line":30,"in_reply_to":"3fa7e38b_1db53532","updated":"2019-11-13 01:22:31.000000000","message":"For cloud you need to provide \"cloud\" argument. And it doesn\u0027t populate environment variables when using clouds.yaml.\nSee how it\u0027s done in ansible: https://github.com/ansible/ansible/blob/devel/lib/ansible/module_utils/openstack.py#L35:L35","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"765528a6185c6b4aeb96c9f9bc4dde1bbce478ca","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        auth_url\u003dos.environ[\"OS_AUTH_URL\"],"},{"line_number":28,"context_line":"        username\u003dos.environ[\"OS_USERNAME\"],"},{"line_number":29,"context_line":"        password\u003dos.environ[\"OS_PASSWORD\"],"},{"line_number":30,"context_line":"        project_name\u003dos.environ[\"OS_PROJECT_NAME\"],"},{"line_number":31,"context_line":"        project_domain_name\u003d\"Default\","},{"line_number":32,"context_line":"        user_domain_name\u003d\"Default\","},{"line_number":33,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_99e9b21a","line":30,"in_reply_to":"3fa7e38b_3eb8af73","updated":"2019-11-13 15:55:34.000000000","message":"Yeah, good point. I do need to improve this.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":25877,"name":"Luke Short","email":"ekultails@gmail.com","username":"ekultails"},"change_message_id":"7a3b3cd2a7e4af2ed234361b3253c15d02172dd2","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        auth_url\u003dos.environ[\"OS_AUTH_URL\"],"},{"line_number":28,"context_line":"        username\u003dos.environ[\"OS_USERNAME\"],"},{"line_number":29,"context_line":"        password\u003dos.environ[\"OS_PASSWORD\"],"},{"line_number":30,"context_line":"        project_name\u003dos.environ[\"OS_PROJECT_NAME\"],"},{"line_number":31,"context_line":"        project_domain_name\u003d\"Default\","},{"line_number":32,"context_line":"        user_domain_name\u003d\"Default\","},{"line_number":33,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_1d60d5ce","line":30,"in_reply_to":"3fa7e38b_6e77d9d5","updated":"2019-10-31 22:40:41.000000000","message":"I believe the openstacksdk (used by Ansible) automatically loads the clouds.yaml file if found.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"f6ab82f241f558c0c284c36a62f95cb4f43b8e18","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"def main():"},{"line_number":114,"context_line":"    module \u003d AnsibleModule("},{"line_number":115,"context_line":"        argument_spec\u003d{"},{"line_number":116,"context_line":"            \"node_uuids\": {\"type\": \"list\"},"},{"line_number":117,"context_line":"            \"concurrency\": {\"type\": \"int\"},"},{"line_number":118,"context_line":"            \"max_retries\": {\"type\": \"int\"},"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_9e2be393","line":115,"range":{"start_line":115,"start_character":8,"end_line":115,"end_character":23},"updated":"2019-11-13 01:22:31.000000000","message":"nothing about auth is here, need at least cloud name or sort of","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"5862eb0c598be84b44f0346550943db51cc75061","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"def main():"},{"line_number":114,"context_line":"    module \u003d AnsibleModule("},{"line_number":115,"context_line":"        argument_spec\u003d{"},{"line_number":116,"context_line":"            \"node_uuids\": {\"type\": \"list\"},"},{"line_number":117,"context_line":"            \"concurrency\": {\"type\": \"int\"},"},{"line_number":118,"context_line":"            \"max_retries\": {\"type\": \"int\"},"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_409f84b3","line":115,"range":{"start_line":115,"start_character":8,"end_line":115,"end_character":23},"in_reply_to":"3fa7e38b_9e2be393","updated":"2019-11-18 16:49:37.000000000","message":"ansible modules should have a documentation constant within them which is written in YAML. The constant will then have all available options within it allowing us to source the options from the documentation which has the side effect of making our code and our documentation match.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"f6ab82f241f558c0c284c36a62f95cb4f43b8e18","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            \"max_retries\": {\"type\": \"int\"},"},{"line_number":119,"context_line":"            \"node_timeout\": {\"type\": \"int\"},"},{"line_number":120,"context_line":"        },"},{"line_number":121,"context_line":"        supports_check_mode\u003dTrue,"},{"line_number":122,"context_line":"    )"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    introspector \u003d IntrospectNodes("}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_de0abb25","line":121,"range":{"start_line":121,"start_character":7,"end_line":121,"end_character":33},"updated":"2019-11-13 01:22:31.000000000","message":"where does it support check mode?","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"765528a6185c6b4aeb96c9f9bc4dde1bbce478ca","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            \"max_retries\": {\"type\": \"int\"},"},{"line_number":119,"context_line":"            \"node_timeout\": {\"type\": \"int\"},"},{"line_number":120,"context_line":"        },"},{"line_number":121,"context_line":"        supports_check_mode\u003dTrue,"},{"line_number":122,"context_line":"    )"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    introspector \u003d IntrospectNodes("}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_b9e34e34","line":121,"range":{"start_line":121,"start_character":7,"end_line":121,"end_character":33},"in_reply_to":"3fa7e38b_de0abb25","updated":"2019-11-13 15:55:34.000000000","message":"This needs to be removed.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"f6ab82f241f558c0c284c36a62f95cb4f43b8e18","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    introspector \u003d IntrospectNodes("},{"line_number":125,"context_line":"        module,"},{"line_number":126,"context_line":"        module.params[\"concurrency\"],"},{"line_number":127,"context_line":"        module.params[\"max_retries\"],"},{"line_number":128,"context_line":"        module.params[\"node_timeout\"],"},{"line_number":129,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_61252aae","line":126,"range":{"start_line":126,"start_character":0,"end_line":126,"end_character":37},"updated":"2019-11-13 01:22:31.000000000","message":"Is this needed and all these threads above? I think it\u0027s possible just to `start_introspection` for each node and then watch it with `wait_introspection` calls of ironic. No need to reimplement concurrency","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"765528a6185c6b4aeb96c9f9bc4dde1bbce478ca","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    introspector \u003d IntrospectNodes("},{"line_number":125,"context_line":"        module,"},{"line_number":126,"context_line":"        module.params[\"concurrency\"],"},{"line_number":127,"context_line":"        module.params[\"max_retries\"],"},{"line_number":128,"context_line":"        module.params[\"node_timeout\"],"},{"line_number":129,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_5941fa09","line":126,"range":{"start_line":126,"start_character":0,"end_line":126,"end_character":37},"in_reply_to":"3fa7e38b_61252aae","updated":"2019-11-13 15:55:34.000000000","message":"I am not reimplementing concurrency. This is a very simple use of what Python provides.\n\nIf you have 300 nodes you can\u0027t start introspection on all of them at the same time. You need to be able to limit this. By default we limit this to 20 nodes at a time.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"f6ab82f241f558c0c284c36a62f95cb4f43b8e18","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    failed \u003d sum(n[\"failed\"] for n in result.values())"},{"line_number":132,"context_line":"    if failed \u003e 0:"},{"line_number":133,"context_line":"        message \u003d \"Introspection completed with failures. %s node(s) failed.\" % failed"},{"line_number":134,"context_line":"        module.log(\"[ERROR] %s\" % message)"},{"line_number":135,"context_line":"    else:"},{"line_number":136,"context_line":"        message \u003d \"Introspection completed successfully\""},{"line_number":137,"context_line":"        module.log(\"[INFO] %s\" % message)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_7e1aa77c","line":134,"range":{"start_line":134,"start_character":8,"end_line":134,"end_character":42},"updated":"2019-11-13 01:22:31.000000000","message":"it will be in journal only, better to include this in module results","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"5862eb0c598be84b44f0346550943db51cc75061","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    failed \u003d sum(n[\"failed\"] for n in result.values())"},{"line_number":132,"context_line":"    if failed \u003e 0:"},{"line_number":133,"context_line":"        message \u003d \"Introspection completed with failures. %s node(s) failed.\" % failed"},{"line_number":134,"context_line":"        module.log(\"[ERROR] %s\" % message)"},{"line_number":135,"context_line":"    else:"},{"line_number":136,"context_line":"        message \u003d \"Introspection completed successfully\""},{"line_number":137,"context_line":"        module.log(\"[INFO] %s\" % message)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_c0f4d4d1","line":134,"range":{"start_line":134,"start_character":8,"end_line":134,"end_character":42},"in_reply_to":"3fa7e38b_39251e5d","updated":"2019-11-18 16:49:37.000000000","message":"+1, not great given the interaction is expected to come from the client, however, this is a great way to get started, and will allow us to improve later.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"765528a6185c6b4aeb96c9f9bc4dde1bbce478ca","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    failed \u003d sum(n[\"failed\"] for n in result.values())"},{"line_number":132,"context_line":"    if failed \u003e 0:"},{"line_number":133,"context_line":"        message \u003d \"Introspection completed with failures. %s node(s) failed.\" % failed"},{"line_number":134,"context_line":"        module.log(\"[ERROR] %s\" % message)"},{"line_number":135,"context_line":"    else:"},{"line_number":136,"context_line":"        message \u003d \"Introspection completed successfully\""},{"line_number":137,"context_line":"        module.log(\"[INFO] %s\" % message)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_39251e5d","line":134,"range":{"start_line":134,"start_character":8,"end_line":134,"end_character":42},"in_reply_to":"3fa7e38b_7e1aa77c","updated":"2019-11-13 15:55:34.000000000","message":"Indeed, this is another limitation of Ansible IMO. The playbook output shows the UUIDs grouped by pass/fail. If we putput everything here unstructured it would be difficult to follow (for example with 300 nodes).\n\nHowever these log messages do give extra context for anyone debugging and trying to determine exactly what happened.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"f6ab82f241f558c0c284c36a62f95cb4f43b8e18","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        message \u003d \"Introspection completed successfully\""},{"line_number":137,"context_line":"        module.log(\"[INFO] %s\" % message)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    module.exit_json(result\u003dresult, msg\u003dmessage)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"if __name__ \u003d\u003d \"__main__\":"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_3e142f4d","line":139,"range":{"start_line":139,"start_character":4,"end_line":139,"end_character":34},"updated":"2019-11-13 01:22:31.000000000","message":"no fail when not all nodes introspected? not even configurable?","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"5862eb0c598be84b44f0346550943db51cc75061","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        message \u003d \"Introspection completed successfully\""},{"line_number":137,"context_line":"        module.log(\"[INFO] %s\" % message)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    module.exit_json(result\u003dresult, msg\u003dmessage)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"if __name__ \u003d\u003d \"__main__\":"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_c0cb746f","line":139,"range":{"start_line":139,"start_character":4,"end_line":139,"end_character":34},"in_reply_to":"3fa7e38b_39575ecd","updated":"2019-11-18 16:49:37.000000000","message":"It might be best to have the module fail when introspection fails. then we can have the playbook simply retry the interaction.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"765528a6185c6b4aeb96c9f9bc4dde1bbce478ca","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        message \u003d \"Introspection completed successfully\""},{"line_number":137,"context_line":"        module.log(\"[INFO] %s\" % message)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    module.exit_json(result\u003dresult, msg\u003dmessage)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"if __name__ \u003d\u003d \"__main__\":"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_39575ecd","line":139,"range":{"start_line":139,"start_character":4,"end_line":139,"end_character":34},"in_reply_to":"3fa7e38b_3e142f4d","updated":"2019-11-13 15:55:34.000000000","message":"I chose to handle this in the playbook itself, but it could be moved here. I don\u0027thave a strong opinion onthis one.","commit_id":"2f2ab2feba901c58cfd1b4e2dd4a4fca90a9270f"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"88a11c32061ce41a55de2f87870499f10156aab9","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        module.fail_json(msg\u003d\"Authentication appears to be disabled, \""},{"line_number":230,"context_line":"                             \"Please define an ironic_url parameter\")"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    if (module.params[\u0027ironic_url\u0027] and"},{"line_number":233,"context_line":"            module.params[\u0027auth_type\u0027] in [None, \u0027None\u0027]):"},{"line_number":234,"context_line":"        module.params[\u0027auth\u0027] \u003d dict("},{"line_number":235,"context_line":"            endpoint\u003dmodule.params[\u0027ironic_url\u0027]"},{"line_number":236,"context_line":"        )"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    sdk, cloud \u003d openstack_cloud_from_module(module)"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_a83ce191","line":236,"range":{"start_line":232,"start_character":0,"end_line":236,"end_character":9},"updated":"2019-11-22 02:45:15.000000000","message":"this needs to be updated to appease the linters.\n\nhttps://zuul.opendev.org/t/openstack/build/6c189a2f3bf64a63a60527160b4001f1/log/job-output.txt#617","commit_id":"cf35501c59a15f8d10946ee12da56d475d974798"}],"tripleo_ansible/ansible_plugins/modules/os_tripleo_baremetal_node_introspection.py":[{"author":{"_account_id":14985,"name":"Alex Schultz","email":"aschultz@next-development.com","username":"mwhahaha"},"change_message_id":"dbd6dec7276e05bacec9d1563f715e49bbd8aea1","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        retry_count \u003d 0"},{"line_number":156,"context_line":"        status \u003d None"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        while retry_count \u003c\u003d self.max_retries:"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"            if retry_count \u003d\u003d 0:"},{"line_number":161,"context_line":"                self.log(\"INFO Starting introspection %s\" % node_uuid)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_2cac6533","line":158,"range":{"start_line":158,"start_character":0,"end_line":158,"end_character":46},"updated":"2019-11-25 17:33:07.000000000","message":"Would it be better to use tenacity or something to handle this and implement a better backoff strategy?  Though currently this is a module rather than an action plugin so it\u0027d be harder to ensure tenacity is available.\n\n\nTBH this might be better suited as an action plugin because it\u0027s an API stuff rather than needing to be run on the target node.","commit_id":"2daf272ad7c5b73312407bba6d6fd99ad6677d8a"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"8f1470f30809f6d8b3d7fc894335b970b0a2621b","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        retry_count \u003d 0"},{"line_number":156,"context_line":"        status \u003d None"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        while retry_count \u003c\u003d self.max_retries:"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"            if retry_count \u003d\u003d 0:"},{"line_number":161,"context_line":"                self.log(\"INFO Starting introspection %s\" % node_uuid)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_872d3247","line":158,"range":{"start_line":158,"start_character":0,"end_line":158,"end_character":46},"in_reply_to":"3fa7e38b_2cac6533","updated":"2019-11-25 17:50:01.000000000","message":"+1 to what Alex said, this may be a really good candidate for an action plugin.","commit_id":"2daf272ad7c5b73312407bba6d6fd99ad6677d8a"},{"author":{"_account_id":10969,"name":"Shnaidman Sagi (Sergey)","display_name":"Shnaidman Sagi","email":"sshnaidm@redhat.com","username":"sergsh"},"change_message_id":"e3ec0c550324e006f1fd065633a8562f38402cb3","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        retry_count \u003d 0"},{"line_number":156,"context_line":"        status \u003d None"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        while retry_count \u003c\u003d self.max_retries:"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"            if retry_count \u003d\u003d 0:"},{"line_number":161,"context_line":"                self.log(\"INFO Starting introspection %s\" % node_uuid)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_81894626","line":158,"range":{"start_line":158,"start_character":0,"end_line":158,"end_character":46},"in_reply_to":"3fa7e38b_872d3247","updated":"2019-12-02 22:09:09.000000000","message":"I was thinking how it can be implemented with action plugin and seems like we had to use threads with it, because each task is blocking and not way to run them concurrent w/o threads in action plugin. And threads is something that I\u0027d avoid to use with Ansible in any way. So I reimplemented it just with simple queue and pool, w/o any threads.","commit_id":"2daf272ad7c5b73312407bba6d6fd99ad6677d8a"},{"author":{"_account_id":14985,"name":"Alex Schultz","email":"aschultz@next-development.com","username":"mwhahaha"},"change_message_id":"dbd6dec7276e05bacec9d1563f715e49bbd8aea1","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        result \u003d {}"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        with futures.ThreadPoolExecutor("},{"line_number":204,"context_line":"                max_workers\u003dself.concurrency) as executor:"},{"line_number":205,"context_line":"            future_to_uuid \u003d {"},{"line_number":206,"context_line":"                executor.submit(self._introspect_node, node_uuid): node_uuid"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_2c39c53d","line":203,"range":{"start_line":203,"start_character":21,"end_line":203,"end_character":39},"updated":"2019-11-25 17:33:07.000000000","message":"oh it\u0027s my nemesis","commit_id":"2daf272ad7c5b73312407bba6d6fd99ad6677d8a"},{"author":{"_account_id":14985,"name":"Alex Schultz","email":"aschultz@next-development.com","username":"mwhahaha"},"change_message_id":"dbd6dec7276e05bacec9d1563f715e49bbd8aea1","unresolved":false,"context_lines":[{"line_number":207,"context_line":"                for node_uuid in node_uuids"},{"line_number":208,"context_line":"            }"},{"line_number":209,"context_line":"            for future in futures.as_completed(future_to_uuid):"},{"line_number":210,"context_line":"                uuid \u003d future_to_uuid[future]"},{"line_number":211,"context_line":"                try:"},{"line_number":212,"context_line":"                    result[uuid] \u003d future.result()"},{"line_number":213,"context_line":"                except Exception as exc:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_2c8305ab","line":210,"updated":"2019-11-25 17:33:07.000000000","message":"You can just check for an exception via job.exception(). We do something like this in tripleo-common/tripleo_common/image/image_uploader.py\n\n    e \u003d job.exception()\n    if e:\n        // log exception\n        result[uuid] \u003d {\"error\": str(e)}\n        continue\n    result[uuid] \u003d job.result()","commit_id":"2daf272ad7c5b73312407bba6d6fd99ad6677d8a"}],"tripleo_ansible/playbooks/baremetal-introspect.yaml":[{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"39259c10e7a285e9363dc2b24087db8b9e1b9722","unresolved":false,"context_lines":[{"line_number":26,"context_line":"      loop:"},{"line_number":27,"context_line":"        - node_uuids"},{"line_number":28,"context_line":"  vars:"},{"line_number":29,"context_line":"    run_validations: False"},{"line_number":30,"context_line":"    concurrency: 20"},{"line_number":31,"context_line":"    max_retries: 2"},{"line_number":32,"context_line":"    node_timeout: 1200"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3fa7e38b_e0047016","line":29,"range":{"start_line":29,"start_character":21,"end_line":29,"end_character":26},"updated":"2019-10-28 13:11:02.000000000","message":"change to `false`.","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"a9ec4d99e358079e87e5e9a148636bc99cbadcf4","unresolved":false,"context_lines":[{"line_number":26,"context_line":"      loop:"},{"line_number":27,"context_line":"        - node_uuids"},{"line_number":28,"context_line":"  vars:"},{"line_number":29,"context_line":"    run_validations: False"},{"line_number":30,"context_line":"    concurrency: 20"},{"line_number":31,"context_line":"    max_retries: 2"},{"line_number":32,"context_line":"    node_timeout: 1200"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3fa7e38b_e0579059","line":29,"range":{"start_line":29,"start_character":21,"end_line":29,"end_character":26},"in_reply_to":"3fa7e38b_e0047016","updated":"2019-10-29 13:25:06.000000000","message":"Done","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"39259c10e7a285e9363dc2b24087db8b9e1b9722","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    - name: Start baremetal introspection"},{"line_number":59,"context_line":"      baremetal_introspection:"},{"line_number":60,"context_line":"        node_uuids: \"{{node_uuids}}\""},{"line_number":61,"context_line":"        concurrency: \"{{concurrency}}\""},{"line_number":62,"context_line":"        max_retries: \"{{max_retries}}\""},{"line_number":63,"context_line":"        node_timeout: \"{{node_timeout}}\""}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3fa7e38b_a012f856","line":60,"range":{"start_line":60,"start_character":21,"end_line":60,"end_character":35},"updated":"2019-10-28 13:11:02.000000000","message":"spaces when using brace expansions.\n\n  \"{{ node_uuids }}\"","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"a9ec4d99e358079e87e5e9a148636bc99cbadcf4","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    - name: Start baremetal introspection"},{"line_number":59,"context_line":"      baremetal_introspection:"},{"line_number":60,"context_line":"        node_uuids: \"{{node_uuids}}\""},{"line_number":61,"context_line":"        concurrency: \"{{concurrency}}\""},{"line_number":62,"context_line":"        max_retries: \"{{max_retries}}\""},{"line_number":63,"context_line":"        node_timeout: \"{{node_timeout}}\""}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3fa7e38b_6072c014","line":60,"range":{"start_line":60,"start_character":21,"end_line":60,"end_character":35},"in_reply_to":"3fa7e38b_a012f856","updated":"2019-10-29 13:25:06.000000000","message":"Done","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"39259c10e7a285e9363dc2b24087db8b9e1b9722","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    - name: Start baremetal introspection"},{"line_number":59,"context_line":"      baremetal_introspection:"},{"line_number":60,"context_line":"        node_uuids: \"{{node_uuids}}\""},{"line_number":61,"context_line":"        concurrency: \"{{concurrency}}\""},{"line_number":62,"context_line":"        max_retries: \"{{max_retries}}\""},{"line_number":63,"context_line":"        node_timeout: \"{{node_timeout}}\""},{"line_number":64,"context_line":"      async: 1000"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3fa7e38b_c00ff42b","line":61,"range":{"start_line":61,"start_character":21,"end_line":61,"end_character":38},"updated":"2019-10-28 13:11:02.000000000","message":"see above.","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"a9ec4d99e358079e87e5e9a148636bc99cbadcf4","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    - name: Start baremetal introspection"},{"line_number":59,"context_line":"      baremetal_introspection:"},{"line_number":60,"context_line":"        node_uuids: \"{{node_uuids}}\""},{"line_number":61,"context_line":"        concurrency: \"{{concurrency}}\""},{"line_number":62,"context_line":"        max_retries: \"{{max_retries}}\""},{"line_number":63,"context_line":"        node_timeout: \"{{node_timeout}}\""},{"line_number":64,"context_line":"      async: 1000"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3fa7e38b_806fbc26","line":61,"range":{"start_line":61,"start_character":21,"end_line":61,"end_character":38},"in_reply_to":"3fa7e38b_c00ff42b","updated":"2019-10-29 13:25:06.000000000","message":"Done","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"39259c10e7a285e9363dc2b24087db8b9e1b9722","unresolved":false,"context_lines":[{"line_number":59,"context_line":"      baremetal_introspection:"},{"line_number":60,"context_line":"        node_uuids: \"{{node_uuids}}\""},{"line_number":61,"context_line":"        concurrency: \"{{concurrency}}\""},{"line_number":62,"context_line":"        max_retries: \"{{max_retries}}\""},{"line_number":63,"context_line":"        node_timeout: \"{{node_timeout}}\""},{"line_number":64,"context_line":"      async: 1000"},{"line_number":65,"context_line":"      poll: 0"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3fa7e38b_60188075","line":62,"range":{"start_line":62,"start_character":21,"end_line":62,"end_character":38},"updated":"2019-10-28 13:11:02.000000000","message":"see above.","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"a9ec4d99e358079e87e5e9a148636bc99cbadcf4","unresolved":false,"context_lines":[{"line_number":59,"context_line":"      baremetal_introspection:"},{"line_number":60,"context_line":"        node_uuids: \"{{node_uuids}}\""},{"line_number":61,"context_line":"        concurrency: \"{{concurrency}}\""},{"line_number":62,"context_line":"        max_retries: \"{{max_retries}}\""},{"line_number":63,"context_line":"        node_timeout: \"{{node_timeout}}\""},{"line_number":64,"context_line":"      async: 1000"},{"line_number":65,"context_line":"      poll: 0"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3fa7e38b_2062883f","line":62,"range":{"start_line":62,"start_character":21,"end_line":62,"end_character":38},"in_reply_to":"3fa7e38b_60188075","updated":"2019-10-29 13:25:06.000000000","message":"Done","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"39259c10e7a285e9363dc2b24087db8b9e1b9722","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        node_uuids: \"{{node_uuids}}\""},{"line_number":61,"context_line":"        concurrency: \"{{concurrency}}\""},{"line_number":62,"context_line":"        max_retries: \"{{max_retries}}\""},{"line_number":63,"context_line":"        node_timeout: \"{{node_timeout}}\""},{"line_number":64,"context_line":"      async: 1000"},{"line_number":65,"context_line":"      poll: 0"},{"line_number":66,"context_line":"      register: baremetal_introspection_async"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3fa7e38b_20284884","line":63,"range":{"start_line":63,"start_character":22,"end_line":63,"end_character":40},"updated":"2019-10-28 13:11:02.000000000","message":"see above.","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"a9ec4d99e358079e87e5e9a148636bc99cbadcf4","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        node_uuids: \"{{node_uuids}}\""},{"line_number":61,"context_line":"        concurrency: \"{{concurrency}}\""},{"line_number":62,"context_line":"        max_retries: \"{{max_retries}}\""},{"line_number":63,"context_line":"        node_timeout: \"{{node_timeout}}\""},{"line_number":64,"context_line":"      async: 1000"},{"line_number":65,"context_line":"      poll: 0"},{"line_number":66,"context_line":"      register: baremetal_introspection_async"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3fa7e38b_4067844e","line":63,"range":{"start_line":63,"start_character":22,"end_line":63,"end_character":40},"in_reply_to":"3fa7e38b_20284884","updated":"2019-10-29 13:25:06.000000000","message":"Done","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"39259c10e7a285e9363dc2b24087db8b9e1b9722","unresolved":false,"context_lines":[{"line_number":83,"context_line":"      until: job_result.finished"},{"line_number":84,"context_line":"      retries: 1000"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    # QUESTION: Is there a better way to show the final result to users? This"},{"line_number":87,"context_line":"    # just outputs a JSON blob with the uuids and their introspection status."},{"line_number":88,"context_line":"    # However, if you have 100 nodes that wont be very manageable and users"},{"line_number":89,"context_line":"    # probably need to take action on any failed node."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    - debug: var\u003djob_result"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3fa7e38b_402d4493","line":89,"range":{"start_line":86,"start_character":0,"end_line":89,"end_character":54},"updated":"2019-10-28 13:11:02.000000000","message":"we could iterate over the set and just print the UUID or some other debug message? We could also iterate over the set and just print any node that failed?\n\nSomething like \n\n- name: notice block\n  block:\n    - debug: \n        msg: \"interesting message {{ item }}\"\n      loop: \"{{ job_result | SOME_FILTERED_SET_TO_FIGURE_OUT_LATER }}\"\n  finally:\n    - debug:\n        msg: \"Introspection complete.\"","commit_id":"0b7e94473872e16a28ca55f7468f4a3710244d09"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"a9ec4d99e358079e87e5e9a148636bc99cbadcf4","unresolved":false,"context_lines":[{"line_number":102,"context_line":"          {% else %}"},{"line_number":103,"context_line":"            No errors were encountered during introspection"},{"line_number":104,"context_line":"          {% endfor %}"},{"line_number":105,"context_line":"      failed_when: \"{{ introspection_result.result | json_query(\u0027*.status.error\u0027) | length \u003e 0 }}\""}],"source_content_type":"text/x-yaml","patch_set":12,"id":"3fa7e38b_bfbd24b2","line":105,"updated":"2019-10-29 13:25:06.000000000","message":"What is the correct way to do this? I am getting this warning...\n\n\n[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ introspection_result.result |\njson_query(\u0027*.status.error\u0027) | length \u003e 0 }}\n\nI want to make sure the playbook fails, so we can pass on correct return codes easily","commit_id":"f98af5de9ab58691df47114eea4e8e148bbbf389"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"1be67e779bd80a302447f334eef8fd584e423fcd","unresolved":false,"context_lines":[{"line_number":102,"context_line":"          {% else %}"},{"line_number":103,"context_line":"            No errors were encountered during introspection"},{"line_number":104,"context_line":"          {% endfor %}"},{"line_number":105,"context_line":"      failed_when: \"{{ introspection_result.result | json_query(\u0027*.status.error\u0027) | length \u003e 0 }}\""}],"source_content_type":"text/x-yaml","patch_set":12,"id":"3fa7e38b_bf8a04b9","line":105,"in_reply_to":"3fa7e38b_bfbd24b2","updated":"2019-10-29 13:35:53.000000000","message":"To resolve this error you would write the condition like so\n\n  failed_when:\n    - (introspection_result.result | json_query(\u0027*.status.error\u0027)) | (length \u003e 0)\n\nThe reason for this warning is that all conditions within ansible are run through the jinja processor. So the use of braces expansions are redundant and likely to cause confusion.","commit_id":"f98af5de9ab58691df47114eea4e8e148bbbf389"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"6ad0907ec400a964cecf705a44bc455128e0fbad","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"- connection: local"},{"line_number":18,"context_line":"  hosts: localhost"},{"line_number":19,"context_line":"  pre_tasks:"},{"line_number":20,"context_line":"    - name: Check for required inputs"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3fa7e38b_d305707b","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":19},"updated":"2019-10-29 22:56:13.000000000","message":"we should add a `name` here.","commit_id":"87dac0d9759f599deace9d62b696bac125774d71"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"58ee0a11eb776547c6d2fae32177c4805da2c871","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    - name: Run Validations"},{"line_number":39,"context_line":"      command: \u003e"},{"line_number":40,"context_line":"        mistral execution-create tripleo.validations.v1.run_groups \u0027{\"group_names\":[\"pre-introspection\"], \"queue_name\":\"tripleo\"}\u0027 -f json"},{"line_number":41,"context_line":"      register: output_text"},{"line_number":42,"context_line":"      when:"},{"line_number":43,"context_line":"        - run_validations | bool"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3fa7e38b_20126159","line":40,"updated":"2019-10-30 14:14:25.000000000","message":"Use \"openstack tripleo validator [run|list|...]\"","commit_id":"87dac0d9759f599deace9d62b696bac125774d71"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"a9a419e28ef248d8a3302b39c2d88e6e6b213190","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    - name: Run Validations"},{"line_number":39,"context_line":"      command: \u003e"},{"line_number":40,"context_line":"        mistral execution-create tripleo.validations.v1.run_groups \u0027{\"group_names\":[\"pre-introspection\"], \"queue_name\":\"tripleo\"}\u0027 -f json"},{"line_number":41,"context_line":"      register: output_text"},{"line_number":42,"context_line":"      when:"},{"line_number":43,"context_line":"        - run_validations | bool"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3fa7e38b_60529914","line":40,"in_reply_to":"3fa7e38b_20126159","updated":"2019-10-30 14:18:44.000000000","message":"... or run the ansible playbook directly?","commit_id":"87dac0d9759f599deace9d62b696bac125774d71"}]}
