|
1 | 1 | import asyncio |
2 | 2 | import time |
3 | 3 |
|
| 4 | +from engine import Engine |
| 5 | +from enginefrontend import EngineFrontend |
4 | 6 | from node import Node |
5 | 7 | from node.utility import check_replica_locality |
6 | 8 |
|
|
22 | 24 | class volume_keywords: |
23 | 25 |
|
24 | 26 | def __init__(self): |
| 27 | + self.engine = Engine() |
| 28 | + self.enginefrontend = EngineFrontend() |
25 | 29 | self.node = Node() |
26 | 30 | self.volume = Volume() |
27 | 31 | self.replica = Replica() |
@@ -90,6 +94,37 @@ def wait_for_volume_not_attached_to_node(self, volume_name, node_name): |
90 | 94 | time.sleep(self.retry_interval) |
91 | 95 | assert False, f"Failed to wait for volume {volume_name} not attached to node {node_name}" |
92 | 96 |
|
| 97 | + def wait_for_volume_engine_node(self, volume_name, expected_node_name): |
| 98 | + for i in range(self.retry_count): |
| 99 | + logging(f"Waiting for volume {volume_name} engine to be on node {expected_node_name} ... ({i})") |
| 100 | + engine_node = self.engine.get_node(volume_name) |
| 101 | + if engine_node == expected_node_name: |
| 102 | + return |
| 103 | + time.sleep(self.retry_interval) |
| 104 | + assert False, f"Failed to wait for volume {volume_name} engine on node {expected_node_name}, actual: {engine_node}" |
| 105 | + |
| 106 | + def wait_for_volume_enginefrontend_node(self, volume_name, expected_node_name): |
| 107 | + for i in range(self.retry_count): |
| 108 | + logging(f"Waiting for volume {volume_name} enginefrontend to be on node {expected_node_name} ... ({i})") |
| 109 | + enginefrontend_node = self.enginefrontend.get_node(volume_name) |
| 110 | + if enginefrontend_node == expected_node_name: |
| 111 | + return |
| 112 | + time.sleep(self.retry_interval) |
| 113 | + assert False, f"Failed to wait for volume {volume_name} enginefrontend on node {expected_node_name}, actual: {enginefrontend_node}" |
| 114 | + |
| 115 | + def wait_for_volume_engine_and_enginefrontend_same_node(self, volume_name): |
| 116 | + for i in range(self.retry_count): |
| 117 | + logging(f"Waiting for volume {volume_name} engine and enginefrontend to be on same node ... ({i})") |
| 118 | + volume_node = self.get_volume_node(volume_name) |
| 119 | + engine_node = self.engine.get_node(volume_name) |
| 120 | + enginefrontend_node = self.enginefrontend.get_node(volume_name) |
| 121 | + |
| 122 | + if volume_node == engine_node and volume_node == enginefrontend_node: |
| 123 | + logging(f"Volume {volume_name} engine and enginefrontend are on same node: {volume_node}") |
| 124 | + return |
| 125 | + time.sleep(self.retry_interval) |
| 126 | + assert False, f"Failed to wait for volume {volume_name} engine and enginefrontend on same node. Volume node: {volume_node}, Engine node: {engine_node}, EngineFrontend node: {enginefrontend_node}" |
| 127 | + |
93 | 128 | def get_volume_instance_manager(self, volume_name): |
94 | 129 | volume = VolumeRest().get(volume_name) |
95 | 130 | assert len(volume['controllers']) == 1, f"Expect only one controller for volume {volume_name}; Got controllers: {volume['controllers']}" |
@@ -478,3 +513,15 @@ def expand_volume(self, volume_name, size): |
478 | 513 |
|
479 | 514 | def trim_volume(self, volume_name): |
480 | 515 | self.volume.trim_filesystem(volume_name) |
| 516 | + |
| 517 | + def get_volume_engine_node(self, volume_name): |
| 518 | + return self.engine.get_node(volume_name) |
| 519 | + |
| 520 | + def get_volume_enginefrontend_node(self, volume_name): |
| 521 | + return self.enginefrontend.get_node(volume_name) |
| 522 | + |
| 523 | + def get_volume_state(self, volume_name): |
| 524 | + return self.volume.get_state(volume_name) |
| 525 | + |
| 526 | + def verify_volume_never_detached_during_test(self, volume_name, start_time=None): |
| 527 | + return self.volume.verify_never_detached_during_test(volume_name, start_time) |
0 commit comments