Skip to content

Commit

Permalink
added expiryTime and Reassign semantics (backward compatible with cur…
Browse files Browse the repository at this point in the history
…rent assign/unassign semantics)
  • Loading branch information
root committed Jan 8, 2011
2 parents 1c42690 + 8c34081 commit 05f8799
Show file tree
Hide file tree
Showing 19 changed files with 211 additions and 64 deletions.
29 changes: 24 additions & 5 deletions cluster/handlers.c
Expand Up @@ -234,11 +234,12 @@ int ncClientCall(ncMetadata *meta, int timeout, int ncLock, char *ncURL, char *n
netConfig *ncnet = va_arg(al, netConfig *);
char *userData = va_arg(al, char *);
char *launchIndex = va_arg(al, char *);
int expiryTime = va_arg(al, int);
char **netNames = va_arg(al, char **);
int netNamesLen = va_arg(al, int);
ncInstance **outInst = va_arg(al, ncInstance **);

rc = ncRunInstanceStub(ncs, meta, uuid, instId, reservationId, ncvm, imageId, imageURL, kernelId, kernelURL, ramdiskId, ramdiskURL, keyName, ncnet, userData, launchIndex, netNames, netNamesLen, outInst);
rc = ncRunInstanceStub(ncs, meta, uuid, instId, reservationId, ncvm, imageId, imageURL, kernelId, kernelURL, ramdiskId, ramdiskURL, keyName, ncnet, userData, launchIndex, expiryTime, netNames, netNamesLen, outInst);
if (timeout && outInst) {
if (!rc && *outInst) {
len = sizeof(ncInstance);
Expand Down Expand Up @@ -400,6 +401,7 @@ int ncClientCall(ncMetadata *meta, int timeout, int ncLock, char *ncURL, char *n
netConfig *ncnet = va_arg(al, netConfig *);
char *userData = va_arg(al, char *);
char *launchIndex = va_arg(al, char *);
int expiryTime = va_arg(al, int);
char **netNames = va_arg(al, char **);
int netNamesLen = va_arg(al, int);
ncInstance **outInst = va_arg(al, ncInstance **);
Expand Down Expand Up @@ -718,7 +720,7 @@ int doAssignAddress(ncMetadata *ccMeta, char *uuid, char *src, char *dst) {
logprintfl(EUCAINFO,"AssignAddress(): called\n");
logprintfl(EUCADEBUG,"AssignAddress(): params: src=%s, dst=%s\n", SP(src), SP(dst));

if (!src || !dst || !strcmp(src, "0.0.0.0") || !strcmp(dst, "0.0.0.0")) {
if (!src || !dst || !strcmp(src, "0.0.0.0")) {
logprintfl(EUCADEBUG, "AssignAddress(): bad input params\n");
return(1);
}
Expand All @@ -730,6 +732,14 @@ int doAssignAddress(ncMetadata *ccMeta, char *uuid, char *src, char *dst) {
} else {

sem_mywait(VNET);

ret = vnetReassignAddress(vnetconfig, uuid, src, dst);
if (ret) {
logprintfl(EUCAERROR, "doAssignAddress(): vnetReassignAddress() failed\n");
ret = 1;
}

/*
rc = vnetGetPublicIP(vnetconfig, src, NULL, &allocated, &addrdevno);
if (rc) {
logprintfl(EUCAERROR,"AssignAddress(): failed to retrieve publicip record %s\n", src);
Expand Down Expand Up @@ -761,10 +771,11 @@ int doAssignAddress(ncMetadata *ccMeta, char *uuid, char *src, char *dst) {
ret = 0;
}
}
*/
sem_mypost(VNET);
}

if (!ret) {
if (!ret && strcmp(dst, "0.0.0.0")) {
// everything worked, update instance cache

rc = map_instanceCache(privIpCmp, dst, pubIpSet, src);
Expand Down Expand Up @@ -830,6 +841,13 @@ int doUnassignAddress(ncMetadata *ccMeta, char *src, char *dst) {
} else {

sem_mywait(VNET);

ret = vnetReassignAddress(vnetconfig, "UNSET", src, "0.0.0.0");
if (ret) {
logprintfl(EUCAERROR, "UnassignAddress(): vnetReassignAddress() failed\n");
ret = 1;
}
/*
ret=0;
rc = vnetGetPublicIP(vnetconfig, src, NULL, &allocated, &addrdevno);
if (rc) {
Expand All @@ -856,6 +874,7 @@ int doUnassignAddress(ncMetadata *ccMeta, char *src, char *dst) {
logprintfl(EUCAWARN,"UnassignAddress(): cmd failed '%s'\n", cmd);
}
}
*/
sem_mypost(VNET);
}

Expand Down Expand Up @@ -1685,7 +1704,7 @@ int schedule_instance_greedy(virtualMachine *vm, int *outresid) {
return(0);
}

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 *networkIndexList, int networkIndexListLen, char **uuids, int uuidsLen, int minCount, int maxCount, char *ownerId, char *reservationId, virtualMachine *ccvm, char *keyName, int vlan, char *userData, char *launchIndex, char *targetNode, ccInstance **outInsts, int *outInstsLen) {
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 *networkIndexList, int networkIndexListLen, char **uuids, int uuidsLen, int minCount, int maxCount, char *ownerId, char *reservationId, virtualMachine *ccvm, char *keyName, int vlan, char *userData, char *launchIndex, int expiryTime, char *targetNode, ccInstance **outInsts, int *outInstsLen) {
int rc=0, i=0, done=0, runCount=0, resid=0, foundnet=0, error=0, networkIdx=0, nidx=0, thenidx=0;
ccInstance *myInstance=NULL,
*retInsts=NULL;
Expand Down Expand Up @@ -1851,7 +1870,7 @@ int doRunInstances(ncMetadata *ccMeta, char *amiId, char *kernelId, char *ramdis
// call StartNetwork client
rc = ncClientCall(ccMeta, OP_TIMEOUT_PERNODE, NCCALL, res->ncURL, "ncStartNetwork", uuid, NULL, 0, 0, vlan, NULL);

rc = ncClientCall(ccMeta, OP_TIMEOUT_PERNODE, NCCALL, res->ncURL, "ncRunInstance", uuid, instId, reservationId, &ncvm, amiId, amiURL, kernelId, kernelURL, ramdiskId, ramdiskURL, keyName, &ncnet, userData, launchIndex, netNames, netNamesLen, &outInst);
rc = ncClientCall(ccMeta, OP_TIMEOUT_PERNODE, NCCALL, res->ncURL, "ncRunInstance", uuid, instId, reservationId, &ncvm, amiId, amiURL, kernelId, kernelURL, ramdiskId, ramdiskURL, keyName, &ncnet, userData, launchIndex, expiryTime, netNames, netNamesLen, &outInst);

if (rc) {
sleep(1);
Expand Down
3 changes: 2 additions & 1 deletion cluster/handlers.h
Expand Up @@ -105,6 +105,7 @@ typedef struct instance_t {

char userData[4096];
char launchIndex[64];
int expiryTime;
char groupNames[64][32];

ncVolume volumes[EUCA_MAX_VOLUMES];
Expand Down Expand Up @@ -179,7 +180,7 @@ int doDescribePublicAddresses(ncMetadata *ccMeta, publicip **outAddresses, int *
int doDescribeNetworks(ncMetadata *ccMeta, char *nameserver, char **ccs, int ccsLen, vnetConfig *outvnetConfig);

int doDescribeInstances(ncMetadata *meta, char **instIds, int instIdsLen, ccInstance **outInsts, int *outInstsLen);
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 *networkIndexList, int networkIndexListLen, char **uuids, int uuidsLen, int minCount, int maxCount, char *ownerId, char *reservationId, virtualMachine *ccvm, char *keyName, int vlan, char *userData, char *launchIndex, char *targetNode, ccInstance **outInsts, int *outInstsLen);
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 *networkIndexList, int networkIndexListLen, char **uuids, int uuidsLen, int minCount, int maxCount, char *ownerId, char *reservationId, virtualMachine *ccvm, char *keyName, int vlan, char *userData, char *launchIndex, int expiryTime, char *targetNode, ccInstance **outInsts, int *outInstsLen);
int doGetConsoleOutput(ncMetadata *meta, char *instId, char **consoleOutput);
int doRebootInstances(ncMetadata *meta, char **instIds, int instIdsLen);
int doTerminateInstances(ncMetadata *meta, char **instIds, int instIdsLen, int **outStatus);
Expand Down
10 changes: 7 additions & 3 deletions cluster/server-marshal.c
Expand Up @@ -380,7 +380,7 @@ adb_DescribePublicAddressesResponse_t *DescribePublicAddressesMarshal(adb_Descri
adb_publicAddressType_set_destAddress(addr, env, ipstr);
if (ipstr) free(ipstr);
} else {
adb_publicAddressType_set_destAddress(addr, env, "");
adb_publicAddressType_set_destAddress(addr, env, "0.0.0.0");
}

adb_describePublicAddressesResponseType_add_addresses(dpart, env, addr);
Expand Down Expand Up @@ -964,14 +964,16 @@ adb_RunInstancesResponse_t *RunInstancesMarshal(adb_RunInstances_t *runInstances
adb_virtualMachineType_t *vm=NULL;

ccInstance *outInsts=NULL, *myInstance=NULL;
int minCount, maxCount, rc, outInstsLen, i, vlan, instIdsLen, netNamesLen, macAddrsLen, *networkIndexList=NULL, networkIndexListLen, uuidsLen;
int minCount, maxCount, rc, outInstsLen, i, vlan, instIdsLen, netNamesLen, macAddrsLen, *networkIndexList=NULL, networkIndexListLen, uuidsLen, expiryTime;
axis2_bool_t status=AXIS2_TRUE;
char statusMessage[256];

char *emiId, *keyName, **instIds=NULL, *reservationId, **netNames=NULL, **macAddrs=NULL, *kernelId, *ramdiskId, *emiURL, *kernelURL, *ramdiskURL, *vmName, *userData, *launchIndex, *tmp, **uuids=NULL;
ncMetadata ccMeta;

virtualMachine ccvm;

axutil_date_time_t *dt=NULL;

rit = adb_RunInstances_get_RunInstances(runInstances, env);
// ccMeta.correlationId = adb_runInstancesType_get_correlationId(rit, env);
Expand Down Expand Up @@ -1000,6 +1002,8 @@ adb_RunInstancesResponse_t *RunInstancesMarshal(adb_RunInstances_t *runInstances
}

launchIndex = adb_runInstancesType_get_launchIndex(rit, env);
dt = adb_runInstancesType_get_expiryTime(rit, env);
expiryTime = datetime_to_unix(dt, env);

vm = adb_runInstancesType_get_instanceType(rit, env);
copy_vm_type_from_adb (&ccvm, vm, env);
Expand Down Expand Up @@ -1045,7 +1049,7 @@ adb_RunInstancesResponse_t *RunInstancesMarshal(adb_RunInstances_t *runInstances

rc=1;
if (!DONOTHING) {
rc = doRunInstances(&ccMeta, emiId, kernelId, ramdiskId, emiURL, kernelURL,ramdiskURL, instIds, instIdsLen, netNames, netNamesLen, macAddrs, macAddrsLen, networkIndexList, networkIndexListLen, uuids, uuidsLen, minCount, maxCount, ccMeta.userId, reservationId, &ccvm, keyName, vlan, userData, launchIndex, NULL, &outInsts, &outInstsLen);
rc = doRunInstances(&ccMeta, emiId, kernelId, ramdiskId, emiURL, kernelURL,ramdiskURL, instIds, instIdsLen, netNames, netNamesLen, macAddrs, macAddrsLen, networkIndexList, networkIndexListLen, uuids, uuidsLen, minCount, maxCount, ccMeta.userId, reservationId, &ccvm, keyName, vlan, userData, launchIndex, expiryTime, NULL, &outInsts, &outInstsLen);
}

if (rc) {
Expand Down
123 changes: 111 additions & 12 deletions net/vnetwork.c
Expand Up @@ -1914,24 +1914,45 @@ int vnetAddPublicIP(vnetConfig *vnetconfig, char *inip) {
}

int vnetAssignAddress(vnetConfig *vnetconfig, char *src, char *dst) {
int rc=0, slashnet;
char cmd[256], *network;
int rc=0, slashnet, ret=0;
char cmd[MAX_PATH], *network;

if ((vnetconfig->role == CC || vnetconfig->role == CLC) && (!strcmp(vnetconfig->mode, "MANAGED") || !strcmp(vnetconfig->mode, "MANAGED-NOVLAN"))) {

snprintf(cmd, 255, "-A PREROUTING -d %s -j DNAT --to-destination %s", src, dst);
snprintf(cmd, MAX_PATH, "%s/usr/lib/eucalyptus/euca_rootwrap ip addr add %s/32 dev %s", vnetconfig->eucahome, src, vnetconfig->pubInterface);
logprintfl(EUCADEBUG,"vnetAssignAddress(): running cmd %s\n", cmd);
rc = system(cmd);
rc = rc>>8;
if (rc && (rc != 2)) {
logprintfl(EUCAERROR,"vnetAssignAddress(): failed to assign IP address '%s'\n", cmd);
ret = 1;
}

snprintf(cmd, MAX_PATH, "-A PREROUTING -d %s -j DNAT --to-destination %s", src, dst);
rc = vnetApplySingleTableRule(vnetconfig, "nat", cmd);
snprintf(cmd, 255, "-A OUTPUT -d %s -j DNAT --to-destination %s", src, dst);
if (rc) {
logprintfl(EUCAERROR,"vnetAssignAddress(): failed to apply DNAT rule '%s'\n", cmd);
ret = 1;
}
snprintf(cmd, MAX_PATH, "-A OUTPUT -d %s -j DNAT --to-destination %s", src, dst);
rc = vnetApplySingleTableRule(vnetconfig, "nat", cmd);
if (rc) {
logprintfl(EUCAERROR,"vnetAssignAddress(): failed to apply DNAT rule '%s'\n", cmd);
ret = 1;
}

slashnet = 32 - ((int)log2((double)(0xFFFFFFFF - vnetconfig->nm)) + 1);
network = hex2dot(vnetconfig->nw);
// snprintf(cmd, 255, "-I POSTROUTING -s %s -d ! %s/%d -j SNAT --to-source %s", dst, network, slashnet, src);
snprintf(cmd, 255, "-I POSTROUTING -s %s -j SNAT --to-source %s", dst, src);
snprintf(cmd, MAX_PATH, "-I POSTROUTING -s %s -j SNAT --to-source %s", dst, src);
if (network) free(network);
rc = vnetApplySingleTableRule(vnetconfig, "nat", cmd);
if (rc) {
logprintfl(EUCAERROR,"vnetAssignAddress(): failed to apply SNAT rule '%s'\n", cmd);
ret = 1;
}
}
return(rc);
return(ret);
}

int vnetAllocatePublicIP(vnetConfig *vnetconfig, char *uuid, char *ip, char *dstip) {
Expand Down Expand Up @@ -1975,41 +1996,119 @@ int vnetSetPublicIP(vnetConfig *vnetconfig, char *uuid, char *ip, char *dstip, i

}

int vnetReassignAddress(vnetConfig *vnetconfig, char *uuid, char *src, char *dst) {
int done, i, isallocated, pubidx, rc;
char *currdst=NULL, cmd[MAX_PATH];

// assign address if unassigned, unassign/reassign if assigned
if (!uuid || !src) {
logprintfl(EUCAERROR, "vnetReassignAddress(): bad input params uuid=%s, src=%s, dst=%s\n", SP(uuid), SP(src), SP(dst));
return(1);
}

// get the publicIP of interest
isallocated = 0;
pubidx = 0;
currdst = NULL;
done=0;
for (i=1; i<NUMBER_OF_PUBLIC_IPS && !done; i++) {
if (vnetconfig->publicips[i].ip == dot2hex(src)) {
currdst = hex2dot(vnetconfig->publicips[i].dstip);
isallocated = vnetconfig->publicips[i].allocated;
pubidx = i;
done++;
}
}

if (!done) {
logprintfl(EUCAERROR, "vnetReassignAddress(): could not find ip %s in list of allocateable publicips\n", src);
return(1);
}

// determine if reassign must happen
if (isallocated) {
rc = vnetUnassignAddress(vnetconfig, src, currdst);
if (currdst) free(currdst);
if (rc) {
return(1);
}
}

// do the (re)assign
if (!dst || !strcmp(dst, "0.0.0.0")) {
vnetconfig->publicips[pubidx].dstip = 0;
vnetconfig->publicips[pubidx].allocated = 0;
} else {
rc = vnetAssignAddress(vnetconfig, src, dst);
if (rc) {
return(1);
}
vnetconfig->publicips[pubidx].dstip = dot2hex(dst);
vnetconfig->publicips[pubidx].allocated = 1;
}
snprintf(vnetconfig->publicips[pubidx].uuid, 48, "%s", uuid);
logprintfl(EUCADEBUG, "vnetReassignAddress(): successfully set src=%s to dst=%s with uuid=%s, allocated=%d\n", SP(src), SP(dst), SP(uuid), vnetconfig->publicips[pubidx].allocated);

return(0);
}

int vnetUnassignAddress(vnetConfig *vnetconfig, char *src, char *dst) {
int rc=0, count, slashnet;
char cmd[256], *network;
int rc=0, count, slashnet, ret=0;
char cmd[MAX_PATH], *network;

if ((vnetconfig->role == CC || vnetconfig->role == CLC) && (!strcmp(vnetconfig->mode, "MANAGED") || !strcmp(vnetconfig->mode, "MANAGED-NOVLAN"))) {

snprintf(cmd, 255, "-D PREROUTING -d %s -j DNAT --to-destination %s", src, dst);
snprintf(cmd, MAX_PATH, "%s/usr/lib/eucalyptus/euca_rootwrap ip addr del %s/32 dev %s", vnetconfig->eucahome, src, vnetconfig->pubInterface);
logprintfl(EUCADEBUG,"vnetUnassignAddress(): running cmd %s\n", cmd);
rc = system(cmd);
rc = rc>>8;
if (rc && (rc != 2)) {
logprintfl(EUCAERROR,"vnetUnassignAddress(): failed to assign IP address '%s'\n", cmd);
ret = 1;
}

snprintf(cmd, MAX_PATH, "-D PREROUTING -d %s -j DNAT --to-destination %s", src, dst);
rc = vnetApplySingleTableRule(vnetconfig, "nat", cmd);
count=0;
while(rc != 0 && count < 10) {
rc = vnetApplySingleTableRule(vnetconfig, "nat", cmd);
count++;
}
if (rc) {
logprintfl(EUCAERROR,"vnetUnassignAddress(): failed to remove DNAT rule '%s'\n", cmd);
ret = 1;
}

snprintf(cmd, 255, "-D OUTPUT -d %s -j DNAT --to-destination %s", src, dst);
snprintf(cmd, MAX_PATH, "-D OUTPUT -d %s -j DNAT --to-destination %s", src, dst);
rc = vnetApplySingleTableRule(vnetconfig, "nat", cmd);
count=0;
while(rc != 0 && count < 10) {
rc = vnetApplySingleTableRule(vnetconfig, "nat", cmd);
count++;
}
if (rc) {
logprintfl(EUCAERROR,"vnetUnassignAddress(): failed to remove DNAT rule '%s'\n", cmd);
ret = 1;
}

slashnet = 32 - ((int)log2((double)(0xFFFFFFFF - vnetconfig->nm)) + 1);
network = hex2dot(vnetconfig->nw);
// snprintf(cmd, 255, "-D POSTROUTING -s %s -d ! %s/%d -j SNAT --to-source %s", dst, network, slashnet, src);
snprintf(cmd, 255, "-D POSTROUTING -s %s -j SNAT --to-source %s", dst, src);
snprintf(cmd, MAX_PATH, "-D POSTROUTING -s %s -j SNAT --to-source %s", dst, src);
if (network) free(network);
rc = vnetApplySingleTableRule(vnetconfig, "nat", cmd);
count=0;
while(rc != 0 && count < 10) {
rc = vnetApplySingleTableRule(vnetconfig, "nat", cmd);
count++;
}
if (rc) {
logprintfl(EUCAERROR,"vnetUnassignAddress(): failed to remove SNAT rule '%s'\n", cmd);
ret = 1;
}

}
return(rc);
return(ret);
}

int vnetStopNetwork(vnetConfig *vnetconfig, int vlan, char *userName, char *netName) {
Expand Down
1 change: 1 addition & 0 deletions net/vnetwork.h
Expand Up @@ -185,6 +185,7 @@ int vnetSetPublicIP(vnetConfig *vnetconfig, char *uuid, char *ip, char *dstip, i
int vnetGetPublicIP(vnetConfig *vnetconfig, char *ip, char **dstip, int *allocated, int *addrdevno);

int vnetAssignAddress(vnetConfig *vnetconfig, char *src, char *dst);
int vnetReassignAddress(vnetConfig *vnetconfig, char *uuid, char *src, char *dst);
int vnetUnassignAddress(vnetConfig *vnetconfig, char *src, char *dst);

int vnetAddGatewayIP(vnetConfig *vnetconfig, int vlan, char *devname);
Expand Down
2 changes: 1 addition & 1 deletion node/NCclient.c
Expand Up @@ -369,7 +369,7 @@ int main (int argc, char **argv)
"", /* key */
&netparams,
// privMac, privIp, vlan,
user_data, launch_index, group_names, group_names_size, /* CC stuff */
user_data, launch_index, 0, group_names, group_names_size, /* CC stuff */
&outInst);
if (rc != 0) {
printf("ncRunInstance() failed: instanceId=%s error=%d\n", instance_id, rc);
Expand Down

0 comments on commit 05f8799

Please sign in to comment.