From 0586f6184d6e5c00f4eb06485a1193f3eba4ec5e Mon Sep 17 00:00:00 2001 From: TangBin Date: Tue, 16 Oct 2018 17:24:00 +0800 Subject: [PATCH] add storage cache --- pkg/util/aws/storagecache.go | 94 +++++++++++++++++++++++++++++++----- 1 file changed, 81 insertions(+), 13 deletions(-) diff --git a/pkg/util/aws/storagecache.go b/pkg/util/aws/storagecache.go index 81c385bd84..5d41ad8e81 100644 --- a/pkg/util/aws/storagecache.go +++ b/pkg/util/aws/storagecache.go @@ -5,6 +5,10 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/onecloud/pkg/mcclient" "github.com/aliyun/aliyun-oss-go-sdk/oss" + "fmt" + "time" + "yunion.io/x/onecloud/pkg/mcclient/auth" + "yunion.io/x/log" ) type SStoragecache struct { @@ -14,51 +18,105 @@ type SStoragecache struct { } func (self *SStoragecache) GetId() string { - panic("implement me") + return fmt.Sprintf("%s-%s", self.region.client.providerId, self.region.GetId()) } func (self *SStoragecache) GetName() string { - panic("implement me") + return fmt.Sprintf("%s-%s", self.region.client.providerName, self.region.GetId()) } func (self *SStoragecache) GetGlobalId() string { - panic("implement me") + return fmt.Sprintf("%s-%s", self.region.client.providerId, self.region.GetGlobalId()) } func (self *SStoragecache) GetStatus() string { - panic("implement me") + return "available" } func (self *SStoragecache) Refresh() error { - panic("implement me") + return nil } func (self *SStoragecache) IsEmulated() bool { - panic("implement me") + return false } func (self *SStoragecache) GetMetadata() *jsonutils.JSONDict { - panic("implement me") + return nil } func (self *SStoragecache) GetIImages() ([]cloudprovider.ICloudImage, error) { - panic("implement me") + if self.iimages == nil { + err := self.fetchImages() + if err != nil { + return nil, err + } + } + return self.iimages, nil } func (self *SStoragecache) GetManagerId() string { - panic("implement me") + return self.region.client.providerId } func (self *SStoragecache) CreateIImage(snapshotId, imageName, osType, imageDesc string) (cloudprovider.ICloudImage, error) { - panic("implement me") + if imageId, err := self.region.createIImage(snapshotId, imageName, imageDesc); err != nil { + return nil, err + } else if image, err := self.region.GetImage(imageId); err != nil { + return nil, err + } else { + image.storageCache = self + iimage := make([]cloudprovider.ICloudImage, 1) + iimage[0] = image + //todo : implement me + if err := cloudprovider.WaitStatus(iimage[0], "avaliable", 15*time.Second, 3600*time.Second); err != nil { + return nil, err + } + return iimage[0], nil + } } func (self *SStoragecache) DownloadImage(userCred mcclient.TokenCredential, imageId string, extId string) (jsonutils.JSONObject, error) { - panic("implement me") + return self.downloadImage(userCred, imageId, extId) } func (self *SStoragecache) UploadImage(userCred mcclient.TokenCredential, imageId string, osArch, osType, osDist string, extId string, isForce bool) (string, error) { - panic("implement me") + if len(extId) > 0 { + log.Debugf("UploadImage: Image external ID exists %s", extId) + + status, err := self.region.GetImageStatus(extId) + if err != nil { + log.Errorf("GetImageStatus error %s", err) + } + if status == ImageStatusAvailable && !isForce { + return extId, nil + } + } else { + log.Debugf("UploadImage: no external ID") + } + + return self.uploadImage(userCred, imageId, osArch, osType, osDist, isForce) + +} + +func (self *SStoragecache) fetchImages() error { + images := make([]SImage, 0) + for { + parts, total, err := self.region.GetImages(ImageStatusType(""), ImageOwnerSelf, nil, "", len(images), 50) + if err != nil { + return err + } + images = append(images, parts...) + if len(images) >= total { + break + } + } + self.iimages = make([]cloudprovider.ICloudImage, len(images)) + for i := 0; i < len(images); i += 1 { + images[i].storageCache = self + self.iimages[i] = &images[i] + } + return nil } func (self *SRegion) CheckBucket(bucketName string) (*oss.Bucket, error) { @@ -69,7 +127,7 @@ func (self *SRegion) checkBucket(bucketName string) (*oss.Bucket, error) { return nil, nil } -func (self *SRegion) createIImage(snapshoutId, imageName, imageDesc string) (string, error) { +func (self *SRegion) createIImage(snapshotId, imageName, imageDesc string) (string, error) { return "", nil } @@ -78,4 +136,14 @@ func (self *SRegion) getStoragecache() *SStoragecache { self.storageCache = &SStoragecache{region: self} } return self.storageCache +} + +func (self *SStoragecache) uploadImage(userCred mcclient.TokenCredential, imageId string, osArch, osType, osDist string, isForce bool) (string, error) { + // todo: implement me + return "", nil +} + +func (self *SStoragecache) downloadImage(userCred mcclient.TokenCredential, imageId string, extId string) (jsonutils.JSONObject, error) { + // todo: implement me + return nil, nil } \ No newline at end of file