mirror of
https://github.com/GNS3/gns3-server.git
synced 2025-02-01 05:43:49 +02:00
Merge pull request #2474 from GNS3/install-all-images
Support to create templates based on image checksums
This commit is contained in:
commit
fb3409c1a1
@ -192,6 +192,43 @@ async def prune_images(
|
|||||||
await images_repo.prune_images(skip_images)
|
await images_repo.prune_images(skip_images)
|
||||||
|
|
||||||
|
|
||||||
|
@router.post(
|
||||||
|
"/install",
|
||||||
|
status_code=status.HTTP_204_NO_CONTENT,
|
||||||
|
dependencies=[Depends(has_privilege("Image.Allocate"))]
|
||||||
|
)
|
||||||
|
async def install_images(
|
||||||
|
images_repo: ImagesRepository = Depends(get_repository(ImagesRepository)),
|
||||||
|
templates_repo: TemplatesRepository = Depends(get_repository(TemplatesRepository))
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Attempt to automatically create templates based on image checksums.
|
||||||
|
|
||||||
|
Required privilege: Image.Allocate
|
||||||
|
"""
|
||||||
|
|
||||||
|
skip_images = get_builtin_disks()
|
||||||
|
images = await images_repo.get_images()
|
||||||
|
for image in images:
|
||||||
|
if skip_images and image.filename in skip_images:
|
||||||
|
log.debug(f"Skipping image '{image.path}' for image installation")
|
||||||
|
continue
|
||||||
|
templates = await images_repo.get_image_templates(image.image_id)
|
||||||
|
if templates:
|
||||||
|
# the image is already used by a template
|
||||||
|
log.warning(f"Image '{image.path}' is used by one or more templates")
|
||||||
|
continue
|
||||||
|
await Controller.instance().appliance_manager.install_appliances_from_image(
|
||||||
|
image.path,
|
||||||
|
image.checksum,
|
||||||
|
images_repo,
|
||||||
|
templates_repo,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
os.path.dirname(image.path)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@router.get(
|
@router.get(
|
||||||
"/{image_path:path}",
|
"/{image_path:path}",
|
||||||
response_model=schemas.Image,
|
response_model=schemas.Image,
|
||||||
|
@ -19,6 +19,7 @@ import os
|
|||||||
import pytest
|
import pytest
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
|
from tests.utils import asyncio_patch
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
from fastapi import FastAPI, status
|
from fastapi import FastAPI, status
|
||||||
from httpx import AsyncClient
|
from httpx import AsyncClient
|
||||||
@ -295,3 +296,32 @@ class TestImageRoutes:
|
|||||||
assert len(templates) == 1
|
assert len(templates) == 1
|
||||||
assert templates[0].name == "Empty VM"
|
assert templates[0].name == "Empty VM"
|
||||||
assert templates[0].version == "30G"
|
assert templates[0].version == "30G"
|
||||||
|
await templates_repo.delete_template(templates[0].template_id)
|
||||||
|
|
||||||
|
async def test_install_all(
|
||||||
|
self, app: FastAPI,
|
||||||
|
client: AsyncClient,
|
||||||
|
db_session: AsyncSession,
|
||||||
|
controller: Controller
|
||||||
|
) -> None:
|
||||||
|
|
||||||
|
image_path = "tests/resources/empty100G.qcow2"
|
||||||
|
image_name = os.path.basename(image_path)
|
||||||
|
with open(image_path, "rb") as f:
|
||||||
|
image_data = f.read()
|
||||||
|
response = await client.post(
|
||||||
|
app.url_path_for("upload_image", image_path=image_name),
|
||||||
|
content=image_data)
|
||||||
|
assert response.status_code == status.HTTP_201_CREATED
|
||||||
|
|
||||||
|
controller.appliance_manager.load_appliances() # make sure appliances are loaded
|
||||||
|
with asyncio_patch("gns3server.api.routes.controller.images.get_builtin_disks", return_value=[]) as mock:
|
||||||
|
response = await client.post(app.url_path_for("install_images"))
|
||||||
|
assert mock.called
|
||||||
|
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||||
|
|
||||||
|
templates_repo = TemplatesRepository(db_session)
|
||||||
|
templates = await templates_repo.get_templates()
|
||||||
|
assert len(templates) == 1
|
||||||
|
assert templates[0].name == "Empty VM"
|
||||||
|
assert templates[0].version == "100G"
|
BIN
tests/resources/empty100G.qcow2
Normal file
BIN
tests/resources/empty100G.qcow2
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user