Skip to content

Commit

Permalink
Add integration test cases
Browse files Browse the repository at this point in the history
  • Loading branch information
asaha2 committed Apr 9, 2024
1 parent d94ea64 commit 00041d6
Show file tree
Hide file tree
Showing 3 changed files with 201 additions and 11 deletions.
7 changes: 6 additions & 1 deletion commands/displayers/load_balancer.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ func (lb *LoadBalancer) Cols() []string {
"ID",
"IP",
"Name",
"Type",
"Status",
"Created",
"Region",
Expand All @@ -58,6 +59,7 @@ func (lb *LoadBalancer) ColMap() map[string]string {
"ID": "ID",
"IP": "IP",
"Name": "Name",
"Type": "Type",
"Status": "Status",
"Created": "Created At",
"Region": "Region",
Expand Down Expand Up @@ -87,9 +89,9 @@ func (lb *LoadBalancer) KV() []map[string]any {
"ID": l.ID,
"IP": l.IP,
"Name": l.Name,
"Type": l.Type,
"Status": l.Status,
"Created": l.Created,
"Region": l.Region.Slug,
"VPCUUID": l.VPCUUID,
"Tag": l.Tag,
"DropletIDs": strings.Trim(strings.Replace(fmt.Sprint(l.DropletIDs), " ", ",", -1), "[]"),
Expand All @@ -99,6 +101,9 @@ func (lb *LoadBalancer) KV() []map[string]any {
"ForwardingRules": strings.Join(forwardingRules, " "),
"DisableLetsEncryptDNSRecords": toBool(l.DisableLetsEncryptDNSRecords),
}
if l.Region != nil {
o["Region"] = l.Region.Slug
}
if l.SizeSlug != "" {
o["Size"] = l.SizeSlug
}
Expand Down
20 changes: 10 additions & 10 deletions commands/load_balancers.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ With the load-balancer command, you can list, create, or delete load balancers,
AddStringFlag(cmdLoadBalancerCreate, doctl.ArgLoadBalancerName, "", "",
"The load balancer's name", requiredOpt())
AddStringFlag(cmdLoadBalancerCreate, doctl.ArgRegionSlug, "", "",
"The load balancer's region, e.g.: `nyc1`", requiredOpt())
"The load balancer's region, e.g.: `nyc1`")
AddStringFlag(cmdLoadBalancerCreate, doctl.ArgSizeSlug, "", "",
fmt.Sprintf("The load balancer's size, e.g.: `lb-small`. Only one of %s and %s should be used", doctl.ArgSizeSlug, doctl.ArgSizeUnit))
AddIntFlag(cmdLoadBalancerCreate, doctl.ArgSizeUnit, "", 0,
Expand Down Expand Up @@ -402,7 +402,7 @@ func RunLoadBalancerPurgeCache(c *CmdConfig) error {
return err
}

if force || AskForConfirmDelete("load balancer", 1) == nil {
if force || AskForConfirm("purge CDN cache for global load balancer") == nil {
lbs := c.LoadBalancers()
if err := lbs.PurgeCache(lbID); err != nil {
return err
Expand All @@ -423,7 +423,7 @@ func extractForwardingRules(s string) (forwardingRules []godo.ForwardingRule, er

for _, v := range list {
forwardingRule := new(godo.ForwardingRule)
if err := fillStructFromStringSliceArgs(forwardingRule, v); err != nil {
if err := fillStructFromStringSliceArgs(forwardingRule, v, ","); err != nil {
return nil, err
}

Expand All @@ -440,7 +440,7 @@ func extractDomains(s []string) (domains []*godo.LBDomain, err error) {

for _, v := range s {
domain := new(godo.LBDomain)
if err := fillStructFromStringSliceArgs(domain, v); err != nil {
if err := fillStructFromStringSliceArgs(domain, v, " "); err != nil {
return nil, err
}

Expand All @@ -450,12 +450,12 @@ func extractDomains(s []string) (domains []*godo.LBDomain, err error) {
return domains, err
}

func fillStructFromStringSliceArgs(obj any, s string) error {
func fillStructFromStringSliceArgs(obj any, s string, delimiter string) error {
if len(s) == 0 {
return nil
}

kvs := strings.Split(s, ",")
kvs := strings.Split(s, delimiter)
m := map[string]string{}

for _, v := range kvs {
Expand Down Expand Up @@ -589,7 +589,7 @@ func buildRequestFromArgs(c *CmdConfig, r *godo.LoadBalancerRequest) error {
}

stickySession := new(godo.StickySessions)
if err := fillStructFromStringSliceArgs(stickySession, ssa); err != nil {
if err := fillStructFromStringSliceArgs(stickySession, ssa, ","); err != nil {
return err
}
r.StickySessions = stickySession
Expand All @@ -600,7 +600,7 @@ func buildRequestFromArgs(c *CmdConfig, r *godo.LoadBalancerRequest) error {
}

healthCheck := new(godo.HealthCheck)
if err := fillStructFromStringSliceArgs(healthCheck, hca); err != nil {
if err := fillStructFromStringSliceArgs(healthCheck, hca, ","); err != nil {
return err
}
r.HealthCheck = healthCheck
Expand Down Expand Up @@ -667,7 +667,7 @@ func buildRequestFromArgs(c *CmdConfig, r *godo.LoadBalancerRequest) error {
}

glbSettings := new(godo.GLBSettings)
if err := fillStructFromStringSliceArgs(glbSettings, glbs); err != nil {
if err := fillStructFromStringSliceArgs(glbSettings, glbs, ","); err != nil {
return err
}
if glbSettings.TargetProtocol != "" && glbSettings.TargetPort != 0 {
Expand All @@ -680,7 +680,7 @@ func buildRequestFromArgs(c *CmdConfig, r *godo.LoadBalancerRequest) error {
}

cdnSettings := new(godo.CDNSettings)
if err := fillStructFromStringSliceArgs(cdnSettings, cdns); err != nil {
if err := fillStructFromStringSliceArgs(cdnSettings, cdns, ","); err != nil {
return err
}
if r.GLBSettings != nil {
Expand Down
185 changes: 185 additions & 0 deletions integration/glb_create_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
package integration

import (
"fmt"
"io"
"net/http"
"net/http/httptest"
"net/http/httputil"
"os/exec"
"strings"
"testing"

"github.com/sclevine/spec"
"github.com/stretchr/testify/require"
)

var _ = suite("compute/load-balancer/create", func(t *testing.T, when spec.G, it spec.S) {
const testUUID = "4de7ac8b-495b-4884-9a69-1050c6793cd6"
var (
expect *require.Assertions
server *httptest.Server
cmd *exec.Cmd
)

it.Before(func() {
expect = require.New(t)

server = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
switch req.URL.Path {
case "/v2/load_balancers":
auth := req.Header.Get("Authorization")
if auth != "Bearer some-magic-token" {
w.WriteHeader(http.StatusUnauthorized)
return
}

if req.Method != http.MethodPost {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}

reqBody, err := io.ReadAll(req.Body)
expect.NoError(err)

expect.JSONEq(glbCreateRequest, string(reqBody))

w.Write([]byte(glbCreateResponse))
default:
dump, err := httputil.DumpRequest(req, true)
if err != nil {
t.Fatal("failed to dump request")
}

t.Fatalf("received unknown request: %s", dump)
}
}))

cmd = exec.Command(builtBinaryPath,
"-t", "some-magic-token",
"-u", server.URL,
"compute",
"load-balancer",
)
})

when("command is create with global config", func() {
it("creates a global load balancer", func() {
args := append([]string{"create"}, []string{
"--name", "my-glb-name",
"--type", "GLOBAL",
"--domains", "name:test-domain-1 is_managed:true certificate_id:test-cert-id-1",
"--domains", "name:test-domain-2 is_managed:false certificate_id:test-cert-id-2",
"--glb-settings", "target_protocol:http,target_port:80",
"--glb-cdn-settings", "is_enabled:true",
"--target-lb-ids", "target-lb-id-1",
"--target-lb-ids", "target-lb-id-2",
}...)
cmd.Args = append(cmd.Args, args...)

output, err := cmd.CombinedOutput()
expect.NoError(err, fmt.Sprintf("received error output: %s", output))
expect.Equal(strings.TrimSpace(glbCreateOutput), strings.TrimSpace(string(output)))
})
})
})

const (
glbCreateRequest = `
{
"name": "my-glb-name",
"algorithm": "round_robin",
"type": "GLOBAL",
"health_check": {},
"sticky_sessions": {},
"disable_lets_encrypt_dns_records": false,
"domains": [
{
"name": "test-domain-1",
"is_managed": true,
"certificate_id": "test-cert-id-1"
},
{
"name": "test-domain-2",
"is_managed": false,
"certificate_id": "test-cert-id-2"
}
],
"glb_settings": {
"target_protocol": "http",
"target_port": 80,
"cdn": {
"is_enabled": true
}
},
"target_load_balancer_ids": [
"target-lb-id-1",
"target-lb-id-2"
]
}`
glbCreateResponse = `
{
"load_balancer": {
"id": "cf9f1aa1-e1f8-4f3a-ad71-124c45e204b8",
"name": "my-glb-name",
"ip": "",
"size": "lb-small",
"size_unit": 1,
"type": "GLOBAL",
"algorithm": "round_robin",
"status": "new",
"created_at": "2024-04-09T16:10:11Z",
"forwarding_rules": [],
"health_check": {
"protocol": "http",
"port": 80,
"path": "/",
"check_interval_seconds": 10,
"response_timeout_seconds": 5,
"healthy_threshold": 5,
"unhealthy_threshold": 3
},
"sticky_sessions": {
"type": "none"
},
"tag": "",
"droplet_ids": [],
"redirect_http_to_https": false,
"enable_proxy_protocol": false,
"enable_backend_keepalive": false,
"project_id": "1e02c6d8-aa24-477e-bc50-837b44e26cb3",
"disable_lets_encrypt_dns_records": false,
"http_idle_timeout_seconds": 60,
"domains": [
{
"name": "test-domain-1",
"is_managed": true,
"certificate_id": "test-cert-id-1",
"status": "CREATING"
},
{
"name": "test-domain-1-2",
"is_managed": false,
"certificate_id": "test-cert-id-2",
"status": "CREATING"
}
],
"glb_settings": {
"target_protocol": "HTTP",
"target_port": 80,
"cdn": {
"is_enabled": true
}
},
"target_load_balancer_ids": [
"target-lb-id-1",
"target-lb-id-2"
]
}
}`
glbCreateOutput = `
Notice: Load balancer created
ID IP Name Type Status Created At Region Size Size Unit VPC UUID Tag Droplet IDs SSL Sticky Sessions Health Check Forwarding Rules Disable Lets Encrypt DNS Records
cf9f1aa1-e1f8-4f3a-ad71-124c45e204b8 my-glb-name GLOBAL new 2024-04-09T16:10:11Z <nil> lb-small 1 false type:none,cookie_name:,cookie_ttl_seconds:0 protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3 false
`
)

0 comments on commit 00041d6

Please sign in to comment.