Class: ActivePostgres::RollbackManager
- Inherits:
-
Object
- Object
- ActivePostgres::RollbackManager
- Defined in:
- lib/active_postgres/rollback_manager.rb
Instance Attribute Summary collapse
-
#config ⇒ Object
readonly
Returns the value of attribute config.
-
#logger ⇒ Object
readonly
Returns the value of attribute logger.
-
#rollback_stack ⇒ Object
readonly
Returns the value of attribute rollback_stack.
-
#ssh_executor ⇒ Object
readonly
Returns the value of attribute ssh_executor.
Instance Method Summary collapse
-
#clear ⇒ Object
Clear all registered rollback actions.
-
#execute ⇒ Object
Execute all registered rollback actions in reverse order.
-
#initialize(config, ssh_executor, logger: nil) ⇒ RollbackManager
constructor
A new instance of RollbackManager.
-
#register(description, host: nil) { ... } ⇒ Object
Register a rollback action.
- #register_database_removal(host, database_name) ⇒ Object
- #register_directory_removal(host, dir_path) ⇒ Object
- #register_file_removal(host, file_path) ⇒ Object
- #register_package_removal(host, packages) ⇒ Object
-
#register_postgres_cluster_removal(host, version) ⇒ Object
Common rollback actions for PostgreSQL components.
- #register_postgres_user_removal(host, username) ⇒ Object
- #register_user_removal(host, username) ⇒ Object
-
#with_rollback(description: 'operation') { ... } ⇒ Object
Wrap a block with automatic rollback on failure.
Constructor Details
#initialize(config, ssh_executor, logger: nil) ⇒ RollbackManager
Returns a new instance of RollbackManager.
5 6 7 8 9 10 |
# File 'lib/active_postgres/rollback_manager.rb', line 5 def initialize(config, ssh_executor, logger: nil) @config = config @ssh_executor = ssh_executor @logger = logger || Logger.new @rollback_stack = [] end |
Instance Attribute Details
#config ⇒ Object (readonly)
Returns the value of attribute config.
3 4 5 |
# File 'lib/active_postgres/rollback_manager.rb', line 3 def config @config end |
#logger ⇒ Object (readonly)
Returns the value of attribute logger.
3 4 5 |
# File 'lib/active_postgres/rollback_manager.rb', line 3 def logger @logger end |
#rollback_stack ⇒ Object (readonly)
Returns the value of attribute rollback_stack.
3 4 5 |
# File 'lib/active_postgres/rollback_manager.rb', line 3 def rollback_stack @rollback_stack end |
#ssh_executor ⇒ Object (readonly)
Returns the value of attribute ssh_executor.
3 4 5 |
# File 'lib/active_postgres/rollback_manager.rb', line 3 def ssh_executor @ssh_executor end |
Instance Method Details
#clear ⇒ Object
Clear all registered rollback actions
52 53 54 |
# File 'lib/active_postgres/rollback_manager.rb', line 52 def clear rollback_stack.clear end |
#execute ⇒ Object
Execute all registered rollback actions in reverse order
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 |
# File 'lib/active_postgres/rollback_manager.rb', line 25 def execute return if rollback_stack.empty? logger.warn "Executing rollback (#{rollback_stack.count} actions)..." rollback_stack.reverse.each do |rollback| logger.info " Rolling back: #{rollback[:description]}" if rollback[:host] ssh_executor.execute_on_host(rollback[:host]) do instance_eval(&rollback[:action]) end else rollback[:action].call end logger.success ' Completed' rescue StandardError => e logger.error " Failed: #{e.}" # Continue with other rollback actions end clear logger.success 'Rollback completed' end |
#register(description, host: nil) { ... } ⇒ Object
Register a rollback action
16 17 18 19 20 21 22 |
# File 'lib/active_postgres/rollback_manager.rb', line 16 def register(description, host: nil, &block) rollback_stack.push({ description: description, host: host, action: block }) end |
#register_database_removal(host, database_name) ⇒ Object
114 115 116 117 118 119 120 121 122 123 |
# File 'lib/active_postgres/rollback_manager.rb', line 114 def register_database_removal(host, database_name) postgres_user = config.postgres_user executor = ssh_executor register("Drop database #{database_name} on #{host}", host: host) do sql = "DROP DATABASE IF EXISTS #{database_name};" executor.run_sql_on_backend(self, sql, postgres_user: postgres_user, tuples_only: false, capture: false) rescue StandardError nil end end |
#register_directory_removal(host, dir_path) ⇒ Object
98 99 100 101 102 103 104 |
# File 'lib/active_postgres/rollback_manager.rb', line 98 def register_directory_removal(host, dir_path) register("Remove directory #{dir_path} on #{host}", host: host) do execute :sudo, 'rm', '-rf', dir_path rescue StandardError nil end end |
#register_file_removal(host, file_path) ⇒ Object
90 91 92 93 94 95 96 |
# File 'lib/active_postgres/rollback_manager.rb', line 90 def register_file_removal(host, file_path) register("Remove file #{file_path} on #{host}", host: host) do execute :sudo, 'rm', '-f', file_path rescue StandardError nil end end |
#register_package_removal(host, packages) ⇒ Object
82 83 84 85 86 87 88 |
# File 'lib/active_postgres/rollback_manager.rb', line 82 def register_package_removal(host, packages) register("Remove packages on #{host}: #{packages.join(', ')}", host: host) do execute :sudo, 'apt-get', 'remove', '-y', *packages rescue StandardError nil end end |
#register_postgres_cluster_removal(host, version) ⇒ Object
Common rollback actions for PostgreSQL components
71 72 73 74 75 76 77 78 79 80 |
# File 'lib/active_postgres/rollback_manager.rb', line 71 def register_postgres_cluster_removal(host, version) register("Remove PostgreSQL cluster on #{host}", host: host) do begin execute :sudo, 'systemctl', 'stop', 'postgresql' rescue StandardError nil end execute :sudo, 'pg_dropcluster', '--stop', version.to_s, 'main', rescue: nil end end |
#register_postgres_user_removal(host, username) ⇒ Object
125 126 127 128 129 130 131 132 133 134 |
# File 'lib/active_postgres/rollback_manager.rb', line 125 def register_postgres_user_removal(host, username) postgres_user = config.postgres_user executor = ssh_executor register("Drop PostgreSQL user #{username} on #{host}", host: host) do sql = "DROP USER IF EXISTS #{username};" executor.run_sql_on_backend(self, sql, postgres_user: postgres_user, tuples_only: false, capture: false) rescue StandardError nil end end |
#register_user_removal(host, username) ⇒ Object
106 107 108 109 110 111 112 |
# File 'lib/active_postgres/rollback_manager.rb', line 106 def register_user_removal(host, username) register("Remove user #{username} on #{host}", host: host) do execute :sudo, 'userdel', username rescue StandardError nil end end |
#with_rollback(description: 'operation') { ... } ⇒ Object
Wrap a block with automatic rollback on failure
59 60 61 62 63 64 65 66 67 |
# File 'lib/active_postgres/rollback_manager.rb', line 59 def with_rollback(description: 'operation') result = yield clear # Success - clear rollback stack result rescue StandardError => e logger.error "#{description} failed: #{e.}" execute if rollback_stack.any? raise end |