crds:
  # -- Disables the installation of all CRDs if set to false
  enabled: true
  csi:
    volumeSnapshots:
      # -- Install Volume Snapshot CRDs
      enabled: true

global:
  security:
    allowInsecureImages: true

image:
  # -- Image registry to pull our product images
  registry: docker.io
  # -- Image registry's namespace
  repo: openebs
  # -- Release tag for our images
  tag: v2.10.0
  repoTags:
    # Note: Below image tag configuration is optional and typically should never be
    #       used. Setting specific image tags for the different repositories proves useful
    #       for some integration testing scenarios. Use the 'tag' option above to set
    #       release/pre-release container image tags.
    #       The below tag values will be picked for images by default.
    #       If not specified, 'tag' option provided above will be picked.
    controlPlane: ""
    dataPlane: ""
    extensions: ""
  # -- ImagePullPolicy for our images
  pullPolicy: IfNotPresent
  # -- docker-secrets required to pull images if the container registry from image.registry is protected
  pullSecrets: []
# -- Node labels for pod assignment
# ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
# Note that if multi-arch images support 'kubernetes.io/arch: amd64'
# should be removed and set 'nodeSelector' to empty '{}' as default value.
nodeSelector:
  kubernetes.io/arch: amd64
# -- Pod scheduling priority.
# Setting this value will apply to all components except the external Chart dependencies.
# If any component has `priorityClassName` set, then this value would be overridden for that component.
# For external components like etcd, jaeger or loki, PriorityClass can only be set at component level.
priorityClassName: ""
earlyEvictionTolerations:
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 5
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 5
# -- Tolerations to be applied to all components except external Chart dependencies.
# If any component has tolerations set, then it would override this value.
# For external components like etcd, jaeger and loki, tolerations can only be set at component level.
tolerations: []
base:
  # -- Request timeout for rest & core agents
  default_req_timeout: 5s
  # -- Cache timeout for core agent & diskpool deployment
  cache_poll_period: 30s
  logging:
    # -- Valid values for format are pretty, json and compact
    format: pretty
    # -- Enable ansi color code for Pod StdOut/StdErr
    color: true
    # -- Silence specific module components
    silenceLevel:
  initContainers:
    enabled: true
    image:
      name: alpine-sh
      tag: 4.3.0
      pullPolicy: IfNotPresent
    containers:
      - name: agent-core-grpc-probe
        command: ['sh', '-c', 'trap "exit 1" TERM; until nc -vzw 5 {{ .Release.Name }}-agent-core 50051; do date; echo "Waiting for agent-core-grpc services..."; sleep 1; done;']
      - name: etcd-probe
        command: ['sh', '-c', 'trap "exit 1" TERM; until nc -vzw 5 {{ include "etcdUrl" . }} {{ .Values.etcd.service.ports.client }}; do date; echo "Waiting for etcd..."; sleep 1; done;']
  initHaNodeContainers:
    enabled: true
    containers:
      - name: agent-cluster-grpc-probe
        command: ['sh', '-c', 'trap "exit 1" TERM; until nc -vzw 5 {{ .Release.Name }}-agent-core 50052; do date; echo "Waiting for agent-cluster-grpc services..."; sleep 1; done;']
  initCoreContainers:
    enabled: true
    containers:
      - name: etcd-probe
        command: ['sh', '-c', 'trap "exit 1" TERM; until nc -vzw 5 {{ include "etcdUrl" . }} {{ .Values.etcd.service.ports.client }}; do date; echo "Waiting for etcd..."; sleep 1; done;']
  metrics:
    # -- Enable the metrics exporter
    enabled: true
    # -- Container port for the metrics exporter service
    port: 9502
  jaeger:
    # Enable jaeger tracing (for development only).
    # Since version 1.31 the Jaeger Operator uses webhooks to validate Jaeger custom resources (CRs).
    # This requires an installed version of the cert-manager.
    enabled: false
    initContainer: true
    agent:
      name: jaeger-agent
      port: 6831
      initContainer:
        - name: jaeger-probe
          command: ['sh', '-c', 'trap "exit 1" TERM; until nc -vzw 5 -u {{.Values.base.jaeger.agent.name}} {{.Values.base.jaeger.agent.port}}; do date; echo "Waiting for jaeger..."; sleep 1; done;']
    collector:
      name: jaeger-collector
      port: 4317
      initContainer:
        - name: jaeger-probe
          command: ['sh', '-c', 'trap "exit 1" TERM; until nc -vzw 5 -u {{.Values.base.jaeger.collector.name}} {{.Values.base.jaeger.collector.port}}; do date; echo "Waiting for jaeger..."; sleep 1; done;']
  initRestContainer:
    enabled: true
    initContainer:
      - name: api-rest-probe
        command: ['sh', '-c', 'trap "exit 1" TERM; until nc -vzw 5 {{ .Release.Name }}-api-rest 8081; do date; echo "Waiting for REST API endpoint to become available"; sleep 1; done;']
operators:
  pool:
    # -- Log level for diskpool operator service
    logLevel: info
    resources:
      limits:
        # -- Cpu limits for diskpool operator
        cpu: "100m"
        # -- Memory limits for diskpool operator
        memory: "32Mi"
      requests:
        # -- Cpu requests for diskpool operator
        cpu: "50m"
        # -- Memory requests for diskpool operator
        memory: "16Mi"
    # -- Set tolerations, overrides global
    tolerations: []
    # -- Set PriorityClass, overrides global
    priorityClassName: ""
jaeger-operator:
  # Name of jaeger operator
  name: "{{ .Release.Name }}"
  jaeger:
    # Install jaeger-operator
    create: false
    collector:
      service:
        otlp:
          grpc: true
  rbac:
    # Create a clusterRole for Jaeger
    clusterRole: true
  tolerations: []
  priorityClassName: ""
agents:
  core:
    # -- Request timeout for core agents
    # Default value is defined in .base.default_req_timeout
    requestTimeout:
    # -- Enable minimal timeouts
    minTimeouts: true
    # -- Log level for the core service
    logLevel: info
    capacity:
      thin:
        # -- The allowed pool commitment limit when dealing with thin provisioned volumes.
        # Example: If the commitment is 250 and the pool is 10GiB we can overcommit the pool
        # up to 25GiB (create 2 10GiB and 1 5GiB volume) but no further.
        poolCommitment: "250%"
        # -- When creating replicas for an existing volume, each replica pool must have at least
        # this much free space percentage of the volume size.
        # Example: if this value is 40, the pool has 40GiB free, then the max volume size allowed
        # to be created on the pool is 100GiB.
        volumeCommitment: "40%"
        # -- Same as the `volumeCommitment` argument, but applicable only when creating replicas
        # for a new volume.
        volumeCommitmentInitial: "40%"
        # -- When creating snapshots for an existing volume, each replica pool must have at least
        # this much free space percentage of the volume size.
        # Example: if this value is 40, the pool has 40GiB free, then the max volume size allowed
        # to be snapped on the pool is 100GiB.
        snapshotCommitment: "40%"
    rebuild:
      # -- The maximum number of system-wide rebuilds permitted at any given time.
      # If set to an empty string, there are no limits.
      maxConcurrent: ""
      partial:
        # -- Partial rebuild uses a log of missed IO to rebuild replicas which have become temporarily faulted,
        # hence a bit faster, depending on the log size.
        enabled: true
        # -- If a faulted replica comes back online within this time period then it will be
        # rebuilt using the partial rebuild capability. Otherwise, the replica will be fully rebuilt.
        # A blank value "" means internally derived value will be used.
        waitPeriod: ""
    # The maximum number of concurrent create volume requests.
    maxCreateVolume: 10
    # -- Enable extended volume health information, which helps generate the volume status more accurately.
    volumeHealth: true
    resources:
      limits:
        # -- Cpu limits for core agents
        cpu: "1000m"
        # -- Memory limits for core agents
        memory: "128Mi"
      requests:
        # -- Cpu requests for core agents
        cpu: "500m"
        # -- Memory requests for core agents
        memory: "32Mi"
    # -- Set tolerations, overrides global
    tolerations: []
    # -- Set PriorityClass, overrides global.
    # If both local and global are not set, the final deployment manifest has a mayastor custom critical priority class assigned to the pod by default.
    # Refer the `templates/_helpers.tpl` and `templates/mayastor/agents/core/agent-core-deployment.yaml` for more details.
    priorityClassName: ""
    # -- Prefer encrypted pools for volume replicas.
    # If a volume wasn't provisioned with a encryption storageclass, we try to place the replicas of such volume on best-effort basis onto encrypted pools, if this global is set.
    # This is effective subject to volume spec already modified via plugin to request encryption.
    encryptedPoolsSoftScheduling: false
    # -- Allow using non-persistent kernel devpaths for pool disks.
    # Enabling this will let users to use the kernel devpaths e.g /dev/sda, for diskpools. However, this comes with associated risks if the devpaths
    # get swapped among disks, resulting in total data loss especially if encryption is being used.
    allowNonPersistentDevlink: false
    # -- Default blobstore cluster size for diskpools, in bytes.
    # This value is used as a default value of blobstore cluster size on diskpools. This is set to 4MiB internally by default, if nothing specified here.
    # The value is also configurable via Diskpool CR, which takes precedence over this setting. This is an advanced configuration, please refer documentation to
    # understand the usage and implications of this.
    poolClusterSize: ""
  ha:
    enabled: true
    node:
      # -- Log level for the ha node service
      logLevel: info
      resources:
        limits:
          # -- Cpu limits for ha node agent
          cpu: "100m"
          # -- Memory limits for ha node agent
          memory: "64Mi"
        requests:
          # -- Cpu requests for ha node agent
          cpu: "100m"
          # -- Memory requests for ha node agent
          memory: "64Mi"
      # -- Set tolerations, overrides global
      tolerations: []
      # -- Set PriorityClass, overrides global
      priorityClassName: ""
      # -- Container port for the ha-node service
      port: 50053
    cluster:
      # -- Log level for the ha cluster service
      logLevel: info
      resources:
        limits:
          # -- Cpu limits for ha cluster agent
          cpu: "100m"
          # -- Memory limits for ha cluster agent
          memory: "64Mi"
        requests:
          # -- Cpu requests for ha cluster agent
          cpu: "100m"
          # -- Memory requests for ha cluster agent
          memory: "16Mi"
apis:
  rest:
    # -- Log level for the rest service
    logLevel: info
    healthProbes:
      readiness:
        # -- Toggle readiness probe.
        enabled: true
        # -- Frequency for the agent-core liveness probe.
        agentCoreProbeFreq: "20s"
        # -- No. of failures the readiness probe will tolerate.
        failureThreshold: 2
        # -- No. of seconds of delay before checking the readiness status.
        initialDelaySeconds: 0
        # -- No. of seconds between readiness probe checks.
        periodSeconds: 20
        # -- No. of seconds of timeout tolerance.
        timeoutSeconds: 5
      liveness:
        # -- Toggle liveness probe.
        enabled: true
        # -- No. of failures the liveness probe will tolerate.
        failureThreshold: 1
        # -- No. of seconds of delay before checking the liveness status.
        initialDelaySeconds: 0
        # -- No. of seconds between liveness probe checks.
        periodSeconds: 30
        # -- No. of seconds of timeout tolerance.
        timeoutSeconds: 5
    # -- Number of replicas of rest
    replicaCount: 1
    resources:
      limits:
        # -- Cpu limits for rest
        cpu: "100m"
        # -- Memory limits for rest
        memory: "64Mi"
      requests:
        # -- Cpu requests for rest
        cpu: "50m"
        # -- Memory requests for rest
        memory: "32Mi"
    # Rest service parameters define how the rest service is exposed
    service:
      # -- Rest K8s service type
      type: ClusterIP
      # Ports from where rest endpoints are accessible from outside the cluster, only valid if type is NodePort
      nodePorts:
        # NodePort associated with http port
        http: 30011
        # NodePort associated with https port
        https: 30010
    # -- Set tolerations, overrides global
    tolerations: []
    # -- Set PriorityClass, overrides global.
    # If both local and global are not set, the final deployment manifest has a mayastor custom critical priority class assigned to the pod by default.
    # Refer the `templates/_helpers.tpl` and `templates/mayastor/apis/rest/api-rest-deployment.yaml` for more details.
    priorityClassName: ""
csi:
  image:
    # -- Image registry to pull all CSI Sidecar images
    registry: registry.k8s.io
    # -- Image registry's namespace
    repo: sig-storage
    # -- imagePullPolicy for all CSI Sidecar images
    pullPolicy: IfNotPresent
    # -- csi-provisioner image release tag
    provisionerTag: v5.2.0
    # -- csi-attacher image release tag
    attacherTag: v4.8.1
    # -- csi-snapshotter image release tag
    snapshotterTag: v8.2.0
    # -- csi-snapshot-controller image release tag
    snapshotControllerTag: v8.2.0
    # -- csi-node-driver-registrar image release tag
    registrarTag: v2.13.0
    # -- csi-resizer image release tag
    resizerTag: v1.13.2
  controller:
    # -- Log level for the csi controller
    logLevel: info
    # The maximum number of concurrent create volume requests.
    maxCreateVolume: 10
    resources:
      limits:
        # -- Cpu limits for csi controller
        cpu: "32m"
        # -- Memory limits for csi controller
        memory: "128Mi"
      requests:
        # -- Cpu requests for csi controller
        cpu: "16m"
        # -- Memory requests for csi controller
        memory: "64Mi"
    # -- Set tolerations, overrides global
    tolerations: []
    # -- Set PriorityClass, overrides global
    priorityClassName: ""
    # -- Prevent modifying the volume mode when creating a PVC from an existing VolumeSnapshot
    preventVolumeModeConversion: true
    # Enable auto garbage collection of volume resources which were associated with `Retain` PV's.
    # Before enabling this, make sure you're well aware of the dangerous downsides.
    # For more information see: <https://kubernetes.io/docs/concepts/storage/persistent-volumes/#retain>.
    enableDangerousRetainGC: false
  node:
    logLevel: info
    topology:
      segments:
        openebs.io/csi-node: mayastor
      # -- Add topology segments to the csi-node and agent-ha-node daemonset node selector
      nodeSelector: false
    resources:
      limits:
        # -- Cpu limits for csi node plugin
        cpu: "100m"
        # -- Memory limits for csi node plugin
        memory: "128Mi"
      requests:
        # -- Cpu requests for csi node plugin
        cpu: "100m"
        # -- Memory requests for csi node plugin
        memory: "64Mi"
    nvme:
      # The nvme_core module and nvme block io timeout in humantime
      # By default it uses the "io_engine.nvme.ioTimeout" + 10s
      # Do not modify this unless you're really sure about its effects
      io_timeout: ""
      # -- The ctrl_loss_tmo (controller loss timeout) in seconds
      ctrl_loss_tmo: "1980"
      # Kato (keep alive timeout) in seconds
      keep_alive_tmo: ""
      # -- Fallback to nvme-tcp if nvme-rdma is enabled for Mayastor but rdma is not available on a particular csi-node
      tcpFallback: true
    # -- The kubeletDir directory for the csi-node plugin
    kubeletDir: /var/lib/kubelet
    pluginMountPath: /csi
    socketPath: csi.sock
    # Additional arguments when creating filesystems
    mkfs_args:
      xfs: ""
    restClient:
      enabled: true
    # -- Set tolerations, overrides global
    tolerations: []
    # -- Set PriorityClass, overrides global
    priorityClassName: ""
    initContainers:
      enabled: false
      containers:
        - name: nvme-tcp-probe
          command: ['sh', '-c', 'trap "exit 1" TERM; until [ -d /sys/module/nvme_tcp ]; do [ -z "$WARNED" ] && echo "nvme_tcp module not loaded..."; WARNED=1; sleep 60; done;']
    # -- Container port for the csi-node service
    port: 10199
io_engine:
  # -- Log level for the io-engine service
  logLevel: info
  api: "v1"
  target:
    nvmf:
      # -- Enable RDMA
      # Capability of Mayastor nvmf target to take RDMA connections if the cluster nodes have RDMA device(s)
      # configured from RNIC.
      rdma:
        enabled: false
      # -- NVMF target interface (ip, mac, name or subnet)
      # If RDMA is enabled, please set iface to an RDMA
      # capable netdev name from host network. Example, if an rdma device mlx5_0 is
      # available on a netdev eth0 on RNIC, as can be seen from `rdma link` command output,
      # then this field should be set to eth0.
      iface: ""
      # -- Reservations Persist Through Power Loss State
      ptpl: true
      # NVMF target Command Retry Delay for volume target initiators
      hostCmdRetryDelay:
        # A command retry delay in milliseconds. A value of 0 means no delay, host may retry immediately
        crdt1: 30
  nvme:
    # -- Timeout for IOs
    # The default here is exaggerated for local disks, but we've observed that in
    # shared virtual environments having a higher timeout value is beneficial.
    # Please adjust this according to your hardware and needs.
    ioTimeout: "110s"
    # Timeout for admin commands
    adminTimeout: "30s"
    # Timeout for keep alives
    keepAliveTimeout: "10s"
    tcp:
      # -- Max size setting (both initiator and target) for an NVMe queue
      # -- You may need to increase this for a higher outstanding IOs per volume
      maxQueueDepth: "32"
      # Max qpairs per controller.
      maxQpairsPerCtrl: "32"
  # -- Pass additional arguments to the Environment Abstraction Layer.
  # Example: --set {product}.envcontext=iova-mode=pa
  envcontext: ""
  reactorFreezeDetection:
    enabled: false
  # -- The number of cores that each io-engine instance will bind to.
  cpuCount: "2"
  # -- If not empty, overrides the cpuCount and explicitly sets the list of cores.
  # Example: --set='io_engine.coreList={30,31}'
  coreList: []
  # -- Node selectors to designate storage nodes for diskpool creation
  # Note that if multi-arch images support 'kubernetes.io/arch: amd64'
  # should be removed.
  nodeSelector:
    openebs.io/engine: mayastor
    kubernetes.io/arch: amd64
  resources:
    limits:
      # -- Cpu limits for the io-engine
      cpu: ""
      # -- Memory limits for the io-engine
      memory: "1Gi"
      # -- Hugepage memory in 2MiB chunks
      hugepages2Mi: "2Gi"
      # -- Hugepage memory in 1GiB chunks
      hugepages1Gi:
    requests:
      # -- Cpu requests for the io-engine
      cpu: ""
      # -- Memory requests for the io-engine
      memory: "1Gi"
      # -- Hugepage memory in 2MiB chunks
      hugepages2Mi: "2Gi"
      # -- Hugepage memory in 1GiB chunks
      hugepages1Gi:
  # -- Set tolerations, overrides global
  tolerations: []
  # -- Set PriorityClass, overrides global
  priorityClassName: ""
  # -- Runtime class to use. Defaults to cluster standard
  runtimeClassName: ""
  # -- Number of retries for pstor persistence before the volume target self shutdowns
  pstorRetries: 300
  # -- Container port for the io-engine service
  port: 10124
etcd:
  # -- Disable when using an external etcd cluster.
  enabled: true
  # -- (string) Url of the external etcd cluster. Note, etcd.enable must be set to false.
  externalUrl: ""
  # Configuration for etcd's localpv hostpath storage class.
  localpvScConfig:
    enabled: true
    # Name of etcd's localpv hostpath storage class.
    name: "mayastor-etcd-localpv"
    # -- Host path where local etcd data is stored in.
    basePath: "/var/local/{{ .Release.Name }}/localpv-hostpath/etcd"
    # -- ReclaimPolicy of etcd's localpv hostpath storage class.
    reclaimPolicy: Delete
    # -- VolumeBindingMode of etcd's localpv hostpath storage class.
    volumeBindingMode: WaitForFirstConsumer
  # Pod labels; okay to remove the openebs logging label if required
  podLabels:
    app: etcd
    openebs.io/logging: "true"
  # -- Number of replicas of etcd
  replicaCount: 3
  # -- Kubernetes Cluster Domain
  clusterDomain: cluster.local
  # TLS authentication for client-to-server communications
  # ref: https://etcd.io/docs/current/op-guide/security/
  auth:
    client:
      secureTransport: false
    # TLS authentication for server-to-server communications
    # ref: https://etcd.io/docs/current/op-guide/security/
    peer:
      secureTransport: false
    rbac:
      create: false
      allowNoneAuthentication: true
  # Enable persistence using Persistent Volume Claims
  persistence:
    # -- If true, use a Persistent Volume Claim. If false, use emptyDir.
    enabled: true
    # -- Will define which storageClass to use in etcd's StatefulSets. Options:
    # <p> - `"manual"` - Will provision a hostpath PV on the same node. <br>
    # - `""` (empty) - Will use the default StorageClass on the cluster. </p>
    storageClass: "mayastor-etcd-localpv"
    # -- Volume size
    size: 2Gi
  persistentVolumeClaimRetentionPolicy:
    # -- PVC's reclaimPolicy
    enabled: false
    whenDeleted: Retain
    whenScaled: Retain
  # -- Use a PreStop hook to remove the etcd members from the etcd cluster on container termination
  # Ignored if lifecycleHooks is set or replicaCount=1
  removeMemberOnContainerTermination: false
  # -- AutoCompaction
  # Since etcd keeps an exact history of its keyspace, this history should be
  # periodically compacted to avoid performance degradation
  # and eventual storage space exhaustion.
  # Auto compaction mode. Valid values: "periodic", "revision".
  # - 'periodic' for duration based retention, defaulting to hours if no time unit is provided (e.g. 5m).
  # - 'revision' for revision number based retention.
  autoCompactionMode: revision
  # -- Auto compaction retention length. 0 means disable auto compaction.
  autoCompactionRetention: "100"
  extraEnvVars:
    # -- Raise alarms when backend size exceeds the given quota.
    - name: ETCD_QUOTA_BACKEND_BYTES
      value: "8589934592"
  # Init containers parameters:
  # volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.
  #
  volumePermissions:
    # chown the mounted volume; this is required if a statically provisioned hostpath volume is used
    enabled: true
    image:
      registry: docker.io
      repository: openebs/alpine-bash
      tag: 4.3.0
      pullSecrets: []
  image:
    registry: docker.io
    repository: openebs/etcd
    # extra debug information on logs
    debug: false
  # -- Pod anti-affinity preset
  # Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
  podAntiAffinityPreset: "hard"
  ## -- nodeSelector [object] Node labels for pod assignment
  ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
  nodeSelector: {}
  # etcd service parameters defines how the etcd service is exposed
  service:
    # K8s service type
    type: ClusterIP
    ports:
      # etcd client port
      client: 2379
    # Specify the nodePort(s) value(s) for the LoadBalancer and NodePort service types.
    # ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
    #
    nodePorts:
      # Port from where etcd endpoints are accessible from outside cluster
      client: 31379
      peer: ""
  tolerations: []
  priorityClassName: ""
  preUpgradeJob:
    annotations:
      "helm.sh/hook-delete-policy": "hook-succeeded,before-hook-creation"
loki:
  enabled: true
  # NOTE: For all possible storage options for loki, check https://github.com/openebs/mayastor-extensions/blob/HEAD/chart/loki-storage.md
  # Configuration for loki's localpv hostpath storage class.
  localpvScConfig:
    enabled: true
    loki:
      # Name of loki's localpv hostpath storage class.
      name: "mayastor-loki-localpv"
      # -- Host path where local loki data is stored in.
      basePath: "/var/local/{{ .Release.Name }}/localpv-hostpath/loki"
      # -- ReclaimPolicy of loki's localpv hostpath storage class.
      reclaimPolicy: Delete
      # -- VolumeBindingMode of loki's localpv hostpath storage class.
      volumeBindingMode: WaitForFirstConsumer
    minio:
      # Name of minio's localpv hostpath storage class.
      name: "mayastor-minio-localpv"
      # -- Host path where local minio data is stored in.
      basePath: "/var/local/{{ .Release.Name }}/localpv-hostpath/minio"
      # -- ReclaimPolicy of minio's localpv hostpath storage class.
      reclaimPolicy: Delete
      # -- VolumeBindingMode of minio's localpv hostpath storage class.
      volumeBindingMode: WaitForFirstConsumer
  loki:
    serviceLabels:
      app: loki
    podLabels:
      app: loki
    schemaConfig:
      configs:
        - from: 2024-04-01
          store: tsdb
          object_store: s3
          schema: v13
          index:
            prefix: loki_index_
            period: 24h
    commonConfig:
      replication_factor: 3
    ingester:
      chunk_encoding: snappy
      # Configure these if a quicker ingestion is needed, i.e. faster push to your bucket.
      # chunk_idle_period: 3m
      # chunk_retain_period: 1m
      # max_chunk_age: 6m
    tracing:
      enabled: true
    querier:
      max_concurrent: 1
    limits_config:
      ingestion_burst_size_mb: 1000
      ingestion_rate_mb: 10000
  singleBinary:
    replicas: 3
    drivesPerNode: 1
    persistence:
      enabled: true
      storageClass: "mayastor-loki-localpv"
      accessModes:
        - ReadWriteOnce
      size: 2Gi
  minio:
    replicas: 3
    drivesPerNode: 1
    mode: distributed
    # Disable this if you want to enabled external s3 bucket, and uncomment the storage section above.
    enabled: true
    persistence:
      storageClass: "mayastor-loki-localpv"
      size: 2Gi
  deploymentMode: SingleBinary
  lokiCanary:
    enabled: false
  chunksCache:
    enabled: false
  test:
    enabled: false
  gateway:
    enabled: false
  resultsCache:
    enabled: false
  backend:
    replicas: 0
  read:
    replicas: 0
  write:
    replicas: 0
  ingester:
    replicas: 0
  querier:
    replicas: 0
  queryFrontend:
    replicas: 0
  queryScheduler:
    replicas: 0
  distributor:
    replicas: 0
  compactor:
    replicas: 0
  indexGateway:
    replicas: 0
  bloomCompactor:
    replicas: 0
  bloomGateway:
    replicas: 0
  sidecar:
    image:
      repository: docker.io/kiwigrid/k8s-sidecar
alloy:
  logging_config:
    # Enable debugging on alloy components.
    debugging: false
    # -- Labels to enable scraping on, at-least one of these labels should be present.
    labels:
      openebs.io/logging: true
    # -- X-Scope-OrgID to pe populated which pushing logs. Make sure the caller also uses the same.
    tenant_id: openebs
  enabled: true
  alloy:
    mounts:
      varlog: true
    configMap:
      create: true
      content: |
        livedebugging {
          enabled = {{ .Values.logging_config.debugging }}
        }

        discovery.kubernetes "{{ .Release.Name }}_pods_name" {
          role = "pod"
        }

        discovery.relabel "{{ .Release.Name }}_pods_name" {
          targets = discovery.kubernetes.{{ .Release.Name }}_pods_name.targets

          {{- $labels := .Values.logging_config.labels }}
          {{- if $labels }}
          {{- $keys := (keys $labels | sortAlpha) }}

          rule {
            source_labels = [
              {{- range $key := $keys }}
              "__meta_kubernetes_pod_label_{{ $key | replace "." "_" | replace "/" "_" }}",
              {{- end }}
            ]
            separator     = ";"
            regex         = "^{{ include "regex_or" (dict "labels" $labels "keys" $keys) }}$"
            action        = "keep"
          }

          {{- end }}

          rule {
            regex  = "__meta_kubernetes_pod_label_(.+)"
            action = "labelmap"
          }

          rule {
            regex  = "__meta_kubernetes_pod_label_(.+)"
            action = "labelmap"
          }

          rule {
            source_labels = ["__meta_kubernetes_namespace"]
            separator     = "/"
            target_label  = "job"
          }

          rule {
            source_labels = ["__meta_kubernetes_pod_name"]
            target_label  = "pod"
          }

          rule {
            source_labels = ["__meta_kubernetes_pod_container_name"]
            target_label  = "container"
          }

          rule {
            source_labels = ["__meta_kubernetes_pod_node_name"]
            target_label  = "hostname"
          }

          rule {
            source_labels = ["__meta_kubernetes_pod_uid", "__meta_kubernetes_pod_container_name"]
            separator     = "/"
            target_label  = "__path__"
            replacement   = "/var/log/pods/*$1/*.log"
          }
        }

        local.file_match "{{ .Release.Name }}_pod_files" {
          path_targets = discovery.relabel.{{ .Release.Name }}_pods_name.output
        }

        loki.source.file "{{ .Release.Name }}_pod_logs" {
          targets    = local.file_match.{{ .Release.Name }}_pod_files.targets
          forward_to = [loki.process.{{ .Release.Name }}_process_logs.receiver]
        }

        loki.process "{{ .Release.Name }}_process_logs" {
          forward_to = [loki.write.default.receiver]

          stage.docker { }

          stage.replace {
            expression = "(\\n)"
            replace = ""
          }

          stage.multiline {
            firstline = "^  \\x1b\\[2m(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}).(\\d{6})Z"
          }

          stage.multiline {
            firstline = "^  (\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}).(\\d{6})Z"
          }
        }

        loki.write "default" {
            endpoint {
            url       = "http://{{ .Release.Name }}-loki:3100/loki/api/v1/push"
            tenant_id = "{{ .Values.logging_config.tenant_id }}"
          }
          external_labels = {}
        }

        {{- define "regex_or" -}}
        {{- $labels := .labels -}}
        {{- $keys := .keys -}}
        {{- $numKeys := len $keys -}}
        {{- $regexParts := list -}}
        {{- range $i, $key := $keys -}}
        {{- $part := list -}}
        {{- range $j := until $numKeys -}}
        {{- if eq $j $i -}}
        {{- $part = append $part (get $labels $key) -}}
        {{- else -}}
        {{- $part = append $part ".*" -}}
        {{- end -}}
        {{- end -}}
        {{- $regexParts = append $regexParts (join ";" $part) -}}
        {{- end -}}
        {{- join "|" $regexParts -}}
        {{- end -}}
# Eventing which enables or disables eventing-related components.
eventing:
  enabled: true
# Configuration for the nats message-bus. This is an eventing component, and is enabled when
# 'eventing.enabled' is set to 'true'.
nats:
  nats:
    image:
      pullPolicy: IfNotPresent
      registry: docker.io
    jetstream:
      enabled: true
      memStorage:
        enabled: true
        # Size of nats message is around 0.3 KB, so it can store around 10K messages.
        size: "5Mi"
      fileStorage:
        enabled: false
  # Affinity for pod assignment
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchLabels:
              app.kubernetes.io/name: nats
          topologyKey: kubernetes.io/hostname
  cluster:
    enabled: true
    replicas: 3
  # Define if NATS is using FQDN name for clustering (i.e. nats-0.nats.default.svc.cluster.local) or short name (i.e. nats-0.nats.default).
  useFQDN: false
  statefulSetPodLabels:
    app: nats
    openebs.io/logging: "true"
  # The nats box can be installed for debugging, by default its enabled.
  natsbox:
    enabled: false
    image:
      registry: docker.io
  reloader:
    image:
      registry: docker.io
  exporter:
    image:
      registry: docker.io
obs:
  callhome:
    # -- Enable callhome
    enabled: true
    # -- Log level for callhome
    logLevel: "info"
    sendReport: true
    resources:
      limits:
        # -- Cpu limits for callhome
        cpu: "100m"
        # -- Memory limits for callhome
        memory: "32Mi"
      requests:
        # -- Cpu requests for callhome
        cpu: "50m"
        # -- Memory requests for callhome
        memory: "16Mi"
    # -- Set tolerations, overrides global
    tolerations: []
    # -- Set PriorityClass, overrides global
    priorityClassName: ""
  # Eventing component enabled/disabled based on obs.callhome.enabled value
  stats:
    # -- Log level for stats
    logLevel: "info"
    resources:
      limits:
        # -- Cpu limits for stats
        cpu: "100m"
        # -- Memory limits for stats
        memory: "32Mi"
      requests:
        # -- Cpu requests for stats
        cpu: "50m"
        # -- Memory requests for stats
        memory: "16Mi"
    service:
      # -- Rest K8s service type
      type: ClusterIP
      # Ports from where rest endpoints are accessible from outside the cluster, only valid if type is NodePort
      nodePorts:
        # NodePort associated with http port
        http: 90011
        # NodePort associated with https port
        https: 90010
storageClass:
  enabled: true
  nameSuffix: single-replica
  default: false
  # -- Enable volume expansion for the default StorageClass.
  allowVolumeExpansion: true
  parameters:
    protocol: nvmf
    repl: 1
localpv-provisioner:
  # -- Enables the openebs dynamic-localpv-provisioner. If disabled, modify etcd and loki storage class accordingly.
  enabled: true
  localpv:
    # -- Set the PriorityClass for the LocalPV Hostpath provisioner Deployment.
    priorityClassName: "{{ .Release.Name }}-cluster-critical"
  hostpathClass:
    # -- Enable default hostpath localpv StorageClass.
    enabled: false
  analytics:
    enabled: true
preUpgradeHook:
  # -- Enable/Disable mayastor pre-upgrade hook
  enabled: true
  # -- Node tolerations for server scheduling to nodes with taints
  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
  ##
  tolerations: []
  # -- Optional array of imagePullSecrets containing private registry credentials
  ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
  imagePullSecrets: []
  # - name: secretName
  # Labels to be added to the Job Pod.
  podLabels:
    openebs.io/logging: "true"
  # Extra annotations to be added to all the hook resources.
  # This helps in debugging by leaving the Job/Pod instances lying around
  annotations:
    "helm.sh/hook-delete-policy": "hook-succeeded,before-hook-creation"
  image:
    # -- The container image registry URL for the hook job
    registry: docker.io
    # -- The container repository for the hook job
    repo: openebs/kubectl
    # -- The container image tag for the hook job
    tag: "1.25.15"
    # -- The imagePullPolicy for the container
    pullPolicy: IfNotPresent
