Source code for backend.vm_manage.models
# coding: utf-8
from pprint import pformat
from . import KEY_VM_INSTANCE
from backend.exceptions import VmDescriptorNotFound
[docs]class VmDescriptor(object):
def __init__(self, vm_ip, vm_name, group, state):
self.vm_ip = vm_ip
self.vm_name = vm_name
self.state = state
self.group = int(group)
self.check_fails = 0
# self.last_health_check = None
# self.last_release = None
# self.in_use_since = None
# self.terminating_since = None
#
self.bound_to_user = None
# self.used_by_pid = None
@property
def vm_key(self):
return KEY_VM_INSTANCE.format(vm_name=self.vm_name)
def __str__(self):
return pformat(self.__dict__)
[docs] def to_dict(self):
return {str(k): str(v) for k, v in self.__dict__.items() if v is not None}
@classmethod
[docs] def from_dict(cls, raw):
vmd = cls(raw.pop("vm_ip"), raw.pop("vm_name"), raw.pop("group"), raw.pop("state"))
vmd.__dict__.update(raw)
return vmd
@classmethod
[docs] def load(cls, rc, vm_name):
"""
:param rc:
:param vm_name:
:rtype: VmDescriptor
:raises VmDescriptorNotFound:
"""
raw = rc.hgetall(KEY_VM_INSTANCE.format(vm_name=vm_name))
if not raw:
raise VmDescriptorNotFound("VmDescriptor for `{}` not found".format(vm_name))
return cls.from_dict(raw)
[docs] def store(self, rc):
"""
:type rc: StrictRedis
"""
rc.hmset(KEY_VM_INSTANCE.format(vm_name=self.vm_name), self.__dict__)
[docs] def store_field(self, rc, field, value):
"""
:type rc: StrictRedis
"""
# TODO: add option `save_with_existnse_check`, use lua script to ensure that VMD still exists
setattr(self, field, value)
rc.hset(KEY_VM_INSTANCE.format(vm_name=self.vm_name), field, value)
[docs] def get_field(self, rc, field):
"""
:type rc: StrictRedis
"""
value = rc.hget(KEY_VM_INSTANCE.format(vm_name=self.vm_name), field)
setattr(self, field, value)
return value
# def record_failure(self, rc):
# """
# :type rc: StrictRedis
# """
# rc.hincrby(KEY_VM_INSTANCE.format(vm_name=self.vm_name), "check_fails")