payload: {"action":"created","comment":{"url":"https://api.github.com/repos/ansible/ansible/pulls/comments/295919231","pull_request_review_id":252434914,"id":295919231,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI5NTkxOTIzMQ==","diff_hunk":"@@ -0,0 +1,134 @@\n+# This code is part of Ansible, but is an independent component.\n+# This particular file snippet, and this file snippet only, is BSD licensed.\n+# Modules you write using this snippet, which is embedded dynamically by Ansible\n+# still belong to the author of the module, and may assign their own license\n+# to the complete work.\n+#\n+# (c) 2019 Fortinet, Inc\n+# All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without modification,\n+# are permitted provided that the following conditions are met:\n+#\n+#    * Redistributions of source code must retain the above copyright\n+#      notice, this list of conditions and the following disclaimer.\n+#    * Redistributions in binary form must reproduce the above copyright notice,\n+#      this list of conditions and the following disclaimer in the documentation\n+#      and/or other materials provided with the distribution.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n+# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n+# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+\n+\n+from __future__ import (absolute_import, division, print_function)\n+__metaclass__ = type\n+\n+DOCUMENTATION = \"\"\"\n+---\n+author:\n+    - Miguel Angel Muñoz (@magonzalez)\n+httpapi : fortios\n+short_description: HttpApi Plugin for Fortinet FortiOS Appliance or VM\n+description:\n+  - This HttpApi plugin provides methods to connect to Fortinet FortiOS Appliance or VM via REST API\n+version_added: \"2.9\"\n+\"\"\"\n+\n+from ansible.plugins.httpapi import HttpApiBase\n+from ansible.module_utils.basic import to_text\n+import urllib\n+import json\n+import re\n+\n+\n+class HttpApi(HttpApiBase):\n+    def __init__(self, connection):\n+        super(HttpApi, self).__init__(connection)\n+\n+        self._ccsrftoken = ''\n+\n+    def set_become(self, become_context):\n+        \"\"\"\n+        Elevation is not required on Fortinet devices - Skipped\n+        :param become_context: Unused input.\n+        :return: None\n+        \"\"\"\n+        return None\n+\n+    def login(self, username, password):\n+        \"\"\"Call a defined login endpoint to receive an authentication token.\"\"\"\n+\n+        data = \"username=\" + urllib.parse.quote(username) + \"&secretkey=\" + urllib.parse.quote(password) + \"&ajax=1\"\n+        dummy, result_data = self.send_request(url='/logincheck', data=data, method='POST')\n+        if result_data[0] != '1':\n+            raise Exception('Wrong credentials. Please check')\n+\n+    def logout(self):\n+        \"\"\" Call to implement session logout.\"\"\"\n+\n+        self.send_request(url='/logout', method=\"POST\")\n+\n+    def update_auth(self, response, response_text):\n+        \"\"\"\n+        Get cookies and obtain value for csrftoken that will be used on next requests\n+        :param response: Response given by the server.\n+        :param response_text Unused_input.\n+        :return: Dictionary containing headers\n+        \"\"\"\n+\n+        headers = {}\n+\n+        for attr, val in response.getheaders():\n+            if attr == 'Set-Cookie' and 'APSCOOKIE_' in val:\n+                headers['Cookie'] = val\n+\n+            elif attr == 'Set-Cookie' and 'ccsrftoken=' in val:\n+                csrftoken_search = re.search('\\\"(.*)\\\"', val)\n+                if csrftoken_search:\n+                    self._ccsrftoken = csrftoken_search.group(1)\n+                    headers['x-csrftoken'] = self._ccsrftoken\n+\n+        return headers\n+\n+    def handle_httperror(self, exc):\n+        \"\"\"\n+        Not required on Fortinet devices - Skipped\n+        :param exc: Unused input.\n+        :return: exc\n+        \"\"\"\n+        return exc\n+\n+    def send_request(self, **message_kwargs):\n+        \"\"\"\n+        Responsible for actual sending of data to the connection httpapi base plugin.\n+        :param message_kwargs: A formatted dictionary containing request info: url, data, method\n+\n+        :return: Status code and response data.\n+        \"\"\"\n+        url = message_kwargs.get('url', '/')\n+        data = message_kwargs.get('data', '')\n+        method = message_kwargs.get('method', 'GET')\n+\n+        if self._ccsrftoken == '' and not (method == 'POST' and 'logincheck' in url):\n+            raise Exception('Not logged in. Please login first')","path":"lib/ansible/plugins/httpapi/fortios.py","position":120,"original_position":120,"commit_id":"1b6232d4945c2b82f2b4ed6dc25b28e873b9986b","original_commit_id":"1b6232d4945c2b82f2b4ed6dc25b28e873b9986b","user":{"login":"mamunozgonzalez","id":29597798,"node_id":"MDQ6VXNlcjI5NTk3Nzk4","avatar_url":"https://avatars3.githubusercontent.com/u/29597798?v=4","gravatar_id":"","url":"https://api.github.com/users/mamunozgonzalez","html_url":"https://github.com/mamunozgonzalez","followers_url":"https://api.github.com/users/mamunozgonzalez/followers","following_url":"https://api.github.com/users/mamunozgonzalez/following{/other_user}","gists_url":"https://api.github.com/users/mamunozgonzalez/gists{/gist_id}","starred_url":"https://api.github.com/users/mamunozgonzalez/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mamunozgonzalez/subscriptions","organizations_url":"https://api.github.com/users/mamunozgonzalez/orgs","repos_url":"https://api.github.com/users/mamunozgonzalez/repos","events_url":"https://api.github.com/users/mamunozgonzalez/events{/privacy}","received_events_url":"https://api.github.com/users/mamunozgonzalez/received_events","type":"User","site_admin":false},"body":"Hi Qalthos,\r\n thanks for your answer. If the system guarantees that the first call is a login then I think you are right and the exception will never raise. I can remove that part, thanks for the clarification. I just added it as an extra 'safety' measure.\r\n\r\nRegarding the csrf token lost, our device sends the csrf token and the cookie in the first login, but in the later request it may send only the cookie, or nothing. There is no rule about that. However whenever we send a PUT or POST we must add both the token and the cookie always. And here is where I found that if I don't store the csrf token it will be lost in later requests. I have run some tests, and the ansible system do not keep the csrftoken after the first request (even if I return \"None\" in update_auth). Therefore, I see no other way to make it work than storing the csrf token in the class. Please let me know if I am doing something wrong. This is the code I am testing according to your comments but it does not work bcs later requests do not keep the csrf token:\r\n```\r\n    def update_auth(self, response, response_text):\r\n\r\n        headers = {}\r\n\r\n        for attr, val in response.getheaders():\r\n            if attr == 'Set-Cookie' and 'APSCOOKIE_' in val:\r\n                headers['Cookie'] = val\r\n\r\n            elif attr == 'Set-Cookie' and 'ccsrftoken=' in val:\r\n                csrftoken_search = re.search('\\\"(.*)\\\"', val)\r\n                if csrftoken_search:\r\n                    headers['x-csrftoken'] = self._ccsrftoken\r\n\r\n        if len (headers) == 2:\r\n            return headers\r\n        else:\r\n            return None\r\n\r\n    def send_request(self, **message_kwargs):\r\n\r\n        url = message_kwargs.get('url', '/')\r\n        data = message_kwargs.get('data', '')\r\n        method = message_kwargs.get('method', 'GET')\r\n\r\n        try:\r\n            response, response_data = self.connection.send(url, data, #headers=headers,\r\n                                                           method=method)\r\n\r\n            return response.status, to_text(response_data.getvalue())\r\n        except Exception as err:\r\n            raise Exception(err)\r\n```\r\nPlease let me know if I am doing something wrong or if I misunderstood something.\r\nThanks!","created_at":"2019-06-20T17:38:07Z","updated_at":"2019-06-20T17:38:07Z","html_url":"https://github.com/ansible/ansible/pull/56870#discussion_r295919231","pull_request_url":"https://api.github.com/repos/ansible/ansible/pulls/56870","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/ansible/ansible/pulls/comments/295919231"},"html":{"href":"https://github.com/ansible/ansible/pull/56870#discussion_r295919231"},"pull_request":{"href":"https://api.github.com/repos/ansible/ansible/pulls/56870"}},"in_reply_to_id":295838641},"pull_request":{"url":"https://api.github.com/repos/ansible/ansible/pulls/56870","id":281737803,"node_id":"MDExOlB1bGxSZXF1ZXN0MjgxNzM3ODAz","html_url":"https://github.com/ansible/ansible/pull/56870","diff_url":"https://github.com/ansible/ansible/pull/56870.diff","patch_url":"https://github.com/ansible/ansible/pull/56870.patch","issue_url":"https://api.github.com/repos/ansible/ansible/issues/56870","number":56870,"state":"open","locked":false,"title":"New HTTPAPI plugin for FortiOS","user":{"login":"mamunozgonzalez","id":29597798,"node_id":"MDQ6VXNlcjI5NTk3Nzk4","avatar_url":"https://avatars3.githubusercontent.com/u/29597798?v=4","gravatar_id":"","url":"https://api.github.com/users/mamunozgonzalez","html_url":"https://github.com/mamunozgonzalez","followers_url":"https://api.github.com/users/mamunozgonzalez/followers","following_url":"https://api.github.com/users/mamunozgonzalez/following{/other_user}","gists_url":"https://api.github.com/users/mamunozgonzalez/gists{/gist_id}","starred_url":"https://api.github.com/users/mamunozgonzalez/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mamunozgonzalez/subscriptions","organizations_url":"https://api.github.com/users/mamunozgonzalez/orgs","repos_url":"https://api.github.com/users/mamunozgonzalez/repos","events_url":"https://api.github.com/users/mamunozgonzalez/events{/privacy}","received_events_url":"https://api.github.com/users/mamunozgonzalez/received_events","type":"User","site_admin":false},"body":"##### SUMMARY\r\n\r\nFortinet is adding Ansible support for FortiOS and FortiGate products. This PR includes a new HTTPAPI plugin for FortiOS to handle proper connectivity to FortiGate devices for the new and existing Ansible modules. The goals for this submission are:\r\n\r\n - Comply with Ansible guidelines \r\n - Use a single connection during the lifetime of the playbook execution\r\n - Better usage of the inventory.\r\n\r\nThis is related to other commits that include new modules for FortiOS, such as: #56447\r\n\r\n##### ISSUE TYPE\r\n\r\n- New Module Pull Request\r\n\r\n##### COMPONENT NAME\r\n\r\nFortios (httpapi plugin)\r\n\r\n##### ADDITIONAL INFORMATION\r\n\r\nFortinet is gradually adding Ansible support to every feature of FortiOS, thus old modules and code which are no longer maintained and were submitted by other authors will be deprecated gradually, as new modules with overlapping functionality are added.\r\n","created_at":"2019-05-23T18:43:59Z","updated_at":"2019-06-20T17:38:07Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f9983a7a8d4d794a9ef0cbb54f2b232bc8df2790","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1316917295,"node_id":"MDU6TGFiZWwxMzE2OTE3Mjk1","url":"https://api.github.com/repos/ansible/ansible/labels/affects_2.9","name":"affects_2.9","color":"ededed","default":false},{"id":513652538,"node_id":"MDU6TGFiZWw1MTM2NTI1Mzg=","url":"https://api.github.com/repos/ansible/ansible/labels/core_review","name":"core_review","color":"ededed","default":false},{"id":1243593377,"node_id":"MDU6TGFiZWwxMjQzNTkzMzc3","url":"https://api.github.com/repos/ansible/ansible/labels/fortios","name":"fortios","color":"c7def8","default":false},{"id":339653091,"node_id":"MDU6TGFiZWwzMzk2NTMwOTE=","url":"https://api.github.com/repos/ansible/ansible/labels/networking","name":"networking","color":"4071a5","default":false},{"id":153577825,"node_id":"MDU6TGFiZWwxNTM1Nzc4MjU=","url":"https://api.github.com/repos/ansible/ansible/labels/new_plugin","name":"new_plugin","color":"bfe5bf","default":false},{"id":581543918,"node_id":"MDU6TGFiZWw1ODE1NDM5MTg=","url":"https://api.github.com/repos/ansible/ansible/labels/stale_ci","name":"stale_ci","color":"fef2c0","default":false},{"id":638933140,"node_id":"MDU6TGFiZWw2Mzg5MzMxNDA=","url":"https://api.github.com/repos/ansible/ansible/labels/stale_review","name":"stale_review","color":"ededed","default":false},{"id":636327968,"node_id":"MDU6TGFiZWw2MzYzMjc5Njg=","url":"https://api.github.com/repos/ansible/ansible/labels/support:community","name":"support:community","color":"ededed","default":false},{"id":669761792,"node_id":"MDU6TGFiZWw2Njk3NjE3OTI=","url":"https://api.github.com/repos/ansible/ansible/labels/support:network","name":"support:network","color":"ededed","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ansible/ansible/pulls/56870/commits","review_comments_url":"https://api.github.com/repos/ansible/ansible/pulls/56870/comments","review_comment_url":"https://api.github.com/repos/ansible/ansible/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ansible/ansible/issues/56870/comments","statuses_url":"https://api.github.com/repos/ansible/ansible/statuses/1b6232d4945c2b82f2b4ed6dc25b28e873b9986b","head":{"label":"fortinet-solutions-cse:new_httpapi_fortios","ref":"new_httpapi_fortios","sha":"1b6232d4945c2b82f2b4ed6dc25b28e873b9986b","user":{"login":"fortinet-solutions-cse","id":27803665,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI3ODAzNjY1","avatar_url":"https://avatars0.githubusercontent.com/u/27803665?v=4","gravatar_id":"","url":"https://api.github.com/users/fortinet-solutions-cse","html_url":"https://github.com/fortinet-solutions-cse","followers_url":"https://api.github.com/users/fortinet-solutions-cse/followers","following_url":"https://api.github.com/users/fortinet-solutions-cse/following{/other_user}","gists_url":"https://api.github.com/users/fortinet-solutions-cse/gists{/gist_id}","starred_url":"https://api.github.com/users/fortinet-solutions-cse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fortinet-solutions-cse/subscriptions","organizations_url":"https://api.github.com/users/fortinet-solutions-cse/orgs","repos_url":"https://api.github.com/users/fortinet-solutions-cse/repos","events_url":"https://api.github.com/users/fortinet-solutions-cse/events{/privacy}","received_events_url":"https://api.github.com/users/fortinet-solutions-cse/received_events","type":"Organization","site_admin":false},"repo":{"id":149600085,"node_id":"MDEwOlJlcG9zaXRvcnkxNDk2MDAwODU=","name":"ansible","full_name":"fortinet-solutions-cse/ansible","private":false,"owner":{"login":"fortinet-solutions-cse","id":27803665,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI3ODAzNjY1","avatar_url":"https://avatars0.githubusercontent.com/u/27803665?v=4","gravatar_id":"","url":"https://api.github.com/users/fortinet-solutions-cse","html_url":"https://github.com/fortinet-solutions-cse","followers_url":"https://api.github.com/users/fortinet-solutions-cse/followers","following_url":"https://api.github.com/users/fortinet-solutions-cse/following{/other_user}","gists_url":"https://api.github.com/users/fortinet-solutions-cse/gists{/gist_id}","starred_url":"https://api.github.com/users/fortinet-solutions-cse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fortinet-solutions-cse/subscriptions","organizations_url":"https://api.github.com/users/fortinet-solutions-cse/orgs","repos_url":"https://api.github.com/users/fortinet-solutions-cse/repos","events_url":"https://api.github.com/users/fortinet-solutions-cse/events{/privacy}","received_events_url":"https://api.github.com/users/fortinet-solutions-cse/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/fortinet-solutions-cse/ansible","description":"Ansible is a radically simple IT automation platform that makes your applications and systems easier to deploy. Avoid writing scripts or custom code to deploy and update your applications — automate in a language that approaches plain English, using SSH, with no agents to install on remote systems. https://docs.ansible.com/ansible/","fork":true,"url":"https://api.github.com/repos/fortinet-solutions-cse/ansible","forks_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/forks","keys_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/teams","hooks_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/hooks","issue_events_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/issues/events{/number}","events_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/events","assignees_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/assignees{/user}","branches_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/branches{/branch}","tags_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/tags","blobs_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/git/refs{/sha}","trees_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/statuses/{sha}","languages_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/languages","stargazers_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/stargazers","contributors_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/contributors","subscribers_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/subscribers","subscription_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/subscription","commits_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/commits{/sha}","git_commits_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/git/commits{/sha}","comments_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/comments{/number}","issue_comment_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/issues/comments{/number}","contents_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/contents/{+path}","compare_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/merges","archive_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/downloads","issues_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/issues{/number}","pulls_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/pulls{/number}","milestones_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/milestones{/number}","notifications_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/labels{/name}","releases_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/releases{/id}","deployments_url":"https://api.github.com/repos/fortinet-solutions-cse/ansible/deployments","created_at":"2018-09-20T11:40:21Z","updated_at":"2019-06-11T12:43:56Z","pushed_at":"2019-06-12T07:45:46Z","git_url":"git://github.com/fortinet-solutions-cse/ansible.git","ssh_url":"git@github.com:fortinet-solutions-cse/ansible.git","clone_url":"https://github.com/fortinet-solutions-cse/ansible.git","svn_url":"https://github.com/fortinet-solutions-cse/ansible","homepage":"https://www.ansible.com/","size":157179,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"devel"}},"base":{"label":"ansible:devel","ref":"devel","sha":"c06f890f5582c434c0ed595828984b1dc4d0c2ec","user":{"login":"ansible","id":1507452,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE1MDc0NTI=","avatar_url":"https://avatars2.githubusercontent.com/u/1507452?v=4","gravatar_id":"","url":"https://api.github.com/users/ansible","html_url":"https://github.com/ansible","followers_url":"https://api.github.com/users/ansible/followers","following_url":"https://api.github.com/users/ansible/following{/other_user}","gists_url":"https://api.github.com/users/ansible/gists{/gist_id}","starred_url":"https://api.github.com/users/ansible/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ansible/subscriptions","organizations_url":"https://api.github.com/users/ansible/orgs","repos_url":"https://api.github.com/users/ansible/repos","events_url":"https://api.github.com/users/ansible/events{/privacy}","received_events_url":"https://api.github.com/users/ansible/received_events","type":"Organization","site_admin":false},"repo":{"id":3638964,"node_id":"MDEwOlJlcG9zaXRvcnkzNjM4OTY0","name":"ansible","full_name":"ansible/ansible","private":false,"owner":{"login":"ansible","id":1507452,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE1MDc0NTI=","avatar_url":"https://avatars2.githubusercontent.com/u/1507452?v=4","gravatar_id":"","url":"https://api.github.com/users/ansible","html_url":"https://github.com/ansible","followers_url":"https://api.github.com/users/ansible/followers","following_url":"https://api.github.com/users/ansible/following{/other_user}","gists_url":"https://api.github.com/users/ansible/gists{/gist_id}","starred_url":"https://api.github.com/users/ansible/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ansible/subscriptions","organizations_url":"https://api.github.com/users/ansible/orgs","repos_url":"https://api.github.com/users/ansible/repos","events_url":"https://api.github.com/users/ansible/events{/privacy}","received_events_url":"https://api.github.com/users/ansible/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/ansible/ansible","description":"Ansible is a radically simple IT automation platform that makes your applications and systems easier to deploy. Avoid writing scripts or custom code to deploy and update your applications — automate in a language that approaches plain English, using SSH, with no agents to install on remote systems. https://docs.ansible.com/ansible/","fork":false,"url":"https://api.github.com/repos/ansible/ansible","forks_url":"https://api.github.com/repos/ansible/ansible/forks","keys_url":"https://api.github.com/repos/ansible/ansible/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ansible/ansible/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ansible/ansible/teams","hooks_url":"https://api.github.com/repos/ansible/ansible/hooks","issue_events_url":"https://api.github.com/repos/ansible/ansible/issues/events{/number}","events_url":"https://api.github.com/repos/ansible/ansible/events","assignees_url":"https://api.github.com/repos/ansible/ansible/assignees{/user}","branches_url":"https://api.github.com/repos/ansible/ansible/branches{/branch}","tags_url":"https://api.github.com/repos/ansible/ansible/tags","blobs_url":"https://api.github.com/repos/ansible/ansible/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ansible/ansible/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ansible/ansible/git/refs{/sha}","trees_url":"https://api.github.com/repos/ansible/ansible/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ansible/ansible/statuses/{sha}","languages_url":"https://api.github.com/repos/ansible/ansible/languages","stargazers_url":"https://api.github.com/repos/ansible/ansible/stargazers","contributors_url":"https://api.github.com/repos/ansible/ansible/contributors","subscribers_url":"https://api.github.com/repos/ansible/ansible/subscribers","subscription_url":"https://api.github.com/repos/ansible/ansible/subscription","commits_url":"https://api.github.com/repos/ansible/ansible/commits{/sha}","git_commits_url":"https://api.github.com/repos/ansible/ansible/git/commits{/sha}","comments_url":"https://api.github.com/repos/ansible/ansible/comments{/number}","issue_comment_url":"https://api.github.com/repos/ansible/ansible/issues/comments{/number}","contents_url":"https://api.github.com/repos/ansible/ansible/contents/{+path}","compare_url":"https://api.github.com/repos/ansible/ansible/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ansible/ansible/merges","archive_url":"https://api.github.com/repos/ansible/ansible/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ansible/ansible/downloads","issues_url":"https://api.github.com/repos/ansible/ansible/issues{/number}","pulls_url":"https://api.github.com/repos/ansible/ansible/pulls{/number}","milestones_url":"https://api.github.com/repos/ansible/ansible/milestones{/number}","notifications_url":"https://api.github.com/repos/ansible/ansible/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ansible/ansible/labels{/name}","releases_url":"https://api.github.com/repos/ansible/ansible/releases{/id}","deployments_url":"https://api.github.com/repos/ansible/ansible/deployments","created_at":"2012-03-06T14:58:02Z","updated_at":"2019-06-20T17:35:18Z","pushed_at":"2019-06-20T17:35:15Z","git_url":"git://github.com/ansible/ansible.git","ssh_url":"git@github.com:ansible/ansible.git","clone_url":"https://github.com/ansible/ansible.git","svn_url":"https://github.com/ansible/ansible","homepage":"https://www.ansible.com/","size":170319,"stargazers_count":37822,"watchers_count":37822,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":15859,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":5801,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":15859,"open_issues":5801,"watchers":37822,"default_branch":"devel"}},"_links":{"self":{"href":"https://api.github.com/repos/ansible/ansible/pulls/56870"},"html":{"href":"https://github.com/ansible/ansible/pull/56870"},"issue":{"href":"https://api.github.com/repos/ansible/ansible/issues/56870"},"comments":{"href":"https://api.github.com/repos/ansible/ansible/issues/56870/comments"},"review_comments":{"href":"https://api.github.com/repos/ansible/ansible/pulls/56870/comments"},"review_comment":{"href":"https://api.github.com/repos/ansible/ansible/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ansible/ansible/pulls/56870/commits"},"statuses":{"href":"https://api.github.com/repos/ansible/ansible/statuses/1b6232d4945c2b82f2b4ed6dc25b28e873b9986b"}},"author_association":"CONTRIBUTOR"}}
other: {"actor":{"display_login":"mamunozgonzalez"}}