Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ecloud dedicated hosts #107

Merged
merged 6 commits into from
Jun 23, 2021
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion cmd/ecloud/ecloud.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ func ECloudRootCmd(f factory.ClientFactory, fs afero.Fs) *cobra.Command {
cmd.AddCommand(ecloudVirtualMachineRootCmd(f))
cmd.AddCommand(ecloudSolutionRootCmd(f))
cmd.AddCommand(ecloudSiteRootCmd(f))
cmd.AddCommand(ecloudHostRootCmd(f))
cmd.AddCommand(ecloudV1HostRootCmd(f))
cmd.AddCommand(ecloudFirewallRootCmd(f))
cmd.AddCommand(ecloudPodRootCmd(f))
cmd.AddCommand(ecloudDatastoreRootCmd(f))
Expand All @@ -37,11 +37,15 @@ func ECloudRootCmd(f factory.ClientFactory, fs afero.Fs) *cobra.Command {
}
// -- eCloud v2
if v2envset || !v1envset {
cmd.AddCommand(ecloudAvailabilityZoneRootCmd(f))
cmd.AddCommand(ecloudDHCPRootCmd(f))
cmd.AddCommand(ecloudFirewallPolicyRootCmd(f))
cmd.AddCommand(ecloudFirewallRuleRootCmd(f))
cmd.AddCommand(ecloudFirewallRulePortRootCmd(f))
cmd.AddCommand(ecloudFloatingIPRootCmd(f))
cmd.AddCommand(ecloudHostRootCmd(f))
cmd.AddCommand(ecloudHostGroupRootCmd(f))
cmd.AddCommand(ecloudHostSpecRootCmd(f))
cmd.AddCommand(ecloudImageRootCmd(f))
cmd.AddCommand(ecloudInstanceRootCmd(f))
cmd.AddCommand(ecloudNetworkRootCmd(f))
Expand Down
92 changes: 92 additions & 0 deletions cmd/ecloud/ecloud_availabilityzone.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package ecloud

import (
"errors"
"fmt"

"github.com/spf13/cobra"
"github.com/ukfast/cli/internal/pkg/factory"
"github.com/ukfast/cli/internal/pkg/helper"
"github.com/ukfast/cli/internal/pkg/output"
"github.com/ukfast/sdk-go/pkg/service/ecloud"
)

func ecloudAvailabilityZoneRootCmd(f factory.ClientFactory) *cobra.Command {
cmd := &cobra.Command{
Use: "availabilityzone",
Short: "sub-commands relating to availability zones",
Aliases: []string{
"az",
},
}

// Child commands
cmd.AddCommand(ecloudAvailabilityZoneListCmd(f))
cmd.AddCommand(ecloudAvailabilityZoneShowCmd(f))

return cmd
}

func ecloudAvailabilityZoneListCmd(f factory.ClientFactory) *cobra.Command {
cmd := &cobra.Command{
Use: "list",
Short: "Lists availability zones",
Long: "This command lists availability zones",
Example: "ukfast ecloud availabilityzone list",
RunE: ecloudCobraRunEFunc(f, ecloudAvailabilityZoneList),
}

cmd.Flags().String("name", "", "Availability zone name for filtering")
cmd.Flags().String("region", "", "Region ID for filtering")

return cmd
}

func ecloudAvailabilityZoneList(service ecloud.ECloudService, cmd *cobra.Command, args []string) error {
params, err := helper.GetAPIRequestParametersFromFlags(cmd,
helper.NewStringFilterFlagOption("name", "name"),
helper.NewStringFilterFlagOption("region", "region_id"),
)
if err != nil {
return err
}

zones, err := service.GetAvailabilityZones(params)
if err != nil {
return fmt.Errorf("Error retrieving availability zones: %s", err)
}

return output.CommandOutput(cmd, OutputECloudAvailabilityZonesProvider(zones))
}

func ecloudAvailabilityZoneShowCmd(f factory.ClientFactory) *cobra.Command {
return &cobra.Command{
Use: "show <zone: id>...",
Short: "Shows an availability zone",
Long: "This command shows one or more availability zones",
Example: "ukfast ecloud availabilityzone show az-abcdef12",
Args: func(cmd *cobra.Command, args []string) error {
if len(args) < 1 {
return errors.New("Missing availability zone")
}

return nil
},
RunE: ecloudCobraRunEFunc(f, ecloudAvailabilityZoneShow),
}
}

func ecloudAvailabilityZoneShow(service ecloud.ECloudService, cmd *cobra.Command, args []string) error {
var zones []ecloud.AvailabilityZone
for _, arg := range args {
zone, err := service.GetAvailabilityZone(arg)
if err != nil {
output.OutputWithErrorLevelf("Error retrieving availability zone [%s]: %s", arg, err)
continue
}

zones = append(zones, zone)
}

return output.CommandOutput(cmd, OutputECloudAvailabilityZonesProvider(zones))
}
109 changes: 109 additions & 0 deletions cmd/ecloud/ecloud_availabilityzone_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package ecloud

import (
"errors"
"testing"

gomock "github.com/golang/mock/gomock"
"github.com/spf13/cobra"
"github.com/stretchr/testify/assert"
"github.com/ukfast/cli/internal/pkg/clierrors"
"github.com/ukfast/cli/test/mocks"
"github.com/ukfast/cli/test/test_output"
"github.com/ukfast/sdk-go/pkg/service/ecloud"
)

func Test_ecloudAvailabilityZoneList(t *testing.T) {
t.Run("DefaultRetrieve", func(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()

service := mocks.NewMockECloudService(mockCtrl)

service.EXPECT().GetAvailabilityZones(gomock.Any()).Return([]ecloud.AvailabilityZone{}, nil).Times(1)

ecloudAvailabilityZoneList(service, &cobra.Command{}, []string{})
})

t.Run("MalformedFlag_ReturnsError", func(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()

service := mocks.NewMockECloudService(mockCtrl)
cmd := &cobra.Command{}
cmd.Flags().StringArray("filter", []string{"invalidfilter"}, "")

err := ecloudAvailabilityZoneList(service, cmd, []string{})

assert.IsType(t, &clierrors.ErrInvalidFlagValue{}, err)
})

t.Run("GetAvailabilityZonesError_ReturnsError", func(t *testing.T) {

mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()

service := mocks.NewMockECloudService(mockCtrl)

service.EXPECT().GetAvailabilityZones(gomock.Any()).Return([]ecloud.AvailabilityZone{}, errors.New("test error")).Times(1)

err := ecloudAvailabilityZoneList(service, &cobra.Command{}, []string{})

assert.Equal(t, "Error retrieving availability zones: test error", err.Error())
})
}

func Test_ecloudAvailabilityZoneShowCmd_Args(t *testing.T) {
t.Run("ValidArgs_NoError", func(t *testing.T) {
err := ecloudAvailabilityZoneShowCmd(nil).Args(nil, []string{"az-abcdef12"})

assert.Nil(t, err)
})

t.Run("InvalidArgs_Error", func(t *testing.T) {
err := ecloudAvailabilityZoneShowCmd(nil).Args(nil, []string{})

assert.NotNil(t, err)
assert.Equal(t, "Missing availability zone", err.Error())
})
}

func Test_ecloudAvailabilityZoneShow(t *testing.T) {
t.Run("SingleAvailabilityZone", func(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()

service := mocks.NewMockECloudService(mockCtrl)

service.EXPECT().GetAvailabilityZone("az-abcdef12").Return(ecloud.AvailabilityZone{}, nil).Times(1)

ecloudAvailabilityZoneShow(service, &cobra.Command{}, []string{"az-abcdef12"})
})

t.Run("MultipleAvailabilityZones", func(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()

service := mocks.NewMockECloudService(mockCtrl)

gomock.InOrder(
service.EXPECT().GetAvailabilityZone("az-abcdef12").Return(ecloud.AvailabilityZone{}, nil),
service.EXPECT().GetAvailabilityZone("az-abcdef23").Return(ecloud.AvailabilityZone{}, nil),
)

ecloudAvailabilityZoneShow(service, &cobra.Command{}, []string{"az-abcdef12", "az-abcdef23"})
})

t.Run("GetAvailabilityZoneError_OutputsError", func(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()

service := mocks.NewMockECloudService(mockCtrl)

service.EXPECT().GetAvailabilityZone("az-abcdef12").Return(ecloud.AvailabilityZone{}, errors.New("test error"))

test_output.AssertErrorOutput(t, "Error retrieving availability zone [az-abcdef12]: test error\n", func() {
ecloudAvailabilityZoneShow(service, &cobra.Command{}, []string{"az-abcdef12"})
})
})
}
18 changes: 2 additions & 16 deletions cmd/ecloud/ecloud_dhcp.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,7 @@ func ecloudDHCPListCmd(f factory.ClientFactory) *cobra.Command {
Short: "Lists DHCPs",
Long: "This command lists DHCPs",
Example: "ukfast ecloud dhcp list",
RunE: func(cmd *cobra.Command, args []string) error {
c, err := f.NewClient()
if err != nil {
return err
}

return ecloudDHCPList(c.ECloudService(), cmd, args)
},
RunE: ecloudCobraRunEFunc(f, ecloudDHCPList),
}

cmd.Flags().String("name", "", "DHCP name for filtering")
Expand Down Expand Up @@ -76,14 +69,7 @@ func ecloudDHCPShowCmd(f factory.ClientFactory) *cobra.Command {

return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
c, err := f.NewClient()
if err != nil {
return err
}

return ecloudDHCPShow(c.ECloudService(), cmd, args)
},
RunE: ecloudCobraRunEFunc(f, ecloudDHCPShow),
}
}

Expand Down
18 changes: 2 additions & 16 deletions cmd/ecloud/ecloud_firewallrule.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,7 @@ func ecloudFirewallRuleListCmd(f factory.ClientFactory) *cobra.Command {
Short: "Lists firewall rules",
Long: "This command lists firewall rules",
Example: "ukfast ecloud firewallrule list",
RunE: func(cmd *cobra.Command, args []string) error {
c, err := f.NewClient()
if err != nil {
return err
}

return ecloudFirewallRuleList(c.ECloudService(), cmd, args)
},
RunE: ecloudCobraRunEFunc(f, ecloudFirewallRuleList),
}

cmd.Flags().String("policy", "", "Firewall policy ID for filtering")
Expand Down Expand Up @@ -82,14 +75,7 @@ func ecloudFirewallRuleShowCmd(f factory.ClientFactory) *cobra.Command {

return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
c, err := f.NewClient()
if err != nil {
return err
}

return ecloudFirewallRuleShow(c.ECloudService(), cmd, args)
},
RunE: ecloudCobraRunEFunc(f, ecloudFirewallRuleShow),
}
}

Expand Down
18 changes: 2 additions & 16 deletions cmd/ecloud/ecloud_firewallruleport.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,7 @@ func ecloudFirewallRulePortListCmd(f factory.ClientFactory) *cobra.Command {
Short: "Lists firewall rule ports",
Long: "This command lists firewall rule ports",
Example: "ukfast ecloud firewallruleport list",
RunE: func(cmd *cobra.Command, args []string) error {
c, err := f.NewClient()
if err != nil {
return err
}

return ecloudFirewallRulePortList(c.ECloudService(), cmd, args)
},
RunE: ecloudCobraRunEFunc(f, ecloudFirewallRulePortList),
}

cmd.Flags().String("rule", "", "Firewall rule ID for filtering")
Expand Down Expand Up @@ -78,14 +71,7 @@ func ecloudFirewallRulePortShowCmd(f factory.ClientFactory) *cobra.Command {

return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
c, err := f.NewClient()
if err != nil {
return err
}

return ecloudFirewallRulePortShow(c.ECloudService(), cmd, args)
},
RunE: ecloudCobraRunEFunc(f, ecloudFirewallRulePortShow),
}
}

Expand Down
18 changes: 2 additions & 16 deletions cmd/ecloud/ecloud_floatingip.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,7 @@ func ecloudFloatingIPListCmd(f factory.ClientFactory) *cobra.Command {
Short: "Lists floating IPs",
Long: "This command lists floating IPs",
Example: "ukfast ecloud floatingip list",
RunE: func(cmd *cobra.Command, args []string) error {
c, err := f.NewClient()
if err != nil {
return err
}

return ecloudFloatingIPList(c.ECloudService(), cmd, args)
},
RunE: ecloudCobraRunEFunc(f, ecloudFloatingIPList),
}
}

Expand Down Expand Up @@ -73,14 +66,7 @@ func ecloudFloatingIPShowCmd(f factory.ClientFactory) *cobra.Command {

return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
c, err := f.NewClient()
if err != nil {
return err
}

return ecloudFloatingIPShow(c.ECloudService(), cmd, args)
},
RunE: ecloudCobraRunEFunc(f, ecloudFloatingIPShow),
}
}

Expand Down
Loading