blob: 716cbc93f17fd358dfdd81e2f77bbd83d89934f6 [file] [log] [blame]
Zack Williamse940c7a2019-08-21 14:25:39 -07001/*
2 * Copyright 2019-present Ciena Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package model
17
18import (
19 "github.com/jhump/protoreflect/dynamic"
20)
21
22type PeerPort struct {
23 DeviceId string `json:"deviceid"`
24 PortNo uint32 `json:"portno"`
25}
26
27type ProxyAddress struct {
28 DeviceId string `json:"deviceId"`
29 DeviceType string `json:"devicetype,omitempty"`
30 ChannelId uint32 `json:"channelid"`
31 ChannelGroupId uint32 `json:"channelgroup"`
32 ChannelTermination string `json:"channeltermination,omitempty"`
33 OnuId uint32 `json:"onuid"`
34 OnuSessionId uint32 `json:"onusessionid"`
35}
36
37type Device struct {
38 Id string `json:"id"`
39 Type string `json:"type"`
40 Root bool `json:"root"`
41 ParentId string `json:"parentid"`
42 ParentPortNo uint32 `json:"parentportno"`
43 Vendor string `json:"vendor"`
44 Model string `json:"model"`
45 HardwareVersion string `json:"hardwareversion"`
46 FirmwareVersion string `json:"firmwareversion"`
47 SerialNumber string `json:"serialnumber"`
48 VendorId string `json:"vendorid"`
49 Adapter string `json:"adapter"`
50 Vlan uint32 `json:"vlan"`
51 MacAddress string `json:"macaddress"`
52 Address string `json:"address"`
53 ExtraArgs string `json:"extraargs"`
54 ProxyAddress *ProxyAddress `json:"proxyaddress,omitempty"`
55 AdminState string `json:"adminstate"`
56 OperStatus string `json:"operstatus"`
57 Reason string `json:"reason"`
58 ConnectStatus string `json:"connectstatus"`
59 Ports []DevicePort `json:"ports"`
60 Flows []Flow `json:"flows"`
61}
62
63type DevicePort struct {
64 PortNo uint32 `json:"portno"`
65 Label string `json:"label"`
66 Type string `json:"type"`
67 AdminState string `json:"adminstate"`
68 OperStatus string `json:"operstatus"`
69 DeviceId string `json:"deviceid"`
70 Peers []PeerPort `json:"peers"`
71}
72
73func (d *Device) PopulateFrom(val *dynamic.Message) {
74 d.Id = val.GetFieldByName("id").(string)
75 d.Type = val.GetFieldByName("type").(string)
76 d.Root = val.GetFieldByName("root").(bool)
77 d.ParentId = val.GetFieldByName("parent_id").(string)
78 d.ParentPortNo = val.GetFieldByName("parent_port_no").(uint32)
79 d.Vendor = val.GetFieldByName("vendor").(string)
80 d.Model = val.GetFieldByName("model").(string)
81 d.HardwareVersion = val.GetFieldByName("hardware_version").(string)
82 d.FirmwareVersion = val.GetFieldByName("firmware_version").(string)
83 d.SerialNumber = val.GetFieldByName("serial_number").(string)
84 d.VendorId = val.GetFieldByName("vendor_id").(string)
85 d.Adapter = val.GetFieldByName("adapter").(string)
86 d.MacAddress = val.GetFieldByName("mac_address").(string)
87 d.Vlan = val.GetFieldByName("vlan").(uint32)
88 d.Address = val.GetFieldByName("host_and_port").(string)
89 if len(d.Address) == 0 {
90 d.Address = val.GetFieldByName("ipv4_address").(string)
91 }
92 if len(d.Address) == 0 {
93 d.Address = val.GetFieldByName("ipv6_address").(string)
94 }
95 if len(d.Address) == 0 {
96 d.Address = "unknown"
97 }
98 d.ExtraArgs = val.GetFieldByName("extra_args").(string)
99 proxy := val.GetFieldByName("proxy_address").(*dynamic.Message)
100 d.ProxyAddress = nil
101 if proxy != nil {
102 d.ProxyAddress = &ProxyAddress{
103 DeviceId: proxy.GetFieldByName("device_id").(string),
104 ChannelId: proxy.GetFieldByName("channel_id").(uint32),
105 ChannelGroupId: proxy.GetFieldByName("channel_group_id").(uint32),
106 OnuId: proxy.GetFieldByName("onu_id").(uint32),
107 OnuSessionId: proxy.GetFieldByName("onu_session_id").(uint32),
108 }
109 v, err := proxy.TryGetFieldByName("device_type")
110 if err == nil {
111 d.ProxyAddress.DeviceType = v.(string)
112 }
113 v, err = proxy.TryGetFieldByName("channel_termination")
114 if err == nil {
115 d.ProxyAddress.ChannelTermination = v.(string)
116 }
117 }
118 d.AdminState = GetEnumValue(val, "admin_state")
119 d.OperStatus = GetEnumValue(val, "oper_status")
120 d.Reason = val.GetFieldByName("reason").(string)
121 d.ConnectStatus = GetEnumValue(val, "connect_status")
122
123 ports := val.GetFieldByName("ports").([]interface{})
124 d.Ports = make([]DevicePort, len(ports))
125 for i, port := range ports {
126 d.Ports[i].PopulateFrom(port.(*dynamic.Message))
127 }
128 flows := val.GetFieldByName("flows").(*dynamic.Message)
129 if flows == nil {
130 d.Flows = make([]Flow, 0)
131 } else {
132 items := flows.GetFieldByName("items").([]interface{})
133 d.Flows = make([]Flow, len(items))
134 for i, flow := range items {
135 d.Flows[i].PopulateFrom(flow.(*dynamic.Message))
136 }
137 }
138}
139
140func (port *DevicePort) PopulateFrom(val *dynamic.Message) {
141 port.PortNo = val.GetFieldByName("port_no").(uint32)
142 port.Type = GetEnumValue(val, "type")
143 port.Label = val.GetFieldByName("label").(string)
144 port.AdminState = GetEnumValue(val, "admin_state")
145 port.OperStatus = GetEnumValue(val, "oper_status")
146 port.DeviceId = val.GetFieldByName("device_id").(string)
147 peers := val.GetFieldByName("peers").([]interface{})
148 port.Peers = make([]PeerPort, len(peers))
149 for j, peer := range peers {
150 p := peer.(*dynamic.Message)
151 port.Peers[j].DeviceId = p.GetFieldByName("device_id").(string)
152 port.Peers[j].PortNo = p.GetFieldByName("port_no").(uint32)
153 }
154}