support remote config store
This commit is contained in:
parent
ddba189aec
commit
9bab385d8c
|
@ -1,90 +0,0 @@
|
||||||
elasticsearch:
|
|
||||||
- name: $[[INGEST_CLUSTER_ID]]
|
|
||||||
enabled: true
|
|
||||||
endpoints: $[[INGEST_CLUSTER_ENDPOINT]]
|
|
||||||
discovery:
|
|
||||||
enabled: false
|
|
||||||
basic_auth:
|
|
||||||
username: $[[INGEST_CLUSTER_USERNAME]]
|
|
||||||
password: $[[keystore.ingest_cluster_password]]
|
|
||||||
|
|
||||||
metrics:
|
|
||||||
enabled: true
|
|
||||||
queue: metrics
|
|
||||||
network:
|
|
||||||
enabled: true
|
|
||||||
summary: true
|
|
||||||
details: true
|
|
||||||
memory:
|
|
||||||
metrics:
|
|
||||||
- swap
|
|
||||||
- memory
|
|
||||||
disk:
|
|
||||||
metrics:
|
|
||||||
- iops
|
|
||||||
- usage
|
|
||||||
cpu:
|
|
||||||
metrics:
|
|
||||||
- idle
|
|
||||||
- system
|
|
||||||
- user
|
|
||||||
- iowait
|
|
||||||
- load
|
|
||||||
instance:
|
|
||||||
enabled: true
|
|
||||||
|
|
||||||
elastic:
|
|
||||||
availability_check:
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
pipeline:
|
|
||||||
- name: merge_logs
|
|
||||||
auto_start: true
|
|
||||||
keep_running: true
|
|
||||||
processor:
|
|
||||||
- indexing_merge:
|
|
||||||
index_name: ".infini_logs"
|
|
||||||
elasticsearch: "$[[INGEST_CLUSTER_ID]]"
|
|
||||||
input_queue: "logs"
|
|
||||||
idle_timeout_in_seconds: 10
|
|
||||||
output_queue:
|
|
||||||
name: "merged_requests"
|
|
||||||
worker_size: 1
|
|
||||||
bulk_size_in_mb: 5
|
|
||||||
- name: merge_metrics
|
|
||||||
auto_start: true
|
|
||||||
keep_running: true
|
|
||||||
processor:
|
|
||||||
- indexing_merge:
|
|
||||||
elasticsearch: "$[[INGEST_CLUSTER_ID]]"
|
|
||||||
index_name: ".infini_metrics"
|
|
||||||
input_queue: "metrics"
|
|
||||||
output_queue:
|
|
||||||
name: "merged_requests"
|
|
||||||
worker_size: 1
|
|
||||||
bulk_size_in_mb: 5
|
|
||||||
- name: ingest_merged_requests
|
|
||||||
auto_start: true
|
|
||||||
keep_running: true
|
|
||||||
processor:
|
|
||||||
- bulk_indexing:
|
|
||||||
max_worker_size: 1
|
|
||||||
bulk:
|
|
||||||
batch_size_in_mb: 5
|
|
||||||
batch_size_in_docs: 5000
|
|
||||||
max_retry_times: 0
|
|
||||||
invalid_queue: ""
|
|
||||||
response_handle:
|
|
||||||
include_index_stats: false
|
|
||||||
include_action_stats: false
|
|
||||||
output_bulk_stats: false
|
|
||||||
include_error_details: false
|
|
||||||
save_error_results: false
|
|
||||||
save_success_results: false
|
|
||||||
save_busy_results: false
|
|
||||||
consumer:
|
|
||||||
fetch_max_messages: 5
|
|
||||||
queues:
|
|
||||||
type: indexing_merge
|
|
||||||
when:
|
|
||||||
cluster_available: ["$[[INGEST_CLUSTER_ID]]"]
|
|
|
@ -1,84 +0,0 @@
|
||||||
elasticsearch:
|
|
||||||
- id: $[[CLUSTER_ID]]
|
|
||||||
name: $[[CLUSTER_ID]]
|
|
||||||
enabled: true
|
|
||||||
endpoint: $[[CLUSTER_ENDPOINT]]
|
|
||||||
discovery:
|
|
||||||
enabled: false
|
|
||||||
basic_auth:
|
|
||||||
username: $[[CLUSTER_USERNAME]]
|
|
||||||
password: $[[keystore.$[[CLUSTER_ID]]_password]]
|
|
||||||
|
|
||||||
pipeline:
|
|
||||||
#clsuter level metrics
|
|
||||||
- auto_start: $[[CLUSTER_LEVEL_TASKS_ENABLED]]
|
|
||||||
enabled: $[[CLUSTER_LEVEL_TASKS_ENABLED]]
|
|
||||||
keep_running: true
|
|
||||||
singleton: true
|
|
||||||
name: collect_$[[CLUSTER_ID]]_es_cluster_stats
|
|
||||||
retry_delay_in_ms: 10000
|
|
||||||
processor:
|
|
||||||
- es_cluster_stats:
|
|
||||||
elasticsearch: $[[CLUSTER_ID]]
|
|
||||||
labels:
|
|
||||||
cluster_id: $[[CLUSTER_ID]]
|
|
||||||
when:
|
|
||||||
cluster_available: ["$[[CLUSTER_ID]]"]
|
|
||||||
|
|
||||||
- auto_start: $[[CLUSTER_LEVEL_TASKS_ENABLED]]
|
|
||||||
enabled: $[[CLUSTER_LEVEL_TASKS_ENABLED]]
|
|
||||||
keep_running: true
|
|
||||||
singleton: true
|
|
||||||
name: collect_$[[CLUSTER_ID]]_es_index_stats
|
|
||||||
retry_delay_in_ms: 10000
|
|
||||||
processor:
|
|
||||||
- es_index_stats:
|
|
||||||
elasticsearch: $[[CLUSTER_ID]]
|
|
||||||
labels:
|
|
||||||
cluster_id: $[[CLUSTER_ID]]
|
|
||||||
when:
|
|
||||||
cluster_available: ["$[[CLUSTER_ID]]"]
|
|
||||||
|
|
||||||
- auto_start: $[[CLUSTER_LEVEL_TASKS_ENABLED]]
|
|
||||||
enabled: $[[CLUSTER_LEVEL_TASKS_ENABLED]]
|
|
||||||
keep_running: true
|
|
||||||
singleton: true
|
|
||||||
name: collect_$[[CLUSTER_ID]]_es_cluster_health
|
|
||||||
retry_delay_in_ms: 10000
|
|
||||||
processor:
|
|
||||||
- es_cluster_health:
|
|
||||||
elasticsearch: $[[CLUSTER_ID]]
|
|
||||||
labels:
|
|
||||||
cluster_id: $[[CLUSTER_ID]]
|
|
||||||
when:
|
|
||||||
cluster_available: ["$[[CLUSTER_ID]]"]
|
|
||||||
|
|
||||||
#node level metrics
|
|
||||||
- auto_start: $[[NODE_LEVEL_TASKS_ENABLED]]
|
|
||||||
enabled: $[[NODE_LEVEL_TASKS_ENABLED]]
|
|
||||||
keep_running: true
|
|
||||||
name: collect_$[[CLUSTER_ID]]_es_node_stats
|
|
||||||
retry_delay_in_ms: 10000
|
|
||||||
processor:
|
|
||||||
- es_node_stats:
|
|
||||||
elasticsearch: $[[CLUSTER_ID]]
|
|
||||||
labels:
|
|
||||||
cluster_id: $[[CLUSTER_ID]]
|
|
||||||
when:
|
|
||||||
cluster_available: ["$[[CLUSTER_ID]]"]
|
|
||||||
|
|
||||||
#node logs
|
|
||||||
- auto_start: $[[NODE_LEVEL_TASKS_ENABLED]]
|
|
||||||
enabled: $[[NODE_LEVEL_TASKS_ENABLED]]
|
|
||||||
keep_running: true
|
|
||||||
name: collect_$[[CLUSTER_ID]]_es_logs
|
|
||||||
retry_delay_in_ms: 10000
|
|
||||||
processor:
|
|
||||||
- es_logs_processor:
|
|
||||||
elasticsearch: $[[CLUSTER_ID]]
|
|
||||||
labels:
|
|
||||||
cluster_id: $[[CLUSTER_ID]]
|
|
||||||
logs_path: $[[NODE_LOGS_PATH]]
|
|
||||||
queue_name: logs
|
|
||||||
when:
|
|
||||||
cluster_available: ["$[[CLUSTER_ID]]"]
|
|
|
@ -1,17 +0,0 @@
|
||||||
configs.template:
|
|
||||||
- name: "cluster_a_node_b_task_config"
|
|
||||||
path: ./config/task_config.tpl
|
|
||||||
variable:
|
|
||||||
CLUSTER_ID: infini_default_ingest_cluster
|
|
||||||
CLUSTER_ENDPOINT: ["https://localhost:9200"]
|
|
||||||
CLUSTER_USERNAME: "admin"
|
|
||||||
CLUSTER_VER: "1.6.0"
|
|
||||||
CLUSTER_DISTRIBUTION: "easysearch"
|
|
||||||
INDEX_PREFIX: ".infini_"
|
|
||||||
CLUSTER_LEVEL_TASKS_ENABLED: false
|
|
||||||
NODE_LEVEL_TASKS_ENABLED: true
|
|
||||||
NODE_LOGS_PATH: "/opt/easysearch/logs/"
|
|
||||||
|
|
||||||
|
|
||||||
#MANAGED_CONFIG_VERSION: 19
|
|
||||||
#MANAGED: true
|
|
|
@ -4,14 +4,13 @@ configs: #define configs group
|
||||||
- ./templates/ingest_config.tpl
|
- ./templates/ingest_config.tpl
|
||||||
- ./templates/task_config.tpl
|
- ./templates/task_config.tpl
|
||||||
- ./configs/ingest_config.yml
|
- ./configs/ingest_config.yml
|
||||||
- ./configs/cluster_xx_node_xx.yml
|
|
||||||
instances: #define which config instance should fetch
|
instances: #define which config instance should fetch
|
||||||
infini_default_system_cluster: #instance group
|
_all: #instance group
|
||||||
plugins:
|
# plugins:
|
||||||
- ingest
|
# - ingest
|
||||||
instances:
|
# instances:
|
||||||
- ck0mkk805f5virpsejp0
|
# - ck0mkk805f5virpsejp0
|
||||||
- ckjrpdg05f5lrfp8qlng
|
# - ckjrpdg05f5lrfp8qlng
|
||||||
configs:
|
configs:
|
||||||
- general_ingest_template
|
- general_ingest_template
|
||||||
secrets:
|
secrets:
|
||||||
|
@ -22,10 +21,4 @@ secrets:
|
||||||
keystore:
|
keystore:
|
||||||
ingest_cluster_password:
|
ingest_cluster_password:
|
||||||
type: plaintext
|
type: plaintext
|
||||||
value: "d7cc48e69a41dac719fb"
|
value: "d7cc48e69a41dac719fb"
|
||||||
infini_default_ingest_cluster_password:
|
|
||||||
type: plaintext
|
|
||||||
value: "d7cc48e69a41dac719fb"
|
|
||||||
# infini_default_ingest_cluster_password:
|
|
||||||
# type: credential
|
|
||||||
# value: "ckghspo05f5q7pr20ct0" #credential_id
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
env:
|
||||||
|
CLUSTER_PASSWORD: $[[keystore.$[[CLUSTER_ID]]_password]]
|
||||||
|
|
||||||
elasticsearch:
|
elasticsearch:
|
||||||
- id: $[[CLUSTER_ID]]
|
- id: $[[CLUSTER_ID]]
|
||||||
name: $[[CLUSTER_ID]]
|
name: $[[CLUSTER_ID]]
|
||||||
|
@ -7,7 +10,7 @@ elasticsearch:
|
||||||
enabled: false
|
enabled: false
|
||||||
basic_auth:
|
basic_auth:
|
||||||
username: $[[CLUSTER_USERNAME]]
|
username: $[[CLUSTER_USERNAME]]
|
||||||
password: $[[keystore.$[[CLUSTER_ID]]_password]]
|
password: $[[CLUSTER_PASSWORD]]
|
||||||
|
|
||||||
pipeline:
|
pipeline:
|
||||||
#clsuter level metrics
|
#clsuter level metrics
|
||||||
|
|
2
main.go
2
main.go
|
@ -129,7 +129,6 @@ func main() {
|
||||||
orm.RegisterSchemaWithIndexName(elastic.View{}, "view")
|
orm.RegisterSchemaWithIndexName(elastic.View{}, "view")
|
||||||
orm.RegisterSchemaWithIndexName(elastic.CommonCommand{}, "commands")
|
orm.RegisterSchemaWithIndexName(elastic.CommonCommand{}, "commands")
|
||||||
//orm.RegisterSchema(elastic.TraceTemplate{}, "trace-template")
|
//orm.RegisterSchema(elastic.TraceTemplate{}, "trace-template")
|
||||||
//orm.RegisterSchema(model.Instance{}, "instance")
|
|
||||||
orm.RegisterSchemaWithIndexName(alerting.Rule{}, "alert-rule")
|
orm.RegisterSchemaWithIndexName(alerting.Rule{}, "alert-rule")
|
||||||
orm.RegisterSchemaWithIndexName(alerting.Alert{}, "alert-history")
|
orm.RegisterSchemaWithIndexName(alerting.Alert{}, "alert-history")
|
||||||
orm.RegisterSchemaWithIndexName(alerting.AlertMessage{}, "alert-message")
|
orm.RegisterSchemaWithIndexName(alerting.AlertMessage{}, "alert-message")
|
||||||
|
@ -142,6 +141,7 @@ func main() {
|
||||||
orm.RegisterSchemaWithIndexName(model.Notification{}, "notification")
|
orm.RegisterSchemaWithIndexName(model.Notification{}, "notification")
|
||||||
orm.RegisterSchemaWithIndexName(model.EmailServer{}, "email-server")
|
orm.RegisterSchemaWithIndexName(model.EmailServer{}, "email-server")
|
||||||
orm.RegisterSchemaWithIndexName(model2.Instance{}, "instance")
|
orm.RegisterSchemaWithIndexName(model2.Instance{}, "instance")
|
||||||
|
orm.RegisterSchemaWithIndexName(api3.RemoteConfig{}, "configs")
|
||||||
|
|
||||||
api.RegisterSchema()
|
api.RegisterSchema()
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
log "github.com/cihub/seelog"
|
log "github.com/cihub/seelog"
|
||||||
|
@ -13,12 +14,70 @@ import (
|
||||||
"infini.sh/framework/core/model"
|
"infini.sh/framework/core/model"
|
||||||
"infini.sh/framework/core/orm"
|
"infini.sh/framework/core/orm"
|
||||||
"infini.sh/framework/core/util"
|
"infini.sh/framework/core/util"
|
||||||
|
common2 "infini.sh/framework/modules/elastic/common"
|
||||||
|
"infini.sh/framework/plugins/managed/common"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//node -> binding item
|
||||||
|
func GetEnrolledNodesByAgent(instance *model.Instance) (map[string]BindingItem, error) {
|
||||||
|
|
||||||
|
//get nodes settings where agent id = instance id
|
||||||
|
q := orm.Query{
|
||||||
|
Size: 1000,
|
||||||
|
Conds: orm.And(orm.Eq("metadata.category", "node_settings"),
|
||||||
|
orm.Eq("metadata.name", "agent"),
|
||||||
|
orm.Eq("metadata.labels.agent_id", instance.ID),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
err, result := orm.Search(model.Setting{}, &q)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ids := map[string]BindingItem{}
|
||||||
|
for _, row := range result.Result {
|
||||||
|
v, ok := row.(map[string]interface{})
|
||||||
|
if ok {
|
||||||
|
x, ok := v["payload"]
|
||||||
|
if ok {
|
||||||
|
f, ok := x.(map[string]interface{})
|
||||||
|
if ok {
|
||||||
|
nodeID, ok := f["node_uuid"].(string)
|
||||||
|
if ok {
|
||||||
|
item := BindingItem{}
|
||||||
|
item.ClusterID = util.ToString(f["cluster_id"])
|
||||||
|
item.ClusterName = util.ToString(f["cluster_name"])
|
||||||
|
item.ClusterUUID = util.ToString(f["cluster_uuid"])
|
||||||
|
item.PublishAddress = util.ToString(f["publish_address"])
|
||||||
|
item.NodeName = util.ToString(f["node_name"])
|
||||||
|
item.PathHome = util.ToString(f["path_home"])
|
||||||
|
item.PathLogs = util.ToString(f["path_logs"])
|
||||||
|
item.NodeUUID = nodeID
|
||||||
|
|
||||||
|
t, ok := v["updated"]
|
||||||
|
if ok {
|
||||||
|
layout := "2006-01-02T15:04:05.999999-07:00"
|
||||||
|
t1, err := time.Parse(layout, util.ToString(t))
|
||||||
|
if err == nil {
|
||||||
|
item.Updated = t1.Unix()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ids[item.NodeUUID] = item
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ids, nil
|
||||||
|
}
|
||||||
|
|
||||||
func refreshNodesInfo(inst *model.Instance) (*elastic.DiscoveryResult, error) {
|
func refreshNodesInfo(inst *model.Instance) (*elastic.DiscoveryResult, error) {
|
||||||
enrolledNodesByAgent, err := getEnrolledNodesByAgent(inst)
|
enrolledNodesByAgent, err := GetEnrolledNodesByAgent(inst)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error on get binding nodes info: %w", err)
|
return nil, fmt.Errorf("error on get binding nodes info: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -30,13 +89,14 @@ func refreshNodesInfo(inst *model.Instance) (*elastic.DiscoveryResult, error) {
|
||||||
//TODO return already biding nodes info ??
|
//TODO return already biding nodes info ??
|
||||||
return nil, fmt.Errorf("error on get nodes info from agent: %w", err)
|
return nil, fmt.Errorf("error on get nodes info from agent: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for nodeID, node := range nodesInfo.Nodes {
|
for nodeID, node := range nodesInfo.Nodes {
|
||||||
|
|
||||||
v, ok := enrolledNodesByAgent[nodeID]
|
v, ok := enrolledNodesByAgent[nodeID]
|
||||||
if ok {
|
if ok {
|
||||||
node.ClusterID = v.ClusterID
|
node.ClusterID = v.ClusterID
|
||||||
node.Enrolled = true
|
node.Enrolled = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////not recognized by agent, need auth?
|
////not recognized by agent, need auth?
|
||||||
|
@ -75,6 +135,149 @@ func refreshNodesInfo(inst *model.Instance) (*elastic.DiscoveryResult, error) {
|
||||||
return nodesInfo, nil
|
return nodesInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RemoteConfig struct {
|
||||||
|
orm.ORMObjectBase
|
||||||
|
Metadata model.Metadata `json:"metadata" elastic_mapping:"metadata: { type: object }"`
|
||||||
|
Payload common.ConfigFile `json:"payload" elastic_mapping:"payload: { type: object}"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func remoteConfigProvider(instance model.Instance) []*common.ConfigFile {
|
||||||
|
|
||||||
|
//fetch configs from remote db
|
||||||
|
//fetch configs assigned to (instance=_all OR instance=$instance_id ) AND application.name=$application.name
|
||||||
|
|
||||||
|
q := orm.Query{
|
||||||
|
Size: 1000,
|
||||||
|
Conds: orm.And(orm.Eq("metadata.category", "app_settings"),
|
||||||
|
orm.Eq("metadata.name", instance.Application.Name),
|
||||||
|
orm.Eq("metadata.labels.instance", "_all"),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
err, searchResult := orm.Search(RemoteConfig{}, &q)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
result := []*common.ConfigFile{}
|
||||||
|
|
||||||
|
for _, row := range searchResult.Result {
|
||||||
|
v, ok := row.(map[string]interface{})
|
||||||
|
if ok {
|
||||||
|
x, ok := v["payload"]
|
||||||
|
if ok {
|
||||||
|
f, ok := x.(map[string]interface{})
|
||||||
|
if ok {
|
||||||
|
name, ok := f["name"].(string)
|
||||||
|
if ok {
|
||||||
|
item := common.ConfigFile{}
|
||||||
|
item.Name = util.ToString(name)
|
||||||
|
item.Location = util.ToString(f["location"])
|
||||||
|
item.Content = util.ToString(f["content"])
|
||||||
|
item.Version,_ = util.ToInt64(util.ToString(f["version"]))
|
||||||
|
item.Size = int64(len(item.Content))
|
||||||
|
item.Managed = true
|
||||||
|
t, ok := v["updated"]
|
||||||
|
if ok {
|
||||||
|
layout := "2006-01-02T15:04:05.999999-07:00"
|
||||||
|
t1, err := time.Parse(layout, util.ToString(t))
|
||||||
|
if err == nil {
|
||||||
|
item.Updated = t1.Unix()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result=append(result,&item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Error("remoteConfigProvider", "result", result)
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func dynamicAgentConfigProvider(instance model.Instance) []*common.ConfigFile {
|
||||||
|
|
||||||
|
//get config files from remote db
|
||||||
|
//get settings with this agent id
|
||||||
|
result := []*common.ConfigFile{}
|
||||||
|
ids, err := GetEnrolledNodesByAgent(&instance)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var latestTimestamp int64
|
||||||
|
for _, v := range ids {
|
||||||
|
if v.Updated > latestTimestamp {
|
||||||
|
latestTimestamp = v.Updated
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
|
||||||
|
cfg := common.ConfigFile{}
|
||||||
|
cfg.Name = "generated_metrics_tasks.yml"
|
||||||
|
cfg.Location = "generated_metrics_tasks.yml"
|
||||||
|
cfg.Content = getConfigs(ids)
|
||||||
|
cfg.Size = int64(len(cfg.Content))
|
||||||
|
cfg.Version = latestTimestamp
|
||||||
|
cfg.Managed = true
|
||||||
|
cfg.Updated = latestTimestamp
|
||||||
|
result = append(result, &cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func getConfigs(items map[string]BindingItem) string {
|
||||||
|
buffer := bytes.NewBuffer([]byte("configs.template:\n "))
|
||||||
|
|
||||||
|
for _, v := range items {
|
||||||
|
|
||||||
|
if v.ClusterID == "" {
|
||||||
|
panic("cluster id is empty")
|
||||||
|
}
|
||||||
|
metadata := elastic.GetMetadata(v.ClusterID)
|
||||||
|
var clusterLevelEnabled = false
|
||||||
|
var nodeLevelEnabled = true
|
||||||
|
var clusterEndPoint = metadata.Config.GetAnyEndpoint()
|
||||||
|
credential, err := common2.GetCredential(metadata.Config.CredentialID)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
var dv interface{}
|
||||||
|
dv, err = credential.Decode()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
var username = ""
|
||||||
|
var password = ""
|
||||||
|
|
||||||
|
if auth, ok := dv.(model.BasicAuth); ok {
|
||||||
|
username = auth.Username
|
||||||
|
password = auth.Password
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.Write([]byte(fmt.Sprintf("- name: \"%v\"\n path: ./config/task_config.tpl\n "+
|
||||||
|
"variable:\n "+
|
||||||
|
"CLUSTER_ID: %v\n "+
|
||||||
|
"CLUSTER_ENDPOINT: [\"%v\"]\n "+
|
||||||
|
"CLUSTER_USERNAME: \"%v\"\n "+
|
||||||
|
"CLUSTER_PASSWORD: \"%v\"\n "+
|
||||||
|
"CLUSTER_LEVEL_TASKS_ENABLED: %v\n "+
|
||||||
|
"NODE_LEVEL_TASKS_ENABLED: %v\n "+
|
||||||
|
"NODE_LOGS_PATH: \"%v\"\n\n\n"+
|
||||||
|
"#MANAGED_CONFIG_VERSION: %v\n"+
|
||||||
|
"#MANAGED: true",
|
||||||
|
v.NodeUUID, v.ClusterID, clusterEndPoint, username, password, clusterLevelEnabled, nodeLevelEnabled, v.PathLogs, v.Updated)))
|
||||||
|
}
|
||||||
|
|
||||||
|
//password: $[[keystore.$[[CLUSTER_ID]]_password]]
|
||||||
|
|
||||||
|
return buffer.String()
|
||||||
|
}
|
||||||
|
|
||||||
//get nodes info via agent
|
//get nodes info via agent
|
||||||
func GetElasticsearchNodesViaAgent(ctx context.Context, instance *model.Instance) (*elastic.DiscoveryResult, error) {
|
func GetElasticsearchNodesViaAgent(ctx context.Context, instance *model.Instance) (*elastic.DiscoveryResult, error) {
|
||||||
req := &util.Request{
|
req := &util.Request{
|
||||||
|
@ -134,52 +337,7 @@ type BindingItem struct {
|
||||||
|
|
||||||
//infini system assigned id
|
//infini system assigned id
|
||||||
ClusterID string `json:"cluster_id"`
|
ClusterID string `json:"cluster_id"`
|
||||||
}
|
Updated int64 `json:"updated"`
|
||||||
|
|
||||||
//node -> binding item
|
|
||||||
func getEnrolledNodesByAgent(instance *model.Instance) (map[string]BindingItem, error) {
|
|
||||||
|
|
||||||
//get nodes settings where agent id = instance id
|
|
||||||
q := orm.Query{
|
|
||||||
Size: 1000,
|
|
||||||
Conds: orm.And(orm.Eq("metadata.category", "node_settings"),
|
|
||||||
orm.Eq("metadata.name", "agent"),
|
|
||||||
orm.Eq("metadata.labels.agent_id", instance.ID),
|
|
||||||
),
|
|
||||||
}
|
|
||||||
|
|
||||||
err, result := orm.Search(model.Setting{}, &q)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
ids := map[string]BindingItem{}
|
|
||||||
for _, row := range result.Result {
|
|
||||||
v, ok := row.(map[string]interface{})
|
|
||||||
if ok {
|
|
||||||
x, ok := v["payload"]
|
|
||||||
if ok {
|
|
||||||
f, ok := x.(map[string]interface{})
|
|
||||||
if ok {
|
|
||||||
nodeID, ok := f["node_uuid"].(string)
|
|
||||||
if ok {
|
|
||||||
item := BindingItem{}
|
|
||||||
item.ClusterID = util.ToString(f["cluster_id"])
|
|
||||||
item.ClusterName = util.ToString(f["cluster_name"])
|
|
||||||
item.ClusterUUID = util.ToString(f["cluster_uuid"])
|
|
||||||
item.PublishAddress = util.ToString(f["publish_address"])
|
|
||||||
item.NodeName = util.ToString(f["node_name"])
|
|
||||||
item.PathHome = util.ToString(f["path_home"])
|
|
||||||
item.PathLogs = util.ToString(f["path_logs"])
|
|
||||||
item.NodeUUID = nodeID
|
|
||||||
ids[item.NodeUUID] = item
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ids, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func getUnAssociateNodes() (map[string][]model.ESNodeInfo, error) {
|
func getUnAssociateNodes() (map[string][]model.ESNodeInfo, error) {
|
||||||
|
|
|
@ -7,6 +7,7 @@ package api
|
||||||
import (
|
import (
|
||||||
"infini.sh/framework/core/api"
|
"infini.sh/framework/core/api"
|
||||||
"infini.sh/framework/core/api/rbac/enum"
|
"infini.sh/framework/core/api/rbac/enum"
|
||||||
|
"infini.sh/framework/plugins/managed/server"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Init() {
|
func Init() {
|
||||||
|
@ -32,4 +33,8 @@ func Init() {
|
||||||
|
|
||||||
//api.HandleAPIMethod(api.POST, "/agent/install_command", handler.RequireLogin(handler.generateInstallCommand))
|
//api.HandleAPIMethod(api.POST, "/agent/install_command", handler.RequireLogin(handler.generateInstallCommand))
|
||||||
//api.HandleAPIMethod(api.GET, "/agent/install.sh", handler.getInstallScript)
|
//api.HandleAPIMethod(api.GET, "/agent/install.sh", handler.getInstallScript)
|
||||||
|
|
||||||
|
|
||||||
|
server.RegisterConfigProvider(remoteConfigProvider)
|
||||||
|
server.RegisterConfigProvider(dynamicAgentConfigProvider)
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,7 +239,7 @@ func (h *APIHandler) authESNode(w http.ResponseWriter, req *http.Request, ps htt
|
||||||
|
|
||||||
func NewClusterSettings(clusterID string) *model.Setting {
|
func NewClusterSettings(clusterID string) *model.Setting {
|
||||||
settings := model.Setting{
|
settings := model.Setting{
|
||||||
Metadata: model.SettingsMetadata{
|
Metadata: model.Metadata{
|
||||||
Category: Cluster,
|
Category: Cluster,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -255,7 +255,7 @@ func NewClusterSettings(clusterID string) *model.Setting {
|
||||||
func NewNodeAgentSettings(instanceID string, item *BindingItem) *model.Setting {
|
func NewNodeAgentSettings(instanceID string, item *BindingItem) *model.Setting {
|
||||||
|
|
||||||
settings := model.Setting{
|
settings := model.Setting{
|
||||||
Metadata: model.SettingsMetadata{
|
Metadata: model.Metadata{
|
||||||
Category: Node,
|
Category: Node,
|
||||||
Name: "agent",
|
Name: "agent",
|
||||||
},
|
},
|
||||||
|
@ -283,7 +283,7 @@ func NewNodeAgentSettings(instanceID string, item *BindingItem) *model.Setting {
|
||||||
func NewIndexSettings(clusterID, nodeID, agentID, indexName, indexID string) *model.Setting {
|
func NewIndexSettings(clusterID, nodeID, agentID, indexName, indexID string) *model.Setting {
|
||||||
|
|
||||||
settings := model.Setting{
|
settings := model.Setting{
|
||||||
Metadata: model.SettingsMetadata{
|
Metadata: model.Metadata{
|
||||||
Category: Index,
|
Category: Index,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -469,7 +469,7 @@ func (h *APIHandler) autoAssociateESNode(w http.ResponseWriter, req *http.Reques
|
||||||
taskSetting.ClusterStats = nil
|
taskSetting.ClusterStats = nil
|
||||||
}
|
}
|
||||||
setting = &model.Setting{
|
setting = &model.Setting{
|
||||||
Metadata: model.SettingsMetadata{
|
Metadata: model.Metadata{
|
||||||
Category: "agent",
|
Category: "agent",
|
||||||
Name: "task",
|
Name: "task",
|
||||||
Labels: util.MapStr{
|
Labels: util.MapStr{
|
||||||
|
@ -623,7 +623,7 @@ func getAgentTaskSetting(agentID string, v model.ESNodeInfo) (*model.Setting, er
|
||||||
LogsPath: v.Path.Logs,
|
LogsPath: v.Path.Logs,
|
||||||
}
|
}
|
||||||
return &model.Setting{
|
return &model.Setting{
|
||||||
Metadata: model.SettingsMetadata{
|
Metadata: model.Metadata{
|
||||||
Category: "agent",
|
Category: "agent",
|
||||||
Name: "task",
|
Name: "task",
|
||||||
Labels: util.MapStr{
|
Labels: util.MapStr{
|
||||||
|
|
Loading…
Reference in New Issue