[lxc-devel] [lxd/master] lxd/instances: Add /1.0/virtual-machines

stgraber on Github lxc-bot at linuxcontainers.org
Mon Nov 18 00:36:19 UTC 2019


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 438 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20191117/8b4f2054/attachment.bin>
-------------- next part --------------
From e92870591cc0d48a8a4aa5d767d9ec970487af67 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Sun, 17 Nov 2019 19:33:56 -0500
Subject: [PATCH] lxd/instances: Add /1.0/virtual-machines
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Not used by our own client but useful for debugging and manual
API interaction.

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/container_logs.go |  18 ++++---
 lxd/containers.go     | 117 ++++++++++++++++++++++++++++--------------
 lxd/containers_get.go |   4 ++
 3 files changed, 94 insertions(+), 45 deletions(-)

diff --git a/lxd/container_logs.go b/lxd/container_logs.go
index e3f7d861fd..b8cbf5d785 100644
--- a/lxd/container_logs.go
+++ b/lxd/container_logs.go
@@ -15,18 +15,24 @@ import (
 )
 
 var instanceLogCmd = APIEndpoint{
-	Name:    "instanceLog",
-	Path:    "instances/{name}/logs/{file}",
-	Aliases: []APIEndpointAlias{{Name: "containerLog", Path: "containers/{name}/logs/{file}"}},
+	Name: "instanceLog",
+	Path: "instances/{name}/logs/{file}",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerLog", Path: "containers/{name}/logs/{file}"},
+		{Name: "vmLog", Path: "virtual-machines/{name}/logs/{file}"},
+	},
 
 	Delete: APIEndpointAction{Handler: containerLogDelete, AccessHandler: AllowProjectPermission("containers", "operate-containers")},
 	Get:    APIEndpointAction{Handler: containerLogGet, AccessHandler: AllowProjectPermission("containers", "view")},
 }
 
 var instanceLogsCmd = APIEndpoint{
-	Name:    "instanceLogs",
-	Path:    "instances/{name}/logs",
-	Aliases: []APIEndpointAlias{{Name: "containerLogs", Path: "containers/{name}/logs"}},
+	Name: "instanceLogs",
+	Path: "instances/{name}/logs",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerLogs", Path: "containers/{name}/logs"},
+		{Name: "vmLogs", Path: "virtual-machines/{name}/logs"},
+	},
 
 	Get: APIEndpointAction{Handler: containerLogsGet, AccessHandler: AllowProjectPermission("containers", "view")},
 }
diff --git a/lxd/containers.go b/lxd/containers.go
index 384c0584b0..d98e4e6f47 100644
--- a/lxd/containers.go
+++ b/lxd/containers.go
@@ -17,18 +17,24 @@ import (
 )
 
 var instancesCmd = APIEndpoint{
-	Name:    "instances",
-	Path:    "instances",
-	Aliases: []APIEndpointAlias{{Name: "containers", Path: "containers"}},
+	Name: "instances",
+	Path: "instances",
+	Aliases: []APIEndpointAlias{
+		{Name: "containers", Path: "containers"},
+		{Name: "vms", Path: "virtual-machines"},
+	},
 
 	Get:  APIEndpointAction{Handler: containersGet, AccessHandler: AllowProjectPermission("containers", "view")},
 	Post: APIEndpointAction{Handler: containersPost, AccessHandler: AllowProjectPermission("containers", "manage-containers")},
 }
 
 var instanceCmd = APIEndpoint{
-	Name:    "instance",
-	Path:    "instances/{name}",
-	Aliases: []APIEndpointAlias{{Name: "container", Path: "containers/{name}"}},
+	Name: "instance",
+	Path: "instances/{name}",
+	Aliases: []APIEndpointAlias{
+		{Name: "container", Path: "containers/{name}"},
+		{Name: "vm", Path: "virtual-machines/{name}"},
+	},
 
 	Get:    APIEndpointAction{Handler: containerGet, AccessHandler: AllowProjectPermission("containers", "view")},
 	Put:    APIEndpointAction{Handler: containerPut, AccessHandler: AllowProjectPermission("containers", "manage-containers")},
@@ -38,18 +44,24 @@ var instanceCmd = APIEndpoint{
 }
 
 var instanceStateCmd = APIEndpoint{
-	Name:    "instanceState",
-	Path:    "instances/{name}/state",
-	Aliases: []APIEndpointAlias{{Name: "containerState", Path: "containers/{name}/state"}},
+	Name: "instanceState",
+	Path: "instances/{name}/state",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerState", Path: "containers/{name}/state"},
+		{Name: "vmState", Path: "virtual-machines/{name}/state"},
+	},
 
 	Get: APIEndpointAction{Handler: containerState, AccessHandler: AllowProjectPermission("containers", "view")},
 	Put: APIEndpointAction{Handler: containerStatePut, AccessHandler: AllowProjectPermission("containers", "operate-containers")},
 }
 
 var instanceFileCmd = APIEndpoint{
-	Name:    "instanceFile",
-	Path:    "instances/{name}/files",
-	Aliases: []APIEndpointAlias{{Name: "containerFile", Path: "containers/{name}/files"}},
+	Name: "instanceFile",
+	Path: "instances/{name}/files",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerFile", Path: "containers/{name}/files"},
+		{Name: "vmFile", Path: "virtual-machines/{name}/files"},
+	},
 
 	Get:    APIEndpointAction{Handler: containerFileHandler, AccessHandler: AllowProjectPermission("containers", "operate-containers")},
 	Post:   APIEndpointAction{Handler: containerFileHandler, AccessHandler: AllowProjectPermission("containers", "operate-containers")},
@@ -57,18 +69,24 @@ var instanceFileCmd = APIEndpoint{
 }
 
 var instanceSnapshotsCmd = APIEndpoint{
-	Name:    "instanceSnapshots",
-	Path:    "instances/{name}/snapshots",
-	Aliases: []APIEndpointAlias{{Name: "containerSnapshots", Path: "containers/{name}/snapshots"}},
+	Name: "instanceSnapshots",
+	Path: "instances/{name}/snapshots",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerSnapshots", Path: "containers/{name}/snapshots"},
+		{Name: "vmSnapshots", Path: "virtual-machines/{name}/snapshots"},
+	},
 
 	Get:  APIEndpointAction{Handler: containerSnapshotsGet, AccessHandler: AllowProjectPermission("containers", "view")},
 	Post: APIEndpointAction{Handler: containerSnapshotsPost, AccessHandler: AllowProjectPermission("containers", "operate-containers")},
 }
 
 var instanceSnapshotCmd = APIEndpoint{
-	Name:    "instanceSnapshot",
-	Path:    "instances/{name}/snapshots/{snapshotName}",
-	Aliases: []APIEndpointAlias{{Name: "containerSnapshot", Path: "containers/{name}/snapshots/{snapshotName}"}},
+	Name: "instanceSnapshot",
+	Path: "instances/{name}/snapshots/{snapshotName}",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerSnapshot", Path: "containers/{name}/snapshots/{snapshotName}"},
+		{Name: "vmSnapshot", Path: "virtual-machines/{name}/snapshots/{snapshotName}"},
+	},
 
 	Get:    APIEndpointAction{Handler: containerSnapshotHandler, AccessHandler: AllowProjectPermission("containers", "operate-containers")},
 	Post:   APIEndpointAction{Handler: containerSnapshotHandler, AccessHandler: AllowProjectPermission("containers", "operate-containers")},
@@ -77,9 +95,12 @@ var instanceSnapshotCmd = APIEndpoint{
 }
 
 var instanceConsoleCmd = APIEndpoint{
-	Name:    "instanceConsole",
-	Path:    "instances/{name}/console",
-	Aliases: []APIEndpointAlias{{Name: "containerConsole", Path: "containers/{name}/console"}},
+	Name: "instanceConsole",
+	Path: "instances/{name}/console",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerConsole", Path: "containers/{name}/console"},
+		{Name: "vmConsole", Path: "virtual-machines/{name}/console"},
+	},
 
 	Get:    APIEndpointAction{Handler: containerConsoleLogGet, AccessHandler: AllowProjectPermission("containers", "view")},
 	Post:   APIEndpointAction{Handler: containerConsolePost, AccessHandler: AllowProjectPermission("containers", "operate-containers")},
@@ -87,26 +108,35 @@ var instanceConsoleCmd = APIEndpoint{
 }
 
 var instanceExecCmd = APIEndpoint{
-	Name:    "instanceExec",
-	Path:    "instances/{name}/exec",
-	Aliases: []APIEndpointAlias{{Name: "containerExec", Path: "containers/{name}/exec"}},
+	Name: "instanceExec",
+	Path: "instances/{name}/exec",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerExec", Path: "containers/{name}/exec"},
+		{Name: "vmExec", Path: "virtual-machines/{name}/exec"},
+	},
 
 	Post: APIEndpointAction{Handler: containerExecPost, AccessHandler: AllowProjectPermission("containers", "operate-containers")},
 }
 
 var instanceMetadataCmd = APIEndpoint{
-	Name:    "instanceMetadata",
-	Path:    "instances/{name}/metadata",
-	Aliases: []APIEndpointAlias{{Name: "containerMetadata", Path: "containers/{name}/metadata"}},
+	Name: "instanceMetadata",
+	Path: "instances/{name}/metadata",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerMetadata", Path: "containers/{name}/metadata"},
+		{Name: "vmMetadata", Path: "virtual-machines/{name}/metadata"},
+	},
 
 	Get: APIEndpointAction{Handler: containerMetadataGet, AccessHandler: AllowProjectPermission("containers", "view")},
 	Put: APIEndpointAction{Handler: containerMetadataPut, AccessHandler: AllowProjectPermission("containers", "manage-containers")},
 }
 
 var instanceMetadataTemplatesCmd = APIEndpoint{
-	Name:    "instanceMetadataTemplates",
-	Path:    "instances/{name}/metadata/templates",
-	Aliases: []APIEndpointAlias{{Name: "containerMetadataTemplates", Path: "containers/{name}/metadata/templates"}},
+	Name: "instanceMetadataTemplates",
+	Path: "instances/{name}/metadata/templates",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerMetadataTemplates", Path: "containers/{name}/metadata/templates"},
+		{Name: "vmMetadataTemplates", Path: "virtual-machines/{name}/metadata/templates"},
+	},
 
 	Get:    APIEndpointAction{Handler: containerMetadataTemplatesGet, AccessHandler: AllowProjectPermission("containers", "view")},
 	Post:   APIEndpointAction{Handler: containerMetadataTemplatesPostPut, AccessHandler: AllowProjectPermission("containers", "manage-containers")},
@@ -115,18 +145,24 @@ var instanceMetadataTemplatesCmd = APIEndpoint{
 }
 
 var instanceBackupsCmd = APIEndpoint{
-	Name:    "instanceBackups",
-	Path:    "instances/{name}/backups",
-	Aliases: []APIEndpointAlias{{Name: "containerBackups", Path: "containers/{name}/backups"}},
+	Name: "instanceBackups",
+	Path: "instances/{name}/backups",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerBackups", Path: "containers/{name}/backups"},
+		{Name: "vmBackups", Path: "virtual-machines/{name}/backups"},
+	},
 
 	Get:  APIEndpointAction{Handler: containerBackupsGet, AccessHandler: AllowProjectPermission("containers", "view")},
 	Post: APIEndpointAction{Handler: containerBackupsPost, AccessHandler: AllowProjectPermission("containers", "operate-containers")},
 }
 
 var instanceBackupCmd = APIEndpoint{
-	Name:    "instanceBackup",
-	Path:    "instances/{name}/backups/{backupName}",
-	Aliases: []APIEndpointAlias{{Name: "containerBackup", Path: "containers/{name}/backups/{backupName}"}},
+	Name: "instanceBackup",
+	Path: "instances/{name}/backups/{backupName}",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerBackup", Path: "containers/{name}/backups/{backupName}"},
+		{Name: "vmBackup", Path: "virtual-machines/{name}/backups/{backupName}"},
+	},
 
 	Get:    APIEndpointAction{Handler: containerBackupGet, AccessHandler: AllowProjectPermission("containers", "view")},
 	Post:   APIEndpointAction{Handler: containerBackupPost, AccessHandler: AllowProjectPermission("containers", "operate-containers")},
@@ -134,9 +170,12 @@ var instanceBackupCmd = APIEndpoint{
 }
 
 var instanceBackupExportCmd = APIEndpoint{
-	Name:    "instanceBackupExport",
-	Path:    "instances/{name}/backups/{backupName}/export",
-	Aliases: []APIEndpointAlias{{Name: "containerBackupExport", Path: "containers/{name}/backups/{backupName}/export"}},
+	Name: "instanceBackupExport",
+	Path: "instances/{name}/backups/{backupName}/export",
+	Aliases: []APIEndpointAlias{
+		{Name: "containerBackupExport", Path: "containers/{name}/backups/{backupName}/export"},
+		{Name: "vmBackupExport", Path: "virtual-machines/{name}/backups/{backupName}/export"},
+	},
 
 	Get: APIEndpointAction{Handler: containerBackupExportGet, AccessHandler: AllowProjectPermission("containers", "view")},
 }
diff --git a/lxd/containers_get.go b/lxd/containers_get.go
index 499170f925..3e4dc3d2bb 100644
--- a/lxd/containers_get.go
+++ b/lxd/containers_get.go
@@ -29,6 +29,8 @@ func urlInstanceTypeDetect(r *http.Request) (instancetype.Type, error) {
 	reqInstanceType := r.URL.Query().Get("instance-type")
 	if strings.HasPrefix(mux.CurrentRoute(r).GetName(), "container") {
 		return instancetype.Container, nil
+	} else if strings.HasPrefix(mux.CurrentRoute(r).GetName(), "vm") {
+		return instancetype.VM, nil
 	} else if reqInstanceType != "" {
 		instanceType, err := instancetype.New(reqInstanceType)
 		if err != nil {
@@ -216,6 +218,8 @@ func doContainersGet(d *Daemon, r *http.Request) (interface{}, error) {
 				instancePath := "instances"
 				if strings.HasPrefix(mux.CurrentRoute(r).GetName(), "container") {
 					instancePath = "containers"
+				} else if strings.HasPrefix(mux.CurrentRoute(r).GetName(), "vm") {
+					instancePath = "virtual-machines"
 				}
 				url := fmt.Sprintf("/%s/%s/%s", version.APIVersion, instancePath, container)
 				resultString = append(resultString, url)


More information about the lxc-devel mailing list