Merge "Change PTL informatin in INFO"
[bottlenecks.git] / testsuites / vstf / vstf_scripts / vstf / controller / env_build / cfg_intent_parse.py
1 ##############################################################################
2 # Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10 import json
11 import logging
12 from vstf.common.utils import randomMAC
13
14 LOG = logging.getLogger(__name__)
15
16
17 class IntentParser(object):
18
19     def __init__(self, cfg_file):
20         self.cfg_file = cfg_file
21         with file(cfg_file) as fp:
22             self.cfg_intent = json.load(fp)
23
24     def parse_cfg_file(self):
25         self.set_default()
26         self.parse_br_type()
27         self.parse_vms_cfg()
28         return self.cfg_intent
29
30     def set_default(self):
31         for host_cfg in self.cfg_intent['env-build']:
32             host_cfg.setdefault("scheme", 'libvirt')
33             host_cfg.setdefault("drivers", [])
34             host_cfg.setdefault("vms", [])
35             host_cfg.setdefault("bridges", [])
36             for vm_cfg in host_cfg["vms"]:
37                 vm_cfg.setdefault("init_config", {})
38                 vm_cfg["init_config"].setdefault('amqp_port', 5672)
39                 vm_cfg["init_config"].setdefault('amqp_user', "guest")
40                 vm_cfg["init_config"].setdefault('amqp_passwd', "guest")
41                 vm_cfg["init_config"].setdefault('amqp_id', "")
42
43     def _nomornize_boolean(self, flag):
44         if isinstance(flag, bool):
45             return flag
46         lflag = flag.lower()
47         if lflag == 'true':
48             return True
49         if lflag == 'false':
50             return False
51         raise Exception("flag %s cannot be nomonized to bool value" % flag)
52
53     def parse_br_type(self):
54         for host_cfg in self.cfg_intent['env-build']:
55             br_cfgs = host_cfg['bridges']
56             br_type_set = set()
57             for br_cfg in br_cfgs:
58                 br_type_set.add(br_cfg["type"])
59             for vm_cfg in host_cfg['vms']:
60                 for tap_cfg in vm_cfg['taps']:
61                     br_type_set.add(tap_cfg["br_type"])
62             if len(br_type_set) > 1:
63                 raise Exception(
64                     "specified more than one type of vswitchfor host:%s" %
65                     host_cfg['ip'])
66             if len(br_type_set) > 0:
67                 br_type = br_type_set.pop()
68                 host_cfg['br_type'] = br_type
69
70     def parse_vms_cfg(self):
71         for host_cfg in self.cfg_intent['env-build']:
72             vm_cfgs = host_cfg["vms"]
73             self._parse_vm_init_cfg(vm_cfgs)
74             self._parse_vm_ctrl_cfg(vm_cfgs)
75             for vm_cfg in vm_cfgs:
76                 self._parse_taps_cfg(vm_cfg['taps'])
77
78     def _parse_taps_cfg(self, tap_cfgs):
79         tap_name_set = set()
80         tap_mac_set = set()
81         count = 0
82         for tap_cfg in tap_cfgs:
83             count += 1
84             tap_name_set.add(tap_cfg["tap_mac"])
85             tap_mac_set.add(tap_cfg["tap_name"])
86         if len(tap_mac_set) != len(tap_name_set) != count:
87             raise Exception('config same tap_mac/tap_name for different taps')
88         LOG.info("tap_name_set: %s", tap_name_set)
89         LOG.info("tap_mac_set: %s", tap_mac_set)
90
91     def _parse_vm_init_cfg(self, vm_cfgs):
92         count = 0
93         ip_set = set()
94         gw_set = set()
95         required_options = {"ctrl_ip_setting", "ctrl_gw", "amqp_server"}
96         for vm_cfg in vm_cfgs:
97             init_cfg = vm_cfg["init_config"]
98             sub = required_options - set(init_cfg.keys())
99             if sub:
100                 raise Exception("unset required options:%s" % sub)
101             count += 1
102             ip_set.add(init_cfg["ctrl_ip_setting"])
103             gw_set.add(init_cfg["ctrl_gw"])
104         if len(gw_set) > 1:
105             raise Exception("cannot config more than one gw for vm")
106         if len(ip_set) < count:
107             raise Exception("config same ip for different vm")
108         LOG.info("ip_set: %s", ip_set)
109         LOG.info("gw_set: %s", gw_set)
110
111     def _parse_vm_ctrl_cfg(self, vm_cfgs):
112         count = 0
113         ctrl_mac_set = set()
114         ctrl_br_set = set()
115         for vm_cfg in vm_cfgs:
116             count += 1
117             vm_cfg.setdefault("ctrl_mac", randomMAC())
118             vm_cfg.setdefault("ctrl_br", 'br0')
119             ctrl_mac_set.add(vm_cfg['ctrl_mac'])
120             ctrl_br_set.add(vm_cfg['ctrl_br'])
121         if len(ctrl_br_set) > 1:
122             raise Exception("cannot config more than one ctrl_br_set.")
123         if len(ctrl_mac_set) < count:
124             raise Exception("config same ctrl_mac_set for different vm.")
125         LOG.info("ctrl_mac_set: %s", ctrl_mac_set)
126         LOG.info("ctrl_br_set: %s", ctrl_br_set)
127
128
129 if __name__ == '__main__':
130     import argparse
131
132     parser = argparse.ArgumentParser()
133     parser.add_argument('--config', help='config file to parse')
134     args = parser.parse_args()
135     logging.basicConfig(level=logging.INFO)
136     p = IntentParser(args.config)
137     LOG.info(json.dumps(p.parse_cfg_file(), indent=4))