Example #1
0
class Control(WatchGuard):

    def __init__(self, user_product):
        super(Control, self).__init__(user_product)
        self.product_obj_list = []
        self.log = Log('control')

    def save_performance_data(self):
        """
            @summary 存储产品的performance数据
        :return:None
        """
        self.save_product_obj()
        # 遍历每个产品对象,获取所以的产品数据存以列表形式放在all_data中
        all_data = []
        for probj in self.product_obj_list:
            pf = probj.get_product_performance()
            all_data.append(pf)
        # 对all_data中的字典按照键值 Firewall Throughput 进行升排序,
        # 因为Firewall Throughput单位全部换算成以K为单位的数字,对应键值flag_number,
        # 所以这里以flag_number排序.
        all_data.sort(key=lambda x: x['flag_number'], reverse=False)
        title = []
        value = []
        for i, data in enumerate(all_data):
            temp = []
            for k, v in data.items():
                if not k == "flag_number":
                    if i == 0:
                        title.append(k)
                    temp.append(v)
            value.append(temp)
        # 调用view层进行写文件
        file_name = "..\\data\\performance.csv"
        visual = Visual(file_name)
        visual.write_to_csv(title, value)
        self.log.debug("存储产品performance数据完成, 结果在data文件下的performance.csv")

    def save_product_obj(self):
        """
            @summary 采用多线程获取存储产品对象【如果产品数量过多,则要限制多线程,防止服务器忙于过多请求,
                     具体限制数量根据网站性能和要求给出】
        :return:None
        """
        user_prd = self.choose_product()
        thread_list = []
        for prd in user_prd:
            name = prd['name']
            pid = prd['id']
            self.thread_action(name, pid)
            th = Thread(target=self.thread_action, args=(name, pid))
            thread_list.append(th)
        for thread in thread_list:
            thread.start()
        for thread in thread_list:
            thread.join(60)

    def thread_action(self, name, pid):
        prd = self.get_product_obj(name, pid)
        self.product_obj_list.append(prd)
Example #2
0
class WatchGuard(object):
    def __init__(self, user_product):
        self.compare_url = COMPARE_URL
        self.user_product = user_product
        self.log = Log('watchGuard')

    def choose_product(self):
        """
            @summary  获取指定的产品列表
        :return: data: [list] ,返回一个列表,其中元素是字典包含设备name和id
        """
        data = []
        page_text = connection.open_url(self.compare_url)
        soup = BeautifulSoup(page_text, 'lxml')
        select_tag = soup.find_all('select', attrs={'name': 'p1'})[0]
        optgroup = select_tag.find_all('optgroup')
        # 遍历下拉框选择Firebox M Series、Firebox T Series型号的设备id
        for group in optgroup:
            label = str(group.get('label').encode('utf-8'))
            if label in self.user_product:
                # 获取到该型号的option标签列表
                option_list = group.find_all('option')
                for opt in option_list:
                    name = str(opt.text.encode('utf-8'))
                    value = str(opt.get('value'))
                    data.append({'name': name, 'id': value})
        self.log.debug("选取用户特定产品型号完成")
        return data

    def get_product_obj(self, name, pid):
        """
            获取产品对象
        :return: Product 对象
        """
        url = COMPARE_URL + "/%s/%s/%s" % (pid, pid, pid)
        page = connection.open_url(url)
        prd = Product(name, page)
        short_name = name.split(' ')[-1]
        self.log.debug('%s 实例化产品对象完成' % short_name)
        return prd