[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Condor-users] running VMware VIX job with Condor



HI,

I have test.c VMware VIX script in execution node which look for running vm and if there is no running vm then it start a fedora vm.

the test.c:

#include <stdio.h>
#include <stdlib.h>


#include "vix.h"

#define CONNTYPE VIX_SERVICEPROVIDER_VMWARE_PLAYER

#define HOSTNAME NULL

#define HOSTPORT 0
#define USERNAME NULL
#define PASSWORD NULL

#define VM_NUMBER 4

int vmHandleIndex = 0;
int runningVMCount = 0;
VixHandle   hostHandle = VIX_INVALID_HANDLE;

char *runningVM[VM_NUMBER];

static void find_runningVM(VixHandle jobHandle,VixEventType ev,VixHandle moreEvInfo,void *cd)
{
    VixError err = VIX_OK;
    char *loc = NULL;

    if (VIX_EVENTTYPE_FIND_ITEM != ev) {
        return;
    }

    if (runningVMCount < VM_NUMBER) {
    err = Vix_GetProperties(moreEvInfo,VIX_PROPERTY_FOUND_ITEM_LOCATION,&loc,VIX_PROPERTY_NONE);
    if (VIX_SUCCEEDED(err)) {
    runningVM[runningVMCount] = loc;
    runningVMCount++;

    } else {
        fprintf(stderr,"GetProperties failed (%s)\n",Vix_GetErrorText(err, NULL));
    }
    } else {
        fprintf(stderr, "Warning: found too many virtual machines!\n");
    }
}

int main(int argc, char **argv)
{
    VixError    err;
    VixHandle   jobHandle = VIX_INVALID_HANDLE;
    VixHandle   vmHandle = VIX_INVALID_HANDLE;
    int i;

    jobHandle = VixHost_Connect(VIX_API_VERSION,CONNTYPE,HOSTNAME,HOSTPORT,USERNAME,PASSWORD,0,VIX_INVALID_HANDLE,NULL,NULL);
    err = VixJob_Wait(jobHandle,VIX_PROPERTY_JOB_RESULT_HANDLE,&hostHandle,VIX_PROPERTY_NONE);
    Vix_ReleaseHandle(jobHandle);
    if (VIX_FAILED(err)) {
        fprintf(stderr,"Failed to connect to host (%s)\n",Vix_GetErrorText(err, NULL));
        goto abort;
    }

    printf("About to find running virtual machines\n");

    jobHandle = VixHost_FindItems(hostHandle,VIX_FIND_RUNNING_VMS,VIX_INVALID_HANDLE, -1,find_runningVM,NULL);

    err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
    Vix_ReleaseHandle(jobHandle);
    if (VIX_FAILED(err)) {
        fprintf(stderr,"FindItems failed (%s)\n",Vix_GetErrorText(err, NULL));
        goto abort;
    }
    printf("Listing running virtual machines\n");

    printf("number of running virtual machine: %d\n", runningVMCount);
    for(i = 0; i < runningVMCount; ++i) {
        printf("%s\n",runningVM[i]);
    }
   
    if(runningVMCount > 0)
    {
        printf("can not start more virtual machine\n");
        goto abort;
    } else {
       
        printf ("about to open \n");
           jobHandle = VixVM_Open(hostHandle, "/home/condor/vmware/Fedora/Fedora.vmx",NULL,NULL);
          err = VixJob_Wait(jobHandle, VIX_PROPERTY_JOB_RESULT_HANDLE, &vmHandle, VIX_PROPERTY_NONE);
           Vix_ReleaseHandle(jobHandle);
           if (VIX_FAILED(err))
        {
                fprintf(stderr, "failed to open virtual machine (%"FMT64"d %s)\n", err,
                 Vix_GetErrorText(err, NULL));
                 goto abort;
           }
          printf ("opened (%d)\n", vmHandle);

           printf("powering on\n");
           jobHandle = VixVM_PowerOn(vmHandle,VIX_VMPOWEROP_LAUNCH_GUI,VIX_INVALID_HANDLE,NULL,NULL);
           err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
           Vix_ReleaseHandle(jobHandle);
           if (VIX_FAILED(err)) {
                 fprintf(stderr, "failed to power on virtual machine (%"FMT64"d %s)\n", err,
                     Vix_GetErrorText(err, NULL));
                 goto abort;
           }
           printf("powered on\n");
    }

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    abort:
        VixHost_Disconnect(hostHandle);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}

to compile I use a make file:

WRAPPER = -lvixAllProducts -ldl
SERVER11 = /usr/lib/vmware-vix/lib/server-1/32bit/libvix.so
WORKST60 = /usr/lib/vmware-vix/lib/ws-3/32bit/libvix.so
SERVER20 = /usr/lib/vmware-vix/lib/VIServer-2.0.0/32bit/libvix.so
WORKST65 = /usr/lib/vmware-vix/lib/Workstation-6.5.0/32bit/libvix.so
WRAPORNOT = $(WRAPPER)
VIXH = -I/usr/include/vmware-vix

all:test

test: test.c
    gcc $(VIXH) test.c -o test $(WRAPORNOT)
clean:
    rm -f test

when run on terminal it gives the following output and starts the vm:

[condor@aopcach experiment]$ ./test
About to find running virtual machines
Listing running virtual machines
number of running virtual machine: 0
about to open
opened (34603069)
powering on
powered on
[condor@aopcach experiment]$

when executed with condor using the following submit file:

Universe   = vanilla
transfer_executable = false
Executable = /home/condor/experiment/test
Log        = simple2.log
Output     = simple2.out
Error      = simple2.error
Requirements = (Machine == "aopcach.uab.es")
run_as_owner = true
copy_to_spool = false
Queue

it gives the following output without starting the vm. here submit node and execute node is same:

[condor@aopcach ~]$ cat simple2.out
About to find running virtual machines
Listing running virtual machines
number of running virtual machine: 0
about to open
opened (35651645)
powering on
[condor@aopcach ~]$

if I use the following submit file then the job keeps running for indefinite time:

Universe   = vanilla
transfer_executable = false
Executable = /home/condor/experiment/test
Log        = simple2.log
Output     = simple2.out
Error      = simple2.error
Requirements = (Machine == "aopcach.uab.es")
run_as_owner = true
copy_to_spool = false
should_transfer_files = YES
when_to_transfer_output = ON_EXIT
Queue

with simple C program, everything runs fine. But with VIX, I am facing the problems.

-Arindam