00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 static const char *rcsid = "$Header: /export/cvs-gridlab/wp-1/Codes/GATEngine/C-reference/src/GATResourceBroker.c,v 1.18 2004/04/20 12:33:22 hartmutkaiser Exp $";
00021
00022
00023 #include <stdlib.h>
00024 #include <string.h>
00025 #include <assert.h>
00026
00027
00028 #include "GAT.h"
00029 #include "GATInternal.h"
00030 #include "GATRegistry.h"
00031 #include "GATResourceBrokerCPI.h"
00032
00033
00034
00035
00036
00037 GATLIST_IMPLEMENT(extern, GATResource, GATList_GATResource,
00038 GATType_GATResource);
00039
00040
00041 GATOBJECT_DEFINE_VTABLE(GATResourceBroker);
00042
00043
00044 GATOBJECT_DEFINE_CONVERTERS(GATResourceBroker)
00045
00046
00047
00048
00049 struct GATResourceBroker_S {
00050
00051 GATResourceBroker_vtable *GATObject__vtable;
00052
00053
00054 GATResourceBrokerCPI_Instance data;
00055 GATResourceBrokerCPI cpi;
00056 GATResourceBrokerCPIList cpilist;
00057 };
00058
00059
00060 static GATResult
00061 GATResourceBroker_GetCPIInstanceData(GATResourceBroker object, void **data);
00062
00063 static GATResult
00064 GATResourceBroker_SetJobEnvironment(GATResourceBroker broker,
00065 GATJobDescription description, GATJobID_const gatjobid);
00066
00067
00068 GATResourceBroker_vtable GATResourceBroker__vtable = {
00069 GATResourceBroker_GetType,
00070 GATResourceBroker_Destroy,
00071 GATResourceBroker_Equals,
00072 GATResourceBroker_Clone,
00073 GATResourceBroker_GetInterface,
00074 GATResourceBroker_GetCPIInstanceData
00075 };
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 GATResourceBroker
00094 GATResourceBroker_Create(GATContext context, GATPreferences_const preferences,
00095 GATString vo_name)
00096 {
00097 GATResult err_code = GAT_MEMORYFAILURE;
00098 GATResourceBroker retval = (GATResourceBroker) malloc(
00099 sizeof(struct GATResourceBroker_S));
00100
00101 if (NULL != retval)
00102 {
00103 memset(retval, 0, sizeof(struct GATResourceBroker_S));
00104 retval->GATObject__vtable = &GATResourceBroker__vtable;
00105
00106 retval->data.context = context;
00107
00108
00109 if (NULL != vo_name)
00110 {
00111 err_code = GATString_Clone(vo_name, &retval->data.vo_name);
00112 }
00113 else
00114 {
00115 err_code = GAT_SUCCESS;
00116 }
00117
00118
00119 if (GAT_SUCCEEDED(err_code))
00120 {
00121 GATBool found_cpi = GATFalse;
00122 GATResourceBrokerCPIList current = NULL;
00123 GATRegistry_const registry = GATContext_internal_GetRegistry(context);
00124
00125
00126 if (NULL == preferences)
00127 {
00128 preferences = GATContext_GetPreferences(context);
00129 }
00130 retval->cpilist = GATRegistry_FindGATResourceBrokerCPI(registry, preferences);
00131 if (NULL == retval->cpilist)
00132 {
00133 GATResourceBroker_Destroy(&retval);
00134 err_code = GAT_NO_REGISTERED_CPI;
00135 }
00136 else
00137 {
00138
00139 err_code = GAT_NO_MATCHING_CPI;
00140 for(current = retval->cpilist; NULL != current; current = current->next)
00141 {
00142 err_code = GATResourceBrokerCPI_CreateInstance(current->cpi,
00143 &retval->data);
00144
00145 if (GAT_SUCCESS == err_code)
00146 {
00147 retval->cpi = current->cpi;
00148 found_cpi = GATTrue;
00149 break;
00150 }
00151 }
00152
00153
00154 if (GAT_SUCCEEDED(retval))
00155 {
00156 err_code = GATRegistry_AddGATResourceBrokerToCPIList(context,
00157 retval->cpi, retval);
00158 }
00159 }
00160 }
00161 }
00162
00163
00164 if (GAT_SUCCESS != err_code)
00165 {
00166 GATResourceBroker_Destroy(&retval);
00167 }
00168 return retval;
00169 }
00170
00171
00172
00173
00174
00175
00176
00177
00178 void
00179 GATResourceBroker_Destroy(GATResourceBroker *object)
00180 {
00181 if (NULL != object && NULL != *object)
00182 {
00183 GATString_Destroy(&(*object)->data.vo_name);
00184 if (NULL != (*object)->cpi)
00185 {
00186 GATRegistry_RemoveGATResourceBrokerFromCPIList((*object)->data.context,
00187 (*object)->cpi, *object);
00188 GATResourceBrokerCPI_DestroyInstance((*object)->cpi, &(*object)->data);
00189 }
00190 GATResourceBrokerCPIList_Destroy((*object)->cpilist);
00191 free(*object);
00192 *object = NULL;
00193 }
00194 }
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 GATResult
00210 GATResourceBroker_Equals(GATResourceBroker_const lhs,
00211 GATResourceBroker_const rhs, GATBool *isequal)
00212 {
00213 GATResult retval = GAT_INVALID_HANDLE;
00214
00215 if (NULL != lhs && NULL != rhs)
00216 {
00217 retval = GAT_INVALID_PARAMETER;
00218 if (NULL != isequal)
00219 {
00220 if (NULL == lhs->data.vo_name && NULL == rhs->data.vo_name)
00221 {
00222 retval = GAT_SUCCESS;
00223 *isequal = GATTrue;
00224 }
00225 else if (NULL != lhs->data.vo_name && NULL != rhs->data.vo_name)
00226 {
00227 retval = GATString_Equals(lhs->data.vo_name, rhs->data.vo_name, isequal);
00228 }
00229 else
00230 {
00231 retval = GAT_SUCCESS;
00232 *isequal = GATFalse;
00233 }
00234
00235 if (GAT_SUCCEEDED(retval) && GATTrue == *isequal)
00236 {
00237 retval = GATResourceBrokerCPI_EqualsInstance(lhs->cpi, &lhs->data,
00238 &rhs->data, isequal);
00239 }
00240 }
00241 }
00242 return retval;
00243 }
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 GATResult
00258 GATResourceBroker_Clone(GATResourceBroker_const handle,
00259 GATResourceBroker *new_handle)
00260 {
00261 if (NULL != handle)
00262 {
00263 GAT_USES_STATUS(handle->data.context, "GATResourceBroker_Clone");
00264 if (NULL == new_handle)
00265 {
00266 GAT_CREATE_STATUS(GAT_INVALID_PARAMETER);
00267 }
00268 else
00269 {
00270 struct GATResourceBroker_S const *object = handle;
00271 GATResourceBroker new_object =
00272 (GATResourceBroker) malloc(sizeof(struct GATResourceBroker_S));
00273
00274 *new_handle = NULL;
00275 if (NULL == new_object)
00276 {
00277 GAT_CREATE_STATUS(GAT_MEMORYFAILURE);
00278 }
00279 else
00280 {
00281 memset(new_object, 0, sizeof(struct GATResourceBroker_S));
00282 new_object->GATObject__vtable = &GATResourceBroker__vtable;
00283
00284 new_object->data.context = object->data.context;
00285 if (NULL != object->data.vo_name)
00286 {
00287 GAT_CREATE_STATUS(GATString_Clone(object->data.vo_name,
00288 &new_object->data.vo_name));
00289 }
00290
00291 new_object->cpilist = GATRegistry_CloneGATResourceBrokerCPIList(object->cpilist);
00292 if (GAT_FAILED(GAT_CURRENT_STATUS()) || NULL == new_object->cpilist)
00293 {
00294 GAT_CREATE_STATUS(GAT_MEMORYFAILURE);
00295 }
00296
00297 if (GAT_SUCCEEDED(GAT_CURRENT_STATUS()))
00298 {
00299
00300 GATResourceBrokerCPIList current = object->cpilist;
00301 GATResourceBrokerCPIList new_current = new_object->cpilist;
00302
00303 for (; NULL != current;
00304 current = current->next, new_current = new_current->next)
00305 {
00306 if (current->cpi == object->cpi)
00307 {
00308 new_object->cpi = new_current->cpi;
00309 break;
00310 }
00311 }
00312 assert(NULL != new_object->cpi);
00313
00314
00315 GAT_CREATE_STATUS(GATResourceBrokerCPI_CloneInstance(object->cpi,
00316 &object->data, &new_object->data));
00317
00318
00319 GAT_CREATE_STATUS(GATRegistry_AddGATResourceBrokerToCPIList(
00320 new_object->data.context, new_object->cpi, new_object));
00321 }
00322 }
00323
00324
00325 if (GAT_FAILED(GAT_CURRENT_STATUS()))
00326 {
00327 GATResourceBroker_Destroy(&new_object);
00328 }
00329 else
00330 {
00331
00332 *new_handle = new_object;
00333 }
00334 }
00335 }
00336 return GAT_INVALID_HANDLE;
00337 }
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349 GATType
00350 GATResourceBroker_GetType(GATResourceBroker_const object)
00351 {
00352 GAT_UNUSED_PARAMETER(object);
00353 return GATType_GATResourceBroker;
00354 }
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368 GATResult
00369 GATResourceBroker_GetInterface(GATResourceBroker_const object,
00370 GATInterface iftype, void const **ifp)
00371 {
00372 GAT_UNUSED_PARAMETER(object);
00373 GAT_UNUSED_PARAMETER(iftype);
00374 if (NULL != object)
00375 {
00376 GAT_STATUS_APIENTRY(object->data.context, "GATResourceBroker_GetInterface");
00377
00378 if (NULL != ifp)
00379 {
00380 *ifp = NULL;
00381 GAT_CREATE_STATUS(GAT_NO_INTERFACE);
00382 }
00383 else
00384 {
00385 GAT_CREATE_STATUS(GAT_INVALID_PARAMETER);
00386 }
00387
00388 return GAT_RETURN_STATUS();
00389 }
00390 return GAT_INVALID_HANDLE;
00391 }
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412 GATResult
00413 GATResourceBroker_ReserveResource_Description(GATResourceBroker broker,
00414 GATResourceDescription_const description, GATTime_const time_of_start,
00415 GATTimePeriod_const duration, GATReservation *reservation)
00416 {
00417 if (NULL != broker)
00418 {
00419 GAT_STATUS_APIENTRY(broker->data.context, "GATResourceBroker_ReserveResource");
00420 GAT_CREATE_STATUS(GATResourceBrokerCPI_ReserveResource_Description(
00421 broker->cpi, &broker->data, description, time_of_start, duration,
00422 reservation));
00423 return GAT_RETURN_STATUS();
00424 }
00425 return GAT_INVALID_HANDLE;
00426 }
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445 GATResult
00446 GATResourceBroker_ReserveResource(GATResourceBroker broker,
00447 GATResource_const resource, GATTime_const time_of_start,
00448 GATTimePeriod_const duration, GATReservation *reservation)
00449 {
00450 if (NULL != broker)
00451 {
00452 GAT_STATUS_APIENTRY(broker->data.context, "GATResourceBroker_ReserveResource");
00453 GAT_CREATE_STATUS(GATResourceBrokerCPI_ReserveResource(broker->cpi,
00454 &broker->data, resource, time_of_start, duration, reservation));
00455 return GAT_RETURN_STATUS();
00456 }
00457 return GAT_INVALID_HANDLE;
00458 }
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473 GATResult
00474 GATResourceBroker_FindResources(GATResourceBroker broker,
00475 GATResourceDescription_const description, GATList_GATResource *resources)
00476 {
00477 if (NULL != broker)
00478 {
00479 GAT_STATUS_APIENTRY(broker->data.context, "GATResourceBroker_FindResources");
00480 GAT_CREATE_STATUS(GATResourceBrokerCPI_FindResources(broker->cpi,
00481 &broker->data, description, resources));
00482 return GAT_RETURN_STATUS();
00483 }
00484 return GAT_INVALID_HANDLE;
00485 }
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501 GATResult GATResourceBroker_SubmitJob(GATResourceBroker broker,
00502 GATJobDescription_const description, GATJob *job)
00503 {
00504 if (NULL != broker)
00505 {
00506 GAT_STATUS_APIENTRY(broker->data.context, "GATResourceBroker_SubmitJob");
00507 GATJobDescription desc = NULL;
00508
00509
00510 GATString gatjobid = NULL;
00511 GATSelf_const self = GATContext_internal_GetSelf(broker->data.context);
00512
00513 GAT_CREATE_STATUS(GATSelf_internal_CreateGATJobId(self, broker->data.context,
00514 &gatjobid));
00515
00516
00517 GAT_CREATE_STATUS(GATJobDescription_Clone(description, &desc));
00518 GAT_CREATE_STATUS(GATResourceBroker_SetJobEnvironment(broker, desc,
00519 gatjobid));
00520
00521
00522 GAT_CREATE_STATUS(GATResourceBrokerCPI_SubmitJob(broker->cpi, &broker->data,
00523 desc, job));
00524 GATJobDescription_Destroy(&desc);
00525
00526
00527 GAT_CREATE_STATUS(GATJob_internal_SetGATJobId(*job, gatjobid));
00528 GATString_Destroy(&gatjobid);
00529
00530 return GAT_RETURN_STATUS();
00531 }
00532 return GAT_INVALID_HANDLE;
00533 }
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549 static GATResult
00550 GATResourceBroker_GetCPIInstanceData(GATResourceBroker broker, void **data)
00551 {
00552 if (NULL != broker)
00553 {
00554 GAT_USES_STATUS(broker->data.context, "GATResourceBroker_GetCPIInstanceData");
00555
00556 if (NULL != data)
00557 {
00558 *data = (void *)&broker->data;
00559 }
00560 else
00561 {
00562 GAT_CREATE_STATUS(GAT_INVALID_PARAMETER);
00563 }
00564
00565 return GAT_RETURN_STATUS();
00566 }
00567 return GAT_INVALID_HANDLE;
00568 }
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582 static GATResult
00583 GATResourceBroker_SetJobEnvironment(GATResourceBroker broker,
00584 GATJobDescription desc, GATJobID_const gatjobid)
00585 {
00586 if (NULL != broker)
00587 {
00588 GAT_USES_STATUS(broker->data.context, "GATResourceBroker_SetJobEnvironment");
00589
00590 GATSelf_const self = GATContext_internal_GetSelf(broker->data.context);
00591
00592
00593 GATJobID_const parent_gatjobid = NULL;
00594 GATTable env = NULL;
00595
00596 GAT_CREATE_STATUS(GATJobDescription_internal_GetEnvironment(desc, &env));
00597
00598 GAT_CREATE_STATUS(GATTable_Add_String(env, "GAT_JOBID",
00599 GATString_GetBuffer(gatjobid)));
00600
00601 GAT_CREATE_STATUS(GATSelf_internal_GetGATJobId(self, broker->data.context,
00602 &parent_gatjobid));
00603 GAT_CREATE_STATUS(GATTable_Add_String(env, "PARENT_GAT_JOBID",
00604 GATString_GetBuffer(parent_gatjobid)));
00605
00606 return GAT_RETURN_STATUS();
00607 }
00608 return GAT_INVALID_HANDLE;
00609 }
00610