{"action":"created","comment":{"url":"https://api.github.com/repos/openshift/origin/pulls/comments/51117434","id":51117434,"diff_hunk":"@@ -0,0 +1,396 @@\n+package cmd\n+\n+import (\n+\t\"fmt\"\n+\t\"io\"\n+\t\"strconv\"\n+\n+\t\"github.com/spf13/cobra\"\n+\n+\tkapi \"k8s.io/kubernetes/pkg/api\"\n+\tkclient \"k8s.io/kubernetes/pkg/client/unversioned\"\n+\tkcmdutil \"k8s.io/kubernetes/pkg/kubectl/cmd/util\"\n+\t\"k8s.io/kubernetes/pkg/kubectl/resource\"\n+\t\"k8s.io/kubernetes/pkg/util\"\n+\n+\tcmdutil \"github.com/openshift/origin/pkg/cmd/util\"\n+\t\"github.com/openshift/origin/pkg/cmd/util/clientcmd\"\n+\t\"github.com/openshift/origin/pkg/route/api\"\n+\tfileutil \"github.com/openshift/origin/pkg/util/file\"\n+)\n+\n+const (\n+\trouteLong = `\n+Expose containers externally via secured routes\n+\n+The name of the service you want to expose needs to be specified by using the\n+--expose option.\n+\n+Three types of secured routes are supported: edge, passthrough, and reencrypt.\n+If you wish to create unsecured routes, see \"%[1]s expose -h\"\n+`\n+)\n+\n+// NewCmdCreateRoute is a macro command to create a secured route.\n+func NewCmdCreateRoute(fullName string, f *clientcmd.Factory, out io.Writer) *cobra.Command {\n+\tcmd := &cobra.Command{\n+\t\tUse:   \"route\",\n+\t\tShort: \"Expose containers externally via secured routes\",\n+\t\tLong:  fmt.Sprintf(routeLong, fullName),\n+\t\tRun:   cmdutil.DefaultSubCommandRun(out),\n+\t}\n+\n+\tcmd.AddCommand(NewCmdCreateEdgeRoute(fullName, f, out))\n+\tcmd.AddCommand(NewCmdCreatePassthroughRoute(fullName, f, out))\n+\tcmd.AddCommand(NewCmdCreateReencryptRoute(fullName, f, out))\n+\n+\treturn cmd\n+}\n+\n+const (\n+\tedgeRouteLong = `\n+Create a route that uses edge TLS termination\n+\n+Specify the service that the new route should expose via the --expose flag.`\n+\n+\tedgeRouteExample = `  # Create an edge route named \"my-route\" that exposes frontend service.\n+  $ %[1]s create route edge my-route --expose frontend\n+\n+  # Create an edge route that exposes the frontend service and specify a path.\n+  # If the route name is omitted, the service name will be re-used.\n+  $ %[1]s create route edge --expose frontend --path /assets`\n+)\n+\n+// NewCmdCreateEdgeRoute is a macro command to create an edge route.\n+func NewCmdCreateEdgeRoute(fullName string, f *clientcmd.Factory, out io.Writer) *cobra.Command {\n+\tcmd := &cobra.Command{\n+\t\tUse:     \"edge [NAME] --expose=SERVICE\",\n+\t\tShort:   \"Create a route that uses edge TLS termination\",\n+\t\tLong:    edgeRouteLong,\n+\t\tExample: fmt.Sprintf(edgeRouteExample, fullName),\n+\t\tRun: func(cmd *cobra.Command, args []string) {\n+\t\t\terr := CreateEdgeRoute(f, out, cmd, args)\n+\t\t\tkcmdutil.CheckErr(err)\n+\t\t},\n+\t}\n+\n+\tkcmdutil.AddValidateFlags(cmd)\n+\tkcmdutil.AddOutputFlagsForMutation(cmd)\n+\tcmd.Flags().String(\"hostname\", \"\", \"Set a hostname for the new route\")\n+\tcmd.Flags().String(\"port\", \"\", \"Name of the service port or number of the container port the route will route traffic to\")\n+\tcmd.Flags().String(\"expose\", \"\", \"Name of the service that the new route is exposing\")\n+\tcmd.MarkFlagRequired(\"expose\")\n+\tcmd.Flags().String(\"path\", \"\", \"Path that the router watches to route traffic to the service.\")\n+\tcmd.Flags().String(\"cert\", \"\", \"Path to a certificate file.\")\n+\tcmd.Flags().String(\"key\", \"\", \"Path to a key file.\")\n+\tcmd.Flags().String(\"ca-cert\", \"\", \"Path to a CA certificate file.\")\n+\n+\treturn cmd\n+}\n+\n+// CreateEdgeRoute implements the behavior to run the create edge route command.\n+func CreateEdgeRoute(f *clientcmd.Factory, out io.Writer, cmd *cobra.Command, args []string) error {\n+\toc, kc, err := f.Clients()\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\tns, _, err := f.DefaultNamespace()\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\troute, err := unsecuredRoute(cmd, kc, ns, args)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\troute.Spec.Host = kcmdutil.GetFlagString(cmd, \"hostname\")\n+\troute.Spec.Path = kcmdutil.GetFlagString(cmd, \"path\")\n+\n+\troute.Spec.TLS = new(api.TLSConfig)\n+\troute.Spec.TLS.Termination = api.TLSTerminationEdge\n+\tcert, err := fileutil.LoadData(kcmdutil.GetFlagString(cmd, \"cert-file\"))\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\troute.Spec.TLS.Certificate = string(cert)\n+\tkey, err := fileutil.LoadData(kcmdutil.GetFlagString(cmd, \"key-file\"))\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\troute.Spec.TLS.Key = string(key)\n+\tcaCert, err := fileutil.LoadData(kcmdutil.GetFlagString(cmd, \"ca-cert-file\"))\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\troute.Spec.TLS.CACertificate = string(caCert)\n+\n+\troute, err = oc.Routes(ns).Create(route)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\tmapper, typer := f.Object()\n+\tresourceMapper := &resource.Mapper{\n+\t\tObjectTyper:  typer,\n+\t\tRESTMapper:   mapper,\n+\t\tClientMapper: resource.ClientMapperFunc(f.Factory.RESTClient),\n+\t}\n+\tinfo, err := resourceMapper.InfoForObject(route)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\tshortOutput := kcmdutil.GetFlagString(cmd, \"output\") == \"name\"\n+\tkcmdutil.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, \"created\")\n+\treturn nil\n+}\n+\n+const (\n+\tpassthroughRouteLong = `\n+Create a route that uses passthrough TLS termination\n+\n+Specify the service that the new route should expose via the --expose flag.`\n+\n+\tpassthroughRouteExample = `  # Create a passthrough route named \"my-route\" that exposes the frontend service.\n+  $ %[1]s create route passthrough my-route --expose frontend\n+\n+  # Create a passthrough route that exposes the frontend service and specify\n+  # a hostname. If the route name is omitted, the service name will be re-used.\n+  $ %[1]s create route passthrough --expose frontend --hostname www.example.com`\n+)\n+\n+// NewCmdCreatePassthroughRoute is a macro command to create a passthrough route.\n+func NewCmdCreatePassthroughRoute(fullName string, f *clientcmd.Factory, out io.Writer) *cobra.Command {\n+\tcmd := &cobra.Command{\n+\t\tUse:     \"passthrough [NAME] --expose=SERVICE\",\n+\t\tShort:   \"Create a route that uses passthrough TLS termination\",\n+\t\tLong:    passthroughRouteLong,\n+\t\tExample: fmt.Sprintf(passthroughRouteExample, fullName),\n+\t\tRun: func(cmd *cobra.Command, args []string) {\n+\t\t\terr := CreatePassthroughRoute(f, out, cmd, args)\n+\t\t\tkcmdutil.CheckErr(err)\n+\t\t},\n+\t}\n+\n+\tkcmdutil.AddValidateFlags(cmd)\n+\tkcmdutil.AddOutputFlagsForMutation(cmd)\n+\tcmd.Flags().String(\"hostname\", \"\", \"Set a hostname for the new route\")\n+\tcmd.Flags().String(\"port\", \"\", \"Name of the service port or number of the container port the route will route traffic to\")\n+\tcmd.Flags().String(\"expose\", \"\", \"Name of the service that the new route is exposing\")\n+\tcmd.MarkFlagRequired(\"expose\")\n+\n+\treturn cmd\n+}\n+\n+// CreatePassthroughRoute implements the behavior to run the create passthrough route command.\n+func CreatePassthroughRoute(f *clientcmd.Factory, out io.Writer, cmd *cobra.Command, args []string) error {\n+\toc, kc, err := f.Clients()\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\tns, _, err := f.DefaultNamespace()\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\troute, err := unsecuredRoute(cmd, kc, ns, args)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\troute.Spec.Host = kcmdutil.GetFlagString(cmd, \"hostname\")\n+\n+\troute.Spec.TLS = new(api.TLSConfig)\n+\troute.Spec.TLS.Termination = api.TLSTerminationPassthrough\n+\n+\troute, err = oc.Routes(ns).Create(route)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\tmapper, typer := f.Object()\n+\tresourceMapper := &resource.Mapper{\n+\t\tObjectTyper:  typer,\n+\t\tRESTMapper:   mapper,\n+\t\tClientMapper: resource.ClientMapperFunc(f.Factory.RESTClient),\n+\t}\n+\tinfo, err := resourceMapper.InfoForObject(route)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\tshortOutput := kcmdutil.GetFlagString(cmd, \"output\") == \"name\"\n+\tkcmdutil.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, \"created\")\n+\treturn nil\n+}\n+\n+const (\n+\treencryptRouteLong = `\n+Create a route that uses reencrypt TLS termination\n+\n+Specify the service that the new route should expose via the --expose flag.\n+A destination CA certificate is needed for reencrypt routes, specify one \n+with the --dest-ca-cert flag.`\n+\n+\treencryptRouteExample = `  # Create a route named \"my-route\" that exposes the frontend service.\n+  $ %[1]s create route reencrypt my-route --expose frontend --dest-ca-cert cert.cert\n+\n+  # Create a reencrypt route that exposes the frontend service and re-use\n+  # the service name as the route name.\n+  $ %[1]s create route reencrypt --expose frontend --dest-ca-cert cert.cert`\n+)\n+\n+// NewCmdCreateReencryptRoute is a macro command to create a reencrypt route.\n+func NewCmdCreateReencryptRoute(fullName string, f *clientcmd.Factory, out io.Writer) *cobra.Command {\n+\tcmd := &cobra.Command{\n+\t\tUse:     \"reencrypt [NAME] --dest-ca-cert=FILENAME --expose=SERVICE\",\n+\t\tShort:   \"Create a route that uses reencrypt TLS termination\",\n+\t\tLong:    reencryptRouteLong,\n+\t\tExample: fmt.Sprintf(reencryptRouteExample, fullName),\n+\t\tRun: func(cmd *cobra.Command, args []string) {\n+\t\t\terr := CreateReencryptRoute(f, out, cmd, args)\n+\t\t\tkcmdutil.CheckErr(err)\n+\t\t},\n+\t}\n+\n+\tkcmdutil.AddValidateFlags(cmd)\n+\tkcmdutil.AddOutputFlagsForMutation(cmd)\n+\tcmd.Flags().String(\"hostname\", \"\", \"Set a hostname for the new route\")\n+\tcmd.Flags().String(\"port\", \"\", \"Name of the service port or number of the container port the route will route traffic to\")\n+\tcmd.Flags().String(\"expose\", \"\", \"Name of the service that the new route is exposing\")\n+\tcmd.MarkFlagRequired(\"expose\")\n+\tcmd.Flags().String(\"path\", \"\", \"Path that the router watches to route traffic to the service.\")\n+\tcmd.Flags().String(\"cert\", \"\", \"Path to a certificate file.\")\n+\tcmd.Flags().String(\"key\", \"\", \"Path to a key file.\")\n+\tcmd.Flags().String(\"ca-cert\", \"\", \"Path to a CA certificate file.\")\n+\tcmd.Flags().String(\"dest-ca-cert\", \"\", \"Path to a CA certificate file, used for securing the connection from the router to the destination.\")\n+\tcmd.MarkFlagRequired(\"dest-ca-cert\")\n+\n+\treturn cmd\n+}\n+\n+// CreateReencryptRoute implements the behavior to run the create reencrypt route command.\n+func CreateReencryptRoute(f *clientcmd.Factory, out io.Writer, cmd *cobra.Command, args []string) error {\n+\toc, kc, err := f.Clients()\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\tns, _, err := f.DefaultNamespace()\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\troute, err := unsecuredRoute(cmd, kc, ns, args)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\troute.Spec.Host = kcmdutil.GetFlagString(cmd, \"hostname\")\n+\troute.Spec.Path = kcmdutil.GetFlagString(cmd, \"path\")\n+\n+\troute.Spec.TLS = new(api.TLSConfig)\n+\troute.Spec.TLS.Termination = api.TLSTerminationEdge\n+\n+\tcert, err := fileutil.LoadData(kcmdutil.GetFlagString(cmd, \"cert-file\"))\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\troute.Spec.TLS.Certificate = string(cert)\n+\tkey, err := fileutil.LoadData(kcmdutil.GetFlagString(cmd, \"key-file\"))\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\troute.Spec.TLS.Key = string(key)\n+\tcaCert, err := fileutil.LoadData(kcmdutil.GetFlagString(cmd, \"ca-cert-file\"))\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\troute.Spec.TLS.CACertificate = string(caCert)\n+\tdestCACert, err := fileutil.LoadData(kcmdutil.GetFlagString(cmd, \"dest-ca-cert\"))\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\troute.Spec.TLS.DestinationCACertificate = string(destCACert)\n+\n+\troute, err = oc.Routes(ns).Create(route)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\tmapper, typer := f.Object()\n+\tresourceMapper := &resource.Mapper{\n+\t\tObjectTyper:  typer,\n+\t\tRESTMapper:   mapper,\n+\t\tClientMapper: resource.ClientMapperFunc(f.Factory.RESTClient),\n+\t}\n+\tinfo, err := resourceMapper.InfoForObject(route)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\tshortOutput := kcmdutil.GetFlagString(cmd, \"output\") == \"name\"\n+\tkcmdutil.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, \"created\")\n+\treturn nil\n+}\n+\n+// unsecuredRoute will return a route with enough info so that it can direct traffic to\n+// the service provided by --expose. Callers of this helper are responsible for providing\n+// tls configuration, path, and the hostname of the route.\n+func unsecuredRoute(cmd *cobra.Command, kc *kclient.Client, namespace string, args []string) (*api.Route, error) {\n+\tserviceName := kcmdutil.GetFlagString(cmd, \"expose\")","path":"pkg/cmd/cli/cmd/create_route.go","position":335,"original_position":335,"commit_id":"0215022c9aa3d496cfaabb9b6ba8ee4719a0c2a1","original_commit_id":"37064f953d60a612b9eeff226acb32ab8a5720ed","user":{"login":"kargakis","id":3900799,"avatar_url":"https://avatars.githubusercontent.com/u/3900799?v=3","gravatar_id":"","url":"https://api.github.com/users/kargakis","html_url":"https://github.com/kargakis","followers_url":"https://api.github.com/users/kargakis/followers","following_url":"https://api.github.com/users/kargakis/following{/other_user}","gists_url":"https://api.github.com/users/kargakis/gists{/gist_id}","starred_url":"https://api.github.com/users/kargakis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kargakis/subscriptions","organizations_url":"https://api.github.com/users/kargakis/orgs","repos_url":"https://api.github.com/users/kargakis/repos","events_url":"https://api.github.com/users/kargakis/events{/privacy}","received_events_url":"https://api.github.com/users/kargakis/received_events","type":"User","site_admin":false},"body":"I think I will create another helper just for resolving the service name where I can handle types","created_at":"2016-01-28T12:47:43Z","updated_at":"2016-01-28T12:47:43Z","html_url":"https://github.com/openshift/origin/pull/6819#discussion_r51117434","pull_request_url":"https://api.github.com/repos/openshift/origin/pulls/6819","_links":{"self":{"href":"https://api.github.com/repos/openshift/origin/pulls/comments/51117434"},"html":{"href":"https://github.com/openshift/origin/pull/6819#discussion_r51117434"},"pull_request":{"href":"https://api.github.com/repos/openshift/origin/pulls/6819"}}},"pull_request":{"url":"https://api.github.com/repos/openshift/origin/pulls/6819","id":57098913,"html_url":"https://github.com/openshift/origin/pull/6819","diff_url":"https://github.com/openshift/origin/pull/6819.diff","patch_url":"https://github.com/openshift/origin/pull/6819.patch","issue_url":"https://api.github.com/repos/openshift/origin/issues/6819","number":6819,"state":"open","locked":false,"title":"oc: add create route subcommands","user":{"login":"kargakis","id":3900799,"avatar_url":"https://avatars.githubusercontent.com/u/3900799?v=3","gravatar_id":"","url":"https://api.github.com/users/kargakis","html_url":"https://github.com/kargakis","followers_url":"https://api.github.com/users/kargakis/followers","following_url":"https://api.github.com/users/kargakis/following{/other_user}","gists_url":"https://api.github.com/users/kargakis/gists{/gist_id}","starred_url":"https://api.github.com/users/kargakis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kargakis/subscriptions","organizations_url":"https://api.github.com/users/kargakis/orgs","repos_url":"https://api.github.com/users/kargakis/repos","events_url":"https://api.github.com/users/kargakis/events{/privacy}","received_events_url":"https://api.github.com/users/kargakis/received_events","type":"User","site_admin":false},"body":"Add three subcommands under `oc create route` that create secure\r\nroutes.\r\n\r\n`oc expose` will continue creating unsecured routes as it already\r\ndoes but we will not enhance it further.\r\n\r\n@deads2k @liggitt @pweil- @ramr @smarterclayton @jwforres @fabianofranz \r\n\r\nFixes https://github.com/openshift/origin/issues/6094\r\n","created_at":"2016-01-25T16:59:55Z","updated_at":"2016-01-28T12:47:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"57f0f8e951e595a5605a8bc1178d9a001bfad317","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/openshift/origin/pulls/6819/commits","review_comments_url":"https://api.github.com/repos/openshift/origin/pulls/6819/comments","review_comment_url":"https://api.github.com/repos/openshift/origin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openshift/origin/issues/6819/comments","statuses_url":"https://api.github.com/repos/openshift/origin/statuses/0215022c9aa3d496cfaabb9b6ba8ee4719a0c2a1","head":{"label":"kargakis:create-route-subcommand","ref":"create-route-subcommand","sha":"0215022c9aa3d496cfaabb9b6ba8ee4719a0c2a1","user":{"login":"kargakis","id":3900799,"avatar_url":"https://avatars.githubusercontent.com/u/3900799?v=3","gravatar_id":"","url":"https://api.github.com/users/kargakis","html_url":"https://github.com/kargakis","followers_url":"https://api.github.com/users/kargakis/followers","following_url":"https://api.github.com/users/kargakis/following{/other_user}","gists_url":"https://api.github.com/users/kargakis/gists{/gist_id}","starred_url":"https://api.github.com/users/kargakis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kargakis/subscriptions","organizations_url":"https://api.github.com/users/kargakis/orgs","repos_url":"https://api.github.com/users/kargakis/repos","events_url":"https://api.github.com/users/kargakis/events{/privacy}","received_events_url":"https://api.github.com/users/kargakis/received_events","type":"User","site_admin":false},"repo":{"id":29889288,"name":"origin","full_name":"kargakis/origin","owner":{"login":"kargakis","id":3900799,"avatar_url":"https://avatars.githubusercontent.com/u/3900799?v=3","gravatar_id":"","url":"https://api.github.com/users/kargakis","html_url":"https://github.com/kargakis","followers_url":"https://api.github.com/users/kargakis/followers","following_url":"https://api.github.com/users/kargakis/following{/other_user}","gists_url":"https://api.github.com/users/kargakis/gists{/gist_id}","starred_url":"https://api.github.com/users/kargakis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kargakis/subscriptions","organizations_url":"https://api.github.com/users/kargakis/orgs","repos_url":"https://api.github.com/users/kargakis/repos","events_url":"https://api.github.com/users/kargakis/events{/privacy}","received_events_url":"https://api.github.com/users/kargakis/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kargakis/origin","description":"OpenShift 3 - build, deploy, and manage your applications with Docker and Kubernetes","fork":true,"url":"https://api.github.com/repos/kargakis/origin","forks_url":"https://api.github.com/repos/kargakis/origin/forks","keys_url":"https://api.github.com/repos/kargakis/origin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kargakis/origin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kargakis/origin/teams","hooks_url":"https://api.github.com/repos/kargakis/origin/hooks","issue_events_url":"https://api.github.com/repos/kargakis/origin/issues/events{/number}","events_url":"https://api.github.com/repos/kargakis/origin/events","assignees_url":"https://api.github.com/repos/kargakis/origin/assignees{/user}","branches_url":"https://api.github.com/repos/kargakis/origin/branches{/branch}","tags_url":"https://api.github.com/repos/kargakis/origin/tags","blobs_url":"https://api.github.com/repos/kargakis/origin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kargakis/origin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kargakis/origin/git/refs{/sha}","trees_url":"https://api.github.com/repos/kargakis/origin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kargakis/origin/statuses/{sha}","languages_url":"https://api.github.com/repos/kargakis/origin/languages","stargazers_url":"https://api.github.com/repos/kargakis/origin/stargazers","contributors_url":"https://api.github.com/repos/kargakis/origin/contributors","subscribers_url":"https://api.github.com/repos/kargakis/origin/subscribers","subscription_url":"https://api.github.com/repos/kargakis/origin/subscription","commits_url":"https://api.github.com/repos/kargakis/origin/commits{/sha}","git_commits_url":"https://api.github.com/repos/kargakis/origin/git/commits{/sha}","comments_url":"https://api.github.com/repos/kargakis/origin/comments{/number}","issue_comment_url":"https://api.github.com/repos/kargakis/origin/issues/comments{/number}","contents_url":"https://api.github.com/repos/kargakis/origin/contents/{+path}","compare_url":"https://api.github.com/repos/kargakis/origin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kargakis/origin/merges","archive_url":"https://api.github.com/repos/kargakis/origin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kargakis/origin/downloads","issues_url":"https://api.github.com/repos/kargakis/origin/issues{/number}","pulls_url":"https://api.github.com/repos/kargakis/origin/pulls{/number}","milestones_url":"https://api.github.com/repos/kargakis/origin/milestones{/number}","notifications_url":"https://api.github.com/repos/kargakis/origin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kargakis/origin/labels{/name}","releases_url":"https://api.github.com/repos/kargakis/origin/releases{/id}","deployments_url":"https://api.github.com/repos/kargakis/origin/deployments","created_at":"2015-01-27T00:24:14Z","updated_at":"2016-01-12T09:45:46Z","pushed_at":"2016-01-28T12:33:28Z","git_url":"git://github.com/kargakis/origin.git","ssh_url":"git@github.com:kargakis/origin.git","clone_url":"https://github.com/kargakis/origin.git","svn_url":"https://github.com/kargakis/origin","homepage":"https://openshift.github.io","size":199790,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"openshift:master","ref":"master","sha":"2881fe889e3f6e6eb14a89c180936313ed4dfd26","user":{"login":"openshift","id":792337,"avatar_url":"https://avatars.githubusercontent.com/u/792337?v=3","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://avatars.githubusercontent.com/u/792337?v=3","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":"OpenShift 3 - build, deploy, and manage your applications with Docker and Kubernetes","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":"2016-01-28T09:50:54Z","pushed_at":"2016-01-28T12:33:29Z","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":262845,"stargazers_count":942,"watchers_count":942,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":598,"mirror_url":null,"open_issues_count":766,"forks":598,"open_issues":766,"watchers":942,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openshift/origin/pulls/6819"},"html":{"href":"https://github.com/openshift/origin/pull/6819"},"issue":{"href":"https://api.github.com/repos/openshift/origin/issues/6819"},"comments":{"href":"https://api.github.com/repos/openshift/origin/issues/6819/comments"},"review_comments":{"href":"https://api.github.com/repos/openshift/origin/pulls/6819/comments"},"review_comment":{"href":"https://api.github.com/repos/openshift/origin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openshift/origin/pulls/6819/commits"},"statuses":{"href":"https://api.github.com/repos/openshift/origin/statuses/0215022c9aa3d496cfaabb9b6ba8ee4719a0c2a1"}}}}