{"action":"created","comment":{"url":"https://api.github.com/repos/heptio/ark/pulls/comments/194462454","pull_request_review_id":127639772,"id":194462454,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5NDQ2MjQ1NA==","diff_hunk":"@@ -250,40 +252,99 @@ func (c *podVolumeRestoreController) processRestore(req *arkv1api.PodVolumeResto\n \tpod, err := c.podLister.Pods(req.Spec.Pod.Namespace).Get(req.Spec.Pod.Name)\n \tif err != nil {\n \t\tlog.WithError(err).Errorf(\"Error getting pod %s/%s\", req.Spec.Pod.Namespace, req.Spec.Pod.Name)\n-\t\treturn c.fail(req, errors.Wrap(err, \"error getting pod\").Error(), log)\n+\t\treturn c.failRestore(req, errors.Wrap(err, \"error getting pod\").Error(), log)\n \t}\n \n \tvolumeDir, err := kube.GetVolumeDirectory(pod, req.Spec.Volume, c.pvcLister)\n \tif err != nil {\n \t\tlog.WithError(err).Error(\"Error getting volume directory name\")\n-\t\treturn c.fail(req, errors.Wrap(err, \"error getting volume directory name\").Error(), log)\n+\t\treturn c.failRestore(req, errors.Wrap(err, \"error getting volume directory name\").Error(), log)\n \t}\n \n-\t// temp creds\n-\tfile, err := restic.TempCredentialsFile(c.secretLister, req.Spec.Pod.Namespace)\n+\tcredsFile, err := restic.TempCredentialsFile(c.secretLister, req.Spec.Pod.Namespace)\n \tif err != nil {\n \t\tlog.WithError(err).Error(\"Error creating temp restic credentials file\")\n-\t\treturn c.fail(req, errors.Wrap(err, \"error creating temp restic credentials file\").Error(), log)\n+\t\treturn c.failRestore(req, errors.Wrap(err, \"error creating temp restic credentials file\").Error(), log)\n \t}\n \t// ignore error since there's nothing we can do and it's a temp file.\n-\tdefer os.Remove(file)\n+\tdefer os.Remove(credsFile)\n \n+\t// execute the restore process\n+\tif err := restorePodVolume(req, credsFile, volumeDir, log); err != nil {\n+\t\tlog.WithError(err).Error(\"Error restoring volume\")\n+\t\treturn c.failRestore(req, errors.Wrap(err, \"error restoring volume\").Error(), log)\n+\t}\n+\n+\t// update status to Completed\n+\tif _, err = c.patchPodVolumeRestore(req, updatePodVolumeRestorePhaseFunc(arkv1api.PodVolumeRestorePhaseCompleted)); err != nil {\n+\t\tlog.WithError(err).Error(\"Error setting phase to Completed\")\n+\t\treturn err\n+\t}\n+\n+\treturn nil\n+}\n+\n+func restorePodVolume(req *arkv1api.PodVolumeRestore, credsFile, volumeDir string, log logrus.FieldLogger) error {\n \tresticCmd := restic.RestoreCommand(\n \t\treq.Spec.RepoPrefix,\n \t\treq.Spec.Pod.Namespace,\n-\t\tfile,\n+\t\tcredsFile,\n \t\tstring(req.Spec.Pod.UID),\n \t\treq.Spec.SnapshotID,\n \t)\n \n-\tvar stdout, stderr string\n+\tvar (\n+\t\tstdout, stderr string\n+\t\terr            error\n+\t)\n \n+\t// First restore the backed-up volume into a staging area, under /restores. This is necessary because restic backups\n+\t// are stored with the absolute path of the backed-up directory, and restic doesn't allow you to adjust this path\n+\t// when restoring, only to choose a different parent directory. So, for example, if you backup /foo/bar/volume, when\n+\t// restoring, you can't restore to /baz/volume. You may restore to /baz/foo/bar/volume, though. The net result of\n+\t// all this is that we can't restore directly into the new volume's directory, because the path is entirely different\n+\t// than the backed-up one.\n \tif stdout, stderr, err = runCommand(resticCmd.Cmd()); err != nil {\n-\t\tlog.WithError(errors.WithStack(err)).Errorf(\"Error running command=%s, stdout=%s, stderr=%s\", resticCmd.String(), stdout, stderr)\n-\t\treturn c.fail(req, fmt.Sprintf(\"error running restic restore, stderr=%s: %s\", stderr, err.Error()), log)\n+\t\treturn errors.Wrapf(err, \"error running restic restore, cmd=%s, stdout=%s, stderr=%s\", resticCmd.String(), stdout, stderr)\n \t}\n \tlog.Debugf(\"Ran command=%s, stdout=%s, stderr=%s\", resticCmd.String(), stdout, stderr)\n \n+\t// Now, get the full path of the restored volume in the staging directory, which will\n+\t// look like:\n+\t// \t\t/restores/<new-pod-uid>/host_pods/<backed-up-pod-uid>/volumes/<volume-plugin-name>/<volume-dir>\n+\trestorePath, err := singlePathMatch(fmt.Sprintf(\"/restores/%s/host_pods/*/volumes/*/%s\", string(req.Spec.Pod.UID), volumeDir))\n+\tif err != nil {\n+\t\treturn errors.Wrap(err, \"error identifying path of restore staging directory\")\n+\t}\n+\n+\t// Also get the full path of the new volume's directory (as mounted in the daemonset pod), which\n+\t// will look like:\n+\t// \t\t/host_pods/<new-pod-uid>/volumes/<volume-plugin-name>/<volume-dir>\n+\tvolumePath, err := singlePathMatch(fmt.Sprintf(\"/host_pods/%s/volumes/*/%s\", string(req.Spec.Pod.UID), volumeDir))\n+\tif err != nil {\n+\t\treturn errors.Wrap(err, \"error identifying path of volume\")\n+\t}\n+\n+\t// Move the contents of the staging directory into the new volume directory to finalize the restore. This\n+\t// is being executed through a shell because attempting to do the same thing in go (via os.Rename()) is\n+\t// giving errors about renames not being allowed across filesystem layers in a container. This is occurring\n+\t// whether /restores is part of the writeable container layer, or is an emptyDir volume mount. This may\n+\t// be solvable but using the shell works so not investigating further.\n+\t//\n+\t// Glob patterns:\n+\t// \t[^.]*  : any non-dot character followed by anything (regular files)\n+\t// \t.[^.]* : a dot followed by a non-dot and anything else (dotfiles starting with a single dot, excluding '.')\n+\t// \t..?*   : two dots followed by any single character and anything else (dotfiles starting with two dots, excluding '..')\n+\tif err := moveMatchingFiles(restorePath, volumePath, \"[^.]*\", \".[^.]*\", \"..?*\"); err != nil {\n+\t\treturn errors.Wrapf(err, \"error moving files from restore staging directory into volume\")\n+\t}\n+\n+\t// The staging directory should be empty at this point since we moved everything, but\n+\t// make sure.\n+\tif err := os.RemoveAll(restorePath); err != nil {\n+\t\treturn errors.Wrap(err, \"error removing restore staging directory and its contents\")","path":"pkg/controller/pod_volume_restore_controller.go","position":115,"original_position":115,"commit_id":"caf6460aca55fb5a995870a35aa4c695f50f6691","original_commit_id":"caf6460aca55fb5a995870a35aa4c695f50f6691","user":{"login":"skriss","id":5241206,"node_id":"MDQ6VXNlcjUyNDEyMDY=","avatar_url":"https://avatars3.githubusercontent.com/u/5241206?v=4","gravatar_id":"","url":"https://api.github.com/users/skriss","html_url":"https://github.com/skriss","followers_url":"https://api.github.com/users/skriss/followers","following_url":"https://api.github.com/users/skriss/following{/other_user}","gists_url":"https://api.github.com/users/skriss/gists{/gist_id}","starred_url":"https://api.github.com/users/skriss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/skriss/subscriptions","organizations_url":"https://api.github.com/users/skriss/orgs","repos_url":"https://api.github.com/users/skriss/repos","events_url":"https://api.github.com/users/skriss/events{/privacy}","received_events_url":"https://api.github.com/users/skriss/received_events","type":"User","site_admin":false},"body":"I suppose it is possible there's an error. Now that you raise it, I'm thinking this shouldn't be an error for the restore - since this is just (probably redundant) cleanup in the daemonset pod. ","created_at":"2018-06-11T16:17:54Z","updated_at":"2018-06-11T16:17:54Z","html_url":"https://github.com/heptio/ark/pull/534#discussion_r194462454","pull_request_url":"https://api.github.com/repos/heptio/ark/pulls/534","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/heptio/ark/pulls/comments/194462454"},"html":{"href":"https://github.com/heptio/ark/pull/534#discussion_r194462454"},"pull_request":{"href":"https://api.github.com/repos/heptio/ark/pulls/534"}},"in_reply_to_id":194422359},"pull_request":{"url":"https://api.github.com/repos/heptio/ark/pulls/534","id":193440736,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkzNDQwNzM2","html_url":"https://github.com/heptio/ark/pull/534","diff_url":"https://github.com/heptio/ark/pull/534.diff","patch_url":"https://github.com/heptio/ark/pull/534.patch","issue_url":"https://api.github.com/repos/heptio/ark/issues/534","number":534,"state":"open","locked":false,"title":"replace complete-restore.sh with go code","user":{"login":"skriss","id":5241206,"node_id":"MDQ6VXNlcjUyNDEyMDY=","avatar_url":"https://avatars3.githubusercontent.com/u/5241206?v=4","gravatar_id":"","url":"https://api.github.com/users/skriss","html_url":"https://github.com/skriss","followers_url":"https://api.github.com/users/skriss/followers","following_url":"https://api.github.com/users/skriss/following{/other_user}","gists_url":"https://api.github.com/users/skriss/gists{/gist_id}","starred_url":"https://api.github.com/users/skriss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/skriss/subscriptions","organizations_url":"https://api.github.com/users/skriss/orgs","repos_url":"https://api.github.com/users/skriss/repos","events_url":"https://api.github.com/users/skriss/events{/privacy}","received_events_url":"https://api.github.com/users/skriss/received_events","type":"User","site_admin":false},"body":"Signed-off-by: Steve Kriss <steve@heptio.com>","created_at":"2018-06-07T20:38:49Z","updated_at":"2018-06-11T16:17:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8bf9b26ea5b82ca8fe050817857a514bb7e212e8","assignee":{"login":"ncdc","id":354,"node_id":"MDQ6VXNlcjM1NA==","avatar_url":"https://avatars2.githubusercontent.com/u/354?v=4","gravatar_id":"","url":"https://api.github.com/users/ncdc","html_url":"https://github.com/ncdc","followers_url":"https://api.github.com/users/ncdc/followers","following_url":"https://api.github.com/users/ncdc/following{/other_user}","gists_url":"https://api.github.com/users/ncdc/gists{/gist_id}","starred_url":"https://api.github.com/users/ncdc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ncdc/subscriptions","organizations_url":"https://api.github.com/users/ncdc/orgs","repos_url":"https://api.github.com/users/ncdc/repos","events_url":"https://api.github.com/users/ncdc/events{/privacy}","received_events_url":"https://api.github.com/users/ncdc/received_events","type":"User","site_admin":false},"assignees":[{"login":"ncdc","id":354,"node_id":"MDQ6VXNlcjM1NA==","avatar_url":"https://avatars2.githubusercontent.com/u/354?v=4","gravatar_id":"","url":"https://api.github.com/users/ncdc","html_url":"https://github.com/ncdc","followers_url":"https://api.github.com/users/ncdc/followers","following_url":"https://api.github.com/users/ncdc/following{/other_user}","gists_url":"https://api.github.com/users/ncdc/gists{/gist_id}","starred_url":"https://api.github.com/users/ncdc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ncdc/subscriptions","organizations_url":"https://api.github.com/users/ncdc/orgs","repos_url":"https://api.github.com/users/ncdc/repos","events_url":"https://api.github.com/users/ncdc/events{/privacy}","received_events_url":"https://api.github.com/users/ncdc/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":732881901,"node_id":"MDU6TGFiZWw3MzI4ODE5MDE=","url":"https://api.github.com/repos/heptio/ark/labels/Tech%20debt","name":"Tech debt","color":"93eda5","default":false}],"milestone":{"url":"https://api.github.com/repos/heptio/ark/milestones/6","html_url":"https://github.com/heptio/ark/milestone/6","labels_url":"https://api.github.com/repos/heptio/ark/milestones/6/labels","id":3259201,"node_id":"MDk6TWlsZXN0b25lMzI1OTIwMQ==","number":6,"title":"v0.9.0","description":"","creator":{"login":"nrb","id":321387,"node_id":"MDQ6VXNlcjMyMTM4Nw==","avatar_url":"https://avatars0.githubusercontent.com/u/321387?v=4","gravatar_id":"","url":"https://api.github.com/users/nrb","html_url":"https://github.com/nrb","followers_url":"https://api.github.com/users/nrb/followers","following_url":"https://api.github.com/users/nrb/following{/other_user}","gists_url":"https://api.github.com/users/nrb/gists{/gist_id}","starred_url":"https://api.github.com/users/nrb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nrb/subscriptions","organizations_url":"https://api.github.com/users/nrb/orgs","repos_url":"https://api.github.com/users/nrb/repos","events_url":"https://api.github.com/users/nrb/events{/privacy}","received_events_url":"https://api.github.com/users/nrb/received_events","type":"User","site_admin":false},"open_issues":6,"closed_issues":16,"state":"open","created_at":"2018-04-11T14:49:32Z","updated_at":"2018-06-08T22:04:11Z","due_on":"2018-06-14T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/heptio/ark/pulls/534/commits","review_comments_url":"https://api.github.com/repos/heptio/ark/pulls/534/comments","review_comment_url":"https://api.github.com/repos/heptio/ark/pulls/comments{/number}","comments_url":"https://api.github.com/repos/heptio/ark/issues/534/comments","statuses_url":"https://api.github.com/repos/heptio/ark/statuses/caf6460aca55fb5a995870a35aa4c695f50f6691","head":{"label":"skriss:rm-complete-restore-sh","ref":"rm-complete-restore-sh","sha":"caf6460aca55fb5a995870a35aa4c695f50f6691","user":{"login":"skriss","id":5241206,"node_id":"MDQ6VXNlcjUyNDEyMDY=","avatar_url":"https://avatars3.githubusercontent.com/u/5241206?v=4","gravatar_id":"","url":"https://api.github.com/users/skriss","html_url":"https://github.com/skriss","followers_url":"https://api.github.com/users/skriss/followers","following_url":"https://api.github.com/users/skriss/following{/other_user}","gists_url":"https://api.github.com/users/skriss/gists{/gist_id}","starred_url":"https://api.github.com/users/skriss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/skriss/subscriptions","organizations_url":"https://api.github.com/users/skriss/orgs","repos_url":"https://api.github.com/users/skriss/repos","events_url":"https://api.github.com/users/skriss/events{/privacy}","received_events_url":"https://api.github.com/users/skriss/received_events","type":"User","site_admin":false},"repo":{"id":99252487,"node_id":"MDEwOlJlcG9zaXRvcnk5OTI1MjQ4Nw==","name":"ark","full_name":"skriss/ark","owner":{"login":"skriss","id":5241206,"node_id":"MDQ6VXNlcjUyNDEyMDY=","avatar_url":"https://avatars3.githubusercontent.com/u/5241206?v=4","gravatar_id":"","url":"https://api.github.com/users/skriss","html_url":"https://github.com/skriss","followers_url":"https://api.github.com/users/skriss/followers","following_url":"https://api.github.com/users/skriss/following{/other_user}","gists_url":"https://api.github.com/users/skriss/gists{/gist_id}","starred_url":"https://api.github.com/users/skriss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/skriss/subscriptions","organizations_url":"https://api.github.com/users/skriss/orgs","repos_url":"https://api.github.com/users/skriss/repos","events_url":"https://api.github.com/users/skriss/events{/privacy}","received_events_url":"https://api.github.com/users/skriss/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/skriss/ark","description":"Heptio Ark is a utility for managing disaster recovery, specifically for your Kubernetes cluster resources and persistent volumes. Brought to you by Heptio.","fork":true,"url":"https://api.github.com/repos/skriss/ark","forks_url":"https://api.github.com/repos/skriss/ark/forks","keys_url":"https://api.github.com/repos/skriss/ark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/skriss/ark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/skriss/ark/teams","hooks_url":"https://api.github.com/repos/skriss/ark/hooks","issue_events_url":"https://api.github.com/repos/skriss/ark/issues/events{/number}","events_url":"https://api.github.com/repos/skriss/ark/events","assignees_url":"https://api.github.com/repos/skriss/ark/assignees{/user}","branches_url":"https://api.github.com/repos/skriss/ark/branches{/branch}","tags_url":"https://api.github.com/repos/skriss/ark/tags","blobs_url":"https://api.github.com/repos/skriss/ark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/skriss/ark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/skriss/ark/git/refs{/sha}","trees_url":"https://api.github.com/repos/skriss/ark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/skriss/ark/statuses/{sha}","languages_url":"https://api.github.com/repos/skriss/ark/languages","stargazers_url":"https://api.github.com/repos/skriss/ark/stargazers","contributors_url":"https://api.github.com/repos/skriss/ark/contributors","subscribers_url":"https://api.github.com/repos/skriss/ark/subscribers","subscription_url":"https://api.github.com/repos/skriss/ark/subscription","commits_url":"https://api.github.com/repos/skriss/ark/commits{/sha}","git_commits_url":"https://api.github.com/repos/skriss/ark/git/commits{/sha}","comments_url":"https://api.github.com/repos/skriss/ark/comments{/number}","issue_comment_url":"https://api.github.com/repos/skriss/ark/issues/comments{/number}","contents_url":"https://api.github.com/repos/skriss/ark/contents/{+path}","compare_url":"https://api.github.com/repos/skriss/ark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/skriss/ark/merges","archive_url":"https://api.github.com/repos/skriss/ark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/skriss/ark/downloads","issues_url":"https://api.github.com/repos/skriss/ark/issues{/number}","pulls_url":"https://api.github.com/repos/skriss/ark/pulls{/number}","milestones_url":"https://api.github.com/repos/skriss/ark/milestones{/number}","notifications_url":"https://api.github.com/repos/skriss/ark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/skriss/ark/labels{/name}","releases_url":"https://api.github.com/repos/skriss/ark/releases{/id}","deployments_url":"https://api.github.com/repos/skriss/ark/deployments","created_at":"2017-08-03T16:18:24Z","updated_at":"2017-08-03T16:18:37Z","pushed_at":"2018-06-11T16:12:57Z","git_url":"git://github.com/skriss/ark.git","ssh_url":"git@github.com:skriss/ark.git","clone_url":"https://github.com/skriss/ark.git","svn_url":"https://github.com/skriss/ark","homepage":"http://www.heptio.com","size":21565,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"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":0,"watchers":0,"default_branch":"master"}},"base":{"label":"heptio:master","ref":"master","sha":"0396ca1deef2eee7297615e24d28f2f55558c33d","user":{"login":"heptio","id":22035492,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIyMDM1NDky","avatar_url":"https://avatars0.githubusercontent.com/u/22035492?v=4","gravatar_id":"","url":"https://api.github.com/users/heptio","html_url":"https://github.com/heptio","followers_url":"https://api.github.com/users/heptio/followers","following_url":"https://api.github.com/users/heptio/following{/other_user}","gists_url":"https://api.github.com/users/heptio/gists{/gist_id}","starred_url":"https://api.github.com/users/heptio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/heptio/subscriptions","organizations_url":"https://api.github.com/users/heptio/orgs","repos_url":"https://api.github.com/users/heptio/repos","events_url":"https://api.github.com/users/heptio/events{/privacy}","received_events_url":"https://api.github.com/users/heptio/received_events","type":"Organization","site_admin":false},"repo":{"id":99143276,"node_id":"MDEwOlJlcG9zaXRvcnk5OTE0MzI3Ng==","name":"ark","full_name":"heptio/ark","owner":{"login":"heptio","id":22035492,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIyMDM1NDky","avatar_url":"https://avatars0.githubusercontent.com/u/22035492?v=4","gravatar_id":"","url":"https://api.github.com/users/heptio","html_url":"https://github.com/heptio","followers_url":"https://api.github.com/users/heptio/followers","following_url":"https://api.github.com/users/heptio/following{/other_user}","gists_url":"https://api.github.com/users/heptio/gists{/gist_id}","starred_url":"https://api.github.com/users/heptio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/heptio/subscriptions","organizations_url":"https://api.github.com/users/heptio/orgs","repos_url":"https://api.github.com/users/heptio/repos","events_url":"https://api.github.com/users/heptio/events{/privacy}","received_events_url":"https://api.github.com/users/heptio/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/heptio/ark","description":"Heptio Ark is a utility for managing disaster recovery, specifically for your Kubernetes cluster resources and persistent volumes. Brought to you by Heptio.","fork":false,"url":"https://api.github.com/repos/heptio/ark","forks_url":"https://api.github.com/repos/heptio/ark/forks","keys_url":"https://api.github.com/repos/heptio/ark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/heptio/ark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/heptio/ark/teams","hooks_url":"https://api.github.com/repos/heptio/ark/hooks","issue_events_url":"https://api.github.com/repos/heptio/ark/issues/events{/number}","events_url":"https://api.github.com/repos/heptio/ark/events","assignees_url":"https://api.github.com/repos/heptio/ark/assignees{/user}","branches_url":"https://api.github.com/repos/heptio/ark/branches{/branch}","tags_url":"https://api.github.com/repos/heptio/ark/tags","blobs_url":"https://api.github.com/repos/heptio/ark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/heptio/ark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/heptio/ark/git/refs{/sha}","trees_url":"https://api.github.com/repos/heptio/ark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/heptio/ark/statuses/{sha}","languages_url":"https://api.github.com/repos/heptio/ark/languages","stargazers_url":"https://api.github.com/repos/heptio/ark/stargazers","contributors_url":"https://api.github.com/repos/heptio/ark/contributors","subscribers_url":"https://api.github.com/repos/heptio/ark/subscribers","subscription_url":"https://api.github.com/repos/heptio/ark/subscription","commits_url":"https://api.github.com/repos/heptio/ark/commits{/sha}","git_commits_url":"https://api.github.com/repos/heptio/ark/git/commits{/sha}","comments_url":"https://api.github.com/repos/heptio/ark/comments{/number}","issue_comment_url":"https://api.github.com/repos/heptio/ark/issues/comments{/number}","contents_url":"https://api.github.com/repos/heptio/ark/contents/{+path}","compare_url":"https://api.github.com/repos/heptio/ark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/heptio/ark/merges","archive_url":"https://api.github.com/repos/heptio/ark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/heptio/ark/downloads","issues_url":"https://api.github.com/repos/heptio/ark/issues{/number}","pulls_url":"https://api.github.com/repos/heptio/ark/pulls{/number}","milestones_url":"https://api.github.com/repos/heptio/ark/milestones{/number}","notifications_url":"https://api.github.com/repos/heptio/ark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/heptio/ark/labels{/name}","releases_url":"https://api.github.com/repos/heptio/ark/releases{/id}","deployments_url":"https://api.github.com/repos/heptio/ark/deployments","created_at":"2017-08-02T17:22:11Z","updated_at":"2018-06-11T14:52:35Z","pushed_at":"2018-06-11T16:12:59Z","git_url":"git://github.com/heptio/ark.git","ssh_url":"git@github.com:heptio/ark.git","clone_url":"https://github.com/heptio/ark.git","svn_url":"https://github.com/heptio/ark","homepage":"https://www.heptio.com","size":9291,"stargazers_count":1181,"watchers_count":1181,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":153,"mirror_url":null,"archived":false,"open_issues_count":119,"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":153,"open_issues":119,"watchers":1181,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/heptio/ark/pulls/534"},"html":{"href":"https://github.com/heptio/ark/pull/534"},"issue":{"href":"https://api.github.com/repos/heptio/ark/issues/534"},"comments":{"href":"https://api.github.com/repos/heptio/ark/issues/534/comments"},"review_comments":{"href":"https://api.github.com/repos/heptio/ark/pulls/534/comments"},"review_comment":{"href":"https://api.github.com/repos/heptio/ark/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/heptio/ark/pulls/534/commits"},"statuses":{"href":"https://api.github.com/repos/heptio/ark/statuses/caf6460aca55fb5a995870a35aa4c695f50f6691"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"skriss"}}