github.com/kotalco/kotal@v0.3.0/apis/ethereum/v1alpha1/node_defaulting_webhook.go (about)

     1  package v1alpha1
     2  
     3  import (
     4  	"sigs.k8s.io/controller-runtime/pkg/webhook"
     5  )
     6  
     7  // +kubebuilder:webhook:path=/mutate-ethereum-kotal-io-v1alpha1-node,mutating=true,failurePolicy=fail,groups=ethereum.kotal.io,resources=nodes,verbs=create;update,versions=v1alpha1,name=mutate-ethereum-v1alpha1-node.kb.io,sideEffects=None,admissionReviewVersions=v1
     8  
     9  var _ webhook.Defaulter = &Node{}
    10  
    11  // Default implements webhook.Defaulter so a webhook will be registered for the type
    12  func (n *Node) Default() {
    13  	defaultAPIs := []API{Web3API, ETHAPI, NetworkAPI}
    14  	client := n.Spec.Client
    15  	nethermindNode := client == NethermindClient
    16  
    17  	if n.Spec.Image == "" {
    18  		var image string
    19  
    20  		switch client {
    21  		case BesuClient:
    22  			image = DefaultBesuImage
    23  		case GethClient:
    24  			image = DefaultGethImage
    25  		case NethermindClient:
    26  			image = DefaultNethermindImage
    27  		}
    28  
    29  		n.Spec.Image = image
    30  	}
    31  
    32  	if n.Spec.Replicas == nil {
    33  		// constants are not addressable
    34  		replicas := DefaltReplicas
    35  		n.Spec.Replicas = &replicas
    36  	}
    37  
    38  	// default genesis block
    39  	if n.Spec.Genesis != nil {
    40  		n.Spec.Genesis.Default()
    41  	}
    42  
    43  	if n.Spec.P2PPort == 0 {
    44  		n.Spec.P2PPort = DefaultP2PPort
    45  	}
    46  
    47  	if n.Spec.SyncMode == "" {
    48  		// public network
    49  		if n.Spec.Genesis == nil {
    50  			if n.Spec.Client == GethClient {
    51  				n.Spec.SyncMode = SnapSynchronization
    52  			} else {
    53  				n.Spec.SyncMode = FastSynchronization
    54  			}
    55  		} else {
    56  			n.Spec.SyncMode = FullSynchronization
    57  		}
    58  	}
    59  
    60  	// must be called after defaulting sync mode because it's depending on its value
    61  	n.DefaultNodeResources()
    62  
    63  	// nethermind doesn't support host whitelisting
    64  	if len(n.Spec.Hosts) == 0 && !nethermindNode {
    65  		n.Spec.Hosts = DefaultOrigins
    66  	}
    67  
    68  	// nethermind doesn't support cors domains
    69  	if len(n.Spec.CORSDomains) == 0 && !nethermindNode {
    70  		n.Spec.CORSDomains = DefaultOrigins
    71  	}
    72  
    73  	if n.Spec.EnginePort == 0 {
    74  		n.Spec.EnginePort = DefaultEngineRPCPort
    75  	}
    76  
    77  	if n.Spec.RPCPort == 0 {
    78  		n.Spec.RPCPort = DefaultRPCPort
    79  	}
    80  
    81  	if len(n.Spec.RPCAPI) == 0 {
    82  		n.Spec.RPCAPI = defaultAPIs
    83  	}
    84  
    85  	if n.Spec.WSPort == 0 {
    86  		n.Spec.WSPort = DefaultWSPort
    87  	}
    88  
    89  	if len(n.Spec.WSAPI) == 0 {
    90  		n.Spec.WSAPI = defaultAPIs
    91  	}
    92  
    93  	if n.Spec.GraphQLPort == 0 {
    94  		n.Spec.GraphQLPort = DefaultGraphQLPort
    95  	}
    96  
    97  	if n.Spec.Logging == "" {
    98  		n.Spec.Logging = DefaultLogging
    99  	}
   100  
   101  }
   102  
   103  // DefaultNodeResources defaults node cpu, memory and storage resources
   104  func (n *Node) DefaultNodeResources() {
   105  	var cpu, cpuLimit, memory, memoryLimit, storage string
   106  	privateNetwork := n.Spec.Genesis != nil
   107  	network := n.Spec.Network
   108  
   109  	if n.Spec.Resources.CPU == "" {
   110  		if privateNetwork {
   111  			cpu = DefaultPrivateNetworkNodeCPURequest
   112  		} else {
   113  			cpu = DefaultPublicNetworkNodeCPURequest
   114  		}
   115  
   116  		n.Spec.Resources.CPU = cpu
   117  	}
   118  
   119  	if n.Spec.Resources.CPULimit == "" {
   120  		if privateNetwork {
   121  			cpuLimit = DefaultPrivateNetworkNodeCPULimit
   122  		} else {
   123  			cpuLimit = DefaultPublicNetworkNodeCPULimit
   124  		}
   125  
   126  		n.Spec.Resources.CPULimit = cpuLimit
   127  	}
   128  
   129  	if n.Spec.Resources.Memory == "" {
   130  		if privateNetwork {
   131  			memory = DefaultPrivateNetworkNodeMemoryRequest
   132  		} else {
   133  			memory = DefaultPublicNetworkNodeMemoryRequest
   134  		}
   135  
   136  		n.Spec.Resources.Memory = memory
   137  	}
   138  
   139  	if n.Spec.Resources.MemoryLimit == "" {
   140  		if privateNetwork {
   141  			memoryLimit = DefaultPrivateNetworkNodeMemoryLimit
   142  		} else {
   143  			memoryLimit = DefaultPublicNetworkNodeMemoryLimit
   144  		}
   145  
   146  		n.Spec.Resources.MemoryLimit = memoryLimit
   147  	}
   148  
   149  	if n.Spec.Resources.Storage == "" {
   150  		if privateNetwork {
   151  			storage = DefaultPrivateNetworkNodeStorageRequest
   152  		} else if network == MainNetwork && n.Spec.SyncMode == FastSynchronization {
   153  			storage = DefaultMainNetworkFastNodeStorageRequest
   154  		} else if network == MainNetwork && n.Spec.SyncMode == FullSynchronization {
   155  			storage = DefaultMainNetworkFullNodeStorageRequest
   156  		} else {
   157  			storage = DefaultTestNetworkStorageRequest
   158  		}
   159  
   160  		n.Spec.Resources.Storage = storage
   161  	}
   162  
   163  }