Skip to content

Commit

Permalink
Merge pull request #13 from gammadia/secrets
Browse files Browse the repository at this point in the history
Basic secret feature for Jobfiles
  • Loading branch information
BastienClement committed Nov 7, 2023
2 parents ec33143 + cc29906 commit 05e2cb7
Show file tree
Hide file tree
Showing 9 changed files with 287 additions and 241 deletions.
1 change: 1 addition & 0 deletions client/jobfile/jobfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ type Jobfile struct {
Name string
Steps []JobfileImage
Env map[string]string
Secrets map[string]string
Services map[string]JobfileService
Tasks []string
}
Expand Down
8 changes: 8 additions & 0 deletions client/jobfile/reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,14 @@ func Read(file string, options ReadOptions) (job *proto.Job, err error) {
}
})
}
if len(jobfile.Secrets) > 0 {
job.Secrets = lo.MapToSlice(jobfile.Secrets, func(key string, value string) *proto.Job_Env {
return &proto.Job_Env{
Key: key,
Value: value,
}
})
}

for name, service := range jobfile.Services {
jobService := &proto.Job_Service{
Expand Down
483 changes: 247 additions & 236 deletions proto/alfred.pb.go

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions proto/alfred.proto
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@ message Job {
string about = 2;
repeated string steps = 3;
repeated Env env = 4;
repeated Service services = 5;
repeated string tasks = 6;
repeated Env secrets = 5;
repeated Service services = 6;
repeated string tasks = 7;

message Service {
string name = 1;
Expand Down
22 changes: 19 additions & 3 deletions provisioner/internal/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package internal

import (
"context"
"encoding/base64"
"fmt"
"io"
"log/slog"
Expand Down Expand Up @@ -233,14 +234,29 @@ func RunContainer(
for i, image := range task.Job.Steps {
// Using a func here so that defer are called between each iteration
if err := func(stepIndex int) error {
secretEnv := []string{}
for _, secret := range task.Job.Secrets {
if runConfig.SecretLoader == nil {
return fmt.Errorf("no secret loader available")
}
secretData, err := runConfig.SecretLoader(secret.Value)
if err != nil {
return fmt.Errorf("failed to load secret '%s': %w", secret.Key, err)
}
secretEnv = append(secretEnv, fmt.Sprintf("%s=%s", secret.Key, base64.StdEncoding.EncodeToString(secretData)))
}

resp, err := docker.ContainerCreate(
ctx,
&container.Config{
Image: image,
Env: append(
lo.Map(task.Job.Env, func(jobEnv *proto.Job_Env, _ int) string {
return fmt.Sprintf("%s=%s", jobEnv.Key, jobEnv.Value)
}),
append(
lo.Map(task.Job.Env, func(jobEnv *proto.Job_Env, _ int) string {
return fmt.Sprintf("%s=%s", jobEnv.Key, jobEnv.Value)
}),
secretEnv...,
),
[]string{
fmt.Sprintf("ALFRED_TASK=%s", task.Name),
"ALFRED_SHARED=/alfred/shared",
Expand Down
2 changes: 2 additions & 0 deletions scheduler/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@ import (
)

type ArtifactPreserver func(io.Reader, *Task) error
type SecretLoader func(string) ([]byte, error)

type Config struct {
ArtifactPreserver ArtifactPreserver `json:"-"`
Logger *slog.Logger `json:"-"`
MaxNodes int `json:"max-nodes"`
ProvisioningDelay time.Duration `json:"provisioning-delay"`
ProvisioningFailureCooldown time.Duration `json:"provisioning-failure-cooldown"`
SecretLoader SecretLoader `json:"-"`
TasksPerNode int `json:"tasks-per-node"`
}

Expand Down
1 change: 1 addition & 0 deletions scheduler/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ func (ns NodeStatus) AsProto() proto.NodeStatus_Status {

type RunTaskConfig struct {
ArtifactPreserver ArtifactPreserver
SecretLoader SecretLoader
}

type Node interface {
Expand Down
1 change: 1 addition & 0 deletions scheduler/scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,7 @@ func (s *Scheduler) watchTaskExecution(nodeState *nodeState, slot int, task *Tas

runConfig := RunTaskConfig{
ArtifactPreserver: s.config.ArtifactPreserver,
SecretLoader: s.config.SecretLoader,
}

task.log.Info("Running task")
Expand Down
5 changes: 5 additions & 0 deletions server/scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ func createScheduler() error {
MaxNodes: viper.GetInt(flags.MaxNodes),
ProvisioningDelay: viper.GetDuration(flags.ProvisioningDelay),
ProvisioningFailureCooldown: viper.GetDuration(flags.ProvisioningFailureCooldown),
SecretLoader: loadSecret,
TasksPerNode: viper.GetInt(flags.TasksPerNode),
}
if err := schedulerpkg.Validate(config); err != nil {
Expand Down Expand Up @@ -65,6 +66,10 @@ func preserveArtifacts(reader io.Reader, task *schedulerpkg.Task) error {
return nil
}

func loadSecret(secret string) ([]byte, error) {
return os.ReadFile(path.Join(dataRoot, "secrets", secret))
}

func createProvisioner() (schedulerpkg.Provisioner, error) {
logger := log.Base.With("component", "provisioner")
switch p := viper.GetString(flags.Provisioner); p {
Expand Down

0 comments on commit 05e2cb7

Please sign in to comment.