{"action":"created","comment":{"url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls/comments/280397043","pull_request_review_id":232978615,"id":280397043,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI4MDM5NzA0Mw==","diff_hunk":"@@ -176,166 +139,246 @@ func machineAutoscalerResource(targetMachineSet *mapiv1beta1.MachineSet, minRepl\n \t}\n }\n \n-var _ = g.Describe(\"[Feature:Machines] Autoscaler should\", func() {\n+func isAutoscalerScaleUpEvent(event *corev1.Event) bool {\n+\treturn event.Source.Component == \"cluster-autoscaler\" &&\n+\t\tevent.Reason == \"ScaledUpGroup\" &&\n+\t\tevent.InvolvedObject.Kind == \"ConfigMap\" &&\n+\t\tstrings.HasPrefix(event.Message, \"Scale-up: setting group\")\n+}\n+\n+func isAutoscalerScaleDownEvent(event *corev1.Event) bool {\n+\treturn event.Source.Component == \"cluster-autoscaler\" &&\n+\t\tevent.Reason == \"ScaleDownEmpty\" &&\n+\t\tevent.InvolvedObject.Kind == \"ConfigMap\" &&\n+\t\tstrings.HasPrefix(event.Message, \"Scale-down: empty node\")\n+}\n+\n+func isAutoscalerMaxNodesTotalEvent(event *corev1.Event) bool {\n+\treturn event.Source.Component == \"cluster-autoscaler\" &&\n+\t\tevent.Reason == \"MaxNodesTotalReached\" &&\n+\t\tevent.InvolvedObject.Kind == \"ConfigMap\" &&\n+\t\tstrings.HasPrefix(event.Message, \"Max total nodes in cluster reached\")\n+}\n+\n+func scaleUpAndDown() {\n \tdefer g.GinkgoRecover()\n-\tscaleUpFunc := func(client runtimeclient.Client, targetMachineSet mapiv1beta1.MachineSet, nodeTestLabel string, initialNumberOfReplicas int32, expectedReplicas int32) {\n-\t\tg.By(fmt.Sprintf(\"Creating MachineAutoscaler object for targetMachineSet %q\", targetMachineSet.Name))\n-\t\tmachineAutoscaler := machineAutoscalerResource(&targetMachineSet, 1, expectedReplicas)\n-\t\terr := client.Create(context.TODO(), machineAutoscaler)\n-\t\to.Expect(err).NotTo(o.HaveOccurred())\n \n-\t\tg.By(fmt.Sprintf(\"Waiting for cluster to scale out number of replicas of targetMachineSet %q\", targetMachineSet.Name))\n-\t\terr = wait.PollImmediate(5*time.Second, e2e.WaitLong, func() (bool, error) {\n-\t\t\tms, err := e2e.GetMachineSet(context.TODO(), client, targetMachineSet.Name)\n-\t\t\tif err != nil {\n-\t\t\t\tglog.Errorf(\"error getting machineset object: %v, retrying...\", err)\n-\t\t\t\treturn false, nil\n-\t\t\t}\n-\t\t\tglog.Infof(\"MachineSet %q. Initial number of replicas: %d. Current number of replicas: %d\", targetMachineSet.Name, initialNumberOfReplicas, pointer.Int32PtrDerefOr(ms.Spec.Replicas, e2e.DefaultMachineSetReplicas))\n-\t\t\treturn pointer.Int32PtrDerefOr(ms.Spec.Replicas, e2e.DefaultMachineSetReplicas) == expectedReplicas, nil\n-\t\t})\n-\t\to.Expect(err).NotTo(o.HaveOccurred())\n+\tclientset, err := e2e.LoadClientset()\n+\to.Expect(err).NotTo(o.HaveOccurred())\n \n-\t\tg.By(fmt.Sprintf(\"Waiting for cluster to scale up nodes for targetMachineSet %q\", targetMachineSet.Name))\n-\t\terr = wait.PollImmediate(5*time.Second, e2e.WaitLong, func() (bool, error) {\n-\t\t\tscaledMachines := mapiv1beta1.MachineList{}\n-\t\t\tif err := client.List(context.TODO(), runtimeclient.MatchingLabels(targetMachineSet.Spec.Selector.MatchLabels), &scaledMachines); err != nil {\n-\t\t\t\tglog.Errorf(\"Error querying api for machineset object: %v, retrying...\", err)\n-\t\t\t\treturn false, nil\n-\t\t\t}\n+\t// We listen to events to control test completion.\n+\tkubeInformerFactory := kubeinformers.NewSharedInformerFactory(clientset, 0)\n+\teventInformer := kubeInformerFactory.Core().V1().Events().Informer()\n \n-\t\t\t// get all linked nodes and label them\n-\t\t\tnodeCounter := 0\n-\t\t\tfor _, machine := range scaledMachines.Items {\n-\t\t\t\tif machine.Status.NodeRef == nil {\n-\t\t\t\t\tglog.Errorf(\"Machine %q does not have node reference set\", machine.Name)\n-\t\t\t\t\treturn false, nil\n-\t\t\t\t}\n-\t\t\t\tglog.Infof(\"Machine %q is linked to node %q\", machine.Name, machine.Status.NodeRef.Name)\n-\t\t\t\tnodeCounter++\n-\t\t\t}\n+\tvar matchEventFuncLock sync.Mutex\n+\tvar matchEventFunc matchEventFunc\n \n-\t\t\tglog.Infof(\"Expecting %d nodes. Current number of nodes in the group: %d\", expectedReplicas, nodeCounter)\n-\t\t\treturn nodeCounter == int(expectedReplicas), nil\n-\t\t})\n-\t\to.Expect(err).NotTo(o.HaveOccurred())\n+\tinterestingComponents := sets.StringKeySet(map[string]bool{\n+\t\t\"cluster-autoscaler\":            true,\n+\t\t\"cluster-autoscaler-controller\": true,\n+\t\t\"kubemark-controller\":           true,\n+\t\t\"machine-autoscaler-controller\": true,\n+\t\t\"machine-controller\":            true,\n+\t})\n \n-\t\tg.By(fmt.Sprintf(\"Labeling all nodes belonging to the machineset %q (after scale up phase)\", targetMachineSet.Name))\n-\t\terr = labelMachineSetNodes(client, &targetMachineSet, nodeTestLabel)\n-\t\to.Expect(err).NotTo(o.HaveOccurred())\n-\t}\n+\ttestStartTime := metav1.Now()\n \n-\tscaleDownFunc := func(client runtimeclient.Client, targetMachineSet string, nodeTestLabel string, initialNumberOfReplicas int32) {\n-\t\tg.By(fmt.Sprintf(\"Waiting for machineset %q to have at most initial number of replicas\", targetMachineSet))\n-\t\terr := wait.PollImmediate(5*time.Second, e2e.WaitLong, func() (bool, error) {\n-\t\t\tms, err := e2e.GetMachineSet(context.TODO(), client, targetMachineSet)\n-\t\t\tif err != nil {\n-\t\t\t\tglog.Errorf(\"error getting machineset object: %v, retrying...\", err)\n-\t\t\t\treturn false, nil\n+\teventInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{\n+\t\tAddFunc: func(obj interface{}) {\n+\t\t\tevent := obj.(*corev1.Event)\n+\t\t\tif event.CreationTimestamp.Before(&testStartTime) {\n+\t\t\t\treturn\n \t\t\t}\n-\t\t\tmsReplicas := pointer.Int32PtrDerefOr(ms.Spec.Replicas, e2e.DefaultMachineSetReplicas)\n-\t\t\tglog.Infof(\"Initial number of replicas: %d. Current number of replicas: %d\", initialNumberOfReplicas, msReplicas)\n-\t\t\tif msReplicas > initialNumberOfReplicas {\n-\t\t\t\treturn false, nil\n+\t\t\tif interestingComponents.Has(event.Source.Component) {\n+\t\t\t\tmsg := fmt.Sprintf(\"%s/%s: %s\\n\", event.Source.Component, event.InvolvedObject.Name, event.Message)\n+\t\t\t\tg.GinkgoWriter.Write([]byte(msg))\n \t\t\t}\n+\t\t\tmatchEventFuncLock.Lock()\n+\t\t\tdefer matchEventFuncLock.Unlock()\n+\t\t\tif matchEventFunc != nil {\n+\t\t\t\tmatchEventFunc(event)\n+\t\t\t}\n+\t\t},\n+\t})\n \n-\t\t\t// Make sure all scaled down nodes are really gone (so they don't affect tests to be run next)\n-\t\t\tscaledNodes := corev1.NodeList{}\n-\t\t\tif err := client.List(context.TODO(), runtimeclient.MatchingLabels(map[string]string{nodeTestLabel: \"\"}), &scaledNodes); err != nil {\n-\t\t\t\tglog.Errorf(\"Error querying api for node objects: %v, retrying...\", err)\n-\t\t\t\treturn false, nil\n+\tstopCh := make(chan struct{})\n+\tdefer close(stopCh)\n+\tkubeInformerFactory.Start(stopCh)\n+\to.Expect(cache.WaitForCacheSync(stopCh, eventInformer.HasSynced)).Should(o.BeTrue())\n+\n+\tvar client runtimeclient.Client\n+\tclient, err = e2e.LoadClient()\n+\to.Expect(err).NotTo(o.HaveOccurred())\n+\n+\tvar cleanupObjects []runtime.Object\n+\tdefer func() {\n+\t\tcascadeDelete := metav1.DeletePropagationForeground\n+\t\tfor _, obj := range cleanupObjects {\n+\t\t\tif err := client.Delete(context.TODO(), obj, func(opt *runtimeclient.DeleteOptions) {\n+\t\t\t\topt.PropagationPolicy = &cascadeDelete\n+\t\t\t}); err != nil {\n+\t\t\t\tglog.Errorf(\"error deleting object: %v\", err)\n \t\t\t}\n-\t\t\tscaledNodesLen := int32(len(scaledNodes.Items))\n-\t\t\tglog.Infof(\"Current number of replicas: %d. Current number of nodes: %d\", msReplicas, scaledNodesLen)\n-\t\t\treturn scaledNodesLen <= msReplicas && scaledNodesLen <= initialNumberOfReplicas, nil\n-\t\t})\n+\t\t}\n+\t}()\n+\n+\tg.By(\"Getting machinesets\")\n+\tmachineSets, err := e2e.GetMachineSets(context.TODO(), client)\n+\to.Expect(err).NotTo(o.HaveOccurred())\n+\t// We need at least two machinesets to so that we can scale up","path":"pkg/e2e/autoscaler/autoscaler.go","position":263,"original_position":263,"commit_id":"a8ca50fc6622de69f2dcb57a94a0cab0f07ccf0d","original_commit_id":"a8ca50fc6622de69f2dcb57a94a0cab0f07ccf0d","user":{"login":"vikaschoudhary16","id":11936386,"node_id":"MDQ6VXNlcjExOTM2Mzg2","avatar_url":"https://avatars3.githubusercontent.com/u/11936386?v=4","gravatar_id":"","url":"https://api.github.com/users/vikaschoudhary16","html_url":"https://github.com/vikaschoudhary16","followers_url":"https://api.github.com/users/vikaschoudhary16/followers","following_url":"https://api.github.com/users/vikaschoudhary16/following{/other_user}","gists_url":"https://api.github.com/users/vikaschoudhary16/gists{/gist_id}","starred_url":"https://api.github.com/users/vikaschoudhary16/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vikaschoudhary16/subscriptions","organizations_url":"https://api.github.com/users/vikaschoudhary16/orgs","repos_url":"https://api.github.com/users/vikaschoudhary16/repos","events_url":"https://api.github.com/users/vikaschoudhary16/events{/privacy}","received_events_url":"https://api.github.com/users/vikaschoudhary16/received_events","type":"User","site_admin":false},"body":"s/to so that/so that","created_at":"2019-05-02T12:31:57Z","updated_at":"2019-05-02T12:31:57Z","html_url":"https://github.com/openshift/cluster-api-actuator-pkg/pull/77#discussion_r280397043","pull_request_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls/77","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls/comments/280397043"},"html":{"href":"https://github.com/openshift/cluster-api-actuator-pkg/pull/77#discussion_r280397043"},"pull_request":{"href":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls/77"}}},"pull_request":{"url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls/77","id":275010502,"node_id":"MDExOlB1bGxSZXF1ZXN0Mjc1MDEwNTAy","html_url":"https://github.com/openshift/cluster-api-actuator-pkg/pull/77","diff_url":"https://github.com/openshift/cluster-api-actuator-pkg/pull/77.diff","patch_url":"https://github.com/openshift/cluster-api-actuator-pkg/pull/77.patch","issue_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/issues/77","number":77,"state":"open","locked":false,"title":"e2e/autoscaler: scale out in parallel","user":{"login":"frobware","id":943903,"node_id":"MDQ6VXNlcjk0MzkwMw==","avatar_url":"https://avatars1.githubusercontent.com/u/943903?v=4","gravatar_id":"","url":"https://api.github.com/users/frobware","html_url":"https://github.com/frobware","followers_url":"https://api.github.com/users/frobware/followers","following_url":"https://api.github.com/users/frobware/following{/other_user}","gists_url":"https://api.github.com/users/frobware/gists{/gist_id}","starred_url":"https://api.github.com/users/frobware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/frobware/subscriptions","organizations_url":"https://api.github.com/users/frobware/orgs","repos_url":"https://api.github.com/users/frobware/repos","events_url":"https://api.github.com/users/frobware/events{/privacy}","received_events_url":"https://api.github.com/users/frobware/received_events","type":"User","site_admin":false},"body":"Scale out all machinesets at the same time. The previous\r\nbehaviour persisted with scaling one machine set at a time but we\r\nwant to validate across all available machine sets, in parallel.\r\n\r\nThis change also switches to using events to control test\r\ntermination. The intent is to implement the test using\r\ncluster-autoscaler primitives and not use implementation\r\ndetails (e.g., the replica count) on a scalable resource. We\r\nalso have other e2e tests that validate the behaviour of\r\nincreasing/decreasing the replica count for low-level scaling.\r\n\r\nRequires https://github.com/openshift/kubernetes-autoscaler/pull/90 to merge first.\r\n","created_at":"2019-05-01T11:39:38Z","updated_at":"2019-05-02T12:31:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8cc324aade7dca256f0b5f9d3eb1f0e12cdb94cd","assignee":null,"assignees":[],"requested_reviewers":[{"login":"spangenberg","id":236406,"node_id":"MDQ6VXNlcjIzNjQwNg==","avatar_url":"https://avatars3.githubusercontent.com/u/236406?v=4","gravatar_id":"","url":"https://api.github.com/users/spangenberg","html_url":"https://github.com/spangenberg","followers_url":"https://api.github.com/users/spangenberg/followers","following_url":"https://api.github.com/users/spangenberg/following{/other_user}","gists_url":"https://api.github.com/users/spangenberg/gists{/gist_id}","starred_url":"https://api.github.com/users/spangenberg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spangenberg/subscriptions","organizations_url":"https://api.github.com/users/spangenberg/orgs","repos_url":"https://api.github.com/users/spangenberg/repos","events_url":"https://api.github.com/users/spangenberg/events{/privacy}","received_events_url":"https://api.github.com/users/spangenberg/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":1087999576,"node_id":"MDU6TGFiZWwxMDg3OTk5NTc2","url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/labels/do-not-merge/hold","name":"do-not-merge/hold","color":"e11d21","default":false},{"id":1086695821,"node_id":"MDU6TGFiZWwxMDg2Njk1ODIx","url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/labels/size/L","name":"size/L","color":"ee9900","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls/77/commits","review_comments_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls/77/comments","review_comment_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/issues/77/comments","statuses_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/statuses/a8ca50fc6622de69f2dcb57a94a0cab0f07ccf0d","head":{"label":"frobware:fix-scale-out-assumptions","ref":"fix-scale-out-assumptions","sha":"a8ca50fc6622de69f2dcb57a94a0cab0f07ccf0d","user":{"login":"frobware","id":943903,"node_id":"MDQ6VXNlcjk0MzkwMw==","avatar_url":"https://avatars1.githubusercontent.com/u/943903?v=4","gravatar_id":"","url":"https://api.github.com/users/frobware","html_url":"https://github.com/frobware","followers_url":"https://api.github.com/users/frobware/followers","following_url":"https://api.github.com/users/frobware/following{/other_user}","gists_url":"https://api.github.com/users/frobware/gists{/gist_id}","starred_url":"https://api.github.com/users/frobware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/frobware/subscriptions","organizations_url":"https://api.github.com/users/frobware/orgs","repos_url":"https://api.github.com/users/frobware/repos","events_url":"https://api.github.com/users/frobware/events{/privacy}","received_events_url":"https://api.github.com/users/frobware/received_events","type":"User","site_admin":false},"repo":{"id":172097200,"node_id":"MDEwOlJlcG9zaXRvcnkxNzIwOTcyMDA=","name":"cluster-api-actuator-pkg","full_name":"frobware/cluster-api-actuator-pkg","private":false,"owner":{"login":"frobware","id":943903,"node_id":"MDQ6VXNlcjk0MzkwMw==","avatar_url":"https://avatars1.githubusercontent.com/u/943903?v=4","gravatar_id":"","url":"https://api.github.com/users/frobware","html_url":"https://github.com/frobware","followers_url":"https://api.github.com/users/frobware/followers","following_url":"https://api.github.com/users/frobware/following{/other_user}","gists_url":"https://api.github.com/users/frobware/gists{/gist_id}","starred_url":"https://api.github.com/users/frobware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/frobware/subscriptions","organizations_url":"https://api.github.com/users/frobware/orgs","repos_url":"https://api.github.com/users/frobware/repos","events_url":"https://api.github.com/users/frobware/events{/privacy}","received_events_url":"https://api.github.com/users/frobware/received_events","type":"User","site_admin":false},"html_url":"https://github.com/frobware/cluster-api-actuator-pkg","description":null,"fork":true,"url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg","forks_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/forks","keys_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/keys{/key_id}","collaborators_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/teams","hooks_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/hooks","issue_events_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/issues/events{/number}","events_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/events","assignees_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/assignees{/user}","branches_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/branches{/branch}","tags_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/tags","blobs_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/git/refs{/sha}","trees_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/git/trees{/sha}","statuses_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/statuses/{sha}","languages_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/languages","stargazers_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/stargazers","contributors_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/contributors","subscribers_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/subscribers","subscription_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/subscription","commits_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/commits{/sha}","git_commits_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/git/commits{/sha}","comments_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/comments{/number}","issue_comment_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/issues/comments{/number}","contents_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/contents/{+path}","compare_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/compare/{base}...{head}","merges_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/merges","archive_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/downloads","issues_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/issues{/number}","pulls_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/pulls{/number}","milestones_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/milestones{/number}","notifications_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/labels{/name}","releases_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/releases{/id}","deployments_url":"https://api.github.com/repos/frobware/cluster-api-actuator-pkg/deployments","created_at":"2019-02-22T16:20:28Z","updated_at":"2019-02-22T16:20:30Z","pushed_at":"2019-05-01T17:09:40Z","git_url":"git://github.com/frobware/cluster-api-actuator-pkg.git","ssh_url":"git@github.com:frobware/cluster-api-actuator-pkg.git","clone_url":"https://github.com/frobware/cluster-api-actuator-pkg.git","svn_url":"https://github.com/frobware/cluster-api-actuator-pkg","homepage":null,"size":43588,"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,"disabled":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":"openshift:master","ref":"master","sha":"7f0427a526ab924b8843b62a7fe868c6821c435d","user":{"login":"openshift","id":792337,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc5MjMzNw==","avatar_url":"https://avatars3.githubusercontent.com/u/792337?v=4","gravatar_id":"","url":"https://api.github.com/users/openshift","html_url":"https://github.com/openshift","followers_url":"https://api.github.com/users/openshift/followers","following_url":"https://api.github.com/users/openshift/following{/other_user}","gists_url":"https://api.github.com/users/openshift/gists{/gist_id}","starred_url":"https://api.github.com/users/openshift/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openshift/subscriptions","organizations_url":"https://api.github.com/users/openshift/orgs","repos_url":"https://api.github.com/users/openshift/repos","events_url":"https://api.github.com/users/openshift/events{/privacy}","received_events_url":"https://api.github.com/users/openshift/received_events","type":"Organization","site_admin":false},"repo":{"id":152441092,"node_id":"MDEwOlJlcG9zaXRvcnkxNTI0NDEwOTI=","name":"cluster-api-actuator-pkg","full_name":"openshift/cluster-api-actuator-pkg","private":false,"owner":{"login":"openshift","id":792337,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc5MjMzNw==","avatar_url":"https://avatars3.githubusercontent.com/u/792337?v=4","gravatar_id":"","url":"https://api.github.com/users/openshift","html_url":"https://github.com/openshift","followers_url":"https://api.github.com/users/openshift/followers","following_url":"https://api.github.com/users/openshift/following{/other_user}","gists_url":"https://api.github.com/users/openshift/gists{/gist_id}","starred_url":"https://api.github.com/users/openshift/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openshift/subscriptions","organizations_url":"https://api.github.com/users/openshift/orgs","repos_url":"https://api.github.com/users/openshift/repos","events_url":"https://api.github.com/users/openshift/events{/privacy}","received_events_url":"https://api.github.com/users/openshift/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/openshift/cluster-api-actuator-pkg","description":null,"fork":false,"url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg","forks_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/forks","keys_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/keys{/key_id}","collaborators_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/teams","hooks_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/hooks","issue_events_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/issues/events{/number}","events_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/events","assignees_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/assignees{/user}","branches_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/branches{/branch}","tags_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/tags","blobs_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/git/refs{/sha}","trees_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/git/trees{/sha}","statuses_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/statuses/{sha}","languages_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/languages","stargazers_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/stargazers","contributors_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/contributors","subscribers_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/subscribers","subscription_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/subscription","commits_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/commits{/sha}","git_commits_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/git/commits{/sha}","comments_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/comments{/number}","issue_comment_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/issues/comments{/number}","contents_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/contents/{+path}","compare_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/compare/{base}...{head}","merges_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/merges","archive_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/downloads","issues_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/issues{/number}","pulls_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls{/number}","milestones_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/milestones{/number}","notifications_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/labels{/name}","releases_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/releases{/id}","deployments_url":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/deployments","created_at":"2018-10-10T14:53:45Z","updated_at":"2019-05-01T03:49:40Z","pushed_at":"2019-05-01T17:09:41Z","git_url":"git://github.com/openshift/cluster-api-actuator-pkg.git","ssh_url":"git@github.com:openshift/cluster-api-actuator-pkg.git","clone_url":"https://github.com/openshift/cluster-api-actuator-pkg.git","svn_url":"https://github.com/openshift/cluster-api-actuator-pkg","homepage":null,"size":43623,"stargazers_count":3,"watchers_count":3,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":12,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":4,"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":12,"open_issues":4,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls/77"},"html":{"href":"https://github.com/openshift/cluster-api-actuator-pkg/pull/77"},"issue":{"href":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/issues/77"},"comments":{"href":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/issues/77/comments"},"review_comments":{"href":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls/77/comments"},"review_comment":{"href":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/pulls/77/commits"},"statuses":{"href":"https://api.github.com/repos/openshift/cluster-api-actuator-pkg/statuses/a8ca50fc6622de69f2dcb57a94a0cab0f07ccf0d"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"vikaschoudhary16"}}