aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go
blob: 45e2281b07810958b24b0d535341dc0349562fa0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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"`
}

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
}