github.com/MetalBlockchain/metalgo@v1.11.9/tests/fixture/tmpnet/node_config.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package tmpnet 5 6 import ( 7 "encoding/json" 8 "fmt" 9 "os" 10 "path/filepath" 11 "strings" 12 "time" 13 14 "github.com/MetalBlockchain/metalgo/utils/perms" 15 ) 16 17 // The Node type is defined in this file node_config.go 18 // (reading/writing configuration) and node.go (orchestration). 19 20 func (n *Node) getFlagsPath() string { 21 return filepath.Join(n.GetDataDir(), "flags.json") 22 } 23 24 func (n *Node) readFlags() error { 25 bytes, err := os.ReadFile(n.getFlagsPath()) 26 if err != nil { 27 return fmt.Errorf("failed to read node flags: %w", err) 28 } 29 flags := FlagsMap{} 30 if err := json.Unmarshal(bytes, &flags); err != nil { 31 return fmt.Errorf("failed to unmarshal node flags: %w", err) 32 } 33 n.Flags = flags 34 return n.EnsureNodeID() 35 } 36 37 func (n *Node) writeFlags() error { 38 bytes, err := DefaultJSONMarshal(n.Flags) 39 if err != nil { 40 return fmt.Errorf("failed to marshal node flags: %w", err) 41 } 42 if err := os.WriteFile(n.getFlagsPath(), bytes, perms.ReadWrite); err != nil { 43 return fmt.Errorf("failed to write node flags: %w", err) 44 } 45 return nil 46 } 47 48 func (n *Node) getConfigPath() string { 49 return filepath.Join(n.GetDataDir(), defaultConfigFilename) 50 } 51 52 func (n *Node) readConfig() error { 53 bytes, err := os.ReadFile(n.getConfigPath()) 54 if err != nil { 55 return fmt.Errorf("failed to read node config: %w", err) 56 } 57 if err := json.Unmarshal(bytes, n); err != nil { 58 return fmt.Errorf("failed to unmarshal node config: %w", err) 59 } 60 return nil 61 } 62 63 type serializedNodeConfig struct { 64 NetworkUUID string 65 NetworkOwner string 66 IsEphemeral bool 67 RuntimeConfig *NodeRuntimeConfig 68 } 69 70 func (n *Node) writeConfig() error { 71 config := serializedNodeConfig{ 72 NetworkUUID: n.NetworkUUID, 73 NetworkOwner: n.NetworkOwner, 74 IsEphemeral: n.IsEphemeral, 75 RuntimeConfig: n.RuntimeConfig, 76 } 77 bytes, err := DefaultJSONMarshal(config) 78 if err != nil { 79 return fmt.Errorf("failed to marshal node config: %w", err) 80 } 81 if err := os.WriteFile(n.getConfigPath(), bytes, perms.ReadWrite); err != nil { 82 return fmt.Errorf("failed to write node config: %w", err) 83 } 84 return nil 85 } 86 87 func (n *Node) Read() error { 88 if err := n.readFlags(); err != nil { 89 return err 90 } 91 if err := n.readConfig(); err != nil { 92 return err 93 } 94 return n.readState() 95 } 96 97 func (n *Node) Write() error { 98 if err := os.MkdirAll(n.GetDataDir(), perms.ReadWriteExecute); err != nil { 99 return fmt.Errorf("failed to create node dir: %w", err) 100 } 101 102 if err := n.writeFlags(); err != nil { 103 return nil 104 } 105 return n.writeConfig() 106 } 107 108 func (n *Node) writeMetricsSnapshot(data []byte) error { 109 metricsDir := filepath.Join(n.GetDataDir(), "metrics") 110 if err := os.MkdirAll(metricsDir, perms.ReadWriteExecute); err != nil { 111 return fmt.Errorf("failed to create metrics dir: %w", err) 112 } 113 // Create a compatible filesystem from the current timestamp 114 ts := time.Now().UTC().Format(time.RFC3339) 115 ts = strings.ReplaceAll(strings.ReplaceAll(ts, ":", ""), "-", "") 116 metricsPath := filepath.Join(metricsDir, ts) 117 return os.WriteFile(metricsPath, data, perms.ReadWrite) 118 }