Best Toxiproxy code snippet using toxiproxy.Direction
network.go
Source:network.go  
1// Copyright 2018 The Cockroach Authors.2//3// Use of this software is governed by the Business Source License4// included in the file licenses/BSL.txt.5//6// As of the Change Date specified in that file, in accordance with7// the Business Source License, use of this software will be governed8// by the Apache License, Version 2.0, included in the file9// licenses/APL.txt.10package main11import (12	"bytes"13	"context"14	"fmt"15	"io/ioutil"16	"net/http"17	"time"18	toxiproxy "github.com/Shopify/toxiproxy/client"19	_ "github.com/lib/pq"20)21// runNetworkSanity is just a sanity check to make sure we're setting up toxiproxy22// correctly.23func runNetworkSanity(ctx context.Context, t *test, origC *cluster, nodes int) {24	origC.Put(ctx, cockroach, "./cockroach", origC.All())25	c, err := Toxify(ctx, t.l, origC, origC.All())26	if err != nil {27		t.Fatal(err)28	}29	c.Start(ctx, t, c.All())30	db := c.Conn(ctx, 1) // unaffected by toxiproxy31	defer db.Close()32	waitForFullReplication(t, db)33	// NB: we're generous with latency in this test because we're checking that34	// the upstream connections aren't affected by latency below, but the fixed35	// cost of starting the binary and processing the query is already close to36	// 100ms.37	//38	// NB: last node gets no latency injected, but first node gets cut off below.39	const latency = 300 * time.Millisecond40	for i := 1; i <= nodes; i++ {41		// NB: note that these latencies only apply to connections *to* the node42		// on which the toxic is active. That is, if n1 has a (down or upstream)43		// latency toxic of 100ms, then none of its outbound connections are44		// affected but any connections made to it by other nodes will.45		// In particular, it's difficult to simulate intricate network partitions46		// as there's no way to activate toxics only for certain peers.47		proxy := c.Proxy(i)48		if _, err := proxy.AddToxic("", "latency", "downstream", 1, toxiproxy.Attributes{49			"latency": latency / (2 * time.Millisecond), // ms50		}); err != nil {51			t.Fatal(err)52		}53		if _, err := proxy.AddToxic("", "latency", "upstream", 1, toxiproxy.Attributes{54			"latency": latency / (2 * time.Millisecond), // ms55		}); err != nil {56			t.Fatal(err)57		}58	}59	m := newMonitor(ctx, c.cluster, c.All())60	m.Go(func(ctx context.Context) error {61		c.Measure(ctx, 1, `SET CLUSTER SETTING trace.debug.enable = true`)62		c.Measure(ctx, 1, "CREATE DATABASE test")63		c.Measure(ctx, 1, `CREATE TABLE test.commit (a INT, b INT, v INT, PRIMARY KEY (a, b))`)64		for i := 0; i < 10; i++ {65			duration := c.Measure(ctx, 1, fmt.Sprintf(66				"BEGIN; INSERT INTO test.commit VALUES (2, %[1]d), (1, %[1]d), (3, %[1]d); COMMIT",67				i,68			))69			c.l.Printf("%s\n", duration)70		}71		c.Measure(ctx, 1, `72set tracing=on;73insert into test.commit values(3,1000), (1,1000), (2,1000);74select age, message from [ show trace for session ];75`)76		for i := 1; i < origC.spec.NodeCount; i++ {77			if dur := c.Measure(ctx, i, `SELECT 1`); dur > latency {78				t.Fatalf("node %d unexpectedly affected by latency: select 1 took %.2fs", i, dur.Seconds())79			}80		}81		return nil82	})83	m.Wait()84}85func runNetworkTPCC(ctx context.Context, t *test, origC *cluster, nodes int) {86	n := origC.spec.NodeCount87	serverNodes, workerNode := origC.Range(1, n-1), origC.Node(n)88	origC.Put(ctx, cockroach, "./cockroach", origC.All())89	origC.Put(ctx, workload, "./workload", origC.All())90	c, err := Toxify(ctx, t.l, origC, serverNodes)91	if err != nil {92		t.Fatal(err)93	}94	const warehouses = 195	c.Start(ctx, t, serverNodes)96	c.Run(ctx, workerNode, fmt.Sprintf(97		`./workload fixtures load tpcc --warehouses=%d {pgurl:1}`, warehouses,98	))99	db := c.Conn(ctx, 1)100	defer db.Close()101	waitForFullReplication(t, db)102	duration := time.Hour103	if local {104		// NB: this is really just testing the test with this duration, it won't105		// be able to detect slow goroutine leaks.106		duration = 5 * time.Minute107	}108	// Run TPCC, but don't give it the first node (or it basically won't do anything).109	m := newMonitor(ctx, c.cluster, serverNodes)110	m.Go(func(ctx context.Context) error {111		t.WorkerStatus("running tpcc")112		tpccL, err := c.l.ChildLogger("tpcc", quietStdout, quietStderr)113		if err != nil {114			return err115		}116		cmd := fmt.Sprintf(117			"./workload run tpcc --warehouses=%d --wait=false"+118				" --histograms="+perfArtifactsDir+"/stats.json"+119				" --duration=%s {pgurl:2-%d}",120			warehouses, duration, c.spec.NodeCount-1)121		return c.RunL(ctx, tpccL, workerNode, cmd)122	})123	checkGoroutines := func(ctx context.Context) int {124		// NB: at the time of writing, the goroutine count would quickly125		// stabilize near 230 when the network is partitioned, and around 270126		// when it isn't. Experimentally a past "slow" goroutine leak leaked ~3127		// goroutines every minute (though it would likely be more with the tpcc128		// workload above), which over the duration of an hour would easily push129		// us over the threshold.130		const thresh = 350131		uiAddrs := c.ExternalAdminUIAddr(ctx, serverNodes)132		var maxSeen int133		for _, addr := range uiAddrs {134			url := "http://" + addr + "/debug/pprof/goroutine?debug=2"135			resp, err := http.Get(url)136			if err != nil {137				t.Fatal(err)138			}139			content, err := ioutil.ReadAll(resp.Body)140			resp.Body.Close()141			if err != nil {142				t.Fatal(err)143			}144			numGoroutines := bytes.Count(content, []byte("goroutine "))145			if numGoroutines >= thresh {146				t.Fatalf("%s shows %d goroutines (expected <%d)", url, numGoroutines, thresh)147			}148			if maxSeen < numGoroutines {149				maxSeen = numGoroutines150			}151		}152		return maxSeen153	}154	m.Go(func(ctx context.Context) error {155		time.Sleep(10 * time.Second) // give tpcc a head start156		// Give n1 a network partition from the remainder of the cluster. Note that even though it affects157		// both the "upstream" and "downstream" directions, this is in fact an asymmetric partition since158		// it only affects connections *to* the node. n1 itself can connect to the cluster just fine.159		proxy := c.Proxy(1)160		c.l.Printf("letting inbound traffic to first node time out")161		for _, direction := range []string{"upstream", "downstream"} {162			if _, err := proxy.AddToxic("", "timeout", direction, 1, toxiproxy.Attributes{163				"timeout": 0, // forever164			}); err != nil {165				t.Fatal(err)166			}167		}168		t.WorkerStatus("checking goroutines")169		done := time.After(duration)170		var maxSeen int171		for {172			cur := checkGoroutines(ctx)173			if maxSeen < cur {174				c.l.Printf("new goroutine peak: %d", cur)175				maxSeen = cur176			}177			select {178			case <-done:179				c.l.Printf("done checking goroutines, repairing network")180				// Repair the network. Note that the TPCC workload would never181				// finish (despite the duration) without this. In particular,182				// we don't want to m.Wait() before we do this.183				toxics, err := proxy.Toxics()184				if err != nil {185					t.Fatal(err)186				}187				for _, toxic := range toxics {188					if err := proxy.RemoveToxic(toxic.Name); err != nil {189						t.Fatal(err)190					}191				}192				c.l.Printf("network is repaired")193				// Verify that goroutine count doesn't spike.194				for i := 0; i < 20; i++ {195					nowGoroutines := checkGoroutines(ctx)196					c.l.Printf("currently at most %d goroutines per node", nowGoroutines)197					time.Sleep(time.Second)198				}199				return nil200			default:201				time.Sleep(3 * time.Second)202			}203		}204	})205	m.Wait()206}207func registerNetwork(r *testRegistry) {208	const numNodes = 4209	r.Add(testSpec{210		Name:    fmt.Sprintf("network/sanity/nodes=%d", numNodes),211		Cluster: makeClusterSpec(numNodes),212		Run: func(ctx context.Context, t *test, c *cluster) {213			runNetworkSanity(ctx, t, c, numNodes)214		},215	})216	r.Add(testSpec{217		Name:    fmt.Sprintf("network/tpcc/nodes=%d", numNodes),218		Cluster: makeClusterSpec(numNodes),219		Run: func(ctx context.Context, t *test, c *cluster) {220			runNetworkTPCC(ctx, t, c, numNodes)221		},222	})223}...client.go
Source:client.go  
1// Package Toxiproxy provides a client wrapper around the Toxiproxy HTTP API for2// testing the resiliency of Go applications.3package toxiproxy4import (5	"bytes"6	"encoding/json"7	"fmt"8	"net/http"9)10// Client holds information about where to connect to Toxiproxy.11type Client struct {12	endpoint string13}14type Toxic map[string]interface{}15type Toxics map[string]Toxic16// Proxy represents a Proxy.17type Proxy struct {18	Name     string `json:"name"`     // The name of the proxy19	Listen   string `json:"listen"`   // The address the proxy listens on20	Upstream string `json:"upstream"` // The upstream address to proxy to21	Enabled  bool   `json:"enabled"`  // Whether the proxy is enabled22	ToxicsUpstream   Toxics `json:"upstream_toxics"`   // Toxics in the upstream direction23	ToxicsDownstream Toxics `json:"downstream_toxics"` // Toxics in the downstream direction24	client *Client25}26// NewClient creates a new client which provides the base of all communication27// with Toxiproxy. Endpoint is the address to the proxy (e.g. localhost:8474 if28// not overriden)29func NewClient(endpoint string) *Client {30	return &Client{endpoint: endpoint}31}32// Proxies returns a map with all the proxies and their toxics.33func (client *Client) Proxies() (map[string]*Proxy, error) {34	resp, err := http.Get(client.endpoint + "/proxies")35	if err != nil {36		return nil, err37	}38	err = checkError(resp, http.StatusOK, "Proxies")39	if err != nil {40		return nil, err41	}42	proxies := make(map[string]*Proxy)43	err = json.NewDecoder(resp.Body).Decode(&proxies)44	if err != nil {45		return nil, err46	}47	for _, proxy := range proxies {48		proxy.client = client49	}50	return proxies, nil51}52// NewProxy instantiates a new proxy instance. Note Create() must be called on53// it to create it. The Enabled field must be set to true, otherwise the Proxy54// will not be enabled when created.55func (client *Client) NewProxy(proxy *Proxy) *Proxy {56	if proxy == nil {57		proxy = &Proxy{}58	}59	proxy.client = client60	return proxy61}62// Create creates a new proxy.63func (proxy *Proxy) Create() error {64	request, err := json.Marshal(proxy)65	if err != nil {66		return err67	}68	resp, err := http.Post(proxy.client.endpoint+"/proxies", "application/json", bytes.NewReader(request))69	if err != nil {70		return err71	}72	err = checkError(resp, http.StatusCreated, "Create")73	if err != nil {74		return err75	}76	proxy = new(Proxy)77	err = json.NewDecoder(resp.Body).Decode(&proxy)78	if err != nil {79		return err80	}81	return nil82}83// Proxy returns a proxy by name.84func (client *Client) Proxy(name string) (*Proxy, error) {85	// TODO url encode86	resp, err := http.Get(client.endpoint + "/proxies/" + name)87	if err != nil {88		return nil, err89	}90	err = checkError(resp, http.StatusOK, "Proxy")91	if err != nil {92		return nil, err93	}94	proxy := client.NewProxy(nil)95	err = json.NewDecoder(resp.Body).Decode(proxy)96	if err != nil {97		return nil, err98	}99	return proxy, nil100}101// Save saves changes to a proxy such as its enabled status.102func (proxy *Proxy) Save() error {103	request, err := json.Marshal(proxy)104	if err != nil {105		return err106	}107	resp, err := http.Post(proxy.client.endpoint+"/proxies/"+proxy.Name, "application/json", bytes.NewReader(request))108	if err != nil {109		return err110	}111	err = checkError(resp, http.StatusOK, "Save")112	if err != nil {113		return err114	}115	err = json.NewDecoder(resp.Body).Decode(proxy)116	if err != nil {117		return err118	}119	return nil120}121// Delete a proxy which will cause it to stop listening and delete all122// information associated with it. If you just wish to stop and later enable a123// proxy, set the `Enabled` field to `false` and call `Save()`.124func (proxy *Proxy) Delete() error {125	httpClient := &http.Client{}126	req, err := http.NewRequest("DELETE", proxy.client.endpoint+"/proxies/"+proxy.Name, nil)127	if err != nil {128		return err129	}130	resp, err := httpClient.Do(req)131	if err != nil {132		return err133	}134	return checkError(resp, http.StatusNoContent, "Delete")135}136// Toxics returns a map of all the toxics and their attributes for a direction.137func (proxy *Proxy) Toxics(direction string) (Toxics, error) {138	resp, err := http.Get(proxy.client.endpoint + "/proxies/" + proxy.Name + "/" + direction + "/toxics")139	if err != nil {140		return nil, err141	}142	err = checkError(resp, http.StatusOK, "Toxics")143	if err != nil {144		return nil, err145	}146	toxics := make(Toxics)147	err = json.NewDecoder(resp.Body).Decode(&toxics)148	if err != nil {149		return nil, err150	}151	return toxics, nil152}153// SetToxic sets the parameters for a toxic with a given name in the direction.154// See https://github.com/Shopify/toxiproxy#toxics for a list of all Toxics.155func (proxy *Proxy) SetToxic(name string, direction string, toxic Toxic) (Toxic, error) {156	request, err := json.Marshal(toxic)157	if err != nil {158		return nil, err159	}160	resp, err := http.Post(proxy.client.endpoint+"/proxies/"+proxy.Name+"/"+direction+"/toxics/"+name, "application/json", bytes.NewReader(request))161	if err != nil {162		return nil, err163	}164	err = checkError(resp, http.StatusOK, "SetToxic")165	if err != nil {166		return nil, err167	}168	toxics := make(Toxic)169	err = json.NewDecoder(resp.Body).Decode(&toxics)170	if err != nil {171		return nil, err172	}173	return toxics, nil174}175// ResetState resets the state of all proxies and toxics in Toxiproxy.176func (client *Client) ResetState() error {177	resp, err := http.Get(client.endpoint + "/reset")178	if err != nil {179		return err180	}181	return checkError(resp, http.StatusNoContent, "ResetState")182}183type ApiError struct {184	Title  string `json:"title"`185	Status int    `json:"status"`186}187func (err *ApiError) Error() string {188	return fmt.Sprintf("HTTP %d: %s", err.Status, err.Title)189}190func checkError(resp *http.Response, expectedCode int, caller string) error {191	if resp.StatusCode != expectedCode {192		apiError := new(ApiError)193		err := json.NewDecoder(resp.Body).Decode(apiError)194		if err != nil {195			apiError.Title = fmt.Sprintf("Unexpected response code, expected %d", expectedCode)196			apiError.Status = resp.StatusCode197		}198		return fmt.Errorf("%s: %v", caller, apiError)199	}200	return nil201}...Direction
Using AI Code Generation
1import (2func main() {3    client := toxiproxy.NewClient("localhost:8474")4    toxics, err := client.Toxics("redis")5    if err != nil {6        panic(err)7    }8    for _, toxic := range toxics {9        fmt.Println(toxic.Name)10        fmt.Println(toxic.Stream)11        fmt.Println(toxic.Type)12        fmt.Println(toxic.Direction)13        fmt.Println(toxic.Toxicity)14        fmt.Println(toxic.Attributes)15        fmt.Println(toxic.CreatedAt)16    }17}18import (19func main() {20    client := toxiproxy.NewClient("localhost:8474")21    toxics, err := client.Toxics("redis")22    if err != nil {23        panic(err)24    }25    for _, toxic := range toxics {26        fmt.Println(toxic.Name)27        fmt.Println(toxic.Stream)28        fmt.Println(toxic.Type)29        fmt.Println(toxic.Direction())30        fmt.Println(toxic.Toxicity)31        fmt.Println(toxic.Attributes)32        fmt.Println(toxic.CreatedAt)33    }34}Direction
Using AI Code Generation
1import (2func main() {3    client := toxiproxy.NewClient("localhost:8474")4    toxics, err := client.Toxics("redis-master")5    if err != nil {6        fmt.Printf("error: %s7    }8    fmt.Printf("toxics: %v9}10import (11func main() {12    client := toxiproxy.NewClient("localhost:8474")13    toxics, err := client.Toxics("redis-master")14    if err != nil {15        fmt.Printf("error: %s16    }17    fmt.Printf("toxics: %v18}19import (20func main() {21    client := toxiproxy.NewClient("localhost:8474")22    toxics, err := client.Toxics("redis-master")23    if err != nil {24        fmt.Printf("error: %s25    }26    fmt.Printf("toxics: %v27}28import (29func main() {30    client := toxiproxy.NewClient("localhost:8474")31    toxics, err := client.Toxics("redis-master")32    if err != nil {33        fmt.Printf("error: %s34    }35    fmt.Printf("toxics: %v36}37import (38func main() {39    client := toxiproxy.NewClient("localhost:8474")Direction
Using AI Code Generation
1import (2func main() {3    client := toxiproxy.NewClient("localhost:8474")4    client.CreateProxy("redis", "localhost:6379", "localhost:16379")5    client.CreateProxy("mysql", "localhost:3306", "localhost:13306")6    client.CreateProxy("http", "localhost:80", "localhost:8080")7    client.CreateProxy("https", "localhost:443", "localhost:8443")8    client.CreateProxy("memcache", "localhost:11211", "localhost:11111")9    client.CreateProxy("tcp", "localhost:9999", "localhost:9998")10    client.CreateProxy("dns", "localhost:53", "localhost:5353")11    client.CreateProxy("test", "localhost:3000", "localhost:3001")12    client.CreateProxy("test2", "localhost:3000", "localhost:3002")13    client.CreateProxy("test3", "localhost:3000", "localhost:3003")14    client.CreateProxy("test4", "localhost:3000", "localhost:3004")15    client.CreateProxy("test5", "localhost:3000", "localhost:3005")16    client.CreateProxy("test6", "localhost:3000", "localhost:3006")17    client.CreateProxy("test7", "localhost:3000", "localhost:3007")18    client.CreateProxy("test8", "localhost:3000", "localhost:3008")19    client.CreateProxy("test9", "localhost:3000", "localhost:3009")20    proxies, err := client.Proxies()21    if err != nil {22        panic(err)23    }24    fmt.Println(proxies)25    proxy, err := client.Proxy("test")26    if err != nil {27        panic(err)28    }29    fmt.Println(proxy)30    proxy.Enable()31    proxy.Disable()32    proxy.Save()33    proxy.Delete()34    toxic := toxiproxy.Toxic{Direction
Using AI Code Generation
1import (2func main() {3	proxy, _ := toxiproxy.NewClient("localhost:8474")4	direction, _ := proxy.Direction("redis")5	fmt.Println(direction)6}7[{"name":"redis","listen":"localhost:6379","upstream":"localhost:6378","enabled":true}]8{"name":"redis","listen":"localhost:6379","upstream":"localhost:6378","enabled":true}9{"name":"latency","type":"latency","stream":"upstream","toxicity":1,"attributes":{"latency":0,"jitter":0}}10{"name":"latency","type":"latency","stream":"upstream","toxicity":1,"attributes":{"latency":0,"jitter":0}}11{"name":"latency","type":"latency","stream":"downstream","toxicity":1,"attributes":{"latency":0,"jitter":0}}12{"name":"latency","type":"latency","stream":"downstream","toxicity":1,"attributes":{"latency":0,"jitter":0}}13{"name":"latency","type":"latency","stream":"upstream","toxicity":1,"attributes":{"latency":0,"jitter":0}}14{"name":"redis","listen":"localhost:6379","upstream":"localhost:6378","enabled":true}15{"name":"slow_close","type":"slow_close","stream":"upDirection
Using AI Code Generation
1toxiproxy.Direction("upstream")2toxiproxy.Direction("downstream")3toxiproxy.Enable()4toxiproxy.Enable()5toxiproxy.Disable()6toxiproxy.Disable()7toxiproxy.Latency(100)8toxiproxy.Latency(100)9toxiproxy.LatencyJitter(10)10toxiproxy.LatencyJitter(10)11toxiproxy.LatencyJitter(10)12toxiproxy.LatencyJitter(10)13toxiproxy.Bandwidth(100)14toxiproxy.Bandwidth(100)15toxiproxy.Slicer(100)16toxiproxy.Slicer(100)Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
