diff --git a/object_manager.go b/object_manager.go index 5d98e2b6..fcc2abfb 100644 --- a/object_manager.go +++ b/object_manager.go @@ -22,6 +22,7 @@ type IBObjectManager interface { CreateNetwork(netview string, cidr string, isIPv6 bool, comment string, eas EA) (*Network, error) CreateNetworkContainer(netview string, cidr string, isIPv6 bool, comment string, eas EA) (*NetworkContainer, error) CreateNetworkView(name string, comment string, setEas EA) (*NetworkView, error) + CreateNSRecord(dnsview string, name string, ns string, addr []string) (*RecordNS, error) CreatePTRRecord(networkView string, dnsView string, ptrdname string, recordName string, cidr string, ipAddr string, useTtl bool, ttl uint32, comment string, eas EA) (*RecordPTR, error) CreateTXTRecord(dnsView string, recordName string, text string, ttl uint32, useTtl bool, comment string, eas EA) (*RecordTXT, error) CreateZoneDelegated(fqdn string, delegate_to []NameServer) (*ZoneDelegated, error) @@ -34,6 +35,7 @@ type IBObjectManager interface { DeleteNetwork(ref string) (string, error) DeleteNetworkContainer(ref string) (string, error) DeleteNetworkView(ref string) (string, error) + DeleteNSRecord(ref string) (string, error) DeletePTRRecord(ref string) (string, error) DeleteTXTRecord(ref string) (string, error) DeleteZoneDelegated(ref string) (string, error) diff --git a/object_manager_ns-record.go b/object_manager_ns-record.go new file mode 100644 index 00000000..04ee42b7 --- /dev/null +++ b/object_manager_ns-record.go @@ -0,0 +1,23 @@ +package ibclient + +func (objMgr *ObjectManager) CreateNSRecord(dnsview string, recordname string, ns string, addr []string) (*RecordNS, error) { + + var addresses []ZoneNameServer + for _, addr := range addr { + addresses = append(addresses, ZoneNameServer{Address: addr}) + } + recordNS := NewRecordNS(RecordNS{ + View: dnsview, + Name: recordname, + NS: ns, + Addresses: addresses, + }) + + ref, err := objMgr.connector.CreateObject(recordNS) + recordNS.Ref = ref + return recordNS, err +} + +func (objMgr *ObjectManager) DeleteNSRecord(ref string) (string, error) { + return objMgr.connector.DeleteObject(ref) +} diff --git a/object_manager_ns-record_test.go b/object_manager_ns-record_test.go new file mode 100644 index 00000000..df3f7f23 --- /dev/null +++ b/object_manager_ns-record_test.go @@ -0,0 +1,83 @@ +package ibclient + +import ( + "fmt" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Object Manager: NS-record", func() { +Describe("Allocate NS Record ", func() { + cmpType := "Docker" + tenantID := "01234567890abcdef01234567890abcdef" + ns := "ns.example.com" + dnsView := "default" + recordName := "test.example.com" + addr := []string{"10.0.0.1"} + resultAddr := []ZoneNameServer{{Address: addr[0]}} + + fakeRefReturn := fmt.Sprintf("record:ns/ZG5zLmhvc3RjkuMC4xLg:%s/%s/default", ns, recordName) + + aniFakeConnector := &fakeConnector{ + createObjectObj: NewRecordNS(RecordNS{ + Name: recordName, + NS: ns, + Addresses: resultAddr, + View: dnsView, + }), + getObjectRef: fakeRefReturn, + getObjectObj: NewRecordNS(RecordNS{ + Name: recordName, + NS: ns, + Addresses: resultAddr, + View: dnsView, + Ref: fakeRefReturn, + }), + resultObject: NewRecordNS(RecordNS{ + Name: recordName, + NS: ns, + Addresses: resultAddr, + View: dnsView, + Ref: fakeRefReturn, + }), + fakeRefReturn: fakeRefReturn, + } + + objMgr := NewObjectManager(aniFakeConnector, cmpType, tenantID) + + var actualRecord *RecordNS + var err error + It("should pass expected NS record Object to CreateObject", func() { + actualRecord, err = objMgr.CreateNSRecord(dnsView, recordName, ns, addr) + }) + It("should return expected NS record Object", func() { + Expect(actualRecord).To(Equal(aniFakeConnector.resultObject)) + Expect(err).To(BeNil()) + }) + }) + Describe("Delete NS Record", func() { + cmpType := "Docker" + tenantID := "01234567890abcdef01234567890abcdef" + recordName := "test.example.com" + ns := "ns1.example.com" + deleteRef := fmt.Sprintf("record:ns/ZG5zLmJpbmRfY25h:%s/%s", ns, recordName) + fakeRefReturn := deleteRef + nwFakeConnector := &fakeConnector{ + deleteObjectRef: deleteRef, + fakeRefReturn: fakeRefReturn, + } + + objMgr := NewObjectManager(nwFakeConnector, cmpType, tenantID) + + var actualRef string + var err error + It("should pass expected NS record Ref to DeleteObject", func() { + actualRef, err = objMgr.DeleteTXTRecord(deleteRef) + }) + It("should return expected NS record Ref", func() { + Expect(actualRef).To(Equal(fakeRefReturn)) + Expect(err).To(BeNil()) + }) + }) +}) diff --git a/objects.go b/objects.go index 9dd10751..7deb4aca 100644 --- a/objects.go +++ b/objects.go @@ -810,6 +810,29 @@ func NewZoneDelegated(za ZoneDelegated) *ZoneDelegated { return &res } +type RecordNS struct { + IBBase `json:"-"` + Ref string `json:"_ref,omitempty"` + Addresses []ZoneNameServer `json:"addresses,omitempty"` + Name string `json:"name,omitempty"` + NS string `json:"nameserver,omitempty"` + View string `json:"view,omitempty"` + Zone string `json:"zone,omitempty"` + Ea EA `json:"extattrs,omitempty"` +} + +func NewRecordNS(rc RecordNS) *RecordNS { + res := rc + res.objectType = "record:ns" + res.returnFields = []string{"extattrs", "addresses", "nameserver", "name", "view", "zone"} + + return &res +} + +type ZoneNameServer struct { + Address string `json:"address,omitempty"` +} + func (ea EA) Count() int { return len(ea) } diff --git a/objects_test.go b/objects_test.go index eeb645a2..90126d0c 100644 --- a/objects_test.go +++ b/objects_test.go @@ -666,6 +666,35 @@ var _ = Describe("Objects", func() { }) + Context("RecordNS object", func() { + name := "ns.domain.com" + ns := "ns.domain.com" + addr := []ZoneNameServer{{ + Address: "10.0.0.1"}} + view := "default" + zone := "domain.com" + + rt := NewRecordNS(RecordNS{ + Name: name, + NS: ns, + Addresses: addr, + View: view, + Zone: zone}) + + It("should set fields correctly", func() { + Expect(rt.Name).To(Equal(name)) + Expect(rt.NS).To(Equal(ns)) + Expect(rt.Addresses).To(Equal(addr)) + Expect(rt.View).To(Equal(view)) + Expect(rt.Zone).To(Equal(zone)) + }) + + It("should set base fields correctly", func() { + Expect(rt.ObjectType()).To(Equal("record:ns")) + Expect(rt.ReturnFields()).To(ConsistOf("extattrs", "name", "nameserver", "addresses", "view", "zone")) + }) + }) + Context("Unmarshalling malformed JSON", func() { Context("for EA", func() { badJSON := `""` diff --git a/record_ns.go b/record_ns.go deleted file mode 100644 index 275af58e..00000000 --- a/record_ns.go +++ /dev/null @@ -1,23 +0,0 @@ -package ibclient - -type RecordNS struct { - IBBase `json:"-"` - Ref string `json:"_ref,omitempty"` - Addresses []ZoneNameServer `json:"addresses,omitempty"` - Name string `json:"name,omitempty"` - Nameserver string `json:"nameserver,omitempty"` - View string `json:"view,omitempty"` - Zone string `json:"zone,omitempty"` -} - -func NewRecordNS(rc RecordNS) *RecordNS { - res := rc - res.objectType = "record:ns" - res.returnFields = []string{"addresses", "name", "nameserver", "view", "zone"} - - return &res -} - -type ZoneNameServer struct { - Address string `json:"address,omitempty"` -}