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] = randomString(32) upgr3 = deepcopy(upgr2) upgr3[VERSION] = bumpVersion(upgr2[VERSION]) upgr3[NAME] += randomString(3) upgr3[SHA256] = randomString(32) upgr4 = deepcopy(upgr3) upgr4[ACTION] = CANCEL ensureUpgradeSent(looper, trustee, trusteeWallet, upgr1) looper.run(eventually(checkUpgradeScheduled, nodeSet[:-1], upgr1[VERSION], retryWait=1, timeout=5)) ensureUpgradeSent(looper, trustee, trusteeWallet, upgr2) looper.run(eventually(checkUpgradeScheduled, nodeSet[:-1], upgr2[VERSION], retryWait=1, timeout=5)) ensureUpgradeSent(looper, trustee, trusteeWallet, upgr3) looper.run(eventually(checkUpgradeScheduled, nodeSet[:-1], upgr3[VERSION], retryWait=1, timeout=5)) ensureUpgradeSent(looper, trustee, trusteeWallet, upgr4) looper.run(eventually(checkUpgradeScheduled, nodeSet[:-1], upgr2[VERSION], retryWait=1, timeout=5)) 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, overrideTimeout=30)) looper.run(eventually(checkUpgradeScheduled, [newNode, ], upgr2[VERSION], retryWait=1, timeout=10))
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 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 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 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 validUpgradeExpForceTrue(validUpgradeExpForceFalse): nup = validUpgradeExpForceFalse.copy() nup.update({FORCE: True}) nup.update({VERSION: bumpVersion(validUpgradeExpForceFalse[VERSION])}) return nup
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()))
def validUpgradeExpForceTrue(validUpgradeExpForceFalse): nup = validUpgradeExpForceFalse.copy() nup.update({FORCE: True}) nup.update({VERSION: bumpVersion(validUpgradeExpForceFalse[VERSION])}) return nup