diff --git a/cli/organizationsettings.go b/cli/organizationsettings.go
index 2c6b901de10ca..920ae41ebe1fc 100644
--- a/cli/organizationsettings.go
+++ b/cli/organizationsettings.go
@@ -48,6 +48,23 @@ func (r *RootCmd) organizationSettings(orgContext *OrganizationContext) *serpent
return cli.RoleIDPSyncSettings(ctx, org.String())
},
},
+ {
+ Name: "organization-sync",
+ Aliases: []string{"organizationsync", "org-sync", "orgsync"},
+ Short: "Organization sync settings to sync organization memberships from an IdP.",
+ DisableOrgContext: true,
+ Patch: func(ctx context.Context, cli *codersdk.Client, _ uuid.UUID, input json.RawMessage) (any, error) {
+ var req codersdk.OrganizationSyncSettings
+ err := json.Unmarshal(input, &req)
+ if err != nil {
+ return nil, xerrors.Errorf("unmarshalling organization sync settings: %w", err)
+ }
+ return cli.PatchOrganizationIDPSyncSettings(ctx, req)
+ },
+ Fetch: func(ctx context.Context, cli *codersdk.Client, _ uuid.UUID) (any, error) {
+ return cli.OrganizationIDPSyncSettings(ctx)
+ },
+ },
}
cmd := &serpent.Command{
Use: "settings",
@@ -68,8 +85,13 @@ type organizationSetting struct {
Name string
Aliases []string
Short string
- Patch func(ctx context.Context, cli *codersdk.Client, org uuid.UUID, input json.RawMessage) (any, error)
- Fetch func(ctx context.Context, cli *codersdk.Client, org uuid.UUID) (any, error)
+ // DisableOrgContext is kinda a kludge. It tells the command constructor
+ // to not require an organization context. This is used for the organization
+ // sync settings which are not tied to a specific organization.
+ // It feels excessive to build a more elaborate solution for this one-off.
+ DisableOrgContext bool
+ Patch func(ctx context.Context, cli *codersdk.Client, org uuid.UUID, input json.RawMessage) (any, error)
+ Fetch func(ctx context.Context, cli *codersdk.Client, org uuid.UUID) (any, error)
}
func (r *RootCmd) setOrganizationSettings(orgContext *OrganizationContext, settings []organizationSetting) *serpent.Command {
@@ -107,9 +129,14 @@ func (r *RootCmd) setOrganizationSettings(orgContext *OrganizationContext, setti
),
Handler: func(inv *serpent.Invocation) error {
ctx := inv.Context()
- org, err := orgContext.Selected(inv, client)
- if err != nil {
- return err
+ var org codersdk.Organization
+ var err error
+
+ if !set.DisableOrgContext {
+ org, err = orgContext.Selected(inv, client)
+ if err != nil {
+ return err
+ }
}
// Read in the json
@@ -178,9 +205,14 @@ func (r *RootCmd) printOrganizationSetting(orgContext *OrganizationContext, sett
),
Handler: func(inv *serpent.Invocation) error {
ctx := inv.Context()
- org, err := orgContext.Selected(inv, client)
- if err != nil {
- return err
+ var org codersdk.Organization
+ var err error
+
+ if !set.DisableOrgContext {
+ org, err = orgContext.Selected(inv, client)
+ if err != nil {
+ return err
+ }
}
output, err := fetch(ctx, client, org.ID)
diff --git a/cli/testdata/coder_organizations_settings_set_--help.golden b/cli/testdata/coder_organizations_settings_set_--help.golden
index e86ceddf73865..a6554785f3131 100644
--- a/cli/testdata/coder_organizations_settings_set_--help.golden
+++ b/cli/testdata/coder_organizations_settings_set_--help.golden
@@ -10,8 +10,11 @@ USAGE:
$ coder organization settings set groupsync < input.json
SUBCOMMANDS:
- group-sync Group sync settings to sync groups from an IdP.
- role-sync Role sync settings to sync organization roles from an IdP.
+ group-sync Group sync settings to sync groups from an IdP.
+ organization-sync Organization sync settings to sync organization
+ memberships from an IdP.
+ role-sync Role sync settings to sync organization roles from an
+ IdP.
———
Run `coder --help` for a list of global options.
diff --git a/cli/testdata/coder_organizations_settings_set_--help_--help.golden b/cli/testdata/coder_organizations_settings_set_--help_--help.golden
index e86ceddf73865..a6554785f3131 100644
--- a/cli/testdata/coder_organizations_settings_set_--help_--help.golden
+++ b/cli/testdata/coder_organizations_settings_set_--help_--help.golden
@@ -10,8 +10,11 @@ USAGE:
$ coder organization settings set groupsync < input.json
SUBCOMMANDS:
- group-sync Group sync settings to sync groups from an IdP.
- role-sync Role sync settings to sync organization roles from an IdP.
+ group-sync Group sync settings to sync groups from an IdP.
+ organization-sync Organization sync settings to sync organization
+ memberships from an IdP.
+ role-sync Role sync settings to sync organization roles from an
+ IdP.
———
Run `coder --help` for a list of global options.
diff --git a/cli/testdata/coder_organizations_settings_show_--help.golden b/cli/testdata/coder_organizations_settings_show_--help.golden
index ee575a0fd067b..da8ccb18c14a1 100644
--- a/cli/testdata/coder_organizations_settings_show_--help.golden
+++ b/cli/testdata/coder_organizations_settings_show_--help.golden
@@ -10,8 +10,11 @@ USAGE:
$ coder organization settings show groupsync
SUBCOMMANDS:
- group-sync Group sync settings to sync groups from an IdP.
- role-sync Role sync settings to sync organization roles from an IdP.
+ group-sync Group sync settings to sync groups from an IdP.
+ organization-sync Organization sync settings to sync organization
+ memberships from an IdP.
+ role-sync Role sync settings to sync organization roles from an
+ IdP.
———
Run `coder --help` for a list of global options.
diff --git a/cli/testdata/coder_organizations_settings_show_--help_--help.golden b/cli/testdata/coder_organizations_settings_show_--help_--help.golden
index ee575a0fd067b..da8ccb18c14a1 100644
--- a/cli/testdata/coder_organizations_settings_show_--help_--help.golden
+++ b/cli/testdata/coder_organizations_settings_show_--help_--help.golden
@@ -10,8 +10,11 @@ USAGE:
$ coder organization settings show groupsync
SUBCOMMANDS:
- group-sync Group sync settings to sync groups from an IdP.
- role-sync Role sync settings to sync organization roles from an IdP.
+ group-sync Group sync settings to sync groups from an IdP.
+ organization-sync Organization sync settings to sync organization
+ memberships from an IdP.
+ role-sync Role sync settings to sync organization roles from an
+ IdP.
———
Run `coder --help` for a list of global options.
diff --git a/docs/manifest.json b/docs/manifest.json
index 8a8cc6c771794..5c53ee05352dd 100644
--- a/docs/manifest.json
+++ b/docs/manifest.json
@@ -1056,6 +1056,11 @@
"description": "Group sync settings to sync groups from an IdP.",
"path": "reference/cli/organizations_settings_set_group-sync.md"
},
+ {
+ "title": "organizations settings set organization-sync",
+ "description": "Organization sync settings to sync organization memberships from an IdP.",
+ "path": "reference/cli/organizations_settings_set_organization-sync.md"
+ },
{
"title": "organizations settings set role-sync",
"description": "Role sync settings to sync organization roles from an IdP.",
@@ -1071,6 +1076,11 @@
"description": "Group sync settings to sync groups from an IdP.",
"path": "reference/cli/organizations_settings_show_group-sync.md"
},
+ {
+ "title": "organizations settings show organization-sync",
+ "description": "Organization sync settings to sync organization memberships from an IdP.",
+ "path": "reference/cli/organizations_settings_show_organization-sync.md"
+ },
{
"title": "organizations settings show role-sync",
"description": "Role sync settings to sync organization roles from an IdP.",
diff --git a/docs/reference/cli/organizations_settings_set.md b/docs/reference/cli/organizations_settings_set.md
index b4fd819184030..e1e9bf0261a1b 100644
--- a/docs/reference/cli/organizations_settings_set.md
+++ b/docs/reference/cli/organizations_settings_set.md
@@ -20,7 +20,8 @@ coder organizations settings set
## Subcommands
-| Name | Purpose |
-| --------------------------------------------------------------------- | ---------------------------------------------------------- |
-| [group-sync
](./organizations_settings_set_group-sync.md) | Group sync settings to sync groups from an IdP. |
-| [role-sync
](./organizations_settings_set_role-sync.md) | Role sync settings to sync organization roles from an IdP. |
+| Name | Purpose |
+| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
+| [group-sync
](./organizations_settings_set_group-sync.md) | Group sync settings to sync groups from an IdP. |
+| [role-sync
](./organizations_settings_set_role-sync.md) | Role sync settings to sync organization roles from an IdP. |
+| [organization-sync
](./organizations_settings_set_organization-sync.md) | Organization sync settings to sync organization memberships from an IdP. |
diff --git a/docs/reference/cli/organizations_settings_set_organization-sync.md b/docs/reference/cli/organizations_settings_set_organization-sync.md
new file mode 100644
index 0000000000000..6b6557e2c3358
--- /dev/null
+++ b/docs/reference/cli/organizations_settings_set_organization-sync.md
@@ -0,0 +1,17 @@
+
+
+# organizations settings set organization-sync
+
+Organization sync settings to sync organization memberships from an IdP.
+
+Aliases:
+
+- organizationsync
+- org-sync
+- orgsync
+
+## Usage
+
+```console
+coder organizations settings set organization-sync
+```
diff --git a/docs/reference/cli/organizations_settings_show.md b/docs/reference/cli/organizations_settings_show.md
index 651f0a6f199de..feaef7d0124f9 100644
--- a/docs/reference/cli/organizations_settings_show.md
+++ b/docs/reference/cli/organizations_settings_show.md
@@ -20,7 +20,8 @@ coder organizations settings show
## Subcommands
-| Name | Purpose |
-| ---------------------------------------------------------------------- | ---------------------------------------------------------- |
-| [group-sync
](./organizations_settings_show_group-sync.md) | Group sync settings to sync groups from an IdP. |
-| [role-sync
](./organizations_settings_show_role-sync.md) | Role sync settings to sync organization roles from an IdP. |
+| Name | Purpose |
+| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------ |
+| [group-sync
](./organizations_settings_show_group-sync.md) | Group sync settings to sync groups from an IdP. |
+| [role-sync
](./organizations_settings_show_role-sync.md) | Role sync settings to sync organization roles from an IdP. |
+| [organization-sync
](./organizations_settings_show_organization-sync.md) | Organization sync settings to sync organization memberships from an IdP. |
diff --git a/docs/reference/cli/organizations_settings_show_organization-sync.md b/docs/reference/cli/organizations_settings_show_organization-sync.md
new file mode 100644
index 0000000000000..7e2e025c2a4af
--- /dev/null
+++ b/docs/reference/cli/organizations_settings_show_organization-sync.md
@@ -0,0 +1,17 @@
+
+
+# organizations settings show organization-sync
+
+Organization sync settings to sync organization memberships from an IdP.
+
+Aliases:
+
+- organizationsync
+- org-sync
+- orgsync
+
+## Usage
+
+```console
+coder organizations settings show organization-sync
+```
diff --git a/enterprise/cli/organizationsettings_test.go b/enterprise/cli/organizationsettings_test.go
index ad80c57cb3671..b0344ca358513 100644
--- a/enterprise/cli/organizationsettings_test.go
+++ b/enterprise/cli/organizationsettings_test.go
@@ -115,3 +115,51 @@ func TestUpdateRoleSync(t *testing.T) {
require.JSONEq(t, string(expectedData), buf.String())
})
}
+
+func TestUpdateOrganizationSync(t *testing.T) {
+ t.Parallel()
+
+ t.Run("OK", func(t *testing.T) {
+ t.Parallel()
+
+ owner, _ := coderdenttest.New(t, &coderdenttest.Options{
+ LicenseOptions: &coderdenttest.LicenseOptions{
+ Features: license.Features{
+ codersdk.FeatureMultipleOrganizations: 1,
+ },
+ },
+ })
+
+ ctx := testutil.Context(t, testutil.WaitLong)
+ inv, root := clitest.New(t, "organization", "settings", "set", "organization-sync")
+ //nolint:gocritic // Using the owner, testing the cli not perms
+ clitest.SetupConfig(t, owner, root)
+
+ expectedSettings := codersdk.OrganizationSyncSettings{
+ Field: "organizations",
+ Mapping: map[string][]uuid.UUID{
+ "test": {uuid.New()},
+ },
+ }
+ expectedData, err := json.Marshal(expectedSettings)
+ require.NoError(t, err)
+
+ buf := new(bytes.Buffer)
+ inv.Stdout = buf
+ inv.Stdin = bytes.NewBuffer(expectedData)
+ err = inv.WithContext(ctx).Run()
+ require.NoError(t, err)
+ require.JSONEq(t, string(expectedData), buf.String())
+
+ // Now read it back
+ inv, root = clitest.New(t, "organization", "settings", "show", "organization-sync")
+ //nolint:gocritic // Using the owner, testing the cli not perms
+ clitest.SetupConfig(t, owner, root)
+
+ buf = new(bytes.Buffer)
+ inv.Stdout = buf
+ err = inv.WithContext(ctx).Run()
+ require.NoError(t, err)
+ require.JSONEq(t, string(expectedData), buf.String())
+ })
+}