Exemplo n.º 1
0
def add_cluster(request):
    if not commons.logged_in(request):
        return HttpResponseRedirect('/')
    if request.method == 'POST':
        if len(Cluster.objects.filter(name=request.POST['name'])) == 0:
            cluster = Cluster.objects.create(name=request.POST['name'], master=None)
    return HttpResponseRedirect('/')
Exemplo n.º 2
0
def logout(request):
    if commons.logged_in(request):
        try:
            del request.session['access']
        except KeyError:
            pass
    return HttpResponseRedirect('/')
Exemplo n.º 3
0
def logout(request):
    if commons.logged_in(request):
        try:
            del request.session['access']
        except KeyError:
            pass
    return HttpResponseRedirect('/')
Exemplo n.º 4
0
def add_server(request, curr_cluster):
    if not commons.logged_in(request):
        return HttpResponseRedirect('/')

    if 'name' in request.POST and 'flavor' in request.POST and 'image' in request.POST:
        name = request.POST['name']

        server = Server(name=name, server_id='', ip='', cluster_in=Cluster.objects.get(name=curr_cluster))
        try:
            server.full_clean()
            data = launch(request)
            server.server_id = data['server']['id']
            server.save()
        except ValidationError:
            pass

    if request.method == 'POST':
        return HttpResponseRedirect('/cluster/'+curr_cluster+'/')
    flavors = get_flavors(request)
    images = get_images(request)

    t = loader.get_template('launch.html')
    c = { 
        'curr_cluster': curr_cluster,
        'flavors': flavors,
        'images': images,
    }   
    c.update(csrf(request))
    c = Context(c)
    return HttpResponse(t.render(c))
Exemplo n.º 5
0
def login(request):
    if commons.logged_in(request):
        return HttpResponseRedirect('/cluster/')
    if 'username' in request.POST and 'password' in request.POST:
        (username, password) = (request.POST['username'],
                                request.POST['password'])
        header = {'Content-type': 'application/json'}
        body = {
            'auth': {
                'passwordCredentials': {
                    'username': username,
                    'password': password
                },
                'tenantName': username
            }
        }
        conn = httplib.HTTPConnection(NOVA_CONTROLLER, 35357)
        conn.request('POST', '/v2.0/tokens', json.dumps(body), header)
        response = conn.getresponse()
        # TODO: Error Handling
        data = json.loads(response.read())
        conn.close()
        request.session['access'] = data['access']
        return HttpResponseRedirect('/cluster/')
    else:
        t = loader.get_template('login.html')
        c = {}
        c.update(csrf(request))
        c = Context(c)
        return HttpResponse(t.render(c))
Exemplo n.º 6
0
def get_server(request, server_id):
    if not commons.logged_in(request):
        return {}

    header = {'X-Auth-Token': request.session['access']['token']['id']}
    body = {}

    data = nova_api(request, 'GET', '/v2/%(tenant_id)s/servers/'+server_id, header, body)

    return data['server']
Exemplo n.º 7
0
def get_images(request):
    if not commons.logged_in(request):
        return {}

    header = {'X-Auth-Token': request.session['access']['token']['id']}
    body = {}

    data = nova_api(request, 'GET', '/v2/%(tenant_id)s/images/detail', header, body)

    return data['images']
Exemplo n.º 8
0
def get_console_log(request, server_id):
    if not commons.logged_in(request):
        return {}

    header = {'Content-type': 'application/json',
              'X-Auth-Token': request.session['access']['token']['id']}
    body = {'os-getConsoleOutput': {}}

    data = nova_api(request, 'POST', '/v2/%(tenant_id)s/servers/'+server_id+'/action', header, body)

    if 'output' not in data:
        return ''
    return data['output']
Exemplo n.º 9
0
def delete_cluster(request, cluster):
    if not commons.logged_in(request):
        return HttpResponseRedirect('/')
    curr_cluster = Cluster.objects.get(name=cluster)
    server_set = []
    for server in Server.objects.filter(cluster=curr_cluster):
        server_set.append(server.name)
    servers = get_servers(request)
    for server in servers:
        if server['name'] in server_set:
            delete_server(request, curr_cluster, server['name'], server['id'])
    curr_cluster.delete()
    return HttpResponseRedirect('/')
Exemplo n.º 10
0
def servers(request, curr_cluster):
    if not commons.logged_in(request):
        return HttpResponseRedirect('/')

    servers = get_servers(request)
    flavors = get_flavors(request)
    images = get_images(request)

    servers_dict = {}
    for server in servers:
        servers_dict[server['name']] = server
    flavors_dict = {}
    for flavor in flavors:
        flavors_dict[flavor['id']] = flavor
    images_dict = {}
    for image in images:
        images_dict[image['id']] = image

    servers = []
    for server in Cluster.objects.get(name=curr_cluster).server_set.all():
        if server.name in servers_dict:
            s = servers_dict[server.name]
            s['flavor'] = flavors_dict[s['flavor']['id']]
            s['image'] = images_dict[s['image']['id']]
            s['is_master'] = server.is_master
            s['is_slave'] = server.is_slave
            if not server.is_ready:
                console_log = get_console_log(request, s['id'])
                if re.search(r'^cloud\-init boot finished', console_log, re.M) != None:
                    server.is_ready = True
                    server.save()
            s['is_ready'] = server.is_ready
        else:
            s = {'name': server.name, 'flavor': {'vcpus': '0', 'ram': '0', 'disk': '0'}, 'status': 'NOT EXIST', 'is_master': False, 'is_slave': False}
        servers.append(s)

    has_master = True if Cluster.objects.get(name=curr_cluster).master != None else False

    t = loader.get_template('servers.html')
    c = {
            'curr_cluster': curr_cluster,
            'has_master': has_master,
            'servers': servers,
            'flavors': flavors,
            'images': images,
        }
    c.update(csrf(request))
    c = Context(c)
    return HttpResponse(t.render(c))
Exemplo n.º 11
0
def launch(request):
    if not commons.logged_in(request):
        return HttpResponseRedirect('/')

    f = open('user_data.txt', 'r')
    user_data = f.read()
    f.close()

    header = {'Content-type': 'application/json',
              'X-Auth-Token': request.session['access']['token']['id']}
    body = {'server': {'name': request.POST['name'],
                       'flavorRef': request.POST['flavor'],
                       'imageRef': request.POST['image'],
                       'user_data': base64.b64encode(user_data)
                      }}

    return nova_api(request, 'POST', '/v2/%(tenant_id)s/servers', header, body)
Exemplo n.º 12
0
def cluster(request, curr_cluster):
    if not commons.logged_in(request):
        return HttpResponseRedirect('/')
    if Cluster.objects.filter(name=curr_cluster).count() == 0:
        clusters = Cluster.objects.all()
        for cluster in clusters:
            return HttpResponseRedirect('/cluster/' + cluster.name + '/')
        if curr_cluster != "":
            return HttpResponseRedirect('/cluster/')
    cluster_form = ClusterForm()
    clusters = Cluster.objects.filter()
    t = loader.get_template('cluster.html')
    c = {
        'cluster_form': cluster_form,
        'clusters': clusters,
        'curr_cluster': curr_cluster,
    }
    c.update(csrf(request))
    c = Context(c)
    return HttpResponse(t.render(c))
Exemplo n.º 13
0
def cluster(request, curr_cluster):
    if not commons.logged_in(request):
        return HttpResponseRedirect('/')
    if Cluster.objects.filter(name=curr_cluster).count() == 0:
        clusters = Cluster.objects.all()
        for cluster in clusters:
            return HttpResponseRedirect('/cluster/'+cluster.name+'/')
        if curr_cluster != "":
            return HttpResponseRedirect('/cluster/')
    cluster_form = ClusterForm()
    clusters = Cluster.objects.filter()
    t = loader.get_template('cluster.html')
    c = {
        'cluster_form': cluster_form,
        'clusters': clusters,
        'curr_cluster': curr_cluster,
    }
    c.update(csrf(request))
    c = Context(c)
    return HttpResponse(t.render(c))
Exemplo n.º 14
0
def install(request, curr_cluster, server_name, role):
    if not commons.logged_in(request):
        return HttpResponseRedirect('/cluster/'+curr_cluster+'/')
    server = Server.objects.get(name=server_name)
    if server.ip == '':
        server_data = get_server(request, server.server_id)
        for ip in server_data['addresses']['private']:
            if ip['version'] == 4:
                server.ip = ip['addr']
                server.save()
                os.system('echo '+server.ip+' '+server.name+'.novalocal >> /etc/hosts')
                break
    api = get_chef_api()
    node = chef.Node(server_name+".novalocal", api)
    if "role["+role+"]" not in node.run_list:
        if role == 'vm-master':
            if server.cluster_in.master != None: 
                return HttpResponseRedirect('/cluster/'+curr_cluster+'/')
            server.cluster_in.master = server
            server.cluster_in.save()
            update_databag(server, '1')
            if 'role[vm-slave]' in node.run_list:
                node.run_list.remove("role[vm-slave]")
            node.run_list.append("role[vm-master]")
            server.is_master = True
            server.is_slave = False
            node.save()
            server.save()
            trigger_chef_client(server_name)
        elif role == 'vm-slave':
            update_databag(server, '0')
            if 'role[vm-master]' in node.run_list:
                node.run_list.remove("role[vm-master]")
            node.run_list.append("role[vm-slave]")
            server.is_master = False
            server.is_slave = True
            node.save()
            server.save()
            trigger_chef_client(server_name)
            trigger_chef_client(server.cluster_in.master.name)
    return HttpResponseRedirect('/cluster/'+curr_cluster+'/')
Exemplo n.º 15
0
def nova_api(request, method, uri, header, body, debug=False):
    if not commons.logged_in(request):
        return {}

    conn = httplib.HTTPConnection(NOVA_CONTROLLER, 8774)
    conn.request(method,
                 uri % {'tenant_id': request.session['access']['token']['tenant']['id']},
                 json.dumps(body), header)
    response = conn.getresponse()
    if debug:
        res = response.read()
        print res
        return res
    # TODO: Error Handling
    data = {}
    try:
        data = json.loads(response.read())
    except Exception:
        data = {}
    conn.close()
    return data
Exemplo n.º 16
0
def delete_server(request, curr_cluster, server_name, server_id):
    if not commons.logged_in(request):
        return HttpResponseRedirect('/')

    server = Server.objects.get(name=server_name, cluster_in=Cluster.objects.get(name=curr_cluster))
    try:
        delete_databag(server)
    except Exception:
        pass
    try:
        delete_chef_client(server_name)
    except Exception:
        pass
    server.delete()

    if server_id != None: 
        header = {'X-Auth-Token': request.session['access']['token']['id']}
        body = {}

        nova_api(request, 'DELETE', '/v2/%(tenant_id)s/servers/'+server_id, header, body)

    return HttpResponseRedirect('/cluster/')
Exemplo n.º 17
0
def login(request):
    if commons.logged_in(request):
        return HttpResponseRedirect('/cluster/')
    if 'username' in request.POST and 'password' in request.POST:
        (username, password) = (request.POST['username'], request.POST['password'])
        header = {'Content-type': 'application/json'}
        body = {'auth': {'passwordCredentials': {'username': username, 'password': password},
                         'tenantName': username}}
        conn = httplib.HTTPConnection(NOVA_CONTROLLER, 35357)
        conn.request('POST', '/v2.0/tokens', json.dumps(body), header)
        response = conn.getresponse()
        # TODO: Error Handling
        data = json.loads(response.read())
        conn.close()
        request.session['access'] = data['access']
        return HttpResponseRedirect('/cluster/')
    else:
        t = loader.get_template('login.html')
        c = {}
        c.update(csrf(request))
        c = Context(c)
        return HttpResponse(t.render(c))