From 89d84f2f260a909e0c830b144545d4c3f6e0e43c Mon Sep 17 00:00:00 2001 From: Gustavo Bazan Date: Thu, 19 Mar 2020 12:51:47 +0000 Subject: [PATCH] CLOUDP-57839: Create db users, C/OM --- go.mod | 4 +- go.sum | 9 +- internal/cli/atlas_dbusers_create.go | 2 +- internal/cli/atlas_dbusers_update.go | 2 +- internal/cli/cloud_manager.go | 1 + internal/cli/cloud_manager_clusters_apply.go | 2 +- .../cli/cloud_manager_clusters_apply_test.go | 2 +- internal/cli/cloud_manager_clusters_create.go | 2 +- internal/cli/cloud_manager_clusters_list.go | 2 +- .../cli/cloud_manager_clusters_list_test.go | 2 +- .../cli/cloud_manager_clusters_shutdown.go | 2 +- .../cloud_manager_clusters_shutdown_test.go | 2 +- .../cli/cloud_manager_clusters_startup.go | 2 +- .../cloud_manager_clusters_startup_test.go | 2 +- internal/cli/cloud_manager_clusters_update.go | 2 +- .../cli/cloud_manager_clusters_update_test.go | 2 +- internal/cli/ops_manager.go | 1 + internal/cli/ops_manager_dbusers.go | 35 +++++ internal/cli/ops_manager_dbusers_create.go | 122 ++++++++++++++++++ .../cli/ops_manager_dbusers_create_test.go | 57 ++++++++ internal/convert/database_user.go | 25 +++- internal/flags/flags.go | 2 + internal/mocks/mock_all_clusters_projects.go | 49 ------- internal/mocks/mock_automation.go | 76 +++++++++-- internal/store/automation.go | 11 +- internal/usage/usage.go | 3 + 26 files changed, 335 insertions(+), 86 deletions(-) create mode 100644 internal/cli/ops_manager_dbusers.go create mode 100644 internal/cli/ops_manager_dbusers_create.go create mode 100644 internal/cli/ops_manager_dbusers_create_test.go delete mode 100644 internal/mocks/mock_all_clusters_projects.go diff --git a/go.mod b/go.mod index 81b0a02921..9acf684642 100644 --- a/go.mod +++ b/go.mod @@ -11,8 +11,8 @@ require ( github.com/mattn/go-colorable v0.1.4 // indirect github.com/mattn/go-isatty v0.0.12 // indirect github.com/mitchellh/go-homedir v1.1.0 - github.com/mongodb/go-client-mongodb-atlas v0.1.4-0.20200318094203-b65adad6f142 - github.com/mongodb/go-client-mongodb-ops-manager v0.0.2-0.20200318095624-136324ab144a + github.com/mongodb/go-client-mongodb-atlas v0.1.4-0.20200318163834-8b6a5ea6eb67 + github.com/mongodb/go-client-mongodb-ops-manager v0.0.2-0.20200319100114-648fc659365b github.com/pelletier/go-toml v1.6.0 // indirect github.com/spf13/afero v1.2.2 github.com/spf13/cast v1.3.1 // indirect diff --git a/go.sum b/go.sum index 3dee713378..9d329346c4 100644 --- a/go.sum +++ b/go.sum @@ -100,11 +100,10 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mongodb/go-client-mongodb-atlas v0.1.4-0.20200318090919-47fd90f26eb1/go.mod h1:LS8O0YLkA+sbtOb3fZLF10yY3tJM+1xATXMJ3oU35LU= -github.com/mongodb/go-client-mongodb-atlas v0.1.4-0.20200318094203-b65adad6f142 h1:A8gFrXWfOPWgDkv4/J7uxVY6ER/NFETb3TZMmX83vdg= -github.com/mongodb/go-client-mongodb-atlas v0.1.4-0.20200318094203-b65adad6f142/go.mod h1:LS8O0YLkA+sbtOb3fZLF10yY3tJM+1xATXMJ3oU35LU= -github.com/mongodb/go-client-mongodb-ops-manager v0.0.2-0.20200318095624-136324ab144a h1:AKMyjBEQgzgI8u9sszRW0qt04ajrhLCC6YRJFstT41s= -github.com/mongodb/go-client-mongodb-ops-manager v0.0.2-0.20200318095624-136324ab144a/go.mod h1:KnlAMq1ZY06LOYW1QUxCWiDLrj71c52K2Z5zGlxeS4k= +github.com/mongodb/go-client-mongodb-atlas v0.1.4-0.20200318163834-8b6a5ea6eb67 h1:YKz/n9K99mUOxs/pX+vpzNvbSFr56vObu2+O33upiFo= +github.com/mongodb/go-client-mongodb-atlas v0.1.4-0.20200318163834-8b6a5ea6eb67/go.mod h1:LS8O0YLkA+sbtOb3fZLF10yY3tJM+1xATXMJ3oU35LU= +github.com/mongodb/go-client-mongodb-ops-manager v0.0.2-0.20200319100114-648fc659365b h1:ROpURq2j0CnObttgt3cm+2veOzoNwUPWWK/hoHZGBQA= +github.com/mongodb/go-client-mongodb-ops-manager v0.0.2-0.20200319100114-648fc659365b/go.mod h1:FhMID1fXaHZpvHPfUhcDL3pfc5JrBB+aD42HLgFoO+8= github.com/mwielbut/pointy v1.1.0 h1:U5/YEfoIkaGCHv0St3CgjduqXID4FNRoyZgLM1kY9vg= github.com/mwielbut/pointy v1.1.0/go.mod h1:MvvO+uMFj9T5DMda33HlvogsFBX7pWWKAkFIn4teYwY= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= diff --git a/internal/cli/atlas_dbusers_create.go b/internal/cli/atlas_dbusers_create.go index 6a9f7408f3..6f6815aec5 100644 --- a/internal/cli/atlas_dbusers_create.go +++ b/internal/cli/atlas_dbusers_create.go @@ -59,7 +59,7 @@ func (opts *atlasDBUsersCreateOpts) Run() error { func (opts *atlasDBUsersCreateOpts) newDatabaseUser() *atlas.DatabaseUser { return &atlas.DatabaseUser{ DatabaseName: convert.AdminDB, - Roles: convert.BuildRoles(opts.roles), + Roles: convert.BuildAtlasRoles(opts.roles), GroupID: opts.ProjectID(), Username: opts.username, Password: opts.password, diff --git a/internal/cli/atlas_dbusers_update.go b/internal/cli/atlas_dbusers_update.go index 0b6590385f..906ae3a80a 100644 --- a/internal/cli/atlas_dbusers_update.go +++ b/internal/cli/atlas_dbusers_update.go @@ -63,7 +63,7 @@ func (opts *atlasDBUsersUpdateOpts) update(out *atlas.DatabaseUser) { out.Password = opts.password } - out.Roles = convert.BuildRoles(opts.roles) + out.Roles = convert.BuildAtlasRoles(opts.roles) } // mongocli atlas dbuser(s) update username [--password password] [--role roleName@dbName] [--projectId projectId] diff --git a/internal/cli/cloud_manager.go b/internal/cli/cloud_manager.go index 5b84b6f65b..e95317c10b 100644 --- a/internal/cli/cloud_manager.go +++ b/internal/cli/cloud_manager.go @@ -30,6 +30,7 @@ func CloudManagerBuilder() *cobra.Command { cmd.AddCommand(AtlasBackupsBuilder()) cmd.AddCommand(OpsManagerServersBuilder()) cmd.AddCommand(OpsManagerAutomationBuilder()) + cmd.AddCommand(OpsManagerDBUsersCreateBuilder()) return cmd } diff --git a/internal/cli/cloud_manager_clusters_apply.go b/internal/cli/cloud_manager_clusters_apply.go index bb8e42bc54..403aa27302 100644 --- a/internal/cli/cloud_manager_clusters_apply.go +++ b/internal/cli/cloud_manager_clusters_apply.go @@ -32,7 +32,7 @@ type cmClustersApplyOpts struct { *globalOpts filename string fs afero.Fs - store store.AutomationStore + store store.AutomationPatcher } func (opts *cmClustersApplyOpts) init() error { diff --git a/internal/cli/cloud_manager_clusters_apply_test.go b/internal/cli/cloud_manager_clusters_apply_test.go index 9f6a5e4033..22df025a69 100644 --- a/internal/cli/cloud_manager_clusters_apply_test.go +++ b/internal/cli/cloud_manager_clusters_apply_test.go @@ -25,7 +25,7 @@ import ( func TestCloudManagerClustersApply_Run(t *testing.T) { ctrl := gomock.NewController(t) - mockStore := mocks.NewMockAutomationStore(ctrl) + mockStore := mocks.NewMockAutomationPatcher(ctrl) defer ctrl.Finish() diff --git a/internal/cli/cloud_manager_clusters_create.go b/internal/cli/cloud_manager_clusters_create.go index ae73d484a8..9aff47a4f1 100644 --- a/internal/cli/cloud_manager_clusters_create.go +++ b/internal/cli/cloud_manager_clusters_create.go @@ -33,7 +33,7 @@ type cmClustersCreateOpts struct { *globalOpts filename string fs afero.Fs - store store.AutomationStore + store store.AutomationPatcher } func (opts *cmClustersCreateOpts) init() error { diff --git a/internal/cli/cloud_manager_clusters_list.go b/internal/cli/cloud_manager_clusters_list.go index c8f90a313c..9fb1615c03 100644 --- a/internal/cli/cloud_manager_clusters_list.go +++ b/internal/cli/cloud_manager_clusters_list.go @@ -51,7 +51,7 @@ func cloudManagerClustersListRun(opts *cloudManagerClustersListOpts) (interface{ var err error if opts.projectID == "" && config.Service() == config.OpsManagerService { - result, err = opts.store.ListAllClustersProjects() + result, err = opts.store.ListAllProjectClusters() } else { var clusterConfigs *om.AutomationConfig diff --git a/internal/cli/cloud_manager_clusters_list_test.go b/internal/cli/cloud_manager_clusters_list_test.go index 3e1f34f49f..e31cdf2c42 100644 --- a/internal/cli/cloud_manager_clusters_list_test.go +++ b/internal/cli/cloud_manager_clusters_list_test.go @@ -56,7 +56,7 @@ func TestCloudManagerClustersList_Run(t *testing.T) { config.SetService(config.OpsManagerService) mockStore. EXPECT(). - ListAllClustersProjects(). + ListAllProjectClusters(). Return(expected, nil). Times(1) diff --git a/internal/cli/cloud_manager_clusters_shutdown.go b/internal/cli/cloud_manager_clusters_shutdown.go index 1d8fe98793..37432130ae 100644 --- a/internal/cli/cloud_manager_clusters_shutdown.go +++ b/internal/cli/cloud_manager_clusters_shutdown.go @@ -32,7 +32,7 @@ type cmClustersShutdownOpts struct { *globalOpts name string confirm bool - store store.AutomationStore + store store.AutomationPatcher } func (opts *cmClustersShutdownOpts) init() error { diff --git a/internal/cli/cloud_manager_clusters_shutdown_test.go b/internal/cli/cloud_manager_clusters_shutdown_test.go index 35e38f49a4..814889ccfb 100644 --- a/internal/cli/cloud_manager_clusters_shutdown_test.go +++ b/internal/cli/cloud_manager_clusters_shutdown_test.go @@ -24,7 +24,7 @@ import ( func TestCloudManagerClustersShutdown_Run(t *testing.T) { ctrl := gomock.NewController(t) - mockStore := mocks.NewMockAutomationStore(ctrl) + mockStore := mocks.NewMockAutomationPatcher(ctrl) defer ctrl.Finish() diff --git a/internal/cli/cloud_manager_clusters_startup.go b/internal/cli/cloud_manager_clusters_startup.go index e8fe8a1755..5699e83ea0 100644 --- a/internal/cli/cloud_manager_clusters_startup.go +++ b/internal/cli/cloud_manager_clusters_startup.go @@ -32,7 +32,7 @@ type cmClustersStartupOpts struct { *globalOpts name string confirm bool - store store.AutomationStore + store store.AutomationPatcher } func (opts *cmClustersStartupOpts) init() error { diff --git a/internal/cli/cloud_manager_clusters_startup_test.go b/internal/cli/cloud_manager_clusters_startup_test.go index 3951a84ebd..f9871bfd01 100644 --- a/internal/cli/cloud_manager_clusters_startup_test.go +++ b/internal/cli/cloud_manager_clusters_startup_test.go @@ -24,7 +24,7 @@ import ( func TestCloudManagerClustersStartup_Run(t *testing.T) { ctrl := gomock.NewController(t) - mockStore := mocks.NewMockAutomationStore(ctrl) + mockStore := mocks.NewMockAutomationPatcher(ctrl) defer ctrl.Finish() diff --git a/internal/cli/cloud_manager_clusters_update.go b/internal/cli/cloud_manager_clusters_update.go index c0d56a3399..2d3361e652 100644 --- a/internal/cli/cloud_manager_clusters_update.go +++ b/internal/cli/cloud_manager_clusters_update.go @@ -33,7 +33,7 @@ type cmClustersUpdateOpts struct { *globalOpts filename string fs afero.Fs - store store.AutomationStore + store store.AutomationPatcher } func (opts *cmClustersUpdateOpts) init() error { diff --git a/internal/cli/cloud_manager_clusters_update_test.go b/internal/cli/cloud_manager_clusters_update_test.go index d3276e14f4..cce917b3f7 100644 --- a/internal/cli/cloud_manager_clusters_update_test.go +++ b/internal/cli/cloud_manager_clusters_update_test.go @@ -25,7 +25,7 @@ import ( func TestCloudManagerClustersUpdate_Run(t *testing.T) { ctrl := gomock.NewController(t) - mockStore := mocks.NewMockAutomationStore(ctrl) + mockStore := mocks.NewMockAutomationPatcher(ctrl) defer ctrl.Finish() diff --git a/internal/cli/ops_manager.go b/internal/cli/ops_manager.go index 5789ca978d..d6e9802600 100644 --- a/internal/cli/ops_manager.go +++ b/internal/cli/ops_manager.go @@ -31,6 +31,7 @@ func OpsManagerBuilder() *cobra.Command { cmd.AddCommand(AtlasBackupsBuilder()) cmd.AddCommand(OpsManagerServersBuilder()) cmd.AddCommand(OpsManagerAutomationBuilder()) + cmd.AddCommand(OpsManagerDBUsersBuilder()) return cmd } diff --git a/internal/cli/ops_manager_dbusers.go b/internal/cli/ops_manager_dbusers.go new file mode 100644 index 0000000000..b8017c5694 --- /dev/null +++ b/internal/cli/ops_manager_dbusers.go @@ -0,0 +1,35 @@ +// Copyright 2020 MongoDB Inc +// +// 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 cli + +import ( + "github.com/spf13/cobra" +) + +func OpsManagerDBUsersBuilder() *cobra.Command { + cmd := &cobra.Command{ + Use: "dbusers", + Aliases: []string{"dbuser", "databaseUsers", "databaseUser"}, + Short: "Manage database users for your project.", + Long: ` +The dbusers command retrieves, creates and modifies the MongoDB database users in your cluster. +Each user has a set of roles that provide access to the project’s databases. +A user’s roles apply to all the clusters in the project.`, + } + + cmd.AddCommand(OpsManagerDBUsersCreateBuilder()) + + return cmd +} diff --git a/internal/cli/ops_manager_dbusers_create.go b/internal/cli/ops_manager_dbusers_create.go new file mode 100644 index 0000000000..9036339f65 --- /dev/null +++ b/internal/cli/ops_manager_dbusers_create.go @@ -0,0 +1,122 @@ +// Copyright 2020 MongoDB Inc +// +// 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 cli + +import ( + "fmt" + + "github.com/AlecAivazis/survey/v2" + om "github.com/mongodb/go-client-mongodb-ops-manager/opsmngr" + "github.com/mongodb/mongocli/internal/config" + "github.com/mongodb/mongocli/internal/convert" + "github.com/mongodb/mongocli/internal/flags" + "github.com/mongodb/mongocli/internal/messages" + "github.com/mongodb/mongocli/internal/store" + "github.com/mongodb/mongocli/internal/usage" + "github.com/spf13/cobra" +) + +type opsManagerDBUsersCreateOpts struct { + *globalOpts + username string + password string + authDB string + roles []string + mechanisms []string + store store.AutomationPatcher +} + +func (opts *opsManagerDBUsersCreateOpts) init() error { + if opts.ProjectID() == "" { + return errMissingProjectID + } + + var err error + opts.store, err = store.New() + return err +} + +func (opts *opsManagerDBUsersCreateOpts) Run() error { + current, err := opts.store.GetAutomationConfig(opts.ProjectID()) + + if err != nil { + return err + } + + current.Auth.Users = append(current.Auth.Users, opts.newDBUser()) + + if err = opts.store.UpdateAutomationConfig(opts.ProjectID(), current); err != nil { + return err + } + + fmt.Print(messages.DeploymentStatus(config.OpsManagerURL(), opts.ProjectID())) + + return nil +} + +func (opts *opsManagerDBUsersCreateOpts) newDBUser() *om.MongoDBUser { + return &om.MongoDBUser{ + Database: opts.authDB, + Username: opts.username, + InitPassword: opts.password, + Roles: convert.BuildOMRoles(opts.roles), + AuthenticationRestrictions: []string{}, + Mechanisms: opts.mechanisms, + } +} + +func (opts *opsManagerDBUsersCreateOpts) Prompt() error { + if opts.password != "" { + return nil + } + prompt := &survey.Password{ + Message: "Password:", + } + return survey.AskOne(prompt, &opts.password) +} + +// mongocli atlas dbuser(s) create --username username --password password --role roleName@dbName [--projectId projectId] +func OpsManagerDBUsersCreateBuilder() *cobra.Command { + opts := &opsManagerDBUsersCreateOpts{ + globalOpts: newGlobalOpts(), + } + cmd := &cobra.Command{ + Use: "create", + Short: "Create a database user for a project.", + Example: ` mongocli om dbuser create --username User1 --password passW0rd --role readWriteAnyDatabase,clusterMonitor --mechanism SCRAM-SHA-256 --projectId <>`, + Args: cobra.NoArgs, + PreRunE: func(cmd *cobra.Command, args []string) error { + if err := opts.init(); err != nil { + return err + } + return opts.Prompt() + }, + RunE: func(cmd *cobra.Command, args []string) error { + return opts.Run() + }, + } + + cmd.Flags().StringVar(&opts.username, flags.Username, "", usage.Username) + cmd.Flags().StringVar(&opts.password, flags.Password, "", usage.Password) + cmd.Flags().StringVar(&opts.authDB, flags.AuthDB, convert.AdminDB, usage.AuthDB) + cmd.Flags().StringSliceVar(&opts.roles, flags.Role, []string{}, usage.Roles) + cmd.Flags().StringSliceVar(&opts.mechanisms, flags.Mechanisms, []string{"SCRAM-SHA-1"}, usage.Mechanisms) + + cmd.Flags().StringVar(&opts.projectID, flags.ProjectID, "", usage.ProjectID) + + _ = cmd.MarkFlagRequired(flags.Username) + + return cmd +} diff --git a/internal/cli/ops_manager_dbusers_create_test.go b/internal/cli/ops_manager_dbusers_create_test.go new file mode 100644 index 0000000000..d028d959d8 --- /dev/null +++ b/internal/cli/ops_manager_dbusers_create_test.go @@ -0,0 +1,57 @@ +// Copyright 2020 MongoDB Inc +// +// 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 cli + +import ( + "testing" + + "github.com/golang/mock/gomock" + "github.com/mongodb/mongocli/internal/fixtures" + "github.com/mongodb/mongocli/internal/mocks" +) + +func TestOpsManagerDBUserCreate_Run(t *testing.T) { + ctrl := gomock.NewController(t) + mockStore := mocks.NewMockAutomationPatcher(ctrl) + + defer ctrl.Finish() + + expected := fixtures.AutomationConfig() + + createOpts := &opsManagerDBUsersCreateOpts{ + globalOpts: newGlobalOpts(), + username: "ProjectBar", + password: "US", + roles: []string{"admin@admin"}, + store: mockStore, + } + + mockStore. + EXPECT(). + GetAutomationConfig(createOpts.projectID). + Return(expected, nil). + Times(1) + + mockStore. + EXPECT(). + UpdateAutomationConfig(createOpts.projectID, expected). + Return(nil). + Times(1) + + err := createOpts.Run() + if err != nil { + t.Fatalf("Run() unexpected error: %v", err) + } +} diff --git a/internal/convert/database_user.go b/internal/convert/database_user.go index ea22911211..1992b0a350 100644 --- a/internal/convert/database_user.go +++ b/internal/convert/database_user.go @@ -18,6 +18,7 @@ import ( "strings" atlas "github.com/mongodb/go-client-mongodb-atlas/mongodbatlas" + om "github.com/mongodb/go-client-mongodb-ops-manager/opsmngr" ) //Public constants @@ -30,9 +31,9 @@ const ( roleSep = "@" ) -// BuildRoles converts the roles inside the array of string in an array of Atlas.Role Objects +// BuildAtlasRoles converts the roles inside the array of string in an array of mongodbatlas.Role structs // r contains roles in the format roleName@dbName -func BuildRoles(r []string) []atlas.Role { +func BuildAtlasRoles(r []string) []atlas.Role { roles := make([]atlas.Role, len(r)) for i, roleP := range r { role := strings.Split(roleP, roleSep) @@ -49,3 +50,23 @@ func BuildRoles(r []string) []atlas.Role { } return roles } + +// BuildOMRoles converts the roles inside the array of string in an array of opsmngr.Role structs +// r contains roles in the format roleName@dbName +func BuildOMRoles(r []string) []*om.Role { + roles := make([]*om.Role, len(r)) + for i, roleP := range r { + role := strings.Split(roleP, roleSep) + roleName := role[0] + databaseName := AdminDB + if len(role) > 1 { + databaseName = role[1] + } + + roles[i] = &om.Role{ + Role: roleName, + Database: databaseName, + } + } + return roles +} diff --git a/internal/flags/flags.go b/internal/flags/flags.go index 5c44b74ece..3202907dbf 100644 --- a/internal/flags/flags.go +++ b/internal/flags/flags.go @@ -31,10 +31,12 @@ const ( Backup = "backup" // Backup flag Username = "username" // Username flag Password = "password" // Password flag + AuthDB = "authDB" // AuthDB flag Email = "email" // Email flag FirstName = "firstName" // FirstName flag LastName = "lastName" // LastName flag Role = "role" // Role flag + Mechanisms = "mechanisms" // Mechanisms flag Type = "type" // Type flag Comment = "comment" // Comment flag Page = "page" // Page flag diff --git a/internal/mocks/mock_all_clusters_projects.go b/internal/mocks/mock_all_clusters_projects.go deleted file mode 100644 index 08b7171111..0000000000 --- a/internal/mocks/mock_all_clusters_projects.go +++ /dev/null @@ -1,49 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: internal/store/all_clusters_projects.go - -// Package mocks is a generated GoMock package. -package mocks - -import ( - gomock "github.com/golang/mock/gomock" - opsmngr "github.com/mongodb/go-client-mongodb-ops-manager/opsmngr" - reflect "reflect" -) - -// MockListAllClusters is a mock of ListAllClusters interface -type MockListAllClusters struct { - ctrl *gomock.Controller - recorder *MockListAllClustersMockRecorder -} - -// MockListAllClustersMockRecorder is the mock recorder for MockListAllClusters -type MockListAllClustersMockRecorder struct { - mock *MockListAllClusters -} - -// NewMockListAllClusters creates a new mock instance -func NewMockListAllClusters(ctrl *gomock.Controller) *MockListAllClusters { - mock := &MockListAllClusters{ctrl: ctrl} - mock.recorder = &MockListAllClustersMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use -func (m *MockListAllClusters) EXPECT() *MockListAllClustersMockRecorder { - return m.recorder -} - -// ListAllClustersProjects mocks base method -func (m *MockListAllClusters) ListAllClustersProjects() (*opsmngr.AllClustersProjects, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListAllClustersProjects") - ret0, _ := ret[0].(*opsmngr.AllClustersProjects) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListAllClustersProjects indicates an expected call of ListAllClustersProjects -func (mr *MockListAllClustersMockRecorder) ListAllClustersProjects() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAllClustersProjects", reflect.TypeOf((*MockListAllClusters)(nil).ListAllClustersProjects)) -} diff --git a/internal/mocks/mock_automation.go b/internal/mocks/mock_automation.go index b14cf5ca8d..f44f8f0951 100644 --- a/internal/mocks/mock_automation.go +++ b/internal/mocks/mock_automation.go @@ -146,19 +146,71 @@ func (m *MockAllClusterLister) EXPECT() *MockAllClusterListerMockRecorder { return m.recorder } -// ListAllClustersProjects mocks base method -func (m *MockAllClusterLister) ListAllClustersProjects() (*opsmngr.AllClustersProjects, error) { +// ListAllProjectClusters mocks base method +func (m *MockAllClusterLister) ListAllProjectClusters() (*opsmngr.AllClustersProjects, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListAllClustersProjects") + ret := m.ctrl.Call(m, "ListAllProjectClusters") ret0, _ := ret[0].(*opsmngr.AllClustersProjects) ret1, _ := ret[1].(error) return ret0, ret1 } -// ListAllClustersProjects indicates an expected call of ListAllClustersProjects -func (mr *MockAllClusterListerMockRecorder) ListAllClustersProjects() *gomock.Call { +// ListAllProjectClusters indicates an expected call of ListAllProjectClusters +func (mr *MockAllClusterListerMockRecorder) ListAllProjectClusters() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAllClustersProjects", reflect.TypeOf((*MockAllClusterLister)(nil).ListAllClustersProjects)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAllProjectClusters", reflect.TypeOf((*MockAllClusterLister)(nil).ListAllProjectClusters)) +} + +// MockAutomationPatcher is a mock of AutomationPatcher interface +type MockAutomationPatcher struct { + ctrl *gomock.Controller + recorder *MockAutomationPatcherMockRecorder +} + +// MockAutomationPatcherMockRecorder is the mock recorder for MockAutomationPatcher +type MockAutomationPatcherMockRecorder struct { + mock *MockAutomationPatcher +} + +// NewMockAutomationPatcher creates a new mock instance +func NewMockAutomationPatcher(ctrl *gomock.Controller) *MockAutomationPatcher { + mock := &MockAutomationPatcher{ctrl: ctrl} + mock.recorder = &MockAutomationPatcherMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockAutomationPatcher) EXPECT() *MockAutomationPatcherMockRecorder { + return m.recorder +} + +// GetAutomationConfig mocks base method +func (m *MockAutomationPatcher) GetAutomationConfig(arg0 string) (*opsmngr.AutomationConfig, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAutomationConfig", arg0) + ret0, _ := ret[0].(*opsmngr.AutomationConfig) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAutomationConfig indicates an expected call of GetAutomationConfig +func (mr *MockAutomationPatcherMockRecorder) GetAutomationConfig(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAutomationConfig", reflect.TypeOf((*MockAutomationPatcher)(nil).GetAutomationConfig), arg0) +} + +// UpdateAutomationConfig mocks base method +func (m *MockAutomationPatcher) UpdateAutomationConfig(arg0 string, arg1 *opsmngr.AutomationConfig) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateAutomationConfig", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpdateAutomationConfig indicates an expected call of UpdateAutomationConfig +func (mr *MockAutomationPatcherMockRecorder) UpdateAutomationConfig(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAutomationConfig", reflect.TypeOf((*MockAutomationPatcher)(nil).UpdateAutomationConfig), arg0, arg1) } // MockAutomationStore is a mock of AutomationStore interface @@ -266,17 +318,17 @@ func (mr *MockCloudManagerClustersListerMockRecorder) GetAutomationConfig(arg0 i return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAutomationConfig", reflect.TypeOf((*MockCloudManagerClustersLister)(nil).GetAutomationConfig), arg0) } -// ListAllClustersProjects mocks base method -func (m *MockCloudManagerClustersLister) ListAllClustersProjects() (*opsmngr.AllClustersProjects, error) { +// ListAllProjectClusters mocks base method +func (m *MockCloudManagerClustersLister) ListAllProjectClusters() (*opsmngr.AllClustersProjects, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListAllClustersProjects") + ret := m.ctrl.Call(m, "ListAllProjectClusters") ret0, _ := ret[0].(*opsmngr.AllClustersProjects) ret1, _ := ret[1].(error) return ret0, ret1 } -// ListAllClustersProjects indicates an expected call of ListAllClustersProjects -func (mr *MockCloudManagerClustersListerMockRecorder) ListAllClustersProjects() *gomock.Call { +// ListAllProjectClusters indicates an expected call of ListAllProjectClusters +func (mr *MockCloudManagerClustersListerMockRecorder) ListAllProjectClusters() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAllClustersProjects", reflect.TypeOf((*MockCloudManagerClustersLister)(nil).ListAllClustersProjects)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAllProjectClusters", reflect.TypeOf((*MockCloudManagerClustersLister)(nil).ListAllProjectClusters)) } diff --git a/internal/store/automation.go b/internal/store/automation.go index 86255b9585..d3ae4d8f36 100644 --- a/internal/store/automation.go +++ b/internal/store/automation.go @@ -35,7 +35,12 @@ type AutomationStatusGetter interface { } type AllClusterLister interface { - ListAllClustersProjects() (*om.AllClustersProjects, error) + ListAllProjectClusters() (*om.AllClustersProjects, error) +} + +type AutomationPatcher interface { + AutomationGetter + AutomationUpdater } type AutomationStore interface { @@ -81,8 +86,8 @@ func (s *Store) UpdateAutomationConfig(projectID string, automationConfig *om.Au } } -// ListAllClustersProjects encapsulate the logic to manage different cloud providers -func (s *Store) ListAllClustersProjects() (*om.AllClustersProjects, error) { +// ListAllProjectClusters encapsulate the logic to manage different cloud providers +func (s *Store) ListAllProjectClusters() (*om.AllClustersProjects, error) { switch s.service { case config.OpsManagerService, config.CloudManagerService: result, _, err := s.client.(*om.Client).AllClusters.List(context.Background()) diff --git a/internal/usage/usage.go b/internal/usage/usage.go index b0f2d2983d..8e71a98587 100644 --- a/internal/usage/usage.go +++ b/internal/usage/usage.go @@ -27,6 +27,7 @@ const ( Limit = "Number of items per page." Username = "Username for authenticating to MongoDB." Password = "User’s password." + AuthDB = "Authentication database name." Roles = "User's roles and the databases or collections on which the roles apply." Comment = "Optional description of the whitelist entry." Force = "Don't ask for confirmation." @@ -84,6 +85,8 @@ For use only with download restore jobs.` For use only with download restore jobs.` MaxDownloads = `Number of times the download URL can be used. This must be 1 or greater. For use only with download restore jobs.` + Mechanisms = `Authentication mechanism. +Valid values: SCRAM-SHA-1|SCRAM-SHA-256` WhitelistType = `Type of whitelist entry. Valid values: cidrBlock|ipAddress` Service = `Type of MongoDB service.