| {{ HTML::style('css/sharing.css') }} |
| <style> |
| #experiment-form { |
| margin-bottom: 20px; |
| } |
| </style> |
| <div class="container" style="max-width: 750px;"> |
| @if(isset( $invalidExperimentId ) ) |
| <div class="alert alert-danger"> |
| The Experiment ID does not exist. Please go to correct experiment. |
| </div> |
| @else |
| @if( Session::has("permissionDenied" ) ) |
| <div class="alert alert-danger"> |
| {{Session::forget("permissionDenied") }} |
| </div> |
| @else |
| @if( Session::has("cloning-error")) |
| <div class="alert alert-danger alert-dismissible" role="alert"> |
| <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span |
| class="sr-only">Close</span></button> |
| {{{ Session::get("cloning-error") }}} |
| </div> |
| @endif |
| <h1> |
| Experiment Summary |
| @if( !isset($dashboard)) |
| <small><a id="refresh-experiment" |
| title="Refresh"><span class="glyphicon glyphicon-refresh refresh-exp"></span></a></small> |
| <small><small>Enable Auto Refresh </small></small> |
| <div class="btn-group btn-toggle"> |
| @if($autoRefresh == true) |
| <button class="btn btn-xs btn-primary active">ON</button> |
| <button class="btn btn-xs btn-default">OFF</button> |
| @else |
| <button class="btn btn-xs btn-default">ON</button> |
| <button class="btn btn-xs btn-primary active">OFF</button> |
| @endif |
| </div> |
| @endif |
| </h1> |
| |
| |
| <table class="table table-bordered"> |
| <tr> |
| <td><strong>Experiment ID</strong></td> |
| <td>{{{ $experiment->experimentId }}}</td> |
| </tr> |
| <tr> |
| <td><strong>Name</strong></td> |
| <td>{{{ $experiment->experimentName }}}</td> |
| </tr> |
| <tr> |
| <td><strong>Description</strong></td> |
| <td>{{{ $experiment->description }}}</td> |
| </tr> |
| <tr> |
| <td><strong>Project</strong></td> |
| @if (isset($project)) |
| <td>{{{ $project->name }}}</td> |
| @else |
| <td><em>You don't have access to this project.</em></td> |
| @endif |
| </tr> |
| <tr> |
| <td><strong>Owner</strong></td> |
| <td>{{{ $experiment->userName }}}</td> |
| </tr> |
| <tr> |
| <td><strong>Application</strong></td> |
| <td><?php if (!empty($expVal["applicationInterface"])) { |
| echo $expVal["applicationInterface"]->applicationName; |
| } ?></td> |
| </tr> |
| <tr class="compute-resource-summary-page"> |
| <td><strong>Compute Resource</strong></td> |
| <td><?php if (!empty($expVal["computeResource"])) { |
| echo $expVal["computeResource"]->hostName; |
| } ?></td> |
| </tr> |
| @if( $experiment->userConfigurationData->useUserCRPref ) |
| <tr> |
| <td><strong>Uses My Compute Resource Account</strong></td> |
| <td> |
| Yes |
| </td> |
| </tr> |
| @endif |
| <tr> |
| <td><strong>Experiment Status</strong></td> |
| <td class="exp-status">{{{ $expVal["experimentStatusString"] }}}</td> |
| </tr> |
| |
| @foreach( $expVal["jobDetails"] as $index => $jobDetail) |
| <tr> |
| <th>Job</th> |
| <td> |
| <table class="table table-bordered"> |
| <tr> |
| <td>Name</td> |
| <td>ID</td> |
| <td>Status</td> |
| <td>Creation Time</td> |
| </tr> |
| <tr> |
| <td>{{$jobDetail->jobName}}</td> |
| <td>{{ $jobDetail->jobId}}</td> |
| <td>{{ ExperimentUtilities::latestStatus($jobDetail->jobStatuses)->jobStateName }}</td> |
| <td class="time" unix-time="{{$jobDetail->creationTime}}"></td> |
| </tr> |
| </table> |
| </td> |
| </tr> |
| @endforeach |
| <!-- |
| @if( isset( $expVal["jobState"]) ) |
| <tr> |
| <td><strong>Job Status</strong></td> |
| <td>{{ $expVal["jobState"] }}</td> |
| </tr> |
| @endif |
| --> |
| @if( isset( $experiment->enableEmailNotification)) |
| <tr> |
| <td><strong>Notifications To:</strong></td> |
| <td> |
| @if(isset($experiment->emailAddresses)) |
| @foreach( $experiment->emailAddresses as $email) |
| {{ $email}}<br/> |
| @endforeach |
| @endif |
| </td> |
| </tr> |
| @endif |
| |
| @if( isset($dashboard)) |
| <tr> |
| <td><strong>Working Dir</strong></td> |
| |
| <?php |
| foreach ($jobDetails as $job) echo ' |
| <td>' . $job->workingDir . '</td> |
| '; |
| ?> |
| </tr> |
| <tr> |
| <td><strong>Job Description</strong></td> |
| |
| <?php |
| foreach ($jobDetails as $job) echo ' |
| <td>' . nl2br($job->jobDescription) . '</td> |
| '; |
| ?> |
| </tr> |
| @endif |
| |
| <tr> |
| <td><strong>Creation Time</strong></td> |
| <td class="time" unix-time="{{ $expVal["experimentCreationTime"] }}"></td> |
| </tr> |
| <tr> |
| <td><strong>Last Modified Time</strong></td> |
| <td class="time" unix-time="{{ $expVal["experimentTimeOfStateChange"] }}"></td> |
| </tr> |
| <tr class="wall-time-summary-page"> |
| <td><strong>Wall Time</strong></td> |
| <td>{{ $experiment->userConfigurationData->computationalResourceScheduling->wallTimeLimit }}</td> |
| </tr> |
| <tr class="cpu-count-summary-page"> |
| <td><strong>CPU Count</strong></td> |
| <td>{{ $experiment->userConfigurationData->computationalResourceScheduling->totalCPUCount }}</td> |
| </tr> |
| <tr class="node-count-summary-page"> |
| <td><strong>Node Count</strong></td> |
| <td>{{ $experiment->userConfigurationData->computationalResourceScheduling->nodeCount }}</td> |
| </tr> |
| <tr class="queue-summary-page"> |
| <td><strong>Queue</strong></td> |
| <td>{{ $experiment->userConfigurationData->computationalResourceScheduling->queueName }}</td> |
| </tr> |
| <tr> |
| <td><strong>Inputs</strong></td> |
| <td>{{ ExperimentUtilities::list_input_files($experiment->experimentInputs) }}</td> |
| </tr> |
| <tr> |
| <td><strong>Outputs</strong></td> |
| <td>{{ ExperimentUtilities::list_output_files($experiment->experimentOutputs, ExperimentUtilities::latestStatus($experiment->experimentStatus)->state, false) }}</td> |
| </tr> |
| <tr> |
| <td><strong>Storage Directory</strong></td> |
| <?php |
| if(0 === strpos($experiment->userConfigurationData->experimentDataDir, Config::get("pga_config.airavata")['experiment-data-absolute-path'])){ |
| $expDataDir = str_replace(Config::get("pga_config.airavata")['experiment-data-absolute-path'], "", $experiment->userConfigurationData->experimentDataDir); |
| }else{ |
| $expDataDir = $experiment->userConfigurationData->experimentDataDir; |
| } |
| ?> |
| <td><a href="{{URL::to('/')}}/files/browse?path={{$expDataDir}}" target="_blank">Open</a></td> |
| </tr> |
| <!-- an experiment is editable only when it has not failed. otherwise, show errors. --> |
| {{-- @if( $expVal["editable"] == false)--}} |
| <tr> |
| <td><strong>Errors</strong></td> |
| <td> |
| @if( $experiment->errors != null) |
| @foreach( (array)$experiment->errors as $error) |
| {{ $error->actualErrorMessage }} |
| @endforeach |
| @endif |
| </td> |
| </tr> |
| {{--@endif--}} |
| @foreach( $expVal["jobDetails"] as $index => $jobDetail) |
| @if(ExperimentUtilities::latestStatus($experiment->experimentStatus)->state == \Airavata\Model\Status\ExperimentState::FAILED |
| || ExperimentUtilities::latestStatus($jobDetail->jobStatuses)->jobStateName == "FAILED") |
| <tr> |
| <th>Job Submission Response</th> |
| <td>{{$jobDetail->stdOut . $jobDetail->stdErr}}</td> |
| </tr> |
| @endif |
| @endforeach |
| </table> |
| |
| @if( !isset( $dashboard)) |
| |
| <form id="experiment-form" action="{{URL::to('/') }}/experiment/summary" method="post" role="form"> |
| |
| <div class="form-group"> |
| @if(Config::get('pga_config.airavata')["data-sharing-enabled"] && isset($updateSharingViaAjax)) |
| @include('partials/sharing-display-body', array("form" => !$updateSharingViaAjax)) |
| @endif |
| </div> |
| <div class="btn-toolbar"> |
| <button name="launch" |
| type="submit" |
| class="btn btn-success" |
| title="Launch the experiment" @if ( !$expVal["editable"]) style="display: none" @endif> |
| <span class="glyphicon glyphicon-play"></span> |
| Launch |
| </button> |
| <button name="cancel" |
| type="submit" |
| class="btn btn-danger" onclick="return confirm('Are you sure you want to cancel this experiment?')" |
| title="Cancel experiment" @if (!$expVal["cancelable"]) style="display: none" @endif> |
| <span class="glyphicon glyphicon-stop"></span> |
| Cancel |
| </button> |
| <input type="hidden" name="expId" value="{{{ Input::get('expId') }}}"/> |
| <a href="{{URL::to('/') }}/experiment/edit?expId={{ urlencode($experiment->experimentId) }}" |
| class="btn btn-primary" |
| role="button" |
| title="Edit experiment" <?php if (!$expVal["editable"]) echo 'style="display: none"' ?>> |
| <span class="glyphicon glyphicon-pencil"></span> |
| Edit |
| </a> |
| @if( count($writeableProjects) > 0 ) |
| <button type="button" |
| id="clone-button" |
| name="clone" |
| class="btn btn-info" |
| role="button" |
| title="Create a clone of the experiment. Cloning is the only way to change an experiment's settings after it has been launched."> |
| <span class="glyphicon glyphicon-edit"></span> |
| Clone |
| </button> |
| @endif |
| @if(Config::get('pga_config.airavata')["data-sharing-enabled"] && isset($canEditSharing) && $canEditSharing) |
| <button id="update-sharing" name="update-sharing" |
| type="button" |
| class="btn btn-warning" |
| title="Update sharing settings"> |
| <span class="glyphicon glyphicon-share"></span> |
| Update Sharing |
| </button> |
| @endif |
| </div> |
| </form> |
| |
| @endif |
| <input type="hidden" id="lastModifiedTime" value="{{ $expVal['experimentTimeOfStateChange'] }}"/> |
| |
| <div class="modal fade" id="clone-experiment-modal" tabindex="-1" role="dialog" aria-labelledby="clone-experiment-modal-title" |
| aria-hidden="true"> |
| <div class="modal-dialog"> |
| <div class="modal-content"> |
| <div class="modal-header"> |
| <h3 class="text-center" id="clone-experiment-modal-title">Clone experiment</h3> |
| </div> |
| <div class="modal-body"> |
| <form class="form-inline" action="{{ URL::to('/') }}/experiment/clone" method="post"> |
| <input type="hidden" name="expId" value="{{{ Input::get('expId') }}}"/> |
| <div class="form-group"> |
| <label for="projectId">Project</label> |
| <select class="form-control" name="projectId" required> |
| @foreach($writeableProjects as $project) |
| <option value="{{{ $project->projectID }}}" |
| @if( $project->projectID == $experiment->projectId) |
| selected |
| @endif |
| >{{{ $project->optionLabel }}}</option> |
| @endforeach |
| </select> |
| </div> |
| |
| <button type="submit" |
| class="btn btn-info" |
| role="button" |
| title="Create a clone of the experiment. Cloning is the only way to change an experiment's settings after it has been launched."> |
| <span class="glyphicon glyphicon-edit"></span> |
| Clone |
| </a> |
| </form> |
| </div> |
| <div class="modal-footer"> |
| <div class="form-group"> |
| <input type="button" class="btn btn-default" data-dismiss="modal" value="Cancel"/> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <!-- check of correct experiment Id ends here --> |
| @endif |
| |
| @endif |
| </div> |
| |
| @if( isset($dashboard)) |
| <h2 class="text-center">Detailed Experiment Information</h2> |
| <div class="tree"> |
| <ul> |
| <li> |
| <span><i class="icon-calendar"></i>{{{ $detailedExperiment->experimentName }}}</span> |
| <ul> |
| @foreach( $detailedExperiment->processes as $index => $process) |
| <li> |
| <span class="badge badge-success"><i class="icon-minus-sign"></i>Process - {{ $process->processId }}</span> |
| <ul> |
| <li> |
| <span class="alert"><i class="icon-time"></i> |
| <p>Inputs<br/> |
| {{ ExperimentUtilities::list_process_input_files( $process->processInputs) }}</p> |
| </span> |
| </li> |
| <li> |
| <span class="alert"><i class="icon-time"></i> |
| Tasks |
| </span> |
| |
| @foreach( $process->tasks as $task) |
| <dl class="well dl-horizontal"> |
| <dt>Task Id : </dt> <dd>{{ $task->taskId }}</dd> |
| <dt>Task Type : </dt> <dd>{{ $expVal["taskTypes"][$task->taskType] }}</dd> |
| <dt>Task Status : </dt> <dd>{{ $expVal["taskStates"][ExperimentUtilities::latestStatus($task->taskStatuses)->state] }}</dd> |
| <dt>Task Status Time : </dt> <dd class="time" unix-time="{{{ ExperimentUtilities::latestStatus($task->taskStatuses)->timeOfStateChange}}}"></dd> |
| <dt>Task Status Reason : </dt> <dd>{{{ ExperimentUtilities::latestStatus($task->taskStatuses)->reason }}}</dd> |
| @if( is_object( $task->taskErrors)) |
| <dt>Task Error Id : </dt><dd>{{ $task->taskErrors[0]->errorId }}</dd> |
| <dt>Task Error Msg : </dt><dd>{{ $task->taskErrors[0]->userFriendlyMessage }} <a tabindex="0" class="popover-taskinfo btn btn-sm btn-default" role="button" data-toggle="popover" data-html="true" title="Detailed Task Information" data-content="{{ str_replace( ',', '<br/><br/>', $task->taskError->actualErrorMessage ) }}">More Info</a></dd> |
| @endif |
| @if( count( $task->jobs) > 0 ) |
| <dt>Jobs : </dt><dd>{{ count( $task->jobs)}}</dd> |
| @endif |
| @foreach( $task->jobs as $jobIndex => $job) |
| <dl class="well dl-horizontal"> |
| <dt>Job Id. :</dt> <dd>{{ $job->jobId }}</dd> |
| <dt>Job Name : </dt><dd>{{ $job->jobName }}</dd> |
| <dt>Job Description :</dt><dd><pre>{{{ $job->jobDescription }}}</pre></dd> |
| </dl> |
| @endforeach |
| </dl> |
| <hr/> |
| @endforeach |
| </li> |
| <li> |
| <span class="alert"><i class="icon-time"></i> |
| <p>Outputs<hr/> |
| {{ ExperimentUtilities::list_process_output_files( $process->processOutputs, ExperimentUtilities::latestStatus($process->processStatuses)->state) }}</p> |
| </span> |
| </li> |
| </ul> |
| </li> |
| @endforeach |
| <li> |
| <span class="alert"><i class="icon-time"></i> |
| Errors : <br/> |
| @if( $detailedExperiment->errors != null) |
| @foreach( $detailedExperiment->errors as $error) |
| Error Id : {{ $error->errorId}}<br/> |
| Error Message : {{ $error->actualErrorMessage}} |
| @endforeach |
| @else |
| No errors |
| @endif |
| </span> |
| </li> |
| </ul> |
| </li> |
| |
| |
| </ul> |
| </div> |
| @endif |
| |
| @if(Config::get('pga_config.airavata')["data-sharing-enabled"] and isset($canEditSharing) && $canEditSharing) |
| @include('partials/sharing-form-modal', array("entityName" => "experiment")) |
| @endif |
| @section('scripts') |
| @parent |
| {{ HTML::script('js/time-conversion.js')}} |
| @if(Config::get('pga_config.airavata')["data-sharing-enabled"] and !isset($invalidExperimentId)) |
| <script> |
| var users = {{ $users }}; |
| var owner = {{ $owner }}; |
| var projectOwner = {{ $projectOwner }}; |
| $('#update-sharing').data({url: "{{URL::to('/')}}/experiment/unshared-users", resourceId: {{json_encode(Input::get('expId'))}} }); |
| @if($updateSharingViaAjax) |
| $('#share-box-button').data({ajaxUpdateUrl: "{{URL::to('/')}}/experiment/update-sharing?expId={{urlencode(Input::get('expId'))}}", resourceId: {{json_encode(Input::get('expId'))}} }); |
| @endif |
| </script> |
| {{ HTML::script('js/sharing/sharing_utils.js') }} |
| {{ HTML::script('js/sharing/share.js') }} |
| @endif |
| |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.2.1/Chart.bundle.min.js"></script> |
| {{ HTML::script('js/simstream.js') }} |
| <script> |
| checkAuth("http://localhost:8888/auth", "ws://localhost:8888/experiment/openmm"); |
| </script> |
| |
| <script> |
| |
| $('#clone-button').on('click', function(e){ |
| |
| e.stopPropagation(); |
| e.preventDefault(); |
| |
| // If experiment can be cloned into more than one project, give the user |
| // the chance to pick which one, otherwise just submit the cloning form |
| var projectCount = $('#clone-experiment-modal select[name=projectId] option').size(); |
| if (projectCount > 1) { |
| $("#clone-experiment-modal").modal("show"); |
| } else { |
| $("#clone-experiment-modal form").submit(); |
| } |
| return false; |
| }); |
| $('[data-toggle="tooltip"]').tooltip(); |
| </script> |
| |
| |
| @stop |