Browse Source

Bug fix: base64 encoded data appeared in lease attrs

For some reason, json.Marshal'ing struct (vs ptr to it)
has odd interaction with json.RawMessage.

Fixes #97
Eugene Yakubovich 10 years ago
parent
commit
2a0cbd16cd
3 changed files with 31 additions and 23 deletions
  1. 10 16
      backend/vxlan/vxlan.go
  2. 3 3
      subnet/subnet.go
  3. 18 4
      subnet/subnet_test.go

+ 10 - 16
backend/vxlan/vxlan.go

@@ -23,7 +23,7 @@ type VXLANBackend struct {
 	sm     *subnet.SubnetManager
 	rawCfg json.RawMessage
 	cfg    struct {
-		Vni  int
+		VNI  int
 		Port int
 	}
 	dev    *vxlanDevice
@@ -38,28 +38,22 @@ func New(sm *subnet.SubnetManager, config json.RawMessage) backend.Backend {
 		rawCfg: config,
 		stop:   make(chan bool),
 	}
-	vb.cfg.Vni = defaultVNI
+	vb.cfg.VNI = defaultVNI
 
 	return vb
 }
 
 func newSubnetAttrs(pubIP net.IP, mac net.HardwareAddr) (*subnet.LeaseAttrs, error) {
-	sa := subnet.LeaseAttrs{
-		PublicIP:    ip.FromIP(pubIP),
-		BackendType: "vxlan",
-	}
-
-	data, err := json.Marshal(vxlanLeaseAttrs{hardwareAddr(mac)})
-	if err != nil {
-		return nil, err
-	}
-
-	err = sa.BackendData.UnmarshalJSON(data)
+	data, err := json.Marshal(&vxlanLeaseAttrs{hardwareAddr(mac)})
 	if err != nil {
 		return nil, err
 	}
 
-	return &sa, nil
+	return &subnet.LeaseAttrs{
+		PublicIP:    ip.FromIP(pubIP),
+		BackendType: "vxlan",
+		BackendData: json.RawMessage(data),
+	}, nil
 }
 
 func (vb *VXLANBackend) Init(extIface *net.Interface, extIP net.IP, ipMasq bool) (*backend.SubnetDef, error) {
@@ -71,8 +65,8 @@ func (vb *VXLANBackend) Init(extIface *net.Interface, extIP net.IP, ipMasq bool)
 	}
 
 	devAttrs := vxlanDeviceAttrs{
-		vni:       uint32(vb.cfg.Vni),
-		name:      fmt.Sprintf("flannel.%v", vb.cfg.Vni),
+		vni:       uint32(vb.cfg.VNI),
+		name:      fmt.Sprintf("flannel.%v", vb.cfg.VNI),
 		vtepIndex: extIface.Index,
 		vtepAddr:  extIP,
 		vtepPort:  vb.cfg.Port,

+ 3 - 3
subnet/subnet.go

@@ -424,12 +424,12 @@ func (sm *SubnetManager) parseSubnetWatchError(err error) (batch *EventBatch, ou
 }
 
 func (sm *SubnetManager) LeaseRenewer(cancel chan bool) {
-	dur := sm.leaseExp.Sub(time.Now()) - renewMargin
-
 	for {
+		dur := sm.leaseExp.Sub(time.Now()) - renewMargin
+
 		select {
 		case <-time.After(dur):
-			attrBytes, err := json.Marshal(sm.myLease.Attrs)
+			attrBytes, err := json.Marshal(&sm.myLease.Attrs)
 			if err != nil {
 				log.Error("Error renewing lease (trying again in 1 min): ", err)
 				dur = time.Minute

+ 18 - 4
subnet/subnet_test.go

@@ -3,6 +3,7 @@ package subnet
 import (
 	"encoding/json"
 	"fmt"
+	"reflect"
 	"testing"
 	"time"
 
@@ -252,18 +253,31 @@ func TestWatchLeaseRemoved(t *testing.T) {
 	close(cancel)
 }
 
+type leaseData struct {
+	Dummy string
+}
+
 func TestRenewLease(t *testing.T) {
 	msr := newMockSubnetRegistry(1)
 	sm, err := newSubnetManager(msr)
 	if err != nil {
-		t.Fatalf("Failed to create subnet manager: %s", err)
+		t.Fatalf("Failed to create subnet manager: %v", err)
 	}
 
+	// Create LeaseAttrs
 	extIP, _ := ip.ParseIP4("1.2.3.4")
 	attrs := LeaseAttrs{
-		PublicIP: extIP,
+		PublicIP:    extIP,
+		BackendType: "vxlan",
+	}
+
+	ld, err := json.Marshal(&leaseData{Dummy: "test string"})
+	if err != nil {
+		t.Fatalf("Failed to marshal leaseData: %v", err)
 	}
+	attrs.BackendData = json.RawMessage(ld)
 
+	// Acquire lease
 	cancel := make(chan bool)
 	defer close(cancel)
 
@@ -288,8 +302,8 @@ func TestRenewLease(t *testing.T) {
 				t.Errorf("Failed to JSON-decode LeaseAttrs: %v", err)
 				return
 			}
-			if a.PublicIP != attrs.PublicIP {
-				t.Errorf("LeaseAttrs changed: was %v, now %v", attrs.PublicIP, a.PublicIP)
+			if !reflect.DeepEqual(a, attrs) {
+				t.Errorf("LeaseAttrs changed: was %#v, now %#v", attrs, a)
 			}
 			return
 		}