mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 05:27:21 +00:00
Merge pull request #41384 from xilabao/support-create-subresource
Automatic merge from submit-queue support subresource when running kubectl create role ``` #kubect create role foo --verb=get,list,watch --resource=pods/status the server doesn't have a resource type "pods/status" ```
This commit is contained in:
commit
d59cf76a61
@ -3016,20 +3016,47 @@ runTests() {
|
|||||||
kube::test::get_object_assert rolebinding/sarole "{{range.subjects}}{{.name}}:{{end}}" 'sa-name:'
|
kube::test::get_object_assert rolebinding/sarole "{{range.subjects}}{{.name}}:{{end}}" 'sa-name:'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
########
|
||||||
|
# Role #
|
||||||
|
########
|
||||||
if kube::test::if_supports_resource "${roles}" ; then
|
if kube::test::if_supports_resource "${roles}" ; then
|
||||||
|
# Create Role from command (only resource)
|
||||||
kubectl create "${kube_flags[@]}" role pod-admin --verb=* --resource=pods
|
kubectl create "${kube_flags[@]}" role pod-admin --verb=* --resource=pods
|
||||||
kube::test::get_object_assert role/pod-admin "{{range.rules}}{{range.verbs}}{{.}}:{{end}}{{end}}" '\*:'
|
kube::test::get_object_assert role/pod-admin "{{range.rules}}{{range.verbs}}{{.}}:{{end}}{{end}}" '\*:'
|
||||||
kube::test::get_object_assert role/pod-admin "{{range.rules}}{{range.resources}}{{.}}:{{end}}{{end}}" 'pods:'
|
kube::test::get_object_assert role/pod-admin "{{range.rules}}{{range.resources}}{{.}}:{{end}}{{end}}" 'pods:'
|
||||||
kube::test::get_object_assert role/pod-admin "{{range.rules}}{{range.apiGroups}}{{.}}:{{end}}{{end}}" ':'
|
kube::test::get_object_assert role/pod-admin "{{range.rules}}{{range.apiGroups}}{{.}}:{{end}}{{end}}" ':'
|
||||||
kubectl create "${kube_flags[@]}" role resource-reader --verb=get,list --resource=pods,deployments.extensions
|
output_message=$(! kubectl create "${kube_flags[@]}" role invalid-pod-admin --verb=* --resource=invalid-resource 2>&1)
|
||||||
kube::test::get_object_assert role/resource-reader "{{range.rules}}{{range.verbs}}{{.}}:{{end}}{{end}}" 'get:list:get:list:'
|
kube::test::if_has_string "${output_message}" "the server doesn't have a resource type \"invalid-resource\""
|
||||||
kube::test::get_object_assert role/resource-reader "{{range.rules}}{{range.resources}}{{.}}:{{end}}{{end}}" 'pods:deployments:'
|
# Create Role from command (resource + group)
|
||||||
kube::test::get_object_assert role/resource-reader "{{range.rules}}{{range.apiGroups}}{{.}}:{{end}}{{end}}" ':extensions:'
|
kubectl create "${kube_flags[@]}" role group-reader --verb=get,list --resource=deployments.extensions
|
||||||
|
kube::test::get_object_assert role/group-reader "{{range.rules}}{{range.verbs}}{{.}}:{{end}}{{end}}" 'get:list:'
|
||||||
|
kube::test::get_object_assert role/group-reader "{{range.rules}}{{range.resources}}{{.}}:{{end}}{{end}}" 'deployments:'
|
||||||
|
kube::test::get_object_assert role/group-reader "{{range.rules}}{{range.apiGroups}}{{.}}:{{end}}{{end}}" 'extensions:'
|
||||||
|
output_message=$(! kubectl create "${kube_flags[@]}" role invalid-group --verb=get,list --resource=deployments.invalid-group 2>&1)
|
||||||
|
kube::test::if_has_string "${output_message}" "the server doesn't have a resource type \"deployments\" in group \"invalid-group\""
|
||||||
|
# Create Role from command (resource / subresource)
|
||||||
|
kubectl create "${kube_flags[@]}" role subresource-reader --verb=get,list --resource=pods/status
|
||||||
|
kube::test::get_object_assert role/subresource-reader "{{range.rules}}{{range.verbs}}{{.}}:{{end}}{{end}}" 'get:list:'
|
||||||
|
kube::test::get_object_assert role/subresource-reader "{{range.rules}}{{range.resources}}{{.}}:{{end}}{{end}}" 'pods/status:'
|
||||||
|
kube::test::get_object_assert role/subresource-reader "{{range.rules}}{{range.apiGroups}}{{.}}:{{end}}{{end}}" ':'
|
||||||
|
# Create Role from command (resource + group / subresource)
|
||||||
|
kubectl create "${kube_flags[@]}" role group-subresource-reader --verb=get,list --resource=replicasets.extensions/scale
|
||||||
|
kube::test::get_object_assert role/group-subresource-reader "{{range.rules}}{{range.verbs}}{{.}}:{{end}}{{end}}" 'get:list:'
|
||||||
|
kube::test::get_object_assert role/group-subresource-reader "{{range.rules}}{{range.resources}}{{.}}:{{end}}{{end}}" 'replicasets/scale:'
|
||||||
|
kube::test::get_object_assert role/group-subresource-reader "{{range.rules}}{{range.apiGroups}}{{.}}:{{end}}{{end}}" 'extensions:'
|
||||||
|
output_message=$(! kubectl create "${kube_flags[@]}" role invalid-group --verb=get,list --resource=rs.invalid-group/scale 2>&1)
|
||||||
|
kube::test::if_has_string "${output_message}" "the server doesn't have a resource type \"rs\" in group \"invalid-group\""
|
||||||
|
# Create Role from command (resource + resourcename)
|
||||||
kubectl create "${kube_flags[@]}" role resourcename-reader --verb=get,list --resource=pods --resource-name=foo
|
kubectl create "${kube_flags[@]}" role resourcename-reader --verb=get,list --resource=pods --resource-name=foo
|
||||||
kube::test::get_object_assert role/resourcename-reader "{{range.rules}}{{range.verbs}}{{.}}:{{end}}{{end}}" 'get:list:'
|
kube::test::get_object_assert role/resourcename-reader "{{range.rules}}{{range.verbs}}{{.}}:{{end}}{{end}}" 'get:list:'
|
||||||
kube::test::get_object_assert role/resourcename-reader "{{range.rules}}{{range.resources}}{{.}}:{{end}}{{end}}" 'pods:'
|
kube::test::get_object_assert role/resourcename-reader "{{range.rules}}{{range.resources}}{{.}}:{{end}}{{end}}" 'pods:'
|
||||||
kube::test::get_object_assert role/resourcename-reader "{{range.rules}}{{range.apiGroups}}{{.}}:{{end}}{{end}}" ':'
|
kube::test::get_object_assert role/resourcename-reader "{{range.rules}}{{range.apiGroups}}{{.}}:{{end}}{{end}}" ':'
|
||||||
kube::test::get_object_assert role/resourcename-reader "{{range.rules}}{{range.resourceNames}}{{.}}:{{end}}{{end}}" 'foo:'
|
kube::test::get_object_assert role/resourcename-reader "{{range.rules}}{{range.resourceNames}}{{.}}:{{end}}{{end}}" 'foo:'
|
||||||
|
# Create Role from command (multi-resources)
|
||||||
|
kubectl create "${kube_flags[@]}" role resource-reader --verb=get,list --resource=pods/status,deployments.extensions
|
||||||
|
kube::test::get_object_assert role/resource-reader "{{range.rules}}{{range.verbs}}{{.}}:{{end}}{{end}}" 'get:list:get:list:'
|
||||||
|
kube::test::get_object_assert role/resource-reader "{{range.rules}}{{range.resources}}{{.}}:{{end}}{{end}}" 'pods/status:deployments:'
|
||||||
|
kube::test::get_object_assert role/resource-reader "{{range.rules}}{{range.apiGroups}}{{.}}:{{end}}{{end}}" ':extensions:'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
|
@ -36,7 +36,13 @@ var (
|
|||||||
kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods
|
kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods
|
||||||
|
|
||||||
# Create a ClusterRole named "pod-reader" with ResourceName specified
|
# Create a ClusterRole named "pod-reader" with ResourceName specified
|
||||||
kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods --resource-name=readablepod`))
|
kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods --resource-name=readablepod
|
||||||
|
|
||||||
|
# Create a ClusterRole named "foo" with API Group specified
|
||||||
|
kubectl create clusterrole foo --verb=get,list,watch --resource=rs.extensions
|
||||||
|
|
||||||
|
# Create a ClusterRole named "foo" with SubResource specified
|
||||||
|
kubectl create clusterrole foo --verb=get,list,watch --resource=pods,pods/status`))
|
||||||
)
|
)
|
||||||
|
|
||||||
type CreateClusterRoleOptions struct {
|
type CreateClusterRoleOptions struct {
|
||||||
|
@ -43,16 +43,28 @@ var (
|
|||||||
kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods
|
kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods
|
||||||
|
|
||||||
# Create a Role named "pod-reader" with ResourceName specified
|
# Create a Role named "pod-reader" with ResourceName specified
|
||||||
kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods --resource-name=readablepod`))
|
kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods --resource-name=readablepod
|
||||||
|
|
||||||
|
# Create a Role named "foo" with API Group specified
|
||||||
|
kubectl create role foo --verb=get,list,watch --resource=rs.extensions
|
||||||
|
|
||||||
|
# Create a Role named "foo" with SubResource specified
|
||||||
|
kubectl create role foo --verb=get,list,watch --resource=pods,pods/status`))
|
||||||
|
|
||||||
// Valid resource verb list for validation.
|
// Valid resource verb list for validation.
|
||||||
validResourceVerbs = []string{"*", "get", "delete", "list", "create", "update", "patch", "watch", "proxy", "redirect", "deletecollection", "use", "bind", "impersonate"}
|
validResourceVerbs = []string{"*", "get", "delete", "list", "create", "update", "patch", "watch", "proxy", "redirect", "deletecollection", "use", "bind", "impersonate"}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type ResourceOptions struct {
|
||||||
|
Group string
|
||||||
|
Resource string
|
||||||
|
SubResource string
|
||||||
|
}
|
||||||
|
|
||||||
type CreateRoleOptions struct {
|
type CreateRoleOptions struct {
|
||||||
Name string
|
Name string
|
||||||
Verbs []string
|
Verbs []string
|
||||||
Resources []schema.GroupVersionResource
|
Resources []ResourceOptions
|
||||||
ResourceNames []string
|
ResourceNames []string
|
||||||
|
|
||||||
DryRun bool
|
DryRun bool
|
||||||
@ -70,7 +82,7 @@ func NewCmdCreateRole(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command {
|
|||||||
Out: cmdOut,
|
Out: cmdOut,
|
||||||
}
|
}
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "role NAME --verb=verb --resource=resource.group [--resource-name=resourcename] [--dry-run]",
|
Use: "role NAME --verb=verb --resource=resource.group/subresource [--resource-name=resourcename] [--dry-run]",
|
||||||
Short: roleLong,
|
Short: roleLong,
|
||||||
Long: roleLong,
|
Long: roleLong,
|
||||||
Example: roleExample,
|
Example: roleExample,
|
||||||
@ -116,13 +128,20 @@ func (c *CreateRoleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args
|
|||||||
// e.g. --resource=pods,deployments.extensions
|
// e.g. --resource=pods,deployments.extensions
|
||||||
resources := cmdutil.GetFlagStringSlice(cmd, "resource")
|
resources := cmdutil.GetFlagStringSlice(cmd, "resource")
|
||||||
for _, r := range resources {
|
for _, r := range resources {
|
||||||
sections := strings.Split(r, ".")
|
sections := strings.SplitN(r, "/", 2)
|
||||||
|
|
||||||
if len(sections) == 1 {
|
resource := &ResourceOptions{}
|
||||||
c.Resources = append(c.Resources, schema.GroupVersionResource{Resource: r})
|
if len(sections) == 2 {
|
||||||
} else {
|
resource.SubResource = sections[1]
|
||||||
c.Resources = append(c.Resources, schema.GroupVersionResource{Resource: sections[0], Group: strings.Join(sections[1:], ".")})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parts := strings.SplitN(sections[0], ".", 2)
|
||||||
|
if len(parts) == 2 {
|
||||||
|
resource.Group = parts[1]
|
||||||
|
}
|
||||||
|
resource.Resource = parts[0]
|
||||||
|
|
||||||
|
c.Resources = append(c.Resources, *resource)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove duplicate resource names.
|
// Remove duplicate resource names.
|
||||||
@ -180,8 +199,10 @@ func (c *CreateRoleOptions) Validate() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, r := range c.Resources {
|
for _, r := range c.Resources {
|
||||||
_, err := c.Mapper.ResourceFor(r)
|
if len(r.Resource) == 0 {
|
||||||
if err != nil {
|
return fmt.Errorf("resource must be specified if apiGroup/subresource specified")
|
||||||
|
}
|
||||||
|
if _, err := c.Mapper.ResourceFor(schema.GroupVersionResource{Resource: r.Resource, Group: r.Group}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,7 +249,7 @@ func arrayContains(s []string, e string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateResourcePolicyRules(mapper meta.RESTMapper, verbs []string, resources []schema.GroupVersionResource, resourceNames []string) ([]rbac.PolicyRule, error) {
|
func generateResourcePolicyRules(mapper meta.RESTMapper, verbs []string, resources []ResourceOptions, resourceNames []string) ([]rbac.PolicyRule, error) {
|
||||||
// groupResourceMapping is a apigroup-resource map. The key of this map is api group, while the value
|
// groupResourceMapping is a apigroup-resource map. The key of this map is api group, while the value
|
||||||
// is a string array of resources under this api group.
|
// is a string array of resources under this api group.
|
||||||
// E.g. groupResourceMapping = {"extensions": ["replicasets", "deployments"], "batch":["jobs"]}
|
// E.g. groupResourceMapping = {"extensions": ["replicasets", "deployments"], "batch":["jobs"]}
|
||||||
@ -239,10 +260,13 @@ func generateResourcePolicyRules(mapper meta.RESTMapper, verbs []string, resourc
|
|||||||
// 2. Prevents pointing to non-existent resources.
|
// 2. Prevents pointing to non-existent resources.
|
||||||
// 3. Transfers resource short name to long name. E.g. rs.extensions is transferred to replicasets.extensions
|
// 3. Transfers resource short name to long name. E.g. rs.extensions is transferred to replicasets.extensions
|
||||||
for _, r := range resources {
|
for _, r := range resources {
|
||||||
resource, err := mapper.ResourceFor(r)
|
resource, err := mapper.ResourceFor(schema.GroupVersionResource{Resource: r.Resource, Group: r.Group})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []rbac.PolicyRule{}, err
|
return []rbac.PolicyRule{}, err
|
||||||
}
|
}
|
||||||
|
if len(r.SubResource) > 0 {
|
||||||
|
resource.Resource = resource.Resource + "/" + r.SubResource
|
||||||
|
}
|
||||||
if !arrayContains(groupResourceMapping[resource.Group], resource.Resource) {
|
if !arrayContains(groupResourceMapping[resource.Group], resource.Resource) {
|
||||||
groupResourceMapping[resource.Group] = append(groupResourceMapping[resource.Group], resource.Resource)
|
groupResourceMapping[resource.Group] = append(groupResourceMapping[resource.Group], resource.Resource)
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,6 @@ import (
|
|||||||
|
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1"
|
"k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
||||||
"k8s.io/client-go/rest/fake"
|
"k8s.io/client-go/rest/fake"
|
||||||
"k8s.io/kubernetes/pkg/apis/rbac"
|
"k8s.io/kubernetes/pkg/apis/rbac"
|
||||||
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
|
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
|
||||||
@ -80,6 +79,40 @@ func TestCreateRole(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"test-subresources": {
|
||||||
|
verbs: "get,watch,list",
|
||||||
|
resources: "replicasets/scale",
|
||||||
|
expectedRole: &rbac.Role{
|
||||||
|
ObjectMeta: v1.ObjectMeta{
|
||||||
|
Name: roleName,
|
||||||
|
},
|
||||||
|
Rules: []rbac.PolicyRule{
|
||||||
|
{
|
||||||
|
Verbs: []string{"get", "watch", "list"},
|
||||||
|
Resources: []string{"replicasets/scale"},
|
||||||
|
APIGroups: []string{"extensions"},
|
||||||
|
ResourceNames: []string{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"test-subresources-with-apigroup": {
|
||||||
|
verbs: "get,watch,list",
|
||||||
|
resources: "replicasets.extensions/scale",
|
||||||
|
expectedRole: &rbac.Role{
|
||||||
|
ObjectMeta: v1.ObjectMeta{
|
||||||
|
Name: roleName,
|
||||||
|
},
|
||||||
|
Rules: []rbac.PolicyRule{
|
||||||
|
{
|
||||||
|
Verbs: []string{"get", "watch", "list"},
|
||||||
|
Resources: []string{"replicasets/scale"},
|
||||||
|
APIGroups: []string{"extensions"},
|
||||||
|
ResourceNames: []string{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
"test-valid-case-with-multiple-apigroups": {
|
"test-valid-case-with-multiple-apigroups": {
|
||||||
verbs: "get,watch,list",
|
verbs: "get,watch,list",
|
||||||
resources: "pods,deployments.extensions",
|
resources: "pods,deployments.extensions",
|
||||||
@ -148,11 +181,35 @@ func TestValidate(t *testing.T) {
|
|||||||
},
|
},
|
||||||
expectErr: true,
|
expectErr: true,
|
||||||
},
|
},
|
||||||
|
"test-missing-resource-existing-apigroup": {
|
||||||
|
roleOptions: &CreateRoleOptions{
|
||||||
|
Name: "my-role",
|
||||||
|
Verbs: []string{"get"},
|
||||||
|
Resources: []ResourceOptions{
|
||||||
|
{
|
||||||
|
Group: "extensions",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectErr: true,
|
||||||
|
},
|
||||||
|
"test-missing-resource-existing-subresource": {
|
||||||
|
roleOptions: &CreateRoleOptions{
|
||||||
|
Name: "my-role",
|
||||||
|
Verbs: []string{"get"},
|
||||||
|
Resources: []ResourceOptions{
|
||||||
|
{
|
||||||
|
SubResource: "scale",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectErr: true,
|
||||||
|
},
|
||||||
"test-invalid-verb": {
|
"test-invalid-verb": {
|
||||||
roleOptions: &CreateRoleOptions{
|
roleOptions: &CreateRoleOptions{
|
||||||
Name: "my-role",
|
Name: "my-role",
|
||||||
Verbs: []string{"invalid-verb"},
|
Verbs: []string{"invalid-verb"},
|
||||||
Resources: []schema.GroupVersionResource{
|
Resources: []ResourceOptions{
|
||||||
{
|
{
|
||||||
Resource: "pods",
|
Resource: "pods",
|
||||||
},
|
},
|
||||||
@ -164,7 +221,7 @@ func TestValidate(t *testing.T) {
|
|||||||
roleOptions: &CreateRoleOptions{
|
roleOptions: &CreateRoleOptions{
|
||||||
Name: "my-role",
|
Name: "my-role",
|
||||||
Verbs: []string{"post"},
|
Verbs: []string{"post"},
|
||||||
Resources: []schema.GroupVersionResource{
|
Resources: []ResourceOptions{
|
||||||
{
|
{
|
||||||
Resource: "pods",
|
Resource: "pods",
|
||||||
},
|
},
|
||||||
@ -176,7 +233,7 @@ func TestValidate(t *testing.T) {
|
|||||||
roleOptions: &CreateRoleOptions{
|
roleOptions: &CreateRoleOptions{
|
||||||
Name: "my-role",
|
Name: "my-role",
|
||||||
Verbs: []string{"get"},
|
Verbs: []string{"get"},
|
||||||
Resources: []schema.GroupVersionResource{
|
Resources: []ResourceOptions{
|
||||||
{
|
{
|
||||||
Resource: "invalid-resource",
|
Resource: "invalid-resource",
|
||||||
},
|
},
|
||||||
@ -188,7 +245,7 @@ func TestValidate(t *testing.T) {
|
|||||||
roleOptions: &CreateRoleOptions{
|
roleOptions: &CreateRoleOptions{
|
||||||
Name: "my-role",
|
Name: "my-role",
|
||||||
Verbs: []string{"get"},
|
Verbs: []string{"get"},
|
||||||
Resources: []schema.GroupVersionResource{
|
Resources: []ResourceOptions{
|
||||||
{
|
{
|
||||||
Resource: "pods",
|
Resource: "pods",
|
||||||
},
|
},
|
||||||
@ -205,7 +262,7 @@ func TestValidate(t *testing.T) {
|
|||||||
roleOptions: &CreateRoleOptions{
|
roleOptions: &CreateRoleOptions{
|
||||||
Name: "role-binder",
|
Name: "role-binder",
|
||||||
Verbs: []string{"get", "list", "bind"},
|
Verbs: []string{"get", "list", "bind"},
|
||||||
Resources: []schema.GroupVersionResource{
|
Resources: []ResourceOptions{
|
||||||
{
|
{
|
||||||
Resource: "roles",
|
Resource: "roles",
|
||||||
Group: "rbac.authorization.k8s.io",
|
Group: "rbac.authorization.k8s.io",
|
||||||
@ -215,6 +272,20 @@ func TestValidate(t *testing.T) {
|
|||||||
},
|
},
|
||||||
expectErr: false,
|
expectErr: false,
|
||||||
},
|
},
|
||||||
|
"test-valid-case-with-subresource": {
|
||||||
|
roleOptions: &CreateRoleOptions{
|
||||||
|
Name: "my-role",
|
||||||
|
Verbs: []string{"get", "list"},
|
||||||
|
Resources: []ResourceOptions{
|
||||||
|
{
|
||||||
|
Resource: "replicasets",
|
||||||
|
SubResource: "scale",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ResourceNames: []string{"bar"},
|
||||||
|
},
|
||||||
|
expectErr: false,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, test := range tests {
|
for name, test := range tests {
|
||||||
@ -271,7 +342,7 @@ func TestComplete(t *testing.T) {
|
|||||||
"watch",
|
"watch",
|
||||||
"list",
|
"list",
|
||||||
},
|
},
|
||||||
Resources: []schema.GroupVersionResource{
|
Resources: []ResourceOptions{
|
||||||
{
|
{
|
||||||
Resource: "pods",
|
Resource: "pods",
|
||||||
Group: "",
|
Group: "",
|
||||||
@ -299,7 +370,7 @@ func TestComplete(t *testing.T) {
|
|||||||
expected: &CreateRoleOptions{
|
expected: &CreateRoleOptions{
|
||||||
Name: roleName,
|
Name: roleName,
|
||||||
Verbs: []string{"*"},
|
Verbs: []string{"*"},
|
||||||
Resources: []schema.GroupVersionResource{
|
Resources: []ResourceOptions{
|
||||||
{
|
{
|
||||||
Resource: "pods",
|
Resource: "pods",
|
||||||
Group: "",
|
Group: "",
|
||||||
@ -323,7 +394,7 @@ func TestComplete(t *testing.T) {
|
|||||||
expected: &CreateRoleOptions{
|
expected: &CreateRoleOptions{
|
||||||
Name: roleName,
|
Name: roleName,
|
||||||
Verbs: []string{"*"},
|
Verbs: []string{"*"},
|
||||||
Resources: []schema.GroupVersionResource{
|
Resources: []ResourceOptions{
|
||||||
{
|
{
|
||||||
Resource: "pods",
|
Resource: "pods",
|
||||||
Group: "",
|
Group: "",
|
||||||
@ -347,7 +418,7 @@ func TestComplete(t *testing.T) {
|
|||||||
expected: &CreateRoleOptions{
|
expected: &CreateRoleOptions{
|
||||||
Name: roleName,
|
Name: roleName,
|
||||||
Verbs: []string{"*"},
|
Verbs: []string{"*"},
|
||||||
Resources: []schema.GroupVersionResource{
|
Resources: []ResourceOptions{
|
||||||
{
|
{
|
||||||
Resource: "pods",
|
Resource: "pods",
|
||||||
Group: "",
|
Group: "",
|
||||||
|
Loading…
Reference in New Issue
Block a user