@@ -39,6 +39,7 @@ import (
3939
4040const (
4141 cloudAgentsBetaSignupURL = "https://forms.gle/GkGNNTiMt2qyfnu78"
42+ maxSecretFileSize = 1024 * 1024 // 1MB
4243)
4344
4445var (
6970 Required : false ,
7071 }
7172
73+ secretsMountFlag = & cli.StringSliceFlag {
74+ Name : "secret-mount" ,
75+ Usage : "Local path to a secret file to be mounted on agent environment" ,
76+ Required : false ,
77+ }
78+
7279 logTypeFlag = & cli.StringFlag {
7380 Name : "log-type" ,
7481 Usage : "Type of logs to retrieve. Valid values are 'deploy' and 'build'" ,
@@ -103,6 +110,7 @@ var (
103110 Flags : []cli.Flag {
104111 secretsFlag ,
105112 secretsFileFlag ,
113+ secretsMountFlag ,
106114 silentFlag ,
107115 regionFlag ,
108116 skipSDKCheckFlag ,
@@ -146,6 +154,7 @@ var (
146154 Flags : []cli.Flag {
147155 secretsFlag ,
148156 secretsFileFlag ,
157+ secretsMountFlag ,
149158 skipSDKCheckFlag ,
150159 },
151160 // NOTE: since secrets may contain commas, or indeed any special character we might want to treat as a flag separator,
@@ -171,6 +180,7 @@ var (
171180 Flags : []cli.Flag {
172181 secretsFlag ,
173182 secretsFileFlag ,
183+ secretsMountFlag ,
174184 },
175185 // NOTE: since secrets may contain commas, or indeed any special character we might want to treat as a flag separator,
176186 // we disable it entirely here and require multiple --secrets flags to be used.
@@ -263,6 +273,7 @@ var (
263273 Flags : []cli.Flag {
264274 secretsFlag ,
265275 secretsFileFlag ,
276+ secretsMountFlag ,
266277 idFlag (false ),
267278 & cli.BoolFlag {
268279 Name : "overwrite" ,
@@ -1112,17 +1123,39 @@ func requireSecrets(_ context.Context, cmd *cli.Command, required, lazy bool) ([
11121123 silent := cmd .Bool ("silent" )
11131124 secrets := make (map [string ]* lkproto.AgentSecret )
11141125
1126+ mountableSecretFiles := cmd .StringSlice ("secret-mount" )
1127+ for _ , filePath := range mountableSecretFiles {
1128+ fileInfo , err := os .Stat (filePath )
1129+ if err != nil {
1130+ return nil , fmt .Errorf ("failed to get secret file: %w" , err )
1131+ }
1132+ if fileInfo .Size () > maxSecretFileSize {
1133+ return nil , fmt .Errorf ("secret file size is too large (must be under %d MB): %s" , maxSecretFileSize / (1024 * 1024 ), filePath )
1134+ }
1135+ fileContent , err := os .ReadFile (filePath )
1136+ if err != nil {
1137+ return nil , fmt .Errorf ("failed to read secret file: %w" , err )
1138+ }
1139+ name := fileInfo .Name ()
1140+ agentSecret := & lkproto.AgentSecret {
1141+ Name : name ,
1142+ Value : []byte (fileContent ),
1143+ Kind : lkproto .AgentSecretKind_AGENT_SECRET_KIND_FILE ,
1144+ }
1145+ secrets [name ] = agentSecret
1146+ }
1147+
11151148 if values , err := parseKeyValuePairs (cmd , "secrets" ); err != nil {
11161149 return nil , fmt .Errorf ("failed to parse secrets: %w" , err )
11171150 } else {
11181151 for key , val := range values {
11191152 agentSecret := & lkproto.AgentSecret {
11201153 Name : key ,
11211154 Value : []byte (val ),
1155+ Kind : lkproto .AgentSecretKind_AGENT_SECRET_KIND_ENVIRONMENT ,
11221156 }
11231157 secrets [key ] = agentSecret
11241158 }
1125-
11261159 }
11271160
11281161 shouldReadFromDisk := cmd .IsSet ("secrets-file" ) || ! lazy || (required && len (secrets ) == 0 )
@@ -1143,6 +1176,7 @@ func requireSecrets(_ context.Context, cmd *cli.Command, required, lazy bool) ([
11431176 secret := & lkproto.AgentSecret {
11441177 Name : k ,
11451178 Value : []byte (v ),
1179+ Kind : lkproto .AgentSecretKind_AGENT_SECRET_KIND_ENVIRONMENT ,
11461180 }
11471181 secrets [k ] = secret
11481182 }
0 commit comments