#!/usr/bin/env bash

test_description='node management'

. lib/test-lib.sh

################################################################

# launch subordinate and manager

subord() {
    PORT=58902 guardian --name=TEST TEST3 &
    wait_node_ready TEST
    cawait T1:GRD-TEST_STATUS DONE
}

subord1() {
    PORT=58903 guardian --name=TEST1 TEST3 &
    wait_node_ready TEST1
    cawait T1:GRD-TEST1_STATUS DONE
}

subord2() {
    PORT=58904 guardian --name=TEST2 TEST3 &
    wait_node_ready TEST2
    cawait T1:GRD-TEST2_STATUS DONE
}

manager() {
    guardian --name=TESTM TEST_manager &
    wait_node_ready TESTM
    cawait T1:GRD-TESTM_STATUS DONE
}

#trap 'wait' EXIT

################################################################

test_begin_subtest "set managed"
subord
subord1
subord2
manager
sleep .1
caput T1:GRD-TESTM_REQUEST A
sleep .2
cawait T1:GRD-TESTM_STATUS DONE
node_dump_state TESTM >OUTPUT
node_dump_state TEST >>OUTPUT
kill_jobs
cat <<EOF >EXPECTED
T1:GRD-TESTM_ACTIVE.True
T1:GRD-TESTM_ERROR.False
T1:GRD-TESTM_INTENT.False
T1:GRD-TESTM_MANAGER.
T1:GRD-TESTM_MODE.AUTO
T1:GRD-TESTM_NOMINAL.NONE
T1:GRD-TESTM_NOMINAL_N.-1
T1:GRD-TESTM_NOMINAL_S.NONE
T1:GRD-TESTM_OK.False
T1:GRD-TESTM_OP.EXEC
T1:GRD-TESTM_READY.False
T1:GRD-TESTM_REQUEST.A
T1:GRD-TESTM_REQUEST_N.-10
T1:GRD-TESTM_REQUEST_S.A
T1:GRD-TESTM_STALLED.False
T1:GRD-TESTM_STATE.A
T1:GRD-TESTM_STATE_N.-10
T1:GRD-TESTM_STATE_S.A
T1:GRD-TESTM_STATUS.DONE
T1:GRD-TESTM_SUBNODES_NOT_OK.3
T1:GRD-TESTM_SUBNODES_TOTAL.3
T1:GRD-TESTM_TARGET.A
T1:GRD-TESTM_TARGET_N.-10
T1:GRD-TESTM_TARGET_S.A
T1:GRD-TEST_ACTIVE.True
T1:GRD-TEST_ERROR.False
T1:GRD-TEST_INTENT.False
T1:GRD-TEST_MANAGER.TESTM
T1:GRD-TEST_MODE.MANAGED
T1:GRD-TEST_NOMINAL.C
T1:GRD-TEST_NOMINAL_N.-12
T1:GRD-TEST_NOMINAL_S.C
T1:GRD-TEST_OK.False
T1:GRD-TEST_OP.EXEC
T1:GRD-TEST_READY.True
T1:GRD-TEST_REQUEST.NONE
T1:GRD-TEST_REQUEST_N.-1
T1:GRD-TEST_REQUEST_S.NONE
T1:GRD-TEST_STALLED.False
T1:GRD-TEST_STATE.INIT
T1:GRD-TEST_STATE_N.0
T1:GRD-TEST_STATE_S.INIT
T1:GRD-TEST_STATUS.DONE
T1:GRD-TEST_SUBNODES_NOT_OK.0
T1:GRD-TEST_SUBNODES_TOTAL.0
T1:GRD-TEST_TARGET.INIT
T1:GRD-TEST_TARGET_N.0
T1:GRD-TEST_TARGET_S.INIT
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "managed request"
subord
subord1
subord2
manager
camonitor -tn -F. T1:GRD-TESTM_{REQUEST,STATE,STATUS,ACTIVE,READY,SUBNODES_{NOT_OK,TOTAL},INTENT,OK} >OUTPUT_M & 
camonitor -tn -F. T1:GRD-TEST_{MANAGER,MODE,REQUEST,STATE,STATUS,ACTIVE,READY,INTENT,OK} >OUTPUT_S &
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .1
caput T1:GRD-TESTM_REQUEST A
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .1
caput T1:GRD-TESTM_REQUEST C
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .3
kill_jobs
cat OUTPUT_{M,S} > OUTPUT
cat <<EOF >EXPECTED
T1:GRD-TESTM_REQUEST..NONE..
T1:GRD-TESTM_STATE..INIT..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_ACTIVE..True..
T1:GRD-TESTM_READY..False..
T1:GRD-TESTM_SUBNODES_NOT_OK..3.HIGH.MINOR
T1:GRD-TESTM_SUBNODES_TOTAL..3..
T1:GRD-TESTM_INTENT..True..
T1:GRD-TESTM_OK..False..
T1:GRD-TESTM_REQUEST..A..
T1:GRD-TESTM_INTENT..False..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..A..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_REQUEST..C..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..B..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..C..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_SUBNODES_NOT_OK..2.HIGH.MINOR
T1:GRD-TEST_MANAGER....
T1:GRD-TEST_MODE..AUTO..
T1:GRD-TEST_REQUEST..NONE..
T1:GRD-TEST_STATE..INIT..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_ACTIVE..True..
T1:GRD-TEST_READY..True..
T1:GRD-TEST_INTENT..False..
T1:GRD-TEST_OK..False..
T1:GRD-TEST_MODE..MANAGED..
T1:GRD-TEST_MANAGER..TESTM..
T1:GRD-TEST_REQUEST..C..
T1:GRD-TEST_INTENT..True..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..A..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..B..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..C..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_OK..True..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "paused subordinate fault and recovery"
subord
subord1
subord2
manager
camonitor -tn -F. T1:GRD-TESTM_{REQUEST,STATE,STATUS,ACTIVE,READY,SUBNODES_{NOT_OK,TOTAL},INTENT,OK} >OUTPUT_M &
camonitor -tn -F. T1:GRD-TEST_{MODE,OP,REQUEST,STATE,STATUS,ACTIVE,READY,INTENT,OK} >OUTPUT_S &
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .1
caput T1:GRD-TESTM_REQUEST A
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .1
caput T1:GRD-TEST_OP PAUSE
cawait T1:GRD-TESTM_STATE FAULT
sleep .2
caput T1:GRD-TEST_OP EXEC
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
kill_jobs
cat OUTPUT_{M,S} > OUTPUT
cat <<EOF >EXPECTED
T1:GRD-TESTM_REQUEST..NONE..
T1:GRD-TESTM_STATE..INIT..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_ACTIVE..True..
T1:GRD-TESTM_READY..False..
T1:GRD-TESTM_SUBNODES_NOT_OK..3.HIGH.MINOR
T1:GRD-TESTM_SUBNODES_TOTAL..3..
T1:GRD-TESTM_INTENT..True..
T1:GRD-TESTM_OK..False..
T1:GRD-TESTM_REQUEST..A..
T1:GRD-TESTM_INTENT..False..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..A..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_STATUS..JUMP..
T1:GRD-TESTM_STATE..FAULT..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..JUMP..
T1:GRD-TESTM_STATE..INIT..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..A..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TEST_MODE..AUTO..
T1:GRD-TEST_OP..EXEC..
T1:GRD-TEST_REQUEST..NONE..
T1:GRD-TEST_STATE..INIT..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_ACTIVE..True..
T1:GRD-TEST_READY..True..
T1:GRD-TEST_INTENT..False..
T1:GRD-TEST_OK..False..
T1:GRD-TEST_MODE..MANAGED..
T1:GRD-TEST_OP..PAUSE..
T1:GRD-TEST_ACTIVE..False..
T1:GRD-TEST_READY..False..
T1:GRD-TEST_OP..EXEC..
T1:GRD-TEST_ACTIVE..True..
T1:GRD-TEST_READY..True..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "renegade subordinate fault and recovery"
subord
subord1
subord2
manager
camonitor -tn -F. T1:GRD-TESTM_{REQUEST,STATE,STATUS,ACTIVE,READY,SUBNODES_{NOT_OK,TOTAL},INTENT,OK} >OUTPUT_M &
camonitor -tn -F. T1:GRD-TEST_{MANAGER,MODE,REQUEST,STATE,STATUS,ACTIVE,READY,INTENT,OK} >OUTPUT_S &
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .1
caput T1:GRD-TESTM_REQUEST A
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .1
caput T1:GRD-TEST_MODE AUTO
cawait T1:GRD-TESTM_STATE FAULT
sleep .2
caput T1:GRD-TEST_MANAGER TESTM
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
kill_jobs
cat OUTPUT_{M,S} > OUTPUT
cat <<EOF >EXPECTED
T1:GRD-TESTM_REQUEST..NONE..
T1:GRD-TESTM_STATE..INIT..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_ACTIVE..True..
T1:GRD-TESTM_READY..False..
T1:GRD-TESTM_SUBNODES_NOT_OK..3.HIGH.MINOR
T1:GRD-TESTM_SUBNODES_TOTAL..3..
T1:GRD-TESTM_INTENT..True..
T1:GRD-TESTM_OK..False..
T1:GRD-TESTM_REQUEST..A..
T1:GRD-TESTM_INTENT..False..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..A..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_STATUS..JUMP..
T1:GRD-TESTM_STATE..FAULT..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..JUMP..
T1:GRD-TESTM_STATE..INIT..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..A..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TEST_MANAGER....
T1:GRD-TEST_MODE..AUTO..
T1:GRD-TEST_REQUEST..NONE..
T1:GRD-TEST_STATE..INIT..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_ACTIVE..True..
T1:GRD-TEST_READY..True..
T1:GRD-TEST_INTENT..False..
T1:GRD-TEST_OK..False..
T1:GRD-TEST_MODE..MANAGED..
T1:GRD-TEST_MANAGER..TESTM..
T1:GRD-TEST_MODE..AUTO..
T1:GRD-TEST_MANAGER....
T1:GRD-TEST_MODE..MANAGED..
T1:GRD-TEST_MANAGER..TESTM..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "release subordinate"
subord
subord1
subord2
manager
camonitor -tn -F. T1:GRD-TESTM_{REQUEST,STATE,STATUS,ACTIVE,READY,SUBNODES_{NOT_OK,TOTAL},INTENT,OK} >OUTPUT_M &
camonitor -tn -F. T1:GRD-TEST_{MODE,REQUEST,STATE,STATUS,ACTIVE,READY,INTENT,OK} >OUTPUT_S &
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .1
caput T1:GRD-TESTM_REQUEST A
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .1
caput T1:GRD-TESTM_REQUEST C
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .1
caput T1:GRD-TESTM_REQUEST D
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .1
# this last check is to make sure the manager doesn't show a fault
# after releasing subordinate
caput T1:GRD-TEST_OP PAUSE
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
sleep .1
kill_jobs
cat OUTPUT_{M,S} > OUTPUT
cat <<EOF >EXPECTED
T1:GRD-TESTM_REQUEST..NONE..
T1:GRD-TESTM_STATE..INIT..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_ACTIVE..True..
T1:GRD-TESTM_READY..False..
T1:GRD-TESTM_SUBNODES_NOT_OK..3.HIGH.MINOR
T1:GRD-TESTM_SUBNODES_TOTAL..3..
T1:GRD-TESTM_INTENT..True..
T1:GRD-TESTM_OK..False..
T1:GRD-TESTM_REQUEST..A..
T1:GRD-TESTM_INTENT..False..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..A..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_REQUEST..C..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..B..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..C..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_SUBNODES_NOT_OK..2.HIGH.MINOR
T1:GRD-TESTM_REQUEST..D..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..D..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_SUBNODES_NOT_OK..3.HIGH.MINOR
T1:GRD-TEST_MODE..AUTO..
T1:GRD-TEST_REQUEST..NONE..
T1:GRD-TEST_STATE..INIT..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_ACTIVE..True..
T1:GRD-TEST_READY..True..
T1:GRD-TEST_INTENT..False..
T1:GRD-TEST_OK..False..
T1:GRD-TEST_MODE..MANAGED..
T1:GRD-TEST_REQUEST..C..
T1:GRD-TEST_INTENT..True..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..A..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..B..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..C..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_OK..True..
T1:GRD-TEST_MODE..AUTO..
T1:GRD-TEST_ACTIVE..False..
T1:GRD-TEST_READY..False..
T1:GRD-TEST_INTENT..False..
T1:GRD-TEST_OK..False..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "loose management"
subord
subord1
subord2
manager
# NOTE: we don't check _SUBNODES_{NOT_OK,TOTAL} here because those
# records get updated asynchronously compared to the rest of the
# status channels, and therefore the updates were showing up in random
# order.
camonitor -tn -F. T1:GRD-TESTM_{REQUEST,STATE,STATUS,ACTIVE,READY,INTENT,OK} >OUTPUT_M &
camonitor -tn -F. T1:GRD-TEST_{MODE,REQUEST,STATE,STATUS,ACTIVE,READY,INTENT,OK} >OUTPUT_S &
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .1
caput T1:GRD-TESTM_REQUEST C
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
sleep .1
caput T1:GRD-TEST_REQUEST B
cawait T1:GRD-TESTM_STATE FAULT
sleep 1
caput T1:GRD-TEST_REQUEST C
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST_STATUS DONE
kill_jobs
cat OUTPUT_{M,S} > OUTPUT
cat <<EOF >EXPECTED
T1:GRD-TESTM_REQUEST..NONE..
T1:GRD-TESTM_STATE..INIT..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_ACTIVE..True..
T1:GRD-TESTM_READY..False..
T1:GRD-TESTM_INTENT..True..
T1:GRD-TESTM_OK..False..
T1:GRD-TESTM_REQUEST..C..
T1:GRD-TESTM_INTENT..False..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..B..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..C..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_STATUS..JUMP..
T1:GRD-TESTM_STATE..FAULT..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..JUMP..
T1:GRD-TESTM_STATE..INIT..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..B..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..C..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TEST_MODE..AUTO..
T1:GRD-TEST_REQUEST..NONE..
T1:GRD-TEST_STATE..INIT..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_ACTIVE..True..
T1:GRD-TEST_READY..True..
T1:GRD-TEST_INTENT..False..
T1:GRD-TEST_OK..False..
T1:GRD-TEST_REQUEST..C..
T1:GRD-TEST_INTENT..True..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..A..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..B..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..EDGE..
T1:GRD-TEST_STATE..C..
T1:GRD-TEST_STATUS..ENTER..
T1:GRD-TEST_STATUS..MAIN..
T1:GRD-TEST_STATUS..RUN..
T1:GRD-TEST_STATUS..DONE..
T1:GRD-TEST_OK..True..
T1:GRD-TEST_REQUEST..B..
T1:GRD-TEST_INTENT..False..
T1:GRD-TEST_OK..False..
T1:GRD-TEST_REQUEST..C..
T1:GRD-TEST_INTENT..True..
T1:GRD-TEST_OK..True..
EOF
test_expect_equal_file OUTPUT EXPECTED

test_begin_subtest "subset management"
subord
subord1
subord2
manager
camonitor -tn -F. T1:GRD-TESTM_{REQUEST,STATE,STATUS,ACTIVE,READY,SUBNODES_{NOT_OK,TOTAL},INTENT,OK} >OUTPUT_M &
camonitor -tn -F. T1:GRD-TEST1_{MODE,REQUEST,STATE,STATUS} >OUTPUT_S1 &
camonitor -tn -F. T1:GRD-TEST2_{MODE,REQUEST,STATE,STATUS} >OUTPUT_S2 &
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST1_STATUS DONE
cawait T1:GRD-TEST2_STATUS DONE
sleep .1
caput T1:GRD-TESTM_REQUEST E
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
cawait T1:GRD-TEST1_STATUS DONE
sleep .1
caput T1:GRD-TEST1_MODE AUTO
sleep .1
cawait T1:GRD-TESTM_STATUS RUN
sleep .1
caput T1:GRD-TEST1_MANAGER TESTM
sleep .1
cawait T1:GRD-TESTM_STATUS DONE
kill_jobs
cat OUTPUT_{M,S1,S2} > OUTPUT
cat <<EOF >EXPECTED
T1:GRD-TESTM_REQUEST..NONE..
T1:GRD-TESTM_STATE..INIT..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_ACTIVE..True..
T1:GRD-TESTM_READY..False..
T1:GRD-TESTM_SUBNODES_NOT_OK..3.HIGH.MINOR
T1:GRD-TESTM_SUBNODES_TOTAL..3..
T1:GRD-TESTM_INTENT..True..
T1:GRD-TESTM_OK..False..
T1:GRD-TESTM_REQUEST..E..
T1:GRD-TESTM_INTENT..False..
T1:GRD-TESTM_STATUS..EDGE..
T1:GRD-TESTM_STATE..E..
T1:GRD-TESTM_STATUS..ENTER..
T1:GRD-TESTM_STATUS..MAIN..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TESTM_STATUS..RUN..
T1:GRD-TESTM_STATUS..DONE..
T1:GRD-TEST1_MODE..AUTO..
T1:GRD-TEST1_REQUEST..NONE..
T1:GRD-TEST1_STATE..INIT..
T1:GRD-TEST1_STATUS..DONE..
T1:GRD-TEST1_MODE..MANAGED..
T1:GRD-TEST1_MODE..AUTO..
T1:GRD-TEST1_MODE..MANAGED..
T1:GRD-TEST2_MODE..AUTO..
T1:GRD-TEST2_REQUEST..NONE..
T1:GRD-TEST2_STATE..INIT..
T1:GRD-TEST2_STATUS..DONE..
EOF
test_expect_equal_file OUTPUT EXPECTED

################################################################

test_done
