github.com/kotalco/kotal@v0.3.0/controllers/stacks/config.go (about)

     1  package controllers
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"fmt"
     7  
     8  	"github.com/BurntSushi/toml"
     9  	stacksv1alpha1 "github.com/kotalco/kotal/apis/stacks/v1alpha1"
    10  	stacksClients "github.com/kotalco/kotal/clients/stacks"
    11  	"github.com/kotalco/kotal/controllers/shared"
    12  	"k8s.io/apimachinery/pkg/types"
    13  	"sigs.k8s.io/controller-runtime/pkg/client"
    14  )
    15  
    16  type BurnChain struct {
    17  	Chain    string `toml:"chain"`
    18  	Mode     string `toml:"mode"`
    19  	PeerHost string `toml:"peer_host"`
    20  	Username string `toml:"username"`
    21  	Password string `toml:"password"`
    22  	RPCPort  uint   `toml:"rpc_port"`
    23  	PeerPort uint   `toml:"peer_port"`
    24  }
    25  
    26  type Node struct {
    27  	WorkingDir      string `toml:"working_dir"`
    28  	RPCBind         string `toml:"rpc_bind"`
    29  	P2PBind         string `toml:"p2p_bind"`
    30  	Seed            string `toml:"seed,omitempty"`
    31  	LocalPeerSeed   string `toml:"local_peer_seed"`
    32  	Miner           bool   `toml:"miner"`
    33  	MineMicroblocks bool   `toml:"mine_microblocks,omitempty"`
    34  }
    35  
    36  type Config struct {
    37  	Node      Node      `toml:"node"`
    38  	BurnChain BurnChain `toml:"burnchain"`
    39  }
    40  
    41  // ConfigFromSpec generates config.toml file from node spec
    42  func ConfigFromSpec(node *stacksv1alpha1.Node, client client.Client) (config string, err error) {
    43  	c := &Config{}
    44  
    45  	c.Node = Node{
    46  		WorkingDir: shared.PathData(stacksClients.StacksNodeHomeDir),
    47  		RPCBind:    fmt.Sprintf("%s:%d", shared.Host(node.Spec.RPC), node.Spec.RPCPort),
    48  		P2PBind:    fmt.Sprintf("%s:%d", shared.Host(true), node.Spec.P2PPort),
    49  		Miner:      node.Spec.Miner,
    50  	}
    51  
    52  	if node.Spec.Miner {
    53  		var seedPrivateKey string
    54  		name := types.NamespacedName{
    55  			Name:      node.Spec.SeedPrivateKeySecretName,
    56  			Namespace: node.Namespace,
    57  		}
    58  		seedPrivateKey, err = shared.GetSecret(context.Background(), client, name, "key")
    59  		if err != nil {
    60  			return
    61  		}
    62  
    63  		c.Node.Seed = seedPrivateKey
    64  		c.Node.MineMicroblocks = node.Spec.MineMicroblocks
    65  	}
    66  
    67  	if node.Spec.NodePrivateKeySecretName != "" {
    68  		var nodePrivateKey string
    69  		name := types.NamespacedName{
    70  			Name:      node.Spec.NodePrivateKeySecretName,
    71  			Namespace: node.Namespace,
    72  		}
    73  		nodePrivateKey, err = shared.GetSecret(context.Background(), client, name, "key")
    74  		if err != nil {
    75  			return
    76  		}
    77  
    78  		c.Node.LocalPeerSeed = nodePrivateKey
    79  	}
    80  
    81  	name := types.NamespacedName{
    82  		Name:      node.Spec.BitcoinNode.RpcPasswordSecretName,
    83  		Namespace: node.Namespace,
    84  	}
    85  	password, err := shared.GetSecret(context.Background(), client, name, "password")
    86  	if err != nil {
    87  		return
    88  	}
    89  
    90  	c.BurnChain = BurnChain{
    91  		Chain:    "bitcoin",
    92  		Mode:     string(node.Spec.Network),
    93  		PeerHost: node.Spec.BitcoinNode.Endpoint,
    94  		Username: node.Spec.BitcoinNode.RpcUsername,
    95  		Password: password,
    96  		RPCPort:  node.Spec.BitcoinNode.RpcPort,
    97  		PeerPort: node.Spec.BitcoinNode.P2pPort,
    98  	}
    99  
   100  	var buff bytes.Buffer
   101  	enc := toml.NewEncoder(&buff)
   102  	err = enc.Encode(c)
   103  	if err != nil {
   104  		return
   105  	}
   106  
   107  	config = buff.String()
   108  
   109  	return
   110  }