Skip to content

Commit 7ae6b55

Browse files
committed
Added create version command
1 parent 5616e2b commit 7ae6b55

File tree

13 files changed

+407
-3
lines changed

13 files changed

+407
-3
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package auth
2+
3+
import "github.com/jfrog/jfrog-client-go/auth"
4+
5+
type appDetails struct {
6+
auth.CommonConfigFields
7+
}
8+
9+
func NewAppDetails() auth.ServiceDetails {
10+
return &appDetails{}
11+
}
12+
13+
func (rt *appDetails) GetVersion() (string, error) {
14+
panic("Failed: Method is not implemented")
15+
}

application/app/context.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package app
2+
3+
import (
4+
"github.com/jfrog/jfrog-cli-application/application/service"
5+
)
6+
7+
type Context interface {
8+
GetVersionService() service.VersionService
9+
GetSystemService() service.SystemService
10+
GetConfig() interface{}
11+
}
12+
13+
type context struct {
14+
versionService service.VersionService
15+
systemService service.SystemService
16+
}
17+
18+
func NewAppContext() Context {
19+
return &context{
20+
versionService: service.NewVersionService(),
21+
systemService: service.NewSystemService(),
22+
}
23+
}
24+
25+
func (c *context) GetVersionService() service.VersionService {
26+
return c.versionService
27+
}
28+
29+
func (c *context) GetSystemService() service.SystemService {
30+
return c.systemService
31+
}
32+
33+
func (c *context) GetConfig() interface{} {
34+
return nil
35+
}

application/cli/cli.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
package cli
22

33
import (
4+
"github.com/jfrog/jfrog-cli-application/application/app"
5+
"github.com/jfrog/jfrog-cli-application/application/commands/system"
6+
"github.com/jfrog/jfrog-cli-application/application/commands/version"
47
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
58
)
69

710
const category = "Application Lifecycle"
811

912
func GetJfrogApplicationCli() components.App {
10-
app := components.CreateEmbeddedApp(
13+
appContext := app.NewAppContext()
14+
appEntity := components.CreateEmbeddedApp(
1115
category,
1216
nil,
1317
components.Namespace{
1418
Name: "app",
1519
Description: "Tools for Application Lifecycle management",
1620
Category: category,
17-
Commands: []components.Command{},
21+
Commands: []components.Command{
22+
system.GetPingCommand(appContext),
23+
version.GetCreateAppVersionCommand(appContext),
24+
},
1825
},
1926
)
20-
return app
27+
return appEntity
2128
}

application/commands/flags.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package commands
2+
3+
import pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
4+
import "github.com/jfrog/jfrog-cli-core/v2/plugins/components"
5+
6+
const (
7+
CreateAppVersion = "create-app-version"
8+
)
9+
10+
const (
11+
ServerId = "server-id"
12+
url = "url"
13+
user = "user"
14+
accessToken = "access-token"
15+
ProjectFlag = "project"
16+
17+
ApplicationKey = "app"
18+
PackageTypeFlag = "package-type"
19+
PackageNameFlag = "package-name"
20+
PackageVersionFlag = "package-version"
21+
PackageRepoNameFlag = "package-repo-name"
22+
)
23+
24+
// Flag keys mapped to their corresponding components.Flag definition.
25+
var flagsMap = map[string]components.Flag{
26+
// Common commands flags
27+
ServerId: components.NewStringFlag(ServerId, "Server ID configured using the config command.", func(f *components.StringFlag) { f.Mandatory = false }),
28+
url: components.NewStringFlag(url, "JFrog Platform URL.", func(f *components.StringFlag) { f.Mandatory = false }),
29+
user: components.NewStringFlag(user, "JFrog username.", func(f *components.StringFlag) { f.Mandatory = false }),
30+
accessToken: components.NewStringFlag(accessToken, "JFrog access token.", func(f *components.StringFlag) { f.Mandatory = false }),
31+
ProjectFlag: components.NewStringFlag(ProjectFlag, "Project key associated with the created evidence.", func(f *components.StringFlag) { f.Mandatory = false }),
32+
33+
ApplicationKey: components.NewStringFlag(ApplicationKey, "Application key.", func(f *components.StringFlag) { f.Mandatory = true }),
34+
PackageTypeFlag: components.NewStringFlag(PackageTypeFlag, "Package type.", func(f *components.StringFlag) { f.Mandatory = false }),
35+
PackageNameFlag: components.NewStringFlag(PackageNameFlag, "Package name.", func(f *components.StringFlag) { f.Mandatory = false }),
36+
PackageVersionFlag: components.NewStringFlag(PackageVersionFlag, "Package version.", func(f *components.StringFlag) { f.Mandatory = false }),
37+
PackageRepoNameFlag: components.NewStringFlag(PackageRepoNameFlag, "Package repository Name.", func(f *components.StringFlag) { f.Mandatory = false }),
38+
}
39+
40+
var commandFlags = map[string][]string{
41+
CreateAppVersion: {
42+
url,
43+
user,
44+
accessToken,
45+
ServerId,
46+
ProjectFlag,
47+
ApplicationKey,
48+
PackageTypeFlag,
49+
PackageNameFlag,
50+
PackageVersionFlag,
51+
PackageRepoNameFlag,
52+
},
53+
}
54+
55+
func GetCommandFlags(cmdKey string) []components.Flag {
56+
return pluginsCommon.GetCommandFlags(cmdKey, commandFlags, flagsMap)
57+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package system
2+
3+
import (
4+
"github.com/jfrog/jfrog-cli-application/application/app"
5+
"github.com/jfrog/jfrog-cli-application/application/common"
6+
"github.com/jfrog/jfrog-cli-application/application/service"
7+
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
8+
)
9+
10+
type pingCommand struct {
11+
systemService service.SystemService
12+
}
13+
14+
func (pc *pingCommand) executeCmd(commandCtx *components.Context) error {
15+
ping, err := pc.systemService.Ping()
16+
if err != nil {
17+
return err
18+
}
19+
20+
println(ping)
21+
return nil
22+
}
23+
24+
func GetPingCommand(appContext app.Context) components.Command {
25+
cmd := &pingCommand{systemService: appContext.GetSystemService()}
26+
return components.Command{
27+
Name: "ping",
28+
Description: "Ping the application server",
29+
Category: common.CategorySystem,
30+
Aliases: []string{"p"},
31+
Arguments: []components.Argument{},
32+
Flags: []components.Flag{},
33+
EnvVars: []components.EnvVar{},
34+
Action: func(commandCtx *components.Context) error {
35+
return cmd.executeCmd(commandCtx)
36+
},
37+
}
38+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package utils
2+
3+
import (
4+
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
5+
coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
6+
"github.com/jfrog/jfrog-client-go/utils"
7+
"github.com/jfrog/jfrog-client-go/utils/errorutils"
8+
)
9+
10+
func AssertValueProvided(c *components.Context, fieldName string) error {
11+
if c.GetStringFlagValue(fieldName) == "" {
12+
return errorutils.CheckErrorf("the --%s option is mandatory", fieldName)
13+
}
14+
return nil
15+
}
16+
17+
func PlatformToApplicationUrls(details *coreConfig.ServerDetails) {
18+
details.ArtifactoryUrl = utils.AddTrailingSlashIfNeeded(details.Url) + "artifactory/"
19+
details.EvidenceUrl = utils.AddTrailingSlashIfNeeded(details.Url) + "evidence/"
20+
details.MetadataUrl = utils.AddTrailingSlashIfNeeded(details.Url) + "metadata/"
21+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package version
2+
3+
import (
4+
"errors"
5+
"github.com/jfrog/jfrog-cli-application/application/app"
6+
"github.com/jfrog/jfrog-cli-application/application/commands"
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+
commonCliUtils "github.com/jfrog/jfrog-cli-core/v2/common/cliutils"
11+
commonCLiCommands "github.com/jfrog/jfrog-cli-core/v2/common/commands"
12+
pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
13+
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
14+
coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
15+
)
16+
17+
type createAppVersionCommand struct {
18+
versionService service.VersionService
19+
serverDetails *coreConfig.ServerDetails
20+
requestPayload *model.CreateAppVersionRequest
21+
}
22+
23+
func (cv *createAppVersionCommand) Run() error {
24+
ctx := &service.Context{ServerDetails: cv.serverDetails}
25+
return cv.versionService.CreateAppVersion(ctx, cv.requestPayload)
26+
}
27+
28+
func (cv *createAppVersionCommand) ServerDetails() (*coreConfig.ServerDetails, error) {
29+
return cv.serverDetails, nil
30+
}
31+
32+
func (cv *createAppVersionCommand) CommandName() string {
33+
return commands.CreateAppVersion
34+
}
35+
36+
func (cv *createAppVersionCommand) runCreateAppVersionCommand(ctx *components.Context) error {
37+
if err := validateCreateAppVersionContext(ctx); err != nil {
38+
return err
39+
}
40+
serverDetails, err := serverDetailsByFlags(ctx)
41+
if err != nil {
42+
return err
43+
}
44+
cv.serverDetails = serverDetails
45+
cv.requestPayload = &model.CreateAppVersionRequest{}
46+
return commonCLiCommands.Exec(cv)
47+
}
48+
49+
func serverDetailsByFlags(ctx *components.Context) (*coreConfig.ServerDetails, error) {
50+
serverDetails, err := pluginsCommon.CreateServerDetailsWithConfigOffer(ctx, true, commonCliUtils.Platform)
51+
if err != nil {
52+
return nil, err
53+
}
54+
if serverDetails.Url == "" {
55+
return nil, errors.New("platform URL is mandatory for evidence commands")
56+
}
57+
if serverDetails.GetUser() != "" && serverDetails.GetPassword() != "" {
58+
return nil, errors.New("evidence service does not support basic authentication")
59+
}
60+
61+
return serverDetails, nil
62+
}
63+
64+
func validateCreateAppVersionContext(ctx *components.Context) error {
65+
if show, err := pluginsCommon.ShowCmdHelpIfNeeded(ctx, ctx.Arguments); show || err != nil {
66+
return err
67+
}
68+
if len(ctx.Arguments) > 1 {
69+
return pluginsCommon.WrongNumberOfArgumentsHandler(ctx)
70+
}
71+
72+
return nil
73+
//err := utils.AssertValueProvided(ctx, commands.PackageNameFlag)
74+
//if err != nil {
75+
// return err
76+
//}
77+
//err = utils.AssertValueProvided(ctx, commands.PackageVersionFlag)
78+
//if err != nil {
79+
// return err
80+
//}
81+
//err = utils.AssertValueProvided(ctx, commands.PackageRepoNameFlag)
82+
//return err
83+
}
84+
85+
func GetCreateAppVersionCommand(appContext app.Context) components.Command {
86+
cmd := &createAppVersionCommand{versionService: appContext.GetVersionService()}
87+
return components.Command{
88+
Name: commands.CreateAppVersion,
89+
Description: "Create application version",
90+
Category: common.CategoryVersion,
91+
Aliases: []string{"cav"},
92+
Arguments: []components.Argument{},
93+
Flags: commands.GetCommandFlags(commands.CreateAppVersion),
94+
Action: cmd.runCreateAppVersionCommand,
95+
}
96+
}

application/common/categories.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package common
2+
3+
const (
4+
CategorySystem = "system"
5+
CategoryVersion = "version"
6+
)

application/http/http_client.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package http
2+
3+
import (
4+
commonCliConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
5+
"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
6+
clientConfig "github.com/jfrog/jfrog-client-go/config"
7+
"github.com/jfrog/jfrog-client-go/http/jfroghttpclient"
8+
)
9+
10+
func NewAppHttpClient(serverDetails *commonCliConfig.ServerDetails) (*jfroghttpclient.JfrogHttpClient, error) {
11+
certsPath, err := coreutils.GetJfrogCertsDir()
12+
if err != nil {
13+
return nil, err
14+
}
15+
16+
authDetails, err := serverDetails.CreateLifecycleAuthConfig()
17+
if err != nil {
18+
return nil, err
19+
}
20+
21+
serviceConfig, err := clientConfig.NewConfigBuilder().
22+
SetServiceDetails(authDetails).
23+
SetCertificatesPath(certsPath).
24+
SetInsecureTls(serverDetails.InsecureTls).
25+
Build()
26+
if err != nil {
27+
return nil, err
28+
}
29+
30+
return jfroghttpclient.JfrogClientBuilder().
31+
SetCertificatesPath(certsPath).
32+
SetInsecureTls(serviceConfig.IsInsecureTls()).
33+
SetClientCertPath(serverDetails.GetClientCertPath()).
34+
SetClientCertKeyPath(serverDetails.GetClientCertKeyPath()).
35+
AppendPreRequestInterceptor(authDetails.RunPreRequestFunctions).
36+
SetContext(serviceConfig.GetContext()).
37+
SetDialTimeout(serviceConfig.GetDialTimeout()).
38+
SetOverallRequestTimeout(serviceConfig.GetOverallRequestTimeout()).
39+
SetRetries(serviceConfig.GetHttpRetries()).
40+
SetRetryWaitMilliSecs(serviceConfig.GetHttpRetryWaitMilliSecs()).
41+
Build()
42+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package model
2+
3+
type CreateAppVersionRequest struct {
4+
ApplicationKey string `json:"application_key"`
5+
Version string `json:"version"`
6+
Packages []*CreateVersionPackage `json:"packages"`
7+
}
8+
9+
type CreateVersionPackage struct {
10+
Type string `json:"type"`
11+
Name string `json:"name"`
12+
Version string `json:"version"`
13+
Repository string `json:"repository"`
14+
}

0 commit comments

Comments
 (0)