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
019 package org.apache.hadoop.yarn.security;
020
021 import java.io.DataInput;
022 import java.io.DataOutput;
023 import java.io.IOException;
024
025 import org.apache.commons.logging.Log;
026 import org.apache.commons.logging.LogFactory;
027 import org.apache.hadoop.classification.InterfaceAudience;
028 import org.apache.hadoop.classification.InterfaceAudience.Public;
029 import org.apache.hadoop.classification.InterfaceStability.Evolving;
030 import org.apache.hadoop.io.Text;
031 import org.apache.hadoop.security.UserGroupInformation;
032 import org.apache.hadoop.security.token.Token;
033 import org.apache.hadoop.security.token.TokenIdentifier;
034 import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
035 import org.apache.hadoop.yarn.api.records.ApplicationId;
036 import org.apache.hadoop.yarn.api.records.ContainerId;
037 import org.apache.hadoop.yarn.api.records.Priority;
038 import org.apache.hadoop.yarn.api.records.Resource;
039
040 /**
041 * TokenIdentifier for a container. Encodes {@link ContainerId},
042 * {@link Resource} needed by the container and the target NMs host-address.
043 *
044 */
045 @Public
046 @Evolving
047 public class ContainerTokenIdentifier extends TokenIdentifier {
048
049 private static Log LOG = LogFactory.getLog(ContainerTokenIdentifier.class);
050
051 public static final Text KIND = new Text("ContainerToken");
052
053 private ContainerId containerId;
054 private String nmHostAddr;
055 private String appSubmitter;
056 private Resource resource;
057 private long expiryTimeStamp;
058 private int masterKeyId;
059 private long rmIdentifier;
060 private Priority priority;
061 private long creationTime;
062
063 public ContainerTokenIdentifier(ContainerId containerID,
064 String hostName, String appSubmitter, Resource r, long expiryTimeStamp,
065 int masterKeyId, long rmIdentifier, Priority priority, long creationTime) {
066 this.containerId = containerID;
067 this.nmHostAddr = hostName;
068 this.appSubmitter = appSubmitter;
069 this.resource = r;
070 this.expiryTimeStamp = expiryTimeStamp;
071 this.masterKeyId = masterKeyId;
072 this.rmIdentifier = rmIdentifier;
073 this.priority = priority;
074 this.creationTime = creationTime;
075 }
076
077 /**
078 * Default constructor needed by RPC layer/SecretManager.
079 */
080 public ContainerTokenIdentifier() {
081 }
082
083 public ContainerId getContainerID() {
084 return this.containerId;
085 }
086
087 public String getApplicationSubmitter() {
088 return this.appSubmitter;
089 }
090
091 public String getNmHostAddress() {
092 return this.nmHostAddr;
093 }
094
095 public Resource getResource() {
096 return this.resource;
097 }
098
099 public long getExpiryTimeStamp() {
100 return this.expiryTimeStamp;
101 }
102
103 public int getMasterKeyId() {
104 return this.masterKeyId;
105 }
106
107 public Priority getPriority() {
108 return this.priority;
109 }
110
111 public long getCreationTime() {
112 return this.creationTime;
113 }
114 /**
115 * Get the RMIdentifier of RM in which containers are allocated
116 * @return RMIdentifier
117 */
118 public long getRMIdentifer() {
119 return this.rmIdentifier;
120 }
121
122 @Override
123 public void write(DataOutput out) throws IOException {
124 LOG.debug("Writing ContainerTokenIdentifier to RPC layer: " + this);
125 ApplicationAttemptId applicationAttemptId = this.containerId
126 .getApplicationAttemptId();
127 ApplicationId applicationId = applicationAttemptId.getApplicationId();
128 out.writeLong(applicationId.getClusterTimestamp());
129 out.writeInt(applicationId.getId());
130 out.writeInt(applicationAttemptId.getAttemptId());
131 out.writeInt(this.containerId.getId());
132 out.writeUTF(this.nmHostAddr);
133 out.writeUTF(this.appSubmitter);
134 out.writeInt(this.resource.getMemory());
135 out.writeInt(this.resource.getVirtualCores());
136 out.writeLong(this.expiryTimeStamp);
137 out.writeInt(this.masterKeyId);
138 out.writeLong(this.rmIdentifier);
139 out.writeInt(this.priority.getPriority());
140 out.writeLong(this.creationTime);
141 }
142
143 @Override
144 public void readFields(DataInput in) throws IOException {
145 ApplicationId applicationId =
146 ApplicationId.newInstance(in.readLong(), in.readInt());
147 ApplicationAttemptId applicationAttemptId =
148 ApplicationAttemptId.newInstance(applicationId, in.readInt());
149 this.containerId =
150 ContainerId.newInstance(applicationAttemptId, in.readInt());
151 this.nmHostAddr = in.readUTF();
152 this.appSubmitter = in.readUTF();
153 int memory = in.readInt();
154 int vCores = in.readInt();
155 this.resource = Resource.newInstance(memory, vCores);
156 this.expiryTimeStamp = in.readLong();
157 this.masterKeyId = in.readInt();
158 this.rmIdentifier = in.readLong();
159 this.priority = Priority.newInstance(in.readInt());
160 this.creationTime = in.readLong();
161 }
162
163 @Override
164 public Text getKind() {
165 return KIND;
166 }
167
168 @Override
169 public UserGroupInformation getUser() {
170 return UserGroupInformation.createRemoteUser(this.containerId.toString());
171 }
172
173 // TODO: Needed?
174 @InterfaceAudience.Private
175 public static class Renewer extends Token.TrivialRenewer {
176 @Override
177 protected Text getKind() {
178 return KIND;
179 }
180 }
181 }