Skip to content

Commit

Permalink
CLOUDP-70043: mongocli ops-manager|cloud-manager maintenanceWindow(s)…
Browse files Browse the repository at this point in the history
… describe <ID> (#430)
  • Loading branch information
andreaangiolillo committed Sep 9, 2020
1 parent e9608f4 commit 042a0d3
Show file tree
Hide file tree
Showing 7 changed files with 196 additions and 7 deletions.
75 changes: 75 additions & 0 deletions internal/cli/opsmanager/maintenance/describe.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// 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 maintenance

import (
"github.com/mongodb/mongocli/internal/cli"
"github.com/mongodb/mongocli/internal/config"
"github.com/mongodb/mongocli/internal/flag"
"github.com/mongodb/mongocli/internal/store"
"github.com/mongodb/mongocli/internal/usage"
"github.com/spf13/cobra"
)

type DescribeOpts struct {
cli.GlobalOpts
cli.OutputOpts
id string
store store.OpsManagerMaintenanceWindowDescriber
}

func (opts *DescribeOpts) initStore() error {
var err error
opts.store, err = store.New(config.Default())
return err
}

var describeTemplate = `ID PROJECT ID START DATE END DATE
{{.ID}} {{.GroupID}} {{.StartDate}} {{.EndDate}}
`

func (opts *DescribeOpts) Run() error {
r, err := opts.store.OpsManagerMaintenanceWindow(opts.ConfigProjectID(), opts.id)
if err != nil {
return err
}

return opts.Print(r)
}

// mongocli ops-manager maintenanceWindows describe <ID> [--projectId projectId]
func DescribeBuilder() *cobra.Command {
opts := &DescribeOpts{}
cmd := &cobra.Command{
Use: "describe <ID>",
Short: describeMaintenanceWindow,
Args: cobra.ExactArgs(1),
PreRunE: func(cmd *cobra.Command, args []string) error {
return opts.PreRunE(
opts.initStore,
opts.InitOutput(cmd.OutOrStdout(), describeTemplate),
)
},
RunE: func(cmd *cobra.Command, args []string) error {
opts.id = args[0]
return opts.Run()
},
}

cmd.Flags().StringVar(&opts.ProjectID, flag.ProjectID, "", usage.ProjectID)
cmd.Flags().StringVarP(&opts.Output, flag.Output, flag.OutputShort, "", usage.FormatOut)

return cmd
}
59 changes: 59 additions & 0 deletions internal/cli/opsmanager/maintenance/describe_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// 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.

// +build unit

package maintenance

import (
"testing"

"github.com/golang/mock/gomock"
"github.com/mongodb/mongocli/internal/cli"
"github.com/mongodb/mongocli/internal/flag"
"github.com/mongodb/mongocli/internal/mocks"
"go.mongodb.org/ops-manager/opsmngr"
)

func TestDescribe_Run(t *testing.T) {
ctrl := gomock.NewController(t)
mockStore := mocks.NewMockOpsManagerMaintenanceWindowDescriber(ctrl)
defer ctrl.Finish()

expected := &opsmngr.MaintenanceWindow{}

opts := &DescribeOpts{
store: mockStore,
}

mockStore.
EXPECT().
OpsManagerMaintenanceWindow(opts.ProjectID, opts.id).
Return(expected, nil).
Times(1)

err := opts.Run()
if err != nil {
t.Fatalf("Run() unexpected error: %v", err)
}
}

func TestDescrieBuilder(t *testing.T) {
cli.CmdValidator(
t,
DescribeBuilder(),
0,
[]string{flag.ProjectID},
)
}
9 changes: 5 additions & 4 deletions internal/cli/opsmanager/maintenance/descriptions.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@
package maintenance

const (
maintenanceWindows = "Manage Ops Manager/Cloud Manager maintenance windows."
createMaintenanceWindow = "Create a maintenance window."
listMaintenanceWindows = "List maintenance windows."
deleteMaintenanceWindow = "Delete a maintenance window."
maintenanceWindows = "Manage Ops Manager/Cloud Manager maintenance windows."
createMaintenanceWindow = "Create a maintenance window."
listMaintenanceWindows = "List maintenance windows."
deleteMaintenanceWindow = "Delete a maintenance window."
describeMaintenanceWindow = "Get a maintenance window."
)
1 change: 1 addition & 0 deletions internal/cli/opsmanager/maintenance/maintenance.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ func Builder() *cobra.Command {
CreateBuilder(),
ListBuilder(),
DeleteBuilder(),
DescribeBuilder(),
)

return cmd
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/opsmanager/maintenance/maintenance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func TestBuilder(t *testing.T) {
cli.CmdValidator(
t,
Builder(),
3,
4,
[]string{},
)
}
40 changes: 39 additions & 1 deletion internal/mocks/mock_maintenance.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 16 additions & 1 deletion internal/store/maintenance.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import (
"go.mongodb.org/ops-manager/opsmngr"
)

//go:generate mockgen -destination=../mocks/mock_maintenance.go -package=mocks github.com/mongodb/mongocli/internal/store MaintenanceWindowUpdater,MaintenanceWindowClearer,MaintenanceWindowDeferrer,MaintenanceWindowDescriber,OpsManagerMaintenanceWindowCreator,OpsManagerMaintenanceWindowLister,OpsManagerMaintenanceWindowDeleter
//go:generate mockgen -destination=../mocks/mock_maintenance.go -package=mocks github.com/mongodb/mongocli/internal/store MaintenanceWindowUpdater,MaintenanceWindowClearer,MaintenanceWindowDeferrer,MaintenanceWindowDescriber,OpsManagerMaintenanceWindowCreator,OpsManagerMaintenanceWindowLister,OpsManagerMaintenanceWindowDeleter,OpsManagerMaintenanceWindowDescriber

type MaintenanceWindowUpdater interface {
UpdateMaintenanceWindow(string, *atlas.MaintenanceWindow) error
Expand Down Expand Up @@ -53,6 +53,10 @@ type OpsManagerMaintenanceWindowDeleter interface {
DeleteOpsManagerMaintenanceWindow(string, string) error
}

type OpsManagerMaintenanceWindowDescriber interface {
OpsManagerMaintenanceWindow(string, string) (*opsmngr.MaintenanceWindow, error)
}

// UpdateMaintenanceWindow encapsulates the logic to manage different cloud providers
func (s *Store) UpdateMaintenanceWindow(projectID string, maintenanceWindow *atlas.MaintenanceWindow) error {
switch s.service {
Expand Down Expand Up @@ -129,3 +133,14 @@ func (s *Store) DeleteOpsManagerMaintenanceWindow(projectID, maintenanceWindowID
return fmt.Errorf("unsupported service: %s", s.service)
}
}

// OpsManagerMaintenanceWindow encapsulates the logic to manage different cloud providers
func (s *Store) OpsManagerMaintenanceWindow(projectID, maintenanceWindowID string) (*opsmngr.MaintenanceWindow, error) {
switch s.service {
case config.OpsManagerService, config.CloudManagerService:
log, _, err := s.client.(*opsmngr.Client).MaintenanceWindows.Get(context.Background(), projectID, maintenanceWindowID)
return log, err
default:
return nil, fmt.Errorf("unsupported service: %s", s.service)
}
}

0 comments on commit 042a0d3

Please sign in to comment.