diff --git a/client/interfaces.go b/client/interfaces.go index cc374a9bff81..8ea4b172c239 100644 --- a/client/interfaces.go +++ b/client/interfaces.go @@ -426,6 +426,13 @@ type InstanceServer interface { UpdateClusterGroup(name string, group api.ClusterGroupPut, ETag string) error GetClusterGroup(name string) (*api.ClusterGroup, string, error) + // Site functions ("sites" API extension) + GetSite(name string) (remote *api.Site, ETag string, err error) + GetSites() (remotes []api.Site, err error) + JoinSite(remote api.SitePost) (op Operation, err error) + UpdateSiteName(name string) (op Operation, err error) + DeleteSite(name string) (op Operation, err error) + // Warning functions GetWarningUUIDs() (uuids []string, err error) GetWarnings() (warnings []api.Warning, err error) @@ -675,8 +682,7 @@ type InstanceConsoleArgs struct { // The InstanceConsoleLogArgs struct is used to pass additional options during a // instance console log request. -type InstanceConsoleLogArgs struct { -} +type InstanceConsoleLogArgs struct{} // The InstanceExecArgs struct is used to pass additional options during instance exec. type InstanceExecArgs struct { diff --git a/client/lxd_sites.go b/client/lxd_sites.go new file mode 100644 index 000000000000..53ec02e4dc20 --- /dev/null +++ b/client/lxd_sites.go @@ -0,0 +1,85 @@ +package lxd + +import ( + "fmt" + + "github.com/canonical/lxd/shared/api" +) + +// GetServerSites returns all sites. +func (r *ProtocolLXD) GetSites() ([]api.Site, error) { + err := r.CheckExtension("sites") + if err != nil { + return nil, err + } + + sites := []api.Site{} + _, err = r.queryStruct("GET", "/sites/", nil, "", &sites) + if err != nil { + return nil, err + } + + return sites, nil +} + +// GetSite returns information about a site. +func (r *ProtocolLXD) GetSite(name string) (*api.Site, string, error) { + err := r.CheckExtension("sites") + if err != nil { + return nil, "", err + } + + site := &api.Site{} + etag, err := r.queryStruct("GET", fmt.Sprintf("/sites/%s", name), nil, "", &site) + if err != nil { + return nil, "", err + } + + return site, etag, nil +} + +// JoinSite requests add a new site. +func (r *ProtocolLXD) JoinSite(site api.SitePost) (Operation, error) { + err := r.CheckExtension("sites") + if err != nil { + return nil, err + } + + op, _, err := r.queryOperation("POST", "/site/join", site, "", true) + if err != nil { + return nil, err + } + + return op, nil +} + +// UpdateSiteName updates a site's name. +func (r *ProtocolLXD) UpdateSiteName(name string) (Operation, error) { + // TODO: expand function to provide support for updating site addresses. + err := r.CheckExtension("sites") + if err != nil { + return nil, err + } + + op, _, err := r.queryOperation("PUT", fmt.Sprintf("/sites/%s", name), nil, "", true) + if err != nil { + return nil, err + } + + return op, nil +} + +// DeleteSite deletes a site. +func (r *ProtocolLXD) DeleteSite(name string) (Operation, error) { + err := r.CheckExtension("sites") + if err != nil { + return nil, err + } + + op, _, err := r.queryOperation("DELETE", fmt.Sprintf("/sites/%s", name), nil, "", true) + if err != nil { + return nil, err + } + + return op, nil +}