The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
# -*- Perl -*-

use IBM::LoadLeveler;

$query = ll_query(CLASSES);
$return=ll_set_request($query,QUERY_ALL,undef,ALL_DATA);

if ($return != 0 )
{
    print STDERR "ll_set_request failed Return = $return\n";
}

# $number will contain the number of objects returned

$classes=ll_get_objs($query,LL_CM,NULL,$number,$err);
while($classes)
{
    $class_name=ll_get_data($classes,LL_ClassName);
    $class_prio=ll_get_data($classes,LL_ClassPriority);
    @class_exc_users=ll_get_data($classes,LL_ClassExcludeUsers);
    $class_exc_users=array2string(@class_exc_users);
    @class_inc_users=ll_get_data($classes,LL_ClassIncludeUsers);
    $class_inc_users=array2string(@class_inc_users);
    @class_exc_group=ll_get_data($classes,LL_ClassExcludeGroups);
    $class_exc_group=array2string(@class_exc_group);
    @class_inc_group=ll_get_data($classes,LL_ClassIncludeGroups);
    $class_inc_group=array2string(@class_inc_group);
    @class_admin=ll_get_data($classes,LL_ClassAdmin);
    $class_admin=array2string(@class_admin);
#    $class_nqs_class=ll_get_data($classes,LL_ClassNqsClass);
#    $class_nqs_submit=ll_get_data($classes,LL_ClassNqsSubmit);
#    @class_nqs_query=ll_get_data($classes,LL_ClassNqsQuery);
#    $class_nqs_query=array2string(@class_nqs_query);
    $class_max_procs=ll_get_data($classes,LL_ClassMaxProcessors);
    $class_max_jobs=ll_get_data($classes,LL_ClassMaxJobs);

    $class_res_str = "";
    $class_res_req=ll_get_data($classes,LL_ClassGetFirstResourceRequirement);
    while($class_res_req)
    {
         $name=ll_get_data($class_res_req, LL_ResourceRequirementName);
         $init_val=ll_get_data($class_res_req, LL_ResourceRequirementValue);
         $class_res_str .= $name."(".$init_val.") ";
         $class_res_req=ll_get_data($classes, LL_ClassGetNextResourceRequirement);
    }
    $class_comment=ll_get_data($classes,LL_ClassComment);
    $class_ckpt_dir=ll_get_data($classes,LL_ClassCkptDir);
    $class_ckpt_hlimit=ll_get_data($classes,LL_ClassCkptTimeHardLimit);
    $class_ckpt_slimit=ll_get_data($classes,LL_ClassCkptTimeSoftLimit);
    $class_wcl_hlimit=ll_get_data($classes,LL_ClassWallClockLimitHard);
    $class_wcl_slimit=ll_get_data($classes,LL_ClassWallClockLimitSoft);
    $class_jcpu_hlimit=ll_get_data($classes,LL_ClassCpuStepLimitHard);
    $class_jcpu_slimit=ll_get_data($classes,LL_ClassCpuStepLimitSoft);
    $class_cpu_hlimit=ll_get_data($classes,LL_ClassCpuLimitHard);
    $class_cpu_slimit=ll_get_data($classes,LL_ClassCpuLimitSoft);
    $class_data_hlimit=ll_get_data($classes,LL_ClassDataLimitHard);
    $class_data_slimit=ll_get_data($classes,LL_ClassDataLimitSoft);
    $class_core_hlimit=ll_get_data($classes,LL_ClassCoreLimitHard);
    $class_core_slimit=ll_get_data($classes,LL_ClassCoreLimitSoft);
    $class_file_hlimit=ll_get_data($classes,LL_ClassFileLimitHard);
    $class_file_slimit=ll_get_data($classes,LL_ClassFileLimitSoft);
    $class_stack_hlimit=ll_get_data($classes,LL_ClassStackLimitHard);
    $class_stack_slimit=ll_get_data($classes,LL_ClassStackLimitSoft);
    $class_rss_hlimit=ll_get_data($classes,LL_ClassRssLimitHard);
    $class_rss_slimit=ll_get_data($classes,LL_ClassRssLimitSoft);

    $class_nice=ll_get_data($classes,LL_ClassNice);
    $class_free_slots=ll_get_data($classes,LL_ClassFreeSlots);
    $class_max_slots=ll_get_data($classes,LL_ClassMaximumSlots);
#    $class_exec_factor=ll_get_data($classes,LL_ClassExecutionFactor);
    $class_max_total_tasks=ll_get_data($classes,LL_ClassMaxTotalTasks);
    $class_max_proto_inst=ll_get_data($classes,LL_ClassMaxProtocolInstances);
    $class_preempt_class=ll_get_data($classes,LL_ClassPreemptClass);
    $class_start_class=ll_get_data($classes,LL_ClassStartClass);

    $class_constraints=ll_get_data($classes,LL_ClassConstraints);
  
    print "=============== Class $class_name ===============\n";
    print "                Name: $class_name\n";
    print "            Priority: $class_prio\n";
    print "       Exclude_Users: $class_exc_users\n";
    print "       Include_Users: $class_inc_users\n";
    print "      Exclude_Groups: $class_exc_group\n";
    print "      Include_Groups: $class_inc_group\n";
    print "               Admin: $class_admin\n";
    print "           NQS_class: ", $class_nqs_class ? "T\n":"F\n";
    print "          NQS_submit: $class_nqs_submit\n";
    print "           NQS_query: $class_nqs_query\n";
    print "      Max_processors: $class_max_procs\n";
    print "             Maxjobs: $class_max_jobs\n";
    print "Resource_requirement: $class_res_str\n";
    print "       Class_comment: $class_comment\n";
    print "      Class_ckpt_dir: $class_ckpt_dir\n";
    print "          Ckpt_limit: $class_ckpt_hlimit, $class_ckpt_slimit\n";
    print "    Wall_clock_limit: $class_wcl_hlimit, $class_wcl_slimit\n";
    print "       Job_cpu_limit: $class_jcpu_hlimit, $class_jcpu_slimit\n";
    print "           Cpu_limit: $class_cpu_hlimit, $class_cpu_slimit\n"; 
    print "          Data_limit: $class_data_hlimit, $class_data_slimit\n";
    print "          Core_limit: $class_core_hlimit, $class_core_slimit\n";
    print "          File_limit: $class_file_hlimit, $class_file_slimit\n";
    print "         Stack_limit: $class_stack_hlimit, $class_stack_slimit\n";
    print "           Rss_limit: $class_rss_hlimit, $class_rss_slimit\n";
    print "                Nice: $class_nice\n";
    print "          Free_slots: $class_free_slots\n";
    print "       Maximum_slots: $class_max_slots\n";
    print "    Execution_factor: $class_exec_factor\n";
    print "     Max_total_tasks: $class_max_total_tasks\n";
    print " Max_proto_instances: $class_max_proto_inst\n";
    print "       Preempt_class: $class_preempt_class\n";
    print "         Start_class: $class_start_class\n";

    if ( $class_constraints ) {
      print "-------------------------------------------------------\n";
    }
    if ( $class_constraints & 1) {
      print "\"Maximum Slots\" value of class \"$class_name\" is constrained by the MAX_STARTERS limit(s).\n";
    }
    if ($class_constraints & 2) {
      print "\"Free Slots\" value of class \"$class_name\" is constrained by the MAX_STARTERS limit(s).\n";
    }
    if ($class_constraints & 4) {
     print "\"Free Slots\" value of class \"$class_names\" is constrained by the MAXJOBS limit(s).\n";
    }
    $classes=ll_next_obj($query);
}

# Free up space allocated by LoadLeveler
ll_free_objs($query);
ll_deallocate($query);

sub array2string {
  my $entry;
  my $return_str = "";
  $return_str = join(" ", @_) if @_;
  return $return_str;
}