diff --git a/src/master/vclustermgr.py b/src/master/vclustermgr.py index caef4ad..63fed07 100755 --- a/src/master/vclustermgr.py +++ b/src/master/vclustermgr.py @@ -728,6 +728,59 @@ class VclusterMgr(object): full_clusters.append(single_cluster)''' return [True, clusters] + def migrate_container(self, clustername, username, containername, new_host, proxy_public_ip, user_info): + [status, info] = self.get_clusterinfo(clustername, username) + if not status: + return [False, "cluster not found"] + if info['status'] != 'stopped': + return [False, 'cluster is not stopped'] + + con_db = Container.query.get(containername) + if con_db is None: + return [False, 'Container not found'] + if host == new_host: + return [False, 'Container has been on the new host'] + + oldworker = self.nodemgr.ip_to_rpc(con_db.host) + if oldworker is None: + return [False, "Old host worker can't be found or has been stopped."] + oldworker.stop_container(containername) + imagename = "migrate-" + containername + "-" + datetime.datetime.now().strftime("%Y-%m-%d") + status,msg = oldworker.create_image(username,imagename,containername,"",10000) + if not status: + return [False, msg] + #con_db.lastsave = datetime.datetime.now() + #con_db.image = imagename + + '''self.networkmgr.load_usrgw(username) + proxy_server_ip = self.networkmgr.usrgws[username] + [status, proxy_public_ip] = self.etcd.getkey("machines/publicIP/"+proxy_server_ip) + if not status: + logger.error("Fail to get proxy_public_ip %s."%(proxy_server_ip)) + return [False, "Fail to get proxy server public IP."]''' + uid = json.loads(user_info)["data"]["id"] + setting = { + 'cpu': con_db.setting_cpu, + 'memory': con_db.setting_mem, + 'disk': con_db.setting_disk + } + _, clusterid, cid = containername.split('-') + hostname = "host-"+str(cid) + gateway = self.networkmgr.get_usergw(username) + image = {'name':imagename,'type':'private','owner':username } + + worker = self.nodemgr.ip_to_rpc(new_host) + if worker is None: + self.imagemgr.removeImage(username,imagename) + return [False, "New host worker can't be found or has been stopped."] + status,msg = worker.create_container(containername, proxy_public_ip, username, uid, json.dumps(setting), + clustername, str(clusterid), str(cid), hostname, con_db.ip, gateway, json.dumps(image)) + if not status: + return [False, msg] + oldworker.delete_container(containername) + self.imagemgr.removeImage(username,imagename) + return [True,""] + def is_cluster(self, clustername, username): [status, clusters] = self.list_clusters(username) if clustername in clusters: