mirror of
				https://github.com/ARM-software/workload-automation.git
				synced 2025-10-31 07:04:17 +00:00 
			
		
		
		
	utils/serializer: Add Podable Mix-in class
Add a new mix-in class for classes that are serialized to PODs, the aim of this class is to provide a way to ensure that both the original data version and the current serialization version are known. When attempting to de-serialize a POD the serialization version will be compared to the latest version in WA if not matching will call the appropriate method to upgrade the pod to a known structure state populating any missing fields with a sensible default or converting the existing data to the new format.
This commit is contained in:
		| @@ -361,3 +361,33 @@ def is_pod(obj): | |||||||
|             if not is_pod(v): |             if not is_pod(v): | ||||||
|                 return False |                 return False | ||||||
|     return True |     return True | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Podable(object): | ||||||
|  |  | ||||||
|  |     _pod_serialization_version = 0 | ||||||
|  |  | ||||||
|  |     @classmethod | ||||||
|  |     def from_pod(cls, pod): | ||||||
|  |         pod = cls._upgrade_pod(pod) | ||||||
|  |         instance = cls() | ||||||
|  |         instance._pod_version = pod.pop('_pod_version')  # pylint: disable=protected-access | ||||||
|  |         return instance | ||||||
|  |  | ||||||
|  |     @classmethod | ||||||
|  |     def _upgrade_pod(cls, pod): | ||||||
|  |         _pod_serialization_version = pod.pop('_pod_serialization_version', None) or 0 | ||||||
|  |         while _pod_serialization_version < cls._pod_serialization_version: | ||||||
|  |             _pod_serialization_version += 1 | ||||||
|  |             upgrade = getattr(cls, '_pod_upgrade_v{}'.format(_pod_serialization_version)) | ||||||
|  |             pod = upgrade(pod) | ||||||
|  |         return pod | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self._pod_version = self._pod_serialization_version | ||||||
|  |  | ||||||
|  |     def to_pod(self): | ||||||
|  |         pod = {} | ||||||
|  |         pod['_pod_version'] = self._pod_version | ||||||
|  |         pod['_pod_serialization_version'] = self._pod_serialization_version | ||||||
|  |         return pod | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user