...

Source file src/edge-infra.dev/pkg/edge/registration/builder.go

Documentation: edge-infra.dev/pkg/edge/registration

     1  package registration
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"edge-infra.dev/pkg/edge/constants/api/cluster"
     7  )
     8  
     9  const DefaultLumperImage = "us-east1-docker.pkg.dev/ret-edge-pltf-infra/workloads/lumperctl:latest"
    10  
    11  type Builder struct {
    12  	reg Registration
    13  }
    14  
    15  func NewBuilder() *Builder {
    16  	return &Builder{}
    17  }
    18  
    19  // Build returns a valid Registration object
    20  func (b *Builder) Build() (*Registration, error) {
    21  	if err := b.reg.Bff.Valid(); err != nil {
    22  		return nil, err
    23  	}
    24  	if err := b.reg.Cluster.Valid(); err != nil {
    25  		return nil, err
    26  	}
    27  	return &b.reg, nil
    28  }
    29  
    30  // BootstrapBuild returns a valid Registration object for bootstrapping
    31  func (b *Builder) BootstrapBuild() (*Registration, error) {
    32  	if err := b.reg.Bff.Valid(); err != nil {
    33  		return nil, err
    34  	}
    35  	if err := b.reg.Cluster.ValidForBootstrapping(); err != nil {
    36  		return nil, err
    37  	}
    38  	return &b.reg, nil
    39  }
    40  
    41  // BFF fields
    42  
    43  func (b *Builder) APIEndpoint(endpoint string) *Builder {
    44  	b.reg.Bff.APIEndpoint = endpoint
    45  	return b
    46  }
    47  
    48  func (b *Builder) BearerToken(bearerToken string) *Builder {
    49  	b.reg.Bff.BearerToken = bearerToken
    50  	return b
    51  }
    52  
    53  func (b *Builder) BSLUserPassword(user, pwd string) *Builder {
    54  	b.reg.Bff.BSLUser = user
    55  	b.reg.Bff.BSLPassword = pwd
    56  	return b
    57  }
    58  
    59  func (b *Builder) TotpToken(token string) *Builder {
    60  	b.reg.Bff.TotpToken = token
    61  	return b
    62  }
    63  
    64  func (b *Builder) BSLOrganization(org string) *Builder {
    65  	b.reg.Bff.BSLOrganization = org
    66  	return b
    67  }
    68  
    69  // Cluster Info
    70  func (b *Builder) Banner(banner string) *Builder {
    71  	b.reg.Cluster.Banner = banner
    72  	return b
    73  }
    74  
    75  func (b *Builder) BannerEdgeID(bannerEdgeID string) *Builder {
    76  	b.reg.Cluster.BannerEdgeID = bannerEdgeID
    77  	return b
    78  }
    79  
    80  func (b *Builder) Store(store string) *Builder {
    81  	b.reg.Cluster.Store = store
    82  	return b
    83  }
    84  
    85  func (b *Builder) ClusterType(clusterType string) *Builder {
    86  	b.reg.Cluster.ClusterType = clusterType
    87  	return b
    88  }
    89  
    90  func (b *Builder) ClusterEdgeID(clusterEdgeID string) *Builder {
    91  	b.reg.Cluster.ClusterEdgeID = clusterEdgeID
    92  	return b
    93  }
    94  
    95  func (b *Builder) ClusterCaHash(clusterCaHash string) *Builder {
    96  	b.reg.Cluster.ClusterCaHash = clusterCaHash
    97  	return b
    98  }
    99  
   100  func (b *Builder) ForceBootstrap(force bool) *Builder {
   101  	b.reg.Cluster.ForceBootstrap = force
   102  	return b
   103  }
   104  
   105  // BFF Info
   106  
   107  func (b *Builder) CreateBSLSite(createBSLSite bool) *Builder {
   108  	b.reg.Bff.CreateBSLSite = createBSLSite
   109  	return b
   110  }
   111  
   112  func (b *Builder) BSLSiteEuid(id string) *Builder {
   113  	b.reg.Bff.BSLSiteEuid = id
   114  	return b
   115  }
   116  
   117  func (b *Builder) BSLSiteLatitude(latitude float64) *Builder {
   118  	b.reg.Bff.BSLSiteLatitude = latitude
   119  	return b
   120  }
   121  
   122  func (b *Builder) BSLSiteLongitude(longitude float64) *Builder {
   123  	b.reg.Bff.BSLSiteLongitude = longitude
   124  	return b
   125  }
   126  
   127  func (b *Builder) BSLSiteReferenceID(referenceID string) *Builder {
   128  	b.reg.Bff.BSLSiteReferenceID = referenceID
   129  	return b
   130  }
   131  
   132  func (b *Builder) Fleet(fleet string) *Builder {
   133  	b.reg.Cluster.Fleet = fleet
   134  	return b
   135  }
   136  
   137  func (b *Builder) FleetVersion(fleetVersion string) *Builder {
   138  	b.reg.Cluster.FleetVersion = fleetVersion
   139  	return b
   140  }
   141  
   142  // CLI Version
   143  func (b *Builder) EdgeVersion(version string) *Builder {
   144  	b.reg.Bff.EdgeVersion = version
   145  	return b
   146  }
   147  
   148  func (b *Builder) MachineType(machineType string) *Builder {
   149  	b.reg.Cluster.MachineType = machineType
   150  	return b
   151  }
   152  
   153  func (b *Builder) Autoscale(autoscale bool) *Builder {
   154  	b.reg.Cluster.Autoscale = autoscale
   155  	return b
   156  }
   157  
   158  func (b *Builder) Location(location string) *Builder {
   159  	b.reg.Cluster.Location = location
   160  	return b
   161  }
   162  
   163  func (b *Builder) MinNodes(minNodes int) *Builder {
   164  	b.reg.Cluster.MinNodes = minNodes
   165  	return b
   166  }
   167  
   168  func (b *Builder) MaxNodes(maxNodes int) *Builder {
   169  	b.reg.Cluster.MaxNodes = maxNodes
   170  	return b
   171  }
   172  
   173  // Fields validation
   174  
   175  func (b BffConfig) Valid() error {
   176  	if b.APIEndpoint == "" {
   177  		return fmt.Errorf("backend api endpoint is not provided")
   178  	}
   179  	userPasswordProvided := b.BSLUser != "" && b.BSLPassword != ""
   180  	totpTokenProvided := b.TotpToken != ""
   181  	bearerTokenProvided := b.BearerToken != ""
   182  	if !userPasswordProvided && !totpTokenProvided && !bearerTokenProvided {
   183  		return fmt.Errorf("bsl user/password, bearer or totp token credentials not provided")
   184  	}
   185  	if userPasswordProvided && b.BSLOrganization == "" {
   186  		return fmt.Errorf("bsl organization is not provided")
   187  	}
   188  	if b.CreateBSLSite && b.BSLSiteEuid == "" {
   189  		if b.BSLSiteLatitude < -90 || b.BSLSiteLatitude > 90 {
   190  			return fmt.Errorf("provided bsl latitide is not within the range of -90.0 and 90.0")
   191  		}
   192  		if b.BSLSiteLongitude < -180 || b.BSLSiteLongitude > 180 {
   193  			return fmt.Errorf("provided bsl longitude is not within the range of -180.0 and 180.0")
   194  		}
   195  	}
   196  	if b.BSLOrganization == "" && !bearerTokenProvided {
   197  		return fmt.Errorf("BSL Banner not provided")
   198  	}
   199  	return nil
   200  }
   201  
   202  func (r ClusterInfo) Valid() error {
   203  	if r.Banner == "" {
   204  		return fmt.Errorf("banner is not provided")
   205  	}
   206  	if r.Store == "" {
   207  		return fmt.Errorf("store is not provided")
   208  	}
   209  	if r.ClusterType == "" {
   210  		return fmt.Errorf("cluster type is not provided")
   211  	}
   212  	if r.Fleet == "" {
   213  		return fmt.Errorf("fleetType type is not provided")
   214  	}
   215  	return nil
   216  }
   217  
   218  func (r ClusterInfo) ValidForBootstrapping() error {
   219  	if r.ClusterEdgeID == "" {
   220  		return fmt.Errorf("cluster edge id is not provided")
   221  	}
   222  	return nil
   223  }
   224  
   225  func (r ClusterInfo) IsGKE() bool {
   226  	return r.ClusterType == cluster.GKE
   227  }
   228  

View as plain text