/
unexpose.go
108 lines (95 loc) · 3.36 KB
/
unexpose.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package cli
import (
"context"
"fmt"
"log"
"strings"
"github.com/skupperproject/skupper/api/types"
clientpodman "github.com/skupperproject/skupper/client/podman"
"github.com/skupperproject/skupper/pkg/domain/podman"
utils2 "github.com/skupperproject/skupper/pkg/utils"
"github.com/skupperproject/skupper/test/utils"
"github.com/skupperproject/skupper/test/utils/base"
"github.com/skupperproject/skupper/test/utils/constants"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// UnexposeTester runs `skupper unexpose` and validates outcome
// and asserts service has been effectively removed
type UnexposeTester struct {
TargetType string
TargetName string
Address string
}
func (e *UnexposeTester) Command(platform types.Platform, cluster *base.ClusterContext) []string {
args := SkupperCommonOptions(platform, cluster)
args = append(args, "unexpose", e.TargetType, e.TargetName)
// Flags
if e.Address != "" {
args = append(args, "--address", e.Address)
}
return args
}
func (e *UnexposeTester) Run(platform types.Platform, cluster *base.ClusterContext) (stdout string, stderr string, err error) {
// Execute unexpose command
stdout, stderr, err = RunSkupperCli(e.Command(platform, cluster))
if err != nil {
return
}
// Validating stdout contains expected data
log.Printf("Validating 'skupper unexpose'")
if platform.IsKubernetes() {
expectedOut := fmt.Sprintf("%s %s unexposed", e.TargetType, e.TargetName)
if !strings.Contains(stdout, expectedOut) {
err = fmt.Errorf("expected: %s - found: %s", expectedOut, stdout)
return
}
}
attempt := 0
ctx, fn := context.WithTimeout(context.Background(), commandTimeout)
defer fn()
err = utils2.RetryWithContext(ctx, constants.DefaultTick, func() (bool, error) {
attempt++
log.Printf("validating service after unexpose completed - attempt: %d", attempt)
if platform == types.PlatformPodman {
return e.validatePodman()
}
return e.validateKubernetes(ctx, cluster)
})
return
}
func (e *UnexposeTester) validateKubernetes(ctx context.Context, cluster *base.ClusterContext) (bool, error) {
var err error
// Service should have been removed
expectedAddress := utils.StrDefault(e.Address, e.TargetName)
log.Printf("validating service %s has been removed", expectedAddress)
_, err = cluster.VanClient.KubeClient.CoreV1().Services(cluster.Namespace).Get(ctx, expectedAddress, v1.GetOptions{})
if err == nil {
log.Printf("service %s still exists", expectedAddress)
return false, nil
}
// Service removed from config map
log.Printf("validating service %s no longer exists in %s config map", expectedAddress, types.ServiceInterfaceConfigMap)
cm, err := cluster.VanClient.KubeClient.CoreV1().ConfigMaps(cluster.Namespace).Get(ctx, types.ServiceInterfaceConfigMap, v1.GetOptions{})
if err != nil {
return true, fmt.Errorf("unable to find %s config map - %v", types.ServiceInterfaceConfigMap, err)
}
// retrieving data
_, ok := cm.Data[expectedAddress]
if ok {
log.Printf("address %s is still defined at %s", expectedAddress, types.ServiceInterfaceConfigMap)
return false, nil
}
return true, nil
}
func (e *UnexposeTester) validatePodman() (bool, error) {
cli, err := clientpodman.NewPodmanClient("", "")
if err != nil {
return true, err
}
svcIfaceHandler := podman.NewServiceInterfaceHandlerPodman(cli)
_, err = svcIfaceHandler.Get(e.Address)
if err == nil {
return false, nil
}
return true, nil
}