A-Tune/common/sqlstore/service.go

368 lines
9.3 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 sqlstore
import (
"atune/common/log"
"errors"
"strings"
)
// GetClasses method return item of table class_profile
func GetClasses(query *GetClass) error {
query.Result = make([]*ClassProfile, 0)
session := globalEngine.Table("class_profile")
if query.Class != "" {
session.Where("class=?", query.Class)
}
if query.Active {
session.Where("active=?", query.Active)
}
if err := session.Find(&query.Result); err != nil {
return err
}
return nil
}
// InsertClassProfile method insert item to class_profile table
func InsertClassProfile(value *ClassProfile) error {
session := globalEngine.Table("class_profile")
if _, err := session.Insert(value); err != nil {
return err
}
return nil
}
// UpdateClassProfile method update the class_profile table
func UpdateClassProfile(value *ClassProfile) error {
session := globalEngine.Table("class_profile")
if _, err := session.Where("class = ?", value.Class).Update(value); err != nil {
return err
}
return nil
}
// DeleteClassProfile method delete item from class_profile table by workloadType
func DeleteClassProfile(workloadType string) error {
session := globalEngine.Table("class_profile")
if _, err := session.Exec("delete from class_profile where class = ?", workloadType); err != nil {
return err
}
return nil
}
// GetClassApps method return the item of table class_apps
func GetClassApps(query *GetClassApp) error {
query.Result = make([]*ClassApps, 0)
session := globalEngine.Table("class_apps")
if query.Class != "" {
session.Where("class=?", query.Class)
}
if err := session.Find(&query.Result); err != nil {
return err
}
return nil
}
// InsertClassApps method insert item to class_apps table
func InsertClassApps(value *ClassApps) error {
session := globalEngine.Table("class_apps")
if _, err := session.Insert(value); err != nil {
return err
}
return nil
}
// DeleteClassApps method delete item from class_apps table by workload type
func DeleteClassApps(workloadType string) error {
session := globalEngine.Table("class_apps")
if _, err := session.Exec("delete from class_apps where class = ?", workloadType); err != nil {
return err
}
return nil
}
// ExistWorkloadType method return true if workloadType exist otherwise return false
func ExistWorkloadType(workloadType string) (bool, error) {
session := globalEngine.Table("class_apps")
exist, err := session.Where("class=?", workloadType).Exist()
if err != nil {
return false, err
}
return exist, nil
}
// GetContext method return the optimization item of workload type name
func GetContext(name string) (string, error) {
query := make([]*Profile, 0)
session := globalEngine.Table("profile")
if err := session.Where("profile_type=?", name).Find(&query); err != nil {
return "", err
}
if len(query) != 1 {
return "", errors.New("name not exist")
}
context := query[0].ProfileInformation
return context, nil
}
// InsertProfile method insert self define profile to table profile
func InsertProfile(value *Profile) error {
session := globalEngine.Table("profile")
session.Insert(value)
return nil
}
// UpdateProfile method update the profile table
func UpdateProfile(value *Profile) error {
session := globalEngine.Table("profile")
if _, err := session.Where("profile_type = ?", value.ProfileType).Update(value); err != nil {
return err
}
return nil
}
// DeleteProfile method delete the item from profile table
func DeleteProfile(profileType string) error {
session := globalEngine.Table("profile")
if _, err := session.Exec("delete from profile where profile_type = ?", profileType); err != nil {
return err
}
return nil
}
// ExistProfile method return true if profileType exist otherwise return false
func ExistProfile(profileType string) (bool, error) {
session := globalEngine.Table("profile")
exist, err := session.Where("profile_type=?", profileType).Exist()
if err != nil {
return false, err
}
return exist, nil
}
// ActiveProfile method set the workload type state to active
func ActiveProfile(name string) error {
session := globalEngine.Table("class_profile")
name = strings.Trim(name, " ")
profile := new(ClassProfile)
session.Where("active=?", true).Get(profile)
if profile.Class == name {
return nil
}
session.Exec("update class_profile set active=? where class = ?", !profile.Active, profile.Class)
newProfile := new(ClassProfile)
has, err := session.Where("class=?", name).Get(newProfile)
if err != nil {
return err
} else if !has {
return errors.New("Profile does not exist")
}
session.Exec("update class_profile set active=? where class = ?", !newProfile.Active, newProfile.Class)
return nil
}
// GetPropertyItem method return the classification of the specified property
func GetPropertyItem(property string) (string, error) {
tunedItem := new(TunedItem)
session := globalEngine.Table("tuned_item")
has, err := session.Where("property=?", property).Get(tunedItem)
if err != nil {
return "", err
}
if !has {
return "", errors.New("property is not exist")
}
item := tunedItem.Item
return item, nil
}
// GetProfileIDByName method return the profile history ID.
// the parameter name is workload type
func GetProfileIDByName(name string) (int64, error) {
query := make([]*Profile, 0)
session := globalEngine.Table("profile")
if err := session.Where("name=?", name).Find(&query); err != nil {
return -1, err
}
if len(query) != 1 {
return -1, errors.New("profile name not exist")
}
//id := query[0].Id
id := int64(0)
return id, nil
}
// GetTuneds method return the dynamic tuned items which used for bayes search
func GetTuneds(query *GetTuned) error {
query.Result = make([]*Tuned, 0)
session := globalEngine.Table("tuned")
if query.Class != "" {
session.Where("class=?", query.Class)
}
if err := session.Find(&query.Result); err != nil {
return err
}
return nil
}
// GetRuleTuneds method return the rules inquery from rule_tuned table
func GetRuleTuneds(query *GetRuleTuned) error {
query.Result = make([]*RuleTuned, 0)
session := globalEngine.Table("rule_tuned")
if query.Class != "" {
session.Where("class=?", query.Class)
}
if err := session.Find(&query.Result); err != nil {
return err
}
return nil
}
// GetCollections method return the collection metrics
func GetCollections() ([]*Collection, error) {
collections := make([]*Collection, 0)
session := globalEngine.Table("collection")
if err := session.Find(&collections); err != nil {
return nil, err
}
return collections, nil
}
// InsertProfileLog method insert profile history to database
func InsertProfileLog(value *ProfileLog) error {
session := globalEngine.Table("profile_log")
session.Insert(value)
return nil
}
// GetProfileLogs method return profile histories
func GetProfileLogs() ([]*ProfileLog, error) {
profileLogs := make([]*ProfileLog, 0)
session := globalEngine.Table("profile_log")
if err := session.Find(&profileLogs); err != nil {
return nil, err
}
return profileLogs, nil
}
// DelProfileLogByID method delete the profile history by ID
func DelProfileLogByID(id int64) error {
session := globalEngine.Table("profile_log")
if _, err := session.Exec("delete from profile_log where id = ?", id); err != nil {
return err
}
return nil
}
// GetProfileLogByID method get the profile history by id
func GetProfileLogByID(query *GetProfileLog) error {
query.Result = make([]*ProfileLog, 0)
session := globalEngine.Table("profile_log")
if err := session.Where("id = ?", query.ID).Find(&query.Result); err != nil {
return err
}
return nil
}
// GetProfileMaxID method get the id profile history
func GetProfileMaxID() (*ProfileLog, error) {
profileLog := new(ProfileLog)
session := globalEngine.Table("profile_log")
has, err := session.Desc("id").Limit(1).Get(profileLog)
if err != nil {
return nil, err
}
if !has {
return nil, nil
}
return profileLog, nil
}
// InActiveProfile method set the active field to false
func InActiveProfile() error {
session := globalEngine.Table("profile_log")
if _, err := session.Exec("update class_profile set active=? where active = ?", false, true); err != nil {
return err
}
return nil
}
func UpdateSchedule(typename string, strategy string) error {
session := globalEngine.Table("schedule")
item := new(Schedule)
has, err := session.Where("type=?", typename).Get(item)
if err != nil {
log.Info("Schedule have not the type = ?", typename)
return err
} else if !has {
_, err = session.Exec("insert into schedule (type, strategy) values (?, ?)", typename, strategy)
if err != nil {
log.Info("Insert Schedule values (?, ?)", typename, strategy)
return err
}
} else {
_, err = session.Exec("update schedule set type=?,strategy=? where type=?", typename, strategy, typename)
log.Info(err)
}
return nil
}
func GetSchedule() []*Schedule {
session := globalEngine.Table("schedule")
items := make([]*Schedule, 0)
if err := session.Find(&items); err != nil {
return nil
}
return items
}