package hcsshim | |
import ( | |
"encoding/json" | |
"github.com/sirupsen/logrus" | |
) | |
// RoutePolicy is a structure defining schema for Route based Policy | |
type RoutePolicy struct { | |
Policy | |
DestinationPrefix string `json:"DestinationPrefix,omitempty"` | |
NextHop string `json:"NextHop,omitempty"` | |
EncapEnabled bool `json:"NeedEncap,omitempty"` | |
} | |
// ELBPolicy is a structure defining schema for ELB LoadBalancing based Policy | |
type ELBPolicy struct { | |
LBPolicy | |
SourceVIP string `json:"SourceVIP,omitempty"` | |
VIPs []string `json:"VIPs,omitempty"` | |
ILB bool `json:"ILB,omitempty"` | |
} | |
// LBPolicy is a structure defining schema for LoadBalancing based Policy | |
type LBPolicy struct { | |
Policy | |
Protocol uint16 `json:"Protocol,omitempty"` | |
InternalPort uint16 | |
ExternalPort uint16 | |
} | |
// PolicyList is a structure defining schema for Policy list request | |
type PolicyList struct { | |
ID string `json:"ID,omitempty"` | |
EndpointReferences []string `json:"References,omitempty"` | |
Policies []json.RawMessage `json:"Policies,omitempty"` | |
} | |
// HNSPolicyListRequest makes a call into HNS to update/query a single network | |
func HNSPolicyListRequest(method, path, request string) (*PolicyList, error) { | |
var policy PolicyList | |
err := hnsCall(method, "/policylists/"+path, request, &policy) | |
if err != nil { | |
return nil, err | |
} | |
return &policy, nil | |
} | |
// HNSListPolicyListRequest gets all the policy list | |
func HNSListPolicyListRequest() ([]PolicyList, error) { | |
var plist []PolicyList | |
err := hnsCall("GET", "/policylists/", "", &plist) | |
if err != nil { | |
return nil, err | |
} | |
return plist, nil | |
} | |
// PolicyListRequest makes a HNS call to modify/query a network policy list | |
func PolicyListRequest(method, path, request string) (*PolicyList, error) { | |
policylist := &PolicyList{} | |
err := hnsCall(method, "/policylists/"+path, request, &policylist) | |
if err != nil { | |
return nil, err | |
} | |
return policylist, nil | |
} | |
// GetPolicyListByID get the policy list by ID | |
func GetPolicyListByID(policyListID string) (*PolicyList, error) { | |
return PolicyListRequest("GET", policyListID, "") | |
} | |
// Create PolicyList by sending PolicyListRequest to HNS. | |
func (policylist *PolicyList) Create() (*PolicyList, error) { | |
operation := "Create" | |
title := "HCSShim::PolicyList::" + operation | |
logrus.Debugf(title+" id=%s", policylist.ID) | |
jsonString, err := json.Marshal(policylist) | |
if err != nil { | |
return nil, err | |
} | |
return PolicyListRequest("POST", "", string(jsonString)) | |
} | |
// Delete deletes PolicyList | |
func (policylist *PolicyList) Delete() (*PolicyList, error) { | |
operation := "Delete" | |
title := "HCSShim::PolicyList::" + operation | |
logrus.Debugf(title+" id=%s", policylist.ID) | |
return PolicyListRequest("DELETE", policylist.ID, "") | |
} | |
// AddEndpoint add an endpoint to a Policy List | |
func (policylist *PolicyList) AddEndpoint(endpoint *HNSEndpoint) (*PolicyList, error) { | |
operation := "AddEndpoint" | |
title := "HCSShim::PolicyList::" + operation | |
logrus.Debugf(title+" id=%s, endpointId:%s", policylist.ID, endpoint.Id) | |
_, err := policylist.Delete() | |
if err != nil { | |
return nil, err | |
} | |
// Add Endpoint to the Existing List | |
policylist.EndpointReferences = append(policylist.EndpointReferences, "/endpoints/"+endpoint.Id) | |
return policylist.Create() | |
} | |
// RemoveEndpoint removes an endpoint from the Policy List | |
func (policylist *PolicyList) RemoveEndpoint(endpoint *HNSEndpoint) (*PolicyList, error) { | |
operation := "RemoveEndpoint" | |
title := "HCSShim::PolicyList::" + operation | |
logrus.Debugf(title+" id=%s, endpointId:%s", policylist.ID, endpoint.Id) | |
_, err := policylist.Delete() | |
if err != nil { | |
return nil, err | |
} | |
elementToRemove := "/endpoints/" + endpoint.Id | |
var references []string | |
for _, endpointReference := range policylist.EndpointReferences { | |
if endpointReference == elementToRemove { | |
continue | |
} | |
references = append(references, endpointReference) | |
} | |
policylist.EndpointReferences = references | |
return policylist.Create() | |
} | |
// AddLoadBalancer policy list for the specified endpoints | |
func AddLoadBalancer(endpoints []HNSEndpoint, isILB bool, sourceVIP, vip string, protocol uint16, internalPort uint16, externalPort uint16) (*PolicyList, error) { | |
operation := "AddLoadBalancer" | |
title := "HCSShim::PolicyList::" + operation | |
logrus.Debugf(title+" endpointId=%v, isILB=%v, sourceVIP=%s, vip=%s, protocol=%v, internalPort=%v, externalPort=%v", endpoints, isILB, sourceVIP, vip, protocol, internalPort, externalPort) | |
policylist := &PolicyList{} | |
elbPolicy := &ELBPolicy{ | |
SourceVIP: sourceVIP, | |
ILB: isILB, | |
} | |
if len(vip) > 0 { | |
elbPolicy.VIPs = []string{vip} | |
} | |
elbPolicy.Type = ExternalLoadBalancer | |
elbPolicy.Protocol = protocol | |
elbPolicy.InternalPort = internalPort | |
elbPolicy.ExternalPort = externalPort | |
for _, endpoint := range endpoints { | |
policylist.EndpointReferences = append(policylist.EndpointReferences, "/endpoints/"+endpoint.Id) | |
} | |
jsonString, err := json.Marshal(elbPolicy) | |
if err != nil { | |
return nil, err | |
} | |
policylist.Policies = append(policylist.Policies, jsonString) | |
return policylist.Create() | |
} | |
// AddRoute adds route policy list for the specified endpoints | |
func AddRoute(endpoints []HNSEndpoint, destinationPrefix string, nextHop string, encapEnabled bool) (*PolicyList, error) { | |
operation := "AddRoute" | |
title := "HCSShim::PolicyList::" + operation | |
logrus.Debugf(title+" destinationPrefix:%s", destinationPrefix) | |
policylist := &PolicyList{} | |
rPolicy := &RoutePolicy{ | |
DestinationPrefix: destinationPrefix, | |
NextHop: nextHop, | |
EncapEnabled: encapEnabled, | |
} | |
rPolicy.Type = Route | |
for _, endpoint := range endpoints { | |
policylist.EndpointReferences = append(policylist.EndpointReferences, "/endpoints/"+endpoint.Id) | |
} | |
jsonString, err := json.Marshal(rPolicy) | |
if err != nil { | |
return nil, err | |
} | |
policylist.Policies = append(policylist.Policies, jsonString) | |
return policylist.Create() | |
} |