forked from canonical/lxd
/
lxd_projects.go
146 lines (114 loc) · 3.73 KB
/
lxd_projects.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
138
139
140
141
142
143
144
145
146
package lxd
import (
"fmt"
"net/url"
"strings"
"github.com/lxc/lxd/shared/api"
)
// Project handling functions
// GetProjectNames returns a list of available project names
func (r *ProtocolLXD) GetProjectNames() ([]string, error) {
if !r.HasExtension("projects") {
return nil, fmt.Errorf("The server is missing the required \"projects\" API extension")
}
urls := []string{}
// Fetch the raw value
_, err := r.queryStruct("GET", "/projects", nil, "", &urls)
if err != nil {
return nil, err
}
// Parse it
names := []string{}
for _, url := range urls {
fields := strings.Split(url, "/projects/")
names = append(names, fields[len(fields)-1])
}
return names, nil
}
// GetProjects returns a list of available Project structs
func (r *ProtocolLXD) GetProjects() ([]api.Project, error) {
if !r.HasExtension("projects") {
return nil, fmt.Errorf("The server is missing the required \"projects\" API extension")
}
projects := []api.Project{}
// Fetch the raw value
_, err := r.queryStruct("GET", "/projects?recursion=1", nil, "", &projects)
if err != nil {
return nil, err
}
return projects, nil
}
// GetProject returns a Project entry for the provided name
func (r *ProtocolLXD) GetProject(name string) (*api.Project, string, error) {
if !r.HasExtension("projects") {
return nil, "", fmt.Errorf("The server is missing the required \"projects\" API extension")
}
project := api.Project{}
// Fetch the raw value
etag, err := r.queryStruct("GET", fmt.Sprintf("/projects/%s", url.PathEscape(name)), nil, "", &project)
if err != nil {
return nil, "", err
}
return &project, etag, nil
}
// GetProjectState returns a Project state for the provided name
func (r *ProtocolLXD) GetProjectState(name string) (*api.ProjectState, error) {
if !r.HasExtension("project_usage") {
return nil, fmt.Errorf("The server is missing the required \"project_usage\" API extension")
}
projectState := api.ProjectState{}
// Fetch the raw value
_, err := r.queryStruct("GET", fmt.Sprintf("/projects/%s/state", url.PathEscape(name)), nil, "", &projectState)
if err != nil {
return nil, err
}
return &projectState, nil
}
// CreateProject defines a new container project
func (r *ProtocolLXD) CreateProject(project api.ProjectsPost) error {
if !r.HasExtension("projects") {
return fmt.Errorf("The server is missing the required \"projects\" API extension")
}
// Send the request
_, _, err := r.query("POST", "/projects", project, "")
if err != nil {
return err
}
return nil
}
// UpdateProject updates the project to match the provided Project struct
func (r *ProtocolLXD) UpdateProject(name string, project api.ProjectPut, ETag string) error {
if !r.HasExtension("projects") {
return fmt.Errorf("The server is missing the required \"projects\" API extension")
}
// Send the request
_, _, err := r.query("PUT", fmt.Sprintf("/projects/%s", url.PathEscape(name)), project, ETag)
if err != nil {
return err
}
return nil
}
// RenameProject renames an existing project entry
func (r *ProtocolLXD) RenameProject(name string, project api.ProjectPost) (Operation, error) {
if !r.HasExtension("projects") {
return nil, fmt.Errorf("The server is missing the required \"projects\" API extension")
}
// Send the request
op, _, err := r.queryOperation("POST", fmt.Sprintf("/projects/%s", url.PathEscape(name)), project, "")
if err != nil {
return nil, err
}
return op, nil
}
// DeleteProject deletes a project
func (r *ProtocolLXD) DeleteProject(name string) error {
if !r.HasExtension("projects") {
return fmt.Errorf("The server is missing the required \"projects\" API extension")
}
// Send the request
_, _, err := r.query("DELETE", fmt.Sprintf("/projects/%s", url.PathEscape(name)), nil, "")
if err != nil {
return err
}
return nil
}