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  }