Skip to content

Commit

Permalink
bugfix: specifying confusing instance names
Browse files Browse the repository at this point in the history
Added instance name support for cases:
* Application name as instance name
* Instance name with dots

Closes #763
  • Loading branch information
GRISHNOV committed Apr 19, 2023
1 parent 6b860f7 commit 76f83de
Show file tree
Hide file tree
Showing 8 changed files with 28 additions and 48 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

- Set `compat.fiber_slice_default` to `new` by default in application template.

### Fixed

- Fixed support for instance names as application name and names with dots.

## [2.12.4] - 2022-12-31

### Changed
Expand Down
19 changes: 1 addition & 18 deletions cli/common/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -377,21 +377,11 @@ func InsertInStringSlice(s []string, i int, elem string) []string {
return res
}

func GetInstancesFromArgs(args []string, projectName string) ([]string, error) {
func GetInstancesFromArgs(args []string) ([]string, error) {
foundInstances := make(map[string]struct{})
var instances []string

for _, instanceName := range args {
if instanceName == projectName {
return nil, fmt.Errorf(appNameSpecifiedError)
}

parts := strings.SplitN(instanceName, ".", 2)

if len(parts) > 1 {
return nil, fmt.Errorf(instanceIDSpecified)
}

if instanceName == "stateboard" {
return nil, fmt.Errorf("Please, specify flag --stateboard for processing stateboard instance")
}
Expand Down Expand Up @@ -579,10 +569,3 @@ func ParseDependencies(rawDeps []string) (PackDependencies, error) {
func ContainsUpperSymbols(src string) bool {
return strings.ToLower(src) != src
}

const (
appNameSpecifiedError = "Application name is specified. " +
"Please, specify instance name(s)"
instanceIDSpecified = `[APP_NAME].INSTANCE_NAME is specified. ` +
"Please, specify instance name(s)"
)
28 changes: 2 additions & 26 deletions cli/common/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,40 +114,16 @@ func TestGetInstancesFromArgs(t *testing.T) {
var args []string
var instances []string

projectName := "myapp"

// wrong format
args = []string{"myapp.instance-1", "myapp.instance-2"}
_, err = GetInstancesFromArgs(args, projectName)
assert.EqualError(err, instanceIDSpecified)

args = []string{"instance-1", "myapp.instance-2"}
_, err = GetInstancesFromArgs(args, projectName)
assert.EqualError(err, instanceIDSpecified)

args = []string{"myapp"}
_, err = GetInstancesFromArgs(args, projectName)
assert.True(strings.Contains(err.Error(), appNameSpecifiedError))

// duplicate instance name
args = []string{"instance-1", "instance-1"}
_, err = GetInstancesFromArgs(args, projectName)
_, err = GetInstancesFromArgs(args)
assert.True(strings.Contains(err.Error(), "Duplicate instance name specified: instance-1"))

// instances are specified
args = []string{"instance-1", "instance-2"}
instances, err = GetInstancesFromArgs(args, projectName)
instances, err = GetInstancesFromArgs(args)
assert.Nil(err)
assert.Equal([]string{"instance-1", "instance-2"}, instances)

// specified both app name and instance name
args = []string{"instance-1", "myapp"}
instances, err = GetInstancesFromArgs(args, projectName)
assert.EqualError(err, appNameSpecifiedError)

args = []string{"myapp", "instance-1"}
instances, err = GetInstancesFromArgs(args, projectName)
assert.EqualError(err, appNameSpecifiedError)
}

func TestCorrectDependencyParsing(t *testing.T) {
Expand Down
9 changes: 8 additions & 1 deletion cli/connect/connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package connect

import (
"fmt"
"strings"

"github.com/tarantool/cartridge-cli/cli/common"
"github.com/tarantool/cartridge-cli/cli/context"
Expand All @@ -21,7 +22,7 @@ func Enter(ctx *context.Ctx, args []string) error {
return err
}

if ctx.Running.Instances, err = common.GetInstancesFromArgs(args, ctx.Project.Name); err != nil {
if ctx.Running.Instances, err = common.GetInstancesFromArgs(args); err != nil {
return err
}

Expand All @@ -33,6 +34,12 @@ func Enter(ctx *context.Ctx, args []string) error {

process := running.NewInstanceProcess(ctx, instanceName)
if !process.IsRunning() {
instanceNameParts := strings.SplitN(instanceName, ".", 2)
if instanceNameParts[0] == ctx.Project.Name {
return fmt.Errorf("Instance %s is not running, "+
"you may have specified an unnecessary prefix as the application name, "+
"perhaps you meant %s?", instanceName, instanceNameParts[1])
}
return fmt.Errorf("Instance %s is not running", instanceName)
}

Expand Down
2 changes: 1 addition & 1 deletion cli/replicasets/failover_priority.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func SetFailoverPriority(ctx *context.Ctx, args []string) error {
return err
}

if ctx.Replicasets.FailoverPriorityNames, err = common.GetInstancesFromArgs(args, ctx.Project.Name); err != nil {
if ctx.Replicasets.FailoverPriorityNames, err = common.GetInstancesFromArgs(args); err != nil {
return err
}

Expand Down
2 changes: 1 addition & 1 deletion cli/replicasets/join.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func Join(ctx *context.Ctx, args []string) error {
return err
}

if ctx.Replicasets.JoinInstancesNames, err = common.GetInstancesFromArgs(args, ctx.Project.Name); err != nil {
if ctx.Replicasets.JoinInstancesNames, err = common.GetInstancesFromArgs(args); err != nil {
return err
}

Expand Down
10 changes: 10 additions & 0 deletions cli/running/process.go
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,16 @@ func NewStateboardProcess(ctx *context.Ctx) *Process {

func (process *Process) Log(follow bool, n int) error {
if _, err := os.Stat(process.logFile); err != nil {
if os.IsNotExist(err) {
logFilePathParts := strings.SplitN(process.logFile, "/", -1)
logFileName := logFilePathParts[len(logFilePathParts)-1]
logFilePathParts[len(logFilePathParts)-1] = strings.SplitN(logFileName, ".", 2)[1]
possibleLogFilePath := strings.Join(logFilePathParts, "/")
if _, err := os.Stat(possibleLogFilePath); err == nil {
return fmt.Errorf("Failed to use process log file: " +
"Try to delete unnecessary application name prefix from INSTANCE_NAME arg")
}
}
return fmt.Errorf("Failed to use process log file: %s", err)
}

Expand Down
2 changes: 1 addition & 1 deletion cli/running/running.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func FillCtx(ctx *context.Ctx, args []string) error {
ctx.Running.WithStateboard = true
}

if ctx.Running.Instances, err = common.GetInstancesFromArgs(args, ctx.Project.Name); err != nil {
if ctx.Running.Instances, err = common.GetInstancesFromArgs(args); err != nil {
return err
}

Expand Down

0 comments on commit 76f83de

Please sign in to comment.