github.com/octohelm/wagon@v0.0.0-20240308040401-88662650dc0b/pkg/engine/plan/task/client_env.go (about)

     1  package task
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"os"
     7  	"strings"
     8  
     9  	"github.com/pkg/errors"
    10  
    11  	"dagger.io/dagger"
    12  
    13  	"github.com/octohelm/wagon/pkg/engine/daggerutil"
    14  	"github.com/octohelm/wagon/pkg/engine/plan/task/core"
    15  )
    16  
    17  func init() {
    18  	core.DefaultFactory.Register(&ClientEnv{})
    19  }
    20  
    21  type ClientEnv struct {
    22  	core.Task
    23  	Env map[string]core.SecretOrString `json:",inline" wagon:"generated"`
    24  }
    25  
    26  func (s *ClientEnv) UnmarshalJSON(data []byte) error {
    27  	if err := json.Unmarshal(data, &s.Env); err != nil {
    28  		return err
    29  	}
    30  	delete(s.Env, "$wagon")
    31  	return nil
    32  }
    33  
    34  func (s *ClientEnv) MarshalJSON() ([]byte, error) {
    35  	return json.Marshal(s.Env)
    36  }
    37  
    38  func (v *ClientEnv) Do(ctx context.Context) error {
    39  	clientEnvs := getClientEnvs()
    40  
    41  	return daggerutil.Do(ctx, func(c *dagger.Client) error {
    42  		env := map[string]core.SecretOrString{}
    43  
    44  		for key := range v.Env {
    45  			e := v.Env[key]
    46  
    47  			if envVar, ok := clientEnvs[key]; ok {
    48  				if secret := e.Secret; secret != nil {
    49  					envSecret := c.SetSecret(key, envVar)
    50  
    51  					if err := secret.SetSecretIDBy(ctx, envSecret); err != nil {
    52  						return err
    53  					}
    54  
    55  					env[key] = core.SecretOrString{
    56  						Secret: secret,
    57  					}
    58  				} else {
    59  					env[key] = core.SecretOrString{
    60  						Value: envVar,
    61  					}
    62  				}
    63  			} else {
    64  				if secret := e.Secret; secret != nil {
    65  					return errors.Errorf("EnvVar %s is not defined.", key)
    66  				}
    67  
    68  				env[key] = e
    69  			}
    70  		}
    71  
    72  		v.Env = env
    73  
    74  		return nil
    75  	})
    76  }
    77  
    78  func getClientEnvs() map[string]string {
    79  	clientEnvs := map[string]string{}
    80  
    81  	for _, i := range os.Environ() {
    82  		parts := strings.SplitN(i, "=", 2)
    83  		if len(parts) == 2 {
    84  			clientEnvs[parts[0]] = parts[1]
    85  		} else {
    86  			clientEnvs[parts[0]] = ""
    87  		}
    88  	}
    89  
    90  	return clientEnvs
    91  }