Repository navigation
Expand file tree
/
Copy pathcloud_wrapper.py
More file actions
255 lines (198 loc) · 10.8 KB
/
Copy pathcloud_wrapper.py
File metadata and controls
255 lines (198 loc) · 10.8 KB
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
import os, sys, time, atexit, re
'''
app_path = os.path.dirname(__file__)
sys.path.append(app_path)
if app_path:
os.chdir(app_path)
else:
app_path = os.getcwd()
'''
from factories import cloudFactory
import config
class xass_wrapper:
def __init__(self):
self.user = {}
self.server={}
#signal.signal(signal.SIGINT, self.signal_handler())
#atexit.register(self.cleanup)
self.adaptor = cloudFactory.cloudFactory.factory("openstackRest", {\
"username" : config.username,\
"password": config.password, \
"tenant": config.tenant, \
"controller": config.controller})
self.Default_Image_User = config.Default_Image_User
self.Default_Image_Pass = config.Default_Image_Pass
self.Default_Linux_Image = config.Default_Linux_Image
self.Default_Windows_Image = config.Default_Windows_Image
self.VPC_external_network = config.VPC_external_network
self.VPC_flavor_name = config.VPC_flavor_name
self.VPC_sec_group = config.VPC_sec_group
self.VPC_int_net_From = config.VPC_internal_network_From
self.VPC_int_net_To = config.VPC_internal_network_To
self.VPC_int_net_Range = config.VPC_internal_network_Range
#self.VPC_int_3rd_oct_crnt = int(re.split('(.*)\.(.*)\.(.*)\.(.*)', self.VPC_int_net_From)[3:4].pop())
self.VPS_project_name = config.VPS_project_name
self.VPS_project_user = config.VPS_project_user
self.VPS_project_pass = config.VPS_project_pass
self.VPS_ValidIP_3oct = config.VPS_ValidIP_3oct #RETURN VALUES SHOULD BE CAPTURED HERE OR PASSED TO THE FUNCTIONS(As a temporary solution)
self.VPS_external_network = config.VPS_external_network
self.VPS_internal_network = config.VPS_internal_network
self.VPS_sec_group = config.VPS_sec_group
print self._get_internal_net_add()
def create_user(self,user_dict,server_dict):
'''
This method creates a Project and a user on Xamin Cloud.
@type user_dict: Dict
@param user_dict: It has three keys which contains user info.
The keys are 'name': user name; 'pass': The user password for entering to Xamin IAAS; 'project': The name of Project which has been assigned to the user
@rtype: Boolean
@return: False if there is any problem in adding user or project, otherwise True will be returned.
'''
print "Creating Project....."
if "demo" in user_dict['project'] :
prj_desc="This is a %s project for user %s " %("Demo",user_dict['name'])
#ram=512;cpu=1;instance_num=1
ram=2048;cpu=1;instance_num=1
else:
prj_desc="This is a %s project for user %s " %("Paid",user_dict['name'])
ram=10240;cpu=100;instance_num=40
user_dict['project'] = user_dict['project']+ time.strftime("%Y%m%d_%H%M%S", time.gmtime()) #+'_VPC'
self.user = user_dict
if not self._add_project(user_dict['project'], prj_desc, ram, cpu, instance_num) :
return False
print "Creating user...."
if not self._add_user(user_dict) :
self.adaptor.remove_tenant(user_dict['project'])
return False
if "demo" in user_dict['project'] :
newpid = os.fork()
if newpid == 0: # Child
print 'Time for Deletion is %s ' % config.demo_user_time
time.sleep(config.demo_user_time)
print; print "Im Removing Demo User & Project....................."
self.cleanup(user_dict,server_dict)
os._exit(0)
return True
def create_VPC(self, user_dict, image):
print "CREATING Network FOR VPC....."
#self.adaptor.add_network(user_dict['name'], user_dict['pass'], user_dict['project'] ,False ,'xaas_int4','xaas_subnet')
print "Creating VPC.........."
if "linux" in image :
image = self.Default_Linux_Image
else:
image = self.Default_Windows_Image
network_address = self._get_internal_net_add()
int_net = 'xaas_vpc_int_'+ time.strftime("%Y%m%d_%H%M%S", time.gmtime())
int_subnet = 'xaas_vpc_subnet_'+ time.strftime("%Y%m%d_%H%M%S", time.gmtime())
router = 'xaas_vpc_router_'+time.strftime("%Y%m%d_%H%M%S", time.gmtime())
server_name = 'Demo'
server={'net':int_net, 'subnet':int_subnet, 'router': router, 'server': server_name}
if not self.create_user(user_dict,server):
return False
print "Creating Network for VPC....."
if not self.adaptor.add_network(user_dict['name'], user_dict['pass'], user_dict['project'], False, int_net, int_subnet, network_address):
print "Error in Adding Network"
self.cleanup(user_dict,server)
return False
print "Creating Router FOR VPC....."
if not self.adaptor.add_router(user_dict['name'], user_dict['pass'], user_dict['project'], router, self.VPC_external_network, int_subnet):
print "Cant add router...."
self.cleanup(user_dict,server)
return False
print "Creating a demo VPS on VPC .........."
print "flavor in config file is: ", self.VPC_flavor_name
ip = self.adaptor.install_server(user_dict['name'], user_dict['pass'], user_dict['project'] , server_name, self.VPC_external_network, int_net, self.Default_Image_User, self.Default_Image_Pass, self.VPC_sec_group, image, self.VPC_flavor_name)
if not ip :
print "Cant create instance.."
self.cleanup(user_dict,server)
return False
else:
print "Valid_ip in cloud wrapper is: ", ip
return True
def create_VPS(self, image, ram, vcpus, disk):
if "linux" in image :
image = self.Default_Linux_Image
else:
image = self.Default_Windows_Image
flavor = "xaas_flavor_"+time.strftime("%Y%m%d_%H%M%S", time.gmtime())
if not self.adaptor.add_flavor(self.VPS_project_user, self.VPS_project_pass, self.VPS_project_name, flavor, ram, vcpus, disk):
return False
print "Creating a demo VPS .........."
server = "VPS_"+time.strftime("%Y%m%d_%H%M%S", time.gmtime())
ip = self.adaptor.install_server(self.VPS_project_user, self.VPS_project_pass, self.VPS_project_name , server, self.VPS_external_network, self.VPS_internal_network, self.Default_Image_User, self.Default_Image_Pass, self.VPS_sec_group , image, flavor)
if not ip :
print "Cant create instance.."
self.adaptor.remove_flavor(self.VPS_project_user, self.VPS_project_pass, self.VPS_project_name, flavor)
return False
print "I am removing flavor..............."
self.adaptor.remove_flavor(self.VPS_project_user, self.VPS_project_pass, self.VPS_project_name, flavor)
return ip
#*************************************PRIVATE FUNCTIONS**************************
def _add_user(self, user_dict):
if not self.adaptor.add_user(user_dict['name'], user_dict['pass'], user_dict['project']) :
print "Error Accured in Adding User ....... "
return False
return True
def _add_project(self, project_name, description, ram, vcpu, instances):
out = self.adaptor.add_tenant(project_name, description, ram, vcpu, instances)
if not out :
print "Error Accured in Adding Project ....... "
return False
return True
def _get_internal_net_add(self):
#file = open("/root/asemani/new_xaas_2/apps/xCloudAgent/test.ini", "r")
file = open("test.ini", "r")
print os.getcwd()
self.VPC_int_3rd_oct_crnt = file.read()
file.close()
print "first line in function: _3rd_crnt is: ", self.VPC_int_3rd_oct_crnt
octets = re.split('(.*)\.(.*)\.(.*)\.(.*)', self.VPC_int_net_From)
first_octet = octets[1:2].pop()
second_octet = octets[2:3].pop()
third_octet = octets[3:4].pop()
print "third_octet is ",third_octet
if int(self.VPC_int_3rd_oct_crnt) < int(third_octet) :
self.VPC_int_3rd_oct_crnt = int(third_octet)
else :
self.VPC_int_3rd_oct_crnt = int(self.VPC_int_3rd_oct_crnt) + 1
if int(self.VPC_int_3rd_oct_crnt) >= int(re.split('(.*)\.(.*)\.(.*)\.(.*)', self.VPC_int_net_To)[3:4].pop()) :
self.VPC_int_3rd_oct_crnt = int(third_octet)
network_address = first_octet + '.' + second_octet + '.' + str(self.VPC_int_3rd_oct_crnt) + '.0/' + self.VPC_int_net_Range
print; print "step2"
file = open("test.ini", "w")
file.write("%s" % self.VPC_int_3rd_oct_crnt)
file.close()
print; print "step3"
file = open("test.ini", "r")
print file.read()
file.close()
return network_address
def cleanup(self,user, server = None):
print "Cleaning Environment...."
if bool(server) :
print "cleaning Server "
print; print; print "Removing Server ********************************************* ", server[ 'server']
if self.adaptor.remove_server(user['name'], user['pass'], user['project'], server[ 'server']):
time.sleep(3.0)
print; print; print "Removing Router ********************************************* ", server['router']
if self.adaptor.remove_router(user['name'], user['pass'], user['project'], server['router'], server['subnet']) :
print; print; print "Removing Network ********************************************* ", server['net']
if not self.adaptor.remove_network(user['name'], user['pass'], user['project'], server['net'], server['subnet']):
return False
else:
return False
'''
if self.adaptor.remove_router(user['name'], user['pass'], user['project'], server['router'], server['subnet']) :
print "Removing Network will be implemented in the next version..."
if not self.adaptor.remove_network(user['name'], user['pass'], user['project'], server['net'], server['subnet']):
return False
else:
return False
'''
if bool(user) :
print; print; print "cleaning user ********************************************* ", user['project'], user['name']
if self.adaptor.remove_tenant(user['project']):
self.adaptor.remove_user(user['name'])
else:
return False
return True