Compare commits
7 Commits
v0.1.0-dev
...
master
Author | SHA1 | Date | |
---|---|---|---|
90de626999 | |||
9b8b7be2d7 | |||
7289248925 | |||
197e272f3e | |||
baa511f678 | |||
32b9600554 | |||
71ef774060 |
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
"""Compute instances management library."""
|
"""Compute instances management library."""
|
||||||
|
|
||||||
__version__ = '0.1.0-dev4'
|
__version__ = '0.1.0-dev5'
|
||||||
|
|
||||||
from .config import Config
|
from .config import Config
|
||||||
from .instance import CloudInit, Instance, InstanceConfig, InstanceSchema
|
from .instance import CloudInit, Instance, InstanceConfig, InstanceSchema
|
||||||
|
@ -788,6 +788,12 @@ class Instance:
|
|||||||
disk.source,
|
disk.source,
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
|
if volume.storagePoolLookupByVolume().name() == 'images':
|
||||||
|
log.info(
|
||||||
|
'Volume %s skipped because it is from images pool',
|
||||||
|
volume.path(),
|
||||||
|
)
|
||||||
|
continue
|
||||||
log.info('Delete volume: %s', volume.path())
|
log.info('Delete volume: %s', volume.path())
|
||||||
volume.delete()
|
volume.delete()
|
||||||
log.info('Undefine instance')
|
log.info('Undefine instance')
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
from contextlib import AbstractContextManager
|
from contextlib import AbstractContextManager
|
||||||
|
from pathlib import Path
|
||||||
from types import TracebackType
|
from types import TracebackType
|
||||||
from typing import Any, NamedTuple
|
from typing import Any, NamedTuple
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
@ -245,11 +246,17 @@ class Session(AbstractContextManager):
|
|||||||
log.info('Volume %s is CDROM device', volume_name)
|
log.info('Volume %s is CDROM device', volume_name)
|
||||||
elif volume.source is not None:
|
elif volume.source is not None:
|
||||||
log.info('Using volume %s as source', volume_name)
|
log.info('Using volume %s as source', volume_name)
|
||||||
volume_source = volume.source
|
|
||||||
if volume.capacity:
|
if volume.capacity:
|
||||||
capacity = units.to_bytes(
|
capacity = units.to_bytes(
|
||||||
volume.capacity.value, volume.capacity.unit
|
volume.capacity.value, volume.capacity.unit
|
||||||
)
|
)
|
||||||
|
log.info('Getting volume %s', volume.source)
|
||||||
|
vol = volumes_pool.get_volume(Path(volume_name).name)
|
||||||
|
log.info(
|
||||||
|
'Resize volume to specified size: %s',
|
||||||
|
capacity,
|
||||||
|
)
|
||||||
|
vol.resize(capacity, unit=units.DataUnit.BYTES)
|
||||||
else:
|
else:
|
||||||
capacity = units.to_bytes(
|
capacity = units.to_bytes(
|
||||||
volume.capacity.value, volume.capacity.unit
|
volume.capacity.value, volume.capacity.unit
|
||||||
@ -259,7 +266,7 @@ class Session(AbstractContextManager):
|
|||||||
path=str(volumes_pool.path.joinpath(volume_name)),
|
path=str(volumes_pool.path.joinpath(volume_name)),
|
||||||
capacity=capacity,
|
capacity=capacity,
|
||||||
)
|
)
|
||||||
volume_source = volume_config.path
|
volume.source = volume_config.path
|
||||||
log.debug('Volume config: %s', volume_config)
|
log.debug('Volume config: %s', volume_config)
|
||||||
if volume.is_system is True and data.image:
|
if volume.is_system is True and data.image:
|
||||||
log.info(
|
log.info(
|
||||||
@ -269,21 +276,20 @@ class Session(AbstractContextManager):
|
|||||||
image = images_pool.get_volume(data.image)
|
image = images_pool.get_volume(data.image)
|
||||||
log.info('Cloning image into volumes pool...')
|
log.info('Cloning image into volumes pool...')
|
||||||
vol = volumes_pool.clone_volume(image, volume_config)
|
vol = volumes_pool.clone_volume(image, volume_config)
|
||||||
|
log.info(
|
||||||
|
'Resize cloned volume to specified size: %s',
|
||||||
|
capacity,
|
||||||
|
)
|
||||||
|
vol.resize(capacity, unit=units.DataUnit.BYTES)
|
||||||
else:
|
else:
|
||||||
log.info('Create volume %s', volume_config.name)
|
log.info('Create volume %s', volume_config.name)
|
||||||
volumes_pool.create_volume(volume_config)
|
volumes_pool.create_volume(volume_config)
|
||||||
if capacity is not None:
|
|
||||||
log.info(
|
|
||||||
'Resize cloned volume to specified size: %s',
|
|
||||||
capacity,
|
|
||||||
)
|
|
||||||
vol.resize(capacity, unit=units.DataUnit.BYTES)
|
|
||||||
log.info('Attaching volume to instance...')
|
log.info('Attaching volume to instance...')
|
||||||
instance.attach_device(
|
instance.attach_device(
|
||||||
DiskConfig(
|
DiskConfig(
|
||||||
type=volume.type,
|
type=volume.type,
|
||||||
device=volume.device,
|
device=volume.device,
|
||||||
source=volume_source,
|
source=volume.source,
|
||||||
target=volume.target,
|
target=volume.target,
|
||||||
is_readonly=volume.is_readonly,
|
is_readonly=volume.is_readonly,
|
||||||
bus=volume.bus,
|
bus=volume.bus,
|
||||||
|
@ -119,7 +119,7 @@ class StoragePool:
|
|||||||
'src_pool=%s src_vol=%s dst_pool=%s dst_vol=%s',
|
'src_pool=%s src_vol=%s dst_pool=%s dst_vol=%s',
|
||||||
src.pool_name,
|
src.pool_name,
|
||||||
src.name,
|
src.name,
|
||||||
self.pool.name,
|
self.pool.name(),
|
||||||
dst.name,
|
dst.name,
|
||||||
)
|
)
|
||||||
vol = self.pool.createXMLFrom(
|
vol = self.pool.createXMLFrom(
|
||||||
@ -134,7 +134,9 @@ class StoragePool:
|
|||||||
def get_volume(self, name: str) -> Volume | None:
|
def get_volume(self, name: str) -> Volume | None:
|
||||||
"""Lookup and return Volume instance or None."""
|
"""Lookup and return Volume instance or None."""
|
||||||
log.info(
|
log.info(
|
||||||
'Lookup for storage volume vol=%s in pool=%s', name, self.pool.name
|
'Lookup for storage volume vol=%s in pool=%s',
|
||||||
|
name,
|
||||||
|
self.pool.name(),
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
vol = self.pool.storageVolLookupByName(name)
|
vol = self.pool.storageVolLookupByName(name)
|
||||||
|
@ -6,7 +6,7 @@ sys.path.insert(0, os.path.abspath('../..'))
|
|||||||
project = 'Compute'
|
project = 'Compute'
|
||||||
copyright = '2023, Compute Authors'
|
copyright = '2023, Compute Authors'
|
||||||
author = 'Compute Authors'
|
author = 'Compute Authors'
|
||||||
release = '0.1.0-dev4'
|
release = '0.1.0-dev5'
|
||||||
|
|
||||||
# Sphinx general settings
|
# Sphinx general settings
|
||||||
extensions = [
|
extensions = [
|
||||||
|
@ -19,4 +19,4 @@ build: clean
|
|||||||
$(DOCKER_CMD) run --rm -i -v $$PWD/$(BUILDDIR):/mnt --ulimit "nofile=1024:1048576" \
|
$(DOCKER_CMD) run --rm -i -v $$PWD/$(BUILDDIR):/mnt --ulimit "nofile=1024:1048576" \
|
||||||
$(DOCKER_IMG) makepkg --nodeps --clean
|
$(DOCKER_IMG) makepkg --nodeps --clean
|
||||||
# Remove unwanted files from build dir
|
# Remove unwanted files from build dir
|
||||||
rm $(BUILDDIR)/compute*.tar.gz $(BUILDDIR)/PKGBUILD
|
find $(BUILDDIR) ! -name '*.pkg.tar.zst' -type f -exec rm -f {} +
|
||||||
|
@ -1,16 +1,21 @@
|
|||||||
pkgname=compute
|
pkgname=compute
|
||||||
pkgver='0.1.0-dev4'
|
pkgver='%placeholder%'
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc='Compute instances management library'
|
pkgdesc='Compute instances management library'
|
||||||
arch=(any)
|
arch=(any)
|
||||||
url=https://get.lulzette.ru/hstack/compute
|
url=https://get.lulzette.ru/hstack/compute
|
||||||
license=('GPL-3-or-later')
|
license=('GPL-3-or-later')
|
||||||
makedepends=(python python-pip)
|
makedepends=(python python-pip)
|
||||||
depends=(python libvirt libvirt-python qemu-base qemu-system-x86 qemu-img dnsmasq iptables-nft)
|
depends=(python libvirt libvirt-python qemu-base qemu-system-x86 qemu-img)
|
||||||
|
optdepends=(
|
||||||
|
'dnsmasq: required for default NAT/DHCP'
|
||||||
|
'iptables-nft: required for default NAT'
|
||||||
|
)
|
||||||
provides=(compute)
|
provides=(compute)
|
||||||
conflicts=()
|
conflicts=()
|
||||||
|
|
||||||
package() {
|
package() {
|
||||||
pip install --no-cache-dir --no-deps --root $pkgdir ../$pkgname-*.tar.gz
|
pip install --no-cache-dir --no-deps --root $pkgdir ../$pkgname-*.tar.gz
|
||||||
install -Dm644 ../completion.bash $pkgdir/usr/share/bash-completion/completions/compute
|
install -Dm644 ../completion.bash $pkgdir/usr/share/bash-completion/completions/compute
|
||||||
|
install -Dm644 $pkgdir/usr/lib/*/site-packages/computed.toml $pkgdir/etc/compute/computed.toml
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ build: clean
|
|||||||
cp -v ../../dist/compute-*[.tar.gz] $(BUILDDIR)/
|
cp -v ../../dist/compute-*[.tar.gz] $(BUILDDIR)/
|
||||||
cp -r ../../docs $(BUILDDIR)/
|
cp -r ../../docs $(BUILDDIR)/
|
||||||
cp ../../extra/completion.bash $(BUILDDIR)/compute.bash-completion
|
cp ../../extra/completion.bash $(BUILDDIR)/compute.bash-completion
|
||||||
if [ -f build.sh.bak ]; then mv build.sh{.bak,}; fi
|
if [ -f build.sh.bak ]; then mv build.sh.bak build.sh; fi
|
||||||
cp build.sh{,.bak}
|
cp build.sh{,.bak}
|
||||||
awk '/authors/{gsub(/[\[\]]/,"");print $$3" "$$4}' ../pyproject.toml \
|
awk '/authors/{gsub(/[\[\]]/,"");print $$3" "$$4}' ../pyproject.toml \
|
||||||
| sed "s/['<>]//g" \
|
| sed "s/['<>]//g" \
|
||||||
|
@ -38,6 +38,7 @@ Depends:
|
|||||||
python3-pydantic,
|
python3-pydantic,
|
||||||
mtools,
|
mtools,
|
||||||
dosfstools,
|
dosfstools,
|
||||||
|
Recommends:
|
||||||
dnsmasq,
|
dnsmasq,
|
||||||
dnsmasq-base
|
dnsmasq-base
|
||||||
Suggests:
|
Suggests:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = 'compute'
|
name = 'compute'
|
||||||
version = '0.1.0-dev4'
|
version = '0.1.0-dev5'
|
||||||
description = 'Compute instances management library'
|
description = 'Compute instances management library'
|
||||||
license = 'GPL-3.0-or-later'
|
license = 'GPL-3.0-or-later'
|
||||||
authors = ['ge <ge@nixhacks.net>']
|
authors = ['ge <ge@nixhacks.net>']
|
||||||
|
Loading…
x
Reference in New Issue
Block a user