Files
cloudpods/pkg/image/models/image_properties.go
Qiu Jian 2e587bd6ab glance重构 update 1
Conflicts:
	Gopkg.lock
	pkg/appsrv/appsrv.go
	pkg/cloudcommon/options.go
	pkg/compute/models/hosts.go
	pkg/compute/models/quotas.go
	pkg/compute/service/service.go
	pkg/mcclient/mcclient.go
2018-12-26 22:52:13 +08:00

125 lines
3.7 KiB
Go

package models
import (
"context"
"yunion.io/x/jsonutils"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/mcclient"
)
type SImagePropertyManager struct {
db.SResourceBaseManager
}
var ImagePropertyManager *SImagePropertyManager
func init() {
ImagePropertyManager = &SImagePropertyManager{
SResourceBaseManager: db.NewResourceBaseManager(
SImageProperty{},
"image_properties",
"image_property",
"image_properties",
),
}
ImagePropertyManager.TableSpec().AddIndex(true, "image_id", "name")
}
/*
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| image_id | varchar(36) | NO | MUL | NULL | |
| name | varchar(255) | NO | | NULL | |
| value | text | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | YES | | NULL | |
| deleted_at | datetime | YES | | NULL | |
| deleted | tinyint(1) | NO | MUL | NULL | |
+------------+--------------+------+-----+---------+----------------+
*/
type SImageProperty struct {
SImagePeripheral
Name string `width:"255"`
Value string `nullable:"true" create:"optional"`
}
func (manager *SImagePropertyManager) GetProperties(imageId string) (map[string]string, error) {
properties := make([]SImageProperty, 0)
q := manager.Query("name", "value").Equals("image_id", imageId)
err := db.FetchModelObjects(manager, q, &properties)
if err != nil {
return nil, err
}
props := make(map[string]string)
for i := range properties {
props[properties[i].Name] = properties[i].Value
}
return props, nil
}
func (manager *SImagePropertyManager) SaveProperties(ctx context.Context, userCred mcclient.TokenCredential, imageId string, props jsonutils.JSONObject) error {
propsJson := props.(*jsonutils.JSONDict)
for _, k := range propsJson.SortedKeys() {
v, _ := propsJson.GetString(k)
_, err := manager.SaveProperty(ctx, userCred, imageId, k, v)
if err != nil {
return err
}
}
return nil
}
func (manager *SImagePropertyManager) SaveProperty(ctx context.Context, userCred mcclient.TokenCredential, imageId string, key string, value string) (*SImageProperty, error) {
prop, _ := manager.GetProperty(imageId, key)
if prop != nil {
if prop.Value != value {
return prop, prop.UpdateValue(ctx, userCred, value)
} else {
return prop, nil
}
} else {
// create
return manager.NewProperty(ctx, userCred, imageId, key, value)
}
}
func (manager *SImagePropertyManager) GetProperty(imageId string, key string) (*SImageProperty, error) {
q := manager.Query().Equals("image_id", imageId).Equals("name", key)
prop := SImageProperty{}
prop.SetModelManager(manager)
err := q.First(&prop)
if err != nil {
return nil, err
}
return &prop, nil
}
func (manager *SImagePropertyManager) NewProperty(ctx context.Context, userCred mcclient.TokenCredential, imageId string, key string, value string) (*SImageProperty, error) {
prop := SImageProperty{}
prop.ImageId = imageId
prop.Name = key
prop.Value = value
err := manager.TableSpec().Insert(&prop)
if err != nil {
return nil, err
}
prop.SetModelManager(manager)
return &prop, nil
}
func (self *SImageProperty) UpdateValue(ctx context.Context, userCred mcclient.TokenCredential, value string) error {
_, err := self.GetModelManager().TableSpec().Update(self, func() error {
self.Value = value
return nil
})
return err
}