001/**
002* Licensed to the Apache Software Foundation (ASF) under one
003* or more contributor license agreements.  See the NOTICE file
004* distributed with this work for additional information
005* regarding copyright ownership.  The ASF licenses this file
006* to you under the Apache License, Version 2.0 (the
007* "License"); you may not use this file except in compliance
008* with the License.  You may obtain a copy of the License at
009*
010*     http://www.apache.org/licenses/LICENSE-2.0
011*
012* Unless required by applicable law or agreed to in writing, software
013* distributed under the License is distributed on an "AS IS" BASIS,
014* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015* See the License for the specific language governing permissions and
016* limitations under the License.
017*/
018
019package org.apache.hadoop.yarn.api.records;
020
021import java.nio.ByteBuffer;
022import java.util.List;
023import java.util.Map;
024
025import org.apache.hadoop.classification.InterfaceAudience.Public;
026import org.apache.hadoop.classification.InterfaceStability.Stable;
027import org.apache.hadoop.yarn.api.ContainerManagementProtocol;
028import org.apache.hadoop.yarn.server.api.ApplicationInitializationContext;
029import org.apache.hadoop.yarn.server.api.AuxiliaryService;
030import org.apache.hadoop.yarn.util.Records;
031
032/**
033 * <p><code>ContainerLaunchContext</code> represents all of the information
034 * needed by the <code>NodeManager</code> to launch a container.</p>
035 * 
036 * <p>It includes details such as:
037 *   <ul>
038 *     <li>{@link ContainerId} of the container.</li>
039 *     <li>{@link Resource} allocated to the container.</li>
040 *     <li>User to whom the container is allocated.</li>
041 *     <li>Security tokens (if security is enabled).</li>
042 *     <li>
043 *       {@link LocalResource} necessary for running the container such
044 *       as binaries, jar, shared-objects, side-files etc. 
045 *     </li>
046 *     <li>Optional, application-specific binary service data.</li>
047 *     <li>Environment variables for the launched process.</li>
048 *     <li>Command to launch the container.</li>
049 *   </ul>
050 * </p>
051 * 
052 * @see ContainerManagementProtocol#startContainers(org.apache.hadoop.yarn.api.protocolrecords.StartContainersRequest)
053 */
054@Public
055@Stable
056public abstract class ContainerLaunchContext {
057
058  @Public
059  @Stable
060  public static ContainerLaunchContext newInstance(
061      Map<String, LocalResource> localResources,
062      Map<String, String> environment, List<String> commands,
063      Map<String, ByteBuffer> serviceData,  ByteBuffer tokens,
064      Map<ApplicationAccessType, String> acls) {
065    ContainerLaunchContext container =
066        Records.newRecord(ContainerLaunchContext.class);
067    container.setLocalResources(localResources);
068    container.setEnvironment(environment);
069    container.setCommands(commands);
070    container.setServiceData(serviceData);
071    container.setTokens(tokens);
072    container.setApplicationACLs(acls);
073    return container;
074  }
075
076  /**
077   * Get all the tokens needed by this container. It may include file-system
078   * tokens, ApplicationMaster related tokens if this container is an
079   * ApplicationMaster or framework level tokens needed by this container to
080   * communicate to various services in a secure manner.
081   * 
082   * @return tokens needed by this container.
083   */
084  @Public
085  @Stable
086  public abstract ByteBuffer getTokens();
087
088  /**
089   * Set security tokens needed by this container.
090   * @param tokens security tokens 
091   */
092  @Public
093  @Stable
094  public abstract void setTokens(ByteBuffer tokens);
095
096  /**
097   * Get <code>LocalResource</code> required by the container.
098   * @return all <code>LocalResource</code> required by the container
099   */
100  @Public
101  @Stable
102  public abstract Map<String, LocalResource> getLocalResources();
103  
104  /**
105   * Set <code>LocalResource</code> required by the container. All pre-existing
106   * Map entries are cleared before adding the new Map
107   * @param localResources <code>LocalResource</code> required by the container
108   */
109  @Public
110  @Stable
111  public abstract void setLocalResources(Map<String, LocalResource> localResources);
112
113  /**
114   * <p>
115   * Get application-specific binary <em>service data</em>. This is a map keyed
116   * by the name of each {@link AuxiliaryService} that is configured on a
117   * NodeManager and value correspond to the application specific data targeted
118   * for the keyed {@link AuxiliaryService}.
119   * </p>
120   * 
121   * <p>
122   * This will be used to initialize this application on the specific
123   * {@link AuxiliaryService} running on the NodeManager by calling
124   * {@link AuxiliaryService#initializeApplication(ApplicationInitializationContext)}
125   * </p>
126   * 
127   * @return application-specific binary <em>service data</em>
128   */
129  @Public
130  @Stable
131  public abstract Map<String, ByteBuffer> getServiceData();
132  
133  /**
134   * <p>
135   * Set application-specific binary <em>service data</em>. This is a map keyed
136   * by the name of each {@link AuxiliaryService} that is configured on a
137   * NodeManager and value correspond to the application specific data targeted
138   * for the keyed {@link AuxiliaryService}. All pre-existing Map entries are
139   * preserved.
140   * </p>
141   * 
142   * @param serviceData
143   *          application-specific binary <em>service data</em>
144   */
145  @Public
146  @Stable
147  public abstract void setServiceData(Map<String, ByteBuffer> serviceData);
148
149  /**
150   * Get <em>environment variables</em> for the container.
151   * @return <em>environment variables</em> for the container
152   */
153  @Public
154  @Stable
155  public abstract Map<String, String> getEnvironment();
156    
157  /**
158   * Add <em>environment variables</em> for the container. All pre-existing Map
159   * entries are cleared before adding the new Map
160   * @param environment <em>environment variables</em> for the container
161   */
162  @Public
163  @Stable
164  public abstract void setEnvironment(Map<String, String> environment);
165
166  /**
167   * Get the list of <em>commands</em> for launching the container.
168   * @return the list of <em>commands</em> for launching the container
169   */
170  @Public
171  @Stable
172  public abstract List<String> getCommands();
173  
174  /**
175   * Add the list of <em>commands</em> for launching the container. All
176   * pre-existing List entries are cleared before adding the new List
177   * @param commands the list of <em>commands</em> for launching the container
178   */
179  @Public
180  @Stable
181  public abstract void setCommands(List<String> commands);
182
183  /**
184   * Get the <code>ApplicationACL</code>s for the application. 
185   * @return all the <code>ApplicationACL</code>s
186   */
187  @Public
188  @Stable
189  public abstract  Map<ApplicationAccessType, String> getApplicationACLs();
190
191  /**
192   * Set the <code>ApplicationACL</code>s for the application. All pre-existing
193   * Map entries are cleared before adding the new Map
194   * @param acls <code>ApplicationACL</code>s for the application
195   */
196  @Public
197  @Stable
198  public abstract  void setApplicationACLs(Map<ApplicationAccessType, String> acls);
199}