Skip to content

Commit

Permalink
add support for retrieving certificate contents from files (#46)
Browse files Browse the repository at this point in the history
  • Loading branch information
0x4c6565 committed Feb 7, 2020
1 parent 822a853 commit 39c2616
Show file tree
Hide file tree
Showing 7 changed files with 122 additions and 98 deletions.
20 changes: 10 additions & 10 deletions cmd/ddosx_domain_acl_ip.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ package cmd

import (
"errors"
"fmt"

"github.com/ukfast/sdk-go/pkg/connection"
"github.com/ukfast/sdk-go/pkg/ptr"

"github.com/spf13/cobra"
"github.com/ukfast/cli/internal/pkg/clierrors"
"github.com/ukfast/cli/internal/pkg/helper"
"github.com/ukfast/cli/internal/pkg/output"
"github.com/ukfast/sdk-go/pkg/service/ddosx"
Expand Down Expand Up @@ -115,27 +117,26 @@ func ddosxDomainACLIPRuleCreateCmd() *cobra.Command {

return nil
},
Run: func(cmd *cobra.Command, args []string) {
ddosxDomainACLIPRuleCreate(getClient().DDoSXService(), cmd, args)
RunE: func(cmd *cobra.Command, args []string) error {
return ddosxDomainACLIPRuleCreate(getClient().DDoSXService(), cmd, args)
},
}

cmd.Flags().String("ip", "", "IP address for IP ACL rule")
cmd.MarkFlagRequired("ip")
cmd.Flags().String("uri", "", "Relative URI for IP ACL rule, e.g. path/to/file.jpg")
cmd.Flags().String("uri", "", "Path for IP ACL rule, e.g. path/to/file.jpg")
cmd.Flags().String("mode", "", "Mode for IP ACL rule. Valid values: "+ddosx.ACLIPModeEnum.String())
cmd.MarkFlagRequired("mode")

return cmd
}

func ddosxDomainACLIPRuleCreate(service ddosx.DDoSXService, cmd *cobra.Command, args []string) {
func ddosxDomainACLIPRuleCreate(service ddosx.DDoSXService, cmd *cobra.Command, args []string) error {
ip, _ := cmd.Flags().GetString("ip")
mode, _ := cmd.Flags().GetString("mode")
parsedMode, err := ddosx.ParseACLIPMode(mode)
if err != nil {
output.Fatal(err.Error())
return
return clierrors.NewErrInvalidFlagValue("mode", mode, err)
}

createRequest := ddosx.CreateACLIPRuleRequest{}
Expand All @@ -145,17 +146,16 @@ func ddosxDomainACLIPRuleCreate(service ddosx.DDoSXService, cmd *cobra.Command,

id, err := service.CreateDomainACLIPRule(args[0], createRequest)
if err != nil {
output.Fatalf("Error creating domain ACL IP rule: %s", err)
return
return fmt.Errorf("Error creating domain ACL IP rule: %s", err)
}

rule, err := service.GetDomainACLIPRule(args[0], id)
if err != nil {
output.Fatalf("Error retrieving new domain ACL IP rule [%s]: %s", id, err)
return
return fmt.Errorf("Error retrieving new domain ACL IP rule [%s]: %s", id, err)
}

outputDDoSXACLIPRules([]ddosx.ACLIPRule{rule})
return nil
}

func ddosxDomainACLIPRuleUpdateCmd() *cobra.Command {
Expand Down
18 changes: 7 additions & 11 deletions cmd/ddosx_domain_acl_ip_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
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/ptr"
Expand Down Expand Up @@ -174,11 +175,8 @@ func Test_ddosxDomainACLIPRuleCreate(t *testing.T) {
cmd.Flags().Set("uri", "testuri")
cmd.Flags().Set("mode", "invalidmode")

test_output.AssertFatalOutputFunc(t, func(stdErr string) {
assert.Contains(t, stdErr, "Invalid ddosx.ACLIPMode")
}, func() {
ddosxDomainACLIPRuleCreate(service, cmd, []string{"testdomain1.co.uk"})
})
err := ddosxDomainACLIPRuleCreate(service, cmd, []string{"testdomain1.co.uk"})
assert.IsType(t, &clierrors.ErrInvalidFlagValue{}, err)
})

t.Run("CreateDomainACLIPRuleError_OutputsFatal", func(t *testing.T) {
Expand All @@ -194,9 +192,8 @@ func Test_ddosxDomainACLIPRuleCreate(t *testing.T) {

service.EXPECT().CreateDomainACLIPRule("testdomain1.co.uk", gomock.Any()).Return("00000000-0000-0000-0000-000000000000", errors.New("test error")).Times(1)

test_output.AssertFatalOutput(t, "Error creating domain ACL IP rule: test error\n", func() {
ddosxDomainACLIPRuleCreate(service, cmd, []string{"testdomain1.co.uk"})
})
err := ddosxDomainACLIPRuleCreate(service, cmd, []string{"testdomain1.co.uk"})
assert.Equal(t, "Error creating domain ACL IP rule: test error", err.Error())
})

t.Run("CreateDomainACLIPRuleError_OutputsFatal", func(t *testing.T) {
Expand All @@ -215,9 +212,8 @@ func Test_ddosxDomainACLIPRuleCreate(t *testing.T) {
service.EXPECT().GetDomainACLIPRule("testdomain1.co.uk", "00000000-0000-0000-0000-000000000000").Return(ddosx.ACLIPRule{}, errors.New("test error")),
)

test_output.AssertFatalOutput(t, "Error retrieving new domain ACL IP rule [00000000-0000-0000-0000-000000000000]: test error\n", func() {
ddosxDomainACLIPRuleCreate(service, cmd, []string{"testdomain1.co.uk"})
})
err := ddosxDomainACLIPRuleCreate(service, cmd, []string{"testdomain1.co.uk"})
assert.Equal(t, "Error retrieving new domain ACL IP rule [00000000-0000-0000-0000-000000000000]: test error", err.Error())
})
}

Expand Down
96 changes: 77 additions & 19 deletions cmd/ddosx_ssl.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package cmd

import (
"errors"
"fmt"
"io/ioutil"

"github.com/spf13/cobra"
"github.com/ukfast/cli/internal/pkg/helper"
Expand Down Expand Up @@ -97,46 +99,60 @@ func ddosxSSLCreateCmd() *cobra.Command {
Short: "Creates an ssl",
Long: "This command creates an SSL",
Example: "ukfast ddosx ssl create",
Run: func(cmd *cobra.Command, args []string) {
ddosxSSLCreate(getClient().DDoSXService(), cmd, args)
RunE: func(cmd *cobra.Command, args []string) error {
return ddosxSSLCreate(getClient().DDoSXService(), cmd, args)
},
}

cmd.Flags().String("friendly-name", "", "Friendly name for SSL")
cmd.MarkFlagRequired("friendly-name")
cmd.Flags().Int("ukfast-ssl-id", 0, "Optional ID of UKFast SSL to retrieve certificate, key and bundle")
cmd.Flags().String("key", "", "Key for SSL")
cmd.Flags().String("key", "", "Key contents for SSL")
cmd.Flags().String("key-file", "", "Path to file containing key contents for SSL")
cmd.Flags().String("certificate", "", "Certificate contents for SSL")
cmd.Flags().String("certificate-file", "", "Path to file containing certificate contents for SSL")
cmd.Flags().String("ca-bundle", "", "CA bundle contents for SSL")
cmd.Flags().String("ca-bundle-file", "", "Path to file containing CA bundle contents for SSL")

return cmd
}

func ddosxSSLCreate(service ddosx.DDoSXService, cmd *cobra.Command, args []string) {
func ddosxSSLCreate(service ddosx.DDoSXService, cmd *cobra.Command, args []string) error {
createRequest := ddosx.CreateSSLRequest{}
createRequest.FriendlyName, _ = cmd.Flags().GetString("friendly-name")

if cmd.Flags().Changed("ukfast-ssl-id") {
createRequest.UKFastSSLID, _ = cmd.Flags().GetInt("ukfast-ssl-id")
} else {
createRequest.Key, _ = cmd.Flags().GetString("key")
createRequest.Certificate, _ = cmd.Flags().GetString("certificate")
createRequest.CABundle, _ = cmd.Flags().GetString("ca-bundle")
key, err := getCertContent(cmd, "key", "key-file")
if err != nil {
return err
}
certificate, err := getCertContent(cmd, "certificate", "certificate-file")
if err != nil {
return err
}
caBundle, err := getCertContent(cmd, "ca-bundle", "ca-bundle-file")
if err != nil {
return err
}
createRequest.Key = key
createRequest.Certificate = certificate
createRequest.CABundle = caBundle
}

id, err := service.CreateSSL(createRequest)
if err != nil {
output.Fatalf("Error creating ssl: %s", err.Error())
return
return fmt.Errorf("Error creating ssl: %s", err.Error())
}

ssl, err := service.GetSSL(id)
if err != nil {
output.Fatalf("Error retrieving new ssl [%s]: %s", id, err.Error())
return
return fmt.Errorf("Error retrieving new ssl [%s]: %s", id, err.Error())
}

outputDDoSXSSLs([]ddosx.SSL{ssl})
return nil
}

func ddosxSSLUpdateCmd() *cobra.Command {
Expand All @@ -152,21 +168,24 @@ func ddosxSSLUpdateCmd() *cobra.Command {

return nil
},
Run: func(cmd *cobra.Command, args []string) {
ddosxSSLUpdate(getClient().DDoSXService(), cmd, args)
RunE: func(cmd *cobra.Command, args []string) error {
return ddosxSSLUpdate(getClient().DDoSXService(), cmd, args)
},
}

cmd.Flags().String("friendly-name", "", "Friendly name for SSL")
cmd.Flags().Int("ukfast-ssl-id", 0, "Optional ID of UKFast SSL to retrieve certificate, key and bundle")
cmd.Flags().String("key", "", "Key for SSL")
cmd.Flags().String("key", "", "Key contents for SSL")
cmd.Flags().String("key-file", "", "Path to file containing key contents for SSL")
cmd.Flags().String("certificate", "", "Certificate contents for SSL")
cmd.Flags().String("certificate-file", "", "Path to file containing certificate contents for SSL")
cmd.Flags().String("ca-bundle", "", "CA bundle contents for SSL")
cmd.Flags().String("ca-bundle-file", "", "Path to file containing CA bundle contents for SSL")

return cmd
}

func ddosxSSLUpdate(service ddosx.DDoSXService, cmd *cobra.Command, args []string) {
func ddosxSSLUpdate(service ddosx.DDoSXService, cmd *cobra.Command, args []string) error {
patchRequest := ddosx.PatchSSLRequest{}
patchRequest.FriendlyName, _ = cmd.Flags().GetString("friendly-name")

Expand All @@ -183,20 +202,44 @@ func ddosxSSLUpdate(service ddosx.DDoSXService, cmd *cobra.Command, args []strin
patchRequest.CABundle, _ = cmd.Flags().GetString("ca-bundle")
}
}
if cmd.Flags().Changed("ukfast-ssl-id") {
patchRequest.UKFastSSLID, _ = cmd.Flags().GetInt("ukfast-ssl-id")
} else {
if cmd.Flags().Changed("key") || cmd.Flags().Changed("key-file") {
key, err := getCertContent(cmd, "key", "key-file")
if err != nil {
return err
}
patchRequest.Key = key
}
if cmd.Flags().Changed("certificate") || cmd.Flags().Changed("certificate-file") {
certificate, err := getCertContent(cmd, "certificate", "certificate-file")
if err != nil {
return err
}
patchRequest.Certificate = certificate
}
if cmd.Flags().Changed("ca-bundle") || cmd.Flags().Changed("ca-bundle-file") {
caBundle, err := getCertContent(cmd, "ca-bundle", "ca-bundle-file")
if err != nil {
return err
}
patchRequest.CABundle = caBundle
}
}

_, err := service.PatchSSL(args[0], patchRequest)
if err != nil {
output.Fatalf("Error updating ssl: %s", err.Error())
return
return fmt.Errorf("Error updating ssl: %s", err.Error())
}

ssl, err := service.GetSSL(args[0])
if err != nil {
output.Fatalf("Error retrieving updated ssl: %s", err.Error())
return
return fmt.Errorf("Error retrieving updated ssl: %s", err.Error())
}

outputDDoSXSSLs([]ddosx.SSL{ssl})
return nil
}

func ddosxSSLDeleteCmd() *cobra.Command {
Expand Down Expand Up @@ -227,3 +270,18 @@ func ddosxSSLDelete(service ddosx.DDoSXService, cmd *cobra.Command, args []strin
}
}
}

func getCertContent(cmd *cobra.Command, literalFlag, filePathFlag string) (string, error) {
if cmd.Flags().Changed(filePathFlag) {
filePath, _ := cmd.Flags().GetString(filePathFlag)
contentBytes, err := ioutil.ReadFile(filePath)
if err != nil {
return "", err
}

return string(contentBytes), nil
}

content, _ := cmd.Flags().GetString(literalFlag)
return content, nil
}
22 changes: 8 additions & 14 deletions cmd/ddosx_ssl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,8 @@ func Test_ddosxSSLCreate(t *testing.T) {
service.EXPECT().CreateSSL(gomock.Any()).Return("00000000-0000-0000-0000-000000000000", errors.New("test error")),
)

test_output.AssertFatalOutput(t, "Error creating ssl: test error\n", func() {
ddosxSSLCreate(service, cmd, []string{})
})
err := ddosxSSLCreate(service, cmd, []string{})
assert.Equal(t, "Error creating ssl: test error", err.Error())
})

t.Run("GetSSLError_OutputsFatal", func(t *testing.T) {
Expand All @@ -188,9 +187,8 @@ func Test_ddosxSSLCreate(t *testing.T) {
service.EXPECT().GetSSL("00000000-0000-0000-0000-000000000000").Return(ddosx.SSL{}, errors.New("test error")),
)

test_output.AssertFatalOutput(t, "Error retrieving new ssl [00000000-0000-0000-0000-000000000000]: test error\n", func() {
ddosxSSLCreate(service, cmd, []string{})
})
err := ddosxSSLCreate(service, cmd, []string{})
assert.Equal(t, "Error retrieving new ssl [00000000-0000-0000-0000-000000000000]: test error", err.Error())
})
}

Expand Down Expand Up @@ -259,7 +257,6 @@ func Test_ddosxSSLUpdate(t *testing.T) {
})

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

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

Expand All @@ -271,13 +268,11 @@ func Test_ddosxSSLUpdate(t *testing.T) {
service.EXPECT().PatchSSL("00000000-0000-0000-0000-000000000000", gomock.Any()).Return("00000000-0000-0000-0000-000000000000", errors.New("test error")),
)

test_output.AssertFatalOutput(t, "Error updating ssl: test error\n", func() {
ddosxSSLUpdate(service, cmd, []string{"00000000-0000-0000-0000-000000000000"})
})
err := ddosxSSLUpdate(service, cmd, []string{"00000000-0000-0000-0000-000000000000"})
assert.Equal(t, "Error updating ssl: test error", err.Error())
})

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

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

Expand All @@ -290,9 +285,8 @@ func Test_ddosxSSLUpdate(t *testing.T) {
service.EXPECT().GetSSL("00000000-0000-0000-0000-000000000000").Return(ddosx.SSL{}, errors.New("test error")),
)

test_output.AssertFatalOutput(t, "Error retrieving updated ssl: test error\n", func() {
ddosxSSLUpdate(service, cmd, []string{"00000000-0000-0000-0000-000000000000"})
})
err := ddosxSSLUpdate(service, cmd, []string{"00000000-0000-0000-0000-000000000000"})
assert.Equal(t, "Error retrieving updated ssl: test error", err.Error())
})
}

Expand Down
Loading

0 comments on commit 39c2616

Please sign in to comment.