{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/42833216","id":42833216,"diff_hunk":"@@ -0,0 +1,381 @@\n+# API Types package layout\n+\n+We have written tooling around api types and will write more. This document\n+seeks to prescribe an organizational layout for types packages and their\n+associated generated files.\n+\n+Explicit goals are:\n+* Organizing our chaos.\n+* Make the toolchain easy to understand and use.\n+* Reduce the package import graph to a minimum for any given use case.\n+* Make it possible to set up a Kubernetes-style types directory in an arbitrary\n+  location; decouple our tools and github repository.\n+* Coordinate among those who will or might write autogeneration.\n+* Where does validation code go? How is it called?\n+* Where does conversion code go? How is it called?\n+* Where does defaulting code go? How is it called?\n+* Where are validation/conversion/defaulting functions registered?\n+\n+Non-goals for this document:\n+* apiserver usage of these types.\n+* apiserver swagger generation for types.\n+* removing the \"internal\" version.\n+* Where does deep-copy code go? How is it called? (Deep copy is more general\n+  than API types.)\n+\n+These will be covered in another document.\n+\n+## Current state\n+\n+Currently, we have api types in two places, `pkg/api` and `pkg/apis/`. The\n+former has many things that are general to all apis and needs to be split, but I\n+include everything for completeness.\n+\n+```\n+pkg/api/\n+├── context.go\n+├── context_test.go\n+├── conversion.go\n+├── conversion_test.go\n+├── copy_test.go\n+├── deep_copy_generated.go\n+├── deep_copy_test.go\n+├── doc.go\n+├── endpoints\n+│   ├── util.go\n+│   └── util_test.go\n+├── errors\n+│   ├── doc.go\n+│   ├── errors.go\n+│   ├── errors_test.go\n+│   └── etcd\n+│       ├── doc.go\n+│       └── etcd.go\n+├── generate.go\n+├── generate_test.go\n+├── helpers.go\n+├── helpers_test.go\n+├── install\n+│   ├── install.go\n+│   └── install_test.go\n+├── latest\n+│   ├── doc.go\n+│   ├── latest.go\n+│   └── latest_test.go\n+├── mapper.go\n+├── meta\n+│   ├── doc.go\n+│   ├── interfaces.go\n+│   ├── meta.go\n+│   ├── meta_test.go\n+│   ├── restmapper.go\n+│   └── restmapper_test.go\n+├── meta.go\n+├── meta_test.go\n+├── node_example.json\n+├── pod_example.json\n+├── ref.go\n+├── ref_test.go\n+├── registered\n+│   └── registered.go\n+├── register.go\n+├── replication_controller_example.json\n+├── requestcontext.go\n+├── resource\n+│   ├── quantity_example_test.go\n+│   ├── quantity.go\n+│   ├── quantity_test.go\n+│   └── suffix.go\n+├── resource_helpers.go\n+├── resource_helpers_test.go\n+├── rest\n+│   ├── create.go\n+│   ├── create_test.go\n+│   ├── delete.go\n+│   ├── doc.go\n+│   ├── rest.go\n+│   ├── resttest\n+│   │   └── resttest.go\n+│   ├── types.go\n+│   ├── update.go\n+│   └── update_test.go\n+├── serialization_test.go\n+├── testapi\n+│   ├── testapi.go\n+│   └── testapi_test.go\n+├── testing\n+│   ├── compat\n+│   │   └── compatibility_tester.go\n+│   ├── fuzzer.go\n+│   └── pod_specs.go\n+├── types.generated.go\n+├── types.go\n+├── unversioned\n+│   ├── duration.go\n+│   ├── duration_test.go\n+│   ├── time.go\n+│   ├── time_test.go\n+│   ├── types.go\n+│   └── types_swagger_doc_generated.go\n+├── util\n+│   ├── group_version.go\n+│   └── group_version_test.go\n+├── v1\n+│   ├── backward_compatibility_test.go\n+│   ├── conversion_generated.go\n+│   ├── conversion.go\n+│   ├── conversion_test.go\n+│   ├── deep_copy_generated.go\n+│   ├── defaults.go\n+│   ├── defaults_test.go\n+│   ├── doc.go\n+│   ├── register.go\n+│   ├── types.generated.go\n+│   ├── types.go\n+│   └── types_swagger_doc_generated.go\n+└── validation\n+    ├── doc.go\n+    ├── events.go\n+    ├── events_test.go\n+    ├── schema.go\n+    ├── schema_test.go\n+    ├── testdata\n+    │   └── v1\n+    │       ├── invalidPod1.json\n+    │       ├── invalidPod2.json\n+    │       ├── invalidPod3.json\n+    │       ├── invalidPod.yaml\n+    │       └── validPod.yaml\n+    ├── validation.go\n+    └── validation_test.go\n+\n+```\n+\n+The api in `pkg/apis` is closer to where we want to be.\n+\n+```\n+pkg/apis/\n+└── extensions\n+    ├── deep_copy_generated.go\n+    ├── helpers.go\n+    ├── helpers_test.go\n+    ├── install\n+    │   ├── install.go\n+    │   └── install_test.go\n+    ├── register.go\n+    ├── types.generated.go\n+    ├── types.go\n+    ├── v1beta1\n+    │   ├── conversion_generated.go\n+    │   ├── conversion.go\n+    │   ├── deep_copy_generated.go\n+    │   ├── defaults.go\n+    │   ├── defaults_test.go\n+    │   ├── register.go\n+    │   ├── types.generated.go\n+    │   ├── types.go\n+    │   └── types_swagger_doc_generated.go\n+    └── validation\n+        ├── validation.go\n+        └── validation_test.go\n+```\n+\n+## Desired directory structure\n+\n+We want to define a standard layout and structure for Kubernetes API types.\n+Below is a first draft, with explanation afterwards. We may try to move the\n+relevant parts of the legacy `pkg/api/v1` api into the new structure, although\n+this api doesn't have a group.\n+\n+```\n+apis\n+└── group\n+    ├── install\n+    ├── types.go\n+    ├── v1\n+    │   ├── install\n+    │   │   ├── conversion\n+    │   │   │   ├── generated_conversion.go\n+    │   │   │   └── manual_conversion_overrides.go\n+    │   │   ├── defaulting\n+    │   │   │   ├── generated_defaulters.go\n+    │   │   │   └── generated_default_stubs.go\n+    │   │   └── validation\n+    │   │       ├── generated_validation.go\n+    │   │       └── generated_validation_stubs.go\n+    │   └── types.go\n+    ├── v1beta1\n+    │   ├── install\n+    │   │   ├── conversion\n+    │   │   │   ├── generated_conversion.go\n+    │   │   │   └── manual_conversion_overrides.go\n+    │   │   ├── defaulting\n+    │   │   │   ├── generated_defaulters.go\n+    │   │   │   └── generated_default_stubs.go\n+    │   │   └── validation\n+    │   │       ├── generated_validation.go\n+    │   │       └── generated_validation_stubs.go\n+    │   └── types.go\n+    └── v2alpha1\n+        ├── install\n+        │   ├── conversion\n+        │   │   ├── generated_conversion.go\n+        │   │   └── manual_conversion_overrides.go\n+        │   ├── defaulting\n+        │   │   ├── generated_defaulters.go\n+        │   │   └── generated_default_stubs.go\n+        │   └── validation\n+        │       ├── generated_validation.go\n+        │       └── generated_validation_stubs.go\n+        └── types.go\n+```\n+\n+### Package: `apis/`\n+\n+Multiple groups may live in the same tree. Each group gets its own directory\n+under `apis/`. We'll assume an `apis/` directory of this structure in all tools.\n+\n+TBD: Either test code will live here, or no code.\n+\n+### Package: `apis/group/`\n+\n+Multiple versions live in a group. Each version gets its own subdirectory.\n+\n+Additionally, a types.go file contains an \"internal\" version of the group's\n+objects. This file is used as a destination/source for conversion functions.\n+\n+### Package: `apis/group/install`\n+\n+This package installs *all* of the versions of the group.\n+\n+### Package: `apis/group/v1`\n+\n+'v1' is taken to be the current stable version of this api.\n+\n+`types.go` contains the types for this version of the api group.\n+\n+This package has tightly controlled imports. It's allowed to include the\n+Kubernetes unversioned API types (to be moved to `pkg/apis/unversioned`) and\n+little else. In particular, it *must not* import its parent `apis/group`.\n+\n+### Package: `apis/group/v1/install`\n+\n+This package, if imported, registers the v1 version of this group, its\n+conversion, validation, and defaulting functions.\n+\n+We have separate install packages for every version to allow deliberate import\n+choices to be made.\n+\n+### Package: `apis/group/v1/install/conversion`\n+\n+This package contains conversion functions, and if imported, will register them.\n+\n+There are two sorts of conversion functions: those which could be automatically\n+generated, and those which have manual additions. All the conversion functions\n+convert to & from the types in the parent `apis/groups` and `apis/groups/v1`\n+directories.\n+\n+### Package: `apis/group/v1/install/defaulting`\n+\n+This package contains defaulting functions, and if imported, will register them.\n+\n+The functions apply to only the `group/v1` types, *not* the parent `group/`\n+types.\n+\n+There are two sorts of defaulting functions, those that can be automatically\n+written and those that need human attention.\n+\n+The former will be autogenerated by looking for `// +default=<value>` comments\n+preceding the types or their embedded struct members. Similarly, a\n+`// +default=custom` marker will force a stub to be generated. Stubs will be\n+generated with a `panic(\"write me!\")` marker to ensure that they are populated.\n+\n+### Package: `apis/group/v1/install/validation`\n+\n+This package contains validation functions, and if imported, will register them.\n+\n+The functions apply to only the `group/v1` types, *not* the parent `group/`\n+types.\n+\n+The allowed imports are constrained; in particular, nothing that would let you\n+do RPCs to look up other cluster state is allowed. Validation functions validate\n+*only* the object, not cluster-wide or other constraints, which must be validate\n+elsewhere. (TODO: copy-pasta this 2x above)\n+\n+There are two sorts of validation functions, those that can be automatically\n+written and those that need human attention.\n+\n+The former will be autogenerated by looking for directives in the comments\n+preceding the types or their embedded struct members. Allowed directives will\n+include:\n+* `// +validate_min=<numeric value>,validate_max=<numeric value>`\n+* `// +validate_regexp=<regexp>`\n+* `// +validate_exact=<exact value>`","path":"docs/proposals/api-types-package-structure.md","position":313,"original_position":313,"commit_id":"1522c9b6300dcdf7eff9253107c3415ccdc29f70","original_commit_id":"1522c9b6300dcdf7eff9253107c3415ccdc29f70","user":{"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},"body":"Agree with @wojtek-t - we might eventually have declarative validators, but we should start with every field being custom.\r\n\r\nWe need clarity on what it means to default or validate a _field_ vs a _type_.  For primitives, obviously we are validating each instance of int or string independently.  What about typedef'ed primitives?  If I typedef FooBar as string, should I apply the same validation to every FooBar or does validation differ for every instance of FooBar?   What about structs?  It seems pretty obvious that you don't want to validate different instances of FooStruct differently...","created_at":"2015-10-23T04:57:38Z","updated_at":"2015-10-23T04:57:38Z","html_url":"https://github.com/kubernetes/kubernetes/pull/16062#discussion_r42833216","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16062","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/42833216"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/16062#discussion_r42833216"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16062"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16062","id":48392038,"html_url":"https://github.com/kubernetes/kubernetes/pull/16062","diff_url":"https://github.com/kubernetes/kubernetes/pull/16062.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/16062.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/16062","number":16062,"state":"open","locked":false,"title":"[draft] API type structure","user":{"login":"lavalamp","id":647318,"avatar_url":"https://avatars.githubusercontent.com/u/647318?v=3","gravatar_id":"","url":"https://api.github.com/users/lavalamp","html_url":"https://github.com/lavalamp","followers_url":"https://api.github.com/users/lavalamp/followers","following_url":"https://api.github.com/users/lavalamp/following{/other_user}","gists_url":"https://api.github.com/users/lavalamp/gists{/gist_id}","starred_url":"https://api.github.com/users/lavalamp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lavalamp/subscriptions","organizations_url":"https://api.github.com/users/lavalamp/orgs","repos_url":"https://api.github.com/users/lavalamp/repos","events_url":"https://api.github.com/users/lavalamp/events{/privacy}","received_events_url":"https://api.github.com/users/lavalamp/received_events","type":"User","site_admin":false},"body":"#15730 talked about client package arrangement. This is about the general package structure, usable in both server and client.\r\n\r\nI think the following people will be interested in this: @thockin @bgrant0607 @krousey @smarterclayton @wojtek-t ","created_at":"2015-10-21T21:43:02Z","updated_at":"2015-10-23T04:57:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"45624eebefa0015621a3497b54552f33c85a7b22","assignee":{"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},"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16062/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16062/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/16062/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/1522c9b6300dcdf7eff9253107c3415ccdc29f70","head":{"label":"lavalamp:types-doc","ref":"types-doc","sha":"1522c9b6300dcdf7eff9253107c3415ccdc29f70","user":{"login":"lavalamp","id":647318,"avatar_url":"https://avatars.githubusercontent.com/u/647318?v=3","gravatar_id":"","url":"https://api.github.com/users/lavalamp","html_url":"https://github.com/lavalamp","followers_url":"https://api.github.com/users/lavalamp/followers","following_url":"https://api.github.com/users/lavalamp/following{/other_user}","gists_url":"https://api.github.com/users/lavalamp/gists{/gist_id}","starred_url":"https://api.github.com/users/lavalamp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lavalamp/subscriptions","organizations_url":"https://api.github.com/users/lavalamp/orgs","repos_url":"https://api.github.com/users/lavalamp/repos","events_url":"https://api.github.com/users/lavalamp/events{/privacy}","received_events_url":"https://api.github.com/users/lavalamp/received_events","type":"User","site_admin":false},"repo":{"id":20749157,"name":"kubernetes","full_name":"lavalamp/kubernetes","owner":{"login":"lavalamp","id":647318,"avatar_url":"https://avatars.githubusercontent.com/u/647318?v=3","gravatar_id":"","url":"https://api.github.com/users/lavalamp","html_url":"https://github.com/lavalamp","followers_url":"https://api.github.com/users/lavalamp/followers","following_url":"https://api.github.com/users/lavalamp/following{/other_user}","gists_url":"https://api.github.com/users/lavalamp/gists{/gist_id}","starred_url":"https://api.github.com/users/lavalamp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lavalamp/subscriptions","organizations_url":"https://api.github.com/users/lavalamp/orgs","repos_url":"https://api.github.com/users/lavalamp/repos","events_url":"https://api.github.com/users/lavalamp/events{/privacy}","received_events_url":"https://api.github.com/users/lavalamp/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/lavalamp/kubernetes","description":"Container Cluster Manager","fork":true,"url":"https://api.github.com/repos/lavalamp/kubernetes","forks_url":"https://api.github.com/repos/lavalamp/kubernetes/forks","keys_url":"https://api.github.com/repos/lavalamp/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lavalamp/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lavalamp/kubernetes/teams","hooks_url":"https://api.github.com/repos/lavalamp/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/lavalamp/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/lavalamp/kubernetes/events","assignees_url":"https://api.github.com/repos/lavalamp/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/lavalamp/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/lavalamp/kubernetes/tags","blobs_url":"https://api.github.com/repos/lavalamp/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lavalamp/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lavalamp/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/lavalamp/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lavalamp/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/lavalamp/kubernetes/languages","stargazers_url":"https://api.github.com/repos/lavalamp/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/lavalamp/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/lavalamp/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/lavalamp/kubernetes/subscription","commits_url":"https://api.github.com/repos/lavalamp/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/lavalamp/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/lavalamp/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/lavalamp/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/lavalamp/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/lavalamp/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lavalamp/kubernetes/merges","archive_url":"https://api.github.com/repos/lavalamp/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lavalamp/kubernetes/downloads","issues_url":"https://api.github.com/repos/lavalamp/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/lavalamp/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/lavalamp/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/lavalamp/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lavalamp/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/lavalamp/kubernetes/releases{/id}","created_at":"2014-06-12T00:36:13Z","updated_at":"2014-12-05T22:04:19Z","pushed_at":"2015-10-21T21:40:20Z","git_url":"git://github.com/lavalamp/kubernetes.git","ssh_url":"git@github.com:lavalamp/kubernetes.git","clone_url":"https://github.com/lavalamp/kubernetes.git","svn_url":"https://github.com/lavalamp/kubernetes","homepage":null,"size":121777,"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":"kubernetes:master","ref":"master","sha":"236193a26d1c4a3e0646b46c8f0b0653c82a462b","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":"Container Cluster Manager from Google","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}","created_at":"2014-06-06T22:56:04Z","updated_at":"2015-10-23T04:00:46Z","pushed_at":"2015-10-23T04:33:50Z","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":496547,"stargazers_count":10828,"watchers_count":10828,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2754,"mirror_url":null,"open_issues_count":2118,"forks":2754,"open_issues":2118,"watchers":10828,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16062"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/16062"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/16062"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/16062/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16062/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16062/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/1522c9b6300dcdf7eff9253107c3415ccdc29f70"}}}}