1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
summary: Check that `snap connect` runs interface hooks
details: |
Snapd hooks are programs that run in response to certain actions. The test
exercises the full suite of hooks that correspond to interface connections.
One important detail is that interface hooks can interact with plug and slot
attributes, both static and dynamically created.
environment:
CONSUMER_DATA: /var/snap/basic-iface-hooks-consumer/common
PRODUCER_DATA: /var/snap/basic-iface-hooks-producer/common
prepare: |
echo "Install test hooks snaps"
"$TESTSTOOLS"/snaps-state install-local basic-iface-hooks-consumer
"$TESTSTOOLS"/snaps-state install-local basic-iface-hooks-producer
restore: |
rm -f "$CONSUMER_DATA/prepare-plug-consumer-done"
rm -f "$PRODUCER_DATA/prepare-slot-producer-done"
rm -f "$CONSUMER_DATA/connect-plug-consumer-done"
rm -f "$PRODUCER_DATA/connect-slot-producer-done"
rm -f "$CONSUMER_DATA/disconnect-plug-consumer-done"
rm -f "$PRODUCER_DATA/disconnect-slot-producer-done"
rm -f "$CONSUMER_DATA/unprepare-plug-consumer-done"
rm -f "$PRODUCER_DATA/unprepare-slot-producer-done"
snap remove --purge basic-iface-hooks-consumer
snap remove --purge basic-iface-hooks-producer
execute: |
remove_markers() {
rm -f "$CONSUMER_DATA"/*-plug-*done
rm -f "$PRODUCER_DATA"/*-slot-*done
}
check_attributes(){
# static values should have the values defined in snap's yaml
gojq -r '.data["conns"]["basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer"]["plug-static"]["consumer-attr-1"]' \
/var/lib/snapd/state.json | MATCH "consumer-value-1"
gojq -r '.data["conns"]["basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer"]["plug-static"]["consumer-attr-2"]' \
/var/lib/snapd/state.json | MATCH "consumer-value-2"
gojq -r '.data["conns"]["basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer"]["slot-static"]["producer-attr-1"]' \
/var/lib/snapd/state.json | MATCH "producer-value-1"
gojq -r '.data["conns"]["basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer"]["slot-static"]["producer-attr-2"]' \
/var/lib/snapd/state.json | MATCH "producer-value-2"
# dynamic attributes have values created by the hooks, the "-validated" suffix is added by our test interface
gojq -r '.data["conns"]["basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer"]["plug-dynamic"]["before-connect"]' \
/var/lib/snapd/state.json | MATCH 'plug-changed\(consumer-value\)'
gojq -r '.data["conns"]["basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer"]["slot-dynamic"]["before-connect"]' \
/var/lib/snapd/state.json | MATCH 'slot-changed\(producer-value\)'
}
check_hooks_were_run(){
# producer/consumer hooks dump marker files, check if they exist to verify hooks were run
test -f "$CONSUMER_DATA/prepare-plug-consumer-done"
test -f "$PRODUCER_DATA/prepare-slot-producer-done"
test -f "$CONSUMER_DATA/connect-plug-consumer-done"
test -f "$PRODUCER_DATA/connect-slot-producer-done"
}
echo "Test that snap connect with plug and slot hooks succeeds"
snap connect basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer
echo "Ensure the hooks were actually executed"
check_hooks_were_run
# stop snapd before inspecting state.json
systemctl stop snapd.service snapd.socket
echo "Verify static and dynamic attributes have expected values"
check_attributes
systemctl start snapd.service snapd.socket
remove_markers
echo "Make sure that disconnect hooks are executed when disconnecting the interface"
snap disconnect basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer
snap change --last=disconnect | MATCH "Run hook disconnect-slot-producer of snap \"basic-iface-hooks-producer"
snap change --last=disconnect | MATCH "Run hook disconnect-plug-consumer of snap \"basic-iface-hooks-consumer"
test -f "$CONSUMER_DATA/disconnect-plug-consumer-done"
test -f "$PRODUCER_DATA/disconnect-slot-producer-done"
remove_markers
echo "Make connect hooks fail and check that undo hooks were executed"
snap set basic-iface-hooks-consumer fail=connect
if snap connect basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer ; then
echo "Expected snap connect to fail"
exit 1
fi
test -f "$CONSUMER_DATA/unprepare-plug-consumer-done"
test -f "$PRODUCER_DATA/unprepare-slot-producer-done"
test -f "$PRODUCER_DATA/connect-slot-producer-done"
test -f "$PRODUCER_DATA/disconnect-slot-producer-done"
MATCH "plug-changed.consumer-value" < "$CONSUMER_DATA/unprepare-plug-consumer-done"
remove_markers
echo "Check disconnect hooks are executed on snap removal"
snap set basic-iface-hooks-consumer fail=none
snap connect basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer
snap remove --purge basic-iface-hooks-consumer
test -f "$PRODUCER_DATA/disconnect-slot-producer-done"
snap change --last=remove | MATCH "Run hook disconnect-slot-producer of snap \"basic-iface-hooks-producer"
snap change --last=remove | MATCH "Run hook disconnect-plug-consumer of snap \"basic-iface-hooks-consumer"
|