feat: add endpoint for partial updates to org sync mapping (#16316)

This commit is contained in:
ケイラ
2025-01-30 10:52:50 -07:00
committed by GitHub
parent f651ab937b
commit 2371153a37
17 changed files with 595 additions and 11 deletions

76
coderd/apidoc/docs.go generated
View File

@ -4248,6 +4248,45 @@ const docTemplate = `{
}
}
},
"/settings/idpsync/organization/mapping": {
"patch": {
"security": [
{
"CoderSessionToken": []
}
],
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Enterprise"
],
"summary": "Update organization IdP Sync mapping",
"operationId": "update-organization-idp-sync-mapping",
"parameters": [
{
"description": "Description of the mappings to add and remove",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/codersdk.PatchOrganizationIDPSyncMappingRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/codersdk.OrganizationSyncSettings"
}
}
}
}
},
"/tailnet": {
"get": {
"security": [
@ -12420,6 +12459,43 @@ const docTemplate = `{
}
}
},
"codersdk.PatchOrganizationIDPSyncMappingRequest": {
"type": "object",
"properties": {
"add": {
"type": "array",
"items": {
"type": "object",
"properties": {
"gets": {
"description": "The ID of the Coder resource the user should be added to",
"type": "string"
},
"given": {
"description": "The IdP claim the user has",
"type": "string"
}
}
}
},
"remove": {
"type": "array",
"items": {
"type": "object",
"properties": {
"gets": {
"description": "The ID of the Coder resource the user should be added to",
"type": "string"
},
"given": {
"description": "The IdP claim the user has",
"type": "string"
}
}
}
}
}
},
"codersdk.PatchTemplateVersionRequest": {
"type": "object",
"properties": {

View File

@ -3744,6 +3744,39 @@
}
}
},
"/settings/idpsync/organization/mapping": {
"patch": {
"security": [
{
"CoderSessionToken": []
}
],
"consumes": ["application/json"],
"produces": ["application/json"],
"tags": ["Enterprise"],
"summary": "Update organization IdP Sync mapping",
"operationId": "update-organization-idp-sync-mapping",
"parameters": [
{
"description": "Description of the mappings to add and remove",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/codersdk.PatchOrganizationIDPSyncMappingRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/codersdk.OrganizationSyncSettings"
}
}
}
}
},
"/tailnet": {
"get": {
"security": [
@ -11201,6 +11234,43 @@
}
}
},
"codersdk.PatchOrganizationIDPSyncMappingRequest": {
"type": "object",
"properties": {
"add": {
"type": "array",
"items": {
"type": "object",
"properties": {
"gets": {
"description": "The ID of the Coder resource the user should be added to",
"type": "string"
},
"given": {
"description": "The IdP claim the user has",
"type": "string"
}
}
}
},
"remove": {
"type": "array",
"items": {
"type": "object",
"properties": {
"gets": {
"description": "The ID of the Coder resource the user should be added to",
"type": "string"
},
"given": {
"description": "The IdP claim the user has",
"type": "string"
}
}
}
}
}
},
"codersdk.PatchTemplateVersionRequest": {
"type": "object",
"properties": {

View File

@ -26,7 +26,7 @@ import (
type IDPSync interface {
OrganizationSyncEntitled() bool
OrganizationSyncSettings(ctx context.Context, db database.Store) (*OrganizationSyncSettings, error)
UpdateOrganizationSettings(ctx context.Context, db database.Store, settings OrganizationSyncSettings) error
UpdateOrganizationSyncSettings(ctx context.Context, db database.Store, settings OrganizationSyncSettings) error
// OrganizationSyncEnabled returns true if all OIDC users are assigned
// to organizations via org sync settings.
// This is used to know when to disable manual org membership assignment.
@ -70,6 +70,9 @@ type IDPSync interface {
SyncRoles(ctx context.Context, db database.Store, user database.User, params RoleParams) error
}
// AGPLIDPSync implements the IDPSync interface
var _ IDPSync = AGPLIDPSync{}
// AGPLIDPSync is the configuration for syncing user information from an external
// IDP. All related code to syncing user information should be in this package.
type AGPLIDPSync struct {

View File

@ -34,7 +34,7 @@ func (AGPLIDPSync) OrganizationSyncEnabled(_ context.Context, _ database.Store)
return false
}
func (s AGPLIDPSync) UpdateOrganizationSettings(ctx context.Context, db database.Store, settings OrganizationSyncSettings) error {
func (s AGPLIDPSync) UpdateOrganizationSyncSettings(ctx context.Context, db database.Store, settings OrganizationSyncSettings) error {
rlv := s.Manager.Resolver(db)
err := s.SyncSettings.Organization.SetRuntimeValue(ctx, rlv, &settings)
if err != nil {

View File

@ -12,6 +12,9 @@ import (
"github.com/coder/coder/v2/coderd/database"
)
// NoopResolver implements the Resolver interface
var _ Resolver = &NoopResolver{}
// NoopResolver is a useful test device.
type NoopResolver struct{}
@ -31,6 +34,9 @@ func (NoopResolver) DeleteRuntimeConfig(context.Context, string) error {
return ErrEntryNotFound
}
// StoreResolver implements the Resolver interface
var _ Resolver = &StoreResolver{}
// StoreResolver uses the database as the underlying store for runtime settings.
type StoreResolver struct {
db Store

View File

@ -295,7 +295,7 @@ func TestTelemetry(t *testing.T) {
org, err := db.GetDefaultOrganization(ctx)
require.NoError(t, err)
sync := idpsync.NewAGPLSync(testutil.Logger(t), runtimeconfig.NewManager(), idpsync.DeploymentSyncSettings{})
err = sync.UpdateOrganizationSettings(ctx, db, idpsync.OrganizationSyncSettings{
err = sync.UpdateOrganizationSyncSettings(ctx, db, idpsync.OrganizationSyncSettings{
Field: "organizations",
Mapping: map[string][]uuid.UUID{
"first": {org.ID},