// NewClient returns a new client based on the passed in config. The // codec is ignored, as the dynamic client uses it's own codec. func NewClient(conf *rest.Config) (*Client, error) { // avoid changing the original config confCopy := *conf conf = &confCopy // TODO: it's questionable that this should be using anything other than unstructured schema and JSON conf.ContentType = runtime.ContentTypeJSON conf.AcceptContentTypes = runtime.ContentTypeJSON if conf.APIPath == "" { conf.APIPath = "/api" } if len(conf.UserAgent) == 0 { conf.UserAgent = rest.DefaultKubernetesUserAgent() } if conf.NegotiatedSerializer == nil { streamingInfo, _ := api.Codecs.StreamingSerializerForMediaType("application/json;stream=watch", nil) conf.NegotiatedSerializer = serializer.NegotiatedSerializerWrapper(runtime.SerializerInfo{Serializer: dynamicCodec{}}, streamingInfo) } cl, err := rest.RESTClientFor(conf) if err != nil { return nil, err } return &Client{cl: cl}, nil }
// ClientForGroupVersion returns a client for the specified groupVersion, creates one if none exists func (c *clientPoolImpl) ClientForGroupVersion(groupVersion unversioned.GroupVersion) (*Client, error) { c.lock.Lock() defer c.lock.Unlock() // do we have a client already configured? if existingClient, found := c.clients[groupVersion]; found { return existingClient, nil } // avoid changing the original config confCopy := *c.config conf := &confCopy // we need to set the api path based on group version, if no group, default to legacy path conf.APIPath = c.apiPathResolverFunc(groupVersion) // we need to make a client conf.GroupVersion = &groupVersion if conf.NegotiatedSerializer == nil { streamingInfo, _ := api.Codecs.StreamingSerializerForMediaType("application/json;stream=watch", nil) conf.NegotiatedSerializer = serializer.NegotiatedSerializerWrapper(runtime.SerializerInfo{Serializer: dynamicCodec{}}, streamingInfo) } dynamicClient, err := NewClient(conf) if err != nil { return nil, err } c.clients[groupVersion] = dynamicClient return dynamicClient, nil }
// ContentConfig returns a rest.ContentConfig for dynamic types. func ContentConfig() rest.ContentConfig { // TODO: it's questionable that this should be using anything other than unstructured schema and JSON codec := dynamicCodec{} streamingInfo, _ := api.Codecs.StreamingSerializerForMediaType("application/json;stream=watch", nil) return rest.ContentConfig{ AcceptContentTypes: runtime.ContentTypeJSON, ContentType: runtime.ContentTypeJSON, NegotiatedSerializer: serializer.NegotiatedSerializerWrapper(runtime.SerializerInfo{Serializer: codec}, streamingInfo), } }
func setDiscoveryDefaults(config *rest.Config) error { config.APIPath = "" config.GroupVersion = nil codec := runtime.NoopEncoder{Decoder: api.Codecs.UniversalDecoder()} config.NegotiatedSerializer = serializer.NegotiatedSerializerWrapper( runtime.SerializerInfo{Serializer: codec}, runtime.StreamSerializerInfo{}, ) if len(config.UserAgent) == 0 { config.UserAgent = rest.DefaultKubernetesUserAgent() } return nil }