Skip to content

CLOUDP-314903 [OIDC] CRD Config Propagation to Automation Config #60

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 37 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
f0b6a96
CRD changes
MaciejKaras Apr 25, 2025
d344589
Authorization package refactor - part 1
MaciejKaras Apr 24, 2025
99479f1
Authorization package refactor - part 2
MaciejKaras Apr 24, 2025
7c23143
Added validation logic + tests
MaciejKaras Apr 25, 2025
8cba1c1
Add URL test validation
MaciejKaras Apr 27, 2025
2528892
Fixed MDB Multi code
MaciejKaras Apr 27, 2025
1eaf9ab
Merge branch 'feature/mk-authorization-refactor' into feature/mk-oidc…
MaciejKaras Apr 27, 2025
6d27458
Propagating CRD values
MaciejKaras Apr 17, 2025
81e6107
Moved OIDCProviderConfigs to Deployment.Auth where it belongs
MaciejKaras Apr 25, 2025
024fa63
Fixed migrating to mongodb-kubernetes repository
MaciejKaras Apr 27, 2025
7a53fd7
Fixed unit tests + CRD generation
MaciejKaras Apr 27, 2025
97a5c99
Add unit tests
MaciejKaras Apr 27, 2025
6dd4976
Temporal fix for AC
MaciejKaras Apr 27, 2025
8b34222
Fix kubebuilder validation rules
MaciejKaras Apr 29, 2025
1cbe97a
Fixes for util.ParseURL
MaciejKaras Apr 30, 2025
0ce0874
Proper OIDC AC merging
MaciejKaras Apr 29, 2025
e4cfb11
Unit test fixes
MaciejKaras Apr 30, 2025
1667045
Fixed issue with disabling OIDC
MaciejKaras Apr 30, 2025
e882a8c
Resolve review comments
MaciejKaras Apr 30, 2025
8f5ff0a
Added getMechanismByName() func and removed global variables
MaciejKaras Apr 30, 2025
e533976
Review fixes
MaciejKaras May 5, 2025
279886f
Merge branch 'master' into feature/mk-oidc-crd-validations
MaciejKaras May 5, 2025
a8306a7
Add one more validation test
MaciejKaras May 5, 2025
866d6ae
Merge branch 'master' into feature/mk-authorization-refactor
MaciejKaras May 5, 2025
09e4628
Merge branch 'feature/mk-oidc-crd-validations' into feature/mk-oidc-c…
MaciejKaras May 5, 2025
23de25e
Merge branch 'feature/mk-authorization-refactor' into feature/mk-oidc…
MaciejKaras May 5, 2025
bcc1136
Fix bug
lucian-tosa May 9, 2025
2c08662
Merge remote-tracking branch 'origin/master' into feature/mk-oidc-crd…
lucian-tosa May 9, 2025
68750a4
Fix linter
lucian-tosa May 9, 2025
e7d3d06
Merge branch 'master' into feature/mk-oidc-crd-propagation
lucian-tosa May 9, 2025
764d3d5
Merge branch 'master' into feature/mk-oidc-crd-propagation
anandsyncs May 19, 2025
1bce820
Merge branch 'master' into feature/mk-oidc-crd-propagation
anandsyncs May 22, 2025
f7ec0f1
implement the authentication_mechanism interface correctly for oidc
anandsyncs May 22, 2025
c1f54a5
lint-fix
anandsyncs May 22, 2025
f271051
Merge branch 'master' into feature/mk-oidc-crd-propagation
anandsyncs May 22, 2025
e6ed367
update external auth validation
anandsyncs May 22, 2025
0d8fd6e
Webhook validation tests
lucian-tosa May 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/v1/mdb/mongodb_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -811,6 +811,7 @@ func (s *Security) IsOIDCEnabled() bool {
if s == nil || s.Authentication == nil || !s.Authentication.Enabled {
return false
}

return s.Authentication.IsOIDCEnabled()
}

Expand Down
81 changes: 77 additions & 4 deletions controllers/om/automation_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"k8s.io/apimachinery/pkg/api/equality"

"github.com/mongodb/mongodb-kubernetes/controllers/operator/ldap"
"github.com/mongodb/mongodb-kubernetes/controllers/operator/oidc"
"github.com/mongodb/mongodb-kubernetes/pkg/util"
"github.com/mongodb/mongodb-kubernetes/pkg/util/generate"
"github.com/mongodb/mongodb-kubernetes/pkg/util/maputil"
Expand All @@ -20,10 +21,11 @@ import (
// configuration which are merged into the `Deployment` object before sending it back to Ops Manager.
// As of right now only support configuring LogRotate for monitoring and backup via dedicated endpoints.
type AutomationConfig struct {
Auth *Auth
AgentSSL *AgentSSL
Deployment Deployment
Ldap *ldap.Ldap
Auth *Auth
AgentSSL *AgentSSL
Deployment Deployment
Ldap *ldap.Ldap
OIDCProviderConfigs []oidc.ProviderConfig
}

// Apply merges the state of all concrete structs into the Deployment (map[string]interface{})
Expand Down Expand Up @@ -58,9 +60,67 @@ func applyInto(a AutomationConfig, into *Deployment) error {
}
(*into)["ldap"] = mergedLdap
}

if len(a.OIDCProviderConfigs) > 0 {
deploymentConfigs := make([]map[string]any, 0)
if configs, ok := a.Deployment["oidcProviderConfigs"]; ok {
configsSlice := cast.ToSlice(configs)
for _, config := range configsSlice {
deploymentConfigs = append(deploymentConfigs, config.(map[string]any))
}
}

result := make([]map[string]any, 0)
for _, config := range a.OIDCProviderConfigs {
deploymentConfig := findOrCreateEmptyDeploymentConfig(deploymentConfigs, config.AuthNamePrefix)

deploymentConfig["authNamePrefix"] = config.AuthNamePrefix
deploymentConfig["audience"] = config.Audience
deploymentConfig["issuerUri"] = config.IssuerUri
deploymentConfig["userClaim"] = config.UserClaim
deploymentConfig["supportsHumanFlows"] = config.SupportsHumanFlows
deploymentConfig["useAuthorizationClaim"] = config.UseAuthorizationClaim

if config.ClientId == util.MergoDelete {
delete(deploymentConfig, "clientId")
} else {
deploymentConfig["clientId"] = config.ClientId
}

if len(config.RequestedScopes) == 0 {
delete(deploymentConfig, "requestedScopes")
} else {
deploymentConfig["requestedScopes"] = config.RequestedScopes
}

if config.GroupsClaim == util.MergoDelete {
delete(deploymentConfig, "groupsClaim")
} else {
deploymentConfig["groupsClaim"] = config.GroupsClaim
}

result = append(result, deploymentConfig)
}

(*into)["oidcProviderConfigs"] = result
} else {
// Clear oidcProviderConfigs if no configs are provided
delete(*into, "oidcProviderConfigs")
}

return nil
}

func findOrCreateEmptyDeploymentConfig(deploymentConfigs []map[string]any, configName string) map[string]any {
for _, deploymentConfig := range deploymentConfigs {
if configName == deploymentConfig["authNamePrefix"] {
return deploymentConfig
}
}

return make(map[string]any)
}

// EqualsWithoutDeployment returns true if two AutomationConfig objects are meaningful equal by following the following conditions:
// - Not taking AutomationConfig.Deployment into consideration.
// - Serializing ac A and ac B to ensure that we remove util.MergoDelete before comparing those two.
Expand Down Expand Up @@ -432,6 +492,19 @@ func BuildAutomationConfigFromDeployment(deployment Deployment) (*AutomationConf
finalAutomationConfig.Ldap = acLdap
}

oidcConfigsArray, ok := deployment["oidcProviderConfigs"]
if ok {
oidcMarshalled, err := json.Marshal(oidcConfigsArray)
if err != nil {
return nil, err
}
providerConfigs := make([]oidc.ProviderConfig, 0)
if err := json.Unmarshal(oidcMarshalled, &providerConfigs); err != nil {
return nil, err
}
finalAutomationConfig.OIDCProviderConfigs = providerConfigs
}

return finalAutomationConfig, nil
}

Expand Down
Loading