{"action":"created","comment":{"url":"https://api.github.com/repos/giantswarm/gsctl/pulls/comments/122439296","pull_request_review_id":44557248,"id":122439296,"diff_hunk":"@@ -23,84 +27,208 @@ var (\n \n \t// ListKeypairsCommand performs the \"list keypairs\" function\n \tListKeypairsCommand = &cobra.Command{\n-\t\tUse:     \"keypairs\",\n-\t\tShort:   \"List key pairs for a cluster\",\n-\t\tLong:    `Prints a list of key pairs for a cluster`,\n-\t\tPreRunE: checkListKeypairs,\n-\t\tRun:     listKeypairs,\n+\t\tUse:    \"keypairs\",\n+\t\tShort:  \"List key pairs for a cluster\",\n+\t\tLong:   `Prints a list of key pairs for a cluster`,\n+\t\tPreRun: listKeypairsValidationOutput,\n+\t\tRun:    listKeypairsOutput,\n \t}\n )\n \n+// listKeypairsArguments are the actual arguments used to call the\n+// listKeypairs() function.\n+type listKeypairsArguments struct {\n+\tapiEndpoint string\n+\tclusterID   string\n+\ttoken       string\n+}\n+\n+// defaultListKeypairsArguments returns a new listKeypairsArguments struct\n+// based on global variables (= command line options from cobra).\n+func defaultListKeypairsArguments() listKeypairsArguments {\n+\treturn listKeypairsArguments{\n+\t\tapiEndpoint: cmdAPIEndpoint,\n+\t\tclusterID:   cmdClusterID,\n+\t\ttoken:       cmdToken,\n+\t}\n+}\n+\n+// listKeypairsResult is the data structure returned by the listKeypairs() function.\n+type listKeypairsResult struct {\n+\tkeypairs []gsclientgen.KeyPairModel\n+}\n+\n func init() {\n \tListKeypairsCommand.Flags().StringVarP(&cmdClusterID, \"cluster\", \"c\", \"\", \"ID of the cluster to list key pairs for\")\n \tListCommand.AddCommand(ListKeypairsCommand)\n }\n \n-func checkListKeypairs(cmd *cobra.Command, args []string) error {\n-\tif config.Config.Token == \"\" {\n-\t\treturn errors.New(\"You are not logged in. Use '\" + config.ProgramName + \" login' to log in.\")\n+// listKeypairsValidationOutput does our pre-checks and shows errors, in case\n+// something is missing.\n+func listKeypairsValidationOutput(cmd *cobra.Command, extraArgs []string) {\n+\targs := defaultListKeypairsArguments()\n+\terr := listKeypairsValidate(&args)\n+\tif err != nil {\n+\t\tvar headline string\n+\t\tvar subtext string\n+\n+\t\tswitch err.Error() {\n+\t\tcase errNotLoggedIn:\n+\t\t\theadline = \"You are not logged in.\"\n+\t\t\tsubtext = \"Please log in using 'gsctl login <email>' or set an auth token as a command line argument.\"\n+\t\t\tsubtext += \" See `gsctl list keypairs --help` for details.\"\n+\t\tcase errClusterIDNotSpecified:\n+\t\t\theadline = \"No cluster ID specified.\"\n+\t\t\tsubtext = \"Please specify which cluster to list key pairs for, by using the '-c' or '--cluster' argument.\"\n+\t\tdefault:\n+\t\t\theadline = err.Error()\n+\t\t}\n+\n+\t\tfmt.Println(color.RedString(headline))\n+\t\tif subtext != \"\" {\n+\t\t\tfmt.Println(subtext)\n+\t\t}\n+\t\tos.Exit(1)\n \t}\n-\tif cmdClusterID == \"\" {\n+}\n+\n+// listKeypairsValidate validates our pre-conditions and returns an error in\n+// case something is missing.\n+// If no clusterID argument is given, and a default cluster can be determined,\n+// the listKeypairsArguments given as argument will be modified to contain\n+// the clusterID field.\n+func listKeypairsValidate(args *listKeypairsArguments) error {\n+\tif config.Config.Token == \"\" && args.token == \"\" {\n+\t\treturn errors.New(errNotLoggedIn)\n+\t}\n+\tif args.clusterID == \"\" {\n \t\t// use default cluster if possible\n \t\tclusterID, _ := config.GetDefaultCluster(requestIDHeader, listKeypairsActivityName, cmdLine, cmdAPIEndpoint)\n \t\tif clusterID != \"\" {\n \t\t\tcmdClusterID = clusterID\n \t\t} else {\n-\t\t\treturn errors.New(\"No cluster given. Please use the -c/--cluster flag to set a cluster ID.\")\n+\t\t\treturn errors.New(errClusterIDNotSpecified)\n \t\t}\n \t}\n+\n \treturn nil\n }\n \n-// listKeypairs is the function called to list keypairs and display\n+// listKeypairsOutput is the function called to list keypairs and display\n // errors in case they happen\n-func listKeypairs(cmd *cobra.Command, args []string) {\n-\toutput, err := keypairsTable()\n+func listKeypairsOutput(cmd *cobra.Command, extraArgs []string) {\n+\targs := defaultListKeypairsArguments()\n+\tresult, err := listKeypairs(args)\n+\n+\t// error output\n \tif err != nil {\n-\t\tfmt.Println(color.RedString(\"Error: %s\", err))\n-\t\tif _, ok := err.(APIError); ok {\n-\t\t\tdumpAPIResponse((err).(APIError).APIResponse)\n+\t\tvar headline string\n+\t\tvar subtext string\n+\n+\t\tswitch err.Error() {\n+\t\tcase errNotLoggedIn:\n+\t\t\theadline = \"You are not logged in.\"\n+\t\t\tsubtext = \"Please log in using 'gsctl login <email>' or set an auth token as a command line argument.\"\n+\t\t\tsubtext += \" See `gsctl list keypairs --help` for details.\"\n+\t\tcase errClusterIDNotSpecified:\n+\t\t\theadline = \"No cluster ID specified.\"\n+\t\t\tsubtext = \"Please specify which cluster to list key pairs for, by using the '-c' or '--cluster' argument.\"\n+\t\tcase errNotAuthorized:\n+\t\t\theadline = \"You are not authorized for this cluster.\"\n+\t\t\tsubtext = \"You have no permission to access key pairs for this cluster. Please check your credentials.\"\n+\t\tcase errClusterNotFound:\n+\t\t\theadline = \"The cluster does not exist.\"\n+\t\t\tsubtext = fmt.Sprintf(\"We couldn't find a cluster with the ID '%s' via API endpoint %s.\", args.clusterID, args.apiEndpoint)\n+\t\tcase errInternalServerError:\n+\t\t\theadline = \"An internal error occurred.\"\n+\t\t\tsubtext = \"Please notify the Giant Swarm support team, or try listing key pairs again in a few moments.\"\n+\t\tdefault:\n+\t\t\theadline = err.Error()\n+\t\t}\n+\n+\t\tfmt.Println(color.RedString(headline))\n+\t\tif subtext != \"\" {\n+\t\t\tfmt.Println(subtext)\n \t\t}\n \t\tos.Exit(1)","path":"commands/list_keypairs.go","position":168,"original_position":165,"commit_id":"2eb06fb02783c64c6358e2124b0d9f32e43bb84b","original_commit_id":"69e55544c23892724360b1b3b9afdb4759ba3c4d","user":{"login":"marians","id":273727,"avatar_url":"https://avatars2.githubusercontent.com/u/273727?v=3","gravatar_id":"","url":"https://api.github.com/users/marians","html_url":"https://github.com/marians","followers_url":"https://api.github.com/users/marians/followers","following_url":"https://api.github.com/users/marians/following{/other_user}","gists_url":"https://api.github.com/users/marians/gists{/gist_id}","starred_url":"https://api.github.com/users/marians/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/marians/subscriptions","organizations_url":"https://api.github.com/users/marians/orgs","repos_url":"https://api.github.com/users/marians/repos","events_url":"https://api.github.com/users/marians/events{/privacy}","received_events_url":"https://api.github.com/users/marians/received_events","type":"User","site_admin":false},"body":"I've been changing the code lately to be separate the business logic from the output printing. That at least allows for testing of the business logic, and that works quite well now.\r\n\r\nSo far we are not testing the printed output in unit tests. Might be that we start doing that at some point.","created_at":"2017-06-16T13:20:14Z","updated_at":"2017-06-16T13:20:14Z","html_url":"https://github.com/giantswarm/gsctl/pull/86#discussion_r122439296","pull_request_url":"https://api.github.com/repos/giantswarm/gsctl/pulls/86","_links":{"self":{"href":"https://api.github.com/repos/giantswarm/gsctl/pulls/comments/122439296"},"html":{"href":"https://github.com/giantswarm/gsctl/pull/86#discussion_r122439296"},"pull_request":{"href":"https://api.github.com/repos/giantswarm/gsctl/pulls/86"}}},"pull_request":{"url":"https://api.github.com/repos/giantswarm/gsctl/pulls/86","id":125616831,"html_url":"https://github.com/giantswarm/gsctl/pull/86","diff_url":"https://github.com/giantswarm/gsctl/pull/86.diff","patch_url":"https://github.com/giantswarm/gsctl/pull/86.patch","issue_url":"https://api.github.com/repos/giantswarm/gsctl/issues/86","number":86,"state":"open","locked":false,"title":"gsctl list keypairs: Better handling of certain cases","user":{"login":"marians","id":273727,"avatar_url":"https://avatars2.githubusercontent.com/u/273727?v=3","gravatar_id":"","url":"https://api.github.com/users/marians","html_url":"https://github.com/marians","followers_url":"https://api.github.com/users/marians/followers","following_url":"https://api.github.com/users/marians/following{/other_user}","gists_url":"https://api.github.com/users/marians/gists{/gist_id}","starred_url":"https://api.github.com/users/marians/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/marians/subscriptions","organizations_url":"https://api.github.com/users/marians/orgs","repos_url":"https://api.github.com/users/marians/repos","events_url":"https://api.github.com/users/marians/events{/privacy}","received_events_url":"https://api.github.com/users/marians/received_events","type":"User","site_admin":false},"body":"Fixes #64, #71, #72\r\n\r\n### Preview\r\n\r\n```nohighlight\r\n$ ./gsctl --api-endpoint=https://api-g8s.giantswarm.io list keypairs -c pmb9q --auth-token=\"sdfsdf\"\r\nYou are not authorized for this cluster.\r\nYou have no permission to access key pairs for this cluster. Please check your credentials.\r\n```\r\n\r\n```nohighlight\r\n$ ./gsctl --api-endpoint=https://api-g8s.giantswarm.io list keypairs -c feogv\r\nNo key pairs available for this cluster.\r\n```","created_at":"2017-06-14T14:55:16Z","updated_at":"2017-06-16T13:20:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8a75f86a31dd68b6e0ab07f31f419405c2258a20","assignee":null,"assignees":[],"requested_reviewers":[{"login":"rossf7","id":311527,"avatar_url":"https://avatars2.githubusercontent.com/u/311527?v=3","gravatar_id":"","url":"https://api.github.com/users/rossf7","html_url":"https://github.com/rossf7","followers_url":"https://api.github.com/users/rossf7/followers","following_url":"https://api.github.com/users/rossf7/following{/other_user}","gists_url":"https://api.github.com/users/rossf7/gists{/gist_id}","starred_url":"https://api.github.com/users/rossf7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rossf7/subscriptions","organizations_url":"https://api.github.com/users/rossf7/orgs","repos_url":"https://api.github.com/users/rossf7/repos","events_url":"https://api.github.com/users/rossf7/events{/privacy}","received_events_url":"https://api.github.com/users/rossf7/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/giantswarm/gsctl/pulls/86/commits","review_comments_url":"https://api.github.com/repos/giantswarm/gsctl/pulls/86/comments","review_comment_url":"https://api.github.com/repos/giantswarm/gsctl/pulls/comments{/number}","comments_url":"https://api.github.com/repos/giantswarm/gsctl/issues/86/comments","statuses_url":"https://api.github.com/repos/giantswarm/gsctl/statuses/2eb06fb02783c64c6358e2124b0d9f32e43bb84b","head":{"label":"giantswarm:list-keypairs-errors","ref":"list-keypairs-errors","sha":"2eb06fb02783c64c6358e2124b0d9f32e43bb84b","user":{"login":"giantswarm","id":7556340,"avatar_url":"https://avatars0.githubusercontent.com/u/7556340?v=3","gravatar_id":"","url":"https://api.github.com/users/giantswarm","html_url":"https://github.com/giantswarm","followers_url":"https://api.github.com/users/giantswarm/followers","following_url":"https://api.github.com/users/giantswarm/following{/other_user}","gists_url":"https://api.github.com/users/giantswarm/gists{/gist_id}","starred_url":"https://api.github.com/users/giantswarm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/giantswarm/subscriptions","organizations_url":"https://api.github.com/users/giantswarm/orgs","repos_url":"https://api.github.com/users/giantswarm/repos","events_url":"https://api.github.com/users/giantswarm/events{/privacy}","received_events_url":"https://api.github.com/users/giantswarm/received_events","type":"Organization","site_admin":false},"repo":{"id":74132145,"name":"gsctl","full_name":"giantswarm/gsctl","owner":{"login":"giantswarm","id":7556340,"avatar_url":"https://avatars0.githubusercontent.com/u/7556340?v=3","gravatar_id":"","url":"https://api.github.com/users/giantswarm","html_url":"https://github.com/giantswarm","followers_url":"https://api.github.com/users/giantswarm/followers","following_url":"https://api.github.com/users/giantswarm/following{/other_user}","gists_url":"https://api.github.com/users/giantswarm/gists{/gist_id}","starred_url":"https://api.github.com/users/giantswarm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/giantswarm/subscriptions","organizations_url":"https://api.github.com/users/giantswarm/orgs","repos_url":"https://api.github.com/users/giantswarm/repos","events_url":"https://api.github.com/users/giantswarm/events{/privacy}","received_events_url":"https://api.github.com/users/giantswarm/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/giantswarm/gsctl","description":"The next-generation command line interface for Giant Swarm","fork":false,"url":"https://api.github.com/repos/giantswarm/gsctl","forks_url":"https://api.github.com/repos/giantswarm/gsctl/forks","keys_url":"https://api.github.com/repos/giantswarm/gsctl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/giantswarm/gsctl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/giantswarm/gsctl/teams","hooks_url":"https://api.github.com/repos/giantswarm/gsctl/hooks","issue_events_url":"https://api.github.com/repos/giantswarm/gsctl/issues/events{/number}","events_url":"https://api.github.com/repos/giantswarm/gsctl/events","assignees_url":"https://api.github.com/repos/giantswarm/gsctl/assignees{/user}","branches_url":"https://api.github.com/repos/giantswarm/gsctl/branches{/branch}","tags_url":"https://api.github.com/repos/giantswarm/gsctl/tags","blobs_url":"https://api.github.com/repos/giantswarm/gsctl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/giantswarm/gsctl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/giantswarm/gsctl/git/refs{/sha}","trees_url":"https://api.github.com/repos/giantswarm/gsctl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/giantswarm/gsctl/statuses/{sha}","languages_url":"https://api.github.com/repos/giantswarm/gsctl/languages","stargazers_url":"https://api.github.com/repos/giantswarm/gsctl/stargazers","contributors_url":"https://api.github.com/repos/giantswarm/gsctl/contributors","subscribers_url":"https://api.github.com/repos/giantswarm/gsctl/subscribers","subscription_url":"https://api.github.com/repos/giantswarm/gsctl/subscription","commits_url":"https://api.github.com/repos/giantswarm/gsctl/commits{/sha}","git_commits_url":"https://api.github.com/repos/giantswarm/gsctl/git/commits{/sha}","comments_url":"https://api.github.com/repos/giantswarm/gsctl/comments{/number}","issue_comment_url":"https://api.github.com/repos/giantswarm/gsctl/issues/comments{/number}","contents_url":"https://api.github.com/repos/giantswarm/gsctl/contents/{+path}","compare_url":"https://api.github.com/repos/giantswarm/gsctl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/giantswarm/gsctl/merges","archive_url":"https://api.github.com/repos/giantswarm/gsctl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/giantswarm/gsctl/downloads","issues_url":"https://api.github.com/repos/giantswarm/gsctl/issues{/number}","pulls_url":"https://api.github.com/repos/giantswarm/gsctl/pulls{/number}","milestones_url":"https://api.github.com/repos/giantswarm/gsctl/milestones{/number}","notifications_url":"https://api.github.com/repos/giantswarm/gsctl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/giantswarm/gsctl/labels{/name}","releases_url":"https://api.github.com/repos/giantswarm/gsctl/releases{/id}","deployments_url":"https://api.github.com/repos/giantswarm/gsctl/deployments","created_at":"2016-11-18T13:31:19Z","updated_at":"2017-03-22T08:12:22Z","pushed_at":"2017-06-16T13:14:38Z","git_url":"git://github.com/giantswarm/gsctl.git","ssh_url":"git@github.com:giantswarm/gsctl.git","clone_url":"https://github.com/giantswarm/gsctl.git","svn_url":"https://github.com/giantswarm/gsctl","homepage":null,"size":11445,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":25,"forks":0,"open_issues":25,"watchers":0,"default_branch":"master"}},"base":{"label":"giantswarm:master","ref":"master","sha":"58f0a886379fd8912c5e6f094dcbad536c56d223","user":{"login":"giantswarm","id":7556340,"avatar_url":"https://avatars0.githubusercontent.com/u/7556340?v=3","gravatar_id":"","url":"https://api.github.com/users/giantswarm","html_url":"https://github.com/giantswarm","followers_url":"https://api.github.com/users/giantswarm/followers","following_url":"https://api.github.com/users/giantswarm/following{/other_user}","gists_url":"https://api.github.com/users/giantswarm/gists{/gist_id}","starred_url":"https://api.github.com/users/giantswarm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/giantswarm/subscriptions","organizations_url":"https://api.github.com/users/giantswarm/orgs","repos_url":"https://api.github.com/users/giantswarm/repos","events_url":"https://api.github.com/users/giantswarm/events{/privacy}","received_events_url":"https://api.github.com/users/giantswarm/received_events","type":"Organization","site_admin":false},"repo":{"id":74132145,"name":"gsctl","full_name":"giantswarm/gsctl","owner":{"login":"giantswarm","id":7556340,"avatar_url":"https://avatars0.githubusercontent.com/u/7556340?v=3","gravatar_id":"","url":"https://api.github.com/users/giantswarm","html_url":"https://github.com/giantswarm","followers_url":"https://api.github.com/users/giantswarm/followers","following_url":"https://api.github.com/users/giantswarm/following{/other_user}","gists_url":"https://api.github.com/users/giantswarm/gists{/gist_id}","starred_url":"https://api.github.com/users/giantswarm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/giantswarm/subscriptions","organizations_url":"https://api.github.com/users/giantswarm/orgs","repos_url":"https://api.github.com/users/giantswarm/repos","events_url":"https://api.github.com/users/giantswarm/events{/privacy}","received_events_url":"https://api.github.com/users/giantswarm/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/giantswarm/gsctl","description":"The next-generation command line interface for Giant Swarm","fork":false,"url":"https://api.github.com/repos/giantswarm/gsctl","forks_url":"https://api.github.com/repos/giantswarm/gsctl/forks","keys_url":"https://api.github.com/repos/giantswarm/gsctl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/giantswarm/gsctl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/giantswarm/gsctl/teams","hooks_url":"https://api.github.com/repos/giantswarm/gsctl/hooks","issue_events_url":"https://api.github.com/repos/giantswarm/gsctl/issues/events{/number}","events_url":"https://api.github.com/repos/giantswarm/gsctl/events","assignees_url":"https://api.github.com/repos/giantswarm/gsctl/assignees{/user}","branches_url":"https://api.github.com/repos/giantswarm/gsctl/branches{/branch}","tags_url":"https://api.github.com/repos/giantswarm/gsctl/tags","blobs_url":"https://api.github.com/repos/giantswarm/gsctl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/giantswarm/gsctl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/giantswarm/gsctl/git/refs{/sha}","trees_url":"https://api.github.com/repos/giantswarm/gsctl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/giantswarm/gsctl/statuses/{sha}","languages_url":"https://api.github.com/repos/giantswarm/gsctl/languages","stargazers_url":"https://api.github.com/repos/giantswarm/gsctl/stargazers","contributors_url":"https://api.github.com/repos/giantswarm/gsctl/contributors","subscribers_url":"https://api.github.com/repos/giantswarm/gsctl/subscribers","subscription_url":"https://api.github.com/repos/giantswarm/gsctl/subscription","commits_url":"https://api.github.com/repos/giantswarm/gsctl/commits{/sha}","git_commits_url":"https://api.github.com/repos/giantswarm/gsctl/git/commits{/sha}","comments_url":"https://api.github.com/repos/giantswarm/gsctl/comments{/number}","issue_comment_url":"https://api.github.com/repos/giantswarm/gsctl/issues/comments{/number}","contents_url":"https://api.github.com/repos/giantswarm/gsctl/contents/{+path}","compare_url":"https://api.github.com/repos/giantswarm/gsctl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/giantswarm/gsctl/merges","archive_url":"https://api.github.com/repos/giantswarm/gsctl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/giantswarm/gsctl/downloads","issues_url":"https://api.github.com/repos/giantswarm/gsctl/issues{/number}","pulls_url":"https://api.github.com/repos/giantswarm/gsctl/pulls{/number}","milestones_url":"https://api.github.com/repos/giantswarm/gsctl/milestones{/number}","notifications_url":"https://api.github.com/repos/giantswarm/gsctl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/giantswarm/gsctl/labels{/name}","releases_url":"https://api.github.com/repos/giantswarm/gsctl/releases{/id}","deployments_url":"https://api.github.com/repos/giantswarm/gsctl/deployments","created_at":"2016-11-18T13:31:19Z","updated_at":"2017-03-22T08:12:22Z","pushed_at":"2017-06-16T13:14:38Z","git_url":"git://github.com/giantswarm/gsctl.git","ssh_url":"git@github.com:giantswarm/gsctl.git","clone_url":"https://github.com/giantswarm/gsctl.git","svn_url":"https://github.com/giantswarm/gsctl","homepage":null,"size":11445,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":25,"forks":0,"open_issues":25,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/giantswarm/gsctl/pulls/86"},"html":{"href":"https://github.com/giantswarm/gsctl/pull/86"},"issue":{"href":"https://api.github.com/repos/giantswarm/gsctl/issues/86"},"comments":{"href":"https://api.github.com/repos/giantswarm/gsctl/issues/86/comments"},"review_comments":{"href":"https://api.github.com/repos/giantswarm/gsctl/pulls/86/comments"},"review_comment":{"href":"https://api.github.com/repos/giantswarm/gsctl/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/giantswarm/gsctl/pulls/86/commits"},"statuses":{"href":"https://api.github.com/repos/giantswarm/gsctl/statuses/2eb06fb02783c64c6358e2124b0d9f32e43bb84b"}}}}
{"actor":{"display_login":"marians"}}