blob: 954e66e535ec485ebb8f3654f566ba79512d7ed0 [file] [log] [blame]
Matteo Scandolo40e067f2019-10-16 16:59:41 -07001/*
2 * Copyright 2018-present Open Networking Foundation
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 */
16
17package common
18
Zdravko Bozakov3ddb2452019-11-29 14:33:41 +010019import (
20 "flag"
21 "fmt"
22 "io/ioutil"
23 "net"
Matteo Scandolo40e067f2019-10-16 16:59:41 -070024
Zdravko Bozakov3ddb2452019-11-29 14:33:41 +010025 "gopkg.in/yaml.v2"
26)
Matteo Scandolo40e067f2019-10-16 16:59:41 -070027
28type BBRCliOptions struct {
Zdravko Bozakov3ddb2452019-11-29 14:33:41 +010029 *BBSimYamlConfig
Matteo Scandolo40e067f2019-10-16 16:59:41 -070030 BBSimIp string
31 BBSimPort string
32 BBSimApiPort string
Matteo Scandolof5c537e2019-10-28 16:45:57 -070033 LogFile string
Matteo Scandolo40e067f2019-10-16 16:59:41 -070034}
35
Zdravko Bozakov3ddb2452019-11-29 14:33:41 +010036type BBSimYamlConfig struct {
37 BBSim BBSimConfig
38 Olt OltConfig
39 BBR BBRConfig
40}
Matteo Scandolo40e067f2019-10-16 16:59:41 -070041
Zdravko Bozakov3ddb2452019-11-29 14:33:41 +010042type OltConfig struct {
43 Model string `yaml:"model"`
44 Vendor string `yaml:"vendor"`
45 HardwareVersion string `yaml:"hardware_version"`
46 FirmwareVersion string `yaml:"firmware_version"`
47 DeviceId string `yaml:"device_id"`
48 DeviceSerialNumber string `yaml:"device_serial_number"`
49 PonPorts uint32 `yaml:"pon_ports"`
50 NniPorts uint32 `yaml:"nni_ports"`
51 OnusPonPort uint32 `yaml:"onus_per_port"`
52 Technology string `yaml:"technology"`
53 ID int `yaml:"id"`
54 OltRebootDelay int `yaml:"reboot_delay"`
55}
Matteo Scandolo40e067f2019-10-16 16:59:41 -070056
Zdravko Bozakov3ddb2452019-11-29 14:33:41 +010057type BBSimConfig struct {
58 EnableDhcp bool `yaml:"enable_dhcp"`
59 EnableAuth bool `yaml:"enable_auth"`
60 LogLevel string `yaml:"log_level"`
61 LogCaller bool `yaml:"log_caller"`
62 Delay int `yaml:"delay"`
63 CpuProfile *string `yaml:"cpu_profile"`
64 CTagInit int `yaml:"c_tag"`
65 STag int `yaml:"s_tag"`
66 OpenOltAddress string `yaml:"openolt_address"`
67 ApiAddress string `yaml:"api_address"`
68 RestApiAddress string `yaml:"rest_api_address"`
69 LegacyApiAddress string `yaml:"legacy_api_address"`
70 LegacyRestApiAddress string `yaml:"legacy_rest_api_address"`
71}
Matteo Scandoloc1147092019-10-29 09:38:33 -070072
Zdravko Bozakov3ddb2452019-11-29 14:33:41 +010073type BBRConfig struct {
74 Log string `yaml:"log"`
75 LogLevel string `yaml:"log_level"`
76 LogCaller bool `yaml:"log_caller"`
77}
78
79var Options *BBSimYamlConfig
80
81func init() {
82 // load settings from config file first
83 Options, _ = LoadBBSimConf("configs/bbsim.yaml")
84}
85
86func getDefaultOps() *BBSimYamlConfig {
87
88 c := &BBSimYamlConfig{
89 BBSimConfig{
90 STag: 900,
91 CTagInit: 900,
92 EnableDhcp: false,
93 EnableAuth: false,
94 LogLevel: "debug",
95 LogCaller: false,
96 Delay: 200,
97 OpenOltAddress: "0.0.0.0:50060",
98 ApiAddress: "0.0.0.0:50070",
99 RestApiAddress: "0.0.0.0:50071",
100 LegacyApiAddress: "0.0.0.0:50072",
101 LegacyRestApiAddress: "0.0.0.0:50073",
102 },
103 OltConfig{
104 Vendor: "BBSim",
105 Model: "asfvolt16",
106 HardwareVersion: "emulated",
107 FirmwareVersion: "",
108 DeviceSerialNumber: "BBSM00000001",
109 PonPorts: 1,
110 NniPorts: 1,
111 OnusPonPort: 1,
112 Technology: "XGS-PON",
113 ID: 0,
114 OltRebootDelay: 10,
115 },
116 BBRConfig{
117 LogLevel: "debug",
118 LogCaller: false,
119 },
120 }
121 return c
122}
123
124// LoadBBSimConf loads the BBSim configuration from a YAML file
125func LoadBBSimConf(filename string) (*BBSimYamlConfig, error) {
126 yamlConfig := getDefaultOps()
127
128 yamlFile, err := ioutil.ReadFile(filename)
129 if err != nil {
130 fmt.Printf("Cannot load BBSim configuration file: %s. Using defaults.\n", err)
131 return yamlConfig, nil
132 }
133
134 err = yaml.Unmarshal(yamlFile, yamlConfig)
135 if err != nil {
136 fmt.Printf("Error parsing YAML file: %s\n", err)
137 }
138
139 return yamlConfig, nil
140}
141
142// GetBBSimOpts loads the BBSim configuration file and overides options with corresponding CLI flags if set
143func GetBBSimOpts() *BBSimYamlConfig {
144 conf := Options
145
146 olt_id := flag.Int("olt_id", conf.Olt.ID, "OLT device ID")
147 nni := flag.Int("nni", int(conf.Olt.NniPorts), "Number of NNI ports per OLT device to be emulated")
148 pon := flag.Int("pon", int(conf.Olt.PonPorts), "Number of PON ports per OLT device to be emulated")
149 onu := flag.Int("onu", int(conf.Olt.OnusPonPort), "Number of ONU devices per PON port to be emulated")
150
151 s_tag := flag.Int("s_tag", conf.BBSim.STag, "S-Tag initial value")
152 c_tag_init := flag.Int("c_tag", conf.BBSim.CTagInit, "C-Tag starting value, each ONU will get a sequential one (targeting 1024 ONUs per BBSim instance the range is big enough)")
153
154 auth := flag.Bool("auth", conf.BBSim.EnableAuth, "Set this flag if you want authentication to start automatically")
155 dhcp := flag.Bool("dhcp", conf.BBSim.EnableDhcp, "Set this flag if you want DHCP to start automatically")
Matteo Scandolo40e067f2019-10-16 16:59:41 -0700156
157 profileCpu := flag.String("cpuprofile", "", "write cpu profile to file")
158
Zdravko Bozakov3ddb2452019-11-29 14:33:41 +0100159 logLevel := flag.String("logLevel", conf.BBSim.LogLevel, "Set the log level (trace, debug, info, warn, error)")
160 logCaller := flag.Bool("logCaller", conf.BBSim.LogCaller, "Whether to print the caller filename or not")
Matteo Scandolo40e067f2019-10-16 16:59:41 -0700161
Zdravko Bozakov3ddb2452019-11-29 14:33:41 +0100162 delay := flag.Int("delay", conf.BBSim.Delay, "The delay between ONU DISCOVERY batches in milliseconds (1 ONU per each PON PORT at a time")
Matteo Scandoloe33447a2019-10-31 12:38:23 -0700163
Matteo Scandolo40e067f2019-10-16 16:59:41 -0700164 flag.Parse()
165
Zdravko Bozakov3ddb2452019-11-29 14:33:41 +0100166 conf.Olt.ID = int(*olt_id)
167 conf.Olt.NniPorts = uint32(*nni)
168 conf.Olt.PonPorts = uint32(*pon)
169 conf.Olt.OnusPonPort = uint32(*onu)
170 conf.BBSim.STag = int(*s_tag)
171 conf.BBSim.CTagInit = int(*c_tag_init)
172 conf.BBSim.CpuProfile = profileCpu
173 conf.BBSim.LogLevel = *logLevel
174 conf.BBSim.LogCaller = *logCaller
175 conf.BBSim.EnableAuth = *auth
176 conf.BBSim.EnableDhcp = *dhcp
177 conf.BBSim.Delay = *delay
Matteo Scandolo40e067f2019-10-16 16:59:41 -0700178
Zdravko Bozakov3ddb2452019-11-29 14:33:41 +0100179 // update device id if not set
180 if conf.Olt.DeviceId == "" {
181 conf.Olt.DeviceId = net.HardwareAddr{0xA, 0xA, 0xA, 0xA, 0xA, byte(conf.Olt.ID)}.String()
182 }
Matteo Scandolo40e067f2019-10-16 16:59:41 -0700183
Zdravko Bozakov3ddb2452019-11-29 14:33:41 +0100184 return conf
Matteo Scandolo40e067f2019-10-16 16:59:41 -0700185}
186
187func GetBBROpts() BBRCliOptions {
188
189 bbsimIp := flag.String("bbsimIp", "127.0.0.1", "BBSim IP")
190 bbsimPort := flag.String("bbsimPort", "50060", "BBSim Port")
191 bbsimApiPort := flag.String("bbsimApiPort", "50070", "BBSim API Port")
Matteo Scandolof5c537e2019-10-28 16:45:57 -0700192 logFile := flag.String("logfile", "", "Log to a file")
Matteo Scandolo40e067f2019-10-16 16:59:41 -0700193
194 options := GetBBSimOpts()
195
196 bbrOptions := BBRCliOptions{
197 options,
198 *bbsimIp,
199 *bbsimPort,
200 *bbsimApiPort,
Matteo Scandolof5c537e2019-10-28 16:45:57 -0700201 *logFile,
Matteo Scandolo40e067f2019-10-16 16:59:41 -0700202 }
203
204 return bbrOptions
205}