-
-
Notifications
You must be signed in to change notification settings - Fork 222
/
instances.go
137 lines (122 loc) · 4.43 KB
/
instances.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//go:build linux && cgo && !agent
package cluster
import (
"context"
"database/sql"
"time"
"github.com/lxc/incus/internal/server/device/config"
"github.com/lxc/incus/internal/server/instance/instancetype"
"github.com/lxc/incus/shared/api"
"github.com/lxc/incus/shared/osarch"
)
// Code generation directives.
//
//go:generate -command mapper incus-generate db mapper -t instances.mapper.go
//go:generate mapper reset -i -b "//go:build linux && cgo && !agent"
//
//go:generate mapper stmt -e instance objects
//go:generate mapper stmt -e instance objects-by-ID
//go:generate mapper stmt -e instance objects-by-Project
//go:generate mapper stmt -e instance objects-by-Project-and-Type
//go:generate mapper stmt -e instance objects-by-Project-and-Type-and-Node
//go:generate mapper stmt -e instance objects-by-Project-and-Type-and-Node-and-Name
//go:generate mapper stmt -e instance objects-by-Project-and-Type-and-Name
//go:generate mapper stmt -e instance objects-by-Project-and-Name
//go:generate mapper stmt -e instance objects-by-Project-and-Name-and-Node
//go:generate mapper stmt -e instance objects-by-Project-and-Node
//go:generate mapper stmt -e instance objects-by-Type
//go:generate mapper stmt -e instance objects-by-Type-and-Name
//go:generate mapper stmt -e instance objects-by-Type-and-Name-and-Node
//go:generate mapper stmt -e instance objects-by-Type-and-Node
//go:generate mapper stmt -e instance objects-by-Node
//go:generate mapper stmt -e instance objects-by-Node-and-Name
//go:generate mapper stmt -e instance objects-by-Name
//go:generate mapper stmt -e instance id
//go:generate mapper stmt -e instance create
//go:generate mapper stmt -e instance rename
//go:generate mapper stmt -e instance delete-by-Project-and-Name
//go:generate mapper stmt -e instance update
//
//go:generate mapper method -i -e instance GetMany references=Config,Device
//go:generate mapper method -i -e instance GetOne
//go:generate mapper method -i -e instance ID
//go:generate mapper method -i -e instance Exists
//go:generate mapper method -i -e instance Create references=Config,Device
//go:generate mapper method -i -e instance Rename
//go:generate mapper method -i -e instance DeleteOne-by-Project-and-Name
//go:generate mapper method -i -e instance Update references=Config,Device
// Instance is a value object holding db-related details about an instance.
type Instance struct {
ID int
Project string `db:"primary=yes&join=projects.name"`
Name string `db:"primary=yes"`
Node string `db:"join=nodes.name"`
Type instancetype.Type
Snapshot bool `db:"ignore"`
Architecture int
Ephemeral bool
CreationDate time.Time
Stateful bool
LastUseDate sql.NullTime
Description string `db:"coalesce=''"`
ExpiryDate sql.NullTime
}
// InstanceFilter specifies potential query parameter fields.
type InstanceFilter struct {
ID *int
Project *string
Name *string
Node *string
Type *instancetype.Type
}
// ToAPI converts the database Instance to API type.
func (i *Instance) ToAPI(ctx context.Context, tx *sql.Tx) (*api.Instance, error) {
profiles, err := GetInstanceProfiles(ctx, tx, i.ID)
if err != nil {
return nil, err
}
apiProfiles := make([]api.Profile, 0, len(profiles))
profileNames := make([]string, 0, len(profiles))
for _, p := range profiles {
apiProfile, err := p.ToAPI(ctx, tx)
if err != nil {
return nil, err
}
apiProfiles = append(apiProfiles, *apiProfile)
profileNames = append(profileNames, p.Name)
}
devices, err := GetInstanceDevices(ctx, tx, i.ID)
if err != nil {
return nil, err
}
apiDevices := DevicesToAPI(devices)
expandedDevices := ExpandInstanceDevices(config.NewDevices(apiDevices), apiProfiles)
config, err := GetInstanceConfig(ctx, tx, i.ID)
if err != nil {
return nil, err
}
expandedConfig := ExpandInstanceConfig(config, apiProfiles)
archName, err := osarch.ArchitectureName(i.Architecture)
if err != nil {
return nil, err
}
return &api.Instance{
InstancePut: api.InstancePut{
Architecture: archName,
Config: config,
Devices: apiDevices,
Ephemeral: i.Ephemeral,
Profiles: profileNames,
Stateful: i.Stateful,
Description: i.Description,
},
CreatedAt: i.CreationDate,
ExpandedConfig: expandedConfig,
ExpandedDevices: expandedDevices.CloneNative(),
Name: i.Name,
LastUsedAt: i.LastUseDate.Time,
Location: i.Node,
Type: i.Type.String(),
Project: i.Project,
}, nil
}