@@ -9,40 +9,35 @@ module Failover
99 VROUTER_ID = env :VROUTER_ID , nil
1010
1111 SERVICES = {
12- 'one-router4' => { _ENABLED : 'ONEAPP_VNF_ROUTER4_ENABLED' ,
13- fallback : VROUTER_ID . nil? ? 'NO' : 'YES' } ,
12+ 'one-router4' => { _ENABLED : 'ONEAPP_VNF_ROUTER4_ENABLED' , fallback : VROUTER_ID . nil? ? 'NO' : 'YES' } ,
1413
15- 'one-nat4' => { _ENABLED : 'ONEAPP_VNF_NAT4_ENABLED' ,
16- fallback : 'NO' } ,
14+ 'one-nat4' => { _ENABLED : 'ONEAPP_VNF_NAT4_ENABLED' } ,
1715
18- 'one-lvs' => { _ENABLED : 'ONEAPP_VNF_LB_ENABLED' ,
19- fallback : 'NO' } ,
16+ 'one-lvs' => { _ENABLED : 'ONEAPP_VNF_LB_ENABLED' } ,
2017
21- 'one-haproxy' => { _ENABLED : 'ONEAPP_VNF_HAPROXY_ENABLED' ,
22- fallback : 'NO' } ,
18+ 'one-haproxy' => { _ENABLED : 'ONEAPP_VNF_HAPROXY_ENABLED' } ,
19+ 'haproxy' => { _ENABLED : 'ONEAPP_VNF_HAPROXY_ENABLED' , dependency : true } ,
2320
24- 'one-sdnat4' => { _ENABLED : 'ONEAPP_VNF_SDNAT4_ENABLED' ,
25- fallback : 'NO' } ,
21+ 'one-sdnat4' => { _ENABLED : 'ONEAPP_VNF_SDNAT4_ENABLED' } ,
2622
27- 'one-dns' => { _ENABLED : 'ONEAPP_VNF_DNS_ENABLED' ,
28- fallback : 'NO' } ,
23+ 'one-dns' => { _ENABLED : 'ONEAPP_VNF_DNS_ENABLED' } ,
24+ 'unbound' => { _ENABLED : 'ONEAPP_VNF_DNS_ENABLED' , dependency : true } ,
2925
30- 'one-dhcp4v2' => { _ENABLED : 'ONEAPP_VNF_DHCP4_ENABLED' ,
31- fallback : 'NO' } ,
26+ 'one-dhcp4v2' => { _ENABLED : 'ONEAPP_VNF_DHCP4_ENABLED' } ,
27+ 'coredhcp' => { _ENABLED : 'ONEAPP_VNF_DHCP4_ENABLED' , dependency : true } ,
3228
33- 'one-wg' => { _ENABLED : 'ONEAPP_VNF_WG_ENABLED' ,
34- fallback : 'NO' }
29+ 'one-wg' => { _ENABLED : 'ONEAPP_VNF_WG_ENABLED' }
3530 }
3631
3732 FIFO_PATH = '/run/keepalived/vrrp_notify_fifo.sock'
3833 STATE_PATH = '/run/one-failover.state'
3934
4035 STATE_TO_DIRECTION = {
4136 'BACKUP' => :down ,
42- 'DELETED' => :down ,
43- 'FAULT' => :down ,
37+ 'DELETED' => :stay ,
38+ 'FAULT' => :stay ,
4439 'MASTER' => :up ,
45- 'STOP' => :down ,
40+ 'STOP' => :stay ,
4641 nil => :stay
4742 }
4843
@@ -62,7 +57,11 @@ def to_task(event)
6257 direction = :stay
6358 ignored = true
6459 else
65- if STATE_TO_DIRECTION [ event [ :state ] ] == STATE_TO_DIRECTION [ state [ :state ] ]
60+ case
61+ when event [ :state ] == 'BACKUP'
62+ direction = STATE_TO_DIRECTION [ 'BACKUP' ]
63+ ignored = false
64+ when STATE_TO_DIRECTION [ event [ :state ] ] == STATE_TO_DIRECTION [ state [ :state ] ]
6665 direction = :stay
6766 ignored = false
6867 else
@@ -100,13 +99,12 @@ def process_events(fifo_path = FIFO_PATH)
10099 f . each do |line |
101100 event = to_event line
102101 task = to_task event
103- msg :info , task
102+ msg :debug , task
104103 method ( task [ :direction ] ) . call
105104 end
106105 end
107106 rescue StandardError => e
108107 msg :error , e . full_message
109-
110108 # NOTE: We always disable all services on fatal errors
111109 # to avoid any potential conflicts.
112110 down
@@ -117,70 +115,88 @@ def process_events(fifo_path = FIFO_PATH)
117115 end
118116 end
119117
120- def execute
121- msg :info , 'Failover::execute'
122- process_events
123- end
124-
125- def stay
126- msg :debug , :STAY
127- end
128-
129- def up
130- msg :debug , :UP
131-
132- load_env
133-
118+ def wait_ready ( role = :master )
134119 # Give one-context 30 seconds to fully start..
135120 6 . times do
136121 bash 'rc-service one-context status' , terminate : false
137122 break
138- rescue RuntimeError
123+ rescue RuntimeError => e
124+ msg :error , e . full_message
139125 sleep 5
140126 end . then do |result |
141- unless result . nil?
142- msg :error , 'one-context not ready!'
143- return
144- end
127+ msg :error , 'one-context not ready!' unless result . nil?
145128 end
146-
147- # Give keepalived 30 seconds to setup VIPs..
129+ # Give keepalived 30 seconds to fully start..
148130 6 . times do
149- bash ' rc-service keepalived ready', terminate : false
131+ bash " rc-service keepalived #{ role == :master ? ' ready' : 'standby' } " , terminate : false
150132 break
151- rescue RuntimeError
133+ rescue RuntimeError => e
134+ msg :error , e . full_message
152135 sleep 5
153136 end . then do |result |
154- unless result . nil?
155- msg :error , 'keepalived not ready!'
156- return
157- end
137+ msg :error , 'keepalived not ready!' unless result . nil?
158138 end
139+ end
140+
141+ def execute
142+ msg :info , 'Failover::execute'
143+ process_events
144+ end
145+
146+ def stay
147+ msg :debug , ":STAY (pid = #{ Process . pid } )"
148+ end
149+
150+ def up
151+ msg :debug , ":UP (pid = #{ Process . pid } )"
152+
153+ wait_ready :master
154+
155+ load_env
159156
160157 SERVICES . each do |service , settings |
161- enabled = env settings [ :_ENABLED ] , settings [ :fallback ]
158+ if env settings [ :_ENABLED ] , ( settings [ :fallback ] || 'NO' )
159+ next if settings [ :dependency ]
162160
163- msg :debug , "#{ service } (#{ enabled ? ' :enabled' : ':disabled' } )"
161+ msg :info , "#{ service } (:enabled)"
164162
165- if enabled
166- bash "rc-service #{ service } restart ||:" , terminate : false
163+ puts bash "rc-service #{ service } restart ||:" , terminate : false
167164 else
168- bash "rc-service #{ service } stop ||:" , terminate : false
169- end
165+ msg :info , "#{ service } (:disabled)"
170166
171- sleep 1
167+ puts bash "rc-service #{ service } stop ||:" , terminate : false
168+ end
172169 end
170+
171+ puts bash 'rc-update -v -u ||:' , terminate : false
173172 end
174173
175174 def down
176- msg :debug , :DOWN
175+ msg :debug , ":DOWN (pid = #{ Process . pid } )"
176+
177+ wait_ready :standby
178+
179+ 12 . times do |attempt |
180+ services = bash 'rc-status --nocolor --format ini --servicelist' , terminate : false
177181
178- SERVICES . each do |service , _ |
179- msg :debug , "#{ service } (:disabled)"
182+ stopped = services . lines . map ( &:split )
183+ . select { |_ , _ , s | s == 'stopped' }
184+ . map ( &:first )
180185
181- bash "rc-service #{ service } stop ||:" , terminate : false
186+ break if ( running = SERVICES . keys - stopped ) . empty?
182187
183- sleep 1
188+ running . each do |service |
189+ msg :info , "#{ service } (:disabled)"
190+
191+ puts bash "rc-service #{ service } stop ||:" , terminate : false
192+ end
193+
194+ puts bash 'rc-update -v -u ||:' , terminate : false
195+ rescue RuntimeError => e
196+ msg :error , e . full_message
197+ sleep 5
198+ end . then do |result |
199+ msg :error , 'could not stop services!' unless result . nil?
184200 end
185201 end
186202end
0 commit comments