-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathset_weights.go
125 lines (106 loc) · 3.09 KB
/
set_weights.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package main
import (
"errors"
"fmt"
"os"
"strconv"
"strings"
"code.cloudfoundry.org/cli/plugin"
"github.com/tstannard/set-weights-plugin/helpers"
)
type UpdateRouteWeightPlugin struct {
CliClient cliClient
}
// Models
//go:generate counterfeiter -o fakes/cli_client.go --fake-name CliClient . cliClient
type cliClient interface {
GetAppGUID(cliConnection plugin.CliConnection, appName string) (string, error)
GetDomainGUID(cliConnection plugin.CliConnection, domainName string) (string, error)
GetRouteGUID(cliConnection plugin.CliConnection, hostName string, domainGuid string) (string, error)
GetRouteMappingGUID(cliConnection plugin.CliConnection, appGUID string, routeGUID string) (string, error)
SetRouteMappingWeight(cliConnection plugin.CliConnection, routeMappingGUID string, routeWeight int) error
}
// Plugin
func (c *UpdateRouteWeightPlugin) Run(cliConnection plugin.CliConnection, args []string) {
if args[0] == "update-route-weight" {
err := c.SetWeight(cliConnection, args)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
}
func (c *UpdateRouteWeightPlugin) GetMetadata() plugin.PluginMetadata {
return plugin.PluginMetadata{
Name: "UpdateRouteWeightPlugin",
Version: plugin.VersionType{
Major: 1,
Minor: 1,
Build: 0,
},
MinCliVersion: plugin.VersionType{
Major: 6,
Minor: 7,
Build: 0,
},
Commands: []plugin.Command{
{
Name: "update-route-weight",
HelpText: "Update Route Weight help text",
UsageDetails: plugin.Usage{
Usage: "update-route-weight\n cf update-route-weight APP_NAME ROUTE WEIGHT",
},
},
},
}
}
func (c *UpdateRouteWeightPlugin) SetWeight(cliConnection plugin.CliConnection, args []string) error {
appName, host, domain, routeWeight, err := parseArgs(args)
if err != nil {
return err
}
appGUID, err := c.CliClient.GetAppGUID(cliConnection, appName)
if err != nil {
return err
}
domainGUID, err := c.CliClient.GetDomainGUID(cliConnection, domain)
if err != nil {
return err
}
routeGUID, err := c.CliClient.GetRouteGUID(cliConnection, host, domainGUID)
if err != nil {
return err
}
routeMappingGUID, err := c.CliClient.GetRouteMappingGUID(cliConnection, appGUID, routeGUID)
if err != nil {
return err
}
err = c.CliClient.SetRouteMappingWeight(cliConnection, routeMappingGUID, routeWeight)
if err != nil {
return err
}
fmt.Println("Successfully set route mapping weight.")
return nil
}
func parseArgs(args []string) (appName string, host string, domain string, weight int, err error) {
if len(args) < 3 {
return "", "", "", 0, errors.New("not enough arguments provided")
}
parsedWeight, err := strconv.ParseInt(args[3], 10, 64)
if err != nil {
return "", "", "", 0, fmt.Errorf("could not parse route weight: %s", err)
}
route := args[2]
idx := strings.Index(route, ".")
if idx == -1 {
return "", "", "", 0, fmt.Errorf("invalid route format (e.g hostname.domain)")
}
host = route[0:idx]
domain = route[idx+1 : len(route)]
return args[1], host, domain, int(parsedWeight), nil
}
func main() {
plugin.Start(&UpdateRouteWeightPlugin{
CliClient: &helpers.CliClient{},
})
}