blob: d35a55b6bdedb243c858937f98f95a72464fb26d [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
27 "gerrit.opencord.org/voltha-bbsim/common/logger"
28 "gerrit.opencord.org/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
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +090051func NewTestManager(opt *option) *TestManager {
52 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
58func (*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 Bozakov7401ff22019-05-28 22:45:12 +020090func (tm *TestManager) StartTester(t *Tester) error {
Keita NISHIMOTO2807c542019-06-04 22:58:32 +090091 testtype := t.Type
92 key := t.Key
93 waitsec := t.Waitsec
Keita NISHIMOTO9708e042018-10-27 09:24:44 +090094
Keita NISHIMOTO2807c542019-06-04 22:58:32 +090095 logger.Debug("StartTester type:%s called with key:%v", testtype, key)
96 child, cancel := context.WithCancel(tm.ctx)
97 t.ctx = child
98 t.cancel = cancel
99 go func() error {
100 tick := time.NewTicker(time.Second)
101 counter := 0
102 defer func() {
103 tick.Stop()
104 logger.Debug("Tester type:%s with key %v Done", testtype, key)
105 }()
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900106
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900107 L:
108 for counter < waitsec {
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200109 select {
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900110 case <-tick.C:
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200111 counter++
112 if counter == waitsec { // TODO: This should be fixed
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900113 break L
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900114 }
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900115 case <-child.Done():
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900116 return nil
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900117 }
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900118 }
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900119 err := t.Testfunc(key)
120 if err != nil {
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900121 return err
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900122 }
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900123 return nil
124 }()
125
126 tm.testers[testtype][key] = t
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900127 return nil
128}
129
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200130// StopTester stops the test
131func (tm *TestManager) StopTester(testtype string, key device.Devkey) error {
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900132 ts := tm.testers[testtype][key]
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900133 ts.cancel()
Keita NISHIMOTO2807c542019-06-04 22:58:32 +0900134 delete(tm.testers[testtype], key)
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900135 return nil
136}
137
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200138// Initialize test manager
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900139func (tm *TestManager) Initialize() {
140 logger.Info("TestManager Initialize () called")
141 pids := tm.Pid
142 logger.Debug("Runnig Process: %v", pids)
143 KillProcesses(pids)
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200144 exec.Command("rm", "/var/run/dhcpd.pid").Run() // This is for DHCP server activation
145 exec.Command("touch", "/var/run/dhcpd.pid").Run() // This is for DHCP server activation
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900146}
147
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200148// KillProcesses kill process by specified pid
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900149func KillProcesses(pids []int) error {
150 for _, pname := range pids {
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900151 killProcess(pname)
152 }
153 return nil
154}
155
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900156func killProcess(pid int) error {
157 err := exec.Command("kill", strconv.Itoa(pid)).Run()
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900158 if err != nil {
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900159 logger.Error("Fail to kill %d: %v", pid, err)
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900160 return err
161 }
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900162 logger.Info("Successfully killed %d", pid)
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900163 return nil
164}
165
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900166func activateWPASupplicant(key device.Devkey) (err error) {
167 if err = startEAPClient(key.Intfid, key.ID); err != nil {
168 errmsg := fmt.Sprintf("Failed to activate WPA Supplicant intfid: %d onuid: %d", key.Intfid, key.ID)
169 logger.Error(errmsg)
Keita NISHIMOTO621a43d2019-01-30 20:53:03 +0900170 }
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900171 logger.Info("Successfuly activateWPASupplicant() for intfid:%d onuid:%d", key.Intfid, key.ID)
172 return nil
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900173}
174
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900175func activateDHCPClient(key device.Devkey) (err error) {
176 if err = startDHCPClient(key.Intfid, key.ID); err != nil {
177 errmsg := fmt.Sprintf("Failed to activate DHCP client intfid: %d onuid: %d", key.Intfid, key.ID)
178 logger.Error(errmsg)
Keita NISHIMOTO2f8a6a42019-02-08 09:47:07 +0900179 }
Keita NISHIMOTOdd9f6732019-02-09 09:41:31 +0900180 return nil
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900181}
182
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200183func activateDHCPServer(veth string, serverip string) error {
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900184 err := exec.Command("ip", "addr", "add", serverip, "dev", veth).Run()
185 if err != nil {
Matteo Scandolo2aca22c2018-11-08 14:12:07 -0800186 logger.Error("Fail to add ip to %s address: %s", veth, err)
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900187 return err
188 }
189 err = exec.Command("ip", "link", "set", veth, "up").Run()
190 if err != nil {
Matteo Scandolo2aca22c2018-11-08 14:12:07 -0800191 logger.Error("Fail to set %s up: %s", veth, err)
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900192 return err
193 }
Matteo Scandolof7b260d2019-07-31 13:43:02 -0700194 dhcp := "/usr/local/bin/dhcpd"
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900195 conf := "/etc/dhcp/dhcpd.conf"
Keita NISHIMOTO2f8a6a42019-02-08 09:47:07 +0900196 logfile := "/tmp/dhcplog"
Matteo Scandolof7b260d2019-07-31 13:43:02 -0700197 var stderr bytes.Buffer
198 cmd := exec.Command(dhcp, "-cf", conf, veth, "-tf", logfile)
199 cmd.Stderr = &stderr
200 err = cmd.Run()
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900201 if err != nil {
Matteo Scandolof7b260d2019-07-31 13:43:02 -0700202 logger.Error("Fail to activateDHCP Server (): %s, %s", err, stderr.String())
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900203 return err
204 }
Matteo Scandolo2aca22c2018-11-08 14:12:07 -0800205 logger.Info("DHCP Server is successfully activated !")
Keita NISHIMOTO9708e042018-10-27 09:24:44 +0900206 return err
Zdravko Bozakov7401ff22019-05-28 22:45:12 +0200207}