cleaning stuff up

Change-Id: Ib7e91c6e92b6f6b3c93f4d8ca5dcbfcf74f6c671
diff --git a/api/abstract_olt_api.proto b/api/abstract_olt_api.proto
index 86f9a72..12c8941 100644
--- a/api/abstract_olt_api.proto
+++ b/api/abstract_olt_api.proto
@@ -21,14 +21,8 @@
    string VCoreIP =2;
    int32 VCorePort=3;
 }
-message Error {
-   int32 ErrorNum = 1;
-   string ErrorMessage=2;
-   int32 Serverity=3;
-}
 message AddChassisReturn{
    string DeviceID = 1;
-   Error error = 2;
 }
 message AddOLTChassisMessage{
    string CLLI=1;
@@ -55,14 +49,13 @@
 message AddOLTChassisReturn {
    string DeviceID =1;
    string ChassisDeviceID =2;
-   Error error = 3;
 }
 message ActivateSlotMessage{
-   string SlotDeviceID = 1;
+   string CLLI =1;
+   int32 SlotNumber = 2;
 }
 message ActivateSlotReturn{
    bool Success = 1;
-   Error error = 2;
 }
 message AddOntMessage{
    string CLLI=1;
@@ -73,7 +66,6 @@
 }
 message AddOntReturn{
    bool Success=1;
-   Error error = 2;
 }
 
 service AbstractOLT{
diff --git a/api/handler_test.go b/api/handler_test.go
index 50c5355..c319e6d 100644
--- a/api/handler_test.go
+++ b/api/handler_test.go
@@ -22,6 +22,7 @@
 
 	"gerrit.opencord.org/abstract-olt/api"
 	"gerrit.opencord.org/abstract-olt/models/abstract"
+	"gerrit.opencord.org/abstract-olt/models/physical"
 	"golang.org/x/net/context"
 )
 
@@ -40,7 +41,6 @@
 		t.Fatalf("CreateChassis failed %v\n", err)
 	}
 	clli = ret.DeviceID
-
 }
 func TestHandler_CreateOLTChassis(t *testing.T) {
 	fmt.Println("in handlerTest_CreateChassis")
@@ -51,6 +51,30 @@
 		t.Fatalf("CreateOLTChassis failed %v\n", err)
 	}
 	fmt.Printf("CreateOLTChassis success %v\n", ret)
+}
+func TestHandler_EnableSlot(t *testing.T) {
+	ctx = context.Background()
+	server = api.Server{}
+	fmt.Println("in handler_test_EnableSlot")
+	// slot number 1 should be provisioned above
+	message := &api.ActivateSlotMessage{CLLI: clli, SlotNumber: 1}
+	ret, err := server.EnableSlot(ctx, message)
+	if err != nil {
+		t.Fatalf("EnableSlot failed with %v\n", err)
+	}
+	fmt.Printf("EnableSlot succeeded with %v\n", ret)
+	// Slot 2 isn't provisioned and should fail
+	message = &api.ActivateSlotMessage{CLLI: clli, SlotNumber: 2}
+	ret, err = server.EnableSlot(ctx, message)
+	if err != nil {
+		switch err.(type) {
+		case *physical.UnprovisionedSlotError:
+			fmt.Printf("EnableSlot failed as it should with %v\n", err)
+		default:
+			t.Fatalf("EnableSlot failed with %v\n", err)
+		}
+		t.Fatalf("EnableSlot should have failed but didn't")
+	}
 
 }
 func TestHandler_ProvisionOnt(t *testing.T) {
@@ -65,6 +89,7 @@
 	}
 	// this one should fail
 	fmt.Println("here")
+	//SlotNumber 1 hasn't been provisioned
 	message = &api.AddOntMessage{CLLI: clli, SlotNumber: 2, PortNumber: 3, OntNumber: 2, SerialNumber: "2033029402"}
 	ret, err = server.ProvisionOnt(ctx, message)
 	if err != nil {
@@ -78,5 +103,4 @@
 		t.Fatalf("ProvsionOnt should have failed but didn't")
 	}
 	fmt.Printf("ProvisionOnt success %v\n", ret)
-
 }
diff --git a/models/abstract/chassis.go b/models/abstract/chassis.go
index 74a288c..65bd228 100644
--- a/models/abstract/chassis.go
+++ b/models/abstract/chassis.go
@@ -59,6 +59,6 @@
 	return nextPort, nil
 }
 func (chassis *Chassis) ActivateONT(slotNumber int, portNumber int, ontNumber int, serialNumber string) error {
-	err := chassis.Slots[slotNumber-1].Ports[portNumber].provisionOnt(ontNumber, serialNumber)
+	err := chassis.Slots[slotNumber-1].Ports[portNumber-1].provisionOnt(ontNumber, serialNumber)
 	return err
 }
diff --git a/models/physical/chassis.go b/models/physical/chassis.go
index 3f050aa..8f60838 100644
--- a/models/physical/chassis.go
+++ b/models/physical/chassis.go
@@ -30,6 +30,14 @@
 	Dataswitch   DataSwitch
 	Linecards    []OLT
 }
+type UnprovisionedSlotError struct {
+	CLLI       string
+	SlotNumber int
+}
+
+func (e *UnprovisionedSlotError) Error() string {
+	return fmt.Sprintf("SlotNumber %d in Chassis %s is currently unprovsioned", e.SlotNumber, e.CLLI)
+}
 
 /*
 AddOLTChassis - adds a reference to a new olt chassis
@@ -43,3 +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) ActivateSlot(slotNumber int) error {
+	// AT&T backend systems start at 1 and not 0 :P
+	if chassis.Linecards[slotNumber-1] == nil {
+		return &UnprovisionedSlotError{CLLI: chassis.CLLI, SlotNumber: slotNumber}
+	}
+	return chassis.Linecards[slotNumber-1].activate()
+}
diff --git a/models/physical/olt.go b/models/physical/olt.go
index beffec8..121fdac 100644
--- a/models/physical/olt.go
+++ b/models/physical/olt.go
@@ -29,6 +29,7 @@
 	GetPorts() []PONPort
 	GetParent() *Chassis
 	GetDataSwitchPort() int
+	activate() error
 }
 
 /*
@@ -73,3 +74,8 @@
 func (s *SimpleOLT) GetDataSwitchPort() int {
 	return s.DataSwitchPort
 }
+func (s *SimpleOLT) activate() error {
+	s.Active = true
+	//TODO make call to XOS to activate phyiscal OLT
+	return nil
+}