diff --git a/cmd/climc/shell/compute/dbinstance_accounts.go b/cmd/climc/shell/compute/dbinstance_accounts.go index 12fbc842d8..26a1b1a9cb 100644 --- a/cmd/climc/shell/compute/dbinstance_accounts.go +++ b/cmd/climc/shell/compute/dbinstance_accounts.go @@ -15,50 +15,15 @@ package compute import ( - "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/cmd/climc/shell" "yunion.io/x/onecloud/pkg/mcclient/modules" "yunion.io/x/onecloud/pkg/mcclient/options" ) func init() { - type DBInstanceAccountListOptions struct { - options.BaseListOptions - DBInstance string `help:"ID or Name of DBInstance" json:"dbinstance"` - } - R(&DBInstanceAccountListOptions{}, "dbinstance-account-list", "List DB instance accounts", func(s *mcclient.ClientSession, opts *DBInstanceAccountListOptions) error { - params, err := options.ListStructToParams(opts) - if err != nil { - return err - } - - result, err := modules.DBInstanceAccounts.List(s, params) - if err != nil { - return err - } - printList(result, modules.DBInstanceAccounts.GetColumns(s)) - return nil - }) - - type DBInstanceAccountIdOptions struct { - ID string `help:"ID or Name of DBInstanceaccount"` - } - - R(&DBInstanceAccountIdOptions{}, "dbinstance-account-show", "Show DB instance account", func(s *mcclient.ClientSession, opts *DBInstanceAccountIdOptions) error { - account, err := modules.DBInstanceAccounts.Get(s, opts.ID, nil) - if err != nil { - return err - } - printObject(account) - return nil - }) - - R(&DBInstanceAccountIdOptions{}, "dbinstance-account-delete", "Delete DB instance account", func(s *mcclient.ClientSession, opts *DBInstanceAccountIdOptions) error { - account, err := modules.DBInstanceAccounts.Delete(s, opts.ID, nil) - if err != nil { - return err - } - printObject(account) - return nil - }) - + cmd := shell.NewResourceCmd(&modules.DBInstanceAccounts).WithKeyword("dbinstance-account") + cmd.List(&options.DBInstanceAccountListOptions{}) + cmd.Update(&options.BaseUpdateOptions{}) + cmd.Show(&options.DBInstanceAccountIdOptions{}) + cmd.Delete(&options.DBInstanceAccountIdOptions{}) } diff --git a/cmd/climc/shell/compute/dbinstance_databases.go b/cmd/climc/shell/compute/dbinstance_databases.go index c9c8ce21c8..79647a0725 100644 --- a/cmd/climc/shell/compute/dbinstance_databases.go +++ b/cmd/climc/shell/compute/dbinstance_databases.go @@ -15,60 +15,16 @@ package compute import ( - "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/cmd/climc/shell" "yunion.io/x/onecloud/pkg/mcclient/modules" "yunion.io/x/onecloud/pkg/mcclient/options" ) func init() { - type DBInstanceDatabaseListOptions struct { - options.BaseListOptions - DBInstance string `help:"ID or Name of DBInstance" json:"dbinstance"` - } - R(&DBInstanceDatabaseListOptions{}, "dbinstance-database-list", "List DB instance databases", func(s *mcclient.ClientSession, opts *DBInstanceDatabaseListOptions) error { - params, err := options.ListStructToParams(opts) - if err != nil { - return err - } - - result, err := modules.DBInstanceDatabases.List(s, params) - if err != nil { - return err - } - printList(result, modules.DBInstanceDatabases.GetColumns(s)) - return nil - }) - - type DBInstanceDatabaseCreateOptions struct { - NAME string - DBINSTANCE string `help:"ID or Name of DBInstance" json:"dbinstance"` - CharacterSet string `help:"CharacterSet for database"` - } - - R(&DBInstanceDatabaseCreateOptions{}, "dbinstance-database-create", "Create DB instance databases", func(s *mcclient.ClientSession, opts *DBInstanceDatabaseCreateOptions) error { - params, err := options.ListStructToParams(opts) - if err != nil { - return err - } - result, err := modules.DBInstanceDatabases.Create(s, params) - if err != nil { - return err - } - printObject(result) - return nil - }) - - type DBInstanceDatabaseIdOptions struct { - ID string - } - - R(&DBInstanceDatabaseIdOptions{}, "dbinstance-database-delete", "Delete DB instance databases", func(s *mcclient.ClientSession, opts *DBInstanceDatabaseIdOptions) error { - result, err := modules.DBInstanceDatabases.Delete(s, opts.ID, nil) - if err != nil { - return err - } - printObject(result) - return nil - }) - + cmd := shell.NewResourceCmd(&modules.DBInstanceDatabases).WithKeyword("dbinstance-database") + cmd.List(&options.DBInstanceDatabaseListOptions{}) + cmd.Update(&options.BaseUpdateOptions{}) + cmd.Delete(&options.DBInstanceDatabaseIdOptions{}) + cmd.Show(&options.DBInstanceDatabaseIdOptions{}) + cmd.Create(&options.DBInstanceDatabaseCreateOptions{}) } diff --git a/pkg/apis/compute/dbinstance_account.go b/pkg/apis/compute/dbinstance_account.go index 2f612a8047..3042205f9d 100644 --- a/pkg/apis/compute/dbinstance_account.go +++ b/pkg/apis/compute/dbinstance_account.go @@ -92,3 +92,7 @@ type DBInstanceAccountDetails struct { ProjectId string `json:"tenant_id"` } + +type DBInstanceAccountUpdateInput struct { + apis.StatusStandaloneResourceBaseUpdateInput +} diff --git a/pkg/apis/compute/dbinstance_database.go b/pkg/apis/compute/dbinstance_database.go index 3563e94c76..b4e8ee40fc 100644 --- a/pkg/apis/compute/dbinstance_database.go +++ b/pkg/apis/compute/dbinstance_database.go @@ -80,3 +80,7 @@ type DBInstanceparameterDetails struct { SDBInstanceParameter } + +type DBInstanceDatabaseUpdateInput struct { + apis.StatusStandaloneResourceBaseUpdateInput +} diff --git a/pkg/compute/models/dbinstance_accounts.go b/pkg/compute/models/dbinstance_accounts.go index aebd01cac7..e89135ab27 100644 --- a/pkg/compute/models/dbinstance_accounts.go +++ b/pkg/compute/models/dbinstance_accounts.go @@ -130,7 +130,19 @@ func (self *SDBInstanceAccount) AllowGetDetails(ctx context.Context, userCred mc } func (self *SDBInstanceAccount) AllowUpdateItem(ctx context.Context, userCred mcclient.TokenCredential) bool { - return false + return db.IsProjectAllowUpdate(userCred, self) +} + +func (self *SDBInstanceAccount) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.DBInstanceAccountUpdateInput) (api.DBInstanceAccountUpdateInput, error) { + var err error + input.StatusStandaloneResourceBaseUpdateInput, err = self.SStatusStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, input.StatusStandaloneResourceBaseUpdateInput) + if err != nil { + return input, errors.Wrapf(err, "SStatusStandaloneResourceBase.ValidateUpdateData") + } + if len(input.Name) > 0 && input.Name != self.Name { + return input, httperrors.NewForbiddenError("not allow update rds account name") + } + return input, nil } func (self *SDBInstanceAccount) AllowDeleteItem(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { diff --git a/pkg/compute/models/dbinstance_databases.go b/pkg/compute/models/dbinstance_databases.go index fa482758a0..7c8e551c45 100644 --- a/pkg/compute/models/dbinstance_databases.go +++ b/pkg/compute/models/dbinstance_databases.go @@ -123,13 +123,20 @@ func (manager *SDBInstanceDatabaseManager) FilterByOwner(q *sqlchemy.SQuery, use return q } -//func (self *SDBInstanceDatabase) AllowUpdateItem(ctx context.Context, userCred mcclient.TokenCredential) bool { -//只能创建或删除,避免update name后造成登录数据库名称异常 -// return false -//} +func (self *SDBInstanceDatabase) AllowUpdateItem(ctx context.Context, userCred mcclient.TokenCredential) bool { + return db.IsProjectAllowUpdate(userCred, self) +} -func (self *SDBInstanceDatabase) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { - return nil, httperrors.ErrForbidden +func (self *SDBInstanceDatabase) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.DBInstanceDatabaseUpdateInput) (api.DBInstanceDatabaseUpdateInput, error) { + var err error + input.StatusStandaloneResourceBaseUpdateInput, err = self.SStatusStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, input.StatusStandaloneResourceBaseUpdateInput) + if err != nil { + return input, errors.Wrapf(err, "SStatusStandaloneResourceBase.ValidateUpdateData") + } + if len(input.Name) > 0 && input.Name != self.Name { + return input, httperrors.NewForbiddenError("not allow update rds database name") + } + return input, nil } // RDS数据库列表 diff --git a/pkg/mcclient/options/dbinstance_account.go b/pkg/mcclient/options/dbinstance_account.go new file mode 100644 index 0000000000..63bce3aaae --- /dev/null +++ b/pkg/mcclient/options/dbinstance_account.go @@ -0,0 +1,38 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package options + +import "yunion.io/x/jsonutils" + +type DBInstanceAccountListOptions struct { + BaseListOptions + DBInstance string `help:"ID or Name of DBInstance" json:"dbinstance"` +} + +func (opts *DBInstanceAccountListOptions) Params() (jsonutils.JSONObject, error) { + return ListStructToParams(opts) +} + +type DBInstanceAccountIdOptions struct { + ID string `help:"ID of DBInstanceaccount"` +} + +func (opts *DBInstanceAccountIdOptions) GetId() string { + return opts.ID +} + +func (opts *DBInstanceAccountIdOptions) Params() (jsonutils.JSONObject, error) { + return nil, nil +} diff --git a/pkg/mcclient/options/dbinstance_database.go b/pkg/mcclient/options/dbinstance_database.go new file mode 100644 index 0000000000..420b8e380b --- /dev/null +++ b/pkg/mcclient/options/dbinstance_database.go @@ -0,0 +1,48 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package options + +import "yunion.io/x/jsonutils" + +type DBInstanceDatabaseListOptions struct { + BaseListOptions + DBInstance string `help:"ID or Name of DBInstance" json:"dbinstance"` +} + +func (opts *DBInstanceDatabaseListOptions) Params() (jsonutils.JSONObject, error) { + return ListStructToParams(opts) +} + +type DBInstanceDatabaseIdOptions struct { + ID string `help:"ID of DBInstancedatabase"` +} + +func (opts *DBInstanceDatabaseIdOptions) GetId() string { + return opts.ID +} + +func (opts *DBInstanceDatabaseIdOptions) Params() (jsonutils.JSONObject, error) { + return nil, nil +} + +type DBInstanceDatabaseCreateOptions struct { + NAME string + DBINSTANCE string `help:"ID or Name of DBInstance" json:"dbinstance"` + CharacterSet string `help:"CharacterSet for database"` +} + +func (opts *DBInstanceDatabaseCreateOptions) Params() (jsonutils.JSONObject, error) { + return ListStructToParams(opts) +}