mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-01 15:07:17 +08:00
Merge pull request #249 in YUNIONIO/onecloud from ~QUXUAN/onecloud:hotfix/qx-azure to release/2.2.0
* commit '072c4b8a1f741094b0040f2ed242933779ed23b1': 全量同步时默认不创建默认resourcegroup,延迟到创建资源时创建
This commit is contained in:
@@ -13,6 +13,7 @@ type ICloudProviderFactory interface {
|
||||
}
|
||||
|
||||
type ICloudProvider interface {
|
||||
GetSubAccounts() (jsonutils.JSONObject, error)
|
||||
GetId() string
|
||||
GetName() string
|
||||
GetIRegions() []ICloudRegion
|
||||
|
||||
@@ -369,6 +369,23 @@ func (self *SCloudprovider) GetDriver() (cloudprovider.ICloudProvider, error) {
|
||||
return cloudprovider.GetProvider(self.Id, self.Name, self.AccessUrl, self.Account, secret, self.Provider)
|
||||
}
|
||||
|
||||
func (manager *SCloudproviderManager) AllowPerformGetSubAccounts(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
|
||||
return userCred.IsSystemAdmin()
|
||||
}
|
||||
|
||||
func (manager *SCloudproviderManager) PerformGetSubAccounts(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
name, _ := data.GetString("name")
|
||||
accessUrl, _ := data.GetString("access_url")
|
||||
account, _ := data.GetString("account")
|
||||
secret, _ := data.GetString("secret")
|
||||
_provider, _ := data.GetString("provider")
|
||||
if provider, err := cloudprovider.GetProvider("", name, accessUrl, account, secret, _provider); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return provider.GetSubAccounts()
|
||||
}
|
||||
}
|
||||
|
||||
func (self *SCloudprovider) SaveSysInfo(info jsonutils.JSONObject) {
|
||||
self.GetModelManager().TableSpec().Update(self, func() error {
|
||||
self.Sysinfo = info
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
|
||||
|
||||
"time"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/onecloud/pkg/cloudprovider"
|
||||
@@ -131,6 +132,10 @@ func (self *SAliyunClient) GetRegions() []SRegion {
|
||||
return regions
|
||||
}
|
||||
|
||||
func (self *SAliyunClient) GetSubAccounts() (jsonutils.JSONObject, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (self *SAliyunClient) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.iregions
|
||||
}
|
||||
|
||||
@@ -71,6 +71,10 @@ func (self *SAliyunProvider) GetSysInfo() (jsonutils.JSONObject, error) {
|
||||
return info, nil
|
||||
}
|
||||
|
||||
func (self *SAliyunProvider) GetSubAccounts() (jsonutils.JSONObject, error) {
|
||||
return self.client.GetSubAccounts()
|
||||
}
|
||||
|
||||
func (self *SAliyunProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.client.GetIRegions()
|
||||
}
|
||||
|
||||
+67
-49
@@ -26,25 +26,29 @@ const (
|
||||
)
|
||||
|
||||
type SAzureClient struct {
|
||||
providerId string
|
||||
providerName string
|
||||
subscriptionId string
|
||||
tenantId string
|
||||
clientId string
|
||||
clientScret string
|
||||
baseUrl string
|
||||
secret string
|
||||
envName string
|
||||
env azureenv.Environment
|
||||
authorizer autorest.Authorizer
|
||||
iregions []cloudprovider.ICloudRegion
|
||||
providerId string
|
||||
providerName string
|
||||
subscriptionId string
|
||||
tenantId string
|
||||
clientId string
|
||||
clientScret string
|
||||
baseUrl string
|
||||
secret string
|
||||
envName string
|
||||
subscriptionName string
|
||||
env azureenv.Environment
|
||||
authorizer autorest.Authorizer
|
||||
iregions []cloudprovider.ICloudRegion
|
||||
}
|
||||
|
||||
func NewAzureClient(providerId string, providerName string, accessKey string, secret string, envName string) (*SAzureClient, error) {
|
||||
if clientInfo, accountInfo := strings.Split(secret, "/"), strings.Split(accessKey, "/"); len(clientInfo) == 2 && len(accountInfo) == 2 {
|
||||
if clientInfo, accountInfo := strings.Split(secret, "/"), strings.Split(accessKey, "/"); len(clientInfo) >= 2 && len(accountInfo) >= 1 {
|
||||
client := SAzureClient{providerId: providerId, providerName: providerName, secret: secret, envName: envName}
|
||||
client.clientId, client.clientScret = clientInfo[0], clientInfo[1]
|
||||
client.tenantId, client.subscriptionId = accountInfo[0], accountInfo[1]
|
||||
client.clientId, client.clientScret = clientInfo[0], strings.Join(clientInfo[1:], "/")
|
||||
client.tenantId = accountInfo[0]
|
||||
if len(accountInfo) == 2 {
|
||||
client.subscriptionId = accountInfo[1]
|
||||
}
|
||||
if env, err := azureenv.EnvironmentFromName(envName); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
@@ -55,8 +59,6 @@ func NewAzureClient(providerId string, providerName string, accessKey string, se
|
||||
return nil, err
|
||||
} else if err := client.fetchRegions(); err != nil {
|
||||
return nil, err
|
||||
} else if err := client.fetchAzueResourceGroup(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &client, nil
|
||||
} else {
|
||||
@@ -64,20 +66,6 @@ func NewAzureClient(providerId string, providerName string, accessKey string, se
|
||||
}
|
||||
}
|
||||
|
||||
func (self *SAzureClient) fetchAzueResourceGroup() error {
|
||||
if _region, err := self.getDefaultRegion(); err != nil {
|
||||
return err
|
||||
} else {
|
||||
region := _region.(*SRegion)
|
||||
for _, value := range defaultResourceGroups {
|
||||
if _, err := region.CreateResourceGroup(value); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *SAzureClient) fetchAzureInof() error {
|
||||
conf := auth.NewClientCredentialsConfig(self.clientId, self.clientScret, self.tenantId)
|
||||
conf.Resource = self.env.ResourceManagerEndpoint
|
||||
@@ -87,6 +75,15 @@ func (self *SAzureClient) fetchAzureInof() error {
|
||||
} else {
|
||||
self.authorizer = authorizer
|
||||
}
|
||||
if len(self.subscriptionId) > 0 {
|
||||
subClient := subscription.NewSubscriptionsClientWithBaseURI(self.baseUrl)
|
||||
subClient.Authorizer = self.authorizer
|
||||
if resp, err := subClient.Get(context.Background(), self.subscriptionId); err != nil {
|
||||
return err
|
||||
} else {
|
||||
self.subscriptionName = *resp.DisplayName
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -98,9 +95,12 @@ func (self *SAzureClient) UpdateAccount(tenantId, secret, envName string) error
|
||||
self.env = env
|
||||
self.baseUrl = env.ResourceManagerEndpoint
|
||||
}
|
||||
if clientInfo, accountInfo := strings.Split(secret, "/"), strings.Split(tenantId, "/"); len(clientInfo) == 2 && len(accountInfo) == 2 {
|
||||
self.clientId, self.clientScret = clientInfo[0], clientInfo[1]
|
||||
self.tenantId, self.subscriptionId = accountInfo[0], accountInfo[1]
|
||||
if clientInfo, accountInfo := strings.Split(secret, "/"), strings.Split(tenantId, "/"); len(clientInfo) >= 2 && len(accountInfo) >= 1 {
|
||||
self.clientId, self.clientScret = clientInfo[0], strings.Join(clientInfo[1:], "/")
|
||||
self.tenantId = accountInfo[0]
|
||||
if len(accountInfo) == 2 {
|
||||
self.subscriptionId = accountInfo[1]
|
||||
}
|
||||
conf := auth.NewClientCredentialsConfig(self.clientId, self.clientScret, self.tenantId)
|
||||
conf.Resource = self.env.ResourceManagerEndpoint
|
||||
conf.AADEndpoint = self.env.ActiveDirectoryEndpoint
|
||||
@@ -113,8 +113,6 @@ func (self *SAzureClient) UpdateAccount(tenantId, secret, envName string) error
|
||||
return err
|
||||
} else if err := self.fetchRegions(); err != nil {
|
||||
return err
|
||||
} else if err := self.fetchAzueResourceGroup(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
} else {
|
||||
@@ -125,20 +123,22 @@ func (self *SAzureClient) UpdateAccount(tenantId, secret, envName string) error
|
||||
}
|
||||
|
||||
func (self *SAzureClient) fetchRegions() error {
|
||||
locationClient := subscription.NewSubscriptionsClientWithBaseURI(self.baseUrl)
|
||||
locationClient.Authorizer = self.authorizer
|
||||
if locationList, err := locationClient.ListLocations(context.Background(), self.subscriptionId); err != nil {
|
||||
return err
|
||||
} else {
|
||||
regions := make([]SRegion, len(*locationList.Value))
|
||||
self.iregions = make([]cloudprovider.ICloudRegion, len(regions))
|
||||
for i, location := range *locationList.Value {
|
||||
region := SRegion{SubscriptionID: self.subscriptionId}
|
||||
if err := jsonutils.Update(®ion, location); err != nil {
|
||||
return err
|
||||
if len(self.subscriptionId) > 0 {
|
||||
locationClient := subscription.NewSubscriptionsClientWithBaseURI(self.baseUrl)
|
||||
locationClient.Authorizer = self.authorizer
|
||||
if locationList, err := locationClient.ListLocations(context.Background(), self.subscriptionId); err != nil {
|
||||
return err
|
||||
} else {
|
||||
regions := make([]SRegion, len(*locationList.Value))
|
||||
self.iregions = make([]cloudprovider.ICloudRegion, len(regions))
|
||||
for i, location := range *locationList.Value {
|
||||
region := SRegion{SubscriptionID: self.subscriptionId}
|
||||
if err := jsonutils.Update(®ion, location); err != nil {
|
||||
return err
|
||||
}
|
||||
region.client = self
|
||||
self.iregions[i] = ®ion
|
||||
}
|
||||
region.client = self
|
||||
self.iregions[i] = ®ion
|
||||
}
|
||||
}
|
||||
return nil
|
||||
@@ -153,6 +153,24 @@ func (self *SAzureClient) GetRegions() []SRegion {
|
||||
return regions
|
||||
}
|
||||
|
||||
func (self *SAzureClient) GetSubAccounts() (jsonutils.JSONObject, error) {
|
||||
subClient := subscription.NewSubscriptionsClientWithBaseURI(self.baseUrl)
|
||||
subClient.Authorizer = self.authorizer
|
||||
result := jsonutils.NewArray()
|
||||
if resp, err := subClient.List(context.Background()); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
for _, value := range resp.Values() {
|
||||
data := jsonutils.NewDict()
|
||||
data.Add(jsonutils.NewString(*value.SubscriptionID), "subscriptionId")
|
||||
data.Add(jsonutils.NewString(string(value.State)), "state")
|
||||
data.Add(jsonutils.NewString(*value.DisplayName), "displayName")
|
||||
result.Add(data)
|
||||
}
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (self *SAzureClient) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.iregions
|
||||
}
|
||||
|
||||
@@ -91,6 +91,7 @@ func (self *SRegion) createDisk(storageType string, name string, sizeGb int32, d
|
||||
disk := compute.Disk{Name: &name, Location: &self.Name, DiskProperties: &properties, Sku: &sku}
|
||||
diskId, resourceGroup, diskName := pareResourceGroupWithName(name, DISK_RESOURCE)
|
||||
//log.Debugf("Create disk: %s", jsonutils.Marshal(disk).PrettyString())
|
||||
self.CreateResourceGroup(resourceGroup)
|
||||
if result, err := computeClient.CreateOrUpdate(context.Background(), resourceGroup, diskName, disk); err != nil {
|
||||
return "", err
|
||||
} else if err := result.WaitForCompletion(context.Background(), computeClient.Client); err != nil {
|
||||
|
||||
@@ -60,6 +60,7 @@ func (region *SRegion) AllocateEIP(eipName string) (*SEipAddress, error) {
|
||||
PublicIPAddressVersion: network.IPv4,
|
||||
},
|
||||
}
|
||||
region.CreateResourceGroup(resourceGroup)
|
||||
if result, err := networkClient.CreateOrUpdate(context.Background(), resourceGroup, eipName, params); err != nil {
|
||||
return nil, err
|
||||
} else if err := result.WaitForCompletion(context.Background(), networkClient.Client); err != nil {
|
||||
|
||||
@@ -29,7 +29,7 @@ func (self *SHost) GetId() string {
|
||||
}
|
||||
|
||||
func (self *SHost) GetName() string {
|
||||
return fmt.Sprintf("%s-%s", self.zone.region.client.providerName, self.zone.region.Name)
|
||||
return fmt.Sprintf("%s(%s)", self.zone.region.client.subscriptionId, self.zone.region.client.subscriptionName)
|
||||
}
|
||||
|
||||
func (self *SHost) GetGlobalId() string {
|
||||
@@ -156,6 +156,7 @@ func (self *SHost) _createVM(name string, imgId string, sysDiskSize int, cpu int
|
||||
params.HardwareProfile.VMSize = compute.VirtualMachineSizeTypes(profile)
|
||||
log.Debugf("Try HardwareProfile : %s", profile)
|
||||
instanceId, resourceGroup, instanceName := pareResourceGroupWithName(name, INSTANCE_RESOURCE)
|
||||
self.zone.region.CreateResourceGroup(resourceGroup)
|
||||
result, err := computeClient.CreateOrUpdate(context.Background(), resourceGroup, instanceName, params)
|
||||
if err != nil {
|
||||
log.Errorf("Failed for %s: %s", profile, err)
|
||||
|
||||
@@ -166,6 +166,7 @@ func (self *SRegion) CreateImageByBlob(imageName, osType, blobURI string, diskSi
|
||||
},
|
||||
}
|
||||
_, resourceGroup, imageName := pareResourceGroupWithName(imageName, IMAGE_RESOURCE)
|
||||
self.CreateResourceGroup(resourceGroup)
|
||||
if result, err := imageClient.CreateOrUpdate(context.Background(), resourceGroup, imageName, params); err != nil {
|
||||
log.Errorf("Create image from blob error: %v", err)
|
||||
return nil, err
|
||||
@@ -202,6 +203,7 @@ func (self *SRegion) CreateImage(snapshotId, imageName, osType, imageDesc string
|
||||
StorageProfile: &storageProfile,
|
||||
},
|
||||
}
|
||||
self.CreateResourceGroup(resourceGroup)
|
||||
if resutl, err := imageClient.CreateOrUpdate(context.Background(), resourceGroup, imageName, params); err != nil {
|
||||
return nil, err
|
||||
} else if err := resutl.WaitForCompletion(context.Background(), imageClient.Client); err != nil {
|
||||
|
||||
@@ -495,7 +495,7 @@ func (region *SRegion) resetLoginInfo(instanceId string, setting map[string]stri
|
||||
ProtectedSettings: setting,
|
||||
},
|
||||
}
|
||||
|
||||
region.CreateResourceGroup(resourceGroup)
|
||||
if result, err := extensionClient.CreateOrUpdate(context.Background(), resourceGroup, instanceName, DEFAULT_EXTENSION_NAME, params); err != nil {
|
||||
return err
|
||||
} else if err := result.WaitForCompletion(context.Background(), extensionClient.Client); err != nil {
|
||||
|
||||
@@ -106,6 +106,7 @@ func (self *SInstanceNic) updateSecurityGroup(secgroupId string) error {
|
||||
if len(secgroupId) > 0 {
|
||||
params.InterfacePropertiesFormat.NetworkSecurityGroup.ID = &secgroupId
|
||||
}
|
||||
region.CreateResourceGroup(resourceGroup)
|
||||
if result, err := nicClient.CreateOrUpdate(context.Background(), resourceGroup, nicName, params); err != nil {
|
||||
return err
|
||||
} else if err := result.WaitForCompletion(context.Background(), nicClient.Client); err != nil {
|
||||
|
||||
@@ -70,6 +70,7 @@ func (self *SNetwork) Delete() error {
|
||||
networkClient := network.NewVirtualNetworksClientWithBaseURI(region.client.baseUrl, region.SubscriptionID)
|
||||
networkClient.Authorizer = region.client.authorizer
|
||||
_, resourceGroup, vpcName := pareResourceGroupWithName(vpc.ID, VPC_RESOURCE)
|
||||
region.CreateResourceGroup(resourceGroup)
|
||||
if result, err := networkClient.CreateOrUpdate(context.Background(), resourceGroup, vpcName, params); err != nil {
|
||||
return err
|
||||
} else if err := result.WaitForCompletion(context.Background(), networkClient.Client); err != nil {
|
||||
|
||||
@@ -51,6 +51,10 @@ func (self *SAzureProvider) GetSysInfo() (jsonutils.JSONObject, error) {
|
||||
return info, nil
|
||||
}
|
||||
|
||||
func (self *SAzureProvider) GetSubAccounts() (jsonutils.JSONObject, error) {
|
||||
return self.client.GetSubAccounts()
|
||||
}
|
||||
|
||||
func (self *SAzureProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return self.client.GetIRegions()
|
||||
}
|
||||
|
||||
@@ -137,6 +137,7 @@ func (self *SRegion) CreateIVpc(name string, desc string, cidr string) (cloudpro
|
||||
properties := network.VirtualNetworkPropertiesFormat{AddressSpace: &addressSpace}
|
||||
parameters := network.VirtualNetwork{Name: &name, Location: &self.Name, VirtualNetworkPropertiesFormat: &properties}
|
||||
vpcId, resourceGroup, vpcName := pareResourceGroupWithName(name, VPC_RESOURCE)
|
||||
self.CreateResourceGroup(resourceGroup)
|
||||
if result, err := vpcClient.CreateOrUpdate(context.Background(), resourceGroup, vpcName, parameters); err != nil {
|
||||
return nil, err
|
||||
} else if err := result.WaitForCompletion(context.Background(), vpcClient.Client); err != nil {
|
||||
|
||||
@@ -205,6 +205,7 @@ func (region *SRegion) CreateSecurityGroup(secName string) (*SSecurityGroup, err
|
||||
Location: ®ion.Name,
|
||||
Name: &securityName,
|
||||
}
|
||||
region.CreateResourceGroup(resourceGroup)
|
||||
if result, err := secClient.CreateOrUpdate(context.Background(), resourceGroup, securityName, params); err != nil {
|
||||
return nil, err
|
||||
} else if result.WaitForCompletion(context.Background(), secClient.Client); err != nil {
|
||||
@@ -381,6 +382,7 @@ func (region *SRegion) updateSecurityGroupRules(secgroupId string, rules []secru
|
||||
},
|
||||
}
|
||||
//log.Debugf("Update SecurityGroup rules: %s", jsonutils.Marshal(params).PrettyString())
|
||||
region.CreateResourceGroup(resourceGroup)
|
||||
if result, err := secClient.CreateOrUpdate(context.Background(), resourceGroup, secName, params); err != nil {
|
||||
return "", err
|
||||
} else if err := result.WaitForCompletion(context.Background(), secClient.Client); err != nil {
|
||||
@@ -419,6 +421,7 @@ func (region *SRegion) AttachSecurityToInterfaces(secgroupId string, nicIds []st
|
||||
NetworkInterfaces: &networkInterfaces,
|
||||
},
|
||||
}
|
||||
region.CreateResourceGroup(resourceGroup)
|
||||
if result, err := secClient.CreateOrUpdate(context.Background(), resourceGroup, secName, params); err != nil {
|
||||
return err
|
||||
} else if err := result.WaitForCompletion(context.Background(), secClient.Client); err != nil {
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package shell
|
||||
|
||||
import (
|
||||
"yunion.io/x/onecloud/pkg/util/azure"
|
||||
"yunion.io/x/onecloud/pkg/util/shellutils"
|
||||
)
|
||||
|
||||
func init() {
|
||||
type AccountListOptions struct {
|
||||
}
|
||||
shellutils.R(&AccountListOptions{}, "account-list", "List sub account", func(cli *azure.SRegion, args *AccountListOptions) error {
|
||||
if accounts, err := cli.GetClient().GetSubAccounts(); err != nil {
|
||||
return err
|
||||
} else {
|
||||
printObject(accounts)
|
||||
return nil
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -64,6 +64,7 @@ func (self *SRegion) CreateSnapshot(diskId, snapName, desc string) (*SSnapshot,
|
||||
},
|
||||
},
|
||||
}
|
||||
self.CreateResourceGroup(resourceGroup)
|
||||
if result, err := snapClient.CreateOrUpdate(context.Background(), resourceGroup, snapshotName, params); err != nil {
|
||||
return nil, err
|
||||
} else if err := result.WaitForCompletion(context.Background(), snapClient.Client); err != nil {
|
||||
|
||||
@@ -80,6 +80,7 @@ func (self *SRegion) createNetwork(vpc *SVpc, subnetName string, cidr string, de
|
||||
networkClient.Authorizer = self.client.authorizer
|
||||
_, resourceGroup, vpcName := pareResourceGroupWithName(vpc.ID, VPC_RESOURCE)
|
||||
result := SNetwork{}
|
||||
self.CreateResourceGroup(resourceGroup)
|
||||
if resp, err := networkClient.CreateOrUpdate(context.Background(), resourceGroup, vpcName, params); err != nil {
|
||||
return nil, err
|
||||
} else if err := resp.WaitForCompletion(context.Background(), networkClient.Client); err != nil {
|
||||
|
||||
@@ -87,6 +87,10 @@ func (self *SESXiProvider) GetSysInfo() (jsonutils.JSONObject, error) {
|
||||
return self.client.About(), nil
|
||||
}
|
||||
|
||||
func (self *SESXiProvider) GetSubAccounts() (jsonutils.JSONObject, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (self *SESXiProvider) GetIRegions() []cloudprovider.ICloudRegion {
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user