// New creates a Kubernetes client for the given config. This client works with pods, // replication controllers, daemons, and services. It allows operations such as list, get, update // and delete on these objects. An error is returned if the provided configuration // is not valid. func New(c *Config) (*Client, error) { config := *c if err := SetKubernetesDefaults(&config); err != nil { return nil, err } client, err := RESTClientFor(&config) if err != nil { return nil, err } discoveryConfig := *c discoveryClient, err := NewDiscoveryClient(&discoveryConfig) if err != nil { return nil, err } if _, err := registered.Group(extensions.GroupName); err != nil { return &Client{RESTClient: client, ExtensionsClient: nil, DiscoveryClient: discoveryClient}, nil } experimentalConfig := *c experimentalClient, err := NewExtensions(&experimentalConfig) if err != nil { return nil, err } return &Client{RESTClient: client, ExtensionsClient: experimentalClient, DiscoveryClient: discoveryClient}, nil }
func setConfigDefaults(config *unversioned.Config) error { // if testgroup group is not registered, return an error g, err := registered.Group("testgroup") if err != nil { return err } config.APIPath = "/apis" if config.UserAgent == "" { config.UserAgent = unversioned.DefaultKubernetesUserAgent() } // TODO: Unconditionally set the config.Version, until we fix the config. //if config.Version == "" { copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion //} versionInterfaces, err := g.InterfacesFor(*config.GroupVersion) if err != nil { return fmt.Errorf("Testgroup API version '%s' is not recognized (valid values: %s)", config.GroupVersion, g.GroupVersions) } config.Codec = versionInterfaces.Codec if config.QPS == 0 { config.QPS = 5 } if config.Burst == 0 { config.Burst = 10 } return nil }
func main() { config := genericapiserver.Config{ EnableIndex: true, APIPrefix: "/api", APIGroupPrefix: "/apis", } s := genericapiserver.New(&config) groupVersion := v1.SchemeGroupVersion groupName := groupVersion.Group groupMeta, err := registered.Group(groupName) if err != nil { glog.Fatalf("%v", err) } storageDestinations, err := newStorageDestinations(groupName, groupMeta) if err != nil { glog.Fatalf("Unable to init etcd: %v", err) } restStorageMap := map[string]rest.Storage{ "testtypes": testgroupetcd.NewREST(storageDestinations.Get(groupName, "testtype"), s.StorageDecorator()), } apiGroupInfo := genericapiserver.APIGroupInfo{ GroupMeta: *groupMeta, VersionedResourcesStorageMap: map[string]map[string]rest.Storage{ groupVersion.Version: restStorageMap, }, } if err := s.InstallAPIGroups([]genericapiserver.APIGroupInfo{apiGroupInfo}); err != nil { glog.Fatalf("Error in installing API: %v", err) } s.Run(genericapiserver.NewServerRunOptions()) }
func setExtensionsDefaults(config *Config) error { // if experimental group is not registered, return an error g, err := registered.Group(extensions.GroupName) if err != nil { return err } config.APIPath = defaultAPIPath if config.UserAgent == "" { config.UserAgent = DefaultKubernetesUserAgent() } // TODO: Unconditionally set the config.Version, until we fix the config. //if config.Version == "" { copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion //} versionInterfaces, err := g.InterfacesFor(*config.GroupVersion) if err != nil { return fmt.Errorf("Extensions API group/version '%v' is not recognized (valid values: %v)", config.GroupVersion, registered.GroupOrDie(extensions.GroupName).GroupVersions) } config.Codec = versionInterfaces.Codec if config.QPS == 0 { config.QPS = 5 } if config.Burst == 0 { config.Burst = 10 } return nil }
func (c *MasterConfig) defaultAPIGroupVersion() *apiserver.APIGroupVersion { var restMapper meta.MultiRESTMapper seenGroups := sets.String{} for _, gv := range registered.EnabledVersions() { if seenGroups.Has(gv.Group) { continue } seenGroups.Insert(gv.Group) groupMeta, err := registered.Group(gv.Group) if err != nil { continue } restMapper = meta.MultiRESTMapper(append(restMapper, groupMeta.RESTMapper)) } statusMapper := meta.NewDefaultRESTMapper([]unversioned.GroupVersion{kubeapiv1.SchemeGroupVersion}, registered.GroupOrDie(kapi.GroupName).InterfacesFor) statusMapper.Add(kubeapiv1.SchemeGroupVersion.WithKind("Status"), meta.RESTScopeRoot) restMapper = meta.MultiRESTMapper(append(restMapper, statusMapper)) return &apiserver.APIGroupVersion{ Root: OpenShiftAPIPrefix, Mapper: restMapper, Creater: kapi.Scheme, Typer: kapi.Scheme, Convertor: kapi.Scheme, Linker: registered.GroupOrDie("").SelfLinker, Admit: c.AdmissionControl, Context: c.getRequestContextMapper(), SubresourceGroupVersionKind: map[string]unversioned.GroupVersionKind{}, } }
func setConfigDefaults(config *restclient.Config) error { // if extensions group is not registered, return an error g, err := registered.Group("extensions") if err != nil { return err } config.APIPath = "/apis" if config.UserAgent == "" { config.UserAgent = restclient.DefaultKubernetesUserAgent() } // TODO: Unconditionally set the config.Version, until we fix the config. //if config.Version == "" { copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion //} codec, ok := api.Codecs.SerializerForFileExtension("json") if !ok { return fmt.Errorf("unable to find serializer for JSON") } config.Codec = codec if config.QPS == 0 { config.QPS = 5 } if config.Burst == 0 { config.Burst = 10 } return nil }
func setConfigDefaults(config *unversioned.Config) error { // if legacy group is not registered, return an error g, err := registered.Group("") if err != nil { return err } config.APIPath = "/api" if config.UserAgent == "" { config.UserAgent = unversioned.DefaultKubernetesUserAgent() } // TODO: Unconditionally set the config.Version, until we fix the config. //if config.Version == "" { copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion //} config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) if config.QPS == 0 { config.QPS = 5 } if config.Burst == 0 { config.Burst = 10 } return nil }
func setBatchDefaults(config *restclient.Config, gv *unversioned.GroupVersion) error { // if batch group is not registered, return an error g, err := registered.Group(batch.GroupName) if err != nil { return err } config.APIPath = defaultAPIPath if config.UserAgent == "" { config.UserAgent = restclient.DefaultKubernetesUserAgent() } // TODO: Unconditionally set the config.Version, until we fix the config. //if config.Version == "" { copyGroupVersion := g.GroupVersion if gv != nil { copyGroupVersion = *gv } config.GroupVersion = ©GroupVersion //} config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) config.NegotiatedSerializer = api.Codecs if config.QPS == 0 { config.QPS = 5 } if config.Burst == 0 { config.Burst = 10 } return nil }
func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, error) { switch version { case v1.SchemeGroupVersion: return &meta.VersionInterfaces{ ObjectConvertor: kapi.Scheme, MetadataAccessor: accessor, }, nil case docker10.SchemeGroupVersion: return &meta.VersionInterfaces{ ObjectConvertor: kapi.Scheme, MetadataAccessor: accessor, }, nil case dockerpre012.SchemeGroupVersion: return &meta.VersionInterfaces{ ObjectConvertor: kapi.Scheme, MetadataAccessor: accessor, }, nil default: g, _ := registered.Group(api.GroupName) return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, g.GroupVersions) } }
func setNamespace(typer runtime.ObjectTyper, obj runtime.Object, namespace string) error { itemMeta, err := meta.Accessor(obj) if err != nil { return err } gvks, _, err := typer.ObjectKinds(obj) if err != nil { return err } group, err := registered.Group(gvks[0].Group) if err != nil { return err } mapping, err := group.RESTMapper.RESTMapping(gvks[0].GroupKind(), gvks[0].Version) if err != nil { return err } switch mapping.Scope.Name() { case meta.RESTScopeNameNamespace: if len(itemMeta.GetNamespace()) == 0 { itemMeta.SetNamespace(namespace) } } return nil }
// SetKubernetesDefaults sets default values on the provided client config for accessing the // Kubernetes API or returns an error if any of the defaults are impossible or invalid. // TODO: this method needs to be split into one that sets defaults per group, expected to be fix in PR "Refactoring clientcache.go and helper.go #14592" func SetKubernetesDefaults(config *Config) error { if config.APIPath == "" { config.APIPath = legacyAPIPath } if len(config.UserAgent) == 0 { config.UserAgent = DefaultKubernetesUserAgent() } g, err := registered.Group(api.GroupName) if err != nil { return err } // TODO: Unconditionally set the config.Version, until we fix the config. copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion versionInterfaces, err := g.InterfacesFor(*config.GroupVersion) if err != nil { return fmt.Errorf("API version '%v' is not recognized (valid values: %v)", *config.GroupVersion, registered.GroupOrDie(api.GroupName).GroupVersions) } if config.Codec == nil { config.Codec = versionInterfaces.Codec } if config.QPS == 0.0 { config.QPS = 5.0 } if config.Burst == 0 { config.Burst = 10 } return nil }
func setPolicyDefaults(config *restclient.Config) error { g, err := registered.Group(policy.GroupName) if err != nil { return err } config.APIPath = defaultAPIPath if config.UserAgent == "" { config.UserAgent = restclient.DefaultKubernetesUserAgent() } // TODO: Unconditionally set the config.Version, until we fix the config. //if config.Version == "" { copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion //} config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) config.NegotiatedSerializer = api.Codecs if config.QPS == 0 { config.QPS = 5 } if config.Burst == 0 { config.Burst = 10 } return nil }
// checkNamespace makes sure that the scope of gvk matches ns. It // returns an error if namespace is empty but gvk is a namespaced // kind, or if ns is non-empty and gvk is a namespaced kind. func checkNamespace(gvk schema.GroupVersionKind, ns string) error { group, err := registered.Group(gvk.Group) if err != nil { return err } mapping, err := group.RESTMapper.RESTMapping(gvk.GroupKind(), gvk.Version) if err != nil { return err } switch mapping.Scope.Name() { case meta.RESTScopeNameRoot: if ns != "" { return fmt.Errorf("namespace specified for a non-namespaced kind %s", gvk) } case meta.RESTScopeNameNamespace: if ns == "" { // Skipping this check for Events, since // controllers emit events that have no namespace, // even though Event is a namespaced resource. if gvk.Kind != "Event" { return fmt.Errorf("no namespace specified for a namespaced kind %s", gvk) } } } return nil }
func setConfigDefaults(config *restclient.Config) error { // if core group is not registered, return an error g, err := registered.Group("") if err != nil { return err } config.APIPath = "/api" if config.UserAgent == "" { config.UserAgent = restclient.DefaultKubernetesUserAgent() } // TODO: Unconditionally set the config.Version, until we fix the config. //if config.Version == "" { copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion //} config.NegotiatedSerializer = api.Codecs if config.QPS == 0 { config.QPS = 5 } if config.Burst == 0 { config.Burst = 10 } return nil }
func setAutoscalingDefaults(config *Config) error { // if autoscaling group is not registered, return an error g, err := registered.Group(autoscaling.GroupName) if err != nil { return err } config.APIPath = defaultAPIPath if config.UserAgent == "" { config.UserAgent = DefaultKubernetesUserAgent() } // TODO: Unconditionally set the config.Version, until we fix the config. //if config.Version == "" { copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion //} config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) if config.QPS == 0 { config.QPS = 5 } if config.Burst == 0 { config.Burst = 10 } return nil }
// SetKubernetesDefaults sets default values on the provided client config for accessing the // Kubernetes API or returns an error if any of the defaults are impossible or invalid. // TODO: this method needs to be split into one that sets defaults per group, expected to be fix in PR "Refactoring clientcache.go and helper.go #14592" func SetKubernetesDefaults(config *Config) error { if config.APIPath == "" { config.APIPath = legacyAPIPath } if len(config.UserAgent) == 0 { config.UserAgent = DefaultKubernetesUserAgent() } g, err := registered.Group(api.GroupName) if err != nil { return err } // TODO: Unconditionally set the config.Version, until we fix the config. copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion if config.Codec == nil { config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) } if config.QPS == 0.0 { config.QPS = 5.0 } if config.Burst == 0 { config.Burst = 10 } return nil }
// Admit enforces that a namespace must exist in order to associate content with it. // Admit enforces that a namespace that is terminating cannot accept new content being associated with it. func (e *lifecycle) Admit(a admission.Attributes) (err error) { if len(a.GetNamespace()) == 0 { return nil } // always allow a SAR request through, the SAR will return information about // the ability to take action on the object, no need to verify it here. if isSubjectAccessReview(a) { return nil } groupMeta, err := registered.Group(a.GetKind().Group) if err != nil { return err } mapping, err := groupMeta.RESTMapper.RESTMapping(a.GetKind().GroupKind()) if err != nil { glog.V(4).Infof("Ignoring life-cycle enforcement for resource %v; no associated default version and kind could be found.", a.GetResource()) return nil } if mapping.Scope.Name() != meta.RESTScopeNameNamespace { return nil } if !e.cache.Running() { return admission.NewForbidden(a, err) } namespace, err := e.cache.GetNamespace(a.GetNamespace()) if err != nil { return admission.NewForbidden(a, err) } // in case of concurrency issues, we will retry this logic numRetries := 10 interval := time.Duration(rand.Int63n(90)+int64(10)) * time.Millisecond for retry := 1; retry <= numRetries; retry++ { // associate this namespace with openshift _, err = projectutil.Associate(e.client, namespace) if err == nil { break } // we have exhausted all reasonable efforts to retry so give up now if retry == numRetries { return admission.NewForbidden(a, err) } // get the latest namespace for the next pass in case of resource version updates time.Sleep(interval) // it's possible the namespace actually was deleted, so just forbid if this occurs namespace, err = e.client.Core().Namespaces().Get(a.GetNamespace()) if err != nil { return admission.NewForbidden(a, err) } } return nil }
// RunExplain executes the appropriate steps to print a model's documentation func RunExplain(f *cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, args []string) error { if len(args) == 0 { fmt.Fprint(cmdErr, "You must specify the type of resource to explain. ", valid_resources) return cmdutil.UsageError(cmd, "Required resource not specified.") } if len(args) > 1 { return cmdutil.UsageError(cmd, "We accept only this format: explain RESOURCE") } recursive := cmdutil.GetFlagBool(cmd, "recursive") apiVersionString := cmdutil.GetFlagString(cmd, "api-version") apiVersion := unversioned.GroupVersion{} mapper, _ := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) // TODO: After we figured out the new syntax to separate group and resource, allow // the users to use it in explain (kubectl explain <group><syntax><resource>). // Refer to issue #16039 for why we do this. Refer to PR #15808 that used "/" syntax. inModel, fieldsPath, err := kubectl.SplitAndParseResourceRequest(args[0], mapper) if err != nil { return err } // TODO: We should deduce the group for a resource by discovering the supported resources at server. fullySpecifiedGVR, groupResource := unversioned.ParseResourceArg(inModel) gvk := unversioned.GroupVersionKind{} if fullySpecifiedGVR != nil { gvk, _ = mapper.KindFor(*fullySpecifiedGVR) } if gvk.Empty() { gvk, err = mapper.KindFor(groupResource.WithVersion("")) if err != nil { return err } } if len(apiVersionString) == 0 { groupMeta, err := registered.Group(gvk.Group) if err != nil { return err } apiVersion = groupMeta.GroupVersion } else { apiVersion, err = unversioned.ParseGroupVersion(apiVersionString) if err != nil { return nil } } schema, err := f.SwaggerSchema(apiVersion.WithKind(gvk.Kind)) if err != nil { return err } return kubectl.PrintModelDescription(inModel, fieldsPath, out, schema, recursive) }
func TestUpstreamResourceToKind(t *testing.T) { // Ensure we resolve to klatest.ExternalVersions[0] meta, _ := registered.Group("") expectedGVK := meta.GroupVersion.WithKind("Pod") gvk, err := registered.RESTMapper().KindFor(kapi.SchemeGroupVersion.WithResource("Pod")) if err != nil { t.Fatalf("Unexpected error: %v", err) } if gvk != expectedGVK { t.Fatalf("Expected RESTMapper.KindFor('pod') to be %#v, got %#v", expectedGVK, gvk) } }
// InterfacesFor returns the default Codec and ResourceVersioner for a given version // string, or an error if the version is not known. func interfacesFor(version schema.GroupVersion) (*meta.VersionInterfaces, error) { switch version { case core_v1.SchemeGroupVersion: return &meta.VersionInterfaces{ ObjectConvertor: core.Scheme, MetadataAccessor: accessor, }, nil default: g, _ := registered.Group(core.GroupName) return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, g.GroupVersions) } }
// interfacesFor returns the default Codec and ResourceVersioner for a given version // string, or an error if the version is not known. func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, error) { switch version { case v1beta1.SchemeGroupVersion: return &meta.VersionInterfaces{ Codec: v1beta1.Codec, ObjectConvertor: api.Scheme, MetadataAccessor: accessor, }, nil default: g, _ := registered.Group(extensions.GroupName) return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, g.GroupVersions) } }
func Run(serverOptions *genericoptions.ServerRunOptions, stopCh <-chan struct{}) error { // Set ServiceClusterIPRange _, serviceClusterIPRange, _ := net.ParseCIDR("10.0.0.0/24") serverOptions.ServiceClusterIPRange = *serviceClusterIPRange serverOptions.StorageConfig.ServerList = []string{"http://127.0.0.1:2379"} genericvalidation.ValidateRunOptions(serverOptions) genericvalidation.VerifyEtcdServersList(serverOptions) config := genericapiserver.NewConfig().ApplyOptions(serverOptions).Complete() if err := config.MaybeGenerateServingCerts(); err != nil { // this wasn't treated as fatal for this process before fmt.Printf("Error creating cert: %v", err) } config.Authorizer = authorizer.NewAlwaysAllowAuthorizer() config.SwaggerConfig = genericapiserver.DefaultSwaggerConfig() s, err := config.New() if err != nil { return fmt.Errorf("Error in bringing up the server: %v", err) } groupVersion := v1.SchemeGroupVersion groupName := groupVersion.Group groupMeta, err := registered.Group(groupName) if err != nil { return fmt.Errorf("%v", err) } storageFactory := newStorageFactory() storageConfig, err := storageFactory.NewConfig(unversioned.GroupResource{Group: groupName, Resource: "testtype"}) if err != nil { return fmt.Errorf("Unable to get storage config: %v", err) } restStorageMap := map[string]rest.Storage{ "testtypes": testgroupetcd.NewREST(storageConfig, generic.UndecoratedStorage), } apiGroupInfo := genericapiserver.APIGroupInfo{ GroupMeta: *groupMeta, VersionedResourcesStorageMap: map[string]map[string]rest.Storage{ groupVersion.Version: restStorageMap, }, Scheme: api.Scheme, NegotiatedSerializer: api.Codecs, } if err := s.InstallAPIGroup(&apiGroupInfo); err != nil { return fmt.Errorf("Error in installing API: %v", err) } s.PrepareRun().Run(stopCh) return nil }
// SetKubernetesDefaults sets default values on the provided client config for accessing the // Kubernetes API or returns an error if any of the defaults are impossible or invalid. // TODO: this method needs to be split into one that sets defaults per group, expected to be fix in PR "Refactoring clientcache.go and helper.go #14592" func SetKubernetesDefaults(config *restclient.Config) error { if config.APIPath == "" { config.APIPath = legacyAPIPath } g, err := registered.Group(api.GroupName) if err != nil { return err } // TODO: Unconditionally set the config.Version, until we fix the config. copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion if config.NegotiatedSerializer == nil { config.NegotiatedSerializer = api.Codecs } return restclient.SetKubernetesDefaults(config) }
// DefaultMultiRESTMapper returns the multi REST mapper with all OpenShift and // Kubernetes objects already registered. func DefaultMultiRESTMapper() meta.MultiRESTMapper { var restMapper meta.MultiRESTMapper seenGroups := sets.String{} for _, gv := range registered.EnabledVersions() { if seenGroups.Has(gv.Group) { continue } seenGroups.Insert(gv.Group) groupMeta, err := registered.Group(gv.Group) if err != nil { continue } restMapper = meta.MultiRESTMapper(append(restMapper, groupMeta.RESTMapper)) } return restMapper }
// Check whether the kind in groupVersion is scoped at the root of the api hierarchy func isNamespacedKind(kind, groupVersion string) (bool, error) { group := apiutil.GetGroup(groupVersion) g, err := registered.Group(group) if err != nil { return false, err } restMapping, err := g.RESTMapper.RESTMapping(unversioned.GroupKind{Group: group, Kind: kind}, apiutil.GetVersion(groupVersion)) if err != nil { return false, err } scopeName := restMapping.Scope.Name() if scopeName == meta.RESTScopeNameNamespace { return true, nil } return false, nil }
// SetKubernetesDefaults sets default values on the provided client config for accessing the // Kubernetes API or returns an error if any of the defaults are impossible or invalid. // TODO: this method needs to be split into one that sets defaults per group, expected to be fix in PR "Refactoring clientcache.go and helper.go #14592" func SetKubernetesDefaults(config *restclient.Config) error { if config.APIPath == "" { config.APIPath = legacyAPIPath } if config.GroupVersion == nil || config.GroupVersion.Group != api.GroupName { g, err := registered.Group(api.GroupName) if err != nil { return err } copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion } if config.NegotiatedSerializer == nil { config.NegotiatedSerializer = api.Codecs } return restclient.SetKubernetesDefaults(config) }
func (o *DefaultResourceEncodingConfig) InMemoryEncodingFor(resource unversioned.GroupResource) (unversioned.GroupVersion, error) { if _, err := registered.Group(resource.Group); err != nil { return unversioned.GroupVersion{}, err } groupEncoding, groupExists := o.Groups[resource.Group] if !groupExists { return unversioned.GroupVersion{Group: resource.Group, Version: runtime.APIVersionInternal}, nil } resourceOverride, resourceExists := groupEncoding.InternalResourceEncodings[resource.Resource] if !resourceExists { return groupEncoding.DefaultInternalEncoding, nil } return resourceOverride, nil }
// RunExplain executes the appropriate steps to print a model's documentation func RunExplain(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string) error { if len(args) != 1 { return cmdutil.UsageError(cmd, "We accept only this format: explain RESOURCE") } recursive := cmdutil.GetFlagBool(cmd, "recursive") apiVersionString := cmdutil.GetFlagString(cmd, "api-version") apiVersion := unversioned.GroupVersion{} mapper, _ := f.Object() // TODO: After we figured out the new syntax to separate group and resource, allow // the users to use it in explain (kubectl explain <group><syntax><resource>). // Refer to issue #16039 for why we do this. Refer to PR #15808 that used "/" syntax. inModel, fieldsPath, err := kubectl.SplitAndParseResourceRequest(args[0], mapper) if err != nil { return err } // TODO: We should deduce the group for a resource by discovering the supported resources at server. gvk, err := mapper.KindFor(unversioned.GroupVersionResource{Resource: inModel}) if err != nil { return err } if len(apiVersionString) == 0 { groupMeta, err := registered.Group(gvk.Group) if err != nil { return err } apiVersion = groupMeta.GroupVersion } else { apiVersion, err = unversioned.ParseGroupVersion(apiVersionString) if err != nil { return nil } } schema, err := f.SwaggerSchema(apiVersion) if err != nil { return err } return kubectl.PrintModelDescription(inModel, fieldsPath, out, schema, recursive) }
func setAppsDefaults(config *restclient.Config) error { g, err := registered.Group(apps.GroupName) if err != nil { return err } config.APIPath = defaultAPIPath if config.UserAgent == "" { config.UserAgent = restclient.DefaultKubernetesUserAgent() } // TODO: Unconditionally set the config.Version, until we fix the config. //if config.Version == "" { copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion //} config.NegotiatedSerializer = api.Codecs return nil }
func setGroupDefaults(groupName string, config *restclient.Config) error { config.APIPath = defaultAPIPath if config.UserAgent == "" { config.UserAgent = restclient.DefaultKubernetesUserAgent() } if config.GroupVersion == nil || config.GroupVersion.Group != groupName { g, err := registered.Group(groupName) if err != nil { return err } copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion } if config.NegotiatedSerializer == nil { config.NegotiatedSerializer = api.Codecs } return nil }