From 5dfdc7ccc5b0b4cbc89cf099493ca46fbe6e19cf Mon Sep 17 00:00:00 2001 From: khushboo-rancher Date: Mon, 25 Sep 2023 22:02:17 +0000 Subject: [PATCH] Update testing docs Signed-off-by: khushboo-rancher --- index.html | 2 +- integration/common.html | 174 ++++++++++++++++++++++++++++++ integration/test_csi.html | 218 ++++++++++++++++++++++++++++---------- 3 files changed, 336 insertions(+), 58 deletions(-) diff --git a/index.html b/index.html index 7c4962d598..bfdcea594a 100644 --- a/index.html +++ b/index.html @@ -1,7 +1,7 @@ - + Longhorn Manual Test Cases diff --git a/integration/common.html b/integration/common.html index a41acd7a6b..7926754ac8 100644 --- a/integration/common.html +++ b/integration/common.html @@ -1562,6 +1562,35 @@ <h1 class="title">Module <code>tests.common</code></h1> return sc_manifest +@pytest.fixture +def crypto_secret(request): + manifest = { + 'apiVersion': 'v1', + 'kind': 'Secret', + 'metadata': { + 'name': 'longhorn-crypto', + 'namespace': 'longhorn-system', + }, + 'stringData': { + 'CRYPTO_KEY_VALUE': 'simple', + 'CRYPTO_KEY_PROVIDER': 'secret' + } + } + + def finalizer(): + api = get_core_api_client() + try: + api.delete_namespaced_secret( + name=manifest['metadata']['name'], + namespace=manifest['metadata']['namespace']) + except ApiException as e: + assert e.status == 404 + + request.addfinalizer(finalizer) + + return manifest + + @pytest.fixture def priority_class(request): priority_class = { @@ -1717,6 +1746,7 @@ <h1 class="title">Module <code>tests.common</code></h1> if backing_image_feature_supported(client): cleanup_all_backing_images(client) + cleanup_crypto_secret() cleanup_storage_class() if system_backup_feature_supported(client): system_restores_cleanup(client) @@ -3826,6 +3856,43 @@ <h1 class="title">Module <code>tests.common</code></h1> assert s_set.status.ready_replicas == replicas +def create_crypto_secret(secret_manifest): + api = get_core_api_client() + api.create_namespaced_secret(namespace=LONGHORN_NAMESPACE, + body=secret_manifest) + + +def delete_crypto_secret(secret_manifest): + api = get_core_api_client() + try: + api.delete_namespaced_secret(secret_manifest, + body=k8sclient.V1DeleteOptions()) + except ApiException as e: + assert e.status == 404 + + +def cleanup_crypto_secret(): + secret_deletes = ["longhorn-crypto"] + api = get_core_api_client() + ret = api.list_namespaced_secret(namespace=LONGHORN_NAMESPACE) + for sc in ret.items: + if sc.metadata.name in secret_deletes: + delete_crypto_secret(sc.metadata.name) + + ok = False + for _ in range(RETRY_COUNTS): + ok = True + ret = api.list_namespaced_secret(namespace=LONGHORN_NAMESPACE) + for s in ret.items: + if s.metadata.name in secret_deletes: + ok = False + break + if ok: + break + time.sleep(RETRY_INTERVAL) + assert ok + + def create_storage_class(sc_manifest): api = get_storage_api_client() api.create_storage_class( @@ -6734,6 +6801,7 @@ <h2 id="returns">Returns</h2> if backing_image_feature_supported(client): cleanup_all_backing_images(client) + cleanup_crypto_secret() cleanup_storage_class() if system_backup_feature_supported(client): system_restores_cleanup(client) @@ -6754,6 +6822,37 @@ <h2 id="returns">Returns</h2> ["mkdir", "-p", DEFAULT_REPLICA_DIRECTORY])</code></pre> </details> </dd> +<dt id="tests.common.cleanup_crypto_secret"><code class="name flex"> +<span>def <span class="ident">cleanup_crypto_secret</span></span>(<span>)</span> +</code></dt> +<dd> +<div class="desc"></div> +<details class="source"> +<summary> +<span>Expand source code</span> +</summary> +<pre><code class="python">def cleanup_crypto_secret(): + secret_deletes = ["longhorn-crypto"] + api = get_core_api_client() + ret = api.list_namespaced_secret(namespace=LONGHORN_NAMESPACE) + for sc in ret.items: + if sc.metadata.name in secret_deletes: + delete_crypto_secret(sc.metadata.name) + + ok = False + for _ in range(RETRY_COUNTS): + ok = True + ret = api.list_namespaced_secret(namespace=LONGHORN_NAMESPACE) + for s in ret.items: + if s.metadata.name in secret_deletes: + ok = False + break + if ok: + break + time.sleep(RETRY_INTERVAL) + assert ok</code></pre> +</details> +</dd> <dt id="tests.common.cleanup_host_disk"><code class="name flex"> <span>def <span class="ident">cleanup_host_disk</span></span>(<span>vol_name)</span> </code></dt> @@ -7516,6 +7615,21 @@ <h2 id="returns">Returns</h2> return backup_volume, backup, data_checksum</code></pre> </details> </dd> +<dt id="tests.common.create_crypto_secret"><code class="name flex"> +<span>def <span class="ident">create_crypto_secret</span></span>(<span>secret_manifest)</span> +</code></dt> +<dd> +<div class="desc"></div> +<details class="source"> +<summary> +<span>Expand source code</span> +</summary> +<pre><code class="python">def create_crypto_secret(secret_manifest): + api = get_core_api_client() + api.create_namespaced_secret(namespace=LONGHORN_NAMESPACE, + body=secret_manifest)</code></pre> +</details> +</dd> <dt id="tests.common.create_host_disk"><code class="name flex"> <span>def <span class="ident">create_host_disk</span></span>(<span>client, vol_name, size, node_id)</span> </code></dt> @@ -7872,6 +7986,44 @@ <h2 id="returns">Returns</h2> return volume, volume_data</code></pre> </details> </dd> +<dt id="tests.common.crypto_secret"><code class="name flex"> +<span>def <span class="ident">crypto_secret</span></span>(<span>request)</span> +</code></dt> +<dd> +<div class="desc"></div> +<details class="source"> +<summary> +<span>Expand source code</span> +</summary> +<pre><code class="python">@pytest.fixture +def crypto_secret(request): + manifest = { + 'apiVersion': 'v1', + 'kind': 'Secret', + 'metadata': { + 'name': 'longhorn-crypto', + 'namespace': 'longhorn-system', + }, + 'stringData': { + 'CRYPTO_KEY_VALUE': 'simple', + 'CRYPTO_KEY_PROVIDER': 'secret' + } + } + + def finalizer(): + api = get_core_api_client() + try: + api.delete_namespaced_secret( + name=manifest['metadata']['name'], + namespace=manifest['metadata']['namespace']) + except ApiException as e: + assert e.status == 404 + + request.addfinalizer(finalizer) + + return manifest</code></pre> +</details> +</dd> <dt id="tests.common.csi_pv"><code class="name flex"> <span>def <span class="ident">csi_pv</span></span>(<span>request)</span> </code></dt> @@ -8179,6 +8331,24 @@ <h2 id="args">Args</h2> wait_for_backup_volume_delete(client, volume_name)</code></pre> </details> </dd> +<dt id="tests.common.delete_crypto_secret"><code class="name flex"> +<span>def <span class="ident">delete_crypto_secret</span></span>(<span>secret_manifest)</span> +</code></dt> +<dd> +<div class="desc"></div> +<details class="source"> +<summary> +<span>Expand source code</span> +</summary> +<pre><code class="python">def delete_crypto_secret(secret_manifest): + api = get_core_api_client() + try: + api.delete_namespaced_secret(secret_manifest, + body=k8sclient.V1DeleteOptions()) + except ApiException as e: + assert e.status == 404</code></pre> +</details> +</dd> <dt id="tests.common.delete_replica_on_test_node"><code class="name flex"> <span>def <span class="ident">delete_replica_on_test_node</span></span>(<span>client, volume_name)</span> </code></dt> @@ -14855,6 +15025,7 @@ <h1>Index</h1> <li><code><a title="tests.common.cleanup_all_support_bundles" href="#tests.common.cleanup_all_support_bundles">cleanup_all_support_bundles</a></code></li> <li><code><a title="tests.common.cleanup_all_volumes" href="#tests.common.cleanup_all_volumes">cleanup_all_volumes</a></code></li> <li><code><a title="tests.common.cleanup_client" href="#tests.common.cleanup_client">cleanup_client</a></code></li> +<li><code><a title="tests.common.cleanup_crypto_secret" href="#tests.common.cleanup_crypto_secret">cleanup_crypto_secret</a></code></li> <li><code><a title="tests.common.cleanup_host_disk" href="#tests.common.cleanup_host_disk">cleanup_host_disk</a></code></li> <li><code><a title="tests.common.cleanup_host_disks" href="#tests.common.cleanup_host_disks">cleanup_host_disks</a></code></li> <li><code><a title="tests.common.cleanup_node_disks" href="#tests.common.cleanup_node_disks">cleanup_node_disks</a></code></li> @@ -14877,6 +15048,7 @@ <h1>Index</h1> <li><code><a title="tests.common.create_backing_image_with_matching_url" href="#tests.common.create_backing_image_with_matching_url">create_backing_image_with_matching_url</a></code></li> <li><code><a title="tests.common.create_backup" href="#tests.common.create_backup">create_backup</a></code></li> <li><code><a title="tests.common.create_backup_from_volume_attached_to_pod" href="#tests.common.create_backup_from_volume_attached_to_pod">create_backup_from_volume_attached_to_pod</a></code></li> +<li><code><a title="tests.common.create_crypto_secret" href="#tests.common.create_crypto_secret">create_crypto_secret</a></code></li> <li><code><a title="tests.common.create_host_disk" href="#tests.common.create_host_disk">create_host_disk</a></code></li> <li><code><a title="tests.common.create_pv_for_volume" href="#tests.common.create_pv_for_volume">create_pv_for_volume</a></code></li> <li><code><a title="tests.common.create_pvc" href="#tests.common.create_pvc">create_pvc</a></code></li> @@ -14891,6 +15063,7 @@ <h1>Index</h1> <li><code><a title="tests.common.create_volume" href="#tests.common.create_volume">create_volume</a></code></li> <li><code><a title="tests.common.create_volume_and_backup" href="#tests.common.create_volume_and_backup">create_volume_and_backup</a></code></li> <li><code><a title="tests.common.create_volume_and_write_data" href="#tests.common.create_volume_and_write_data">create_volume_and_write_data</a></code></li> +<li><code><a title="tests.common.crypto_secret" href="#tests.common.crypto_secret">crypto_secret</a></code></li> <li><code><a title="tests.common.csi_pv" href="#tests.common.csi_pv">csi_pv</a></code></li> <li><code><a title="tests.common.csi_pv_backingimage" href="#tests.common.csi_pv_backingimage">csi_pv_backingimage</a></code></li> <li><code><a title="tests.common.csi_pvc_name" href="#tests.common.csi_pvc_name">csi_pvc_name</a></code></li> @@ -14903,6 +15076,7 @@ <h1>Index</h1> <li><code><a title="tests.common.delete_and_wait_volume_attachment" href="#tests.common.delete_and_wait_volume_attachment">delete_and_wait_volume_attachment</a></code></li> <li><code><a title="tests.common.delete_backup" href="#tests.common.delete_backup">delete_backup</a></code></li> <li><code><a title="tests.common.delete_backup_volume" href="#tests.common.delete_backup_volume">delete_backup_volume</a></code></li> +<li><code><a title="tests.common.delete_crypto_secret" href="#tests.common.delete_crypto_secret">delete_crypto_secret</a></code></li> <li><code><a title="tests.common.delete_replica_on_test_node" href="#tests.common.delete_replica_on_test_node">delete_replica_on_test_node</a></code></li> <li><code><a title="tests.common.delete_replica_processes" href="#tests.common.delete_replica_processes">delete_replica_processes</a></code></li> <li><code><a title="tests.common.delete_statefulset" href="#tests.common.delete_statefulset">delete_statefulset</a></code></li> diff --git a/integration/test_csi.html b/integration/test_csi.html index bab8a748b2..712e17e8f0 100644 --- a/integration/test_csi.html +++ b/integration/test_csi.html @@ -35,6 +35,7 @@ <h1 class="title">Module <code>tests.test_csi</code></h1> import time from common import client, core_api, apps_api # NOQA from common import csi_pv, pod_make, pvc, storage_class # NOQA +from common import crypto_secret # NOQA from common import make_deployment_with_pvc # NOQA from common import pod as pod_manifest # NOQA from common import Mi, Gi, DEFAULT_VOLUME_SIZE, EXPANDED_VOLUME_SIZE @@ -42,8 +43,10 @@ <h1 class="title">Module <code>tests.test_csi</code></h1> from common import VOLUME_CONDITION_SCHEDULED from common import SETTING_REPLICA_NODE_SOFT_ANTI_AFFINITY from common import SETTING_REPLICA_REPLENISHMENT_WAIT_INTERVAL +from common import LONGHORN_NAMESPACE from common import create_and_wait_pod, create_pvc_spec, delete_and_wait_pod from common import size_to_string, create_storage_class, create_pvc +from common import create_crypto_secret from common import delete_and_wait_pvc, delete_and_wait_pv from common import wait_and_get_pv_for_pvc from common import generate_random_data, read_volume_data @@ -283,11 +286,48 @@ <h1 class="title">Module <code>tests.test_csi</code></h1> 6. Delete the pod and create `pod2` to use the same volume 7. Validate the data in `pod2` is consistent with `test_data` """ + + storage_class['reclaimPolicy'] = 'Retain' + create_storage_class(storage_class) + + create_and_verify_block_volume(client, core_api, storage_class, pvc, + pod_manifest) + + +@pytest.mark.csi # NOQA +def test_csi_encrypted_block_volume(client, core_api, storage_class, crypto_secret, pvc, pod_manifest): # NOQA + """ + Test CSI feature: encrypted block volume + + 1. Create a PVC with encrypted `volumeMode = Block` + 2. Create a pod using the PVC to dynamic provision a volume + 3. Verify the pod creation + 4. Generate `test_data` and write to the block volume directly in the pod + 5. Read the data back for validation + 6. Delete the pod and create `pod2` to use the same volume + 7. Validate the data in `pod2` is consistent with `test_data` + """ + + create_crypto_secret(crypto_secret) + + storage_class['reclaimPolicy'] = 'Retain' + storage_class['parameters']['csi.storage.k8s.io/provisioner-secret-name'] = 'longhorn-crypto' # NOQA + storage_class['parameters']['csi.storage.k8s.io/provisioner-secret-namespace'] = LONGHORN_NAMESPACE # NOQA + storage_class['parameters']['csi.storage.k8s.io/node-publish-secret-name'] = 'longhorn-crypto' # NOQA + storage_class['parameters']['csi.storage.k8s.io/node-publish-secret-namespace'] = LONGHORN_NAMESPACE # NOQA + storage_class['parameters']['csi.storage.k8s.io/node-stage-secret-name'] = 'longhorn-crypto' # NOQA + storage_class['parameters']['csi.storage.k8s.io/node-stage-secret-namespace'] = LONGHORN_NAMESPACE # NOQA + create_storage_class(storage_class) + + create_and_verify_block_volume(client, core_api, storage_class, pvc, + pod_manifest) + + +def create_and_verify_block_volume(client, core_api, storage_class, pvc, pod_manifest): # NOQA pod_name = 'csi-block-volume-test' pvc_name = pod_name + "-pvc" device_path = "/dev/longhorn/longhorn-test-blk" - storage_class['reclaimPolicy'] = 'Retain' pvc['metadata']['name'] = pvc_name pvc['spec']['volumeMode'] = 'Block' pvc['spec']['storageClassName'] = storage_class['metadata']['name'] @@ -308,7 +348,6 @@ <h1 class="title">Module <code>tests.test_csi</code></h1> {'name': 'longhorn-blk', 'devicePath': device_path} ] - create_storage_class(storage_class) create_pvc(pvc) pv_name = wait_and_get_pv_for_pvc(core_api, pvc_name).metadata.name create_and_wait_pod(core_api, pod_manifest) @@ -960,6 +999,75 @@ <h2 class="section-title" id="header-functions">Functions</h2> client.delete(volume2)</code></pre> </details> </dd> +<dt id="tests.test_csi.create_and_verify_block_volume"><code class="name flex"> +<span>def <span class="ident">create_and_verify_block_volume</span></span>(<span>client, core_api, storage_class, pvc, pod_manifest)</span> +</code></dt> +<dd> +<div class="desc"></div> +<details class="source"> +<summary> +<span>Expand source code</span> +</summary> +<pre><code class="python">def create_and_verify_block_volume(client, core_api, storage_class, pvc, pod_manifest): # NOQA + pod_name = 'csi-block-volume-test' + pvc_name = pod_name + "-pvc" + device_path = "/dev/longhorn/longhorn-test-blk" + + pvc['metadata']['name'] = pvc_name + pvc['spec']['volumeMode'] = 'Block' + pvc['spec']['storageClassName'] = storage_class['metadata']['name'] + pvc['spec']['resources'] = { + 'requests': { + 'storage': size_to_string(1 * Gi) + } + } + pod_manifest['metadata']['name'] = pod_name + pod_manifest['spec']['volumes'] = [{ + 'name': 'longhorn-blk', + 'persistentVolumeClaim': { + 'claimName': pvc_name, + }, + }] + pod_manifest['spec']['containers'][0]['volumeMounts'] = [] + pod_manifest['spec']['containers'][0]['volumeDevices'] = [ + {'name': 'longhorn-blk', 'devicePath': device_path} + ] + + create_pvc(pvc) + pv_name = wait_and_get_pv_for_pvc(core_api, pvc_name).metadata.name + create_and_wait_pod(core_api, pod_manifest) + + test_data = generate_random_data(VOLUME_RWTEST_SIZE) + test_offset = random.randint(0, VOLUME_RWTEST_SIZE) + write_pod_block_volume_data( + core_api, pod_name, test_data, test_offset, device_path) + returned_data = read_pod_block_volume_data( + core_api, pod_name, len(test_data), test_offset, device_path + ) + assert test_data == returned_data + md5_sum = get_pod_data_md5sum( + core_api, pod_name, device_path) + + delete_and_wait_pod(core_api, pod_name) + common.wait_for_volume_detached(client, pv_name) + + pod_name_2 = 'csi-block-volume-test-reuse' + pod_manifest['metadata']['name'] = pod_name_2 + create_and_wait_pod(core_api, pod_manifest) + + returned_data = read_pod_block_volume_data( + core_api, pod_name_2, len(test_data), test_offset, device_path + ) + assert test_data == returned_data + md5_sum_2 = get_pod_data_md5sum( + core_api, pod_name_2, device_path) + assert md5_sum == md5_sum_2 + + delete_and_wait_pod(core_api, pod_name_2) + delete_and_wait_pvc(core_api, pvc_name) + delete_and_wait_pv(core_api, pv_name)</code></pre> +</details> +</dd> <dt id="tests.test_csi.create_and_wait_csi_pod"><code class="name flex"> <span>def <span class="ident">create_and_wait_csi_pod</span></span>(<span>pod_name, client, core_api, csi_pv, pvc, pod_make, backing_image, from_backup)</span> </code></dt> @@ -1372,65 +1480,12 @@ <h2 class="section-title" id="header-functions">Functions</h2> 6. Delete the pod and create `pod2` to use the same volume 7. Validate the data in `pod2` is consistent with `test_data` """ - pod_name = 'csi-block-volume-test' - pvc_name = pod_name + "-pvc" - device_path = "/dev/longhorn/longhorn-test-blk" storage_class['reclaimPolicy'] = 'Retain' - pvc['metadata']['name'] = pvc_name - pvc['spec']['volumeMode'] = 'Block' - pvc['spec']['storageClassName'] = storage_class['metadata']['name'] - pvc['spec']['resources'] = { - 'requests': { - 'storage': size_to_string(1 * Gi) - } - } - pod_manifest['metadata']['name'] = pod_name - pod_manifest['spec']['volumes'] = [{ - 'name': 'longhorn-blk', - 'persistentVolumeClaim': { - 'claimName': pvc_name, - }, - }] - pod_manifest['spec']['containers'][0]['volumeMounts'] = [] - pod_manifest['spec']['containers'][0]['volumeDevices'] = [ - {'name': 'longhorn-blk', 'devicePath': device_path} - ] - create_storage_class(storage_class) - create_pvc(pvc) - pv_name = wait_and_get_pv_for_pvc(core_api, pvc_name).metadata.name - create_and_wait_pod(core_api, pod_manifest) - - test_data = generate_random_data(VOLUME_RWTEST_SIZE) - test_offset = random.randint(0, VOLUME_RWTEST_SIZE) - write_pod_block_volume_data( - core_api, pod_name, test_data, test_offset, device_path) - returned_data = read_pod_block_volume_data( - core_api, pod_name, len(test_data), test_offset, device_path - ) - assert test_data == returned_data - md5_sum = get_pod_data_md5sum( - core_api, pod_name, device_path) - - delete_and_wait_pod(core_api, pod_name) - common.wait_for_volume_detached(client, pv_name) - - pod_name_2 = 'csi-block-volume-test-reuse' - pod_manifest['metadata']['name'] = pod_name_2 - create_and_wait_pod(core_api, pod_manifest) - returned_data = read_pod_block_volume_data( - core_api, pod_name_2, len(test_data), test_offset, device_path - ) - assert test_data == returned_data - md5_sum_2 = get_pod_data_md5sum( - core_api, pod_name_2, device_path) - assert md5_sum == md5_sum_2 - - delete_and_wait_pod(core_api, pod_name_2) - delete_and_wait_pvc(core_api, pvc_name) - delete_and_wait_pv(core_api, pv_name)</code></pre> + create_and_verify_block_volume(client, core_api, storage_class, pvc, + pod_manifest)</code></pre> </details> </dd> <dt id="tests.test_csi.test_csi_block_volume_online_expansion"><code class="name flex"> @@ -1538,6 +1593,53 @@ <h2 class="section-title" id="header-functions">Functions</h2> assert pod_dev_md5 == volume_dev_md5</code></pre> </details> </dd> +<dt id="tests.test_csi.test_csi_encrypted_block_volume"><code class="name flex"> +<span>def <span class="ident">test_csi_encrypted_block_volume</span></span>(<span>client, core_api, storage_class, crypto_secret, pvc, pod_manifest)</span> +</code></dt> +<dd> +<div class="desc"><p>Test CSI feature: encrypted block volume</p> +<ol> +<li>Create a PVC with encrypted <code>volumeMode = Block</code></li> +<li>Create a pod using the PVC to dynamic provision a volume</li> +<li>Verify the pod creation</li> +<li>Generate <code>test_data</code> and write to the block volume directly in the pod</li> +<li>Read the data back for validation</li> +<li>Delete the pod and create <code>pod2</code> to use the same volume</li> +<li>Validate the data in <code>pod2</code> is consistent with <code>test_data</code></li> +</ol></div> +<details class="source"> +<summary> +<span>Expand source code</span> +</summary> +<pre><code class="python">@pytest.mark.csi # NOQA +def test_csi_encrypted_block_volume(client, core_api, storage_class, crypto_secret, pvc, pod_manifest): # NOQA + """ + Test CSI feature: encrypted block volume + + 1. Create a PVC with encrypted `volumeMode = Block` + 2. Create a pod using the PVC to dynamic provision a volume + 3. Verify the pod creation + 4. Generate `test_data` and write to the block volume directly in the pod + 5. Read the data back for validation + 6. Delete the pod and create `pod2` to use the same volume + 7. Validate the data in `pod2` is consistent with `test_data` + """ + + create_crypto_secret(crypto_secret) + + storage_class['reclaimPolicy'] = 'Retain' + storage_class['parameters']['csi.storage.k8s.io/provisioner-secret-name'] = 'longhorn-crypto' # NOQA + storage_class['parameters']['csi.storage.k8s.io/provisioner-secret-namespace'] = LONGHORN_NAMESPACE # NOQA + storage_class['parameters']['csi.storage.k8s.io/node-publish-secret-name'] = 'longhorn-crypto' # NOQA + storage_class['parameters']['csi.storage.k8s.io/node-publish-secret-namespace'] = LONGHORN_NAMESPACE # NOQA + storage_class['parameters']['csi.storage.k8s.io/node-stage-secret-name'] = 'longhorn-crypto' # NOQA + storage_class['parameters']['csi.storage.k8s.io/node-stage-secret-namespace'] = LONGHORN_NAMESPACE # NOQA + create_storage_class(storage_class) + + create_and_verify_block_volume(client, core_api, storage_class, pvc, + pod_manifest)</code></pre> +</details> +</dd> <dt id="tests.test_csi.test_csi_expansion_with_replica_failure"><code class="name flex"> <span>def <span class="ident">test_csi_expansion_with_replica_failure</span></span>(<span>client, core_api, storage_class, pvc, pod_manifest)</span> </code></dt> @@ -2122,6 +2224,7 @@ <h1>Index</h1> <li><h3><a href="#header-functions">Functions</a></h3> <ul class=""> <li><code><a title="tests.test_csi.backupstore_test" href="#tests.test_csi.backupstore_test">backupstore_test</a></code></li> +<li><code><a title="tests.test_csi.create_and_verify_block_volume" href="#tests.test_csi.create_and_verify_block_volume">create_and_verify_block_volume</a></code></li> <li><code><a title="tests.test_csi.create_and_wait_csi_pod" href="#tests.test_csi.create_and_wait_csi_pod">create_and_wait_csi_pod</a></code></li> <li><code><a title="tests.test_csi.create_and_wait_csi_pod_named_pv" href="#tests.test_csi.create_and_wait_csi_pod_named_pv">create_and_wait_csi_pod_named_pv</a></code></li> <li><code><a title="tests.test_csi.create_pv_storage" href="#tests.test_csi.create_pv_storage">create_pv_storage</a></code></li> @@ -2133,6 +2236,7 @@ <h1>Index</h1> <li><code><a title="tests.test_csi.test_csi_backup" href="#tests.test_csi.test_csi_backup">test_csi_backup</a></code></li> <li><code><a title="tests.test_csi.test_csi_block_volume" href="#tests.test_csi.test_csi_block_volume">test_csi_block_volume</a></code></li> <li><code><a title="tests.test_csi.test_csi_block_volume_online_expansion" href="#tests.test_csi.test_csi_block_volume_online_expansion">test_csi_block_volume_online_expansion</a></code></li> +<li><code><a title="tests.test_csi.test_csi_encrypted_block_volume" href="#tests.test_csi.test_csi_encrypted_block_volume">test_csi_encrypted_block_volume</a></code></li> <li><code><a title="tests.test_csi.test_csi_expansion_with_replica_failure" href="#tests.test_csi.test_csi_expansion_with_replica_failure">test_csi_expansion_with_replica_failure</a></code></li> <li><code><a title="tests.test_csi.test_csi_io" href="#tests.test_csi.test_csi_io">test_csi_io</a></code></li> <li><code><a title="tests.test_csi.test_csi_minimal_volume_size" href="#tests.test_csi.test_csi_minimal_volume_size">test_csi_minimal_volume_size</a></code></li>