Skip to content

Commit cca3cb1

Browse files
authored
feat(provisioner): pass owner git ssh key (#13366)
1 parent b7edf5b commit cca3cb1

File tree

7 files changed

+235
-136
lines changed

7 files changed

+235
-136
lines changed

coderd/provisionerdserver/provisionerdserver.go

+11
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,15 @@ func (s *server) acquireProtoJob(ctx context.Context, job database.ProvisionerJo
467467
if err != nil {
468468
return nil, failJob(fmt.Sprintf("get owner: %s", err))
469469
}
470+
var ownerSSHPublicKey, ownerSSHPrivateKey string
471+
if ownerSSHKey, err := s.Database.GetGitSSHKey(ctx, owner.ID); err != nil {
472+
if !xerrors.Is(err, sql.ErrNoRows) {
473+
return nil, failJob(fmt.Sprintf("get owner ssh key: %s", err))
474+
}
475+
} else {
476+
ownerSSHPublicKey = ownerSSHKey.PublicKey
477+
ownerSSHPrivateKey = ownerSSHKey.PrivateKey
478+
}
470479
ownerGroups, err := s.Database.GetGroupsByOrganizationAndUserID(ctx, database.GetGroupsByOrganizationAndUserIDParams{
471480
UserID: owner.ID,
472481
OrganizationID: s.OrganizationID,
@@ -586,6 +595,8 @@ func (s *server) acquireProtoJob(ctx context.Context, job database.ProvisionerJo
586595
TemplateName: template.Name,
587596
TemplateVersion: templateVersion.Name,
588597
WorkspaceOwnerSessionToken: sessionToken,
598+
WorkspaceOwnerSshPublicKey: ownerSSHPublicKey,
599+
WorkspaceOwnerSshPrivateKey: ownerSSHPrivateKey,
589600
},
590601
LogLevel: input.LogLevel,
591602
},

coderd/provisionerdserver/provisionerdserver_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,9 @@ func TestAcquireJob(t *testing.T) {
190190
Name: "group1",
191191
OrganizationID: pd.OrganizationID,
192192
})
193+
sshKey := dbgen.GitSSHKey(t, db, database.GitSSHKey{
194+
UserID: user.ID,
195+
})
193196
err := db.InsertGroupMember(ctx, database.InsertGroupMemberParams{
194197
UserID: user.ID,
195198
GroupID: group1.ID,
@@ -360,6 +363,8 @@ func TestAcquireJob(t *testing.T) {
360363
TemplateName: template.Name,
361364
TemplateVersion: version.Name,
362365
WorkspaceOwnerSessionToken: sessionToken,
366+
WorkspaceOwnerSshPublicKey: sshKey.PublicKey,
367+
WorkspaceOwnerSshPrivateKey: sshKey.PrivateKey,
363368
},
364369
},
365370
})

provisioner/terraform/provision.go

+2
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ func provisionEnv(
202202
"CODER_WORKSPACE_OWNER_NAME="+metadata.GetWorkspaceOwnerName(),
203203
"CODER_WORKSPACE_OWNER_OIDC_ACCESS_TOKEN="+metadata.GetWorkspaceOwnerOidcAccessToken(),
204204
"CODER_WORKSPACE_OWNER_GROUPS="+string(ownerGroups),
205+
"CODER_WORKSPACE_OWNER_SSH_PUBLIC_KEY="+metadata.GetWorkspaceOwnerSshPublicKey(),
206+
"CODER_WORKSPACE_OWNER_SSH_PRIVATE_KEY="+metadata.GetWorkspaceOwnerSshPrivateKey(),
205207
"CODER_WORKSPACE_ID="+metadata.GetWorkspaceId(),
206208
"CODER_WORKSPACE_OWNER_ID="+metadata.GetWorkspaceOwnerId(),
207209
"CODER_WORKSPACE_OWNER_SESSION_TOKEN="+metadata.GetWorkspaceOwnerSessionToken(),

provisioner/terraform/provision_test.go

+46
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,52 @@ func TestProvision(t *testing.T) {
572572
}},
573573
},
574574
},
575+
{
576+
Name: "ssh-key",
577+
Files: map[string]string{
578+
"main.tf": `terraform {
579+
required_providers {
580+
coder = {
581+
source = "coder/coder"
582+
}
583+
}
584+
}
585+
586+
resource "null_resource" "example" {}
587+
data "coder_workspace_owner" "me" {}
588+
resource "coder_metadata" "example" {
589+
resource_id = null_resource.example.id
590+
item {
591+
key = "pubkey"
592+
value = data.coder_workspace_owner.me.ssh_public_key
593+
}
594+
item {
595+
key = "privkey"
596+
value = data.coder_workspace_owner.me.ssh_private_key
597+
}
598+
}
599+
`,
600+
},
601+
Request: &proto.PlanRequest{
602+
Metadata: &proto.Metadata{
603+
WorkspaceOwnerSshPublicKey: "fake public key",
604+
WorkspaceOwnerSshPrivateKey: "fake private key",
605+
},
606+
},
607+
Response: &proto.PlanComplete{
608+
Resources: []*proto.Resource{{
609+
Name: "example",
610+
Type: "null_resource",
611+
Metadata: []*proto.Resource_Metadata{{
612+
Key: "pubkey",
613+
Value: "fake public key",
614+
}, {
615+
Key: "privkey",
616+
Value: "fake private key",
617+
}},
618+
}},
619+
},
620+
},
575621
}
576622

577623
for _, testCase := range testCases {

0 commit comments

Comments
 (0)