{"action":"created","comment":{"url":"https://api.github.com/repos/openshift/installer/pulls/comments/213814990","pull_request_review_id":150731008,"id":213814990,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMzgxNDk5MA==","diff_hunk":"@@ -0,0 +1,297 @@\n+package tls\n+\n+import (\n+\t\"crypto/x509\"\n+\t\"crypto/x509/pkix\"\n+\n+\t\"github.com/openshift/installer/pkg/asset\"\n+\t\"github.com/openshift/installer/pkg/asset/installconfig\"\n+)\n+\n+// Stock is the stock of TLS assets that can be generated.\n+type Stock interface {\n+\t// RootCA is the asset that generates the root-ca key/cert pair.\n+\tRootCA() asset.Asset\n+\t// KubeCA is the asset that generates the kube-ca key/cert pair.\n+\tKubeCA() asset.Asset\n+\t// EtcdCA is the asset that generates the etcd-ca key/cert pair.\n+\tEtcdCA() asset.Asset\n+\t// AggregatorCA is the asset that generates the aggregator-ca key/cert pair.\n+\tAggregatorCA() asset.Asset\n+\t// ServiceServingCA is the asset that generates the service-serving-ca key/cert pair.\n+\tServiceServingCA() asset.Asset\n+\t// EtcdClientCertKey is the asset that generates the etcd client key/cert pair.\n+\tEtcdClientCertKey() asset.Asset\n+\t// AdminCertKey is the asset that generates the admin key/cert pair.\n+\tAdminCertKey() asset.Asset\n+\t// IngressCertKey is the asset that generates the ingress key/cert pair.\n+\tIngressCertKey() asset.Asset\n+\t// APIServerCertKey is the asset that generates the API server key/cert pair.\n+\tAPIServerCertKey() asset.Asset\n+\t// OpenshiftAPIServerCertKey is the asset that generates the Openshift API server key/cert pair.\n+\tOpenshiftAPIServerCertKey() asset.Asset\n+\t// APIServerProxyCertKey is the asset that generates the API server proxy key/cert pair.\n+\tAPIServerProxyCertKey() asset.Asset\n+\t// KubeletCertKey is the asset that generates the kubelet key/cert pair.\n+\tKubeletCertKey() asset.Asset\n+\t// TNCCertKey is the asset that generates the TNC key/cert pair.\n+\tTNCCertKey() asset.Asset\n+\t// ClusterAPIServerCertKey is the asset that generates the cluster API server key/cert pair.\n+\tClusterAPIServerCertKey() asset.Asset\n+\t// ServiceAccountKeyPair is the asset that generates the service-account key/cert pair.\n+\tServiceAccountKeyPair() asset.Asset\n+}\n+\n+// StockImpl implements the Stock interface for tls assets.\n+type StockImpl struct {\n+\trootCA                    asset.Asset\n+\tkubeCA                    asset.Asset\n+\tetcdCA                    asset.Asset\n+\taggregatorCA              asset.Asset\n+\tserviceServingCA          asset.Asset\n+\tetcdClientCertKey         asset.Asset\n+\tadminCertKey              asset.Asset\n+\tingressCertKey            asset.Asset\n+\tapiServerCertKey          asset.Asset\n+\topenshiftAPIServerCertKey asset.Asset\n+\tapiServerProxyCertKey     asset.Asset\n+\tkubeletCertKey            asset.Asset\n+\ttncCertKey                asset.Asset\n+\tclusterAPIServerCertKey   asset.Asset\n+\tserviceAccountKeyPair     asset.Asset\n+}\n+\n+var _ Stock = (*StockImpl)(nil)\n+\n+// EstablishStock establishes the stock of assets in the specified directory.\n+func (s *StockImpl) EstablishStock(rootDir string, stock installconfig.Stock) {\n+\ts.rootCA = &RootCA{rootDir: rootDir}\n+\ts.kubeCA = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tSubject:       pkix.Name{CommonName: \"kube-ca\", OrganizationalUnit: []string{\"bootkube\"}},\n+\t\tKeyUsages:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,\n+\t\tValidity:      ValidityTenYears,\n+\t\tKeyFileName:   \"kube-ca.key\",\n+\t\tCertFileName:  \"kube-ca.crt\",\n+\n+\t\tIsCA:     true,\n+\t\tParentCA: s.rootCA,\n+\t}\n+\n+\ts.etcdCA = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tSubject:       pkix.Name{CommonName: \"etcd\", OrganizationalUnit: []string{\"etcd\"}},\n+\t\tKeyUsages:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,\n+\t\tValidity:      ValidityTenYears,\n+\t\tKeyFileName:   \"etcd-ca.key\",\n+\t\tCertFileName:  \"etcd-ca.crt\",\n+\n+\t\tIsCA:     true,\n+\t\tParentCA: s.rootCA,\n+\t}\n+\n+\ts.aggregatorCA = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tSubject:       pkix.Name{CommonName: \"aggregator\", OrganizationalUnit: []string{\"bootkube\"}},\n+\t\tKeyUsages:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,\n+\t\tValidity:      ValidityTenYears,\n+\t\tKeyFileName:   \"aggregator-ca.key\",\n+\t\tCertFileName:  \"aggregator-ca.crt\",\n+\n+\t\tIsCA:     true,\n+\t\tParentCA: s.rootCA,\n+\t}\n+\n+\ts.serviceServingCA = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tSubject:       pkix.Name{CommonName: \"service-serving\", OrganizationalUnit: []string{\"bootkube\"}},\n+\t\tKeyUsages:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,\n+\t\tValidity:      ValidityTenYears,\n+\t\tKeyFileName:   \"service-serving-ca.key\",\n+\t\tCertFileName:  \"service-serving-ca.crt\",\n+\n+\t\tIsCA:     true,\n+\t\tParentCA: s.rootCA,\n+\t}\n+\n+\ts.etcdClientCertKey = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tSubject:       pkix.Name{CommonName: \"etcd\", OrganizationalUnit: []string{\"etcd\"}},\n+\t\tKeyUsages:     x509.KeyUsageKeyEncipherment,\n+\t\tExtKeyUsages:  []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},\n+\t\tValidity:      ValidityTenYears,\n+\t\tKeyFileName:   \"etcd-client.key\",\n+\t\tCertFileName:  \"etcd-client.crt\",\n+\n+\t\tParentCA: s.etcdCA,\n+\t}\n+\n+\ts.adminCertKey = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tSubject:       pkix.Name{CommonName: \"system:admin\", Organization: []string{\"system:masters\"}},\n+\t\tKeyUsages:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,\n+\t\tExtKeyUsages:  []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth},\n+\t\tValidity:      ValidityTenYears,\n+\t\tKeyFileName:   \"admin.key\",\n+\t\tCertFileName:  \"admin.crt\",\n+\n+\t\tParentCA: s.kubeCA,\n+\t}\n+\n+\ts.ingressCertKey = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tKeyUsages:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,\n+\t\tExtKeyUsages:  []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth},\n+\t\tValidity:      ValidityTenYears,\n+\t\tKeyFileName:   \"ingress.key\",\n+\t\tCertFileName:  \"ingress.crt\",\n+\n+\t\tParentCA:     s.kubeCA,\n+\t\tAppendParent: true,\n+\t\tGenSubject:   genSubjectForIngressCertKey,\n+\t\tGenDNSNames:  genDNSNamesForIngressCertKey,\n+\t}\n+\n+\ts.apiServerCertKey = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tKeyUsages:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,\n+\t\tExtKeyUsages:  []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth},\n+\t\tSubject:       pkix.Name{CommonName: \"kube-apiserver\", Organization: []string{\"kube-master\"}},\n+\t\tValidity:      ValidityTenYears,\n+\t\tKeyFileName:   \"apiserver.key\",\n+\t\tCertFileName:  \"apiserver.crt\",\n+\n+\t\tParentCA:       s.kubeCA,\n+\t\tAppendParent:   true,\n+\t\tGenDNSNames:    genDNSNamesForAPIServerCertKey,\n+\t\tGenIPAddresses: genIPAddressesForAPIServerCertKey,\n+\t}\n+\n+\ts.openshiftAPIServerCertKey = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tKeyUsages:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,\n+\t\tExtKeyUsages:  []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth},\n+\t\tSubject:       pkix.Name{CommonName: \"openshift-apiserver\", Organization: []string{\"kube-master\"}},\n+\t\tValidity:      ValidityTenYears,\n+\t\tKeyFileName:   \"openshift-apiserver.key\",\n+\t\tCertFileName:  \"openshift-apiserver.crt\",\n+\n+\t\tParentCA:       s.aggregatorCA,\n+\t\tAppendParent:   true,\n+\t\tGenDNSNames:    genDNSNamesForOpenshiftAPIServerCertKey,\n+\t\tGenIPAddresses: genIPAddressesForOpenshiftAPIServerCertKey,\n+\t}\n+\n+\ts.apiServerProxyCertKey = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tKeyUsages:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,\n+\t\tExtKeyUsages:  []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},\n+\t\tSubject:       pkix.Name{CommonName: \"kube-apiserver-proxy\", Organization: []string{\"kube-master\"}},\n+\t\tValidity:      ValidityTenYears,\n+\t\tKeyFileName:   \"apiserver-proxy.key\",\n+\t\tCertFileName:  \"apiserver-proxy.crt\",\n+\n+\t\tParentCA: s.aggregatorCA,\n+\t}\n+\n+\ts.kubeletCertKey = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tKeyUsages:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,\n+\t\tExtKeyUsages:  []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},\n+\t\tSubject:       pkix.Name{CommonName: \"system:serviceaccount:kube-system:default\", Organization: []string{\"system:serviceaccounts:kube-system\"}},\n+\t\tValidity:      ValidityThirtyMinutes,\n+\t\tKeyFileName:   \"kubelet.key\",\n+\t\tCertFileName:  \"kubelet.crt\",\n+\n+\t\tParentCA: s.kubeCA,\n+\t}\n+\n+\ts.tncCertKey = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tExtKeyUsages:  []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},\n+\t\tValidity:      ValidityTenYears,\n+\t\tKeyFileName:   \"tnc.key\",\n+\t\tCertFileName:  \"tnc.crt\",\n+\n+\t\tParentCA:    s.rootCA,\n+\t\tGenDNSNames: genDNSNamesForTNCCertKey,\n+\t\tGenSubject:  genSubjectForTNCCertKey,\n+\t}\n+\n+\ts.clusterAPIServerCertKey = &CertKey{\n+\t\trootDir:       rootDir,\n+\t\tinstallConfig: stock.InstallConfig(),\n+\t\tSubject:       pkix.Name{CommonName: \"cluster-apiserver\", OrganizationalUnit: []string{\"bootkube\"}},\n+\t\tKeyUsages:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,\n+\t\tValidity:      ValidityTenYears,\n+\t\tKeyFileName:   \"cluster-apiserver-ca.key\",\n+\t\tCertFileName:  \"cluster-apiserver-ca.crt\",\n+\t\tIsCA:          true,\n+\n+\t\tParentCA:     s.aggregatorCA,\n+\t\tAppendParent: true,\n+\t}\n+\n+\ts.serviceAccountKeyPair = &KeyPair{\n+\t\trootDir:         rootDir,\n+\t\tPrivKeyFileName: \"service-account.key\",\n+\t\tPubKeyFileName:  \"service-account.pub\",\n+\t}\n+}\n+\n+// RootCA is the asset that generates the root-ca key/cert pair.\n+func (s *StockImpl) RootCA() asset.Asset { return s.rootCA }\n+\n+// KubeCA is the asset that generates the kube-ca key/cert pair.\n+func (s *StockImpl) KubeCA() asset.Asset { return s.kubeCA }\n+\n+// EtcdCA is the asset that generates the etcd-ca key/cert pair.\n+func (s *StockImpl) EtcdCA() asset.Asset { return s.etcdCA }\n+\n+// AggregatorCA is the asset that generates the aggregator-ca key/cert pair.\n+func (s *StockImpl) AggregatorCA() asset.Asset { return s.aggregatorCA }\n+\n+// ServiceServingCA is the asset that generates the service-serving-ca key/cert pair.\n+func (s *StockImpl) ServiceServingCA() asset.Asset { return s.serviceServingCA }\n+\n+// EtcdClientCertKey is the asset that generates the etcd client key/cert pair.\n+func (s *StockImpl) EtcdClientCertKey() asset.Asset { return s.etcdClientCertKey }\n+\n+// AdminCertKey is the asset that generates the admin key/cert pair.\n+func (s *StockImpl) AdminCertKey() asset.Asset { return s.adminCertKey }\n+\n+// IngressCertKey is the asset that generates the ingress key/cert pair.\n+func (s *StockImpl) IngressCertKey() asset.Asset { return s.ingressCertKey }\n+\n+// APIServerCertKey is the asset that generates the API server key/cert pair.\n+func (s *StockImpl) APIServerCertKey() asset.Asset { return s.apiServerCertKey }\n+\n+// OpenshiftAPIServerCertKey is the asset that generates the Openshift API server key/cert pair.\n+func (s *StockImpl) OpenshiftAPIServerCertKey() asset.Asset { return s.openshiftAPIServerCertKey }\n+\n+// APIServerProxyCertKey is the asset that generates the API server proxy key/cert pair.\n+func (s *StockImpl) APIServerProxyCertKey() asset.Asset { return s.apiServerProxyCertKey }\n+\n+// KubeletCertKey is the asset that generates the kubelet key/cert pair.\n+func (s *StockImpl) KubeletCertKey() asset.Asset { return s.kubeletCertKey }\n+\n+// TNCCertKey is the asset that generates the TNC key/cert pair.\n+func (s *StockImpl) TNCCertKey() asset.Asset { return s.tncCertKey }\n+\n+// ClusterAPIServerCertKey is the asset that generates the cluster API server key/cert pair.\n+func (s *StockImpl) ClusterAPIServerCertKey() asset.Asset { return s.clusterAPIServerCertKey }\n+\n+// ServiceAccountKeyPair is the asset that generates the service-account key/cert pair.","path":"pkg/asset/tls/stock.go","position":296,"original_position":296,"commit_id":"0a7e6f4dbeb0b4ced37e6d4469e3d490710e590e","original_commit_id":"0a7e6f4dbeb0b4ced37e6d4469e3d490710e590e","user":{"login":"wking","id":209920,"node_id":"MDQ6VXNlcjIwOTkyMA==","avatar_url":"https://avatars1.githubusercontent.com/u/209920?v=4","gravatar_id":"","url":"https://api.github.com/users/wking","html_url":"https://github.com/wking","followers_url":"https://api.github.com/users/wking/followers","following_url":"https://api.github.com/users/wking/following{/other_user}","gists_url":"https://api.github.com/users/wking/gists{/gist_id}","starred_url":"https://api.github.com/users/wking/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wking/subscriptions","organizations_url":"https://api.github.com/users/wking/orgs","repos_url":"https://api.github.com/users/wking/repos","events_url":"https://api.github.com/users/wking/events{/privacy}","received_events_url":"https://api.github.com/users/wking/received_events","type":"User","site_admin":false},"body":"nit: \"key/cert\" -> \"key\".","created_at":"2018-08-29T20:02:04Z","updated_at":"2018-08-29T20:02:04Z","html_url":"https://github.com/openshift/installer/pull/145#discussion_r213814990","pull_request_url":"https://api.github.com/repos/openshift/installer/pulls/145","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/openshift/installer/pulls/comments/213814990"},"html":{"href":"https://github.com/openshift/installer/pull/145#discussion_r213814990"},"pull_request":{"href":"https://api.github.com/repos/openshift/installer/pulls/145"}}},"pull_request":{"url":"https://api.github.com/repos/openshift/installer/pulls/145","id":209235430,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA5MjM1NDMw","html_url":"https://github.com/openshift/installer/pull/145","diff_url":"https://github.com/openshift/installer/pull/145.diff","patch_url":"https://github.com/openshift/installer/pull/145.patch","issue_url":"https://api.github.com/repos/openshift/installer/issues/145","number":145,"state":"open","locked":false,"title":"tls: Generate TLS assets through dependency graph","user":{"login":"yifan-gu","id":3278588,"node_id":"MDQ6VXNlcjMyNzg1ODg=","avatar_url":"https://avatars0.githubusercontent.com/u/3278588?v=4","gravatar_id":"","url":"https://api.github.com/users/yifan-gu","html_url":"https://github.com/yifan-gu","followers_url":"https://api.github.com/users/yifan-gu/followers","following_url":"https://api.github.com/users/yifan-gu/following{/other_user}","gists_url":"https://api.github.com/users/yifan-gu/gists{/gist_id}","starred_url":"https://api.github.com/users/yifan-gu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yifan-gu/subscriptions","organizations_url":"https://api.github.com/users/yifan-gu/orgs","repos_url":"https://api.github.com/users/yifan-gu/repos","events_url":"https://api.github.com/users/yifan-gu/events{/privacy}","received_events_url":"https://api.github.com/users/yifan-gu/received_events","type":"User","site_admin":false},"body":"- Created `CertKey` type that implements the asset interface.\r\n- Pulling the tls asset generation logic from `/installer/pkg/config-generator/tls.go`","created_at":"2018-08-17T19:18:51Z","updated_at":"2018-08-29T20:02:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e79395accc30222a1b56c12991151936f9510b54","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":959732229,"node_id":"MDU6TGFiZWw5NTk3MzIyMjk=","url":"https://api.github.com/repos/openshift/installer/labels/approved","name":"approved","color":"0ffa16","default":false},{"id":981486838,"node_id":"MDU6TGFiZWw5ODE0ODY4Mzg=","url":"https://api.github.com/repos/openshift/installer/labels/run-smoke-tests","name":"run-smoke-tests","color":"0e8a16","default":false},{"id":959730581,"node_id":"MDU6TGFiZWw5NTk3MzA1ODE=","url":"https://api.github.com/repos/openshift/installer/labels/size/XXL","name":"size/XXL","color":"ee0000","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/openshift/installer/pulls/145/commits","review_comments_url":"https://api.github.com/repos/openshift/installer/pulls/145/comments","review_comment_url":"https://api.github.com/repos/openshift/installer/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openshift/installer/issues/145/comments","statuses_url":"https://api.github.com/repos/openshift/installer/statuses/0a7e6f4dbeb0b4ced37e6d4469e3d490710e590e","head":{"label":"yifan-gu:generate_tls","ref":"generate_tls","sha":"0a7e6f4dbeb0b4ced37e6d4469e3d490710e590e","user":{"login":"yifan-gu","id":3278588,"node_id":"MDQ6VXNlcjMyNzg1ODg=","avatar_url":"https://avatars0.githubusercontent.com/u/3278588?v=4","gravatar_id":"","url":"https://api.github.com/users/yifan-gu","html_url":"https://github.com/yifan-gu","followers_url":"https://api.github.com/users/yifan-gu/followers","following_url":"https://api.github.com/users/yifan-gu/following{/other_user}","gists_url":"https://api.github.com/users/yifan-gu/gists{/gist_id}","starred_url":"https://api.github.com/users/yifan-gu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yifan-gu/subscriptions","organizations_url":"https://api.github.com/users/yifan-gu/orgs","repos_url":"https://api.github.com/users/yifan-gu/repos","events_url":"https://api.github.com/users/yifan-gu/events{/privacy}","received_events_url":"https://api.github.com/users/yifan-gu/received_events","type":"User","site_admin":false},"repo":{"id":139901205,"node_id":"MDEwOlJlcG9zaXRvcnkxMzk5MDEyMDU=","name":"installer","full_name":"yifan-gu/installer","owner":{"login":"yifan-gu","id":3278588,"node_id":"MDQ6VXNlcjMyNzg1ODg=","avatar_url":"https://avatars0.githubusercontent.com/u/3278588?v=4","gravatar_id":"","url":"https://api.github.com/users/yifan-gu","html_url":"https://github.com/yifan-gu","followers_url":"https://api.github.com/users/yifan-gu/followers","following_url":"https://api.github.com/users/yifan-gu/following{/other_user}","gists_url":"https://api.github.com/users/yifan-gu/gists{/gist_id}","starred_url":"https://api.github.com/users/yifan-gu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yifan-gu/subscriptions","organizations_url":"https://api.github.com/users/yifan-gu/orgs","repos_url":"https://api.github.com/users/yifan-gu/repos","events_url":"https://api.github.com/users/yifan-gu/events{/privacy}","received_events_url":"https://api.github.com/users/yifan-gu/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/yifan-gu/installer","description":"Install an OpenShift cluster","fork":true,"url":"https://api.github.com/repos/yifan-gu/installer","forks_url":"https://api.github.com/repos/yifan-gu/installer/forks","keys_url":"https://api.github.com/repos/yifan-gu/installer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/yifan-gu/installer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/yifan-gu/installer/teams","hooks_url":"https://api.github.com/repos/yifan-gu/installer/hooks","issue_events_url":"https://api.github.com/repos/yifan-gu/installer/issues/events{/number}","events_url":"https://api.github.com/repos/yifan-gu/installer/events","assignees_url":"https://api.github.com/repos/yifan-gu/installer/assignees{/user}","branches_url":"https://api.github.com/repos/yifan-gu/installer/branches{/branch}","tags_url":"https://api.github.com/repos/yifan-gu/installer/tags","blobs_url":"https://api.github.com/repos/yifan-gu/installer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/yifan-gu/installer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/yifan-gu/installer/git/refs{/sha}","trees_url":"https://api.github.com/repos/yifan-gu/installer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/yifan-gu/installer/statuses/{sha}","languages_url":"https://api.github.com/repos/yifan-gu/installer/languages","stargazers_url":"https://api.github.com/repos/yifan-gu/installer/stargazers","contributors_url":"https://api.github.com/repos/yifan-gu/installer/contributors","subscribers_url":"https://api.github.com/repos/yifan-gu/installer/subscribers","subscription_url":"https://api.github.com/repos/yifan-gu/installer/subscription","commits_url":"https://api.github.com/repos/yifan-gu/installer/commits{/sha}","git_commits_url":"https://api.github.com/repos/yifan-gu/installer/git/commits{/sha}","comments_url":"https://api.github.com/repos/yifan-gu/installer/comments{/number}","issue_comment_url":"https://api.github.com/repos/yifan-gu/installer/issues/comments{/number}","contents_url":"https://api.github.com/repos/yifan-gu/installer/contents/{+path}","compare_url":"https://api.github.com/repos/yifan-gu/installer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/yifan-gu/installer/merges","archive_url":"https://api.github.com/repos/yifan-gu/installer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/yifan-gu/installer/downloads","issues_url":"https://api.github.com/repos/yifan-gu/installer/issues{/number}","pulls_url":"https://api.github.com/repos/yifan-gu/installer/pulls{/number}","milestones_url":"https://api.github.com/repos/yifan-gu/installer/milestones{/number}","notifications_url":"https://api.github.com/repos/yifan-gu/installer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/yifan-gu/installer/labels{/name}","releases_url":"https://api.github.com/repos/yifan-gu/installer/releases{/id}","deployments_url":"https://api.github.com/repos/yifan-gu/installer/deployments","created_at":"2018-07-05T21:13:29Z","updated_at":"2018-07-05T21:13:32Z","pushed_at":"2018-08-29T19:45:23Z","git_url":"git://github.com/yifan-gu/installer.git","ssh_url":"git@github.com:yifan-gu/installer.git","clone_url":"https://github.com/yifan-gu/installer.git","svn_url":"https://github.com/yifan-gu/installer","homepage":"","size":36455,"stargazers_count":0,"watchers_count":0,"language":"HCL","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":"openshift:master","ref":"master","sha":"aaa47f6a54f0fa0449d36de01ccb9f56729b608a","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":136633680,"node_id":"MDEwOlJlcG9zaXRvcnkxMzY2MzM2ODA=","name":"installer","full_name":"openshift/installer","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},"private":false,"html_url":"https://github.com/openshift/installer","description":"Install an OpenShift cluster","fork":false,"url":"https://api.github.com/repos/openshift/installer","forks_url":"https://api.github.com/repos/openshift/installer/forks","keys_url":"https://api.github.com/repos/openshift/installer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/openshift/installer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/openshift/installer/teams","hooks_url":"https://api.github.com/repos/openshift/installer/hooks","issue_events_url":"https://api.github.com/repos/openshift/installer/issues/events{/number}","events_url":"https://api.github.com/repos/openshift/installer/events","assignees_url":"https://api.github.com/repos/openshift/installer/assignees{/user}","branches_url":"https://api.github.com/repos/openshift/installer/branches{/branch}","tags_url":"https://api.github.com/repos/openshift/installer/tags","blobs_url":"https://api.github.com/repos/openshift/installer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/openshift/installer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/openshift/installer/git/refs{/sha}","trees_url":"https://api.github.com/repos/openshift/installer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/openshift/installer/statuses/{sha}","languages_url":"https://api.github.com/repos/openshift/installer/languages","stargazers_url":"https://api.github.com/repos/openshift/installer/stargazers","contributors_url":"https://api.github.com/repos/openshift/installer/contributors","subscribers_url":"https://api.github.com/repos/openshift/installer/subscribers","subscription_url":"https://api.github.com/repos/openshift/installer/subscription","commits_url":"https://api.github.com/repos/openshift/installer/commits{/sha}","git_commits_url":"https://api.github.com/repos/openshift/installer/git/commits{/sha}","comments_url":"https://api.github.com/repos/openshift/installer/comments{/number}","issue_comment_url":"https://api.github.com/repos/openshift/installer/issues/comments{/number}","contents_url":"https://api.github.com/repos/openshift/installer/contents/{+path}","compare_url":"https://api.github.com/repos/openshift/installer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/openshift/installer/merges","archive_url":"https://api.github.com/repos/openshift/installer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/openshift/installer/downloads","issues_url":"https://api.github.com/repos/openshift/installer/issues{/number}","pulls_url":"https://api.github.com/repos/openshift/installer/pulls{/number}","milestones_url":"https://api.github.com/repos/openshift/installer/milestones{/number}","notifications_url":"https://api.github.com/repos/openshift/installer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/openshift/installer/labels{/name}","releases_url":"https://api.github.com/repos/openshift/installer/releases{/id}","deployments_url":"https://api.github.com/repos/openshift/installer/deployments","created_at":"2018-06-08T15:04:41Z","updated_at":"2018-08-29T16:42:06Z","pushed_at":"2018-08-29T19:45:25Z","git_url":"git://github.com/openshift/installer.git","ssh_url":"git@github.com:openshift/installer.git","clone_url":"https://github.com/openshift/installer.git","svn_url":"https://github.com/openshift/installer","homepage":"","size":36326,"stargazers_count":27,"watchers_count":27,"language":"Go","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":34,"mirror_url":null,"archived":false,"open_issues_count":26,"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":34,"open_issues":26,"watchers":27,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openshift/installer/pulls/145"},"html":{"href":"https://github.com/openshift/installer/pull/145"},"issue":{"href":"https://api.github.com/repos/openshift/installer/issues/145"},"comments":{"href":"https://api.github.com/repos/openshift/installer/issues/145/comments"},"review_comments":{"href":"https://api.github.com/repos/openshift/installer/pulls/145/comments"},"review_comment":{"href":"https://api.github.com/repos/openshift/installer/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openshift/installer/pulls/145/commits"},"statuses":{"href":"https://api.github.com/repos/openshift/installer/statuses/0a7e6f4dbeb0b4ced37e6d4469e3d490710e590e"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"wking"}}