seba-260 get inventory

Change-Id: Icd3f955d55ed71ab18cbab6f669ce244ab7c47da
diff --git a/models/inventory/gather.go b/models/inventory/gather.go
new file mode 100644
index 0000000..9f2bd21
--- /dev/null
+++ b/models/inventory/gather.go
@@ -0,0 +1,129 @@
+/*
+ Copyright 2017 the original author or authors.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+package inventory
+
+import (
+	"encoding/json"
+	"net"
+
+	"gerrit.opencord.org/abstract-olt/models"
+	"gerrit.opencord.org/abstract-olt/models/physical"
+)
+
+type Chassis struct {
+	Clli      string
+	Rack      int
+	Shelf     int
+	XOSAddr   net.TCPAddr
+	LineCards []LineCard
+}
+type LineCard struct {
+	Number int
+	Olts   []PhysicalOlt
+}
+type PhysicalOlt struct {
+	Address  net.TCPAddr
+	Hostname string
+	Ports    []Port
+}
+type Port struct {
+	AbstractNumber int
+	PhysicalNumber int
+	Onts           []Ont
+}
+type Ont struct {
+	Number       int
+	SVlan        uint32
+	CVlan        uint32
+	SerialNumber string
+	NasPortID    string
+	CircuitID    string
+}
+
+func GatherAllInventory() string {
+	chassisMap := models.GetChassisMap()
+	chassis_s := []Chassis{}
+	for clli, chassisHolder := range *chassisMap {
+		chassis := parseClli(clli, chassisHolder)
+		chassis_s = append(chassis_s, chassis)
+	}
+	bytes, _ := json.Marshal(chassis_s)
+	return string(bytes)
+}
+
+func GatherInventory(clli string) string {
+	chassisMap := models.GetChassisMap()
+	chassisHolder := (*chassisMap)[clli]
+	chassis := parseClli(clli, chassisHolder)
+	bytes, _ := json.Marshal(chassis)
+	return string(bytes)
+}
+
+func parseClli(clli string, chassisHolder *models.ChassisHolder) Chassis {
+	abstract := chassisHolder.AbstractChassis
+	chassis := Chassis{}
+	chassis.Clli = clli
+	chassis.Rack = abstract.Rack
+	chassis.Shelf = abstract.Shelf
+	chassis.XOSAddr = chassisHolder.PhysicalChassis.XOSAddress
+
+	lineCards := []LineCard{}
+	for index, slot := range abstract.Slots {
+		if slot.Ports[0].PhysPort != nil {
+			lineCard := LineCard{Number: index + 1}
+			var currentOLT *physical.SimpleOLT
+			var physicalOLT PhysicalOlt
+			var ports []Port
+			olts := []PhysicalOlt{}
+			for i := 0; i < 16; i++ {
+				ponPort := slot.Ports[i].PhysPort
+				if ponPort != nil {
+					parentOLT := ponPort.Parent
+					if currentOLT != parentOLT {
+						if currentOLT != nil {
+							physicalOLT.Ports = ports
+							olts = append(olts, physicalOLT)
+						}
+						physicalOLT = PhysicalOlt{Address: parentOLT.Address, Hostname: parentOLT.Hostname}
+						currentOLT = parentOLT
+						ports = []Port{}
+
+					}
+					port := Port{AbstractNumber: i + 1, PhysicalNumber: ponPort.Number}
+					onts := []Ont{}
+					for _, physicalONT := range ponPort.Onts {
+						if physicalONT.Active {
+							ont := Ont{Number: physicalONT.Number, SVlan: physicalONT.Svlan, CVlan: physicalONT.Cvlan, SerialNumber: physicalONT.SerialNumber,
+								NasPortID: physicalONT.NasPortID, CircuitID: physicalONT.CircuitID}
+							onts = append(onts, ont)
+						}
+					}
+					port.Onts = onts
+					ports = append(ports, port)
+				}
+
+				if i == 15 { // last one
+					physicalOLT.Ports = ports
+					olts = append(olts, physicalOLT)
+				}
+			}
+			lineCard.Olts = olts
+			lineCards = append(lineCards, lineCard)
+		}
+	}
+	chassis.LineCards = lineCards
+	return chassis
+}