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 }