libs/go-kibana-rest/kbapi/api.kibana_role_management.go (152 lines of code) (raw):

package kbapi import ( "encoding/json" "fmt" "github.com/go-resty/resty/v2" log "github.com/sirupsen/logrus" ) const ( basePathKibanaRoleManagement = "/api/security/role" // Base URL to access on Kibana role management ) // KibanaRole is the API role object type KibanaRole struct { Name string `json:"name,omitempty"` Metadata map[string]interface{} `json:"metadata,omitempty"` TransientMedata *KibanaRoleTransientMetadata `json:"transient_metadata,omitempty"` Elasticsearch *KibanaRoleElasticsearch `json:"elasticsearch,omitempty"` Kibana []KibanaRoleKibana `json:"kibana,omitempty"` CreateOnly bool `json:"-"` } // KibanaRoleTransientMetadata is the API TransientMedata object type KibanaRoleTransientMetadata struct { Enabled bool `json:"enabled,omitempty"` } // KibanaRoleElasticsearch is the API Elasticsearch object type KibanaRoleElasticsearch struct { Indices []KibanaRoleElasticsearchIndice `json:"indices,omitempty"` RemoteIndices []KibanaRoleElasticsearchRemoteIndice `json:"remote_indices,omitempty"` Cluster []string `json:"cluster,omitempty"` RunAs []string `json:"run_as,omitempty"` } // KibanaRoleKibana is the API Kibana object type KibanaRoleKibana struct { Base []string `json:"base,omitempty"` Feature map[string][]string `json:"feature,omitempty"` Spaces []string `json:"spaces,omitempty"` } // KibanaRoleElasticsearchIndice is the API indice object type KibanaRoleElasticsearchIndice struct { Names []string `json:"names,omitempty"` Privileges []string `json:"privileges,omitempty"` FieldSecurity map[string]interface{} `json:"field_security,omitempty"` Query interface{} `json:"query,omitempty"` } // KibanaRoleElasticsearchRemoteIndice is the API remote_indice object type KibanaRoleElasticsearchRemoteIndice struct { Clusters []string `json:"clusters,omitempty"` Names []string `json:"names,omitempty"` Privileges []string `json:"privileges,omitempty"` FieldSecurity map[string]interface{} `json:"field_security,omitempty"` Query interface{} `json:"query,omitempty"` } // KibanaRoles is a list of role object type KibanaRoles []KibanaRole // KibanaRoleManagementGet permit to get role from Kibana type KibanaRoleManagementGet func(name string) (*KibanaRole, error) // KibanaRoleManagementList permit to get all roles from Kibana type KibanaRoleManagementList func() (KibanaRoles, error) // KibanaRoleManagementCreateOrUpdate permit to create or update role in Kibana type KibanaRoleManagementCreateOrUpdate func(kibanaRole *KibanaRole) (*KibanaRole, error) // KibanaRoleManagementDelete permit to delete role in Kibana type KibanaRoleManagementDelete func(name string) error // String permit to return KibanaRole object as JSON string func (k *KibanaRole) String() string { json, _ := json.Marshal(k) return string(json) } // newKibanaRoleManagementGetFunc permit to get the kibana role with it name func newKibanaRoleManagementGetFunc(c *resty.Client) KibanaRoleManagementGet { return func(name string) (*KibanaRole, error) { if name == "" { return nil, NewAPIError(600, "You must provide kibana role name") } log.Debug("Name: ", name) path := fmt.Sprintf("%s/%s", basePathKibanaRoleManagement, name) 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()) } kibanaRole := &KibanaRole{} err = json.Unmarshal(resp.Body(), kibanaRole) if err != nil { return nil, err } log.Debug("KibanaRole: ", kibanaRole) return kibanaRole, nil } } // newKibanaRoleManagementListFunc permit to get all kibana role func newKibanaRoleManagementListFunc(c *resty.Client) KibanaRoleManagementList { return func() (KibanaRoles, error) { resp, err := c.R().Get(basePathKibanaRoleManagement) if err != nil { return nil, err } log.Debug("Response: ", resp) if resp.StatusCode() >= 300 { return nil, NewAPIError(resp.StatusCode(), resp.Status()) } kibanaRoles := make(KibanaRoles, 0, 1) err = json.Unmarshal(resp.Body(), &kibanaRoles) if err != nil { return nil, err } log.Debug("KibanaRoles: ", kibanaRoles) return kibanaRoles, nil } } // newKibanaRoleManagementGetFunc permit to create or update the kibana role func newKibanaRoleManagementCreateOrUpdateFunc(c *resty.Client) KibanaRoleManagementCreateOrUpdate { return func(kibanaRole *KibanaRole) (*KibanaRole, error) { if kibanaRole == nil { return nil, NewAPIError(600, "You must provide kibana role object") } log.Debug("Kibana role: ", kibanaRole) roleName := kibanaRole.Name path := fmt.Sprintf("%s/%s", basePathKibanaRoleManagement, roleName) kibanaRole.Name = "" jsonData, err := json.Marshal(kibanaRole) log.Debugf("Payload: %s", jsonData) if err != nil { return nil, err } r := c.R() if kibanaRole.CreateOnly { r = r.SetQueryParam("createOnly", "true") } resp, err := 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()) } // Retrive the object to return it kibanaRole, err = newKibanaRoleManagementGetFunc(c)(roleName) if err != nil { return nil, err } log.Debug("KibanaRole: ", kibanaRole) return kibanaRole, nil } } // newKibanaRoleManagementDeleteFunc permit to delete kibana role with it name func newKibanaRoleManagementDeleteFunc(c *resty.Client) KibanaRoleManagementDelete { return func(name string) error { if name == "" { return NewAPIError(600, "You must provide kibana role name") } log.Debug("Name: ", name) path := fmt.Sprintf("%s/%s", basePathKibanaRoleManagement, name) 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 } }