{"action":"created","comment":{"url":"https://api.github.com/repos/openshift/origin/pulls/comments/186776701","pull_request_review_id":118422709,"id":186776701,"diff_hunk":"@@ -0,0 +1,214 @@\n+package openshift_service_serving_cert_signer\n+\n+import (\n+\t\"encoding/json\"\n+\t\"fmt\"\n+\t\"io/ioutil\"\n+\t\"net\"\n+\t\"net/http\"\n+\t\"path\"\n+\t\"path/filepath\"\n+\t\"time\"\n+\n+\t\"k8s.io/apimachinery/pkg/runtime\"\n+\t\"k8s.io/apimachinery/pkg/runtime/serializer\"\n+\tkyaml \"k8s.io/apimachinery/pkg/util/yaml\"\n+\t\"k8s.io/client-go/rest\"\n+\t\"k8s.io/client-go/tools/clientcmd\"\n+\n+\t\"github.com/openshift/origin/pkg/cmd/openshift-service-serving-cert-signer/apis/serviceservingcertsigner/v1alpha1\"\n+)\n+\n+var (\n+\tconfigScheme = runtime.NewScheme()\n+\tconfigCodecs = serializer.NewCodecFactory(configScheme)\n+)\n+\n+func init() {\n+\tv1alpha1.AddToScheme(configScheme)\n+}\n+\n+func readConfig(filename string) (*v1alpha1.ServiceServingCertSignerConfig, error) {\n+\tconfig := &v1alpha1.ServiceServingCertSignerConfig{}\n+\tif err := readYAMLFileInto(filename, config); err != nil {\n+\t\treturn nil, err\n+\t}\n+\treturn config, nil\n+}\n+\n+func readAndResolveConfig(filename string) (*v1alpha1.ServiceServingCertSignerConfig, error) {\n+\tconfig, err := readConfig(filename)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\n+\tif err := resolveConfigPaths(config, path.Dir(filename)); err != nil {\n+\t\treturn nil, err\n+\t}\n+\n+\treturn config, nil\n+}\n+\n+func readYAMLInto(data []byte, obj runtime.Object) error {\n+\tdata, err := kyaml.ToJSON(data)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\terr = runtime.DecodeInto(configCodecs.LegacyCodec(v1alpha1.SchemeGroupVersion), data, obj)\n+\treturn captureSurroundingJSONForError(\"error reading config: \", data, err)\n+}\n+\n+func readYAMLFileInto(filename string, obj runtime.Object) error {\n+\tdata, err := ioutil.ReadFile(filename)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\terr = readYAMLInto(data, obj)\n+\tif err != nil {\n+\t\treturn fmt.Errorf(\"could not load config file %q due to an error: %v\", filename, err)\n+\t}\n+\treturn nil\n+}\n+\n+// TODO: we ultimately want a better decoder for JSON that allows us exact line numbers and better\n+// surrounding text description. This should be removed / replaced when that happens.\n+func captureSurroundingJSONForError(prefix string, data []byte, err error) error {\n+\tif syntaxErr, ok := err.(*json.SyntaxError); err != nil && ok {\n+\t\toffset := syntaxErr.Offset\n+\t\tbegin := offset - 20\n+\t\tif begin < 0 {\n+\t\t\tbegin = 0\n+\t\t}\n+\t\tend := offset + 20\n+\t\tif end > int64(len(data)) {\n+\t\t\tend = int64(len(data))\n+\t\t}\n+\t\treturn fmt.Errorf(\"%s%v (found near '%s')\", prefix, err, string(data[begin:end]))\n+\t}\n+\tif err != nil {\n+\t\treturn fmt.Errorf(\"%s%v\", prefix, err)\n+\t}\n+\treturn err\n+}\n+\n+func resolveConfigPaths(config *v1alpha1.ServiceServingCertSignerConfig, base string) error {\n+\treturn resolvePaths(getFileReferences(config), base)\n+}\n+\n+func getFileReferences(config *v1alpha1.ServiceServingCertSignerConfig) []*string {\n+\trefs := []*string{}\n+\n+\trefs = append(refs, &config.ServingInfo.CertInfo.CertFile)\n+\trefs = append(refs, &config.ServingInfo.CertInfo.KeyFile)\n+\trefs = append(refs, &config.ServingInfo.ClientCA)\n+\tfor i := range config.ServingInfo.NamedCertificates {\n+\t\trefs = append(refs, &config.ServingInfo.NamedCertificates[i].CertFile)\n+\t\trefs = append(refs, &config.ServingInfo.NamedCertificates[i].KeyFile)\n+\t}\n+\trefs = append(refs, &config.Signer.CertFile)\n+\trefs = append(refs, &config.Signer.KeyFile)\n+\n+\treturn refs\n+}\n+\n+// resolvePaths updates the given refs to be absolute paths, relative to the given base directory\n+func resolvePaths(refs []*string, base string) error {\n+\tfor _, ref := range refs {\n+\t\t// Don't resolve empty paths\n+\t\tif len(*ref) > 0 {\n+\t\t\t// Don't resolve absolute paths\n+\t\t\tif !filepath.IsAbs(*ref) {\n+\t\t\t\t*ref = filepath.Join(base, *ref)\n+\t\t\t}\n+\t\t}\n+\t}\n+\treturn nil\n+}\n+\n+type ClientConnectionOverrides struct {\n+\t// AcceptContentTypes defines the Accept header sent by clients when connecting to a server, overriding the\n+\t// default value of 'application/json'. This field will control all connections to the server used by a particular\n+\t// client.\n+\tAcceptContentTypes string\n+\t// ContentType is the content type used when sending data to the server from this client.\n+\tContentType string\n+\n+\t// QPS controls the number of queries per second allowed for this connection.\n+\tQPS float32\n+\t// Burst allows extra queries to accumulate when a client is exceeding its rate.\n+\tBurst int32\n+}\n+\n+var defaultConnectionOverrides = &ClientConnectionOverrides{\n+\tAcceptContentTypes: \"application/vnd.kubernetes.protobuf,application/json\",\n+\tContentType:        \"application/vnd.kubernetes.protobuf\",\n+\tQPS:                50,\n+\tBurst:              100,\n+}\n+\n+// getKubeConfigOrInClusterConfig loads in-cluster config if kubeConfigFile is empty or the file if not,\n+// then applies overrides.\n+func getKubeConfigOrInClusterConfig(kubeConfigFile string, overrides *ClientConnectionOverrides) (*rest.Config, error) {","path":"pkg/cmd/openshift-service-serving-cert-signer/config.go","position":151,"original_position":151,"commit_id":"073a0c5da29c7cb2ce74afc7659976649bc306bc","original_commit_id":"073a0c5da29c7cb2ce74afc7659976649bc306bc","user":{"login":"deads2k","id":8225098,"avatar_url":"https://avatars0.githubusercontent.com/u/8225098?v=4","gravatar_id":"","url":"https://api.github.com/users/deads2k","html_url":"https://github.com/deads2k","followers_url":"https://api.github.com/users/deads2k/followers","following_url":"https://api.github.com/users/deads2k/following{/other_user}","gists_url":"https://api.github.com/users/deads2k/gists{/gist_id}","starred_url":"https://api.github.com/users/deads2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deads2k/subscriptions","organizations_url":"https://api.github.com/users/deads2k/orgs","repos_url":"https://api.github.com/users/deads2k/repos","events_url":"https://api.github.com/users/deads2k/events{/privacy}","received_events_url":"https://api.github.com/users/deads2k/received_events","type":"User","site_admin":false},"body":"@openshift/api-review This looks helper-like, but not directly related to APIs.  I suspect we'll use a method like this to load either a reference `--kubeconfig` or the inclusterconfig in many/most processes.","created_at":"2018-05-08T15:49:38Z","updated_at":"2018-05-08T15:49:38Z","html_url":"https://github.com/openshift/origin/pull/19650#discussion_r186776701","pull_request_url":"https://api.github.com/repos/openshift/origin/pulls/19650","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/openshift/origin/pulls/comments/186776701"},"html":{"href":"https://github.com/openshift/origin/pull/19650#discussion_r186776701"},"pull_request":{"href":"https://api.github.com/repos/openshift/origin/pulls/19650"}}},"pull_request":{"url":"https://api.github.com/repos/openshift/origin/pulls/19650","id":186677358,"html_url":"https://github.com/openshift/origin/pull/19650","diff_url":"https://github.com/openshift/origin/pull/19650.diff","patch_url":"https://github.com/openshift/origin/pull/19650.patch","issue_url":"https://api.github.com/repos/openshift/origin/issues/19650","number":19650,"state":"open","locked":false,"title":"[WIP] add service serving cert signer as experimental controller","user":{"login":"deads2k","id":8225098,"avatar_url":"https://avatars0.githubusercontent.com/u/8225098?v=4","gravatar_id":"","url":"https://api.github.com/users/deads2k","html_url":"https://github.com/deads2k","followers_url":"https://api.github.com/users/deads2k/followers","following_url":"https://api.github.com/users/deads2k/following{/other_user}","gists_url":"https://api.github.com/users/deads2k/gists{/gist_id}","starred_url":"https://api.github.com/users/deads2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deads2k/subscriptions","organizations_url":"https://api.github.com/users/deads2k/orgs","repos_url":"https://api.github.com/users/deads2k/repos","events_url":"https://api.github.com/users/deads2k/events{/privacy}","received_events_url":"https://api.github.com/users/deads2k/received_events","type":"User","site_admin":false},"body":"Needs API endpoints and proof inside of `oc cluster up`.\r\n\r\nAdds `hypershift experimental openshift-service-serving-cert-signer` to see how easy or hard it is to split our controllers apart.  The next step is to add it to cluster up.  This controller will provide certificates to the openshift apiserver and openshift controllers.\r\n\r\n@openshift/sig-master ","created_at":"2018-05-08T15:46:46Z","updated_at":"2018-05-08T15:49:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b9d4492f7ec340c66c0cf6863759e27c407c5087","assignee":null,"assignees":[],"requested_reviewers":[{"login":"mrogers950","id":3697177,"avatar_url":"https://avatars3.githubusercontent.com/u/3697177?v=4","gravatar_id":"","url":"https://api.github.com/users/mrogers950","html_url":"https://github.com/mrogers950","followers_url":"https://api.github.com/users/mrogers950/followers","following_url":"https://api.github.com/users/mrogers950/following{/other_user}","gists_url":"https://api.github.com/users/mrogers950/gists{/gist_id}","starred_url":"https://api.github.com/users/mrogers950/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrogers950/subscriptions","organizations_url":"https://api.github.com/users/mrogers950/orgs","repos_url":"https://api.github.com/users/mrogers950/repos","events_url":"https://api.github.com/users/mrogers950/events{/privacy}","received_events_url":"https://api.github.com/users/mrogers950/received_events","type":"User","site_admin":false},{"login":"enj","id":7001223,"avatar_url":"https://avatars0.githubusercontent.com/u/7001223?v=4","gravatar_id":"","url":"https://api.github.com/users/enj","html_url":"https://github.com/enj","followers_url":"https://api.github.com/users/enj/followers","following_url":"https://api.github.com/users/enj/following{/other_user}","gists_url":"https://api.github.com/users/enj/gists{/gist_id}","starred_url":"https://api.github.com/users/enj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enj/subscriptions","organizations_url":"https://api.github.com/users/enj/orgs","repos_url":"https://api.github.com/users/enj/repos","events_url":"https://api.github.com/users/enj/events{/privacy}","received_events_url":"https://api.github.com/users/enj/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":223051294,"url":"https://api.github.com/repos/openshift/origin/labels/approved","name":"approved","color":"0ffa16","default":false},{"id":686389978,"url":"https://api.github.com/repos/openshift/origin/labels/do-not-merge/work-in-progress","name":"do-not-merge/work-in-progress","color":"e11d21","default":false},{"id":683887368,"url":"https://api.github.com/repos/openshift/origin/labels/sig/master","name":"sig/master","color":"f9d0c4","default":false},{"id":640548612,"url":"https://api.github.com/repos/openshift/origin/labels/size/XL","name":"size/XL","color":"ee5500","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/openshift/origin/pulls/19650/commits","review_comments_url":"https://api.github.com/repos/openshift/origin/pulls/19650/comments","review_comment_url":"https://api.github.com/repos/openshift/origin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openshift/origin/issues/19650/comments","statuses_url":"https://api.github.com/repos/openshift/origin/statuses/073a0c5da29c7cb2ce74afc7659976649bc306bc","head":{"label":"deads2k:controller-11-sscs","ref":"controller-11-sscs","sha":"073a0c5da29c7cb2ce74afc7659976649bc306bc","user":{"login":"deads2k","id":8225098,"avatar_url":"https://avatars0.githubusercontent.com/u/8225098?v=4","gravatar_id":"","url":"https://api.github.com/users/deads2k","html_url":"https://github.com/deads2k","followers_url":"https://api.github.com/users/deads2k/followers","following_url":"https://api.github.com/users/deads2k/following{/other_user}","gists_url":"https://api.github.com/users/deads2k/gists{/gist_id}","starred_url":"https://api.github.com/users/deads2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deads2k/subscriptions","organizations_url":"https://api.github.com/users/deads2k/orgs","repos_url":"https://api.github.com/users/deads2k/repos","events_url":"https://api.github.com/users/deads2k/events{/privacy}","received_events_url":"https://api.github.com/users/deads2k/received_events","type":"User","site_admin":false},"repo":{"id":24424126,"name":"origin","full_name":"deads2k/origin","owner":{"login":"deads2k","id":8225098,"avatar_url":"https://avatars0.githubusercontent.com/u/8225098?v=4","gravatar_id":"","url":"https://api.github.com/users/deads2k","html_url":"https://github.com/deads2k","followers_url":"https://api.github.com/users/deads2k/followers","following_url":"https://api.github.com/users/deads2k/following{/other_user}","gists_url":"https://api.github.com/users/deads2k/gists{/gist_id}","starred_url":"https://api.github.com/users/deads2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deads2k/subscriptions","organizations_url":"https://api.github.com/users/deads2k/orgs","repos_url":"https://api.github.com/users/deads2k/repos","events_url":"https://api.github.com/users/deads2k/events{/privacy}","received_events_url":"https://api.github.com/users/deads2k/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/deads2k/origin","description":"OpenShift 3 - build, deploy, and manage your applications with Docker and Kubernetes","fork":true,"url":"https://api.github.com/repos/deads2k/origin","forks_url":"https://api.github.com/repos/deads2k/origin/forks","keys_url":"https://api.github.com/repos/deads2k/origin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/deads2k/origin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/deads2k/origin/teams","hooks_url":"https://api.github.com/repos/deads2k/origin/hooks","issue_events_url":"https://api.github.com/repos/deads2k/origin/issues/events{/number}","events_url":"https://api.github.com/repos/deads2k/origin/events","assignees_url":"https://api.github.com/repos/deads2k/origin/assignees{/user}","branches_url":"https://api.github.com/repos/deads2k/origin/branches{/branch}","tags_url":"https://api.github.com/repos/deads2k/origin/tags","blobs_url":"https://api.github.com/repos/deads2k/origin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/deads2k/origin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/deads2k/origin/git/refs{/sha}","trees_url":"https://api.github.com/repos/deads2k/origin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/deads2k/origin/statuses/{sha}","languages_url":"https://api.github.com/repos/deads2k/origin/languages","stargazers_url":"https://api.github.com/repos/deads2k/origin/stargazers","contributors_url":"https://api.github.com/repos/deads2k/origin/contributors","subscribers_url":"https://api.github.com/repos/deads2k/origin/subscribers","subscription_url":"https://api.github.com/repos/deads2k/origin/subscription","commits_url":"https://api.github.com/repos/deads2k/origin/commits{/sha}","git_commits_url":"https://api.github.com/repos/deads2k/origin/git/commits{/sha}","comments_url":"https://api.github.com/repos/deads2k/origin/comments{/number}","issue_comment_url":"https://api.github.com/repos/deads2k/origin/issues/comments{/number}","contents_url":"https://api.github.com/repos/deads2k/origin/contents/{+path}","compare_url":"https://api.github.com/repos/deads2k/origin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/deads2k/origin/merges","archive_url":"https://api.github.com/repos/deads2k/origin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/deads2k/origin/downloads","issues_url":"https://api.github.com/repos/deads2k/origin/issues{/number}","pulls_url":"https://api.github.com/repos/deads2k/origin/pulls{/number}","milestones_url":"https://api.github.com/repos/deads2k/origin/milestones{/number}","notifications_url":"https://api.github.com/repos/deads2k/origin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/deads2k/origin/labels{/name}","releases_url":"https://api.github.com/repos/deads2k/origin/releases{/id}","deployments_url":"https://api.github.com/repos/deads2k/origin/deployments","created_at":"2014-09-24T17:02:12Z","updated_at":"2018-05-07T19:11:52Z","pushed_at":"2018-05-08T15:44:54Z","git_url":"git://github.com/deads2k/origin.git","ssh_url":"git@github.com:deads2k/origin.git","clone_url":"https://github.com/deads2k/origin.git","svn_url":"https://github.com/deads2k/origin","homepage":"https://openshift.github.io","size":899336,"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":1,"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"},"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"openshift:master","ref":"master","sha":"72c9740681baf4290c74c8d55ba708a0fec32ef4","user":{"login":"openshift","id":792337,"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":22442668,"name":"origin","full_name":"openshift/origin","owner":{"login":"openshift","id":792337,"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},"private":false,"html_url":"https://github.com/openshift/origin","description":"Enterprise Kubernetes for Developers","fork":false,"url":"https://api.github.com/repos/openshift/origin","forks_url":"https://api.github.com/repos/openshift/origin/forks","keys_url":"https://api.github.com/repos/openshift/origin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/openshift/origin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/openshift/origin/teams","hooks_url":"https://api.github.com/repos/openshift/origin/hooks","issue_events_url":"https://api.github.com/repos/openshift/origin/issues/events{/number}","events_url":"https://api.github.com/repos/openshift/origin/events","assignees_url":"https://api.github.com/repos/openshift/origin/assignees{/user}","branches_url":"https://api.github.com/repos/openshift/origin/branches{/branch}","tags_url":"https://api.github.com/repos/openshift/origin/tags","blobs_url":"https://api.github.com/repos/openshift/origin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/openshift/origin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/openshift/origin/git/refs{/sha}","trees_url":"https://api.github.com/repos/openshift/origin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/openshift/origin/statuses/{sha}","languages_url":"https://api.github.com/repos/openshift/origin/languages","stargazers_url":"https://api.github.com/repos/openshift/origin/stargazers","contributors_url":"https://api.github.com/repos/openshift/origin/contributors","subscribers_url":"https://api.github.com/repos/openshift/origin/subscribers","subscription_url":"https://api.github.com/repos/openshift/origin/subscription","commits_url":"https://api.github.com/repos/openshift/origin/commits{/sha}","git_commits_url":"https://api.github.com/repos/openshift/origin/git/commits{/sha}","comments_url":"https://api.github.com/repos/openshift/origin/comments{/number}","issue_comment_url":"https://api.github.com/repos/openshift/origin/issues/comments{/number}","contents_url":"https://api.github.com/repos/openshift/origin/contents/{+path}","compare_url":"https://api.github.com/repos/openshift/origin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/openshift/origin/merges","archive_url":"https://api.github.com/repos/openshift/origin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/openshift/origin/downloads","issues_url":"https://api.github.com/repos/openshift/origin/issues{/number}","pulls_url":"https://api.github.com/repos/openshift/origin/pulls{/number}","milestones_url":"https://api.github.com/repos/openshift/origin/milestones{/number}","notifications_url":"https://api.github.com/repos/openshift/origin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/openshift/origin/labels{/name}","releases_url":"https://api.github.com/repos/openshift/origin/releases{/id}","deployments_url":"https://api.github.com/repos/openshift/origin/deployments","created_at":"2014-07-30T20:04:05Z","updated_at":"2018-05-08T15:38:01Z","pushed_at":"2018-05-08T15:46:47Z","git_url":"git://github.com/openshift/origin.git","ssh_url":"git@github.com:openshift/origin.git","clone_url":"https://github.com/openshift/origin.git","svn_url":"https://github.com/openshift/origin","homepage":"http://www.openshift.org","size":904403,"stargazers_count":4481,"watchers_count":4481,"language":"Go","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2781,"mirror_url":null,"archived":false,"open_issues_count":810,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":2781,"open_issues":810,"watchers":4481,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openshift/origin/pulls/19650"},"html":{"href":"https://github.com/openshift/origin/pull/19650"},"issue":{"href":"https://api.github.com/repos/openshift/origin/issues/19650"},"comments":{"href":"https://api.github.com/repos/openshift/origin/issues/19650/comments"},"review_comments":{"href":"https://api.github.com/repos/openshift/origin/pulls/19650/comments"},"review_comment":{"href":"https://api.github.com/repos/openshift/origin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openshift/origin/pulls/19650/commits"},"statuses":{"href":"https://api.github.com/repos/openshift/origin/statuses/073a0c5da29c7cb2ce74afc7659976649bc306bc"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"deads2k"}}