From 6ec1ff09ad6aa7fcbcab5311104b42a4b82189d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Mon, 18 Jul 2022 23:03:15 +0800 Subject: [PATCH] fix(cloudid): huawei saml provider (#14664) --- pkg/multicloud/huawei/saml_provider.go | 35 +++++++++++++++----- pkg/multicloud/huawei/shell/saml_provider.go | 25 ++++++++++++++ 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/pkg/multicloud/huawei/saml_provider.go b/pkg/multicloud/huawei/saml_provider.go index 7e04b3204c..69211fa1e4 100644 --- a/pkg/multicloud/huawei/saml_provider.go +++ b/pkg/multicloud/huawei/saml_provider.go @@ -218,19 +218,38 @@ func (self *SHuaweiClient) CreateSAMLProvider(opts *cloudprovider.SAMLProviderCr name = append(name, '-') } } - opts.Name = string(name) - _, err = client.SAMLProviders.Update(opts.Name, params) - if err != nil { - if he, ok := err.(*modules.HuaweiClientError); ok && he.Code != 409 { - return nil, errors.Wrapf(err, "SAMLProviders.Update") + samlName := string(name) + err = func() error { + idx := 1 + for { + _, err = client.SAMLProviders.Update(samlName, params) + if err == nil { + return nil + } + he, ok := err.(*modules.HuaweiClientError) + if !ok { + return errors.Wrapf(err, "SAMLProviders.Update") + } + if he.Code != 409 { + return errors.Wrapf(err, "SAMLProviders.Update") + } + samlName = fmt.Sprintf("%s-%d", string(name), idx) + idx++ + if idx >= 40 { + break + } } + return err + }() + if err != nil { + return nil, errors.Wrapf(err, "saml provider create") } - ret := SAMLProvider{client: self, Id: opts.Name} - err = self.UpdateSAMLProviderMetadata(opts.Name, opts.Metadata.String()) + ret := SAMLProvider{client: self, Id: samlName} + err = self.UpdateSAMLProviderMetadata(samlName, opts.Metadata.String()) if err != nil { return nil, errors.Wrapf(err, "resp.Unmarshal") } - err = self.InitSAMLProviderMapping(opts.Name) + err = self.InitSAMLProviderMapping(samlName) if err != nil { return nil, errors.Wrapf(err, "InitSAMLProviderMapping") } diff --git a/pkg/multicloud/huawei/shell/saml_provider.go b/pkg/multicloud/huawei/shell/saml_provider.go index 3d0190c82c..f8cac29493 100644 --- a/pkg/multicloud/huawei/shell/saml_provider.go +++ b/pkg/multicloud/huawei/shell/saml_provider.go @@ -15,7 +15,9 @@ package shell import ( + "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/multicloud/huawei" + "yunion.io/x/onecloud/pkg/util/samlutils" "yunion.io/x/onecloud/pkg/util/shellutils" ) @@ -31,6 +33,29 @@ func init() { return nil }) + type SAMLProviderCreateOptions struct { + NAME string + Metadata string + } + shellutils.R(&SAMLProviderCreateOptions{}, "saml-provider-create", "Create saml provider", func(cli *huawei.SRegion, args *SAMLProviderCreateOptions) error { + opts := cloudprovider.SAMLProviderCreateOptions{ + Name: args.NAME, + } + if len(args.Metadata) > 0 { + var err error + opts.Metadata, err = samlutils.ParseMetadata([]byte(args.Metadata)) + if err != nil { + return err + } + } + result, err := cli.GetClient().CreateSAMLProvider(&opts) + if err != nil { + return err + } + printObject(result) + return nil + }) + type SAMLProviderIdOptions struct { ID string }