Change:
My broke it for v1beta3, then fixed it for v1beta3 and broke it for v1beta1. I'm working on a fix.
Honestly I'm very surprised that more people aren't complaining-- integration test logs are full of noise because of this.
Exact text of error log is "Failed to watch *api.Node: field label not supported: "
cc

Discussion:
return r } <del> /* // ParseSelectorParam parses the given string as a resource selector. // This is a convenience function so you don't have to first check that it's a // validly formatted selector. func (r *Request) ParseSelectorParam(paramName, item string) *Request { if r.err != nil { return r </del> <ins> const ( // A constant that clients can use to refer in a field selector to the object name field. // Will be automatically emitted as the correct name for the API version. ObjectNameField = "metadata.name" PodHost         = "spec.host" ) type clientFieldNameToAPIVersionFieldName map[string]string func (c clientFieldNameToAPIVersionFieldName) filterField(field, value string) (newField, newValue string, err error) { newFieldName, ok := c[field] if !ok { return "", "", fmt.Errorf("%v - %v - no field mapping defined", field, value) </ins> } <del> var selector string var err error switch paramName { case "labels": var lsel labels.Selector if lsel, err = labels.Parse(item); err == nil { selector = lsel.String() } case "fields": var fsel fields.Selector if fsel, err = fields.ParseSelector(item); err == nil { selector = fsel.String() } default: err = fmt.Errorf("unknown parameter name '%s'", paramName) </del> <ins> return newFieldName, value, nil } type resourceTypeToFieldMapping map[string]clientFieldNameToAPIVersionFieldName func (r resourceTypeToFieldMapping) filterField(resourceType, field, value string) (newField, newValue string, err error) { fMapping, ok := r[resourceType] if !ok { return "", "", fmt.Errorf("%v - %v - %v - no field mapping defined", resourceType, field, value) </ins> } <del> if err != nil { r.err = err return r </del> <ins> return fMapping.filterField(field, value) } type versionToResourceToFieldMapping map[string]resourceTypeToFieldMapping func (v versionToResourceToFieldMapping) filterField(apiVersion, resourceType, field, value string) (newField, newValue string, err error) { rMapping, ok := v[apiVersion] if !ok { glog.Warningf("field selector: %v - %v - %v - %v: need to check if this is versioned correctly.", apiVersion, resourceType, field, value) return field, value, nil </ins> } <del> return r.setParam(paramName, selector) }*/ </del> <ins> newField, newValue, err = rMapping.filterField(resourceType, field, value) if err != nil { // This is only a warning until we find and fix all of the client's usages. glog.Warningf("field selector: %v - %v - %v - %v: need to check if this is versioned correctly.", apiVersion, resourceType, field, value) return field, value, nil } return newField, newValue, nil } var fieldMappings = versionToResourceToFieldMapping{ "v1beta1": resourceTypeToFieldMapping{ "nodes": clientFieldNameToAPIVersionFieldName{ ObjectNameField: "name", }, "minions": clientFieldNameToAPIVersionFieldName{ ObjectNameField: "name", }, "pods": clientFieldNameToAPIVersionFieldName{ PodHost: "DesiredState.Host", }, }, "v1beta2": resourceTypeToFieldMapping{ "nodes": clientFieldNameToAPIVersionFieldName{ ObjectNameField: "name", }, "minions": clientFieldNameToAPIVersionFieldName{ ObjectNameField: "name", }, "pods": clientFieldNameToAPIVersionFieldName{ PodHost: "DesiredState.Host", }, }, "v1beta3": resourceTypeToFieldMapping{ "nodes": clientFieldNameToAPIVersionFieldName{ ObjectNameField: "metadata.name", }, "minions": clientFieldNameToAPIVersionFieldName{ ObjectNameField: "metadata.name", }, "pods": clientFieldNameToAPIVersionFieldName{ PodHost: "spec.host", }, }, } </ins> // FieldsSelectorParam adds the given selector as a query parameter with the name paramName. func (r *Request) FieldsSelectorParam(s fields.Selector) *Request {

if s.Empty() { return r } <del> return r.setParam(api.FieldSelectorQueryParam(r.apiVersion), s.String()) </del> <ins> s2, err := s.Transform(func(field, value string) (newField, newValue string, err error) { return fieldMappings.filterField(r.apiVersion, r.resource, field, value) }) if err != nil { r.err = err return r } return r.setParam(api.FieldSelectorQueryParam(r.apiVersion), s2.String()) </ins> } // LabelsSelectorParam adds the given selector as a query parameter

) // NewSourceApiserver creates a config source that watches and pulls from the apiserver. <del> func NewSourceApiserver(client *client.Client, hostname string, updates chan<- interface{}) { lw := cache.NewListWatchFromClient(client, "pods", api.NamespaceAll, fields.OneTermEqualSelector(getHostFieldLabel(client.APIVersion()), hostname)) </del> <ins> func NewSourceApiserver(c *client.Client, hostname string, updates chan<- interface{}) { lw := cache.NewListWatchFromClient(c, "pods", api.NamespaceAll, fields.OneTermEqualSelector(client.PodHost, hostname)) </ins> newSourceApiserverFromLW(lw, updates) }

if kubeClient != nil { // TODO: cache.NewListWatchFromClient is limited as it takes a client implementation rather // than an interface. There is no way to construct a list+watcher using resource name. <del> fieldSelector := fields.Set{"metadata.name": hostname}.AsSelector() </del> <ins> fieldSelector := fields.Set{client.ObjectNameField: hostname}.AsSelector() </ins> listWatch := &cache.ListWatch{ ListFunc: func() (runtime.Object, error) { // TODO: Use List() with fieldSelector when it is supported.

// Returns a cache.ListWatch that finds all pods that need to be // scheduled. func (factory *ConfigFactory) createUnassignedPodLW() *cache.ListWatch { <del> return cache.NewListWatchFromClient(factory.Client, "pods", api.NamespaceAll, fields.Set{getHostFieldLabel(factory.Client.APIVersion()): ""}.AsSelector()) </del> <ins> return cache.NewListWatchFromClient(factory.Client, "pods", api.NamespaceAll, fields.Set{client.PodHost: ""}.AsSelector()) </ins> } func parseSelectorOrDie(s string) fields.Selector {

// TODO: return a ListerWatcher interface instead? func (factory *ConfigFactory) createAssignedPodLW() *cache.ListWatch { return cache.NewListWatchFromClient(factory.Client, "pods", api.NamespaceAll, <del> parseSelectorOrDie(getHostFieldLabel(factory.Client.APIVersion())+"!=")) </del> <ins> parseSelectorOrDie(client.PodHost+"!=")) </ins> } // createMinionLW returns a cache.ListWatch that gets all changes to minions.

} } <del> func getHostFieldLabel(apiVersion string) string { switch apiVersion { case "v1beta1", "v1beta2": return "DesiredState.Host" default: return "spec.host" } } </del> // nodeEnumerator allows a cache.Poller to enumerate items in an api.NodeList type nodeEnumerator struct { *api.NodeList