A-Tune/common/tuning/hpre_tunning.go

135 lines
3.2 KiB
Go
Raw Normal View History

/*
* Copyright (c) 2019 Huawei Technologies Co., Ltd.
* A-Tune is licensed under the Mulan PSL v1.
* You can use this software according to the terms and conditions of the Mulan PSL v1.
* You may obtain a copy of Mulan PSL v1 at:
* http://license.coscl.org.cn/MulanPSL
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v1 for more details.
* Create: 2019-10-29
*/
package tuning
import (
"atune/common/config"
"atune/common/http"
"atune/common/log"
"encoding/json"
"fmt"
"io/ioutil"
"strings"
"github.com/caibirdme/yql"
"github.com/mitchellh/mapstructure"
)
// Event : the content of response
type Event struct {
OverHead string `json:"overhead"`
Object string `json:"object"`
Symbol string `json:"symbol"`
}
// HprePostBody : body send to CPI service
type HprePostBody struct {
Section string `json:"section"`
Key string `json:"key"`
}
// RespHprePost : response of CPI service
type RespHprePost struct {
Value string `json:"value"`
}
// Get method call the service of CPI
func (h *HprePostBody) Get() (*RespHprePost, error) {
url := config.GetUrl(config.ConfiguratorURI)
res, err := http.Get(url, h)
if err != nil {
return nil, err
}
defer res.Body.Close()
if res.StatusCode != 200 {
fmt.Println(res.StatusCode)
respBody, err := ioutil.ReadAll(res.Body)
fmt.Println(string(respBody), err)
return nil, fmt.Errorf("get hpre support faild")
}
respBody, err := ioutil.ReadAll(res.Body)
respPostIns := new(RespHprePost)
err = json.Unmarshal(respBody, respPostIns)
if err != nil {
return nil, err
}
return respPostIns, nil
}
// HpreTuned method enable hpre if match the conditon
func HpreTuned(m map[string]interface{}, expression string) (bool, error) {
log.Infof("expression: %s", expression)
for _, v := range m {
switch vv := v.(type) {
case []interface{}:
for _, value := range vv {
var event Event
err := mapstructure.Decode(value, &event)
if err != nil {
log.Errorf("map %v convert to struct err %v", value, err)
continue
}
log.Infof("OverHead: %f, Object: %s, Symbol: %s", event.OverHead, event.Object, event.Symbol)
object := getObjectName(event.Object)
match, err := yql.Match(expression, map[string]interface{}{
"object": object,
})
if err != nil {
log.Errorf("match error: %v", err)
continue
}
if match {
log.Infof("expression %s matches", expression)
return true, nil
}
}
}
}
return false, nil
}
func getObjectName(object string) string {
objects := strings.Split(object, ".")
if strings.Contains(objects[0], "-") {
return strings.Split(objects[0], "-")[0]
}
return objects[0]
}
// IsSupportHpre method check system is support hpre or not, only can be used on ARM
func IsSupportHpre() (bool, error) {
body := &HprePostBody{
Section: "bios",
Key: "hpre_support",
}
respGetIns, err := body.Get()
if err != nil {
log.Infof("get support_hpre faild")
return false, fmt.Errorf("get support_hpre faild")
}
if respGetIns.Value == "yes" {
return true, nil
}
return false, nil
}