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

sections:
  - name: Getting Started
    sublinks:
      - name: Local (Single Node)
        url: /docs/getting-started
      - name: Migrate Storm Topologies
        url: /docs/migrate-storm-to-heron
      - name: Troubleshooting Guide
        url: /docs/getting-started-troubleshooting
  - name: Deployment
    sublinks:
      - name: Overview
        url: /docs/operators/deployment
      - name: Configuration
        url: /docs/operators/deployment/configuration
      - name: The Heron API server
        url: /docs/operators/heron-api-server
  - name: Topology Development APIs
    sublinks:
    - name: The Heron Streamlet API for Java
      url: /docs/developers/java/streamlet-api
    - name: The Heron Streamlet API for Scala
      url: /docs/developers/scala/streamlet-api
    - name: The Heron ECO API for Java
      url: /docs/developers/java/eco-api
    - name: The Heron Topology API for Java
      url: /docs/developers/java/topologies
    - name: The Heron Topology API for Python
      url: /docs/developers/python/topologies
  - name: Client API docs
    sublinks:
      - name: Java
        url: /api/java
      - name: Python
        url: /api/python
  - name: Guides
    sublinks:
      - name: Effectively-once Java topologies
        url: /docs/developers/java/effectively-once
      - name: Python Topologies
        url: /docs/developers/python/topologies
      - name: Heron Data Model
        url: /docs/developers/data-model
      - name: Tuple Serialization
        url: /docs/developers/serialization
      - name: Heron UI Guide
        url: /docs/developers/ui-guide
      - name: Tuning Guide
        url: /docs/developers/tuning
      - name: Packing Algorithms
        url: /docs/developers/packing/ffdpacking
      - name: Simulator Mode
        url: /docs/developers/simulator-mode
      - name: Troubleshooting Guide
        url: /docs/developers/troubleshooting
  - name: Heron Concepts
    sublinks:
      - name: Heron Design Goals
        url: /docs/concepts/design-goals
      - name: Heron Topologies
        url: /docs/concepts/topologies
      - name: Heron Streamlet API
        url: /docs/concepts/streamlet-api
      - name: Heron Architecture
        url: /docs/concepts/architecture
      - name: Heron Delivery Semantics
        url: /docs/concepts/delivery-semantics
  - name: State Managers
    sublinks:
      - name: Zookeeper
        url: /docs/operators/deployment/statemanagers/zookeeper
      - name: Local FS
        url: /docs/operators/deployment/statemanagers/localfs
  - name: Uploaders
    sublinks:
      - name: Local FS
        url: /docs/operators/deployment/uploaders/localfs
      - name: HDFS
        url: /docs/operators/deployment/uploaders/hdfs
      - name: HTTP
        url: /docs/operators/deployment/uploaders/http
      - name: Amazon S3
        url: /docs/operators/deployment/uploaders/s3
      - name: Secure Copy (SCP)
        url: /docs/operators/deployment/uploaders/scp
  - name: Schedulers
    sublinks:
      - name: Kubernetes by Hand
        url: /docs/operators/deployment/schedulers/kubernetes
      - name: Kubernetes with Helm
        url: /docs/operators/deployment/schedulers/kubernetes-helm
      - name: Aurora Cluster
        url: /docs/operators/deployment/schedulers/aurora
      - name: Multi-node standalone cluster
        url: /docs/operators/deployment/schedulers/standalone
      - name: Nomad
        url: /docs/operators/deployment/schedulers/nomad
      - name: Local Cluster
        url: /docs/operators/deployment/schedulers/local
#      - name: Mesos Cluster
#        url: /docs/operators/deployment/schedulers/mesos
      - name: Mesos Cluster Locally
        url: /docs/operators/deployment/schedulers/mesos-local-mac
      - name: Slurm Cluster
        url: /docs/operators/deployment/schedulers/slurm
      - name: YARN Cluster
        url: /docs/operators/deployment/schedulers/yarn
  - name: Cluster Configuration
    sublinks:
      - name: Overview
        url: /docs/operators/configuration/config-intro
      - name: System-Level
        url: /docs/operators/configuration/system
      - name: Heron Instance
        url: /docs/operators/configuration/instance
      - name: Metrics Manager
        url: /docs/operators/configuration/metrics-manager
      - name: Stream Manager
        url: /docs/operators/configuration/stmgr
      - name: Topology Master
        url: /docs/operators/configuration/tmaster
  - name: Observability
    sublinks:
    - name: Prometheus
      url: /docs/operators/observability/prometheus
    - name: Graphite
      url: /docs/operators/observability/graphite
    - name: Scribe
      url: /docs/operators/observability/scribe
  - name: User Manuals
    sublinks:
      - name: Heron Client
        url: /docs/operators/heron-cli
      - name: Heron Explorer
        url: /docs/operators/heron-explorer
      - name: Heron Tracker REST API
        url: /docs/operators/heron-tracker-api
      - name: Heron Tracker Runbook
        url: /docs/operators/heron-tracker
      - name: Heron UI Runbook
        url: /docs/operators/heron-ui
  - name: Heron Developers
    sublinks:
      - name: Compiling
        url: /docs/developers/compiling/compiling
      - name: Compiling on Linux
        url: /docs/developers/compiling/linux
      - name: Compiling on Mac OS X
        url: /docs/developers/compiling/mac
      - name: Compiling With Docker
        url: /docs/developers/compiling/docker
      - name: Running Tests
        url: /docs/contributors/testing
      - name: Code Organization
        url: /docs/contributors/codebase
  - name: Extending Heron
    sublinks:
      - name: Custom Scheduler
        url: /docs/contributors/custom-scheduler
      - name: Custom Metrics Sink
        url: /docs/contributors/custom-metrics-sink
  - name: Heron Resources
    sublinks:
      - name: Heron Resources
        url: /docs/resources
  - name: Contributors
    sublinks:
      - name: Community
        url: /docs/contributors/community
      - name: Governance
        url: /docs/contributors/governance
