From edc99eff4cc4f55fe80c15f6a9cd37a2982809e7 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Mon, 30 Sep 2024 17:33:24 +0000 Subject: [PATCH 1/9] feat: show user-auth provisioners --- enterprise/coderd/provisionerkeys.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/enterprise/coderd/provisionerkeys.go b/enterprise/coderd/provisionerkeys.go index ea89538965afa..92d9dea58e9fb 100644 --- a/enterprise/coderd/provisionerkeys.go +++ b/enterprise/coderd/provisionerkeys.go @@ -147,9 +147,11 @@ func (api *API) provisionerKeyDaemons(rw http.ResponseWriter, r *http.Request) { pkDaemons := []codersdk.ProvisionerKeyDaemons{} for _, key := range sdkKeys { - // currently we exclude user-auth from this list + // Currently the user-auth key orgID is hardcoded to the default org. + // This will be changed when we update the `user-auth` keys to be + // directly tied to a user ID. if key.ID.String() == codersdk.ProvisionerKeyIDUserAuth { - continue + key.OrganizationID = organization.ID } daemons := []codersdk.ProvisionerDaemon{} for _, daemon := range recentDaemons { From a2faf9f665a543720a285d56264883aee3377473 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Mon, 30 Sep 2024 18:50:38 +0000 Subject: [PATCH 2/9] display on fe --- .../modules/provisioners/ProvisionerGroup.tsx | 57 ++++++++----------- .../OrganizationProvisionersPageView.tsx | 14 ++--- 2 files changed, 32 insertions(+), 39 deletions(-) diff --git a/site/src/modules/provisioners/ProvisionerGroup.tsx b/site/src/modules/provisioners/ProvisionerGroup.tsx index ee333c915a2fe..b0dc5a42227c3 100644 --- a/site/src/modules/provisioners/ProvisionerGroup.tsx +++ b/site/src/modules/provisioners/ProvisionerGroup.tsx @@ -27,7 +27,7 @@ import { createDayString } from "utils/createDayString"; import { docs } from "utils/docs"; import { ProvisionerTag } from "./ProvisionerTag"; -type ProvisionerGroupType = "builtin" | "psk" | "key"; +type ProvisionerGroupType = "builtin" | "userAuth" | "psk" | "key"; interface ProvisionerGroupProps { readonly buildInfo: BuildInfoResponse; @@ -62,7 +62,6 @@ export const ProvisionerGroup: FC = ({ return null; } - const daemonScope = firstProvisioner.tags.scope || "organization"; const allProvisionersAreSameVersion = provisioners.every( (it) => it.version === firstProvisioner.version, ); @@ -73,9 +72,6 @@ export const ProvisionerGroup: FC = ({ provisioners.length === 1 ? "1 provisioner" : `${provisioners.length} provisioners`; - const extraTags = Object.entries(keyTags).filter( - ([key]) => key !== "scope" && key !== "owner", - ); let warnings = 0; let provisionersWithWarnings = 0; @@ -102,9 +98,6 @@ export const ProvisionerGroup: FC = ({ ? "1 provisioner" : `${provisionersWithWarnings} provisioners`; - const hasMultipleTagVariants = - type === "psk" && provisioners.some((it) => !isSimpleTagSet(it.tags)); - return (
= ({ )} + {type === "userAuth" && } {type === "psk" && } {type === "key" && ( @@ -168,28 +162,8 @@ export const ProvisionerGroup: FC = ({ justifyContent: "right", }} > - {!hasMultipleTagVariants ? ( - - - ) : ( - - ) - } - > - {daemonScope} - - - ) : ( - }> - Multiple tags - - )} {type === "key" && - extraTags.map(([key, value]) => ( + Object.entries(keyTags).map(([key, value]) => ( ))}
@@ -248,9 +222,7 @@ export const ProvisionerGroup: FC = ({ )} - {hasMultipleTagVariants && ( - - )} + ))} @@ -413,6 +385,27 @@ const BuiltinProvisionerTitle: FC = () => { ); }; +const UserAuthProvisionerTitle: FC = () => { + return ( +

+ + User provisioners + + + + User provisioners + + These provisioners all use user session authentication. User + provisioners can be scoped to the user or organization.{" "} + Learn more… + + + + +

+ ); +}; + const PskProvisionerTitle: FC = () => { return (

diff --git a/site/src/pages/ManagementSettingsPage/OrganizationProvisionersPageView.tsx b/site/src/pages/ManagementSettingsPage/OrganizationProvisionersPageView.tsx index eac651f10219e..22afabde60b89 100644 --- a/site/src/pages/ManagementSettingsPage/OrganizationProvisionersPageView.tsx +++ b/site/src/pages/ManagementSettingsPage/OrganizationProvisionersPageView.tsx @@ -113,13 +113,13 @@ const ViewContent: FC = ({ buildInfo, provisioners }) => { {provisioners.map((group) => { const type = getGroupType(group.key); - // We intentionally hide user-authenticated provisioners for now - // because there are 1. some grouping issues on the backend and 2. we - // should ideally group them by the user who authenticated them, and - // not just lump them all together. - if (type === "userAuth") { - return null; - } + // // We intentionally hide user-authenticated provisioners for now + // // because there are 1. some grouping issues on the backend and 2. we + // // should ideally group them by the user who authenticated them, and + // // not just lump them all together. + // if (type === "userAuth") { + // return null; + // } return ( Date: Mon, 30 Sep 2024 19:19:15 +0000 Subject: [PATCH 3/9] cleanup --- .../modules/provisioners/ProvisionerGroup.tsx | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/site/src/modules/provisioners/ProvisionerGroup.tsx b/site/src/modules/provisioners/ProvisionerGroup.tsx index b0dc5a42227c3..795e394cba245 100644 --- a/site/src/modules/provisioners/ProvisionerGroup.tsx +++ b/site/src/modules/provisioners/ProvisionerGroup.tsx @@ -62,6 +62,7 @@ export const ProvisionerGroup: FC = ({ return null; } + const daemonScope = firstProvisioner.tags.scope || "organization"; const allProvisionersAreSameVersion = provisioners.every( (it) => it.version === firstProvisioner.version, ); @@ -72,6 +73,9 @@ export const ProvisionerGroup: FC = ({ provisioners.length === 1 ? "1 provisioner" : `${provisioners.length} provisioners`; + const extraTags = Object.entries(keyTags).filter( + ([key]) => key !== "scope" && key !== "owner", + ); let warnings = 0; let provisionersWithWarnings = 0; @@ -135,6 +139,7 @@ export const ProvisionerGroup: FC = ({ )} + {type === "userAuth" && } {type === "psk" && } @@ -162,10 +167,19 @@ export const ProvisionerGroup: FC = ({ justifyContent: "right", }} > + {/* {type !== "userAuth" && + + } + > + {"organization"} + + } {type === "key" && - Object.entries(keyTags).map(([key, value]) => ( + extraTags.map(([key, value]) => ( - ))} + ))} */} @@ -222,7 +236,7 @@ export const ProvisionerGroup: FC = ({ )} - + ))} @@ -307,11 +321,11 @@ const ProvisionerVersionPopover: FC = ({ ); }; -interface PskProvisionerTagsProps { +interface ProvisionerTagsProps { tags: Record; } -const PskProvisionerTags: FC = ({ tags }) => { +const ProvisionerTags: FC = ({ tags }) => { const daemonScope = tags.scope || "organization"; const iconScope = daemonScope === "organization" ? : ; From dfc83dfbf9a538e51025389f80c64e98d40bc48b Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Mon, 30 Sep 2024 19:19:51 +0000 Subject: [PATCH 4/9] cleanup --- site/src/modules/provisioners/ProvisionerGroup.tsx | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/site/src/modules/provisioners/ProvisionerGroup.tsx b/site/src/modules/provisioners/ProvisionerGroup.tsx index 795e394cba245..e6379678859af 100644 --- a/site/src/modules/provisioners/ProvisionerGroup.tsx +++ b/site/src/modules/provisioners/ProvisionerGroup.tsx @@ -167,19 +167,6 @@ export const ProvisionerGroup: FC = ({ justifyContent: "right", }} > - {/* {type !== "userAuth" && - - } - > - {"organization"} - - } - {type === "key" && - extraTags.map(([key, value]) => ( - - ))} */} From 46b3323117510e168979511dc1922f3e0fc034cf Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Mon, 30 Sep 2024 19:21:22 +0000 Subject: [PATCH 5/9] cleanup --- .../modules/provisioners/ProvisionerGroup.tsx | 3 +- .../OrganizationProvisionersPageView.tsx | 32 ++++++------------- 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/site/src/modules/provisioners/ProvisionerGroup.tsx b/site/src/modules/provisioners/ProvisionerGroup.tsx index e6379678859af..f70b51e09fc3b 100644 --- a/site/src/modules/provisioners/ProvisionerGroup.tsx +++ b/site/src/modules/provisioners/ProvisionerGroup.tsx @@ -166,8 +166,7 @@ export const ProvisionerGroup: FC = ({ gap: 12, justifyContent: "right", }} - > - + > {showDetails && ( diff --git a/site/src/pages/ManagementSettingsPage/OrganizationProvisionersPageView.tsx b/site/src/pages/ManagementSettingsPage/OrganizationProvisionersPageView.tsx index 22afabde60b89..7dd1bccab1aac 100644 --- a/site/src/pages/ManagementSettingsPage/OrganizationProvisionersPageView.tsx +++ b/site/src/pages/ManagementSettingsPage/OrganizationProvisionersPageView.tsx @@ -110,28 +110,16 @@ const ViewContent: FC = ({ buildInfo, provisioners }) => { )} - {provisioners.map((group) => { - const type = getGroupType(group.key); - - // // We intentionally hide user-authenticated provisioners for now - // // because there are 1. some grouping issues on the backend and 2. we - // // should ideally group them by the user who authenticated them, and - // // not just lump them all together. - // if (type === "userAuth") { - // return null; - // } - - return ( - - ); - })} + {provisioners.map((group) => ( + + ))} ); From f1b4fcf110d959b19ef256d43e86d067d0c596f0 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Tue, 1 Oct 2024 09:18:16 -0400 Subject: [PATCH 6/9] Apply suggestions from code review Co-authored-by: Ben Potter --- site/src/modules/provisioners/ProvisionerGroup.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/src/modules/provisioners/ProvisionerGroup.tsx b/site/src/modules/provisioners/ProvisionerGroup.tsx index f70b51e09fc3b..c25e3d0a0764d 100644 --- a/site/src/modules/provisioners/ProvisionerGroup.tsx +++ b/site/src/modules/provisioners/ProvisionerGroup.tsx @@ -389,11 +389,11 @@ const UserAuthProvisionerTitle: FC = () => { return (

- User provisioners + User-authenticated provisioners - User provisioners + User-authenticated provisioners These provisioners all use user session authentication. User provisioners can be scoped to the user or organization.{" "} From 59877499cb058a3f778925aca42a9f8f53e8318e Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Tue, 1 Oct 2024 16:24:50 +0000 Subject: [PATCH 7/9] fix comment --- enterprise/coderd/provisionerkeys.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/enterprise/coderd/provisionerkeys.go b/enterprise/coderd/provisionerkeys.go index 92d9dea58e9fb..08556e2eb24c2 100644 --- a/enterprise/coderd/provisionerkeys.go +++ b/enterprise/coderd/provisionerkeys.go @@ -147,7 +147,9 @@ func (api *API) provisionerKeyDaemons(rw http.ResponseWriter, r *http.Request) { pkDaemons := []codersdk.ProvisionerKeyDaemons{} for _, key := range sdkKeys { - // Currently the user-auth key orgID is hardcoded to the default org. + // The key.OrganizationID for the `user-auth` key is hardcoded to + // the default org in the database and we are overwriting it here + // to be the correct org we used to query the list. // This will be changed when we update the `user-auth` keys to be // directly tied to a user ID. if key.ID.String() == codersdk.ProvisionerKeyIDUserAuth { From f7489325e993dff00da8cc75cd91bc511ab1aac9 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 1 Oct 2024 16:49:38 +0000 Subject: [PATCH 8/9] clean up tags --- .../modules/provisioners/ProvisionerGroup.tsx | 39 +++++++++++++++++-- ...ganizationProvisionersPageView.stories.tsx | 12 ++++++ site/src/testHelpers/entities.ts | 2 +- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/site/src/modules/provisioners/ProvisionerGroup.tsx b/site/src/modules/provisioners/ProvisionerGroup.tsx index c25e3d0a0764d..56186a9de8a1e 100644 --- a/site/src/modules/provisioners/ProvisionerGroup.tsx +++ b/site/src/modules/provisioners/ProvisionerGroup.tsx @@ -102,6 +102,10 @@ export const ProvisionerGroup: FC = ({ ? "1 provisioner" : `${provisionersWithWarnings} provisioners`; + const hasMultipleTagVariants = + (type === "psk" || type === "userAuth") && + provisioners.some((it) => !isSimpleTagSet(it.tags)); + return (
= ({ gap: 12, justifyContent: "right", }} - >
+ > + {!hasMultipleTagVariants ? ( + + + ) : ( + + ) + } + > + {daemonScope} + + + ) : ( + }> + Multiple tags + + )} + {type === "key" && + extraTags.map(([key, value]) => ( + + ))} + {showDetails && ( @@ -222,7 +251,9 @@ export const ProvisionerGroup: FC = ({ )} - + {hasMultipleTagVariants && ( + + )}
))} @@ -307,11 +338,11 @@ const ProvisionerVersionPopover: FC = ({ ); }; -interface ProvisionerTagsProps { +interface InlineProvisionerTagsProps { tags: Record; } -const ProvisionerTags: FC = ({ tags }) => { +const InlineProvisionerTags: FC = ({ tags }) => { const daemonScope = tags.scope || "organization"; const iconScope = daemonScope === "organization" ? : ; diff --git a/site/src/pages/ManagementSettingsPage/OrganizationProvisionersPageView.stories.tsx b/site/src/pages/ManagementSettingsPage/OrganizationProvisionersPageView.stories.tsx index dec8e40e28d59..5bbf6cfe81731 100644 --- a/site/src/pages/ManagementSettingsPage/OrganizationProvisionersPageView.stories.tsx +++ b/site/src/pages/ManagementSettingsPage/OrganizationProvisionersPageView.stories.tsx @@ -7,6 +7,7 @@ import { MockProvisionerBuiltinKey, MockProvisionerKey, MockProvisionerPskKey, + MockProvisionerUserAuthKey, MockProvisionerWithTags, MockUserProvisioner, mockApiError, @@ -79,6 +80,17 @@ export const Provisioners: Story = { name: `ケイラ-${i}`, })), }, + { + key: MockProvisionerUserAuthKey, + daemons: [ + MockUserProvisioner, + { + ...MockUserProvisioner, + id: "mock-user-provisioner-2", + name: "Test User Provisioner 2", + }, + ], + }, ], }, play: async ({ step }) => { diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index be2a1ccdda196..7b654e54c48a2 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -610,7 +610,7 @@ export const MockProvisioner2: TypesGen.ProvisionerDaemon = { }; export const MockUserProvisioner: TypesGen.ProvisionerDaemon = { - ...MockProvisioner, + ...MockUserAuthProvisioner, id: "test-user-provisioner", name: "Test User Provisioner", tags: { scope: "user", owner: "12345678-abcd-1234-abcd-1234567890abcd" }, From 3937cca046a09599c00c37186b59b0abc544bd4d Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 1 Oct 2024 16:54:22 +0000 Subject: [PATCH 9/9] tweak tooltip wording --- site/src/modules/provisioners/ProvisionerGroup.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/site/src/modules/provisioners/ProvisionerGroup.tsx b/site/src/modules/provisioners/ProvisionerGroup.tsx index 56186a9de8a1e..79bcac0c9ba20 100644 --- a/site/src/modules/provisioners/ProvisionerGroup.tsx +++ b/site/src/modules/provisioners/ProvisionerGroup.tsx @@ -426,8 +426,11 @@ const UserAuthProvisionerTitle: FC = () => { User-authenticated provisioners - These provisioners all use user session authentication. User - provisioners can be scoped to the user or organization.{" "} + These provisioners are connected by users using the{" "} + coder CLI, and are authorized by the users + credentials. They can be tagged to only run provisioner jobs for + that user. User-authenticated provisioners are only available for + the default organization.{" "} Learn more…