SEBA-317

Change-Id: Ifb582cbd4764b6995b191ed5c9bc08f2d1ba3c4b
diff --git a/models/abstract/ChassisUtils.go b/models/abstract/ChassisUtils.go
index 0cacf79..964234f 100644
--- a/models/abstract/ChassisUtils.go
+++ b/models/abstract/ChassisUtils.go
@@ -47,31 +47,32 @@
 
 	var onts [64]Ont
 	//i starts with 1 because :P Architects - blah
-	for i := 1; i < 65; i++ {
+	var i uint32
+	for i = 1; i < 65; i++ {
 		/* adding one because the system that provisions is 1 based on everything not 0 based*/
-		onts[i-1] = Ont{Number: i, Svlan: calculateSvlan(s.Number, n, i),
-			Cvlan: calculateCvlan(s.Number, n, i+1), Parent: &port}
+		onts[int(i-1)] = Ont{Number: int(i), Svlan: calculateSvlan(s.Number, n, int(i)),
+			Cvlan: calculateCvlan(s.Number, n, int(i+1)), Parent: &port}
 	}
 
 	port.Onts = onts
 	return port
 }
 
-func calculateCvlan(slot int, port int, ont int) int {
+func calculateCvlan(slot int, port int, ont int) uint32 {
 	ontPortOffset := 120 // Max(ONT_SLOT) * Max(ONT_PORT) = 10 * 12 = 120
 	ontSlotOffset := 12  //= Max(ONT_PORT) = 12
 	vlanOffset := 1      //(VID 1 is reserved)
 
-	cVid := ((ont-2)%32)*ontPortOffset + (slot-3)*ontSlotOffset + port + vlanOffset
+	cVid := uint32(((ont-2)%32)*ontPortOffset + (slot-3)*ontSlotOffset + port + vlanOffset)
 
 	return cVid
 }
 
-func calculateSvlan(slot int, port int, ont int) int {
+func calculateSvlan(slot int, port int, ont int) uint32 {
 	ltSlotOffset := 16
 	vlanGap := 288  // Max(LT_SLOT) * Max(ltSlotOffset) = 18 * 16 = 288
 	vlanOffset := 1 //(VID 1 is reserved)
-	sVid := ((slot-3)*ltSlotOffset + port) + ((ont-1)/32)*vlanGap + vlanOffset
+	sVid := uint32(((slot-3)*ltSlotOffset + port) + ((ont-1)/32)*vlanGap + vlanOffset)
 
 	return sVid
 }
diff --git a/models/abstract/chassis.go b/models/abstract/chassis.go
index 9b62c8c..a86822d 100644
--- a/models/abstract/chassis.go
+++ b/models/abstract/chassis.go
@@ -62,6 +62,11 @@
 
 	return nextPort, nil
 }
+func (chassis *Chassis) ActivateONTFull(slotNumber int, portNumber int, ontNumber int, serialNumber string, cTag uint32, sTag uint32, nasPortID string, circuitID string) error {
+	err := chassis.Slots[slotNumber-1].Ports[portNumber-1].provisionOntFull(ontNumber, serialNumber, cTag, sTag, nasPortID, circuitID)
+	return err
+}
+
 func (chassis *Chassis) ActivateONT(slotNumber int, portNumber int, ontNumber int, serialNumber string) error {
 	err := chassis.Slots[slotNumber-1].Ports[portNumber-1].provisionOnt(ontNumber, serialNumber)
 	return err
diff --git a/models/abstract/ont.go b/models/abstract/ont.go
index bfd6d60..6a058a0 100644
--- a/models/abstract/ont.go
+++ b/models/abstract/ont.go
@@ -21,7 +21,7 @@
 */
 type Ont struct {
 	Number int
-	Svlan  int
-	Cvlan  int
+	Svlan  uint32
+	Cvlan  uint32
 	Parent *Port `json:"-"`
 }
diff --git a/models/abstract/port.go b/models/abstract/port.go
index 1af3d6e..efb3054 100644
--- a/models/abstract/port.go
+++ b/models/abstract/port.go
@@ -51,19 +51,30 @@
 func (port *Port) provisionOnt(ontNumber int, serialNumber string) error {
 
 	slot := port.Parent
-	chassis := *slot.Parent
+	chassis := slot.Parent
 	baseID := fmt.Sprintf("%d/%d/%d/%d:%d.1.1", chassis.Rack, chassis.Shelf, slot.Number, port.Number, ontNumber)
 	nasPortID := fmt.Sprintf("PON %s", baseID)
 	circuitID := fmt.Sprintf("%s %s", chassis.CLLI, baseID)
 
 	if port.PhysPort == nil {
+		err := UnprovisonedPortError{oltNum: slot.Number, clli: chassis.CLLI, portNum: port.Number}
+		return &err
+	}
+	phyPort := port.PhysPort
+	ont := port.Onts[ontNumber-1]
+	err := phyPort.ActivateOnt(ontNumber, ont.Svlan, ont.Cvlan, serialNumber, nasPortID, circuitID)
+	return err
+}
+func (port *Port) provisionOntFull(ontNumber int, serialNumber string, cTag uint32, sTag uint32, nasPortID string, circuitID string) error {
+	slot := port.Parent
+
+	if port.PhysPort == nil {
 		chassis := slot.Parent
 		err := UnprovisonedPortError{oltNum: slot.Number, clli: chassis.CLLI, portNum: port.Number}
 		return &err
 	}
 	phyPort := port.PhysPort
-	ont := port.Onts[ontNumber-1]
-	err := phyPort.ActivateOnt(ontNumber, ont.Svlan, ont.Cvlan, serialNumber, nasPortID, circuitID)
+	err := phyPort.ActivateOnt(ontNumber, sTag, cTag, serialNumber, nasPortID, circuitID)
 	return err
 }
 func (port *Port) deleteOnt(ontNumber int, serialNumber string) error {