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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.service.Service;
import org.apache.hadoop.yarn.api.records.Container;
import org.apache.hadoop.yarn.api.records.ContainerId;
import org.apache.slider.api.ClusterDescription;
import org.apache.slider.common.tools.SliderFileSystem;
import org.apache.slider.core.conf.AggregateConf;
import org.apache.slider.core.conf.MapOperations;
import org.apache.slider.core.exceptions.BadCommandArgumentsException;
import org.apache.slider.core.exceptions.SliderException;
import org.apache.slider.core.launch.ContainerLauncher;
import org.apache.slider.core.main.ExitCodeProvider;
import org.apache.slider.core.registry.info.ServiceInstanceData;
import org.apache.slider.server.appmaster.actions.QueueAccess;
import org.apache.slider.server.appmaster.state.ContainerReleaseSelector;
import org.apache.slider.server.appmaster.operations.RMOperationHandlerActions;
import org.apache.slider.server.appmaster.state.StateAccessForProviders;
import org.apache.slider.server.appmaster.web.rest.agent.AgentRestOperations;
import org.apache.slider.server.services.registry.RegistryViewForProviders;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.Map;

public interface ProviderService extends ProviderCore,
    Service,
    RMOperationHandlerActions,
    ExitCodeProvider {

  /**
   * Set up the entire container launch context
   * @param containerLauncher
   * @param instanceDefinition
   * @param container
   * @param role
   * @param sliderFileSystem
   * @param generatedConfPath
   * @param appComponent
   * @param containerTmpDirPath
   */
  void buildContainerLaunchContext(ContainerLauncher containerLauncher,
      AggregateConf instanceDefinition,
      Container container,
      String role,
      SliderFileSystem sliderFileSystem,
      Path generatedConfPath,
      MapOperations resourceComponent,
      MapOperations appComponent,
      Path containerTmpDirPath) throws
      IOException,
      SliderException;

  /**
   * Notify the providers of container completion
   * @param containerId container that has completed
   */
  void notifyContainerCompleted(ContainerId containerId);

  /**
   * Execute a process in the AM
   * @param instanceDefinition cluster description
   * @param confDir configuration directory
   * @param env environment
   * @param execInProgress the callback for the exec events
   * @return true if a process was actually started
   * @throws IOException
   * @throws SliderException
   */
  boolean exec(AggregateConf instanceDefinition,
               File confDir,
               Map<String, String> env,
               ProviderCompleted execInProgress) throws IOException,
      SliderException;

  /**
   * Scan through the roles and see if it is supported.
   * @param role role to look for
   * @return true if the role is known about -and therefore
   * that a launcher thread can be deployed to launch it
   */
  boolean isSupportedRole(String role);

  /**
   * Load a specific XML configuration file for the provider config
   * @param confDir configuration directory
   * @param siteXMLFilename provider-specific filename
   * @return a configuration to be included in status
   * @throws BadCommandArgumentsException
   * @throws IOException
   */
  Configuration loadProviderConfigurationInformation(File confDir)
    throws BadCommandArgumentsException, IOException;

  /**
   * The application configuration should be initialized here
   * 
   * @param instanceDefinition
   * @param fileSystem
   * @throws IOException
   * @throws SliderException
   */
  void initializeApplicationConfiguration(AggregateConf instanceDefinition,
      SliderFileSystem fileSystem) throws IOException, SliderException;

  /**
   * This is a validation of the application configuration on the AM.
   * Here is where things like the existence of keytabs and other
   * not-seen-client-side properties can be tested, before
   * the actual process is spawned. 
   * @param instanceDefinition clusterSpecification
   * @param confDir configuration directory
   * @param secure flag to indicate that secure mode checks must exist
   * @throws IOException IO problemsn
   * @throws SliderException any failure
   */
  void validateApplicationConfiguration(AggregateConf instanceDefinition,
                                        File confDir,
                                        boolean secure
                                       ) throws IOException, SliderException;

  /*
     * Build the provider status, can be empty
     * @return the provider status - map of entries to add to the info section
     */
  Map<String, String> buildProviderStatus();
  
  /**
   * Build a map of data intended for the AM webapp that is specific
   * about this provider. The key is some text to be displayed, and the
   * value can be a URL that will create an anchor over the key text.
   * 
   * If no anchor is needed/desired, insert the key with a null value.
   * @return
   */
  Map<String, String> buildMonitorDetails(ClusterDescription clusterSpec);

  public void bind(StateAccessForProviders stateAccessor,
      RegistryViewForProviders reg,
      QueueAccess queueAccess,
      List<Container> liveContainers);

  /**
   * Returns the agent rest operations interface.
   * @return  the interface if available, null otherwise.
   */
  AgentRestOperations getAgentRestOperations();

  /**
   * Build up the endpoint details for this service
   * @param details
   */
  void buildEndpointDetails(Map<String, String> details);

  /**
   * Prior to going live -register the initial service registry data
   * @param unsecureWebAPI
   * @param secureWebAPI
   * @param registryInstanceData
   */
  void applyInitialRegistryDefinitions(URL unsecureWebAPI,
                                       URL secureWebAPI,
                                       ServiceInstanceData registryInstanceData)
      throws IOException;

  /**
   * Create the container release selector for this provider...any policy
   * can be implemented
   * @return the selector to use for choosing containers.
   */
  ContainerReleaseSelector createContainerReleaseSelector();

  /**
   * On AM restart (for whatever reason) this API is required to rebuild the AM
   * internal state with the containers which were already assigned and running
   * 
   * @param liveContainers
   * @param applicationId
   * @param providerRoles
   */
  void rebuildContainerDetails(List<Container> liveContainers,
      String applicationId, Map<Integer, ProviderRole> providerRoles);
}
