Skip to content

Commit

Permalink
first draft
Browse files Browse the repository at this point in the history
  • Loading branch information
royhadad committed Jul 6, 2023
1 parent ef13f93 commit d95e092
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 15 deletions.
4 changes: 3 additions & 1 deletion internal/startup/startup.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package startup
import (
"errors"
"fmt"
"github.com/datreeio/admission-webhook-datree/pkg/openshiftClient"

"net/http"
"os"
Expand Down Expand Up @@ -43,6 +44,7 @@ func Start() {
basicCliClient := clients.NewCliServiceClient(deploymentConfig.URL, basicNetworkValidator, state)
errorReporter := errorReporter.NewErrorReporter(basicCliClient, state)
internalLogger := logger.New("", errorReporter)
openshiftClientInstance, err := openshiftClient.NewOpenshiftClient()

defer func() {
if panicErr := recover(); panicErr != nil {
Expand Down Expand Up @@ -87,7 +89,7 @@ func Start() {
panic(err)
}

validationController := controllers.NewValidationController(basicCliClient, state, errorReporter, k8sMetadataUtilInstance)
validationController := controllers.NewValidationController(basicCliClient, state, errorReporter, k8sMetadataUtilInstance, &internalLogger, openshiftClientInstance)
healthController := controllers.NewHealthController()
// set routes
http.HandleFunc("/validate", validationController.Validate)
Expand Down
5 changes: 4 additions & 1 deletion pkg/controllers/validationController.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package controllers
import (
"encoding/json"
"fmt"
"github.com/datreeio/admission-webhook-datree/pkg/openshiftClient"
"io"
"net/http"

Expand All @@ -27,12 +28,14 @@ type ValidationController struct {
ErrorReporter *errorReporter.ErrorReporter
}

func NewValidationController(cliServiceClient *clients.CliClient, state *servicestate.ServiceState, errorReporter *errorReporter.ErrorReporter, k8sMetadataUtilInstance *k8sMetadataUtil.K8sMetadataUtil) *ValidationController {
func NewValidationController(cliServiceClient *clients.CliClient, state *servicestate.ServiceState, errorReporter *errorReporter.ErrorReporter, k8sMetadataUtilInstance *k8sMetadataUtil.K8sMetadataUtil, logger *logger.Logger, openshiftClient *openshiftClient.OpenshiftClient) *ValidationController {
validationService := &services.ValidationService{
CliServiceClient: cliServiceClient,
State: state,
K8sMetadataUtil: k8sMetadataUtilInstance,
ErrorReporter: errorReporter,
OpenshiftClient: openshiftClient,
Logger: logger,
}

return &ValidationController{
Expand Down
8 changes: 7 additions & 1 deletion pkg/controllers/validationController_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
_ "embed"
"encoding/json"
"fmt"
"github.com/datreeio/admission-webhook-datree/pkg/logger"
"github.com/datreeio/admission-webhook-datree/pkg/openshiftClient"
"net/http"
"net/http/httptest"
"strings"
Expand Down Expand Up @@ -310,7 +312,11 @@ func mockValidationController(mockedResponse httpClient.Response) *ValidationCon
mockErrorReporterClient.On("ReportError", mock.Anything, mock.Anything).Return(200, nil)
mockErrorReporter := errorReporter.NewErrorReporter(mockErrorReporterClient, mockState)

return NewValidationController(mockedCliServiceClient, mockState, mockErrorReporter, mockK8sMetadataUtil)
mockLogger := &logger.Logger{}

mockOpenshiftClient := &openshiftClient.OpenshiftClient{}

return NewValidationController(mockedCliServiceClient, mockState, mockErrorReporter, mockK8sMetadataUtil, mockLogger, mockOpenshiftClient)
}

func convertPrerunResponseJsonToStruct(prerunResponse []byte) *clients.ClusterEvaluationPrerunDataResponse {
Expand Down
17 changes: 6 additions & 11 deletions pkg/openshiftClient/openshiftClient.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package main
package openshiftClient

import (
"context"
Expand Down Expand Up @@ -60,20 +60,15 @@ func (oc *OpenshiftClient) getGroupsByUsers() (GroupsByUsers, error) {
oc.cache.Set(groupsByUsersCacheKey, groupsByUsers, 1*time.Minute)
return groupsByUsers, nil
}

func (oc *OpenshiftClient) GetGroupsUserBelongsTo(username string) ([]string, error) {
groups, err := oc.userClientV1.Groups().List(context.TODO(), metav1.ListOptions{})
groupsByUsers, err := oc.getGroupsByUsers()
if err != nil {
return nil, err
}

var groupsUserBelongsTo []string
for _, group := range groups.Items {
for _, user := range group.Users {
if user == username {
groupsUserBelongsTo = append(groupsUserBelongsTo, group.Name)
}
}
groups, found := groupsByUsers[username]
if !found {
return []string{}, nil
}
return groupsUserBelongsTo, nil
return groups, nil
}
14 changes: 13 additions & 1 deletion pkg/services/validationService.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/datreeio/admission-webhook-datree/pkg/openshiftClient"
"net/http"
"os"
"regexp"
Expand Down Expand Up @@ -59,6 +60,8 @@ type ValidationService struct {
K8sMetadataUtil *k8sMetadataUtil.K8sMetadataUtil
ErrorReporter *errorReporter.ErrorReporter
State *servicestate.ServiceState
OpenshiftClient *openshiftClient.OpenshiftClient
Logger *logger.Logger
}

func (vs *ValidationService) Validate(admissionReviewReq *admission.AdmissionReview, warningMessages *[]string, internalLogger logger.Logger) (admissionReview *admission.AdmissionReview, isSkipped bool) {
Expand Down Expand Up @@ -402,8 +405,17 @@ func (vs *ValidationService) shouldBypassByPermissions(userInfo authenticationv1
}

userName := userInfo.Username
groups := userInfo.Groups
if openShiftRequester != "" {
// override username
userName = openShiftRequester

// override groups
groupsFromOpenshiftClient, err := vs.OpenshiftClient.GetGroupsUserBelongsTo(openShiftRequester)
if err != nil {
vs.Logger.LogError(fmt.Sprintf("Failed to get groups for user %s from openshift client: %s", openShiftRequester, err.Error()))
}
groups = groupsFromOpenshiftClient
}

for _, userAccount := range bypassPermissions.UserAccounts {
Expand All @@ -419,7 +431,7 @@ func (vs *ValidationService) shouldBypassByPermissions(userInfo authenticationv1
}

for _, bypassGroup := range bypassPermissions.Groups {
for _, userInfoGroup := range userInfo.Groups {
for _, userInfoGroup := range groups {
if match, _ := regexp.MatchString(bypassGroup, userInfoGroup); match {
return true
}
Expand Down

0 comments on commit d95e092

Please sign in to comment.