SEBA-173
Change-Id: I3480e254784d4af68316d482990d664c50544cff
diff --git a/models/abstract/chassis.go b/models/abstract/chassis.go
index 65bd228..687ecae 100644
--- a/models/abstract/chassis.go
+++ b/models/abstract/chassis.go
@@ -62,3 +62,7 @@
err := chassis.Slots[slotNumber-1].Ports[portNumber-1].provisionOnt(ontNumber, serialNumber)
return err
}
+func (chassis *Chassis) DeleteONT(slotNumber int, portNumber int, ontNumber int, serialNumber string) error {
+ err := chassis.Slots[slotNumber-1].Ports[portNumber-1].deleteOnt(ontNumber, serialNumber)
+ return err
+}
diff --git a/models/abstract/port.go b/models/abstract/port.go
index 5dfa195..2c2e07c 100644
--- a/models/abstract/port.go
+++ b/models/abstract/port.go
@@ -33,12 +33,18 @@
Parent *Slot `json:"-"`
}
+/*
+UnprovisonedPortError - thrown when an attempt is made to address a physical port that hasn't been mapped to an abstract port
+*/
type UnprovisonedPortError struct {
oltNum int
clli string
portNum int
}
+/*
+Error - the interface method that must be implemented on error
+*/
func (e *UnprovisonedPortError) Error() string {
return fmt.Sprintf("Port %d for olt %d on AbstractChasis %s is not provisioned", e.portNum, e.oltNum, e.clli)
}
@@ -49,9 +55,20 @@
err := UnprovisonedPortError{oltNum: slot.Number, clli: chassis.CLLI, portNum: port.Number}
return &err
}
-
phyPort := port.PhysPort
ont := port.Onts[ontNumber-1]
- phyPort.ActivateOnt(ontNumber, ont.Svlan, ont.Cvlan, serialNumber)
- return nil
+ err := phyPort.ActivateOnt(ontNumber, ont.Svlan, ont.Cvlan, serialNumber)
+ return err
+}
+func (port *Port) deleteOnt(ontNumber int, serialNumber string) error {
+ if port.PhysPort == nil {
+ slot := port.Parent
+ 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.DeleteOnt(ontNumber, ont.Svlan, ont.Cvlan, serialNumber)
+ return err
}
diff --git a/models/physical/chassis.go b/models/physical/chassis.go
index 8f60838..705de80 100644
--- a/models/physical/chassis.go
+++ b/models/physical/chassis.go
@@ -51,6 +51,10 @@
//TODO - api call to provison s/c vlans and ont serial number etc
fmt.Printf("chassis.provisionONT(%s,SVlan:%d,CVlan:%d)\n", ont.SerialNumber, ont.Svlan, ont.Cvlan)
}
+func (chassis *Chassis) deleteONT(ont Ont) {
+ //TODO - api call to provison s/c vlans and ont serial number etc
+ fmt.Printf("chassis.deleteONT(%s,SVlan:%d,CVlan:%d)\n", ont.SerialNumber, ont.Svlan, ont.Cvlan)
+}
func (chassis *Chassis) ActivateSlot(slotNumber int) error {
// AT&T backend systems start at 1 and not 0 :P
if chassis.Linecards[slotNumber-1] == nil {
diff --git a/models/physical/ont.go b/models/physical/ont.go
index 4a9ca89..3e5e659 100644
--- a/models/physical/ont.go
+++ b/models/physical/ont.go
@@ -25,4 +25,5 @@
Cvlan int
SerialNumber string
Parent *PONPort `json:"-"`
+ Active bool
}
diff --git a/models/physical/ponport.go b/models/physical/ponport.go
index e17a07e..15b7328 100644
--- a/models/physical/ponport.go
+++ b/models/physical/ponport.go
@@ -16,6 +16,8 @@
package physical
+import "fmt"
+
/*
PONPort represents a single PON port on the OLT chassis
*/
@@ -26,9 +28,74 @@
Parent *Edgecore `json:"-"`
}
-func (port *PONPort) ActivateOnt(number int, sVlan int, cVlan int, serialNumber string) {
+/*
+AllReadyActiveError - thrown when an attempt to activate a ONT which is already activated
+*/
+type AllReadyActiveError struct {
+ slotNum int
+ clli string
+ ponportNum int
+ ontNumber int
+}
+
+/*
+Error - the interface method that must be implemented on error
+*/
+func (e *AllReadyActiveError) Error() string {
+ return fmt.Sprintf("Attempt to Activate ONT %d on PONPort %d Slot %d on %s but already active", e.ontNumber, e.ponportNum, e.slotNum, e.clli)
+}
+
+/*
+AllReadyDeactivatedError - thrown when an attempt to activate a ONT which is already activated
+*/
+type AllReadyDeactivatedError struct {
+ slotNum int
+ clli string
+ ponportNum int
+ ontNumber int
+}
+
+/*
+Error - the interface method that must be implemented on error
+*/
+func (e *AllReadyDeactivatedError) Error() string {
+ return fmt.Sprintf("Attempt to De-Activate ONT %d on PONPort %d Slot %d on %s but not active", e.ontNumber, e.ponportNum, e.slotNum, e.clli)
+}
+
+/*
+ActivateOnt - passes ont information to chassis to make call to NEM to activate (whitelist) ont
+*/
+func (port *PONPort) ActivateOnt(number int, sVlan int, cVlan int, serialNumber string) error {
+ slot := port.Parent
+ chassis := slot.Parent
+ fmt.Printf("Calling ActivateOnt and port state is %t\n", port.Onts[number-1].Active)
+
+ if port.Onts[number-1].Active {
+ e := AllReadyActiveError{ontNumber: number, slotNum: slot.Number, ponportNum: port.Number, clli: chassis.CLLI}
+ return &e
+ }
ont := Ont{Number: number, Svlan: sVlan, Cvlan: cVlan, SerialNumber: serialNumber, Parent: port}
port.Onts[number-1] = ont
port.Parent.Parent.provisionONT(ont)
+ port.Onts[number-1].Active = true
+ return nil
}
+
+/*
+DeleteOnt - passes ont information to chassis to make call to NEM to de-activate (de-whitelist) ont
+*/
+func (port *PONPort) DeleteOnt(number int, sVlan int, cVlan int, serialNumber string) error {
+ slot := port.Parent
+ chassis := slot.Parent
+ fmt.Printf("Calling ActivateOnt and port state is %t\n", port.Onts[number-1].Active)
+ if port.Onts[number-1].Active != true {
+ e := AllReadyDeactivatedError{ontNumber: number, slotNum: slot.Number, ponportNum: port.Number, clli: chassis.CLLI}
+ return &e
+ }
+ ont := Ont{Number: number, Svlan: sVlan, Cvlan: cVlan, SerialNumber: serialNumber, Parent: port}
+ chassis.deleteONT(ont)
+ port.Onts[number-1].Active = false
+
+ return nil
+}