modified to support the custom lab where data will be provided
[joid.git] / ci / deploy.py
1 import yaml
2 import pprint
3 import socket
4 import fcntl
5 import struct
6 import os
7 import getpass
8
9 def get_ip_address(ifname):
10     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
11     return socket.inet_ntoa(fcntl.ioctl(
12         s.fileno(),
13         0x8915,  # SIOCGIFADDR
14         struct.pack('256s', ifname[:15])
15     )[20:24])
16
17 with open('labconfig.yaml', 'r') as labf:
18     labcfg = yaml.load(labf)
19
20 with open('deployment.yaml', 'r') as opnfvf:
21     opnfvcfg = yaml.load(opnfvf)
22
23 def setInDict(dataDict, mapList, value):
24     getFromDict(dataDict, mapList[:-1])[mapList[-1]] = value
25
26 def getFromDict(dataDict, mapList):
27     return reduce(lambda d, k: d[k], mapList, dataDict)
28
29
30 # lets modify the maas general settings:
31
32 updns = getFromDict(labcfg, ["labconfig","labsettings","upstream_dns"])
33 setInDict(opnfvcfg, ["demo-maas", "maas", "settings", "upstream_dns"], updns)
34 value = getFromDict(labcfg, ["labconfig","lab_location"])
35 setInDict(opnfvcfg, ["demo-maas", "maas", "settings", "maas_name"], value)
36 setInDict(opnfvcfg, ["demo-maas", "maas", "name"], "opnfv-"+value)
37
38 #lets figure out the interfaces data
39
40 ethbrAdm=""
41 ethbrAdmin=""
42
43 c=0
44 y=0
45 z=0
46
47 while c < len(labcfg["labconfig"]["bridges"]):
48     brtype = getFromDict(labcfg, ["labconfig","bridges",c,"type"])
49     brname = getFromDict(labcfg, ["labconfig","bridges",c,"bridge"])
50     brcidr = getFromDict(labcfg, ["labconfig","bridges",c,"cidr"])
51     if brtype == "admin":
52         if c > 0:
53             opnfvcfg["demo-maas"]["maas"]["node_group_ifaces"].append({})
54         ethbrAdmin = getFromDict(labcfg, ["labconfig","bridges",c,"bridge"])
55         brgway = getFromDict(labcfg, ["labconfig","bridges",c,"gateway"])
56         tmpcidr = brcidr[:-4]
57         setInDict(opnfvcfg, ["demo-maas", "maas", "ip_address"], tmpcidr+"5")
58         opnfvcfg["demo-maas"]["maas"]["interfaces"][y] = "bridge="+brname+",model=virtio" 
59
60         nodegroup={"device": "eth"+str(y), "ip": tmpcidr+"5","subnet_mask": "255.255.255.0", \
61                    "broadcast_ip": tmpcidr+"255", "router_ip": brgway,\
62                    "static_range":{"high":tmpcidr+"80","low":tmpcidr+"50"},\
63                    "dynamic_range":{"high":tmpcidr+"250","low":tmpcidr+"81"}}
64
65         opnfvcfg["demo-maas"]["maas"]["node_group_ifaces"][y] = nodegroup
66
67         opnfvcfg["demo-maas"]["juju-bootstrap"]["interfaces"][z] = "bridge="+brname+",model=virtio" 
68
69         ethbrAdm = ('auto lo\n'
70                     '    iface lo inet loopback\n\n'
71                     'auto eth'+str(y)+'\n'
72                     '    iface eth'+str(y)+' inet static\n'
73                     '    address '+tmpcidr+'5\n'
74                     '    netmask 255.255.255.0\n'
75                     '    gateway '+brgway+'\n'
76                     '    dns-nameservers '+updns+' '+tmpcidr+'5 127.0.0.1\n')
77         z=z+1
78         y=y+1
79     elif brtype:
80         opnfvcfg["demo-maas"]["maas"]["interfaces"].append("bridge="+brname+",model=virtio")
81         brgway = getFromDict(labcfg, ["labconfig","bridges",c,"gateway"])
82         if brtype != "external":
83             if c > 0:
84                 opnfvcfg["demo-maas"]["maas"]["node_group_ifaces"].append({})
85             tmpcidr = brcidr[:-4]
86             if brgway:
87                 nodegroup={"device": "eth"+str(y), "ip": tmpcidr+"5","subnet_mask": "255.255.255.0", \
88                            "broadcast_ip": tmpcidr+"255", "management": 1, "router_ip": brgway,\
89                            "static_range":{"high":tmpcidr+"80","low":tmpcidr+"50"},\
90                            "dynamic_range":{"high":tmpcidr+"250","low":tmpcidr+"81"}}
91             else:
92                 nodegroup={"device": "eth"+str(y), "ip": tmpcidr+"5","subnet_mask": "255.255.255.0", \
93                            "broadcast_ip": tmpcidr+"255", "management": 1, \
94                            "static_range":{"high":tmpcidr+"80","low":tmpcidr+"50"},\
95                            "dynamic_range":{"high":tmpcidr+"250","low":tmpcidr+"81"}}
96
97             opnfvcfg["demo-maas"]["maas"]["node_group_ifaces"][y] = nodegroup
98             ethbrAdm  = (ethbrAdm+'\n'
99                         'auto eth'+str(y)+'\n'
100                         '    iface eth'+str(y)+' inet static\n'
101                         '    address '+tmpcidr+'5\n'
102                         '    netmask 255.255.255.0\n')
103         if brtype == "public":
104             opnfvcfg["demo-maas"]["juju-bootstrap"]["interfaces"].append("bridge="+brname+",model=virtio")
105             z=z+1
106         if brtype == "external":
107             ipaddress = getFromDict(labcfg, ["labconfig","bridges",c,"ipaddress"])
108             ethbrAdm  = (ethbrAdm+'\n'
109                         'auto eth'+str(y)+'\n'
110                         '    iface eth'+str(y)+' inet static\n'
111                         '    address '+ipaddress+'\n'
112                         '    netmask 255.255.255.0\n')
113             opnfvcfg["demo-maas"]["juju-bootstrap"]["interfaces"].append("bridge="+brname+",model=virtio")
114             z=z+1
115         y=y+1
116
117
118     c=c+1
119
120 setInDict(opnfvcfg, ["demo-maas", "maas", "network_config"], ethbrAdm)
121
122 # lets modify the maas general settings:
123 value = get_ip_address(ethbrAdmin) 
124 value = "qemu+ssh://"+getpass.getuser()+"@"+value+"/system"
125 setInDict(opnfvcfg, ["demo-maas", "maas", "virsh", "uri"], value)
126
127 if len(labcfg["labconfig"]["nodes"]) < 1:
128     print("looks like virtual deployment where nodes were not defined")
129     opnfvcfg["demo-maas"]["maas"]["nodes"].remove()
130     exit() 
131
132 #lets insert the node details here:
133 c=0
134
135 while c < len(labcfg["labconfig"]["nodes"]):
136     # setup value of name and tags accordigly
137     value = getFromDict(labcfg, ["labconfig","nodes",c, "type"])
138     namevalue = "node" + str(c+1) + "-" + value 
139     if c > 0:
140         opnfvcfg["demo-maas"]["maas"]["nodes"].append({})
141
142     opnfvcfg["demo-maas"]["maas"]["nodes"][c]["name"] = namevalue
143     opnfvcfg["demo-maas"]["maas"]["nodes"][c]["tags"] = value
144
145     # setup value of architecture
146     value = getFromDict(labcfg, ["labconfig","nodes",c, "architecture"])
147     if value == "x86_64":
148         value="amd64/generic"
149     opnfvcfg["demo-maas"]["maas"]["nodes"][c]["architecture"] = value
150     
151     # setup mac_addresses
152     value = getFromDict(labcfg, ["labconfig","nodes",c, "pxe_mac_address"])
153     opnfvcfg["demo-maas"]["maas"]["nodes"][c]["mac_addresses"] = value
154     valuetype = getFromDict(labcfg, ["labconfig","nodes",c, "power", "type"])
155
156     if valuetype == "wakeonlan":
157         macvalue = getFromDict(labcfg, ["labconfig","nodes",c, "power", "mac_address"])
158         power={"type": "ether_wake", "mac_address": macvalue}
159         opnfvcfg["demo-maas"]["maas"]["nodes"][c]["power"] = power
160     if valuetype == "ipmi":
161         valueaddr = getFromDict(labcfg, ["labconfig","nodes",c, "power", "address"])
162         valueuser = getFromDict(labcfg, ["labconfig","nodes",c, "power", "user"])
163         valuepass = getFromDict(labcfg, ["labconfig","nodes",c, "power", "pass"])
164         valuedriver = "LAN_2_0"
165         power={"type": valuetype, "address": valueaddr,"user": valueuser, "pass": valuepass, "driver": valuedriver}
166         opnfvcfg["demo-maas"]["maas"]["nodes"][c]["power"] = power
167
168
169     c=c+1
170
171 with open('deployment.yaml', 'w') as opnfvf:
172    yaml.dump(opnfvcfg, opnfvf, default_flow_style=False)
173