package main import ( "fmt" "io" "net/http" "os" "strings" "time" ) const networkTopologyDir string = "topo-network/" const containerTopologyDir string = "topo-containers/" type Stanza struct { content string pad int } type ActionResult struct { Err error Desc string ErrOutput string StdOutput string } type JsonResult struct { Code int Desc string ErrOutput string StdOutput string } func assertFileSize(f1, f2 string) error { fi1, err := os.Stat(f1) if err != nil { return err } fi2, err1 := os.Stat(f2) if err1 != nil { return err1 } if fi1.Size() != fi2.Size() { return fmt.Errorf("file sizes differ (%d vs %d)", fi1.Size(), fi2.Size()) } return nil } func (c *Stanza) newStanza(name string) *Stanza { c.append("\n" + name + " {") c.pad += 2 return c } func (c *Stanza) append(name string) *Stanza { c.content += strings.Repeat(" ", c.pad) c.content += name + "\n" return c } func (c *Stanza) close() *Stanza { c.content += "}\n" c.pad -= 2 return c } func (s *Stanza) toString() string { return s.content } func (s *Stanza) saveToFile(fileName string) error { fo, err := os.Create(fileName) if err != nil { return err } defer fo.Close() _, err = io.Copy(fo, strings.NewReader(s.content)) return err } // newHttpClient creates [http.Client] with disabled proxy and redirects, it also sets timeout to 30seconds. func newHttpClient() *http.Client { transport := http.DefaultTransport transport.(*http.Transport).Proxy = nil transport.(*http.Transport).DisableKeepAlives = true client := &http.Client{ Transport: transport, Timeout: time.Second * 30, CheckRedirect: func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse }} return client }