Skip to content

Commit 3984de9

Browse files
committed
adding to network + server
1 parent 06646d9 commit 3984de9

File tree

3 files changed

+108
-0
lines changed

3 files changed

+108
-0
lines changed

network/network.go

+2
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ type Network interface {
121121
AddPermissionlessValidators(context.Context, []PermissionlessStakerSpec) error
122122
// Remove a validator from a subnet
123123
RemoveSubnetValidators(context.Context, []SubnetValidatorsSpec) error
124+
// Add a validator toa subnet
125+
AddSubnetValidators(context.Context, []SubnetValidatorsSpec) error
124126
// Get the elastic subnet tx id for the given subnet id
125127
GetElasticSubnetID(context.Context, ids.ID) (ids.ID, error)
126128
}

server/network.go

+39
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,45 @@ func (lc *localNetwork) AddPermissionlessValidators(ctx context.Context, validat
377377
return nil
378378
}
379379

380+
func (lc *localNetwork) AddSubnetValidators(ctx context.Context, validatorSpecs []network.SubnetValidatorsSpec) error {
381+
lc.lock.Lock()
382+
defer lc.lock.Unlock()
383+
384+
if len(validatorSpecs) == 0 {
385+
ux.Print(lc.log, logging.Orange.Wrap(logging.Bold.Wrap("no validator specs provided...")))
386+
return nil
387+
}
388+
389+
ctx, cancel := context.WithCancel(ctx)
390+
defer cancel()
391+
392+
go func(ctx context.Context) {
393+
select {
394+
case <-lc.stopCh:
395+
// The network is stopped; return from method calls below.
396+
cancel()
397+
case <-ctx.Done():
398+
// This method is done. Don't leak [ctx].
399+
}
400+
}(ctx)
401+
402+
if err := lc.awaitHealthyAndUpdateNetworkInfo(ctx); err != nil {
403+
return err
404+
}
405+
406+
err := lc.nw.AddSubnetValidators(ctx, validatorSpecs)
407+
if err != nil {
408+
return err
409+
}
410+
411+
if err := lc.awaitHealthyAndUpdateNetworkInfo(ctx); err != nil {
412+
return err
413+
}
414+
415+
ux.Print(lc.log, logging.Green.Wrap(logging.Bold.Wrap("finished adding subnet validators")))
416+
return nil
417+
}
418+
380419
func (lc *localNetwork) RemoveSubnetValidator(ctx context.Context, validatorSpecs []network.SubnetValidatorsSpec) error {
381420
lc.lock.Lock()
382421
defer lc.lock.Unlock()

server/server.go

+67
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,64 @@ func (s *server) AddPermissionlessValidator(
638638
return &rpcpb.AddPermissionlessValidatorResponse{ClusterInfo: clusterInfo}, nil
639639
}
640640

641+
func (s *server) AddSubnetValidators(
642+
_ context.Context,
643+
req *rpcpb.AddSubnetValidatorsRequest,
644+
) (*rpcpb.AddSubnetValidatorsResponse, error) {
645+
s.mu.Lock()
646+
defer s.mu.Unlock()
647+
648+
if s.network == nil {
649+
return nil, ErrNotBootstrapped
650+
}
651+
652+
s.log.Debug("AddSubnetValidators")
653+
654+
if len(req.GetValidatorsSpec()) == 0 {
655+
return nil, ErrNoValidatorSpec
656+
}
657+
658+
validatorSpecList := []network.SubnetValidatorsSpec{}
659+
for _, spec := range req.GetValidatorsSpec() {
660+
validatorSpec := getSubnetValidatorSpec(spec)
661+
validatorSpecList = append(validatorSpecList, validatorSpec)
662+
}
663+
664+
// check that the given subnets exist
665+
subnetsSet := set.Set[string]{}
666+
subnetsSet.Add(maps.Keys(s.clusterInfo.Subnets)...)
667+
668+
for _, validatorSpec := range validatorSpecList {
669+
if validatorSpec.SubnetID == "" {
670+
return nil, ErrNoSubnetID
671+
} else if !subnetsSet.Contains(validatorSpec.SubnetID) {
672+
return nil, fmt.Errorf("subnet id %q does not exist", validatorSpec.SubnetID)
673+
}
674+
}
675+
676+
s.clusterInfo.Healthy = false
677+
s.clusterInfo.CustomChainsHealthy = false
678+
679+
ctx, cancel := context.WithTimeout(context.Background(), waitForHealthyTimeout)
680+
defer cancel()
681+
err := s.network.AddSubnetValidators(ctx, validatorSpecList)
682+
683+
s.updateClusterInfo()
684+
685+
if err != nil {
686+
s.log.Error("failed to add subnet validators", zap.Error(err))
687+
return nil, err
688+
}
689+
690+
s.log.Info("successfully added subnet validators")
691+
692+
clusterInfo, err := deepCopy(s.clusterInfo)
693+
if err != nil {
694+
return nil, err
695+
}
696+
return &rpcpb.AddSubnetValidatorsResponse{ClusterInfo: clusterInfo}, nil
697+
}
698+
641699
func (s *server) RemoveSubnetValidator(
642700
_ context.Context,
643701
req *rpcpb.RemoveSubnetValidatorRequest,
@@ -1550,6 +1608,15 @@ func getPermissionlessValidatorSpec(
15501608
return validatorSpec, nil
15511609
}
15521610

1611+
func getSubnetValidatorSpec(
1612+
spec *rpcpb.SubnetValidatorsSpec,
1613+
) network.SubnetValidatorsSpec {
1614+
return network.SubnetValidatorsSpec{
1615+
SubnetID: spec.SubnetId,
1616+
NodeNames: spec.GetNodeNames(),
1617+
}
1618+
}
1619+
15531620
func getRemoveSubnetValidatorSpec(
15541621
spec *rpcpb.RemoveSubnetValidatorSpec,
15551622
) network.SubnetValidatorsSpec {

0 commit comments

Comments
 (0)