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.api.records;
020
021 import org.apache.hadoop.classification.InterfaceAudience.Public;
022 import org.apache.hadoop.classification.InterfaceStability.Stable;
023 import org.apache.hadoop.yarn.api.AMRMProtocol;
024
025 /**
026 * <p><code>ResourceRequest</code> represents the request made by an
027 * application to the <code>ResourceManager</code> to obtain various
028 * <code>Container</code> allocations.</p>
029 *
030 * <p>It includes:
031 * <ul>
032 * <li>{@link Priority} of the request.</li>
033 * <li>
034 * The <em>name</em> of the machine or rack on which the allocation is
035 * desired. A special value of <em>*</em> signifies that
036 * <em>any</em> host/rack is acceptable to the application.
037 * </li>
038 * <li>{@link Resource} required for each request.</li>
039 * <li>
040 * Number of containers of such specifications which are required
041 * by the application.
042 * </li>
043 * </ul>
044 * </p>
045 *
046 * @see Resource
047 * @see AMRMProtocol#allocate(org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest)
048 */
049 @Public
050 @Stable
051 public abstract class ResourceRequest implements Comparable<ResourceRequest> {
052 /**
053 * Get the <code>Priority</code> of the request.
054 * @return <code>Priority</code> of the request
055 */
056 @Public
057 @Stable
058 public abstract Priority getPriority();
059
060 /**
061 * Set the <code>Priority</code> of the request
062 * @param priority <code>Priority</code> of the request
063 */
064 @Public
065 @Stable
066 public abstract void setPriority(Priority priority);
067
068 /**
069 * Get the <em>host/rack</em> on which the allocation is desired.
070 *
071 * A special value of <em>*</em> signifies that <em>any</em> host/rack is
072 * acceptable.
073 *
074 * @return <em>host/rack</em> on which the allocation is desired
075 */
076 @Public
077 @Stable
078 public abstract String getHostName();
079
080 /**
081 * Set <em>host/rack</em> on which the allocation is desired.
082 *
083 * A special value of <em>*</em> signifies that <em>any</em> host/rack is
084 * acceptable.
085 *
086 * @param hostName <em>host/rack</em> on which the allocation is desired
087 */
088 @Public
089 @Stable
090 public abstract void setHostName(String hostName);
091
092 /**
093 * Get the <code>Resource</code> capability of the request.
094 * @return <code>Resource</code> capability of the request
095 */
096 @Public
097 @Stable
098 public abstract Resource getCapability();
099
100 /**
101 * Set the <code>Resource</code> capability of the request
102 * @param capability <code>Resource</code> capability of the request
103 */
104 @Public
105 @Stable
106 public abstract void setCapability(Resource capability);
107
108 /**
109 * Get the number of containers required with the given specifications.
110 * @return number of containers required with the given specifications
111 */
112 @Public
113 @Stable
114 public abstract int getNumContainers();
115
116 /**
117 * Set the number of containers required with the given specifications
118 * @param numContainers number of containers required with the given
119 * specifications
120 */
121 @Public
122 @Stable
123 public abstract void setNumContainers(int numContainers);
124
125 @Override
126 public int hashCode() {
127 final int prime = 31;
128 int result = 1;
129 Resource capability = getCapability();
130 String hostName = getHostName();
131 Priority priority = getPriority();
132 result =
133 prime * result + ((capability == null) ? 0 : capability.hashCode());
134 result = prime * result + ((hostName == null) ? 0 : hostName.hashCode());
135 result = prime * result + getNumContainers();
136 result = prime * result + ((priority == null) ? 0 : priority.hashCode());
137 return result;
138 }
139
140 @Override
141 public boolean equals(Object obj) {
142 if (this == obj)
143 return true;
144 if (obj == null)
145 return false;
146 if (getClass() != obj.getClass())
147 return false;
148 ResourceRequest other = (ResourceRequest) obj;
149 Resource capability = getCapability();
150 if (capability == null) {
151 if (other.getCapability() != null)
152 return false;
153 } else if (!capability.equals(other.getCapability()))
154 return false;
155 String hostName = getHostName();
156 if (hostName == null) {
157 if (other.getHostName() != null)
158 return false;
159 } else if (!hostName.equals(other.getHostName()))
160 return false;
161 if (getNumContainers() != other.getNumContainers())
162 return false;
163 Priority priority = getPriority();
164 if (priority == null) {
165 if (other.getPriority() != null)
166 return false;
167 } else if (!priority.equals(other.getPriority()))
168 return false;
169 return true;
170 }
171
172 @Override
173 public int compareTo(ResourceRequest other) {
174 int priorityComparison = this.getPriority().compareTo(other.getPriority());
175 if (priorityComparison == 0) {
176 int hostNameComparison =
177 this.getHostName().compareTo(other.getHostName());
178 if (hostNameComparison == 0) {
179 int capabilityComparison =
180 this.getCapability().compareTo(other.getCapability());
181 if (capabilityComparison == 0) {
182 int numContainersComparison =
183 this.getNumContainers() - other.getNumContainers();
184 if (numContainersComparison == 0) {
185 return 0;
186 } else {
187 return numContainersComparison;
188 }
189 } else {
190 return capabilityComparison;
191 }
192 } else {
193 return hostNameComparison;
194 }
195 } else {
196 return priorityComparison;
197 }
198 }
199 }