from esu.base import BaseAPI, Field, ObjectAlreadyHasId, ObjectHasNoId
[документация]class Disk(BaseAPI):
"""
Args:
id (str): Идентификатор диска
name (str): Имя диска
size (int): Размер диска (ГБ)
scsi (str): Порт, к которому подключен диск
vm (object): Объект виртуального сервера :class:`esu.Vm`
storage_profile (object): Объект :class:`esu.StorageProfile`
.. note:: Поля ``name``, ``size``, ``storage_profile`` могут быть изменены
для существующего объекта.
.. warning:: ``storage_profile`` можно изменить только для дисков в
сегменте VMware когда диск подключен к виртуальному серверу.
"""
class Meta:
id = Field()
name = Field()
size = Field()
scsi = Field()
vdc = Field('esu.Vdc')
vm = Field('esu.Vm', allow_none=True)
storage_profile = Field('esu.StorageProfile')
[документация] @classmethod
def get_object(cls, id, token=None):
"""
Получить объект диска по его ID
Args:
id (str): Идентификатор диска
token (str): Токен для доступа к API. Если не передан, будет
использована переменная окружения **ESU_API_TOKEN**
Returns:
object: Возвращает объект диска :class:`esu.Disk`
"""
disk = cls(token=token, id=id)
disk._get_object('v1/disk', disk.id)
return disk
[документация] def create(self):
"""
Создать объект
Raises:
ObjectAlreadyHasId: Если производится попытка создать объект,
который уже существует
"""
if self.id is not None:
raise ObjectAlreadyHasId
self._commit()
[документация] def save(self):
"""
Сохранить изменения
Raises:
ObjectHasNoId: Если производится попытка сохранить несуществующий
объект
"""
if self.id is None:
raise ObjectHasNoId
self._commit()
def _commit(self):
disk = {
'name': self.name,
'size': self.size,
'storage_profile': self.storage_profile.id,
}
if self.vm:
disk['vm'] = self.vm.id
if self.vdc:
disk['vdc'] = self.vdc.id
self._commit_object('v1/disk', **disk)
[документация] def attach_disk(self, vm):
"""
Присоединить существующий во ВЦОДе диск к виртуальному серверу
"""
if not self.id:
raise ValueError('Disk is not exists')
if self.vm is not None:
raise ValueError('Disk must be unattached')
self._call('POST', 'v1/disk/{}/attach'.format(self.id), vm=vm.id)
self.vm = vm
self._fill()
[документация] def detach_disk(self):
"""
Отсоединить диск от виртуального сервера
"""
self._call('POST', 'v1/disk/{}/detach'.format(self.id))
self.vm = None
self._fill()
[документация] def destroy(self):
"""
Удалить объект
Raises:
ObjectHasNoId: Когда производится попытка удалить несуществующий
объект
"""
if self.id is None:
raise ObjectHasNoId
self._destroy_object('v1/disk', self.id)
self.id = None