映射表默认指向provider的project

This commit is contained in:
屈轩
2019-03-04 16:36:47 +08:00
parent 10d4ca66c0
commit 173034cd26
38 changed files with 230 additions and 50 deletions
+8 -1
View File
@@ -17,6 +17,11 @@ import (
"yunion.io/x/onecloud/pkg/util/logclient"
)
const (
PROJECT_SOURCE_LOCAL = "local"
PROJECT_SOURCE_CLOUD = "cloud"
)
type SVirtualResourceBaseManager struct {
SStatusStandaloneResourceBaseManager
}
@@ -29,7 +34,8 @@ func NewVirtualResourceBaseManager(dt interface{}, tableName string, keyword str
type SVirtualResourceBase struct {
SStatusStandaloneResourceBase
ProjectId string `name:"tenant_id" width:"128" charset:"ascii" nullable:"false" index:"true" list:"user"`
ProjectId string `name:"tenant_id" width:"128" charset:"ascii" nullable:"false" index:"true" list:"user"`
ProjectSource string `width:"128" charset:"ascii" nullable:"false" list:"user" get:"user" default:"cloud"`
IsSystem bool `nullable:"true" default:"false" list:"admin" create:"optional"`
@@ -227,6 +233,7 @@ func (model *SVirtualResourceBase) PerformChangeOwner(ctx context.Context, userC
}
_, err := model.GetModelManager().TableSpec().Update(model, func() error {
model.ProjectId = tobj.GetId()
model.ProjectSource = PROJECT_SOURCE_LOCAL
return nil
})
if err != nil {
+9
View File
@@ -25,6 +25,10 @@ type ICloudResource interface {
GetMetadata() *jsonutils.JSONDict
}
type IVirtualResource interface {
GetProjectId() string
}
type IBillingResource interface {
GetBillingType() string
GetExpiredAt() time.Time
@@ -191,6 +195,7 @@ type ICloudHost interface {
type ICloudVM interface {
ICloudResource
IBillingResource
IVirtualResource
GetCreateTime() time.Time
GetIHost() ICloudHost
@@ -255,6 +260,7 @@ type ICloudNic interface {
type ICloudEIP interface {
ICloudResource
IBillingResource
IVirtualResource
GetIpAddr() string
GetMode() string
@@ -304,6 +310,7 @@ type ICloudRoute interface {
type ICloudDisk interface {
ICloudResource
IBillingResource
IVirtualResource
GetIStorage() (ICloudStorage, error)
@@ -336,6 +343,8 @@ type ICloudDisk interface {
type ICloudSnapshot interface {
ICloudResource
IVirtualResource
GetSize() int32
GetDiskId() string
GetDiskType() string
+19 -2
View File
@@ -1004,6 +1004,7 @@ func (self *SDisk) syncWithCloudDisk(ctx context.Context, userCred mcclient.Toke
if provider.GetFactory().IsSupportPrepaidResources() && len(guests) == 1 && guests[0].IsPrepaidRecycle() {
recycle = true
}
storage := self.GetStorage()
_, err := self.GetModelManager().TableSpec().Update(self, func() error {
extDisk.Refresh()
// self.Name = extDisk.GetName()
@@ -1030,8 +1031,15 @@ func (self *SDisk) syncWithCloudDisk(ctx context.Context, userCred mcclient.Toke
}
// self.ProjectId = userCred.GetProjectId()
if projectSync && len(projectId) > 0 {
self.ProjectId = projectId
if projectSync && self.ProjectSource != db.PROJECT_SOURCE_LOCAL {
if extProjectId := extDisk.GetProjectId(); len(extProjectId) > 0 {
extProject, err := ExternalProjectManager.GetProject(extProjectId, storage.ManagerId)
if err != nil {
log.Errorf(err.Error())
} else {
self.ProjectId = extProject.ProjectId
}
}
}
return nil
})
@@ -1064,10 +1072,19 @@ func (manager *SDiskManager) newFromCloudDisk(ctx context.Context, userCred mccl
disk.Status = extDisk.GetStatus()
disk.ExternalId = extDisk.GetGlobalId()
disk.StorageId = storage.Id
disk.ProjectSource = db.PROJECT_SOURCE_CLOUD
disk.ProjectId = userCred.GetProjectId()
if len(projectId) > 0 {
disk.ProjectId = projectId
}
if extProjectId := extDisk.GetProjectId(); len(extProjectId) > 0 {
externalProject, err := ExternalProjectManager.GetProject(extProjectId, storage.ManagerId)
if err != nil {
log.Errorf(err.Error())
} else {
disk.ProjectId = externalProject.ProjectId
}
}
disk.DiskFormat = extDisk.GetDiskFormat()
disk.DiskSize = extDisk.GetDiskSizeMB()
disk.AutoDelete = extDisk.GetIsAutoDelete()
+19 -2
View File
@@ -302,8 +302,15 @@ func (self *SElasticip) SyncWithCloudEip(userCred mcclient.TokenCredential, prov
// self.ManagerId = ext.GetManagerId()
self.IsEmulated = ext.IsEmulated()
self.ProjectId = userCred.GetProjectId()
if projectSync && len(projectId) > 0 {
self.ProjectId = projectId
if projectSync && self.ProjectSource != db.PROJECT_SOURCE_LOCAL {
if extProjectId := ext.GetProjectId(); len(extProjectId) > 0 {
extProject, err := ExternalProjectManager.GetProject(extProjectId, self.ManagerId)
if err != nil {
log.Errorf(err.Error())
} else {
self.ProjectId = extProject.ProjectId
}
}
}
self.ChargeType = ext.GetInternetChargeType()
@@ -335,11 +342,21 @@ func (manager *SElasticipManager) newFromCloudEip(ctx context.Context, userCred
eip.CloudregionId = region.Id
eip.ChargeType = extEip.GetInternetChargeType()
eip.ProjectSource = db.PROJECT_SOURCE_CLOUD
eip.ProjectId = userCred.GetProjectId()
if len(projectId) > 0 {
eip.ProjectId = projectId
}
if extProjectId := extEip.GetProjectId(); len(extProjectId) > 0 {
externalProject, err := ExternalProjectManager.GetProject(extProjectId, eip.ManagerId)
if err != nil {
log.Errorf(err.Error())
} else {
eip.ProjectId = externalProject.ProjectId
}
}
err := manager.TableSpec().Insert(&eip)
if err != nil {
log.Errorf("newFromCloudEip fail %s", err)
+16 -40
View File
@@ -3,16 +3,14 @@ package models
import (
"context"
"database/sql"
"fmt"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/cloudprovider"
"yunion.io/x/onecloud/pkg/compute/options"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/mcclient/auth"
"yunion.io/x/onecloud/pkg/mcclient/modules"
"yunion.io/x/pkg/util/compare"
)
@@ -75,6 +73,20 @@ func (manager *SExternalProjectManager) getProjectsByRegion(region *SCloudregion
return projects, nil
}
func (manager *SExternalProjectManager) GetProject(externalId string, providerId string) (*SExternalProject, error) {
project := &SExternalProject{}
project.SetModelManager(manager)
q := manager.Query().Equals("external_id", externalId).Equals("manager_id", providerId)
count := q.Count()
if count == 0 {
return nil, fmt.Errorf("no external project record %s for provider %s", externalId, providerId)
}
if count > 1 {
return nil, fmt.Errorf("dumplicate external project record %s for provider %s", externalId, providerId)
}
return project, q.First(project)
}
func (manager *SExternalProjectManager) SyncProjects(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, region *SCloudregion, projects []cloudprovider.ICloudProject, projectSync bool) compare.SyncResult {
syncResult := compare.SyncResult{}
@@ -125,16 +137,7 @@ func (manager *SExternalProjectManager) SyncProjects(ctx context.Context, userCr
func (self *SExternalProject) SyncWithCloudProject(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, ext cloudprovider.ICloudProject, projectSync bool) error {
_, err := self.GetModelManager().TableSpec().Update(self, func() error {
self.Name = ext.GetName()
self.ExternalId = ext.GetGlobalId()
self.IsEmulated = ext.IsEmulated()
self.ProjectId = userCred.GetProjectId()
if projectSync {
projectId, err := ExternalProjectManager.syncProject(ctx, userCred, self.Name)
if err != nil {
return err
}
self.ProjectId = projectId
}
return nil
})
if err != nil {
@@ -143,25 +146,6 @@ func (self *SExternalProject) SyncWithCloudProject(ctx context.Context, userCred
return err
}
func (manager *SExternalProjectManager) syncProject(ctx context.Context, userCred mcclient.TokenCredential, projectName string) (string, error) {
project, err := db.TenantCacheManager.FetchByName(userCred, projectName)
if err == nil {
return project.GetId(), nil
}
if err == sql.ErrNoRows {
s := auth.GetAdminSession(ctx, options.Options.Region, "")
params := jsonutils.NewDict()
params.Add(jsonutils.NewString(projectName), "name")
params.Add(jsonutils.NewString("auto create from external_project"), "description")
result, err := modules.Projects.Create(s, params)
if err != nil {
return "", err
}
return result.GetString("id")
}
return "", err
}
func (manager *SExternalProjectManager) newFromCloudProject(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, extProject cloudprovider.ICloudProject, region *SCloudregion, projectSync bool) (*SExternalProject, error) {
project := SExternalProject{}
project.SetModelManager(manager)
@@ -170,15 +154,7 @@ func (manager *SExternalProjectManager) newFromCloudProject(ctx context.Context,
project.ExternalId = extProject.GetGlobalId()
project.IsEmulated = extProject.IsEmulated()
project.ManagerId = provider.Id
project.ProjectId = userCred.GetProjectId()
if projectSync {
projectId, err := manager.syncProject(ctx, userCred, project.Name)
if err != nil {
return nil, err
}
project.ProjectId = projectId
}
project.ProjectId = provider.ProjectId
factory, err := provider.GetProviderFactory()
if err != nil {
+18 -2
View File
@@ -1853,8 +1853,15 @@ func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.Token
self.VmemSize = extVM.GetVmemSizeMB()
}
if projectSync && len(projectId) > 0 {
self.ProjectId = projectId
if projectSync && self.ProjectSource != db.PROJECT_SOURCE_LOCAL {
if extProjectId := extVM.GetProjectId(); len(extProjectId) > 0 {
extProject, err := ExternalProjectManager.GetProject(extProjectId, host.ManagerId)
if err != nil {
log.Errorf(err.Error())
} else {
self.ProjectId = extProject.ProjectId
}
}
}
self.Hypervisor = extVM.GetHypervisor()
@@ -1978,10 +1985,19 @@ func (manager *SGuestManager) newCloudVM(ctx context.Context, userCred mcclient.
guest.VmemSize = extVM.GetVmemSizeMB()
}
guest.ProjectSource = db.PROJECT_SOURCE_CLOUD
guest.ProjectId = userCred.GetProjectId()
if len(projectId) > 0 {
guest.ProjectId = projectId
}
if extProjectId := extVM.GetProjectId(); len(extProjectId) > 0 {
externalProject, err := ExternalProjectManager.GetProject(extProjectId, host.ManagerId)
if err != nil {
log.Errorf(err.Error())
} else {
guest.ProjectId = externalProject.ProjectId
}
}
extraSecgroups := []*SSecurityGroup{}
if metaData != nil && metaData.Contains("secgroupIds") {
+20 -2
View File
@@ -536,8 +536,15 @@ func (self *SSnapshot) SyncWithCloudSnapshot(userCred mcclient.TokenCredential,
self.Name = ext.GetName()
self.Status = ext.GetStatus()
self.DiskType = ext.GetDiskType()
if projectSync && len(projectId) > 0 {
self.ProjectId = projectId
if projectSync && self.ProjectSource != db.PROJECT_SOURCE_LOCAL {
if extProjectId := ext.GetProjectId(); len(extProjectId) > 0 {
extProject, err := ExternalProjectManager.GetProject(extProjectId, self.ManagerId)
if err != nil {
log.Errorf(err.Error())
} else {
self.ProjectId = extProject.ProjectId
}
}
}
self.CloudregionId = region.Id
return nil
@@ -569,10 +576,21 @@ func (manager *SSnapshotManager) newFromCloudSnapshot(ctx context.Context, userC
snapshot.ManagerId = provider.Id
snapshot.CloudregionId = region.Id
snapshot.ProjectSource = db.PROJECT_SOURCE_CLOUD
snapshot.ProjectId = userCred.GetProjectId()
if len(projectId) > 0 {
snapshot.ProjectId = projectId
}
if extProjectId := extSnapshot.GetProjectId(); len(extProjectId) > 0 {
externalProject, err := ExternalProjectManager.GetProject(extProjectId, snapshot.ManagerId)
if err != nil {
log.Errorf(err.Error())
} else {
snapshot.ProjectId = externalProject.ProjectId
}
}
err := manager.TableSpec().Insert(&snapshot)
if err != nil {
log.Errorf("newFromCloudEip fail %s", err)
+4
View File
@@ -406,3 +406,7 @@ func (self *SRegion) rebuildDisk(diskId string) error {
}
return nil
}
func (self *SDisk) GetProjectId() string {
return ""
}
+4
View File
@@ -326,3 +326,7 @@ func (region *SRegion) UpdateEipBandwidth(eipId string, bw int) error {
}
return err
}
func (self *SEipAddress) GetProjectId() string {
return ""
}
+4
View File
@@ -938,3 +938,7 @@ func (region *SRegion) RenewInstance(instanceId string, bc billing.SBillingCycle
}
return nil
}
func (self *SInstance) GetProjectId() string {
return ""
}
+4
View File
@@ -179,3 +179,7 @@ func (self *SRegion) DeleteSnapshot(snapshotId string) error {
_, err := self.ecsRequest("DeleteSnapshot", params)
return err
}
func (self *SSnapshot) GetProjectId() string {
return ""
}
+4
View File
@@ -480,3 +480,7 @@ func (self *SDisk) Rebuild(ctx context.Context) error {
_, err := self.storage.zone.region.resetDisk(self.DiskId, "")
return err
}
func (self *SDisk) GetProjectId() string {
return ""
}
+4
View File
@@ -304,3 +304,7 @@ func (self *SEipAddress) GetBillingType() string {
func (self *SEipAddress) GetExpiredAt() time.Time {
return time.Time{}
}
func (self *SEipAddress) GetProjectId() string {
return ""
}
+4
View File
@@ -939,3 +939,7 @@ func (self *SInstance) CreateDisk(ctx context.Context, sizeMb int, uuid string,
func (self *SInstance) Renew(bc billing.SBillingCycle) error {
return cloudprovider.ErrNotSupported
}
func (self *SInstance) GetProjectId() string {
return ""
}
+4
View File
@@ -200,3 +200,7 @@ func (self *SRegion) DeleteSnapshot(snapshotId string) error {
_, err := self.ec2Client.DeleteSnapshot(params)
return err
}
func (self *SSnapshot) GetProjectId() string {
return ""
}
+4
View File
@@ -223,3 +223,7 @@ func (disk *SClassicDisk) GetAccessPath() string {
func (self *SClassicDisk) Rebuild(ctx context.Context) error {
return cloudprovider.ErrNotSupported
}
func (self *SClassicDisk) GetProjectId() string {
return ""
}
+4
View File
@@ -151,3 +151,7 @@ func (self *SClassicEipAddress) GetBillingType() string {
func (self *SClassicEipAddress) GetExpiredAt() time.Time {
return time.Time{}
}
func (self *SClassicEipAddress) GetProjectId() string {
return ""
}
+4
View File
@@ -535,3 +535,7 @@ func (self *SClassicInstance) CreateDisk(ctx context.Context, sizeMb int, uuid s
func (self *SClassicInstance) Renew(bc billing.SBillingCycle) error {
return cloudprovider.ErrNotSupported
}
func (self *SClassicInstance) GetProjectId() string {
return ""
}
+4
View File
@@ -77,3 +77,7 @@ func (self *SClassicSnapshot) GetRegionId() string {
func (self *SClassicSnapshot) GetDiskType() string {
return ""
}
func (self *SClassicSnapshot) GetProjectId() string {
return ""
}
+4
View File
@@ -341,3 +341,7 @@ func (self *SDisk) Rebuild(ctx context.Context) error {
// TODO
return cloudprovider.ErrNotSupported
}
func (self *SDisk) GetProjectId() string {
return ""
}
+4
View File
@@ -242,3 +242,7 @@ func (self *SEipAddress) GetBillingType() string {
func (self *SEipAddress) GetExpiredAt() time.Time {
return time.Time{}
}
func (self *SEipAddress) GetProjectId() string {
return ""
}
+4
View File
@@ -1043,3 +1043,7 @@ func (self *SInstance) CreateDisk(ctx context.Context, sizeMb int, uuid string,
func (self *SInstance) Renew(bc billing.SBillingCycle) error {
return cloudprovider.ErrNotSupported
}
func (self *SInstance) GetProjectId() string {
return ""
}
+4
View File
@@ -172,3 +172,7 @@ func (self *SSnapshot) GetDiskId() string {
func (self *SSnapshot) GetDiskType() string {
return ""
}
func (self *SSnapshot) GetProjectId() string {
return ""
}
+4
View File
@@ -244,3 +244,7 @@ func (disk *SVirtualDisk) GetExpiredAt() time.Time {
func (disk *SVirtualDisk) Rebuild(ctx context.Context) error {
return disk.vm.rebuildDisk(ctx, disk)
}
func (disk *SVirtualDisk) GetProjectId() string {
return ""
}
+4
View File
@@ -718,3 +718,7 @@ func (self *SVirtualMachine) createDiskInternal(ctx context.Context, sizeMb int,
func (self *SVirtualMachine) Renew(bc billing.SBillingCycle) error {
return cloudprovider.ErrNotSupported
}
func (self *SVirtualMachine) GetProjectId() string {
return ""
}
+4
View File
@@ -482,3 +482,7 @@ func (self *SRegion) resetDisk(diskId, snapshotId string) (string, error) {
_, err := self.ecsClient.OsSnapshots.PerformAction2("rollback", snapshotId, params, "")
return diskId, err
}
func (self *SDisk) GetProjectId() string {
return ""
}
+4
View File
@@ -367,3 +367,7 @@ func (self *SRegion) GetPorts(instanceId string) ([]Port, error) {
err := doListAllWithMarker(self.ecsClient.Port.List, querys, &ports)
return ports, err
}
func (self *SEipAddress) GetProjectId() string {
return ""
}
+4
View File
@@ -1155,3 +1155,7 @@ func (self *SRegion) UnsubscribeInstance(instanceId string, domianId string) (js
self.ecsClient.Orders.SetDomainId(domianId)
return self.ecsClient.Orders.PerformAction("resources/delete", "", unsubObj)
}
func (self *SInstance) GetProjectId() string {
return ""
}
+1 -1
View File
@@ -381,7 +381,7 @@ func (self *SRegion) CreateEIP(name string, bwMbps int, chargeType string, bgpTy
bgpType = "5_sbgp"
case "cn-northeast-1":
bgpType = "5_telcom"
case "cn-north-4","ap-southeast-1", "ap-southeast-2", "eu-west-0":
case "cn-north-4", "ap-southeast-1", "ap-southeast-2", "eu-west-0":
bgpType = "5_bgp"
default:
bgpType = "5_bgp"
+4
View File
@@ -169,3 +169,7 @@ func (self *SRegion) CreateSnapshot(diskId, name, desc string) (string, error) {
err := DoCreate(self.ecsClient.Snapshots.Create, params, &snapshot)
return snapshot.ID, err
}
func (self *SSnapshot) GetProjectId() string {
return ""
}
+4
View File
@@ -316,3 +316,7 @@ func (disk *SDisk) GetAccessPath() string {
func (disk *SDisk) Rebuild(ctx context.Context) error {
return cloudprovider.ErrNotSupported
}
func (disk *SDisk) GetProjectId() string {
return ""
}
+4
View File
@@ -613,3 +613,7 @@ func (instance *SInstance) Renew(bc billing.SBillingCycle) error {
func (region *SRegion) RenewInstances(instanceId []string, bc billing.SBillingCycle) error {
return cloudprovider.ErrNotSupported
}
func (instance *SInstance) GetProjectId() string {
return ""
}
+4
View File
@@ -163,3 +163,7 @@ func (region *SRegion) CreateSnapshot(diskId, name, desc string) (*SSnapshot, er
snapshot := &SSnapshot{region: region}
return snapshot, resp.Unmarshal(snapshot, "snapshot")
}
func (self *SSnapshot) GetProjectId() string {
return ""
}
+4
View File
@@ -382,3 +382,7 @@ func (self *SDisk) Rebuild(ctx context.Context) error {
// TODO
return cloudprovider.ErrNotSupported
}
func (self *SDisk) GetProjectId() string {
return ""
}
+4
View File
@@ -330,3 +330,7 @@ func (region *SRegion) UpdateInstanceBandwidth(instanceId string, bw int) error
_, err := region.cvmRequest("ResetInstancesInternetMaxBandwidth", params)
return err
}
func (self *SEipAddress) GetProjectId() string {
return ""
}
+4
View File
@@ -821,3 +821,7 @@ func (region *SRegion) RenewInstances(instanceId []string, bc billing.SBillingCy
}
return nil
}
func (self *SInstance) GetProjectId() string {
return ""
}
+4
View File
@@ -139,3 +139,7 @@ func (self *SLocalDisk) Rebuild(ctx context.Context) error {
// TODO
return cloudprovider.ErrNotSupported
}
func (disk *SLocalDisk) GetProjectId() string {
return ""
}
+4
View File
@@ -217,3 +217,7 @@ func (self *SRegion) CreateSnapshot(diskId, name, desc string) (string, error) {
}
return body.GetString("SnapshotId")
}
func (self *SSnapshot) GetProjectId() string {
return ""
}