github.com/tommi2day/tnscli@v0.0.0-20240401211958-338fc0647b73/cmd/ldap_docker_test.go (about) 1 package cmd 2 3 import ( 4 "fmt" 5 "os" 6 "time" 7 8 "github.com/tommi2day/gomodules/common" 9 "github.com/tommi2day/tnscli/test" 10 11 "github.com/go-ldap/ldap/v3" 12 "github.com/ory/dockertest/v3" 13 "github.com/ory/dockertest/v3/docker" 14 ) 15 16 const Ldaprepo = "docker.io/bitnami/openldap" 17 const LdaprepoTag = "2.6.7" 18 const LdapcontainerTimeout = 120 19 20 var LdapcontainerName string 21 var ldapContainer *dockertest.Resource 22 23 // prepareContainer create an OpenLdap Docker Container 24 func prepareLdapContainer() (container *dockertest.Resource, err error) { 25 if os.Getenv("SKIP_LDAP") != "" { 26 err = fmt.Errorf("skipping LDAP Container in CI environment") 27 return 28 } 29 LdapcontainerName = os.Getenv("LDAP_CONTAINER_NAME") 30 if LdapcontainerName == "" { 31 LdapcontainerName = "tnscli-ldap" 32 } 33 var pool *dockertest.Pool 34 pool, err = common.GetDockerPool() 35 if err != nil { 36 return 37 } 38 vendorImagePrefix := os.Getenv("VENDOR_IMAGE_PREFIX") 39 repoString := vendorImagePrefix + Ldaprepo 40 41 fmt.Printf("Try to start docker container for %s:%s\n", repoString, LdaprepoTag) 42 container, err = pool.RunWithOptions(&dockertest.RunOptions{ 43 Repository: repoString, 44 Tag: LdaprepoTag, 45 Env: []string{ 46 "LDAP_PORT_NUMBER=1389", 47 "BITNAMI_DEBUG=true", 48 "LDAP_ROOT=" + LdapBaseDn, 49 "LDAP_ADMIN_USERNAME=admin", 50 "LDAP_ADMIN_PASSWORD=" + LdapAdminPassword, 51 "LDAP_CONFIG_ADMIN_ENABLED=yes", 52 "LDAP_CONFIG_ADMIN_USERNAME=config", 53 "LDAP_CONFIG_ADMIN_PASSWORD=" + LdapConfigPassword, 54 "LDAP_SKIP_DEFAULT_TREE=yes", 55 "LDAP_CUSTOM_LDIF_DIR=/bootstrap/ldif", 56 "LDAP_CUSTOM_SCHEMA_DIR=/bootstrap/schema", 57 "LDAP_ADD_SCHEMAS=yes", 58 "LDAP_EXTRA_SCHEMAS=cosine,inetorgperson,nis", 59 "LDAP_ALLOW_ANON_BINDING=yes", 60 }, 61 Mounts: []string{ 62 test.TestDir + "/docker/oracle-ldap/ldif:/bootstrap/ldif:ro", 63 test.TestDir + "/docker/oracle-ldap/schema:/bootstrap/schema:ro", 64 test.TestDir + "/docker/oracle-ldap/entrypoint:/docker-entrypoint-initdb.d", 65 }, 66 Hostname: LdapcontainerName, 67 Name: LdapcontainerName, 68 }, func(config *docker.HostConfig) { 69 // set AutoRemove to true so that stopped container goes away by itself 70 config.AutoRemove = true 71 config.RestartPolicy = docker.RestartPolicy{Name: "no"} 72 }) 73 74 if err != nil { 75 err = fmt.Errorf("error starting ldap docker container: %v", err) 76 return 77 } 78 79 pool.MaxWait = LdapcontainerTimeout * time.Second 80 myhost, myport := common.GetContainerHostAndPort(container, "1389/tcp") 81 dialURL := fmt.Sprintf("ldap://%s:%d", myhost, myport) 82 fmt.Printf("Wait to successfully connect to Ldap with %s (max %ds)...\n", dialURL, LdapcontainerTimeout) 83 start := time.Now() 84 var l *ldap.Conn 85 if err = pool.Retry(func() error { 86 l, err = ldap.DialURL(dialURL) 87 return err 88 }); err != nil { 89 fmt.Printf("Could not connect to LDAP Container: %s", err) 90 return 91 } 92 _ = l.Close() 93 // wait 15s to init container 94 time.Sleep(15 * time.Second) 95 elapsed := time.Since(start) 96 fmt.Printf("LDAP Container is available after %s\n", elapsed.Round(time.Millisecond)) 97 err = nil 98 return 99 }