Skip to content

Commit

Permalink
changes
Browse files Browse the repository at this point in the history
  • Loading branch information
avishayt committed Nov 11, 2020
1 parent 123a482 commit 0e2f743
Show file tree
Hide file tree
Showing 9 changed files with 150 additions and 106 deletions.
1 change: 1 addition & 0 deletions discovery-infra/test_infra/consts.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
NODES_REGISTERED_TIMEOUT = 600
CLUSTER_INSTALLATION_TIMEOUT = 60 * 60 # 60 minutes
START_CLUSTER_INSTALLATION_TIMEOUT = 360
VALIDATION_TIMEOUT = 3 * 60
TF_TEMPLATE = "terraform_files"
NUMBER_OF_MASTERS = 3
TEST_INFRA = "test-infra"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,7 @@ def get_host_id(self, node_name):
return dom.UUIDString()

def get_cpu_cores(self, node_name):
dom = self.libvirt_connection.lookupByName(node_name)
current_xml = dom.XMLDesc(0)
xml = minidom.parseString(current_xml.encode('utf-8'))
xml = self._get_xml(node_name)
vcpu_element = xml.getElementsByTagName('vcpu')[0]
return int(vcpu_element.firstChild.nodeValue)

Expand All @@ -185,15 +183,22 @@ def set_cpu_cores(self, node_name, core_count):
dom.setVcpusFlags(core_count)
logging.info(f"Successfully set vcpus to {core_count} for node: {node_name}")

def get_ram_kib(self, node_name):
xml = self._get_xml(node_name)
memory_element = xml.getElementsByTagName('memory')[0]
return int(memory_element.firstChild.nodeValue)

def set_ram_kib(self, node_name, ram_kib):
logging.info(f"Going to set memory to {ram_kib} for node: {node_name}")
dom = self.libvirt_connection.lookupByName(node_name)
# dom.setMemoryFlags(ram_kib)
current_xml = dom.XMLDesc(0)
xml = minidom.parseString(current_xml.encode('utf-8'))
xml = self._get_xml(node_name)
memory_element = xml.getElementsByTagName('memory')[0]
memory_element.firstChild.replaceWholeText(ram_kib)
dom = self.libvirt_connection.defineXML(xml.toprettyxml())
if dom is None:
raise Exception(f"Failed to set memory for node: {node_name}")
logging.info(f"Successfully set memory to {ram_kib} for node: {node_name}")

def _get_xml(self, node_name):
dom = self.libvirt_connection.lookupByName(node_name)
current_xml = dom.XMLDesc(0)
return minidom.parseString(current_xml.encode('utf-8'))
11 changes: 11 additions & 0 deletions discovery-infra/test_infra/controllers/node_controllers/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ def __init__(self, name, node_controller, private_ssh_key_path=None, username="c
self.private_ssh_key_path = private_ssh_key_path
self.username = username
self.node_controller = node_controller
self.original_vcpu_count = self.get_cpu_cores()
self.original_ram_kib = self.get_ram_kib()
self._ips = []
self._macs = []

Expand Down Expand Up @@ -108,5 +110,14 @@ def get_cpu_cores(self):
def set_cpu_cores(self, core_count):
self.node_controller.set_cpu_cores(self.name, core_count)

def reset_cpu_cores(self):
self.set_cpu_cores(self.original_vcpu_count)

def get_ram_kib(self):
return self.node_controller.get_ram_kib(self.name)

def set_ram_kib(self, ram_kib):
self.node_controller.set_ram_kib(self.name, ram_kib)

def reset_ram_kib(self):
self.set_ram_kib(self.original_ram_kib)
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,8 @@ def get_cpu_cores(self, node_name: str) -> int:
def set_cpu_cores(self, node_name: str, core_count: int) -> None:
raise NotImplementedError

def set_ram_kib(self, node_name: str, ram_kib: int) -> None:
def get_ram_kib(self, node_name: str) -> int:
raise NotImplementedError

def set_ram_kib(self, node_name: str, ram_kib: int) -> None:
raise NotImplementedError
97 changes: 94 additions & 3 deletions discovery-infra/test_infra/helper_classes/cluster.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
import waiting

from tests.conftest import env_variables
from test_infra import consts, utils
Expand Down Expand Up @@ -47,12 +48,17 @@ def generate_and_download_image(
image_path=iso_download_path
)

def wait_until_hosts_are_discovered(self,nodes_count=env_variables['num_nodes']):
def wait_until_hosts_are_discovered(self, nodes_count=env_variables['num_nodes'],
additional_statuses=None
):
statuses=[consts.NodesStatus.PENDING_FOR_INPUT, consts.NodesStatus.KNOWN]
if additional_statuses:
statuses.extend(additional_statuses)
utils.wait_till_all_hosts_are_in_status(
client=self.api_client,
cluster_id=self.id,
nodes_count=nodes_count,
statuses=[consts.NodesStatus.PENDING_FOR_INPUT, consts.NodesStatus.KNOWN]
statuses=statuses
)

def set_host_roles(self):
Expand Down Expand Up @@ -83,7 +89,15 @@ def set_ingress_and_api_vips(self, vips):

def set_ssh_key(self, ssh_key):
logging.info(f"Setting SSH key:{ssh_key} for cluster: {self.id}")
self.api_client.update_cluster(self.id, ssh_key)
self.api_client.update_cluster(self.id, {"ssh_public_key": ssh_key})

def set_base_dns_domain(self, base_dns_domain):
logging.info(f"Setting base DNS domain:{base_dns_domain} for cluster: {self.id}")
self.api_client.update_cluster(self.id, {"base_dns_domain": base_dns_domain})

def set_pull_secret(self, pull_secret):
logging.info(f"Setting pull secret:{pull_secret} for cluster: {self.id}")
self.api_client.update_cluster(self.id, {"pull_secret": pull_secret})

def start_install(self):
self.api_client.install_cluster(cluster_id=self.id)
Expand Down Expand Up @@ -119,6 +133,13 @@ def wait_for_cluster_in_error_status(self):
statuses=[consts.ClusterStatus.ERROR]
)

def wait_for_cluster_in_pending_for_input_status(self):
utils.wait_till_cluster_is_in_status(
client=self.api_client,
cluster_id=self.id,
statuses=[consts.ClusterStatus.PENDING_FOR_INPUT]
)

def wait_for_at_least_one_host_to_boot_during_install(self, nodes_count=1):
utils.wait_till_at_least_one_host_is_in_stage(
client=self.api_client,
Expand Down Expand Up @@ -288,3 +309,73 @@ def setup_nodes(self, nodes):
nodes.start_all()
self.wait_until_hosts_are_discovered(nodes_count=len(nodes))
return nodes.create_nodes_cluster_hosts_mapping(cluster=self)

def wait_for_cluster_validation(
self, validation_section, validation_id, statuses,
timeout=consts.VALIDATION_TIMEOUT, interval=2
):
logging.info(f"Wait until cluster %s validation %s is in status %s",
self.id, validation_id, statuses)
try:
waiting.wait(
lambda: self.is_cluster_validation_in_status(
validation_section=validation_section,
validation_id=validation_id,
statuses=statuses
),
timeout_seconds=timeout,
sleep_seconds=interval,
waiting_for="Cluster validation to be in status %s" % statuses,
)
except:
logging.error("Cluster validation status is: %s",
utils.get_cluster_validation_value(
self.api_client.cluster_get(self.id), validation_section,
validation_id))
raise

def is_cluster_validation_in_status(
self, validation_section, validation_id, statuses
):
logging.info("Is cluster %s validation %s in status %s",
self.id, validation_id, statuses)
try:
return utils.get_cluster_validation_value(
self.api_client.cluster_get(self.id),
validation_section, validation_id) in statuses
except:
log.exception("Failed to get cluster %s validation info", self.id)

def wait_for_host_validation(
self, host_id, validation_section, validation_id, statuses,
timeout=consts.VALIDATION_TIMEOUT, interval=2
):
logging.info("Wait until host %s validation %s is in status %s", host_id,
validation_id, statuses)
try:
waiting.wait(
lambda: self.is_host_validation_in_status(
host_id=host_id,
validation_section=validation_section,
validation_id=validation_id,
statuses=statuses
),
timeout_seconds=timeout,
sleep_seconds=interval,
waiting_for="Host validation to be in status %s" % statuses,
)
except:
logging.error("Host validation status is: %s",
utils.get_host_validation_value(self.api_client.cluster_get(self.id),
host_id, validation_section, validation_id))
raise

def is_host_validation_in_status(
self, host_id, validation_section, validation_id, statuses
):
logging.info("Is host %s validation %s in status %s", host_id, validation_id, statuses)
try:
return utils.get_host_validation_value(self.api_client.cluster_get(self.id),
host_id, validation_section, validation_id) in statuses
except:
logging.exception("Failed to get cluster %s validation info", self.id)
61 changes: 0 additions & 61 deletions discovery-infra/test_infra/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -346,36 +346,6 @@ def is_cluster_in_status(client, cluster_id, statuses):
log.exception("Failed to get cluster %s info", cluster_id)


def wait_till_cluster_validation_is_in_status(
client, cluster_id, validation_section, validation_id, statuses, timeout=consts.VALIDATION_TIMEOUT, interval=2
):
log.info("Wait till cluster %s validation %s is in status %s", cluster_id, validation_id, statuses)
try:
waiting.wait(
lambda: is_cluster_validation_in_status(
client=client,
cluster_id=cluster_id,
validation_section=validation_section,
validation_id=validation_id,
statuses=statuses
),
timeout_seconds=timeout,
sleep_seconds=interval,
waiting_for="Cluster validation to be in status %s" % statuses,
)
except:
log.error("Cluster validation status is: %s", get_cluster_validation_value(client.cluster_get(cluster_id), validation_section, validation_id))
raise


def is_cluster_validation_in_status(client, cluster_id, validation_section, validation_id, statuses):
log.info("Is cluster %s validation %s in status %s", cluster_id, validation_id, statuses)
try:
return get_cluster_validation_value(client.cluster_get(cluster_id), validation_section, validation_id) in statuses
except:
log.exception("Failed to get cluster %s validation info", cluster_id)


def get_cluster_validation_value(cluster_info, validation_section, validation_id):
found_status = "validation not found"
validations = json.loads(cluster_info.validations_info)
Expand All @@ -386,37 +356,6 @@ def get_cluster_validation_value(cluster_info, validation_section, validation_id
return found_status


def wait_till_host_validation_is_in_status(
client, cluster_id, host_id, validation_section, validation_id, statuses, timeout=consts.VALIDATION_TIMEOUT, interval=2
):
log.info("Wait till host %s validation %s is in status %s", host_id, validation_id, statuses)
try:
waiting.wait(
lambda: is_host_validation_in_status(
client=client,
cluster_id=cluster_id,
host_id=host_id,
validation_section=validation_section,
validation_id=validation_id,
statuses=statuses
),
timeout_seconds=timeout,
sleep_seconds=interval,
waiting_for="Host validation to be in status %s" % statuses,
)
except:
log.error("Host validation status is: %s", get_host_validation_value(client.cluster_get(cluster_id), host_id, validation_section, validation_id))
raise


def is_host_validation_in_status(client, cluster_id, host_id, validation_section, validation_id, statuses):
log.info("Is host %s validation %s in status %s", host_id, validation_id, statuses)
try:
return get_host_validation_value(client.cluster_get(cluster_id), host_id, validation_section, validation_id) in statuses
except:
log.exception("Failed to get cluster %s validation info", cluster_id)


def get_host_validation_value(cluster_info, host_id, validation_section, validation_id):
for host in cluster_info.hosts:
if host.id != host_id:
Expand Down
12 changes: 3 additions & 9 deletions discovery-infra/tests/base_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ def nodes(self, setup_node_controller):
controller = setup_node_controller
nodes = Nodes(controller, env_variables["private_ssh_key_path"])
nodes.set_correct_boot_order(start_nodes=False)
nodes.run_for_all_nodes("reset_cpu_cores")
nodes.run_for_all_nodes("reset_ram_kib")
yield nodes
nodes.shutdown_all()
nodes.format_all_disks()
Expand Down Expand Up @@ -341,12 +343,4 @@ def assert_http_error_code(api_call, status, reason, **kwargs):
@staticmethod
def assert_cluster_validation(cluster_info, validation_section, validation_id, expected_status):
found_status = utils.get_cluster_validation_value(cluster_info, validation_section, validation_id)
assert found_status == expected_status, "Found validation status " + found_status + " rather than " + expected_status + " for validation " + validation_id

@staticmethod
def wait_for_cluster_validation(client, cluster_id, validation_section, validation_id, statuses):
utils.wait_till_cluster_validation_is_in_status(client, cluster_id, validation_section, validation_id, statuses)

@staticmethod
def wait_for_host_validation(client, cluster_id, host_id, validation_section, validation_id, statuses):
utils.wait_till_host_validation_is_in_status(client, cluster_id, host_id, validation_section, validation_id, statuses)
assert found_status == expected_status, "Found validation status " + found_status + " rather than " + expected_status + " for validation " + validation_id
2 changes: 1 addition & 1 deletion discovery-infra/tests/test_cancel_and_reset.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ def test_reset_cluster_after_changing_cluster_configuration(
new_cluster.set_ingress_and_api_vips({
'api_vip': api_vip,
'ingress_vip': ingress_vip})
new_cluster.set_ssh_key({'ssh_public_key': DUMMY_SSH_KEY})
new_cluster.set_ssh_key(DUMMY_SSH_KEY)
new_cluster.reboot_required_nodes_into_iso_after_reset(
nodes)
new_cluster.wait_until_hosts_are_discovered()
Expand Down
Loading

0 comments on commit 0e2f743

Please sign in to comment.