mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-06 21:36:26 +00:00
81 lines
2.1 KiB
Go
81 lines
2.1 KiB
Go
package e2e
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
)
|
|
|
|
const (
|
|
dockerIPv4CIDR = "10.186.73.0/24"
|
|
dockerIPv6CIDR = "fd80:b10c::/48"
|
|
|
|
globalIPv4CIDR = "0.0.0.0/0"
|
|
)
|
|
|
|
// InfrastructureData contains the relevant information for a set of existing
|
|
// infrastructure that is to be used for running a testnet.
|
|
type InfrastructureData struct {
|
|
|
|
// Provider is the name of infrastructure provider backing the testnet.
|
|
// For example, 'docker' if it is running locally in a docker network or
|
|
// 'digital-ocean', 'aws', 'google', etc. if it is from a cloud provider.
|
|
Provider string `json:"provider"`
|
|
|
|
// Instances is a map of all of the machine instances on which to run
|
|
// processes for a testnet.
|
|
// The key of the map is the name of the instance, which each must correspond
|
|
// to the names of one of the testnet nodes defined in the testnet manifest.
|
|
Instances map[string]InstanceData `json:"instances"`
|
|
|
|
// Network is the CIDR notation range of IP addresses that all of the instances'
|
|
// IP addresses are expected to be within.
|
|
Network string `json:"network"`
|
|
}
|
|
|
|
// InstanceData contains the relevant information for a machine instance backing
|
|
// one of the nodes in the testnet.
|
|
type InstanceData struct {
|
|
IPAddress net.IP `json:"ip_address"`
|
|
}
|
|
|
|
func NewDockerInfrastructureData(m Manifest) (InfrastructureData, error) {
|
|
netAddress := dockerIPv4CIDR
|
|
if m.IPv6 {
|
|
netAddress = dockerIPv6CIDR
|
|
}
|
|
_, ipNet, err := net.ParseCIDR(netAddress)
|
|
if err != nil {
|
|
return InfrastructureData{}, fmt.Errorf("invalid IP network address %q: %w", netAddress, err)
|
|
}
|
|
ipGen := newIPGenerator(ipNet)
|
|
ifd := InfrastructureData{
|
|
Provider: "docker",
|
|
Instances: make(map[string]InstanceData),
|
|
Network: netAddress,
|
|
}
|
|
for name := range m.Nodes {
|
|
ifd.Instances[name] = InstanceData{
|
|
IPAddress: ipGen.Next(),
|
|
}
|
|
}
|
|
return ifd, nil
|
|
}
|
|
|
|
func InfrastructureDataFromFile(p string) (InfrastructureData, error) {
|
|
ifd := InfrastructureData{}
|
|
b, err := os.ReadFile(p)
|
|
if err != nil {
|
|
return InfrastructureData{}, err
|
|
}
|
|
err = json.Unmarshal(b, &ifd)
|
|
if err != nil {
|
|
return InfrastructureData{}, err
|
|
}
|
|
if ifd.Network == "" {
|
|
ifd.Network = globalIPv4CIDR
|
|
}
|
|
return ifd, nil
|
|
}
|