[Joid] PEP8 cosmetic changes
[joid.git] / ci / deploy.py
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 """
5 Deploy JOID
6 """
7
8 import yaml
9 import socket
10 import fcntl
11 import struct
12 import getpass
13
14
15 def get_ip_address(ifname):
16     """Get local IP"""
17     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
18     return socket.inet_ntoa(fcntl.ioctl(
19         s.fileno(),
20         0x8915,  # SIOCGIFADDR
21         struct.pack('256s', ifname[:15])
22     )[20:24])
23
24 with open('labconfig.yaml', 'r') as labf:
25     try:
26         labcfg = yaml.load(labf)
27     except yaml.YAMLError as exc:
28         print(exc)
29
30
31 opnfvcfg = {}
32 opnfvlabcfg = {}
33
34
35 def get_from_dict(dataDict, mapList):
36     return reduce(lambda d, k: d[k], mapList, dataDict)
37
38 # lets define the bootstrap section
39 opnfvcfg['demo-maas'] = {'juju-bootstrap': {'memory': 4096,
40                                             'name': "bootstrap",
41                                             'pool': "default",
42                                             'vcpus': 4,
43                                             'disk_size': "60G",
44                                             'arch': "amd64",
45                                             'interfaces': []},
46                          'maas': {'memory': 4096,
47                                   'pool': "default",
48                                   'vcpus': 4,
49                                   'disk_size': "160G",
50                                   'arch': "amd64",
51                                   'interfaces': [],
52                                   'name': "",
53                                   'network_config': [],
54                                   'node_group_ifaces': [],
55                                   'nodes': [],
56                                   'password': 'ubuntu',
57                                   'user': 'ubuntu',
58                                   'release': 'trusty',
59                                   'apt_sources': [],
60                                   'ip_address': '',
61                                   'boot_source': {
62                                         'keyring_filename': "/usr/share/keyrings/ubuntu-cloudimage-keyring.gpg",
63                                         'url': "http://maas.ubuntu.com/images/ephemeral-v2/releases/",
64                                         'sections': {
65                                             '1': {
66                                                 'arches': 'amd64',
67                                                 'labels': 'release',
68                                                 'os': 'ubuntu',
69                                                 'release': 'xenial',
70                                                 'subarches': '*'
71                                              }
72                                          }
73                                      },
74                                   'settings': {'maas_name': '',
75                                                'upstream_dns': '',
76                                                'main_archive': "http://archive.ubuntu.com/ubuntu"
77                                                },
78                                   'virsh': {'rsa_priv_key': '/home/ubuntu/.ssh/id_rsa',
79                                             'rsa_pub_key': '/home/ubuntu/.ssh/id_rsa.pub',
80                                             'uri': ''
81                                             }
82                                   }
83                          }
84
85 opnfvlabcfg['opnfv'] = {'ext-port': '',
86                         'floating-ip-range': '',
87                         'dataNetwork': '',
88                         'ceph-disk': '/srv/',
89                         'storageNetwork': '',
90                         'interface-enable': '',
91                         'publicNetwork': '',
92                         'os-domain-name': '',
93                         'vip': {'rabbitmq': '',
94                                 'dashboard': '',
95                                 'glance': '',
96                                 'keystone': '',
97                                 'ceilometer': '',
98                                 'mysql': '',
99                                 'nova': '',
100                                 'neutron': '',
101                                 'heat': '',
102                                 'cinder': ''}
103                         }
104
105
106 opnfvcfg['demo-maas']['maas']['apt_sources'].append("ppa:maas/stable")
107 opnfvcfg['demo-maas']['maas']['apt_sources'].append("ppa:juju/stable")
108
109 # lets modify the maas general settings:
110
111 updns = get_from_dict(labcfg, ["lab", "racks", 0, "dns"])
112 opnfvcfg["demo-maas"]["maas"]["settings"]["upstream_dns"] = updns
113
114 location = get_from_dict(labcfg, ["lab", "location"])
115 rack = get_from_dict(labcfg, ["lab", "racks", 0, "rack"])
116 value = location+rack
117
118 opnfvcfg["demo-maas"]["maas"]["settings"]["maas_name"] = value
119 opnfvcfg["demo-maas"]["maas"]["name"] = "opnfv-"+value
120
121 ethbrAdm = ""
122 ethbrAdmin = ""
123
124 c = 0
125 y = 0
126 # z = 0
127
128 while c < len(labcfg["opnfv"]["spaces"]):
129     brtype = get_from_dict(labcfg, ["opnfv", "spaces", c, "type"])
130     brname = get_from_dict(labcfg, ["opnfv", "spaces", c, "bridge"])
131     brcidr = get_from_dict(labcfg, ["opnfv", "spaces", c, "cidr"])
132 #
133     if brtype == "admin":
134         ethbrAdmin = get_from_dict(labcfg, ["opnfv", "spaces", c, "bridge"])
135         brgway = get_from_dict(labcfg, ["opnfv", "spaces", c, "gateway"])
136         tmpcidr = brcidr[:-4]
137         opnfvlabcfg["opnfv"]["admNetwork"] = tmpcidr+"2"
138         opnfvlabcfg["opnfv"]["admNetgway"] = brgway
139
140         nodegroup = {"device": "eth"+str(y),
141                      "ip": tmpcidr+"5",
142                      "subnet_mask": "255.255.255.0",
143                      "broadcast_ip": tmpcidr+"255",
144                      "router_ip": brgway,
145                      "static_range": {"high": tmpcidr+"80",
146                                       "low": tmpcidr+"50"},
147                      "dynamic_range": {"high": tmpcidr+"250",
148                                        "low": tmpcidr+"81"}}
149
150         ethbrAdm = ('auto lo\n'
151                     '    iface lo inet loopback\n\n'
152                     'auto eth'+str(y)+'\n'
153                     '    iface eth'+str(y)+' inet static\n'
154                     '    address '+tmpcidr+'5\n'
155                     '    netmask 255.255.255.0\n'
156                     '    gateway '+brgway+'\n'
157                     '    dns-nameservers '+updns+' '+tmpcidr+'5 127.0.0.1\n')
158
159         opnfvcfg['demo-maas']['maas']['ip_address'] = tmpcidr+"5"
160         opnfvcfg['demo-maas']['maas']['interfaces'].append(
161             "bridge="+brname+",model=virtio")
162         opnfvcfg['demo-maas']['juju-bootstrap']['interfaces'].append(
163             "bridge="+brname+",model=virtio")
164         opnfvcfg["demo-maas"]["maas"]["node_group_ifaces"].append(nodegroup)
165         y = y+1
166     elif brtype:
167         opnfvcfg["demo-maas"]["maas"]["interfaces"].append(
168             "bridge="+brname+",model=virtio")
169         brgway = get_from_dict(labcfg, ["opnfv", "spaces", c, "gateway"])
170         if brtype != "external":
171             tmpcidr = brcidr[:-4]
172             if brgway:
173                 nodegroup = {"device": "eth"+str(y),
174                              "ip": tmpcidr+"5",
175                              "subnet_mask": "255.255.255.0",
176                              "broadcast_ip": tmpcidr+"255",
177                              "management": 1,
178                              "router_ip": brgway,
179                              "static_range": {"high": tmpcidr+"80",
180                                               "low": tmpcidr+"50"},
181                              "dynamic_range": {"high": tmpcidr+"250",
182                                                "low": tmpcidr+"81"}}
183             else:
184                 nodegroup = {"device": "eth"+str(y),
185                              "ip": tmpcidr+"5",
186                              "subnet_mask": "255.255.255.0",
187                              "broadcast_ip": tmpcidr+"255",
188                              "management": 1,
189                              "static_range": {"high": tmpcidr+"80",
190                                               "low": tmpcidr+"50"},
191                              "dynamic_range": {"high": tmpcidr+"250",
192                                                "low": tmpcidr+"81"}}
193             opnfvcfg["demo-maas"]["maas"]["node_group_ifaces"].append(
194                 nodegroup)
195             ethbrAdm = (ethbrAdm+'\n'
196                         'auto eth'+str(y)+'\n'
197                         '    iface eth'+str(y)+' inet static\n'
198                         '    address '+tmpcidr+'5\n'
199                         '    netmask 255.255.255.0\n')
200             y = y+1
201         if brtype == "public":
202             opnfvcfg["demo-maas"]["juju-bootstrap"]["interfaces"].append(
203                 "bridge="+brname+",model=virtio")
204             opnfvlabcfg["opnfv"]["publicNetwork"] = brcidr
205         if brtype == "external":
206             ipaddress = get_from_dict(labcfg, ["opnfv", "spaces",
207                                                c, "ipaddress"])
208             ethbrAdm = (ethbrAdm+'\n'
209                         'auto eth'+str(y)+'\n'
210                         '    iface eth'+str(y)+' inet static\n'
211                         '    address '+ipaddress+'\n'
212                         '    netmask 255.255.255.0\n')
213             opnfvcfg["demo-maas"]["juju-bootstrap"]["interfaces"].append(
214                 "bridge="+brname+",model=virtio")
215         if brtype == "data":
216             opnfvlabcfg["opnfv"]["dataNetwork"] = brcidr
217         if brtype == "storage":
218             opnfvlabcfg["opnfv"]["storageNetwork"] = brcidr
219
220     c = c+1
221
222 # lets modify the maas general settings:
223 value = get_ip_address(ethbrAdmin)
224 value = "qemu+ssh://"+getpass.getuser()+"@"+value+"/system"
225 opnfvcfg['demo-maas']['maas']['virsh']['uri'] = value
226 opnfvcfg['demo-maas']['maas']['network_config'] = ethbrAdm
227
228 if len(labcfg["lab"]["racks"][0]["nodes"]) < 1:
229     print("looks like virtual deployment where nodes were not defined")
230     opnfvcfg["demo-maas"]["maas"]["nodes"].remove()
231     exit()
232
233 # lets insert the node details here:
234 c = 0
235 ifnamelist = []
236 #
237 while c < len(labcfg["lab"]["racks"][0]["nodes"]):
238     valuemac = []
239     y = 0
240     # setup value of name and tags accordigly
241     noderoleslist = labcfg["lab"]["racks"][0]["nodes"][c]["roles"]
242     noderoles = " ".join(noderoleslist)
243
244     valuetype = get_from_dict(labcfg, ["lab", "racks", 0, "nodes",
245                                        c, "power", "type"])
246     namevalue = labcfg["lab"]["racks"][0]["nodes"][c]["name"]
247     valuearc = get_from_dict(labcfg, ["lab", "racks", 0,
248                                       "nodes", c, "architecture"])
249     # setup value of architecture
250     if valuearc == "x86_64":
251         valuearc = "amd64/generic"
252
253     if valuetype == "wakeonlan":
254         macvalue = get_from_dict(labcfg, ["lab", "racks", 0, "nodes",
255                                           c, "power", "mac_address"])
256         power = {"type": "ether_wake", "mac_address": macvalue}
257     if valuetype == "ipmi":
258         valueaddr = get_from_dict(labcfg, ["lab", "racks", 0, "nodes", c,
259                                            "power", "address"])
260         valueuser = get_from_dict(labcfg, ["lab", "racks", 0, "nodes", c,
261                                            "power", "user"])
262         valuepass = get_from_dict(labcfg, ["lab", "racks", 0, "nodes", c,
263                                            "power", "pass"])
264         valuedriver = "LAN_2_0"
265         power = {"type": valuetype, "address": valueaddr, "user": valueuser,
266                  "pass": valuepass, "driver": valuedriver}
267
268     opnfvcfg["demo-maas"]["maas"]["nodes"].append(
269             {"name": namevalue,
270              "architecture": valuearc,
271              "interfaces": [],
272              "mac_addresses": [],
273              "power": power,
274              'tags': noderoles})
275
276     y = 0
277     while y < len(labcfg["lab"]["racks"][0]["nodes"][c]["nics"]):
278         valuespaces = labcfg["lab"]["racks"][0]["nodes"][c][
279                         "nics"][y]["spaces"]
280         valueifname = labcfg["lab"]["racks"][0]["nodes"][c][
281                         "nics"][y]["ifname"]
282         if "admin" not in valuespaces:
283             ifnamelist += [valueifname]
284         valueifmac = labcfg["lab"]["racks"][0]["nodes"][c]["nics"][y]["mac"][0]
285         valuemac += labcfg["lab"]["racks"][0]["nodes"][c]["nics"][y]["mac"]
286         opnfvcfg["demo-maas"]["maas"]["nodes"][c]["interfaces"].append(
287                 {"name": valueifname,
288                  "mac_address": valueifmac,
289                  "mode": "auto"})
290         y = y+1
291
292     if valueifmac:
293         opnfvcfg["demo-maas"]["maas"]["nodes"][c]['mac_addresses'] = valuemac
294
295     c = c+1
296
297 opnfvlabcfg["opnfv"]["floating-ip-range"] =\
298     labcfg["lab"]["racks"][0]["floating-ip-range"]
299 opnfvlabcfg["opnfv"]["ext-port"] =\
300     labcfg["lab"]["racks"][0]["ext-port"]
301 opnfvlabcfg["opnfv"]["ceph-disk"] =\
302     labcfg["opnfv"]["storage"][0]["disk"]
303 opnfvlabcfg["opnfv"]["interface-enable"] =\
304     ",".join(list(set(ifnamelist)))
305
306 # setup vip addresss for HA
307 opnfvlabcfg["opnfv"]["vip"]["rabbitmq"] =\
308     opnfvlabcfg["opnfv"]["admNetwork"]+"0"
309 opnfvlabcfg["opnfv"]["vip"]["dashboard"] =\
310     opnfvlabcfg["opnfv"]["admNetwork"]+"1"
311 opnfvlabcfg["opnfv"]["vip"]["glance"] = opnfvlabcfg["opnfv"]["admNetwork"]+"2"
312 opnfvlabcfg["opnfv"]["vip"]["keystone"] =\
313     opnfvlabcfg["opnfv"]["admNetwork"]+"3"
314 opnfvlabcfg["opnfv"]["vip"]["ceilometer"] =\
315     opnfvlabcfg["opnfv"]["admNetwork"]+"4"
316 opnfvlabcfg["opnfv"]["vip"]["mysql"] = opnfvlabcfg["opnfv"]["admNetwork"]+"5"
317 opnfvlabcfg["opnfv"]["vip"]["nova"] = opnfvlabcfg["opnfv"]["admNetwork"]+"6"
318 opnfvlabcfg["opnfv"]["vip"]["neutron"] = opnfvlabcfg["opnfv"]["admNetwork"]+"7"
319 opnfvlabcfg["opnfv"]["vip"]["heat"] = opnfvlabcfg["opnfv"]["admNetwork"]+"8"
320 opnfvlabcfg["opnfv"]["vip"]["cinder"] = opnfvlabcfg["opnfv"]["admNetwork"]+"9"
321
322 osdomname = labcfg["lab"]["racks"][0]["osdomainname"]
323
324 if osdomname:
325     opnfvlabcfg["opnfv"]["os-domain-name"] =\
326         labcfg["lab"]["racks"][0]["osdomainname"]
327     opnfvlabcfg["opnfv"]["domain"] = labcfg["lab"]["racks"][0]["osdomainname"]
328
329 opnfvlabcfg["opnfv"]["ext_port"] = labcfg["lab"]["racks"][0]["ext-port"]
330 opnfvlabcfg["opnfv"]["units"] = len(labcfg["lab"]["racks"][0]["nodes"])
331 opnfvlabcfg["opnfv"]["admin_password"] = "openstack"
332 opnfvlabcfg["opnfv"]["storage"] = labcfg["opnfv"]["storage"]
333 opnfvlabcfg["opnfv"]["spaces"] = labcfg["opnfv"]["spaces"]
334
335 with open('deployment.yaml', 'wa') as opnfvf:
336     yaml.dump(opnfvcfg, opnfvf, default_flow_style=False)
337
338 with open('deployconfig.yaml', 'wa') as opnfvf:
339     yaml.dump(opnfvlabcfg, opnfvf, default_flow_style=False)