github.com/DelineaXPM/dsv-cli@v1.40.6/tests/e2e/e2e_resilience_test.go (about)

     1  //go:build endtoend
     2  // +build endtoend
     3  
     4  package e2e
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"os/exec"
    10  	"strings"
    11  	"sync"
    12  	"time"
    13  )
    14  
    15  const (
    16  	commonPrefix = "e2e-cli-test"
    17  
    18  	// List of keys for `usedObjects` map.
    19  	authProvidersKey = "auth-providers"
    20  	usersKey         = "users"
    21  	rolesKey         = "roles"
    22  	poolsKey         = "pools"
    23  	enginesKey       = "engines"
    24  	siemKey          = "siem"
    25  	homeKey          = "home"
    26  )
    27  
    28  var (
    29  	muxUsedObjects sync.Mutex
    30  	usedObjects    = map[string][]string{}
    31  )
    32  
    33  func makeAuthProviderName() string { return makeName(authProvidersKey) }
    34  func makeUserName() string         { return makeName(usersKey) }
    35  func makeRoleName() string         { return makeName(rolesKey) }
    36  func makePoolName() string         { return makeName(poolsKey) }
    37  func makeEngineName() string       { return makeName(enginesKey) }
    38  func makeSIEMName() string         { return makeName(siemKey) }
    39  
    40  func makeName(key string) string {
    41  	name := fmt.Sprintf("%s-%s-%d", commonPrefix, key, time.Now().UnixNano())
    42  
    43  	muxUsedObjects.Lock()
    44  	if _, ok := usedObjects[key]; !ok {
    45  		usedObjects[key] = []string{name}
    46  	} else {
    47  		usedObjects[key] = append(usedObjects[key], name)
    48  	}
    49  	muxUsedObjects.Unlock()
    50  
    51  	return name
    52  }
    53  
    54  func makeHomeSecretPath() string {
    55  	name := fmt.Sprintf("%s:%s-%d", commonPrefix, homeKey, time.Now().UnixNano())
    56  
    57  	muxUsedObjects.Lock()
    58  	if _, ok := usedObjects[homeKey]; !ok {
    59  		usedObjects[homeKey] = []string{name}
    60  	} else {
    61  		usedObjects[homeKey] = append(usedObjects[homeKey], name)
    62  	}
    63  	muxUsedObjects.Unlock()
    64  
    65  	return name
    66  }
    67  
    68  func resilienceBefore() error {
    69  	// TODO: implement. This function should help to keep tenant clean.
    70  	// All previously created by this testing suite objects should be deleted.
    71  	fmt.Fprintln(os.Stderr, "[ResilienceBefore] <not implemented>")
    72  	return nil
    73  }
    74  
    75  func resilienceAfter() error {
    76  	muxUsedObjects.Lock()
    77  	defer muxUsedObjects.Unlock()
    78  
    79  	if len(usedObjects) == 0 {
    80  		fmt.Fprintln(os.Stderr, "[ResilienceAfter] Used objects list is empty. Nothing to cleanup.")
    81  		return nil
    82  	}
    83  
    84  	if len(usedObjects[authProvidersKey]) > 0 {
    85  		fmt.Fprintf(os.Stderr, "[ResilienceAfter] Recorded %d used auth provider(s).\n", len(usedObjects[authProvidersKey]))
    86  		for _, name := range usedObjects[authProvidersKey] {
    87  			delete(fmt.Sprintf("config auth-provider delete %s --force", name))
    88  		}
    89  	}
    90  
    91  	if len(usedObjects[usersKey]) > 0 {
    92  		fmt.Fprintf(os.Stderr, "[ResilienceAfter] Recorded %d used user(s).\n", len(usedObjects[usersKey]))
    93  		for _, name := range usedObjects[usersKey] {
    94  			delete(fmt.Sprintf("user delete %s --force", name))
    95  		}
    96  	}
    97  
    98  	if len(usedObjects[rolesKey]) > 0 {
    99  		fmt.Fprintf(os.Stderr, "[ResilienceAfter] Recorded %d used role(s).\n", len(usedObjects[rolesKey]))
   100  		for _, name := range usedObjects[rolesKey] {
   101  			delete(fmt.Sprintf("role delete %s --force", name))
   102  		}
   103  	}
   104  
   105  	if len(usedObjects[enginesKey]) > 0 {
   106  		fmt.Fprintf(os.Stderr, "[ResilienceAfter] Recorded %d used engine(s).\n", len(usedObjects[enginesKey]))
   107  		for _, name := range usedObjects[enginesKey] {
   108  			delete(fmt.Sprintf("engine delete %s", name))
   109  		}
   110  	}
   111  
   112  	if len(usedObjects[poolsKey]) > 0 {
   113  		fmt.Fprintf(os.Stderr, "[ResilienceAfter] Recorded %d used pool(s).\n", len(usedObjects[poolsKey]))
   114  		for _, name := range usedObjects[poolsKey] {
   115  			delete(fmt.Sprintf("pool delete %s", name))
   116  		}
   117  	}
   118  
   119  	if len(usedObjects[siemKey]) > 0 {
   120  		fmt.Fprintf(os.Stderr, "[ResilienceAfter] Recorded %d used siem(s).\n", len(usedObjects[siemKey]))
   121  		for _, name := range usedObjects[siemKey] {
   122  			delete(fmt.Sprintf("siem delete %s", name))
   123  		}
   124  	}
   125  
   126  	if len(usedObjects[homeKey]) > 0 {
   127  		fmt.Fprintf(os.Stderr, "[ResilienceAfter] Recorded %d used Home Vault secret(s).\n", len(usedObjects[homeKey]))
   128  		for _, name := range usedObjects[homeKey] {
   129  			delete(fmt.Sprintf("home delete %s --force", name))
   130  		}
   131  	}
   132  
   133  	return nil
   134  }
   135  
   136  func delete(command string) {
   137  	e := newEnv()
   138  
   139  	binArgs := append(strings.Split(command, " "),
   140  		"--auth-type=password",
   141  		fmt.Sprintf("--auth-username=%s", e.username),
   142  		fmt.Sprintf("--auth-password=%s", e.password),
   143  		fmt.Sprintf("--tenant=%s", e.tenant),
   144  		fmt.Sprintf("--domain=%s", e.domain),
   145  	)
   146  
   147  	cmd := exec.Command(binPath, binArgs...)
   148  	cmd.Env = append(os.Environ(), "IS_SYSTEM_TEST=true")
   149  
   150  	output, err := cmd.CombinedOutput()
   151  	if err != nil {
   152  		fmt.Fprintf(os.Stderr, "[ResilienceAfter] dsv %s => %v\n", command, err)
   153  		return
   154  	}
   155  
   156  	out := string(output)
   157  	// Remove lines like this added at the end of the output:
   158  	// 		> PASS
   159  	// 		> coverage: 6.8% of statements in ./...
   160  	// 		>
   161  	out = out[:strings.Index(out, `PASS`)]
   162  
   163  	switch {
   164  	case strings.Contains(out, "unable to find item with specified identifier"):
   165  		// ignore. Obj was removed.
   166  
   167  	case strings.Contains(out, "Invalid permissions"):
   168  		fmt.Fprintf(os.Stderr, "[ResilienceAfter] dsv %s => Invalid permissions\n", command)
   169  
   170  	case out != "":
   171  		fmt.Fprintf(os.Stderr, "[ResilienceAfter] dsv %s => %s\n", command, out)
   172  
   173  	case out == "":
   174  		fmt.Fprintf(os.Stderr, "[ResilienceAfter] dsv %s => success\n", command)
   175  	}
   176  }