[VOL-4603] Generating resource ranges dinamically based on the configuration

Change-Id: Ibcd7a4290e4c57baa0865e013bd140cae0699e05
diff --git a/internal/bbsim/devices/olt.go b/internal/bbsim/devices/olt.go
index 3410e60..a6e55c0 100644
--- a/internal/bbsim/devices/olt.go
+++ b/internal/bbsim/devices/olt.go
@@ -51,19 +51,10 @@
 })
 
 const (
-	onuIdStart = 1
-	// Least pon port on the real OLTs we test with today have 16 ports (not including the pluggable OLTs).
-	// Given that we have to support 512 ONUs per OLT, we have to have up to 32 ONU per PON (could be less
-	// on a higher density port OLT).
-	// We pass just enough limits here to ensure the resource pool is as
-	// compact as possible on the etcd to reduce storage.
-	onuIdEnd            = onuIdStart + 31
+	onuIdStart          = 1
 	allocIdStart        = 1024
-	allocIdPerOnu       = 4
-	allocIdEnd          = allocIdStart + (onuIdEnd-onuIdStart+1)*allocIdPerOnu // up to 4 alloc-id per ONU
 	gemPortIdPerAllocId = 8
 	gemportIdStart      = 1024
-	gemportIdEnd        = gemportIdStart + (onuIdEnd-onuIdStart+1)*allocIdPerOnu*gemPortIdPerAllocId // up to 8 gemport-id per tcont/alloc-id
 	// The flow ids are no more necessary by the adapter, but still need to pass something dummy. Pass a very small valid range.
 	flowIdStart = 1
 	flowIdEnd   = flowIdStart + 1
@@ -105,6 +96,12 @@
 	OpenoltStream openolt.Openolt_EnableIndicationServer
 	enablePerf    bool
 
+	// resource ranges (only the ones that depends on the topology size)
+	onuIdEnd      uint32
+	allocIdPerOnu uint32
+	allocIdEnd    uint32
+	gemportIdEnd  uint32
+
 	// Allocated Resources
 	// this data are to verify that the openolt adapter does not duplicate resources
 	AllocIDsLock     sync.RWMutex
@@ -156,6 +153,12 @@
 		OmciResponseRate:    options.Olt.OmciResponseRate,
 	}
 
+	// create the resource ranges based on the configuration
+	olt.onuIdEnd = onuIdStart + (options.Olt.OnusPonPort - 1)                                               // we need one ONU ID available per ONU, but the smaller the range the smaller the pool created in the openolt adapter
+	olt.allocIdPerOnu = uint32(olt.NumUni * len(common.Services))                                           // 1 allocId per Service * UNI
+	olt.allocIdEnd = allocIdStart + (options.Olt.OnusPonPort * olt.allocIdPerOnu)                           // 1 allocId per Service * UNI * ONU
+	olt.gemportIdEnd = gemportIdStart + (options.Olt.OnusPonPort * olt.allocIdPerOnu * gemPortIdPerAllocId) // up to 8 gemport-id per tcont/alloc-id
+
 	if val, ok := ControlledActivationModes[options.BBSim.ControlledActivation]; ok {
 		olt.ControlledActivation = val
 	} else {
@@ -1263,11 +1266,11 @@
 		Technology:          common.Config.Olt.Technology,
 		PonPorts:            uint32(o.NumPon),
 		OnuIdStart:          onuIdStart,
-		OnuIdEnd:            onuIdEnd,
+		OnuIdEnd:            o.onuIdEnd,
 		AllocIdStart:        allocIdStart,
-		AllocIdEnd:          allocIdEnd,
+		AllocIdEnd:          o.allocIdEnd,
 		GemportIdStart:      gemportIdStart,
-		GemportIdEnd:        gemportIdEnd,
+		GemportIdEnd:        o.gemportIdEnd,
 		FlowIdStart:         flowIdStart,
 		FlowIdEnd:           flowIdEnd,
 		DeviceSerialNumber:  o.SerialNumber,
@@ -1282,19 +1285,19 @@
 						Type:    openolt.DeviceInfo_DeviceResourceRanges_Pool_ONU_ID,
 						Sharing: openolt.DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF,
 						Start:   onuIdStart,
-						End:     onuIdEnd,
+						End:     o.onuIdEnd,
 					},
 					{
 						Type:    openolt.DeviceInfo_DeviceResourceRanges_Pool_ALLOC_ID,
 						Sharing: openolt.DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF,
 						Start:   allocIdStart,
-						End:     allocIdEnd,
+						End:     o.allocIdEnd,
 					},
 					{
 						Type:    openolt.DeviceInfo_DeviceResourceRanges_Pool_GEMPORT_ID,
 						Sharing: openolt.DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF,
 						Start:   gemportIdStart,
-						End:     gemportIdEnd,
+						End:     o.gemportIdEnd,
 					},
 					{
 						Type:    openolt.DeviceInfo_DeviceResourceRanges_Pool_FLOW_ID,
diff --git a/internal/bbsim/devices/olt_test.go b/internal/bbsim/devices/olt_test.go
index 4b046a6..e442d54 100644
--- a/internal/bbsim/devices/olt_test.go
+++ b/internal/bbsim/devices/olt_test.go
@@ -174,6 +174,40 @@
 	assert.Equal(t, olt.Pons[1].Onus[1].ID, uint32(2))
 }
 
+func TestGetDeviceInfo(t *testing.T) {
+
+	var onusPerPon uint32 = 4
+
+	common.Services = []common.ServiceYaml{
+		{Name: "hsia", CTag: 900, CTagAllocation: common.TagAllocationUnique.String(), STag: 900, STagAllocation: common.TagAllocationShared.String(), NeedsEapol: true, NeedsDhcp: true, NeedsIgmp: true},
+	}
+
+	common.Config = &common.GlobalConfig{
+		Olt: common.OltConfig{
+			ID:          1,
+			PonPorts:    2,
+			OnusPonPort: onusPerPon,
+			UniPorts:    4,
+		},
+	}
+
+	olt := CreateOLT(*common.Config, common.Services, true)
+
+	res, err := olt.GetDeviceInfo(context.Background(), &openolt.Empty{})
+
+	assert.NoError(t, err, "GetDeviceInfo returned error")
+
+	fmt.Println(res)
+	fmt.Println(res.OnuIdEnd - res.OnuIdStart + 1)
+
+	assert.Equal(t, onuIdStart+(onusPerPon-1), res.OnuIdEnd)
+	assert.Equal(t, onuIdStart+(onusPerPon-1), res.Ranges[0].Pools[0].End)
+	assert.Equal(t, onusPerPon, res.OnuIdEnd-res.OnuIdStart+1, "The ONU ID range size is different that the number of ONUs per PON")
+
+	assert.Equal(t, uint32(allocIdStart+(olt.NumOnuPerPon*olt.NumUni*len(common.Services))), res.AllocIdEnd)
+	assert.Equal(t, uint32(gemportIdStart+(olt.NumOnuPerPon*olt.NumUni*len(common.Services))*gemPortIdPerAllocId), res.GemportIdEnd)
+}
+
 func Test_Olt_FindOnuBySn_Success(t *testing.T) {
 
 	numPon := 4