{"action":"created","comment":{"url":"https://api.github.com/repos/openshift/origin/pulls/comments/24938098","id":24938098,"diff_hunk":"@@ -0,0 +1,243 @@\n+package router\n+\n+import (\n+\t\"fmt\"\n+\t\"io\"\n+\t\"os\"\n+\t\"strings\"\n+\n+\tkapi \"github.com/GoogleCloudPlatform/kubernetes/pkg/api\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors\"\n+\tcmdutil \"github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd/util\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime\"\n+\t\"github.com/golang/glog\"\n+\t\"github.com/spf13/cobra\"\n+\n+\t\"github.com/openshift/origin/pkg/cmd/util/clientcmd\"\n+\t\"github.com/openshift/origin/pkg/cmd/util/variable\"\n+\tconfigcmd \"github.com/openshift/origin/pkg/config/cmd\"\n+\tdapi \"github.com/openshift/origin/pkg/deploy/api\"\n+\t\"github.com/openshift/origin/pkg/generate/app\"\n+\t//imageapi \"github.com/openshift/origin/pkg/image/api\"\n+)\n+\n+const longDesc = `\n+Install or configure an OpenShift router\n+\n+This command helps to setup an OpenShift router to take edge traffic and balance it to\n+your application. With no arguments, the command will check for an existing router\n+service called 'router' and perform some diagnostics to ensure the router is properly\n+configured and functioning.\n+\n+If a router does not exist with the given name, the --create flag can be passed to\n+create a deployment configuration and service that will run the router. If you are\n+running your router in production, you should pass --replicas=2 or higher to ensure\n+you have failover protection.\n+\n+Examples:\n+  Check the default router (\"router\"):\n+\n+  $ %[1]s %[2]s\n+\n+  See what the router would look like if created:\n+\n+  $ %[1]s %[2]s -o json\n+\n+  Create a router if it does not exist:\n+\n+  $ %[1]s %[2]s router-west --create --replicas=2\n+\n+  Use a different router image:\n+\n+  $ %[1]s %[2]s region-west -o yaml --images=myrepo/somerouter:mytag\n+\n+ALPHA: This command is currently being actively developed. It is intended to simplify\n+  the tasks of setting up routers in a new installation.\n+`\n+\n+type config struct {\n+\tType          string\n+\tImageTemplate variable.ImageTemplate\n+\tPorts         string\n+\tReplicas      int\n+\tLabels        string\n+\tCreate        bool\n+}\n+\n+const defaultLabel = \"router=<name>\"\n+\n+func NewCmdRouter(f *clientcmd.Factory, parentName, name string, out io.Writer) *cobra.Command {\n+\tcfg := &config{\n+\t\tImageTemplate: variable.NewDefaultImageTemplate(),\n+\n+\t\tLabels:   defaultLabel,\n+\t\tPorts:    \"80:80,443:443\",\n+\t\tReplicas: 1,\n+\t}\n+\n+\tcmd := &cobra.Command{\n+\t\tUse:   fmt.Sprintf(\"%s [<name>]\", name),\n+\t\tShort: \"Install and check OpenShift routers\",\n+\t\tLong:  fmt.Sprintf(longDesc, parentName, name),\n+\n+\t\tRun: func(cmd *cobra.Command, args []string) {\n+\t\t\tvar name string\n+\t\t\tswitch len(args) {\n+\t\t\tcase 0:\n+\t\t\t\tname = \"router\"\n+\t\t\tcase 1:\n+\t\t\t\tname = args[0]\n+\t\t\tdefault:\n+\t\t\t\tglog.Fatalf(\"You may pass zero or one arguments to provide a name for the router\")\n+\t\t\t}\n+\n+\t\t\tports, err := app.ContainerPortsFromString(cfg.Ports)\n+\t\t\tif err != nil {\n+\t\t\t\tglog.Fatal(err)\n+\t\t\t}\n+\n+\t\t\tlabel := map[string]string{\"router\": name}\n+\t\t\tif cfg.Labels != defaultLabel {\n+\t\t\t\tvalid, remove, err := app.LabelsFromSpec(strings.Split(cfg.Labels, \",\"))\n+\t\t\t\tif err != nil {\n+\t\t\t\t\tglog.Fatal(err)\n+\t\t\t\t}\n+\t\t\t\tif len(remove) > 0 {\n+\t\t\t\t\tglog.Fatalf(\"You may not pass negative labels in %q\", cfg.Labels)\n+\t\t\t\t}\n+\t\t\t\tlabel = valid\n+\t\t\t}\n+\n+\t\t\timage := cfg.ImageTemplate.ExpandOrDie(cfg.Type)\n+\n+\t\t\tnamespace, err := f.OpenShiftClientConfig.Namespace()\n+\t\t\tif err != nil {\n+\t\t\t\tglog.Fatalf(\"Error getting client: %v\", err)\n+\t\t\t}\n+\t\t\t_, kclient, err := f.Clients(cmd)\n+\t\t\tif err != nil {\n+\t\t\t\tglog.Fatalf(\"Error getting client: %v\", err)\n+\t\t\t}\n+\n+\t\t\tp, output, err := cmdutil.PrinterForCommand(cmd)\n+\t\t\tif err != nil {\n+\t\t\t\tglog.Fatalf(\"Unable to configure printer: %v\", err)\n+\t\t\t}\n+\n+\t\t\tgenerate := output\n+\t\t\tif !generate {\n+\t\t\t\t_, err = kclient.Services(namespace).Get(name)\n+\t\t\t\tif err != nil {\n+\t\t\t\t\tif !errors.IsNotFound(err) {\n+\t\t\t\t\t\tglog.Fatalf(\"Can't check for existing router %q: %v\", name, err)\n+\t\t\t\t\t}\n+\t\t\t\t\tgenerate = true\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\tif generate {\n+\t\t\t\t// create new router\n+\n+\t\t\t\tobjects := []runtime.Object{\n+\t\t\t\t\t&dapi.DeploymentConfig{\n+\t\t\t\t\t\tObjectMeta: kapi.ObjectMeta{\n+\t\t\t\t\t\t\tName:   name,\n+\t\t\t\t\t\t\tLabels: label,\n+\t\t\t\t\t\t},\n+\t\t\t\t\t\tTriggers: []dapi.DeploymentTriggerPolicy{\n+\t\t\t\t\t\t\t{Type: dapi.DeploymentTriggerOnConfigChange},\n+\t\t\t\t\t\t},\n+\t\t\t\t\t\tTemplate: dapi.DeploymentTemplate{\n+\t\t\t\t\t\t\tStrategy: dapi.DeploymentStrategy{\n+\t\t\t\t\t\t\t\tType: dapi.DeploymentStrategyTypeRecreate,\n+\t\t\t\t\t\t\t},\n+\t\t\t\t\t\t\tControllerTemplate: kapi.ReplicationControllerSpec{\n+\t\t\t\t\t\t\t\tReplicas: cfg.Replicas,\n+\t\t\t\t\t\t\t\tSelector: label,\n+\t\t\t\t\t\t\t\tTemplate: &kapi.PodTemplateSpec{\n+\t\t\t\t\t\t\t\t\tObjectMeta: kapi.ObjectMeta{Labels: label},\n+\t\t\t\t\t\t\t\t\tSpec: kapi.PodSpec{\n+\t\t\t\t\t\t\t\t\t\tContainers: []kapi.Container{\n+\t\t\t\t\t\t\t\t\t\t\t{\n+\t\t\t\t\t\t\t\t\t\t\t\tName:  \"router\",\n+\t\t\t\t\t\t\t\t\t\t\t\tImage: image,\n+\t\t\t\t\t\t\t\t\t\t\t\tPorts: ports,\n+\t\t\t\t\t\t\t\t\t\t\t},\n+\t\t\t\t\t\t\t\t\t\t},\n+\t\t\t\t\t\t\t\t\t},\n+\t\t\t\t\t\t\t\t},\n+\t\t\t\t\t\t\t},\n+\t\t\t\t\t\t},\n+\t\t\t\t\t},\n+\t\t\t\t}\n+\t\t\t\tobjects = app.AddServices(objects)\n+\t\t\t\t// TODO: label all created objects with the same label - router=<name>\n+\t\t\t\tlist := &kapi.List{Items: objects}\n+\n+\t\t\t\tif output {\n+\t\t\t\t\tif err := p.PrintObj(list, out); err != nil {\n+\t\t\t\t\t\tglog.Fatalf(\"Unable to print object: %v\", err)\n+\t\t\t\t\t}\n+\t\t\t\t\treturn\n+\t\t\t\t}\n+\n+\t\t\t\tif !cfg.Create {\n+\t\t\t\t\tglog.Fatalf(\"Router %q does not exist (no service). Pass --create to install.\", name)\n+\t\t\t\t}\n+\n+\t\t\t\tbulk := configcmd.Bulk{\n+\t\t\t\t\tFactory: f.Factory,\n+\t\t\t\t\tCommand: cmd,\n+\t\t\t\t\tAfter:   configcmd.NewPrintNameOrErrorAfter(out, os.Stderr),\n+\t\t\t\t}\n+\t\t\t\tif errs := bulk.Create(list, namespace); len(errs) != 0 {\n+\t\t\t\t\tos.Exit(1)\n+\t\t\t\t}\n+\t\t\t\treturn\n+\t\t\t}\n+\n+\t\t\tglog.Infof(\"Router %q service exists\", name)\n+\t\t},\n+\t}\n+\n+\tcmd.Flags().StringVar(&cfg.Type, \"type\", \"haproxy-router\", \"The type of router to use - if you specify --images this flag may be ignored.\")","path":"pkg/cmd/experimental/router/router.go","position":203,"original_position":203,"commit_id":"4319591e8cee6c4b7fcea6a3611ab9da10561c9b","original_commit_id":"4319591e8cee6c4b7fcea6a3611ab9da10561c9b","user":{"login":"smarterclayton","id":1163175,"avatar_url":"https://avatars.githubusercontent.com/u/1163175?v=3","gravatar_id":"","url":"https://api.github.com/users/smarterclayton","html_url":"https://github.com/smarterclayton","followers_url":"https://api.github.com/users/smarterclayton/followers","following_url":"https://api.github.com/users/smarterclayton/following{/other_user}","gists_url":"https://api.github.com/users/smarterclayton/gists{/gist_id}","starred_url":"https://api.github.com/users/smarterclayton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smarterclayton/subscriptions","organizations_url":"https://api.github.com/users/smarterclayton/orgs","repos_url":"https://api.github.com/users/smarterclayton/repos","events_url":"https://api.github.com/users/smarterclayton/events{/privacy}","received_events_url":"https://api.github.com/users/smarterclayton/received_events","type":"User","site_admin":false},"body":"Actually - type is the name of the image.  So if we have two ootb images, \"origin-haproxy-router\" and \"origin-f5-integration\", you can say --type=f5-integration and it will use \"origin-f5-integration\"\n\n----- Original Message -----\n> > +\t\t\t\tbulk := configcmd.Bulk{\n> > +\t\t\t\t\tFactory: f.Factory,\n> > +\t\t\t\t\tCommand: cmd,\n> > +\t\t\t\t\tAfter:   configcmd.NewPrintNameOrErrorAfter(out, os.Stderr),\n> > +\t\t\t\t}\n> > +\t\t\t\tif errs := bulk.Create(list, namespace); len(errs) != 0 {\n> > +\t\t\t\t\tos.Exit(1)\n> > +\t\t\t\t}\n> > +\t\t\t\treturn\n> > +\t\t\t}\n> > +\n> > +\t\t\tglog.Infof(\"Router %q service exists\", name)\n> > +\t\t},\n> > +\t}\n> > +\n> > +\tcmd.Flags().StringVar(&cfg.Type, \"type\", \"haproxy-router\", \"The type of\n> > router to use - if you specify --images this flag may be ignored.\")\n> \n> @sosiouxme Here is my interpretation of the type arg: the router type and\n> image are related but not the same thing.  In the plugin architecture we\n> have a router infrastructure command (`openshift-router`) that is expected\n> to be in the router image as the entry point.  The `openshift-router`\n> command is what creates the plugin to communicate with the underlying\n> implementation.  It currently supports only one type, the template router.\n> When more types are supported we will pass the type to `openshift-router`\n> so it knows what config is required and which plugin to create.\n> \n> So for example, you could create a router with `-type template -image\n> apache`.  The command would start a pod with the specified image, specify\n> the `openshift-router` command with the required type/config, the command\n> would start the plugin.\n> \n> It's all done manually today in the docker images but these can be passed as\n> commands in the generated pod template:\n> \n> `ENTRYPOINT [\"/usr/bin/openshift-router\",\n> \"--template=/var/lib/haproxy/conf/haproxy-config.template\",\n> \"--reload=/var/lib/haproxy/reload-haproxy\"]`\n> \n> \n> ---\n> Reply to this email directly or view it on GitHub:\n> https://github.com/openshift/origin/pull/1043/files#r24933624\n","created_at":"2015-02-18T20:36:55Z","updated_at":"2015-02-18T20:36:55Z","html_url":"https://github.com/openshift/origin/pull/1043#discussion_r24938098","pull_request_url":"https://api.github.com/repos/openshift/origin/pulls/1043","_links":{"self":{"href":"https://api.github.com/repos/openshift/origin/pulls/comments/24938098"},"html":{"href":"https://github.com/openshift/origin/pull/1043#discussion_r24938098"},"pull_request":{"href":"https://api.github.com/repos/openshift/origin/pulls/1043"}}},"pull_request":{"url":"https://api.github.com/repos/openshift/origin/pulls/1043","id":29419872,"html_url":"https://github.com/openshift/origin/pull/1043","diff_url":"https://github.com/openshift/origin/pull/1043.diff","patch_url":"https://github.com/openshift/origin/pull/1043.patch","issue_url":"https://api.github.com/repos/openshift/origin/issues/1043","number":1043,"state":"open","locked":false,"title":"WIP - Add a router command to install / check routers","user":{"login":"smarterclayton","id":1163175,"avatar_url":"https://avatars.githubusercontent.com/u/1163175?v=3","gravatar_id":"","url":"https://api.github.com/users/smarterclayton","html_url":"https://github.com/smarterclayton","followers_url":"https://api.github.com/users/smarterclayton/followers","following_url":"https://api.github.com/users/smarterclayton/following{/other_user}","gists_url":"https://api.github.com/users/smarterclayton/gists{/gist_id}","starred_url":"https://api.github.com/users/smarterclayton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smarterclayton/subscriptions","organizations_url":"https://api.github.com/users/smarterclayton/orgs","repos_url":"https://api.github.com/users/smarterclayton/repos","events_url":"https://api.github.com/users/smarterclayton/events{/privacy}","received_events_url":"https://api.github.com/users/smarterclayton/received_events","type":"User","site_admin":false},"body":"@deads2k @derekwaynecarr - the first commit here cleans up the experimental\ncommands to share a lot more logic with cli, and unifies the factories.  Please\nreview your respective commands (if you have good test coverage, you shouldn't\nworry... :))\n\n@pweil- see the second commit for steps to generate the router on the fly.","created_at":"2015-02-17T05:56:05Z","updated_at":"2015-02-18T20:36:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9e546dbeca0652557580261cdc633bdbdb21ac1e","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/openshift/origin/pulls/1043/commits","review_comments_url":"https://api.github.com/repos/openshift/origin/pulls/1043/comments","review_comment_url":"https://api.github.com/repos/openshift/origin/pulls/comments/{number}","comments_url":"https://api.github.com/repos/openshift/origin/issues/1043/comments","statuses_url":"https://api.github.com/repos/openshift/origin/statuses/4319591e8cee6c4b7fcea6a3611ab9da10561c9b","head":{"label":"smarterclayton:add_router_command","ref":"add_router_command","sha":"4319591e8cee6c4b7fcea6a3611ab9da10561c9b","user":{"login":"smarterclayton","id":1163175,"avatar_url":"https://avatars.githubusercontent.com/u/1163175?v=3","gravatar_id":"","url":"https://api.github.com/users/smarterclayton","html_url":"https://github.com/smarterclayton","followers_url":"https://api.github.com/users/smarterclayton/followers","following_url":"https://api.github.com/users/smarterclayton/following{/other_user}","gists_url":"https://api.github.com/users/smarterclayton/gists{/gist_id}","starred_url":"https://api.github.com/users/smarterclayton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smarterclayton/subscriptions","organizations_url":"https://api.github.com/users/smarterclayton/orgs","repos_url":"https://api.github.com/users/smarterclayton/repos","events_url":"https://api.github.com/users/smarterclayton/events{/privacy}","received_events_url":"https://api.github.com/users/smarterclayton/received_events","type":"User","site_admin":false},"repo":{"id":22921364,"name":"origin","full_name":"smarterclayton/origin","owner":{"login":"smarterclayton","id":1163175,"avatar_url":"https://avatars.githubusercontent.com/u/1163175?v=3","gravatar_id":"","url":"https://api.github.com/users/smarterclayton","html_url":"https://github.com/smarterclayton","followers_url":"https://api.github.com/users/smarterclayton/followers","following_url":"https://api.github.com/users/smarterclayton/following{/other_user}","gists_url":"https://api.github.com/users/smarterclayton/gists{/gist_id}","starred_url":"https://api.github.com/users/smarterclayton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smarterclayton/subscriptions","organizations_url":"https://api.github.com/users/smarterclayton/orgs","repos_url":"https://api.github.com/users/smarterclayton/repos","events_url":"https://api.github.com/users/smarterclayton/events{/privacy}","received_events_url":"https://api.github.com/users/smarterclayton/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/smarterclayton/origin","description":"OpenShift 3 - build, deploy, and manage your applications with Docker and Kubernetes","fork":true,"url":"https://api.github.com/repos/smarterclayton/origin","forks_url":"https://api.github.com/repos/smarterclayton/origin/forks","keys_url":"https://api.github.com/repos/smarterclayton/origin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/smarterclayton/origin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/smarterclayton/origin/teams","hooks_url":"https://api.github.com/repos/smarterclayton/origin/hooks","issue_events_url":"https://api.github.com/repos/smarterclayton/origin/issues/events{/number}","events_url":"https://api.github.com/repos/smarterclayton/origin/events","assignees_url":"https://api.github.com/repos/smarterclayton/origin/assignees{/user}","branches_url":"https://api.github.com/repos/smarterclayton/origin/branches{/branch}","tags_url":"https://api.github.com/repos/smarterclayton/origin/tags","blobs_url":"https://api.github.com/repos/smarterclayton/origin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/smarterclayton/origin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/smarterclayton/origin/git/refs{/sha}","trees_url":"https://api.github.com/repos/smarterclayton/origin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/smarterclayton/origin/statuses/{sha}","languages_url":"https://api.github.com/repos/smarterclayton/origin/languages","stargazers_url":"https://api.github.com/repos/smarterclayton/origin/stargazers","contributors_url":"https://api.github.com/repos/smarterclayton/origin/contributors","subscribers_url":"https://api.github.com/repos/smarterclayton/origin/subscribers","subscription_url":"https://api.github.com/repos/smarterclayton/origin/subscription","commits_url":"https://api.github.com/repos/smarterclayton/origin/commits{/sha}","git_commits_url":"https://api.github.com/repos/smarterclayton/origin/git/commits{/sha}","comments_url":"https://api.github.com/repos/smarterclayton/origin/comments{/number}","issue_comment_url":"https://api.github.com/repos/smarterclayton/origin/issues/comments/{number}","contents_url":"https://api.github.com/repos/smarterclayton/origin/contents/{+path}","compare_url":"https://api.github.com/repos/smarterclayton/origin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/smarterclayton/origin/merges","archive_url":"https://api.github.com/repos/smarterclayton/origin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/smarterclayton/origin/downloads","issues_url":"https://api.github.com/repos/smarterclayton/origin/issues{/number}","pulls_url":"https://api.github.com/repos/smarterclayton/origin/pulls{/number}","milestones_url":"https://api.github.com/repos/smarterclayton/origin/milestones{/number}","notifications_url":"https://api.github.com/repos/smarterclayton/origin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/smarterclayton/origin/labels{/name}","releases_url":"https://api.github.com/repos/smarterclayton/origin/releases{/id}","created_at":"2014-08-13T15:49:23Z","updated_at":"2014-08-13T15:47:38Z","pushed_at":"2015-02-18T18:24:00Z","git_url":"git://github.com/smarterclayton/origin.git","ssh_url":"git@github.com:smarterclayton/origin.git","clone_url":"https://github.com/smarterclayton/origin.git","svn_url":"https://github.com/smarterclayton/origin","homepage":"https://openshift.github.io","size":39379,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"openshift:master","ref":"master","sha":"dacf1599478ef158987a4fe6432714ac6b199682","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}","created_at":"2014-07-30T20:04:05Z","updated_at":"2015-02-18T19:08:14Z","pushed_at":"2015-02-18T19:08:14Z","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":"https://openshift.github.io","size":57592,"stargazers_count":283,"watchers_count":283,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":149,"mirror_url":null,"open_issues_count":87,"forks":149,"open_issues":87,"watchers":283,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openshift/origin/pulls/1043"},"html":{"href":"https://github.com/openshift/origin/pull/1043"},"issue":{"href":"https://api.github.com/repos/openshift/origin/issues/1043"},"comments":{"href":"https://api.github.com/repos/openshift/origin/issues/1043/comments"},"review_comments":{"href":"https://api.github.com/repos/openshift/origin/pulls/1043/comments"},"review_comment":{"href":"https://api.github.com/repos/openshift/origin/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/openshift/origin/pulls/1043/commits"},"statuses":{"href":"https://api.github.com/repos/openshift/origin/statuses/4319591e8cee6c4b7fcea6a3611ab9da10561c9b"}}}}