proc num_unique_secrets {num_nodes} {
    set secrets [list]
    for {set i 0} {$i < $num_nodes} {incr i} {
        lappend secrets [R $i debug internal_secret]
    }
    set num_secrets [llength [lsort -unique $secrets]]
    return $num_secrets
}

proc wait_for_secret_sync {maxtries delay num_nodes} {
    wait_for_condition $maxtries $delay {
        [num_unique_secrets $num_nodes] eq 1
    } else {
        fail "Failed waiting for secrets to sync"
    }
}

start_cluster 10 10 {tags {external:skip cluster}} {
    test "Test internal secret sync" {
        wait_for_secret_sync 50 100 20
    }

    
    set first_shard_host [srv 0 host]
    set first_shard_port [srv 0 port]
    
    if {$::verbose} {
        puts {cluster internal secret:}
        puts [R 1 debug internal_secret]
    }

    test "Join a node to the cluster and make sure it gets the same secret" {
        start_server {tags {"external:skip"} overrides {cluster-enabled {yes}}} {
            r cluster meet $first_shard_host $first_shard_port
            wait_for_condition 50 100 {
                [r debug internal_secret] eq [R 1 debug internal_secret]
            } else {
                puts [r debug internal_secret]
                puts [R 1 debug internal_secret]
                fail "Secrets not match"
            }
        }
    }

    test "Join another cluster, make sure clusters sync on the internal secret" {
        start_server {tags {"external:skip"} overrides {cluster-enabled {yes}}} {
            set new_shard_host [srv 0 host]
            set new_shard_port [srv 0 port]
            start_server {tags {"external:skip"} overrides {cluster-enabled {yes}}} {
                r cluster meet $new_shard_host $new_shard_port
                wait_for_condition 50 100 {
                    [r debug internal_secret] eq [r -1 debug internal_secret]
                } else {
                    puts [r debug internal_secret]
                    puts [r -1 debug internal_secret]
                    fail "Secrets not match"
                }
                if {$::verbose} {
                    puts {new cluster internal secret:}
                    puts [r -1 debug internal_secret]
                }
                r cluster meet $first_shard_host $first_shard_port
                wait_for_secret_sync 50 100 22
                if {$::verbose} {
                    puts {internal secret after join to bigger cluster:}
                    puts [r -1 debug internal_secret]
                }
            }
        }
    }
}
