Module harvester_e2e_tests.integrations.test_z_terraform

Functions

def clusternetwork_resource(unique_name, tf_resource)
Expand source code
@pytest.fixture(scope="module")
def clusternetwork_resource(unique_name, tf_resource):
    name = f"cnet-{datetime.strptime(unique_name, '%Hh%Mm%Ss%f-%m-%d').strftime('%H%M%S')}"
    spec = tf_resource.cluster_network(f"tf_{unique_name}", name)
    return spec, name
def image_resource(unique_name, image_opensuse, tf_resource)
Expand source code
@pytest.fixture(scope="module")
def image_resource(unique_name, image_opensuse, tf_resource):
    spec = tf_resource.image_download(
        f"tf_{unique_name}", unique_name, unique_name, image_opensuse.url
    )
    return spec, unique_name, image_opensuse
def ssh_key_resource(ssh_keypair, unique_name, tf_resource)
Expand source code
@pytest.fixture(scope="module")
def ssh_key_resource(ssh_keypair, unique_name, tf_resource):
    pub_key, _ = ssh_keypair
    spec = tf_resource.ssh_key(f"tf_{unique_name}", unique_name, pub_key)
    return spec, unique_name, pub_key
def test_create_image(api_client, tf_harvester, image_resource)
Expand source code
@pytest.mark.p0
@pytest.mark.terraform
@pytest.mark.dependency(name="create_image")
def test_create_image(api_client, tf_harvester, image_resource):
    spec, unique_name, img_info = image_resource
    tf_harvester.save_as(spec.ctx, "images")

    out, err, code = tf_harvester.apply_resource(spec.type, spec.name)
    assert not err and 0 == code

    code, data = api_client.images.get(unique_name)
    assert 200 == code
    assert img_info.url == data['spec']['url']
def test_create_ssh_key(api_client, tf_harvester, ssh_key_resource)
Expand source code
@pytest.mark.p0
@pytest.mark.terraform
@pytest.mark.dependency(name="create_ssh_key")
def test_create_ssh_key(api_client, tf_harvester, ssh_key_resource):
    spec, unique_name, _ = ssh_key_resource
    tf_harvester.save_as(spec.ctx, "ssh_key")

    out, err, code = tf_harvester.apply_resource(spec.type, spec.name)
    assert not err and 0 == code

    code, data = api_client.keypairs.get(unique_name)
    assert 200 == code
def test_create_volume(api_client, tf_harvester, volume_resource)
Expand source code
@pytest.mark.p0
@pytest.mark.terraform
@pytest.mark.dependency(name="create_volume")
def test_create_volume(api_client, tf_harvester, volume_resource):
    spec, unique_name, size = volume_resource
    tf_harvester.save_as(spec.ctx, "volumes")

    out, err, code = tf_harvester.apply_resource(spec.type, spec.name)
    assert not err and 0 == code

    code, data = api_client.volumes.get(unique_name)
    assert 200 == code
    vol_spec = api_client.volumes.Spec.from_dict(data)
    assert size == vol_spec.size
def test_create_volume_from_image(api_client, tf_harvester, tf_resource, image_resource)
Expand source code
@pytest.mark.p0
@pytest.mark.terraform
def test_create_volume_from_image(api_client, tf_harvester, tf_resource, image_resource):
    spec, unique_name, img_info = image_resource
    tf_harvester.save_as(spec.ctx, "images")

    out, err, code = tf_harvester.apply_resource(spec.type, spec.name)
    assert not err and 0 == code

    code, data = api_client.images.get(unique_name)

    vol_name, size = f"vol-from-img-{unique_name}", "10Gi"
    spec = tf_resource.volume(
        f"tf_{vol_name}", vol_name, size, image=f"{data['metadata']['namespace']}/{unique_name}"
    )
    tf_harvester.save_as(spec.ctx, "vol_from_img")

    out, err, code = tf_harvester.apply_resource(spec.type, spec.name)
    assert not err and 0 == code

    code, data = api_client.volumes.get(vol_name)
    assert 200 == code
    vol_spec = api_client.volumes.Spec.from_dict(data)
    assert size == vol_spec.size

    # Teardown
    api_client.volumes.delete(vol_name)
def test_delete_image(api_client, wait_timeout, tf_harvester, image_resource)
Expand source code
@pytest.mark.p0
@pytest.mark.terraform
@pytest.mark.dependency(depends=["create_image"])
def test_delete_image(api_client, wait_timeout, tf_harvester, image_resource):
    spec, unique_name, _ = image_resource

    out, err, rc = tf_harvester.destroy_resource(spec.type, spec.name)
    assert not err and 0 == rc

    endtime = datetime.now() + timedelta(seconds=wait_timeout)
    while endtime > datetime.now():
        code, data = api_client.images.get(unique_name)
        if 404 == code:
            break
    else:
        raise AssertionError(
            "Terraform destroy image fail\n"
            f"stdout: {out}\nstderr: {err}, code: {rc}"
        )
def test_delete_ssh_key(api_client, tf_harvester, ssh_key_resource)
Expand source code
@pytest.mark.p0
@pytest.mark.terraform
@pytest.mark.dependency(depends=["create_ssh_key"])
def test_delete_ssh_key(api_client, tf_harvester, ssh_key_resource):
    spec, unique_name, _ = ssh_key_resource

    out, err, code = tf_harvester.destroy_resource(spec.type, spec.name)
    assert not err and 0 == code

    code, data = api_client.keypairs.get(unique_name)
    assert 404 == code
def test_delete_volume(api_client, wait_timeout, tf_harvester, volume_resource)
Expand source code
@pytest.mark.p0
@pytest.mark.terraform
@pytest.mark.dependency(depends=["create_volume"])
def test_delete_volume(api_client, wait_timeout, tf_harvester, volume_resource):
    spec, unique_name, _ = volume_resource

    out, err, rc = tf_harvester.destroy_resource(spec.type, spec.name)
    assert not err and 0 == rc

    endtime = datetime.now() + timedelta(seconds=wait_timeout)
    while endtime > datetime.now():
        code, data = api_client.volumes.get(unique_name)
        if 404 == code:
            break
    else:
        raise AssertionError(
            "Terraform destroy volume fail\n"
            f"stdout: {out}\nstderr:{err}, code: {rc}"
        )
def vlanconfig_resource(request, unique_name, tf_resource, clusternetwork_resource)
Expand source code
@pytest.fixture(scope="module")
def vlanconfig_resource(request, unique_name, tf_resource, clusternetwork_resource):
    vlan_nic = request.config.getoption('--vlan-nic')
    assert vlan_nic, f"VLAN NIC {vlan_nic} not configured correctly."

    _, clusternetwork_name = clusternetwork_resource
    name, nics = f"{clusternetwork_name}-{vlan_nic}".lower(), [vlan_nic]
    spec = tf_resource.vlanconfig(f"tf_{unique_name}", name, clusternetwork_name, nics)

    return spec, name, clusternetwork_name, nics
def vmnetwork_resource(request, unique_name, tf_resource, clusternetwork_resource)
Expand source code
@pytest.fixture(scope="module")
def vmnetwork_resource(request, unique_name, tf_resource, clusternetwork_resource):
    vlan_id = request.config.getoption('--vlan-id')
    assert 4095 > vlan_id > 0, (f"VLAN ID should in range 1-4094, not {vlan_id}")

    _, clusternetwork_name = clusternetwork_resource
    spec = tf_resource.network(f"tf_{unique_name}", unique_name, vlan_id, clusternetwork_name)

    return spec, unique_name, vlan_id, clusternetwork_name
def volume_resource(unique_name, tf_resource)
Expand source code
@pytest.fixture(scope="module")
def volume_resource(unique_name, tf_resource):
    size = "2Gi"
    spec = tf_resource.volume(f"tf_{unique_name}", unique_name, size)
    return spec, unique_name, size

Classes

class TestNetworking
Expand source code
@pytest.mark.p0
@pytest.mark.terraform
class TestNetworking:
    @pytest.mark.dependency(name="create_clusternetwork")
    def test_create_clusternetwork(self, api_client, tf_harvester, clusternetwork_resource):
        spec, unique_name = clusternetwork_resource
        tf_harvester.save_as(spec.ctx, "clusternetwork")

        out, err, code = tf_harvester.apply_resource(spec.type, spec.name)
        assert not err and 0 == code

        code, data = api_client.clusternetworks.get(unique_name)
        assert 200 == code

    @pytest.mark.dependency(name="create_vlanconfig", depends=["create_clusternetwork"])
    def test_create_vlanconfig(self, api_client, tf_harvester, vlanconfig_resource):
        spec, unique_name, cnet_name, nics = vlanconfig_resource
        tf_harvester.save_as(spec.ctx, "vlanconfig")

        out, err, code = tf_harvester.apply_resource(spec.type, spec.name)
        assert not err and 0 == code

        code, data = api_client.clusternetworks.get_config(unique_name)
        assert 200 == code
        assert cnet_name == data['spec']['clusterNetwork']
        assert nics == data['spec']['uplink']['nics']

    @pytest.mark.dependency(name="create_vm_network", depends=["create_vlanconfig"])
    def test_create_vm_network(self, api_client, tf_harvester, vmnetwork_resource):
        spec, unique_name, vlan_id, cnet_name = vmnetwork_resource
        tf_harvester.save_as(spec.ctx, "vmnetwork")

        out, err, code = tf_harvester.apply_resource(spec.type, spec.name)
        assert not err and 0 == code

        code, data = api_client.networks.get(unique_name)
        assert 200 == code
        config = json.loads(data['spec'].get('config', ""))
        assert vlan_id == config['vlan']
        assert cnet_name in config['bridge']

    @pytest.mark.dependency(depends=["create_vm_network"])
    def test_delete_vm_network(self, api_client, tf_harvester, vmnetwork_resource):
        spec, unique_name, *_ = vmnetwork_resource

        out, err, code = tf_harvester.destroy_resource(spec.type, spec.name)
        assert not err and 0 == code

        code, data = api_client.networks.get(unique_name)
        assert 404 == code

    @pytest.mark.dependency(depends=["create_vlanconfig"])
    def test_delete_vlanconfig(self, api_client, wait_timeout, tf_harvester, vlanconfig_resource):
        spec, unique_name, *_ = vlanconfig_resource

        out, err, rc = tf_harvester.destroy_resource(spec.type, spec.name)
        assert not err and 0 == rc

        endtime = datetime.now() + timedelta(seconds=wait_timeout)
        while endtime > datetime.now():
            code, data = api_client.clusternetworks.get_config(unique_name)
            if 404 == code:
                break
        else:
            raise AssertionError(
                "Terraform destroy vlanconfig fail\n"
                f"stdout: {out}\nstderr: {err}, code: {rc}"
            )

    @pytest.mark.dependency(depends=["create_clusternetwork"])
    def test_delete_clusternetwork(
        self, api_client, wait_timeout, tf_harvester, clusternetwork_resource
    ):
        spec, unique_name, *_ = clusternetwork_resource

        out, err, rc = tf_harvester.destroy_resource(spec.type, spec.name)
        assert not err and 0 == rc

        endtime = datetime.now() + timedelta(seconds=wait_timeout)
        while endtime > datetime.now():
            code, data = api_client.clusternetworks.get(unique_name)
            if 404 == code:
                break
        else:
            raise AssertionError(
                "Terraform destroy clusternetwork fail\n"
                f"stdout: {out}\nstderr: {err}, code: {rc}"
            )

Class variables

var pytestmark

Methods

def test_create_clusternetwork(self, api_client, tf_harvester, clusternetwork_resource)
Expand source code
@pytest.mark.dependency(name="create_clusternetwork")
def test_create_clusternetwork(self, api_client, tf_harvester, clusternetwork_resource):
    spec, unique_name = clusternetwork_resource
    tf_harvester.save_as(spec.ctx, "clusternetwork")

    out, err, code = tf_harvester.apply_resource(spec.type, spec.name)
    assert not err and 0 == code

    code, data = api_client.clusternetworks.get(unique_name)
    assert 200 == code
def test_create_vlanconfig(self, api_client, tf_harvester, vlanconfig_resource)
Expand source code
@pytest.mark.dependency(name="create_vlanconfig", depends=["create_clusternetwork"])
def test_create_vlanconfig(self, api_client, tf_harvester, vlanconfig_resource):
    spec, unique_name, cnet_name, nics = vlanconfig_resource
    tf_harvester.save_as(spec.ctx, "vlanconfig")

    out, err, code = tf_harvester.apply_resource(spec.type, spec.name)
    assert not err and 0 == code

    code, data = api_client.clusternetworks.get_config(unique_name)
    assert 200 == code
    assert cnet_name == data['spec']['clusterNetwork']
    assert nics == data['spec']['uplink']['nics']
def test_create_vm_network(self, api_client, tf_harvester, vmnetwork_resource)
Expand source code
@pytest.mark.dependency(name="create_vm_network", depends=["create_vlanconfig"])
def test_create_vm_network(self, api_client, tf_harvester, vmnetwork_resource):
    spec, unique_name, vlan_id, cnet_name = vmnetwork_resource
    tf_harvester.save_as(spec.ctx, "vmnetwork")

    out, err, code = tf_harvester.apply_resource(spec.type, spec.name)
    assert not err and 0 == code

    code, data = api_client.networks.get(unique_name)
    assert 200 == code
    config = json.loads(data['spec'].get('config', ""))
    assert vlan_id == config['vlan']
    assert cnet_name in config['bridge']
def test_delete_clusternetwork(self, api_client, wait_timeout, tf_harvester, clusternetwork_resource)
Expand source code
@pytest.mark.dependency(depends=["create_clusternetwork"])
def test_delete_clusternetwork(
    self, api_client, wait_timeout, tf_harvester, clusternetwork_resource
):
    spec, unique_name, *_ = clusternetwork_resource

    out, err, rc = tf_harvester.destroy_resource(spec.type, spec.name)
    assert not err and 0 == rc

    endtime = datetime.now() + timedelta(seconds=wait_timeout)
    while endtime > datetime.now():
        code, data = api_client.clusternetworks.get(unique_name)
        if 404 == code:
            break
    else:
        raise AssertionError(
            "Terraform destroy clusternetwork fail\n"
            f"stdout: {out}\nstderr: {err}, code: {rc}"
        )
def test_delete_vlanconfig(self, api_client, wait_timeout, tf_harvester, vlanconfig_resource)
Expand source code
@pytest.mark.dependency(depends=["create_vlanconfig"])
def test_delete_vlanconfig(self, api_client, wait_timeout, tf_harvester, vlanconfig_resource):
    spec, unique_name, *_ = vlanconfig_resource

    out, err, rc = tf_harvester.destroy_resource(spec.type, spec.name)
    assert not err and 0 == rc

    endtime = datetime.now() + timedelta(seconds=wait_timeout)
    while endtime > datetime.now():
        code, data = api_client.clusternetworks.get_config(unique_name)
        if 404 == code:
            break
    else:
        raise AssertionError(
            "Terraform destroy vlanconfig fail\n"
            f"stdout: {out}\nstderr: {err}, code: {rc}"
        )
def test_delete_vm_network(self, api_client, tf_harvester, vmnetwork_resource)
Expand source code
@pytest.mark.dependency(depends=["create_vm_network"])
def test_delete_vm_network(self, api_client, tf_harvester, vmnetwork_resource):
    spec, unique_name, *_ = vmnetwork_resource

    out, err, code = tf_harvester.destroy_resource(spec.type, spec.name)
    assert not err and 0 == code

    code, data = api_client.networks.get(unique_name)
    assert 404 == code