-
Notifications
You must be signed in to change notification settings - Fork 2
Home
This is the GoLang API wrapper for Brocade Virtual Traffic Manager (vTM).
This wrapper uses the REST API interface provided by the vTM, currently version 3.8.
There is also command line interface which can be built by running make
in the root of this repo.
Resource | Create | Read | Update | Delete |
---|---|---|---|---|
Monitor [1] | Y | Y | Y | Y |
Pool | Y | Y | Y | Y |
SSL Server Key | Y | Y | Y | Y |
Traffic IP Group | Y | Y | Y | Y |
Virtual Server | Y | Y | Y | Y |
Rule | Y | Y | Y | Y |
[1] : Currently only HTTP monitoring is supported
import(
"github.com/sky-uk/go-brocade-vtm"
)
In order to get a client object authentication credentials needs to be provided. The REST API transport protocol is by default HTTPS and hence SSL encryption is used by default. Certificate handling behaviour can be controlled via the ignoreSSL flag. More information about the client and the Base API may be found here https://github.com/sky-uk/go-rest-api.
In order to work with monitors, import the monitor package section:
import (
"github.com/sky-uk/go-brocade-vtm/api/monitor"
)
api := monitor.NewGetAll()
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
monitors := api.ResponseObject().(*monitor.MonitorsList)
api := monitor.NewGet( name )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
monitor := api.ResponseObject().(*monitor.Monitor)
newMonitor := monitor.Monitor{
...
}
api := monitor.NewCreate( name, newMonitor )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
monCreated := api.ResponseObject().(*monitor.Monitor)
updateMonitor := monitor.Monitor{
...
}
api := monitor.NewUpdate( name, updateMonitor )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
monUpdated := api.ResponseObject().(*monitor.Monitor)
api := monitor.NewDelete( name )
err := client.Do(api)
if err != nil {
log.Fatal(err)
} else {
log.Printf("Monitor %s deleted", name)
}
In order to work with pools, import the pool package section:
import (
"github.com/sky-uk/go-brocade-vtm/api/pool"
)
api := monitor.NewGetAll()
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
pools := api.ResponseObject().(*pool.LBPoolList)
api := monitor.NewGet(name)
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
pool := api.ResponseObject().(*pool.Pool)
newPool := pool.Pool{
...
}
api := pool.NewCreate( name, newPool )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
poolCreated := api..ResponseObject().(*pool.Pool)
updatePool := pool.Pool{
...
}
api := pool.NewUpdate( name, updatePool )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
poolUpdated := api.ResponseObject().(*pool.Pool)
api := pool.NewDelete( name )
err := client.Do(api)
if err != nil {
log.Fatal(err)
} else {
log.Printf("Pool %s deleted", name)
}
In order to work with server keys, import the pool package section:
import (
"github.com/sky-uk/go-brocade-vtm/api/sslServerKey"
)
api := monitor.NewGetAll()
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
keys := api.ResponseObject().(*sslServerKey.SSLServerKeysList)
api := sslServerKey.NewGet(name)
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
key := api.ResponseObject().(*sslServerKey.SSLServerKey)
newKey := sslServerKey.SSLServerKey{
...
}
api := sslServerKey.NewCreate( name, newKey )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
keyCreated := api.ResponseObject().(*sslServerKey.SSLServerKey)
updateKey := sslServerKey.SSLServerKey{
...
}
api := sslServerKey.NewUpdate( name, updateKey )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
keyUpdated := api.ResponseObject().(*sslServerKey.SSLServerKey)
api := sslServerKey.NewDelete( name )
err := client.Do(api)
if err != nil {
log.Fatal(err)
} else {
log.Printf("Server key %s deleted", name)
}
In order to work with traffic IP groups, import the traffic IP package section:
import (
"github.com/sky-uk/go-brocade-vtm/api/trafficIpGroups"
)
// to get the list of all traffic managers
api := trafficIpGroups.NewGetAll()
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
trafficIPGroups := api.ResponseObject().(*trafficIpGroups.TrafficIPGroupList)
api := trafficIpGroups.NewGet(name)
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
trafficIPGroup := api.ResponseObject().(*trafficIpGroups.TrafficIPGroup)
newTipg := trafficIpGroups.TrafficIPGroup{
...
}
api := trafficIpGroups.NewCreate( name, newTipg )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
tipgCreated := api.ResponseObject().(*trafficIpGroups.TrafficIPGroup)
updateTipg := trafficIpGroups.TrafficIPGroup{
...
}
api := trafficIpGroups.NewUpdate( name, updateTipg )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
tipgUpdated := api.ResponseObject().(*trafficIpGroups.TrafficIPGroup)
api := trafficIpGroups.NewDelete( name )
err := client.Do(api)
if err != nil {
log.Fatal(err)
} else {
log.Printf("Traffic IP group %s deleted", name)
}
Traffic IP Group Managers are only used by Traffic IP Group to retrieve a list of Traffic Mangers when creating a Traffic IP Group.
In order to work with Traffic IP Group Managers, import the Traffic IP Group package section:
import (
"github.com/sky-uk/go-brocade-vtm/api/traffic_ip_group_managers"
)
api := trafficIpGroupManager.NewGetAll()
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
trafficIPGroupManagers := api.ResponseObject().(*trafficIpGroupManager.TrafficManagerChildren)
In order to work with virtual servers, import the virtual server package section:
import (
"github.com/sky-uk/go-brocade-vtm/api/virtualserver"
)
api := virtualserver.NewGetAll()
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
virtualServer := api.ResponseObject().(*virtualserver.VirtualServersList)
api := virtualserver.NewGet(name)
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
virtualServer := api.ResponseObject().(*virtualserver.VirtualServer)
newVS := virtualserver.VirtualServer{
...
}
api := virtualserver.NewCreate( name, newVS )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
vsCreated := api.ResponseObject().(*virtualserver.VirtualServer)
updateVS := virtualserver.VirtualServer{
...
}
api := virtualserver.NewUpdate( name, updateVS )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
vsUpdated := api.ResponseObject().(*virtualserver.VirtualServer)
api := virtualserver.NewDelete( name )
err := client.Do(api)
if err != nil {
log.Fatal(err)
} else {
log.Printf("Virtual server %s deleted", name)
}
In order to work with rules, import the rule package section:
```
import (
"github.com/sky-uk/go-brocade-vtm/api/rule"
)
```
api := rule.NewGetAll()
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
rules := api.ResponseObject().(*rule.Rules)
api := rule.NewGet(name)
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
// Returns the traffic script as a string
trafficScript := api.ResponseObject().(*[]byte)
ruleName := "my-rule"
trafficScript := []byte(`
if( string.ipmaskmatch( request.getremoteip(), "192.168.123.10" ) ){
connection.discard();
}`)
api := rule.NewCreate( ruleName, trafficScript )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
ruleName := "my-rule"
updatedTrafficScript := []byte(`
if( string.ipmaskmatch( request.getremoteip(), "192.168.123.10" ) ){
connection.discard();
}`)
api := rule.NewUpdate( ruleName, updatedTrafficScript )
err := client.Do(api)
if err != nil {
log.Fatal(err)
}
nameRuleToDelete := "my-rule"
api := rule.NewDelete( nameRuleToDelete )
err := client.Do(api)
if err != nil {
log.Fatal(err)
} else {
log.Printf("Rule %s deleted", nameRuleToDelete)
}
Run make
in the root of the repository to build the go-brocade-vtm-cli
binary. Once built the binary may be found in the root of the repository.
Set the following shell environment variables to allow the cli to make changes to a Brocade vTM. Note that the cli automatically prefixes the value of BROCADEVTM_SERVER with https://.
$ export BROCADEVTM_USERNAME=admin
$ export BROCADEVTM_PASSWORD=myPassword
$ export BROCADEVTM_SERVER=my-brocade-vtm.example.com:9070
$ ./go-brocade-vtm-cli -h
Monitor is partially implemented. The following attributes may be specified when creating or updating a monitor:
- authentication (Optional, Default: none, basic-auth string used to authenticate when testing a service)
- delay (Optional, Default: 3, minimum seconds between calls to an endpoint)
- failures (Optional, Default: 3, number of consecutive failed calls to an endpoint)
- http-body-regex (Optional, Default: none, regular expression patter to match in the response body)
- http-host-header (Optional, Default: none, host header sent in test request)
- http-path (Optional, Default: '/', the endpoint to call)
- name (Required, Default: none, name of the monitor)
- timeout (Optional, Default: 3, maximum runtime of a call to an endpoint)
- type (Optional, Default: http, type of monitor to use when calling an endpoint)
- use-ssl (Optional, Default: false, whether the monitor should use SSL when calling the endpoint)
- verbose (Optional, Default: false, whether the monitor should emit verbose logging)
$ ./go-brocade-vtm-cli monitor-create -name example-monitor -delay 10 -failures 2 -http-path /health-check -timeout 2 -verbose -type http
Show all monitors and their associated endpoint
$ ./go-brocade-vtm-cli monitor-show-all
Show a monitor and it's attributes
$ ./go-brocade-vtm-cli monitor-show -name example-monitor
Note: if an attribute isn't specified on the command line it will revert to it's default. See above for defaults.
$ ./go-brocade-vtm-cli monitor-update -name example-monitor -delay 10 -failures 2 -http-path /my-app/health-check -timeout 2 -verbose -type http
$ ./go-brocade-vtm-cli monitor-delete -name example-monitor
To create a rule ensure the traffic script is in the file /path/to/traffic_script.
$ ./go-brocade-vtm-cli rule-create -name my-rule -script /path/to/traffic_script
To list all rules.
$ ./go-brocade-vtm-cli rule-show-all
To show a rule called 'my-rule'.
$ ./go-brocade-vtm-cli rule-show -name my-rule
To update a rule called 'my-rule' with the traffic script (file) /path/to/updated_traffic_script.
$ ./go-brocade-vtm-cli rule-update -name my-rule -script /path/to/updated_traffic_script
To delete a rule
$ ./go-brocade-vtm-cli rule-delete -name my-rule
*Note: Traffic IP Groups uses Traffic IP Group Managers to obtain a list of Traffic Managers. Traffic IP Group Managers isn't for direct use.