|
1 | 1 | package templates
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "time" |
| 5 | + |
4 | 6 | g "github.com/onsi/ginkgo"
|
5 | 7 | o "github.com/onsi/gomega"
|
6 | 8 |
|
7 | 9 | kerrors "k8s.io/apimachinery/pkg/api/errors"
|
8 | 10 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
9 | 11 | "k8s.io/apimachinery/pkg/runtime"
|
10 | 12 | "k8s.io/apimachinery/pkg/util/sets"
|
| 13 | + "k8s.io/apimachinery/pkg/util/wait" |
11 | 14 | kapi "k8s.io/kubernetes/pkg/api"
|
12 | 15 | "k8s.io/kubernetes/pkg/client/retry"
|
13 | 16 |
|
@@ -53,17 +56,91 @@ var _ = g.Describe("[Conformance][templates] templateinstance impersonation test
|
53 | 56 | )
|
54 | 57 |
|
55 | 58 | g.BeforeEach(func() {
|
56 |
| - var err error |
57 |
| - |
58 | 59 | adminuser = createUser(cli, "adminuser", bootstrappolicy.AdminRoleName)
|
59 | 60 | impersonateuser = createUser(cli, "impersonateuser", bootstrappolicy.EditRoleName)
|
60 | 61 | impersonatebygroupuser = createUser(cli, "impersonatebygroupuser", bootstrappolicy.EditRoleName)
|
61 |
| - impersonategroup = createGroup(cli, "impersonategroup", bootstrappolicy.EditRoleName) |
62 |
| - addUserToGroup(cli, impersonatebygroupuser.Name, impersonategroup.Name) |
63 | 62 | edituser1 = createUser(cli, "edituser1", bootstrappolicy.EditRoleName)
|
64 | 63 | edituser2 = createUser(cli, "edituser2", bootstrappolicy.EditRoleName)
|
65 | 64 | viewuser = createUser(cli, "viewuser", bootstrappolicy.ViewRoleName)
|
66 | 65 |
|
| 66 | + impersonategroup = createGroup(cli, "impersonategroup", bootstrappolicy.EditRoleName) |
| 67 | + addUserToGroup(cli, impersonatebygroupuser.Name, impersonategroup.Name) |
| 68 | + |
| 69 | + // additional plumbing to enable impersonateuser to impersonate edituser1 |
| 70 | + role, err := cli.AdminAuthorizationClient().Authorization().Roles(cli.Namespace()).Create(&authorizationapi.Role{ |
| 71 | + ObjectMeta: metav1.ObjectMeta{ |
| 72 | + Name: "impersonater", |
| 73 | + }, |
| 74 | + Rules: []authorizationapi.PolicyRule{ |
| 75 | + { |
| 76 | + Verbs: sets.NewString("assign"), |
| 77 | + APIGroups: []string{templateapi.GroupName}, |
| 78 | + Resources: sets.NewString("templateinstances"), |
| 79 | + }, |
| 80 | + }, |
| 81 | + }) |
| 82 | + o.Expect(err).NotTo(o.HaveOccurred()) |
| 83 | + |
| 84 | + _, err = cli.AdminAuthorizationClient().Authorization().RoleBindings(cli.Namespace()).Create(&authorizationapi.RoleBinding{ |
| 85 | + ObjectMeta: metav1.ObjectMeta{ |
| 86 | + Name: "impersonater-binding", |
| 87 | + }, |
| 88 | + RoleRef: kapi.ObjectReference{ |
| 89 | + Name: role.Name, |
| 90 | + Namespace: cli.Namespace(), |
| 91 | + }, |
| 92 | + Subjects: []kapi.ObjectReference{ |
| 93 | + { |
| 94 | + Kind: authorizationapi.UserKind, |
| 95 | + Name: impersonateuser.Name, |
| 96 | + }, |
| 97 | + { |
| 98 | + Kind: authorizationapi.GroupKind, |
| 99 | + Name: impersonategroup.Name, |
| 100 | + }, |
| 101 | + }, |
| 102 | + }) |
| 103 | + o.Expect(err).NotTo(o.HaveOccurred()) |
| 104 | + |
| 105 | + // I think we get flakes when the group cache hasn't yet noticed the |
| 106 | + // new group membership made above. Wait until all it looks like |
| 107 | + // all the users above have access to the namespace as expected. |
| 108 | + err = wait.PollImmediate(time.Second, 30*time.Second, func() (done bool, err error) { |
| 109 | + for _, user := range []*userapi.User{adminuser, impersonateuser, impersonatebygroupuser, edituser1, edituser2, viewuser} { |
| 110 | + cli.ChangeUser(user.Name) |
| 111 | + sar, err := cli.AuthorizationClient().Authorization().LocalSubjectAccessReviews(cli.Namespace()).Create(&authorizationapi.LocalSubjectAccessReview{ |
| 112 | + Action: authorizationapi.Action{ |
| 113 | + Verb: "get", |
| 114 | + Resource: "pods", |
| 115 | + }, |
| 116 | + }) |
| 117 | + if err != nil { |
| 118 | + return false, err |
| 119 | + } |
| 120 | + if !sar.Allowed { |
| 121 | + return false, nil |
| 122 | + } |
| 123 | + } |
| 124 | + |
| 125 | + cli.ChangeUser(impersonatebygroupuser.Name) |
| 126 | + sar, err := cli.AuthorizationClient().Authorization().LocalSubjectAccessReviews(cli.Namespace()).Create(&authorizationapi.LocalSubjectAccessReview{ |
| 127 | + Action: authorizationapi.Action{ |
| 128 | + Verb: "assign", |
| 129 | + Group: templateapi.GroupName, |
| 130 | + Resource: "templateinstances", |
| 131 | + }, |
| 132 | + }) |
| 133 | + if err != nil { |
| 134 | + return false, err |
| 135 | + } |
| 136 | + if !sar.Allowed { |
| 137 | + return false, nil |
| 138 | + } |
| 139 | + |
| 140 | + return true, nil |
| 141 | + }) |
| 142 | + o.Expect(err).NotTo(o.HaveOccurred()) |
| 143 | + |
67 | 144 | dummytemplateinstance = &templateapi.TemplateInstance{
|
68 | 145 | ObjectMeta: metav1.ObjectMeta{
|
69 | 146 | Name: "test",
|
@@ -141,42 +218,6 @@ var _ = g.Describe("[Conformance][templates] templateinstance impersonation test
|
141 | 218 | hasUpdateStatusPermission: false,
|
142 | 219 | },
|
143 | 220 | }
|
144 |
| - |
145 |
| - // additional plumbing to enable impersonateuser to impersonate edituser1 |
146 |
| - role, err := cli.AdminAuthorizationClient().Authorization().Roles(cli.Namespace()).Create(&authorizationapi.Role{ |
147 |
| - ObjectMeta: metav1.ObjectMeta{ |
148 |
| - Name: "impersonater", |
149 |
| - }, |
150 |
| - Rules: []authorizationapi.PolicyRule{ |
151 |
| - { |
152 |
| - Verbs: sets.NewString("assign"), |
153 |
| - APIGroups: []string{templateapi.GroupName}, |
154 |
| - Resources: sets.NewString("templateinstances"), |
155 |
| - }, |
156 |
| - }, |
157 |
| - }) |
158 |
| - o.Expect(err).NotTo(o.HaveOccurred()) |
159 |
| - |
160 |
| - _, err = cli.AdminAuthorizationClient().Authorization().RoleBindings(cli.Namespace()).Create(&authorizationapi.RoleBinding{ |
161 |
| - ObjectMeta: metav1.ObjectMeta{ |
162 |
| - Name: "impersonater-binding", |
163 |
| - }, |
164 |
| - RoleRef: kapi.ObjectReference{ |
165 |
| - Name: role.Name, |
166 |
| - Namespace: cli.Namespace(), |
167 |
| - }, |
168 |
| - Subjects: []kapi.ObjectReference{ |
169 |
| - { |
170 |
| - Kind: authorizationapi.UserKind, |
171 |
| - Name: impersonateuser.Name, |
172 |
| - }, |
173 |
| - { |
174 |
| - Kind: authorizationapi.GroupKind, |
175 |
| - Name: impersonategroup.Name, |
176 |
| - }, |
177 |
| - }, |
178 |
| - }) |
179 |
| - o.Expect(err).NotTo(o.HaveOccurred()) |
180 | 221 | })
|
181 | 222 |
|
182 | 223 | g.AfterEach(func() {
|
|
0 commit comments