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 }