2 # Copyright(c) 2019 Intel Corporation
3 # SPDX-License-Identifier: BSD-3-Clause-Clear
6 from ctypes
import c_void_p
, Structure
, c_char_p
, cast
, pointer
, byref
, c_int
8 from .logger
import LoggerOps
, Logger
9 from .data
import DataOps
, Data
10 from .cleaner
import CleanerOps
, Cleaner
11 from .metadata_updater
import MetadataUpdaterOps
, MetadataUpdater
12 from .shared
import OcfError
13 from ..ocf
import OcfLib
14 from .queue
import Queue
15 from .volume
import Volume
18 class OcfCtxOps(Structure
):
21 ("cleaner", CleanerOps
),
22 ("metadata_updater", MetadataUpdaterOps
),
23 ("logger", LoggerOps
),
27 class OcfCtxCfg(Structure
):
28 _fields_
= [("name", c_char_p
), ("ops", OcfCtxOps
), ("logger_priv", c_void_p
)]
32 def __init__(self
, lib
, name
, logger
, data
, mu
, cleaner
):
36 self
.cleaner
= cleaner
37 self
.ctx_handle
= c_void_p()
39 self
.volume_types_count
= 1
40 self
.volume_types
= {}
46 data
=self
.data
.get_ops(),
47 cleaner
=self
.cleaner
.get_ops(),
48 metadata_updater
=self
.mu
.get_ops(),
49 logger
=logger
.get_ops(),
51 logger_priv
=cast(pointer(logger
.get_priv()), c_void_p
),
54 result
= self
.lib
.ocf_ctx_create(byref(self
.ctx_handle
), byref(self
.cfg
))
56 raise OcfError("Context initialization failed", result
)
58 def register_volume_type(self
, volume_type
):
59 self
.volume_types
[self
.volume_types_count
] = volume_type
60 volume_type
.type_id
= self
.volume_types_count
61 volume_type
.owner
= self
63 result
= self
.lib
.ocf_ctx_register_volume_type(
65 self
.volume_types_count
,
66 byref(self
.volume_types
[self
.volume_types_count
].get_props()),
69 raise OcfError("Volume type registration failed", result
)
71 self
.volume_types_count
+= 1
73 def unregister_volume_type(self
, vol_type
):
74 if not vol_type
.type_id
:
75 raise Exception("Already unregistered")
77 self
.lib
.ocf_ctx_unregister_volume_type(
78 self
.ctx_handle
, vol_type
.type_id
81 del self
.volume_types
[vol_type
.type_id
]
83 def cleanup_volume_types(self
):
84 for k
, vol_type
in list(self
.volume_types
.items()):
86 self
.unregister_volume_type(vol_type
)
88 def stop_caches(self
):
89 for cache
in self
.caches
[:]:
94 self
.cleanup_volume_types()
96 self
.lib
.ocf_ctx_put(self
.ctx_handle
)
103 Queue
._instances
_ = {}
104 Volume
._instances
_ = {}
105 Data
._instances
_ = {}
106 Logger
._instances
_ = {}
109 def get_default_ctx(logger
):
111 OcfLib
.getInstance(),
112 b
"PyOCF default ctx",
120 lib
= OcfLib
.getInstance()
121 lib
.ocf_mngt_cache_get_by_name
.argtypes
= [c_void_p
, c_void_p
, c_void_p
]
122 lib
.ocf_mngt_cache_get_by_name
.restype
= c_int