mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 21:47:07 +00:00
Switch to v1.List instead of allowing the conversion fn to be provided.
This commit is contained in:
parent
72d672c3d5
commit
fd169a6218
@ -196,7 +196,6 @@ filegroup(
|
|||||||
"//pkg/kubectl/apps:all-srcs",
|
"//pkg/kubectl/apps:all-srcs",
|
||||||
"//pkg/kubectl/cmd:all-srcs",
|
"//pkg/kubectl/cmd:all-srcs",
|
||||||
"//pkg/kubectl/explain:all-srcs",
|
"//pkg/kubectl/explain:all-srcs",
|
||||||
"//pkg/kubectl/internaldeps:all-srcs",
|
|
||||||
"//pkg/kubectl/metricsutil:all-srcs",
|
"//pkg/kubectl/metricsutil:all-srcs",
|
||||||
"//pkg/kubectl/plugins:all-srcs",
|
"//pkg/kubectl/plugins:all-srcs",
|
||||||
"//pkg/kubectl/proxy:all-srcs",
|
"//pkg/kubectl/proxy:all-srcs",
|
||||||
|
@ -86,7 +86,6 @@ go_library(
|
|||||||
"//pkg/kubectl/cmd/util/editor:go_default_library",
|
"//pkg/kubectl/cmd/util/editor:go_default_library",
|
||||||
"//pkg/kubectl/cmd/util/openapi:go_default_library",
|
"//pkg/kubectl/cmd/util/openapi:go_default_library",
|
||||||
"//pkg/kubectl/explain:go_default_library",
|
"//pkg/kubectl/explain:go_default_library",
|
||||||
"//pkg/kubectl/internaldeps:go_default_library",
|
|
||||||
"//pkg/kubectl/metricsutil:go_default_library",
|
"//pkg/kubectl/metricsutil:go_default_library",
|
||||||
"//pkg/kubectl/plugins:go_default_library",
|
"//pkg/kubectl/plugins:go_default_library",
|
||||||
"//pkg/kubectl/proxy:go_default_library",
|
"//pkg/kubectl/proxy:go_default_library",
|
||||||
|
@ -34,7 +34,6 @@ import (
|
|||||||
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
|
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
||||||
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/internaldeps"
|
|
||||||
"k8s.io/kubernetes/pkg/kubectl/util/i18n"
|
"k8s.io/kubernetes/pkg/kubectl/util/i18n"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -153,7 +152,7 @@ func (p *AttachOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, argsIn [
|
|||||||
builder.ResourceNames(argsIn[0], argsIn[1])
|
builder.ResourceNames(argsIn[0], argsIn[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
obj, err := builder.Do().Object(internaldeps.ToInternalList)
|
obj, err := builder.Do().Object()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,6 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
||||||
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi"
|
"k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/internaldeps"
|
|
||||||
"k8s.io/kubernetes/pkg/kubectl/resource"
|
"k8s.io/kubernetes/pkg/kubectl/resource"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/util/i18n"
|
"k8s.io/kubernetes/pkg/kubectl/util/i18n"
|
||||||
"k8s.io/kubernetes/pkg/printers"
|
"k8s.io/kubernetes/pkg/printers"
|
||||||
@ -249,7 +248,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
obj, err := r.Object(internaldeps.ToInternalList)
|
obj, err := r.Object()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,6 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/kubectl"
|
"k8s.io/kubernetes/pkg/kubectl"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
||||||
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/internaldeps"
|
|
||||||
"k8s.io/kubernetes/pkg/kubectl/resource"
|
"k8s.io/kubernetes/pkg/kubectl/resource"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/util"
|
"k8s.io/kubernetes/pkg/kubectl/util"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/util/i18n"
|
"k8s.io/kubernetes/pkg/kubectl/util/i18n"
|
||||||
@ -205,21 +204,21 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args
|
|||||||
NamespaceParam(cmdNamespace).DefaultNamespace().
|
NamespaceParam(cmdNamespace).DefaultNamespace().
|
||||||
FilenameParam(enforceNamespace, &resource.FilenameOptions{Recursive: false, Filenames: []string{filename}}).
|
FilenameParam(enforceNamespace, &resource.FilenameOptions{Recursive: false, Filenames: []string{filename}}).
|
||||||
Do()
|
Do()
|
||||||
obj, err := request.Object(internaldeps.ToInternalList)
|
obj, err := request.Object()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var ok bool
|
var ok bool
|
||||||
// Handle filename input from stdin. The resource builder always returns an api.List
|
// Handle filename input from stdin. The resource builder always returns an api.List
|
||||||
// when creating resource(s) from a stream.
|
// when creating resource(s) from a stream.
|
||||||
if list, ok := obj.(*api.List); ok {
|
if list, ok := obj.(*v1.List); ok {
|
||||||
if len(list.Items) > 1 {
|
if len(list.Items) > 1 {
|
||||||
return cmdutil.UsageErrorf(cmd, "%s specifies multiple items", filename)
|
return cmdutil.UsageErrorf(cmd, "%s specifies multiple items", filename)
|
||||||
}
|
}
|
||||||
if len(list.Items) == 0 {
|
if len(list.Items) == 0 {
|
||||||
return cmdutil.UsageErrorf(cmd, "please make sure %s exists and is not empty", filename)
|
return cmdutil.UsageErrorf(cmd, "please make sure %s exists and is not empty", filename)
|
||||||
}
|
}
|
||||||
obj = list.Items[0]
|
obj = list.Items[0].Object
|
||||||
}
|
}
|
||||||
newRc, ok = obj.(*api.ReplicationController)
|
newRc, ok = obj.(*api.ReplicationController)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -22,7 +22,6 @@ go_library(
|
|||||||
"//pkg/kubectl/cmd/set:go_default_library",
|
"//pkg/kubectl/cmd/set:go_default_library",
|
||||||
"//pkg/kubectl/cmd/templates:go_default_library",
|
"//pkg/kubectl/cmd/templates:go_default_library",
|
||||||
"//pkg/kubectl/cmd/util:go_default_library",
|
"//pkg/kubectl/cmd/util:go_default_library",
|
||||||
"//pkg/kubectl/internaldeps:go_default_library",
|
|
||||||
"//pkg/kubectl/resource:go_default_library",
|
"//pkg/kubectl/resource:go_default_library",
|
||||||
"//pkg/kubectl/util/i18n:go_default_library",
|
"//pkg/kubectl/util/i18n:go_default_library",
|
||||||
"//pkg/util/interrupt:go_default_library",
|
"//pkg/util/interrupt:go_default_library",
|
||||||
|
@ -24,7 +24,6 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/kubectl"
|
"k8s.io/kubernetes/pkg/kubectl"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
||||||
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/internaldeps"
|
|
||||||
"k8s.io/kubernetes/pkg/kubectl/resource"
|
"k8s.io/kubernetes/pkg/kubectl/resource"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/util/i18n"
|
"k8s.io/kubernetes/pkg/kubectl/util/i18n"
|
||||||
"k8s.io/kubernetes/pkg/util/interrupt"
|
"k8s.io/kubernetes/pkg/util/interrupt"
|
||||||
@ -105,7 +104,7 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri
|
|||||||
info := infos[0]
|
info := infos[0]
|
||||||
mapping := info.ResourceMapping()
|
mapping := info.ResourceMapping()
|
||||||
|
|
||||||
obj, err := r.Object(internaldeps.ToInternalList)
|
obj, err := r.Object()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
|
||||||
|
|
||||||
go_library(
|
|
||||||
name = "go_default_library",
|
|
||||||
srcs = ["result.go"],
|
|
||||||
importpath = "k8s.io/kubernetes/pkg/kubectl/internaldeps",
|
|
||||||
visibility = ["//visibility:public"],
|
|
||||||
deps = [
|
|
||||||
"//pkg/api:go_default_library",
|
|
||||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
filegroup(
|
|
||||||
name = "package-srcs",
|
|
||||||
srcs = glob(["**"]),
|
|
||||||
tags = ["automanaged"],
|
|
||||||
visibility = ["//visibility:private"],
|
|
||||||
)
|
|
||||||
|
|
||||||
filegroup(
|
|
||||||
name = "all-srcs",
|
|
||||||
srcs = [":package-srcs"],
|
|
||||||
tags = ["automanaged"],
|
|
||||||
visibility = ["//visibility:public"],
|
|
||||||
)
|
|
@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2016 The Kubernetes Authors.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package internaldeps
|
|
||||||
|
|
||||||
import (
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
"k8s.io/kubernetes/pkg/api"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ToInternalList implements resource.ToList and is used by callers of
|
|
||||||
// Result.Object to convert multiple returned Objects into an internal
|
|
||||||
// List containing the objects.
|
|
||||||
func ToInternalList(objects []runtime.Object, version string) runtime.Object {
|
|
||||||
return &api.List{
|
|
||||||
ListMeta: metav1.ListMeta{
|
|
||||||
ResourceVersion: version,
|
|
||||||
},
|
|
||||||
Items: objects,
|
|
||||||
}
|
|
||||||
}
|
|
@ -62,7 +62,6 @@ go_test(
|
|||||||
"//pkg/api:go_default_library",
|
"//pkg/api:go_default_library",
|
||||||
"//pkg/api/testapi:go_default_library",
|
"//pkg/api/testapi:go_default_library",
|
||||||
"//pkg/api/testing:go_default_library",
|
"//pkg/api/testing:go_default_library",
|
||||||
"//pkg/kubectl/internaldeps:go_default_library",
|
|
||||||
"//vendor/github.com/ghodss/yaml:go_default_library",
|
"//vendor/github.com/ghodss/yaml:go_default_library",
|
||||||
"//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library",
|
"//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library",
|
||||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||||
|
@ -46,7 +46,6 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/testapi"
|
"k8s.io/kubernetes/pkg/api/testapi"
|
||||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/internaldeps"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func stringBody(body string) io.ReadCloser {
|
func stringBody(body string) io.ReadCloser {
|
||||||
@ -894,17 +893,17 @@ func TestMultipleObject(t *testing.T) {
|
|||||||
r, pods, svc := streamTestData()
|
r, pods, svc := streamTestData()
|
||||||
obj, err := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, api.Scheme, fakeClient(), testapi.Default.Codec()).
|
obj, err := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, api.Scheme, fakeClient(), testapi.Default.Codec()).
|
||||||
NamespaceParam("test").Stream(r, "STDIN").Flatten().
|
NamespaceParam("test").Stream(r, "STDIN").Flatten().
|
||||||
Do().Object(internaldeps.ToInternalList)
|
Do().Object()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
expected := &api.List{
|
expected := &v1.List{
|
||||||
Items: []runtime.Object{
|
Items: []runtime.RawExtension{
|
||||||
&pods.Items[0],
|
{Object: &pods.Items[0]},
|
||||||
&pods.Items[1],
|
{Object: &pods.Items[1]},
|
||||||
&svc.Items[0],
|
{Object: &svc.Items[0]},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if !apiequality.Semantic.DeepDerivative(expected, obj) {
|
if !apiequality.Semantic.DeepDerivative(expected, obj) {
|
||||||
@ -947,7 +946,7 @@ func TestSingleItemImpliedObject(t *testing.T) {
|
|||||||
NamespaceParam("test").DefaultNamespace().
|
NamespaceParam("test").DefaultNamespace().
|
||||||
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/legacy/redis-master-controller.yaml"}}).
|
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/legacy/redis-master-controller.yaml"}}).
|
||||||
Flatten().
|
Flatten().
|
||||||
Do().Object(internaldeps.ToInternalList)
|
Do().Object()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
@ -967,7 +966,7 @@ func TestSingleItemImpliedObjectNoExtension(t *testing.T) {
|
|||||||
NamespaceParam("test").DefaultNamespace().
|
NamespaceParam("test").DefaultNamespace().
|
||||||
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/pod"}}).
|
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/pod"}}).
|
||||||
Flatten().
|
Flatten().
|
||||||
Do().Object(internaldeps.ToInternalList)
|
Do().Object()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
@ -1018,12 +1017,12 @@ func TestListObject(t *testing.T) {
|
|||||||
ResourceTypeOrNameArgs(true, "pods").
|
ResourceTypeOrNameArgs(true, "pods").
|
||||||
Flatten()
|
Flatten()
|
||||||
|
|
||||||
obj, err := b.Do().Object(internaldeps.ToInternalList)
|
obj, err := b.Do().Object()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
list, ok := obj.(*api.List)
|
list, ok := obj.(*v1.List)
|
||||||
if !ok {
|
if !ok {
|
||||||
t.Fatalf("unexpected object: %#v", obj)
|
t.Fatalf("unexpected object: %#v", obj)
|
||||||
}
|
}
|
||||||
@ -1051,13 +1050,13 @@ func TestListObjectWithDifferentVersions(t *testing.T) {
|
|||||||
NamespaceParam("test").
|
NamespaceParam("test").
|
||||||
ResourceTypeOrNameArgs(true, "pods,services").
|
ResourceTypeOrNameArgs(true, "pods,services").
|
||||||
Flatten().
|
Flatten().
|
||||||
Do().Object(internaldeps.ToInternalList)
|
Do().Object()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
list, ok := obj.(*api.List)
|
list, ok := obj.(*v1.List)
|
||||||
if !ok {
|
if !ok {
|
||||||
t.Fatalf("unexpected object: %#v", obj)
|
t.Fatalf("unexpected object: %#v", obj)
|
||||||
}
|
}
|
||||||
|
@ -125,37 +125,13 @@ func (r *Result) Infos() ([]*Info, error) {
|
|||||||
return infos, err
|
return infos, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToList is a function that converts a slice of Objects into a single
|
|
||||||
// List Object. It allows callers to control whether an internal
|
|
||||||
// or external List is returned.
|
|
||||||
type ToList func([]runtime.Object, string) runtime.Object
|
|
||||||
|
|
||||||
// Compile time check to enforce that list implements the necessary interface
|
|
||||||
var _ metav1.ListInterface = &v1.List{}
|
|
||||||
var _ metav1.ListMetaAccessor = &v1.List{}
|
|
||||||
|
|
||||||
// ToV1List takes a slice of Objects + their version, and returns
|
|
||||||
// a v1.List Object containing the objects as Items
|
|
||||||
func ToV1List(objects []runtime.Object, version string) runtime.Object {
|
|
||||||
raw := []runtime.RawExtension{}
|
|
||||||
for _, o := range objects {
|
|
||||||
raw = append(raw, runtime.RawExtension{Object: o})
|
|
||||||
}
|
|
||||||
return &v1.List{
|
|
||||||
ListMeta: metav1.ListMeta{
|
|
||||||
ResourceVersion: version,
|
|
||||||
},
|
|
||||||
Items: raw,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Object returns a single object representing the output of a single visit to all
|
// Object returns a single object representing the output of a single visit to all
|
||||||
// found resources. If the Builder was a singular context (expected to return a
|
// found resources. If the Builder was a singular context (expected to return a
|
||||||
// single resource by user input) and only a single resource was found, the resource
|
// single resource by user input) and only a single resource was found, the resource
|
||||||
// will be returned as is. Otherwise, the returned resources will be part of an
|
// will be returned as is. Otherwise, the returned resources will be part of an
|
||||||
// v1.List. The ResourceVersion of the v1.List will be set only if it is identical
|
// v1.List. The ResourceVersion of the v1.List will be set only if it is identical
|
||||||
// across all infos returned.
|
// across all infos returned.
|
||||||
func (r *Result) Object(toList ToList) (runtime.Object, error) {
|
func (r *Result) Object() (runtime.Object, error) {
|
||||||
infos, err := r.Infos()
|
infos, err := r.Infos()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -184,11 +160,27 @@ func (r *Result) Object(toList ToList) (runtime.Object, error) {
|
|||||||
if len(versions) == 1 {
|
if len(versions) == 1 {
|
||||||
version = versions.List()[0]
|
version = versions.List()[0]
|
||||||
}
|
}
|
||||||
if toList == nil {
|
|
||||||
toList = ToV1List
|
return toV1List(objects, version), err
|
||||||
}
|
}
|
||||||
|
|
||||||
return toList(objects, version), err
|
// Compile time check to enforce that list implements the necessary interface
|
||||||
|
var _ metav1.ListInterface = &v1.List{}
|
||||||
|
var _ metav1.ListMetaAccessor = &v1.List{}
|
||||||
|
|
||||||
|
// toV1List takes a slice of Objects + their version, and returns
|
||||||
|
// a v1.List Object containing the objects in the Items field
|
||||||
|
func toV1List(objects []runtime.Object, version string) runtime.Object {
|
||||||
|
raw := []runtime.RawExtension{}
|
||||||
|
for _, o := range objects {
|
||||||
|
raw = append(raw, runtime.RawExtension{Object: o})
|
||||||
|
}
|
||||||
|
return &v1.List{
|
||||||
|
ListMeta: metav1.ListMeta{
|
||||||
|
ResourceVersion: version,
|
||||||
|
},
|
||||||
|
Items: raw,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResourceMapping returns a single meta.RESTMapping representing the
|
// ResourceMapping returns a single meta.RESTMapping representing the
|
||||||
|
Loading…
Reference in New Issue
Block a user