...

Source file src/edge-infra.dev/pkg/f8n/ipranger/server/client.go

Documentation: edge-infra.dev/pkg/f8n/ipranger/server

     1  package server
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"net/http"
     7  	"net/url"
     8  )
     9  
    10  const ClusterLocalSvcHost = "ipranger.ipranger.svc.cluster.local"
    11  
    12  type Client struct {
    13  	http.Client
    14  	host string
    15  }
    16  
    17  // NewClient creates an http client for ipranger on a given host. Hostname
    18  // must be given without a scheme, but port is optional, e.g. localhost:8080
    19  func NewClient(host string) *Client {
    20  	return &Client{
    21  		Client: *http.DefaultClient,
    22  		host:   host,
    23  	}
    24  }
    25  
    26  func (c *Client) GetNetcfg(project, region, cluster string) (NetcfgResp, error) {
    27  	u, err := c.netCfgURL(project, region, cluster)
    28  	if err != nil {
    29  		return NetcfgResp{}, err
    30  	}
    31  	req, err := http.NewRequest("GET", u, nil)
    32  	if err != nil {
    33  		return NetcfgResp{}, err
    34  	}
    35  	req.Header.Add("accept", "application/json")
    36  
    37  	resp, err := c.Do(req)
    38  	if err != nil {
    39  		return NetcfgResp{}, err
    40  	}
    41  	defer resp.Body.Close()
    42  	d := json.NewDecoder(resp.Body)
    43  
    44  	// error response
    45  	if resp.StatusCode >= 400 {
    46  		var errresp ErrResp
    47  		err = d.Decode(&errresp)
    48  		if err != nil {
    49  			return NetcfgResp{}, err
    50  		}
    51  		return NetcfgResp{}, fmt.Errorf("failed to get netcfg. message: %v", errresp.Message)
    52  	}
    53  
    54  	// handle success response
    55  	var netcfg NetcfgResp
    56  	err = d.Decode(&netcfg)
    57  	if err != nil {
    58  		return NetcfgResp{}, err
    59  	}
    60  
    61  	return netcfg, nil
    62  }
    63  
    64  func (c *Client) netCfgURL(project, region, cluster string) (string, error) {
    65  	raw := fmt.Sprintf("http://%s%s?project=%s&region=%s&cluster=%s", c.host, NetcfgEndpoint,
    66  		url.QueryEscape(project),
    67  		url.QueryEscape(region),
    68  		url.QueryEscape(cluster),
    69  	)
    70  	u, err := url.Parse(raw)
    71  	if err != nil {
    72  		return "", err
    73  	}
    74  	return u.String(), nil
    75  }
    76  

View as plain text