1import * as _ from 'lodash-es' 16/** GOMEMLIMIT = 85% of the k8s memory limit (in GiB). Forces Go GC before the cgroup OOM killer, 17 * mitigating prysm's heap-growth-to-limit behavior. Only handles `<N>Gi` limits. */ 18const goMemLimitFromPodRes = (podResources?: object): string | undefined => { 19 const memLimit = (podResources as {limits?: {memory?: string}})?.limits?.memory 20 const m = memLimit?.match(/^(\d+)Gi$/) 21 return m ? `${Math.floor(Number(m[1]) * 0.85)}GiB` : undefined 24const beaconDeploymentTmpl = ({ 25 name, beaconDataPvcName, prysmNodePort, execEngProv, ethNetwork, ethRewardAddr, 26 p2pHostIp, relayHostPort, cpSyncApiUrl, prysmVersion, podResources, 28 name: string, beaconDataPvcName: string, prysmNodePort: number, execEngProv: string, 29 ethNetwork: string, ethRewardAddr: string, p2pHostIp: string, relayHostPort: string | null, 30 cpSyncApiUrl: string | null, prysmVersion: string, podResources?: object, 32 const jwtName = `${ethNetwork}-jwt` 33 const image = `gcr.io/prysmaticlabs/prysm/beacon-chain:${prysmVersion}` 34 const goMemLimit = goMemLimitFromPodRes(podResources) 39 '--monitoring-host=0.0.0.0', 40 `--execution-endpoint=${execEngProv}`, 41 '--accept-terms-of-use', 43 '--grpc-gateway-host=0.0.0.0', 44 '--grpc-gateway-port=3500', 45 '--grpc-gateway-corsdomain=*', 46 `--p2p-host-ip=${p2pHostIp}`, 47 `--p2p-tcp-port=${prysmNodePort}`, 48 `--p2p-udp-port=${prysmNodePort}`, 50 `--suggested-fee-recipient=${ethRewardAddr}`, 55 `--checkpoint-sync-url=${cpSyncApiUrl}`, 56 `--genesis-beacon-api-url=${cpSyncApiUrl}`, 61 apiVersion: 'apps/v1', 85 args, image, command: [], 87 resources: podResources, 88 env: goMemLimit ? [{name: 'GOMEMLIMIT', value: goMemLimit}] : undefined, 92 name: beaconDataPvcName 104 name: beaconDataPvcName, 105 persistentVolumeClaim: { 106 claimName: beaconDataPvcName 122const validatorDeploymentTmpl = ({name, beaconName, beaconPort, validatorDbPvcName, valsecretsName, walletSecName, prysmVersion, ethRewardAddr}: { 123 name: string, beaconName: string, beaconPort: number, validatorDbPvcName: string, 124 valsecretsName: string, walletSecName: string, prysmVersion: string, ethRewardAddr: string, 128 const image = `gcr.io/prysmaticlabs/prysm/validator:${prysmVersion}` 131 apiVersion: 'apps/v1', 156 `--wallet-dir=${walletDir}`, 157 `--wallet-password-file=${passwordFilePath}`, 159 '--accept-terms-of-use', 160 `--beacon-rpc-provider=${beaconName}:${beaconPort}`, 161 '--datadir=/validatorDB', 162 `--suggested-fee-recipient=${ethRewardAddr}`, 169 mountPath: '/validatorDB', 170 name: validatorDbPvcName 178 name: validatorDbPvcName, 179 persistentVolumeClaim: { 180 claimName: validatorDbPvcName 190export const doSyncPrysm = async ({ 191 eth1ClientName, ethNetwork, enableValidator, ethRewardAddr, 193 prysmNodePort, relayHostPort, prysmVersion, cpSyncApiUrl, 194 guardValidatorFn, podResources, ethValidatorNums, 196 eth1ClientName: string, ethNetwork: string, enableValidator: boolean, ethRewardAddr: string, 197 p2pHostIp: string, prysmNodePort: number, relayHostPort: string | null, prysmVersion: string, 198 cpSyncApiUrl: string | null, guardValidatorFn?: GuardValidatorFn, podResources?: object, ethValidatorNums?: number[], 204 const name = `prysm-${ethNetwork}` 205 const beaconName = `beacon-${name}` 206 const beaconPort = 4000 208 const validatorName = `validator-${name}` 209 const validatorDbPvcName = `validatordb2-${name}` 210 const beaconDataPvcName = name 211 const valsecretsName = `valsecrets-${ethNetwork}` 212 const walletSecName = `wallet-${ethNetwork}-direct` 214 let {httpWeb3Prov, execEngProv, jwtSecretName} = getEth2Vals({ethNetwork, eth1ClientName}) 216 let resources: any[] = [ 219 dualNodePortTmpl({selfName: beaconName + '-p2p', name: beaconName, nodePort: prysmNodePort}), 222 beaconDeploymentTmpl({ 223 name: beaconName, beaconDataPvcName, prysmNodePort, 224 prysmVersion, execEngProv, ethNetwork, ethRewardAddr, 225 p2pHostIp, podResources, 226 relayHostPort, cpSyncApiUrl, 230 if (enableValidator === true) { 232 await guardValidatorFn({ethNetwork, name, cluster_name, action}) 234 const validatorDeployment = validatorDeploymentTmpl({name: validatorName, validatorDbPvcName, beaconName, beaconPort, valsecretsName, walletSecName, prysmVersion, ethRewardAddr}) 236 deployment: validatorDeployment, enabled: action != 'delete', 237 ethValidatorNum: ethValidatorNums?.[0], cluster_name, domainName: domainNames?.[0], cfApiKeySecretName, 239 resources = _.union(resources, [ 243 ...(claimCheckConfigMap ? [claimCheckConfigMap] : []), 247 resources = _.union(resources, cleanupResOnDelete({action, enabled: enableValidator, secNames: [valsecretsName, walletSecName], deployNames: [validatorName]})) 252 name: beaconDataPvcName, 256 ...(enableValidator || action == 'delete') ? await genericPvcTmplA({name: validatorDbPvcName, sizeGb: 10, action}) : [],