{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/74780405","id":74780405,"diff_hunk":"@@ -0,0 +1,289 @@\n+/*\n+Copyright 2016 The Kubernetes Authors.\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 azure_dd\n+\n+import (\n+\t\"fmt\"\n+\t\"os\"\n+\t\"path\"\n+\t\"strconv\"\n+\t\"strings\"\n+\t\"time\"\n+\n+\t\"github.com/Azure/azure-sdk-for-go/arm/compute\"\n+\t\"github.com/golang/glog\"\n+\t\"k8s.io/kubernetes/pkg/cloudprovider\"\n+\t\"k8s.io/kubernetes/pkg/util/exec\"\n+\t\"k8s.io/kubernetes/pkg/util/keymutex\"\n+\t\"k8s.io/kubernetes/pkg/util/mount\"\n+\t\"k8s.io/kubernetes/pkg/volume\"\n+)\n+\n+type azureDiskAttacher struct {\n+\thost    volume.VolumeHost\n+\tazureProvider azureCloudProvider\n+}\n+\n+var _ volume.Attacher = &azureDiskAttacher{}\n+\n+var _ volume.AttachableVolumePlugin = &azureDataDiskPlugin{}\n+\n+const (\n+\tcheckSleepDuration = time.Second\n+)\n+\n+// Azure doesn't allow simultanious disk attach or detach on the same instance\n+// serialize concurrent attach/detach per instance\n+var attachDetachMutex = keymutex.NewKeyMutex()\n+\n+func (plugin *azureDataDiskPlugin) NewAttacher() (volume.Attacher, error) {\n+\tazure, err := getAzureCloudProvider(plugin.host.GetCloudProvider())\n+\tif err != nil {\n+\t\tglog.V(4).Infof(\"failed to get azure provider\")\n+\t\treturn nil, err\n+\t}\n+\n+\treturn &azureDiskAttacher{\n+\t\thost:    plugin.host,\n+\t\tazureProvider: azure,\n+\t}, nil\n+}\n+\n+func (attacher *azureDiskAttacher) Attach(spec *volume.Spec, hostName string) (string, error) {\n+\tvolumeSource, err := getVolumeSource(spec)\n+\tif err != nil {\n+\t\tglog.V(2).Infof(\"failed to get azure disk spec\")\n+\t\treturn \"\", err\n+\t}\n+\tinstanceid, err := attacher.azureProvider.InstanceID(hostName)\n+\tif err != nil {\n+\t\tglog.V(2).Infof(\"failed to get azure instance id\")\n+\t\treturn \"\", fmt.Errorf(\"failed to get azure instance id for host %q\", hostName)\n+\t}\n+\tif ind := strings.LastIndex(instanceid, \"/\"); ind >= 0 {\n+\t\tinstanceid = instanceid[(ind + 1):]\n+\t}\n+\tattachDetachMutex.LockKey(instanceid)\n+\tdefer attachDetachMutex.UnlockKey(instanceid)\n+\n+\tlun, err := attacher.azureProvider.GetDiskLun(volumeSource.DiskName, volumeSource.DataDiskURI, instanceid)\n+\tif err == cloudprovider.InstanceNotFound {\n+\t\t// Log error and continue with attach\n+\t\tglog.Warningf(\n+\t\t\t\"Error checking if volume is already attached to current node (%q). Will continue and try attach anyway. err=%v\",\n+\t\t\tinstanceid, err)\n+\t}\n+\n+\tif err == nil {\n+\t\t// Volume is already attached to node.\n+\t\tglog.V(4).Infof(\"Attach operation is successful. volume %q is already attached to node %q at lun %d.\", volumeSource.DiskName, instanceid, lun)\n+\t} else {\n+\t\tlun, err = attacher.azureProvider.GetNextDiskLun(instanceid)\n+\t\tif err != nil {\n+\t\t\tglog.Warningf(\"no LUN available for instance %q\", instanceid)\n+\t\t\treturn \"\", fmt.Errorf(\"all LUNs are used, cannot attach volume %q to instance %q\", volumeSource.DiskName, instanceid)\n+\t\t}\n+\n+\t\terr = attacher.azureProvider.AttachDisk(volumeSource.DiskName, volumeSource.DataDiskURI, instanceid, lun, compute.CachingTypes(*volumeSource.CachingMode))\n+\t\tif err == nil {\n+\t\t\tglog.V(4).Infof(\"Attach operation successful: volume %q attached to node %q.\", volumeSource.DataDiskURI, instanceid)\n+\t\t} else {\n+\t\t\tglog.V(2).Infof(\"Attach volume %q to instance %q failed with %v\", volumeSource.DataDiskURI, instanceid, err)\n+\t\t\treturn \"\", fmt.Errorf(\"Attach volume %q to instance %q failed with %v\", volumeSource.DiskName, instanceid, err)\n+\t\t}\n+\t}\n+\n+\treturn strconv.Itoa(int(lun)), err\n+}\n+\n+func (attacher *azureDiskAttacher) WaitForAttach(spec *volume.Spec, lunStr string, timeout time.Duration) (string, error) {\n+\tvolumeSource, err := getVolumeSource(spec)\n+\tif err != nil {\n+\t\treturn \"\", err\n+\t}\n+\n+\tif lunStr == \"\" {\n+\t\treturn \"\", fmt.Errorf(\"WaitForAttach failed for Azure disk %q: lun is empty.\", volumeSource.DiskName)\n+\t}\n+\n+\tlun, err := strconv.Atoi(lunStr)\n+\tif err != nil {\n+\t\treturn \"\", fmt.Errorf(\"WaitForAttach: wrong lun %q\", lunStr)\n+\t}\n+\tscsiHostRescan(&osIOHandler{})\n+\tticker := time.NewTicker(checkSleepDuration)\n+\tdefer ticker.Stop()\n+\ttimer := time.NewTimer(timeout)\n+\tdefer timer.Stop()\n+\n+\tfor {\n+\t\tselect {\n+\t\tcase <-ticker.C:\n+\t\t\tglog.V(4).Infof(\"Checking Azure disk %q(lun %s) is attached.\", volumeSource.DiskName, lunStr)\n+\t\t\tdevicePath := findDiskByLun(lun, &osIOHandler{})\n+\t\t\tif devicePath != \"\" {\n+\t\t\t\tglog.V(4).Infof(\"Successfully found attached Azure disk %q(lun %s, device path %s).\", volumeSource.DiskName, lunStr, devicePath)\n+\t\t\t\treturn devicePath, nil\n+\t\t\t} else {\n+\t\t\t\t//Log error, if any, and continue checking periodically\n+\t\t\t\tglog.V(4).Infof(\"Error Stat Azure disk (%q) is attached: %v\", volumeSource.DiskName, err)\n+\t\t\t}\n+\t\tcase <-timer.C:\n+\t\t\treturn \"\", fmt.Errorf(\"Could not find attached Azure disk %q. Timeout waiting for mount paths to be created.\", volumeSource.DiskName)\n+\t\t}\n+\t}\n+}\n+\n+func (attacher *azureDiskAttacher) GetDeviceMountPath(spec *volume.Spec) (string, error) {\n+\tvolumeSource, err := getVolumeSource(spec)\n+\tif err != nil {\n+\t\treturn \"\", err\n+\t}\n+\n+\treturn makeGlobalPDPath(attacher.host, volumeSource.DiskName), nil\n+}\n+\n+func (attacher *azureDiskAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error {\n+\tmounter := attacher.host.GetMounter()\n+\tnotMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath)\n+\tif err != nil {\n+\t\tif os.IsNotExist(err) {\n+\t\t\tif err := os.MkdirAll(deviceMountPath, 0750); err != nil {\n+\t\t\t\treturn err\n+\t\t\t}\n+\t\t\tnotMnt = true\n+\t\t} else {\n+\t\t\treturn err\n+\t\t}\n+\t}\n+\n+\tvolumeSource, err := getVolumeSource(spec)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\toptions := []string{}\n+\tif spec.ReadOnly {\n+\t\toptions = append(options, \"ro\")\n+\t}\n+\tif notMnt {\n+\t\tdiskMounter := &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()}\n+\t\terr = diskMounter.FormatAndMount(devicePath, deviceMountPath, *volumeSource.FSType, options)\n+\t\tif err != nil {\n+\t\t\tos.Remove(deviceMountPath)\n+\t\t\treturn err\n+\t\t}\n+\t}\n+\treturn nil\n+}\n+\n+type azureDiskDetacher struct {\n+\tmounter mount.Interface\n+\tazureProvider azureCloudProvider\n+}\n+\n+var _ volume.Detacher = &azureDiskDetacher{}\n+\n+func (plugin *azureDataDiskPlugin) NewDetacher() (volume.Detacher, error) {\n+\tazure, err := getAzureCloudProvider(plugin.host.GetCloudProvider())\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\n+\treturn &azureDiskDetacher{\n+\t\tmounter: plugin.host.GetMounter(),\n+\t\tazureProvider: azure,\n+\t}, nil\n+}\n+\n+func (detacher *azureDiskDetacher) Detach(dev string, hostName string) error {\n+\tif dev == \"\" {\n+\t\treturn fmt.Errorf(\"invalid dev to detach: %q\", dev)\n+\t}\n+\tinstanceid, err := detacher.azureProvider.InstanceID(hostName)\n+\tif err != nil {\n+\t\treturn fmt.Errorf(\"failed to get azure instance id for host %q\", hostName)\n+\t}\n+\tif ind := strings.LastIndex(instanceid, \"/\"); ind >= 0 {\n+\t\tinstanceid = instanceid[(ind + 1):]\n+\t}\n+\tattachDetachMutex.LockKey(instanceid)","path":"pkg/volume/azure_dd/attacher.go","position":80,"original_position":224,"commit_id":"2c19625980a77d76b7e332fcfcf1a00e3a3897f0","original_commit_id":"c5320ee34905b8181883fee6e84f63bb137eeb99","user":{"login":"rootfs","id":7062400,"avatar_url":"https://avatars.githubusercontent.com/u/7062400?v=3","gravatar_id":"","url":"https://api.github.com/users/rootfs","html_url":"https://github.com/rootfs","followers_url":"https://api.github.com/users/rootfs/followers","following_url":"https://api.github.com/users/rootfs/following{/other_user}","gists_url":"https://api.github.com/users/rootfs/gists{/gist_id}","starred_url":"https://api.github.com/users/rootfs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rootfs/subscriptions","organizations_url":"https://api.github.com/users/rootfs/orgs","repos_url":"https://api.github.com/users/rootfs/repos","events_url":"https://api.github.com/users/rootfs/events{/privacy}","received_events_url":"https://api.github.com/users/rootfs/received_events","type":"User","site_admin":false},"body":"Tested again. When multiple disks are detached (or attached) in parallel, only one can proceed while the others get errors.\r\n\r\nWill remove this lock when this is no longer the case.","created_at":"2016-08-15T15:34:14Z","updated_at":"2016-08-15T15:34:14Z","html_url":"https://github.com/kubernetes/kubernetes/pull/29836#discussion_r74780405","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/29836","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/74780405"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/29836#discussion_r74780405"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/29836"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/29836","id":79496028,"html_url":"https://github.com/kubernetes/kubernetes/pull/29836","diff_url":"https://github.com/kubernetes/kubernetes/pull/29836.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/29836.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/29836","number":29836,"state":"open","locked":false,"title":"support Azure data disk volume","user":{"login":"rootfs","id":7062400,"avatar_url":"https://avatars.githubusercontent.com/u/7062400?v=3","gravatar_id":"","url":"https://api.github.com/users/rootfs","html_url":"https://github.com/rootfs","followers_url":"https://api.github.com/users/rootfs/followers","following_url":"https://api.github.com/users/rootfs/following{/other_user}","gists_url":"https://api.github.com/users/rootfs/gists{/gist_id}","starred_url":"https://api.github.com/users/rootfs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rootfs/subscriptions","organizations_url":"https://api.github.com/users/rootfs/orgs","repos_url":"https://api.github.com/users/rootfs/repos","events_url":"https://api.github.com/users/rootfs/events{/privacy}","received_events_url":"https://api.github.com/users/rootfs/received_events","type":"User","site_admin":false},"body":"This is a WIP of supporting azure data disk volume. Will add test and dynamic provisioning support once #29006 is merged\r\n\r\nreplace #25915\r\nfix #23259\r\n\r\n@kubernetes/sig-storage \r\n@colemickens @brendandburns\n\n<!-- Reviewable:start -->\n---\nThis change is [<img src=\"https://reviewable.kubernetes.io/review_button.svg\" height=\"34\" align=\"absmiddle\" alt=\"Reviewable\"/>](https://reviewable.kubernetes.io/reviews/kubernetes/kubernetes/29836)\n<!-- Reviewable:end -->\n","created_at":"2016-07-31T21:06:57Z","updated_at":"2016-08-15T15:34:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7b915effbe20dc40e35ab4325e7a38ea6382fbde","assignee":{"login":"thockin","id":5595220,"avatar_url":"https://avatars.githubusercontent.com/u/5595220?v=3","gravatar_id":"","url":"https://api.github.com/users/thockin","html_url":"https://github.com/thockin","followers_url":"https://api.github.com/users/thockin/followers","following_url":"https://api.github.com/users/thockin/following{/other_user}","gists_url":"https://api.github.com/users/thockin/gists{/gist_id}","starred_url":"https://api.github.com/users/thockin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thockin/subscriptions","organizations_url":"https://api.github.com/users/thockin/orgs","repos_url":"https://api.github.com/users/thockin/repos","events_url":"https://api.github.com/users/thockin/events{/privacy}","received_events_url":"https://api.github.com/users/thockin/received_events","type":"User","site_admin":false},"assignees":[{"login":"thockin","id":5595220,"avatar_url":"https://avatars.githubusercontent.com/u/5595220?v=3","gravatar_id":"","url":"https://api.github.com/users/thockin","html_url":"https://github.com/thockin","followers_url":"https://api.github.com/users/thockin/followers","following_url":"https://api.github.com/users/thockin/following{/other_user}","gists_url":"https://api.github.com/users/thockin/gists{/gist_id}","starred_url":"https://api.github.com/users/thockin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thockin/subscriptions","organizations_url":"https://api.github.com/users/thockin/orgs","repos_url":"https://api.github.com/users/thockin/repos","events_url":"https://api.github.com/users/thockin/events{/privacy}","received_events_url":"https://api.github.com/users/thockin/received_events","type":"User","site_admin":false},{"login":"brendandburns","id":5751682,"avatar_url":"https://avatars.githubusercontent.com/u/5751682?v=3","gravatar_id":"","url":"https://api.github.com/users/brendandburns","html_url":"https://github.com/brendandburns","followers_url":"https://api.github.com/users/brendandburns/followers","following_url":"https://api.github.com/users/brendandburns/following{/other_user}","gists_url":"https://api.github.com/users/brendandburns/gists{/gist_id}","starred_url":"https://api.github.com/users/brendandburns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brendandburns/subscriptions","organizations_url":"https://api.github.com/users/brendandburns/orgs","repos_url":"https://api.github.com/users/brendandburns/repos","events_url":"https://api.github.com/users/brendandburns/events{/privacy}","received_events_url":"https://api.github.com/users/brendandburns/received_events","type":"User","site_admin":false},{"login":"saad-ali","id":10052848,"avatar_url":"https://avatars.githubusercontent.com/u/10052848?v=3","gravatar_id":"","url":"https://api.github.com/users/saad-ali","html_url":"https://github.com/saad-ali","followers_url":"https://api.github.com/users/saad-ali/followers","following_url":"https://api.github.com/users/saad-ali/following{/other_user}","gists_url":"https://api.github.com/users/saad-ali/gists{/gist_id}","starred_url":"https://api.github.com/users/saad-ali/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/saad-ali/subscriptions","organizations_url":"https://api.github.com/users/saad-ali/orgs","repos_url":"https://api.github.com/users/saad-ali/repos","events_url":"https://api.github.com/users/saad-ali/events{/privacy}","received_events_url":"https://api.github.com/users/saad-ali/received_events","type":"User","site_admin":false},{"login":"jingxu97","id":19172805,"avatar_url":"https://avatars.githubusercontent.com/u/19172805?v=3","gravatar_id":"","url":"https://api.github.com/users/jingxu97","html_url":"https://github.com/jingxu97","followers_url":"https://api.github.com/users/jingxu97/followers","following_url":"https://api.github.com/users/jingxu97/following{/other_user}","gists_url":"https://api.github.com/users/jingxu97/gists{/gist_id}","starred_url":"https://api.github.com/users/jingxu97/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jingxu97/subscriptions","organizations_url":"https://api.github.com/users/jingxu97/orgs","repos_url":"https://api.github.com/users/jingxu97/repos","events_url":"https://api.github.com/users/jingxu97/events{/privacy}","received_events_url":"https://api.github.com/users/jingxu97/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/29836/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/29836/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/29836/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/2c19625980a77d76b7e332fcfcf1a00e3a3897f0","head":{"label":"rootfs:azuredd","ref":"azuredd","sha":"2c19625980a77d76b7e332fcfcf1a00e3a3897f0","user":{"login":"rootfs","id":7062400,"avatar_url":"https://avatars.githubusercontent.com/u/7062400?v=3","gravatar_id":"","url":"https://api.github.com/users/rootfs","html_url":"https://github.com/rootfs","followers_url":"https://api.github.com/users/rootfs/followers","following_url":"https://api.github.com/users/rootfs/following{/other_user}","gists_url":"https://api.github.com/users/rootfs/gists{/gist_id}","starred_url":"https://api.github.com/users/rootfs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rootfs/subscriptions","organizations_url":"https://api.github.com/users/rootfs/orgs","repos_url":"https://api.github.com/users/rootfs/repos","events_url":"https://api.github.com/users/rootfs/events{/privacy}","received_events_url":"https://api.github.com/users/rootfs/received_events","type":"User","site_admin":false},"repo":{"id":29694119,"name":"kubernetes","full_name":"rootfs/kubernetes","owner":{"login":"rootfs","id":7062400,"avatar_url":"https://avatars.githubusercontent.com/u/7062400?v=3","gravatar_id":"","url":"https://api.github.com/users/rootfs","html_url":"https://github.com/rootfs","followers_url":"https://api.github.com/users/rootfs/followers","following_url":"https://api.github.com/users/rootfs/following{/other_user}","gists_url":"https://api.github.com/users/rootfs/gists{/gist_id}","starred_url":"https://api.github.com/users/rootfs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rootfs/subscriptions","organizations_url":"https://api.github.com/users/rootfs/orgs","repos_url":"https://api.github.com/users/rootfs/repos","events_url":"https://api.github.com/users/rootfs/events{/privacy}","received_events_url":"https://api.github.com/users/rootfs/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rootfs/kubernetes","description":"Container Cluster Manager","fork":true,"url":"https://api.github.com/repos/rootfs/kubernetes","forks_url":"https://api.github.com/repos/rootfs/kubernetes/forks","keys_url":"https://api.github.com/repos/rootfs/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rootfs/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rootfs/kubernetes/teams","hooks_url":"https://api.github.com/repos/rootfs/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/rootfs/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/rootfs/kubernetes/events","assignees_url":"https://api.github.com/repos/rootfs/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/rootfs/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/rootfs/kubernetes/tags","blobs_url":"https://api.github.com/repos/rootfs/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rootfs/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rootfs/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/rootfs/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rootfs/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/rootfs/kubernetes/languages","stargazers_url":"https://api.github.com/repos/rootfs/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/rootfs/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/rootfs/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/rootfs/kubernetes/subscription","commits_url":"https://api.github.com/repos/rootfs/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/rootfs/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/rootfs/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/rootfs/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/rootfs/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/rootfs/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rootfs/kubernetes/merges","archive_url":"https://api.github.com/repos/rootfs/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rootfs/kubernetes/downloads","issues_url":"https://api.github.com/repos/rootfs/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/rootfs/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/rootfs/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/rootfs/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rootfs/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/rootfs/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/rootfs/kubernetes/deployments","created_at":"2015-01-22T18:48:37Z","updated_at":"2016-02-19T05:36:24Z","pushed_at":"2016-08-15T13:38:42Z","git_url":"git://github.com/rootfs/kubernetes.git","ssh_url":"git@github.com:rootfs/kubernetes.git","clone_url":"https://github.com/rootfs/kubernetes.git","svn_url":"https://github.com/rootfs/kubernetes","homepage":"http://kubernetes.io","size":306257,"stargazers_count":5,"watchers_count":5,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":5,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"64af5b074e9b085338285aa6e08dc203951cd825","user":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars.githubusercontent.com/u/13629408?v=3","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"repo":{"id":20580498,"name":"kubernetes","full_name":"kubernetes/kubernetes","owner":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars.githubusercontent.com/u/13629408?v=3","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kubernetes/kubernetes","description":"Production-Grade Container Scheduling and Management","fork":false,"url":"https://api.github.com/repos/kubernetes/kubernetes","forks_url":"https://api.github.com/repos/kubernetes/kubernetes/forks","keys_url":"https://api.github.com/repos/kubernetes/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubernetes/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubernetes/kubernetes/teams","hooks_url":"https://api.github.com/repos/kubernetes/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/kubernetes/kubernetes/events","assignees_url":"https://api.github.com/repos/kubernetes/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/kubernetes/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/kubernetes/kubernetes/tags","blobs_url":"https://api.github.com/repos/kubernetes/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubernetes/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubernetes/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubernetes/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/kubernetes/kubernetes/languages","stargazers_url":"https://api.github.com/repos/kubernetes/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/kubernetes/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/kubernetes/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/kubernetes/kubernetes/subscription","commits_url":"https://api.github.com/repos/kubernetes/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubernetes/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubernetes/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/kubernetes/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubernetes/kubernetes/merges","archive_url":"https://api.github.com/repos/kubernetes/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubernetes/kubernetes/downloads","issues_url":"https://api.github.com/repos/kubernetes/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/kubernetes/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/kubernetes/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubernetes/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/kubernetes/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/kubernetes/kubernetes/deployments","created_at":"2014-06-06T22:56:04Z","updated_at":"2016-08-15T15:09:17Z","pushed_at":"2016-08-15T15:19:39Z","git_url":"git://github.com/kubernetes/kubernetes.git","ssh_url":"git@github.com:kubernetes/kubernetes.git","clone_url":"https://github.com/kubernetes/kubernetes.git","svn_url":"https://github.com/kubernetes/kubernetes","homepage":"http://kubernetes.io","size":523318,"stargazers_count":16143,"watchers_count":16143,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":5135,"mirror_url":null,"open_issues_count":4176,"forks":5135,"open_issues":4176,"watchers":16143,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/29836"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/29836"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/29836"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/29836/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/29836/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/29836/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/2c19625980a77d76b7e332fcfcf1a00e3a3897f0"}}}}
{"actor":{"display_login":"rootfs"}}