{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/70841347","id":70841347,"diff_hunk":"@@ -0,0 +1,280 @@\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 set\n+\n+import (\n+\t\"fmt\"\n+\t\"io\"\n+\n+\t\"github.com/renstrom/dedent\"\n+\t\"github.com/spf13/cobra\"\n+\t\"k8s.io/kubernetes/pkg/api\"\n+\t\"k8s.io/kubernetes/pkg/api/meta\"\n+\t\"k8s.io/kubernetes/pkg/api/unversioned\"\n+\t\"k8s.io/kubernetes/pkg/kubectl\"\n+\tcmdutil \"k8s.io/kubernetes/pkg/kubectl/cmd/util\"\n+\t\"k8s.io/kubernetes/pkg/kubectl/resource\"\n+\t\"k8s.io/kubernetes/pkg/runtime\"\n+\tutilerrors \"k8s.io/kubernetes/pkg/util/errors\"\n+)\n+\n+// SelectorOptions is the start of the data required to perform the operation.  As new fields are added, add them here instead of\n+// referencing the cmd.Flags()\n+type SelectorOptions struct {\n+\tMapper      meta.RESTMapper\n+\tTyper       runtime.ObjectTyper\n+\tInfos       []*resource.Info\n+\tEncoder     runtime.Encoder\n+\tOut         io.Writer\n+\tErr         io.Writer\n+\tFilenames   []string\n+\tRecursive   bool\n+\tShortOutput bool\n+\tOverwrite   bool\n+\tAll         bool\n+\tRecord      bool\n+\tChangeCause string\n+\tLocal       bool\n+\tDryRun      bool\n+\tCmd         *cobra.Command\n+\n+\tPrintObject             func(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error\n+\tUpdateSelectorForObject func(obj runtime.Object, fn func(*map[string]string, *unversioned.LabelSelector) error) error\n+\tResources               []string\n+\tSelector                *unversioned.LabelSelector\n+}\n+\n+var (\n+\tselectorLong = dedent.Dedent(`\n+\t\tUpdate the selectors on a resource.\n+\n+\t\tA selector must begin with a letter or number, and may contain letters, numbers, hyphens, dots, and underscores, up to %[1]d characters.\n+\t\tIf --overwrite is true, then existing selectors can be overwritten, otherwise attempting to overwrite a selector will result in an error.\n+\t\tIf --resource-version is specified, then updates will use this resource version, otherwise the existing resource-version will be used.`)\n+\tselectorExample = dedent.Dedent(`\n+\t\t# Update rc 'foo' with the selector 'unhealthy' and the value 'true'.\n+\t\tkubectl set selector rc foo unhealthy=true\n+\n+\t\t# Update all deployments in the namespace\n+\t\tkubectl set selector deployment --all 'environment in (production, qa)'\n+\n+\t\t# Update a rs identified by the type and name in \"rs.json\"\n+\t\tkubectl set selector -f rs.json 'environment notin (frontend)'\n+\n+\t\t# Update service 'foo' only if the resource is unchanged from version 1.\n+\t\tkubectl set selector service foo status=unhealthy --resource-version=1`)\n+)\n+\n+// NewCmdSelector is the \"set selector\" command.\n+func NewCmdSelector(f *cmdutil.Factory, out io.Writer) *cobra.Command {\n+\toptions := &SelectorOptions{\n+\t\tOut: out,\n+\t}\n+\n+\tcmd := &cobra.Command{\n+\t\tUse:     \"selector [--overwrite] (-f FILENAME | TYPE NAME) EXPRESSIONS [--resource-version=version]\",\n+\t\tShort:   \"Update the selectors on a resource\",\n+\t\tLong:    fmt.Sprintf(selectorLong),\n+\t\tExample: selectorExample,\n+\t\tRun: func(cmd *cobra.Command, args []string) {\n+\t\t\tcmdutil.CheckErr(options.Complete(f, cmd, args))\n+\t\t\tcmdutil.CheckErr(options.Validate())\n+\t\t\tcmdutil.CheckErr(options.Run())\n+\t\t},\n+\t}\n+\tcmdutil.AddPrinterFlags(cmd)\n+\tcmd.Flags().Bool(\"all\", false, \"Select all resources in the namespace of the specified resource types\")\n+\tcmd.Flags().String(\"resource-version\", \"\", \"If non-empty, the selectors update will only succeed if this is the current resource-version for the object. Only valid when specifying a single resource.\")\n+\tusage := \"Filename, directory, or URL to a file identifying the resource to update the selectors\"\n+\tcmd.Flags().Bool(\"overwrite\", false, \"If true, allow selectors to be overwritten, otherwise reject selector updates that overwrite existing selectors.\")\n+\tkubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage)\n+\tcmdutil.AddRecursiveFlag(cmd, &options.Recursive)\n+\tcmdutil.AddDryRunFlag(cmd)\n+\tcmdutil.AddRecordFlag(cmd)\n+\tcmdutil.AddInclude3rdPartyFlags(cmd)\n+\n+\treturn cmd\n+}\n+\n+// Complete assigns the SelectorOptions from args.\n+func (o *SelectorOptions) Complete(f *cmdutil.Factory, cmd *cobra.Command, args []string) error {\n+\to.Mapper, o.Typer = f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd))\n+\to.UpdateSelectorForObject = f.UpdateSelectorForObject\n+\to.Encoder = f.JSONEncoder()\n+\to.ShortOutput = cmdutil.GetFlagString(cmd, \"output\") == \"name\"\n+\to.Record = cmdutil.GetRecordFlag(cmd)\n+\to.DryRun = cmdutil.GetDryRunFlag(cmd)\n+\to.Overwrite = cmdutil.GetFlagBool(cmd, \"overwrite\")\n+\to.ChangeCause = f.Command()\n+\to.PrintObject = f.PrintObject\n+\to.Cmd = cmd\n+\n+\tcmdNamespace, enforceNamespace, err := f.DefaultNamespace()\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\to.Resources, o.Selector, err = getResourcesAndSelector(args)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\tbuilder := resource.NewBuilder(o.Mapper, o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)).\n+\t\tContinueOnError().\n+\t\tNamespaceParam(cmdNamespace).DefaultNamespace().\n+\t\tFilenameParam(enforceNamespace, o.Recursive, o.Filenames...).\n+\t\tFlatten()\n+\tif !o.Local {\n+\t\tbuilder = builder.\n+\t\t\tResourceTypeOrNameArgs(o.All, o.Resources...).\n+\t\t\tLatest()\n+\t}\n+\to.Infos, err = builder.Do().Infos()\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\treturn nil\n+}\n+\n+// Validate basic inputs\n+func (o *SelectorOptions) Validate() error {\n+\tif len(o.Resources) < 1 && len(o.Filenames) == 0 {\n+\t\treturn fmt.Errorf(\"one or more resources must be specified as <resource> <name> or <resource>/<name>\")\n+\t}\n+\treturn nil\n+}\n+\n+// copyMatchLabels copy match labels from src to dst\n+func copyMatchLabels(dst *map[string]string, src *map[string]string, overwrite bool) error {\n+\tif overwrite {\n+\t\t*dst = make(map[string]string)\n+\t}\n+\tif !overwrite {\n+\t\tfor label := range *src {\n+\t\t\t_, exists := (*dst)[label]\n+\t\t\tif exists {\n+\t\t\t\treturn fmt.Errorf(\"MatchLabel %v exists, use --overwrite to replace it\", label)\n+\t\t\t}\n+\t\t}\n+\t}\n+\tfor label, value := range *src {\n+\t\t_, exists := (*dst)[label]\n+\t\tif overwrite || !exists {\n+\t\t\t(*dst)[label] = value\n+\t\t}\n+\t}\n+\treturn nil\n+}\n+\n+// copySelector copy match labels and match expressions from src to dst\n+func copySelector(dst *unversioned.LabelSelector, src *unversioned.LabelSelector, overwrite bool) error {\n+\tcopyMatchLabels(&dst.MatchLabels, &src.MatchLabels, overwrite)\n+\tif overwrite || dst.MatchExpressions == nil {\n+\t\tdst.MatchExpressions = make([]unversioned.LabelSelectorRequirement, len(src.MatchExpressions))\n+\t}\n+\tif overwrite {\n+\t\tcopy(dst.MatchExpressions, src.MatchExpressions)\n+\t\treturn nil\n+\t}\n+\tfor _, srcExp := range src.MatchExpressions {\n+\t\tfor _, dstExp := range dst.MatchExpressions {\n+\t\t\tif srcExp.Key == dstExp.Key {\n+\t\t\t\treturn fmt.Errorf(\"MatchExpression %v exists, use --overwrite to replace it\", srcExp.Key)\n+\t\t\t}\n+\t\t}\n+\t}\n+\tfor _, srcExp := range src.MatchExpressions {\n+\t\tdst.MatchExpressions = append(dst.MatchExpressions, srcExp)\n+\t}\n+\treturn nil\n+}\n+\n+// Run the command.\n+func (o *SelectorOptions) Run() error {\n+\tallErrs := []error{}\n+\n+\tpatches := CalculatePatches(o.Infos, o.Encoder, func(info *resource.Info) (bool, error) {\n+\t\terr := o.UpdateSelectorForObject(info.Object, func(map_selector *map[string]string, selector *unversioned.LabelSelector) error {\n+\t\t\tif map_selector != nil {\n+\t\t\t\tif len(o.Selector.MatchExpressions) > 0 {\n+\t\t\t\t\treturn fmt.Errorf(\"error: MatchExpression %v not supported on this object\", o.Selector.MatchExpressions)\n+\t\t\t\t}\n+\t\t\t\terr := copyMatchLabels(map_selector, &o.Selector.MatchLabels, o.Overwrite)\n+\t\t\t\tif err != nil {\n+\t\t\t\t\treturn err\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif selector != nil {\n+\t\t\t\terr := copySelector(selector, o.Selector, o.Overwrite)\n+\t\t\t\tif err != nil {\n+\t\t\t\t\treturn err\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\treturn nil\n+\t\t})\n+\t\treturn true, err\n+\t})\n+\n+\tfor _, patch := range patches {\n+\t\tinfo := patch.Info\n+\t\tif patch.Err != nil {\n+\t\t\tallErrs = append(allErrs, fmt.Errorf(\"error: %s/%s %v\\n\", info.Mapping.Resource, info.Name, patch.Err))\n+\t\t\tcontinue\n+\t\t}\n+\t\t// no changes\n+\t\tif string(patch.Patch) == \"{}\" || len(patch.Patch) == 0 {\n+\t\t\tcontinue\n+\t\t}\n+\n+\t\tif o.Local || o.DryRun {\n+\t\t\tfmt.Fprintln(o.Out, \"running in local/dryRun mode...\")\n+\t\t\treturn o.PrintObject(o.Cmd, o.Mapper, info.Object, o.Out)\n+\t\t}\n+\n+\t\t// patch the change\n+\t\tobj, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, api.StrategicMergePatchType, patch.Patch)\n+\t\tif err != nil {\n+\t\t\tallErrs = append(allErrs, fmt.Errorf(\"failed to patch selector update to template: %v\\n\", err))\n+\t\t\tcontinue\n+\t\t}\n+\t\tinfo.Refresh(obj, true)\n+\n+\t\t// record this change (for rollout history)\n+\t\tif o.Record || cmdutil.ContainsChangeCause(info) {\n+\t\t\tif err := cmdutil.RecordChangeCause(obj, o.ChangeCause); err == nil {\n+\t\t\t\tif obj, err = resource.NewHelper(info.Client, info.Mapping).Replace(info.Namespace, info.Name, false, obj); err != nil {\n+\t\t\t\t\tallErrs = append(allErrs, fmt.Errorf(\"changes to %s/%s can't be recorded: %v\\n\", info.Mapping.Resource, info.Name, err))\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\n+\t\tinfo.Refresh(obj, true)\n+\t\tcmdutil.PrintSuccess(o.Mapper, o.ShortOutput, o.Out, info.Mapping.Resource, info.Name, \"selector updated\")\n+\t}\n+\treturn utilerrors.NewAggregate(allErrs)\n+}\n+\n+// getResourcesAndSelector retrieves resources and the selector expression from the given args (assuming selectors the last arg)","path":"pkg/kubectl/cmd/set/set_selector.go","position":273,"original_position":273,"commit_id":"1e015375daf628920517b81f0b6a7745f9fe9290","original_commit_id":"1e015375daf628920517b81f0b6a7745f9fe9290","user":{"login":"deads2k","id":8225098,"avatar_url":"https://avatars.githubusercontent.com/u/8225098?v=3","gravatar_id":"","url":"https://api.github.com/users/deads2k","html_url":"https://github.com/deads2k","followers_url":"https://api.github.com/users/deads2k/followers","following_url":"https://api.github.com/users/deads2k/following{/other_user}","gists_url":"https://api.github.com/users/deads2k/gists{/gist_id}","starred_url":"https://api.github.com/users/deads2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deads2k/subscriptions","organizations_url":"https://api.github.com/users/deads2k/orgs","repos_url":"https://api.github.com/users/deads2k/repos","events_url":"https://api.github.com/users/deads2k/events{/privacy}","received_events_url":"https://api.github.com/users/deads2k/received_events","type":"User","site_admin":false},"body":"I'm not super familiar with the new label selector, but I can see that the lexer has some logic around whitespace.  Do we have another example of entering it in the CLI?  I'm not entirely sure that \"single arg at the end\" is going to be easiest option given that we optionally specify resources here.","created_at":"2016-07-14T16:52:16Z","updated_at":"2016-07-14T16:52:16Z","html_url":"https://github.com/kubernetes/kubernetes/pull/28949#discussion_r70841347","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/28949","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/70841347"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/28949#discussion_r70841347"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/28949"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/28949","id":77429779,"html_url":"https://github.com/kubernetes/kubernetes/pull/28949","diff_url":"https://github.com/kubernetes/kubernetes/pull/28949.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/28949.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/28949","number":28949,"state":"open","locked":false,"title":"Add new command \"kubectl set selector\"","user":{"login":"asalkeld","id":420707,"avatar_url":"https://avatars.githubusercontent.com/u/420707?v=3","gravatar_id":"","url":"https://api.github.com/users/asalkeld","html_url":"https://github.com/asalkeld","followers_url":"https://api.github.com/users/asalkeld/followers","following_url":"https://api.github.com/users/asalkeld/following{/other_user}","gists_url":"https://api.github.com/users/asalkeld/gists{/gist_id}","starred_url":"https://api.github.com/users/asalkeld/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asalkeld/subscriptions","organizations_url":"https://api.github.com/users/asalkeld/orgs","repos_url":"https://api.github.com/users/asalkeld/repos","events_url":"https://api.github.com/users/asalkeld/events{/privacy}","received_events_url":"https://api.github.com/users/asalkeld/received_events","type":"User","site_admin":false},"body":"This is also to aid PR #27109 (create subcommands)\r\n\r\nFixes #7296\r\n\r\n\r\n","created_at":"2016-07-14T10:02:05Z","updated_at":"2016-07-14T16:52:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"48fba1a6e56fc82220a800345ead3b112715211e","assignee":{"login":"deads2k","id":8225098,"avatar_url":"https://avatars.githubusercontent.com/u/8225098?v=3","gravatar_id":"","url":"https://api.github.com/users/deads2k","html_url":"https://github.com/deads2k","followers_url":"https://api.github.com/users/deads2k/followers","following_url":"https://api.github.com/users/deads2k/following{/other_user}","gists_url":"https://api.github.com/users/deads2k/gists{/gist_id}","starred_url":"https://api.github.com/users/deads2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deads2k/subscriptions","organizations_url":"https://api.github.com/users/deads2k/orgs","repos_url":"https://api.github.com/users/deads2k/repos","events_url":"https://api.github.com/users/deads2k/events{/privacy}","received_events_url":"https://api.github.com/users/deads2k/received_events","type":"User","site_admin":false},"assignees":[{"login":"deads2k","id":8225098,"avatar_url":"https://avatars.githubusercontent.com/u/8225098?v=3","gravatar_id":"","url":"https://api.github.com/users/deads2k","html_url":"https://github.com/deads2k","followers_url":"https://api.github.com/users/deads2k/followers","following_url":"https://api.github.com/users/deads2k/following{/other_user}","gists_url":"https://api.github.com/users/deads2k/gists{/gist_id}","starred_url":"https://api.github.com/users/deads2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deads2k/subscriptions","organizations_url":"https://api.github.com/users/deads2k/orgs","repos_url":"https://api.github.com/users/deads2k/repos","events_url":"https://api.github.com/users/deads2k/events{/privacy}","received_events_url":"https://api.github.com/users/deads2k/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/28949/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/28949/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/28949/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/1e015375daf628920517b81f0b6a7745f9fe9290","head":{"label":"asalkeld:set_selector","ref":"set_selector","sha":"1e015375daf628920517b81f0b6a7745f9fe9290","user":{"login":"asalkeld","id":420707,"avatar_url":"https://avatars.githubusercontent.com/u/420707?v=3","gravatar_id":"","url":"https://api.github.com/users/asalkeld","html_url":"https://github.com/asalkeld","followers_url":"https://api.github.com/users/asalkeld/followers","following_url":"https://api.github.com/users/asalkeld/following{/other_user}","gists_url":"https://api.github.com/users/asalkeld/gists{/gist_id}","starred_url":"https://api.github.com/users/asalkeld/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asalkeld/subscriptions","organizations_url":"https://api.github.com/users/asalkeld/orgs","repos_url":"https://api.github.com/users/asalkeld/repos","events_url":"https://api.github.com/users/asalkeld/events{/privacy}","received_events_url":"https://api.github.com/users/asalkeld/received_events","type":"User","site_admin":false},"repo":{"id":58418755,"name":"kubernetes","full_name":"asalkeld/kubernetes","owner":{"login":"asalkeld","id":420707,"avatar_url":"https://avatars.githubusercontent.com/u/420707?v=3","gravatar_id":"","url":"https://api.github.com/users/asalkeld","html_url":"https://github.com/asalkeld","followers_url":"https://api.github.com/users/asalkeld/followers","following_url":"https://api.github.com/users/asalkeld/following{/other_user}","gists_url":"https://api.github.com/users/asalkeld/gists{/gist_id}","starred_url":"https://api.github.com/users/asalkeld/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asalkeld/subscriptions","organizations_url":"https://api.github.com/users/asalkeld/orgs","repos_url":"https://api.github.com/users/asalkeld/repos","events_url":"https://api.github.com/users/asalkeld/events{/privacy}","received_events_url":"https://api.github.com/users/asalkeld/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/asalkeld/kubernetes","description":"Container Cluster Manager from Google","fork":true,"url":"https://api.github.com/repos/asalkeld/kubernetes","forks_url":"https://api.github.com/repos/asalkeld/kubernetes/forks","keys_url":"https://api.github.com/repos/asalkeld/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/asalkeld/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/asalkeld/kubernetes/teams","hooks_url":"https://api.github.com/repos/asalkeld/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/asalkeld/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/asalkeld/kubernetes/events","assignees_url":"https://api.github.com/repos/asalkeld/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/asalkeld/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/asalkeld/kubernetes/tags","blobs_url":"https://api.github.com/repos/asalkeld/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/asalkeld/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/asalkeld/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/asalkeld/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/asalkeld/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/asalkeld/kubernetes/languages","stargazers_url":"https://api.github.com/repos/asalkeld/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/asalkeld/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/asalkeld/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/asalkeld/kubernetes/subscription","commits_url":"https://api.github.com/repos/asalkeld/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/asalkeld/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/asalkeld/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/asalkeld/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/asalkeld/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/asalkeld/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/asalkeld/kubernetes/merges","archive_url":"https://api.github.com/repos/asalkeld/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/asalkeld/kubernetes/downloads","issues_url":"https://api.github.com/repos/asalkeld/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/asalkeld/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/asalkeld/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/asalkeld/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/asalkeld/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/asalkeld/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/asalkeld/kubernetes/deployments","created_at":"2016-05-10T01:04:58Z","updated_at":"2016-05-10T01:05:12Z","pushed_at":"2016-07-14T14:20:46Z","git_url":"git://github.com/asalkeld/kubernetes.git","ssh_url":"git@github.com:asalkeld/kubernetes.git","clone_url":"https://github.com/asalkeld/kubernetes.git","svn_url":"https://github.com/asalkeld/kubernetes","homepage":"http://kubernetes.io","size":281652,"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":"cdb4df8ea5bf6fef07b30d590b9a7112b64eeb0a","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-07-14T14:12:36Z","pushed_at":"2016-07-14T16:51:10Z","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":491539,"stargazers_count":15514,"watchers_count":15514,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":4878,"mirror_url":null,"open_issues_count":3925,"forks":4878,"open_issues":3925,"watchers":15514,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/28949"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/28949"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/28949"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/28949/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/28949/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/28949/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/1e015375daf628920517b81f0b6a7745f9fe9290"}}}}
{"actor":{"display_login":"deads2k"}}