8
"github.com/gruntwork-io/terratest/modules/retry"
9
"github.com/gruntwork-io/terratest/modules/testing"
10
"github.com/pkg/errors"
12
"github.com/kumahq/kuma/pkg/config/core"
13
core_model "github.com/kumahq/kuma/pkg/core/resources/model"
14
"github.com/kumahq/kuma/test/framework/kumactl"
15
"github.com/kumahq/kuma/test/framework/ssh"
18
var _ ControlPlane = &UniversalControlPlane{}
20
type UniversalControlPlane struct {
24
kumactl *kumactl.KumactlOptions
26
cpNetworking UniversalNetworking
30
func NewUniversalControlPlane(
35
networking UniversalNetworking,
38
) (*UniversalControlPlane, error) {
39
name := clusterName + "-" + mode
40
kumactl := NewKumactlOptionsE2E(t, name, verbose)
41
ucp := &UniversalControlPlane{
47
cpNetworking: networking,
48
setupKumactl: setupKumactl,
50
token, err := ucp.retrieveAdminToken()
55
if err := kumactl.KumactlConfigControlPlanesAdd(clusterName, ucp.GetAPIServerAddress(), token, apiHeaders); err != nil {
61
func (c *UniversalControlPlane) Networking() UniversalNetworking {
65
func (c *UniversalControlPlane) GetName() string {
69
func (c *UniversalControlPlane) GetKDSInsecureServerAddress() string {
70
return c.getKDSServerAddress(false)
73
func (c *UniversalControlPlane) GetKDSServerAddress() string {
74
return c.getKDSServerAddress(true)
77
func (c *UniversalControlPlane) GetXDSServerAddress() string {
78
return net.JoinHostPort(c.cpNetworking.IP, "5678")
81
func (c *UniversalControlPlane) getKDSServerAddress(secure bool) string {
87
return protocol + "://" + net.JoinHostPort(c.cpNetworking.IP, "5685")
90
func (c *UniversalControlPlane) GetGlobalStatusAPI() string {
91
panic("not implemented")
94
func (c *UniversalControlPlane) GetAPIServerAddress() string {
95
return "http://localhost:" + c.cpNetworking.ApiServerPort
98
func (c *UniversalControlPlane) GetMetrics() (string, error) {
99
return retry.DoWithRetryE(c.t, "fetching CP metrics", DefaultRetries, DefaultTimeout, func() (string, error) {
100
sshApp := ssh.NewApp(c.name, "", c.verbose, c.cpNetworking.SshPort, nil, []string{
102
"--fail", "--show-error",
103
"http://localhost:5680/metrics",
105
if err := sshApp.Run(); err != nil {
108
if sshApp.Err() != "" {
109
return "", errors.New(sshApp.Err())
111
return sshApp.Out(), nil
115
func (c *UniversalControlPlane) GetMonitoringAssignment(clientId string) (string, error) {
116
panic("not implemented")
119
func (c *UniversalControlPlane) generateToken(
123
description := fmt.Sprintf("generating %s token", tokenPath)
125
return retry.DoWithRetryE(
130
func() (string, error) {
131
sshApp := ssh.NewApp(
135
c.cpNetworking.SshPort,
139
"--fail", "--show-error",
140
"-H", "\"Content-Type: application/json\"",
142
"http://localhost:5681/tokens" + tokenPath,
146
if err := sshApp.Run(); err != nil {
150
if sshApp.Err() != "" {
151
return "", errors.New(sshApp.Err())
154
return sshApp.Out(), nil
159
func (c *UniversalControlPlane) retrieveAdminToken() (string, error) {
164
return retry.DoWithRetryE(
165
c.t, "fetching user admin token",
168
func() (string, error) {
169
out, stderr, err := c.Exec("curl", "--fail", "--show-error", "http://localhost:5681/global-secrets/admin-user-token")
174
return "", errors.New(stderr)
176
return ExtractSecretDataFromResponse(out)
181
func (c *UniversalControlPlane) Exec(cmd ...string) (string, string, error) {
182
sshApp := ssh.NewApp(
185
c.verbose, c.cpNetworking.SshPort, nil, cmd,
187
if err := sshApp.Run(); err != nil {
188
return "", sshApp.Err(), err
190
return sshApp.Out(), sshApp.Err(), nil
193
func (c *UniversalControlPlane) GenerateDpToken(mesh, service string) (string, error) {
195
`'{"mesh": "%s", "tags": {"kuma.io/service":["%s"]}}'`,
200
return c.generateToken("/dataplane", data)
203
func (c *UniversalControlPlane) GenerateZoneIngressToken(zone string) (string, error) {
204
data := fmt.Sprintf(`'{"zone": "%s", "scope": ["ingress"]}'`, zone)
206
return c.generateToken("/zone", data)
209
func (c *UniversalControlPlane) GenerateZoneIngressLegacyToken(zone string) (string, error) {
210
data := fmt.Sprintf(`'{"zone": "%s"}'`, zone)
212
return c.generateToken("/zone-ingress", data)
215
func (c *UniversalControlPlane) GenerateZoneEgressToken(zone string) (string, error) {
216
data := fmt.Sprintf(`'{"zone": "%s", "scope": ["egress"]}'`, zone)
218
return c.generateToken("/zone", data)
221
func (c *UniversalControlPlane) GenerateZoneToken(
225
scopeJson, err := json.Marshal(scope)
230
data := fmt.Sprintf(`'{"zone": "%s", "scope": %s}'`, zone, scopeJson)
232
return c.generateToken("/zone", data)
235
func (c *UniversalControlPlane) UpdateObject(
238
update func(object core_model.Resource) core_model.Resource,
240
return c.kumactl.KumactlUpdateObject(typeName, objectName, update)