9
#include "axis2_skel_EucalyptusCC.h"
11
#include <server-marshal.h>
15
#include <euca_auth.h>
19
#include "client-marshal.h"
21
#define SUPERUSER "eucalyptus"
26
// to be stored in shared memory
27
ccConfig *config=NULL;
28
sem_t *configLock=NULL;
30
ccInstance *instanceCache=NULL;
31
sem_t *instanceCacheLock=NULL;
33
vnetConfig *vnetconfig=NULL;
34
sem_t *vnetConfigLock=NULL;
36
int doAttachVolume(ncMetadata *ccMeta, char *volumeId, char *instanceId, char *remoteDev, char *localDev) {
37
int i, j, rc, start, stop, k, done, ret=0;
38
ccInstance *myInstance, *out;
40
time_t op_start, op_timer;
44
op_start = time(NULL);
45
op_timer = OP_TIMEOUT;
51
logprintfl(EUCADEBUG,"AttachVolume(): called\n");
53
rc = find_instanceCacheId(instanceId, &myInstance);
55
// found the instance in the cache
56
start = myInstance->ncHostIdx;
58
if (myInstance) free(myInstance);
61
stop = config->numResources;
65
for (j=start; j<stop; j++) {
66
// read the instance ids
67
logprintfl(EUCAINFO,"AttachVolume(): calling attach volume (%s) on (%s)\n", instanceId, config->resourcePool[j].hostname);
72
ncs = ncStubCreate(config->resourcePool[j].ncService, NULL, NULL);
73
if (config->use_wssec) {
74
rc = InitWSSEC(ncs->env, ncs->stub, config->policyFile);
76
logprintfl(EUCADEBUG, "would call attachVol on NC: %s\n", config->resourcePool[j].hostname);
79
rc = ncAttachVolumeStub(ncs, ccMeta, instanceId, volumeId, remoteDev, localDev);
87
op_timer = OP_TIMEOUT - (time(NULL) - op_start);
88
rc = timewait(pid, &status, op_timer / ((stop-start) - (j - start)));
89
rc = WEXITSTATUS(status);
90
logprintfl(EUCADEBUG,"\tcall complete (pid/rc): %d/%d\n", pid, rc);
98
logprintfl(EUCAERROR, "failed to attach volume '%s'\n", instanceId);
103
//rc = refresh_resources(ccMeta, OP_TIMEOUT - (time(NULL) - op_start));
105
logprintfl(EUCADEBUG,"AttachVolume(): done.\n");
112
int doDetachVolume(ncMetadata *ccMeta, char *volumeId, char *instanceId, char *remoteDev, char *localDev, int force) {
113
int i, j, rc, start, stop, k, done, ret=0;
114
ccInstance *myInstance, *out;
116
time_t op_start, op_timer;
120
op_start = time(NULL);
121
op_timer = OP_TIMEOUT;
127
logprintfl(EUCADEBUG,"DetachVolume(): called\n");
129
rc = find_instanceCacheId(instanceId, &myInstance);
131
// found the instance in the cache
132
start = myInstance->ncHostIdx;
134
if (myInstance) free(myInstance);
137
stop = config->numResources;
140
sem_wait(configLock);
141
for (j=start; j<stop; j++) {
142
// read the instance ids
143
logprintfl(EUCAINFO,"DetachVolume(): calling dettach volume (%s) on (%s)\n", instanceId, config->resourcePool[j].hostname);
148
ncs = ncStubCreate(config->resourcePool[j].ncService, NULL, NULL);
149
if (config->use_wssec) {
150
rc = InitWSSEC(ncs->env, ncs->stub, config->policyFile);
152
logprintfl(EUCADEBUG, "would call dettachVol on NC: %s\n", config->resourcePool[j].hostname);
154
rc = ncDetachVolumeStub(ncs, ccMeta, instanceId, volumeId, remoteDev, localDev, force);
162
op_timer = OP_TIMEOUT - (time(NULL) - op_start);
163
rc = timewait(pid, &status, op_timer / ((stop-start) - (j - start)));
164
rc = WEXITSTATUS(status);
165
logprintfl(EUCADEBUG,"\tcall complete (pid/rc): %d/%d\n", pid, rc);
168
sem_post(configLock);
173
logprintfl(EUCAERROR, "failed to dettach volume '%s'\n", instanceId);
178
//rc = refresh_resources(ccMeta, OP_TIMEOUT - (time(NULL) - op_start));
180
logprintfl(EUCADEBUG,"DetachVolume(): done.\n");
187
int doConfigureNetwork(ncMetadata *meta, char *type, int namedLen, char **sourceNames, char **userNames, int netLen, char **sourceNets, char *destName, char *protocol, int minPort, int maxPort) {
188
int rc, i, destVlan, slashnet, fail;
196
logprintfl(EUCADEBUG, "ConfigureNetwork(): called\n");
198
if (!strcmp(vnetconfig->mode, "SYSTEM") || !strcmp(vnetconfig->mode, "STATIC")) {
202
destUserName = meta->userId;
204
sem_wait(vnetConfigLock);
207
for (i=0; i<namedLen; i++) {
208
if (sourceNames && userNames) {
209
rc = vnetTableRule(vnetconfig, type, destUserName, destName, userNames[i], NULL, sourceNames[i], protocol, minPort, maxPort);
212
logprintfl(EUCAERROR,"ERROR: vnetTableRule() returned error\n");
216
for (i=0; i<netLen; i++) {
218
rc = vnetTableRule(vnetconfig, type, destUserName, destName, NULL, sourceNets[i], NULL, protocol, minPort, maxPort);
221
logprintfl(EUCAERROR,"ERROR: vnetTableRule() returned error\n");
225
sem_post(vnetConfigLock);
228
logprintfl(EUCADEBUG,"ConfigureNetwork(): done\n");
236
int doFlushNetwork(ncMetadata *ccMeta, char *destName) {
239
if (!strcmp(vnetconfig->mode, "SYSTEM") || !strcmp(vnetconfig->mode, "STATIC")) {
243
sem_wait(vnetConfigLock);
244
rc = vnetFlushTable(vnetconfig, ccMeta->userId, destName);
245
sem_post(vnetConfigLock);
249
int doAssignAddress(ncMetadata *ccMeta, char *src, char *dst) {
250
int rc, allocated, addrdevno, ret;
260
logprintfl(EUCADEBUG,"AssignAddress(): called\n");
262
if (!strcmp(vnetconfig->mode, "SYSTEM") || !strcmp(vnetconfig->mode, "STATIC")) {
266
sem_wait(vnetConfigLock);
267
rc = vnetGetPublicIP(vnetconfig, src, NULL, &allocated, &addrdevno);
269
logprintfl(EUCAERROR,"failed to get publicip record %s\n", src);
273
snprintf(cmd, 255, "%s/usr/share/eucalyptus/euca_rootwrap ip addr add %s/32 dev %s", config->eucahome, src, vnetconfig->pubInterface);
274
logprintfl(EUCAINFO,"running cmd %s\n", cmd);
277
logprintfl(EUCAERROR,"cmd '%s' failed\n", cmd);
280
rc = vnetAssignAddress(vnetconfig, src, dst);
282
logprintfl(EUCAERROR,"could not assign address\n");
285
rc = vnetAllocatePublicIP(vnetconfig, src, dst);
287
logprintfl(EUCAERROR,"could not allocate public IP\n");
293
logprintfl(EUCAWARN,"ip %s is allready assigned, ignoring\n", src);
297
sem_post(vnetConfigLock);
300
logprintfl(EUCADEBUG,"AssignAddress(): done\n");
304
int doDescribePublicAddresses(ncMetadata *ccMeta, publicip **outAddresses, int *outAddressesLen) {
312
*outAddresses = vnetconfig->publicips;
313
*outAddressesLen = NUMBER_OF_PUBLIC_IPS;
318
int doUnassignAddress(ncMetadata *ccMeta, char *src, char *dst) {
319
int rc, allocated, addrdevno, ret, count;
326
logprintfl(EUCADEBUG,"UnassignAddress(): called\n");
328
if (!strcmp(vnetconfig->mode, "SYSTEM") || !strcmp(vnetconfig->mode, "STATIC")) {
332
sem_wait(vnetConfigLock);
334
rc = vnetGetPublicIP(vnetconfig, src, NULL, &allocated, &addrdevno);
336
logprintfl(EUCAERROR,"failed to find publicip to unassign (%s)\n", src);
339
if (allocated && dst) {
340
rc = vnetUnassignAddress(vnetconfig, src, dst);
342
logprintfl(EUCAWARN,"vnetUnassignAddress() failed %d: %s/%s\n", rc, src, dst);
345
rc = vnetDeallocatePublicIP(vnetconfig, src, dst);
347
logprintfl(EUCAWARN,"vnetDeallocatePublicIP() failed %d: %s\n", rc, src);
352
snprintf(cmd, 256, "%s/usr/share/eucalyptus/euca_rootwrap ip addr del %s/32 dev %s", config->eucahome, src, vnetconfig->pubInterface);
353
logprintfl(EUCADEBUG, "running cmd '%s'\n", cmd);
356
logprintfl(EUCAWARN,"cmd failed '%s'\n", cmd);
360
sem_post(vnetConfigLock);
363
logprintfl(EUCADEBUG,"UnassignAddress(): done\n");
367
int doStopNetwork(ncMetadata *ccMeta, char *netName, int vlan) {
375
logprintfl(EUCADEBUG,"StopNetwork(): called\n");
376
logprintfl(EUCADEBUG, "\t vlan:%d\n", vlan);
378
if (!strcmp(vnetconfig->mode, "SYSTEM") || !strcmp(vnetconfig->mode, "STATIC")) {
382
sem_wait(vnetConfigLock);
383
rc = vnetStopNetwork(vnetconfig, vlan, ccMeta->userId, netName);
385
sem_post(vnetConfigLock);
388
logprintfl(EUCADEBUG,"StopNetwork(): done\n");
393
int doStartNetwork(ncMetadata *ccMeta, char *netName, int vlan) {
394
int rc, ret, i, status;
395
time_t op_start, op_timer;
398
op_start = time(NULL);
399
op_timer = OP_TIMEOUT;
406
logprintfl(EUCADEBUG, "StartNetwork(): called\n");
407
logprintfl(EUCADEBUG, "\t vlan:%d\n", vlan);
408
if (!strcmp(vnetconfig->mode, "SYSTEM") || !strcmp(vnetconfig->mode, "STATIC")) {
411
sem_wait(vnetConfigLock);
414
rc = vnetStartNetwork(vnetconfig, vlan, ccMeta->userId, netName, &brname);
417
// vnetAddDev(vnetconfig, brname);
420
sem_post(vnetConfigLock);
423
logprintfl(EUCAERROR,"StartNetwork(): ERROR return from vnetStartNetwork %d\n", rc);
426
logprintfl(EUCAINFO,"StartNetwork(): SUCCESS return from vnetStartNetwork %d\n", rc);
430
sem_wait(configLock);
432
for (i=0; i<config->numResources; i++) {
433
int pid, j, numHosts, done, k;
435
char *statusString=NULL, **hosts;
437
hosts = malloc(sizeof(char *));
439
hosts[0] = strdup("localhost");
443
ncs = ncStubCreate(config->resourcePool[i].ncService, NULL, NULL);
444
if (config->use_wssec) {
445
rc = InitWSSEC(ncs->env, ncs->stub, config->policyFile);
447
rc = ncStartNetworkStub(ncs, ccMeta, hosts, numHosts, 1234, vlan, &statusString);
450
op_timer = OP_TIMEOUT - (time(NULL) - op_start);
451
rc = timewait(pid, &status, op_timer / (config->numResources - i));
454
for (j=0; j<numHosts; j++) {
455
if (hosts[j]) free(hosts[j]);
457
if (hosts) free(hosts);
462
sem_post(configLock);
465
logprintfl(EUCADEBUG,"StartNetwork(): done\n");
472
int doDescribeResources(ncMetadata *ccMeta, virtualMachine **ccvms, int vmLen, int **outTypesMax, int **outTypesAvail, int *outTypesLen, char ***outServiceTags, int *outServiceTagsLen) {
475
int rc, diskpool, mempool, corepool;
476
int *numberOfTypes, j;
479
axis2_svc_client_t *svc_client;
481
time_t op_start, op_timer;
483
op_start = time(NULL);
484
op_timer = OP_TIMEOUT;
490
logprintfl(EUCADEBUG,"DescribeResources(): called %d\n", vmLen);
492
if (outTypesMax == NULL || outTypesAvail == NULL || outTypesLen == NULL || outServiceTags == NULL || outServiceTagsLen == NULL) {
497
print_instanceCache();
499
*outServiceTags = malloc(sizeof(char *) * config->numResources);
500
*outServiceTagsLen = config->numResources;
501
for (i=0; i<config->numResources; i++) {
502
(*outServiceTags)[i] = strdup(config->resourcePool[i].ncService);
506
*outTypesAvail = NULL;
508
*outTypesMax = malloc(sizeof(int) * vmLen);
509
bzero(*outTypesMax, sizeof(int) * vmLen);
511
*outTypesAvail = malloc(sizeof(int) * vmLen);
512
bzero(*outTypesAvail, sizeof(int) * vmLen);
514
*outTypesLen = vmLen;
516
for (i=0; i<vmLen; i++) {
517
if ((*ccvms)[i].mem <= 0 || (*ccvms)[i].cores <= 0 || (*ccvms)[i].disk <= 0) {
518
logprintfl(EUCAERROR,"DescribeResources(): input error\n");
519
if (*outTypesAvail) free(*outTypesAvail);
520
if (*outTypesMax) free(*outTypesMax);
526
rc = refresh_resources(ccMeta, OP_TIMEOUT - (time(NULL) - op_start));
528
logprintfl(EUCAERROR,"calling refresh_resources\n");
531
sem_wait(configLock);
533
for (i=0; i<config->numResources; i++) {
534
res = &(config->resourcePool[i]);
536
for (j=0; j<vmLen; j++) {
537
mempool = res->availMemory;
538
diskpool = res->availDisk;
539
corepool = res->availCores;
541
mempool -= (*ccvms)[j].mem;
542
diskpool -= (*ccvms)[j].disk;
543
corepool -= (*ccvms)[j].cores;
544
while (mempool >= 0 && diskpool >= 0 && corepool >= 0) {
545
(*outTypesAvail)[j]++;
546
mempool -= (*ccvms)[j].mem;
547
diskpool -= (*ccvms)[j].disk;
548
corepool -= (*ccvms)[j].cores;
551
mempool = res->maxMemory;
552
diskpool = res->maxDisk;
553
corepool = res->maxCores;
555
mempool -= (*ccvms)[j].mem;
556
diskpool -= (*ccvms)[j].disk;
557
corepool -= (*ccvms)[j].cores;
558
while (mempool >= 0 && diskpool >= 0 && corepool >= 0) {
560
mempool -= (*ccvms)[j].mem;
561
diskpool -= (*ccvms)[j].disk;
562
corepool -= (*ccvms)[j].cores;
566
sem_post(configLock);
569
logprintfl(EUCADEBUG,"DescribeResources(): done\n");
576
int refresh_resources(ncMetadata *ccMeta, int timeout) {
578
int pid, status, ret;
580
time_t op_start, op_timer;
584
if (timeout <= 0) timeout = 1;
586
op_start = time(NULL);
588
logprintfl(EUCADEBUG,"refresh_resources(): called\n");
590
sem_wait(configLock);
591
for (i=0; i<config->numResources; i++) {
594
logprintfl(EUCADEBUG, "calling %s\n", config->resourcePool[i].ncService);
598
ncs = ncStubCreate(config->resourcePool[i].ncService, NULL, NULL);
599
if (config->use_wssec) {
600
rc = InitWSSEC(ncs->env, ncs->stub, config->policyFile);
602
rc = ncDescribeResourceStub(ncs, ccMeta, NULL, &ncRes);
605
rc = write(filedes[1], ncRes, sizeof(ncResource));
617
ncRes = malloc(sizeof(ncResource));
618
bzero(ncRes, sizeof(ncResource));
619
op_timer = timeout - (time(NULL) - op_start);
620
logprintfl(EUCADEBUG, "\ttime left for next op: %d\n", op_timer);
621
rc = timeread(filedes[0], ncRes, sizeof(ncResource), op_timer / (config->numResources - i));
624
// timeout or read went badly
629
rc = WEXITSTATUS(status);
633
config->lastResourceUpdate = time(NULL);
635
logprintfl(EUCAERROR,"bad return from ncDescribeResource(%s) (%d/%d)\n", config->resourcePool[i].hostname, pid, rc);
636
config->resourcePool[i].maxMemory = 0;
637
config->resourcePool[i].availMemory = 0;
638
config->resourcePool[i].maxDisk = 0;
639
config->resourcePool[i].availDisk = 0;
640
config->resourcePool[i].maxCores = 0;
641
config->resourcePool[i].availCores = 0;
642
config->resourcePool[i].isup = 0;
644
logprintfl(EUCAINFO,"\tnode=%s mem=%d/%d disk=%d/%d cores=%d/%d\n", config->resourcePool[i].hostname, ncRes->memorySizeMax, ncRes->memorySizeAvailable, ncRes->diskSizeMax, ncRes->diskSizeAvailable, ncRes->numberOfCoresMax, ncRes->numberOfCoresAvailable);
645
config->resourcePool[i].maxMemory = ncRes->memorySizeMax;
646
config->resourcePool[i].availMemory = ncRes->memorySizeAvailable;
647
config->resourcePool[i].maxDisk = ncRes->diskSizeMax;
648
config->resourcePool[i].availDisk = ncRes->diskSizeAvailable;
649
config->resourcePool[i].maxCores = ncRes->numberOfCoresMax;
650
config->resourcePool[i].availCores = ncRes->numberOfCoresAvailable;
651
config->resourcePool[i].isup = 1;
652
if (ncRes) free(ncRes);
655
sem_post(configLock);
657
logprintfl(EUCADEBUG,"refresh_resources(): done\n");
661
int doDescribeInstances(ncMetadata *ccMeta, char **instIds, int instIdsLen, ccInstance **outInsts, int *outInstsLen) {
662
ccInstance *myInstance=NULL, *out=NULL, *cacheInstance=NULL;
663
int i, j, k, numInsts, found, ncOutInstsLen, rc, pid;
665
time_t op_start, op_timer;
667
ncInstance **ncOutInsts=NULL;
670
op_start = time(NULL);
671
op_timer = OP_TIMEOUT;
678
logprintfl(EUCADEBUG,"DescribeInstances(): called\n");
686
sem_wait(configLock);
687
for (i=0; i<config->numResources; i++) {
697
ncs = ncStubCreate(config->resourcePool[i].ncService, NULL, NULL);
698
if (config->use_wssec) {
699
rc = InitWSSEC(ncs->env, ncs->stub, config->policyFile);
701
rc = ncDescribeInstancesStub(ncs, ccMeta, instIds, instIdsLen, &ncOutInsts, &ncOutInstsLen);
705
rc = write(filedes[1], &len, sizeof(int));
706
for (j=0; j<len; j++) {
708
inst = ncOutInsts[j];
709
rc = write(filedes[1], inst, sizeof(ncInstance));
714
rc = write(filedes[1], &len, sizeof(int));
726
op_timer = OP_TIMEOUT - (time(NULL) - op_start);
727
rbytes = timeread(filedes[0], &len, sizeof(int), op_timer / (config->numResources - i));
734
if (rbytes < sizeof(int)) {
739
ncOutInsts = malloc(sizeof(ncInstance *) * len);
741
for (j=0; j<len; j++) {
742
inst = malloc(sizeof(ncInstance));
743
op_timer = OP_TIMEOUT - (time(NULL) - op_start);
744
rbytes = timeread(filedes[0], inst, sizeof(ncInstance), op_timer / (config->numResources - i));
745
ncOutInsts[j] = inst;
749
rc = WEXITSTATUS(status);
756
logprintfl(EUCAERROR,"ncDescribeInstancesStub(%s): returned fail: (%d/%d)\n", config->resourcePool[i].ncService, pid, rc);
758
for (j=0; j<ncOutInstsLen; j++) {
760
for (k=0; k<instIdsLen; k++) {
761
if (!strcmp(ncOutInsts[j]->instanceId, instIds[k]) && (!strcmp(ncOutInsts[j]->userId, ccMeta->userId) || !strcmp(ccMeta->userId, SUPERUSER))) {
766
if (found || instIdsLen == 0) {
768
logprintfl(EUCAINFO,"DescribeInstances(): describing instance %s, %d\n", ncOutInsts[j]->instanceId, j);
771
*outInsts = realloc(*outInsts, sizeof(ccInstance) * numInsts);
775
bzero(ccvm.name, 64);
776
ccvm.mem = ncOutInsts[j]->params.memorySize;
777
ccvm.disk = ncOutInsts[j]->params.diskSize;
778
ccvm.cores = ncOutInsts[j]->params.numberOfCores;
780
myInstance = &(out[numInsts-1]);
781
bzero(myInstance, sizeof(ccInstance));
782
// strncpy(myInstance->instanceId, ncOutInsts[j]->instanceId, 16);
784
find_instanceCacheId(ncOutInsts[j]->instanceId, &cacheInstance);
786
logprintfl(EUCADEBUG, "\t%s in cache\n", ncOutInsts[j]->instanceId);
787
memcpy(myInstance, cacheInstance, sizeof(ccInstance));
790
rc = ccInstance_to_ncInstance(myInstance, ncOutInsts[j]);
793
strncpy(myInstance->keyName, ncOutInsts[j]->keyName, 1024);
794
strncpy(myInstance->ownerId, ncOutInsts[j]->userId, 16);
795
strncpy(myInstance->reservationId, ncOutInsts[j]->reservationId, 16);
796
strncpy(myInstance->amiId, ncOutInsts[j]->imageId, 16);
797
strncpy(myInstance->kernelId, ncOutInsts[j]->kernelId, 16);
798
strncpy(myInstance->ramdiskId, ncOutInsts[j]->ramdiskId, 16);
799
strncpy(myInstance->state, ncOutInsts[j]->stateName, 16);
800
myInstance->ts = ncOutInsts[j]->launchTime;
802
myInstance->ccnet.vlan = ncOutInsts[j]->ncnet.vlan;
803
strncpy(myInstance->ccnet.publicIp, ncOutInsts[j]->ncnet.publicIp, 24);
804
strncpy(myInstance->ccnet.privateIp, ncOutInsts[j]->ncnet.privateIp, 24);
805
strncpy(myInstance->ccnet.publicMac, ncOutInsts[j]->ncnet.publicMac, 24);
806
strncpy(myInstance->ccnet.privateMac, ncOutInsts[j]->ncnet.privateMac, 24);
809
// instance info that the CC maintains
810
myInstance->ncHostIdx = i;
811
strncpy(myInstance->serviceTag, config->resourcePool[i].ncService, 64);
812
memcpy(&(myInstance->ccvm), &ccvm, sizeof(virtualMachine));
816
// see if I remember the IPs
817
memcpy(&(myInstance->ccvm), &(cacheInstance->ccvm), sizeof(virtualMachine));
819
if (!strcmp(myInstance->ccnet.publicIp, "0.0.0.0") && strcmp(cacheInstance->ccnet.publicIp, "0.0.0.0")) {
820
// found cached publicIp
821
strncpy(myInstance->ccnet.publicIp, cacheInstance->ccnet.publicIp, 24);
823
if (!strcmp(myInstance->ccnet.privateIp, "0.0.0.0") && strcmp(cacheInstance->ccnet.privateIp, "0.0.0.0")) {
824
// found cached publicIp
825
strncpy(myInstance->ccnet.privateIp, cacheInstance->ccnet.privateIp, 24);
833
if (!strcmp(myInstance->ccnet.publicIp, "0.0.0.0")) {
834
rc = discover_mac(vnetconfig, myInstance->ccnet.publicMac, &ip);
836
strncpy(myInstance->ccnet.publicIp, ip, 24);
839
if (!strcmp(myInstance->ccnet.privateIp, "0.0.0.0")) {
840
rc = discover_mac(vnetconfig, myInstance->ccnet.privateMac, &ip);
842
strncpy(myInstance->ccnet.privateIp, ip, 24);
846
if (cacheInstance) free(cacheInstance);
848
refresh_instanceCache(myInstance->instanceId, myInstance);
851
for (j=0; j<ncOutInstsLen; j++) {
852
free_instance(&(ncOutInsts[j]));
854
if (ncOutInsts) free(ncOutInsts);
857
sem_post(configLock);
859
*outInstsLen = numInsts;
860
logprintfl(EUCADEBUG,"DescribeInstances(): done\n");
867
int ccInstance_to_ncInstance(ccInstance *dst, ncInstance *src) {
870
strncpy(dst->instanceId, src->instanceId, 16);
871
strncpy(dst->reservationId, src->reservationId, 16);
872
strncpy(dst->ownerId, src->userId, 16);
873
strncpy(dst->amiId, src->imageId, 16);
874
strncpy(dst->kernelId, src->kernelId, 16);
875
strncpy(dst->ramdiskId, src->ramdiskId, 16);
876
strncpy(dst->launchIndex, src->launchIndex, 64);
877
strncpy(dst->userData, src->userData, 64);
878
for (i=0; i<src->groupNamesSize || i >= 64; i++) {
879
snprintf(dst->groupNames[i], 32, "%s", src->groupNames[i]);
881
strncpy(dst->state, src->stateName, 16);
882
dst->ccnet.vlan = src->ncnet.vlan;
883
strncpy(dst->ccnet.publicMac, src->ncnet.publicMac, 24);
884
strncpy(dst->ccnet.privateMac, src->ncnet.privateMac, 24);
885
if (strcmp(src->ncnet.publicIp, "0.0.0.0") || dst->ccnet.publicIp[0] == '\0') strncpy(dst->ccnet.publicIp, src->ncnet.publicIp, 16);
886
if (strcmp(src->ncnet.privateIp, "0.0.0.0") || dst->ccnet.privateIp[0] == '\0') strncpy(dst->ccnet.privateIp, src->ncnet.privateIp, 16);
888
memcpy(dst->volumes, src->volumes, sizeof(ncVolume) * EUCA_MAX_VOLUMES);
889
dst->volumesSize = src->volumesSize;
894
int schedule_instance(virtualMachine *vm, int *outresid) {
896
if (config->schedPolicy == SCHEDGREEDY) {
897
return(schedule_instance_greedy(vm, outresid));
898
} else if (config->schedPolicy == SCHEDROUNDROBIN) {
899
return(schedule_instance_roundrobin(vm, outresid));
902
return(schedule_instance_greedy(vm, outresid));
905
int schedule_instance_roundrobin(virtualMachine *vm, int *outresid) {
906
int i, rc, done, start, found, resid=0;
911
logprintfl(EUCAINFO, "scheduler using ROUNDROBIN policy to find next resource\n");
913
// find the best 'resource' on which to run the instance
915
start = config->schedState;
918
logprintfl(EUCADEBUG, "scheduler state starting at resource %d\n", config->schedState);
920
int mem, disk, cores;
922
res = &(config->resourcePool[i]);
924
mem = res->availMemory - vm->mem;
925
disk = res->availDisk - vm->disk;
926
cores = res->availCores - vm->cores;
928
if (mem >= 0 && disk >= 0 && cores >= 0) {
935
if (i >= config->numResources) {
944
// didn't find a resource
949
config->schedState = i;
950
logprintfl(EUCADEBUG, "scheduler state finishing at resource %d\n", config->schedState);
955
int schedule_instance_greedy(virtualMachine *vm, int *outresid) {
956
int i, rc, done, resid=0;
961
logprintfl(EUCAINFO, "scheduler using GREEDY policy to find next resource\n");
963
// find the best 'resource' on which to run the instance
965
for (i=0; i<config->numResources && !done; i++) {
966
int mem, disk, cores;
969
res = &(config->resourcePool[i]);
971
mem = res->availMemory - vm->mem;
972
disk = res->availDisk - vm->disk;
973
cores = res->availCores - vm->cores;
975
if (mem >= 0 && disk >= 0 && cores >= 0) {
983
// didn't find a resource
990
int doRunInstances(ncMetadata *ccMeta, char *amiId, char *kernelId, char *ramdiskId, char *amiURL, char *kernelURL, char *ramdiskURL, char **instIds, int instIdsLen, char **netNames, int netNamesLen, char **macAddrs, int macAddrsLen, int minCount, int maxCount, char *ownerId, char *reservationId, virtualMachine *ccvm, char *keyName, int vlan, char *userData, char *launchIndex, ccInstance **outInsts, int *outInstsLen) {
991
int rc, i, j, done, runCount, resid;
992
ccInstance *myInstance=NULL,
999
time_t op_start, op_timer;
1001
ncInstance *outInst=NULL;
1005
op_start = time(NULL);
1006
op_timer = OP_TIMEOUT;
1012
logprintfl(EUCADEBUG,"RunInstances(): called\n");
1016
if (minCount <= 0 || maxCount <= 0 || instIdsLen < maxCount) {
1017
logprintfl(EUCAERROR,"RunInstances(): bad min or max count, or not enough instIds (%d, %d, %d)\n", minCount, maxCount, instIdsLen);
1021
retInsts = malloc(sizeof(ccInstance) * maxCount);
1024
// get updated resource information
1025
rc = refresh_resources(ccMeta, OP_TIMEOUT - (time(NULL) - op_start));
1027
for (i=0; i<maxCount; i++) {
1029
char mac[32], privip[32], pubip[32];
1032
logprintfl(EUCAINFO,"\trunning instance %d with emiId %s...\n", i, amiId);
1039
strncpy(pubip, "0.0.0.0", 32);
1040
strncpy(privip, "0.0.0.0", 32);
1041
strncpy(mac, macAddrs[i], 32);
1043
sem_wait(vnetConfigLock);
1045
// define/get next mac and allocate IP
1046
if (!strcmp(vnetconfig->mode, "STATIC")) {
1047
// get the next valid mac/ip pairing for this vlan
1049
rc = vnetGetNextHost(vnetconfig, mac, privip, 0);
1053
} else if (!strcmp(vnetconfig->mode, "SYSTEM")) {
1055
} else if (!strcmp(vnetconfig->mode, "MANAGED") || !strcmp(vnetconfig->mode, "MANAGED-NOVLAN")) {
1057
// add the mac address to the virtual network
1058
rc = vnetAddHost(vnetconfig, mac, NULL, vlan);
1060
// get the next valid mac/ip pairing for this vlan
1061
rc = vnetGetNextHost(vnetconfig, mac, privip, vlan);
1067
sem_post(vnetConfigLock);
1069
logprintfl(EUCAINFO,"\tassigning MAC/IP: %s/%s\n", mac, privip);
1071
if (mac[0] == '\0' || !foundnet) {
1072
logprintfl(EUCAERROR,"could not find any free network address, failing doRunInstances()\n");
1074
// "run" the instance
1075
instId = strdup(instIds[i]);
1076
ncvm.memorySize = ccvm->mem;
1077
ncvm.diskSize = ccvm->disk;
1078
ncvm.numberOfCores = ccvm->cores;
1080
sem_wait(configLock);
1083
rc = schedule_instance(ccvm, &resid);
1085
res = &(config->resourcePool[resid]);
1087
// could not find resource
1088
logprintfl(EUCAERROR, "scheduler could not find resource to run the instance on\n");
1089
// couldn't run this VM, remove networking information from system
1090
sem_wait(vnetConfigLock);
1092
vnetDisableHost(vnetconfig, mac, NULL, 0);
1093
if (!strcmp(vnetconfig->mode, "MANAGED") || !strcmp(vnetconfig->mode, "MANAGED-NOVLAN")) {
1094
vnetDelHost(vnetconfig, mac, NULL, vlan);
1097
sem_post(vnetConfigLock);
1099
int pid, status, ret, rbytes;
1102
// try to run the instance on the chosen resource
1103
logprintfl(EUCAINFO, "\tscheduler decided to run instance '%s' on resource '%s'\n", instId, res->ncService);
1110
ncs = ncStubCreate(res->ncService, NULL, NULL);
1111
if (config->use_wssec) {
1112
rc = InitWSSEC(ncs->env, ncs->stub, config->policyFile);
1114
logprintfl(EUCAINFO,"\tclient (%s) running instance: %s %s %s %s %d %s\n", res->ncService, instId, amiId, mac, mac, vlan, keyName);
1115
logprintfl(EUCAINFO,"\tasking for virtual hardware (mem/disk/cores): %d/%d/%d\n", ncvm.memorySize, ncvm.diskSize, ncvm.numberOfCores);
1116
rc = ncRunInstanceStub(ncs, ccMeta, instId, reservationId, &ncvm, amiId, amiURL, kernelId, kernelURL, ramdiskId, ramdiskURL, keyName, mac, mac, vlan, userData, launchIndex, netNames, netNamesLen, &outInst);
1118
rc = write(filedes[1], outInst, sizeof(ncInstance));
1127
outInst = malloc(sizeof(ncInstance));
1128
op_timer = OP_TIMEOUT - (time(NULL) - op_start);
1129
logprintfl(EUCADEBUG, "\ttime left for op: %d\n", op_timer / (maxCount - i));
1130
rbytes = timeread(filedes[0], outInst, sizeof(ncInstance), op_timer / (maxCount - i));
1139
rc = WEXITSTATUS(status);
1141
logprintfl(EUCAINFO,"\tcall complete (pid/rc): %d/%d\n", pid, rc);
1145
logprintfl(EUCAERROR, "tried to run the VM, but runInstance() failed; marking resource '%s' as down\n", res->ncService);
1148
// couldn't run this VM, remove networking information from system
1149
sem_wait(vnetConfigLock);
1150
vnetDisableHost(vnetconfig, mac, NULL, 0);
1151
if (!strcmp(vnetconfig->mode, "MANAGED") || !strcmp(vnetconfig->mode, "MANAGED-NOVLAN")) {
1152
vnetDelHost(vnetconfig, mac, NULL, vlan);
1154
sem_post(vnetConfigLock);
1156
res->availMemory -= ccvm->mem;
1157
res->availDisk -= ccvm->disk;
1158
res->availCores -= ccvm->cores;
1160
myInstance = &(retInsts[runCount]);
1162
bzero(myInstance, sizeof(ccInstance));
1165
rc = ccInstance_to_ncInstance(myInstance, outInst);
1168
strncpy(myInstance->instanceId, outInst->instanceId, 16);
1169
strncpy(myInstance->reservationId, outInst->reservationId, 16);
1170
strncpy(myInstance->ownerId, outInst->userId, 16);
1171
strncpy(myInstance->amiId, outInst->imageId, 16);
1172
strncpy(myInstance->kernelId, outInst->kernelId, 16);
1173
strncpy(myInstance->ramdiskId, outInst->ramdiskId, 16);
1174
strncpy(myInstance->launchIndex, outInst->launchIndex, 64);
1175
strncpy(myInstance->userData, outInst->userData, 64);
1176
for (i=0; i<outInst->groupNamesSize || i >= 64; i++) {
1177
snprintf(myInstance->groupNames[i], 32, "%s", outInst->groupNames[i]);
1179
strncpy(myInstance->state, outInst->stateName, 16);
1180
myInstance->ccnet.vlan = outInst->ncnet.vlan;
1181
strncpy(myInstance->ccnet.publicMac, outInst->ncnet.publicMac, 24);
1182
strncpy(myInstance->ccnet.privateMac, outInst->ncnet.privateMac, 24);
1183
if (strcmp(pubip, "0.0.0.0")) {
1184
strncpy(myInstance->ccnet.publicIp, pubip, 16);
1186
strncpy(myInstance->ccnet.publicIp, outInst->ncnet.publicIp, 16);
1189
if (strcmp(privip, "0.0.0.0")) {
1190
strncpy(myInstance->ccnet.privateIp, privip, 16);
1192
strncpy(myInstance->ccnet.privateIp, outInst->ncnet.privateIp, 16);
1196
// instance info that CC has
1197
myInstance->ts = time(NULL);
1198
if (strcmp(pubip, "0.0.0.0")) {
1199
strncpy(myInstance->ccnet.publicIp, pubip, 16);
1201
if (strcmp(privip, "0.0.0.0")) {
1202
strncpy(myInstance->ccnet.privateIp, privip, 16);
1204
myInstance->ncHostIdx = resid;
1205
if (ccvm) memcpy(&(myInstance->ccvm), ccvm, sizeof(virtualMachine));
1206
if (config->resourcePool[resid].ncService) strncpy(myInstance->serviceTag, config->resourcePool[resid].ncService, 64);
1207
// if (kernelId) strncpy(myInstance->kernelId, kernelId, 16);
1208
// if (ramdiskId) strncpy(myInstance->ramdiskId, ramdiskId, 16);
1209
// if (userData) strncpy(myInstance->userData, userData, 64);
1210
// if (launchIndex) strncpy(myInstance->launchIndex, launchIndex, 64);
1214
for (i=0; i<netNamesLen; i++) {
1216
if (netNames[i]) snprintf(myInstance->groupNames[i], 32, "%s", netNames[i]);
1221
rc = vnetKickDHCP(vnetconfig);
1223
logprintfl(EUCAERROR, "cannot start DHCP daemon, please check your network settings\n");
1226
// add the instance to the cache, and continue on
1227
add_instanceCache(myInstance->instanceId, myInstance);
1228
free_instance(&outInst);
1231
sem_post(configLock);
1235
*outInstsLen = runCount;
1236
*outInsts = retInsts;
1238
logprintfl(EUCADEBUG,"RunInstances(): done\n");
1241
if (instId) free(instId);
1245
int doGetConsoleOutput(ncMetadata *meta, char *instId, char **outConsoleOutput) {
1246
int i, j, rc, numInsts, start, stop, k, done, ret;
1247
ccInstance *myInstance;
1249
char *consoleOutput;
1250
time_t op_start, op_timer;
1252
i = j = numInsts = 0;
1253
op_start = time(NULL);
1254
op_timer = OP_TIMEOUT;
1258
*outConsoleOutput = NULL;
1265
logprintfl(EUCADEBUG,"GetConsoleOutput(): called\n");
1267
rc = find_instanceCacheId(instId, &myInstance);
1269
// found the instance in the cache
1270
start = myInstance->ncHostIdx;
1275
stop = config->numResources;
1278
sem_wait(configLock);
1280
for (j=start; j<stop && !done; j++) {
1281
// read the instance ids
1282
logprintfl(EUCAINFO,"getConsoleOutput(): calling GetConsoleOutput for instance (%s) on (%s)\n", instId, config->resourcePool[j].hostname);
1284
int pid, status, ret, rbytes, len;
1290
ncs = ncStubCreate(config->resourcePool[j].ncService, NULL, NULL);
1291
if (config->use_wssec) {
1292
rc = InitWSSEC(ncs->env, ncs->stub, config->policyFile);
1295
rc = ncGetConsoleOutputStub(ncs, meta, instId, &consoleOutput);
1296
if (!rc && consoleOutput) {
1297
len = strlen(consoleOutput) + 1;
1298
rc = write(filedes[1], &len, sizeof(int));
1299
rc = write(filedes[1], consoleOutput, sizeof(char) * len);
1303
rc = write(filedes[1], &len, sizeof(int));
1310
op_timer = OP_TIMEOUT - (time(NULL) - op_start);
1311
rbytes = timeread(filedes[0], &len, sizeof(int), op_timer / ((stop-start) - (j - start)));
1318
consoleOutput = malloc(sizeof(char) * len);
1319
op_timer = OP_TIMEOUT - (time(NULL) - op_start);
1320
rbytes = timeread(filedes[0], consoleOutput, len, op_timer / ((stop-start) - (j-start)));
1328
rc = WEXITSTATUS(status);
1333
logprintfl(EUCAINFO,"\tcall complete (pid/rc): %d/%d\n", pid, rc);
1340
sem_post(configLock);
1342
logprintfl(EUCADEBUG,"GetConsoleOutput(): done.\n");
1346
if (consoleOutput) {
1347
*outConsoleOutput = strdup(consoleOutput);
1350
*outConsoleOutput = NULL;
1353
if (consoleOutput) free(consoleOutput);
1357
int doRebootInstances(ncMetadata *meta, char **instIds, int instIdsLen) {
1358
int i, j, rc, numInsts, start, stop, k, done, ret;
1360
ccInstance *myInstance, *out;
1362
time_t op_start, op_timer;
1364
i = j = numInsts = 0;
1367
op_start = time(NULL);
1368
op_timer = OP_TIMEOUT;
1374
logprintfl(EUCADEBUG,"RebootInstances(): called\n");
1376
for (i=0; i<instIdsLen; i++) {
1377
instId = instIds[i];
1378
rc = find_instanceCacheId(instId, &myInstance);
1380
// found the instance in the cache
1381
start = myInstance->ncHostIdx;
1386
stop = config->numResources;
1389
sem_wait(configLock);
1391
for (j=start; j<stop && !done; j++) {
1392
// read the instance ids
1393
logprintfl(EUCAINFO,"RebootInstances(): calling reboot instance (%s) on (%s)\n", instId, config->resourcePool[j].hostname);
1395
int pid, status, ret, rbytes;
1398
ncs = ncStubCreate(config->resourcePool[j].ncService, NULL, NULL);
1399
if (config->use_wssec) {
1400
rc = InitWSSEC(ncs->env, ncs->stub, config->policyFile);
1404
rc = ncRebootInstanceStub(ncs, meta, instId);
1413
op_timer = OP_TIMEOUT - (time(NULL) - op_start);
1414
rc = timewait(pid, &status, op_timer / ((stop-start) - (j-start)));
1415
rc = WEXITSTATUS(status);
1416
logprintfl(EUCAINFO,"\tcall complete (pid/rc): %d/%d\n", pid, rc);
1419
sem_post(configLock);
1427
logprintfl(EUCADEBUG,"RebootInstances(): done.\n");
1434
int doTerminateInstances(ncMetadata *ccMeta, char **instIds, int instIdsLen, int **outStatus) {
1435
int i, j, shutdownState, previousState, rc, start, stop, k, done;
1437
ccInstance *myInstance, *out;
1439
time_t op_start, op_timer;
1444
op_start = time(NULL);
1445
op_timer = OP_TIMEOUT;
1451
logprintfl(EUCADEBUG,"TerminateInstances(): called\n");
1453
for (i=0; i<instIdsLen; i++) {
1454
instId = instIds[i];
1455
rc = find_instanceCacheId(instId, &myInstance);
1457
// found the instance in the cache
1458
start = myInstance->ncHostIdx;
1461
// remove private network info from system
1462
sem_wait(vnetConfigLock);
1464
vnetDisableHost(vnetconfig, myInstance->ccnet.privateMac, NULL, 0);
1465
if (!strcmp(vnetconfig->mode, "MANAGED") || !strcmp(vnetconfig->mode, "MANAGED-NOVLAN")) {
1466
vnetDelHost(vnetconfig, myInstance->ccnet.privateMac, NULL, myInstance->ccnet.vlan);
1469
sem_post(vnetConfigLock);
1471
if (myInstance) free(myInstance);
1474
stop = config->numResources;
1477
sem_wait(configLock);
1478
for (j=start; j<stop; j++) {
1479
// read the instance ids
1481
logprintfl(EUCAINFO,"TerminateInstances(): calling terminate instance (%s) on (%s)\n", instId, config->resourcePool[j].hostname);
1483
int pid, status, ret, rbytes;
1489
ncs = ncStubCreate(config->resourcePool[j].ncService, NULL, NULL);
1490
if (config->use_wssec) {
1491
rc = InitWSSEC(ncs->env, ncs->stub, config->policyFile);
1493
rc = ncTerminateInstanceStub(ncs, ccMeta, instId, &shutdownState, &previousState);
1506
op_timer = OP_TIMEOUT - (time(NULL) - op_start);
1507
rc = timewait(pid, &status, op_timer / ((stop-start) - (j - start)));
1508
rc = WEXITSTATUS(status);
1509
logprintfl(EUCADEBUG,"\tcall complete (pid/rc): %d/%d\n", pid, rc);
1512
sem_post(configLock);
1515
del_instanceCacheId(instId);
1516
(*outStatus)[i] = 1;
1517
logprintfl(EUCAWARN, "failed to terminate '%s': instance may not exist any longer\n", instId);
1519
(*outStatus)[i] = 0;
1524
rc = refresh_resources(ccMeta, OP_TIMEOUT - (time(NULL) - op_start));
1526
logprintfl(EUCADEBUG,"TerminateInstances(): done.\n");
1533
int setup_shared_buffer(void **buf, char *bufname, size_t bytes, sem_t **lock, char *lockname) {
1537
// create a lock and grab it
1538
*lock = sem_open(lockname, O_CREAT, 0644, 1);
1541
// set up shared memory segment for config
1542
shd = shm_open(bufname, O_CREAT | O_RDWR | O_EXCL, 0644);
1544
// if this is the first process to create the config, init to 0
1545
rc = ftruncate(shd, bytes);
1547
shd = shm_open(bufname, O_CREAT | O_RDWR, 0644);
1550
printf("cannot initialize shared memory segment\n");
1555
*buf = mmap(0, bytes, PROT_READ | PROT_WRITE, MAP_SHARED, shd, 0);
1560
int sem_timepost(sem_t *sem) {
1564
// sem_getvalue(sem, &rc);
1565
// logprintfl(EUCADEBUG, "dropped sem %d %d %08X\n", getpid(), rc, sem);
1570
int sem_timewait(sem_t *sem, time_t seconds) {
1574
to.tv_sec = time(NULL) + seconds + 1;
1577
rc = sem_timedwait(sem, &to);
1580
logprintfl(EUCAERROR, "timeout waiting for semaphore\n");
1586
int init_config(void) {
1588
char *tmpstr=NULL, **hosts=NULL, *hostname=NULL, *ncservice=NULL, *dhcp_deamon;
1589
int ncport, rd, shd, val, rc, i, numHosts, tcount, use_wssec, loglevel, schedPolicy;
1591
char configFile[1024], netPath[1024], logFile[1024], eucahome[1024], policyFile[1024], buf[1024], *home=NULL, cmd[256];
1593
axutil_env_t *env = NULL;
1600
initLock = sem_open("/eucalyptusCCinitLock", O_CREAT, 0644, 1);
1603
if (config == NULL) {
1604
rc = setup_shared_buffer((void **)&config, "/eucalyptusCCConfig", sizeof(ccConfig), &configLock, "/eucalyptusCCConfigLock");
1606
fprintf(stderr, "Cannot set up shared memory region for ccConfig, exiting...\n");
1612
if (instanceCache == NULL) {
1613
rc = setup_shared_buffer((void **)&instanceCache, "/eucalyptusCCInstanceCache", sizeof(ccInstance) * MAXINSTANCES, &instanceCacheLock, "/eucalyptusCCInstanceCacheLock");
1615
fprintf(stderr, "Cannot set up shared memory region for ccInstanceCache, exiting...\n");
1621
if (vnetconfig == NULL) {
1622
rc = setup_shared_buffer((void **)&vnetconfig, "/eucalyptusCCVNETConfig", sizeof(vnetConfig), &vnetConfigLock, "/eucalyptusCCVNETConfigLock");
1624
fprintf(stderr, "Cannot set up shared memory region for ccVNETConfig, exiting...\n");
1632
// read in base config information
1633
home = strdup(getenv(EUCALYPTUS_ENV_VAR_NAME));
1638
bzero(configFile, 1024);
1639
bzero(netPath, 1024);
1640
bzero(logFile, 1024);
1641
bzero(policyFile, 1024);
1643
snprintf(configFile, 1024, EUCALYPTUS_CONF_LOCATION, home);
1644
snprintf(netPath, 1024, CC_NET_PATH_DEFAULT, home);
1645
snprintf(logFile, 1024, "%s/var/log/eucalyptus/cc.log", home);
1646
snprintf(policyFile, 1024, "%s/var/eucalyptus/keys/nc-client-policy.xml", home);
1647
snprintf(eucahome, 1024, "%s/", home);
1650
// now start reading the config file
1651
rc = get_conf_var(configFile, "LOGLEVEL", &tmpstr);
1653
loglevel = EUCADEBUG;
1655
if (!strcmp(tmpstr,"DEBUG")) {loglevel=EUCADEBUG;}
1656
else if (!strcmp(tmpstr,"INFO")) {loglevel=EUCAINFO;}
1657
else if (!strcmp(tmpstr,"WARN")) {loglevel=EUCAWARN;}
1658
else if (!strcmp(tmpstr,"ERROR")) {loglevel=EUCAERROR;}
1659
else if (!strcmp(tmpstr,"FATAL")) {loglevel=EUCAFATAL;}
1660
else {loglevel=EUCADEBUG;}
1662
if (tmpstr) free(tmpstr);
1665
logfile(logFile, loglevel);
1667
logprintfl(EUCADEBUG,"init_config(): initializing CC configutation\n");
1669
// DHCP configuration section
1679
*pubSubnetMask=NULL,
1680
*pubBroadcastAddress=NULL,
1686
*privSubnetMask=NULL,
1687
*privBroadcastAddress=NULL;
1690
// DHCP Daemon Configuration Params
1691
daemon = getConfString(configFile, "VNET_DHCPDAEMON");
1693
logprintfl(EUCAWARN,"no VNET_DHCPDAEMON defined in config, using default\n");
1697
dhcpuser = getConfString(configFile, "VNET_DHCPUSER");
1699
dhcpuser = strdup("root");
1702
pubmode = getConfString(configFile, "VNET_MODE");
1704
logprintfl(EUCAWARN,"VNET_MODE is not defined, defaulting to 'SYSTEM'\n");
1705
pubmode = strdup("SYSTEM");
1708
pubInterface = getConfString(configFile, "VNET_INTERFACE");
1709
if (!pubInterface) {
1710
logprintfl(EUCAWARN,"VNET_INTERFACE is not defined, defaulting to 'eth0'\n");
1711
pubInterface = strdup("eth0");
1714
if (!strcmp(pubmode, "STATIC")) {
1715
pubSubnet = getConfString(configFile, "VNET_SUBNET");
1716
pubSubnetMask = getConfString(configFile, "VNET_NETMASK");
1717
pubBroadcastAddress = getConfString(configFile, "VNET_BROADCAST");
1718
pubRouter = getConfString(configFile, "VNET_ROUTER");
1719
pubDNS = getConfString(configFile, "VNET_DNS");
1720
pubmacmap = getConfString(configFile, "VNET_MACMAP");
1722
if (!pubSubnet || !pubSubnetMask || !pubBroadcastAddress || !pubRouter || !pubDNS || !pubmacmap) {
1723
logprintfl(EUCAFATAL,"in 'STATIC' network mode, you must specify values for 'VNET_SUBNET, VNET_NETMASK, VNET_BROADCAST, VNET_ROUTER, VNET_DNS, and VNET_MACMAP'\n");
1727
} else if (!strcmp(pubmode, "MANAGED") || !strcmp(pubmode, "MANAGED-NOVLAN")) {
1728
numaddrs = getConfString(configFile, "VNET_ADDRSPERNET");
1729
pubSubnet = getConfString(configFile, "VNET_SUBNET");
1730
pubSubnetMask = getConfString(configFile, "VNET_NETMASK");
1731
pubDNS = getConfString(configFile, "VNET_DNS");
1732
pubips = getConfString(configFile, "VNET_PUBLICIPS");
1733
if (!pubSubnet || !pubSubnetMask || !pubDNS || !numaddrs) {
1734
logprintfl(EUCAFATAL,"in 'MANAGED' or 'MANAGED-NOVLAN' network mode, you must specify values for 'VNET_SUBNET, VNET_NETMASK, VNET_ADDRSPERNET, and VNET_DNS'\n");
1740
logprintfl(EUCAFATAL, "bad network parameters, must fix before system will work\n");
1744
sem_wait(vnetConfigLock);
1746
vnetInit(vnetconfig, pubmode, eucahome, netPath, CLC, pubInterface, numaddrs, pubSubnet, pubSubnetMask, pubBroadcastAddress, pubDNS, pubRouter, daemon, dhcpuser, NULL);
1748
vnetAddDev(vnetconfig, vnetconfig->pubInterface);
1751
char *mac=NULL, *ip=NULL, *ptra=NULL, *toka=NULL, *ptrb=NULL, *tokb=NULL;
1752
toka = strtok_r(pubmacmap, " ", &ptra);
1755
mac = strtok_r(toka, "=", &ptrb);
1756
ip = strtok_r(NULL, "=", &ptrb);
1758
vnetAddHost(vnetconfig, mac, ip, 0);
1760
toka = strtok_r(NULL, " ", &ptra);
1762
vnetGenerateDHCP(vnetconfig);
1763
vnetKickDHCP(vnetconfig);
1764
} else if (pubips) {
1765
char *ip, *ptra, *toka;
1766
toka = strtok_r(pubips, " ", &ptra);
1770
rc = vnetAddPublicIP(vnetconfig, ip);
1772
logprintfl(EUCAERROR, "could not add public IP '%s'\n", ip);
1775
toka = strtok_r(NULL, " ", &ptra);
1779
// vnetPrintNets(vnetconfig);
1780
sem_post(vnetConfigLock);
1783
rc = get_conf_var(configFile, CONFIG_NC_SERVICE, &tmpstr);
1786
logprintfl(EUCAFATAL,"parsing config file (%s) for NC_SERVICE\n", configFile);
1789
ncservice = strdup(tmpstr);
1791
if (tmpstr) free(tmpstr);
1793
rc = get_conf_var(configFile, "SCHEDPOLICY", &tmpstr);
1796
logprintfl(EUCAWARN,"parsing config file (%s) for SCHEDPOLICY, defaulting to GREEDY\n", configFile);
1797
schedPolicy = SCHEDGREEDY;
1799
if (!strcmp(tmpstr, "GREEDY")) schedPolicy = SCHEDGREEDY;
1800
else if (!strcmp(tmpstr, "ROUNDROBIN")) schedPolicy = SCHEDROUNDROBIN;
1801
else schedPolicy = SCHEDGREEDY;
1803
if (tmpstr) free(tmpstr);
1805
rc = get_conf_var(configFile, CONFIG_NC_PORT, &tmpstr);
1808
logprintfl(EUCAFATAL,"parsing config file (%s) for NC_PORT\n", configFile);
1811
ncport = atoi(tmpstr);
1813
if (tmpstr) free(tmpstr);
1815
rc = get_conf_var(configFile, "ENABLE_WS_SECURITY", &tmpstr);
1818
logprintfl(EUCAFATAL,"parsing config file (%s) for ENABLE_WS_SECURITY\n", configFile);
1821
if (!strcmp(tmpstr, "Y")) {
1827
if (tmpstr) free(tmpstr);
1829
rc = get_conf_var(configFile, CONFIG_NODES, &tmpstr);
1832
logprintfl(EUCAFATAL,"parsing config file (%s) for NODES\n", configFile);
1835
hosts = from_var_to_char_list(tmpstr);
1836
if (hosts == NULL) {
1837
logprintfl(EUCAFATAL,"parsing config file (%s) for NODES from substring (%s)\n", configFile, tmpstr);
1838
if (tmpstr) free(tmpstr);
1844
while(hosts[i] != NULL) {
1846
res = realloc(res, sizeof(resource) * numHosts);
1847
strncpy(res[numHosts-1].hostname, hosts[i], 96);
1848
snprintf(res[numHosts-1].ncService, 128, "http://%s:%d/%s", hosts[i], ncport, ncservice);
1853
if (hosts) free(hosts);
1854
if (tmpstr) free(tmpstr);
1856
sem_wait(configLock);
1857
// set up the current config
1858
strncpy(config->eucahome, eucahome, 1024);
1859
strncpy(config->policyFile, policyFile, 1024);
1860
config->use_wssec = use_wssec;
1861
config->schedPolicy = schedPolicy;
1862
config->numResources = numHosts;
1863
memcpy(config->resourcePool, res, sizeof(resource) * numHosts);
1865
config->lastResourceUpdate = 0;
1866
config->instanceCacheUpdate = time(NULL);
1867
config->initialized = 1;
1869
sem_post(configLock);
1871
logprintfl(EUCADEBUG,"init_config(): done\n");
1880
// clean up any orphaned child processes
1882
p = waitpid(-1, &status, WNOHANG);
1884
if (time(NULL) - config->instanceCacheUpdate > 86400) {
1885
config->instanceCacheUpdate = time(NULL);
1888
// deadlock detection
1889
// rc = sem_getvalue(configLock,&status);
1892
int timeread(int fd, void *buf, size_t bytes, int timeout) {
1897
if (timeout <= 0) timeout = 1;
1902
tv.tv_sec = timeout;
1905
rc = select(fd+1, &rfds, NULL, NULL, &tv);
1908
logprintfl(EUCAERROR, "select() timed out for read: timeout=%d\n", timeout);
1911
rc = read(fd, buf, bytes);
1915
pid_t timewait(pid_t pid, int *status, int timeout) {
1919
if (timeout <= 0) timeout = 1;
1922
rc = waitpid(pid, status, WNOHANG);
1923
while(rc <= 0 && timer < (timeout * 1000000)) {
1926
rc = waitpid(pid, status, WNOHANG);
1929
logprintfl(EUCAERROR, "waitpid() timed out: pid=%d\n", pid);
1934
int allocate_ccInstance(ccInstance *out, char *id, char *amiId, char *kernelId, char *ramdiskId, char *amiURL, char *kernelURL, char *ramdiskURL, char *ownerId, char *state, time_t ts, char *reservationId, netConfig *ccnet, virtualMachine *ccvm, int ncHostIdx, char *keyName, char *serviceTag, char *userData, char *launchIndex, char groupNames[][32], ncVolume *volumes, int volumesSize) {
1936
bzero(out, sizeof(ccInstance));
1937
if (id) strncpy(out->instanceId, id, 16);
1938
if (amiId) strncpy(out->amiId, amiId, 16);
1939
if (kernelId) strncpy(out->kernelId, kernelId, 16);
1940
if (ramdiskId) strncpy(out->ramdiskId, ramdiskId, 16);
1942
if (amiURL) strncpy(out->amiURL, amiURL, 64);
1943
if (kernelURL) strncpy(out->kernelURL, kernelURL, 64);
1944
if (ramdiskURL) strncpy(out->ramdiskURL, ramdiskURL, 64);
1946
if (state) strncpy(out->state, state, 16);
1947
if (ownerId) strncpy(out->ownerId, ownerId, 16);
1948
if (reservationId) strncpy(out->reservationId, reservationId, 16);
1949
if (keyName) strncpy(out->keyName, keyName, 1024);
1951
out->ncHostIdx = ncHostIdx;
1952
if (serviceTag) strncpy(out->serviceTag, serviceTag, 64);
1953
if (userData) strncpy(out->userData, userData, 64);
1954
if (launchIndex) strncpy(out->launchIndex, launchIndex, 64);
1957
for (i=0; i<64; i++) {
1958
if (groupNames[i]) {
1959
strncpy(out->groupNames[i], groupNames[i], 32);
1965
memcpy(out->volumes, volumes, sizeof(ncVolume) * EUCA_MAX_VOLUMES);
1967
out->volumesSize = volumesSize;
1969
if (ccnet) allocate_netConfig(&(out->ccnet), ccnet->privateMac, ccnet->publicMac, ccnet->privateIp, ccnet->publicIp, ccnet->vlan);
1970
if (ccvm) allocate_virtualMachine(&(out->ccvm), ccvm->mem, ccvm->disk, ccvm->cores, ccvm->name);
1975
int allocate_netConfig(netConfig *out, char *pvMac, char *pbMac, char *pvIp, char *pbIp, int vlan) {
1977
if (pvMac) strncpy(out->privateMac,pvMac,24);
1978
if (pbMac) strncpy(out->publicMac,pbMac,24);
1979
if (pvIp) strncpy(out->privateIp,pvIp,24);
1980
if (pbIp) strncpy(out->publicIp,pbIp,24);
1986
int allocate_virtualMachine(virtualMachine *out, int mem, int disk, int cores, char *name) {
1991
snprintf(out->name, 64, "%s", name);
1996
void print_instanceCache(void) {
1998
for (i=0; i<MAXINSTANCES; i++) {
1999
if (instanceCache[i].instanceId[0] != '\0') {
2000
logprintfl(EUCADEBUG,"\tcache: %s\n", instanceCache[i].instanceId);
2005
void invalidate_instanceCache(void) {
2007
for (i=0; i<MAXINSTANCES; i++) {
2008
if (instanceCache[i].instanceId[0] != '\0') {
2010
bzero(&(instanceCache[i]), sizeof(ccInstance));
2015
int refresh_instanceCache(char *instanceId, ccInstance *in){
2016
int i, done, firstNull;
2018
if (!instanceId || !in) {
2023
for (i=0; i<MAXINSTANCES && !done; i++) {
2024
if (instanceCache[i].instanceId[0] != '\0') {
2025
if (!strcmp(instanceCache[i].instanceId, instanceId)) {
2027
logprintfl(EUCADEBUG, "refreshing instance '%s'\n", instanceId);
2028
memcpy(&(instanceCache[i]), in, sizeof(ccInstance));
2036
int add_instanceCache(char *instanceId, ccInstance *in){
2037
int i, done, firstNull=0;
2039
if (!instanceId || !in) {
2044
for (i=0; i<MAXINSTANCES && !done; i++) {
2045
if (instanceCache[i].instanceId[0] != '\0') {
2046
if (!strcmp(instanceCache[i].instanceId, instanceId)) {
2057
allocate_ccInstance(&(instanceCache[firstNull]), in->instanceId, in->amiId, in->kernelId, in->ramdiskId, in->amiURL, in->kernelURL, in->ramdiskURL, in->ownerId, in->state, in->ts, in->reservationId, &(in->ccnet), &(in->ccvm), in->ncHostIdx, in->keyName, in->serviceTag, in->userData, in->launchIndex, in->groupNames, in->volumes, in->volumesSize);
2061
int del_instanceCacheId(char *instanceId) {
2064
for (i=0; i<MAXINSTANCES; i++) {
2065
if (instanceCache[i].instanceId[0] != '\0') {
2066
if (!strcmp(instanceCache[i].instanceId, instanceId)) {
2068
bzero(&(instanceCache[i]), sizeof(ccInstance));
2076
int find_instanceCacheId(char *instanceId, ccInstance **out) {
2079
if (!instanceId || !out) {
2085
for (i=0; i<MAXINSTANCES && !done; i++) {
2086
if (instanceCache[i].instanceId[0] != '\0') {
2087
if (!strcmp(instanceCache[i].instanceId, instanceId)) {
2089
*out = malloc(sizeof(ccInstance));
2090
allocate_ccInstance(*out, instanceCache[i].instanceId,instanceCache[i].amiId, instanceCache[i].kernelId, instanceCache[i].ramdiskId, instanceCache[i].amiURL, instanceCache[i].kernelURL, instanceCache[i].ramdiskURL, instanceCache[i].ownerId, instanceCache[i].state,instanceCache[i].ts, instanceCache[i].reservationId, &(instanceCache[i].ccnet), &(instanceCache[i].ccvm), instanceCache[i].ncHostIdx, instanceCache[i].keyName, instanceCache[i].serviceTag, instanceCache[i].userData, instanceCache[i].launchIndex, instanceCache[i].groupNames, instanceCache[i].volumes, instanceCache[i].volumesSize);
2101
int find_instanceCacheIP(char *ip, ccInstance **out) {
2110
for (i=0; i<MAXINSTANCES && !done; i++) {
2111
if (instanceCache[i].ccnet.publicIp[0] != '\0' || instanceCache[i].ccnet.privateIp[0] != '\0') {
2112
if (!strcmp(instanceCache[i].ccnet.publicIp, ip) || !strcmp(instanceCache[i].ccnet.privateIp, ip)) {
2114
*out = malloc(sizeof(ccInstance));
2115
allocate_ccInstance(*out, instanceCache[i].instanceId,instanceCache[i].amiId, instanceCache[i].kernelId, instanceCache[i].ramdiskId, instanceCache[i].amiURL, instanceCache[i].kernelURL, instanceCache[i].ramdiskURL, instanceCache[i].ownerId, instanceCache[i].state,instanceCache[i].ts, instanceCache[i].reservationId, &(instanceCache[i].ccnet), &(instanceCache[i].ccvm), instanceCache[i].ncHostIdx, instanceCache[i].keyName, instanceCache[i].serviceTag, instanceCache[i].userData, instanceCache[i].launchIndex, instanceCache[i].groupNames, instanceCache[i].volumes, instanceCache[i].volumesSize);