from esu.base import BaseAPI, Field, FieldList, ObjectAlreadyHasId, \
ObjectHasNoId, resolve
[документация]class Network(BaseAPI):
"""
Args:
id (str): Идентификатор сети
name (str): Имя сети
vdc (object): Объект класса :class:`esu.Vdc`. ВЦОД, к которому
относится сеть
is_default (bool): True для сети по умолчанию
subnets (object): Список объектов класса :class:`esu.Subnet`
.. note:: Поля ``name`` и ``vdc`` необходимы для создания.
Поле ``subnets`` опционально при создании.
Поле ``name`` может быть изменено для существующего объекта.
"""
class Meta:
id = Field()
name = Field()
vdc = Field('esu.Vdc', allow_none=True)
is_default = Field()
subnets = FieldList('esu.Subnet')
[документация] @classmethod
def get_object(cls, id, token=None):
"""
Получить объект сети по его ID
Args:
id (str): Идентификатор сети
token (str): Токен для доступа к API. Если не передан, будет
использована переменная окружения **ESU_API_TOKEN**
Returns:
object: Возвращает объект сети :class:`esu.Network`
"""
network = cls(token=token, id=id)
network._get_object('v1/network', network.id)
return network
[документация] def create(self):
"""
Создать объект
Raises:
ObjectAlreadyHasId: Если производится попытка создать объект,
который уже существует
"""
if self.id is not None:
raise ObjectAlreadyHasId
subnets = self.subnets or []
self._commit()
for subnet in subnets:
self.add_subnet(subnet)
[документация] def save(self):
"""
Сохранить изменения
Raises:
ObjectHasNoId: Если производится попытка сохранить несуществующий
объект
"""
if self.id is None:
raise ObjectHasNoId
self._commit()
def _commit(self):
return self._commit_object('v1/network', vdc=self.vdc.id,
name=self.name)
[документация] def destroy(self):
"""
Удалить объект
Raises:
ObjectHasNoId: Когда производится попытка удалить несуществующий
объект
"""
if self.id is None:
raise ObjectHasNoId
self._destroy_object('v1/network', self.id)
self.id = None
[документация] def add_subnet(self, subnet):
"""
Добавить подсеть
Args:
subnet (object): Объект подсети :class:`esu.Subnet`
"""
if subnet.id:
raise ValueError('You must pass a new Subnet object')
subnet = self._call('POST', 'v1/network/{}/subnet'.format(self.id),
cidr=subnet.cidr, gateway=subnet.gateway,
start_ip=subnet.start_ip, end_ip=subnet.end_ip,
enable_dhcp=subnet.enable_dhcp, subnet_routes=[],
dns_servers=[])
self.subnets.append(resolve('esu.Subnet')(token=self.token, **subnet))
[документация] def remove_subnet(self, subnet):
"""
Удалить подсеть
Args:
subnet (object): Объект подсети :class:`esu.Subnet`
"""
self._call('DELETE',
'v1/network/{}/subnet/{}'.format(self.id, subnet.id))
self.subnets = [s for s in self.subnets if s.id != subnet.id]