{"action":"created","comment":{"url":"https://api.github.com/repos/Symantec/cloudefficiency/pulls/comments/230452086","pull_request_review_id":171194957,"id":230452086,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzMDQ1MjA4Ng==","diff_hunk":"@@ -0,0 +1,333 @@\n+from datetime import datetime, timedelta\n+from requests_oauthlib import OAuth2Session\n+import boto3\n+import botocore\n+import jwt\n+import os\n+import uuid\n+from functools import wraps\n+\n+from flask import Flask, request, redirect, url_for, make_response, Response\n+\n+import logging\n+logging.basicConfig(level=logging.DEBUG)\n+\n+app = Flask(__name__)\n+\n+logger = app.logger\n+\n+\n+algorithm = 'HS256'\n+jwt_cookie_key = 'jwt_token'\n+\n+# not secret\n+authorization_endpoint = os.environ.get('authorization_endpoint')\n+token_endpoint = os.environ.get('token_endpoint')\n+userinfo_endpoint = os.environ.get('userinfo_endpoint')\n+redirect_uri = os.environ.get('redirect_uri')\n+base_uri = os.environ.get('base_uri')\n+default_object = os.environ.get('default_object')\n+BUCKET_NAME = os.environ.get('bucket_name')\n+\n+# secrets\n+if os.environ.get('DEBUG'):\n+    env = 'dev'\n+else:\n+    env = 'prod'\n+\n+ssm_client = boto3.client('ssm')\n+\n+\n+def get_secret_param(p):\n+    return ssm_client.get_parameter(\n+        Name='/{}/cloudefficiency/{}'.format(env, p),\n+        WithDecryption=True\n+    )[\"Parameter\"][\"Value\"]\n+\n+\n+client_id = get_secret_param('client_id')\n+client_secret = get_secret_param('client_secret')\n+jwt_secrets = get_secret_param('jwt_secrets').split(',')\n+\n+if len(client_id) == 0:\n+    logger.error('Must pass a client_id stage variable')\n+if len(client_secret) == 0:\n+    logger.error('Must pass a client_secret stage variable')\n+if len(jwt_secrets) == 0:\n+    logger.error('Must pass a jwt_secrets stage variable')\n+\n+logger.debug('authorization_endpoint: %s', authorization_endpoint)\n+logger.debug('token_endpoint: %s', token_endpoint)\n+logger.debug('authorization_endpoint: %s', authorization_endpoint)\n+logger.debug('userinfo_endpoint: %s', userinfo_endpoint)\n+logger.debug('redirect_uri: %s', redirect_uri)\n+logger.debug('base_uri: %s', base_uri)\n+logger.debug('bucket_name: %s', BUCKET_NAME)\n+\n+oauth_token = \"oauth_token\"\n+oauth_state = \"oauth_state\"\n+oauth_token_key = base_uri + '/' + oauth_token\n+oauth_state_key = base_uri + '/' + oauth_state\n+oauth_initial_path_key = base_uri + '/initial_path'\n+\n+jwt_keys = [\n+    \"jti\",\n+    \"iss\",\n+    \"aud\",\n+    \"exp\",\n+    \"iat\",\n+    \"nbf\",\n+    oauth_token_key,\n+    oauth_state_key\n+]\n+\n+\n+def jwt_params(\n+        oauth_token=None,\n+        oauth_state=None,\n+        initial_path=None,\n+        sub=None,\n+        iss=base_uri,\n+        aud=base_uri,\n+        exp_seconds=300,\n+        **rest):\n+    \"\"\"\n+    create a dict of jwt cliams\n+    \"\"\"\n+    logger.debug('Creating jwt params')\n+    now = datetime.utcnow()\n+    expires = now + timedelta(seconds=exp_seconds)\n+    token = rest\n+    if initial_path:\n+        token[oauth_initial_path_key] = initial_path\n+    if oauth_token:\n+        token[oauth_token_key] = oauth_token\n+    if oauth_state:\n+        token[oauth_state_key] = oauth_state\n+    if sub:\n+        token['sub'] = sub\n+    token['jti'] = str(uuid.uuid1())\n+    token['iss'] = base_uri\n+    token['aud'] = base_uri\n+    token['exp'] = expires\n+    token['iat'] = now\n+    token['nbf'] = now\n+    logger.debug('JWT params: %s', token)\n+    return token\n+\n+\n+class Cookie:\n+    def __init__(self):\n+        self.keys = {}\n+        self.ages = {}\n+        self.secures = {}\n+        self.deletes = []\n+\n+    def remove_jwt(self, key):\n+        self.deletes.append(key)\n+\n+    def add_jwt(self, key, jwt, max_age=300, secure=True):\n+        self.keys[key] = jwt\n+        self.ages[key] = max_age\n+        self.secures[key] = secure\n+\n+    def populate_resp(self, resp):\n+        for key, token in self.keys.items():\n+            resp.set_cookie(\n+                key=key,\n+                max_age=self.ages[key],\n+                secure=self.secures[key],\n+                value=jwt.encode(\n+                    token,\n+                    # The first secret is the current signer.\n+                    jwt_secrets[0],\n+                    algorithm=algorithm\n+                )\n+            )\n+        for key in self.deletes:\n+            resp.set_cookie(\n+                key=key,\n+                max_age=0\n+            )\n+        return resp\n+\n+\n+def get_jwt_token(cookies, key):\n+    \"\"\"\n+    Retrieve the jwt token's as a key, value object\n+    from the flask request cookies object.\n+    If no token exists, returns an empty object.\n+    \"\"\"\n+    if key in request.cookies:\n+        # We take multiple secrets to allow for online secret rotation.\n+        # The first secret is the current signer,\n+        # and the others are potentially still in use, but will\n+        # be rotated out.\n+        for jwt_secret in jwt_secrets:\n+            try:\n+                # github.com/jpadilla/pyjwt/blob/master/tests/test_api_jwt.py\n+                # This will validate:\n+                #   iss, aud\n+                # This will validate (if they are in the request):\n+                #   exp, nbf, iat\n+                return jwt.decode(\n+                    request.cookies[key],\n+                    jwt_secret,\n+                    issuer=base_uri,\n+                    audience=base_uri,\n+                    algorithms=[algorithm]\n+                )\n+            except jwt.exceptions.InvalidTokenError as e:\n+                # will catch exp, nbf, iat, iss, aud errors\n+                print(e)\n+                continue\n+    return {}\n+\n+\n+def with_auth(func):\n+    \"\"\"\n+    Authentication decorator.\n+\n+    Run the given request handler, passing it the user.\n+    If the user has no valid auth token, then\n+    redirect the user/resource owner to the keymaster\n+    without invoking the given request handler.\n+    \"\"\"\n+    @wraps(func)","path":"server2/app.py","position":196,"original_position":196,"commit_id":"dce326c031be26dc01ce7c1e76efa069e27a92b1","original_commit_id":"dce326c031be26dc01ce7c1e76efa069e27a92b1","user":{"login":"JohnTheodore","id":1904409,"node_id":"MDQ6VXNlcjE5MDQ0MDk=","avatar_url":"https://avatars1.githubusercontent.com/u/1904409?v=4","gravatar_id":"","url":"https://api.github.com/users/JohnTheodore","html_url":"https://github.com/JohnTheodore","followers_url":"https://api.github.com/users/JohnTheodore/followers","following_url":"https://api.github.com/users/JohnTheodore/following{/other_user}","gists_url":"https://api.github.com/users/JohnTheodore/gists{/gist_id}","starred_url":"https://api.github.com/users/JohnTheodore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JohnTheodore/subscriptions","organizations_url":"https://api.github.com/users/JohnTheodore/orgs","repos_url":"https://api.github.com/users/JohnTheodore/repos","events_url":"https://api.github.com/users/JohnTheodore/events{/privacy}","received_events_url":"https://api.github.com/users/JohnTheodore/received_events","type":"User","site_admin":false},"body":"This is more aesthetic, but this decorator name is meh. perhaps importing it as something more reasonable, like 'authcheck' or something","created_at":"2018-11-02T17:33:56Z","updated_at":"2018-11-02T17:49:19Z","html_url":"https://github.com/Symantec/cloudefficiency/pull/8#discussion_r230452086","pull_request_url":"https://api.github.com/repos/Symantec/cloudefficiency/pulls/8","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/Symantec/cloudefficiency/pulls/comments/230452086"},"html":{"href":"https://github.com/Symantec/cloudefficiency/pull/8#discussion_r230452086"},"pull_request":{"href":"https://api.github.com/repos/Symantec/cloudefficiency/pulls/8"}}},"pull_request":{"url":"https://api.github.com/repos/Symantec/cloudefficiency/pulls/8","id":228002580,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI4MDAyNTgw","html_url":"https://github.com/Symantec/cloudefficiency/pull/8","diff_url":"https://github.com/Symantec/cloudefficiency/pull/8.diff","patch_url":"https://github.com/Symantec/cloudefficiency/pull/8.patch","issue_url":"https://api.github.com/repos/Symantec/cloudefficiency/issues/8","number":8,"state":"open","locked":false,"title":"Docker container to serve cloudefficiency out of ecs.","user":{"login":"bytesandwich","id":1048685,"node_id":"MDQ6VXNlcjEwNDg2ODU=","avatar_url":"https://avatars1.githubusercontent.com/u/1048685?v=4","gravatar_id":"","url":"https://api.github.com/users/bytesandwich","html_url":"https://github.com/bytesandwich","followers_url":"https://api.github.com/users/bytesandwich/followers","following_url":"https://api.github.com/users/bytesandwich/following{/other_user}","gists_url":"https://api.github.com/users/bytesandwich/gists{/gist_id}","starred_url":"https://api.github.com/users/bytesandwich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bytesandwich/subscriptions","organizations_url":"https://api.github.com/users/bytesandwich/orgs","repos_url":"https://api.github.com/users/bytesandwich/repos","events_url":"https://api.github.com/users/bytesandwich/events{/privacy}","received_events_url":"https://api.github.com/users/bytesandwich/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-11-02T17:08:21Z","updated_at":"2018-11-02T17:49:19Z","closed_at":null,"merged_at":null,"merge_commit_sha":"160e858e1e9abbb9bcb5ebf8744f399472839133","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Symantec/cloudefficiency/pulls/8/commits","review_comments_url":"https://api.github.com/repos/Symantec/cloudefficiency/pulls/8/comments","review_comment_url":"https://api.github.com/repos/Symantec/cloudefficiency/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Symantec/cloudefficiency/issues/8/comments","statuses_url":"https://api.github.com/repos/Symantec/cloudefficiency/statuses/dce326c031be26dc01ce7c1e76efa069e27a92b1","head":{"label":"Symantec:INFRAENG-2097","ref":"INFRAENG-2097","sha":"dce326c031be26dc01ce7c1e76efa069e27a92b1","user":{"login":"Symantec","id":7462319,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc0NjIzMTk=","avatar_url":"https://avatars0.githubusercontent.com/u/7462319?v=4","gravatar_id":"","url":"https://api.github.com/users/Symantec","html_url":"https://github.com/Symantec","followers_url":"https://api.github.com/users/Symantec/followers","following_url":"https://api.github.com/users/Symantec/following{/other_user}","gists_url":"https://api.github.com/users/Symantec/gists{/gist_id}","starred_url":"https://api.github.com/users/Symantec/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Symantec/subscriptions","organizations_url":"https://api.github.com/users/Symantec/orgs","repos_url":"https://api.github.com/users/Symantec/repos","events_url":"https://api.github.com/users/Symantec/events{/privacy}","received_events_url":"https://api.github.com/users/Symantec/received_events","type":"Organization","site_admin":false},"repo":{"id":142610219,"node_id":"MDEwOlJlcG9zaXRvcnkxNDI2MTAyMTk=","name":"cloudefficiency","full_name":"Symantec/cloudefficiency","private":false,"owner":{"login":"Symantec","id":7462319,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc0NjIzMTk=","avatar_url":"https://avatars0.githubusercontent.com/u/7462319?v=4","gravatar_id":"","url":"https://api.github.com/users/Symantec","html_url":"https://github.com/Symantec","followers_url":"https://api.github.com/users/Symantec/followers","following_url":"https://api.github.com/users/Symantec/following{/other_user}","gists_url":"https://api.github.com/users/Symantec/gists{/gist_id}","starred_url":"https://api.github.com/users/Symantec/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Symantec/subscriptions","organizations_url":"https://api.github.com/users/Symantec/orgs","repos_url":"https://api.github.com/users/Symantec/repos","events_url":"https://api.github.com/users/Symantec/events{/privacy}","received_events_url":"https://api.github.com/users/Symantec/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/Symantec/cloudefficiency","description":"Cloud Efficiency to show utilization for various VPs and Product Lines","fork":false,"url":"https://api.github.com/repos/Symantec/cloudefficiency","forks_url":"https://api.github.com/repos/Symantec/cloudefficiency/forks","keys_url":"https://api.github.com/repos/Symantec/cloudefficiency/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Symantec/cloudefficiency/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Symantec/cloudefficiency/teams","hooks_url":"https://api.github.com/repos/Symantec/cloudefficiency/hooks","issue_events_url":"https://api.github.com/repos/Symantec/cloudefficiency/issues/events{/number}","events_url":"https://api.github.com/repos/Symantec/cloudefficiency/events","assignees_url":"https://api.github.com/repos/Symantec/cloudefficiency/assignees{/user}","branches_url":"https://api.github.com/repos/Symantec/cloudefficiency/branches{/branch}","tags_url":"https://api.github.com/repos/Symantec/cloudefficiency/tags","blobs_url":"https://api.github.com/repos/Symantec/cloudefficiency/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Symantec/cloudefficiency/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Symantec/cloudefficiency/git/refs{/sha}","trees_url":"https://api.github.com/repos/Symantec/cloudefficiency/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Symantec/cloudefficiency/statuses/{sha}","languages_url":"https://api.github.com/repos/Symantec/cloudefficiency/languages","stargazers_url":"https://api.github.com/repos/Symantec/cloudefficiency/stargazers","contributors_url":"https://api.github.com/repos/Symantec/cloudefficiency/contributors","subscribers_url":"https://api.github.com/repos/Symantec/cloudefficiency/subscribers","subscription_url":"https://api.github.com/repos/Symantec/cloudefficiency/subscription","commits_url":"https://api.github.com/repos/Symantec/cloudefficiency/commits{/sha}","git_commits_url":"https://api.github.com/repos/Symantec/cloudefficiency/git/commits{/sha}","comments_url":"https://api.github.com/repos/Symantec/cloudefficiency/comments{/number}","issue_comment_url":"https://api.github.com/repos/Symantec/cloudefficiency/issues/comments{/number}","contents_url":"https://api.github.com/repos/Symantec/cloudefficiency/contents/{+path}","compare_url":"https://api.github.com/repos/Symantec/cloudefficiency/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Symantec/cloudefficiency/merges","archive_url":"https://api.github.com/repos/Symantec/cloudefficiency/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Symantec/cloudefficiency/downloads","issues_url":"https://api.github.com/repos/Symantec/cloudefficiency/issues{/number}","pulls_url":"https://api.github.com/repos/Symantec/cloudefficiency/pulls{/number}","milestones_url":"https://api.github.com/repos/Symantec/cloudefficiency/milestones{/number}","notifications_url":"https://api.github.com/repos/Symantec/cloudefficiency/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Symantec/cloudefficiency/labels{/name}","releases_url":"https://api.github.com/repos/Symantec/cloudefficiency/releases{/id}","deployments_url":"https://api.github.com/repos/Symantec/cloudefficiency/deployments","created_at":"2018-07-27T18:18:19Z","updated_at":"2018-10-04T00:17:20Z","pushed_at":"2018-11-02T17:08:21Z","git_url":"git://github.com/Symantec/cloudefficiency.git","ssh_url":"git@github.com:Symantec/cloudefficiency.git","clone_url":"https://github.com/Symantec/cloudefficiency.git","svn_url":"https://github.com/Symantec/cloudefficiency","homepage":null,"size":586,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":5,"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":0,"open_issues":5,"watchers":1,"default_branch":"master"}},"base":{"label":"Symantec:master","ref":"master","sha":"01d2c63b70d271c4e96be514739eecc332fd124f","user":{"login":"Symantec","id":7462319,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc0NjIzMTk=","avatar_url":"https://avatars0.githubusercontent.com/u/7462319?v=4","gravatar_id":"","url":"https://api.github.com/users/Symantec","html_url":"https://github.com/Symantec","followers_url":"https://api.github.com/users/Symantec/followers","following_url":"https://api.github.com/users/Symantec/following{/other_user}","gists_url":"https://api.github.com/users/Symantec/gists{/gist_id}","starred_url":"https://api.github.com/users/Symantec/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Symantec/subscriptions","organizations_url":"https://api.github.com/users/Symantec/orgs","repos_url":"https://api.github.com/users/Symantec/repos","events_url":"https://api.github.com/users/Symantec/events{/privacy}","received_events_url":"https://api.github.com/users/Symantec/received_events","type":"Organization","site_admin":false},"repo":{"id":142610219,"node_id":"MDEwOlJlcG9zaXRvcnkxNDI2MTAyMTk=","name":"cloudefficiency","full_name":"Symantec/cloudefficiency","private":false,"owner":{"login":"Symantec","id":7462319,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc0NjIzMTk=","avatar_url":"https://avatars0.githubusercontent.com/u/7462319?v=4","gravatar_id":"","url":"https://api.github.com/users/Symantec","html_url":"https://github.com/Symantec","followers_url":"https://api.github.com/users/Symantec/followers","following_url":"https://api.github.com/users/Symantec/following{/other_user}","gists_url":"https://api.github.com/users/Symantec/gists{/gist_id}","starred_url":"https://api.github.com/users/Symantec/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Symantec/subscriptions","organizations_url":"https://api.github.com/users/Symantec/orgs","repos_url":"https://api.github.com/users/Symantec/repos","events_url":"https://api.github.com/users/Symantec/events{/privacy}","received_events_url":"https://api.github.com/users/Symantec/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/Symantec/cloudefficiency","description":"Cloud Efficiency to show utilization for various VPs and Product Lines","fork":false,"url":"https://api.github.com/repos/Symantec/cloudefficiency","forks_url":"https://api.github.com/repos/Symantec/cloudefficiency/forks","keys_url":"https://api.github.com/repos/Symantec/cloudefficiency/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Symantec/cloudefficiency/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Symantec/cloudefficiency/teams","hooks_url":"https://api.github.com/repos/Symantec/cloudefficiency/hooks","issue_events_url":"https://api.github.com/repos/Symantec/cloudefficiency/issues/events{/number}","events_url":"https://api.github.com/repos/Symantec/cloudefficiency/events","assignees_url":"https://api.github.com/repos/Symantec/cloudefficiency/assignees{/user}","branches_url":"https://api.github.com/repos/Symantec/cloudefficiency/branches{/branch}","tags_url":"https://api.github.com/repos/Symantec/cloudefficiency/tags","blobs_url":"https://api.github.com/repos/Symantec/cloudefficiency/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Symantec/cloudefficiency/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Symantec/cloudefficiency/git/refs{/sha}","trees_url":"https://api.github.com/repos/Symantec/cloudefficiency/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Symantec/cloudefficiency/statuses/{sha}","languages_url":"https://api.github.com/repos/Symantec/cloudefficiency/languages","stargazers_url":"https://api.github.com/repos/Symantec/cloudefficiency/stargazers","contributors_url":"https://api.github.com/repos/Symantec/cloudefficiency/contributors","subscribers_url":"https://api.github.com/repos/Symantec/cloudefficiency/subscribers","subscription_url":"https://api.github.com/repos/Symantec/cloudefficiency/subscription","commits_url":"https://api.github.com/repos/Symantec/cloudefficiency/commits{/sha}","git_commits_url":"https://api.github.com/repos/Symantec/cloudefficiency/git/commits{/sha}","comments_url":"https://api.github.com/repos/Symantec/cloudefficiency/comments{/number}","issue_comment_url":"https://api.github.com/repos/Symantec/cloudefficiency/issues/comments{/number}","contents_url":"https://api.github.com/repos/Symantec/cloudefficiency/contents/{+path}","compare_url":"https://api.github.com/repos/Symantec/cloudefficiency/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Symantec/cloudefficiency/merges","archive_url":"https://api.github.com/repos/Symantec/cloudefficiency/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Symantec/cloudefficiency/downloads","issues_url":"https://api.github.com/repos/Symantec/cloudefficiency/issues{/number}","pulls_url":"https://api.github.com/repos/Symantec/cloudefficiency/pulls{/number}","milestones_url":"https://api.github.com/repos/Symantec/cloudefficiency/milestones{/number}","notifications_url":"https://api.github.com/repos/Symantec/cloudefficiency/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Symantec/cloudefficiency/labels{/name}","releases_url":"https://api.github.com/repos/Symantec/cloudefficiency/releases{/id}","deployments_url":"https://api.github.com/repos/Symantec/cloudefficiency/deployments","created_at":"2018-07-27T18:18:19Z","updated_at":"2018-10-04T00:17:20Z","pushed_at":"2018-11-02T17:08:21Z","git_url":"git://github.com/Symantec/cloudefficiency.git","ssh_url":"git@github.com:Symantec/cloudefficiency.git","clone_url":"https://github.com/Symantec/cloudefficiency.git","svn_url":"https://github.com/Symantec/cloudefficiency","homepage":null,"size":586,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":5,"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":0,"open_issues":5,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Symantec/cloudefficiency/pulls/8"},"html":{"href":"https://github.com/Symantec/cloudefficiency/pull/8"},"issue":{"href":"https://api.github.com/repos/Symantec/cloudefficiency/issues/8"},"comments":{"href":"https://api.github.com/repos/Symantec/cloudefficiency/issues/8/comments"},"review_comments":{"href":"https://api.github.com/repos/Symantec/cloudefficiency/pulls/8/comments"},"review_comment":{"href":"https://api.github.com/repos/Symantec/cloudefficiency/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Symantec/cloudefficiency/pulls/8/commits"},"statuses":{"href":"https://api.github.com/repos/Symantec/cloudefficiency/statuses/dce326c031be26dc01ce7c1e76efa069e27a92b1"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"JohnTheodore"}}