2022-06-21 15:59:12 +00:00
package metadata
import (
"context"
"fmt"
"net"
"strconv"
"github.com/edgelesssys/constellation/coordinator/role"
"github.com/edgelesssys/constellation/internal/constants"
)
// Instance describes metadata of a peer.
type InstanceMetadata struct {
Name string
ProviderID string
Role role . Role
PrivateIPs [ ] string
PublicIPs [ ] string
AliasIPRanges [ ] string
// SSHKeys maps usernames to ssh public keys.
SSHKeys map [ string ] [ ] string
}
type metadataAPI interface {
// List retrieves all instances belonging to the current constellation.
List ( ctx context . Context ) ( [ ] InstanceMetadata , error )
// Self retrieves the current instance.
Self ( ctx context . Context ) ( InstanceMetadata , error )
// SignalRole signals the constellation role via cloud provider metadata (if supported by the CSP and deployment type, otherwise does nothing).
SignalRole ( ctx context . Context , role role . Role ) error
// SetVPNIP stores the internally used VPN IP in cloud provider metadata (if supported and required for autoscaling by the CSP, otherwise does nothing).
SetVPNIP ( ctx context . Context , vpnIP string ) error
// Supported is used to determine if metadata API is implemented for this cloud provider.
Supported ( ) bool
}
2022-06-28 14:08:05 +00:00
type InstanceSelfer interface {
// Self retrieves the current instance.
Self ( ctx context . Context ) ( InstanceMetadata , error )
}
type InstanceLister interface {
// List retrieves all instances belonging to the current constellation.
List ( ctx context . Context ) ( [ ] InstanceMetadata , error )
}
func InitServerEndpoints ( ctx context . Context , lister InstanceLister ) ( [ ] string , error ) {
instances , err := lister . List ( ctx )
2022-06-21 15:59:12 +00:00
if err != nil {
return nil , fmt . Errorf ( "retrieving instances list from cloud provider: %w" , err )
}
2022-06-28 14:08:05 +00:00
initServerEndpoints := [ ] string { }
2022-06-21 15:59:12 +00:00
for _ , instance := range instances {
// check if role of instance is "Coordinator"
if instance . Role == role . Coordinator {
for _ , ip := range instance . PrivateIPs {
2022-06-28 14:08:05 +00:00
initServerEndpoints = append ( initServerEndpoints , net . JoinHostPort ( ip , strconv . Itoa ( constants . CoordinatorPort ) ) )
2022-06-21 15:59:12 +00:00
}
}
}
2022-06-28 14:08:05 +00:00
return initServerEndpoints , nil
2022-06-21 15:59:12 +00:00
}