8 from vstf.common.utils import randomMAC
10 LOG = logging.getLogger(__name__)
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)
19 def parse_cfg_file(self):
23 return self.cfg_intent
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', "")
38 def _nomornize_boolean(self, flag):
39 if isinstance(flag, bool):
46 raise Exception("flag %s cannot be nomonized to bool value" % flag)
48 def parse_br_type(self):
49 for host_cfg in self.cfg_intent['env-build']:
50 br_cfgs = host_cfg['bridges']
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
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'])
71 def _parse_taps_cfg(self, tap_cfgs):
75 for tap_cfg in tap_cfgs:
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)
84 def _parse_vm_init_cfg(self, vm_cfgs):
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())
93 raise Exception("unset required options:%s" % sub)
95 ip_set.add(init_cfg["ctrl_ip_setting"])
96 gw_set.add(init_cfg["ctrl_gw"])
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)
104 def _parse_vm_ctrl_cfg(self, vm_cfgs):
108 for vm_cfg in vm_cfgs:
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)
122 if __name__ == '__main__':
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))