| 
									
										
										
										
											2019-10-25 11:42:40 +05:00
										 |  |  | import os | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-22 12:26:48 +05:00
										 |  |  | from ucloud.shared import shared | 
					
						
							|  |  |  | from ucloud.settings import settings | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-25 11:42:40 +05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-11 23:42:57 +05:00
										 |  |  | class Optional: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-25 11:42:40 +05:00
										 |  |  | class Field: | 
					
						
							|  |  |  |     def __init__(self, _name, _type, _value=None): | 
					
						
							|  |  |  |         self.name = _name | 
					
						
							|  |  |  |         self.value = _value | 
					
						
							|  |  |  |         self.type = _type | 
					
						
							|  |  |  |         self.__errors = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def validation(self): | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def is_valid(self): | 
					
						
							|  |  |  |         if self.value == KeyError: | 
					
						
							|  |  |  |             self.add_error("'{}' field is a required field".format(self.name)) | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2019-11-11 23:42:57 +05:00
										 |  |  |             if isinstance(self.value, Optional): | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  |             elif not isinstance(self.value, self.type): | 
					
						
							| 
									
										
										
										
											2019-10-25 11:42:40 +05:00
										 |  |  |                 self.add_error("Incorrect Type for '{}' field".format(self.name)) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.validation() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.__errors: | 
					
						
							|  |  |  |             return False | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_errors(self): | 
					
						
							|  |  |  |         return self.__errors | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def add_error(self, error): | 
					
						
							|  |  |  |         self.__errors.append(error) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class VmUUIDField(Field): | 
					
						
							|  |  |  |     def __init__(self, data): | 
					
						
							|  |  |  |         self.uuid = data.get("uuid", KeyError) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         super().__init__("uuid", str, self.uuid) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.validation = self.vm_uuid_validation | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def vm_uuid_validation(self): | 
					
						
							| 
									
										
										
										
											2019-12-22 12:26:48 +05:00
										 |  |  |         r = shared.etcd_client.get(os.path.join(settings['etcd']['vm_prefix'], self.uuid)) | 
					
						
							| 
									
										
										
										
											2019-10-25 11:42:40 +05:00
										 |  |  |         if not r: | 
					
						
							|  |  |  |             self.add_error("VM with uuid {} does not exists".format(self.uuid)) |