View Javadoc

1   /*
2   Copyright (C) 2000 - 2007 Grid Systems, S.A.
3   
4   This program is free software; you can redistribute it and/or modify
5   it under the terms of the GNU General Public License, version 2, as
6   published by the Free Software Foundation.
7   
8   This program is distributed in the hope that it will be useful,
9   but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  GNU General Public License for more details.
12  
13  You should have received a copy of the GNU General Public License
14  along with this program; if not, write to the Free Software
15  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  */
17  
18  package com.gridsystems.resource.api;
19  
20  import com.gridsystems.innergrid.api.CloneUtils;
21  
22  /**
23   * A group is a set of resources (computational resources
24   * than can execute some work). Each group has a set of labour hours that dictate the
25   * periods of time when the group will be active. The schedule of labour hours
26   * is repeated every week.
27   * <p>
28   * Groups can be heterogeneous.
29   *
30   * @author Antonia Tugores
31   * @author Xmas
32   * @version 1.0
33   */
34  public class Group implements Cloneable {
35  
36    /**
37     * Domain for the ACL (Access Control List) corresponding to a group.
38     * <p>
39     * The ACL is created when the group is added, using {@link
40     * com.gridsystems.resource.api.ApiResourceGroup#addGroup
41     * ApiResourceGroup.addGroup}.
42     * After that, the ACL can be managed through ApiAcl (from the plug-in IXOS),
43     * using this domain and the name of the group.
44     */
45    public static final String ACL_DOMAIN = "ResourceGroups";
46  
47    /**
48     * Name of the only permission related to groups that can be granted to or revoked from
49     * users or roles. The granting of this permission allows the user or role to launch
50     * jobs or tasks to be executed by the resources of the group.
51     */
52    public static final String GRP_EXECUTION = "execution";
53  
54    /**
55     * Index to access the labour hours of Sunday.
56     */
57    public static final int SUNDAY = 0;
58  
59    /**
60     * Index to access the labour hours of Monday.
61     */
62    public static final int MONDAY = 1;
63  
64    /**
65     * Index to access the labour hours of Tuesday.
66     */
67    public static final int TUESDAY = 2;
68  
69    /**
70     * Index to access the labour hours of Wednesday.
71     */
72    public static final int WEDNESDAY = 3;
73  
74    /**
75     * Index to access the labour hours of Thursday.
76     */
77    public static final int THURSDAY = 4;
78  
79    /**
80     * Index to access the labour hours of Friday.
81     */
82    public static final int FRIDAY = 5;
83  
84    /**
85     * Index to access the labour hours of Saturday.
86     */
87    public static final int SATURDAY = 6;
88  
89    /**
90     * This group accepts any tasks.
91     */
92    public static final int SCHEDULE_POLICY_ANY_TASK = 0;
93  
94    /**
95     * This group only can belong to scheduled tasks.
96     */
97    public static final int SCHEDULE_POLICY_ONLY_SCHEDULED_TASKS = 1;
98  
99    /**
100    * This group only can belong to interactive tasks.
101    */
102   public static final int SCHEDULE_POLICY_ONLY_INTERACTIVE_TASKS = 2;
103 
104 
105   /** Name of the group. */
106   private String name = null;
107 
108   /** Description of the group. */
109   private String description = null;
110 
111   /** Allows the execution of jobs or tasks from other groups. */
112   private boolean acceptOnlyGroupAssignments = false;
113 
114   /** Array with the identifiers of the Resources assigned to this group. */
115   private ResourceId[] resources = null;
116 
117   /** This group works as a queue. */
118   private boolean queue = false;
119 
120   /**
121    * Policy used when this Group has market 'queue' field to true.
122    */
123   private int schedulingPolicy;
124 
125   /**
126    * If true, this group requires definition of wallTime in superior instances.
127    */
128   private boolean wallTimeRequested;
129 
130   /**
131    * Labour hours of this group, including a time interval for each day of the week.
132    */
133   private TimeInterval[] labourHours = {
134     new TimeInterval(),
135     new TimeInterval(),
136     new TimeInterval(),
137     new TimeInterval(),
138     new TimeInterval(),
139     new TimeInterval(),
140     new TimeInterval()
141   };
142 
143   /**
144    * Default constructor.
145    */
146   public Group() { }
147 
148   /**
149    * Sets the name of the group.
150    * <p>
151    * Once the group has been added (using
152    * {@link com.gridsystems.resource.api.ApiResourceGroup#addGroup
153    * ApiResourceGroup.addGroup}), its name
154    * cannot be changed.
155    *
156    * @param name a string with the name of the group.
157    */
158   public void setName(String name) {
159     this.name = name;
160   }
161 
162   /**
163    * Gets the name of the group.
164    *
165    * @return a string with the name of the group.
166    */
167   public String getName() {
168     return this.name;
169   }
170 
171   /**
172    * Sets the description of this group.
173    * <p>
174    * Once the group has been added (using
175    * {@link com.gridsystems.resource.api.ApiResourceGroup#addGroup
176    * ApiResourceGroup.addGroup}), its description must be changed using
177    * {@link com.gridsystems.resource.api.ApiResourceGroup#updateGroup(Group)
178    * ApiResourceGroup.updateGroup}.
179    *
180    * @param description a string with the description of this group
181    */
182   public void setDescription(String description) {
183     this.description = description;
184   }
185 
186   /**
187    * Gets the description of this group.
188    *
189    * @return a string with the description of this group
190    */
191   public String getDescription() {
192     return this.description;
193   }
194 
195   /**
196    * Allows or forbids the execution of work from other groups. If allowed, resources
197    * from this group could work on jobs or tasks not targeted to this group.
198    * <p>
199    * Once the group has been added (using {@link
200    * com.gridsystems.resource.api.ApiResourceGroup#addGroup
201    * ApiResourceGroup.addGroup}), this behavior must be changed using {@link
202    * com.gridsystems.resource.api.ApiResourceGroup#updateGroup
203    * ApiResourceGroup.updateGroup}.
204    *
205    * @param accept a boolean, set to <code>true</code> if the resources in this
206    *        group are not allowed to execute job or tasks not directly assigned to
207    *        this group;
208    *        <code>false</code> otherwise.
209    */
210   public void setAcceptOnlyGroupAssignments(boolean accept) {
211     this.acceptOnlyGroupAssignments = accept;
212   }
213 
214   /**
215    * Checks if this group allows its resources to work on jobs or tasks from other groups.
216    *
217    * @return a boolean,set to <code>true</code> if the resources in this
218    *         group are not allowed to execute job or tasks from other groups;
219    *         <code>false</code> otherwise
220    */
221   public boolean isAcceptOnlyGroupAssignments() {
222     return this.acceptOnlyGroupAssignments;
223   }
224 
225   /**
226    * Sets the resources identifiers.
227    *
228    * @param resources the resources to be part of this group
229    */
230   public void setResources(ResourceId[] resources) {
231     this.resources = resources;
232   }
233 
234   /**
235    * Gets current group resources.
236    *
237    * @return current group resources
238    */
239   public ResourceId[] getResources() {
240     return this.resources;
241   }
242   /**
243    * Gets the labour hours of this group which dictate the periods of time when this
244    * group will be active. The schedule of labour hours of a group is repeated every week.
245    *
246    * @return an array of time intervals with the labour hours of this group
247    */
248   public TimeInterval[] getLabourHours() {
249     return this.labourHours;
250   }
251 
252   /**
253    * Sets the labour hours of this group dictated by the periods of time when this
254    * group will be active. The schedule of labour hours of a group is repeated every week.
255    * <p>
256    * Once the group has been added (using {@link
257    * com.gridsystems.resource.api.ApiResourceGroup#addGroup
258    * ApiResourceGroup.addGroup}), its labour hours must be changed using {@link
259    * com.gridsystems.resource.api.ApiResourceGroup#updateGroup
260    * ApiResourceGroup.updateGroup}.
261    *
262    * @param newLabourHours an array of time intervals with the labour hours of this group
263    */
264   public void setLabourHours(TimeInterval[] newLabourHours) {
265     this.labourHours = newLabourHours;
266   }
267 
268   /**
269    * {@inheritDoc}
270    */
271   public Object clone()  throws CloneNotSupportedException {
272     Group clone = (Group) super.clone();
273     clone.labourHours = (TimeInterval[])CloneUtils.cloneArray(this.labourHours);
274     clone.resources = (ResourceId[])CloneUtils.cloneArray(this.resources);
275     return clone;
276   }
277 
278   /**
279    * @return true, if this Group works as a queue. Otherwise, false.
280    */
281   public boolean isQueue() {
282     return queue;
283   }
284 
285   /**
286    * @param queue Sets whether this group works as a queue.
287    */
288   public void setQueue(boolean queue) {
289     this.queue = queue;
290   }
291 
292   /**
293    * @return Returns the schedulingPolicy.
294    *
295    * @see #SCHEDULE_POLICY_ANY_TASK
296    * @see #SCHEDULE_POLICY_ONLY_INTERACTIVE_TASKS
297    * @see #SCHEDULE_POLICY_ONLY_SCHEDULED_TASKS
298    *
299    */
300   public int getSchedulingPolicy() {
301     return schedulingPolicy;
302   }
303 
304   /**
305    * @param schedulingPolicy The schedulingPolicy to set.
306    *
307    * @see #SCHEDULE_POLICY_ANY_TASK
308    * @see #SCHEDULE_POLICY_ONLY_INTERACTIVE_TASKS
309    * @see #SCHEDULE_POLICY_ONLY_SCHEDULED_TASKS
310    */
311   public void setSchedulingPolicy(int schedulingPolicy) {
312     this.schedulingPolicy = schedulingPolicy;
313   }
314 
315   /**
316    * Sets the wallTimeRequested value.
317    * @return Returns the wallTimeRequested.
318    */
319   public boolean isWallTimeRequested() {
320     return wallTimeRequested;
321   }
322 
323   /**
324    * Sets the wallTimeRequested value.
325    * @param wallTimeRequested  If true, this group requires definition
326    * of wallTime in superior instances.
327    *
328    */
329   public void setWallTimeRequested(boolean wallTimeRequested) {
330     this.wallTimeRequested = wallTimeRequested;
331   }
332 }