{"action":"created","comment":{"url":"https://api.github.com/repos/vmarmol/kubernetes/pulls/comments/34221325","id":34221325,"diff_hunk":"@@ -0,0 +1,432 @@\n+/*\n+Copyright 2014 The Kubernetes Authors All rights reserved.\n+\n+Licensed under the Apache License, Version 2.0 (the \"License\");\n+you may not use this file except in compliance with the License.\n+You may obtain a copy of the License at\n+\n+    http://www.apache.org/licenses/LICENSE-2.0\n+\n+Unless required by applicable law or agreed to in writing, software\n+distributed under the License is distributed on an \"AS IS\" BASIS,\n+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+See the License for the specific language governing permissions and\n+limitations under the License.\n+*/\n+\n+package controller\n+\n+import (\n+\t\"reflect\"\n+\t\"time\"\n+\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/api\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/client\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/client/cache\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/client/record\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/controller/framework\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/fields\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/labels\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/util\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/util/workqueue\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/watch\"\n+\t\"github.com/golang/glog\"\n+)\n+\n+const (\n+\t// Daemon Controllers will periodically check that their daemons are running as expected.\n+\tFullDaemonControllerResyncPeriod = 30 * time.Second // TODO: Figure out if this time seems reasonable.\n+\t// Nodes don't need relisting.\n+\tFullNodeResyncPeriod = 0\n+\t// Daemon pods don't need relisting.\n+\tFullDaemonPodResyncPeriod = 0\n+)\n+\n+type DaemonManager struct {\n+\tkubeClient client.Interface\n+\tpodControl PodControlInterface\n+\n+\t// To allow injection of syncDaemonController for testing.\n+\tsyncHandler func(dcKey string) error\n+\t// A TTLCache of pod creates/deletes each dc expects to see\n+\texpectations ControllerExpectationsInterface\n+\t// A store of daemon controllers, populated by the podController.\n+\tdcStore cache.StoreToDaemonControllerLister\n+\t// A store of pods, populated by the podController\n+\tpodStore cache.StoreToPodLister\n+\t// A store of pods, populated by the podController\n+\tnodeStore cache.StoreToNodeLister\n+\t// Watches changes to all pods.\n+\tdcController *framework.Controller\n+\t// Watches changes to all pods\n+\tpodController *framework.Controller\n+\t// Watches changes to all nodes.\n+\tnodeController *framework.Controller\n+\t// Controllers that need to be updated.\n+\tqueue *workqueue.Type\n+}\n+\n+func NewDaemonManager(kubeClient client.Interface) *DaemonManager {\n+\teventBroadcaster := record.NewBroadcaster()\n+\teventBroadcaster.StartLogging(glog.Infof)\n+\teventBroadcaster.StartRecordingToSink(kubeClient.Events(\"\"))\n+\n+\tdm := &DaemonManager{\n+\t\tkubeClient: kubeClient,\n+\t\tpodControl: RealPodControl{\n+\t\t\tkubeClient: kubeClient,\n+\t\t\trecorder:   eventBroadcaster.NewRecorder(api.EventSource{Component: \"daemon-controller\"}),\n+\t\t},\n+\t\texpectations: NewControllerExpectations(),\n+\t\tqueue:        workqueue.New(),\n+\t}\n+\t// Manage addition/update of daemon controllers.\n+\tdm.dcStore.Store, dm.dcController = framework.NewInformer(\n+\t\t&cache.ListWatch{\n+\t\t\tListFunc: func() (runtime.Object, error) {\n+\t\t\t\treturn dm.kubeClient.DaemonControllers(api.NamespaceAll).List(labels.Everything())\n+\t\t\t},\n+\t\t\tWatchFunc: func(rv string) (watch.Interface, error) {\n+\t\t\t\treturn dm.kubeClient.DaemonControllers(api.NamespaceAll).Watch(labels.Everything(), fields.Everything(), rv)\n+\t\t\t},\n+\t\t},\n+\t\t&api.DaemonController{},\n+\t\tFullDaemonControllerResyncPeriod,\n+\t\tframework.ResourceEventHandlerFuncs{\n+\t\t\tAddFunc: func(old interface{}) {\n+\t\t\t\tglog.Infoln(\"Adding dc\")\n+\t\t\t\tdm.enqueueController(old)\n+\t\t\t},\n+\t\t\tUpdateFunc: func(old, cur interface{}) {\n+\t\t\t\tglog.Infoln(\"Updating dc\")\n+\t\t\t\tdm.enqueueController(cur)\n+\t\t\t},\n+\t\t\tDeleteFunc: func(old interface{}) {\n+\t\t\t\tglog.Infoln(\"Deleting dc\")\n+\t\t\t\tdm.enqueueController(old)\n+\t\t\t},\n+\t\t},\n+\t)\n+\t// Watch for creation/deletion of pods. The reason we watch is that we don't want a daemon controller to create/delete\n+\t// more pods until all the effects (expectations) of a daemon controller's create/delete have been observed.\n+\tdm.podStore.Store, dm.podController = framework.NewInformer(\n+\t\t&cache.ListWatch{\n+\t\t\tListFunc: func() (runtime.Object, error) {\n+\t\t\t\treturn dm.kubeClient.Pods(api.NamespaceAll).List(labels.Everything(), fields.Everything())\n+\t\t\t},\n+\t\t\tWatchFunc: func(rv string) (watch.Interface, error) {\n+\t\t\t\treturn dm.kubeClient.Pods(api.NamespaceAll).Watch(labels.Everything(), fields.Everything(), rv)\n+\t\t\t},\n+\t\t},\n+\t\t&api.Pod{},\n+\t\tFullDaemonPodResyncPeriod,\n+\t\tframework.ResourceEventHandlerFuncs{\n+\t\t\tAddFunc:    dm.addPod,\n+\t\t\tUpdateFunc: dm.updatePod, // TODO: add update function, and call it\n+\t\t\tDeleteFunc: dm.deletePod,\n+\t\t},\n+\t)\n+\t// Watch for new nodes or updates to nodes - daemons are launched on new nodes, and possibly when labels on nodes change,\n+\tdm.nodeStore.Store, dm.nodeController = framework.NewInformer(\n+\t\t&cache.ListWatch{\n+\t\t\tListFunc: func() (runtime.Object, error) {\n+\t\t\t\treturn dm.kubeClient.Nodes().List(labels.Everything(), fields.Everything())\n+\t\t\t},\n+\t\t\tWatchFunc: func(rv string) (watch.Interface, error) {\n+\t\t\t\treturn dm.kubeClient.Nodes().Watch(labels.Everything(), fields.Everything(), rv)\n+\t\t\t},\n+\t\t},\n+\t\t&api.Node{},\n+\t\tFullNodeResyncPeriod,\n+\t\tframework.ResourceEventHandlerFuncs{\n+\t\t\tAddFunc:    dm.addNode,\n+\t\t\tUpdateFunc: dm.updateNode,\n+\t\t\tDeleteFunc: func(node interface{}) {},\n+\t\t},\n+\t)\n+\tdm.syncHandler = dm.syncDaemonController\n+\treturn dm\n+}\n+\n+func (dm *DaemonManager) Run(workers int, stopCh <-chan struct{}) {\n+\tgo dm.dcController.Run(stopCh)\n+\tgo dm.podController.Run(stopCh)\n+\tgo dm.nodeController.Run(stopCh)\n+\tfor i := 0; i < workers; i++ {\n+\t\tgo util.Until(dm.worker, time.Second, stopCh)\n+\t}\n+\t<-stopCh\n+\tglog.Infof(\"Shutting down Daemon Controller Manager\")\n+\tdm.queue.ShutDown()\n+}\n+\n+func (dm *DaemonManager) worker() {\n+\tfor {\n+\t\tfunc() {\n+\t\t\tkey, quit := dm.queue.Get()\n+\t\t\tif quit {\n+\t\t\t\treturn\n+\t\t\t}\n+\t\t\tdefer dm.queue.Done(key)\n+\t\t\terr := dm.syncHandler(key.(string))\n+\t\t\tif err != nil {\n+\t\t\t\tglog.Errorf(\"Error syncing daemon controller: %v\", err)\n+\t\t\t}\n+\t\t}()\n+\t}\n+}\n+\n+func (dm *DaemonManager) enqueueAllControllers() {\n+\tdaemonControllers, err := dm.dcStore.List()\n+\tif err != nil {\n+\t\tglog.Errorf(\"Error enqueueing daemon controllers: %v\", err)\n+\t\treturn\n+\t}\n+\tfor i := range daemonControllers {\n+\t\tdm.enqueueController(&daemonControllers[i])\n+\t}\n+}\n+\n+func (dm *DaemonManager) enqueueController(obj interface{}) {\n+\tkey, err := controllerKeyFunc(obj)\n+\tif err != nil {\n+\t\tglog.Errorf(\"Couldn't get key for object %+v: %v\", obj, err)\n+\t\treturn\n+\t}\n+\tdm.queue.Add(key)\n+}\n+\n+func (dm *DaemonManager) getPodDaemonController(pod *api.Pod) *api.DaemonController {\n+\tcontrollers, err := dm.dcStore.GetPodDaemonController(pod)\n+\tif err != nil {\n+\t\tglog.V(4).Infof(\"No controllers found for pod %v, daemon manager will avoid syncing\", pod.Name)\n+\t\treturn nil\n+\t}\n+\treturn &controllers[0]","path":"pkg/controller/daemon_controller.go","position":206,"original_position":206,"commit_id":"e4f44bb5816f9dd04f52e5d2f72f742800a6d52f","original_commit_id":"ac9da2dcd88979f73ee83fb27a803705abd36b87","user":{"login":"AnanyaKumar","id":1862850,"avatar_url":"https://avatars.githubusercontent.com/u/1862850?v=3","gravatar_id":"","url":"https://api.github.com/users/AnanyaKumar","html_url":"https://github.com/AnanyaKumar","followers_url":"https://api.github.com/users/AnanyaKumar/followers","following_url":"https://api.github.com/users/AnanyaKumar/following{/other_user}","gists_url":"https://api.github.com/users/AnanyaKumar/gists{/gist_id}","starred_url":"https://api.github.com/users/AnanyaKumar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnanyaKumar/subscriptions","organizations_url":"https://api.github.com/users/AnanyaKumar/orgs","repos_url":"https://api.github.com/users/AnanyaKumar/repos","events_url":"https://api.github.com/users/AnanyaKumar/events{/privacy}","received_events_url":"https://api.github.com/users/AnanyaKumar/received_events","type":"User","site_admin":false},"body":"Added a comment to listers.GetPodDaemonController - the method returns an error iff  no matching controllers are found.","created_at":"2015-07-09T03:37:40Z","updated_at":"2015-07-09T03:37:40Z","html_url":"https://github.com/vmarmol/kubernetes/pull/2#discussion_r34221325","pull_request_url":"https://api.github.com/repos/vmarmol/kubernetes/pulls/2","_links":{"self":{"href":"https://api.github.com/repos/vmarmol/kubernetes/pulls/comments/34221325"},"html":{"href":"https://github.com/vmarmol/kubernetes/pull/2#discussion_r34221325"},"pull_request":{"href":"https://api.github.com/repos/vmarmol/kubernetes/pulls/2"}}},"pull_request":{"url":"https://api.github.com/repos/vmarmol/kubernetes/pulls/2","id":38392375,"html_url":"https://github.com/vmarmol/kubernetes/pull/2","diff_url":"https://github.com/vmarmol/kubernetes/pull/2.diff","patch_url":"https://github.com/vmarmol/kubernetes/pull/2.patch","issue_url":"https://api.github.com/repos/vmarmol/kubernetes/issues/2","number":2,"state":"open","locked":false,"title":"Daemon controller core","user":{"login":"AnanyaKumar","id":1862850,"avatar_url":"https://avatars.githubusercontent.com/u/1862850?v=3","gravatar_id":"","url":"https://api.github.com/users/AnanyaKumar","html_url":"https://github.com/AnanyaKumar","followers_url":"https://api.github.com/users/AnanyaKumar/followers","following_url":"https://api.github.com/users/AnanyaKumar/following{/other_user}","gists_url":"https://api.github.com/users/AnanyaKumar/gists{/gist_id}","starred_url":"https://api.github.com/users/AnanyaKumar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnanyaKumar/subscriptions","organizations_url":"https://api.github.com/users/AnanyaKumar/orgs","repos_url":"https://api.github.com/users/AnanyaKumar/repos","events_url":"https://api.github.com/users/AnanyaKumar/events{/privacy}","received_events_url":"https://api.github.com/users/AnanyaKumar/received_events","type":"User","site_admin":false},"body":"Code for client (including tests), kubectl get, and basic code for daemon controller core (launches a daemon on every existing node on the cluster).","created_at":"2015-06-23T23:00:39Z","updated_at":"2015-07-09T03:37:40Z","closed_at":null,"merged_at":null,"merge_commit_sha":"766ae2d014639eac098a54511fdfa65df1af8eeb","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/vmarmol/kubernetes/pulls/2/commits","review_comments_url":"https://api.github.com/repos/vmarmol/kubernetes/pulls/2/comments","review_comment_url":"https://api.github.com/repos/vmarmol/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/vmarmol/kubernetes/issues/2/comments","statuses_url":"https://api.github.com/repos/vmarmol/kubernetes/statuses/e4f44bb5816f9dd04f52e5d2f72f742800a6d52f","head":{"label":"AnanyaKumar:daemon-controller-core","ref":"daemon-controller-core","sha":"e4f44bb5816f9dd04f52e5d2f72f742800a6d52f","user":{"login":"AnanyaKumar","id":1862850,"avatar_url":"https://avatars.githubusercontent.com/u/1862850?v=3","gravatar_id":"","url":"https://api.github.com/users/AnanyaKumar","html_url":"https://github.com/AnanyaKumar","followers_url":"https://api.github.com/users/AnanyaKumar/followers","following_url":"https://api.github.com/users/AnanyaKumar/following{/other_user}","gists_url":"https://api.github.com/users/AnanyaKumar/gists{/gist_id}","starred_url":"https://api.github.com/users/AnanyaKumar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnanyaKumar/subscriptions","organizations_url":"https://api.github.com/users/AnanyaKumar/orgs","repos_url":"https://api.github.com/users/AnanyaKumar/repos","events_url":"https://api.github.com/users/AnanyaKumar/events{/privacy}","received_events_url":"https://api.github.com/users/AnanyaKumar/received_events","type":"User","site_admin":false},"repo":{"id":37498217,"name":"kubernetes","full_name":"AnanyaKumar/kubernetes","owner":{"login":"AnanyaKumar","id":1862850,"avatar_url":"https://avatars.githubusercontent.com/u/1862850?v=3","gravatar_id":"","url":"https://api.github.com/users/AnanyaKumar","html_url":"https://github.com/AnanyaKumar","followers_url":"https://api.github.com/users/AnanyaKumar/followers","following_url":"https://api.github.com/users/AnanyaKumar/following{/other_user}","gists_url":"https://api.github.com/users/AnanyaKumar/gists{/gist_id}","starred_url":"https://api.github.com/users/AnanyaKumar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnanyaKumar/subscriptions","organizations_url":"https://api.github.com/users/AnanyaKumar/orgs","repos_url":"https://api.github.com/users/AnanyaKumar/repos","events_url":"https://api.github.com/users/AnanyaKumar/events{/privacy}","received_events_url":"https://api.github.com/users/AnanyaKumar/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnanyaKumar/kubernetes","description":"Container Cluster Manager","fork":true,"url":"https://api.github.com/repos/AnanyaKumar/kubernetes","forks_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/forks","keys_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/teams","hooks_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/events","assignees_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/tags","blobs_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/languages","stargazers_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/subscription","commits_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/merges","archive_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/downloads","issues_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/AnanyaKumar/kubernetes/releases{/id}","created_at":"2015-06-16T00:14:24Z","updated_at":"2015-06-16T00:14:30Z","pushed_at":"2015-07-09T01:18:02Z","git_url":"git://github.com/AnanyaKumar/kubernetes.git","ssh_url":"git@github.com:AnanyaKumar/kubernetes.git","clone_url":"https://github.com/AnanyaKumar/kubernetes.git","svn_url":"https://github.com/AnanyaKumar/kubernetes","homepage":null,"size":82597,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"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":"vmarmol:master","ref":"master","sha":"ab8a1b63a3b7d3240feadfc5cd2eff20ea8dbb8c","user":{"login":"vmarmol","id":985208,"avatar_url":"https://avatars.githubusercontent.com/u/985208?v=3","gravatar_id":"","url":"https://api.github.com/users/vmarmol","html_url":"https://github.com/vmarmol","followers_url":"https://api.github.com/users/vmarmol/followers","following_url":"https://api.github.com/users/vmarmol/following{/other_user}","gists_url":"https://api.github.com/users/vmarmol/gists{/gist_id}","starred_url":"https://api.github.com/users/vmarmol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vmarmol/subscriptions","organizations_url":"https://api.github.com/users/vmarmol/orgs","repos_url":"https://api.github.com/users/vmarmol/repos","events_url":"https://api.github.com/users/vmarmol/events{/privacy}","received_events_url":"https://api.github.com/users/vmarmol/received_events","type":"User","site_admin":false},"repo":{"id":21019364,"name":"kubernetes","full_name":"vmarmol/kubernetes","owner":{"login":"vmarmol","id":985208,"avatar_url":"https://avatars.githubusercontent.com/u/985208?v=3","gravatar_id":"","url":"https://api.github.com/users/vmarmol","html_url":"https://github.com/vmarmol","followers_url":"https://api.github.com/users/vmarmol/followers","following_url":"https://api.github.com/users/vmarmol/following{/other_user}","gists_url":"https://api.github.com/users/vmarmol/gists{/gist_id}","starred_url":"https://api.github.com/users/vmarmol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vmarmol/subscriptions","organizations_url":"https://api.github.com/users/vmarmol/orgs","repos_url":"https://api.github.com/users/vmarmol/repos","events_url":"https://api.github.com/users/vmarmol/events{/privacy}","received_events_url":"https://api.github.com/users/vmarmol/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/vmarmol/kubernetes","description":"Container Cluster Manager","fork":true,"url":"https://api.github.com/repos/vmarmol/kubernetes","forks_url":"https://api.github.com/repos/vmarmol/kubernetes/forks","keys_url":"https://api.github.com/repos/vmarmol/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/vmarmol/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/vmarmol/kubernetes/teams","hooks_url":"https://api.github.com/repos/vmarmol/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/vmarmol/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/vmarmol/kubernetes/events","assignees_url":"https://api.github.com/repos/vmarmol/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/vmarmol/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/vmarmol/kubernetes/tags","blobs_url":"https://api.github.com/repos/vmarmol/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/vmarmol/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/vmarmol/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/vmarmol/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/vmarmol/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/vmarmol/kubernetes/languages","stargazers_url":"https://api.github.com/repos/vmarmol/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/vmarmol/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/vmarmol/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/vmarmol/kubernetes/subscription","commits_url":"https://api.github.com/repos/vmarmol/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/vmarmol/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/vmarmol/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/vmarmol/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/vmarmol/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/vmarmol/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/vmarmol/kubernetes/merges","archive_url":"https://api.github.com/repos/vmarmol/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/vmarmol/kubernetes/downloads","issues_url":"https://api.github.com/repos/vmarmol/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/vmarmol/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/vmarmol/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/vmarmol/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/vmarmol/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/vmarmol/kubernetes/releases{/id}","created_at":"2014-06-19T23:47:05Z","updated_at":"2014-10-03T15:37:19Z","pushed_at":"2015-07-09T01:17:45Z","git_url":"git://github.com/vmarmol/kubernetes.git","ssh_url":"git@github.com:vmarmol/kubernetes.git","clone_url":"https://github.com/vmarmol/kubernetes.git","svn_url":"https://github.com/vmarmol/kubernetes","homepage":null,"size":76098,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":1,"forks":2,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/vmarmol/kubernetes/pulls/2"},"html":{"href":"https://github.com/vmarmol/kubernetes/pull/2"},"issue":{"href":"https://api.github.com/repos/vmarmol/kubernetes/issues/2"},"comments":{"href":"https://api.github.com/repos/vmarmol/kubernetes/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/vmarmol/kubernetes/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/vmarmol/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/vmarmol/kubernetes/pulls/2/commits"},"statuses":{"href":"https://api.github.com/repos/vmarmol/kubernetes/statuses/e4f44bb5816f9dd04f52e5d2f72f742800a6d52f"}}}}