object_manager_network_container.go raw

   1  package ibclient
   2  
   3  import (
   4  	"fmt"
   5  	"regexp"
   6  )
   7  
   8  func (objMgr *ObjectManager) CreateNetworkContainer(netview string, cidr string, isIPv6 bool, comment string, eas EA) (*NetworkContainer, error) {
   9  	container := NewNetworkContainer(netview, cidr, isIPv6, comment, eas)
  10  
  11  	ref, err := objMgr.connector.CreateObject(container)
  12  	if err != nil {
  13  		return nil, err
  14  	}
  15  
  16  	container.Ref = ref
  17  	return container, nil
  18  }
  19  
  20  // TODO normalize IPv4 and IPv6 addresses
  21  func (objMgr *ObjectManager) GetNetworkContainer(netview string, cidr string, isIPv6 bool, eaSearch EA) (*NetworkContainer, error) {
  22  	var res []NetworkContainer
  23  
  24  	nc := NewNetworkContainer(netview, cidr, isIPv6, "", nil)
  25  	nc.eaSearch = EASearch(eaSearch)
  26  	sf := map[string]string{
  27  		"network_view": netview,
  28  		"network":      cidr,
  29  	}
  30  	queryParams := NewQueryParams(false, sf)
  31  	err := objMgr.connector.GetObject(nc, "", queryParams, &res)
  32  	if err != nil {
  33  		return nil, err
  34  	} else if res == nil || len(res) == 0 {
  35  		return nil, NewNotFoundError("network container not found")
  36  	}
  37  
  38  	return &res[0], nil
  39  }
  40  
  41  func (objMgr *ObjectManager) GetNetworkContainerByRef(ref string) (*NetworkContainer, error) {
  42  	nc := NewNetworkContainer("", "", false, "", nil)
  43  
  44  	err := objMgr.connector.GetObject(
  45  		nc, ref, NewQueryParams(false, nil), nc)
  46  	if err != nil {
  47  		return nil, err
  48  	}
  49  
  50  	return nc, nil
  51  }
  52  
  53  func (objMgr *ObjectManager) UpdateNetworkContainer(
  54  	ref string,
  55  	setEas EA,
  56  	comment string) (*NetworkContainer, error) {
  57  
  58  	nc := &NetworkContainer{}
  59  	nc.returnFields = []string{"extattrs", "comment"}
  60  
  61  	err := objMgr.connector.GetObject(
  62  		nc, ref, NewQueryParams(false, nil), nc)
  63  	if err != nil {
  64  		return nil, err
  65  	}
  66  
  67  	nc.Ea = setEas
  68  	nc.Comment = comment
  69  
  70  	// Network view is not allowed to be updated,
  71  	// thus making its name empty (will not appear among data which we update).
  72  	netViewSaved := nc.NetviewName
  73  	nc.NetviewName = ""
  74  
  75  	reference, err := objMgr.connector.UpdateObject(nc, ref)
  76  	if err != nil {
  77  		return nil, err
  78  	}
  79  
  80  	nc.Ref = reference
  81  	nc.NetviewName = netViewSaved
  82  
  83  	return nc, nil
  84  }
  85  
  86  func (objMgr *ObjectManager) AllocateNetworkContainer(
  87  	netview string,
  88  	cidr string,
  89  	isIPv6 bool,
  90  	prefixLen uint,
  91  	comment string,
  92  	eas EA) (*NetworkContainer, error) {
  93  
  94  	containerInfo := NewNetworkContainerNextAvailableInfo(netview, cidr, prefixLen, isIPv6)
  95  	container := NewNetworkContainerNextAvailable(containerInfo, isIPv6, comment, eas)
  96  
  97  	ref, err := objMgr.connector.CreateObject(container)
  98  
  99  	if err != nil {
 100  		return nil, err
 101  	}
 102  
 103  	if isIPv6 {
 104  		return BuildIPv6NetworkContainerFromRef(ref)
 105  	} else {
 106  		return BuildNetworkContainerFromRef(ref)
 107  	}
 108  }
 109  
 110  func (objMgr *ObjectManager) AllocateNetworkContainerByEA(
 111  	netview string, isIPv6 bool, comment string, eas EA, eaMap map[string]string, prefixLen uint) (*NetworkContainer, error) {
 112  
 113  	var object string
 114  	object = getNetworkObjectType(isIPv6, "networkcontainer", "ipv6networkcontainer")
 115  
 116  	nextAvailableNetworkInfo := NetworkContainerNextAvailableInfo{
 117  		Function:     "next_available_network",
 118  		ResultField:  "networks",
 119  		Object:       object,
 120  		ObjectParams: eaMap,
 121  		Params:       map[string]uint{"cidr": prefixLen},
 122  	}
 123  
 124  	net := NetworkContainerNextAvailable{
 125  		Network:     &nextAvailableNetworkInfo,
 126  		objectType:  object,
 127  		Comment:     comment,
 128  		Ea:          eas,
 129  		NetviewName: netview,
 130  	}
 131  	ref, err := objMgr.connector.CreateObject(&net)
 132  
 133  	if err != nil {
 134  		return nil, err
 135  	}
 136  	if isIPv6 {
 137  		return BuildIPv6NetworkContainerFromRef(ref)
 138  	} else {
 139  		return BuildNetworkContainerFromRef(ref)
 140  	}
 141  }
 142  
 143  func (objMgr *ObjectManager) DeleteNetworkContainer(ref string) (string, error) {
 144  	ncRegExp := regexp.MustCompile("^(ipv6)?networkcontainer\\/.+")
 145  	if !ncRegExp.MatchString(ref) {
 146  		return "", fmt.Errorf("'ref' does not reference a network container")
 147  	}
 148  
 149  	return objMgr.connector.DeleteObject(ref)
 150  }
 151