mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-24 20:24:09 +00:00
This tag of hcsshim brings in a couple welcome features/improvements. One being exposing a way to query for hns endpoint statistics (Packets received/sent etc.). This tag also contains some optimizations for querying whether a certain HCN feature is supported, which is a common workflow in kube-proxy on Windows. The first result from querying HCN is now cached so further calls can skip the hcn query as well as the version range parsing that was performed. This also gets rid of some redundant logs that used to hit everytime the version range parsing occurred. The Go-winio dep bump, and all of the ctrd deps are transitive only. Nothing new is needed/intended to be used. Signed-off-by: Daniel Canter <dcanter@microsoft.com>
112 lines
2.5 KiB
Go
112 lines
2.5 KiB
Go
package hns
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
)
|
|
|
|
type namespaceRequest struct {
|
|
IsDefault bool `json:",omitempty"`
|
|
}
|
|
|
|
type namespaceEndpointRequest struct {
|
|
ID string `json:"Id"`
|
|
}
|
|
|
|
type NamespaceResource struct {
|
|
Type string
|
|
Data json.RawMessage
|
|
}
|
|
|
|
type namespaceResourceRequest struct {
|
|
Type string
|
|
Data interface{}
|
|
}
|
|
|
|
type Namespace struct {
|
|
ID string
|
|
IsDefault bool `json:",omitempty"`
|
|
ResourceList []NamespaceResource `json:",omitempty"`
|
|
CompartmentId uint32 `json:",omitempty"`
|
|
}
|
|
|
|
func issueNamespaceRequest(id *string, method, subpath string, request interface{}) (*Namespace, error) {
|
|
var err error
|
|
hnspath := "/namespaces/"
|
|
if id != nil {
|
|
hnspath = path.Join(hnspath, *id)
|
|
}
|
|
if subpath != "" {
|
|
hnspath = path.Join(hnspath, subpath)
|
|
}
|
|
var reqJSON []byte
|
|
if request != nil {
|
|
if reqJSON, err = json.Marshal(request); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
var ns Namespace
|
|
err = hnsCall(method, hnspath, string(reqJSON), &ns)
|
|
if err != nil {
|
|
if strings.Contains(err.Error(), "Element not found.") {
|
|
return nil, os.ErrNotExist
|
|
}
|
|
return nil, fmt.Errorf("%s %s: %s", method, hnspath, err)
|
|
}
|
|
return &ns, err
|
|
}
|
|
|
|
func CreateNamespace() (string, error) {
|
|
req := namespaceRequest{}
|
|
ns, err := issueNamespaceRequest(nil, "POST", "", &req)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return ns.ID, nil
|
|
}
|
|
|
|
func RemoveNamespace(id string) error {
|
|
_, err := issueNamespaceRequest(&id, "DELETE", "", nil)
|
|
return err
|
|
}
|
|
|
|
func GetNamespaceEndpoints(id string) ([]string, error) {
|
|
ns, err := issueNamespaceRequest(&id, "GET", "", nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var endpoints []string
|
|
for _, rsrc := range ns.ResourceList {
|
|
if rsrc.Type == "Endpoint" {
|
|
var endpoint namespaceEndpointRequest
|
|
err = json.Unmarshal(rsrc.Data, &endpoint)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("unmarshal endpoint: %s", err)
|
|
}
|
|
endpoints = append(endpoints, endpoint.ID)
|
|
}
|
|
}
|
|
return endpoints, nil
|
|
}
|
|
|
|
func AddNamespaceEndpoint(id string, endpointID string) error {
|
|
resource := namespaceResourceRequest{
|
|
Type: "Endpoint",
|
|
Data: namespaceEndpointRequest{endpointID},
|
|
}
|
|
_, err := issueNamespaceRequest(&id, "POST", "addresource", &resource)
|
|
return err
|
|
}
|
|
|
|
func RemoveNamespaceEndpoint(id string, endpointID string) error {
|
|
resource := namespaceResourceRequest{
|
|
Type: "Endpoint",
|
|
Data: namespaceEndpointRequest{endpointID},
|
|
}
|
|
_, err := issueNamespaceRequest(&id, "POST", "removeresource", &resource)
|
|
return err
|
|
}
|