#  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.

# Environment where Heron will be running
# Valid values are as follows
# "aws" - Amazon Cloud
# "gke" - Google Container Enginer
# "minikube" - Kubernetes in a single node
# "baremetal" - On premise machines
platform: gke

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

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

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

# Number of replicas for zookeeper
zkReplicas: 5
