From 0d487cd6014bbdd0184b87346a7e923ff6ece53d Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Mon, 9 Dec 2019 22:30:59 +0800 Subject: [PATCH] bufix 20191209 --- cmd/climc/shell/quotas.go | 9 +++ go.sum | 2 + pkg/ansibleserver/models/ansibleplaybooks.go | 45 +++++++----- .../models/ansibleplaybooks_v2.go | 31 +++++--- pkg/apis/compute/guesttemplate.go | 10 ++- pkg/apis/compute/service_catalog.go | 3 +- pkg/apis/identity/input.go | 12 ++++ pkg/apis/sharablevirtualresource.go | 6 -- pkg/apis/standaloneresource.go | 11 --- pkg/apis/virtualresource.go | 5 -- pkg/cloudcommon/db/quotas/models.go | 6 +- pkg/cloudcommon/db/quotas/quotakeys_test.go | 24 +++---- pkg/cloudnet/models/routers.go | 14 +++- pkg/cloudnet/models/routes.go | 14 +++- pkg/cloudnet/models/rules.go | 19 +++-- pkg/compute/models/guest_template.go | 72 +++++++++++++------ pkg/compute/models/zonequota.go | 2 +- pkg/image/models/quotas.go | 6 +- pkg/keystone/models/credentials.go | 13 +++- pkg/keystone/models/endpoints.go | 13 +++- pkg/keystone/models/identity_provider.go | 13 +++- pkg/keystone/models/identitybase.go | 20 +++++- pkg/keystone/models/policies.go | 13 +++- pkg/keystone/models/projects.go | 12 +++- pkg/keystone/models/regions.go | 14 +++- pkg/keystone/models/roles.go | 12 +++- pkg/keystone/models/users.go | 12 +++- pkg/mcclient/options/servers.go | 11 --- pkg/notify/models/base.go | 10 ++- 29 files changed, 309 insertions(+), 125 deletions(-) diff --git a/cmd/climc/shell/quotas.go b/cmd/climc/shell/quotas.go index 9cda510f60..8926da9f79 100644 --- a/cmd/climc/shell/quotas.go +++ b/cmd/climc/shell/quotas.go @@ -142,6 +142,15 @@ func init() { printQuotaList(quotas) return nil }) + R(&QuotaOptions{}, "project-quota", "Show project-quota for current user or tenant", func(s *mcclient.ClientSession, args *QuotaOptions) error { + params := jsonutils.Marshal(args) + result, err := modules.ProjectQuotas.GetQuota(s, params) + if err != nil { + return err + } + printQuotaList(result) + return nil + }) R(&QuotaOptions{}, "image-quota", "Show image quota for current user or tenant", func(s *mcclient.ClientSession, args *QuotaOptions) error { params := jsonutils.Marshal(args) quotas, err := modules.ImageQuotas.GetQuota(s, params) diff --git a/go.sum b/go.sum index e6d71f9e32..b4f27a4068 100644 --- a/go.sum +++ b/go.sum @@ -662,6 +662,8 @@ yunion.io/x/executor v0.0.0-20191202093616-92e2e6119257 h1:LZ6eC1uoLDAp7NQlaCy+D yunion.io/x/executor v0.0.0-20191202093616-92e2e6119257/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051 h1:vtZw2iwGrsARNSwRTREGjmr2BWPdxbmXVkb3kI1qu28= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= +yunion.io/x/jsonutils v0.0.0-20191005115334-bb1c187fc0e7 h1:9NcHs2OFMyN8O8SmJ3sFm5AJSVXP3u1N3avJsbyX3RI= +yunion.io/x/jsonutils v0.0.0-20191005115334-bb1c187fc0e7/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= yunion.io/x/jsonutils v0.0.0-20191203054634-2178957d86cf h1:F7lWnVAPAi7qfpKaatKosNbnXyKkmgMK28tLncJe5Lg= yunion.io/x/jsonutils v0.0.0-20191203054634-2178957d86cf/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= yunion.io/x/log v0.0.0-20190514041436-04ce53b17c6b h1:Z9z+7iegu0HXuL+S8taVWRd1P4b9JJOgPXIeoqYrj7c= diff --git a/pkg/ansibleserver/models/ansibleplaybooks.go b/pkg/ansibleserver/models/ansibleplaybooks.go index b392b893f8..0709967251 100644 --- a/pkg/ansibleserver/models/ansibleplaybooks.go +++ b/pkg/ansibleserver/models/ansibleplaybooks.go @@ -20,13 +20,13 @@ import ( "sync" "time" - "github.com/pkg/errors" - "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/sqlchemy" - apis "yunion.io/x/onecloud/pkg/apis/ansible" + "yunion.io/x/onecloud/pkg/apis" + api "yunion.io/x/onecloud/pkg/apis/ansible" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" @@ -76,8 +76,19 @@ func (man *SAnsiblePlaybookManager) ValidateCreateData(ctx context.Context, user if err := pbV.Validate(data); err != nil { return nil, err } - data.Set("status", jsonutils.NewString(apis.AnsiblePlaybookStatusInit)) - return man.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + data.Set("status", jsonutils.NewString(api.AnsiblePlaybookStatusInit)) + var err error + input := apis.VirtualResourceCreateInput{} + err = data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal VirtualResourceCreateInput fail %s", err) + } + input, err = man.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { + return nil, err + } + data.Update(jsonutils.Marshal(input)) + return data, nil } func (apb *SAnsiblePlaybook) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) { @@ -91,14 +102,14 @@ func (apb *SAnsiblePlaybook) PostCreate(ctx context.Context, userCred mcclient.T func (man *SAnsiblePlaybookManager) InitializeData() error { pbs := []SAnsiblePlaybook{} q := AnsiblePlaybookManager.Query() - q = q.Filter(sqlchemy.Equals(q.Field("status"), apis.AnsiblePlaybookStatusRunning)) + q = q.Filter(sqlchemy.Equals(q.Field("status"), api.AnsiblePlaybookStatusRunning)) if err := db.FetchModelObjects(AnsiblePlaybookManager, q, &pbs); err != nil { - return errors.WithMessage(err, "fetch running playbooks") + return errors.Wrap(err, "fetch running playbooks") } for i := 0; i < len(pbs); i++ { pb := &pbs[i] _, err := db.Update(pb, func() error { - pb.Status = apis.AnsiblePlaybookStatusUnknown + pb.Status = api.AnsiblePlaybookStatusUnknown return nil }) if err != nil { @@ -109,14 +120,14 @@ func (man *SAnsiblePlaybookManager) InitializeData() error { } func (apb *SAnsiblePlaybook) ValidateDeleteCondition(ctx context.Context) error { - if apb.Status == apis.AnsiblePlaybookStatusRunning { + if apb.Status == api.AnsiblePlaybookStatusRunning { return httperrors.NewConflictError("playbook is in running state") } return nil } func (apb *SAnsiblePlaybook) ValidateUpdateCondition(ctx context.Context) error { - if apb.Status == apis.AnsiblePlaybookStatusRunning { + if apb.Status == api.AnsiblePlaybookStatusRunning { return httperrors.NewConflictError("playbook is in running state") } return nil @@ -128,7 +139,7 @@ func (apb *SAnsiblePlaybook) ValidateUpdateData(ctx context.Context, userCred mc return nil, err } apb.Playbook = pbV.Playbook // Update as a whole - data.Set("status", jsonutils.NewString(apis.AnsiblePlaybookStatusInit)) + data.Set("status", jsonutils.NewString(api.AnsiblePlaybookStatusInit)) return data, nil } @@ -185,7 +196,7 @@ func (apb *SAnsiblePlaybook) runPlaybook(ctx context.Context, userCred mcclient. apb.StartTime = time.Now() apb.EndTime = time.Time{} apb.Output = "" - apb.Status = apis.AnsiblePlaybookStatusRunning + apb.Status = api.AnsiblePlaybookStatusRunning return nil }) if err != nil { @@ -205,12 +216,12 @@ func (apb *SAnsiblePlaybook) runPlaybook(ctx context.Context, userCred mcclient. _, err := db.Update(apb, func() error { err := man.sessions.Err(apb.Id) if err != nil { - apb.Status = apis.AnsiblePlaybookStatusCanceled + apb.Status = api.AnsiblePlaybookStatusCanceled } else if runErr != nil { log.Warningf("playbook %s(%s) failed: %v", apb.Name, apb.Id, runErr) - apb.Status = apis.AnsiblePlaybookStatusFailed + apb.Status = api.AnsiblePlaybookStatusFailed } else { - apb.Status = apis.AnsiblePlaybookStatusSucceeded + apb.Status = api.AnsiblePlaybookStatusSucceeded } apb.EndTime = time.Now() return nil @@ -227,9 +238,9 @@ func (apb *SAnsiblePlaybook) stopPlaybook(ctx context.Context, userCred mcclient man.sessionsMux.Lock() defer man.sessionsMux.Unlock() if !man.sessions.Has(apb.Id) { - if apb.Status == apis.AnsiblePlaybookStatusRunning { + if apb.Status == api.AnsiblePlaybookStatusRunning { _, err := db.Update(apb, func() error { - apb.Status = apis.AnsiblePlaybookStatusUnknown + apb.Status = api.AnsiblePlaybookStatusUnknown return nil }) if err != nil { diff --git a/pkg/ansibleserver/models/ansibleplaybooks_v2.go b/pkg/ansibleserver/models/ansibleplaybooks_v2.go index fd708efa97..75fb44f0d8 100644 --- a/pkg/ansibleserver/models/ansibleplaybooks_v2.go +++ b/pkg/ansibleserver/models/ansibleplaybooks_v2.go @@ -26,7 +26,8 @@ import ( "yunion.io/x/log" "yunion.io/x/sqlchemy" - apis "yunion.io/x/onecloud/pkg/apis/ansible" + "yunion.io/x/onecloud/pkg/apis" + api "yunion.io/x/onecloud/pkg/apis/ansible" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" @@ -72,8 +73,18 @@ func init() { } func (man *SAnsiblePlaybookV2Manager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { - data.Set("status", jsonutils.NewString(apis.AnsiblePlaybookStatusInit)) - return man.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + data.Set("status", jsonutils.NewString(api.AnsiblePlaybookStatusInit)) + input := apis.VirtualResourceCreateInput{} + err := data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal StandaloneResourceCreateInput fail %s", err) + } + input, err = man.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { + return nil, err + } + data.Update(jsonutils.Marshal(input)) + return data, nil } func (apb *SAnsiblePlaybookV2) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) { @@ -87,14 +98,14 @@ func (apb *SAnsiblePlaybookV2) PostCreate(ctx context.Context, userCred mcclient func (man *SAnsiblePlaybookV2Manager) InitializeData() error { pbs := []SAnsiblePlaybookV2{} q := AnsiblePlaybookV2Manager.Query() - q = q.Filter(sqlchemy.Equals(q.Field("status"), apis.AnsiblePlaybookStatusRunning)) + q = q.Filter(sqlchemy.Equals(q.Field("status"), api.AnsiblePlaybookStatusRunning)) if err := db.FetchModelObjects(AnsiblePlaybookV2Manager, q, &pbs); err != nil { return errors.WithMessage(err, "fetch running playbooks") } for i := 0; i < len(pbs); i++ { pb := &pbs[i] _, err := db.Update(pb, func() error { - pb.Status = apis.AnsiblePlaybookStatusUnknown + pb.Status = api.AnsiblePlaybookStatusUnknown return nil }) if err != nil { @@ -105,7 +116,7 @@ func (man *SAnsiblePlaybookV2Manager) InitializeData() error { } func (apb *SAnsiblePlaybookV2) ValidateDeleteCondition(ctx context.Context) error { - if apb.Status == apis.AnsiblePlaybookStatusRunning { + if apb.Status == api.AnsiblePlaybookStatusRunning { return httperrors.NewConflictError("playbook is in running state") } return nil @@ -174,7 +185,7 @@ func (apb *SAnsiblePlaybookV2) runPlaybook(ctx context.Context, userCred mcclien apb.StartTime = time.Now() apb.EndTime = time.Time{} apb.Output = "" - apb.Status = apis.AnsiblePlaybookStatusRunning + apb.Status = api.AnsiblePlaybookStatusRunning return nil }) if err != nil { @@ -201,12 +212,12 @@ func (apb *SAnsiblePlaybookV2) runPlaybook(ctx context.Context, userCred mcclien _, err := db.Update(apb, func() error { err := man.sessions.Err(apb.Id) if err != nil { - apb.Status = apis.AnsiblePlaybookStatusCanceled + apb.Status = api.AnsiblePlaybookStatusCanceled } else if runErr != nil { log.Warningf("playbook %s(%s) failed: %v", apb.Name, apb.Id, runErr) - apb.Status = apis.AnsiblePlaybookStatusFailed + apb.Status = api.AnsiblePlaybookStatusFailed } else { - apb.Status = apis.AnsiblePlaybookStatusSucceeded + apb.Status = api.AnsiblePlaybookStatusSucceeded } apb.EndTime = time.Now() return nil diff --git a/pkg/apis/compute/guesttemplate.go b/pkg/apis/compute/guesttemplate.go index fbb3222aed..6e5d4d0db9 100644 --- a/pkg/apis/compute/guesttemplate.go +++ b/pkg/apis/compute/guesttemplate.go @@ -7,10 +7,18 @@ import ( ) type GuesttemplateCreateInput struct { - apis.SharableVirutalResourceCreateInput + apis.SharableVirtualResourceCreateInput + // description: the content of guest template // required: true Content jsonutils.JSONObject `json:"content"` + + VmemSize int `json:"vmem_size"` + VcpuCount int `json:"vcpu_count"` + OsType string `json:"os_type"` + Hypervisor string `json:"hypervisor"` + ImageType string `json:"image_type"` + ImageId string `json:"image_id"` } type GuesttemplateDetails struct { diff --git a/pkg/apis/compute/service_catalog.go b/pkg/apis/compute/service_catalog.go index 14fbde673b..f4f1b704b8 100644 --- a/pkg/apis/compute/service_catalog.go +++ b/pkg/apis/compute/service_catalog.go @@ -3,7 +3,8 @@ package compute import "yunion.io/x/onecloud/pkg/apis" type ServiceCatalogCreateInput struct { - apis.SharableVirutalResourceCreateInput + apis.SharableVirtualResourceCreateInput + // description: service catalog icon url // example: https://yunion.io/files/hello.png IconUrl string `json:"icon_url"` diff --git a/pkg/apis/identity/input.go b/pkg/apis/identity/input.go index 18712e9234..dc93fcc990 100644 --- a/pkg/apis/identity/input.go +++ b/pkg/apis/identity/input.go @@ -16,8 +16,20 @@ package identity import ( "yunion.io/x/pkg/errors" + + "yunion.io/x/onecloud/pkg/apis" ) +type IdentityBaseResourceCreateInput struct { + apis.StandaloneResourceCreateInput +} + +type EnabledIdentityBaseResourceCreateInput struct { + IdentityBaseResourceCreateInput + + Enabled *bool `json:"enabled"` +} + type SJoinProjectsInput struct { Projects []string Roles []string diff --git a/pkg/apis/sharablevirtualresource.go b/pkg/apis/sharablevirtualresource.go index 9d2ee9fcc6..7d4d82a219 100644 --- a/pkg/apis/sharablevirtualresource.go +++ b/pkg/apis/sharablevirtualresource.go @@ -27,9 +27,3 @@ type SharableVirtualResourceDetails struct { type SharableVirtualResourceListInput struct { StandaloneResourceListInput } - -type SharableVirutalResourceCreateInput struct { - VirtualResourceCreateInput - IsPublic bool `json:"is_public"` - PublicScope string `json:"public_scope"` -} diff --git a/pkg/apis/standaloneresource.go b/pkg/apis/standaloneresource.go index b7abd35829..55360d2a72 100644 --- a/pkg/apis/standaloneresource.go +++ b/pkg/apis/standaloneresource.go @@ -27,14 +27,3 @@ type StandaloneResourceListInput struct { Tags []string `json:"tags"` WithoutUserMeta bool `json:"without_user_meta"` } - -type StandaloneResourceCreatInput struct { - Meta - // description: resource name - // unique: true - // required: true - // example: yunion - Name string `json:"name"` - Description string `json:"description"` - IsEmulated bool `json:"is_emulated"` -} diff --git a/pkg/apis/virtualresource.go b/pkg/apis/virtualresource.go index 2a36788fa8..2df8b7ebea 100644 --- a/pkg/apis/virtualresource.go +++ b/pkg/apis/virtualresource.go @@ -17,8 +17,3 @@ package apis type VirtualResourceDetails struct { ModelBaseDetails } - -type VirtualResourceCreateInput struct { - StandaloneResourceCreatInput - IsSystem bool `json:"is_system"` -} diff --git a/pkg/cloudcommon/db/quotas/models.go b/pkg/cloudcommon/db/quotas/models.go index 0b9156b3ef..1a43c64607 100644 --- a/pkg/cloudcommon/db/quotas/models.go +++ b/pkg/cloudcommon/db/quotas/models.go @@ -258,6 +258,10 @@ func (manager *SQuotaBaseManager) InitializeData() error { } quota := manager.newQuota() + baseKeys := OwnerIdQuotaKeys(scope, ownerId) + if !reflectutils.FillEmbededStructValue(reflect.Indirect(reflect.ValueOf(quota)), reflect.ValueOf(baseKeys)) { + log.Fatalf("invalid quota??? fail to find SBaseQuotaKey") + } err := metaQuota.GetQuota(context.Background(), scope, ownerId, quota) if err != nil && err != sql.ErrNoRows { log.Errorf("metaQuota.GetQuota error %s for %s", err, ownerId) @@ -266,8 +270,6 @@ func (manager *SQuotaBaseManager) InitializeData() error { if quota.IsEmpty() { quota.FetchSystemQuota() } - baseKeys := OwnerIdQuotaKeys(scope, ownerId) - reflectutils.FillEmbededStructValue(reflect.Indirect(reflect.ValueOf(quota)), reflect.ValueOf(baseKeys)) err = manager.TableSpec().Insert(quota) if err != nil { log.Errorf("%s insert error %s", manager.KeywordPlural(), err) diff --git a/pkg/cloudcommon/db/quotas/quotakeys_test.go b/pkg/cloudcommon/db/quotas/quotakeys_test.go index a788d045d3..0c6d69f3b1 100644 --- a/pkg/cloudcommon/db/quotas/quotakeys_test.go +++ b/pkg/cloudcommon/db/quotas/quotakeys_test.go @@ -24,7 +24,7 @@ func TestRelation(t *testing.T) { {}, // Domain1 := { - SRegionalCloudRegionKeys: SRegionalCloudRegionKeys{ + SRegionalCloudResourceKeys: SRegionalCloudResourceKeys{ SCloudResourceKeys: SCloudResourceKeys{ SBaseQuotaKeys: SBaseQuotaKeys{ DomainId: "domain1", @@ -34,7 +34,7 @@ func TestRelation(t *testing.T) { }, // Domain2 := { - SRegionalCloudRegionKeys: SRegionalCloudRegionKeys{ + SRegionalCloudResourceKeys: SRegionalCloudResourceKeys{ SCloudResourceKeys: SCloudResourceKeys{ SBaseQuotaKeys: SBaseQuotaKeys{ DomainId: "domain2", @@ -44,7 +44,7 @@ func TestRelation(t *testing.T) { }, // Project11 := { - SRegionalCloudRegionKeys: SRegionalCloudRegionKeys{ + SRegionalCloudResourceKeys: SRegionalCloudResourceKeys{ SCloudResourceKeys: SCloudResourceKeys{ SBaseQuotaKeys: SBaseQuotaKeys{ DomainId: "domain1", @@ -55,7 +55,7 @@ func TestRelation(t *testing.T) { }, // Project12 := { - SRegionalCloudRegionKeys: SRegionalCloudRegionKeys{ + SRegionalCloudResourceKeys: SRegionalCloudResourceKeys{ SCloudResourceKeys: SCloudResourceKeys{ SBaseQuotaKeys: SBaseQuotaKeys{ DomainId: "domain1", @@ -66,7 +66,7 @@ func TestRelation(t *testing.T) { }, // Project21 := { - SRegionalCloudRegionKeys: SRegionalCloudRegionKeys{ + SRegionalCloudResourceKeys: SRegionalCloudResourceKeys{ SCloudResourceKeys: SCloudResourceKeys{ SBaseQuotaKeys: SBaseQuotaKeys{ DomainId: "domain2", @@ -77,7 +77,7 @@ func TestRelation(t *testing.T) { }, // Project11Region1 := { - SRegionalCloudRegionKeys: SRegionalCloudRegionKeys{ + SRegionalCloudResourceKeys: SRegionalCloudResourceKeys{ SCloudResourceKeys: SCloudResourceKeys{ SBaseQuotaKeys: SBaseQuotaKeys{ DomainId: "domain1", @@ -89,7 +89,7 @@ func TestRelation(t *testing.T) { }, // Project11Region2 := { - SRegionalCloudRegionKeys: SRegionalCloudRegionKeys{ + SRegionalCloudResourceKeys: SRegionalCloudResourceKeys{ SCloudResourceKeys: SCloudResourceKeys{ SBaseQuotaKeys: SBaseQuotaKeys{ DomainId: "domain1", @@ -101,7 +101,7 @@ func TestRelation(t *testing.T) { }, // Project11Aliyun := { - SRegionalCloudRegionKeys: SRegionalCloudRegionKeys{ + SRegionalCloudResourceKeys: SRegionalCloudResourceKeys{ SCloudResourceKeys: SCloudResourceKeys{ SBaseQuotaKeys: SBaseQuotaKeys{ DomainId: "domain1", @@ -113,7 +113,7 @@ func TestRelation(t *testing.T) { }, // Project11AliyunRegion1 := { - SRegionalCloudRegionKeys: SRegionalCloudRegionKeys{ + SRegionalCloudResourceKeys: SRegionalCloudResourceKeys{ SCloudResourceKeys: SCloudResourceKeys{ SBaseQuotaKeys: SBaseQuotaKeys{ DomainId: "domain1", @@ -241,9 +241,9 @@ func TestRelation(t *testing.T) { QuotaKeysBelong, QuotaKeysExclude, QuotaKeysExclude, + QuotaKeysBelong, QuotaKeysExclude, - QuotaKeysExclude, - QuotaKeysExclude, + QuotaKeysBelong, QuotaKeysEqual, }, } @@ -251,7 +251,7 @@ func TestRelation(t *testing.T) { for j := range keys { rel := relation(keys[i], keys[j]) if rel != want[i][j] { - t.Errorf("%#v %#v got %s want %s", keys[i], keys[j], rel, want[i][j]) + t.Errorf("i=%d j=%d %#v %#v got %s want %s", i, j, keys[i], keys[j], rel, want[i][j]) } } } diff --git a/pkg/cloudnet/models/routers.go b/pkg/cloudnet/models/routers.go index 2095c0171a..96948d04df 100644 --- a/pkg/cloudnet/models/routers.go +++ b/pkg/cloudnet/models/routers.go @@ -20,10 +20,11 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/gotypes" - yerrors "yunion.io/x/pkg/util/errors" "yunion.io/x/pkg/util/netutils" + "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/validators" "yunion.io/x/onecloud/pkg/httperrors" @@ -63,9 +64,16 @@ func init() { } func (man *SRouterManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { - if _, err := man.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data); err != nil { + input := apis.StandaloneResourceCreateInput{} + err := data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal StandaloneResourceCreateInput fail %s", err) + } + input, err = man.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { return nil, err } + data.Update(jsonutils.Marshal(input)) vs := []validators.IValidator{ validators.NewStringNonEmptyValidator("user").Default("cloudroot"), @@ -153,7 +161,7 @@ func (router *SRouter) CustomizeDelete(ctx context.Context, userCred mcclient.To if err := router.SStandaloneResourceBase.CustomizeDelete(ctx, userCred, query, data); err != nil { errs = append(errs, err) } - return yerrors.NewAggregate(errs) + return errors.NewAggregate(errs) } func (router *SRouter) AllowPerformJoinMeshNetwork(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { diff --git a/pkg/cloudnet/models/routes.go b/pkg/cloudnet/models/routes.go index 2cb6eceb76..b0fcbb51f9 100644 --- a/pkg/cloudnet/models/routes.go +++ b/pkg/cloudnet/models/routes.go @@ -19,9 +19,10 @@ import ( "fmt" "yunion.io/x/jsonutils" - yerrors "yunion.io/x/pkg/util/errors" + "yunion.io/x/pkg/errors" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/validators" "yunion.io/x/onecloud/pkg/httperrors" @@ -60,9 +61,16 @@ func init() { } func (man *SRouteManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { - if _, err := man.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data); err != nil { + input := apis.StandaloneResourceCreateInput{} + err := data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal StandaloneResourceCreateInput fail %s", err) + } + input, err = man.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { return nil, err } + data.Update(jsonutils.Marshal(input)) ifaceV := validators.NewModelIdOrNameValidator("iface", "iface", ownerId) networkV := validators.NewIPv4PrefixValidator("network") @@ -151,7 +159,7 @@ func (man *SRouteManager) removeByIface(ctx context.Context, userCred mcclient.T errs = append(errs, err) } } - return yerrors.NewAggregate(errs) + return errors.NewAggregate(errs) } func (man *SRouteManager) getByFilter(filter map[string]string) ([]SRoute, error) { diff --git a/pkg/cloudnet/models/rules.go b/pkg/cloudnet/models/rules.go index 186a05c82f..3a347cb5c9 100644 --- a/pkg/cloudnet/models/rules.go +++ b/pkg/cloudnet/models/rules.go @@ -20,9 +20,10 @@ import ( "strings" "yunion.io/x/jsonutils" - yerrors "yunion.io/x/pkg/util/errors" + "yunion.io/x/pkg/errors" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/validators" "yunion.io/x/onecloud/pkg/httperrors" @@ -194,9 +195,17 @@ func (man *SRuleManager) validateData(ctx context.Context, userCred mcclient.Tok } func (man *SRuleManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { - if _, err := man.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data); err != nil { + input := apis.StandaloneResourceCreateInput{} + err := data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal StandaloneResourceCreateInput fail %s", err) + } + input, err = man.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { return nil, err } + data.Update(jsonutils.Marshal(input)) + if err := man.validateData(ctx, userCred, ownerId, query, data, nil); err != nil { return nil, err } @@ -241,7 +250,7 @@ func (man *SRuleManager) removeByRouter(ctx context.Context, userCred mcclient.T errs = append(errs, err) } } - return yerrors.NewAggregate(errs) + return errors.NewAggregate(errs) } func (man *SRuleManager) getByFilter(filter map[string]string) ([]SRule, error) { @@ -357,7 +366,7 @@ func (man *SRuleManager) addRules(ctx context.Context, userCred mcclient.TokenCr continue } } - return yerrors.NewAggregate(errs) + return errors.NewAggregate(errs) } func (man *SRuleManager) addRule(ctx context.Context, userCred mcclient.TokenCredential, rule *SRule) error { @@ -455,5 +464,5 @@ func (man *SRuleManager) firewalldDirectByRouter(router *SRouter) (*firewalld.Di } rs = append(rs, r) } - return firewalld.NewDirect(rs...), yerrors.NewAggregate(errs) + return firewalld.NewDirect(rs...), errors.NewAggregate(errs) } diff --git a/pkg/compute/models/guest_template.go b/pkg/compute/models/guest_template.go index bc752be625..ffa3914c9c 100644 --- a/pkg/compute/models/guest_template.go +++ b/pkg/compute/models/guest_template.go @@ -71,18 +71,29 @@ func init() { GuestTemplateManager.SetVirtualObject(GuestTemplateManager) } -func (gtm *SGuestTemplateManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, - ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input *computeapis.GuesttemplateCreateInput) (*jsonutils.JSONDict, error) { +func (gtm *SGuestTemplateManager) ValidateCreateData( + ctx context.Context, + userCred mcclient.TokenCredential, + ownerId mcclient.IIdentityProvider, + query jsonutils.JSONObject, + input computeapis.GuesttemplateCreateInput, +) (computeapis.GuesttemplateCreateInput, error) { if input.Content == nil { - return nil, httperrors.NewMissingParameterError("content") + return input, httperrors.NewMissingParameterError("content") } - data, err := gtm.validateData(ctx, userCred, ownerId, query, input) + input, err := gtm.validateData(ctx, userCred, ownerId, query, input) if err != nil { - return nil, err + return input, errors.Wrap(err, "gtm.validateData") } - return gtm.SSharableVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + + input.SharableVirtualResourceCreateInput, err = gtm.SSharableVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input.SharableVirtualResourceCreateInput) + if err != nil { + return input, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ValidateCreateData") + } + + return input, nil } func (gt *SGuestTemplate) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, @@ -96,36 +107,49 @@ func (gt *SGuestTemplate) PostUpdate(ctx context.Context, userCred mcclient.Toke logclient.AddActionLogWithContext(ctx, gt, logclient.ACT_UPDATE, nil, userCred, true) } -func (gtm *SGuestTemplateManager) validateData(ctx context.Context, userCred mcclient.TokenCredential, - ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, cinput *computeapis.GuesttemplateCreateInput) (*jsonutils.JSONDict, error) { +func (gtm *SGuestTemplateManager) validateData( + ctx context.Context, + userCred mcclient.TokenCredential, + ownerId mcclient.IIdentityProvider, + query jsonutils.JSONObject, + cinput computeapis.GuesttemplateCreateInput, +) (computeapis.GuesttemplateCreateInput, error) { if cinput.Content == nil { - return cinput.JSON(cinput), nil + return cinput, nil } content := cinput.Content - data := cinput.JSON(cinput) + // data := cinput.JSON(cinput) // not support guest image and guest snapshot for now if content.Contains("instance_snapshot_id") { - return nil, httperrors.NewInputParameterError( + return cinput, httperrors.NewInputParameterError( "no support for instance snapshot in guest template for now") } // I don't hope cinput.Content same with data["content"] will change in GuestManager.validateCreateData copy := jsonutils.DeepCopy(content).(*jsonutils.JSONDict) input, err := GuestManager.validateCreateData(ctx, userCred, ownerId, query, copy) if err != nil { - return nil, httperrors.NewInputParameterError(err.Error()) + return cinput, httperrors.NewInputParameterError(err.Error()) } // fill field - data.Add(jsonutils.NewInt(int64(input.VmemSize)), "vmem_size") - data.Add(jsonutils.NewInt(int64(input.VcpuCount)), "vcpu_count") - data.Add(jsonutils.NewString(input.OsType), "os_type") - data.Add(jsonutils.NewString(input.Hypervisor), "hypervisor") + cinput.VmemSize = input.VmemSize + // data.Add(jsonutils.NewInt(int64(input.VmemSize)), "vmem_size") + cinput.VcpuCount = input.VcpuCount + // data.Add(jsonutils.NewInt(int64(input.VcpuCount)), "vcpu_count") + cinput.OsType = input.OsType + // data.Add(jsonutils.NewString(input.OsType), "os_type") + cinput.Hypervisor = input.Hypervisor + // data.Add(jsonutils.NewString(input.Hypervisor), "hypervisor") if len(input.GuestImageID) > 0 { - data.Add(jsonutils.NewString(IMAGE_TYPE_GUEST), "image_type") - data.Add(jsonutils.NewString(input.GuestImageID), "image_id") + cinput.ImageType = IMAGE_TYPE_GUEST + cinput.ImageId = input.GuestImageID + // data.Add(jsonutils.NewString(IMAGE_TYPE_GUEST), "image_type") + // data.Add(jsonutils.NewString(input.GuestImageID), "image_id") } else { - data.Add(jsonutils.NewString(input.Disks[0].ImageId), "image_id") - data.Add(jsonutils.NewString(IMAGE_TYPE_NORMAL), "image_type") + cinput.ImageType = input.GuestImageID + cinput.ImageId = input.Disks[0].ImageId // if input.Didks is empty??? + // data.Add(jsonutils.NewString(input.Disks[0].ImageId), "image_id") + // data.Add(jsonutils.NewString(IMAGE_TYPE_NORMAL), "image_type") } // hide some properties @@ -136,17 +160,19 @@ func (gtm *SGuestTemplateManager) validateData(ctx context.Context, userCred mcc contentDict.Remove("count") contentDict.Remove("project_id") - data.Add(contentDict, "content") - return data, nil + cinput.Content = contentDict + // data.Add(contentDict, "content") + return cinput, nil } func (gt *SGuestTemplate) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, cinput *computeapis.GuesttemplateCreateInput) (*jsonutils.JSONDict, error) { - data, err := GuestTemplateManager.validateData(ctx, userCred, gt.GetOwnerId(), query, cinput) + input, err := GuestTemplateManager.validateData(ctx, userCred, gt.GetOwnerId(), query, *cinput) if err != nil { return nil, nil } + data := input.JSON(input) return gt.SSharableVirtualResourceBase.ValidateUpdateData(ctx, userCred, query, data) } diff --git a/pkg/compute/models/zonequota.go b/pkg/compute/models/zonequota.go index b2fbcf72c3..eb33677543 100644 --- a/pkg/compute/models/zonequota.go +++ b/pkg/compute/models/zonequota.go @@ -18,6 +18,7 @@ import ( "context" "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" identityapi "yunion.io/x/onecloud/pkg/apis/identity" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -26,7 +27,6 @@ import ( "yunion.io/x/onecloud/pkg/compute/options" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/util/rbacutils" - "yunion.io/x/pkg/errors" ) var ( diff --git a/pkg/image/models/quotas.go b/pkg/image/models/quotas.go index c5452dd7d0..20a7d64d87 100644 --- a/pkg/image/models/quotas.go +++ b/pkg/image/models/quotas.go @@ -18,6 +18,7 @@ import ( "context" "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/tristate" identityapi "yunion.io/x/onecloud/pkg/apis/identity" @@ -25,6 +26,7 @@ import ( commonOptions "yunion.io/x/onecloud/pkg/cloudcommon/options" "yunion.io/x/onecloud/pkg/image/options" "yunion.io/x/onecloud/pkg/mcclient/auth" + "yunion.io/x/onecloud/pkg/mcclient/utils" "yunion.io/x/onecloud/pkg/util/rbacutils" ) @@ -151,8 +153,8 @@ func (self *SQuota) Exceed(request quotas.IQuota, quota quotas.IQuota) error { err := quotas.NewOutOfQuotaError() sreq := request.(*SQuota) squota := quota.(*SQuota) - if sreq.Image > 0 && self.Image > squota.Image { - err.Add("image", squota.Image, self.Image) + if sreq.Image > 0 && self.Image+sreq.Image > squota.Image { + err.Add("image", squota.Image, self.Image, sreq.Image) } if err.IsError() { return err diff --git a/pkg/keystone/models/credentials.go b/pkg/keystone/models/credentials.go index 8d7369257d..5ba2c193eb 100644 --- a/pkg/keystone/models/credentials.go +++ b/pkg/keystone/models/credentials.go @@ -25,6 +25,7 @@ import ( "yunion.io/x/pkg/tristate" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/apis" api "yunion.io/x/onecloud/pkg/apis/identity" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" @@ -143,7 +144,17 @@ func (manager *SCredentialManager) ValidateCreateData(ctx context.Context, userC data.Add(jsonutils.NewString(string(blobEnc)), "encrypted_blob") data.Add(jsonutils.NewString(keys.CredentialKeyManager.PrimaryKeyHash()), "key_hash") - return manager.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + input := apis.StandaloneResourceCreateInput{} + err = data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal StandaloneResourceCreateInput fail %s", err) + } + input, err = manager.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { + return nil, err + } + data.Update(jsonutils.Marshal(input)) + return data, nil } func (self *SCredential) ValidateDeleteCondition(ctx context.Context) error { diff --git a/pkg/keystone/models/endpoints.go b/pkg/keystone/models/endpoints.go index 6f0b7c50b9..805a4ef3b7 100644 --- a/pkg/keystone/models/endpoints.go +++ b/pkg/keystone/models/endpoints.go @@ -23,6 +23,7 @@ import ( "yunion.io/x/pkg/tristate" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/apis" api "yunion.io/x/onecloud/pkg/apis/identity" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" @@ -321,7 +322,17 @@ func (manager *SEndpointManager) ValidateCreateData(ctx context.Context, userCre } else { return nil, httperrors.NewInputParameterError("missing input field service/service_id") } - return manager.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + input := apis.StandaloneResourceCreateInput{} + err := data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal StandaloneResourceCreateInput fail %s", err) + } + input, err = manager.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { + return nil, err + } + data.Update(jsonutils.Marshal(input)) + return data, nil } func (manager *SEndpointManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { diff --git a/pkg/keystone/models/identity_provider.go b/pkg/keystone/models/identity_provider.go index b50895f878..911a379ee6 100644 --- a/pkg/keystone/models/identity_provider.go +++ b/pkg/keystone/models/identity_provider.go @@ -26,6 +26,7 @@ import ( "yunion.io/x/pkg/tristate" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/apis" api "yunion.io/x/onecloud/pkg/apis/identity" "yunion.io/x/onecloud/pkg/cloudcommon/consts" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -297,7 +298,17 @@ func (manager *SIdentityProviderManager) ValidateCreateData(ctx context.Context, if err != nil { return nil, httperrors.NewInputParameterError("parse config error: %s", err) } - return manager.SEnabledStatusStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + input := apis.EnabledStatusStandaloneResourceCreateInput{} + err = data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal StandaloneResourceCreateInput fail %s", err) + } + input, err = manager.SEnabledStatusStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { + return nil, err + } + data.Update(jsonutils.Marshal(input)) + return data, nil } func (ident *SIdentityProvider) CustomizeCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) error { diff --git a/pkg/keystone/models/identitybase.go b/pkg/keystone/models/identitybase.go index a02ae063cc..934db22719 100644 --- a/pkg/keystone/models/identitybase.go +++ b/pkg/keystone/models/identitybase.go @@ -164,12 +164,26 @@ func (manager *SIdentityBaseResourceManager) FetchOwnerId(ctx context.Context, d return fetchDomainInfo(data) } -func (manager *SIdentityBaseResourceManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { +func (manager *SIdentityBaseResourceManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input api.IdentityBaseResourceCreateInput) (api.IdentityBaseResourceCreateInput, error) { domain, _ := DomainManager.FetchDomainById(ownerId.GetProjectDomainId()) if domain.Enabled.IsFalse() { - return nil, httperrors.NewInvalidStatusError("domain is disabled") + return input, httperrors.NewInvalidStatusError("domain is disabled") } - return manager.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + var err error + input.StandaloneResourceCreateInput, err = manager.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input.StandaloneResourceCreateInput) + if err != nil { + return input, err + } + return input, nil +} + +func (manager *SEnabledIdentityBaseResourceManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input api.EnabledIdentityBaseResourceCreateInput) (api.EnabledIdentityBaseResourceCreateInput, error) { + var err error + input.IdentityBaseResourceCreateInput, err = manager.SIdentityBaseResourceManager.ValidateCreateData(ctx, userCred, ownerId, query, input.IdentityBaseResourceCreateInput) + if err != nil { + return input, err + } + return input, nil } func (manager *SIdentityBaseResourceManager) NamespaceScope() rbacutils.TRbacScope { diff --git a/pkg/keystone/models/policies.go b/pkg/keystone/models/policies.go index f75aea7a51..9dd3ad0c04 100644 --- a/pkg/keystone/models/policies.go +++ b/pkg/keystone/models/policies.go @@ -20,6 +20,7 @@ import ( "yunion.io/x/jsonutils" + api "yunion.io/x/onecloud/pkg/apis/identity" "yunion.io/x/onecloud/pkg/cloudcommon/db" policyman "yunion.io/x/onecloud/pkg/cloudcommon/policy" "yunion.io/x/onecloud/pkg/httperrors" @@ -114,7 +115,17 @@ func (manager *SPolicyManager) ValidateCreateData(ctx context.Context, userCred if err != nil { return nil, err } - return manager.SEnabledIdentityBaseResourceManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + input := api.EnabledIdentityBaseResourceCreateInput{} + err = data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal IdentityBaseResourceCreateInput fail %s", err) + } + input, err = manager.SEnabledIdentityBaseResourceManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { + return nil, err + } + data.Update(jsonutils.Marshal(input)) + return data, nil } func (policy *SPolicy) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { diff --git a/pkg/keystone/models/projects.go b/pkg/keystone/models/projects.go index a1bee11259..5d07304a64 100644 --- a/pkg/keystone/models/projects.go +++ b/pkg/keystone/models/projects.go @@ -359,7 +359,17 @@ func (manager *SProjectManager) ValidateCreateData(ctx context.Context, userCred if err != nil { return nil, err } - return manager.SIdentityBaseResourceManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + input := api.IdentityBaseResourceCreateInput{} + err = data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal IdentityBaseResourceCreateInput fail %s", err) + } + input, err = manager.SIdentityBaseResourceManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { + return nil, err + } + data.Update(jsonutils.Marshal(input)) + return data, nil } func (project *SProject) AllowPerformJoin(ctx context.Context, diff --git a/pkg/keystone/models/regions.go b/pkg/keystone/models/regions.go index a1541b99e8..4fa4474ecc 100644 --- a/pkg/keystone/models/regions.go +++ b/pkg/keystone/models/regions.go @@ -19,6 +19,7 @@ import ( "yunion.io/x/jsonutils" + "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" @@ -122,7 +123,18 @@ func (manager *SRegionManager) ValidateCreateData(ctx context.Context, userCred if !data.Contains("name") { data.Set("name", jsonutils.NewString(idStr)) } - return manager.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + var err error + input := apis.StandaloneResourceCreateInput{} + err = data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal StandaloneResourceCreateInput fail %s", err) + } + input, err = manager.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { + return nil, err + } + data.Update(jsonutils.Marshal(input)) + return data, nil } func (region *SRegion) CustomizeCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) error { diff --git a/pkg/keystone/models/roles.go b/pkg/keystone/models/roles.go index 3e56a7dc93..024b798a6c 100644 --- a/pkg/keystone/models/roles.go +++ b/pkg/keystone/models/roles.go @@ -381,5 +381,15 @@ func (manager *SRoleManager) ValidateCreateData(ctx context.Context, userCred mc if err != nil { return nil, err } - return manager.SIdentityBaseResourceManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + input := api.IdentityBaseResourceCreateInput{} + err = data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal IdentityBaseResourceCreateInput fail %s", err) + } + input, err = manager.SIdentityBaseResourceManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { + return nil, err + } + data.Update(jsonutils.Marshal(input)) + return data, nil } diff --git a/pkg/keystone/models/users.go b/pkg/keystone/models/users.go index ebbc75a454..3c37ae9406 100644 --- a/pkg/keystone/models/users.go +++ b/pkg/keystone/models/users.go @@ -396,7 +396,17 @@ func (manager *SUserManager) ValidateCreateData(ctx context.Context, userCred mc return nil, errors.Wrap(err, "validatePasswordComplexity") } } - return manager.SEnabledIdentityBaseResourceManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + input := api.EnabledIdentityBaseResourceCreateInput{} + err := data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal EnabledIdentityBaseResourceCreateInput fail %s", err) + } + input, err = manager.SEnabledIdentityBaseResourceManager.ValidateCreateData(ctx, userCred, ownerId, query, input) + if err != nil { + return nil, err + } + data.Update(jsonutils.Marshal(input)) + return data, nil } func (user *SUser) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { diff --git a/pkg/mcclient/options/servers.go b/pkg/mcclient/options/servers.go index c6a578d3c9..e6e88804c5 100644 --- a/pkg/mcclient/options/servers.go +++ b/pkg/mcclient/options/servers.go @@ -372,17 +372,6 @@ func (opts *ServerCreateOptionalOptions) OptionalParams() (*computeapi.ServerCre Secgroups: opts.Secgroups, } - params.Description = opts.Desc - params.IsSystem = &opts.System - - params.Project = opts.Project - params.ProjectId = opts.Project - - if opts.GenerateName { - params.GenerateName = opts.NAME - } else { - params.Name = opts.NAME - } if regutils.MatchSize(opts.MemSpec) { memSize, err := fileutils.GetSizeMb(opts.MemSpec, 'M', 1024) if err != nil { diff --git a/pkg/notify/models/base.go b/pkg/notify/models/base.go index 80e0d3c16c..f94879ecc8 100644 --- a/pkg/notify/models/base.go +++ b/pkg/notify/models/base.go @@ -21,6 +21,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" @@ -59,10 +60,17 @@ func (self *SResourceBase) SetDeleteBy(uid string) { } func (self *SResourceBaseManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { - data, err := self.SResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data) + input := apis.ResourceBaseCreateInput{} + err := data.Unmarshal(&input) + if err != nil { + return nil, httperrors.NewInternalServerError("unmarshal ResourceBaseCreateInput fail %s", err) + } + input, err = self.SResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input) if err != nil { return nil, err } + data.Update(jsonutils.Marshal(input)) + data.Set("create_by", jsonutils.NewString(userCred.GetUserId())) return data, nil }