package server import ( "encoding/json" "fmt" "net/http" "net/url" ) const ClusterLocalSvcHost = "ipranger.ipranger.svc.cluster.local" type Client struct { http.Client host string } // NewClient creates an http client for ipranger on a given host. Hostname // must be given without a scheme, but port is optional, e.g. localhost:8080 func NewClient(host string) *Client { return &Client{ Client: *http.DefaultClient, host: host, } } func (c *Client) GetNetcfg(project, region, cluster string) (NetcfgResp, error) { u, err := c.netCfgURL(project, region, cluster) if err != nil { return NetcfgResp{}, err } req, err := http.NewRequest("GET", u, nil) if err != nil { return NetcfgResp{}, err } req.Header.Add("accept", "application/json") resp, err := c.Do(req) if err != nil { return NetcfgResp{}, err } defer resp.Body.Close() d := json.NewDecoder(resp.Body) // error response if resp.StatusCode >= 400 { var errresp ErrResp err = d.Decode(&errresp) if err != nil { return NetcfgResp{}, err } return NetcfgResp{}, fmt.Errorf("failed to get netcfg. message: %v", errresp.Message) } // handle success response var netcfg NetcfgResp err = d.Decode(&netcfg) if err != nil { return NetcfgResp{}, err } return netcfg, nil } func (c *Client) netCfgURL(project, region, cluster string) (string, error) { raw := fmt.Sprintf("http://%s%s?project=%s®ion=%s&cluster=%s", c.host, NetcfgEndpoint, url.QueryEscape(project), url.QueryEscape(region), url.QueryEscape(cluster), ) u, err := url.Parse(raw) if err != nil { return "", err } return u.String(), nil }