cloudprovider.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package cloudprovider
  15. import (
  16. "context"
  17. "fmt"
  18. "net/http"
  19. "yunion.io/x/jsonutils"
  20. "yunion.io/x/pkg/errors"
  21. "yunion.io/x/pkg/util/httputils"
  22. "yunion.io/x/pkg/utils"
  23. )
  24. type SCloudaccountCredential struct {
  25. // 账号所在的项目 (openstack)
  26. ProjectName string `json:"project_name"`
  27. // 账号所在的域 (openstack)
  28. // default: Default
  29. DomainName string `json:"domain_name"`
  30. // 用户名 (openstack, zstack, esxi)
  31. Username string `json:"username"`
  32. // 密码 (openstack, zstack, esxi)
  33. Password string `json:"password"`
  34. // 认证地址 (openstack,zstack)
  35. AuthUrl string `json:"auto_url"`
  36. // 秘钥id (Aliyun, Aws, huawei, ucloud, ctyun, zstack, s3)
  37. AccessKeyId string `json:"access_key_id"`
  38. // 秘钥key (Aliyun, Aws, huawei, ucloud, ctyun, zstack, s3)
  39. AccessKeySecret string `json:"access_key_secret"`
  40. // 环境 (Azure, Aws, huawei, ctyun, aliyun)
  41. Environment string `json:"environment"`
  42. // 目录ID (Azure)
  43. DirectoryId string `json:"directory_id"`
  44. // 客户端ID (Azure)
  45. ClientId string `json:"client_id"`
  46. // 客户端秘钥 (Azure)
  47. ClientSecret string `json:"client_secret"`
  48. // 主机IP (esxi)
  49. Host string `json:"host"`
  50. // 主机端口 (esxi)
  51. Port int `json:"port"`
  52. // 端点 (s3) 或 Apsara(飞天)
  53. Endpoint string `json:"endpoint"`
  54. // app id (Qcloud)
  55. AppId string `json:"app_id"`
  56. //秘钥ID (Qcloud)
  57. SecretId string `json:"secret_id"`
  58. //秘钥key (Qcloud)
  59. SecretKey string `json:"secret_key"`
  60. // 飞天允许的最高组织id, 默认为1
  61. OrganizationId int `json:"organization_id"`
  62. // Google服务账号email (gcp)
  63. GCPClientEmail string `json:"gcp_client_email"`
  64. // Google服务账号project id (gcp)
  65. GCPProjectId string `json:"gcp_project_id"`
  66. // Google服务账号秘钥id (gcp)
  67. GCPPrivateKeyId string `json:"gcp_private_key_id"`
  68. // Google服务账号秘钥 (gcp)
  69. GCPPrivateKey string `json:"gcp_private_key"`
  70. OracleTenancyOCID string `json:"oracle_tenancy_ocid"`
  71. OracleUserOCID string `json:"oracle_user_ocid"`
  72. OraclePrivateKey string `json:"oracle_private_key"`
  73. RegionId string
  74. // Huawei Cloud Stack Online
  75. *SHCSOEndpoints
  76. }
  77. type SCloudaccount struct {
  78. // 账号信息,各个平台字段不尽相同,以下是各个平台账号创建所需要的字段
  79. //
  80. //
  81. //
  82. // | 云平台 |字段 | 翻译 | 是否必传 | 默认值 | 可否更新 | 获取方式 |
  83. // | ------ |------ | ------ | --------- | -------- |-------- |-------- |
  84. // |Aliyun |access_key_id |秘钥ID | 是 | | 是 | |
  85. // |Aliyun |access_key_secret |秘钥Key | 是 | | 是 | |
  86. // |Qcloud |app_id |APP ID | 是 | | 否 | |
  87. // |Qcloud |secret_id |秘钥ID | 是 | | 是 | |
  88. // |Qcloud |secret_key |秘钥Key | 是 | | 是 | |
  89. // |OpenStack |project_name |用户所在项目 | 是 | | 是 | |
  90. // |OpenStack |username |用户名 | 是 | | 是 | |
  91. // |OpenStack |password |用户密码 | 是 | | 是 | |
  92. // |OpenStack |auth_url |认证地址 | 是 | | 否 | |
  93. // |OpenStack |domain_name |用户所在的域 | 否 |Default | 是 | |
  94. // |VMware |username |用户名 | 是 | | 是 | |
  95. // |VMware |password |密码 | 是 | | 是 | |
  96. // |VMware |host |主机IP或域名 | 是 | | 否 | |
  97. // |VMware |port |主机端口 | 否 |443 | 否 | |
  98. // |Azure |directory_id |目录ID | 是 | | 否 | |
  99. // |Azure |environment |区域 | 是 | | 否 | |
  100. // |Azure |client_id |客户端ID | 是 | | 是 | |
  101. // |Azure |client_secret |客户端密码 | 是 | | 是 | |
  102. // |Huawei |access_key_id |秘钥ID | 是 | | 是 | |
  103. // |Huawei |access_key_secret |秘钥 | 是 | | 是 | |
  104. // |Huawei |environment |区域 | 是 | | 否 | |
  105. // |Aws |access_key_id |秘钥ID | 是 | | 是 | |
  106. // |Aws |access_key_secret |秘钥 | 是 | | 是 | |
  107. // |Aws |environment |区域 | 是 | | 否 | |
  108. // |Ucloud |access_key_id |秘钥ID | 是 | | 是 | |
  109. // |Ucloud |access_key_secret |秘钥 | 是 | | 是 | |
  110. // |Google |project_id |项目ID | 是 | | 否 | |
  111. // |Google |client_email |客户端email | 是 | | 否 | |
  112. // |Google |private_key_id |秘钥ID | 是 | | 是 | |
  113. // |Google |private_key |秘钥Key | 是 | | 是 | |
  114. Account string `json:"account"`
  115. // swagger:ignore
  116. Secret string
  117. // 认证地址
  118. AccessUrl string `json:"access_url"`
  119. }
  120. type ProviderConfig struct {
  121. // Id, Name are properties of Cloudprovider object
  122. Id string
  123. Name string
  124. // Vendor are names like Aliyun, OpenStack, etc.
  125. Vendor string
  126. URL string
  127. Account string
  128. Secret string
  129. ReadOnly bool
  130. AccountId string
  131. Options *jsonutils.JSONDict
  132. RegionId string
  133. ProxyFunc httputils.TransportProxyFunc
  134. Debug bool
  135. // 仅用来检测cloudpods是否纳管自身环境(system项目id)
  136. AdminProjectId string
  137. AliyunResourceGroupIds []string
  138. UpdatePermission func(service, permission string)
  139. }
  140. func (cp *ProviderConfig) AdaptiveTimeoutHttpClient() *http.Client {
  141. client := httputils.GetAdaptiveTimeoutClient()
  142. httputils.SetClientProxyFunc(client, cp.ProxyFunc)
  143. return client
  144. }
  145. type SProviderInfo struct {
  146. Name string
  147. Url string
  148. Account string
  149. Secret string
  150. Region string
  151. Options *jsonutils.JSONDict
  152. }
  153. type ICloudProviderFactory interface {
  154. GetProvider(cfg ProviderConfig) (ICloudProvider, error)
  155. GetClientRC(SProviderInfo) (map[string]string, error)
  156. GetId() string
  157. GetName() string
  158. ValidateChangeBandwidth(instanceId string, bandwidth int64) error
  159. ValidateCreateCloudaccountData(ctx context.Context, input SCloudaccountCredential) (SCloudaccount, error)
  160. IsReadOnly() bool
  161. ValidateUpdateCloudaccountCredential(ctx context.Context, input SCloudaccountCredential, cloudaccount string) (SCloudaccount, error)
  162. GetSupportedBrands() []string
  163. IsPublicCloud() bool
  164. IsOnPremise() bool
  165. IsMultiTenant() bool
  166. IsSupportPrepaidResources() bool
  167. NeedSyncSkuFromCloud() bool
  168. IsCloudeventRegional() bool
  169. GetMaxCloudEventSyncDays() int
  170. GetMaxCloudEventKeepDays() int
  171. IsNeedForceAutoCreateProject() bool
  172. IsSupportCrossCloudEnvVpcPeering() bool
  173. IsSupportCrossRegionVpcPeering() bool
  174. IsSupportVpcPeeringVpcCidrOverlap() bool
  175. ValidateCrossRegionVpcPeeringBandWidth(bandwidth int) error
  176. IsSupportModifyRouteTable() bool
  177. GetSupportedDnsZoneTypes() []TDnsZoneType
  178. GetSupportedDnsTypes() map[TDnsZoneType][]TDnsType
  179. GetSupportedDnsPolicyTypes() map[TDnsZoneType][]TDnsPolicyType
  180. GetSupportedDnsPolicyValues() map[TDnsPolicyType][]TDnsPolicyValue
  181. GetTTLRange(zoneType TDnsZoneType, productType TDnsProductType) TTlRange
  182. IsSupportSAMLAuth() bool
  183. GetAccountIdEqualizer() func(origin, now string) bool
  184. }
  185. type SBalanceInfo struct {
  186. Currency string
  187. Amount float64
  188. Status string
  189. }
  190. type ICloudProvider interface {
  191. GetFactory() ICloudProviderFactory
  192. GetSysInfo() (jsonutils.JSONObject, error)
  193. GetVersion() string
  194. GetIamLoginUrl() string
  195. GetIRegions() ([]ICloudRegion, error)
  196. GetIProjects() ([]ICloudProject, error)
  197. CreateIProject(name string) (ICloudProject, error)
  198. GetIRegionById(id string) (ICloudRegion, error)
  199. GetOnPremiseIRegion() (ICloudRegion, error)
  200. GetBalance() (*SBalanceInfo, error)
  201. GetSubAccounts() ([]SSubAccount, error)
  202. GetAccountId() string
  203. // region external id 是以provider 做为前缀.因此可以通过该判断条件过滤出同一个provider的regions列表
  204. // 但是华为云有点特殊一个provider只对应一个region,因此需要进一步指定region名字,才能找到provider对应的region
  205. GetCloudRegionExternalIdPrefix() string
  206. GetStorageClasses(regionId string) []string
  207. GetBucketCannedAcls(regionId string) []string
  208. GetObjectCannedAcls(regionId string) []string
  209. GetCapabilities() []string
  210. IsClouduserSupportPassword() bool
  211. GetICloudusers() ([]IClouduser, error)
  212. GetICloudpolicies() ([]ICloudpolicy, error)
  213. GetICloudgroups() ([]ICloudgroup, error)
  214. GetICloudgroupByName(name string) (ICloudgroup, error)
  215. CreateICloudgroup(name, desc string) (ICloudgroup, error)
  216. GetIClouduserByName(name string) (IClouduser, error)
  217. CreateIClouduser(conf *SClouduserCreateConfig) (IClouduser, error)
  218. CreateICloudSAMLProvider(opts *SAMLProviderCreateOptions) (ICloudSAMLProvider, error)
  219. GetICloudSAMLProviders() ([]ICloudSAMLProvider, error)
  220. GetICloudroles() ([]ICloudrole, error)
  221. GetICloudroleById(id string) (ICloudrole, error)
  222. GetICloudroleByName(name string) (ICloudrole, error)
  223. CreateICloudrole(opts *SRoleCreateOptions) (ICloudrole, error)
  224. CreateICloudpolicy(opts *SCloudpolicyCreateOptions) (ICloudpolicy, error)
  225. GetEnrollmentAccounts() ([]SEnrollmentAccount, error)
  226. CreateSubscription(SubscriptionCreateInput) error
  227. GetSamlEntityId() string
  228. GetICloudDnsZones() ([]ICloudDnsZone, error)
  229. GetICloudDnsZoneById(id string) (ICloudDnsZone, error)
  230. CreateICloudDnsZone(opts *SDnsZoneCreateOptions) (ICloudDnsZone, error)
  231. GetICloudGlobalVpcs() ([]ICloudGlobalVpc, error)
  232. CreateICloudGlobalVpc(opts *GlobalVpcCreateOptions) (ICloudGlobalVpc, error)
  233. GetICloudGlobalVpcById(id string) (ICloudGlobalVpc, error)
  234. GetICloudInterVpcNetworks() ([]ICloudInterVpcNetwork, error)
  235. GetICloudInterVpcNetworkById(id string) (ICloudInterVpcNetwork, error)
  236. CreateICloudInterVpcNetwork(opts *SInterVpcNetworkCreateOptions) (ICloudInterVpcNetwork, error)
  237. GetICloudCDNDomains() ([]ICloudCDNDomain, error)
  238. GetICloudCDNDomainByName(name string) (ICloudCDNDomain, error)
  239. CreateICloudCDNDomain(opts *CdnCreateOptions) (ICloudCDNDomain, error)
  240. GetMetrics(opts *MetricListOptions) ([]MetricValues, error)
  241. GetISSLCertificates() ([]ICloudSSLCertificate, error)
  242. CreateISSLCertificate(opts *SSLCertificateCreateOptions) (ICloudSSLCertificate, error)
  243. GetIAiGateways() ([]IAiGateway, error)
  244. GetIAiGatewayById(id string) (IAiGateway, error)
  245. CreateIAiGateway(opts *AiGatewayCreateOptions) (IAiGateway, error)
  246. }
  247. func IsSupportCapability(prod ICloudProvider, capa string) bool {
  248. return utils.IsInStringArray(capa, prod.GetCapabilities()) || utils.IsInStringArray(capa+READ_ONLY_SUFFIX, prod.GetCapabilities())
  249. }
  250. func IsSupportCDN(prod ICloudProvider) bool {
  251. return IsSupportCapability(prod, CLOUD_CAPABILITY_CDN)
  252. }
  253. func IsSupportProject(prod ICloudProvider) bool {
  254. return IsSupportCapability(prod, CLOUD_CAPABILITY_PROJECT)
  255. }
  256. func IsSupportQuota(prod ICloudProvider) bool {
  257. return IsSupportCapability(prod, CLOUD_CAPABILITY_QUOTA)
  258. }
  259. func IsSupportDnsZone(prod ICloudProvider) bool {
  260. return IsSupportCapability(prod, CLOUD_CAPABILITY_DNSZONE)
  261. }
  262. func IsSupportAiGateway(prod ICloudProvider) bool {
  263. return IsSupportCapability(prod, CLOUD_CAPABILITY_AI_GATEWAY)
  264. }
  265. func IsSupportInterVpcNetwork(prod ICloudProvider) bool {
  266. return IsSupportCapability(prod, CLOUD_CAPABILITY_INTERVPCNETWORK)
  267. }
  268. func IsSupportCompute(prod ICloudProvider) bool {
  269. return IsSupportCapability(prod, CLOUD_CAPABILITY_COMPUTE)
  270. }
  271. func IsSupportLoadbalancer(prod ICloudProvider) bool {
  272. return IsSupportCapability(prod, CLOUD_CAPABILITY_LOADBALANCER)
  273. }
  274. func IsSupportObjectstore(prod ICloudProvider) bool {
  275. return IsSupportCapability(prod, CLOUD_CAPABILITY_OBJECTSTORE)
  276. }
  277. func IsSupportRds(prod ICloudProvider) bool {
  278. return IsSupportCapability(prod, CLOUD_CAPABILITY_RDS)
  279. }
  280. func IsSupportNAS(prod ICloudProvider) bool {
  281. return IsSupportCapability(prod, CLOUD_CAPABILITY_NAS)
  282. }
  283. func IsSupportNAT(prod ICloudProvider) bool {
  284. return IsSupportCapability(prod, CLOUD_CAPABILITY_NAT)
  285. }
  286. func IsSupportElasticCache(prod ICloudProvider) bool {
  287. return IsSupportCapability(prod, CLOUD_CAPABILITY_CACHE)
  288. }
  289. func IsSupportWaf(prod ICloudProvider) bool {
  290. return IsSupportCapability(prod, CLOUD_CAPABILITY_WAF)
  291. }
  292. func IsSupportMongoDB(prod ICloudProvider) bool {
  293. return IsSupportCapability(prod, CLOUD_CAPABILITY_MONGO_DB)
  294. }
  295. func IsSupportElasticSearch(prod ICloudProvider) bool {
  296. return IsSupportCapability(prod, CLOUD_CAPABILITY_ES)
  297. }
  298. func IsSupportSSLCertificate(prod ICloudProvider) bool {
  299. return IsSupportCapability(prod, CLOUD_CAPABILITY_CERT)
  300. }
  301. func IsSupportKafka(prod ICloudProvider) bool {
  302. return IsSupportCapability(prod, CLOUD_CAPABILITY_KAFKA)
  303. }
  304. func IsSupportApp(prod ICloudProvider) bool {
  305. return IsSupportCapability(prod, CLOUD_CAPABILITY_APP)
  306. }
  307. func IsSupportContainer(prod ICloudProvider) bool {
  308. return IsSupportCapability(prod, CLOUD_CAPABILITY_CONTAINER)
  309. }
  310. func IsSupportTablestore(prod ICloudProvider) bool {
  311. return IsSupportCapability(prod, CLOUD_CAPABILITY_TABLESTORE)
  312. }
  313. func IsSupportModelartsPool(prod ICloudProvider) bool {
  314. return IsSupportCapability(prod, CLOUD_CAPABILITY_MODELARTES)
  315. }
  316. func IsSupportMiscResources(prod ICloudProvider) bool {
  317. return IsSupportCapability(prod, CLOUD_CAPABILITY_MISC)
  318. }
  319. var providerTable map[string]ICloudProviderFactory
  320. func init() {
  321. providerTable = make(map[string]ICloudProviderFactory)
  322. }
  323. func RegisterFactory(factory ICloudProviderFactory) {
  324. providerTable[factory.GetId()] = factory
  325. }
  326. func GetProviderFactory(provider string) (ICloudProviderFactory, error) {
  327. factory, ok := providerTable[provider]
  328. if ok {
  329. return factory, nil
  330. }
  331. return nil, fmt.Errorf("no such provider %s", provider)
  332. }
  333. func GetRegistedProviderIds() []string {
  334. providers := []string{}
  335. for id := range providerTable {
  336. providers = append(providers, id)
  337. }
  338. return providers
  339. }
  340. func GetProvider(cfg ProviderConfig) (ICloudProvider, error) {
  341. driver, err := GetProviderFactory(cfg.Vendor)
  342. if err != nil {
  343. return nil, errors.Wrap(err, "GetProviderFactory")
  344. }
  345. return driver.GetProvider(cfg)
  346. }
  347. func GetClientRC(provider string, info SProviderInfo) (map[string]string, error) {
  348. driver, err := GetProviderFactory(provider)
  349. if err != nil {
  350. return nil, errors.Wrap(err, "GetProviderFactory")
  351. }
  352. return driver.GetClientRC(info)
  353. }
  354. func IsSupported(provider string) bool {
  355. _, ok := providerTable[provider]
  356. return ok
  357. }
  358. func IsValidCloudAccount(cfg ProviderConfig) (ICloudProvider, string, error) {
  359. factory, ok := providerTable[cfg.Vendor]
  360. if ok {
  361. provider, err := factory.GetProvider(cfg)
  362. if err != nil {
  363. return nil, "", err
  364. }
  365. return provider, provider.GetAccountId(), nil
  366. }
  367. return nil, "", ErrNoSuchProvder
  368. }
  369. type SBaseProvider struct {
  370. factory ICloudProviderFactory
  371. }
  372. func (base *SBaseProvider) GetFactory() ICloudProviderFactory {
  373. return base.factory
  374. }
  375. func (base *SBaseProvider) GetOnPremiseIRegion() (ICloudRegion, error) {
  376. return nil, ErrNotImplemented
  377. }
  378. func (base *SBaseProvider) GetIamLoginUrl() string {
  379. return ""
  380. }
  381. func (base *SBaseProvider) IsClouduserSupportPassword() bool {
  382. return true
  383. }
  384. func (base *SBaseProvider) GetICloudusers() ([]IClouduser, error) {
  385. return nil, ErrNotImplemented
  386. }
  387. func (base *SBaseProvider) GetICloudgroups() ([]ICloudgroup, error) {
  388. return nil, ErrNotImplemented
  389. }
  390. func (base *SBaseProvider) GetICloudgroupByName(name string) (ICloudgroup, error) {
  391. return nil, ErrNotImplemented
  392. }
  393. func (base *SBaseProvider) CreateICloudgroup(name, desc string) (ICloudgroup, error) {
  394. return nil, ErrNotImplemented
  395. }
  396. func (base *SBaseProvider) GetICloudpolicies() ([]ICloudpolicy, error) {
  397. return nil, ErrNotImplemented
  398. }
  399. func (base *SBaseProvider) GetIClouduserByName(name string) (IClouduser, error) {
  400. return nil, ErrNotImplemented
  401. }
  402. func (base *SBaseProvider) CreateIClouduser(conf *SClouduserCreateConfig) (IClouduser, error) {
  403. return nil, ErrNotImplemented
  404. }
  405. func (base *SBaseProvider) GetICloudSAMLProviders() ([]ICloudSAMLProvider, error) {
  406. return nil, errors.Wrapf(ErrNotImplemented, "GetICloudSAMLProviders")
  407. }
  408. func (base *SBaseProvider) GetICloudroles() ([]ICloudrole, error) {
  409. return nil, errors.Wrapf(ErrNotImplemented, "GetICloudroles")
  410. }
  411. func (base *SBaseProvider) GetICloudroleById(id string) (ICloudrole, error) {
  412. return nil, errors.Wrapf(ErrNotImplemented, "GetICloudroleById")
  413. }
  414. func (base *SBaseProvider) GetICloudroleByName(name string) (ICloudrole, error) {
  415. return nil, errors.Wrapf(ErrNotImplemented, "GetICloudroleByName")
  416. }
  417. func (base *SBaseProvider) CreateICloudrole(opts *SRoleCreateOptions) (ICloudrole, error) {
  418. return nil, errors.Wrapf(ErrNotImplemented, "CreateICloudrole")
  419. }
  420. func (base *SBaseProvider) CreateICloudSAMLProvider(opts *SAMLProviderCreateOptions) (ICloudSAMLProvider, error) {
  421. return nil, errors.Wrapf(ErrNotImplemented, "CreateICloudSAMLProvider")
  422. }
  423. func (base *SBaseProvider) CreateICloudpolicy(opts *SCloudpolicyCreateOptions) (ICloudpolicy, error) {
  424. return nil, ErrNotImplemented
  425. }
  426. func (base *SBaseProvider) GetEnrollmentAccounts() ([]SEnrollmentAccount, error) {
  427. return nil, ErrNotImplemented
  428. }
  429. func (base *SBaseProvider) CreateSubscription(SubscriptionCreateInput) error {
  430. return ErrNotImplemented
  431. }
  432. func (base *SBaseProvider) GetICloudDnsZones() ([]ICloudDnsZone, error) {
  433. return nil, ErrNotImplemented
  434. }
  435. func (base *SBaseProvider) GetICloudDnsZoneById(id string) (ICloudDnsZone, error) {
  436. return nil, ErrNotImplemented
  437. }
  438. func (base *SBaseProvider) CreateICloudDnsZone(opts *SDnsZoneCreateOptions) (ICloudDnsZone, error) {
  439. return nil, ErrNotImplemented
  440. }
  441. func (base *SBaseProvider) GetCloudRegionExternalIdPrefix() string {
  442. return base.factory.GetId()
  443. }
  444. func (base *SBaseProvider) CreateIProject(name string) (ICloudProject, error) {
  445. return nil, ErrNotImplemented
  446. }
  447. func (base *SBaseProvider) GetSamlEntityId() string {
  448. return ""
  449. }
  450. func (base *SBaseProvider) GetSamlSpInitiatedLoginUrl(idpName string) string {
  451. return ""
  452. }
  453. func (base *SBaseProvider) GetICloudInterVpcNetworks() ([]ICloudInterVpcNetwork, error) {
  454. return nil, ErrNotImplemented
  455. }
  456. func (base *SBaseProvider) GetICloudInterVpcNetworkById(id string) (ICloudInterVpcNetwork, error) {
  457. return nil, ErrNotImplemented
  458. }
  459. func (base *SBaseProvider) CreateICloudInterVpcNetwork(opts *SInterVpcNetworkCreateOptions) (ICloudInterVpcNetwork, error) {
  460. return nil, ErrNotImplemented
  461. }
  462. func (base *SBaseProvider) GetICloudGlobalVpcs() ([]ICloudGlobalVpc, error) {
  463. return nil, errors.Wrapf(ErrNotImplemented, "GetICloudGlobalVpcs")
  464. }
  465. func (base *SBaseProvider) GetICloudGlobalVpcById(id string) (ICloudGlobalVpc, error) {
  466. return nil, errors.Wrapf(ErrNotImplemented, "GetICloudGlobalVpcById")
  467. }
  468. func (base *SBaseProvider) CreateICloudGlobalVpc(opts *GlobalVpcCreateOptions) (ICloudGlobalVpc, error) {
  469. return nil, errors.Wrapf(ErrNotImplemented, "CreateICloudGlobalVpc")
  470. }
  471. func (base *SBaseProvider) GetICloudCDNDomains() ([]ICloudCDNDomain, error) {
  472. return nil, errors.Wrapf(ErrNotImplemented, "GetICloudCDNDomains")
  473. }
  474. func (base *SBaseProvider) GetICloudCDNDomainByName(name string) (ICloudCDNDomain, error) {
  475. return nil, errors.Wrapf(ErrNotImplemented, "GetICloudCDNDomainByName")
  476. }
  477. func (base *SBaseProvider) CreateICloudCDNDomain(opts *CdnCreateOptions) (ICloudCDNDomain, error) {
  478. return nil, errors.Wrapf(ErrNotImplemented, "CreateICloudCDNDomain")
  479. }
  480. func (base *SBaseProvider) GetMetrics(opts *MetricListOptions) ([]MetricValues, error) {
  481. return nil, errors.Wrapf(ErrNotImplemented, "GetMetric")
  482. }
  483. func (base *SBaseProvider) GetIModelartsPools() ([]ICloudModelartsPool, error) {
  484. return nil, errors.Wrapf(ErrNotImplemented, "GetIModelartsPools")
  485. }
  486. func (base *SBaseProvider) GetIModelartsPoolById(id string) (ICloudModelartsPool, error) {
  487. return nil, errors.Wrapf(ErrNotImplemented, "GetIModelartsPoolDetail")
  488. }
  489. func (base *SBaseProvider) CreateIModelartsPool(pool *ModelartsPoolCreateOption, callback func(id string)) (ICloudModelartsPool, error) {
  490. return nil, errors.Wrapf(ErrNotImplemented, "CreateIModelartsPool")
  491. }
  492. func (base *SBaseProvider) GetIModelartsPoolSku() ([]ICloudModelartsPoolSku, error) {
  493. return nil, errors.Wrapf(ErrNotImplemented, "GetIModelartsPoolSku")
  494. }
  495. func (base *SBaseProvider) GetISSLCertificates() ([]ICloudSSLCertificate, error) {
  496. return nil, errors.Wrapf(ErrNotImplemented, "GetISSLCertificates")
  497. }
  498. func (base *SBaseProvider) CreateISSLCertificate(opts *SSLCertificateCreateOptions) (ICloudSSLCertificate, error) {
  499. return nil, errors.Wrapf(ErrNotImplemented, "CreateISSLCertificate")
  500. }
  501. func (base *SBaseProvider) GetIAiGateways() ([]IAiGateway, error) {
  502. return nil, errors.Wrapf(ErrNotImplemented, "GetIAiGateways")
  503. }
  504. func (base *SBaseProvider) GetIAiGatewayById(id string) (IAiGateway, error) {
  505. return nil, errors.Wrapf(ErrNotImplemented, "GetIAiGateways")
  506. }
  507. func (base *SBaseProvider) CreateIAiGateway(opts *AiGatewayCreateOptions) (IAiGateway, error) {
  508. return nil, errors.Wrapf(ErrNotImplemented, "CreateIAiGateway")
  509. }
  510. func NewBaseProvider(factory ICloudProviderFactory) SBaseProvider {
  511. return SBaseProvider{factory: factory}
  512. }
  513. func GetPublicProviders() []string {
  514. providers := make([]string, 0)
  515. for p, d := range providerTable {
  516. if d.IsPublicCloud() {
  517. providers = append(providers, p)
  518. }
  519. }
  520. return providers
  521. }
  522. func GetPrivateProviders() []string {
  523. providers := make([]string, 0)
  524. for p, d := range providerTable {
  525. if !d.IsPublicCloud() && !d.IsOnPremise() {
  526. providers = append(providers, p)
  527. }
  528. }
  529. return providers
  530. }
  531. func GetOnPremiseProviders() []string {
  532. providers := make([]string, 0)
  533. for p, d := range providerTable {
  534. if !d.IsPublicCloud() && d.IsOnPremise() {
  535. providers = append(providers, p)
  536. }
  537. }
  538. return providers
  539. }
  540. func GetProviderCloudEnv(provider string) string {
  541. p, err := GetProviderFactory(provider)
  542. if err != nil {
  543. return ""
  544. }
  545. if p.IsPublicCloud() {
  546. return CLOUD_ENV_PUBLIC_CLOUD
  547. }
  548. if p.IsOnPremise() {
  549. return CLOUD_ENV_ON_PREMISE
  550. }
  551. return CLOUD_ENV_PRIVATE_CLOUD
  552. }
  553. type baseProviderFactory struct {
  554. }
  555. func (factory *baseProviderFactory) ValidateChangeBandwidth(instanceId string, bandwidth int64) error {
  556. return nil
  557. }
  558. func (factory *baseProviderFactory) GetSupportedBrands() []string {
  559. return []string{}
  560. }
  561. func (factory *baseProviderFactory) IsSupportSAMLAuth() bool {
  562. return false
  563. }
  564. func (factory *baseProviderFactory) GetProvider(providerId, providerName, url, username, password string) (ICloudProvider, error) {
  565. return nil, errors.Wrapf(ErrNotImplemented, "GetProvider")
  566. }
  567. func (factory *baseProviderFactory) IsOnPremise() bool {
  568. return false
  569. }
  570. func (factory *baseProviderFactory) IsMultiTenant() bool {
  571. return false
  572. }
  573. func (factory *baseProviderFactory) IsReadOnly() bool {
  574. return false
  575. }
  576. func (factory *baseProviderFactory) IsCloudeventRegional() bool {
  577. return false
  578. }
  579. func (factory *baseProviderFactory) GetMaxCloudEventSyncDays() int {
  580. return 7
  581. }
  582. func (factory *baseProviderFactory) GetMaxCloudEventKeepDays() int {
  583. return 7
  584. }
  585. func (factory *baseProviderFactory) IsNeedForceAutoCreateProject() bool {
  586. return false
  587. }
  588. func (factory *baseProviderFactory) IsSupportCrossCloudEnvVpcPeering() bool {
  589. return false
  590. }
  591. func (factory *baseProviderFactory) IsSupportCrossRegionVpcPeering() bool {
  592. return false
  593. }
  594. func (factory *baseProviderFactory) IsSupportVpcPeeringVpcCidrOverlap() bool {
  595. return false
  596. }
  597. func (factory *baseProviderFactory) ValidateCrossRegionVpcPeeringBandWidth(bandwidth int) error {
  598. return nil
  599. }
  600. func (factory *baseProviderFactory) IsSupportModifyRouteTable() bool {
  601. return false
  602. }
  603. func (factory *baseProviderFactory) GetSupportedDnsZoneTypes() []TDnsZoneType {
  604. return []TDnsZoneType{}
  605. }
  606. func (factory *baseProviderFactory) GetSupportedDnsTypes() map[TDnsZoneType][]TDnsType {
  607. return map[TDnsZoneType][]TDnsType{}
  608. }
  609. func (factory *baseProviderFactory) GetSupportedDnsPolicyTypes() map[TDnsZoneType][]TDnsPolicyType {
  610. return map[TDnsZoneType][]TDnsPolicyType{}
  611. }
  612. func (factory *baseProviderFactory) GetSupportedDnsPolicyValues() map[TDnsPolicyType][]TDnsPolicyValue {
  613. return map[TDnsPolicyType][]TDnsPolicyValue{}
  614. }
  615. func (factory *baseProviderFactory) GetTTLRange(zoneType TDnsZoneType, productType TDnsProductType) TTlRange {
  616. return TTlRange{}
  617. }
  618. func (factory *baseProviderFactory) GetAccountIdEqualizer() func(origin, now string) bool {
  619. return func(origin, now string) bool {
  620. if len(now) > 0 && now != origin {
  621. return false
  622. }
  623. return true
  624. }
  625. }
  626. type SDnsCapability struct {
  627. ZoneTypes []TDnsZoneType
  628. DnsTypes map[TDnsZoneType][]TDnsType
  629. PolicyTypes map[TDnsZoneType][]TDnsPolicyType
  630. PolicyValues map[TDnsPolicyType][]TDnsPolicyValue
  631. }
  632. func GetDnsCapabilities() map[string]SDnsCapability {
  633. capabilities := map[string]SDnsCapability{}
  634. for provider, driver := range providerTable {
  635. capabilities[provider] = SDnsCapability{
  636. ZoneTypes: driver.GetSupportedDnsZoneTypes(),
  637. DnsTypes: driver.GetSupportedDnsTypes(),
  638. PolicyTypes: driver.GetSupportedDnsPolicyTypes(),
  639. PolicyValues: driver.GetSupportedDnsPolicyValues(),
  640. }
  641. }
  642. return capabilities
  643. }
  644. type SPremiseBaseProviderFactory struct {
  645. baseProviderFactory
  646. }
  647. func (factory *SPremiseBaseProviderFactory) IsPublicCloud() bool {
  648. return false
  649. }
  650. func (factory *SPremiseBaseProviderFactory) IsSupportPrepaidResources() bool {
  651. return false
  652. }
  653. func (factory *SPremiseBaseProviderFactory) IsOnPremise() bool {
  654. return true
  655. }
  656. func (factory *SPremiseBaseProviderFactory) IsMultiTenant() bool {
  657. return false
  658. }
  659. func (factory *SPremiseBaseProviderFactory) NeedSyncSkuFromCloud() bool {
  660. return false
  661. }
  662. type SPublicCloudBaseProviderFactory struct {
  663. baseProviderFactory
  664. }
  665. func (factory *SPublicCloudBaseProviderFactory) IsMultiTenant() bool {
  666. return true
  667. }
  668. func (factory *SPublicCloudBaseProviderFactory) IsPublicCloud() bool {
  669. return true
  670. }
  671. func (factory *SPublicCloudBaseProviderFactory) IsSupportPrepaidResources() bool {
  672. return true
  673. }
  674. func (factory *SPublicCloudBaseProviderFactory) NeedSyncSkuFromCloud() bool {
  675. return false
  676. }
  677. type SPrivateCloudBaseProviderFactory struct {
  678. baseProviderFactory
  679. }
  680. func (factory *SPrivateCloudBaseProviderFactory) IsMultiTenant() bool {
  681. return false
  682. }
  683. func (factory *SPrivateCloudBaseProviderFactory) IsPublicCloud() bool {
  684. return false
  685. }
  686. func (factory *SPrivateCloudBaseProviderFactory) IsSupportPrepaidResources() bool {
  687. return false
  688. }
  689. func (factory *SPrivateCloudBaseProviderFactory) NeedSyncSkuFromCloud() bool {
  690. return true
  691. }
  692. type ICloudModelartsPool interface {
  693. ICloudResource
  694. IBillingResource
  695. Delete() error
  696. GetProjectId() string
  697. GetInstanceType() string
  698. GetWorkType() string
  699. GetNodeCount() int
  700. ChangeConfig(opts *ModelartsPoolChangeConfigOptions) error
  701. GetStatusMessage() string
  702. }
  703. type ICloudModelartsPoolSku interface {
  704. ICloudResource
  705. GetCpuCoreCount() int
  706. GetCpuArch() string
  707. GetStatus() string
  708. GetMemorySizeMB() int
  709. GetPoolType() string
  710. GetGpuSize() int
  711. GetGpuType() string
  712. GetNpuSize() int
  713. GetNpuType() string
  714. GetProcessorType() string
  715. }