mirror of
https://github.com/psviderski/uncloud.git
synced 2026-08-26 11:03:34 +00:00
add expriment with using talos discovery service
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/aes"
|
||||
"crypto/cipher"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"github.com/siderolabs/discovery-api/api/v1alpha1/client/pb"
|
||||
discovery "github.com/siderolabs/discovery-client/pkg/client"
|
||||
"go.uber.org/zap"
|
||||
"net/netip"
|
||||
"time"
|
||||
"uncloud/internal/machine/network"
|
||||
)
|
||||
|
||||
const (
|
||||
defaultDiscoveryTTL = 30 * time.Minute
|
||||
)
|
||||
|
||||
func TestDiscovery() error {
|
||||
addrs, err := network.ListRoutableIPs()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
clusterID := "test-cluster"
|
||||
secretBytes, _ := hex.DecodeString("08841038cc5a81e26ee794ebe8821d681bfea7a118ba5e25416e38884bf55c47")
|
||||
|
||||
var cipherBlock cipher.Block
|
||||
cipherBlock, err = aes.NewCipher(secretBytes)
|
||||
if err != nil {
|
||||
return fmt.Errorf("create AES cipher: %w", err)
|
||||
}
|
||||
|
||||
client, err := discovery.NewClient(
|
||||
discovery.Options{
|
||||
Cipher: cipherBlock,
|
||||
Endpoint: "discovery.talos.dev:443",
|
||||
ClusterID: clusterID,
|
||||
AffiliateID: "machine1",
|
||||
TTL: defaultDiscoveryTTL,
|
||||
ClientVersion: "v1.7.0", // Talos version tag.
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return fmt.Errorf("init discovery client: %w", err)
|
||||
}
|
||||
|
||||
clientCtx, clientCancel := context.WithCancel(context.Background())
|
||||
notifyCh := make(chan struct{}, 1)
|
||||
|
||||
go func() {
|
||||
logger, _ := zap.NewDevelopment()
|
||||
err = client.Run(clientCtx, logger, notifyCh)
|
||||
if err != nil {
|
||||
fmt.Println("Discovery client error:", err)
|
||||
}
|
||||
}()
|
||||
|
||||
// Wait for the client to be ready.
|
||||
<-notifyCh
|
||||
fmt.Println("Discovery client ready")
|
||||
var publicIP netip.Addr
|
||||
if err = publicIP.UnmarshalBinary(client.GetPublicIP()); err != nil {
|
||||
fmt.Printf("unmarshal public IP: %s", err)
|
||||
}
|
||||
|
||||
fmt.Println(publicIP)
|
||||
|
||||
wireguardAddress, err := netip.MustParseAddr("10.210.1.1").MarshalBinary()
|
||||
if err != nil {
|
||||
return fmt.Errorf("marshal wireguard address: %w", err)
|
||||
}
|
||||
endpoints := make([]*pb.Endpoint, len(addrs))
|
||||
for i, addr := range addrs {
|
||||
ip, mErr := addr.MarshalBinary()
|
||||
if mErr != nil {
|
||||
return fmt.Errorf("marshal address: %w", mErr)
|
||||
}
|
||||
endpoints[i] = &pb.Endpoint{
|
||||
Ip: ip,
|
||||
Port: network.WireGuardPort,
|
||||
}
|
||||
}
|
||||
if err = client.SetLocalData(
|
||||
&discovery.Affiliate{
|
||||
Affiliate: &pb.Affiliate{
|
||||
NodeId: "machine1",
|
||||
Addresses: [][]byte{},
|
||||
Hostname: "",
|
||||
Nodename: "machine1-name",
|
||||
MachineType: "",
|
||||
OperatingSystem: "",
|
||||
Kubespan: &pb.KubeSpan{
|
||||
PublicKey: "public-key",
|
||||
Address: wireguardAddress,
|
||||
AdditionalAddresses: []*pb.IPPrefix{
|
||||
{Ip: wireguardAddress, Bits: 24},
|
||||
},
|
||||
},
|
||||
},
|
||||
Endpoints: endpoints,
|
||||
}, []discovery.Endpoint{},
|
||||
); err != nil {
|
||||
return fmt.Errorf("set local affiliate data: %w", err)
|
||||
}
|
||||
|
||||
affiliates := client.GetAffiliates()
|
||||
for _, affiliate := range affiliates {
|
||||
fmt.Println("Affiliate:", affiliate)
|
||||
}
|
||||
|
||||
time.Sleep(2 * time.Second)
|
||||
clientCancel()
|
||||
fmt.Println("Discovery client done")
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user