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  }