Files
cloudpods/pkg/apis/compute/cloudaccount.go
2024-10-01 08:49:04 +08:00

634 lines
17 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package compute
import (
"fmt"
"reflect"
"yunion.io/x/cloudmux/pkg/cloudprovider"
"yunion.io/x/jsonutils"
"yunion.io/x/pkg/gotypes"
"yunion.io/x/pkg/utils"
"yunion.io/x/onecloud/pkg/apis"
proxyapi "yunion.io/x/onecloud/pkg/apis/cloudcommon/proxy"
"yunion.io/x/onecloud/pkg/httperrors"
)
type CloudenvResourceInfo struct {
// 云平台名称
// example: Google
Provider string `json:"provider,omitempty"`
// 云平台品牌
// example: Google
Brand string `json:"brand,omitempty"`
// 云环境
// example: public
CloudEnv string `json:"cloud_env,omitempty"`
// Environment
Environment string `json:"environment,omitempty"`
}
type CloudenvResourceListInput struct {
// 列出指定云平台的资源,支持的云平台如下
//
// | Provider | 开始支持版本 | 平台 |
// |-----------|------------|-------------------------------------|
// | OneCloud | 0.0 | OneCloud内置私有云包括KVM和裸金属管理 |
// | VMware | 1.2 | VMware vCenter |
// | OpenStack | 2.6 | OpenStack M版本以上私有云 |
// | ZStack | 2.10 | ZStack私有云 |
// | Aliyun | 2.0 | 阿里云 |
// | Aws | 2.3 | Amazon AWS |
// | Azure | 2.2 | Microsoft Azure |
// | Google | 2.13 | Google Cloud Platform |
// | Qcloud | 2.3 | 腾讯云 |
// | Huawei | 2.5 | 华为公有云 |
// | Ucloud | 2.7 | UCLOUD |
// | Ctyun | 2.13 | 天翼云 |
// | S3 | 2.11 | 通用s3对象存储 |
// | Ceph | 2.11 | Ceph对象存储 |
// | Xsky | 2.11 | XSKY启明星辰Ceph对象存储 |
//
// enum: OneCloud,VMware,Aliyun,Qcloud,Azure,Aws,Huawei,OpenStack,Ucloud,ZStack,Google,Ctyun,S3,Ceph,Xsky"
Providers []string `json:"providers"`
// swagger:ignore
// Deprecated
Provider []string `json:"provider" yunion-deprecated-by:"providers"`
// 列出指定云平台品牌的资源一般来说brand和provider相同除了以上支持的provider之外还支持以下band
//
// | Brand | Provider | 说明 |
// |----------|----------|------------|
// | DStack | ZStack | 滴滴云私有云 |
//
Brands []string `json:"brands"`
// swagger:ignore
// Deprecated
Brand []string `json:"brand" yunion-deprecated-by:"brands"`
// 列出指定云环境的资源,支持云环境如下:
//
// | CloudEnv | 说明 |
// |-----------|--------|
// | public | 公有云 |
// | private | 私有云 |
// | onpremise | 本地IDC |
//
// enum: public,private,onpremise
CloudEnv string `json:"cloud_env"`
// swagger:ignore
// Deprecated
// description: this param will be deprecate at 3.0
PublicCloud *bool `json:"public_cloud"`
// swagger:ignore
// Deprecated
// description: this param will be deprecate at 3.0
IsPublic *bool `json:"is_public"`
// swagger:ignore
// Deprecated
// description: this param will be deprecate at 3.0
PrivateCloud *bool `json:"private_cloud"`
// swagger:ignore
// Deprecated
// description: this param will be deprecate at 3.0
IsPrivate *bool `json:"is_private"`
// swagger:ignore
// Deprecated
// description: this param will be deprecate at 3.0
IsOnPremise *bool `json:"is_on_premise"`
// 以平台名称排序
// pattern:asc|desc
OrderByProvider string `json:"order_by_provider"`
// 以平台品牌排序
// pattern:asc|desc
OrderByBrand string `json:"order_by_brand"`
}
type CloudaccountResourceInfo struct {
CloudenvResourceInfo
// 云账号名称
// example: google-account
Account string `json:"account,omitempty"`
// 云账号状态
AccountStatus string `json:"account_status,omitempty"`
// 云账号监控状态
AccountHealthStatus string `json:"account_health_status,omitempty"`
AccountReadOnly bool `json:"account_read_only,omitempty"`
}
type CloudaccountCreateInput struct {
apis.EnabledStatusInfrasResourceBaseCreateInput
// 指定云平台
// Qcloud: 腾讯云
// Ctyun: 天翼云
// enum: VMware, Aliyun, Qcloud, Azure, Aws, Huawei, OpenStack, Ucloud, ZStack, Google, Ctyun, JDcloud
Provider string `json:"provider"`
// swagger:ignore
AccountId string
// 跳过重复账号注册检查
SkipDuplicateAccountCheck bool
// 指定云平台品牌, 此参数默认和provider相同
// requried: false
//
//
//
// | provider | 支持的参数 |
// | -------- | ---------- |
// | VMware | VMware |
// | Aliyun | Aliyun |
// | Qcloud | Qcloud |
// | Azure | Azure |
// | Aws | Aws |
// | Huawei | Huawei |
// | OpenStack | OpenStack |
// | Ucloud | Ucloud |
// | ZStack | ZStack, DStack |
// | Google | Google |
// | Ctyun | Ctyun |
Brand string `json:"brand"`
// swagger:ignore
IsPublicCloud bool
// swagger:ignore
IsOnPremise bool
// 指定云账号所属的项目
// Tenant string `json:"tenant"`
// swagger:ignore
// TenantId string
apis.ProjectizedResourceInput
// 自动根据云上项目或订阅创建本地项目, OpenStack此参数为true
// default: false
AutoCreateProject *bool `json:"auto_create_project"`
// 额外信息,例如账单的access key
Options *jsonutils.JSONDict `json:"options"`
proxyapi.ProxySettingResourceInput
cloudprovider.SCloudaccount
cloudprovider.SCloudaccountCredential
// 是否启用SAML认证
// default: false
SAMLAuth *bool `json:"saml_auth"`
// VMware 账号有zone属性
Zone string `json:"zone"`
// 仅当show_sub_accounts=true并且dry_run=true时才返回sub accounts 信息, 且不会创建云账号
ShowSubAccounts bool `json:"show_sub_accounts"`
// swagger:ignore
SubAccounts *cloudprovider.SubAccounts
ReadOnly bool `json:"read_only"`
SProjectMappingResourceInput
// 是否立即开始同步资源
StartSync *bool `json:"start_sync"`
// 跳过指定资源同步
SkipSyncResources SkipSyncResources `json:"skip_sync_resources"`
// 货币类型
// enmu: CNY, USD
Currency string `json:"currency"`
EnableAutoSyncResource *bool `json:"enable_auto_sync_resource"`
}
type SProjectMappingResourceInput struct {
ProjectMappingId string `json:"project_mapping_id"`
EnableProjectSync bool `json:"enable_project_sync"`
EnableResourceSync bool `json:"enable_resource_sync"`
}
type CloudaccountShareModeInput struct {
apis.Meta
ShareMode string
}
func (i CloudaccountShareModeInput) Validate() error {
if len(i.ShareMode) == 0 {
return httperrors.NewMissingParameterError("share_mode")
}
if !utils.IsInStringArray(i.ShareMode, CLOUD_ACCOUNT_SHARE_MODES) {
return httperrors.NewInputParameterError("invalid share_mode %s", i.ShareMode)
}
return nil
}
type CloudaccountListInput struct {
apis.EnabledStatusInfrasResourceBaseListInput
ManagedResourceListInput
CapabilityListInput
SyncableBaseResourceListInput
// 账号健康状态
HealthStatus []string `json:"health_status"`
ReadOnly *bool `json:"read_only"`
// 共享模式
ShareMode []string `json:"share_mode"`
// 代理
ProxySetting string `json:"proxy_setting"`
// swagger:ignore
ProxySettingId string `json:"proxy_setting_id" yunion-deprecated-by:"proxy_setting"`
// 按宿主机数量排序
// pattern:asc|desc
OrderByHostCount string `json:"order_by_host_count"`
// 按虚拟机数量排序
// pattern:asc|desc
OrderByGuestCount string `json:"order_by_guest_count"`
}
type ProviderProject struct {
// 子订阅项目名称
// example: system
Tenant string `json:"tenant"`
// 子订阅项目Id
// 9a48383a-467a-4542-8b50-4e15b0a8715f
TenantId string `json:"tenant_id"`
}
type SAccountUsage struct {
// 弹性公网Ip数量
// example: 2
EipCount int `json:"eip_count,allowempty"`
// 虚拟私有网络数量
// example: 4
VpcCount int `json:"vpc_count,allowempty"`
// 云盘数量
// example: 12
DiskCount int `json:"disk_count,allowempty"`
// 宿主机数量(不计算虚拟机宿主机数量)
// example: 0
HostCount int `json:"host_count,allowempty"`
// 云主机数量
// example: 4
GuestCount int `json:"guest_count,allowempty"`
// 块存储数量
// example: 12
StorageCount int `json:"storage_count,allowempty"`
// 子订阅数量
// example: 1
ProviderCount int `json:"provider_count,allowempty"`
// 启用的子订阅数量
// example: 1
EnabledProviderCount int `json:"enabled_provider_count,allowempty"`
// 路由表数量
// example: 0
RoutetableCount int `json:"routetable_count,allowempty"`
// 存储缓存数量
// example: 10
StoragecacheCount int `json:"storagecache_count,allowempty"`
// 并发同步数量
SyncCount int `json:"sync_count,allowempty"`
}
type CloudaccountDetail struct {
apis.EnabledStatusInfrasResourceBaseDetails
SCloudaccount
// 同步时间间隔
// example: 3600
SyncIntervalSeconds int `json:"sync_interval_seconds"`
// 同步状态
SyncStatus2 string `json:"sync_stauts2"`
// 云账号环境类型
// public: 公有云
// private: 私有云
// onpremise: 本地IDC
// example: public
CloudEnv string `json:"cloud_env"`
apis.ProjectizedResourceInfo
SAccountUsage
ProxySetting proxyapi.SProxySetting `json:"proxy_setting"`
ProjectMappingResourceInfo
// 上次同步耗时
LastSyncCost string
}
func (self CloudaccountDetail) GetMetricTags() map[string]string {
ret := map[string]string{
"id": self.Id,
"cloudaccount_id": self.Id,
"cloudaccount_name": self.Name,
"brand": self.Brand,
"domain_id": self.DomainId,
"project_domain": self.ProjectDomain,
"currency": self.Currency,
}
return AppendMetricTags(ret, self.MetadataResourceInfo, self.ProjectizedResourceInfo)
}
func (self CloudaccountDetail) GetMetricPairs() map[string]string {
ret := map[string]string{
"balance": fmt.Sprintf("%.2f", self.Balance),
}
return ret
}
type CloudaccountUpdateInput struct {
apis.EnabledStatusInfrasResourceBaseUpdateInput
// 待更新的options key/value
Options *jsonutils.JSONDict `json:"options"`
// 带删除的options key
RemoveOptions []string `json:"remove_options"`
SAMLAuth *bool `json:"saml_auth"`
proxyapi.ProxySettingResourceInput
// 临时清除缺失的权限提示,云账号权限缺失依然会自动刷新
CleanLakeOfPermissions bool `json:"clean_lake_of_permissions"`
SkipSyncResources *SkipSyncResources `json:"skip_sync_resources"`
AddSkipSyncResources []string `json:"add_skip_sync_resources"`
RemoveSkipSyncResources []string `json:"remove_skip_sync_resources"`
ReadOnly bool `json:"read_only"`
Currency string `json:"currency"`
EnableAutoSyncResource *bool `json:"enable_auto_sync_resource"`
}
type CloudaccountPerformPublicInput struct {
apis.PerformPublicDomainInput
// 共享模式可能值为provider_domain, system
// example: provider_domain
ShareMode string `json:"share_mode"`
}
type CloudaccountPerformPrepareNetsInput struct {
CloudaccountCreateInput
WireLevelForVmware string `json:"wire_level_for_vmware"`
Dvs bool `json:"dvs"`
}
type CloudaccountPerformPrepareNetsOutput struct {
CAWireNets []CAWireNet `json:"wire_networks"`
Hosts []CAGuestNet `json:"hosts"`
// Guests []CAGuestNet `json:"guests"`
Wires []CAPWire `json:"wires"`
VSwitchs []VSwitch `json:"vswitchs"`
}
type CloudaccountSyncVMwareNetworkInput struct {
Zone string `help:"zone Id or Name" json:"zone"`
}
type CAPWire struct {
Id string `json:"id"`
Name string `json:"name"`
Distributed bool `json:"distributed"`
Hosts []SimpleHost `json:"hosts"`
HostNetworks []CANetConf `json:"host_networks"`
GuestNetworks []CANetConf `json:"guest_networks"`
}
type VSwitch struct {
Id string `json:"id"`
Name string `json:"name"`
Distributed bool `json:"distributed"`
Hosts []SimpleHost `json:"hosts"`
HostNetworks []CANetConf `json:"host_networks"`
GuestNetworks []CANetConf `json:"guest_networks"`
}
type SimpleHost struct {
Id string
Name string
}
type CAWireNet struct {
SuggestedWire CAWireConf `json:"suggested_wire"`
SuitableWire string `json:"suitable_wire,allowempty"`
Hosts []CAHostNet `json:"hosts"`
// description: 没有合适的已有网络,推荐的网络配置
HostSuggestedNetworks []CANetConf `json:"host_suggested_networks"`
// Guests []CAGuestNet `json:"guests"`
// description: 没有合适的已有网络,推荐的网络配置
// GuestSuggestedNetworks []CANetConf `json:"guest_suggested_networks"`
}
type CAWireConf struct {
// Zoneids to be selected
ZoneIds []string `json:"zone_ids"`
// description: wire name
Name string `json:"name"`
// description: wire description
Description string `json:"description"`
}
type CAHostNet struct {
// description: Host 的 Name
Name string `json:"name"`
// description: IP
IP string `json:"ip"`
// description: 合适的已有网络
SuitableNetwork string `json:"suitable_network,allowempty"`
}
type CAGuestNet struct {
// description: Host 的 Name
Name string `json:"name"`
IPNets []CAIPNet `json:"ip_nets"`
}
type CAIPNet struct {
// description: IP
IP string `json:"ip"`
VlanID int32 `json:"vlan_id"`
// description: 合适的已有网络
SuitableNetwork string `json:"suitable_network,allowempty"`
}
type CASimpleNetConf struct {
GuestIpStart string `json:"guest_ip_start"`
GuestIpEnd string `json:"guest_ip_end"`
GuestIpMask int8 `json:"guest_ip_mask"`
GuestGateway string `json:"guest_gateway"`
VlanID int32 `json:"vlan_id"`
}
type CANetConf struct {
Name string `json:"name"`
Description string `json:"description"`
CASimpleNetConf
}
type SubscriptonCreateInput struct {
// EA 账号id, 可通过 cloud-account-enrollment-accounts接口获取里面的id字段
EnrollmentAccountId string `json:"enrollment_account_id"`
// 订阅名称
Name string `json:"name"`
// 可选值: MS-AZR-0017P(生产用途), MS-AZR-0148P(开发测试)
OfferType string `json:"offer_type"`
}
type EnrollmentAccountQuery struct {
}
type CloudaccountSyncSkusInput struct {
Resource string
Force bool
CloudregionResourceInput
CloudproviderResourceInput
}
type CloudaccountProjectMappingInput struct {
AutoCreateProject bool `json:"auto_create_project"`
AutoCreateProjectForProvider bool `json:"auto_create_project_for_provider"`
ProjectId string `json:"project_id"`
// 同步策略Id, 若不传此参数则解绑
// 绑定同步策略要求当前云账号此刻未绑定其他同步策略
ProjectMappingId string `json:"project_mapping_id"`
EnableProjectSync *bool `json:"enable_project_sync"`
EnableResourceSync *bool `json:"enable_resource_sync"`
}
type SyncRangeInput struct {
Force bool `json:"force"`
FullSync bool `json:"full_sync"`
DeepSync bool `json:"deep_sync"`
// 极速模式(差量更新)
Xor bool `json:"xor"`
Region []string `json:"region"`
Zone []string `json:"zone"`
Host []string `json:"host"`
// swagger: ignore
SkipSyncResources []string `json:"skip_sync_resources"`
// 按资源类型同步,可输入多个
// enmu: project, compute, network, eip, loadbalancer, objectstore, rds, cache, event, cloudid, dnszone, public_ip, intervpcnetwork, saml_auth, quota, nat, nas, waf, mongodb, es, kafka, app, cdn, container, ipv6_gateway, tablestore, modelarts, vpcpeer, misc
Resources []string `json:"resources" choices:"project|compute|network|eip|loadbalancer|objectstore|rds|cache|event|cloudid|dnszone|public_ip|intervpcnetwork|saml_auth|quota|nat|nas|waf|mongodb|es|kafka|app|cdn|container|ipv6_gateway|tablestore|modelarts|vpcpeer|misc"`
}
type iRes interface {
Keyword() string
}
func (self *SyncRangeInput) IsNotSkipSyncResource(res iRes) bool {
return !utils.IsInStringArray(res.Keyword(), self.SkipSyncResources)
}
type SAccountPermission struct {
Permissions []string
}
type SkipSyncResources []string
func (s SkipSyncResources) String() string {
return jsonutils.Marshal(s).String()
}
func (s *SkipSyncResources) Add(res string) {
if !utils.IsInStringArray(res, *s) {
*s = append(*s, res)
}
}
func (s *SkipSyncResources) Remove(res string) {
ret := []string{}
for _, r := range *s {
if r != res {
ret = append(ret, r)
}
}
*s = ret
}
func (s SkipSyncResources) IsZero() bool {
return len(s) == 0
}
type SAccountPermissions map[string]SAccountPermission
func (s SAccountPermissions) String() string {
return jsonutils.Marshal(s).String()
}
func (s SAccountPermissions) IsZero() bool {
return len(s) == 0
}
func init() {
gotypes.RegisterSerializable(reflect.TypeOf(&SAccountPermissions{}), func() gotypes.ISerializable {
return &SAccountPermissions{}
})
gotypes.RegisterSerializable(reflect.TypeOf(&SkipSyncResources{}), func() gotypes.ISerializable {
return &SkipSyncResources{}
})
}