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

     1  package commands
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"net/http"
     7  
     8  	plugins_common "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
     9  	"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
    10  	"github.com/jfrog/jfrog-client-go/utils/log"
    11  
    12  	"github.com/jfrog/jfrog-cli-platform-services/model"
    13  )
    14  
    15  type deployRequest struct {
    16  	Key            string               `json:"key"`
    17  	Description    string               `json:"description"`
    18  	Enabled        bool                 `json:"enabled"`
    19  	SourceCode     string               `json:"sourceCode"`
    20  	Action         string               `json:"action"`
    21  	FilterCriteria model.FilterCriteria `json:"filterCriteria,omitempty"`
    22  	Secrets        []*model.Secret      `json:"secrets"`
    23  }
    24  
    25  func GetDeployCommand() components.Command {
    26  	return components.Command{
    27  		Name:        "deploy",
    28  		Description: "Deploy a worker",
    29  		Aliases:     []string{"d"},
    30  		Flags: []components.Flag{
    31  			plugins_common.GetServerIdFlag(),
    32  			model.GetTimeoutFlag(),
    33  			model.GetNoSecretsFlag(),
    34  		},
    35  		Action: func(c *components.Context) error {
    36  			manifest, err := model.ReadManifest()
    37  			if err != nil {
    38  				return err
    39  			}
    40  
    41  			if err = manifest.Validate(); err != nil {
    42  				return err
    43  			}
    44  
    45  			server, err := model.GetServerDetails(c)
    46  			if err != nil {
    47  				return err
    48  			}
    49  
    50  			if !c.GetBoolFlagValue(model.FlagNoSecrets) {
    51  				if err = manifest.DecryptSecrets(); err != nil {
    52  					return err
    53  				}
    54  			}
    55  
    56  			return runDeployCommand(c, manifest, server.GetUrl(), server.GetAccessToken())
    57  		},
    58  	}
    59  }
    60  
    61  func runDeployCommand(ctx *components.Context, manifest *model.Manifest, serverUrl string, token string) error {
    62  	existingWorker, err := fetchWorkerDetails(ctx, serverUrl, token, manifest.Name)
    63  	if err != nil {
    64  		return err
    65  	}
    66  
    67  	body, err := prepareDeployRequest(ctx, manifest, existingWorker)
    68  	if err != nil {
    69  		return err
    70  	}
    71  
    72  	bodyBytes, err := json.Marshal(body)
    73  	if err != nil {
    74  		return err
    75  	}
    76  
    77  	if existingWorker == nil {
    78  		log.Info(fmt.Sprintf("Deploying worker '%s'", manifest.Name))
    79  		err = callWorkerApiWithOutput(ctx, serverUrl, token, http.MethodPost, bodyBytes, http.StatusCreated, "workers")
    80  		if err == nil {
    81  			log.Info(fmt.Sprintf("Worker '%s' deployed", manifest.Name))
    82  		}
    83  		return err
    84  	}
    85  
    86  	log.Info(fmt.Sprintf("Updating worker '%s'", manifest.Name))
    87  	err = callWorkerApiWithOutput(ctx, serverUrl, token, http.MethodPut, bodyBytes, http.StatusNoContent, "workers")
    88  	if err == nil {
    89  		log.Info(fmt.Sprintf("Worker '%s' updated", manifest.Name))
    90  	}
    91  
    92  	return err
    93  }
    94  
    95  func prepareDeployRequest(ctx *components.Context, manifest *model.Manifest, existingWorker *model.WorkerDetails) (*deployRequest, error) {
    96  	sourceCode, err := manifest.ReadSourceCode()
    97  	if err != nil {
    98  		return nil, err
    99  	}
   100  	sourceCode = cleanImports(sourceCode)
   101  
   102  	var secrets []*model.Secret
   103  
   104  	if !ctx.GetBoolFlagValue(model.FlagNoSecrets) {
   105  		secrets = prepareSecretsUpdate(manifest, existingWorker)
   106  	}
   107  
   108  	payload := &deployRequest{
   109  		Key:            manifest.Name,
   110  		Action:         manifest.Action,
   111  		Description:    manifest.Description,
   112  		Enabled:        manifest.Enabled,
   113  		FilterCriteria: manifest.FilterCriteria,
   114  		SourceCode:     sourceCode,
   115  		Secrets:        secrets,
   116  	}
   117  
   118  	return payload, nil
   119  }