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