Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,8 @@ Finally, execute `go mod tidy` to update the Go module files. Please note that G
### Before submitting the pull request, ensure:

- Your changes are covered by `unit` and `integration` tests. If not, please add new tests.
- The code compiles, by running `go vet ./...`.
- To format the code, by running `go fmt ./...`.
- The documentation covers the changes, if not please add and make changes at [The documentation repository](https://github.com/jfrog/documentation)
- Run the go linter with --fix flag `golangci-lint run --fix`

### When creating the pull request, ensure:

Expand Down
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ prereq::
GOBIN=${TOOLS_DIR} $(GOCMD) install go.uber.org/mock/[email protected]

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


build-install:: build
Expand Down
7 changes: 4 additions & 3 deletions application/cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import (
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
)

const category = "Application Lifecycle"

//const category = "Application Lifecycle"
//
//
//func GetJfrogApplicationCli() components.App {
// appContext := app.NewAppContext()
Expand All @@ -32,11 +32,12 @@ func GetJfrogApplicationCli() components.App {
appContext := app.NewAppContext()
appEntity := components.CreateApp(
"app",
"1.0.0",
"1.0.2",
"JFrog Application CLI",
[]components.Command{
system.GetPingCommand(appContext),
version.GetCreateAppVersionCommand(appContext),
version.GetPromoteAppVersionCommand(appContext),
},
)
return appEntity
Expand Down
22 changes: 18 additions & 4 deletions application/commands/flags.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package commands

import pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
import "github.com/jfrog/jfrog-cli-core/v2/plugins/components"
import (
pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
)

const (
Ping = "ping"
CreateAppVersion = "create-app-version"
Ping = "ping"
CreateAppVersion = "create-app-version"
PromoteAppVersion = "promote-app-version"
)

const (
Expand All @@ -22,6 +25,7 @@ const (
PackageRepositoryFlag = "package-repository"
SpecFlag = "spec"
SpecVarsFlag = "spec-vars"
EnvironmentVarsFlag = "env"
)

// Flag keys mapped to their corresponding components.Flag definition.
Expand All @@ -40,6 +44,7 @@ var flagsMap = map[string]components.Flag{
PackageRepositoryFlag: components.NewStringFlag(PackageRepositoryFlag, "Package storing repository.", func(f *components.StringFlag) { f.Mandatory = false }),
SpecFlag: components.NewStringFlag(SpecFlag, "A path to the specification file.", func(f *components.StringFlag) { f.Mandatory = false }),
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 }),
EnvironmentVarsFlag: components.NewStringFlag(EnvironmentVarsFlag, "Environment.", func(f *components.StringFlag) { f.Mandatory = true }),
}

var commandFlags = map[string][]string{
Expand All @@ -57,6 +62,15 @@ var commandFlags = map[string][]string{
SpecFlag,
SpecVarsFlag,
},
PromoteAppVersion: {
url,
user,
accessToken,
ServerId,
ProjectFlag,
ApplicationKeyFlag,
EnvironmentVarsFlag,
},

Ping: {
url,
Expand Down
8 changes: 1 addition & 7 deletions application/commands/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ package utils

import (
"fmt"

commonCliUtils "github.com/jfrog/jfrog-cli-core/v2/common/cliutils"
pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
"github.com/jfrog/jfrog-client-go/utils"
"github.com/jfrog/jfrog-client-go/utils/errorutils"
)

Expand All @@ -17,12 +17,6 @@ func AssertValueProvided(c *components.Context, fieldName string) error {
return nil
}

func PlatformToApplicationUrls(details *coreConfig.ServerDetails) {
details.ArtifactoryUrl = utils.AddTrailingSlashIfNeeded(details.Url) + "artifactory/"
details.EvidenceUrl = utils.AddTrailingSlashIfNeeded(details.Url) + "evidence/"
details.MetadataUrl = utils.AddTrailingSlashIfNeeded(details.Url) + "metadata/"
}

func ServerDetailsByFlags(ctx *components.Context) (*coreConfig.ServerDetails, error) {
serverDetails, err := pluginsCommon.CreateServerDetailsWithConfigOffer(ctx, true, commonCliUtils.Platform)
if err != nil {
Expand Down
5 changes: 2 additions & 3 deletions application/commands/version/create_app_version_cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package version

import (
"encoding/json"

"github.com/jfrog/jfrog-cli-application/application/app"
"github.com/jfrog/jfrog-cli-application/application/commands"
"github.com/jfrog/jfrog-cli-application/application/commands/utils"
Expand Down Expand Up @@ -98,9 +99,7 @@ func loadPackagesFromSpec(ctx *components.Context, packages *[]model.CreateVersi
}

// add spec packages to the packages list
for _, pkg := range spec.Packages {
*packages = append(*packages, pkg)
}
*packages = append(*packages, spec.Packages...)
return nil
}

Expand Down
87 changes: 87 additions & 0 deletions application/commands/version/promote_app_version_cmd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package version

import (
"github.com/jfrog/jfrog-cli-application/application/app"
"github.com/jfrog/jfrog-cli-application/application/commands"
"github.com/jfrog/jfrog-cli-application/application/commands/utils"
"github.com/jfrog/jfrog-cli-application/application/common"
"github.com/jfrog/jfrog-cli-application/application/model"
"github.com/jfrog/jfrog-cli-application/application/service"
commonCLiCommands "github.com/jfrog/jfrog-cli-core/v2/common/commands"
pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
"github.com/jfrog/jfrog-client-go/utils/errorutils"
)

type promoteAppVersionCommand struct {
versionService service.VersionService
serverDetails *coreConfig.ServerDetails
requestPayload *model.PromoteAppVersionRequest
}

func (pv *promoteAppVersionCommand) Run() error {
ctx := &service.Context{ServerDetails: pv.serverDetails}
return pv.versionService.PromoteAppVersion(ctx, pv.requestPayload)
}

func (pv *promoteAppVersionCommand) ServerDetails() (*coreConfig.ServerDetails, error) {
return pv.serverDetails, nil
}

func (pv *promoteAppVersionCommand) CommandName() string {
return commands.PromoteAppVersion
}

func (pv *promoteAppVersionCommand) prepareAndRunCommand(ctx *components.Context) error {
if err := validatePromoteAppVersionContext(ctx); err != nil {
return err
}
serverDetails, err := utils.ServerDetailsByFlags(ctx)
if err != nil {
return err
}
pv.serverDetails = serverDetails
pv.requestPayload, err = pv.buildRequestPayload(ctx)
if errorutils.CheckError(err) != nil {
return err
}
return commonCLiCommands.Exec(pv)
}

func validatePromoteAppVersionContext(ctx *components.Context) error {
if show, err := pluginsCommon.ShowCmdHelpIfNeeded(ctx, ctx.Arguments); show || err != nil {
return err
}
if len(ctx.Arguments) != 1 {
return pluginsCommon.WrongNumberOfArgumentsHandler(ctx)
}
return nil
}

func (pv *promoteAppVersionCommand) buildRequestPayload(ctx *components.Context) (*model.PromoteAppVersionRequest, error) {
return &model.PromoteAppVersionRequest{
ApplicationKey: ctx.GetStringFlagValue(commands.ApplicationKeyFlag),
Version: ctx.Arguments[0],
Environment: ctx.GetStringFlagValue(commands.EnvironmentVarsFlag),
}, nil
}

func GetPromoteAppVersionCommand(appContext app.Context) components.Command {
cmd := &promoteAppVersionCommand{versionService: appContext.GetVersionService()}
return components.Command{
Name: commands.PromoteAppVersion,
Description: "Promote application version",
Category: common.CategoryVersion,
Aliases: []string{"pav"},
Arguments: []components.Argument{
{
Name: "version-name",
Description: "The name of the version",
Optional: false,
},
},
Flags: commands.GetCommandFlags(commands.PromoteAppVersion),
Action: cmd.prepareAndRunCommand,
}
}
7 changes: 3 additions & 4 deletions application/http/http_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package http
import (
"encoding/json"
"fmt"
"net/http"

commonCliConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
"github.com/jfrog/jfrog-client-go/auth"
Expand All @@ -11,7 +13,6 @@ import (
"github.com/jfrog/jfrog-client-go/utils"
"github.com/jfrog/jfrog-client-go/utils/errorutils"
"github.com/jfrog/jfrog-client-go/utils/io/httputils"
"net/http"
)

const applicationApiPath = "application/api"
Expand Down Expand Up @@ -61,7 +62,6 @@ func NewAppHttpClient(serverDetails *commonCliConfig.ServerDetails) (AppHttpClie
SetRetries(serviceConfig.GetHttpRetries()).
SetRetryWaitMilliSecs(serviceConfig.GetHttpRetryWaitMilliSecs()).
Build()

if err != nil {
return nil, err
}
Expand Down Expand Up @@ -117,8 +117,7 @@ func (c *appHttpClient) toJsonBytes(payload interface{}) ([]byte, error) {
}

func (c *appHttpClient) getJsonHttpClientDetails() *httputils.HttpClientDetails {
var httpClientDetails httputils.HttpClientDetails
httpClientDetails = c.authDetails.CreateHttpClientDetails()
httpClientDetails := c.authDetails.CreateHttpClientDetails()
httpClientDetails.SetContentTypeApplicationJson()
return &httpClientDetails
}
7 changes: 7 additions & 0 deletions application/model/promote_app_version_request.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package model

type PromoteAppVersionRequest struct {
ApplicationKey string `json:"application_key"`
Version string `json:"version"`
Environment string `json:"environment"`
}
4 changes: 2 additions & 2 deletions application/service/system_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ package service

import (
"fmt"

"github.com/jfrog/jfrog-cli-application/application/http"
)

type SystemService interface {
Ping(ctx *Context) error
}

type systemService struct {
}
type systemService struct{}

func NewSystemService() SystemService {
return &systemService{}
Expand Down
24 changes: 22 additions & 2 deletions application/service/version_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@ package service

import (
"fmt"

"github.com/jfrog/jfrog-cli-application/application/http"
"github.com/jfrog/jfrog-cli-application/application/model"
)

type VersionService interface {
CreateAppVersion(ctx *Context, request *model.CreateAppVersionRequest) error
PromoteAppVersion(ctx *Context, payload *model.PromoteAppVersionRequest) error
}

type versionService struct {
}
type versionService struct{}

func NewVersionService() VersionService {
return &versionService{}
Expand All @@ -35,3 +36,22 @@ func (vs *versionService) CreateAppVersion(ctx *Context, request *model.CreateAp

return nil
}

func (vs *versionService) PromoteAppVersion(ctx *Context, payload *model.PromoteAppVersionRequest) error {
httpClient, err := http.NewAppHttpClient(ctx.ServerDetails)
if err != nil {
return err
}

response, responseBody, err := httpClient.Post("/v1/version/promote", payload)
if err != nil {
return err
}

if response.StatusCode >= 400 {
return fmt.Errorf("failed to promote app version. Status code: %d. \n%s",
response.StatusCode, responseBody)
}

return nil
}
Loading
Loading