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:
邱剑
2018-09-27 17:38:21 +08:00
19 changed files with 136 additions and 51 deletions
+1
View File
@@ -13,6 +13,7 @@ type ICloudProviderFactory interface {
}
type ICloudProvider interface {
GetSubAccounts() (jsonutils.JSONObject, error)
GetId() string
GetName() string
GetIRegions() []ICloudRegion
+17
View File
@@ -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
View File
@@ -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
}
+4
View File
@@ -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
View File
@@ -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(&region, 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(&region, location); err != nil {
return err
}
region.client = self
self.iregions[i] = &region
}
region.client = self
self.iregions[i] = &region
}
}
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
}
+1
View File
@@ -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 {
+1
View File
@@ -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 {
+2 -1
View File
@@ -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)
+2
View File
@@ -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 {
+1 -1
View File
@@ -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 {
+1
View File
@@ -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 {
+1
View File
@@ -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 {
+4
View File
@@ -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()
}
+1
View File
@@ -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 {
+3
View File
@@ -205,6 +205,7 @@ func (region *SRegion) CreateSecurityGroup(secName string) (*SSecurityGroup, err
Location: &region.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 {
+19
View File
@@ -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
}
})
}
+1
View File
@@ -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 {
+1
View File
@@ -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 {
+4
View File
@@ -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
}