{"action":"created","comment":{"url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls/comments/180158417","pull_request_review_id":110523406,"id":180158417,"diff_hunk":"@@ -0,0 +1,301 @@\n+# -*- coding: utf-8 -*-\n+# Copyright (c) 2016-present, CloudZero, Inc. All rights reserved.\n+# Licensed under the BSD-style license. See LICENSE file in the project root for full license information.\n+\n+\"\"\"\n+Contains useful functions for processing ARNs of all shapes and sizes.\n+\"\"\"\n+\n+import re\n+import lambda_tools as lt\n+\n+\n+_ARN_MATCH_REGEX = re.compile('^arn:aws:([a-z0-9\\-]+):([a-z0-9\\-]*):(\\d{12})*:(.+$)$')\n+\n+logger = lt.setup_logging('reactor')\n+\n+\n+# We can't use boto to reliably give us a list of all the service type strings without extra work.\n+# The set of strings that can appear in arns is different than what can be used with the boto API,\n+# however there is significant overlap.\n+# TODO: establish mappings for these 2 domains\n+\n+_service_types_in_arns = {\n+    'a4b', 'apigateway', 'execute-api', 'appsync', 'artifact', 'autoscaling', 'acm', 'cloud9', 'clouddirectory',\n+    'cloudformation', 'cloudfront', 'cloudsearch', 'cloudtrail', 'cloudwatch', 'events', 'logs', 'codebuild',\n+    'codecommit', 'codedeploy', 'cognito-idp', 'cognito-identity', 'cognito-sync', 'config', 'codepipeline',\n+    'codestar', 'directconnect', 'ds', 'dynamodb', 'ecr', 'ecs', 'ec2', 'elasticbeanstalk', 'elasticfilesystem',\n+    'elasticloadbalancing', 'elastictranscoder', 'elasticache', 'es', 'glacier', 'guardduty', 'health', 'iam',\n+    'sts', 'iot', 'kms', 'firehose', 'kinesis', 'kinesisanalytics', 'kinesisvideo', 'lambda', 'machinelearning',\n+    'mediaconvert', 'medialive', 'mediapackage', 'mediastore', 'mediatailor', 'organizations', 'mobilehub', 'mq',\n+    'mobiletargeting', 'polly', 'redshift', 'rds', 'route53', 'serverlessrepo', 'ses', 'ssm', 'sns', 'sqs', 's3',\n+    'swf', 'states', 'storagegateway', 'trustedadvisor', 'waf', 'waf-regional'\n+}\n+\n+_service_types_unique_to_boto = {\n+    'inspector', 'mediastore-data', 'iot-jobs-data', 'gamelift', 'greengrass', 'autoscaling-plans', 'workmail',\n+    'elb', 'mgh', 'opsworkscm', 'application-autoscaling', 'servicecatalog', 'sagemaker', 'cloudhsmv2', 'opsworks',\n+    'mturk', 'budgets', 'emr', 'cur', 'cloudsearchdomain', 'lightsail', 'ce', 'workdocs', 'athena', 'mobile',\n+    'resourcegroupstaggingapi', 'servicediscovery', 'kinesis-video-archived-media', 'resource-groups', 'sdb',\n+    'snowball', 'route53domains', 'glue', 'efs', 'marketplacecommerceanalytics', 'devicefarm', 'support',\n+    'lex-runtime', 'alexaforbusiness', 'elbv2', 'marketplace-entitlement', 'workspaces', 'rekognition', 'cloudhsm',\n+    'kinesis-video-media', 'pricing', 'comprehend', 'batch', 'sms', 'discovery', 'iot-data', 'pinpoint', 'dax',\n+    'xray', 'datapipeline', 'dynamodbstreams', 'stepfunctions', 'transcribe', 'importexport', 'dms', 'translate',\n+    'lex-models', 'appstream', 'sagemaker-runtime', 'meteringmarketplace', 'shield'\n+}\n+\n+_service_types_unique_to_arns = {\n+    'trustedadvisor', 'elasticfilesystem', 'a4b', 'states', 'mobilehub', 'mediatailor', 'execute-api',\n+    'artifact', 'mobiletargeting', 'elasticloadbalancing'\n+}\n+\n+\n+# As part of extracting resource types, we also transform/map certain strings to more readable\n+# normalized equivalents.  ARNs vary in quality for self-documentation.\n+_transformable_resource_type_names = {\n+    'applicationversion': 'application-version',\n+    'autoscalinggroup': 'group',\n+    'batchprediction': 'batch-prediction',\n+    'bytematchset': 'byte-match-set',\n+    'channels': 'channel',\n+    'checks': 'check',\n+    'configurations': 'configuration',\n+    'configurationtemplate': 'configuration-template',\n+    'datasource': 'data-source',\n+    'db': 'instance',\n+    'dbuser': 'database-user',\n+    'deliverystream': 'delivery-stream',\n+    'dxcon': 'connection',\n+    'dxlag': 'lag',\n+    'dxvif': 'virtual-interface',\n+    'es': 'subscription',\n+    'event-source-mappings': 'event-source-mapping',\n+    'hostedzone': 'hosted-zone',\n+    'inputsecuritygroup': 'input-security-group',\n+    'ipset': 'ip-set',\n+    'jobs': 'job',\n+    'jobtemplates': 'job-template',\n+    'maintenancewindow': 'maintenance-window',\n+    'mlmodel': 'learning-model',\n+    'og': 'option-group',\n+    'origin_endpoints': 'origin-endpoint',\n+    'ou': 'organizational-unit',\n+    'parametergroup': 'parameter-group',\n+    'patchbaseline': 'baseline',\n+    'pg': 'parameter-group',\n+    'presets': 'preset',\n+    'queues': 'queue',\n+    'scalingpolicy': 'policy',\n+    'secgrp': 'security-group',\n+    'securitygroup': 'security-group',\n+    'solutionstack': 'solution-stack',\n+    'statemachine': 'state-machine',\n+    'subgrp': 'subnet-group',\n+    'subnetgroup': 'subnet-group',\n+    'threatintelset': 'threat-intel-set',\n+    'vaults': 'vault',\n+    'webacl': 'web-acl',\n+}\n+\n+\n+def get_resource_type_from_arn(arn):\n+    \"\"\"\n+    Get a normalized resource type from an ARN\n+\n+    Args:\n+        arn: (str) - the arn to deconstruct\n+\n+    Returns:\n+        str - a canonical resource type name\n+    \"\"\"\n+    if not arn:\n+        return None\n+    try:\n+        arn_match = re.fullmatch(_ARN_MATCH_REGEX, arn)\n+        if not arn_match or len(arn_match.groups()) != 4:\n+            raise ValueError('ARN did not match standard regex')\n+\n+        service, _, _, resource = arn_match.groups()\n+        if service not in _service_types_in_arns:\n+            raise ValueError(f'Unknown service {service}')\n+        custom_handlers_map = _get_resource_type_custom_handlers()\n+        if service in custom_handlers_map:\n+            return custom_handlers_map[service](resource)\n+        elif '/' in resource:\n+            return _normalize_resource_type_name(resource.split('/')[0])\n+        elif ':' in resource:\n+            return _normalize_resource_type_name(resource.split(':')[0])\n+        else:\n+            return None\n+    except Exception as e:\n+        logger.exception(e)\n+        logger.warning(f'Invalid ARN: {arn}')\n+        return None\n+\n+\n+def _extract_appsync_resource_types(arn_resource):\n+    if '/types/Query/' in arn_resource:\n+        return 'query-field'\n+    if '/types/Mutation/' in arn_resource:\n+        return 'mutation-field'\n+    if '/types/Subscription/' in arn_resource:\n+        return 'subscription-field'\n+    return None\n+\n+\n+def _extract_logs_resource_types(arn_resource):\n+    if arn_resource.startswith('log-group') and 'log-stream' not in arn_resource:\n+        return 'log-group'\n+    if arn_resource.startswith('log-group') and 'log-stream' in arn_resource:\n+        return 'log-stream'\n+    return None\n+\n+\n+def _extract_cognito_sync_resource_types(arn_resource):\n+    if arn_resource.startswith('identitypool') and '/identity/' not in arn_resource and '/dataset/' not in arn_resource:\n+        return 'identity-pool'\n+    if arn_resource.startswith('identitypool') and '/identity/' in arn_resource and '/dataset/' not in arn_resource:\n+        return 'identity'\n+    if arn_resource.startswith('identitypool') and '/identity/' in arn_resource and '/dataset/' in arn_resource:\n+        return 'dataset'\n+    return None\n+\n+\n+def _extract_elasticloadbalancing_resource_types(arn_resource):\n+    # These are wacky special cases because the resource type includes a delimiter\n+    if arn_resource.startswith('loadbalancer/') and len(arn_resource.split('/')) == 2:\n+        return 'classic-load-balancer'\n+    if arn_resource.startswith('loadbalancer/app'):\n+        return 'app-load-balancer'\n+    if arn_resource.startswith('loadbalancer/net'):\n+        return 'net-load-balancer'\n+    if arn_resource.startswith('listener/app'):\n+        return 'app-load-balancer-listener'\n+    if arn_resource.startswith('listener/net'):\n+        return 'net-load-balancer-listener'\n+    if arn_resource.startswith('listener-rule/app'):\n+        return 'app-load-balancer-listener-rule'\n+    if arn_resource.startswith('listener-rule/net'):\n+        return 'net-load-balancer-listener-rule'\n+    if arn_resource.startswith('targetgroup'):\n+        return 'target-group'\n+    return None\n+\n+\n+def _extract_iam_resource_types(arn_resource):\n+    if arn_resource == 'root':\n+        return 'root'","path":"reactor/aws/arn_utils.py","position":187,"original_position":187,"commit_id":"33fd82ce56825f2871b47bf3925686aa8eaa85b8","original_commit_id":"01dee83ef6b5bcacfa07952ab51f727c46fed25e","user":{"login":"silvexis","id":609050,"avatar_url":"https://avatars0.githubusercontent.com/u/609050?v=4","gravatar_id":"","url":"https://api.github.com/users/silvexis","html_url":"https://github.com/silvexis","followers_url":"https://api.github.com/users/silvexis/followers","following_url":"https://api.github.com/users/silvexis/following{/other_user}","gists_url":"https://api.github.com/users/silvexis/gists{/gist_id}","starred_url":"https://api.github.com/users/silvexis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/silvexis/subscriptions","organizations_url":"https://api.github.com/users/silvexis/orgs","repos_url":"https://api.github.com/users/silvexis/repos","events_url":"https://api.github.com/users/silvexis/events{/privacy}","received_events_url":"https://api.github.com/users/silvexis/received_events","type":"User","site_admin":false},"body":"I think this should return 'aws-account' for root","created_at":"2018-04-09T16:45:11Z","updated_at":"2018-04-09T16:58:52Z","html_url":"https://github.com/Cloudzero/cloudzero-reactor-aws/pull/72#discussion_r180158417","pull_request_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls/72","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls/comments/180158417"},"html":{"href":"https://github.com/Cloudzero/cloudzero-reactor-aws/pull/72#discussion_r180158417"},"pull_request":{"href":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls/72"}}},"pull_request":{"url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls/72","id":180305692,"html_url":"https://github.com/Cloudzero/cloudzero-reactor-aws/pull/72","diff_url":"https://github.com/Cloudzero/cloudzero-reactor-aws/pull/72.diff","patch_url":"https://github.com/Cloudzero/cloudzero-reactor-aws/pull/72.patch","issue_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/issues/72","number":72,"state":"open","locked":false,"title":"Feature/reactor 354 - solidify resource type extraction from ARNs","user":{"login":"killthrush","id":6638896,"avatar_url":"https://avatars0.githubusercontent.com/u/6638896?v=4","gravatar_id":"","url":"https://api.github.com/users/killthrush","html_url":"https://github.com/killthrush","followers_url":"https://api.github.com/users/killthrush/followers","following_url":"https://api.github.com/users/killthrush/following{/other_user}","gists_url":"https://api.github.com/users/killthrush/gists{/gist_id}","starred_url":"https://api.github.com/users/killthrush/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/killthrush/subscriptions","organizations_url":"https://api.github.com/users/killthrush/orgs","repos_url":"https://api.github.com/users/killthrush/repos","events_url":"https://api.github.com/users/killthrush/events{/privacy}","received_events_url":"https://api.github.com/users/killthrush/received_events","type":"User","site_admin":false},"body":"### Description\r\n<!--- Provide a brief description of the PR and issue it addresses. -->\r\nNaive approaches to resource type extraction from ARNs kind of fall apart when considering the space of all possible ARNs (see https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html).  Beef this up with comprehensive unit tests.  Also normalize the extracted resource type; in some cases the format of the resource type isn't that great as-is.  Abbreviations and inconsistent formatting is common and sometimes the type name isn't event present.\r\n\r\n### Acceptance checklist\r\n<!--- Here we make sure all criteria for merge has been satisfied. -->\r\n- [ ] Feedback addressed\r\n- [ ] Tests added or modified appropriately\r\n- [ ] All tests passed\r\n\r\n","created_at":"2018-04-09T13:09:20Z","updated_at":"2018-04-09T16:58:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"139c20caf01f38067d1cc20693054f34bcec3629","assignee":null,"assignees":[],"requested_reviewers":[{"login":"tiyberius","id":1237044,"avatar_url":"https://avatars0.githubusercontent.com/u/1237044?v=4","gravatar_id":"","url":"https://api.github.com/users/tiyberius","html_url":"https://github.com/tiyberius","followers_url":"https://api.github.com/users/tiyberius/followers","following_url":"https://api.github.com/users/tiyberius/following{/other_user}","gists_url":"https://api.github.com/users/tiyberius/gists{/gist_id}","starred_url":"https://api.github.com/users/tiyberius/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tiyberius/subscriptions","organizations_url":"https://api.github.com/users/tiyberius/orgs","repos_url":"https://api.github.com/users/tiyberius/repos","events_url":"https://api.github.com/users/tiyberius/events{/privacy}","received_events_url":"https://api.github.com/users/tiyberius/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls/72/commits","review_comments_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls/72/comments","review_comment_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/issues/72/comments","statuses_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/statuses/33fd82ce56825f2871b47bf3925686aa8eaa85b8","head":{"label":"Cloudzero:feature/REACTOR-354","ref":"feature/REACTOR-354","sha":"33fd82ce56825f2871b47bf3925686aa8eaa85b8","user":{"login":"Cloudzero","id":22050846,"avatar_url":"https://avatars0.githubusercontent.com/u/22050846?v=4","gravatar_id":"","url":"https://api.github.com/users/Cloudzero","html_url":"https://github.com/Cloudzero","followers_url":"https://api.github.com/users/Cloudzero/followers","following_url":"https://api.github.com/users/Cloudzero/following{/other_user}","gists_url":"https://api.github.com/users/Cloudzero/gists{/gist_id}","starred_url":"https://api.github.com/users/Cloudzero/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Cloudzero/subscriptions","organizations_url":"https://api.github.com/users/Cloudzero/orgs","repos_url":"https://api.github.com/users/Cloudzero/repos","events_url":"https://api.github.com/users/Cloudzero/events{/privacy}","received_events_url":"https://api.github.com/users/Cloudzero/received_events","type":"Organization","site_admin":false},"repo":{"id":104886482,"name":"cloudzero-reactor-aws","full_name":"Cloudzero/cloudzero-reactor-aws","owner":{"login":"Cloudzero","id":22050846,"avatar_url":"https://avatars0.githubusercontent.com/u/22050846?v=4","gravatar_id":"","url":"https://api.github.com/users/Cloudzero","html_url":"https://github.com/Cloudzero","followers_url":"https://api.github.com/users/Cloudzero/followers","following_url":"https://api.github.com/users/Cloudzero/following{/other_user}","gists_url":"https://api.github.com/users/Cloudzero/gists{/gist_id}","starred_url":"https://api.github.com/users/Cloudzero/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Cloudzero/subscriptions","organizations_url":"https://api.github.com/users/Cloudzero/orgs","repos_url":"https://api.github.com/users/Cloudzero/repos","events_url":"https://api.github.com/users/Cloudzero/events{/privacy}","received_events_url":"https://api.github.com/users/Cloudzero/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Cloudzero/cloudzero-reactor-aws","description":"CloudZero Reactor for AWS","fork":false,"url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws","forks_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/forks","keys_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/teams","hooks_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/hooks","issue_events_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/issues/events{/number}","events_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/events","assignees_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/assignees{/user}","branches_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/branches{/branch}","tags_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/tags","blobs_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/git/refs{/sha}","trees_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/statuses/{sha}","languages_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/languages","stargazers_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/stargazers","contributors_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/contributors","subscribers_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/subscribers","subscription_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/subscription","commits_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/commits{/sha}","git_commits_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/git/commits{/sha}","comments_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/comments{/number}","issue_comment_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/issues/comments{/number}","contents_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/contents/{+path}","compare_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/merges","archive_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/downloads","issues_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/issues{/number}","pulls_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls{/number}","milestones_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/milestones{/number}","notifications_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/labels{/name}","releases_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/releases{/id}","deployments_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/deployments","created_at":"2017-09-26T13:13:15Z","updated_at":"2018-04-04T19:19:25Z","pushed_at":"2018-04-09T16:20:54Z","git_url":"git://github.com/Cloudzero/cloudzero-reactor-aws.git","ssh_url":"git@github.com:Cloudzero/cloudzero-reactor-aws.git","clone_url":"https://github.com/Cloudzero/cloudzero-reactor-aws.git","svn_url":"https://github.com/Cloudzero/cloudzero-reactor-aws","homepage":"https://www.cloudzero.com/","size":26108,"stargazers_count":18,"watchers_count":18,"language":"Python","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":2,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause"},"forks":0,"open_issues":2,"watchers":18,"default_branch":"develop"}},"base":{"label":"Cloudzero:develop","ref":"develop","sha":"59ba0d6339b50eb148b0ddded9daaef2d34cdce9","user":{"login":"Cloudzero","id":22050846,"avatar_url":"https://avatars0.githubusercontent.com/u/22050846?v=4","gravatar_id":"","url":"https://api.github.com/users/Cloudzero","html_url":"https://github.com/Cloudzero","followers_url":"https://api.github.com/users/Cloudzero/followers","following_url":"https://api.github.com/users/Cloudzero/following{/other_user}","gists_url":"https://api.github.com/users/Cloudzero/gists{/gist_id}","starred_url":"https://api.github.com/users/Cloudzero/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Cloudzero/subscriptions","organizations_url":"https://api.github.com/users/Cloudzero/orgs","repos_url":"https://api.github.com/users/Cloudzero/repos","events_url":"https://api.github.com/users/Cloudzero/events{/privacy}","received_events_url":"https://api.github.com/users/Cloudzero/received_events","type":"Organization","site_admin":false},"repo":{"id":104886482,"name":"cloudzero-reactor-aws","full_name":"Cloudzero/cloudzero-reactor-aws","owner":{"login":"Cloudzero","id":22050846,"avatar_url":"https://avatars0.githubusercontent.com/u/22050846?v=4","gravatar_id":"","url":"https://api.github.com/users/Cloudzero","html_url":"https://github.com/Cloudzero","followers_url":"https://api.github.com/users/Cloudzero/followers","following_url":"https://api.github.com/users/Cloudzero/following{/other_user}","gists_url":"https://api.github.com/users/Cloudzero/gists{/gist_id}","starred_url":"https://api.github.com/users/Cloudzero/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Cloudzero/subscriptions","organizations_url":"https://api.github.com/users/Cloudzero/orgs","repos_url":"https://api.github.com/users/Cloudzero/repos","events_url":"https://api.github.com/users/Cloudzero/events{/privacy}","received_events_url":"https://api.github.com/users/Cloudzero/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Cloudzero/cloudzero-reactor-aws","description":"CloudZero Reactor for AWS","fork":false,"url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws","forks_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/forks","keys_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/teams","hooks_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/hooks","issue_events_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/issues/events{/number}","events_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/events","assignees_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/assignees{/user}","branches_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/branches{/branch}","tags_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/tags","blobs_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/git/refs{/sha}","trees_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/statuses/{sha}","languages_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/languages","stargazers_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/stargazers","contributors_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/contributors","subscribers_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/subscribers","subscription_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/subscription","commits_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/commits{/sha}","git_commits_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/git/commits{/sha}","comments_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/comments{/number}","issue_comment_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/issues/comments{/number}","contents_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/contents/{+path}","compare_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/merges","archive_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/downloads","issues_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/issues{/number}","pulls_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls{/number}","milestones_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/milestones{/number}","notifications_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/labels{/name}","releases_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/releases{/id}","deployments_url":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/deployments","created_at":"2017-09-26T13:13:15Z","updated_at":"2018-04-04T19:19:25Z","pushed_at":"2018-04-09T16:20:54Z","git_url":"git://github.com/Cloudzero/cloudzero-reactor-aws.git","ssh_url":"git@github.com:Cloudzero/cloudzero-reactor-aws.git","clone_url":"https://github.com/Cloudzero/cloudzero-reactor-aws.git","svn_url":"https://github.com/Cloudzero/cloudzero-reactor-aws","homepage":"https://www.cloudzero.com/","size":26108,"stargazers_count":18,"watchers_count":18,"language":"Python","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":2,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause"},"forks":0,"open_issues":2,"watchers":18,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls/72"},"html":{"href":"https://github.com/Cloudzero/cloudzero-reactor-aws/pull/72"},"issue":{"href":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/issues/72"},"comments":{"href":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/issues/72/comments"},"review_comments":{"href":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls/72/comments"},"review_comment":{"href":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/pulls/72/commits"},"statuses":{"href":"https://api.github.com/repos/Cloudzero/cloudzero-reactor-aws/statuses/33fd82ce56825f2871b47bf3925686aa8eaa85b8"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"silvexis"}}