Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gracefully setup/teardown network configs and sanitize ISO URL #1799

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions harvester_e2e_tests/fixtures/networks.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ def network_checker(api_client, wait_timeout, sleep_timeout):
class NetworkChecker:
def __init__(self):
self.networks = api_client.networks
self.clusternetworks = api_client.clusternetworks

@wait_until(wait_timeout, sleep_timeout)
def wait_routed(self, vnet_name):
Expand All @@ -33,4 +34,11 @@ def wait_routed(self, vnet_name):
return True, (code, data)
return False, (code, data)

@wait_until(wait_timeout, sleep_timeout)
def wait_cnet_config_created(self, cnet_config_name):
code, data = api_client.clusternetworks.get_config(cnet_config_name)
if code == 200:
return True, (code, data)
return False, (code, data)

return NetworkChecker()
12 changes: 9 additions & 3 deletions harvester_e2e_tests/fixtures/upgrades.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def __init__(self):
self.upgrades = api_client.upgrades

@wait_until(wait_timeout, sleep_timeout)
def wait_upgrade_version_created(self, version):
def wait_version_created(self, version):
code, data = self.versions.get(version)
if code == 200:
return True, (code, data)
Expand All @@ -25,7 +25,10 @@ def wait_upgrade_fail_by_invalid_iso_url(self, upgrade_name):
verified = [
"False" == conds.get('Completed', {}).get('status'),
"False" == conds.get('ImageReady', {}).get('status'),
"no such host" in conds.get('ImageReady', {}).get('message', "")
any([
"no such host" in conds.get('ImageReady', {}).get('message', ""), # >= v1.4.0
"retry limit" in conds.get('ImageReady', {}).get('message', "") # < v1.4.0
])
]
if all(verified):
return True, (code, data)
Expand All @@ -38,7 +41,10 @@ def wait_upgrade_fail_by_invalid_checksum(self, upgrade_name):
verified = [
"False" == conds.get('Completed', {}).get('status'),
"False" == conds.get('ImageReady', {}).get('status'),
"n't match the file actual check" in conds.get('ImageReady', {}).get('message', "")
any([
"actual check" in conds.get('ImageReady', {}).get('message', ""), # >= v1.4.0
"retry limit" in conds.get('ImageReady', {}).get('message', "") # < v1.4.0
])
]
if all(verified):
return True, (code, data)
Expand Down
41 changes: 27 additions & 14 deletions harvester_e2e_tests/integrations/test_upgrade.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,11 @@ def harvester_crds(api_client):

@pytest.fixture(scope="module")
def upgrade_target(request, unique_name):
version = request.config.getoption('--upgrade-target-version')
version = request.config.getoption('--upgrade-target-version').strip()
version = version or f"upgrade-{unique_name}"
iso_url = request.config.getoption('--upgrade-iso-url')
iso_url = request.config.getoption('--upgrade-iso-url').strip()
assert iso_url, "Target ISO URL should not be empty"
checksum = request.config.getoption("--upgrade-iso-checksum")
checksum = request.config.getoption("--upgrade-iso-checksum").strip()
assert checksum, "Checksum for Target ISO should not be empty"

return version, iso_url, checksum
Expand Down Expand Up @@ -118,7 +118,7 @@ def image(api_client, image_ubuntu, unique_name, wait_timeout):


@pytest.fixture(scope='module')
def cluster_network(vlan_nic, api_client, unique_name):
def cluster_network(vlan_nic, api_client, unique_name, network_checker, wait_timeout):
code, data = api_client.clusternetworks.get_config()
assert 200 == code, (code, data)

Expand Down Expand Up @@ -158,17 +158,24 @@ def cluster_network(vlan_nic, api_client, unique_name):
f"Created: {created}\t Remaining: {all_nodes}\n"
f"API Status({code}): {data}"
)
cnet_config_created, (code, data) = network_checker.wait_cnet_config_created(node)
assert cnet_config_created, (code, data)
created.append(node)

yield cnet

# Teardown
deleted = {name: api_client.clusternetworks.delete_config(name) for name in created}
failed = [(name, code, data) for name, (code, data) in deleted.items() if 200 != code]
if failed:
fmt = "Unable to delete VLAN Config {} with error ({}): {}"
endtime = datetime.now() + timedelta(seconds=wait_timeout)
while endtime > datetime.now() and created:
name = created.pop(0)
code, data = api_client.clusternetworks.delete_config(name)
if code != 404:
created.append(name)
sleep(1)
else:
raise AssertionError(
"\n".join(fmt.format(name, code, data) for (name, code, data) in failed)
f"Failed to remove network configs {created} after {wait_timeout}s\n"
f"Last API Status({code}): {data}"
)

code, data = api_client.clusternetworks.delete(cnet)
Expand Down Expand Up @@ -409,7 +416,7 @@ def test_iso_url(self, api_client, unique_name, upgrade_checker):
if code != 200:
code, data = api_client.versions.create(version, url, checksum)
assert code == 201, f"Failed to create invalid version: {data}"
version_created, (code, data) = upgrade_checker.wait_upgrade_version_created(version)
version_created, (code, data) = upgrade_checker.wait_version_created(version)
assert version_created, (code, data)

code, data = api_client.upgrades.create(version)
Expand Down Expand Up @@ -441,7 +448,7 @@ def test_checksum(self, api_client, unique_name, upgrade_target, resort, upgrade

code, data = api_client.versions.create(version, url, checksum[resort])
assert 201 == code, f"Failed to create upgrade for {version}"
version_created, (code, data) = upgrade_checker.wait_upgrade_version_created(version)
version_created, (code, data) = upgrade_checker.wait_version_created(version)
assert version_created, (code, data)

code, data = api_client.upgrades.create(version)
Expand Down Expand Up @@ -483,8 +490,8 @@ def test_version_compatibility(
api_client.versions.delete(version)

def test_degraded_volume(
self, api_client, vm_shell_from_host, upgrade_target, stopped_vm,
vm_checker, volume_checker
self, api_client, unique_name, vm_shell_from_host, upgrade_target, stopped_vm,
vm_checker, volume_checker, upgrade_checker
):
"""
Criteria: create upgrade should fails if there are any degraded volumes
Expand Down Expand Up @@ -535,8 +542,11 @@ def test_degraded_volume(

# create upgrade and verify it is not allowed
version, url, checksum = upgrade_target
version = f"{version}-{unique_name}"
code, data = api_client.versions.create(version, url, checksum)
assert code == 201, f"Failed to create version {version}: {data}"
version_created, (code, data) = upgrade_checker.wait_version_created(version)
assert version_created, (code, data)
code, data = api_client.upgrades.create(version)
assert code == 400, f"Failed to verify degraded volume: {code}, {data}"

Expand Down Expand Up @@ -723,7 +733,8 @@ def test_preq_setup_vms(

@pytest.mark.dependency(name="any_nodes_upgrade")
def test_perform_upgrade(
self, api_client, unique_name, upgrade_target, upgrade_timeout, interceptor
self, api_client, unique_name, upgrade_target, upgrade_timeout, interceptor,
upgrade_checker
):
"""
- perform upgrade
Expand All @@ -740,6 +751,8 @@ def test_perform_upgrade(
version = f"{version}-{unique_name}"
code, data = api_client.versions.create(version, url, checksum)
assert 201 == code, f"Failed to create upgrade for {version}"
version_created, (code, data) = upgrade_checker.wait_version_created(version)
assert version_created, (code, data)
code, data = api_client.upgrades.create(version, annotations=skip_version_check)
assert 201 == code, f"Failed to start upgrade for {version}"
upgrade_name = data['metadata']['name']
Expand Down
Loading