old_console/correlator/mapping/index.go
2024-11-02 14:12:45 +03:00

160 lines
3.7 KiB
Go

package mapping
import (
"bytes"
"encoding/json"
"errors"
"io"
"io/ioutil"
"net/http"
"os"
log "github.com/sirupsen/logrus"
"github.com/spf13/viper"
"iwarma.ru/console/correlator/config"
)
type Meta struct {
Description string `json:"description"`
}
type Index struct {
IndexPatterns []string `json:"index_patterns"`
Template map[string]interface{} `json:"template"`
Priority int `json:"priority"`
ComposedOf []string `json:"composed_of"`
Version int `json:"version"`
MetaInfo Meta `json:"_meta,omitempty"`
}
type IndexResponseItem struct {
Name string `json:"name"`
Template Index `json:"index_template"`
}
type IndexResponse struct {
Templates []IndexResponseItem `json:"index_templates"`
}
func ReadIndex(reader io.Reader) (Index, error) {
byteValue, err := ioutil.ReadAll(reader)
if err != nil {
log.Errorf("Can't read index: %v", err)
return Index{}, err
}
var result Index
err = json.Unmarshal(byteValue, &result)
if err != nil {
log.Errorf("Can't unmarshall index: %v", err)
return Index{}, err
}
return result, nil
}
func ReadIndexFromFile(fileName string) (Index, error) {
file, err := os.Open(fileName)
if err != nil {
log.Errorf("Can't open file: %v", err)
return Index{}, err
}
defer file.Close()
return ReadIndex(file)
}
func ReadIndexResponse(reader io.Reader) (IndexResponse, error) {
byteValue, err := ioutil.ReadAll(reader)
if err != nil {
log.Errorf("Can't read index response: %v", err)
return IndexResponse{}, err
}
var result IndexResponse
err = json.Unmarshal(byteValue, &result)
if err != nil {
log.Errorf("Can't unmarshall index response: %v", err)
return IndexResponse{}, err
}
return result, nil
}
func CheckIndextUpdate(url string, index Index) (bool, error) {
// Get current mapping for index
http_client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Errorf("Can't create get index mapping request: %v", err)
return false, err
}
// Set auth
req.SetBasicAuth(viper.GetString(config.ElasticUsername), viper.GetString(config.ElasticPassword))
resp, err := http_client.Do(req)
if err != nil {
log.Errorf("Can't send index get index mapping request: %v", err)
return false, err
}
defer resp.Body.Close()
responseComponent, err := ReadIndexResponse(resp.Body)
if err != nil {
log.Errorf("Can't read get mappint for index response: %v", err)
return false, err
}
// Now, check version
max_version := 0
for _, cur := range responseComponent.Templates {
if cur.Template.Version > max_version {
max_version = cur.Template.Version
}
}
log.Debugf("After checking %v versions, found max version %v, index version is %v", len(responseComponent.Templates), max_version, index.Version)
return index.Version > max_version, nil
}
func UpdateIndex(url string, index Index) error {
byteValue, err := json.Marshal(index)
if err != nil {
log.Errorf("Can't marshall index: %v", err)
return err
}
buffer := bytes.NewBuffer(byteValue)
req, err := http.NewRequest("PUT", url, buffer)
if err != nil {
log.Errorf("Can't create index update request: %v", err)
return err
}
req.SetBasicAuth(viper.GetString(config.ElasticUsername), viper.GetString(config.ElasticPassword))
req.Header.Add("Content-Type", "application/json")
http_client := &http.Client{}
resp, err := http_client.Do(req)
if err != nil {
log.Errorf("Can't exec index update request: %v", err)
return err
}
defer resp.Body.Close()
response, err := ReadUpdateResponse(resp.Body)
if err != nil {
log.Errorf("Can't read index update response")
return err
}
if response.Acknowledged != true {
return errors.New("Server didn't accept index")
}
return nil
}