def _create_instance(image_id, mem, port, ip, update_lb=False): global current_port if ip != "localhost": url = 'http://' + ip + ':5001' + '/run' form_data = {'image_id' : image_id, 'network' : image_id, 'mem' : str(mem), 'port' : port} params = urllib.urlencode(form_data) response = urllib2.urlopen(url, params) result = json.load(response) main_lb_ip = docker.get_ip_by_name(main_lb_image_label) created = True lb_port = result['lb_port'] container_id = result['container_id'] update_main_load_balancer(image_id, ip, str(lb_port)) else: container_id = docker.run('--network', image_id, '-m', str(mem) + 'M', '--device=/dev/isgx','-d', '--cpus=0.5', '-v', image_id + ':' + docker.default_volume_path, image_id) #if there are instances with this image, remove the current load balancer, reverse one port number in the load balancer port counter and the recreate the load balancer. instances = docker.get_instance_names_by_id(haproxy_prefix + image_id) if instances: load_balancer_instance = docker.get_instance_names_by_id(haproxy_prefix + image_id)[0] load_balancer_ip = docker.get_ip_by_name(load_balancer_instance) _remove_current_load_balancer(load_balancer_instance, image_id) current_port -= 1 lb_port = _add_load_balancer(image_id, port, ip=load_balancer_ip) else: lb_port = _add_load_balancer(image_id, port) update_main_load_balancer(image_id, "127.0.0.1", str(lb_port)) return {container_id: ip}
def remove_instance_from_cluster(image_id): global server_pointer ip = available_nodes[server_pointer].get_ip() #if the choosen node is not local, send a request to the chosen node to remove an instance with the image_id if ip != "localhost": url = 'http://' + ip + ':5001' + '/remove' form_data = {'image_id' : image_id} params = urllib.urlencode(form_data) response = urllib2.urlopen(url, params) result = json.load(response) #update the main load balancer to remove the container from the chosen instance main_lb_ip = docker.get_ip_by_name(main_lb_image_label) removed = True lb_port = result['lb_port'] container_id = result['container_id'] update_main_load_balancer(image_id, ip, str(lb_port)) else: #if the chosen node is the local node, remove an instance with with the image_id straight from docker removables = docker.get_instance_ids_by_id(image_id) removed = docker.rm('-f', removables[-1]) #update main load balancer to remove the container from the chosen instance lb_port = _add_load_balancer(image_id, port) update_main_load_balancer(image_id, "127.0.0.1", str(lb_port)) #update the server pointer to the previous server. If it goes down to zero, set it to the last one on the list. _remove_container_from_record(image_id, container_id) server_pointer -= 1 if server_pointer == 0: server_pointer = len(available_nodes) - 1
def add_cluster_frontend_to_main_load_balancer(cluster_port, image_id): main_lb_ip = docker.get_ip_by_name(main_lb_image_label) url = 'http://' + main_lb_ip + ':5000/create' lb_update_data = ({'cluster_port' : cluster_port, 'image_id' : image_id}) lb_update_data = json.dumps(lb_update_data) print "[DEBUG] main load balancer url is: " + url req = urllib2.Request(url, lb_update_data, {'Content-Type': 'application/json'}) response = urllib2.urlopen(req) str_response = response.read() print str_response
def update_main_load_balancer(image_id, node_ip, lb_port): main_lb_ip = docker.get_ip_by_name(main_lb_image_label) url = 'http://' + main_lb_ip + ':5000/update' print "[DEBUG] url is: " + url lb_update_data = ({'image_id' : image_id, 'node_ip' : node_ip, 'lb_port': str(lb_port)}) lb_update_data = json.dumps(lb_update_data) req = urllib2.Request(url, lb_update_data, {'Content-Type': 'application/json'}) response = urllib2.urlopen(req) str_response = response.read() print "[LOG] update is " + str_response response.close()
def create_instance_single_client_cluster(id, client_id): meta_string = "" with open(service_dispatcher_dockerfile_dir + id + "/meta.json") as file: meta_string = file.read() params = json.loads(meta_string) mem = params['mem'] volume_size = params['volume_size'] volume_name = id + client_id dockerfile_dir = definition.ROOT_PATH + '/dockerfiles/' + id docker.build("-t", id, dockerfile_dir) volume_created = _create_volume(volume_name, volume_size) name = (docker.run_get_name('-m', str(mem) + 'M', '-d', '-v', volume_name + ':' + docker.default_volume_path, id)).rstrip() container_ip = docker.get_ip_by_name(name) return container_ip, 201
def update_load_balancer(container_params): image_id = container_params['image_id'] load_balancer_instance = docker.get_instance_names_by_id(haproxy_prefix + image_id)[0] load_balancer_ip = docker.get_ip_by_name(load_balancer_instance) _remove_current_load_balancer(load_balancer_instance, image_id) load_balancer_unavailable = True lb_port = _add_load_balancer(container_params, ip=load_balancer_ip) while load_balancer_unavailable: load_balancer_list = docker.get_instance_names_by_id(haproxy_prefix + image_id) if load_balancer_list: load_balancer_instance = load_balancer_list[0] load_balancer_unavailable = False else: lb_port = _add_load_balancer(container_params) container_ips = docker.get_ip_list_by_id(container_params['image_id']) return lb_port