[agent-go] - 去除本地环境信息的默认设置,优化启动逻辑
This commit is contained in:
21
agent-common/utils/ReflectUtils.go
Normal file
21
agent-common/utils/ReflectUtils.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
// CopySameFields 利用反射,将a中的所有同名字段的值 复制到b中的对应字段
|
||||||
|
func CopySameFields(source, target interface{}) {
|
||||||
|
va := reflect.ValueOf(source).Elem()
|
||||||
|
vb := reflect.ValueOf(target).Elem()
|
||||||
|
|
||||||
|
for i := 0; i < va.NumField(); i++ {
|
||||||
|
// 忽略source中 空值的部分
|
||||||
|
if va.Field(i).IsZero() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldName := va.Type().Field(i).Name
|
||||||
|
if vb.FieldByName(fieldName).IsValid() {
|
||||||
|
vb.FieldByName(fieldName).Set(va.Field(i))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,6 +28,7 @@ type AgentServerInfo struct {
|
|||||||
KernelArch string `json:"kernelArch"` // native cpu architecture queried at runtime, as returned by `uname -m` or empty string in case of error
|
KernelArch string `json:"kernelArch"` // native cpu architecture queried at runtime, as returned by `uname -m` or empty string in case of error
|
||||||
IoSpeed string `json:"ioSpeed" yaml:"ioSpeed"`
|
IoSpeed string `json:"ioSpeed" yaml:"ioSpeed"`
|
||||||
MemoryTotal string `json:"memoryTotal" yaml:"memoryTotal"`
|
MemoryTotal string `json:"memoryTotal" yaml:"memoryTotal"`
|
||||||
|
SwapTotal string `json:"swapTotal" yaml:"swapTotal"`
|
||||||
DiskTotal string `json:"diskTotal" yaml:"diskTotal"`
|
DiskTotal string `json:"diskTotal" yaml:"diskTotal"`
|
||||||
DiskUsage string `json:"diskUsage" yaml:"diskUsage"`
|
DiskUsage string `json:"diskUsage" yaml:"diskUsage"`
|
||||||
Comment string `json:"comment" yaml:"comment"`
|
Comment string `json:"comment" yaml:"comment"`
|
||||||
|
|||||||
@@ -5,13 +5,15 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
"io/ioutil"
|
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
"wdd.io/agent-common/logger"
|
"wdd.io/agent-common/logger"
|
||||||
|
"wdd.io/agent-common/utils"
|
||||||
"wdd.io/agent-go/a_agent"
|
"wdd.io/agent-go/a_agent"
|
||||||
"wdd.io/agent-go/a_executor"
|
"wdd.io/agent-go/a_executor"
|
||||||
"wdd.io/agent-go/a_status"
|
"wdd.io/agent-go/a_status"
|
||||||
@@ -19,25 +21,35 @@ import (
|
|||||||
"wdd.io/agent-go/rabbitmq"
|
"wdd.io/agent-go/rabbitmq"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const AgentServerInfoLocalFilePath = "/usr/local/etc/octopus-agent/octopus-agent.conf"
|
||||||
|
|
||||||
var initOmType = g.InitOmType
|
var initOmType = g.InitOmType
|
||||||
var P = g.G.P
|
var P = g.G.P
|
||||||
|
|
||||||
var log = logger.Log
|
var log = logger.Log
|
||||||
|
|
||||||
func INIT(octopusAgentConfigFileName string, agentServerInfoConf string) chan bool {
|
func INIT(octopusAgentConfigFileName string) chan bool {
|
||||||
|
|
||||||
// 获取系统的环境变量
|
// 初始化变量
|
||||||
agentServerInfo := parseAgentServerInfo(agentServerInfoConf)
|
agentServerInfo := &a_agent.AgentServerInfo{}
|
||||||
// todo totally get from a_status module
|
|
||||||
|
|
||||||
// 初始化Nacos的连接配置
|
// 初始化Agent的 RabbitMQ连接信息
|
||||||
agentConfig := parseOctopusAgentConf(octopusAgentConfigFileName)
|
agentConfig := parseOctopusAgentConf(octopusAgentConfigFileName)
|
||||||
a_agent.AgentConfig = agentConfig
|
a_agent.AgentConfig = agentConfig
|
||||||
|
|
||||||
// re-get agentInfo from status module
|
// 使用a_status模块,自身获取到运行的环境信息
|
||||||
agentInfo := a_status.ReportAgentInfo()
|
agentInfo := a_status.ReportAgentInfo()
|
||||||
refreshAgentInfoByStatusInfo(agentInfo, agentServerInfo)
|
refreshAgentInfoByStatusInfo(agentInfo, agentServerInfo)
|
||||||
|
|
||||||
|
if utils.FileExistAndNotNull(AgentServerInfoLocalFilePath) {
|
||||||
|
|
||||||
|
// 获取系统的环境变量
|
||||||
|
agentServerInfoFromLocalFile := parseAgentServerInfo(AgentServerInfoLocalFilePath)
|
||||||
|
|
||||||
|
// 合并系统环境变量,手动输入的部分会覆盖自身获得内容
|
||||||
|
utils.CopySameFields(agentServerInfoFromLocalFile, agentServerInfo)
|
||||||
|
}
|
||||||
|
|
||||||
// build operator cache
|
// build operator cache
|
||||||
buildAgentOsOperator(agentInfo, agentServerInfo)
|
buildAgentOsOperator(agentInfo, agentServerInfo)
|
||||||
|
|
||||||
@@ -235,12 +247,44 @@ func buildOctopusTCPConnect(agentConfig *viper.Viper) *rabbitmq.RabbitTCPConnect
|
|||||||
func refreshAgentInfoByStatusInfo(agentInfo *a_status.AgentInfo, agentServerInfo *a_agent.AgentServerInfo) {
|
func refreshAgentInfoByStatusInfo(agentInfo *a_status.AgentInfo, agentServerInfo *a_agent.AgentServerInfo) {
|
||||||
|
|
||||||
// host info
|
// host info
|
||||||
|
agentServerInfo.ServerName = agentInfo.HostInfo.Hostname
|
||||||
|
agentServerInfo.MachineID = agentInfo.HostInfo.HostID
|
||||||
|
|
||||||
|
// cpu part
|
||||||
|
agentServerInfo.CPUCore = strconv.FormatInt(int64(agentInfo.CPUInfo.NumCores), 10)
|
||||||
|
if len(agentInfo.CPUInfo.CPUInfo) > 0 {
|
||||||
|
marshal, _ := json.Marshal(agentInfo.CPUInfo.CPUInfo[0])
|
||||||
|
agentServerInfo.CPUBrand = string(marshal)
|
||||||
|
}
|
||||||
|
|
||||||
|
// os info
|
||||||
|
agentServerInfo.OSInfo = agentInfo.HostInfo.PlatformFamily + agentInfo.HostInfo.Platform + agentInfo.HostInfo.PlatformVersion
|
||||||
|
agentServerInfo.OSKernelInfo = agentInfo.HostInfo.KernelVersion
|
||||||
|
agentServerInfo.Virtualization = agentInfo.HostInfo.VirtualizationSystem + agentInfo.HostInfo.VirtualizationRole
|
||||||
agentServerInfo.Platform = agentInfo.HostInfo.Platform
|
agentServerInfo.Platform = agentInfo.HostInfo.Platform
|
||||||
agentServerInfo.PlatformFamily = agentInfo.HostInfo.PlatformFamily
|
agentServerInfo.PlatformFamily = agentInfo.HostInfo.PlatformFamily
|
||||||
agentServerInfo.PlatformVersion = agentInfo.HostInfo.PlatformVersion
|
agentServerInfo.PlatformVersion = agentInfo.HostInfo.PlatformVersion
|
||||||
agentServerInfo.KernelVersion = agentInfo.HostInfo.KernelVersion
|
agentServerInfo.KernelVersion = agentInfo.HostInfo.KernelVersion
|
||||||
agentServerInfo.KernelArch = agentInfo.HostInfo.KernelArch
|
agentServerInfo.KernelArch = agentInfo.HostInfo.KernelArch
|
||||||
|
|
||||||
|
// memory part
|
||||||
|
agentServerInfo.MemoryTotal = strconv.FormatInt(int64(agentInfo.MemoryInfo.TotalMemory), 10)
|
||||||
|
agentServerInfo.SwapTotal = strconv.FormatInt(int64(agentInfo.MemoryInfo.SwapTotal), 10)
|
||||||
|
|
||||||
|
// disk part
|
||||||
|
info := agentInfo.DiskInfo
|
||||||
|
diskTotal := uint64(0)
|
||||||
|
diskUsage := uint64(0)
|
||||||
|
|
||||||
|
for _, diskInfo := range info {
|
||||||
|
if diskInfo.Total > diskTotal {
|
||||||
|
diskTotal = diskInfo.Total
|
||||||
|
diskUsage = diskInfo.Used
|
||||||
|
}
|
||||||
|
}
|
||||||
|
agentServerInfo.DiskTotal = strconv.FormatUint(diskTotal, 10)
|
||||||
|
agentServerInfo.DiskUsage = strconv.FormatUint(diskUsage, 10)
|
||||||
|
|
||||||
// network part
|
// network part
|
||||||
refreshAgentNetworkInfo(agentInfo, agentServerInfo)
|
refreshAgentNetworkInfo(agentInfo, agentServerInfo)
|
||||||
|
|
||||||
@@ -357,7 +401,7 @@ func parseAgentServerInfo(agentServerInfoConf string) *a_agent.AgentServerInfo {
|
|||||||
|
|
||||||
// 约定文件地址为 /octopus-agent/octopus-agent.conf
|
// 约定文件地址为 /octopus-agent/octopus-agent.conf
|
||||||
var agentServerInfo *a_agent.AgentServerInfo
|
var agentServerInfo *a_agent.AgentServerInfo
|
||||||
yamlFile, err := ioutil.ReadFile(agentServerInfoConf)
|
yamlFile, err := os.ReadFile(agentServerInfoConf)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Errorf("failed to read YAML file: %v", err))
|
panic(fmt.Errorf("failed to read YAML file: %v", err))
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ func main() {
|
|||||||
|
|
||||||
// 解析命令行参数
|
// 解析命令行参数
|
||||||
var version string
|
var version string
|
||||||
var agentServerInfoConfFile string
|
//var agentServerInfoConfFile string
|
||||||
var mode string
|
var mode string
|
||||||
flag.StringVar(&version, "version", "", "config file version")
|
flag.StringVar(&version, "version", "", "config file version")
|
||||||
flag.StringVar(&mode, "mode", "agent", "agent run mode")
|
flag.StringVar(&mode, "mode", "agent", "agent run mode")
|
||||||
flag.StringVar(&agentServerInfoConfFile, "agentServerInfoConfFile", "", "agent server info conf file")
|
//flag.StringVar(&agentServerInfoConfFile, "agentServerInfoConfFile", "", "agent server info conf file")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if mode == "bastion" {
|
if mode == "bastion" {
|
||||||
@@ -30,10 +30,10 @@ func main() {
|
|||||||
// 读取对应版本的配置文件
|
// 读取对应版本的配置文件
|
||||||
octopusAgentConfigFileName := fmt.Sprintf("octopus-agent-%s.yaml", version)
|
octopusAgentConfigFileName := fmt.Sprintf("octopus-agent-%s.yaml", version)
|
||||||
fmt.Println("config file name is => " + octopusAgentConfigFileName)
|
fmt.Println("config file name is => " + octopusAgentConfigFileName)
|
||||||
fmt.Println("agent server info file is => " + agentServerInfoConfFile)
|
//fmt.Println("agent server info file is => " + agentServerInfoConfFile)
|
||||||
|
|
||||||
// 执行初始化之策工作
|
// 执行初始化之策工作
|
||||||
businessForeverChan := a_init.INIT(octopusAgentConfigFileName, agentServerInfoConfFile)
|
businessForeverChan := a_init.INIT(octopusAgentConfigFileName)
|
||||||
|
|
||||||
// 永远等待 runtime的队列消息
|
// 永远等待 runtime的队列消息
|
||||||
<-businessForeverChan
|
<-businessForeverChan
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"github.com/go-playground/validator/v10"
|
"github.com/go-playground/validator/v10"
|
||||||
"os"
|
"os"
|
||||||
"wdd.io/agent-common/logger"
|
"wdd.io/agent-common/logger"
|
||||||
|
"wdd.io/agent-common/utils"
|
||||||
"wdd.io/agent-operator/deploy/z_dep"
|
"wdd.io/agent-operator/deploy/z_dep"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -55,7 +56,7 @@ func init() {
|
|||||||
func (backend *CmiiBackendConfig) BackendDeploy(common *z_dep.CommonEnvironmentConfig) bool {
|
func (backend *CmiiBackendConfig) BackendDeploy(common *z_dep.CommonEnvironmentConfig) bool {
|
||||||
|
|
||||||
// copy
|
// copy
|
||||||
z_dep.CopySameFields(common, backend)
|
utils.CopySameFields(common, backend)
|
||||||
|
|
||||||
validate := validator.New()
|
validate := validator.New()
|
||||||
err := validate.Struct(backend)
|
err := validate.Struct(backend)
|
||||||
@@ -84,7 +85,7 @@ func (backend *CmiiBackendConfig) BackendDeploy(common *z_dep.CommonEnvironmentC
|
|||||||
func (frontend *CmiiFrontendConfig) FrontendDeploy(common *z_dep.CommonEnvironmentConfig) bool {
|
func (frontend *CmiiFrontendConfig) FrontendDeploy(common *z_dep.CommonEnvironmentConfig) bool {
|
||||||
|
|
||||||
// copy
|
// copy
|
||||||
z_dep.CopySameFields(common, frontend)
|
utils.CopySameFields(common, frontend)
|
||||||
|
|
||||||
validate := validator.New()
|
validate := validator.New()
|
||||||
err := validate.Struct(frontend)
|
err := validate.Struct(frontend)
|
||||||
@@ -106,7 +107,7 @@ func (frontend *CmiiFrontendConfig) FrontendDeploy(common *z_dep.CommonEnvironme
|
|||||||
func (frontend *CmiiFrontendConfig) ConfigMapDeploy(commonEnv *z_dep.CommonEnvironmentConfig) bool {
|
func (frontend *CmiiFrontendConfig) ConfigMapDeploy(commonEnv *z_dep.CommonEnvironmentConfig) bool {
|
||||||
|
|
||||||
// copy
|
// copy
|
||||||
z_dep.CopySameFields(commonEnv, frontend)
|
utils.CopySameFields(commonEnv, frontend)
|
||||||
|
|
||||||
// manual validate
|
// manual validate
|
||||||
if frontend.ShortName == "" || frontend.ClientId == "" {
|
if frontend.ShortName == "" || frontend.ClientId == "" {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/go-playground/validator/v10"
|
"github.com/go-playground/validator/v10"
|
||||||
"reflect"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
"text/template"
|
"text/template"
|
||||||
"wdd.io/agent-common/assert"
|
"wdd.io/agent-common/assert"
|
||||||
@@ -104,16 +103,3 @@ func ParseEnvToApplyFile(environment any, applyTemplate string, applyFilePath st
|
|||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// CopySameFields 利用反射,将a中的所有同名字段的值 复制到b中的对应字段
|
|
||||||
func CopySameFields(a, b interface{}) {
|
|
||||||
va := reflect.ValueOf(a).Elem()
|
|
||||||
vb := reflect.ValueOf(b).Elem()
|
|
||||||
|
|
||||||
for i := 0; i < va.NumField(); i++ {
|
|
||||||
fieldName := va.Type().Field(i).Name
|
|
||||||
if vb.FieldByName(fieldName).IsValid() {
|
|
||||||
vb.FieldByName(fieldName).Set(va.Field(i))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public class TestImageSyncScheduler {
|
|||||||
ArrayList<String> ImageFullNameList = new ArrayList<>(List.of(
|
ArrayList<String> ImageFullNameList = new ArrayList<>(List.of(
|
||||||
// "harbor.cdcyy.com.cn/cmii/cmii-live-operator:5.2.0",
|
// "harbor.cdcyy.com.cn/cmii/cmii-live-operator:5.2.0",
|
||||||
// "harbor.cdcyy.com.cn/cmii/cmii/srs:v5.0.195"
|
// "harbor.cdcyy.com.cn/cmii/cmii/srs:v5.0.195"
|
||||||
"harbor.cdcyy.com.cn/cmii/cmii-uav-developer:5.4.0-cqly-042801"
|
"harbor.cdcyy.com.cn/cmii/cmii-uav-industrial-portfolio:5.4.0-cqly-042802"
|
||||||
));
|
));
|
||||||
|
|
||||||
Boolean downloadAndCompressOnly = false;
|
Boolean downloadAndCompressOnly = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user