diff --git a/agkyra/agkyra/config.py b/agkyra/agkyra/config.py index 55a406da1464073a0619b37d1921702a4cb95088..f51c3c734be8495c12cbed350a913f0f4f288a0a 100644 --- a/agkyra/agkyra/config.py +++ b/agkyra/agkyra/config.py @@ -24,7 +24,8 @@ from kamaki.cli.utils import escape_ctrl_chars CLOUD_PREFIX = config.CLOUD_PREFIX config.HEADER = '# Agkyra configuration file version XXX\n' AGKYRA_DIR = os.environ.get('AGKYRA_DIR', os.path.expanduser('~/.agkyra')) -config.CONFIG_PATH = '%s%sconfig.rc' % (AGKYRA_DIR, os.path.sep) +CONFIG_PATH = '%s%sconfig.rc' % (AGKYRA_DIR, os.path.sep) +config.CONFIG_PATH = CONFIG_PATH # neutralize kamaki CONFIG_ENV for this session config.CONFIG_ENV = '' diff --git a/agkyra/test.py b/agkyra/test.py new file mode 100644 index 0000000000000000000000000000000000000000..fffa33965bc1632bf482ead31c064820ee842fc1 --- /dev/null +++ b/agkyra/test.py @@ -0,0 +1,127 @@ +from agkyra.syncer.setup import SyncerSettings +from agkyra.syncer.localfs_client import LocalfsFileClient +from agkyra.syncer.pithos_client import PithosFileClient +from agkyra.syncer.syncer import FileSyncer +from agkyra.syncer import messaging, utils +import random + +from agkyra.config import AgkyraConfig, CONFIG_PATH + +cnf = AgkyraConfig() +cloud_conf = cnf.get('cloud', 'test') +if cloud_conf is None: + print "Define a 'test' cloud in %s" % CONFIG_PATH + exit() + +AUTHENTICATION_URL = cloud_conf['url'] +TOKEN = cloud_conf['token'] + +ID = "AGKYRATEST" + str(random.random()).split('.')[1] + +LOCAL_ROOT_PATH = "/tmp/" + ID + + +settings = SyncerSettings( + instance=ID, + auth_url=AUTHENTICATION_URL, + auth_token=TOKEN, + container=ID, + local_root_path=LOCAL_ROOT_PATH, + ignore_ssl=True) + +master = PithosFileClient(settings) +slave = LocalfsFileClient(settings) +s = FileSyncer(settings, master, slave) + +pithos = master.endpoint +pithos.create_container(ID) + +f1 = "f1" +content1 = "content1" +r1 = pithos.upload_from_string( + f1, content1) +etag1 = r1['etag'] + + +pithos_cands = master.get_pithos_candidates() +info = pithos_cands[f1] +assert etag1 == info["pithos_etag"] + +db = s.get_db() +state = db.get_state(master.SIGNATURE, f1) +assert state.serial == -1 +assert state.info == {} + +s.probe_file(master.SIGNATURE, f1) +m = s.get_next_message(block=True) +assert isinstance(m, messaging.UpdateMessage) + +state = db.get_state(master.SIGNATURE, f1) +assert state.serial == 0 +assert state.info == info + +deciding = s.list_deciding() +assert deciding == set([f1]) + +state = db.get_state(slave.SIGNATURE, f1) +assert state.serial == -1 +assert state.info == {} + +s.decide_file_sync(f1) +m = s.get_next_message(block=True) +assert isinstance(m, messaging.SyncMessage) + +m = s.get_next_message(block=True) +assert isinstance(m, messaging.AckSyncMessage) +state = db.get_state(slave.SIGNATURE, f1) +assert state.serial == 0 +info = state.info +assert info['localfs_size'] == len(content1) + +local_path = LOCAL_ROOT_PATH + '/' + f1 +assert utils.hash_file(local_path) == utils.hash_string(content1) + +def write_local(): + content2 = "content2" + with open(local_path, "w") as f: + f.write(content2) + + +def write_upstream(): + content3 = "content3" + r3 = pithos.upload_from_string( + f1, content3) + etag3 = r1['etag'] + + +def func(): + write_upstream() + write_local() + assert s.get_next_message() is None + s.initiate_probe() + s.start_decide() + + m = s.get_next_message(block=True) + print m + assert isinstance(m, messaging.UpdateMessage) + assert m.archive == master.SIGNATURE + + m = s.get_next_message(block=True) + print m + assert isinstance(m, messaging.UpdateMessage) + assert m.archive == slave.SIGNATURE + + m = s.get_next_message(block=True) + print m + assert isinstance(m, messaging.SyncMessage) + + m = s.get_next_message(block=True) + print m + assert isinstance(m, messaging.ConflictStashMessage) + + m = s.get_next_message(block=True) + print m + assert isinstance(m, messaging.AckSyncMessage) + + +func()