18c2ecf20Sopenharmony_ci'''
28c2ecf20Sopenharmony_cibuild ebpf program
38c2ecf20Sopenharmony_ci'''
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ciimport os
68c2ecf20Sopenharmony_ciimport signal
78c2ecf20Sopenharmony_cifrom string import Template
88c2ecf20Sopenharmony_ciimport subprocess
98c2ecf20Sopenharmony_ciimport time
108c2ecf20Sopenharmony_cifrom TdcPlugin import TdcPlugin
118c2ecf20Sopenharmony_cifrom tdc_config import *
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ciclass SubPlugin(TdcPlugin):
148c2ecf20Sopenharmony_ci    def __init__(self):
158c2ecf20Sopenharmony_ci        self.sub_class = 'buildebpf/SubPlugin'
168c2ecf20Sopenharmony_ci        self.tap = ''
178c2ecf20Sopenharmony_ci        super().__init__()
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci    def pre_suite(self, testcount, testidlist):
208c2ecf20Sopenharmony_ci        super().pre_suite(testcount, testidlist)
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci        if self.args.buildebpf:
238c2ecf20Sopenharmony_ci            self._ebpf_makeall()
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci    def post_suite(self, index):
268c2ecf20Sopenharmony_ci        super().post_suite(index)
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci        self._ebpf_makeclean()
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci    def add_args(self, parser):
318c2ecf20Sopenharmony_ci        super().add_args(parser)
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci        self.argparser_group = self.argparser.add_argument_group(
348c2ecf20Sopenharmony_ci            'buildebpf',
358c2ecf20Sopenharmony_ci            'options for buildebpfPlugin')
368c2ecf20Sopenharmony_ci        self.argparser_group.add_argument(
378c2ecf20Sopenharmony_ci            '--nobuildebpf', action='store_false', default=True,
388c2ecf20Sopenharmony_ci            dest='buildebpf',
398c2ecf20Sopenharmony_ci            help='Don\'t build eBPF programs')
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci        return self.argparser
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci    def _ebpf_makeall(self):
448c2ecf20Sopenharmony_ci        if self.args.buildebpf:
458c2ecf20Sopenharmony_ci            self._make('all')
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci    def _ebpf_makeclean(self):
488c2ecf20Sopenharmony_ci        if self.args.buildebpf:
498c2ecf20Sopenharmony_ci            self._make('clean')
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci    def _make(self, target):
528c2ecf20Sopenharmony_ci        command = 'make -C {} {}'.format(self.args.NAMES['EBPFDIR'], target)
538c2ecf20Sopenharmony_ci        proc = subprocess.Popen(command,
548c2ecf20Sopenharmony_ci            shell=True,
558c2ecf20Sopenharmony_ci            stdout=subprocess.PIPE,
568c2ecf20Sopenharmony_ci            stderr=subprocess.PIPE,
578c2ecf20Sopenharmony_ci            env=os.environ.copy())
588c2ecf20Sopenharmony_ci        (rawout, serr) = proc.communicate()
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci        if proc.returncode != 0 and len(serr) > 0:
618c2ecf20Sopenharmony_ci            foutput = serr.decode("utf-8")
628c2ecf20Sopenharmony_ci        else:
638c2ecf20Sopenharmony_ci            foutput = rawout.decode("utf-8")
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci        proc.stdout.close()
668c2ecf20Sopenharmony_ci        proc.stderr.close()
678c2ecf20Sopenharmony_ci        return proc, foutput
68