{"action":"created","comment":{"url":"https://api.github.com/repos/ansible/ansible/pulls/comments/118682261","pull_request_review_id":40499176,"id":118682261,"diff_hunk":"@@ -0,0 +1,1089 @@\n+#!/usr/bin/python\n+# -*- coding: utf-8 -*-\n+\n+# (c) 2017, Nokia\n+# This file is part of Ansible\n+#\n+# Ansible is free software: you can redistribute it and/or modify\n+# it under the terms of the GNU General Public License as published by\n+# the Free Software Foundation, either version 3 of the License, or\n+# (at your option) any later version.\n+#\n+# Ansible is distributed in the hope that it will be useful,\n+# but WITHOUT ANY WARRANTY; without even the implied warranty of\n+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+# GNU General Public License for more details.\n+#\n+# You should have received a copy of the GNU General Public License\n+# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.\n+\n+ANSIBLE_METADATA = {'status': ['preview'],\n+                    'supported_by': 'community',\n+                    'metadata_version': '1.0'}\n+\n+DOCUMENTATION = '''\n+---\n+module: nuage_vspk\n+short_description: Manage Nuage VSP environments\n+description:\n+    - Manage or find Nuage VSP entities, this includes create, update, delete, assign, unassign and find, with all supported properties.\n+version_added: \"2.4\"\n+author: Philippe Dellaert (@pdellaert)\n+options:\n+    auth:\n+        description:\n+            - Dict with the authentication information required to connect to a Nuage VSP environment.\n+            - Requires a I(api_username) parameter (example csproot).\n+            - Requires either a I(api_password) parameter (example csproot) or a I(api_certificate) and I(api_key) parameters,\n+              which point to the certificate and key files for certificate based authentication.\n+            - Requires a I(api_enterprise) parameter (example csp).\n+            - Requires a I(api_url) parameter (example https://10.0.0.10:8443).\n+            - Requires a I(api_version) parameter (example v4_0).\n+        required: true\n+        default: null\n+        choices: []\n+        aliases: []\n+        version_added: \"1.0\"\n+    type:\n+        description:\n+            - The type of entity you want to work on (example Enterprise).\n+            - This should match the objects CamelCase class name in VSPK-Python.\n+            - This Class name can be found on U(https://nuagenetworks.github.io/vspkdoc/html/index.html).\n+        required: true\n+        default: null\n+        choices: []\n+        aliases: []\n+        version_added: \"1.0\"\n+    id:\n+        description:\n+            - The ID of the entity you want to work on.\n+            - In combination with I(command=find), it will only return the single entity.\n+            - In combination with I(state), it will either update or delete this entity.\n+            - Will take precedence over I(match_filter) and I(properties) whenever an entity needs to be found.\n+        required: false\n+        default: null\n+        choices: []\n+        aliases: []\n+        version_added: \"1.0\"\n+    parent_id:\n+        description:\n+            - The ID of the parent of the entity you want to work on.\n+            - When I(state) is specified, the entity will be gathered from this parent, if it exists, unless an I(id) is specified.\n+            - When I(command=find) is specified, the entity will be searched for in this parent, unless an I(id) is specified.\n+            - If specified, I(parent_type) also needs to be specified.\n+        required: false\n+        default: null\n+        choices: []\n+        aliases: []\n+        version_added: \"1.0\"\n+    parent_type:\n+        description:\n+            - The type of parent the ID is specified for (example Enterprise).\n+            - This should match the objects CamelCase class name in VSPK-Python.\n+            - This Class name can be found on U(https://nuagenetworks.github.io/vspkdoc/html/index.html).\n+            - If specified, I(parent_id) also needs to be specified.\n+        required: false\n+        default: null\n+        choices: []\n+        aliases: []\n+        version_added: \"1.0\"\n+    state:\n+        description:\n+            - Specifies the desired state of the entity.\n+            - If I(state=present), in case the entity already exists, will update the entity if it is needed.\n+            - If I(state=present), in case the relationship with the parent is a member relationship, will assign the entity as a member of the parent.\n+            - If I(state=absent), in case the relationship with the parent is a member relationship, will unassign the entity as a member of the parent.\n+            - Either I(state) or I(command) needs to be defined, both can not be defined at the same time.\n+        required: false\n+        default: null\n+        choices:\n+            - present\n+            - absent\n+        aliases: []\n+        version_added: \"1.0\"\n+    command:\n+        description:\n+            - Specifies a command to be executed.\n+            - With I(command=find), if I(parent_id) and I(parent_type) are defined, it will only search within the parent. Otherwise, if allowed,\n+              will search in the root object.\n+            - With I(command=find), if I(id) is specified, it will only return the single entity matching the id.\n+            - With I(command=find), otherwise, if I(match_filter) is define, it will use that filter to search.\n+            - With I(command=find), otherwise, if I(properties) are defined, it will do an AND search using all properties.\n+            - With I(command=change_password), a password of a user can be changed. Warning - In case the password is the same as the existing,\n+              it will throw an error.\n+            - With I(command=wait_for_job), the module will wait for a job to either have a status of SUCCESS or ERROR. In case an ERROR status is found,\n+              the module will exit with an error.\n+            - With I(command=wait_for_job), the job will always be returned, even if the state is ERROR situation.\n+            - Either I(state) or I(command) needs to be defined, both can not be defined at the same time.\n+        required: false\n+        default: null\n+        choices:\n+            - find\n+            - change_password\n+            - wait_for_job\n+            - get_csp_enterprise\n+        aliases: []\n+        version_added: \"1.0\"\n+    match_filter:\n+        description:\n+            - A filter used when looking (both in I(command) and I(state) for entities, in the format the Nuage VSP API expects.\n+            - If I(match_filter) is defined, it will take precedence over the I(properties), but not on the I(id)\n+        required: false\n+        default: null\n+        choices: []\n+        aliases: []\n+        version_added: \"1.0\"\n+    properties:\n+        description:\n+            - Properties are the key, value pairs of the different properties an entity has.\n+            - If no I(id) and no I(match_filter) is specified, these are used to find or determine if the entity exists.\n+        required: false\n+        default: null\n+        choices: []\n+        aliases: []\n+        version_added: \"1.0\"\n+    children:\n+        description:\n+            - Can be used to specify a set of child entities.\n+            - A mandatory property of each child is the I(type).\n+            - Supported optional properties of each child are I(id), I(properties) and I(match_filter).\n+            - The function of each of these properties is the same as in the general task definition.\n+            - This can be used recursively\n+            - Only useable in case I(state=present).\n+        required: false\n+        choices: []\n+        aliases: []\n+        version_added: \"1.0\"\n+notes:\n+    - Check mode is supported, but with some caveats. It will not do any changes, and if possible try to determine if it is able do what is requested.\n+    - In case a parent id is provided from a previous task, it might be empty and if a search is possible on root, it will do so, which can impact performance.\n+requirements:\n+    - Supports Nuage VSP 4.0Rx\n+    - Proper VSPK-Python installed for your Nuage version\n+    - Tested with VSP 4.0R7 and VSPK-Python 4.0.7\n+    - Tested with NuageX U(https://nuagex.io), with VSP 4.0R5 and VSPK-Python 4.0.5\n+'''\n+\n+EXAMPLES = '''\n+# This can be executed as a single role, with the following vars\n+# vars:\n+#   auth:\n+#     api_username: csproot\n+#     api_password: csproot\n+#     api_enterprise: csp\n+#     api_url: https://10.0.0.10:8443\n+#     api_version: v4_0\n+#   enterprise_name: Ansible-Enterprise\n+#   enterprise_new_name: Ansible-Updated-Enterprise\n+#\n+# or, for certificate based authentication\n+# vars:\n+#   auth:\n+#     api_username: csproot\n+#     api_certificate: /path/to/user-certificate.pem\n+#     api_key: /path/to/user-Key.pem\n+#     api_enterprise: csp\n+#     api_url: https://10.0.0.10:8443\n+#     api_version: v4_0\n+#   enterprise_name: Ansible-Enterprise\n+#   enterprise_new_name: Ansible-Updated-Enterprise\n+\n+# Creating a new enterprise\n+- name: Create Enterprise\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: Enterprise\n+    state: present\n+    properties:\n+      name: \"{{ enterprise_name }}-basic\"\n+  register: nuage_enterprise\n+\n+# Checking if an Enterprise with the new name already exists\n+- name: Check if an Enterprise exists with the new name\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: Enterprise\n+    command: find\n+    properties:\n+      name: \"{{ enterprise_new_name }}-basic\"\n+  ignore_errors: yes\n+  register: nuage_check_enterprise\n+\n+# Updating an enterprise's name\n+- name: Update Enterprise name\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: Enterprise\n+    id: \"{{ nuage_enterprise.id }}\"\n+    state: present\n+    properties:\n+      name: \"{{ enterprise_new_name }}-basic\"\n+  when: nuage_check_enterprise | failed\n+\n+# Creating a User in an Enterprise\n+- name: Create admin user\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: User\n+    parent_id: \"{{ nuage_enterprise.id }}\"\n+    parent_type: Enterprise\n+    state: present\n+    match_filter: \"userName == 'ansible-admin'\"\n+    properties:\n+      email: \"ansible@localhost.local\"\n+      first_name: \"Ansible\"\n+      last_name: \"Admin\"\n+      password: \"ansible-password\"\n+      user_name: \"ansible-admin\"\n+  register: nuage_user\n+\n+# Updating password for User\n+- name: Update admin password\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: User\n+    id: \"{{ nuage_user.id }}\"\n+    command: change_password\n+    properties:\n+      password: \"ansible-new-password\"\n+  ignore_errors: yes\n+\n+# Finding a group in an enterprise\n+- name: Find Administrators group in Enterprise\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: Group\n+    parent_id: \"{{ nuage_enterprise.id }}\"\n+    parent_type: Enterprise\n+    command: find\n+    properties:\n+      name: \"Administrators\"\n+  register: nuage_group\n+\n+# Assign the user to the group\n+- name: Assign admin user to administrators\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: User\n+    id: \"{{ nuage_user.id }}\"\n+    parent_id: \"{{ nuage_group.id }}\"\n+    parent_type: Group\n+    state: present\n+\n+# Creating multiple DomainTemplates\n+- name: Create multiple DomainTemplates\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: DomainTemplate\n+    parent_id: \"{{ nuage_enterprise.id }}\"\n+    parent_type: Enterprise\n+    state: present\n+    properties:\n+      name: \"{{ item }}\"\n+      description: \"Created by Ansible\"\n+  with_items:\n+    - \"Template-1\"\n+    - \"Template-2\"\n+\n+# Finding all DomainTemplates\n+- name: Fetching all DomainTemplates\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: DomainTemplate\n+    parent_id: \"{{ nuage_enterprise.id }}\"\n+    parent_type: Enterprise\n+    command: find\n+  register: nuage_domain_templates\n+\n+# Deleting all DomainTemplates\n+- name: Deleting all found DomainTemplates\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: DomainTemplate\n+    state: absent\n+    id: \"{{ item.ID }}\"\n+  with_items: \"{{ nuage_domain_templates.entities }}\"\n+  when: nuage_domain_templates.entities is defined\n+\n+# Unassign user from group\n+- name: Unassign admin user to administrators\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: User\n+    id: \"{{ nuage_user.id }}\"\n+    parent_id: \"{{ nuage_group.id }}\"\n+    parent_type: Group\n+    state: absent\n+\n+# Deleting an enterprise\n+- name: Delete Enterprise\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: Enterprise\n+    id: \"{{ nuage_enterprise.id }}\"\n+    state: absent\n+\n+# Setup an enterprise with Children\n+- name: Setup Enterprise and domain structure\n+  connection: local\n+  nuage_vspk:\n+    auth: \"{{ nuage_auth }}\"\n+    type: Enterprise\n+    state: present\n+    properties:\n+      name: \"Child-based-Enterprise\"\n+    children:\n+    - type: L2DomainTemplate\n+      properties:\n+        name: \"Unmanaged-Template\"\n+      children:\n+      - type: EgressACLTemplate\n+        match_filter: \"name == 'Allow All'\"\n+        properties:\n+          name: \"Allow All\"\n+          active: true\n+          default_allow_ip: true\n+          default_allow_non_ip: true\n+          default_install_acl_implicit_rules: true\n+          description: \"Created by Ansible\"\n+          priority_type: \"TOP\"\n+      - type: IngressACLTemplate\n+        match_filter: \"name == 'Allow All'\"\n+        properties:\n+          name: \"Allow All\"\n+          active: true\n+          default_allow_ip: true\n+          default_allow_non_ip: true\n+          description: \"Created by Ansible\"\n+          priority_type: \"TOP\"\n+'''\n+\n+RETURN = '''\n+id:\n+    description: The id of the entity that was found, created, updated or assigned.\n+    returned: On state=present and command=find in case one entity was found.\n+    type: string\n+    sample: bae07d8d-d29c-4e2b-b6ba-621b4807a333\n+entities:\n+    description: A list of entities handled. Each element is the to_dict() of the entity.\n+    returned: On state=present and find, with only one element in case of state=present or find=one.\n+    type: list\n+    sample: [{\n+        \"ID\": acabc435-3946-4117-a719-b8895a335830\",\n+        \"assocEntityType\": \"DOMAIN\",\n+        \"command\": \"BEGIN_POLICY_CHANGES\",\n+        \"creationDate\": 1487515656000,\n+        \"entityScope\": \"ENTERPRISE\",\n+        \"externalID\": null,\n+        \"lastUpdatedBy\": \"8a6f0e20-a4db-4878-ad84-9cc61756cd5e\",\n+        \"lastUpdatedDate\": 1487515656000,\n+        \"owner\": \"8a6f0e20-a4db-4878-ad84-9cc61756cd5e\",\n+        \"parameters\": null,\n+        \"parentID\": \"a22fddb9-3da4-4945-bd2e-9d27fe3d62e0\",\n+        \"parentType\": \"domain\",\n+        \"progress\": 0.0,\n+        \"result\": null,\n+        \"status\": \"RUNNING\"\n+        }]\n+'''\n+\n+import time\n+import importlib\n+from ansible.module_utils.basic import AnsibleModule\n+\n+try:\n+    from bambou.exceptions import BambouHTTPError\n+    HASBAMBOU = True\n+except ImportError:\n+    HASBAMBOU = False\n+\n+SUPPORTED_COMMANDS = ['find', 'change_password', 'wait_for_job', 'get_csp_enterprise']\n+VSPK = None\n+\n+\n+class NuageEntityManager(object):\n+    \"\"\"\n+    This module is meant to manage an entity in a Nuage VSP Platform\n+    \"\"\"\n+\n+    def __init__(self, module):\n+        self.module = module\n+        self.auth = module.params['auth']\n+        self.api_username = None\n+        self.api_password = None\n+        self.api_enterprise = None\n+        self.api_url = None\n+        self.api_version = None\n+        self.api_certificate = None\n+        self.api_key = None\n+        self.type = module.params['type']\n+\n+        self.state = None\n+        if 'state' in list(module.params.keys()):\n+            self.state = module.params['state']\n+\n+        self.command = None\n+        if 'command' in list(module.params.keys()):\n+            self.command = module.params['command']\n+\n+        self.match_filter = None\n+        if 'match_filter' in list(module.params.keys()):\n+            self.match_filter = module.params['match_filter']\n+\n+        self.entity_id = None\n+        if 'id' in list(module.params.keys()):\n+            self.entity_id = module.params['id']\n+\n+        self.parent_id = None\n+        if 'parent_id' in list(module.params.keys()):\n+            self.parent_id = module.params['parent_id']\n+\n+        self.parent_type = None\n+        if 'parent_type' in list(module.params.keys()):\n+            self.parent_type = module.params['parent_type']\n+\n+        self.properties = None\n+        if 'properties' in list(module.params.keys()):\n+            self.properties = module.params['properties']\n+\n+        self.children = None\n+        if 'children' in list(module.params.keys()):","path":"lib/ansible/modules/network/nuage/nuage_vspk.py","position":462,"original_position":462,"commit_id":"ad008f73189d546ae9c0b53511ef1faab2bb3dd2","original_commit_id":"ad008f73189d546ae9c0b53511ef1faab2bb3dd2","user":{"login":"ganeshrn","id":5292461,"avatar_url":"https://avatars3.githubusercontent.com/u/5292461?v=3","gravatar_id":"","url":"https://api.github.com/users/ganeshrn","html_url":"https://github.com/ganeshrn","followers_url":"https://api.github.com/users/ganeshrn/followers","following_url":"https://api.github.com/users/ganeshrn/following{/other_user}","gists_url":"https://api.github.com/users/ganeshrn/gists{/gist_id}","starred_url":"https://api.github.com/users/ganeshrn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ganeshrn/subscriptions","organizations_url":"https://api.github.com/users/ganeshrn/orgs","repos_url":"https://api.github.com/users/ganeshrn/repos","events_url":"https://api.github.com/users/ganeshrn/events{/privacy}","received_events_url":"https://api.github.com/users/ganeshrn/received_events","type":"User","site_admin":false},"body":"Since `children`, `properties` and other's are defined as module args, the key will be present in `params` and initialized to is a default value. Hence the `if` check here and above is not required.\r\n`self.children = module.params['children']` is sufficient ","created_at":"2017-05-26T11:21:50Z","updated_at":"2017-05-26T11:21:51Z","html_url":"https://github.com/ansible/ansible/pull/24895#discussion_r118682261","pull_request_url":"https://api.github.com/repos/ansible/ansible/pulls/24895","_links":{"self":{"href":"https://api.github.com/repos/ansible/ansible/pulls/comments/118682261"},"html":{"href":"https://github.com/ansible/ansible/pull/24895#discussion_r118682261"},"pull_request":{"href":"https://api.github.com/repos/ansible/ansible/pulls/24895"}}},"pull_request":{"url":"https://api.github.com/repos/ansible/ansible/pulls/24895","id":121797357,"html_url":"https://github.com/ansible/ansible/pull/24895","diff_url":"https://github.com/ansible/ansible/pull/24895.diff","patch_url":"https://github.com/ansible/ansible/pull/24895.patch","issue_url":"https://api.github.com/repos/ansible/ansible/issues/24895","number":24895,"state":"open","locked":false,"title":"New module: Adding module for management of the Nuage Networks VSP SDN solution","user":{"login":"pdellaert","id":942391,"avatar_url":"https://avatars2.githubusercontent.com/u/942391?v=3","gravatar_id":"","url":"https://api.github.com/users/pdellaert","html_url":"https://github.com/pdellaert","followers_url":"https://api.github.com/users/pdellaert/followers","following_url":"https://api.github.com/users/pdellaert/following{/other_user}","gists_url":"https://api.github.com/users/pdellaert/gists{/gist_id}","starred_url":"https://api.github.com/users/pdellaert/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pdellaert/subscriptions","organizations_url":"https://api.github.com/users/pdellaert/orgs","repos_url":"https://api.github.com/users/pdellaert/repos","events_url":"https://api.github.com/users/pdellaert/events{/privacy}","received_events_url":"https://api.github.com/users/pdellaert/received_events","type":"User","site_admin":false},"body":"##### SUMMARY\r\nAdding a new module to manage the Nuage Networks VSP SDN solution through its Python SDK.\r\n\r\n##### ISSUE TYPE\r\n - New Module Pull Request\r\n\r\n##### COMPONENT NAME\r\nnuage_vspk\r\n\r\n##### ANSIBLE VERSION\r\n```\r\nansible 2.3.0.0\r\n  config file =\r\n  configured module search path = Default w/o overrides\r\n  python version = 2.7.13 (default, Dec 17 2016, 23:03:43) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]\r\n```","created_at":"2017-05-22T14:57:15Z","updated_at":"2017-05-26T11:21:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"00a05d1339d2bf5fc842d3b80645ecdfb636b475","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/ansible/ansible/pulls/24895/commits","review_comments_url":"https://api.github.com/repos/ansible/ansible/pulls/24895/comments","review_comment_url":"https://api.github.com/repos/ansible/ansible/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ansible/ansible/issues/24895/comments","statuses_url":"https://api.github.com/repos/ansible/ansible/statuses/ad008f73189d546ae9c0b53511ef1faab2bb3dd2","head":{"label":"nuagenetworks:devel","ref":"devel","sha":"ad008f73189d546ae9c0b53511ef1faab2bb3dd2","user":{"login":"nuagenetworks","id":3334345,"avatar_url":"https://avatars2.githubusercontent.com/u/3334345?v=3","gravatar_id":"","url":"https://api.github.com/users/nuagenetworks","html_url":"https://github.com/nuagenetworks","followers_url":"https://api.github.com/users/nuagenetworks/followers","following_url":"https://api.github.com/users/nuagenetworks/following{/other_user}","gists_url":"https://api.github.com/users/nuagenetworks/gists{/gist_id}","starred_url":"https://api.github.com/users/nuagenetworks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nuagenetworks/subscriptions","organizations_url":"https://api.github.com/users/nuagenetworks/orgs","repos_url":"https://api.github.com/users/nuagenetworks/repos","events_url":"https://api.github.com/users/nuagenetworks/events{/privacy}","received_events_url":"https://api.github.com/users/nuagenetworks/received_events","type":"Organization","site_admin":false},"repo":{"id":92064772,"name":"ansible","full_name":"nuagenetworks/ansible","owner":{"login":"nuagenetworks","id":3334345,"avatar_url":"https://avatars2.githubusercontent.com/u/3334345?v=3","gravatar_id":"","url":"https://api.github.com/users/nuagenetworks","html_url":"https://github.com/nuagenetworks","followers_url":"https://api.github.com/users/nuagenetworks/followers","following_url":"https://api.github.com/users/nuagenetworks/following{/other_user}","gists_url":"https://api.github.com/users/nuagenetworks/gists{/gist_id}","starred_url":"https://api.github.com/users/nuagenetworks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nuagenetworks/subscriptions","organizations_url":"https://api.github.com/users/nuagenetworks/orgs","repos_url":"https://api.github.com/users/nuagenetworks/repos","events_url":"https://api.github.com/users/nuagenetworks/events{/privacy}","received_events_url":"https://api.github.com/users/nuagenetworks/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nuagenetworks/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.","fork":true,"url":"https://api.github.com/repos/nuagenetworks/ansible","forks_url":"https://api.github.com/repos/nuagenetworks/ansible/forks","keys_url":"https://api.github.com/repos/nuagenetworks/ansible/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nuagenetworks/ansible/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nuagenetworks/ansible/teams","hooks_url":"https://api.github.com/repos/nuagenetworks/ansible/hooks","issue_events_url":"https://api.github.com/repos/nuagenetworks/ansible/issues/events{/number}","events_url":"https://api.github.com/repos/nuagenetworks/ansible/events","assignees_url":"https://api.github.com/repos/nuagenetworks/ansible/assignees{/user}","branches_url":"https://api.github.com/repos/nuagenetworks/ansible/branches{/branch}","tags_url":"https://api.github.com/repos/nuagenetworks/ansible/tags","blobs_url":"https://api.github.com/repos/nuagenetworks/ansible/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nuagenetworks/ansible/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nuagenetworks/ansible/git/refs{/sha}","trees_url":"https://api.github.com/repos/nuagenetworks/ansible/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nuagenetworks/ansible/statuses/{sha}","languages_url":"https://api.github.com/repos/nuagenetworks/ansible/languages","stargazers_url":"https://api.github.com/repos/nuagenetworks/ansible/stargazers","contributors_url":"https://api.github.com/repos/nuagenetworks/ansible/contributors","subscribers_url":"https://api.github.com/repos/nuagenetworks/ansible/subscribers","subscription_url":"https://api.github.com/repos/nuagenetworks/ansible/subscription","commits_url":"https://api.github.com/repos/nuagenetworks/ansible/commits{/sha}","git_commits_url":"https://api.github.com/repos/nuagenetworks/ansible/git/commits{/sha}","comments_url":"https://api.github.com/repos/nuagenetworks/ansible/comments{/number}","issue_comment_url":"https://api.github.com/repos/nuagenetworks/ansible/issues/comments{/number}","contents_url":"https://api.github.com/repos/nuagenetworks/ansible/contents/{+path}","compare_url":"https://api.github.com/repos/nuagenetworks/ansible/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nuagenetworks/ansible/merges","archive_url":"https://api.github.com/repos/nuagenetworks/ansible/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nuagenetworks/ansible/downloads","issues_url":"https://api.github.com/repos/nuagenetworks/ansible/issues{/number}","pulls_url":"https://api.github.com/repos/nuagenetworks/ansible/pulls{/number}","milestones_url":"https://api.github.com/repos/nuagenetworks/ansible/milestones{/number}","notifications_url":"https://api.github.com/repos/nuagenetworks/ansible/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nuagenetworks/ansible/labels{/name}","releases_url":"https://api.github.com/repos/nuagenetworks/ansible/releases{/id}","deployments_url":"https://api.github.com/repos/nuagenetworks/ansible/deployments","created_at":"2017-05-22T14:45:34Z","updated_at":"2017-05-22T14:45:55Z","pushed_at":"2017-05-22T15:10:10Z","git_url":"git://github.com/nuagenetworks/ansible.git","ssh_url":"git@github.com:nuagenetworks/ansible.git","clone_url":"https://github.com/nuagenetworks/ansible.git","svn_url":"https://github.com/nuagenetworks/ansible","homepage":"http://ansible.com/","size":74677,"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,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"devel"}},"base":{"label":"ansible:devel","ref":"devel","sha":"9fb9c00092c240774699a316ed21467d449f7009","user":{"login":"ansible","id":1507452,"avatar_url":"https://avatars1.githubusercontent.com/u/1507452?v=3","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,"name":"ansible","full_name":"ansible/ansible","owner":{"login":"ansible","id":1507452,"avatar_url":"https://avatars1.githubusercontent.com/u/1507452?v=3","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},"private":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.","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":"2017-05-26T11:08:47Z","pushed_at":"2017-05-26T11:02:54Z","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":"http://ansible.com/","size":77047,"stargazers_count":23358,"watchers_count":23358,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":7806,"mirror_url":null,"open_issues_count":3162,"forks":7806,"open_issues":3162,"watchers":23358,"default_branch":"devel"}},"_links":{"self":{"href":"https://api.github.com/repos/ansible/ansible/pulls/24895"},"html":{"href":"https://github.com/ansible/ansible/pull/24895"},"issue":{"href":"https://api.github.com/repos/ansible/ansible/issues/24895"},"comments":{"href":"https://api.github.com/repos/ansible/ansible/issues/24895/comments"},"review_comments":{"href":"https://api.github.com/repos/ansible/ansible/pulls/24895/comments"},"review_comment":{"href":"https://api.github.com/repos/ansible/ansible/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ansible/ansible/pulls/24895/commits"},"statuses":{"href":"https://api.github.com/repos/ansible/ansible/statuses/ad008f73189d546ae9c0b53511ef1faab2bb3dd2"}}}}
{"actor":{"display_login":"ganeshrn"}}