github.com/jfrog/jfrog-cli-platform-services@v1.2.0/commands/dry_run_cmd.go (about)

     1  package commands
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  
     7  	"github.com/jfrog/jfrog-client-go/utils/log"
     8  
     9  	plugins_common "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
    10  	"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
    11  
    12  	"github.com/jfrog/jfrog-cli-platform-services/model"
    13  )
    14  
    15  type dryRunHandler struct {
    16  	ctx *components.Context
    17  }
    18  
    19  type dryRunRequest struct {
    20  	Code          string          `json:"code"`
    21  	Action        string          `json:"action"`
    22  	StagedSecrets []*model.Secret `json:"stagedSecrets,omitempty"`
    23  	Data          map[string]any  `json:"data"`
    24  }
    25  
    26  func GetDryRunCommand() components.Command {
    27  	return components.Command{
    28  		Name:        "dry-run",
    29  		Description: "Dry run a worker",
    30  		Aliases:     []string{"dr"},
    31  		Flags: []components.Flag{
    32  			plugins_common.GetServerIdFlag(),
    33  			model.GetTimeoutFlag(),
    34  			model.GetNoSecretsFlag(),
    35  		},
    36  		Arguments: []components.Argument{
    37  			model.GetJsonPayloadArgument(),
    38  		},
    39  		Action: func(c *components.Context) error {
    40  			h := &dryRunHandler{c}
    41  
    42  			manifest, err := model.ReadManifest()
    43  			if err != nil {
    44  				return err
    45  			}
    46  
    47  			if err = manifest.Validate(); err != nil {
    48  				return err
    49  			}
    50  
    51  			server, err := model.GetServerDetails(c)
    52  			if err != nil {
    53  				return err
    54  			}
    55  
    56  			inputReader := &cmdInputReader{c}
    57  
    58  			data, err := inputReader.readData()
    59  			if err != nil {
    60  				return err
    61  			}
    62  
    63  			if !c.GetBoolFlagValue(model.FlagNoSecrets) {
    64  				if err = manifest.DecryptSecrets(); err != nil {
    65  					return err
    66  				}
    67  			}
    68  
    69  			return h.run(manifest, server.GetUrl(), server.GetAccessToken(), data)
    70  		},
    71  	}
    72  }
    73  
    74  func (c *dryRunHandler) run(manifest *model.Manifest, serverUrl string, token string, data map[string]any) error {
    75  	body, err := c.preparePayload(manifest, serverUrl, token, data)
    76  	if err != nil {
    77  		return err
    78  	}
    79  	return callWorkerApiWithOutput(c.ctx, serverUrl, token, http.MethodPost, body, http.StatusOK, "test", manifest.Name)
    80  }
    81  
    82  func (c *dryRunHandler) preparePayload(manifest *model.Manifest, serverUrl string, token string, data map[string]any) ([]byte, error) {
    83  	payload := &dryRunRequest{Action: manifest.Action, Data: data}
    84  
    85  	var err error
    86  
    87  	payload.Code, err = manifest.ReadSourceCode()
    88  	if err != nil {
    89  		return nil, err
    90  	}
    91  	payload.Code = cleanImports(payload.Code)
    92  
    93  	existingWorker, err := fetchWorkerDetails(c.ctx, serverUrl, token, manifest.Name)
    94  	if err != nil {
    95  		log.Warn(err.Error())
    96  	}
    97  
    98  	if !c.ctx.GetBoolFlagValue(model.FlagNoSecrets) {
    99  		payload.StagedSecrets = prepareSecretsUpdate(manifest, existingWorker)
   100  	}
   101  
   102  	return json.Marshal(&payload)
   103  }