Example #1
0
File: app.py Project: ufcg-lsd/SCO
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}
Example #2
0
File: app.py Project: ufcg-lsd/SCO
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
Example #3
0
File: app.py Project: ufcg-lsd/SCO
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
Example #4
0
File: app.py Project: ufcg-lsd/SCO
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()
Example #5
0
File: app.py Project: ufcg-lsd/SCO
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
Example #6
0
File: app.py Project: ufcg-lsd/SCO
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