123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- //go:build windows
- package hns
- 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"`
- DSR bool `json:"IsDSR,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()
- }
|