Skip to content

Commit 8044a89

Browse files
authored
Update application command (#18)
* Update application command
1 parent ed64b7d commit 8044a89

File tree

10 files changed

+301
-18
lines changed

10 files changed

+301
-18
lines changed

application/cli/cli.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ func GetJfrogApplicationCli() components.App {
4040
version.GetCreateAppVersionCommand(appContext),
4141
version.GetPromoteAppVersionCommand(appContext),
4242
application.GetCreateAppCommand(appContext),
43+
application.GetUpdateAppCommand(appContext),
4344
},
4445
)
4546
return appEntity

application/commands/application/create_app_cmd.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
type createAppCommand struct {
2121
serverDetails *coreConfig.ServerDetails
2222
applicationService applications.ApplicationService
23-
requestBody *model.CreateAppRequest
23+
requestBody *model.AppDescriptor
2424
}
2525

2626
func (cac *createAppCommand) Run() error {
@@ -40,7 +40,7 @@ func (cac *createAppCommand) CommandName() string {
4040
return commands.CreateApp
4141
}
4242

43-
func (cac *createAppCommand) buildRequestPayload(ctx *components.Context) (*model.CreateAppRequest, error) {
43+
func (cac *createAppCommand) buildRequestPayload(ctx *components.Context) (*model.AppDescriptor, error) {
4444
applicationKey := ctx.Arguments[0]
4545
applicationName := ctx.GetStringFlagValue(commands.ApplicationNameFlag)
4646
if applicationName == "" {
@@ -81,7 +81,7 @@ func (cac *createAppCommand) buildRequestPayload(ctx *components.Context) (*mode
8181
return nil, err
8282
}
8383

84-
return &model.CreateAppRequest{
84+
return &model.AppDescriptor{
8585
ApplicationName: applicationName,
8686
ApplicationKey: applicationKey,
8787
Description: description,

application/commands/application/create_app_cmd_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func TestCreateAppCommand_Run(t *testing.T) {
2020
defer ctrl.Finish()
2121

2222
serverDetails := &config.ServerDetails{Url: "https://example.com"}
23-
requestPayload := &model.CreateAppRequest{
23+
requestPayload := &model.AppDescriptor{
2424
ApplicationKey: "app-key",
2525
ApplicationName: "app-name",
2626
ProjectKey: "proj-key",
@@ -44,7 +44,7 @@ func TestCreateAppCommand_Error(t *testing.T) {
4444
defer ctrl.Finish()
4545

4646
serverDetails := &config.ServerDetails{Url: "https://example.com"}
47-
requestPayload := &model.CreateAppRequest{
47+
requestPayload := &model.AppDescriptor{
4848
ApplicationKey: "app-key",
4949
ApplicationName: "app-name",
5050
ProjectKey: "proj-key",
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package application
2+
3+
import (
4+
pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
5+
6+
"github.com/jfrog/jfrog-cli-application/application/app"
7+
"github.com/jfrog/jfrog-cli-application/application/commands"
8+
"github.com/jfrog/jfrog-cli-application/application/commands/utils"
9+
"github.com/jfrog/jfrog-cli-application/application/common"
10+
"github.com/jfrog/jfrog-cli-application/application/model"
11+
"github.com/jfrog/jfrog-cli-application/application/service"
12+
"github.com/jfrog/jfrog-cli-application/application/service/applications"
13+
commonCLiCommands "github.com/jfrog/jfrog-cli-core/v2/common/commands"
14+
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
15+
coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
16+
)
17+
18+
const UpdateApp = "update-app"
19+
20+
type updateAppCommand struct {
21+
serverDetails *coreConfig.ServerDetails
22+
applicationService applications.ApplicationService
23+
requestBody *model.AppDescriptor
24+
}
25+
26+
func (uac *updateAppCommand) Run() error {
27+
ctx, err := service.NewContext(*uac.serverDetails)
28+
if err != nil {
29+
return err
30+
}
31+
32+
return uac.applicationService.UpdateApplication(ctx, uac.requestBody)
33+
}
34+
35+
func (uac *updateAppCommand) ServerDetails() (*coreConfig.ServerDetails, error) {
36+
return uac.serverDetails, nil
37+
}
38+
39+
func (uac *updateAppCommand) CommandName() string {
40+
return UpdateApp
41+
}
42+
43+
func (uac *updateAppCommand) buildRequestPayload(ctx *components.Context) (*model.AppDescriptor, error) {
44+
applicationKey := ctx.Arguments[0]
45+
applicationName := ctx.GetStringFlagValue(commands.ApplicationNameFlag)
46+
47+
businessCriticalityStr := ctx.GetStringFlagValue(commands.BusinessCriticalityFlag)
48+
businessCriticality, err := utils.ValidateEnumFlag(
49+
commands.BusinessCriticalityFlag,
50+
businessCriticalityStr,
51+
"",
52+
model.BusinessCriticalityValues)
53+
if err != nil {
54+
return nil, err
55+
}
56+
57+
maturityLevelStr := ctx.GetStringFlagValue(commands.MaturityLevelFlag)
58+
maturityLevel, err := utils.ValidateEnumFlag(
59+
commands.MaturityLevelFlag,
60+
maturityLevelStr,
61+
model.MaturityLevelUnspecified,
62+
model.MaturityLevelValues)
63+
if err != nil {
64+
return nil, err
65+
}
66+
67+
description := ctx.GetStringFlagValue(commands.DescriptionFlag)
68+
userOwners := utils.ParseSliceFlag(ctx.GetStringFlagValue(commands.UserOwnersFlag))
69+
groupOwners := utils.ParseSliceFlag(ctx.GetStringFlagValue(commands.GroupOwnersFlag))
70+
labelsMap, err := utils.ParseMapFlag(ctx.GetStringFlagValue(commands.LabelsFlag))
71+
if err != nil {
72+
return nil, err
73+
}
74+
75+
return &model.AppDescriptor{
76+
ApplicationKey: applicationKey,
77+
ApplicationName: applicationName,
78+
Description: description,
79+
MaturityLevel: maturityLevel,
80+
BusinessCriticality: businessCriticality,
81+
Labels: labelsMap,
82+
UserOwners: userOwners,
83+
GroupOwners: groupOwners,
84+
}, nil
85+
}
86+
87+
func (uac *updateAppCommand) prepareAndRunCommand(ctx *components.Context) error {
88+
if len(ctx.Arguments) != 1 {
89+
return pluginsCommon.WrongNumberOfArgumentsHandler(ctx)
90+
}
91+
92+
var err error
93+
uac.requestBody, err = uac.buildRequestPayload(ctx)
94+
if err != nil {
95+
return err
96+
}
97+
98+
uac.serverDetails, err = utils.ServerDetailsByFlags(ctx)
99+
if err != nil {
100+
return err
101+
}
102+
103+
return commonCLiCommands.Exec(uac)
104+
}
105+
106+
func GetUpdateAppCommand(appContext app.Context) components.Command {
107+
cmd := &updateAppCommand{
108+
applicationService: appContext.GetApplicationService(),
109+
}
110+
return components.Command{
111+
Name: "update",
112+
Description: "Update an existing application",
113+
Category: common.CategoryApplication,
114+
Arguments: []components.Argument{
115+
{
116+
Name: "application-key",
117+
Description: "The key of the application to update",
118+
Optional: false,
119+
},
120+
},
121+
Flags: commands.GetCommandFlags(commands.UpdateApp),
122+
Action: cmd.prepareAndRunCommand,
123+
}
124+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package application
2+
3+
import (
4+
"errors"
5+
"flag"
6+
"testing"
7+
8+
"github.com/urfave/cli"
9+
10+
"github.com/jfrog/jfrog-cli-application/application/model"
11+
mockapps "github.com/jfrog/jfrog-cli-application/application/service/applications/mocks"
12+
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
13+
"github.com/jfrog/jfrog-cli-core/v2/utils/config"
14+
"github.com/stretchr/testify/assert"
15+
"go.uber.org/mock/gomock"
16+
)
17+
18+
func TestUpdateAppCommand_Run(t *testing.T) {
19+
ctrl := gomock.NewController(t)
20+
defer ctrl.Finish()
21+
22+
serverDetails := &config.ServerDetails{Url: "https://example.com"}
23+
appKey := "app-key"
24+
requestPayload := &model.AppDescriptor{
25+
ApplicationKey: appKey,
26+
ApplicationName: "app-name",
27+
Description: "Updated description",
28+
MaturityLevel: "production",
29+
BusinessCriticality: "high",
30+
Labels: map[string]string{
31+
"environment": "production",
32+
"region": "us-east",
33+
},
34+
UserOwners: []string{"JohnD", "Dave Rice"},
35+
GroupOwners: []string{"DevOps"},
36+
}
37+
38+
mockAppService := mockapps.NewMockApplicationService(ctrl)
39+
mockAppService.EXPECT().UpdateApplication(gomock.Any(), requestPayload).Return(nil).Times(1)
40+
41+
cmd := &updateAppCommand{
42+
applicationService: mockAppService,
43+
serverDetails: serverDetails,
44+
requestBody: requestPayload,
45+
}
46+
47+
err := cmd.Run()
48+
assert.NoError(t, err)
49+
}
50+
51+
func TestUpdateAppCommand_Run_Error(t *testing.T) {
52+
ctrl := gomock.NewController(t)
53+
defer ctrl.Finish()
54+
55+
serverDetails := &config.ServerDetails{Url: "https://example.com"}
56+
appKey := "app-key"
57+
requestPayload := &model.AppDescriptor{
58+
ApplicationKey: appKey,
59+
ApplicationName: "app-name",
60+
Description: "Updated description",
61+
MaturityLevel: "production",
62+
BusinessCriticality: "high",
63+
Labels: map[string]string{
64+
"environment": "production",
65+
"region": "us-east",
66+
},
67+
UserOwners: []string{"JohnD", "Dave Rice"},
68+
GroupOwners: []string{"DevOps"},
69+
}
70+
71+
mockAppService := mockapps.NewMockApplicationService(ctrl)
72+
mockAppService.EXPECT().UpdateApplication(gomock.Any(), requestPayload).Return(errors.New("failed to update application. Status code: 500")).Times(1)
73+
74+
cmd := &updateAppCommand{
75+
applicationService: mockAppService,
76+
serverDetails: serverDetails,
77+
requestBody: requestPayload,
78+
}
79+
80+
err := cmd.Run()
81+
assert.Error(t, err)
82+
assert.Equal(t, "failed to update application. Status code: 500", err.Error())
83+
}
84+
85+
func TestUpdateAppCommand_WrongNumberOfArguments(t *testing.T) {
86+
ctrl := gomock.NewController(t)
87+
defer ctrl.Finish()
88+
app := cli.NewApp()
89+
set := flag.NewFlagSet("test", 0)
90+
ctx := cli.NewContext(app, set, nil)
91+
92+
mockAppService := mockapps.NewMockApplicationService(ctrl)
93+
cmd := &updateAppCommand{
94+
applicationService: mockAppService,
95+
}
96+
97+
// Test with no arguments
98+
context, err := components.ConvertContext(ctx)
99+
assert.NoError(t, err)
100+
101+
err = cmd.prepareAndRunCommand(context)
102+
assert.Error(t, err)
103+
assert.Contains(t, err.Error(), "Wrong number of arguments")
104+
}

application/commands/flags.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ const (
1212
CreateAppVersion = "create-app-version"
1313
PromoteAppVersion = "promote-app-version"
1414
CreateApp = "create-app"
15+
UpdateApp = "update-app"
1516
)
1617

1718
const (
18-
ServerId = "server-id"
19+
serverId = "server-id"
1920
url = "url"
2021
user = "user"
2122
accessToken = "access-token"
@@ -42,7 +43,7 @@ const (
4243
// Flag keys mapped to their corresponding components.Flag definition.
4344
var flagsMap = map[string]components.Flag{
4445
// Common commands flags
45-
ServerId: components.NewStringFlag(ServerId, "Server ID configured using the config command.", func(f *components.StringFlag) { f.Mandatory = false }),
46+
serverId: components.NewStringFlag(serverId, "Server ID configured using the config command.", func(f *components.StringFlag) { f.Mandatory = false }),
4647
url: components.NewStringFlag(url, "JFrog Platform URL.", func(f *components.StringFlag) { f.Mandatory = false }),
4748
user: components.NewStringFlag(user, "JFrog username.", func(f *components.StringFlag) { f.Mandatory = false }),
4849
accessToken: components.NewStringFlag(accessToken, "JFrog access token.", func(f *components.StringFlag) { f.Mandatory = false }),
@@ -71,7 +72,7 @@ var commandFlags = map[string][]string{
7172
url,
7273
user,
7374
accessToken,
74-
ServerId,
75+
serverId,
7576
ApplicationKeyFlag,
7677
PackageTypeFlag,
7778
PackageNameFlag,
@@ -84,7 +85,7 @@ var commandFlags = map[string][]string{
8485
url,
8586
user,
8687
accessToken,
87-
ServerId,
88+
serverId,
8889
ApplicationKeyFlag,
8990
StageVarsFlag,
9091
},
@@ -93,14 +94,14 @@ var commandFlags = map[string][]string{
9394
url,
9495
user,
9596
accessToken,
96-
ServerId,
97+
serverId,
9798
},
9899

99100
CreateApp: {
100101
url,
101102
user,
102103
accessToken,
103-
ServerId,
104+
serverId,
104105
ApplicationNameFlag,
105106
ProjectFlag,
106107
DescriptionFlag,
@@ -113,6 +114,23 @@ var commandFlags = map[string][]string{
113114
SpecFlag,
114115
SpecVarsFlag,
115116
},
117+
118+
UpdateApp: {
119+
url,
120+
user,
121+
accessToken,
122+
serverId,
123+
ApplicationNameFlag,
124+
DescriptionFlag,
125+
BusinessCriticalityFlag,
126+
MaturityLevelFlag,
127+
LabelsFlag,
128+
UserOwnersFlag,
129+
GroupOwnersFlag,
130+
SigningKeyFlag,
131+
SpecFlag,
132+
SpecVarsFlag,
133+
},
116134
}
117135

118136
func GetCommandFlags(cmdKey string) []components.Flag {

0 commit comments

Comments
 (0)