Skip to content
Open
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
19 changes: 16 additions & 3 deletions cmd/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,25 @@ func deleteContext(context, configPath string) error {
if localCfg == nil {
return fmt.Errorf("Nothing to logout from")
}
serverName, ok := localCfg.RemoveContext(context)
resolvedContext, err := localCfg.ResolveContext(context)
if err != nil {
return fmt.Errorf("Context %s does not exist", context)
}
_, ok := localCfg.RemoveContext(context)
if !ok {
return fmt.Errorf("Context %s does not exist", context)
}
_ = localCfg.RemoveUser(context)
_ = localCfg.RemoveServer(serverName)

if !localCfg.HasContextUsingUser(resolvedContext.User.Name) {
_ = localCfg.RemoveUser(resolvedContext.User.Name)
}
if !localCfg.HasContextUsingServer(resolvedContext.Server.Server) {
_ = localCfg.RemoveServer(resolvedContext.Server.Server)
_ = localCfg.RemoveAuth(resolvedContext.Server.Server)
}
if !localCfg.HasContextUsingInstance(resolvedContext.Instance.Name) {
_ = localCfg.RemoveInstance(resolvedContext.Instance.Name)
}

if localCfg.IsEmpty() {
err := localCfg.DeleteLocalConfig(configPath)
Expand Down
64 changes: 63 additions & 1 deletion cmd/context_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cmd

import (
"os"
"path/filepath"
"testing"

"github.com/microcks/microcks-cli/pkg/config"
Expand Down Expand Up @@ -36,9 +37,41 @@ users:
auth-token: ""
refresh-token: ""`

const testConfigFilePath = "./testdata/local.config"
const sharedServerConfig = `current-context: dev
contexts:
- name: dev
server: http://localhost:8585
user: http://localhost:8585
instance: microcks
- name: qa
server: http://localhost:8585
user: http://localhost:8585
instance: microcks
servers:
- name: microcks
server: http://localhost:8585
insecureTLS: true
keycloakEnable: false
users:
- name: http://localhost:8585
auth-token: ""
refresh-token: ""
instances:
- name: microcks
image: quay.io/microcks/microcks-uber:latest-native
status: Running
port: "8585"
containerID: abc123
autoRemove: false
driver: docker
auths:
- server: http://localhost:8585
clientid: ""
clientsecret: ""`

func TestDeleteContext(t *testing.T) {
testConfigFilePath := filepath.Join(t.TempDir(), "local.config")

//write the test config file
err := os.WriteFile(testConfigFilePath, []byte(testConfig), os.ModePerm)
require.NoError(t, err)
Expand All @@ -64,3 +97,32 @@ func TestDeleteContext(t *testing.T) {
_, err = config.ReadLocalConfig(testConfigFilePath)
require.NoError(t, err)
}

func TestDeleteContextSharedServerKeepsReferencedEntries(t *testing.T) {
testConfigFilePath := filepath.Join(t.TempDir(), "local.config")

err := os.WriteFile(testConfigFilePath, []byte(sharedServerConfig), os.ModePerm)
require.NoError(t, err)

err = os.Chmod(testConfigFilePath, 0o600)
require.NoError(t, err, "Could not change the file permission to 0600 %v", err)

err = deleteContext("dev", testConfigFilePath)
require.NoError(t, err)

localCfg, err := config.ReadLocalConfig(testConfigFilePath)
require.NoError(t, err)
require.NotNil(t, localCfg)

assert.Equal(t, "", localCfg.CurrentContext)
assert.Len(t, localCfg.Contexts, 1)
assert.Equal(t, "qa", localCfg.Contexts[0].Name)
assert.Len(t, localCfg.Servers, 1)
assert.Equal(t, "http://localhost:8585", localCfg.Servers[0].Server)
assert.Len(t, localCfg.Users, 1)
assert.Equal(t, "http://localhost:8585", localCfg.Users[0].Name)
assert.Len(t, localCfg.Instances, 1)
assert.Equal(t, "microcks", localCfg.Instances[0].Name)
assert.Len(t, localCfg.Auths, 1)
assert.Equal(t, "http://localhost:8585", localCfg.Auths[0].Server)
}
30 changes: 30 additions & 0 deletions pkg/config/localconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,36 @@ func (l *LocalConfig) RemoveContext(serverName string) (string, bool) {
return "", false
}

func (l *LocalConfig) HasContextUsingServer(server string) bool {
for _, c := range l.Contexts {
if c.Server == server {
return true
}
}
return false
}

func (l *LocalConfig) HasContextUsingUser(user string) bool {
for _, c := range l.Contexts {
if c.User == user {
return true
}
}
return false
}

func (l *LocalConfig) HasContextUsingInstance(instance string) bool {
if instance == "" {
return false
}
for _, c := range l.Contexts {
if c.Instance == instance {
return true
}
}
return false
}

// RemoveToken and returns true if user was removed successfully
func (l *LocalConfig) RemoveToken(serverName string) bool {
for i, u := range l.Users {
Expand Down