-
Notifications
You must be signed in to change notification settings - Fork 1
/
generate_zones.py
129 lines (99 loc) · 3.57 KB
/
generate_zones.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/env python2.7
"""
Functions to generate MDS zone templates based on a fixed set of fabric settings
and initiator parameters (server name, HBA name, WWPN).
"""
# Define and parse command line arguments
def parse_args():
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("fabric_cfg", help="Path to fabric config YAML file")
parser.add_argument("initiator_json", help="Path to initiator JSON file")
return parser.parse_args()
# Load a YAML file
def load_yaml_file(file_path):
from yaml import load, CLoader as Loader
with open(file_path) as file:
data = load(file, Loader=Loader)
return data
# Load a JSON file
def load_json_file(file_path):
import json
with open(file_path) as json_data:
data = json.load(json_data)
return data
def generate_device_alias_list(devices):
aliases = {}
aliases['A'] = {}
aliases['B'] = {}
for fabric in aliases:
for host in devices:
for hba in devices[host][fabric]:
device_alias = "{0}_{1}".format(host, hba)
wwpn = devices[host][fabric][hba]
aliases[fabric][device_alias] = wwpn
return aliases
def generate_device_alias_config(aliases):
j2template = """
!### FABRIC A
device-alias database
{% for name, vhba in fabric_A.iteritems() %}
device-alias name {{name}} pwwn {{vhba.wwpn}}
{% endfor %}
device-alias commit
!### FABRIC B
device-alias database
{% for name, vhba in fabric_B.iteritems() %}
device-alias name {{name}} pwwn {{vhba.wwpn}}
{% endfor %}
device-alias commit
"""
from jinja2 import Template
template = Template(j2template, trim_blocks=True, lstrip_blocks=True)
return template.render(fabric_A=aliases['A'], fabric_B=aliases['B'])
# Generate the MDS zone config snippets
def generate_zone_config(fabric_confg, initiator_aliases):
vsans = {'A': fabric_confg['A']['vsan_id'],
'B': fabric_confg['B']['vsan_id']}
targets = {'A': fabric_confg['A']['target_aliases'],
'B': fabric_confg['B']['target_aliases']}
j2template = """
{% for fabric, vsan in vsans.iteritems() %}
!### FABRIC {{fabric}}
{% for initator in initiators[fabric] %}
{% for target in targets[fabric] %}
zone name {{initator}}__{{target}} vsan {{vsan}}
member device-alias {{initator}}
member device-alias {{target}}
{% endfor %}
{% endfor %}
zoneset name Fabric_{{fabric}}_XXX vsan {{vsan}}
{% for initator in initiators[fabric] %}
{% for target in targets[fabric] %}
member {{initator}}__{{target}}
{% endfor %}
{% endfor %}
{% endfor %}
"""
from jinja2 import Template
template = Template(j2template, trim_blocks=True, lstrip_blocks=True)
return template.render(initiators=initiator_aliases, targets=targets, vsans=vsans)
### ---------------------------------------------------------------------------
### MAIN
### ---------------------------------------------------------------------------
# Main function (when running as an executable)
if __name__ == '__main__':
# Retrive the command line arguements
args = parse_args()
# Fabric and target info
fabric_config_file = args.fabric_cfg
fabric_cfg = load_yaml_file(fabric_config_file)
# Initiators
initiator_file = args.initiator_json
initiators = load_json_file(initiator_file)
# Create a list of device aliases
device_aliases = generate_device_alias_list(initiators)
# Print the device-alias config snippets
print generate_device_alias_config(device_aliases)
# Create the zone config snippets
print generate_zone_config(fabric_cfg, device_aliases)