libs/go-kibana-rest/kbapi/api.kibana_spaces.go (207 lines of code) (raw):
package kbapi
import (
"encoding/json"
"fmt"
"strings"
"github.com/go-resty/resty/v2"
log "github.com/sirupsen/logrus"
)
const (
basePathKibanaSpace = "/api/spaces" // Base URL to access on Kibana space API
)
// KibanaSpace is the Space API object
type KibanaSpace struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
DisabledFeatures []string `json:"disabledFeatures,omitempty"`
Reserved bool `json:"_reserved,omitempty"`
Initials string `json:"initials,omitempty"`
Color string `json:"color,omitempty"`
ImageURL string `json:"imageUrl,omitempty"`
}
// KibanaSpaces is the list of KibanaSpace object
type KibanaSpaces []KibanaSpace
// KibanaSpaceCopySavedObjectParameter is parameters to copy dashboard between spaces
type KibanaSpaceCopySavedObjectParameter struct {
Spaces []string `json:"spaces"`
IncludeReferences bool `json:"includeReferences"`
Overwrite bool `json:"overwrite"`
CreateNewCopies bool `json:"createNewCopies"`
Objects []KibanaSpaceObjectParameter `json:"objects"`
}
// KibanaSpaceObjectParameter is Object object
type KibanaSpaceObjectParameter struct {
Type string `json:"type"`
ID string `json:"id"`
}
// KibanaSpaceGet permit to get space
type KibanaSpaceGet func(id string) (*KibanaSpace, error)
// KibanaSpaceList permit to get all spaces
type KibanaSpaceList func() (KibanaSpaces, error)
// KibanaSpaceCreate permit to create space
type KibanaSpaceCreate func(kibanaSpace *KibanaSpace) (*KibanaSpace, error)
// KibanaSpaceDelete permit to delete space
type KibanaSpaceDelete func(id string) error
// KibanaSpaceUpdate permit to update space
type KibanaSpaceUpdate func(kibanaSpace *KibanaSpace) (*KibanaSpace, error)
// KibanaSpaceCopySavedObjects permit to copy dashboad between space
type KibanaSpaceCopySavedObjects func(parameter *KibanaSpaceCopySavedObjectParameter, spaceOrigin string) error
// String permit to return KibanaSpace object as JSON string
func (k *KibanaSpace) String() string {
json, _ := json.Marshal(k)
return string(json)
}
// newKibanaSpaceGetFunc permit to get the kibana space with it id
func newKibanaSpaceGetFunc(c *resty.Client) KibanaSpaceGet {
return func(id string) (*KibanaSpace, error) {
if id == "" {
return nil, NewAPIError(600, "You must provide kibana space ID")
}
log.Debug("ID: ", id)
path := fmt.Sprintf("%s/space/%s", basePathKibanaSpace, id)
resp, err := c.R().Get(path)
if err != nil {
return nil, err
}
log.Debug("Response: ", resp)
if resp.StatusCode() >= 300 {
if resp.StatusCode() == 404 {
return nil, nil
}
return nil, NewAPIError(resp.StatusCode(), resp.Status())
}
kibanaSpace := &KibanaSpace{}
err = json.Unmarshal(resp.Body(), kibanaSpace)
if err != nil {
return nil, err
}
log.Debug("KibanaSpace: ", kibanaSpace)
return kibanaSpace, nil
}
}
// newKibanaSpaceListFunc permit to get all Kibana space
func newKibanaSpaceListFunc(c *resty.Client) KibanaSpaceList {
return func() (KibanaSpaces, error) {
path := fmt.Sprintf("%s/space", basePathKibanaSpace)
resp, err := c.R().Get(path)
if err != nil {
return nil, err
}
log.Debug("Response: ", resp)
if resp.StatusCode() >= 300 {
return nil, NewAPIError(resp.StatusCode(), resp.Status())
}
kibanaSpaces := make(KibanaSpaces, 0, 1)
err = json.Unmarshal(resp.Body(), &kibanaSpaces)
if err != nil {
return nil, err
}
log.Debug("KibanaSpaces: ", kibanaSpaces)
return kibanaSpaces, nil
}
}
// newKibanaSpaceCreateFunc permit to create new Kibana space
func newKibanaSpaceCreateFunc(c *resty.Client) KibanaSpaceCreate {
return func(kibanaSpace *KibanaSpace) (*KibanaSpace, error) {
if kibanaSpace == nil {
return nil, NewAPIError(600, "You must provide kibana space object")
}
log.Debug("KibanaSpace: ", kibanaSpace)
jsonData, err := json.Marshal(kibanaSpace)
if err != nil {
return nil, err
}
path := fmt.Sprintf("%s/space", basePathKibanaSpace)
resp, err := c.R().SetBody(jsonData).Post(path)
if err != nil {
return nil, err
}
log.Debug("Response: ", resp)
if resp.StatusCode() >= 300 {
return nil, NewAPIError(resp.StatusCode(), resp.Status())
}
kibanaSpace = &KibanaSpace{}
err = json.Unmarshal(resp.Body(), kibanaSpace)
if err != nil {
return nil, err
}
log.Debug("KibanaSpace: ", kibanaSpace)
return kibanaSpace, nil
}
}
// newKibanaSpaceCopySavedObjectsFunc permit to copy extings objects from user space to another userSpace
func newKibanaSpaceCopySavedObjectsFunc(c *resty.Client) KibanaSpaceCopySavedObjects {
return func(parameter *KibanaSpaceCopySavedObjectParameter, spaceOrigin string) error {
if parameter == nil {
return NewAPIError(600, "You must provide parameter to copy existing objects on other user spaces")
}
log.Debug("Parameter: ", parameter)
log.Debug("SpaceOrigin: ", spaceOrigin)
var path string
if spaceOrigin == "" || spaceOrigin == "default" {
path = fmt.Sprintf("%s/_copy_saved_objects", basePathKibanaSpace)
} else {
path = fmt.Sprintf("/s/%s%s/_copy_saved_objects", spaceOrigin, basePathKibanaSpace)
}
jsonData, err := json.Marshal(parameter)
if err != nil {
return err
}
resp, err := c.R().SetBody(jsonData).Post(path)
if err != nil {
return err
}
log.Debug("Response: ", resp)
if resp.StatusCode() >= 300 {
return NewAPIError(resp.StatusCode(), resp.Status())
}
data := make(map[string]interface{})
err = json.Unmarshal(resp.Body(), &data)
if err != nil {
return err
}
log.Debug("Response: ", data)
var errors []string
for name, object := range data {
if !object.(map[string]interface{})["success"].(bool) {
errors = append(errors, fmt.Sprintf("Error to process user space %s", name))
}
}
if len(errors) > 0 {
return NewAPIError(500, strings.Join(errors, "\n"))
}
return nil
}
}
// newKibanaSpaceDeleteFunc permit to delete the kubana space wiht it id
func newKibanaSpaceDeleteFunc(c *resty.Client) KibanaSpaceDelete {
return func(id string) error {
if id == "" {
return NewAPIError(600, "You must provide kibana space ID")
}
log.Debug("ID: ", id)
path := fmt.Sprintf("%s/space/%s", basePathKibanaSpace, id)
resp, err := c.R().Delete(path)
if err != nil {
return err
}
log.Debug("Response: ", resp)
if resp.StatusCode() >= 300 {
return NewAPIError(resp.StatusCode(), resp.Status())
}
return nil
}
}
// newKibanaSpaceUpdateFunc permit to update the Kibana space
func newKibanaSpaceUpdateFunc(c *resty.Client) KibanaSpaceUpdate {
return func(kibanaSpace *KibanaSpace) (*KibanaSpace, error) {
if kibanaSpace == nil {
return nil, NewAPIError(600, "You must provide kibana space object")
}
log.Debug("KibanaSpace: ", kibanaSpace)
jsonData, err := json.Marshal(kibanaSpace)
if err != nil {
return nil, err
}
path := fmt.Sprintf("%s/space/%s", basePathKibanaSpace, kibanaSpace.ID)
resp, err := c.R().SetBody(jsonData).Put(path)
if err != nil {
return nil, err
}
log.Debug("Response: ", resp)
if resp.StatusCode() >= 300 {
return nil, NewAPIError(resp.StatusCode(), resp.Status())
}
kibanaSpace = &KibanaSpace{}
err = json.Unmarshal(resp.Body(), kibanaSpace)
if err != nil {
return nil, err
}
log.Debug("KibanaSpace: ", kibanaSpace)
return kibanaSpace, nil
}
}