123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- 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
- }
|