#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.

# Default values for heron.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

# The environment where Heron will be running
# The following values are valid:
# "aws" - Amazon Web Services
# "gke" - Google Kubernetes Engine
# "minikube" - Kubernetes on a single local node
# "baremetal" - On-premise cluster
platform: minikube

# Heron image to use
image: heron/heron:VERSION
kubectlImage: heron/kubectl:latest

# Heron image pull policy
imagePullPolicy: IfNotPresent

# Number of replicas for the job binary in bookkeeper
jobReplicas: 1

# amount of memory to provide for API server
apiServerMemory: 512M

# Topologies uploader
uploader:
  class: dlog # s3
  s3Bucket: ""
  s3PathPrefix: ""
  s3AccessKey: ""
  s3SecretKey: ""
  s3Region: ""

# Packing algorithms
packing: RoundRobin # ResourceCompliantRR, FirstFitDecreasing

# Number of replicas for storage bookies, memory and storage requirements
bookieReplicas: 1
bookieCpuMin: 100m
bookieCpuMax: 250m
bookieHeapMemory: 256M
bookieDirectMemory: 128M
bookieReadCacheSize: 32
bookieWriteCacheSize: 32
bookieJournalCapacity: 1G
bookieStorageCapacity: 3G

# Number of replicas for zookeeper
zkReplicas: 1

bookkeeper:
  image: apache/bookkeeper:4.7.3
  imagePullPolicy: IfNotPresent
  
  # set storageClassName to "none" to not use storageClassName
  storageClassName: "none"
  prometheus:
    enabled: false

zookeeper:
  enabled: true
  minAvailable: 1
  resources:
    requests:
      cpu: 500m
      memory: 2G
    limits:
      cpu: 1
      memory: 4G
  heap: 1G
  storage: 2G
  serverPort: 2888
  leaderElectionPort: 3888
  clientPort: 2181
  tickTimeMs: 2000
  initTicks: 10
  syncTicks: 5
  clientCnxns: 60
  snapRetain: 3
  purgeHours: 1
  probeInitialDelaySeconds: 15
  probeTimeoutSeconds: 5
  antiAffinity: "hard"
  logLevel: "INFO"
  security:
    enabled: false
    runAsUser: 1000
    fsGroup: 1000
  # set storageClassName to "none" to not use storageClassName
  storageClassName: "none"
