github.com/taubyte/tau-cli@v0.1.13-0.20240326000942-487f0d57edfc/lib/domain/fqdn.go (about)

     1  package domainLib
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"net/http"
     7  	"strings"
     8  
     9  	"github.com/taubyte/tau-cli/common"
    10  	"github.com/taubyte/tau-cli/env"
    11  	domainI18n "github.com/taubyte/tau-cli/i18n/domain"
    12  	projectLib "github.com/taubyte/tau-cli/lib/project"
    13  	authClient "github.com/taubyte/tau-cli/singletons/auth_client"
    14  	client "github.com/taubyte/tau/clients/http/auth"
    15  )
    16  
    17  type validator struct {
    18  	getter
    19  }
    20  
    21  func NewValidator(name string) (Validator, error) {
    22  	info, err := get(name)
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  
    27  	return &validator{info}, nil
    28  }
    29  
    30  // Internal does not require info
    31  // TODO info should be global
    32  func newValidator(info getter) Validator {
    33  	return &validator{info}
    34  }
    35  
    36  func (r *validator) ValidateFQDN(fqdn string) (response client.DomainResponse, err error) {
    37  	client, err := authClient.Load()
    38  	if err != nil {
    39  		return
    40  	}
    41  
    42  	return client.RegisterDomain(fqdn, r.project.Get().Id())
    43  }
    44  
    45  func NewGeneratedFQDN(prefix string) (string, error) {
    46  	project, err := projectLib.SelectedProjectInterface()
    47  	if err != nil {
    48  		return "", err
    49  	}
    50  
    51  	// Get last eight characters of project id for use in fqdn
    52  	projectID := project.Get().Id()
    53  	if len(projectID) < 8 {
    54  		return "", domainI18n.InvalidProjectIDEight(projectID)
    55  	}
    56  	projectID = strings.ToLower(projectID[len(projectID)-8:])
    57  
    58  	parseFqdn := func(suffix string) string {
    59  		return fmt.Sprintf("%s%d%s", projectID, ProjectDomainCount(project), suffix)
    60  	}
    61  
    62  	// Generate fqdn
    63  	var fqdn string
    64  	selectedNetwork, _ := env.GetSelectedNetwork()
    65  	switch selectedNetwork {
    66  	case common.DreamlandNetwork:
    67  		universe, _ := env.GetCustomNetworkUrl()
    68  		fqdn = parseFqdn(fmt.Sprintf(".%s.localtau", universe))
    69  	case common.PythonTestNetwork:
    70  		fqdn = parseFqdn(DefaultGeneratedFqdnSuffix)
    71  	case common.RemoteNetwork:
    72  		customNetworkUrl, _ := env.GetCustomNetworkUrl()
    73  		customGeneratedFqdn, err := FetchCustomNetworkGeneratedFqdn(customNetworkUrl)
    74  		if err != nil {
    75  			return "", err
    76  		}
    77  
    78  		fqdn = parseFqdn(customGeneratedFqdn)
    79  	}
    80  
    81  	// Attach prefix
    82  	if len(prefix) > 0 {
    83  		fqdn = fmt.Sprintf("%s-%s", prefix, fqdn)
    84  	}
    85  
    86  	return fqdn, nil
    87  }
    88  
    89  func IsAGeneratedFQDN(fqdn string) (bool, error) {
    90  	selectedNetwork, _ := env.GetSelectedNetwork()
    91  	switch selectedNetwork {
    92  	case common.DreamlandNetwork:
    93  		universe, _ := env.GetCustomNetworkUrl()
    94  		return strings.HasSuffix(fqdn, fmt.Sprintf(".%s.localtau", universe)), nil
    95  	case common.PythonTestNetwork:
    96  		return strings.HasSuffix(fqdn, DefaultGeneratedFqdnSuffix), nil
    97  	case common.RemoteNetwork:
    98  		customNetworkUrl, _ := env.GetCustomNetworkUrl()
    99  		customGeneratedFqdn, err := FetchCustomNetworkGeneratedFqdn(customNetworkUrl)
   100  		if err != nil {
   101  			return false, err
   102  		}
   103  
   104  		return strings.HasSuffix(fqdn, customGeneratedFqdn), nil
   105  	default:
   106  		return false, fmt.Errorf("%s is not a valid network type", selectedNetwork)
   107  	}
   108  }
   109  
   110  // TODO: Move to specs
   111  func FetchCustomNetworkGeneratedFqdn(fqdn string) (string, error) {
   112  	resp, err := http.Get(fmt.Sprintf("https://seer.tau.%s/network/config", fqdn))
   113  	if err != nil {
   114  		return "", fmt.Errorf("fetching generated url prefix for fqdn `%s` failed with: %s", fqdn, err)
   115  	}
   116  
   117  	defer resp.Body.Close()
   118  
   119  	body, err := ioutil.ReadAll(resp.Body)
   120  	if err != nil {
   121  		return "", fmt.Errorf("reading response failed with: %s", err)
   122  	}
   123  
   124  	bodyStr := strings.Trim(string(body), "\"")
   125  
   126  	return formatGeneratedSuffix(bodyStr), nil
   127  }
   128  
   129  func formatGeneratedSuffix(suffix string) string {
   130  	if !strings.HasPrefix(suffix, ".") {
   131  		suffix = "." + suffix
   132  	}
   133  
   134  	return suffix
   135  }