Skip to content

Commit c1db2f7

Browse files
committed
Added promote application version command
1 parent f96af20 commit c1db2f7

File tree

6 files changed

+132
-5
lines changed

6 files changed

+132
-5
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ prereq::
4949
GOBIN=${TOOLS_DIR} $(GOCMD) install go.uber.org/mock/[email protected]
5050

5151
build::
52-
go env GOOS GOARCH
53-
go build -ldflags="${LINKERFLAGS}" -gcflags ${COMPILERFLAGS} -o ${BINARY_CLI}/application-cli-plugin main.go
52+
$(GOCMD) env GOOS GOARCH
53+
$(GOCMD) build -ldflags="${LINKERFLAGS}" -gcflags ${COMPILERFLAGS} -o ${BINARY_CLI}/application-cli-plugin main.go
5454

5555

5656
build-install:: build

application/cli/cli.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,12 @@ func GetJfrogApplicationCli() components.App {
3232
appContext := app.NewAppContext()
3333
appEntity := components.CreateApp(
3434
"app",
35-
"1.0.0",
35+
"1.0.2",
3636
"JFrog Application CLI",
3737
[]components.Command{
3838
system.GetPingCommand(appContext),
3939
version.GetCreateAppVersionCommand(appContext),
40+
version.GetPromoteAppVersionCommand(appContext),
4041
},
4142
)
4243
return appEntity

application/commands/flags.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
44
import "github.com/jfrog/jfrog-cli-core/v2/plugins/components"
55

66
const (
7-
Ping = "ping"
8-
CreateAppVersion = "create-app-version"
7+
Ping = "ping"
8+
CreateAppVersion = "create-app-version"
9+
PromoteAppVersion = "promote-app-version"
910
)
1011

1112
const (
@@ -22,6 +23,7 @@ const (
2223
PackageRepositoryFlag = "package-repository"
2324
SpecFlag = "spec"
2425
SpecVarsFlag = "spec-vars"
26+
EnvironmentVarsFlag = "env"
2527
)
2628

2729
// Flag keys mapped to their corresponding components.Flag definition.
@@ -40,6 +42,7 @@ var flagsMap = map[string]components.Flag{
4042
PackageRepositoryFlag: components.NewStringFlag(PackageRepositoryFlag, "Package storing repository.", func(f *components.StringFlag) { f.Mandatory = false }),
4143
SpecFlag: components.NewStringFlag(SpecFlag, "A path to the specification file.", func(f *components.StringFlag) { f.Mandatory = false }),
4244
SpecVarsFlag: components.NewStringFlag(SpecVarsFlag, "List of semicolon-separated(;) variables in the form of \"key1=value1;key2=value2;...\" (wrapped by quotes) to be replaced in the File Spec. In the File Spec, the variables should be used as follows: ${key1}.` `", func(f *components.StringFlag) { f.Mandatory = false }),
45+
EnvironmentVarsFlag: components.NewStringFlag(EnvironmentVarsFlag, "Environment.", func(f *components.StringFlag) { f.Mandatory = true }),
4346
}
4447

4548
var commandFlags = map[string][]string{
@@ -57,6 +60,15 @@ var commandFlags = map[string][]string{
5760
SpecFlag,
5861
SpecVarsFlag,
5962
},
63+
PromoteAppVersion: {
64+
url,
65+
user,
66+
accessToken,
67+
ServerId,
68+
ProjectFlag,
69+
ApplicationKeyFlag,
70+
EnvironmentVarsFlag,
71+
},
6072

6173
Ping: {
6274
url,
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package version
2+
3+
import (
4+
"github.com/jfrog/jfrog-cli-application/application/app"
5+
"github.com/jfrog/jfrog-cli-application/application/commands"
6+
"github.com/jfrog/jfrog-cli-application/application/commands/utils"
7+
"github.com/jfrog/jfrog-cli-application/application/common"
8+
"github.com/jfrog/jfrog-cli-application/application/model"
9+
"github.com/jfrog/jfrog-cli-application/application/service"
10+
commonCLiCommands "github.com/jfrog/jfrog-cli-core/v2/common/commands"
11+
pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
12+
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
13+
coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
14+
"github.com/jfrog/jfrog-client-go/utils/errorutils"
15+
)
16+
17+
type promoteAppVersionCommand struct {
18+
versionService service.VersionService
19+
serverDetails *coreConfig.ServerDetails
20+
requestPayload *model.PromoteAppVersionRequest
21+
}
22+
23+
func (pv *promoteAppVersionCommand) Run() error {
24+
ctx := &service.Context{ServerDetails: pv.serverDetails}
25+
return pv.versionService.PromoteAppVersion(ctx, pv.requestPayload)
26+
}
27+
28+
func (pv *promoteAppVersionCommand) ServerDetails() (*coreConfig.ServerDetails, error) {
29+
return pv.serverDetails, nil
30+
}
31+
32+
func (pv *promoteAppVersionCommand) CommandName() string {
33+
return commands.PromoteAppVersion
34+
}
35+
36+
func (pv *promoteAppVersionCommand) prepareAndRunCommand(ctx *components.Context) error {
37+
if err := validatePromoteAppVersionContext(ctx); err != nil {
38+
return err
39+
}
40+
serverDetails, err := utils.ServerDetailsByFlags(ctx)
41+
if err != nil {
42+
return err
43+
}
44+
pv.serverDetails = serverDetails
45+
pv.requestPayload, err = pv.buildRequestPayload(ctx)
46+
if errorutils.CheckError(err) != nil {
47+
return err
48+
}
49+
return commonCLiCommands.Exec(pv)
50+
}
51+
52+
func validatePromoteAppVersionContext(ctx *components.Context) error {
53+
if show, err := pluginsCommon.ShowCmdHelpIfNeeded(ctx, ctx.Arguments); show || err != nil {
54+
return err
55+
}
56+
if len(ctx.Arguments) != 1 {
57+
return pluginsCommon.WrongNumberOfArgumentsHandler(ctx)
58+
}
59+
return nil
60+
}
61+
62+
func (pv *promoteAppVersionCommand) buildRequestPayload(ctx *components.Context) (*model.PromoteAppVersionRequest, error) {
63+
return &model.PromoteAppVersionRequest{
64+
ApplicationKey: ctx.GetStringFlagValue(commands.ApplicationKeyFlag),
65+
Version: ctx.Arguments[0],
66+
Environment: ctx.GetStringFlagValue(commands.EnvironmentVarsFlag),
67+
}, nil
68+
}
69+
70+
func GetPromoteAppVersionCommand(appContext app.Context) components.Command {
71+
cmd := &promoteAppVersionCommand{versionService: appContext.GetVersionService()}
72+
return components.Command{
73+
Name: commands.PromoteAppVersion,
74+
Description: "Promote application version",
75+
Category: common.CategoryVersion,
76+
Aliases: []string{"pav"},
77+
Arguments: []components.Argument{
78+
{
79+
Name: "version-name",
80+
Description: "The name of the version",
81+
Optional: false,
82+
},
83+
},
84+
Flags: commands.GetCommandFlags(commands.PromoteAppVersion),
85+
Action: cmd.prepareAndRunCommand,
86+
}
87+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package model
2+
3+
type PromoteAppVersionRequest struct {
4+
ApplicationKey string `json:"application_key"`
5+
Version string `json:"version"`
6+
Environment string `json:"environment"`
7+
}

application/service/version_service.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
type VersionService interface {
1010
CreateAppVersion(ctx *Context, request *model.CreateAppVersionRequest) error
11+
PromoteAppVersion(ctx *Context, payload *model.PromoteAppVersionRequest) error
1112
}
1213

1314
type versionService struct {
@@ -35,3 +36,22 @@ func (vs *versionService) CreateAppVersion(ctx *Context, request *model.CreateAp
3536

3637
return nil
3738
}
39+
40+
func (vs *versionService) PromoteAppVersion(ctx *Context, payload *model.PromoteAppVersionRequest) error {
41+
httpClient, err := http.NewAppHttpClient(ctx.ServerDetails)
42+
if err != nil {
43+
return err
44+
}
45+
46+
response, responseBody, err := httpClient.Post("/v1/version/promote", payload)
47+
if err != nil {
48+
return err
49+
}
50+
51+
if response.StatusCode >= 400 {
52+
return fmt.Errorf("failed to promote app version. Status code: %d. \n%s",
53+
response.StatusCode, responseBody)
54+
}
55+
56+
return nil
57+
}

0 commit comments

Comments
 (0)