The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6176

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Replaces use CTypeSnapshot with IsSnapshot boolean.
From b1cefe201c141cfe60efe758ba6d7b88daaed7da Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 6 Sep 2019 14:29:22 +0100
Subject: [PATCH 1/7] lxd/instance/instance: Changes instance types to own int
 type

 - Adds constants for Any and Container types

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/instance/instance.go | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/lxd/instance/instance.go b/lxd/instance/instance.go
index 1dff9a626d..10952e4821 100644
--- a/lxd/instance/instance.go
+++ b/lxd/instance/instance.go
@@ -1,4 +1,11 @@
 package instance
 
-// TypeContainer represents a container instance type.
-const TypeContainer = "container"
+// Type indicates the type of instance.
+type Type int
+
+const (
+       // TypeAny represents any type of instance.
+       TypeAny = Type(-1)
+       // TypeContainer represents a container instance type.
+       TypeContainer = Type(0)
+)

From c3f76be0bfb66340292f7e55fbcfc6d5d14052ca Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 6 Sep 2019 14:30:15 +0100
Subject: [PATCH 2/7] lxd/device/device/instance/id: Updates interface to use
 instance.Type

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/device/device_instance_id.go | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lxd/device/device_instance_id.go b/lxd/device/device_instance_id.go
index f1923aa17e..c92bb6ae95 100644
--- a/lxd/device/device_instance_id.go
+++ b/lxd/device/device_instance_id.go
@@ -2,6 +2,7 @@ package device
 
 import (
        "github.com/lxc/lxd/lxd/device/config"
+       "github.com/lxc/lxd/lxd/instance"
 )
 
 // InstanceIdentifier is an interface that allows us to identify an Instance 
and its properties.
@@ -9,7 +10,7 @@ import (
 // independent of when they're called in the instance lifecycle.
 type InstanceIdentifier interface {
        Name() string
-       Type() string
+       Type() instance.Type
        Project() string
        DevicesPath() string
        RootfsPath() string

From edc263bfc1263553d933ff2b10c6140ee505a65e Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 6 Sep 2019 14:32:21 +0100
Subject: [PATCH 3/7] lxd/container/lxc: Updates containerLXC to use
 instance.Type

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/container_lxc.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 425b5e53da..6ab80d9dcc 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -630,7 +630,7 @@ type containerLXC struct {
        expiryDate time.Time
 }
 
-func (c *containerLXC) Type() string {
+func (c *containerLXC) Type() instance.Type {
        return instance.TypeContainer
 }
 

From 35a9559a5fb1eedf047adb84a721a0ccdfd1b25e Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 6 Sep 2019 14:32:01 +0100
Subject: [PATCH 4/7] lxd/container: Updates container interface to use
 instance.Type

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/container.go | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lxd/container.go b/lxd/container.go
index dba6aea933..666e0a8fe9 100644
--- a/lxd/container.go
+++ b/lxd/container.go
@@ -20,6 +20,7 @@ import (
        "github.com/lxc/lxd/lxd/db"
        "github.com/lxc/lxd/lxd/device"
        "github.com/lxc/lxd/lxd/device/config"
+       "github.com/lxc/lxd/lxd/instance"
        "github.com/lxc/lxd/lxd/state"
        "github.com/lxc/lxd/lxd/sys"
        "github.com/lxc/lxd/lxd/task"
@@ -292,7 +293,7 @@ type container interface {
        Location() string
        Project() string
        Name() string
-       Type() string
+       Type() instance.Type
        Description() string
        Architecture() int
        CreationDate() time.Time

From 9083a95a1daa2e735292588f879e1f5c9bb81925 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Mon, 9 Sep 2019 11:20:03 +0100
Subject: [PATCH 5/7] lxd/db/containers: Replaces ContainerType with
 instance.Type

- Removes ContainerType and associated CTypeRegular, CTypeSnapshot constants.
- Updates containerLXC to change Type field tp instance.Type and add IsSnapshot 
bool.

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/db/containers.go | 43 +++++++++++++++++++------------------------
 1 file changed, 19 insertions(+), 24 deletions(-)

diff --git a/lxd/db/containers.go b/lxd/db/containers.go
index 7bd85e7b88..f5a96136e5 100644
--- a/lxd/db/containers.go
+++ b/lxd/db/containers.go
@@ -10,6 +10,7 @@ import (
        "github.com/lxc/lxd/lxd/db/query"
        "github.com/lxc/lxd/lxd/device/config"
        deviceConfig "github.com/lxc/lxd/lxd/device/config"
+       "github.com/lxc/lxd/lxd/instance"
        "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/api"
        "github.com/lxc/lxd/shared/logger"
@@ -69,7 +70,8 @@ type Instance struct {
        Project      string `db:"primary=yes&join=projects.name"`
        Name         string `db:"primary=yes"`
        Node         string `db:"join=nodes.name"`
-       Type         int
+       Type         instance.Type
+       IsSnapshot   bool
        Architecture int
        Ephemeral    bool
        CreationDate time.Time
@@ -87,7 +89,7 @@ type InstanceFilter struct {
        Project string
        Name    string
        Node    string
-       Type    int
+       Type    instance.Type
 }
 
 // ContainerToArgs is a convenience to convert the new Container db struct into
@@ -98,7 +100,8 @@ func ContainerToArgs(container *Instance) ContainerArgs {
                Project:      container.Project,
                Name:         container.Name,
                Node:         container.Node,
-               Ctype:        ContainerType(container.Type),
+               Type:         container.Type,
+               IsSnapshot:   container.IsSnapshot,
                Architecture: container.Architecture,
                Ephemeral:    container.Ephemeral,
                CreationDate: container.CreationDate,
@@ -122,9 +125,10 @@ func ContainerToArgs(container *Instance) ContainerArgs {
 // container.
 type ContainerArgs struct {
        // Don't set manually
-       ID    int
-       Node  string
-       Ctype ContainerType
+       ID         int
+       Node       string
+       Type       instance.Type
+       IsSnapshot bool
 
        // Creation only
        Project      string
@@ -157,15 +161,6 @@ type ContainerBackupArgs struct {
        OptimizedStorage bool
 }
 
-// ContainerType encodes the type of container (either regular or snapshot).
-type ContainerType int
-
-// Numerical codes for container types.
-const (
-       CTypeRegular  ContainerType = 0
-       CTypeSnapshot ContainerType = 1
-)
-
 // ContainerNames returns the names of all containers the given project.
 func (c *ClusterTx) ContainerNames(project string) ([]string, error) {
        stmt := `
@@ -173,7 +168,7 @@ SELECT instances.name FROM instances
   JOIN projects ON projects.id = instances.project_id
   WHERE projects.name = ? AND instances.type = ?
 `
-       return query.SelectStrings(c.tx, stmt, project, CTypeRegular)
+       return query.SelectStrings(c.tx, stmt, project, instance.TypeContainer)
 }
 
 // ContainerNodeAddress returns the address of the node hosting the container
@@ -261,7 +256,7 @@ SELECT instances.name, nodes.id, nodes.address, 
nodes.heartbeat
     AND projects.name = ?
   ORDER BY instances.id
 `
-       rows, err := c.tx.Query(stmt, CTypeRegular, project)
+       rows, err := c.tx.Query(stmt, instance.TypeContainer, project)
        if err != nil {
                return nil, err
        }
@@ -342,7 +337,7 @@ SELECT instances.name, nodes.name
   WHERE instances.type=?
     AND projects.name = ?
 `
-       rows, err := c.tx.Query(stmt, CTypeRegular, project)
+       rows, err := c.tx.Query(stmt, instance.TypeContainer, project)
        if err != nil {
                return nil, err
        }
@@ -488,7 +483,7 @@ func (c *ClusterTx) ContainerNodeList() ([]Instance, error) 
{
        }
        filter := InstanceFilter{
                Node: node,
-               Type: int(CTypeRegular),
+               Type: instance.TypeContainer,
        }
 
        return c.InstanceList(filter)
@@ -503,7 +498,7 @@ func (c *ClusterTx) ContainerNodeProjectList(project 
string) ([]Instance, error)
        filter := InstanceFilter{
                Project: project,
                Node:    node,
-               Type:    int(CTypeRegular),
+               Type:    instance.TypeContainer,
        }
 
        return c.InstanceList(filter)
@@ -795,7 +790,7 @@ func (c *Cluster) ContainerConfig(id int) 
(map[string]string, error) {
 // use it for new code.
 func (c *Cluster) LegacyContainersList() ([]string, error) {
        q := fmt.Sprintf("SELECT name FROM instances WHERE type=? ORDER BY 
name")
-       inargs := []interface{}{CTypeRegular}
+       inargs := []interface{}{instance.TypeContainer}
        var container string
        outfmt := []interface{}{container}
        result, err := queryScan(c.db, q, inargs, outfmt)
@@ -822,7 +817,7 @@ FROM instances_snapshots
 JOIN instances ON instances.id = instances_snapshots.instance_id
 WHERE type=? ORDER BY instances.name, instances_snapshots.name
 `)
-       inargs := []interface{}{CTypeRegular}
+       inargs := []interface{}{instance.TypeContainer}
        var container string
        var snapshot string
        outfmt := []interface{}{container, snapshot}
@@ -841,9 +836,9 @@ WHERE type=? ORDER BY instances.name, 
instances_snapshots.name
 
 // ContainersNodeList returns the names of all the containers of the given type
 // running on the local node.
-func (c *Cluster) ContainersNodeList(cType ContainerType) ([]string, error) {
+func (c *Cluster) ContainersNodeList(instanceType instance.Type) ([]string, 
error) {
        q := fmt.Sprintf("SELECT name FROM instances WHERE type=? AND node_id=? 
ORDER BY name")
-       inargs := []interface{}{cType, c.nodeID}
+       inargs := []interface{}{instanceType, c.nodeID}
        var container string
        outfmt := []interface{}{container}
        result, err := queryScan(c.db, q, inargs, outfmt)

From dd0fbe8b18835f524b80506f39055dea53d6de28 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Mon, 9 Sep 2019 11:30:29 +0100
Subject: [PATCH 6/7] lxd: Replaces ContainerType with instance.Type

- Also adds use of IsSnapshot field where CTypeSnapshot was used.

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/api_internal.go          |  6 +++--
 lxd/container.go             | 17 ++++++++------
 lxd/container_lxc.go         | 11 +++++----
 lxd/container_snapshot.go    |  3 ++-
 lxd/container_test.go        | 43 ++++++++++++++++++------------------
 lxd/containers_post.go       |  9 ++++----
 lxd/db/containers_test.go    | 20 +++++++++--------
 lxd/db/snapshots.go          |  3 ++-
 lxd/db/snapshots_test.go     | 10 +++++----
 lxd/logging.go               |  3 ++-
 lxd/main_activateifneeded.go |  3 ++-
 lxd/patches.go               |  4 ++--
 lxd/storage_lvm_utils.go     |  3 ++-
 lxd/storage_migration.go     |  2 +-
 14 files changed, 78 insertions(+), 59 deletions(-)

diff --git a/lxd/api_internal.go b/lxd/api_internal.go
index 1f48eda280..10c1715f09 100644
--- a/lxd/api_internal.go
+++ b/lxd/api_internal.go
@@ -22,6 +22,7 @@ import (
        "github.com/lxc/lxd/lxd/db/node"
        "github.com/lxc/lxd/lxd/db/query"
        deviceConfig "github.com/lxc/lxd/lxd/device/config"
+       "github.com/lxc/lxd/lxd/instance"
        "github.com/lxc/lxd/lxd/project"
        driver "github.com/lxc/lxd/lxd/storage"
        "github.com/lxc/lxd/shared"
@@ -905,7 +906,7 @@ func internalImport(d *Daemon, r *http.Request) Response {
                BaseImage:    baseImage,
                Config:       backup.Container.Config,
                CreationDate: backup.Container.CreatedAt,
-               Ctype:        db.CTypeRegular,
+               Type:         instance.Type(backup.Container.Type),
                Description:  backup.Container.Description,
                Devices:      deviceConfig.NewDevices(backup.Container.Devices),
                Ephemeral:    backup.Container.Ephemeral,
@@ -1011,7 +1012,8 @@ func internalImport(d *Daemon, r *http.Request) Response {
                        BaseImage:    baseImage,
                        Config:       snap.Config,
                        CreationDate: snap.CreatedAt,
-                       Ctype:        db.CTypeSnapshot,
+                       Type:         instance.Type(backup.Container.Type),
+                       IsSnapshot:   true,
                        Devices:      deviceConfig.NewDevices(snap.Devices),
                        Ephemeral:    snap.Ephemeral,
                        LastUsedDate: snap.LastUsedAt,
diff --git a/lxd/container.go b/lxd/container.go
index 666e0a8fe9..0fe54fbcb2 100644
--- a/lxd/container.go
+++ b/lxd/container.go
@@ -608,7 +608,8 @@ func containerCreateAsCopy(s *state.State, args 
db.ContainerArgs, sourceContaine
                        csArgs := db.ContainerArgs{
                                Architecture: snap.Architecture(),
                                Config:       snap.LocalConfig(),
-                               Ctype:        db.CTypeSnapshot,
+                               Type:         ct.Type(),
+                               IsSnapshot:   true,
                                Devices:      snapDevices,
                                Description:  snap.Description(),
                                Ephemeral:    snap.IsEphemeral(),
@@ -799,8 +800,9 @@ func containerCreateInternal(s *state.State, args 
db.ContainerArgs) (container,
                args.Architecture = s.OS.Architectures[0]
        }
 
-       // Validate container name
-       if args.Ctype == db.CTypeRegular {
+       // Only validate instance name if not snapshot, as snapshot names 
contain a / character that
+       // is not normally allowed in instance names.
+       if !args.IsSnapshot {
                err := containerValidName(args.Name)
                if err != nil {
                        return nil, err
@@ -876,7 +878,7 @@ func containerCreateInternal(s *state.State, args 
db.ContainerArgs) (container,
                        return fmt.Errorf("Project %q does not exist", 
args.Project)
                }
 
-               if args.Ctype == db.CTypeSnapshot {
+               if args.IsSnapshot == true {
                        parts := strings.SplitN(args.Name, 
shared.SnapshotDelimiter, 2)
                        instanceName := parts[0]
                        snapshotName := parts[1]
@@ -916,7 +918,7 @@ func containerCreateInternal(s *state.State, args 
db.ContainerArgs) (container,
                        Project:      args.Project,
                        Name:         args.Name,
                        Node:         node,
-                       Type:         int(args.Ctype),
+                       Type:         args.Type,
                        Architecture: args.Architecture,
                        Ephemeral:    args.Ephemeral,
                        CreationDate: args.CreationDate,
@@ -1082,7 +1084,7 @@ func containerLoadByProject(s *state.State, project 
string) ([]container, error)
        err := s.Cluster.Transaction(func(tx *db.ClusterTx) error {
                filter := db.InstanceFilter{
                        Project: project,
-                       Type:    int(db.CTypeRegular),
+                       Type:    instance.TypeContainer,
                }
                var err error
                cts, err = tx.InstanceList(filter)
@@ -1385,7 +1387,8 @@ func autoCreateContainerSnapshots(ctx context.Context, d 
*Daemon, containers []c
                        args := db.ContainerArgs{
                                Architecture: c.Architecture(),
                                Config:       c.LocalConfig(),
-                               Ctype:        db.CTypeSnapshot,
+                               Type:         c.Type(),
+                               IsSnapshot:   true,
                                Devices:      c.LocalDevices(),
                                Ephemeral:    c.IsEphemeral(),
                                Name:         snapshotName,
diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 6ab80d9dcc..ad6180c220 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -328,7 +328,8 @@ func containerLXCCreate(s *state.State, args 
db.ContainerArgs) (container, error
                description:  args.Description,
                ephemeral:    args.Ephemeral,
                architecture: args.Architecture,
-               cType:        args.Ctype,
+               instanceType: args.Type,
+               isSnapshot:   args.IsSnapshot,
                stateful:     args.Stateful,
                creationDate: args.CreationDate,
                lastUsedDate: args.LastUsedDate,
@@ -562,7 +563,8 @@ func containerLXCInstantiate(s *state.State, args 
db.ContainerArgs) *containerLX
                description:  args.Description,
                ephemeral:    args.Ephemeral,
                architecture: args.Architecture,
-               cType:        args.Ctype,
+               instanceType: args.Type,
+               isSnapshot:   args.IsSnapshot,
                creationDate: args.CreationDate,
                lastUsedDate: args.LastUsedDate,
                profiles:     args.Profiles,
@@ -593,7 +595,8 @@ func containerLXCInstantiate(s *state.State, args 
db.ContainerArgs) *containerLX
 type containerLXC struct {
        // Properties
        architecture int
-       cType        db.ContainerType
+       instanceType instance.Type
+       isSnapshot   bool
        creationDate time.Time
        lastUsedDate time.Time
        ephemeral    bool
@@ -6681,7 +6684,7 @@ func (c *containerLXC) IsRunning() bool {
 }
 
 func (c *containerLXC) IsSnapshot() bool {
-       return c.cType == db.CTypeSnapshot
+       return c.isSnapshot
 }
 
 // Various property query functions
diff --git a/lxd/container_snapshot.go b/lxd/container_snapshot.go
index 851d23c2d9..50a0741a12 100644
--- a/lxd/container_snapshot.go
+++ b/lxd/container_snapshot.go
@@ -140,7 +140,8 @@ func containerSnapshotsPost(d *Daemon, r *http.Request) 
Response {
                        Project:      c.Project(),
                        Architecture: c.Architecture(),
                        Config:       c.LocalConfig(),
-                       Ctype:        db.CTypeSnapshot,
+                       Type:         c.Type(),
+                       IsSnapshot:   true,
                        Devices:      c.LocalDevices(),
                        Ephemeral:    c.IsEphemeral(),
                        Name:         fullName,
diff --git a/lxd/container_test.go b/lxd/container_test.go
index 3982e1bd45..55f9fe3443 100644
--- a/lxd/container_test.go
+++ b/lxd/container_test.go
@@ -8,6 +8,7 @@ import (
 
        "github.com/lxc/lxd/lxd/db"
        "github.com/lxc/lxd/lxd/device/config"
+       "github.com/lxc/lxd/lxd/instance"
        driver "github.com/lxc/lxd/lxd/storage"
        "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/api"
@@ -20,7 +21,7 @@ type containerTestSuite struct {
 
 func (suite *containerTestSuite) TestContainer_ProfilesDefault() {
        args := db.ContainerArgs{
-               Ctype:     db.CTypeRegular,
+               Type:      instance.TypeContainer,
                Ephemeral: false,
                Name:      "testFoo",
        }
@@ -62,7 +63,7 @@ func (suite *containerTestSuite) 
TestContainer_ProfilesMulti() {
        }()
 
        args := db.ContainerArgs{
-               Ctype:     db.CTypeRegular,
+               Type:      instance.TypeContainer,
                Ephemeral: false,
                Profiles:  []string{"default", "unprivileged"},
                Name:      "testFoo",
@@ -85,7 +86,7 @@ func (suite *containerTestSuite) 
TestContainer_ProfilesMulti() {
 
 func (suite *containerTestSuite) TestContainer_ProfilesOverwriteDefaultNic() {
        args := db.ContainerArgs{
-               Ctype:     db.CTypeRegular,
+               Type:      instance.TypeContainer,
                Ephemeral: false,
                Config:    map[string]string{"security.privileged": "true"},
                Devices: config.Devices{
@@ -115,7 +116,7 @@ func (suite *containerTestSuite) 
TestContainer_ProfilesOverwriteDefaultNic() {
 
 func (suite *containerTestSuite) TestContainer_LoadFromDB() {
        args := db.ContainerArgs{
-               Ctype:     db.CTypeRegular,
+               Type:      instance.TypeContainer,
                Ephemeral: false,
                Config:    map[string]string{"security.privileged": "true"},
                Devices: config.Devices{
@@ -153,7 +154,7 @@ func (suite *containerTestSuite) TestContainer_LoadFromDB() 
{
 func (suite *containerTestSuite) TestContainer_Path_Regular() {
        // Regular
        args := db.ContainerArgs{
-               Ctype:     db.CTypeRegular,
+               Type:      instance.TypeContainer,
                Ephemeral: false,
                Name:      "testFoo",
        }
@@ -169,7 +170,7 @@ func (suite *containerTestSuite) 
TestContainer_Path_Regular() {
 
 func (suite *containerTestSuite) TestContainer_LogPath() {
        args := db.ContainerArgs{
-               Ctype:     db.CTypeRegular,
+               Type:      instance.TypeContainer,
                Ephemeral: false,
                Name:      "testFoo",
        }
@@ -183,7 +184,7 @@ func (suite *containerTestSuite) TestContainer_LogPath() {
 
 func (suite *containerTestSuite) TestContainer_IsPrivileged_Privileged() {
        args := db.ContainerArgs{
-               Ctype:     db.CTypeRegular,
+               Type:      instance.TypeContainer,
                Ephemeral: false,
                Config:    map[string]string{"security.privileged": "true"},
                Name:      "testFoo",
@@ -198,7 +199,7 @@ func (suite *containerTestSuite) 
TestContainer_IsPrivileged_Privileged() {
 
 func (suite *containerTestSuite) TestContainer_IsPrivileged_Unprivileged() {
        args := db.ContainerArgs{
-               Ctype:     db.CTypeRegular,
+               Type:      instance.TypeContainer,
                Ephemeral: false,
                Config:    map[string]string{"security.privileged": "false"},
                Name:      "testFoo",
@@ -213,7 +214,7 @@ func (suite *containerTestSuite) 
TestContainer_IsPrivileged_Unprivileged() {
 
 func (suite *containerTestSuite) TestContainer_Rename() {
        args := db.ContainerArgs{
-               Ctype:     db.CTypeRegular,
+               Type:      instance.TypeContainer,
                Ephemeral: false,
                Name:      "testFoo",
        }
@@ -228,8 +229,8 @@ func (suite *containerTestSuite) TestContainer_Rename() {
 
 func (suite *containerTestSuite) TestContainer_findIdmap_isolated() {
        c1, err := containerCreateInternal(suite.d.State(), db.ContainerArgs{
-               Ctype: db.CTypeRegular,
-               Name:  "isol-1",
+               Type: instance.TypeContainer,
+               Name: "isol-1",
                Config: map[string]string{
                        "security.idmap.isolated": "true",
                },
@@ -238,8 +239,8 @@ func (suite *containerTestSuite) 
TestContainer_findIdmap_isolated() {
        defer c1.Delete()
 
        c2, err := containerCreateInternal(suite.d.State(), db.ContainerArgs{
-               Ctype: db.CTypeRegular,
-               Name:  "isol-2",
+               Type: instance.TypeContainer,
+               Name: "isol-2",
                Config: map[string]string{
                        "security.idmap.isolated": "true",
                },
@@ -269,8 +270,8 @@ func (suite *containerTestSuite) 
TestContainer_findIdmap_isolated() {
 
 func (suite *containerTestSuite) TestContainer_findIdmap_mixed() {
        c1, err := containerCreateInternal(suite.d.State(), db.ContainerArgs{
-               Ctype: db.CTypeRegular,
-               Name:  "isol-1",
+               Type: instance.TypeContainer,
+               Name: "isol-1",
                Config: map[string]string{
                        "security.idmap.isolated": "false",
                },
@@ -279,8 +280,8 @@ func (suite *containerTestSuite) 
TestContainer_findIdmap_mixed() {
        defer c1.Delete()
 
        c2, err := containerCreateInternal(suite.d.State(), db.ContainerArgs{
-               Ctype: db.CTypeRegular,
-               Name:  "isol-2",
+               Type: instance.TypeContainer,
+               Name: "isol-2",
                Config: map[string]string{
                        "security.idmap.isolated": "true",
                },
@@ -310,8 +311,8 @@ func (suite *containerTestSuite) 
TestContainer_findIdmap_mixed() {
 
 func (suite *containerTestSuite) TestContainer_findIdmap_raw() {
        c1, err := containerCreateInternal(suite.d.State(), db.ContainerArgs{
-               Ctype: db.CTypeRegular,
-               Name:  "isol-1",
+               Type: instance.TypeContainer,
+               Name: "isol-1",
                Config: map[string]string{
                        "security.idmap.isolated": "false",
                        "raw.idmap":               "both 1000 1000",
@@ -349,8 +350,8 @@ func (suite *containerTestSuite) 
TestContainer_findIdmap_maxed() {
 
        for i := 0; i < 7; i++ {
                c, err := containerCreateInternal(suite.d.State(), 
db.ContainerArgs{
-                       Ctype: db.CTypeRegular,
-                       Name:  fmt.Sprintf("isol-%d", i),
+                       Type: instance.TypeContainer,
+                       Name: fmt.Sprintf("isol-%d", i),
                        Config: map[string]string{
                                "security.idmap.isolated": "true",
                        },
diff --git a/lxd/containers_post.go b/lxd/containers_post.go
index fc4a707ce2..106c1e3feb 100644
--- a/lxd/containers_post.go
+++ b/lxd/containers_post.go
@@ -20,6 +20,7 @@ import (
        "github.com/lxc/lxd/lxd/cluster"
        "github.com/lxc/lxd/lxd/db"
        "github.com/lxc/lxd/lxd/device/config"
+       "github.com/lxc/lxd/lxd/instance"
        "github.com/lxc/lxd/lxd/migration"
        "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/api"
@@ -96,7 +97,7 @@ func createFromImage(d *Daemon, project string, req 
*api.ContainersPost) Respons
                args := db.ContainerArgs{
                        Project:     project,
                        Config:      req.Config,
-                       Ctype:       db.CTypeRegular,
+                       Type:        instance.TypeContainer,
                        Description: req.Description,
                        Devices:     config.NewDevices(req.Devices),
                        Ephemeral:   req.Ephemeral,
@@ -152,7 +153,7 @@ func createFromNone(d *Daemon, project string, req 
*api.ContainersPost) Response
        args := db.ContainerArgs{
                Project:     project,
                Config:      req.Config,
-               Ctype:       db.CTypeRegular,
+               Type:        instance.TypeContainer,
                Description: req.Description,
                Devices:     config.NewDevices(req.Devices),
                Ephemeral:   req.Ephemeral,
@@ -209,7 +210,7 @@ func createFromMigration(d *Daemon, project string, req 
*api.ContainersPost) Res
                Architecture: architecture,
                BaseImage:    req.Source.BaseImage,
                Config:       req.Config,
-               Ctype:        db.CTypeRegular,
+               Type:         instance.TypeContainer,
                Devices:      config.NewDevices(req.Devices),
                Description:  req.Description,
                Ephemeral:    req.Ephemeral,
@@ -555,7 +556,7 @@ func createFromCopy(d *Daemon, project string, req 
*api.ContainersPost) Response
                Architecture: source.Architecture(),
                BaseImage:    req.Source.BaseImage,
                Config:       req.Config,
-               Ctype:        db.CTypeRegular,
+               Type:         instance.TypeContainer,
                Description:  req.Description,
                Devices:      config.NewDevices(req.Devices),
                Ephemeral:    req.Ephemeral,
diff --git a/lxd/db/containers_test.go b/lxd/db/containers_test.go
index 8a0cd545cc..bc2adf4fa8 100644
--- a/lxd/db/containers_test.go
+++ b/lxd/db/containers_test.go
@@ -4,10 +4,12 @@ import (
        "testing"
        "time"
 
-       "github.com/lxc/lxd/lxd/db"
-       "github.com/lxc/lxd/shared/api"
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/require"
+
+       "github.com/lxc/lxd/lxd/db"
+       "github.com/lxc/lxd/lxd/instance"
+       "github.com/lxc/lxd/shared/api"
 )
 
 func TestContainerList(t *testing.T) {
@@ -30,7 +32,7 @@ func TestContainerList(t *testing.T) {
        addContainerDevice(t, tx, "c2", "eth0", "nic", nil)
        addContainerDevice(t, tx, "c3", "root", "disk", map[string]string{"x": 
"y"})
 
-       filter := db.InstanceFilter{Type: int(db.CTypeRegular)}
+       filter := db.InstanceFilter{Type: instance.TypeContainer}
        containers, err := tx.InstanceList(filter)
        require.NoError(t, err)
        assert.Len(t, containers, 3)
@@ -72,7 +74,7 @@ func TestContainerList_FilterByNode(t *testing.T) {
        filter := db.InstanceFilter{
                Project: "default",
                Node:    "node2",
-               Type:    int(db.CTypeRegular),
+               Type:    instance.TypeContainer,
        }
 
        containers, err := tx.InstanceList(filter)
@@ -117,7 +119,7 @@ func 
TestInstanceList_ContainerWithSameNameInDifferentProjects(t *testing.T) {
                Project:      "blah",
                Name:         "c1",
                Node:         "none",
-               Type:         int(db.CTypeRegular),
+               Type:         instance.TypeContainer,
                Architecture: 1,
                Ephemeral:    false,
                Stateful:     true,
@@ -132,7 +134,7 @@ func 
TestInstanceList_ContainerWithSameNameInDifferentProjects(t *testing.T) {
                Project:      "test",
                Name:         "c1",
                Node:         "none",
-               Type:         int(db.CTypeRegular),
+               Type:         instance.TypeContainer,
                Architecture: 1,
                Ephemeral:    false,
                Stateful:     true,
@@ -171,7 +173,7 @@ func TestInstanceListExpanded(t *testing.T) {
                Project:      "default",
                Name:         "c1",
                Node:         "none",
-               Type:         int(db.CTypeRegular),
+               Type:         instance.TypeContainer,
                Architecture: 1,
                Ephemeral:    false,
                Stateful:     true,
@@ -396,7 +398,7 @@ func TestContainersNodeList(t *testing.T) {
        })
        require.NoError(t, err)
 
-       names, err := cluster.ContainersNodeList(db.CTypeRegular)
+       names, err := cluster.ContainersNodeList(instance.TypeContainer)
        require.NoError(t, err)
        assert.Equal(t, names, []string{"c1"})
 }
@@ -448,7 +450,7 @@ func addContainer(t *testing.T, tx *db.ClusterTx, nodeID 
int64, name string) {
        stmt := `
 INSERT INTO instances(node_id, name, architecture, type, project_id) VALUES 
(?, ?, 1, ?, 1)
 `
-       _, err := tx.Tx().Exec(stmt, nodeID, name, db.CTypeRegular)
+       _, err := tx.Tx().Exec(stmt, nodeID, name, instance.TypeContainer)
        require.NoError(t, err)
 }
 
diff --git a/lxd/db/snapshots.go b/lxd/db/snapshots.go
index 5c48106218..dcf7183d10 100644
--- a/lxd/db/snapshots.go
+++ b/lxd/db/snapshots.go
@@ -69,7 +69,8 @@ func InstanceSnapshotToInstance(instance *Instance, snapshot 
*InstanceSnapshot)
                Project:      snapshot.Project,
                Name:         instance.Name + shared.SnapshotDelimiter + 
snapshot.Name,
                Node:         instance.Node,
-               Type:         int(CTypeSnapshot),
+               Type:         instance.Type,
+               IsSnapshot:   true,
                Architecture: instance.Architecture,
                Ephemeral:    false,
                CreationDate: snapshot.CreationDate,
diff --git a/lxd/db/snapshots_test.go b/lxd/db/snapshots_test.go
index dcc348552a..0ef5121170 100644
--- a/lxd/db/snapshots_test.go
+++ b/lxd/db/snapshots_test.go
@@ -4,10 +4,12 @@ import (
        "testing"
        "time"
 
-       "github.com/lxc/lxd/lxd/db"
-       "github.com/lxc/lxd/shared/api"
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/require"
+
+       "github.com/lxc/lxd/lxd/db"
+       "github.com/lxc/lxd/lxd/instance"
+       "github.com/lxc/lxd/shared/api"
 )
 
 func TestInstanceSnapshotList(t *testing.T) {
@@ -95,7 +97,7 @@ func TestInstanceSnapshotList_SameNameInDifferentProjects(t 
*testing.T) {
                Project:      "default",
                Name:         "i1",
                Node:         "none",
-               Type:         int(db.CTypeRegular),
+               Type:         instance.TypeContainer,
                Architecture: 1,
                Ephemeral:    false,
                Stateful:     true,
@@ -108,7 +110,7 @@ func TestInstanceSnapshotList_SameNameInDifferentProjects(t 
*testing.T) {
                Project:      "p1",
                Name:         "i1",
                Node:         "none",
-               Type:         int(db.CTypeRegular),
+               Type:         instance.TypeContainer,
                Architecture: 1,
                Ephemeral:    false,
                Stateful:     true,
diff --git a/lxd/logging.go b/lxd/logging.go
index e46bad2509..162ad51a3d 100644
--- a/lxd/logging.go
+++ b/lxd/logging.go
@@ -7,6 +7,7 @@ import (
        "time"
 
        "github.com/lxc/lxd/lxd/db"
+       "github.com/lxc/lxd/lxd/instance"
        "github.com/lxc/lxd/lxd/state"
        "github.com/lxc/lxd/lxd/task"
        "github.com/lxc/lxd/shared"
@@ -52,7 +53,7 @@ func expireLogs(ctx context.Context, state *state.State) 
error {
        var containers []string
        ch := make(chan struct{})
        go func() {
-               containers, err = 
state.Cluster.ContainersNodeList(db.CTypeRegular)
+               containers, err = 
state.Cluster.ContainersNodeList(instance.TypeContainer)
                ch <- struct{}{}
        }()
        select {
diff --git a/lxd/main_activateifneeded.go b/lxd/main_activateifneeded.go
index 686a3df4fc..16196ef827 100644
--- a/lxd/main_activateifneeded.go
+++ b/lxd/main_activateifneeded.go
@@ -10,6 +10,7 @@ import (
 
        lxd "github.com/lxc/lxd/client"
        "github.com/lxc/lxd/lxd/db"
+       "github.com/lxc/lxd/lxd/instance"
        "github.com/lxc/lxd/lxd/node"
        "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/idmap"
@@ -111,7 +112,7 @@ func (c *cmdActivateifneeded) Run(cmd *cobra.Command, args 
[]string) error {
 
        var containers []db.Instance
        err = d.cluster.Transaction(func(tx *db.ClusterTx) error {
-               filter := db.InstanceFilter{Type: int(db.CTypeRegular)}
+               filter := db.InstanceFilter{Type: instance.TypeContainer}
                var err error
                containers, err = tx.InstanceList(filter)
                return err
diff --git a/lxd/patches.go b/lxd/patches.go
index e0606d63c6..6a1c6421be 100644
--- a/lxd/patches.go
+++ b/lxd/patches.go
@@ -1892,9 +1892,9 @@ func updatePoolPropertyForAllObjects(d *Daemon, poolName 
string, allcontainers [
                }
 
                if c.IsSnapshot() {
-                       args.Ctype = db.CTypeSnapshot
+                       args.IsSnapshot = true
                } else {
-                       args.Ctype = db.CTypeRegular
+                       args.IsSnapshot = false
                }
 
                // Check if the container already has a valid root device entry 
(profile or previous upgrade)
diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go
index 3c88a36888..7ea61f13f2 100644
--- a/lxd/storage_lvm_utils.go
+++ b/lxd/storage_lvm_utils.go
@@ -11,6 +11,7 @@ import (
        "github.com/pkg/errors"
 
        "github.com/lxc/lxd/lxd/db"
+       "github.com/lxc/lxd/lxd/instance"
        "github.com/lxc/lxd/lxd/project"
        "github.com/lxc/lxd/lxd/state"
        driver "github.com/lxc/lxd/lxd/storage"
@@ -721,7 +722,7 @@ func storageLVMThinpoolExists(vgName string, poolName 
string) (bool, error) {
 func storageLVMGetThinPoolUsers(s *state.State) ([]string, error) {
        results := []string{}
 
-       cNames, err := s.Cluster.ContainersNodeList(db.CTypeRegular)
+       cNames, err := s.Cluster.ContainersNodeList(instance.TypeContainer)
        if err != nil {
                return results, err
        }
diff --git a/lxd/storage_migration.go b/lxd/storage_migration.go
index b3cca61997..a6144075fe 100644
--- a/lxd/storage_migration.go
+++ b/lxd/storage_migration.go
@@ -198,7 +198,7 @@ func snapshotProtobufToContainerArgs(project string, 
containerName string, snap
        args := db.ContainerArgs{
                Architecture: int(snap.GetArchitecture()),
                Config:       config,
-               Ctype:        db.CTypeSnapshot,
+               IsSnapshot:   true,
                Devices:      devices,
                Ephemeral:    snap.GetEphemeral(),
                Name:         name,

From e166d38be68d77a6a9874f0b6f0f38e5a294c88b Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Mon, 9 Sep 2019 11:31:26 +0100
Subject: [PATCH 7/7] shared/api/container: Adds Type field to Container

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 shared/api/container.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/shared/api/container.go b/shared/api/container.go
index ed41a6e61e..9203fce3cd 100644
--- a/shared/api/container.go
+++ b/shared/api/container.go
@@ -67,6 +67,7 @@ type Container struct {
        Name            string                       `json:"name" yaml:"name"`
        Status          string                       `json:"status" 
yaml:"status"`
        StatusCode      StatusCode                   `json:"status_code" 
yaml:"status_code"`
+       Type            int                          `json:"type" yaml:"type"`
 
        // API extension: container_last_used_at
        LastUsedAt time.Time `json:"last_used_at" yaml:"last_used_at"`
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to