Add "AddDevice", "EditDevice", "DeleteDevice" functionality. - Associated GUI "Admin" page from which to add/delete/edit GIMS devices in the Database. Create some kind of app to run on the capture device host to gather stats on CPU usage and related processes used, number of users, etc.? - Would either push info to the DB, rrd file elsewhere or would provide updates on query. - Should discuss the best way to handle this. It might be best to specify an XML/RPC structure to be returned and let the implementation on each device be handled individually? At some point we need to decide when to give the user a chunk of the capture resource. On Setup? On Start? That is, we need to decide when to instantiate the experiment on the device and thus make that percentage of the total available resource unavailable for others. - The user will specify that they need a monitored link and this will be reflected in the rSpec. - We may have to determine how to extend the rSpec for this and how to get protoGENI to handle it. Ask for Rob Ricci's help with this? - It might be enough to just try to start the experiment or try to configure the experiment, and fail if there are insufficient resources. - On such a failure, we probably have to clean up after that ExperimentID. GetExperimentStatus functionality: - If experiment is running, take user to a real-time update page with graphs, stats on the data flow, CPU usage, etc. Gauges? Kind of a dashboard thing with realtime updates. GetExperimentResults functionality: - If experiment is completed, take user to a post-experiment page with links to data, statistics, etc. Have GetExperimentSettings use AJAX to get the settings and display them in the intro window's 'results' field?? On "CreateNewExperiment" submission: - Check if ExpID already exists. If it does, throw a fault. - Low priority since it's not likely to happen. On "ConfigureExperiment": - Check getExpStatus(ExpID) * If status returns "undef" 1) Add ExpID to experiment table with status 'instantiated'. 2) Configure as usual. 3) Set experiment.status to 'configured'. * If status eq 'instantiated' or status eq 'configured': 1) Configure as usual 2) Set experiment.status to "configured" on success. * If status eq 'running': 1) Throw fault that user cannot configure a running experiment. * If status eq 'done': 1) Prompt the user to choose a new ExperimentID. 2) Give option to copy the settings from the ExpID that was given. * Else 1) Set the exp_device settings for this device/ExpID pairing. 2) Configure as usual 3) Set experiment.status to "configured" on success. On "StartExperiment": - Check getExpStatus(ExpID) * If status eq 'instantiated' or 'undef' 1) Throw fault - Must configure device. * If status eq 'configured' 1) Start the exeriment. 2) Set experiment.status to "running" on success. 3) Set experment.exp_start timestamp on success. * If status eq 'running' 1) Throw fault - Experiment already running. * If status eq 'done' 1) Throw fault - Cannot start a stopped experiment? * Else 1) Return a fault XML object - no such device/ExpID pair. On "StopExperiment": - Check getExpStatus(ExpID) * If status eq 'instantiated' or 'undef' 1) Throw fault - Must configure device. * If status eq 'configured' 1) Throw fault - Cannot stop an experiment that is not running. * If status eq 'running' 1) Stop the exeriment. 2) Set experiment.status to "done". 3) Set experiment.exp_end timestamp. * If status eq 'done' 1) Throw fault - Experiment already done. * Else 1) Return a fault XML object - no such device/ExpID pair. - Call GetExperimentResults. - Display Experiment Results. On "GetExperimentSettings": - Do we want to display results in the editing GUI for users to make further changes? - Alternately we could display the results in a non-editable form of the GUI. On "GetExperimentStatus": - Create SNMP query mechanism to allow display of CPU usage and number of processes (related to capture device) for each capture device host. ###################### DONE ######################### Move the results field to below the controls. Replace the current start/stop paradigm with start/pause/stop. - Logic in software components. - Graphics in GUI Make sure that if the capture device doesn't respond to a command (e.g. never started standin.pl running) that the UI tells the user something more useful than this: "Not a GLOB reference at /usr/local/lib/perl5/site_perl/5.8.9/mach/XML/LibXML.pm line 745. at /usr/local/lib/perl5/site_perl/5.8.9/mach/XML/LibXML/SAX.pm line 80 at /usr/local/lib/perl5/site_perl/5.8.9/XML/Simple.pm line 366" In the Select Action GUI: - If the user slects an ExpID from the pulldown: 1) Have the ajax backend get the device name/location from the database. 2) Set the capture device name pulldown accordingly. In the AJAX backend: - Handle getExpDevices by returning a list of (initially one) devices for a given experiment id. On "CreateNewExperiment": - Must pass ExpID, location, and device_name. - Insert new exeriment entry into table. - Insert new exp_device entry into table. On Welcome page: - Have ExperimentID be a pulldown list of existing and valid experimentIDs. - Show experiment status next to each ID in this pulldown. - Show last update datetime next to each ID. - Get rid of 'Generate ID' button. - If they select CreateNewExperiment * Generate a new ExperimentID * Populate the ExperimentID field with this ID. * Don't allow them to edit that field. Create new subs in GIMSDBUtils: - addExperiment(dbh, exp_id, user); - addExpDevice(dbh, exp_id, location, device_name); Add "status" field to the experiment table with enum types "instantiated", "configured", "running", "done". Ajax backend should handle "Generate new ExperimentID" request calling createExperimentID() in GIMSDBUtils. Set up javascript enable/disable on generateID button - toggle with text box content. - On for empty text box. - Off for anything in text box. - Disable buton when an ExpID is generated. Implement genExperimentID($) in GIMSDBUtils to return random experiment IDs of the type MSN_dd893d9a9b0d30a5a911aa921da58a76. Implement getNewExpID() in GIMSDBUtils. my $new_exp_id = ''; do my $new_exp_id = GIMSDBUtils::genExperimentID(); while (!$new_exp_id or expIDExists($new_exp_id)); Implement expIDExists() in GIMSDBUtils. On "GetExperimentSettings": - Return all experiment settings. - Display nicely formatted settings in the window.