{"action":"created","comment":{"url":"https://api.github.com/repos/ansible/awx/pulls/comments/218427006","pull_request_review_id":156360572,"id":218427006,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxODQyNzAwNg==","diff_hunk":"@@ -0,0 +1,120 @@\n+# Copyright (c) 2015 Ansible, Inc.\n+# All Rights Reserved.\n+import os\n+import logging\n+from multiprocessing import Process\n+\n+from django.conf import settings\n+from django.core.cache import cache as django_cache\n+from django.core.management.base import BaseCommand\n+from django.db import connection as django_connection\n+from kombu import Connection, Exchange, Queue\n+\n+from awx.main.dispatch import get_local_queuename, reaper\n+from awx.main.dispatch.control import Control\n+from awx.main.dispatch.pool import AutoscalePool\n+from awx.main.dispatch.worker import AWXConsumer, TaskWorker, LeastBusyStrategy\n+\n+logger = logging.getLogger('awx.main.dispatch')\n+\n+\n+def construct_bcast_queue_name(common_name):\n+    return common_name.encode('utf8') + '_' + settings.CLUSTER_HOST_ID\n+\n+\n+class Command(BaseCommand):\n+    help = 'Launch the task dispatcher'\n+\n+    def add_arguments(self, parser):\n+        parser.add_argument('--status', dest='status', action='store_true',\n+                            help='print the internal state of any running dispatchers')\n+        parser.add_argument('--reload', dest='reload', action='store_true',\n+                            help=('cause the dispatcher to recycle all of its worker processes;'\n+                                  'running jobs will run to completion first'))\n+\n+    def beat(self):","path":"awx/main/management/commands/run_dispatcher.py","position":35,"original_position":35,"commit_id":"f70e6345a81af51e33f4e1ee715f2f73197f6f77","original_commit_id":"f70e6345a81af51e33f4e1ee715f2f73197f6f77","user":{"login":"ryanpetrello","id":214912,"node_id":"MDQ6VXNlcjIxNDkxMg==","avatar_url":"https://avatars1.githubusercontent.com/u/214912?v=4","gravatar_id":"","url":"https://api.github.com/users/ryanpetrello","html_url":"https://github.com/ryanpetrello","followers_url":"https://api.github.com/users/ryanpetrello/followers","following_url":"https://api.github.com/users/ryanpetrello/following{/other_user}","gists_url":"https://api.github.com/users/ryanpetrello/gists{/gist_id}","starred_url":"https://api.github.com/users/ryanpetrello/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ryanpetrello/subscriptions","organizations_url":"https://api.github.com/users/ryanpetrello/orgs","repos_url":"https://api.github.com/users/ryanpetrello/repos","events_url":"https://api.github.com/users/ryanpetrello/events{/privacy}","received_events_url":"https://api.github.com/users/ryanpetrello/received_events","type":"User","site_admin":false},"body":"We don't use celery workers anymore, but we're still using celerybeat for now, because it works.  We _may_ replace this in the future if we really want to lose the dependency on the celery library.","created_at":"2018-09-18T13:18:08Z","updated_at":"2018-09-18T13:18:08Z","html_url":"https://github.com/ansible/awx/pull/2266#discussion_r218427006","pull_request_url":"https://api.github.com/repos/ansible/awx/pulls/2266","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/ansible/awx/pulls/comments/218427006"},"html":{"href":"https://github.com/ansible/awx/pull/2266#discussion_r218427006"},"pull_request":{"href":"https://api.github.com/repos/ansible/awx/pulls/2266"}}},"pull_request":{"url":"https://api.github.com/repos/ansible/awx/pulls/2266","id":216296284,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE2Mjk2Mjg0","html_url":"https://github.com/ansible/awx/pull/2266","diff_url":"https://github.com/ansible/awx/pull/2266.diff","patch_url":"https://github.com/ansible/awx/pull/2266.patch","issue_url":"https://api.github.com/repos/ansible/awx/issues/2266","number":2266,"state":"open","locked":false,"title":"RFC: replace the celery-based task queue with a kombu-based implementation","user":{"login":"ryanpetrello","id":214912,"node_id":"MDQ6VXNlcjIxNDkxMg==","avatar_url":"https://avatars1.githubusercontent.com/u/214912?v=4","gravatar_id":"","url":"https://api.github.com/users/ryanpetrello","html_url":"https://github.com/ryanpetrello","followers_url":"https://api.github.com/users/ryanpetrello/followers","following_url":"https://api.github.com/users/ryanpetrello/following{/other_user}","gists_url":"https://api.github.com/users/ryanpetrello/gists{/gist_id}","starred_url":"https://api.github.com/users/ryanpetrello/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ryanpetrello/subscriptions","organizations_url":"https://api.github.com/users/ryanpetrello/orgs","repos_url":"https://api.github.com/users/ryanpetrello/repos","events_url":"https://api.github.com/users/ryanpetrello/events{/privacy}","received_events_url":"https://api.github.com/users/ryanpetrello/received_events","type":"User","site_admin":false},"body":"https://github.com/ansible/awx/pull/2266/files#diff-7fa70f719d2eaf50980938d7e70ad6ab\r\n\r\nThis change implements `awx-manage run_dispatcher`, a new command that binds to RMQ via kombu and balances messages across a pool of workers that are similar to celeryd workers in spirit.  Specifically, this includes:\r\n\r\n- a new decorator, `awx.main.dispatch.task`, which can be used to decorate functions or classes so that they can be designated as \"Tasks\"\r\n- support for fanout/broadcast tasks (at this point in time, only `conf.Setting` memcached flushes use this functionality)\r\n- support for job reaping\r\n- support for success/failure hooks for job runs (i.e., `handle_work_success` and `handle_work_failure`)\r\n- support for auto scaling worker pool that scale processes up and down on demand\r\n- minimal support for RPC, such as status checks and pool recycle/reload","created_at":"2018-09-18T12:51:57Z","updated_at":"2018-09-18T13:18:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"85f9bfe4a511b36ff336826cb5189909d4f80ca7","assignee":null,"assignees":[],"requested_reviewers":[{"login":"wwitzel3","id":27317,"node_id":"MDQ6VXNlcjI3MzE3","avatar_url":"https://avatars1.githubusercontent.com/u/27317?v=4","gravatar_id":"","url":"https://api.github.com/users/wwitzel3","html_url":"https://github.com/wwitzel3","followers_url":"https://api.github.com/users/wwitzel3/followers","following_url":"https://api.github.com/users/wwitzel3/following{/other_user}","gists_url":"https://api.github.com/users/wwitzel3/gists{/gist_id}","starred_url":"https://api.github.com/users/wwitzel3/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wwitzel3/subscriptions","organizations_url":"https://api.github.com/users/wwitzel3/orgs","repos_url":"https://api.github.com/users/wwitzel3/repos","events_url":"https://api.github.com/users/wwitzel3/events{/privacy}","received_events_url":"https://api.github.com/users/wwitzel3/received_events","type":"User","site_admin":false},{"login":"matburt","id":89544,"node_id":"MDQ6VXNlcjg5NTQ0","avatar_url":"https://avatars0.githubusercontent.com/u/89544?v=4","gravatar_id":"","url":"https://api.github.com/users/matburt","html_url":"https://github.com/matburt","followers_url":"https://api.github.com/users/matburt/followers","following_url":"https://api.github.com/users/matburt/following{/other_user}","gists_url":"https://api.github.com/users/matburt/gists{/gist_id}","starred_url":"https://api.github.com/users/matburt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matburt/subscriptions","organizations_url":"https://api.github.com/users/matburt/orgs","repos_url":"https://api.github.com/users/matburt/repos","events_url":"https://api.github.com/users/matburt/events{/privacy}","received_events_url":"https://api.github.com/users/matburt/received_events","type":"User","site_admin":false},{"login":"chrismeyersfsu","id":722880,"node_id":"MDQ6VXNlcjcyMjg4MA==","avatar_url":"https://avatars3.githubusercontent.com/u/722880?v=4","gravatar_id":"","url":"https://api.github.com/users/chrismeyersfsu","html_url":"https://github.com/chrismeyersfsu","followers_url":"https://api.github.com/users/chrismeyersfsu/followers","following_url":"https://api.github.com/users/chrismeyersfsu/following{/other_user}","gists_url":"https://api.github.com/users/chrismeyersfsu/gists{/gist_id}","starred_url":"https://api.github.com/users/chrismeyersfsu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chrismeyersfsu/subscriptions","organizations_url":"https://api.github.com/users/chrismeyersfsu/orgs","repos_url":"https://api.github.com/users/chrismeyersfsu/repos","events_url":"https://api.github.com/users/chrismeyersfsu/events{/privacy}","received_events_url":"https://api.github.com/users/chrismeyersfsu/received_events","type":"User","site_admin":false},{"login":"AlanCoding","id":1385596,"node_id":"MDQ6VXNlcjEzODU1OTY=","avatar_url":"https://avatars3.githubusercontent.com/u/1385596?v=4","gravatar_id":"","url":"https://api.github.com/users/AlanCoding","html_url":"https://github.com/AlanCoding","followers_url":"https://api.github.com/users/AlanCoding/followers","following_url":"https://api.github.com/users/AlanCoding/following{/other_user}","gists_url":"https://api.github.com/users/AlanCoding/gists{/gist_id}","starred_url":"https://api.github.com/users/AlanCoding/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AlanCoding/subscriptions","organizations_url":"https://api.github.com/users/AlanCoding/orgs","repos_url":"https://api.github.com/users/AlanCoding/repos","events_url":"https://api.github.com/users/AlanCoding/events{/privacy}","received_events_url":"https://api.github.com/users/AlanCoding/received_events","type":"User","site_admin":false},{"login":"jladdjr","id":4440360,"node_id":"MDQ6VXNlcjQ0NDAzNjA=","avatar_url":"https://avatars3.githubusercontent.com/u/4440360?v=4","gravatar_id":"","url":"https://api.github.com/users/jladdjr","html_url":"https://github.com/jladdjr","followers_url":"https://api.github.com/users/jladdjr/followers","following_url":"https://api.github.com/users/jladdjr/following{/other_user}","gists_url":"https://api.github.com/users/jladdjr/gists{/gist_id}","starred_url":"https://api.github.com/users/jladdjr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jladdjr/subscriptions","organizations_url":"https://api.github.com/users/jladdjr/orgs","repos_url":"https://api.github.com/users/jladdjr/repos","events_url":"https://api.github.com/users/jladdjr/events{/privacy}","received_events_url":"https://api.github.com/users/jladdjr/received_events","type":"User","site_admin":false},{"login":"rooftopcellist","id":11698892,"node_id":"MDQ6VXNlcjExNjk4ODky","avatar_url":"https://avatars1.githubusercontent.com/u/11698892?v=4","gravatar_id":"","url":"https://api.github.com/users/rooftopcellist","html_url":"https://github.com/rooftopcellist","followers_url":"https://api.github.com/users/rooftopcellist/followers","following_url":"https://api.github.com/users/rooftopcellist/following{/other_user}","gists_url":"https://api.github.com/users/rooftopcellist/gists{/gist_id}","starred_url":"https://api.github.com/users/rooftopcellist/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rooftopcellist/subscriptions","organizations_url":"https://api.github.com/users/rooftopcellist/orgs","repos_url":"https://api.github.com/users/rooftopcellist/repos","events_url":"https://api.github.com/users/rooftopcellist/events{/privacy}","received_events_url":"https://api.github.com/users/rooftopcellist/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":687172858,"node_id":"MDU6TGFiZWw2ODcxNzI4NTg=","url":"https://api.github.com/repos/ansible/awx/labels/state:needs_triage","name":"state:needs_triage","color":"A0522D","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ansible/awx/pulls/2266/commits","review_comments_url":"https://api.github.com/repos/ansible/awx/pulls/2266/comments","review_comment_url":"https://api.github.com/repos/ansible/awx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ansible/awx/issues/2266/comments","statuses_url":"https://api.github.com/repos/ansible/awx/statuses/f70e6345a81af51e33f4e1ee715f2f73197f6f77","head":{"label":"ansible:celery-tastes-bad","ref":"celery-tastes-bad","sha":"f70e6345a81af51e33f4e1ee715f2f73197f6f77","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":91594105,"node_id":"MDEwOlJlcG9zaXRvcnk5MTU5NDEwNQ==","name":"awx","full_name":"ansible/awx","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/awx","description":"AWX Project","fork":false,"url":"https://api.github.com/repos/ansible/awx","forks_url":"https://api.github.com/repos/ansible/awx/forks","keys_url":"https://api.github.com/repos/ansible/awx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ansible/awx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ansible/awx/teams","hooks_url":"https://api.github.com/repos/ansible/awx/hooks","issue_events_url":"https://api.github.com/repos/ansible/awx/issues/events{/number}","events_url":"https://api.github.com/repos/ansible/awx/events","assignees_url":"https://api.github.com/repos/ansible/awx/assignees{/user}","branches_url":"https://api.github.com/repos/ansible/awx/branches{/branch}","tags_url":"https://api.github.com/repos/ansible/awx/tags","blobs_url":"https://api.github.com/repos/ansible/awx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ansible/awx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ansible/awx/git/refs{/sha}","trees_url":"https://api.github.com/repos/ansible/awx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ansible/awx/statuses/{sha}","languages_url":"https://api.github.com/repos/ansible/awx/languages","stargazers_url":"https://api.github.com/repos/ansible/awx/stargazers","contributors_url":"https://api.github.com/repos/ansible/awx/contributors","subscribers_url":"https://api.github.com/repos/ansible/awx/subscribers","subscription_url":"https://api.github.com/repos/ansible/awx/subscription","commits_url":"https://api.github.com/repos/ansible/awx/commits{/sha}","git_commits_url":"https://api.github.com/repos/ansible/awx/git/commits{/sha}","comments_url":"https://api.github.com/repos/ansible/awx/comments{/number}","issue_comment_url":"https://api.github.com/repos/ansible/awx/issues/comments{/number}","contents_url":"https://api.github.com/repos/ansible/awx/contents/{+path}","compare_url":"https://api.github.com/repos/ansible/awx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ansible/awx/merges","archive_url":"https://api.github.com/repos/ansible/awx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ansible/awx/downloads","issues_url":"https://api.github.com/repos/ansible/awx/issues{/number}","pulls_url":"https://api.github.com/repos/ansible/awx/pulls{/number}","milestones_url":"https://api.github.com/repos/ansible/awx/milestones{/number}","notifications_url":"https://api.github.com/repos/ansible/awx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ansible/awx/labels{/name}","releases_url":"https://api.github.com/repos/ansible/awx/releases{/id}","deployments_url":"https://api.github.com/repos/ansible/awx/deployments","created_at":"2017-05-17T15:50:14Z","updated_at":"2018-09-18T12:37:22Z","pushed_at":"2018-09-18T12:55:38Z","git_url":"git://github.com/ansible/awx.git","ssh_url":"git@github.com:ansible/awx.git","clone_url":"https://github.com/ansible/awx.git","svn_url":"https://github.com/ansible/awx","homepage":"","size":202846,"stargazers_count":4459,"watchers_count":4459,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":866,"mirror_url":null,"archived":false,"open_issues_count":478,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":866,"open_issues":478,"watchers":4459,"default_branch":"devel"}},"base":{"label":"ansible:devel","ref":"devel","sha":"5910b8c5627d46ad52a41801c6998322973c650e","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":91594105,"node_id":"MDEwOlJlcG9zaXRvcnk5MTU5NDEwNQ==","name":"awx","full_name":"ansible/awx","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/awx","description":"AWX Project","fork":false,"url":"https://api.github.com/repos/ansible/awx","forks_url":"https://api.github.com/repos/ansible/awx/forks","keys_url":"https://api.github.com/repos/ansible/awx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ansible/awx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ansible/awx/teams","hooks_url":"https://api.github.com/repos/ansible/awx/hooks","issue_events_url":"https://api.github.com/repos/ansible/awx/issues/events{/number}","events_url":"https://api.github.com/repos/ansible/awx/events","assignees_url":"https://api.github.com/repos/ansible/awx/assignees{/user}","branches_url":"https://api.github.com/repos/ansible/awx/branches{/branch}","tags_url":"https://api.github.com/repos/ansible/awx/tags","blobs_url":"https://api.github.com/repos/ansible/awx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ansible/awx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ansible/awx/git/refs{/sha}","trees_url":"https://api.github.com/repos/ansible/awx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ansible/awx/statuses/{sha}","languages_url":"https://api.github.com/repos/ansible/awx/languages","stargazers_url":"https://api.github.com/repos/ansible/awx/stargazers","contributors_url":"https://api.github.com/repos/ansible/awx/contributors","subscribers_url":"https://api.github.com/repos/ansible/awx/subscribers","subscription_url":"https://api.github.com/repos/ansible/awx/subscription","commits_url":"https://api.github.com/repos/ansible/awx/commits{/sha}","git_commits_url":"https://api.github.com/repos/ansible/awx/git/commits{/sha}","comments_url":"https://api.github.com/repos/ansible/awx/comments{/number}","issue_comment_url":"https://api.github.com/repos/ansible/awx/issues/comments{/number}","contents_url":"https://api.github.com/repos/ansible/awx/contents/{+path}","compare_url":"https://api.github.com/repos/ansible/awx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ansible/awx/merges","archive_url":"https://api.github.com/repos/ansible/awx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ansible/awx/downloads","issues_url":"https://api.github.com/repos/ansible/awx/issues{/number}","pulls_url":"https://api.github.com/repos/ansible/awx/pulls{/number}","milestones_url":"https://api.github.com/repos/ansible/awx/milestones{/number}","notifications_url":"https://api.github.com/repos/ansible/awx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ansible/awx/labels{/name}","releases_url":"https://api.github.com/repos/ansible/awx/releases{/id}","deployments_url":"https://api.github.com/repos/ansible/awx/deployments","created_at":"2017-05-17T15:50:14Z","updated_at":"2018-09-18T12:37:22Z","pushed_at":"2018-09-18T12:55:38Z","git_url":"git://github.com/ansible/awx.git","ssh_url":"git@github.com:ansible/awx.git","clone_url":"https://github.com/ansible/awx.git","svn_url":"https://github.com/ansible/awx","homepage":"","size":202846,"stargazers_count":4459,"watchers_count":4459,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":866,"mirror_url":null,"archived":false,"open_issues_count":478,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":866,"open_issues":478,"watchers":4459,"default_branch":"devel"}},"_links":{"self":{"href":"https://api.github.com/repos/ansible/awx/pulls/2266"},"html":{"href":"https://github.com/ansible/awx/pull/2266"},"issue":{"href":"https://api.github.com/repos/ansible/awx/issues/2266"},"comments":{"href":"https://api.github.com/repos/ansible/awx/issues/2266/comments"},"review_comments":{"href":"https://api.github.com/repos/ansible/awx/pulls/2266/comments"},"review_comment":{"href":"https://api.github.com/repos/ansible/awx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ansible/awx/pulls/2266/commits"},"statuses":{"href":"https://api.github.com/repos/ansible/awx/statuses/f70e6345a81af51e33f4e1ee715f2f73197f6f77"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"ryanpetrello"}}