Implemented the provision / activate ont workflow

Change-Id: Ife684f41e54e176879332922ad86f517358f15e7
diff --git a/models/abstract/port.go b/models/abstract/port.go
index c23249a..5dfa195 100644
--- a/models/abstract/port.go
+++ b/models/abstract/port.go
@@ -16,7 +16,11 @@
 
 package abstract
 
-import "gerrit.opencord.org/abstract-olt/models/physical"
+import (
+	"fmt"
+
+	"gerrit.opencord.org/abstract-olt/models/physical"
+)
 
 /*
 Port represents a single PON port on the OLT chassis
@@ -28,3 +32,26 @@
 	PhysPort *physical.PONPort
 	Parent   *Slot `json:"-"`
 }
+
+type UnprovisonedPortError struct {
+	oltNum  int
+	clli    string
+	portNum int
+}
+
+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)
+}
+func (port *Port) provisionOnt(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]
+	phyPort.ActivateOnt(ontNumber, ont.Svlan, ont.Cvlan, serialNumber)
+	return nil
+}