From 2b45e2624352d9dd40a56640d30175e49cea0275 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 10 Apr 2020 00:04:23 +0800 Subject: [PATCH] fix: 1. allow share proxysetting 2. claim proxsetting as domain resources --- cmd/climc/shell/proxysettings.go | 20 ++++++++++++++ pkg/apis/cloudcommon/proxy/proxy.go | 8 ++++++ pkg/apis/compute/cloudaccount.go | 3 +-- pkg/cloudcommon/db/proxy/proxysetting.go | 14 ++++++++++ pkg/compute/models/cloudaccounts.go | 33 ++++++++++++++++++------ pkg/mcclient/options/cloudaccounts.go | 4 ++- pkg/mcclient/options/proxysettings.go | 10 +++++++ 7 files changed, 81 insertions(+), 11 deletions(-) diff --git a/cmd/climc/shell/proxysettings.go b/cmd/climc/shell/proxysettings.go index dbee6aefc3..88c6cf25f5 100644 --- a/cmd/climc/shell/proxysettings.go +++ b/cmd/climc/shell/proxysettings.go @@ -15,6 +15,8 @@ package shell import ( + "yunion.io/x/jsonutils" + "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/modules" "yunion.io/x/onecloud/pkg/mcclient/options" @@ -78,4 +80,22 @@ func init() { printObject(proxysetting) return nil }) + R(&options.ProxySettingPublicOptions{}, "proxysetting-public", "Make proxysetting public", func(s *mcclient.ClientSession, opts *options.ProxySettingPublicOptions) error { + params := jsonutils.Marshal(opts) + result, err := modules.ProxySettings.PerformAction(s, opts.ID, "public", params) + if err != nil { + return err + } + printObject(result) + return nil + }) + R(&options.ProxySettingPrivateOptions{}, "proxysetting-private", "Make proxysetting private", func(s *mcclient.ClientSession, opts *options.ProxySettingPrivateOptions) error { + params := jsonutils.Marshal(opts) + result, err := modules.ProxySettings.PerformAction(s, opts.ID, "private", params) + if err != nil { + return err + } + printObject(result) + return nil + }) } diff --git a/pkg/apis/cloudcommon/proxy/proxy.go b/pkg/apis/cloudcommon/proxy/proxy.go index 2419361316..c29875d7a4 100644 --- a/pkg/apis/cloudcommon/proxy/proxy.go +++ b/pkg/apis/cloudcommon/proxy/proxy.go @@ -40,6 +40,14 @@ func (ps *SProxySetting) IsZero() bool { return false } +type ProxySettingResourceInput struct { + // 代理配置 + ProxySetting string `json:"proxy_setting"` + // Deprecated + // swagger:ignore + ProxySettingId string `json:"proxy_setting_id" deprecated-by:"proxy_setting"` +} + type ProxySettingTestInput struct { HttpProxy string HttpsProxy string diff --git a/pkg/apis/compute/cloudaccount.go b/pkg/apis/compute/cloudaccount.go index 05579df1e3..096b00be67 100644 --- a/pkg/apis/compute/cloudaccount.go +++ b/pkg/apis/compute/cloudaccount.go @@ -80,8 +80,7 @@ type CloudaccountCreateInput struct { // 额外信息,例如账单的access key Options *jsonutils.JSONObject `json:"options"` - // 代理配置 - ProxySettingId string `json:"proxy_setting_id"` + proxyapi.ProxySettingResourceInput cloudprovider.SCloudaccount cloudprovider.SCloudaccountCredential diff --git a/pkg/cloudcommon/db/proxy/proxysetting.go b/pkg/cloudcommon/db/proxy/proxysetting.go index 2dc2195741..632ee4cfda 100644 --- a/pkg/cloudcommon/db/proxy/proxysetting.go +++ b/pkg/cloudcommon/db/proxy/proxysetting.go @@ -12,6 +12,7 @@ import ( "golang.org/x/net/http/httpproxy" "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" proxyapi "yunion.io/x/onecloud/pkg/apis/cloudcommon/proxy" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -203,3 +204,16 @@ var referrersMen []db.IModelManager func RegisterReferrer(man db.IModelManager) { referrersMen = append(referrersMen, man) } + +func ValidateProxySettingResourceInput(userCred mcclient.TokenCredential, input proxyapi.ProxySettingResourceInput) (*SProxySetting, proxyapi.ProxySettingResourceInput, error) { + m, err := ProxySettingManager.FetchByIdOrName(userCred, input.ProxySetting) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return nil, input, errors.Wrapf(httperrors.ErrResourceNotFound, "%s %s", ProxySettingManager.Keyword(), input.ProxySetting) + } else { + return nil, input, errors.Wrapf(err, "ProxySettingManager.FetchByIdOrName") + } + } + input.ProxySetting = m.GetId() + return m.(*SProxySetting), input, nil +} diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 70344ed4b4..44c6b44af8 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -318,11 +318,30 @@ func (self *SCloudaccount) ValidateUpdateData(ctx context.Context, userCred mccl "proxy_setting", proxy.ProxySettingManager.Keyword(), userCred, - ).Optional(true) + ) + v.Optional(true) if err := v.Validate(data); err != nil { return nil, err } + proxySetting := v.Model.(*proxy.SProxySetting) + + if proxySetting != nil { + // updated proxy setting, so do the check + proxyFunc := proxySetting.HttpTransportProxyFunc() + secret, _ := self.getPassword() + _, err := cloudprovider.IsValidCloudAccount(cloudprovider.ProviderConfig{ + Vendor: self.Provider, + URL: self.AccessUrl, + Account: self.Account, + Secret: secret, + ProxyFunc: proxyFunc, + }) + if err != nil { + return nil, httperrors.NewInputParameterError("invalid proxy setting %s", err) + } + } + return self.SEnabledStatusStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, data) } @@ -382,16 +401,14 @@ func (manager *SCloudaccountManager) ValidateCreateData(ctx context.Context, use var proxyFunc httputils.TransportProxyFunc { - if input.ProxySettingId == "" { - input.ProxySettingId = proxyapi.ProxySettingId_DIRECT + if input.ProxySetting == "" { + input.ProxySetting = proxyapi.ProxySettingId_DIRECT } - m, err := proxy.ProxySettingManager.FetchByIdOrName(userCred, input.ProxySettingId) + var proxySetting *proxy.SProxySetting + proxySetting, input.ProxySettingResourceInput, err = proxy.ValidateProxySettingResourceInput(userCred, input.ProxySettingResourceInput) if err != nil { - return input, httperrors.NewInputParameterError("fetch proxysetting %s: %s", - input.ProxySettingId, err) + return input, httperrors.NewInputParameterError("fetch proxysetting %s: %s", input.ProxySetting, err) } - proxySetting := m.(*proxy.SProxySetting) - input.ProxySettingId = proxySetting.Id proxyFunc = proxySetting.HttpTransportProxyFunc() } accountId, err := cloudprovider.IsValidCloudAccount(cloudprovider.ProviderConfig{ diff --git a/pkg/mcclient/options/cloudaccounts.go b/pkg/mcclient/options/cloudaccounts.go index ed2c7ba57d..32106a2a53 100644 --- a/pkg/mcclient/options/cloudaccounts.go +++ b/pkg/mcclient/options/cloudaccounts.go @@ -83,6 +83,8 @@ type SCloudAccountCreateBaseOptions struct { SyncIntervalSeconds int `help:"Interval to synchronize if auto sync is enable" metavar:"SECONDS"` ProjectDomain string `help:"domain for this account"` + + ProxySetting string `help:"proxy setting id or name" json:"proxy_setting"` } type SVMwareCloudAccountCreateOptions struct { @@ -229,7 +231,7 @@ type SCloudAccountUpdateBaseOptions struct { SyncIntervalSeconds int `help:"auto synchornize interval in seconds"` AutoCreateProject *bool `help:"automatically create local project for new remote project"` - ProxySetting string `help:"proxy setting name or id"` + ProxySetting string `help:"proxy setting name or id" json:"proxy_setting"` Desc string `help:"Description" json:"description" token:"desc"` } diff --git a/pkg/mcclient/options/proxysettings.go b/pkg/mcclient/options/proxysettings.go index 22a98ac920..aff1019ada 100644 --- a/pkg/mcclient/options/proxysettings.go +++ b/pkg/mcclient/options/proxysettings.go @@ -46,3 +46,13 @@ type ProxySettingTestOptions struct { type ProxySettingListOptions struct { BaseListOptions } + +type ProxySettingPublicOptions struct { + ProxySettingGetOptions + Scope string `json:"scope" help:"share scope" choices:"domain|system"` + SharedDomain []string `json:"share"` +} + +type ProxySettingPrivateOptions struct { + ProxySettingGetOptions +}