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 }