Esempio n. 1
0
 def test_manual_failover_from_leader(self):
     self.ha.has_lock = true
     self.ha.cluster = get_cluster_initialized_with_leader(
         Failover(0, 'blabla', ''))
     self.assertEquals(self.ha.run_cycle(),
                       'no action.  i am the leader with the lock')
     self.ha.cluster = get_cluster_initialized_with_leader(
         Failover(0, '', MockPostgresql.name))
     self.assertEquals(self.ha.run_cycle(),
                       'no action.  i am the leader with the lock')
     self.ha.cluster = get_cluster_initialized_with_leader(
         Failover(0, '', 'blabla'))
     self.assertEquals(self.ha.run_cycle(),
                       'no action.  i am the leader with the lock')
     f = Failover(0, MockPostgresql.name, '')
     self.ha.cluster = get_cluster_initialized_with_leader(f)
     self.assertEquals(self.ha.run_cycle(),
                       'manual failover: demoting myself')
     self.ha.fetch_node_status = lambda e: (e, True, True, 0, {
         'nofailover': 'True'
     })
     self.assertEquals(self.ha.run_cycle(),
                       'no action.  i am the leader with the lock')
     # manual failover from the previous leader to us won't happen if we hold the nofailover flag
     self.ha.cluster = get_cluster_initialized_with_leader(
         Failover(0, 'blabla', MockPostgresql.name))
     self.assertEquals(self.ha.run_cycle(),
                       'no action.  i am the leader with the lock')
Esempio n. 2
0
    def test_manual_failover_from_leader(self):
        self.ha.fetch_node_status = get_node_status()
        self.ha.has_lock = true
        self.ha.cluster = get_cluster_initialized_with_leader(
            Failover(0, 'blabla', '', None))
        self.assertEquals(self.ha.run_cycle(),
                          'no action.  i am the leader with the lock')
        self.ha.cluster = get_cluster_initialized_with_leader(
            Failover(0, '', self.p.name, None))
        self.assertEquals(self.ha.run_cycle(),
                          'no action.  i am the leader with the lock')
        self.ha.cluster = get_cluster_initialized_with_leader(
            Failover(0, '', 'blabla', None))
        self.assertEquals(self.ha.run_cycle(),
                          'no action.  i am the leader with the lock')
        f = Failover(0, self.p.name, '', None)
        self.ha.cluster = get_cluster_initialized_with_leader(f)
        self.assertEquals(self.ha.run_cycle(),
                          'manual failover: demoting myself')
        self.ha.fetch_node_status = get_node_status(nofailover=True)
        self.assertEquals(self.ha.run_cycle(),
                          'no action.  i am the leader with the lock')
        self.ha.fetch_node_status = get_node_status(xlog_location=1)
        self.assertEquals(self.ha.run_cycle(),
                          'no action.  i am the leader with the lock')
        # manual failover from the previous leader to us won't happen if we hold the nofailover flag
        self.ha.cluster = get_cluster_initialized_with_leader(
            Failover(0, 'blabla', self.p.name, None))
        self.assertEquals(self.ha.run_cycle(),
                          'no action.  i am the leader with the lock')

        # Failover scheduled time must include timezone
        scheduled = datetime.datetime.now()
        self.ha.cluster = get_cluster_initialized_with_leader(
            Failover(0, 'blabla', self.p.name, scheduled))
        self.ha.run_cycle()

        scheduled = datetime.datetime.utcnow().replace(tzinfo=tzutc)
        self.ha.cluster = get_cluster_initialized_with_leader(
            Failover(0, 'blabla', self.p.name, scheduled))
        self.assertEquals('no action.  i am the leader with the lock',
                          self.ha.run_cycle())

        scheduled = scheduled + datetime.timedelta(seconds=30)
        self.ha.cluster = get_cluster_initialized_with_leader(
            Failover(0, 'blabla', self.p.name, scheduled))
        self.assertEquals('no action.  i am the leader with the lock',
                          self.ha.run_cycle())

        scheduled = scheduled + datetime.timedelta(seconds=-600)
        self.ha.cluster = get_cluster_initialized_with_leader(
            Failover(0, 'blabla', self.p.name, scheduled))
        self.assertEquals('no action.  i am the leader with the lock',
                          self.ha.run_cycle())

        scheduled = None
        self.ha.cluster = get_cluster_initialized_with_leader(
            Failover(0, 'blabla', self.p.name, scheduled))
        self.assertEquals('no action.  i am the leader with the lock',
                          self.ha.run_cycle())
Esempio n. 3
0
 def test_manual_failover_from_leader_in_pause(self):
     self.ha.has_lock = true
     self.ha.is_paused = true
     scheduled = datetime.datetime.now()
     self.ha.cluster = get_cluster_initialized_with_leader(Failover(0, 'blabla', self.p.name, scheduled))
     self.assertEquals('PAUSE: no action.  i am the leader with the lock', self.ha.run_cycle())
     self.ha.cluster = get_cluster_initialized_with_leader(Failover(0, self.p.name, '', None))
     self.assertEquals('PAUSE: no action.  i am the leader with the lock', self.ha.run_cycle())
Esempio n. 4
0
 def test_manual_failover_from_leader_in_synchronous_mode(self):
     self.p.is_leader = true
     self.ha.has_lock = true
     self.ha.is_synchronous_mode = true
     self.ha.is_failover_possible = false
     self.ha.process_sync_replication = Mock()
     self.ha.cluster = get_cluster_initialized_with_leader(Failover(0, self.p.name, 'a', None), (self.p.name, None))
     self.assertEquals('no action.  i am the leader with the lock', self.ha.run_cycle())
     self.ha.cluster = get_cluster_initialized_with_leader(Failover(0, self.p.name, 'a', None), (self.p.name, 'a'))
     self.ha.is_failover_possible = true
     self.assertEquals('manual failover: demoting myself', self.ha.run_cycle())
Esempio n. 5
0
 def test_manual_failover_process_no_leader_in_pause(self):
     self.ha.is_paused = true
     self.ha.cluster = get_cluster_initialized_without_leader(failover=Failover(0, '', 'other', None))
     self.assertEquals(self.ha.run_cycle(), 'PAUSE: continue to run as master without lock')
     self.ha.cluster = get_cluster_initialized_without_leader(failover=Failover(0, 'leader', '', None))
     self.assertEquals(self.ha.run_cycle(), 'PAUSE: continue to run as master without lock')
     self.ha.cluster = get_cluster_initialized_without_leader(failover=Failover(0, 'leader', 'blabla', None))
     self.assertEquals('PAUSE: acquired session lock as a leader', self.ha.run_cycle())
     self.p.is_leader = false
     self.p.set_role('replica')
     self.ha.cluster = get_cluster_initialized_without_leader(failover=Failover(0, 'leader', self.p.name, None))
     self.assertEquals(self.ha.run_cycle(), 'PAUSE: promoted self to leader by acquiring session lock')
Esempio n. 6
0
 def test_manual_failover_while_starting(self):
     self.ha.has_lock = true
     self.p.check_for_startup = true
     f = Failover(0, self.p.name, '', None)
     self.ha.cluster = get_cluster_initialized_with_leader(f)
     self.ha.fetch_node_status = get_node_status()  # accessible, in_recovery
     self.assertEquals(self.ha.run_cycle(), 'manual failover: demoting myself')
Esempio n. 7
0
 def test_process_healthy_cluster_in_pause(self):
     self.p.is_leader = false
     self.ha.is_paused = true
     self.p.name = 'leader'
     self.ha.cluster = get_cluster_initialized_with_leader()
     self.assertEquals(self.ha.run_cycle(), 'PAUSE: removed leader lock because postgres is not running as master')
     self.ha.cluster = get_cluster_initialized_with_leader(Failover(0, '', self.p.name, None))
     self.assertEquals(self.ha.run_cycle(), 'PAUSE: waiting to become master after promote...')
Esempio n. 8
0
 def test_manual_failover_process_no_leader(self):
     self.p.is_leader = false
     self.ha.cluster = get_cluster_initialized_without_leader(
         failover=Failover(0, '', self.p.name, None))
     self.assertEquals(self.ha.run_cycle(),
                       'promoted self to leader by acquiring session lock')
     self.ha.cluster = get_cluster_initialized_without_leader(
         failover=Failover(0, '', 'leader', None))
     self.p.set_role('replica')
     self.assertEquals(self.ha.run_cycle(),
                       'promoted self to leader by acquiring session lock')
     self.ha.fetch_node_status = lambda e: (e, True, True, 0, {}
                                            )  # accessible, in_recovery
     self.assertEquals(
         self.ha.run_cycle(),
         'following a different leader because i am not the healthiest node'
     )
     self.ha.cluster = get_cluster_initialized_without_leader(
         failover=Failover(0, self.p.name, '', None))
     self.assertEquals(
         self.ha.run_cycle(),
         'following a different leader because i am not the healthiest node'
     )
     self.ha.fetch_node_status = lambda e: (e, False, True, 0, {}
                                            )  # inaccessible, in_recovery
     self.p.set_role('replica')
     self.assertEquals(self.ha.run_cycle(),
                       'promoted self to leader by acquiring session lock')
     # set failover flag to True for all members of the cluster
     # this should elect the current member, as we are not going to call the API for it.
     self.ha.cluster = get_cluster_initialized_without_leader(
         failover=Failover(0, '', 'other', None))
     self.ha.fetch_node_status = lambda e: (e, True, True, 0, {
         'nofailover': 'True'
     })  # accessible, in_recovery
     self.p.set_role('replica')
     self.assertEquals(self.ha.run_cycle(),
                       'promoted self to leader by acquiring session lock')
     # same as previous, but set the current member to nofailover. In no case it should be elected as a leader
     self.ha.patroni.nofailover = True
     self.assertEquals(
         self.ha.run_cycle(),
         'following a different leader because I am not allowed to promote')