@@ -27,6 +27,7 @@ import (
2727
2828 "github.com/diambra/cli/pkg/container"
2929 "github.com/diambra/cli/pkg/diambra/client"
30+ "github.com/diambra/cli/pkg/secretsources"
3031 "github.com/diambra/init/initializer"
3132 "github.com/go-kit/log"
3233 "github.com/go-kit/log/level"
@@ -234,22 +235,28 @@ const (
234235var ErrInvalidArgs = errors .New ("either image, manifest path or submission id must be provided" )
235236
236237type SubmissionConfig struct {
237- logger log.Logger
238-
239238 Mode string
240239 Difficulty string
241240 EnvVars map [string ]string
242241 Sources map [string ]string
243242 Secrets map [string ]string
243+ SecretsFrom string
244244 ArgsIsCommand bool
245245 ManifestPath string
246246 SubmissionID int
247+
248+ credentialsProvider map [string ]secretsources.CredentialProvider
247249}
248250
249- func NewSubmissionConfig ( logger log. Logger ) * SubmissionConfig {
250- return & SubmissionConfig {
251- logger : logger ,
251+ func ( c * SubmissionConfig ) RegisterCredentialsProvider ( name string , provider secretsources. CredentialProvider ) {
252+ if c . credentialsProvider == nil {
253+ c . credentialsProvider = make ( map [ string ]secretsources. CredentialProvider )
252254 }
255+ c .credentialsProvider [name ] = provider
256+ }
257+ func (c * SubmissionConfig ) RegisterCredentialsProviders () {
258+ c .RegisterCredentialsProvider ("git" , & secretsources.GitCredentials {})
259+ c .RegisterCredentialsProvider ("huggingface" , & secretsources.HuggingfaceCredentials {})
253260}
254261
255262func (c * SubmissionConfig ) AddFlags (flags * pflag.FlagSet ) {
@@ -258,20 +265,21 @@ func (c *SubmissionConfig) AddFlags(flags *pflag.FlagSet) {
258265 flags .StringToStringVarP (& c .EnvVars , "submission.env" , "e" , nil , "Environment variables to pass to the agent" )
259266 flags .StringToStringVarP (& c .Sources , "submission.source" , "u" , nil , "Source urls to pass to the agent" )
260267 flags .StringToStringVar (& c .Secrets , "submission.secret" , nil , "Secrets to pass to the agent" )
268+ flags .StringVar (& c .SecretsFrom , "submission.secrets-from" , "" , "Automatically add secrets. Supported values: git, huggingface" )
261269 flags .StringVar (& c .ManifestPath , "submission.manifest" , "" , "Path to manifest file." )
262270 flags .IntVar (& c .SubmissionID , "submission.id" , 0 , "Submission ID to retrieve manifest from" )
263271 flags .BoolVar (& c .ArgsIsCommand , "submission.set-command" , false , "Treat positional arguments are command instead of entrypoint" )
264272}
265273
266- func (c * SubmissionConfig ) Submission (credPath string , args []string ) (* client.Submission , error ) {
274+ func (c * SubmissionConfig ) Submission (config * EnvConfig , args []string ) (* client.Submission , error ) {
267275 var (
268276 nargs = len (args )
269277 manifest * client.Manifest
270278 )
271279
272280 switch {
273281 case c .SubmissionID != 0 :
274- cl , err := client .NewClient (c .logger , credPath )
282+ cl , err := client .NewClient (config .logger , config . CredPath )
275283 if err != nil {
276284 return nil , fmt .Errorf ("failed to create client: %w" , err )
277285 }
@@ -320,22 +328,62 @@ func (c *SubmissionConfig) Submission(credPath string, args []string) (*client.S
320328 }
321329
322330 if c .Sources != nil {
323- level .Debug (c .logger ).Log ("msg" , "Using sources" , "sources" , c .Sources )
331+ level .Debug (config .logger ).Log ("msg" , "Using sources" , "sources" , c .Sources )
324332 manifest .Sources = make (map [string ]string )
325333 for k , v := range c .Sources {
326334 manifest .Sources [k ] = v
327335 }
328336 }
329337
330- if manifest .Sources != nil {
331- init , err := initializer .NewInitializer (c .logger , manifest .Sources , c .Secrets , map [string ]string {}, "" )
332- if err != nil {
333- return nil , err
338+ if c .SecretsFrom != "" {
339+ if c .Secrets == nil {
340+ c .Secrets = make (map [string ]string )
334341 }
342+ }
335343
336- if err := init .Validate (); err != nil {
337- return nil , err
344+ if c .SecretsFrom != "" {
345+ ss , ok := c .credentialsProvider [c .SecretsFrom ]
346+ if ! ok {
347+ return nil , fmt .Errorf ("invalid value for --submission.secrets-from: %s" , c .SecretsFrom )
338348 }
349+ switch c .SecretsFrom {
350+ case "git" :
351+ secrets , err := secretsources .CredentialsFill (ss , manifest .Sources )
352+ if err != nil {
353+ return nil , err
354+ }
355+ if manifest .Sources == nil {
356+ return nil , fmt .Errorf ("sources are required to use --submission.secrets-from=git" )
357+ }
358+ level .Debug (config .logger ).Log ("msg" , "Adding git secrets" )
359+ for k , v := range secrets {
360+ level .Info (config .logger ).Log ("msg" , "Adding git secret" , "key" , k )
361+ c .Secrets [k ] = v
362+ }
363+ case "huggingface" :
364+ level .Debug (config .logger ).Log ("msg" , "Adding huggingface secrets" )
365+ secrets , err := ss .Credentials ("" )
366+ if err != nil {
367+ return nil , err
368+ }
369+ c .Secrets ["HF_TOKEN" ] = secrets ["HF_TOKEN" ]
370+ if manifest .Env == nil {
371+ manifest .Env = make (map [string ]string )
372+ }
373+ manifest .Env ["HF_TOKEN" ] = "{{ .Secrets.HF_TOKEN }}"
374+ case "" :
375+ default :
376+ return nil , fmt .Errorf ("invalid value for --submission.secrets-from: %s" , c .SecretsFrom )
377+ }
378+ }
379+
380+ init , err := initializer .NewInitializer (config .logger , manifest .Sources , c .Secrets , map [string ]string {}, "" )
381+ if err != nil {
382+ return nil , err
383+ }
384+
385+ if err := init .Validate (); err != nil {
386+ return nil , err
339387 }
340388
341389 return & client.Submission {
0 commit comments