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
 }