Coverage for ocp_resources/persistent_volume_claim.py: 0%
45 statements
« prev ^ index » next coverage.py v7.6.10, created at 2025-01-30 10:48 +0200
« prev ^ index » next coverage.py v7.6.10, created at 2025-01-30 10:48 +0200
1# -*- coding: utf-8 -*-
3from ocp_resources.utils.constants import TIMEOUT_4MINUTES
4from ocp_resources.resource import NamespacedResource
7class PersistentVolumeClaim(NamespacedResource):
8 """
9 PersistentVolumeClaim object
10 """
12 api_version = NamespacedResource.ApiVersion.V1
14 class Status(NamespacedResource.Status):
15 BOUND = "Bound"
17 class AccessMode:
18 """
19 AccessMode object.
20 """
22 RWO = "ReadWriteOnce"
23 ROX = "ReadOnlyMany"
24 RWX = "ReadWriteMany"
26 class VolumeMode:
27 """
28 VolumeMode object
29 """
31 BLOCK = "Block"
32 FILE = "Filesystem"
34 def __init__(
35 self,
36 name=None,
37 namespace=None,
38 client=None,
39 storage_class=None,
40 accessmodes=None,
41 volume_mode=VolumeMode.FILE,
42 size=None,
43 hostpath_node=None,
44 teardown=True,
45 yaml_file=None,
46 delete_timeout=TIMEOUT_4MINUTES,
47 pvlabel=None,
48 **kwargs,
49 ):
50 super().__init__(
51 name=name,
52 namespace=namespace,
53 client=client,
54 teardown=teardown,
55 yaml_file=yaml_file,
56 delete_timeout=delete_timeout,
57 **kwargs,
58 )
59 self.accessmodes = accessmodes
60 self.volume_mode = volume_mode
61 self.size = size
62 self.hostpath_node = hostpath_node
63 self.storage_class = storage_class
64 self.pvlabel = pvlabel
66 def to_dict(self) -> None:
67 super().to_dict()
68 if not self.kind_dict and not self.yaml_file:
69 self.res.update({
70 "spec": {
71 "volumeMode": self.volume_mode,
72 "accessModes": [self.accessmodes],
73 "resources": {"requests": {"storage": self.size}},
74 }
75 })
76 """
77 Hostpath-provisioner is "node aware", when using it,
78 a node attribute on the claim must be introduced as follows.
79 annotations:
80 kubevirt.io/provisionOnNode: <specified_node_name>
81 """
82 if self.hostpath_node:
83 self.res["metadata"]["annotations"] = {"kubevirt.io/provisionOnNode": self.hostpath_node}
84 if self.storage_class:
85 self.res["spec"]["storageClassName"] = self.storage_class
87 if self.pvlabel:
88 self.res["spec"]["selector"] = {"matchLabels": {"pvLabel": self.pvlabel}}
90 def bound(self):
91 """
92 Check if PVC is bound
94 Returns:
95 bool: True if bound else False
96 """
97 self.logger.info(f"Check if {self.kind} {self.name} is bound")
98 return self.status == self.Status.BOUND
100 @property
101 def selected_node(self):
102 return self.instance.metadata.annotations.get("volume.kubernetes.io/selected-node")
104 @property
105 def use_populator(self):
106 return self.instance.metadata.annotations.get(f"{self.ApiGroup.CDI_KUBEVIRT_IO}/storage.usePopulator") == "true"
108 @property
109 def prime_pvc(self):
110 if self.use_populator:
111 return PersistentVolumeClaim(
112 name=f"prime-{self.instance.metadata.uid}",
113 namespace=self.namespace,
114 client=self.client,
115 )