def testScheduleUpgradeForALowerVersion(looper, tconf, nodeSet, validUpgrade, trustee, trusteeWallet): """ A node starts at version 1.2 running has scheduled upgrade for version 1.5 but get a txn for upgrade 1.4, it will schedule it and cancel upgrade to 1.5. """ upgr1 = deepcopy(validUpgrade) upgr2 = deepcopy(upgr1) upgr2[VERSION] = bumpVersion(upgr1[VERSION]) upgr2[NAME] += randomString(3) # upgr2[SHA256] = get_valid_code_hash() upgr2[ SHA256] = 'ef9c3984e7a31994d4f692139116120bd0dd1ff7e270b6a2d773f8f2f9214d4c' # An upgrade for higher version scheduled, it should pass ensureUpgradeSent(looper, trustee, trusteeWallet, upgr2) looper.run( eventually(checkUpgradeScheduled, nodeSet, upgr2[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled())) # An upgrade for lower version scheduled, the transaction should pass and # the upgrade should be scheduled ensureUpgradeSent(looper, trustee, trusteeWallet, upgr1) looper.run( eventually(checkUpgradeScheduled, nodeSet, upgr1[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled()))
def testDoNotScheduleUpgradeForALowerVersion(looper, tconf, nodeSet, validUpgrade, trustee, trusteeWallet): """ A node starts at version 1.2 running has scheduled upgrade for version 1.5 but get a txn for upgrade 1.4, it will not schedule it. To upgrade to 1.4, send cancel for 1.5 """ upgr1 = deepcopy(validUpgrade) upgr2 = deepcopy(upgr1) upgr2[VERSION] = bumpVersion(upgr1[VERSION]) upgr2[NAME] += randomString(3) # upgr2[SHA256] = get_valid_code_hash() upgr2[ SHA256] = 'ef9c3984e7a31994d4f692139116120bd0dd1ff7e270b6a2d773f8f2f9214d4c' # An upgrade for higher version scheduled, it should pass ensureUpgradeSent(looper, trustee, trusteeWallet, upgr2) looper.run( eventually(checkUpgradeScheduled, nodeSet, upgr2[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled())) # An upgrade for lower version scheduled, the transaction should pass but # the upgrade should not be scheduled ensureUpgradeSent(looper, trustee, trusteeWallet, upgr1) with pytest.raises(AssertionError): looper.run( eventually(checkUpgradeScheduled, nodeSet, upgr1[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled())) # Cancel the upgrade with higher version upgr3 = deepcopy(upgr2) upgr3[ACTION] = CANCEL ensureUpgradeSent(looper, trustee, trusteeWallet, upgr3) # Now the upgrade for lower version should be scheduled looper.run( eventually(checkUpgradeScheduled, nodeSet, upgr1[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled()))
def upgradeScheduled(validUpgradeSent, looper, nodeSet, validUpgrade): looper.run( eventually(checkUpgradeScheduled, nodeSet, validUpgrade[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled()))
def testNodeSchedulesUpgradeAfterRestart(upgradeScheduled, looper, nodeSet, validUpgrade, testNodeClass, tdirWithPoolTxns, tconf, allPluginsPath): names = [] while nodeSet: node = nodeSet.pop() names.append(node.name) node.cleanupOnStopping = False looper.removeProdable(node) node.stop() del node for nm in names: node = testNodeClass(nm, basedirpath=tdirWithPoolTxns, config=tconf, pluginPaths=allPluginsPath) looper.add(node) nodeSet.append(node) looper.run(checkNodesConnected(nodeSet)) ensureElectionsDone(looper=looper, nodes=nodeSet, retryWait=1) looper.run( eventually(checkUpgradeScheduled, nodeSet, validUpgrade[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled()))
def test_upgrade_does_not_get_into_loop_if_reinstall( looper, tconf, nodeSet, validUpgrade, trustee, trusteeWallet, monkeypatch): new_version = bumpedVersion() upgr1 = deepcopy(validUpgrade) upgr1[VERSION] = new_version upgr1[REINSTALL] = True # An upgrade scheduled, it should pass ensureUpgradeSent(looper, trustee, trusteeWallet, upgr1) looper.run( eventually( checkUpgradeScheduled, nodeSet, upgr1[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled())) # here we make nodes think they have upgraded successfully monkeypatch.setattr(sovrin_node.__metadata__, '__version__', new_version) check_no_loop(nodeSet, UpgradeLog.UPGRADE_SUCCEEDED)
def poolUpgradeScheduled(poolUpgradeSubmitted, poolNodesStarted, validUpgrade): nodes = poolNodesStarted.nodes.values() timeout = waits.expectedUpgradeScheduled() poolNodesStarted.looper.run( eventually(checkUpgradeScheduled, nodes, validUpgrade[VERSION], retryWait=1, timeout=timeout))
def test_do_upgrade_to_the_same_version_if_reinstall(looper, tconf, nodeSet, validUpgrade, trustee, trusteeWallet): upgr1 = deepcopy(validUpgrade) upgr1[VERSION] = codeVersion() upgr1[REINSTALL] = True # An upgrade scheduled, it should pass ensureUpgradeSent(looper, trustee, trusteeWallet, upgr1) looper.run(eventually(checkUpgradeScheduled, nodeSet, upgr1[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled()))
def test_do_not_upgrade_to_the_same_version(looper, tconf, nodeSet, validUpgrade, trustee, trusteeWallet): upgr1 = deepcopy(validUpgrade) upgr1[VERSION] = codeVersion() # An upgrade scheduled, it should pass ensureUpgradeSent(looper, trustee, trusteeWallet, upgr1) with pytest.raises(AssertionError): looper.run( eventually(checkUpgradeScheduled, nodeSet, upgr1[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled()))
def testDoNotScheduleUpgradeForALowerVersion(looper, tconf, nodeSet, validUpgrade, trustee, trusteeWallet): """ A node starts at version 1.2 running has scheduled upgrade for version 1.5 but get a txn for upgrade 1.4, it will not schedule it. To upgrade to 1.4, send cancel for 1.5 """ upgr1 = deepcopy(validUpgrade) upgr2 = deepcopy(upgr1) upgr2[VERSION] = bumpVersion(upgr1[VERSION]) upgr2[NAME] += randomString(3) # upgr2[SHA256] = get_valid_code_hash() upgr2[SHA256] = 'ef9c3984e7a31994d4f692139116120bd0dd1ff7e270b6a2d773f8f2f9214d4c' # An upgrade for higher version scheduled, it should pass ensureUpgradeSent(looper, trustee, trusteeWallet, upgr2) looper.run(eventually(checkUpgradeScheduled, nodeSet, upgr2[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled())) # An upgrade for lower version scheduled, the transaction should pass but # the upgrade should not be scheduled ensureUpgradeSent(looper, trustee, trusteeWallet, upgr1) with pytest.raises(AssertionError): looper.run(eventually(checkUpgradeScheduled, nodeSet, upgr1[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled())) # Cancel the upgrade with higher version upgr3 = deepcopy(upgr2) upgr3[ACTION] = CANCEL ensureUpgradeSent(looper, trustee, trusteeWallet, upgr3) # Now the upgrade for lower version should be scheduled looper.run(eventually(checkUpgradeScheduled, nodeSet, upgr1[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled()))
def testForcedUpgradeNoConsensusOnSingleNode(validUpgradeExpForceTrue, looper, nodeSet, trustee, trusteeWallet): nup = validUpgradeExpForceTrue.copy() nup.update({VERSION: bumpVersion(validUpgradeExpForceTrue[VERSION])}) for node in nodeSet: if node.name != "Alpha": node.cleanupOnStopping = False looper.removeProdable(node) node.stop() else: node.upgrader.scheduledUpgrade = None sendUpgrade(trustee, trusteeWallet, nup) def testsched(): for node in nodeSet: if node.name == "Alpha": assert node.upgrader.scheduledUpgrade assert node.upgrader.scheduledUpgrade[0] == nup[VERSION] looper.run(eventually(testsched, retryWait=1, timeout=waits.expectedUpgradeScheduled()))
def test_upgrade_does_not_get_into_loop_if_failed(looper, tconf, nodeSet, validUpgrade, trustee, trusteeWallet, monkeypatch): new_version = bumpedVersion() upgr1 = deepcopy(validUpgrade) upgr1[VERSION] = new_version # An upgrade scheduled, it should pass ensureUpgradeSent(looper, trustee, trusteeWallet, upgr1) looper.run( eventually( checkUpgradeScheduled, nodeSet, upgr1[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled())) # we have not patched sovrin_node version so nodes think the upgrade had # failed check_no_loop(nodeSet, UpgradeLog.UPGRADE_FAILED)
def testNodeSchedulesUpgradeAfterRestart(upgradeScheduled, looper, nodeSet, validUpgrade, testNodeClass, tdirWithPoolTxns, tconf, allPluginsPath): names = [] while nodeSet: node = nodeSet.pop() names.append(node.name) node.cleanupOnStopping = False looper.removeProdable(node) node.stop() del node for nm in names: node = testNodeClass(nm, basedirpath=tdirWithPoolTxns, config=tconf, pluginPaths=allPluginsPath) looper.add(node) nodeSet.append(node) looper.run(checkNodesConnected(nodeSet)) ensureElectionsDone(looper=looper, nodes=nodeSet, retryWait=1) looper.run(eventually(checkUpgradeScheduled, nodeSet, validUpgrade[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled()))
def testForcedUpgradeNoConsensusOnSingleNode(validUpgradeExpForceTrue, looper, nodeSet, trustee, trusteeWallet): nup = validUpgradeExpForceTrue.copy() nup.update({VERSION: bumpVersion(validUpgradeExpForceTrue[VERSION])}) for node in nodeSet: if node.name != "Alpha": node.cleanupOnStopping = False looper.removeProdable(node) node.stop() else: node.upgrader.scheduledUpgrade = None sendUpgrade(trustee, trusteeWallet, nup) def testsched(): for node in nodeSet: if node.name == "Alpha": assert node.upgrader.scheduledUpgrade assert node.upgrader.scheduledUpgrade[0] == nup[VERSION] looper.run( eventually(testsched, retryWait=1, timeout=waits.expectedUpgradeScheduled()))
def upgradeScheduledExpForceTrue(validUpgradeSentExpForceTrue, looper, nodeSet, validUpgradeExpForceTrue): looper.run(eventually(checkUpgradeScheduled, nodeSet, validUpgradeExpForceTrue[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled()))
def testUpgradeLatestUncancelledVersion(looper, txnPoolNodeSet, tconf, nodeThetaAdded, validUpgrade, trustee, trusteeWallet, tdirWithPoolTxns, allPluginsPath): """ A node starts and finds several upgrades but selects the latest one which is not cancelled, eg node is on version 1.2 but finds 1.3, 1.4 and 1.5 but since 1.5 is cancelled, it selects 1.4 """ nodeSet = txnPoolNodeSet newSteward, newStewardWallet, newNode = nodeThetaAdded for node in nodeSet[:-1]: node.nodestack.removeRemoteByName(newNode.nodestack.name) newNode.nodestack.removeRemoteByName(node.nodestack.name) newNode.stop() nodeSet = nodeSet[:-1] looper.removeProdable(newNode) upgr1 = deepcopy(validUpgrade) upgr2 = deepcopy(upgr1) upgr2[VERSION] = bumpVersion(upgr1[VERSION]) upgr2[NAME] += randomString(3) # upgr2[SHA256] = get_valid_code_hash() upgr2[ SHA256] = 'db34a72a90d026dae49c3b3f0436c8d3963476c77468ad955845a1ccf7b03f55' upgr3 = deepcopy(upgr2) upgr3[VERSION] = bumpVersion(upgr2[VERSION]) upgr3[NAME] += randomString(3) # upgr3[SHA256] = get_valid_code_hash() upgr3[ SHA256] = '112c060527e8cecfafe64dcb5bdabc4010cc7b64e0bf9bc2a43d23c37d927128' upgr4 = deepcopy(upgr3) upgr4[ACTION] = CANCEL ensureUpgradeSent(looper, trustee, trusteeWallet, upgr1) looper.run( eventually(checkUpgradeScheduled, nodeSet[:-1], upgr1[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled())) ensureUpgradeSent(looper, trustee, trusteeWallet, upgr2) looper.run( eventually(checkUpgradeScheduled, nodeSet[:-1], upgr2[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled())) ensureUpgradeSent(looper, trustee, trusteeWallet, upgr3) looper.run( eventually(checkUpgradeScheduled, nodeSet[:-1], upgr3[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled())) ensureUpgradeSent(looper, trustee, trusteeWallet, upgr4) looper.run( eventually(checkUpgradeScheduled, nodeSet[:-1], upgr2[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled())) trustee.stopRetrying() newNode = TestNode(newNode.name, basedirpath=tdirWithPoolTxns, config=tconf, pluginPaths=allPluginsPath, ha=newNode.nodestack.ha, cliha=newNode.clientstack.ha) looper.add(newNode) nodeSet.append(newNode) looper.run(checkNodesConnected(nodeSet)) looper.run( eventually(checkUpgradeScheduled, [ newNode, ], upgr2[VERSION], retryWait=1, timeout=waits.expectedUpgradeScheduled()))