Skip to content

Commit 0b92e7a

Browse files
committed
Missing permission for web-based terminal in Argocd UI
Signed-off-by: akhil nittala <nakhil@redhat.com>
1 parent 6269d9c commit 0b92e7a

5 files changed

Lines changed: 85 additions & 7 deletions

File tree

controllers/argocd/policyrule.go

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"golang.org/x/mod/semver"
77

8+
argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1"
89
"github.com/argoproj-labs/argocd-operator/common"
910

1011
v1 "k8s.io/api/rbac/v1"
@@ -148,8 +149,8 @@ func policyRuleForDexServer() []v1.PolicyRule {
148149
}
149150
}
150151

151-
func policyRuleForServer() []v1.PolicyRule {
152-
return []v1.PolicyRule{
152+
func policyRuleForServer(cr *argoproj.ArgoCD) []v1.PolicyRule {
153+
policyRules := []v1.PolicyRule{
153154
{
154155
APIGroups: []string{
155156
"*",
@@ -226,6 +227,20 @@ func policyRuleForServer() []v1.PolicyRule {
226227
},
227228
},
228229
}
230+
if isWebTerminalEnabled(cr) {
231+
policyRules = append(policyRules, v1.PolicyRule{
232+
APIGroups: []string{
233+
"",
234+
},
235+
Resources: []string{
236+
"pods/exec",
237+
},
238+
Verbs: []string{
239+
"create",
240+
},
241+
})
242+
}
243+
return policyRules
229244
}
230245

231246
func policyRuleForNotificationsController() []v1.PolicyRule {
@@ -399,7 +414,7 @@ func policyRuleForServerClusterRole() []v1.PolicyRule {
399414
}
400415
}
401416

402-
func getPolicyRuleList(client client.Client) []struct {
417+
func getPolicyRuleList(client client.Client, cr *argoproj.ArgoCD) []struct {
403418
name string
404419
policyRule []v1.PolicyRule
405420
} {
@@ -415,7 +430,7 @@ func getPolicyRuleList(client client.Client) []struct {
415430
policyRule: policyRuleForDexServer(),
416431
}, {
417432
name: common.ArgoCDServerComponent,
418-
policyRule: policyRuleForServer(),
433+
policyRule: policyRuleForServer(cr),
419434
}, {
420435
name: common.ArgoCDRedisHAComponent,
421436
policyRule: policyRuleForRedisHa(client),
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package argocd
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
v1 "k8s.io/api/rbac/v1"
8+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
10+
argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1"
11+
)
12+
13+
func hasPodsExecRule(rules []v1.PolicyRule) bool {
14+
for _, r := range rules {
15+
if len(r.Resources) == 1 &&
16+
r.Resources[0] == "pods/exec" {
17+
return true
18+
}
19+
}
20+
return false
21+
}
22+
23+
func TestPolicyRuleForServer_WebTerminal(t *testing.T) {
24+
webTerminalEnabled := true
25+
tests := []struct {
26+
name string
27+
cr *argoproj.ArgoCD
28+
want bool
29+
}{
30+
{
31+
name: "default",
32+
cr: &argoproj.ArgoCD{
33+
ObjectMeta: metav1.ObjectMeta{
34+
Name: "example",
35+
Namespace: "default",
36+
},
37+
Spec: argoproj.ArgoCDSpec{},
38+
},
39+
want: false,
40+
},
41+
{
42+
name: "disabled",
43+
cr: &argoproj.ArgoCD{},
44+
want: false,
45+
},
46+
{
47+
name: "enabled",
48+
cr: &argoproj.ArgoCD{
49+
Spec: argoproj.ArgoCDSpec{
50+
WebTerminalEnabled: &webTerminalEnabled,
51+
},
52+
},
53+
want: true,
54+
},
55+
}
56+
57+
for _, tt := range tests {
58+
t.Run(tt.name, func(t *testing.T) {
59+
rules := policyRuleForServer(tt.cr)
60+
assert.Equal(t, tt.want, hasPodsExecRule(rules))
61+
})
62+
}
63+
}

controllers/argocd/role.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func newClusterRole(name string, rules []v1.PolicyRule, cr *argoproj.ArgoCD) *v1
6666

6767
// reconcileRoles will ensure that all ArgoCD Service Accounts are configured.
6868
func (r *ReconcileArgoCD) reconcileRoles(cr *argoproj.ArgoCD) error {
69-
params := getPolicyRuleList(r.Client)
69+
params := getPolicyRuleList(r.Client, cr)
7070

7171
for _, param := range params {
7272
if _, err := r.reconcileRole(param.name, param.policyRule, cr); err != nil {

controllers/argocd/rolebinding.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func newRoleBindingWithname(name string, cr *argoproj.ArgoCD) *v1.RoleBinding {
8888

8989
// reconcileRoleBindings will ensure that all ArgoCD RoleBindings are configured.
9090
func (r *ReconcileArgoCD) reconcileRoleBindings(cr *argoproj.ArgoCD) error {
91-
params := getPolicyRuleList(r.Client)
91+
params := getPolicyRuleList(r.Client, cr)
9292

9393
for _, param := range params {
9494
if err := r.reconcileRoleBinding(param.name, param.policyRule, cr); err != nil {

controllers/argocd/service_account.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func getServiceAccountName(crName, name string) string {
5858

5959
// reconcileServiceAccounts will ensure that all ArgoCD Service Accounts are configured.
6060
func (r *ReconcileArgoCD) reconcileServiceAccounts(cr *argoproj.ArgoCD) error {
61-
params := getPolicyRuleList(r.Client)
61+
params := getPolicyRuleList(r.Client, cr)
6262

6363
for _, param := range params {
6464
if err := r.reconcileServiceAccountPermissions(param.name, param.policyRule, cr); err != nil {

0 commit comments

Comments
 (0)