mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-21 06:09:39 +08:00
280 lines
8.4 KiB
Go
280 lines
8.4 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"yunion.io/x/jsonutils"
|
|
"yunion.io/x/sqlchemy"
|
|
|
|
"database/sql"
|
|
"yunion.io/x/onecloud/pkg/appctx"
|
|
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
|
"yunion.io/x/onecloud/pkg/cloudprovider"
|
|
"yunion.io/x/onecloud/pkg/httperrors"
|
|
)
|
|
|
|
type SManagedResourceBase struct {
|
|
ManagerId string `width:"128" charset:"ascii" nullable:"true" list:"admin" create:"admin_optional"` // Column(VARCHAR(ID_LENGTH, charset='ascii'), nullable=True)
|
|
}
|
|
|
|
func (self *SManagedResourceBase) GetCloudprovider() *SCloudprovider {
|
|
if len(self.ManagerId) > 0 {
|
|
return CloudproviderManager.FetchCloudproviderById(self.ManagerId)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (self *SManagedResourceBase) GetCloudaccount() *SCloudaccount {
|
|
cp := self.GetCloudprovider()
|
|
if cp == nil {
|
|
return nil
|
|
}
|
|
return cp.GetCloudaccount()
|
|
}
|
|
|
|
func (self *SManagedResourceBase) GetProviderFactory() (cloudprovider.ICloudProviderFactory, error) {
|
|
provider := self.GetCloudprovider()
|
|
if provider == nil {
|
|
if len(self.ManagerId) > 0 {
|
|
return nil, cloudprovider.ErrInvalidProvider
|
|
}
|
|
return nil, fmt.Errorf("Resource is self managed")
|
|
}
|
|
return provider.GetProviderFactory()
|
|
}
|
|
|
|
func (self *SManagedResourceBase) GetDriver() (cloudprovider.ICloudProvider, error) {
|
|
provider := self.GetCloudprovider()
|
|
if provider == nil {
|
|
if len(self.ManagerId) > 0 {
|
|
return nil, cloudprovider.ErrInvalidProvider
|
|
}
|
|
return nil, fmt.Errorf("Resource is self managed")
|
|
}
|
|
return provider.GetProvider()
|
|
}
|
|
|
|
func (self *SManagedResourceBase) GetProviderName() string {
|
|
driver := self.GetCloudprovider()
|
|
if driver != nil {
|
|
return driver.Provider
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *SManagedResourceBase) IsManaged() bool {
|
|
return len(self.ManagerId) > 0
|
|
}
|
|
|
|
func managedResourceFilterByAccount(q *sqlchemy.SQuery, query jsonutils.JSONObject, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) {
|
|
queryDict := query.(*jsonutils.JSONDict)
|
|
|
|
managerStr := jsonutils.GetAnyString(query, []string{"manager", "cloudprovider", "cloudprovider_id", "manager_id"})
|
|
if len(managerStr) > 0 {
|
|
queryDict.Remove("manager")
|
|
provider, err := CloudproviderManager.FetchByIdOrName(nil, managerStr)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr)
|
|
}
|
|
return nil, httperrors.NewGeneralError(err)
|
|
}
|
|
if len(filterField) == 0 {
|
|
q = q.Filter(sqlchemy.Equals(q.Field("manager_id"), provider.GetId()))
|
|
queryDict.Remove("manager_id")
|
|
} else {
|
|
sq := subqFunc()
|
|
sq = sq.Filter(sqlchemy.Equals(sq.Field("manager_id"), provider.GetId()))
|
|
q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery()))
|
|
queryDict.Remove(filterField)
|
|
}
|
|
}
|
|
|
|
accountStr := jsonutils.GetAnyString(query, []string{"account", "account_id", "cloudaccount", "cloudaccount_id"})
|
|
if len(accountStr) > 0 {
|
|
queryDict.Remove("account")
|
|
account, err := CloudaccountManager.FetchByIdOrName(nil, accountStr)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), accountStr)
|
|
}
|
|
return nil, httperrors.NewGeneralError(err)
|
|
}
|
|
subq := CloudproviderManager.Query("id").Equals("cloudaccount_id", account.GetId()).SubQuery()
|
|
if len(filterField) == 0 {
|
|
q = q.Filter(sqlchemy.In(q.Field("manager_id"), subq))
|
|
queryDict.Remove("manager_id")
|
|
} else {
|
|
sq := subqFunc()
|
|
sq = sq.Filter(sqlchemy.In(sq.Field("manager_id"), subq))
|
|
q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery()))
|
|
queryDict.Remove(filterField)
|
|
}
|
|
}
|
|
|
|
providerStr := jsonutils.GetAnyString(query, []string{"provider"})
|
|
if len(providerStr) > 0 {
|
|
queryDict.Remove("provider")
|
|
subq := CloudproviderManager.Query("id").Equals("provider", providerStr).SubQuery()
|
|
if len(filterField) == 0 {
|
|
q = q.Filter(sqlchemy.In(q.Field("manager_id"), subq))
|
|
queryDict.Remove("manager_id")
|
|
} else {
|
|
sq := subqFunc()
|
|
sq = sq.Filter(sqlchemy.In(sq.Field("manager_id"), subq))
|
|
q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery()))
|
|
queryDict.Remove(filterField)
|
|
}
|
|
}
|
|
|
|
return q, nil
|
|
}
|
|
|
|
func managedResourceFilterByCloudType(q *sqlchemy.SQuery, query jsonutils.JSONObject, filterField string, subqFunc func() *sqlchemy.SQuery) *sqlchemy.SQuery {
|
|
if jsonutils.QueryBoolean(query, "public_cloud", false) || jsonutils.QueryBoolean(query, "is_public", false) {
|
|
if len(filterField) == 0 {
|
|
q = q.Filter(sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetPublicProviderIdsQuery()))
|
|
} else {
|
|
sq := subqFunc()
|
|
sq = sq.Filter(sqlchemy.In(sq.Field("manager_id"), CloudproviderManager.GetPublicProviderIdsQuery()))
|
|
q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery()))
|
|
}
|
|
}
|
|
|
|
if jsonutils.QueryBoolean(query, "private_cloud", false) || jsonutils.QueryBoolean(query, "is_private", false) {
|
|
if len(filterField) == 0 {
|
|
q = q.Filter(
|
|
sqlchemy.OR(
|
|
sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetPrivateProviderIdsQuery()),
|
|
sqlchemy.IsNullOrEmpty(q.Field("manager_id")),
|
|
),
|
|
)
|
|
} else {
|
|
sq := subqFunc()
|
|
sq = sq.Filter(
|
|
sqlchemy.OR(
|
|
sqlchemy.In(sq.Field("manager_id"), CloudproviderManager.GetPrivateProviderIdsQuery()),
|
|
sqlchemy.IsNullOrEmpty(sq.Field("manager_id")),
|
|
),
|
|
)
|
|
q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery()))
|
|
}
|
|
}
|
|
|
|
if jsonutils.QueryBoolean(query, "is_on_premise", false) {
|
|
if len(filterField) == 0 {
|
|
q = q.Filter(
|
|
sqlchemy.OR(
|
|
sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetOnPremiseProviderIdsQuery()),
|
|
sqlchemy.IsNullOrEmpty(q.Field("manager_id")),
|
|
),
|
|
)
|
|
} else {
|
|
sq := subqFunc()
|
|
sq = sq.Filter(
|
|
sqlchemy.OR(
|
|
sqlchemy.In(sq.Field("manager_id"), CloudproviderManager.GetOnPremiseProviderIdsQuery()),
|
|
sqlchemy.IsNullOrEmpty(sq.Field("manager_id")),
|
|
),
|
|
)
|
|
q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery()))
|
|
}
|
|
}
|
|
|
|
if jsonutils.QueryBoolean(query, "is_managed", false) {
|
|
if len(filterField) == 0 {
|
|
q = q.Filter(sqlchemy.IsNotEmpty(q.Field("manager_id")))
|
|
} else {
|
|
sq := subqFunc()
|
|
sq = sq.Filter(sqlchemy.IsNotEmpty(sq.Field("manager_id")))
|
|
q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery()))
|
|
}
|
|
}
|
|
|
|
return q
|
|
}
|
|
|
|
/*func (self *SManagedResourceBase) getExtraDetails(ctx context.Context, extra *jsonutils.JSONDict) *jsonutils.JSONDict {
|
|
manager := self.GetCloudprovider()
|
|
if manager != nil {
|
|
extra.Add(jsonutils.NewString(manager.Name), "manager")
|
|
extra.Add(jsonutils.NewString(manager.ProjectId), "manager_tenant_id")
|
|
extra.Add(jsonutils.NewString(manager.ProjectId), "manager_project_id")
|
|
project := manager.getProject(ctx)
|
|
if project != nil {
|
|
extra.Add(jsonutils.NewString(project.Name), "manager_tenant")
|
|
extra.Add(jsonutils.NewString(project.Name), "manager_project")
|
|
}
|
|
}
|
|
return extra
|
|
}
|
|
*/
|
|
|
|
type SCloudProviderInfo struct {
|
|
Provider string `json:",omitempty"`
|
|
Account string `json:",omitempty"`
|
|
AccountId string `json:",omitempty"`
|
|
Manager string `json:",omitempty"`
|
|
ManagerId string `json:",omitempty"`
|
|
ManagerProject string `json:",omitempty"`
|
|
ManagerProjectId string `json:",omitempty"`
|
|
Region string `json:",omitempty"`
|
|
RegionId string `json:",omitempty"`
|
|
RegionExtId string `json:",omitempty"`
|
|
Zone string `json:",omitempty"`
|
|
ZoneId string `json:",omitempty"`
|
|
ZoneExtId string `json:",omitempty"`
|
|
}
|
|
|
|
func fetchExternalId(extId string) string {
|
|
pos := strings.LastIndexByte(extId, '/')
|
|
if pos > 0 {
|
|
return extId[pos+1:]
|
|
} else {
|
|
return extId
|
|
}
|
|
}
|
|
|
|
func MakeCloudProviderInfo(region *SCloudregion, zone *SZone, provider *SCloudprovider) SCloudProviderInfo {
|
|
info := SCloudProviderInfo{}
|
|
|
|
if zone != nil {
|
|
info.Zone = zone.GetName()
|
|
info.ZoneId = zone.GetId()
|
|
}
|
|
|
|
if region != nil {
|
|
info.Region = region.GetName()
|
|
info.RegionId = region.GetId()
|
|
}
|
|
|
|
if provider != nil {
|
|
info.Manager = provider.GetName()
|
|
info.ManagerId = provider.GetId()
|
|
|
|
if len(provider.ProjectId) > 0 {
|
|
info.ManagerProjectId = provider.ProjectId
|
|
tc, err := db.TenantCacheManager.FetchTenantById(appctx.Background, provider.ProjectId)
|
|
if err == nil {
|
|
info.ManagerProject = tc.GetName()
|
|
}
|
|
}
|
|
|
|
account := provider.GetCloudaccount()
|
|
info.Account = account.GetName()
|
|
info.AccountId = account.GetId()
|
|
|
|
info.Provider = provider.Provider
|
|
|
|
if region != nil {
|
|
info.RegionExtId = fetchExternalId(region.ExternalId)
|
|
if zone != nil {
|
|
info.ZoneExtId = fetchExternalId(zone.ExternalId)
|
|
}
|
|
}
|
|
}
|
|
|
|
return info
|
|
}
|