{"action":"created","comment":{"url":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls/comments/211476054","pull_request_review_id":147902070,"id":211476054,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMTQ3NjA1NA==","diff_hunk":"@@ -0,0 +1,192 @@\n+package framework\n+\n+import (\n+\t\"fmt\"\n+\t\"strings\"\n+\t\"time\"\n+\n+\t. \"github.com/onsi/ginkgo\"\n+\t. \"github.com/onsi/gomega\"\n+\n+\tk8sv1 \"k8s.io/api/core/v1\"\n+\tapierrs \"k8s.io/apimachinery/pkg/api/errors\"\n+\t\"k8s.io/apimachinery/pkg/api/resource\"\n+\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n+\t\"k8s.io/apimachinery/pkg/util/wait\"\n+)\n+\n+const (\n+\tdefaultPvcMountPath = \"/pvc\"\n+\tpoll                = 2 * time.Second\n+)\n+\n+// Creates a PVC in the passed in namespace from the passed in PersistentVolumeClaim definition.\n+// An example of creating a PVC without annotations looks like this:\n+// CreatePVCFromDefinition(client, namespace, NewPVCDefinition(name, size, nil))\n+func (f *Framework) CreatePVCFromDefinition(namespace string, def *k8sv1.PersistentVolumeClaim) (*k8sv1.PersistentVolumeClaim, error) {\n+\tvar pvc *k8sv1.PersistentVolumeClaim\n+\terr := wait.PollImmediate(poll, DefaultTimeout, func() (bool, error) {\n+\t\tvar err error\n+\t\tpvc, err = f.K8sClient.CoreV1().PersistentVolumeClaims(namespace).Create(def)\n+\t\tif err == nil || apierrs.IsAlreadyExists(err) {\n+\t\t\treturn true, nil\n+\t\t}\n+\t\treturn false, err\n+\t})\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\treturn pvc, nil\n+}\n+\n+// Delete the passed in PVC\n+func (f *Framework) DeletePVC(pvc *k8sv1.PersistentVolumeClaim) error {\n+\terr := wait.PollImmediate(poll, DefaultTimeout, func() (bool, error) {\n+\t\terr := f.K8sClient.CoreV1().PersistentVolumeClaims(f.Namespace.GetName()).Delete(pvc.GetName(), nil)\n+\t\tif err == nil || apierrs.IsNotFound(err) {\n+\t\t\treturn true, nil\n+\t\t}\n+\t\treturn false, err\n+\t})\n+\treturn err\n+}\n+\n+// Creates a PVC definition using the passed in name and requested size.\n+// You can use the following annotation keys to request an import or clone. The values are defined in the controller package\n+// AnnEndpoint\n+// AnnSecret\n+// AnnCloneRequest\n+// You can also pass in any label you want.\n+func NewPVCDefinition(pvcName string, size string, annotations, labels map[string]string) *k8sv1.PersistentVolumeClaim {\n+\treturn &k8sv1.PersistentVolumeClaim{\n+\t\tObjectMeta: metav1.ObjectMeta{\n+\t\t\tName:        pvcName,\n+\t\t\tAnnotations: annotations,\n+\t\t\tLabels:      labels,\n+\t\t},\n+\t\tSpec: k8sv1.PersistentVolumeClaimSpec{\n+\t\t\tAccessModes: []k8sv1.PersistentVolumeAccessMode{k8sv1.ReadWriteOnce},\n+\t\t\tResources: k8sv1.ResourceRequirements{\n+\t\t\t\tRequests: k8sv1.ResourceList{\n+\t\t\t\t\tk8sv1.ResourceName(k8sv1.ResourceStorage): resource.MustParse(size),\n+\t\t\t\t},\n+\t\t\t},\n+\t\t},\n+\t}\n+}\n+\n+// Wait for the PVC to be in a particular phase (Pending, Bound, or Lost)\n+func (f *Framework) WaitForPersistentVolumeClaimPhase(phase k8sv1.PersistentVolumeClaimPhase, pvcName string) error {\n+\twait.PollImmediate(poll, DefaultTimeout, func() (bool, error) {\n+\t\tpvc, err := f.K8sClient.CoreV1().PersistentVolumeClaims(f.Namespace.GetName()).Get(pvcName, metav1.GetOptions{})\n+\t\tif err != nil {\n+\t\t\treturn false, err\n+\t\t} else {\n+\t\t\tif pvc.Status.Phase == phase {\n+\t\t\t\treturn true, nil\n+\t\t\t}\n+\t\t}\n+\t\treturn false, nil\n+\t})\n+\treturn fmt.Errorf(\"PersistentVolumeClaim %s not in phase %s within %v\", pvcName, phase, DefaultTimeout)\n+}\n+\n+// Create a Pod with the passed in PVC mounted under /pvc. You can then use the executor utilities to\n+// run commands against the PVC through this Pod.\n+func (f *Framework) CreateExecutorPodWithPVC(podName string, pvc *k8sv1.PersistentVolumeClaim) *k8sv1.Pod {\n+\tvar pod *k8sv1.Pod\n+\tpodDef := newExecutorPodWithPVC(podName, \"ls -1 /pvc | wc -l\", pvc)\n+\terr := wait.PollImmediate(2*time.Second, DefaultTimeout, func() (bool, error) {\n+\t\tvar err error\n+\t\tpod, err = f.K8sClient.CoreV1().Pods(f.Namespace.GetName()).Create(podDef)\n+\t\tif err != nil {\n+\t\t\treturn false, nil\n+\t\t}\n+\t\treturn true, nil\n+\t})\n+\tif err != nil {\n+\t\tFail(\"Unable to create Pod: \" + podName + \", error: \" + err.Error())\n+\t}\n+\treturn pod\n+}\n+\n+// Delete the passed in Pod from the passed in Namespace\n+func (f *Framework) DeletePodFromNamespace(pod *k8sv1.Pod, namespace *k8sv1.Namespace) {\n+\terr := wait.PollImmediate(2*time.Second, DefaultTimeout, func() (bool, error) {\n+\t\terr := f.K8sClient.CoreV1().Pods(namespace.GetName()).Delete(pod.GetName(), &metav1.DeleteOptions{})\n+\t\tif err != nil {\n+\t\t\treturn false, nil\n+\t\t}\n+\t\treturn true, nil\n+\t})\n+\tif err != nil {\n+\t\tFail(\"Unable to delete Pod: \" + pod.GetName() + \", error: \" + err.Error())\n+\t}\n+}\n+\n+// Delete the passed in Pod from the Framework primary namespace\n+func (f *Framework) DeletePod(pod *k8sv1.Pod) {\n+\tf.DeletePodFromNamespace(pod, f.Namespace)\n+}\n+\n+func newExecutorPodWithPVC(podName, cmd string, pvc *k8sv1.PersistentVolumeClaim) *k8sv1.Pod {\n+\treturn &k8sv1.Pod{\n+\t\tObjectMeta: metav1.ObjectMeta{Name: podName},\n+\t\tSpec: k8sv1.PodSpec{\n+\t\t\tRestartPolicy: k8sv1.RestartPolicyNever,\n+\t\t\tContainers: []k8sv1.Container{\n+\t\t\t\t{\n+\t\t\t\t\tName:    \"runner\",\n+\t\t\t\t\tImage:   \"fedora:28\",\n+\t\t\t\t\tCommand: []string{\"/bin/sh\", \"-c\", \"sleep 5; echo I am an executor pod;\"},\n+\t\t\t\t\tVolumeMounts: []k8sv1.VolumeMount{\n+\t\t\t\t\t\t{\n+\t\t\t\t\t\t\tName:      pvc.GetName(),\n+\t\t\t\t\t\t\tMountPath: defaultPvcMountPath,\n+\t\t\t\t\t\t},\n+\t\t\t\t\t},\n+\t\t\t\t},\n+\t\t\t},\n+\t\t\tVolumes: []k8sv1.Volume{\n+\t\t\t\t{\n+\t\t\t\t\tName: pvc.GetName(),\n+\t\t\t\t\tVolumeSource: k8sv1.VolumeSource{\n+\t\t\t\t\t\tPersistentVolumeClaim: &k8sv1.PersistentVolumeClaimVolumeSource{\n+\t\t\t\t\t\t\tClaimName: pvc.GetName(),\n+\t\t\t\t\t\t},\n+\t\t\t\t\t},\n+\t\t\t\t},\n+\t\t\t},\n+\t\t},\n+\t}\n+}\n+\n+func (f *Framework) waitTimeoutForPodReady(podName string, timeout time.Duration) error {\n+\treturn wait.PollImmediate(2*time.Second, timeout, f.podRunning(podName, f.Namespace.GetName()))\n+}\n+\n+func (f *Framework) podRunning(podName, namespace string) wait.ConditionFunc {\n+\treturn func() (bool, error) {\n+\t\tpod, err := f.K8sClient.CoreV1().Pods(namespace).Get(podName, metav1.GetOptions{})\n+\t\tif err != nil {\n+\t\t\treturn false, err\n+\t\t}\n+\t\tswitch pod.Status.Phase {\n+\t\tcase k8sv1.PodRunning:\n+\t\t\treturn true, nil\n+\t\tcase k8sv1.PodFailed, k8sv1.PodSucceeded:\n+\t\t\treturn false, nil\n+\t\t}\n+\t\treturn false, nil\n+\t}\n+}\n+\n+// Verify a particular PVC is empty, returns true if it is, false otherwise.\n+func (f *Framework) VerifyPVCIsEmpty(pvc *k8sv1.PersistentVolumeClaim) bool {\n+\texecutorPod := f.CreateExecutorPodWithPVC(\"verify-pvc-empty\", pvc)\n+\terr := f.waitTimeoutForPodReady(executorPod.GetName(), DefaultTimeout)\n+\tExpect(err).To(BeNil())","path":"tests/framework/pvc_utils.go","position":188,"original_position":188,"commit_id":"9d288e8779583258d2b3f1b7a6407cb17ecf3615","original_commit_id":"9d288e8779583258d2b3f1b7a6407cb17ecf3615","user":{"login":"jeffvance","id":3076896,"node_id":"MDQ6VXNlcjMwNzY4OTY=","avatar_url":"https://avatars3.githubusercontent.com/u/3076896?v=4","gravatar_id":"","url":"https://api.github.com/users/jeffvance","html_url":"https://github.com/jeffvance","followers_url":"https://api.github.com/users/jeffvance/followers","following_url":"https://api.github.com/users/jeffvance/following{/other_user}","gists_url":"https://api.github.com/users/jeffvance/gists{/gist_id}","starred_url":"https://api.github.com/users/jeffvance/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jeffvance/subscriptions","organizations_url":"https://api.github.com/users/jeffvance/orgs","repos_url":"https://api.github.com/users/jeffvance/repos","events_url":"https://api.github.com/users/jeffvance/events{/privacy}","received_events_url":"https://api.github.com/users/jeffvance/received_events","type":"User","site_admin":false},"body":"My vote is that all framework funcs and methods return err rather than calling `Expect`, `Fail` or panic. I think this is the best practice for a lower-level, common framework pkg.","created_at":"2018-08-21T04:36:38Z","updated_at":"2018-08-21T04:36:38Z","html_url":"https://github.com/kubevirt/containerized-data-importer/pull/354#discussion_r211476054","pull_request_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls/354","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls/comments/211476054"},"html":{"href":"https://github.com/kubevirt/containerized-data-importer/pull/354#discussion_r211476054"},"pull_request":{"href":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls/354"}}},"pull_request":{"url":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls/354","id":209364136,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA5MzY0MTM2","html_url":"https://github.com/kubevirt/containerized-data-importer/pull/354","diff_url":"https://github.com/kubevirt/containerized-data-importer/pull/354.diff","patch_url":"https://github.com/kubevirt/containerized-data-importer/pull/354.patch","issue_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/issues/354","number":354,"state":"open","locked":false,"title":"Add regular PVC creation e2e test.","user":{"login":"awels","id":4523502,"node_id":"MDQ6VXNlcjQ1MjM1MDI=","avatar_url":"https://avatars3.githubusercontent.com/u/4523502?v=4","gravatar_id":"","url":"https://api.github.com/users/awels","html_url":"https://github.com/awels","followers_url":"https://api.github.com/users/awels/followers","following_url":"https://api.github.com/users/awels/following{/other_user}","gists_url":"https://api.github.com/users/awels/gists{/gist_id}","starred_url":"https://api.github.com/users/awels/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/awels/subscriptions","organizations_url":"https://api.github.com/users/awels/orgs","repos_url":"https://api.github.com/users/awels/repos","events_url":"https://api.github.com/users/awels/events{/privacy}","received_events_url":"https://api.github.com/users/awels/received_events","type":"User","site_admin":false},"body":"- Added e2e test to see if regular PVC doesn't get populated.\r\n- Moved PVC utility functions under framework.\r\n- Added exec utility functions to execute commands against running\r\n  Pods.\r\n\r\nSigned-off-by: Alexander Wels <awels@redhat.com>","created_at":"2018-08-19T14:58:04Z","updated_at":"2018-08-21T04:36:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"da581b0d286d502477a9e8c30a2f1f7fc4dedfb9","assignee":{"login":"awels","id":4523502,"node_id":"MDQ6VXNlcjQ1MjM1MDI=","avatar_url":"https://avatars3.githubusercontent.com/u/4523502?v=4","gravatar_id":"","url":"https://api.github.com/users/awels","html_url":"https://github.com/awels","followers_url":"https://api.github.com/users/awels/followers","following_url":"https://api.github.com/users/awels/following{/other_user}","gists_url":"https://api.github.com/users/awels/gists{/gist_id}","starred_url":"https://api.github.com/users/awels/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/awels/subscriptions","organizations_url":"https://api.github.com/users/awels/orgs","repos_url":"https://api.github.com/users/awels/repos","events_url":"https://api.github.com/users/awels/events{/privacy}","received_events_url":"https://api.github.com/users/awels/received_events","type":"User","site_admin":false},"assignees":[{"login":"awels","id":4523502,"node_id":"MDQ6VXNlcjQ1MjM1MDI=","avatar_url":"https://avatars3.githubusercontent.com/u/4523502?v=4","gravatar_id":"","url":"https://api.github.com/users/awels","html_url":"https://github.com/awels","followers_url":"https://api.github.com/users/awels/followers","following_url":"https://api.github.com/users/awels/following{/other_user}","gists_url":"https://api.github.com/users/awels/gists{/gist_id}","starred_url":"https://api.github.com/users/awels/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/awels/subscriptions","organizations_url":"https://api.github.com/users/awels/orgs","repos_url":"https://api.github.com/users/awels/repos","events_url":"https://api.github.com/users/awels/events{/privacy}","received_events_url":"https://api.github.com/users/awels/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1030016778,"node_id":"MDU6TGFiZWwxMDMwMDE2Nzc4","url":"https://api.github.com/repos/kubevirt/containerized-data-importer/labels/P0","name":"P0","color":"f453e7","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls/354/commits","review_comments_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls/354/comments","review_comment_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/issues/354/comments","statuses_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/statuses/9d288e8779583258d2b3f1b7a6407cb17ecf3615","head":{"label":"awels:add_e2e_pvc_test","ref":"add_e2e_pvc_test","sha":"9d288e8779583258d2b3f1b7a6407cb17ecf3615","user":{"login":"awels","id":4523502,"node_id":"MDQ6VXNlcjQ1MjM1MDI=","avatar_url":"https://avatars3.githubusercontent.com/u/4523502?v=4","gravatar_id":"","url":"https://api.github.com/users/awels","html_url":"https://github.com/awels","followers_url":"https://api.github.com/users/awels/followers","following_url":"https://api.github.com/users/awels/following{/other_user}","gists_url":"https://api.github.com/users/awels/gists{/gist_id}","starred_url":"https://api.github.com/users/awels/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/awels/subscriptions","organizations_url":"https://api.github.com/users/awels/orgs","repos_url":"https://api.github.com/users/awels/repos","events_url":"https://api.github.com/users/awels/events{/privacy}","received_events_url":"https://api.github.com/users/awels/received_events","type":"User","site_admin":false},"repo":{"id":134304931,"node_id":"MDEwOlJlcG9zaXRvcnkxMzQzMDQ5MzE=","name":"containerized-data-importer","full_name":"awels/containerized-data-importer","owner":{"login":"awels","id":4523502,"node_id":"MDQ6VXNlcjQ1MjM1MDI=","avatar_url":"https://avatars3.githubusercontent.com/u/4523502?v=4","gravatar_id":"","url":"https://api.github.com/users/awels","html_url":"https://github.com/awels","followers_url":"https://api.github.com/users/awels/followers","following_url":"https://api.github.com/users/awels/following{/other_user}","gists_url":"https://api.github.com/users/awels/gists{/gist_id}","starred_url":"https://api.github.com/users/awels/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/awels/subscriptions","organizations_url":"https://api.github.com/users/awels/orgs","repos_url":"https://api.github.com/users/awels/repos","events_url":"https://api.github.com/users/awels/events{/privacy}","received_events_url":"https://api.github.com/users/awels/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/awels/containerized-data-importer","description":"Data Import Service for kubernetes, designed with kubevirt in mind.","fork":true,"url":"https://api.github.com/repos/awels/containerized-data-importer","forks_url":"https://api.github.com/repos/awels/containerized-data-importer/forks","keys_url":"https://api.github.com/repos/awels/containerized-data-importer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/awels/containerized-data-importer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/awels/containerized-data-importer/teams","hooks_url":"https://api.github.com/repos/awels/containerized-data-importer/hooks","issue_events_url":"https://api.github.com/repos/awels/containerized-data-importer/issues/events{/number}","events_url":"https://api.github.com/repos/awels/containerized-data-importer/events","assignees_url":"https://api.github.com/repos/awels/containerized-data-importer/assignees{/user}","branches_url":"https://api.github.com/repos/awels/containerized-data-importer/branches{/branch}","tags_url":"https://api.github.com/repos/awels/containerized-data-importer/tags","blobs_url":"https://api.github.com/repos/awels/containerized-data-importer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/awels/containerized-data-importer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/awels/containerized-data-importer/git/refs{/sha}","trees_url":"https://api.github.com/repos/awels/containerized-data-importer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/awels/containerized-data-importer/statuses/{sha}","languages_url":"https://api.github.com/repos/awels/containerized-data-importer/languages","stargazers_url":"https://api.github.com/repos/awels/containerized-data-importer/stargazers","contributors_url":"https://api.github.com/repos/awels/containerized-data-importer/contributors","subscribers_url":"https://api.github.com/repos/awels/containerized-data-importer/subscribers","subscription_url":"https://api.github.com/repos/awels/containerized-data-importer/subscription","commits_url":"https://api.github.com/repos/awels/containerized-data-importer/commits{/sha}","git_commits_url":"https://api.github.com/repos/awels/containerized-data-importer/git/commits{/sha}","comments_url":"https://api.github.com/repos/awels/containerized-data-importer/comments{/number}","issue_comment_url":"https://api.github.com/repos/awels/containerized-data-importer/issues/comments{/number}","contents_url":"https://api.github.com/repos/awels/containerized-data-importer/contents/{+path}","compare_url":"https://api.github.com/repos/awels/containerized-data-importer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/awels/containerized-data-importer/merges","archive_url":"https://api.github.com/repos/awels/containerized-data-importer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/awels/containerized-data-importer/downloads","issues_url":"https://api.github.com/repos/awels/containerized-data-importer/issues{/number}","pulls_url":"https://api.github.com/repos/awels/containerized-data-importer/pulls{/number}","milestones_url":"https://api.github.com/repos/awels/containerized-data-importer/milestones{/number}","notifications_url":"https://api.github.com/repos/awels/containerized-data-importer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/awels/containerized-data-importer/labels{/name}","releases_url":"https://api.github.com/repos/awels/containerized-data-importer/releases{/id}","deployments_url":"https://api.github.com/repos/awels/containerized-data-importer/deployments","created_at":"2018-05-21T17:52:31Z","updated_at":"2018-08-20T14:19:54Z","pushed_at":"2018-08-20T20:35:23Z","git_url":"git://github.com/awels/containerized-data-importer.git","ssh_url":"git@github.com:awels/containerized-data-importer.git","clone_url":"https://github.com/awels/containerized-data-importer.git","svn_url":"https://github.com/awels/containerized-data-importer","homepage":"","size":47828,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kubevirt:master","ref":"master","sha":"4519a615e9502db4f911c4902510bb3fa57a91d7","user":{"login":"kubevirt","id":18700703,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE4NzAwNzAz","avatar_url":"https://avatars1.githubusercontent.com/u/18700703?v=4","gravatar_id":"","url":"https://api.github.com/users/kubevirt","html_url":"https://github.com/kubevirt","followers_url":"https://api.github.com/users/kubevirt/followers","following_url":"https://api.github.com/users/kubevirt/following{/other_user}","gists_url":"https://api.github.com/users/kubevirt/gists{/gist_id}","starred_url":"https://api.github.com/users/kubevirt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubevirt/subscriptions","organizations_url":"https://api.github.com/users/kubevirt/orgs","repos_url":"https://api.github.com/users/kubevirt/repos","events_url":"https://api.github.com/users/kubevirt/events{/privacy}","received_events_url":"https://api.github.com/users/kubevirt/received_events","type":"Organization","site_admin":false},"repo":{"id":117756215,"node_id":"MDEwOlJlcG9zaXRvcnkxMTc3NTYyMTU=","name":"containerized-data-importer","full_name":"kubevirt/containerized-data-importer","owner":{"login":"kubevirt","id":18700703,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE4NzAwNzAz","avatar_url":"https://avatars1.githubusercontent.com/u/18700703?v=4","gravatar_id":"","url":"https://api.github.com/users/kubevirt","html_url":"https://github.com/kubevirt","followers_url":"https://api.github.com/users/kubevirt/followers","following_url":"https://api.github.com/users/kubevirt/following{/other_user}","gists_url":"https://api.github.com/users/kubevirt/gists{/gist_id}","starred_url":"https://api.github.com/users/kubevirt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubevirt/subscriptions","organizations_url":"https://api.github.com/users/kubevirt/orgs","repos_url":"https://api.github.com/users/kubevirt/repos","events_url":"https://api.github.com/users/kubevirt/events{/privacy}","received_events_url":"https://api.github.com/users/kubevirt/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kubevirt/containerized-data-importer","description":"Data Import Service for kubernetes, designed with kubevirt in mind.","fork":false,"url":"https://api.github.com/repos/kubevirt/containerized-data-importer","forks_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/forks","keys_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/teams","hooks_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/hooks","issue_events_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/issues/events{/number}","events_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/events","assignees_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/assignees{/user}","branches_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/branches{/branch}","tags_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/tags","blobs_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/statuses/{sha}","languages_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/languages","stargazers_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/stargazers","contributors_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/contributors","subscribers_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/subscribers","subscription_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/subscription","commits_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/contents/{+path}","compare_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/merges","archive_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/downloads","issues_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/issues{/number}","pulls_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls{/number}","milestones_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/milestones{/number}","notifications_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/labels{/name}","releases_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/releases{/id}","deployments_url":"https://api.github.com/repos/kubevirt/containerized-data-importer/deployments","created_at":"2018-01-16T23:35:48Z","updated_at":"2018-08-20T21:26:36Z","pushed_at":"2018-08-20T21:26:33Z","git_url":"git://github.com/kubevirt/containerized-data-importer.git","ssh_url":"git@github.com:kubevirt/containerized-data-importer.git","clone_url":"https://github.com/kubevirt/containerized-data-importer.git","svn_url":"https://github.com/kubevirt/containerized-data-importer","homepage":"","size":47370,"stargazers_count":7,"watchers_count":7,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"archived":false,"open_issues_count":36,"license":null,"forks":18,"open_issues":36,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls/354"},"html":{"href":"https://github.com/kubevirt/containerized-data-importer/pull/354"},"issue":{"href":"https://api.github.com/repos/kubevirt/containerized-data-importer/issues/354"},"comments":{"href":"https://api.github.com/repos/kubevirt/containerized-data-importer/issues/354/comments"},"review_comments":{"href":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls/354/comments"},"review_comment":{"href":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubevirt/containerized-data-importer/pulls/354/commits"},"statuses":{"href":"https://api.github.com/repos/kubevirt/containerized-data-importer/statuses/9d288e8779583258d2b3f1b7a6407cb17ecf3615"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jeffvance"}}