source: branches/2.0/drmaa2_utils/drmaa_utils/drmaa_util.c @ 77

Revision 77, 12.3 KB checked in by mmamonski, 12 years ago (diff)

DRMAA 2.0 utils - first skeleton

Line 
1/* $Id: drmaa_util.c 13 2011-04-20 15:41:43Z mmamonski $ */
2/*
3 *  PSNC DRMAA 2.0 utilities library
4 *  Copyright (C) 2012  Poznan Supercomputing and Networking Center
5 *
6 *  This program is free software: you can redistribute it and/or modify
7 *  it under the terms of the GNU General Public License as published by
8 *  the Free Software Foundation, either version 3 of the License, or
9 *  (at your option) any later version.
10 *
11 *  This program is distributed in the hope that it will be useful,
12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 *  GNU General Public License for more details.
15 *
16 *  You should have received a copy of the GNU General Public License
17 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#ifdef HAVE_CONFIG_H
21#       include <config.h>
22#endif
23
24#include <string.h>
25#include <stdlib.h>
26
27#include <drmaa_utils/common.h>
28#include <drmaa_utils/drmaa_attrib.h>
29#include <drmaa_utils/drmaa_util.h>
30#include <drmaa_utils/logging.h>
31#include <drmaa_utils/template.h>
32#include <drmaa_utils/util.h>
33
34#ifndef lint
35static char rcsid[]
36#       ifdef __GNUC__
37                __attribute__ ((unused))
38#       endif
39        = "$Id: drmaa_util.c 13 2011-04-20 15:41:43Z mmamonski $";
40#endif
41
42
43static char *
44fsd_expand_drmaa_ph_expand( fsd_expand_drmaa_ph_t *self, char *s, unsigned set )
45{
46        unsigned mask;
47
48        for(
49                        mask = 1;
50                        mask <= FSD_DRMAA_PH_INCR;
51                        mask <<= 1
52                        )
53         {
54                const char *ph;
55                const char *value;
56
57                switch( mask )
58                 {
59                        case FSD_DRMAA_PH_HD:
60                                ph = DRMAA_PLACEHOLDER_HD;
61                                value = self->home_directory;
62                                break;
63                        case FSD_DRMAA_PH_WD:
64                                ph = DRMAA_PLACEHOLDER_WD;
65                                value = self->working_directory;
66                                break;
67                        case FSD_DRMAA_PH_INCR:
68                                ph = DRMAA_PLACEHOLDER_INCR;
69                                value = self->bulk_incr;
70                                break;
71                        default:
72                                fsd_assert( false );
73                 }
74                if( value == NULL )
75                        value = "";
76
77                if( mask & set )
78                        s = fsd_replace( s, ph, value );
79                else if( strstr( s, ph ) != NULL )
80                 {
81                        fsd_log_warning((
82                                                "'%s' can not be expanded in '%s'; removing from string",
83                                                ph, s ));
84                        s = fsd_replace( s, ph, "" );
85                 }
86         }
87
88        return s;
89}
90
91static void
92fsd_expand_drmaa_ph_set( fsd_expand_drmaa_ph_t *self,
93                int placeholder, char *value )
94{
95        char **var;
96        switch( placeholder )
97         {
98                case FSD_DRMAA_PH_HD:  var = &self->home_directory;  break;
99                case FSD_DRMAA_PH_WD:  var = &self->working_directory;  break;
100                case FSD_DRMAA_PH_INCR:  var = &self->bulk_incr;  break;
101                default:
102                        fsd_free( value );
103                        fsd_exc_raise_code( FSD_ERRNO_INVALID_ARGUMENT );
104         }
105        fsd_free( *var );
106        *var = value;
107}
108
109static void
110fsd_expand_drmaa_ph_destroy( fsd_expand_drmaa_ph_t *self )
111{
112        if( self != NULL )
113         {
114                fsd_free( self->home_directory );
115                fsd_free( self->working_directory );
116                fsd_free( self->bulk_incr );
117                fsd_free( self );
118         }
119}
120
121fsd_expand_drmaa_ph_t *
122fsd_expand_drmaa_ph_new(
123                char *home_directory,
124                char *working_directory,
125                char *bulk_incr
126                )
127{
128        fsd_expand_drmaa_ph_t *volatile p = NULL;
129
130        TRY
131         {
132                fsd_expand_drmaa_ph_t *self;
133                fsd_malloc( p, fsd_expand_drmaa_ph_t );
134                self = p;
135                self->expand = fsd_expand_drmaa_ph_expand;
136                self->set = fsd_expand_drmaa_ph_set;
137                self->destroy = fsd_expand_drmaa_ph_destroy;
138
139                self->home_directory = home_directory;
140                self->working_directory = working_directory;
141                self->bulk_incr = bulk_incr;
142
143                if( self->home_directory == NULL )
144                 {
145                        const char *home = getenv("HOME");
146                        if( home == NULL )
147                                home = "";
148                        self->home_directory = fsd_strdup( home );
149                 }
150
151                if( self->working_directory == NULL )
152                        self->working_directory = fsd_strdup(
153                                        self->home_directory );
154                else
155                        self->working_directory = self->expand( self,
156                                        self->working_directory, FSD_DRMAA_PH_HD );
157
158                if( self->bulk_incr == NULL )
159                        self->bulk_incr = fsd_strdup( "" );
160         }
161        EXCEPT_DEFAULT
162         {
163                if( p )
164                        p->destroy( p );
165                fsd_exc_reraise();
166         }
167        END_TRY
168        return p;
169}
170
171
172const char *
173drmaa_control_to_str( int action )
174{
175        switch( action )
176         {
177                case DRMAA_CONTROL_SUSPEND:
178                        return "suspend";
179                case DRMAA_CONTROL_RESUME:
180                        return "resume";
181                case DRMAA_CONTROL_HOLD:
182                        return "hold";
183                case DRMAA_CONTROL_RELEASE:
184                        return "release";
185                case DRMAA_CONTROL_TERMINATE:
186                        return "terminate";
187                default:
188                        return "?";
189         }
190}
191
192
193const char *
194drmaa_job_ps_to_str( int ps )
195{
196        switch( ps )
197         {
198                case DRMAA_PS_UNDETERMINED:
199                        return "undetermined";
200                case DRMAA_PS_QUEUED_ACTIVE:
201                        return "queued_active";
202                case DRMAA_PS_SYSTEM_ON_HOLD:
203                        return "system_on_hold";
204                case DRMAA_PS_USER_ON_HOLD:
205                        return "user_on_hold";
206                case DRMAA_PS_USER_SYSTEM_ON_HOLD:
207                        return "user_system_on_hold";
208                case DRMAA_PS_RUNNING:
209                        return "running";
210                case DRMAA_PS_SYSTEM_SUSPENDED:
211                        return "system_suspended";
212                case DRMAA_PS_USER_SUSPENDED:
213                        return "user_suspended";
214                case DRMAA_PS_USER_SYSTEM_SUSPENDED:
215                        return "user_system_suspended";
216                case DRMAA_PS_DONE:
217                        return "done";
218                case DRMAA_PS_FAILED:
219                        return "failed";
220                default:
221                        return "?";
222         }
223}
224
225
226int
227fsd_drmaa_code( int fsd_errno )
228{
229        switch( fsd_errno )
230         {
231                case FSD_ERRNO_SUCCESS:
232                        return DRMAA_ERRNO_SUCCESS;
233                case FSD_ERRNO_INTERNAL_ERROR:
234                        return DRMAA_ERRNO_INTERNAL_ERROR;
235                case FSD_ERRNO_NO_MEMORY:
236                        return DRMAA_ERRNO_NO_MEMORY;
237                case FSD_ERRNO_INVALID_ARGUMENT:
238                        return DRMAA_ERRNO_INVALID_ARGUMENT;
239                case FSD_ERRNO_INVALID_VALUE:
240                        return DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE;
241                case FSD_ERRNO_INVALID_VALUE_FORMAT:
242                        return DRMAA_ERRNO_INVALID_ATTRIBUTE_FORMAT;
243                case FSD_ERRNO_STOP_ITERATION:
244                        return DRMAA_ERRNO_NO_MORE_ELEMENTS;
245                case FSD_ERRNO_NOT_IMPLEMENTED:
246                        return DRMAA_ERRNO_INTERNAL_ERROR;
247                case FSD_ERRNO_NOT_INITIALIZED:
248                        return DRMAA_ERRNO_NO_ACTIVE_SESSION;
249                case FSD_ERRNO_TIMEOUT:
250                        return DRMAA_ERRNO_EXIT_TIMEOUT;
251                case FSD_ERRNO_AUTH_FAILURE:
252                        return DRMAA_ERRNO_AUTH_FAILURE;
253                case FSD_ERRNO_AUTHZ_FAILURE:
254                        return DRMAA_ERRNO_AUTH_FAILURE;
255                case FSD_ERRNO_TRY_LATER:
256                        return DRMAA_ERRNO_TRY_LATER;
257                case FSD_ERRNO_DRM_COMMUNICATION_FAILURE:
258                        return DRMAA_ERRNO_DRM_COMMUNICATION_FAILURE;
259                case FSD_ERRNO_DRMS_INIT_FAILED:
260                        return DRMAA_ERRNO_DRMS_INIT_FAILED;
261                case FSD_ERRNO_DRMS_EXIT_ERROR:
262                        return DRMAA_ERRNO_DRMS_EXIT_ERROR;
263                case FSD_ERRNO_DENIED_BY_DRM:
264                        return DRMAA_ERRNO_DENIED_BY_DRM;
265
266                case FSD_DRMAA_ERRNO_NO_ACTIVE_SESSION:
267                        return DRMAA_ERRNO_NO_ACTIVE_SESSION;
268                case FSD_DRMAA_ERRNO_INVALID_CONTACT_STRING:
269                        return DRMAA_ERRNO_INVALID_CONTACT_STRING;
270                case FSD_DRMAA_ERRNO_DEFAULT_CONTACT_STRING_ERROR:
271                        return DRMAA_ERRNO_DEFAULT_CONTACT_STRING_ERROR;
272                case FSD_DRMAA_ERRNO_NO_DEFAULT_CONTACT_STRING_SELECTED:
273                        return DRMAA_ERRNO_NO_DEFAULT_CONTACT_STRING_SELECTED;
274                case FSD_DRMAA_ERRNO_ALREADY_ACTIVE_SESSION:
275                        return DRMAA_ERRNO_ALREADY_ACTIVE_SESSION;
276                case FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_FORMAT:
277                        return DRMAA_ERRNO_INVALID_ATTRIBUTE_FORMAT;
278                case FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE:
279                        return DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE;
280                case FSD_DRMAA_ERRNO_CONFLICTING_ATTRIBUTE_VALUES:
281                        return DRMAA_ERRNO_CONFLICTING_ATTRIBUTE_VALUES;
282                case FSD_DRMAA_ERRNO_INVALID_JOB:
283                        return DRMAA_ERRNO_INVALID_JOB;
284                case FSD_DRMAA_ERRNO_RESUME_INCONSISTENT_STATE:
285                        return DRMAA_ERRNO_RESUME_INCONSISTENT_STATE;
286                case FSD_DRMAA_ERRNO_SUSPEND_INCONSISTENT_STATE:
287                        return DRMAA_ERRNO_SUSPEND_INCONSISTENT_STATE;
288                case FSD_DRMAA_ERRNO_HOLD_INCONSISTENT_STATE:
289                        return DRMAA_ERRNO_HOLD_INCONSISTENT_STATE;
290                case FSD_DRMAA_ERRNO_RELEASE_INCONSISTENT_STATE:
291                        return DRMAA_ERRNO_RELEASE_INCONSISTENT_STATE;
292                case FSD_DRMAA_ERRNO_EXIT_TIMEOUT:
293                        return DRMAA_ERRNO_EXIT_TIMEOUT;
294                case FSD_DRMAA_ERRNO_NO_RUSAGE:
295                        return DRMAA_ERRNO_NO_RUSAGE;
296
297                default:
298                        return DRMAA_ERRNO_INTERNAL_ERROR;
299         }
300}
301
302
303int
304fsd_errno_from_drmaa_code( int drmaa_errno )
305{
306        switch( drmaa_errno )
307         {
308                case DRMAA_ERRNO_SUCCESS:
309                        return FSD_ERRNO_SUCCESS;
310                case DRMAA_ERRNO_INTERNAL_ERROR:
311                        return FSD_ERRNO_INTERNAL_ERROR;
312                case DRMAA_ERRNO_DRM_COMMUNICATION_FAILURE:
313                        return FSD_ERRNO_DRM_COMMUNICATION_FAILURE;
314                case DRMAA_ERRNO_AUTH_FAILURE:
315                        return FSD_ERRNO_AUTHZ_FAILURE;
316                case DRMAA_ERRNO_INVALID_ARGUMENT:
317                        return FSD_ERRNO_INVALID_ARGUMENT;
318                case DRMAA_ERRNO_NO_ACTIVE_SESSION:
319                        return FSD_ERRNO_NOT_INITIALIZED;
320                case DRMAA_ERRNO_NO_MEMORY:
321                        return FSD_ERRNO_NO_MEMORY;
322                case DRMAA_ERRNO_INVALID_CONTACT_STRING:
323                        return FSD_DRMAA_ERRNO_INVALID_CONTACT_STRING;
324                case DRMAA_ERRNO_DEFAULT_CONTACT_STRING_ERROR:
325                        return FSD_DRMAA_ERRNO_DEFAULT_CONTACT_STRING_ERROR;
326                case DRMAA_ERRNO_NO_DEFAULT_CONTACT_STRING_SELECTED:
327                        return FSD_DRMAA_ERRNO_NO_DEFAULT_CONTACT_STRING_SELECTED;
328                case DRMAA_ERRNO_DRMS_INIT_FAILED:
329                        return FSD_ERRNO_DRMS_INIT_FAILED;
330                case DRMAA_ERRNO_ALREADY_ACTIVE_SESSION:
331                        return FSD_DRMAA_ERRNO_ALREADY_ACTIVE_SESSION;
332                case DRMAA_ERRNO_DRMS_EXIT_ERROR:
333                        return FSD_ERRNO_DRMS_EXIT_ERROR;
334                case DRMAA_ERRNO_INVALID_ATTRIBUTE_FORMAT:
335                        return FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_FORMAT;
336                case DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE:
337                        return FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE;
338                case DRMAA_ERRNO_CONFLICTING_ATTRIBUTE_VALUES:
339                        return FSD_DRMAA_ERRNO_CONFLICTING_ATTRIBUTE_VALUES;
340                case DRMAA_ERRNO_TRY_LATER:
341                        return FSD_ERRNO_TRY_LATER;
342                case DRMAA_ERRNO_DENIED_BY_DRM:
343                        return FSD_ERRNO_DENIED_BY_DRM;
344                case DRMAA_ERRNO_INVALID_JOB:
345                        return FSD_DRMAA_ERRNO_INVALID_JOB;
346                case DRMAA_ERRNO_RESUME_INCONSISTENT_STATE:
347                        return FSD_DRMAA_ERRNO_RESUME_INCONSISTENT_STATE;
348                case DRMAA_ERRNO_SUSPEND_INCONSISTENT_STATE:
349                        return FSD_DRMAA_ERRNO_SUSPEND_INCONSISTENT_STATE;
350                case DRMAA_ERRNO_HOLD_INCONSISTENT_STATE:
351                        return FSD_DRMAA_ERRNO_HOLD_INCONSISTENT_STATE;
352                case DRMAA_ERRNO_RELEASE_INCONSISTENT_STATE:
353                        return FSD_DRMAA_ERRNO_RELEASE_INCONSISTENT_STATE;
354                case DRMAA_ERRNO_EXIT_TIMEOUT:
355                        return FSD_DRMAA_ERRNO_EXIT_TIMEOUT;
356                case DRMAA_ERRNO_NO_RUSAGE:
357                        return FSD_DRMAA_ERRNO_NO_RUSAGE;
358                case DRMAA_ERRNO_NO_MORE_ELEMENTS:
359                        return FSD_ERRNO_STOP_ITERATION;
360                default:
361                        fsd_assert(false);
362                        return FSD_ERRNO_INTERNAL_ERROR;
363         }
364}
365
366
367const char *
368fsd_drmaa_strerror( int drmaa_errno )
369{
370        switch( drmaa_errno )
371         {
372                case DRMAA_ERRNO_SUCCESS:
373                        return "Success.";
374                case DRMAA_ERRNO_INTERNAL_ERROR:
375                        return "Unexpected or internal DRMAA error.";
376                case DRMAA_ERRNO_DRM_COMMUNICATION_FAILURE:
377                        return "Could not contact DRM system for this request.";
378                case DRMAA_ERRNO_AUTH_FAILURE:
379                        return "Authorization failure.";
380                case DRMAA_ERRNO_INVALID_ARGUMENT:
381                        return "Invalid argument value.";
382                case DRMAA_ERRNO_NO_ACTIVE_SESSION:
383                        return "No active DRMAA session.";
384                case DRMAA_ERRNO_NO_MEMORY:
385                        return "Not enough memory.";
386                case DRMAA_ERRNO_INVALID_CONTACT_STRING:
387                        return "Invalid contact string.";
388                case DRMAA_ERRNO_DEFAULT_CONTACT_STRING_ERROR:
389                        return "Can not determine default contact to DRM system.";
390                case DRMAA_ERRNO_NO_DEFAULT_CONTACT_STRING_SELECTED:
391                        return "Contact to DRM must be set explicitly "
392                                "because there is no default.";
393                case DRMAA_ERRNO_DRMS_INIT_FAILED:
394                        return "Unable to initialize DRM system.";
395                case DRMAA_ERRNO_ALREADY_ACTIVE_SESSION:
396                        return "DRMAA session already exist.";
397                case DRMAA_ERRNO_DRMS_EXIT_ERROR:
398                        return "Disengagement from the DRM system failed.";
399                case DRMAA_ERRNO_INVALID_ATTRIBUTE_FORMAT:
400                        return "Invalid format of job attribute.";
401                case DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE:
402                        return "Invalid value of job attribute.";
403                case DRMAA_ERRNO_CONFLICTING_ATTRIBUTE_VALUES:
404                        return "Value of attribute conflicts with other attribute value.";
405                case DRMAA_ERRNO_TRY_LATER:
406                        return "DRM system is overloaded.  Try again later.";
407                case DRMAA_ERRNO_DENIED_BY_DRM:
408                        return "DRM rejected job due to its configuration or job attributes.";
409                case DRMAA_ERRNO_INVALID_JOB:
410                        return "Job does not exist in DRMs queue.";
411                case DRMAA_ERRNO_RESUME_INCONSISTENT_STATE:
412                        return "Can not resume job (not in valid state).";
413                case DRMAA_ERRNO_SUSPEND_INCONSISTENT_STATE:
414                        return "Can not suspend job (not in valid state).";
415                case DRMAA_ERRNO_HOLD_INCONSISTENT_STATE:
416                        return "Can not hold job (not in valid state).";
417                case DRMAA_ERRNO_RELEASE_INCONSISTENT_STATE:
418                        return "Can not release job (not in valid state).";
419                case DRMAA_ERRNO_EXIT_TIMEOUT:
420                        return "Waiting for job to terminate finished due to time-out.";
421                case DRMAA_ERRNO_NO_RUSAGE:
422                        return "Job finished but resource usage information "
423                                "and/or termination status could not be provided.";
424                case DRMAA_ERRNO_NO_MORE_ELEMENTS:
425                        return "Vector have no more elements.";
426
427                default:
428                        return "Unknown DRMAA error code!?";
429         }
430}
431
Note: See TracBrowser for help on using the repository browser.