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 }