test-notary-admin-commands.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #!/usr/bin/env bash
  2. # Integration test for Notary admin rescue commands
  3. # This script tests the complete lifecycle of Notary rescue operations:
  4. # 1. Create synthetic delayed/blackholed messages using inject commands
  5. # 2. Execute admin commands against the guardian
  6. # 3. Verify state changes after each command
  7. #
  8. # This modifies Tilt's BadgerDB, so successive runs of this script
  9. # will create many stored messages and the DB is not cleared after the
  10. # script terminates.
  11. #
  12. # Prerequisites:
  13. # - Tilt devnet must be running with notary enabled
  14. #
  15. # Usage: ./test-notary-admin-commands.sh [NODE_NUMBER]
  16. # NODE_NUMBER: Guardian node to test against (default: 0)
  17. set -e
  18. node=${1:-0} # Default to guardian-0
  19. sock="/tmp/admin.sock"
  20. echo "=== Notary Admin Commands Integration Test ==="
  21. echo "Testing against guardian-${node}"
  22. echo ""
  23. # Helper function to execute commands in guardian pod
  24. exec_in_pod() {
  25. kubectl exec -n wormhole guardian-${node} -c guardiand -- "$@"
  26. }
  27. # Helper function to run admin commands
  28. admin_cmd() {
  29. exec_in_pod /guardiand admin "$@" --socket "$sock"
  30. }
  31. # Helper function to print database state
  32. print_db_state() {
  33. local title="$1"
  34. echo ""
  35. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  36. echo "📊 $title"
  37. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  38. local delayed_output=$(admin_cmd notary-list-delayed-messages)
  39. local delayed_count=$(echo "$delayed_output" | grep -oP 'Delayed messages \(\K[0-9]+' || echo "0")
  40. echo "🕒 DELAYED MESSAGES: $delayed_count"
  41. if [[ "$delayed_count" -gt 0 ]]; then
  42. echo "$delayed_output" | grep "^2/" | while read -r msg_id; do
  43. local details=$(admin_cmd notary-get-delayed-message "$msg_id" 2>/dev/null || echo "")
  44. local release_time=$(echo "$details" | grep -oP 'Release Time: \K.*' || echo "unknown")
  45. echo " • ${msg_id:0:80}..."
  46. echo " Release: $release_time"
  47. done
  48. fi
  49. echo ""
  50. local blackholed_output=$(admin_cmd notary-list-blackholed-messages)
  51. local blackholed_count=$(echo "$blackholed_output" | grep -oP 'Blackholed messages \(\K[0-9]+' || echo "0")
  52. echo "⛔ BLACKHOLED MESSAGES: $blackholed_count"
  53. if [[ "$blackholed_count" -gt 0 ]]; then
  54. echo "$blackholed_output" | grep "^2/" | while read -r msg_id; do
  55. echo " • ${msg_id:0:80}..."
  56. done
  57. fi
  58. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  59. echo ""
  60. }
  61. # Step 1: Create synthetic test state using inject commands
  62. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  63. echo "Step 1: Creating synthetic delayed messages"
  64. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  65. msg1_output=$(admin_cmd notary-inject-delayed-message 4)
  66. msg1_id=$(echo "$msg1_output" | grep -oP 'Injected delayed message: \K.*')
  67. msg2_output=$(admin_cmd notary-inject-delayed-message 4)
  68. msg2_id=$(echo "$msg2_output" | grep -oP 'Injected delayed message: \K.*')
  69. echo "✓ Created test messages:"
  70. echo " - Message 1 (4 day delay): ${msg1_id:0:80}..."
  71. echo " - Message 2 (4 day delay): ${msg2_id:0:80}..."
  72. print_db_state "Database State After Injection"
  73. # Step 2: Verify initial state using list command
  74. delayed_list=$(admin_cmd notary-list-delayed-messages)
  75. if ! echo "$delayed_list" | grep -q "$msg1_id"; then
  76. echo "✗ FAIL: Message 1 not found in delayed list"
  77. exit 1
  78. fi
  79. if ! echo "$delayed_list" | grep -q "$msg2_id"; then
  80. echo "✗ FAIL: Message 2 not found in delayed list"
  81. exit 1
  82. fi
  83. echo "✓ Initial state verified"
  84. # Step 3: Test notary-blackhole-delayed-message
  85. echo ""
  86. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  87. echo "Step 2: Testing notary-blackhole-delayed-message"
  88. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  89. echo "Moving message 1 from delayed → blackholed..."
  90. admin_cmd notary-blackhole-delayed-message "$msg1_id"
  91. # Give DB a moment to flush the write
  92. sleep 0.5
  93. delayed_list=$(admin_cmd notary-list-delayed-messages)
  94. if echo "$delayed_list" | grep -q "$msg1_id"; then
  95. echo "✗ FAIL: Message still in delayed list after blackhole"
  96. exit 1
  97. fi
  98. blackholed_list=$(admin_cmd notary-list-blackholed-messages)
  99. if ! echo "$blackholed_list" | grep -q "$msg1_id"; then
  100. echo "✗ FAIL: Message not moved to blackholed list"
  101. exit 1
  102. fi
  103. echo "✓ Message successfully moved from delayed → blackholed"
  104. print_db_state "Database State After Blackholing"
  105. # Step 4: Test notary-remove-blackholed-message
  106. echo ""
  107. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  108. echo "Step 3: Testing notary-remove-blackholed-message"
  109. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  110. echo "Removing message 1 from blackholed (restoring to delayed)..."
  111. admin_cmd notary-remove-blackholed-message "$msg1_id"
  112. # Give DB a moment to flush the write
  113. sleep 0.5
  114. blackholed_list=$(admin_cmd notary-list-blackholed-messages)
  115. if echo "$blackholed_list" | grep -q "$msg1_id"; then
  116. echo "✗ FAIL: Message still in blackholed list after removal"
  117. exit 1
  118. fi
  119. delayed_list=$(admin_cmd notary-list-delayed-messages)
  120. if ! echo "$delayed_list" | grep -q "$msg1_id"; then
  121. echo "✗ FAIL: Message not restored to delayed list"
  122. exit 1
  123. fi
  124. echo "✓ Message successfully moved from blackholed → delayed"
  125. print_db_state "Database State After Removing from Blackhole"
  126. # Step 5: Test notary-release-delayed-message
  127. echo ""
  128. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  129. echo "Step 4: Testing notary-release-delayed-message"
  130. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  131. echo "Getting release time BEFORE release command..."
  132. before_release=$(admin_cmd notary-get-delayed-message "$msg2_id")
  133. before_time=$(echo "$before_release" | grep -oP 'Release Time: \K.*')
  134. echo " Before: $before_time"
  135. echo ""
  136. echo "Releasing message 2 (sets release time to now)..."
  137. admin_cmd notary-release-delayed-message "$msg2_id"
  138. # Note: The notary processes delayed messages on a 1-minute poll timer.
  139. # The release sets the time in the past, but we need to wait for the next poll cycle.
  140. # For testing purposes, we'll just verify the message is still in the delayed list
  141. # but with a release time in the past.
  142. delayed_msg_info=$(admin_cmd notary-get-delayed-message "$msg2_id")
  143. if ! echo "$delayed_msg_info" | grep -q "$msg2_id"; then
  144. echo "✗ FAIL: Message not found after release command"
  145. exit 1
  146. fi
  147. after_time=$(echo "$delayed_msg_info" | grep -oP 'Release Time: \K.*')
  148. echo " After: $after_time"
  149. echo ""
  150. echo "✓ Release time updated (will be released on next poll cycle in ~60s)"
  151. print_db_state "Database State After Release (time updated)"
  152. # Step 6: Test notary-reset-release-timer
  153. echo ""
  154. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  155. echo "Step 5: Testing notary-reset-release-timer"
  156. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  157. msg3_output=$(admin_cmd notary-inject-delayed-message 1)
  158. msg3_id=$(echo "$msg3_output" | grep -oP 'Injected delayed message: \K.*')
  159. echo "Created message 3 with 1 day delay: ${msg3_id:0:80}..."
  160. echo ""
  161. before_reset=$(admin_cmd notary-get-delayed-message "$msg3_id")
  162. before_time=$(echo "$before_reset" | grep -oP 'Release Time: \K.*')
  163. echo "Getting release time BEFORE reset..."
  164. echo " Before: $before_time"
  165. echo ""
  166. echo "Resetting timer to 5 days..."
  167. admin_cmd notary-reset-release-timer "$msg3_id" 5
  168. delayed_list=$(admin_cmd notary-list-delayed-messages)
  169. if ! echo "$delayed_list" | grep -q "$msg3_id"; then
  170. echo "✗ FAIL: Message not found after timer reset"
  171. exit 1
  172. fi
  173. after_reset=$(admin_cmd notary-get-delayed-message "$msg3_id")
  174. after_time=$(echo "$after_reset" | grep -oP 'Release Time: \K.*')
  175. echo " After: $after_time"
  176. echo ""
  177. echo "✓ Release timer successfully reset from 1 day → 5 days"
  178. print_db_state "Database State After Timer Reset"
  179. # Step 7: Test introspection commands
  180. echo ""
  181. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  182. echo "Step 6: Testing introspection commands"
  183. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  184. msg4_output=$(admin_cmd notary-inject-delayed-message 2)
  185. msg4_id=$(echo "$msg4_output" | grep -oP 'Injected delayed message: \K.*')
  186. msg5_output=$(admin_cmd notary-inject-blackholed-message)
  187. msg5_id=$(echo "$msg5_output" | grep -oP 'Injected blackholed message: \K.*')
  188. echo "Testing notary-get-delayed-message for message 4..."
  189. delayed_details=$(admin_cmd notary-get-delayed-message "$msg4_id")
  190. if ! echo "$delayed_details" | grep -q "$msg4_id"; then
  191. echo "✗ FAIL: Failed to get delayed message details"
  192. exit 1
  193. fi
  194. echo "$delayed_details"
  195. echo ""
  196. echo "Testing notary-get-blackholed-message for message 5..."
  197. blackholed_details=$(admin_cmd notary-get-blackholed-message "$msg5_id")
  198. if ! echo "$blackholed_details" | grep -q "$msg5_id"; then
  199. echo "✗ FAIL: Failed to get blackholed message details"
  200. exit 1
  201. fi
  202. echo "$blackholed_details"
  203. print_db_state "Final Database State"