Skip to content

Commit

Permalink
t: add tests for project validation/annotation
Browse files Browse the repository at this point in the history
Problem: There are no tests for project validation and annotation in the
priority plugin.

Add some tests.
  • Loading branch information
cmoussa1 committed Sep 10, 2024
1 parent f145f1a commit 779da78
Show file tree
Hide file tree
Showing 2 changed files with 170 additions and 0 deletions.
1 change: 1 addition & 0 deletions t/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ TESTSCRIPTS = \
t1037-hierarchy-small-tie-db.t \
t1038-hierarchy-small-tie-all-db.t \
t1039-issue476.t \
t1040-mf-priority-projects.t \
t5000-valgrind.t \
python/t1000-example.py \
python/t1001_db.py \
Expand Down
169 changes: 169 additions & 0 deletions t/t1040-mf-priority-projects.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
#!/bin/bash

test_description='test validating and setting project names in priority plugin'

. `dirname $0`/sharness.sh
MULTI_FACTOR_PRIORITY=${FLUX_BUILD_DIR}/src/plugins/.libs/mf_priority.so
SUBMIT_AS=${SHARNESS_TEST_SRCDIR}/scripts/submit_as.py
DB_PATH=$(pwd)/FluxAccountingTest.db

export TEST_UNDER_FLUX_NO_JOB_EXEC=y
export TEST_UNDER_FLUX_SCHED_SIMPLE_MODE="limited=1"
test_under_flux 1 job

flux setattr log-stderr-level 1

test_expect_success 'load multi-factor priority plugin' '
flux jobtap load -r .priority-default ${MULTI_FACTOR_PRIORITY}
'

test_expect_success 'check that mf_priority plugin is loaded' '
flux jobtap list | grep mf_priority
'

test_expect_success 'create flux-accounting DB' '
flux account -p ${DB_PATH} create-db
'

test_expect_success 'start flux-accounting service' '
flux account-service -p ${DB_PATH} -t
'

test_expect_success 'add banks to the DB' '
flux account add-bank root 1 &&
flux account add-bank --parent-bank=root account1 1
'

test_expect_success 'add projects to the DB' '
flux account add-project projectA &&
flux account add-project projectB &&
flux account add-project projectC
'

test_expect_success 'submit jobs under two different users before plugin gets updated' '
job_project_star=$(flux python ${SUBMIT_AS} 5001 hostname) &&
job_project_A=$(flux python ${SUBMIT_AS} 5002 hostname) &&
flux job wait-event -vt 60 $job_project_star depend &&
flux job wait-event -vt 60 $job_project_A depend
'

# If a user is added to the DB without specifying any projects, a default
# project "*" is added for the user automatically, and jobs submitted without
# specifying a project will fall under "*" - this is the case for the first
# added user in this test file.
#
# Every user who is added to the DB belongs to the "*" project, but will only
# run jobs under "*" if they do not already have another default project.
#
# If a user is added to the DB with a specified project name, any job submitted
# without specifying a project name will fall under that project name - this is
# the case for the second user in this test file.
test_expect_success 'add users to flux-accounting DB and to plugin; jobs transition to RUN' '
flux account add-user --username=user1 --userid=5001 --bank=account1 &&
flux account add-user \
--username=user2 \
--userid=5002 \
--bank=account1 \
--projects=projectA &&
flux account-priority-update -p ${DB_PATH} &&
flux job wait-event -vt 60 $job_project_star alloc &&
flux job wait-event -vt 60 $job_project_A alloc
'

test_expect_success 'check that first submitted job has project "*" listed in eventlog' '
flux job info $job_project_star eventlog > eventlog.out &&
grep "\"attributes.system.project\":\"\*\"" eventlog.out &&
flux cancel $job_project_star
'

test_expect_success 'check that second submitted job has project "projectA" listed in eventlog' '
flux job info $job_project_A eventlog > eventlog.out &&
grep "\"attributes.system.project\":\"projectA\"" eventlog.out &&
flux cancel $job_project_A
'

test_expect_success 'add a user with a list of projects to the DB' '
flux account add-user \
--username=user3 \
--userid=5003 \
--bank=account1 \
--projects="projectA,projectB"
'

test_expect_success 'send flux-accounting DB information to the plugin' '
flux account-priority-update -p ${DB_PATH}
'

test_expect_success 'successfully submit a job under a valid project' '
jobid=$(flux python ${SUBMIT_AS} 5003 --setattr=system.project=projectA hostname) &&
flux job wait-event -f json $jobid priority &&
flux job info $jobid jobspec > jobspec.out &&
grep "projectA" jobspec.out &&
flux cancel $jobid
'

test_expect_success 'submit a job under a project that does not exist' '
test_must_fail flux python ${SUBMIT_AS} 5003 --setattr=system.project=projectFOO \
hostname > project_dne.out 2>&1 &&
test_debug "cat project_dne.out" &&
grep "project not valid for user: projectFOO" project_dne.out
'

test_expect_success 'submit a job under a project that user does not belong to' '
test_must_fail flux python ${SUBMIT_AS} 5003 --setattr=system.project=projectC \
hostname > project_invalid.out 2>&1 &&
test_debug "cat project_invalid.out" &&
grep "project not valid for user: projectC" project_invalid.out
'

test_expect_success 'successfully submit a job under a default project' '
jobid=$(flux python ${SUBMIT_AS} 5003 hostname) &&
flux job wait-event -f json $jobid priority &&
flux job info $jobid eventlog > eventlog.out &&
grep "\"attributes.system.project\":\"projectA\"" eventlog.out &&
flux cancel $jobid
'

test_expect_success 'successfully submit a job under a secondary project' '
jobid=$(flux python ${SUBMIT_AS} 5003 --setattr=system.project=projectB hostname) &&
flux job wait-event -f json $jobid priority &&
flux job info $jobid jobspec > jobspec.out &&
grep "projectB" jobspec.out &&
flux cancel $jobid
'

test_expect_success 'update the default project for user and submit job under new default' '
flux account edit-user user3 --default-project=projectB &&
flux account-priority-update -p ${DB_PATH} &&
jobid=$(flux python ${SUBMIT_AS} 5003 hostname) &&
flux job wait-event -f json $jobid priority &&
flux job info $jobid eventlog > eventlog.out &&
grep "\"attributes.system.project\":\"projectB\"" eventlog.out &&
flux cancel $jobid
'

test_expect_success 'add a user without specifying any projects (will add a default project of "*")' '
flux account add-user --username=user4 --userid=5004 --bank=account1 &&
flux account-priority-update -p ${DB_PATH} &&
jobid=$(flux python ${SUBMIT_AS} 5004 hostname) &&
flux job wait-event -f json $jobid priority &&
flux job info $jobid eventlog > eventlog.out &&
grep "\"attributes.system.project\":\"\*\"" eventlog.out &&
flux cancel $jobid
'

test_expect_success 'add a new default project to the new user and update the plugin' '
flux account edit-user user4 --projects=projectA --default-project=projectA &&
flux account-priority-update -p ${DB_PATH} &&
jobid=$(flux python ${SUBMIT_AS} 5004 hostname) &&
flux job wait-event -f json $jobid priority &&
flux job info $jobid eventlog > eventlog.out &&
grep "\"attributes.system.project\":\"projectA\"" eventlog.out &&
flux cancel $jobid
'

test_expect_success 'shut down flux-accounting service' '
flux python -c "import flux; flux.Flux().rpc(\"accounting.shutdown_service\").get()"
'

test_done

0 comments on commit 779da78

Please sign in to comment.