simplifying stuff by removing the journal

This commit is contained in:
deflax 2016-03-30 05:50:03 +03:00
parent f8d7b32d0f
commit db5225b11d
7 changed files with 32 additions and 98 deletions

View file

@ -33,7 +33,7 @@ def validate(vmname, srvpass):
""" return vmid or false if credentials match something in clientdb. useful for authing extrnal admin panels """ """ return vmid or false if credentials match something in clientdb. useful for authing extrnal admin panels """
try: try:
clientsdb = readclientsdb() clientsdb = readclientsdb()
path = utils.find_key(clientsdb, vmname) path = utils.get_path(clientsdb, vmname)
c_id = str(path[0]) c_id = str(path[0])
v_id = str(path[1]) v_id = str(path[1])
#check the returned path with forward query #check the returned path with forward query
@ -63,7 +63,7 @@ def validate(vmname, srvpass):
response = { 'vpsid':v_id, 'ticket':generated_ticket } response = { 'vpsid':v_id, 'ticket':generated_ticket }
return response return response
else: else:
ioconfig.logger.warning('clients> {} (clientid: {}, vmid: {}) ACCESS DENIED!'.format(query, c_id, v_id) ioconfig.logger.warning('clients> {} (clientid: {}, vmid: {}) ACCESS DENIED!'.format(query, c_id, v_id))
#cant compare password #cant compare password
return None return None
return None return None
@ -78,7 +78,7 @@ def setencpasswd(vmname, newpass):
try: try:
clientsdb = readclientsdb() clientsdb = readclientsdb()
#print(clientsdb) #print(clientsdb)
path = utils.find_key(clientsdb, vmname) path = utils.get_path(clientsdb, vmname)
#print(path) #print(path)
c_id = str(path[0]) c_id = str(path[0])
v_id = str(path[1]) v_id = str(path[1])
@ -100,7 +100,7 @@ def vmowner(vmid, vmname, verbose):
""" find the owner of the vm """ """ find the owner of the vm """
clientsdb = readclientsdb() clientsdb = readclientsdb()
try: try:
clientid = utils.get_rec(clientsdb, str(vmid))[0]['ownerid'] clientid = utils.find_rec(clientsdb, str(vmid))[0]['ownerid']
clientname = clientsdb[str(clientid)]['name'] clientname = clientsdb[str(clientid)]['name']
except: except:
raise raise

View file

@ -16,13 +16,13 @@ ipv4_min = 192.168.0.4
ipv4_max = 192.168.0.254 ipv4_max = 192.168.0.254
[slave_0] [slave_0]
name = CHANGEME name = host.0CHANGEME
masterip = 192.168.0.2 masterip = 192.168.0.2
password = CHANGEME password = CHANGEME
regionid = 0 regionid = 0
[slave_1] [slave_1]
name = CHANGEME name = host1.CHANGEME
masterip = 192.168.0.3 masterip = 192.168.0.3
password = CHANGEME password = CHANGEME
regionid = 0 regionid = 0

32
grid.py
View file

@ -15,7 +15,6 @@ import utils
import plugin import plugin
import ioconfig import ioconfig
import clientsdb import clientsdb
import journaldb
logger = ioconfig.logger logger = ioconfig.logger
config = ioconfig.parser config = ioconfig.parser
@ -218,7 +217,7 @@ def generate_ipv4(region_id, how_many=1):
ip_max = len(region_ips) - 1 ip_max = len(region_ips) - 1
tested_ips = [] #initialize ip cache tested_ips = [] #initialize ip cache
requested_ips = [] requested_ips = []
all_ips = utils.get_rec(grid_data, 'ipaddr') all_ips = utils.find_rec(grid_data, 'ipaddr')
for ips in range(int(how_many)): for ips in range(int(how_many)):
counter = 0 counter = 0
@ -262,7 +261,7 @@ def generate_vmid():
tested_vmids = [] #initialize id cache tested_vmids = [] #initialize id cache
id_min = grid_data['vmid_min'] id_min = grid_data['vmid_min']
id_max = grid_data['vmid_max'] id_max = grid_data['vmid_max']
all_vmid = utils.get_rec(grid_data, 'vmid') #get all vmid values from the nested grid all_vmid = utils.find_rec(grid_data, 'vmid') #get all vmid values from the nested grid
all_vmid = [ int(x) for x in all_vmid ] #convert values from str to int (its a vmid right?) all_vmid = [ int(x) for x in all_vmid ] #convert values from str to int (its a vmid right?)
counter = 0 counter = 0
while True: while True:
@ -318,27 +317,33 @@ def query_vm(req_vmid):
sync(False) sync(False)
grid_data = readreal() grid_data = readreal()
#compare requested vmid to all vmid's from the grid #search for the requested vmid
#TODO: maybe we should also check the owner somehow #TODO: maybe we should also check if the owner has permissions to manage it,
all_vmid = utils.get_rec(grid_data, 'vmid') ###### if for some reason the admin panel is compromised.
all_vmid = utils.find_rec(grid_data, 'vmid')
target = int(0) target = int(0)
for running_vmid in all_vmid: for running_vmid in all_vmid:
if str(req_vmid) == str(running_vmid): if str(req_vmid) == str(running_vmid):
target = req_vmid #=runn? target = running_vmid
break break
else: else:
continue continue
if target == 0: if target == 0:
logger.error('grid> vmid {} cannot be found.' + str(req_vmid)) logger.error('grid> vmid {} cannot be found!' + str(req_vmid))
return "-1" return int(-1), "None"
path = utils.get_path(grid_data, target)
region_id = path[0]
slave_id = path[1]
region_id, slave_id = journaldb.getjnode(target)
try: try:
vm_type = grid_data[str(region_id)][str(slave_id)][str(target)]['type'] vm_type = grid_data[str(region_id)][str(slave_id)][str(target)]['type']
except: except:
logger.error('{}> type is unknown!'.format(vm_id))
raise raise
#we should know them by now. logger.info('{}> region={}, slave={}, type={} found.'.format(target, region_id, slave_id, vm_type))
return slave_id, vm_type return slave_id, vm_type
@ -386,11 +391,12 @@ def readreal():
if __name__ == '__main__': if __name__ == '__main__':
print(sync()) #print(sync())
#print(query_region('Plovdiv, Bulgaria')) #print(query_region('Plovdiv, Bulgaria'))
#print(query_happiness(0)) #print(query_happiness(0))
#print(generate_ipv4(0,3)) #print(generate_ipv4(0,3))
#print(generate_vmid()) #print(generate_vmid())
#print(query_slave_data(0)) #print(query_slave_data(0))
#print(query_vm(483039)) print(query_vm(483039))
print(query_vm(147344))

View file

@ -4,8 +4,8 @@
#TODO: scan for all jsons and rewrite them. #TODO: scan for all jsons and rewrite them.
echo " " echo " "
echo "JOURNAL:" echo "GRID:"
cat journal.json | python3 -m json.tool cat grid-real.json | python3 -m json.tool
echo " " echo " "
echo "CLIENTS:" echo "CLIENTS:"
cat clients.json | python3 -m json.tool cat clients.json | python3 -m json.tool

View file

@ -1,70 +0,0 @@
# -*- coding: utf-8
#
# manage journaldb.json which is a table of vmid's as indexes update on vmcreate and
# values of region_id and slave_id. should support deletion of unused id's and be
# properly updated on vm migrations
#site
import json
#local
import ioconfig
import utils
def createjnode(vmid, regionid, slaveid, vmpasswd):
""" create new record into the journal. invoked on vm creation """
journaldb = readjournal()
if str(vmid) in journaldb:
ioconfig.logger.warning('journal> overwriting id[{}] !'.format(vmid))
else:
jnode = { str(vmid):{} }
journaldb.update(jnode)
ioconfig.logger.info ('journal> write: r[{}]s[{}]id[{}] => {}'.format(regionid, slaveid, vmid, vmpasswd))
jdata = { 'vmid':str(vmid), 'slaveid':str(slaveid), 'regionid':str(regionid), 'passwd':str(vmpasswd) }
journaldb[str(vmid)] = jdata
writedb(journaldb)
def getjnode(vmid):
""" query the database for records with requested vmid. invoked on user commands """
journaldb = readjournal()
try:
regionid = journaldb[str(vmid)]['regionid']
slaveid = journaldb[str(vmid)]['slaveid']
ioconfig.logger.info('journal> read: id[{}] => r[{}]s[{}]'.format(vmid, regionid, slaveid))
except:
ioconfig.logger.error('journal> invalid id[{}] !'.format(vmid))
else:
return regionid, slaveid
def getpass(vmid):
""" query the database for the recorded vmid password. """
journaldb = readjournal()
try:
vmpasswd = journaldb[str(vmid)]['passwd']
ioconfig.logger.info('journal> read: id[{}] => {}'.format(vmid, vmpasswd))
except:
ioconfig.logger.error('journal> invalid id[{}] !'.format(vmid))
else:
return vmpasswd
def readjournal():
""" read journal """
try:
with open('journal.json') as dbr:
journaldb = json.load(dbr)
dbr.close()
except:
journaldb = {}
ioconfig.logger.warning('journal> initializing...')
return journaldb
def writedb(journaldb):
""" write journal """
with open('journal.json', 'w') as dbw:
json.dump(journaldb, dbw)
dbw.close()

View file

@ -13,7 +13,6 @@ import socket
#local #local
import grid import grid
import clientsdb import clientsdb
import journaldb
import utils import utils
import ioconfig import ioconfig
import novnc import novnc
@ -116,12 +115,11 @@ def vmcreate(req):
onboot=1, onboot=1,
description=description) description=description)
#populate the client db and vm journal #populate the client db
client_id = req['clientid'] client_id = req['clientid']
client_name = req['clientname'] client_name = req['clientname']
srv_pass = req['password'] srv_pass = req['password']
clientsdb.addclient(vm_id, vm_name, client_id, client_name, srv_pass) clientsdb.addclient(vm_id, vm_name, client_id, client_name, srv_pass)
journaldb.createjnode(vm_id, region_id, slave_id)
#start the machihe #start the machihe
time.sleep(7) #wait few seconds for the slave to prepare the machine for initial run time.sleep(7) #wait few seconds for the slave to prepare the machine for initial run

View file

@ -24,7 +24,7 @@ def dict_merge(target, *args):
target[k] = deepcopy(v) target[k] = deepcopy(v)
return target return target
def get_rec(search_dict, field): def find_rec(search_dict, field):
""" """
Takes a dict with nested lists and dicts, Takes a dict with nested lists and dicts,
and searches all dicts for a key of the field and searches all dicts for a key of the field
@ -37,7 +37,7 @@ def get_rec(search_dict, field):
fields_found.append(value) fields_found.append(value)
elif isinstance(value, dict): elif isinstance(value, dict):
results = get_rec(value, field) results = find_rec(value, field)
for result in results: for result in results:
fields_found.append(result) fields_found.append(result)
@ -51,11 +51,11 @@ def get_rec(search_dict, field):
return fields_found return fields_found
def find_key(search_dict, key): def get_path(search_dict, key):
""" takes a nested dict and returns the path for the searched value """ """ takes a nested dict and returns the path for the searched value """
for k,v in search_dict.items(): for k,v in search_dict.items():
if isinstance(v,dict): if isinstance(v,dict):
p = find_key(v,key) p = get_path(v,key)
if p: if p:
return [k] + p return [k] + p
elif v == key: elif v == key: