blob: 2f445c7611967d977c7f37c67826c9f1cdb33bec [file] [log] [blame]
Keita NISHIMOTO9708e042018-10-27 09:24:44 +09001/*
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 core
18
19import (
Matteo Scandolof7b260d2019-07-31 13:43:02 -070020 "bytes"
Keita NISHIMOTO9708e042018-10-27 09:24:44 +090021 "context"
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090022 "fmt"
Zdravko Bozakov7401ff22019-05-28 22:45:12 +020023 "os/exec"
24 "strconv"
25 "time"
26
Zack Williams2abf3932019-08-05 14:07:05 -070027 "github.com/opencord/voltha-bbsim/common/logger"
28 "github.com/opencord/voltha-bbsim/device"
Keita NISHIMOTO9708e042018-10-27 09:24:44 +090029)
30
Zdravko Bozakov7401ff22019-05-28 22:45:12 +020031// TestManager is the structure for test manager
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090032type TestManager struct {
Keita NISHIMOTO9708e042018-10-27 09:24:44 +090033 DhcpServerIP string
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090034 Pid []int
Keita NISHIMOTO2807c542019-06-04 22:58:32 +090035 testers map[string]map[device.Devkey]*Tester
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090036 ctx context.Context
Keita NISHIMOTO9708e042018-10-27 09:24:44 +090037 cancel context.CancelFunc
38}
39
Zdravko Bozakov7401ff22019-05-28 22:45:12 +020040// Tester is the structure for Test
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090041type Tester struct {
Zdravko Bozakov7401ff22019-05-28 22:45:12 +020042 Type string
43 Key device.Devkey
Keita NISHIMOTO2807c542019-06-04 22:58:32 +090044 Testfunc func(device.Devkey) error
45 Waitsec int
Zdravko Bozakov7401ff22019-05-28 22:45:12 +020046 ctx context.Context
47 cancel context.CancelFunc
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090048}
49
Zdravko Bozakov7401ff22019-05-28 22:45:12 +020050// NewTestManager returns new TestManager
Zdravko Bozakov078a2712019-07-19 23:25:15 +020051func NewTestManager(opt *Option) *TestManager {
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090052 t := new(TestManager)
Keita NISHIMOTO9708e042018-10-27 09:24:44 +090053 t.DhcpServerIP = opt.dhcpservip
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090054 return t
55}
56
Zdravko Bozakov7401ff22019-05-28 22:45:12 +020057// CreateTester creates instance of Tester
Zdravko Bozakov078a2712019-07-19 23:25:15 +020058func (*TestManager) CreateTester(testtype string, opt *Option, key device.Devkey, fn func(device.Devkey) error, waitsec int) *Tester {
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090059 logger.Debug("CreateTester() called")
60 t := new(Tester)
Keita NISHIMOTO2807c542019-06-04 22:58:32 +090061 t.Type = testtype
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090062 t.Key = key
Keita NISHIMOTO2807c542019-06-04 22:58:32 +090063 t.Testfunc = fn
64 t.Waitsec = waitsec
Keita NISHIMOTO9708e042018-10-27 09:24:44 +090065 return t
66}
67
Zdravko Bozakov7401ff22019-05-28 22:45:12 +020068// Start does starting action - Blocking Call
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090069func (tm *TestManager) Start() error {
70 ctx, cancel := context.WithCancel(context.Background())
71 tm.ctx = ctx
72 tm.cancel = cancel
Keita NISHIMOTO2807c542019-06-04 22:58:32 +090073 tm.testers = make(map[string]map[device.Devkey]*Tester)
74 tm.testers["AAA"] = map[device.Devkey]*Tester{}
75 tm.testers["DHCP"] = map[device.Devkey]*Tester{}
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090076 logger.Info("TestManager start")
77 return nil
78}
79
Zdravko Bozakov7401ff22019-05-28 22:45:12 +020080// Stop does stopping action
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090081func (tm *TestManager) Stop() error {
82 if tm.cancel != nil {
83 tm.cancel()
84 }
85 tm.Initialize()
86 logger.Debug("TestManager Done")
87 return nil
88}
89
Zdravko Bozakov078a2712019-07-19 23:25:15 +020090// StartTester starts the test
Zdravko Bozakov7401ff22019-05-28 22:45:12 +020091func (tm *TestManager) StartTester(t *Tester) error {
Keita NISHIMOTO2807c542019-06-04 22:58:32 +090092 testtype := t.Type
93 key := t.Key
94 waitsec := t.Waitsec
Keita NISHIMOTO9708e042018-10-27 09:24:44 +090095
Matteo Scandolo67add0c2019-08-01 16:41:14 -070096 // TODO use timers instead of this crazy loop: https://gobyexample.com/timers
97
Keita NISHIMOTO2807c542019-06-04 22:58:32 +090098 logger.Debug("StartTester type:%s called with key:%v", testtype, key)
99 child, cancel := context.WithCancel(tm.ctx)
100 t.ctx = child
101 t.cancel = cancel
102 go func() error {
103 tick := time.NewTicker(time.Second)
104 counter := 0
105 defer func() {
106 tick.Stop()
107 logger.Debug("Tester type:%s with key %v Done", testtype, key)
108 }()
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900109
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900110 L:
111 for counter < waitsec {
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200112 select {
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900113 case <-tick.C:
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200114 counter++
115 if counter == waitsec { // TODO: This should be fixed
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900116 break L
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900117 }
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900118 case <-child.Done():
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900119 return nil
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900120 }
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900121 }
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900122 err := t.Testfunc(key)
123 if err != nil {
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900124 return err
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900125 }
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900126 return nil
127 }()
128
129 tm.testers[testtype][key] = t
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900130 return nil
131}
132
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200133// StopTester stops the test
134func (tm *TestManager) StopTester(testtype string, key device.Devkey) error {
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900135 ts := tm.testers[testtype][key]
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900136 ts.cancel()
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900137 delete(tm.testers[testtype], key)
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900138 return nil
139}
140
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200141// Initialize test manager
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900142func (tm *TestManager) Initialize() {
143 logger.Info("TestManager Initialize () called")
144 pids := tm.Pid
145 logger.Debug("Runnig Process: %v", pids)
Zdravko Bozakov078a2712019-07-19 23:25:15 +0200146
147 err := KillProcesses(pids)
148 if err != nil {
149 logger.Error("%v", err)
150 }
151
152 err = exec.Command("rm", "/var/run/dhcpd.pid").Run() // This is for DHCP server activation
153 if err != nil {
154 logger.Error("%v", err)
155 }
156
157 err = exec.Command("touch", "/var/run/dhcpd.pid").Run() // This is for DHCP server activation
158 if err != nil {
159 logger.Error("%v", err)
160 }
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900161}
162
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200163// KillProcesses kill process by specified pid
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900164func KillProcesses(pids []int) error {
165 for _, pname := range pids {
Zdravko Bozakov078a2712019-07-19 23:25:15 +0200166 err := killProcess(pname)
167 if err != nil {
168 logger.Error("%v", err)
169 }
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900170 }
171 return nil
172}
173
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900174func killProcess(pid int) error {
175 err := exec.Command("kill", strconv.Itoa(pid)).Run()
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900176 if err != nil {
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900177 logger.Error("Fail to kill %d: %v", pid, err)
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900178 return err
179 }
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900180 logger.Info("Successfully killed %d", pid)
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900181 return nil
182}
183
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900184func activateWPASupplicant(key device.Devkey) (err error) {
185 if err = startEAPClient(key.Intfid, key.ID); err != nil {
186 errmsg := fmt.Sprintf("Failed to activate WPA Supplicant intfid: %d onuid: %d", key.Intfid, key.ID)
187 logger.Error(errmsg)
Keita NISHIMOTO621a43d2019-01-30 20:53:03 +0900188 }
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900189 logger.Info("Successfuly activateWPASupplicant() for intfid:%d onuid:%d", key.Intfid, key.ID)
190 return nil
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900191}
192
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900193func activateDHCPClient(key device.Devkey) (err error) {
194 if err = startDHCPClient(key.Intfid, key.ID); err != nil {
195 errmsg := fmt.Sprintf("Failed to activate DHCP client intfid: %d onuid: %d", key.Intfid, key.ID)
196 logger.Error(errmsg)
Keita NISHIMOTO2f8a6a42019-02-08 09:47:07 +0900197 }
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900198 return nil
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900199}
200
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200201func activateDHCPServer(veth string, serverip string) error {
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900202 err := exec.Command("ip", "addr", "add", serverip, "dev", veth).Run()
203 if err != nil {
Matteo Scandolo2aca22c2018-11-08 14:12:07 -0800204 logger.Error("Fail to add ip to %s address: %s", veth, err)
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900205 return err
206 }
207 err = exec.Command("ip", "link", "set", veth, "up").Run()
208 if err != nil {
Matteo Scandolo2aca22c2018-11-08 14:12:07 -0800209 logger.Error("Fail to set %s up: %s", veth, err)
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900210 return err
211 }
Matteo Scandolof7b260d2019-07-31 13:43:02 -0700212 dhcp := "/usr/local/bin/dhcpd"
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900213 conf := "/etc/dhcp/dhcpd.conf"
Keita NISHIMOTO2f8a6a42019-02-08 09:47:07 +0900214 logfile := "/tmp/dhcplog"
Matteo Scandolof7b260d2019-07-31 13:43:02 -0700215 var stderr bytes.Buffer
216 cmd := exec.Command(dhcp, "-cf", conf, veth, "-tf", logfile)
217 cmd.Stderr = &stderr
218 err = cmd.Run()
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900219 if err != nil {
Matteo Scandolof7b260d2019-07-31 13:43:02 -0700220 logger.Error("Fail to activateDHCP Server (): %s, %s", err, stderr.String())
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900221 return err
222 }
Matteo Scandolo2aca22c2018-11-08 14:12:07 -0800223 logger.Info("DHCP Server is successfully activated !")
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900224 return err
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200225}