From 7c198bc6ea3fc2ed8d03d023d8101d676aa1bcf9 Mon Sep 17 00:00:00 2001 From: andreaangiolillo Date: Wed, 29 Apr 2020 12:15:29 +0100 Subject: [PATCH 1/5] Refactoring --- internal/cli/ops_manager_servers_list.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/cli/ops_manager_servers_list.go b/internal/cli/ops_manager_servers_list.go index 7c742f0e52..03e6332e4a 100644 --- a/internal/cli/ops_manager_servers_list.go +++ b/internal/cli/ops_manager_servers_list.go @@ -38,7 +38,7 @@ func (opts *opsManagerServersListOpts) init() error { } func (opts *opsManagerServersListOpts) Run() error { - servers, err := opts.store.Agents(opts.projectID, agentType) + servers, err := opts.store.Agents(opts.ProjectID(), agentType) if err != nil { return err From e48d6873dd1a2a2d09fb238da9013ca994046920 Mon Sep 17 00:00:00 2001 From: andreaangiolillo Date: Thu, 30 Apr 2020 11:04:07 +0100 Subject: [PATCH 2/5] CLOUDP-59267: mongocli: upgrade all agents in Org --- go.mod | 2 +- go.sum | 4 +- internal/cli/atlas_dbusers_list.go | 2 +- internal/cli/ops_manager.go | 1 + internal/cli/ops_manager_agents.go | 31 +++++++++ internal/cli/ops_manager_agents_upgrade.go | 64 +++++++++++++++++++ .../cli/ops_manager_agents_upgrade_test.go | 48 ++++++++++++++ .../cli/ops_manager_automation_describe.go | 2 +- internal/cli/ops_manager_processes_list.go | 1 - internal/description/description.go | 1 + internal/mocks/mock_agents.go | 38 +++++++++++ internal/store/agents.go | 15 +++++ 12 files changed, 203 insertions(+), 6 deletions(-) create mode 100644 internal/cli/ops_manager_agents.go create mode 100644 internal/cli/ops_manager_agents_upgrade.go create mode 100644 internal/cli/ops_manager_agents_upgrade_test.go diff --git a/go.mod b/go.mod index b2da90d78c..0f1ad332c4 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/mattn/go-colorable v0.1.6 // indirect github.com/mitchellh/go-homedir v1.1.0 github.com/mongodb/go-client-mongodb-atlas v0.2.1-0.20200427191133-b5e334932f44 - github.com/mongodb/go-client-mongodb-ops-manager v0.2.2-0.20200429114541-a82d7d125cfd + github.com/mongodb/go-client-mongodb-ops-manager v0.2.2 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 b3506515a1..fc18c4479d 100644 --- a/go.sum +++ b/go.sum @@ -102,8 +102,8 @@ github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQz github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mongodb/go-client-mongodb-atlas v0.2.1-0.20200427191133-b5e334932f44 h1:PUOc5BwUVOqGVQqX5vs2MPiJJ6PEZ+jA7TYtna1gOLo= github.com/mongodb/go-client-mongodb-atlas v0.2.1-0.20200427191133-b5e334932f44/go.mod h1:LS8O0YLkA+sbtOb3fZLF10yY3tJM+1xATXMJ3oU35LU= -github.com/mongodb/go-client-mongodb-ops-manager v0.2.2-0.20200429114541-a82d7d125cfd h1:vGYgslrNXKaZIkAIomQ83e6bpaByXIhwNXJgYN+yv8A= -github.com/mongodb/go-client-mongodb-ops-manager v0.2.2-0.20200429114541-a82d7d125cfd/go.mod h1:RrXnfBx3CyKN64jXkXFEO07CnMBEYa5CdlHOQ/30a5A= +github.com/mongodb/go-client-mongodb-ops-manager v0.2.2 h1:xQoyeLjRJmOjvCkjCwbnkzIvugpm6eNozDw4Auk84to= +github.com/mongodb/go-client-mongodb-ops-manager v0.2.2/go.mod h1:RrXnfBx3CyKN64jXkXFEO07CnMBEYa5CdlHOQ/30a5A= 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_list.go b/internal/cli/atlas_dbusers_list.go index ed5b7c923b..ed7935d8c7 100644 --- a/internal/cli/atlas_dbusers_list.go +++ b/internal/cli/atlas_dbusers_list.go @@ -36,7 +36,7 @@ func (opts *atlasDBUsersListOpts) initStore() error { func (opts *atlasDBUsersListOpts) Run() error { listOpts := opts.newListOptions() - result, err := opts.store.DatabaseUsers(opts.projectID, listOpts) + result, err := opts.store.DatabaseUsers(opts.ProjectID(), listOpts) if err != nil { return err diff --git a/internal/cli/ops_manager.go b/internal/cli/ops_manager.go index e477f23da1..3363bc35f7 100644 --- a/internal/cli/ops_manager.go +++ b/internal/cli/ops_manager.go @@ -38,6 +38,7 @@ func OpsManagerBuilder() *cobra.Command { cmd.AddCommand(OpsManagerProcessesBuilder()) cmd.AddCommand(OpsManagerMeasurementsBuilder()) cmd.AddCommand(OpsManagerLogsBuilder()) + cmd.AddCommand(OpsManagerAgentsBuilder()) return cmd } diff --git a/internal/cli/ops_manager_agents.go b/internal/cli/ops_manager_agents.go new file mode 100644 index 0000000000..7b86ab07cd --- /dev/null +++ b/internal/cli/ops_manager_agents.go @@ -0,0 +1,31 @@ +// 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/mongodb/mongocli/internal/description" + "github.com/spf13/cobra" +) + +func OpsManagerAgentsBuilder() *cobra.Command { + cmd := &cobra.Command{ + Use: "agents", + Aliases: []string{"agent"}, + Short: description.Agents, + } + + cmd.AddCommand(OpsManagerAgentsUpgradeBuilder()) + return cmd +} diff --git a/internal/cli/ops_manager_agents_upgrade.go b/internal/cli/ops_manager_agents_upgrade.go new file mode 100644 index 0000000000..d085470c15 --- /dev/null +++ b/internal/cli/ops_manager_agents_upgrade.go @@ -0,0 +1,64 @@ +// 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/mongodb/mongocli/internal/flags" + "github.com/mongodb/mongocli/internal/json" + "github.com/mongodb/mongocli/internal/store" + "github.com/mongodb/mongocli/internal/usage" + "github.com/spf13/cobra" +) + +type opsManagerAgentsUpgradeOpts struct { + globalOpts + store store.AgentUpgrader +} + +func (opts *opsManagerAgentsUpgradeOpts) initStore() error { + var err error + opts.store, err = store.New() + return err +} + +func (opts *opsManagerAgentsUpgradeOpts) Run() error { + r, err := opts.store.UpgradeAgent(opts.ProjectID()) + + if err != nil { + return err + } + + return json.PrettyPrint(r) +} + +// mongocli ops-manager agents upgrade [--projectId projectId] +func OpsManagerAgentsUpgradeBuilder() *cobra.Command { + opts := &opsManagerAgentsUpgradeOpts{} + cmd := &cobra.Command{ + Use: "upgrade", + Aliases: []string{"upgrade"}, + Args: cobra.NoArgs, + PreRunE: func(cmd *cobra.Command, args []string) error { + return opts.PreRunE(opts.initStore) + }, + RunE: func(cmd *cobra.Command, args []string) error { + return opts.Run() + }, + } + + cmd.Flags().StringVar(&opts.projectID, flags.ProjectID, "", usage.ProjectID) + + return cmd +} diff --git a/internal/cli/ops_manager_agents_upgrade_test.go b/internal/cli/ops_manager_agents_upgrade_test.go new file mode 100644 index 0000000000..3e425916ad --- /dev/null +++ b/internal/cli/ops_manager_agents_upgrade_test.go @@ -0,0 +1,48 @@ +// 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" + + om "github.com/mongodb/go-client-mongodb-ops-manager/opsmngr" + + "github.com/golang/mock/gomock" + "github.com/mongodb/mongocli/internal/mocks" +) + +func TestOpsManagerAgentsUpgradeOpts_Run(t *testing.T) { + ctrl := gomock.NewController(t) + mockStore := mocks.NewMockAgentUpgrader(ctrl) + + defer ctrl.Finish() + + expected := new(om.AutomationConfigAgent) + + opts := &opsManagerAgentsUpgradeOpts{ + store: mockStore, + } + + mockStore. + EXPECT(). + UpgradeAgent(opts.projectID). + Return(expected, nil). + Times(1) + + err := opts.Run() + if err != nil { + t.Fatalf("Run() unexpected error: %v", err) + } +} diff --git a/internal/cli/ops_manager_automation_describe.go b/internal/cli/ops_manager_automation_describe.go index 3547055d6b..40cdbc496a 100644 --- a/internal/cli/ops_manager_automation_describe.go +++ b/internal/cli/ops_manager_automation_describe.go @@ -34,7 +34,7 @@ func (opts *opsManagerAutomationDescribeOpts) initStore() error { } func (opts *opsManagerAutomationDescribeOpts) Run() error { - r, err := opts.store.GetAutomationConfig(opts.projectID) + r, err := opts.store.GetAutomationConfig(opts.ProjectID()) if err != nil { return err diff --git a/internal/cli/ops_manager_processes_list.go b/internal/cli/ops_manager_processes_list.go index 0ad41861e9..f1bbb7d40b 100644 --- a/internal/cli/ops_manager_processes_list.go +++ b/internal/cli/ops_manager_processes_list.go @@ -62,7 +62,6 @@ func OpsManagerProcessListBuilder() *cobra.Command { Use: "list", Short: description.ListProcesses, Aliases: []string{"ls"}, - Hidden: true, Args: cobra.NoArgs, PreRunE: func(cmd *cobra.Command, args []string) error { return opts.PreRunE(opts.initStore) diff --git a/internal/description/description.go b/internal/description/description.go index 81762758cd..af6d5dc592 100644 --- a/internal/description/description.go +++ b/internal/description/description.go @@ -87,6 +87,7 @@ const ( ListProjects = "List projects." DownloadLogs = "Download logs from a log collection job." OpsManager = "Ops Manager operations." + Agents = "Manage Ops Manager Agents." ListGlobalAlerts = "List global alerts." Automation = "Manage Ops Manager automation config." ShowAutomationStatus = "Show the current status of the automation config." diff --git a/internal/mocks/mock_agents.go b/internal/mocks/mock_agents.go index ead7936b50..2aeb4f2552 100644 --- a/internal/mocks/mock_agents.go +++ b/internal/mocks/mock_agents.go @@ -47,3 +47,41 @@ func (mr *MockAgentListerMockRecorder) Agents(arg0, arg1 interface{}) *gomock.Ca mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Agents", reflect.TypeOf((*MockAgentLister)(nil).Agents), arg0, arg1) } + +// MockAgentUpgrader is a mock of AgentUpgrader interface +type MockAgentUpgrader struct { + ctrl *gomock.Controller + recorder *MockAgentUpgraderMockRecorder +} + +// MockAgentUpgraderMockRecorder is the mock recorder for MockAgentUpgrader +type MockAgentUpgraderMockRecorder struct { + mock *MockAgentUpgrader +} + +// NewMockAgentUpgrader creates a new mock instance +func NewMockAgentUpgrader(ctrl *gomock.Controller) *MockAgentUpgrader { + mock := &MockAgentUpgrader{ctrl: ctrl} + mock.recorder = &MockAgentUpgraderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockAgentUpgrader) EXPECT() *MockAgentUpgraderMockRecorder { + return m.recorder +} + +// UpgradeAgent mocks base method +func (m *MockAgentUpgrader) UpgradeAgent(arg0 string) (*opsmngr.AutomationConfigAgent, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpgradeAgent", arg0) + ret0, _ := ret[0].(*opsmngr.AutomationConfigAgent) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpgradeAgent indicates an expected call of UpgradeAgent +func (mr *MockAgentUpgraderMockRecorder) UpgradeAgent(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpgradeAgent", reflect.TypeOf((*MockAgentUpgrader)(nil).UpgradeAgent), arg0) +} diff --git a/internal/store/agents.go b/internal/store/agents.go index 4805ed08fc..7496667680 100644 --- a/internal/store/agents.go +++ b/internal/store/agents.go @@ -25,6 +25,10 @@ type AgentLister interface { Agents(string, string) (*om.Agents, error) } +type AgentUpgrader interface { + UpgradeAgent(string) (*om.AutomationConfigAgent, error) +} + // Agents encapsulate the logic to manage different cloud providers func (s *Store) Agents(projectID, agentType string) (*om.Agents, error) { switch s.service { @@ -35,3 +39,14 @@ func (s *Store) Agents(projectID, agentType string) (*om.Agents, error) { return nil, fmt.Errorf("unsupported service: %s", s.service) } } + +// Agents encapsulate the logic to manage different cloud providers +func (s *Store) UpgradeAgent(projectID string) (*om.AutomationConfigAgent, error) { + switch s.service { + case config.OpsManagerService, config.CloudManagerService: + result, _, err := s.client.(*om.Client).AutomationConfig.UpdateAgent(context.Background(), projectID) + return result, err + default: + return nil, fmt.Errorf("unsupported service: %s", s.service) + } +} From b7c77e8b574e1060b24a606a8555e87ccc89ef2d Mon Sep 17 00:00:00 2001 From: andreaangiolillo Date: Thu, 30 Apr 2020 11:05:36 +0100 Subject: [PATCH 3/5] Removed Hidden property --- internal/cli/ops_manager_processes_describe.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/cli/ops_manager_processes_describe.go b/internal/cli/ops_manager_processes_describe.go index b7eb475451..03ad6a93a6 100644 --- a/internal/cli/ops_manager_processes_describe.go +++ b/internal/cli/ops_manager_processes_describe.go @@ -52,7 +52,6 @@ func OpsManagerProcessDescribeBuilder() *cobra.Command { Use: "describe [processID]", Short: description.ListProcesses, Aliases: []string{"d"}, - Hidden: true, Args: cobra.ExactArgs(1), PreRunE: func(cmd *cobra.Command, args []string) error { return opts.PreRunE(opts.initStore) From a74af5f8a439b2bac5fbf42db7dfb5824a3bb1f7 Mon Sep 17 00:00:00 2001 From: andreaangiolillo Date: Thu, 30 Apr 2020 11:29:34 +0100 Subject: [PATCH 4/5] Addressed PR comments --- internal/cli/ops_manager_agents_upgrade.go | 2 +- internal/cli/ops_manager_agents_upgrade_test.go | 3 +-- internal/description/description.go | 2 +- internal/store/agents.go | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/internal/cli/ops_manager_agents_upgrade.go b/internal/cli/ops_manager_agents_upgrade.go index d085470c15..cbd00937cb 100644 --- a/internal/cli/ops_manager_agents_upgrade.go +++ b/internal/cli/ops_manager_agents_upgrade.go @@ -48,7 +48,7 @@ func OpsManagerAgentsUpgradeBuilder() *cobra.Command { opts := &opsManagerAgentsUpgradeOpts{} cmd := &cobra.Command{ Use: "upgrade", - Aliases: []string{"upgrade"}, + Aliases: []string{"upgrades"}, Args: cobra.NoArgs, PreRunE: func(cmd *cobra.Command, args []string) error { return opts.PreRunE(opts.initStore) diff --git a/internal/cli/ops_manager_agents_upgrade_test.go b/internal/cli/ops_manager_agents_upgrade_test.go index 3e425916ad..3f364e02fb 100644 --- a/internal/cli/ops_manager_agents_upgrade_test.go +++ b/internal/cli/ops_manager_agents_upgrade_test.go @@ -17,9 +17,8 @@ package cli import ( "testing" - om "github.com/mongodb/go-client-mongodb-ops-manager/opsmngr" - "github.com/golang/mock/gomock" + om "github.com/mongodb/go-client-mongodb-ops-manager/opsmngr" "github.com/mongodb/mongocli/internal/mocks" ) diff --git a/internal/description/description.go b/internal/description/description.go index af6d5dc592..fc997411a5 100644 --- a/internal/description/description.go +++ b/internal/description/description.go @@ -87,7 +87,7 @@ const ( ListProjects = "List projects." DownloadLogs = "Download logs from a log collection job." OpsManager = "Ops Manager operations." - Agents = "Manage Ops Manager Agents." + Agents = "Manage Ops Manager agents." ListGlobalAlerts = "List global alerts." Automation = "Manage Ops Manager automation config." ShowAutomationStatus = "Show the current status of the automation config." diff --git a/internal/store/agents.go b/internal/store/agents.go index 7496667680..5776fa0d57 100644 --- a/internal/store/agents.go +++ b/internal/store/agents.go @@ -40,7 +40,7 @@ func (s *Store) Agents(projectID, agentType string) (*om.Agents, error) { } } -// Agents encapsulate the logic to manage different cloud providers +// UpgradeAgent encapsulate the logic to manage different cloud providers func (s *Store) UpgradeAgent(projectID string) (*om.AutomationConfigAgent, error) { switch s.service { case config.OpsManagerService, config.CloudManagerService: From da7240c3747710cb51a37141e146157b7a540d9a Mon Sep 17 00:00:00 2001 From: andreaangiolillo Date: Thu, 30 Apr 2020 11:39:38 +0100 Subject: [PATCH 5/5] Removed alias --- internal/cli/ops_manager_agents_upgrade.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/internal/cli/ops_manager_agents_upgrade.go b/internal/cli/ops_manager_agents_upgrade.go index cbd00937cb..a92fb1e572 100644 --- a/internal/cli/ops_manager_agents_upgrade.go +++ b/internal/cli/ops_manager_agents_upgrade.go @@ -47,9 +47,8 @@ func (opts *opsManagerAgentsUpgradeOpts) Run() error { func OpsManagerAgentsUpgradeBuilder() *cobra.Command { opts := &opsManagerAgentsUpgradeOpts{} cmd := &cobra.Command{ - Use: "upgrade", - Aliases: []string{"upgrades"}, - Args: cobra.NoArgs, + Use: "upgrade", + Args: cobra.NoArgs, PreRunE: func(cmd *cobra.Command, args []string) error { return opts.PreRunE(opts.initStore) },