agent/pluginmanager/api.go (100 lines of code) (raw):

package pluginmanager import ( "encoding/json" "time" "github.com/aliyun/aliyun_assist_client/thirdparty/sirupsen/logrus" "github.com/aliyun/aliyun_assist_client/agent/util" "github.com/aliyun/aliyun_assist_client/agent/util/osutil" ) // 调用一下接口后需要主动向服务端上报插件状态 var ( NEED_REFRESH_STATUS_API []string = []string{"--install", "--uninstall", "--start", "--stop", "--upgrade", "--restart"} ) // 向服务端请求插件列表的接口数据 type PluginListRequest struct { OsType string `json:"osType"` PluginName string `json:"pluginName"` Version string `json:"version"` PluginType string `json:"pluginType"` Arch string `json:"arch"` } type PluginListResponse struct { Code int `json:"code"` RequestId string `json:"requestId"` InstanceId string `json:"instanceId"` PluginList []PluginInfo `json:"pluginList"` } // 状态上报的请求数据 type PluginStatus struct { Name string `json:"name"` Status string `json:"status"` Version string `json:"version"` SysTagType string `json:"sysTagType,omitempty"` } type PluginStatusResquest struct { Plugin []PluginStatus `json:"plugin"` } const ( NORMAL_REPORT = 0 LAZY_REPORT = 1 // 懒上报 // 限制上报时插件名和插件版本字段的长度 PLUGIN_NAME_MAXLEN = 255 PLUGIN_VERSION_MAXLEN = 32 ) // 状态上报的响应数据 type PluginStatusResponse struct { InstanceId string `json:"instanceId"` Code int `json:"code"` ScanInterval int `json:"scanInterval"` // 下次Agent周期扫描插件状态的频率(兜底),单位秒 PullInterval int `json:"pullInterval"` // 下次Agent主动拉取插件状态的频率,单位秒 RefreshInterval int `json:"refreshInterval"` // 周期扫描到Failed状态的常驻插件后会拉起,在RefreshInterval间隔后上报插件状态 ReportType int `json:"reportType"` // 上报方式 0-正常上报;1-懒上报 } // PluginUpdateCheck 检查升级请求数据 type PluginUpdateCheck struct { Name string `json:"name"` Version string `json:"version"` } type PluginUpdateCheckRequest struct { Os string `json:"os"` Arch string `json:"arch"` Plugin []PluginUpdateCheck `json:"plugin"` } // PluginUpdateCheckResp 检查升级的响应数据 type PluginUpdateCheckResponse struct { InstanceId string `json:"instanceId"` NextInterval int `json:"nextInterval"` Plugin []PluginUpdateInfo `json:"plugin"` } // PluginUpdateInfo 升级插件的信息 type PluginUpdateInfo struct { Name string `json:"name"` Version string `json:"version"` Timeout int `json:"timeout"` } // get pluginInfo by name from online func FetchPackageInfo(logger logrus.FieldLogger, pluginName string, version string, withArch bool) ([]PluginInfo, error) { arch := "" if withArch { arch, _ = GetArch() } postValue := PluginListRequest{ OsType: osutil.GetOsType(), PluginName: pluginName, Version: version, Arch: arch, } postBody, err := json.Marshal(&postValue) if err != nil { return nil, err } // http 请求尝试3次 postContent := string(postBody) responseContent, err := util.HttpPost(util.GetPluginListService(), postContent, "json") if err != nil { retry := 2 for retry > 0 && err != nil { retry-- // pluginlist接口有流控,等一下再重试 time.Sleep(time.Duration(3) * time.Second) responseContent, err = util.HttpPost(util.GetPluginListService(), postContent, "json") } } if err != nil { return nil, err } listResponse := PluginListResponse{} if err := json.Unmarshal([]byte(responseContent), &listResponse); err != nil { return nil, err } return listResponse.PluginList, nil }