github.com/ava-labs/avalanchego@v1.11.11/vms/registry/vm_registry.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package registry
     5  
     6  import (
     7  	"context"
     8  
     9  	"github.com/ava-labs/avalanchego/ids"
    10  	"github.com/ava-labs/avalanchego/vms"
    11  )
    12  
    13  var _ VMRegistry = (*vmRegistry)(nil)
    14  
    15  // VMRegistry defines functionality to get any new virtual machines on the node,
    16  // and install them if they're not already installed.
    17  type VMRegistry interface {
    18  	// Reload installs all non-installed vms on the node.
    19  	Reload(ctx context.Context) ([]ids.ID, map[ids.ID]error, error)
    20  }
    21  
    22  // VMRegistryConfig defines configurations for VMRegistry
    23  type VMRegistryConfig struct {
    24  	VMGetter  VMGetter
    25  	VMManager vms.Manager
    26  }
    27  
    28  type vmRegistry struct {
    29  	config VMRegistryConfig
    30  }
    31  
    32  // NewVMRegistry returns a VMRegistry
    33  func NewVMRegistry(config VMRegistryConfig) VMRegistry {
    34  	return &vmRegistry{
    35  		config: config,
    36  	}
    37  }
    38  
    39  func (r *vmRegistry) Reload(ctx context.Context) ([]ids.ID, map[ids.ID]error, error) {
    40  	_, unregisteredVMs, err := r.config.VMGetter.Get()
    41  	if err != nil {
    42  		return nil, nil, err
    43  	}
    44  
    45  	registeredVms := make([]ids.ID, 0, len(unregisteredVMs))
    46  	failedVMs := make(map[ids.ID]error)
    47  
    48  	for vmID, factory := range unregisteredVMs {
    49  		if err := r.config.VMManager.RegisterFactory(ctx, vmID, factory); err != nil {
    50  			failedVMs[vmID] = err
    51  			continue
    52  		}
    53  
    54  		registeredVms = append(registeredVms, vmID)
    55  	}
    56  	return registeredVms, failedVMs, nil
    57  }