/*
 * 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.
 */

package org.apache.slider.api;

import org.apache.slider.api.types.ApplicationLivenessInformation;
import org.apache.slider.api.types.ComponentInformation;
import org.apache.slider.api.types.ContainerInformation;
import org.apache.slider.api.types.PingInformation;
import org.apache.slider.core.conf.AggregateConf;
import org.apache.slider.core.conf.ConfTree;
import org.apache.slider.core.conf.ConfTreeOperations;

import java.io.IOException;
import java.util.Map;

/**
 * API exported by the slider remote REST/IPC endpoints.
 */
public interface SliderApplicationApi {
  /**
   * Get the aggregate desired model
   * @return the aggregate configuration of what was asked for
   * —before resolution has taken place
   * @throws IOException on any failure
   */
  AggregateConf getDesiredModel() throws IOException;

  /**
   * Get the desired application configuration
   * @return the application configuration asked for
   * —before resolution has taken place
   * @throws IOException on any failure
   */
  ConfTreeOperations getDesiredAppconf() throws IOException;

  /**
   * Get the desired YARN resources
   * @return the resources asked for
   * —before resolution has taken place
   * @throws IOException on any failure
   */
  ConfTreeOperations getDesiredResources() throws IOException;

  /**
   * Put an updated resources structure. This triggers a cluster flex
   * operation
   * @param updated updated resources
   * @throws IOException on any problem.
   */
  void putDesiredResources(ConfTree updated) throws IOException;

  /**
   * Get the aggregate resolved model
   * @return the aggregate configuration of what was asked for
   * —after resolution has taken place
   * @throws IOException on any failure
   */
  AggregateConf getResolvedModel() throws IOException;

  /**
   * Get the resolved application configuration
   * @return the application configuration asked for
   * —after resolution has taken place
   * @throws IOException on any failure
   */
  ConfTreeOperations getResolvedAppconf() throws IOException;

  /**
   * Get the resolved YARN resources
   * @return the resources asked for
   * —after resolution has taken place
   * @throws IOException on any failure
   */
  ConfTreeOperations getResolvedResources() throws IOException;

  /**
   * Get the live YARN resources
   * @return the live set of resources in the cluster
   * @throws IOException on any failure
   */
  ConfTreeOperations getLiveResources() throws IOException;

  /**
   * Get a map of live containers [containerId:info]
   * @return a possibly empty list of serialized containers
   * @throws IOException on any failure
   */
  Map<String, ContainerInformation> enumContainers() throws
      IOException;

  /**
   * Get a container from the container Id
   * @param containerId YARN container ID
   * @return the container information
   * @throws IOException on any failure
   */
  ContainerInformation getContainer(String containerId) throws
      IOException;

  /**
   * List all components into a map of [name:info]
   * @return a possibly empty map of components
   * @throws IOException on any failure
   */
  Map<String, ComponentInformation> enumComponents() throws
      IOException;

  /**
   * Get information about a component
   * @param componentName name of the component
   * @return the component details
   * @throws IOException on any failure
   */
  ComponentInformation getComponent(String componentName) throws
      IOException;

  /**
   * Ping as a GET
   * @param text text to include
   * @return the response
   * @throws IOException on any failure
   */
  PingInformation ping(String text) throws IOException;

  /**
   * Stop the AM (async operation)
   * @param text text to include
   * @throws IOException on any failure
   */
  void stop(String text) throws IOException;

  /**
   * Get the application liveness
   * @return current liveness information
   * @throws IOException
   */
  ApplicationLivenessInformation getApplicationLiveness() throws IOException;
}
