diff --git a/config/Pipfile b/config/Pipfile index abebd34..0025715 100644 --- a/config/Pipfile +++ b/config/Pipfile @@ -9,6 +9,9 @@ verify_ssl = true docker = "*" pyaml = "*" pyexpect = "*" +grpcio = "*" +grpcio-tools = "*" +kazoo = "*" [requires] python_version = "2.7" diff --git a/config/Pipfile.lock b/config/Pipfile.lock index c2a3ba3..0c47726 100644 --- a/config/Pipfile.lock +++ b/config/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5549056543cc9c4bf548ea8f9eb52bacd4a7ed70c9d19892febe3e8d41389c6c" + "sha256": "f081b35b3a523bd410b159fc2d6f5932b80f743f340cb39673b42921377226ca" }, "pipfile-spec": 6, "requires": { @@ -45,6 +45,100 @@ "index": "pypi", "version": "==4.0.2" }, + "enum34": { + "hashes": [ + "sha256:2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850", + "sha256:644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a", + "sha256:6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79", + "sha256:8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1" + ], + "markers": "python_version < '3.4'", + "version": "==1.1.6" + }, + "futures": { + "hashes": [ + "sha256:49b3f5b064b6e3afc3316421a3f25f66c137ae88f068abbf72830170033c5e16", + "sha256:7e033af76a5e35f58e56da7a91e687706faf4e7bdfb2cbc3f2cca6b9bcda9794" + ], + "markers": "python_version < '3.2'", + "version": "==3.3.0" + }, + "grpcio": { + "hashes": [ + "sha256:1303578092f1f6e4bfbc354c04ac422856c393723d3ffa032fff0f7cb5cfd693", + "sha256:229c6b313cd82bec8f979b059d87f03cc1a48939b543fe170b5a9c5cf6a6bc69", + "sha256:3cd3d99a8b5568d0d186f9520c16121a0f2a4bcad8e2b9884b76fb88a85a7774", + "sha256:41cfb222db358227521f9638a6fbc397f310042a4db5539a19dea01547c621cd", + "sha256:43330501660f636fd6547d1e196e395cd1e2c2ae57d62219d6184a668ffebda0", + "sha256:45d7a2bd8b4f25a013296683f4140d636cdbb507d94a382ea5029a21e76b1648", + "sha256:47dc935658a13b25108823dabd010194ddea9610357c5c1ef1ad7b3f5157ebee", + "sha256:480aa7e2b56238badce0b9413a96d5b4c90c3bfbd79eba5a0501e92328d9669e", + "sha256:4a0934c8b0f97e1d8c18e76c45afc0d02d33ab03125258179f2ac6c7a13f3626", + "sha256:5624dab19e950f99e560400c59d87b685809e4cfcb2c724103f1ab14c06071f7", + "sha256:60515b1405bb3dadc55e6ca99429072dad3e736afcf5048db5452df5572231ff", + "sha256:610f97ebae742a57d336a69b09a9c7d7de1f62aa54aaa8adc635b38f55ba4382", + "sha256:64ea189b2b0859d1f7b411a09185028744d494ef09029630200cc892e366f169", + "sha256:686090c6c1e09e4f49585b8508d0a31d58bc3895e4049ea55b197d1381e9f70f", + "sha256:7745c365195bb0605e3d47b480a2a4d1baa8a41a5fd0a20de5fa48900e2c886a", + "sha256:79491e0d2b77a1c438116bf9e5f9e2e04e78b78524615e2ce453eff62db59a09", + "sha256:825177dd4c601c487836b7d6b4ba268db59787157911c623ba59a7c03c8d3adc", + "sha256:8a060e1f72fb94eee8a035ed29f1201ce903ad14cbe27bda56b4a22a8abda045", + "sha256:90168cc6353e2766e47b650c963f21cfff294654b10b3a14c67e26a4e3683634", + "sha256:94b7742734bceeff6d8db5edb31ac844cb68fc7f13617eca859ff1b78bb20ba1", + "sha256:962aebf2dd01bbb2cdb64580e61760f1afc470781f9ecd5fe8f3d8dcd8cf4556", + "sha256:9c8d9eacdce840b72eee7924c752c31b675f8aec74790e08cff184a4ea8aa9c1", + "sha256:af5b929debc336f6bab9b0da6915f9ee5e41444012aed6a79a3c7e80d7662fdf", + "sha256:b9cdb87fc77e9a3eabdc42a512368538d648fa0760ad30cf97788076985c790a", + "sha256:c5e6380b90b389454669dc67d0a39fb4dc166416e01308fcddd694236b8329ef", + "sha256:d60c90fe2bfbee735397bf75a2f2c4e70c5deab51cd40c6e4fa98fae018c8db6", + "sha256:d8582c8b1b1063249da1588854251d8a91df1e210a328aeb0ece39da2b2b763b", + "sha256:ddbf86ba3aa0ad8fed2867910d2913ee237d55920b55f1d619049b3399f04efc", + "sha256:e46bc0664c5c8a0545857aa7a096289f8db148e7f9cca2d0b760113e8994bddc", + "sha256:f6437f70ec7fed0ca3a0eef1146591bb754b418bb6c6b21db74f0333d624e135", + "sha256:f71693c3396530c6b00773b029ea85e59272557e9bd6077195a6593e4229892a", + "sha256:f79f7455f8fbd43e8e9d61914ecf7f48ba1c8e271801996fef8d6a8f3cc9f39f" + ], + "index": "pypi", + "version": "==1.23.0" + }, + "grpcio-tools": { + "hashes": [ + "sha256:056f2a274edda4315e825ac2e3a9536f5415b43aa51669196860c8de6e76d847", + "sha256:0c953251585fdcd422072e4b7f4243fce215f22e21db94ec83c5970e41db6e18", + "sha256:142a73f5769f37bf2e4a8e4a77ef60f7af5f55635f60428322b49c87bd8f9cc0", + "sha256:1b333e2a068d8ef89a01eb23a098d2a789659c3178de79da9bd3d0ffb944cc6d", + "sha256:2124f19cc51d63405a0204ae38ef355732ab0a235975ab41ff6f6f9701905432", + "sha256:24c3a04adfb6c6f1bc4a2f8498d7661ca296ae352b498e538832c22ddde7bf81", + "sha256:3a2054e9640cbdd0ce8a345afb86be52875c5a8f9f5973a5c64791a8002da2dd", + "sha256:3fd15a09eecef83440ac849dcda2ff522f8ee1603ebfcdbb0e9b320ef2012e41", + "sha256:457e7a7dfa0b6bb608a766edba6f20c9d626a790df802016b930ad242fec4470", + "sha256:49ad5661d54ff0d164e4b441ee5e05191187d497380afa16d36d72eb8ef048de", + "sha256:561078e425d21a6720c3c3828385d949e24c0765e2852a46ecc3ad3fca2706e5", + "sha256:5a4f65ab06b32dc34112ed114dee3b698c8463670474334ece5b0b531073804c", + "sha256:8883e0e34676356d219a4cd37d239c3ead655cc550836236b52068e091416fff", + "sha256:8d2b45b1faf81098780e07d6a1c207b328b07e913160b8baa7e2e8d89723e06c", + "sha256:b0ebddb6ecc4c161369f93bb3a74c6120a498d3ddc759b64679709a885dd6d4f", + "sha256:b786ba4842c50de865dd3885b5570690a743e84a327b7213dd440eb0e6b996f8", + "sha256:be8efa010f5a80f1862ead80c3b19b5eb97dc954a0f59a1e2487078576105e03", + "sha256:c29106eaff0e2e708a9a89628dc0134ef145d0d3631f0ef421c09f380c30e354", + "sha256:c3c71236a056ec961b2b8b3b7c0b3b5a826283bc69c4a1c6415d23b70fea8243", + "sha256:cbc35031ec2b29af36947d085a7fbbcd8b79b84d563adf6156103d82565f78db", + "sha256:d47307c22744918e803c1eec7263a14f36aaf34fe496bff9ccbcae67c02b40ae", + "sha256:db088c98e563c1bb070da5984c8df08b45b61e4d9c6d2a8a1ffeed2af89fd1f3", + "sha256:df4dd1cb670062abdacc1fbce41cae4e08a4a212d28dd94fdbbf90615d027f73", + "sha256:e3adcf1499ca08d1e036ff44aedf55ed78653d946f4c4426b6e72ab757cc4dec", + "sha256:e3b3e32e0cda4dc382ec5bed8599dab644e4b3fc66a9ab54eb58248e207880b9", + "sha256:ed524195b35304c670755efa1eca579e5c290a66981f97004a5b2c0d12d6897d", + "sha256:edb42432790b1f8ec9f08faf9326d7e5dfe6e1d8c8fe4db39abc0a49c1c76537", + "sha256:eff1f995e5aa4cc941b6bbc45b5b57842f8f62bbe1a99427281c2c70cf42312c", + "sha256:f2fcdc2669662d77b400f80e20315a3661466e3cb3df1730f8083f9e49465cbc", + "sha256:f52ec9926daf48f41389d39d01570967b99c7dbc12bffc134cc3a3c5b5540ba2", + "sha256:fd007d67fdfbd2a13bf8a8c8ced8353b42a92ca72dbee54e951d8ddbc6ca12bc", + "sha256:ff9045e928dbb7943ea8559bfabebee95a43a830e00bf52c16202d2d805780fb" + ], + "index": "pypi", + "version": "==1.23.0" + }, "idna": { "hashes": [ "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", @@ -60,6 +154,35 @@ "markers": "python_version < '3.3'", "version": "==1.0.22" }, + "kazoo": { + "hashes": [ + "sha256:322c0dfa7e3a91ce217d01cb954fe3bffbc9b412c3eec7d5f800412b5145773e", + "sha256:4a73c2c62a7163ca1c4aef82aa042d795560497cc81034f212ef13cc037cc783" + ], + "index": "pypi", + "version": "==2.6.1" + }, + "protobuf": { + "hashes": [ + "sha256:00a1b0b352dc7c809749526d1688a64b62ea400c5b05416f93cfb1b11a036295", + "sha256:01acbca2d2c8c3f7f235f1842440adbe01bbc379fa1cbdd80753801432b3fae9", + "sha256:0a795bca65987b62d6b8a2d934aa317fd1a4d06a6dd4df36312f5b0ade44a8d9", + "sha256:0ec035114213b6d6e7713987a759d762dd94e9f82284515b3b7331f34bfaec7f", + "sha256:31b18e1434b4907cb0113e7a372cd4d92c047ce7ba0fa7ea66a404d6388ed2c1", + "sha256:32a3abf79b0bef073c70656e86d5bd68a28a1fbb138429912c4fc07b9d426b07", + "sha256:55f85b7808766e5e3f526818f5e2aeb5ba2edcc45bcccede46a3ccc19b569cb0", + "sha256:64ab9bc971989cbdd648c102a96253fdf0202b0c38f15bd34759a8707bdd5f64", + "sha256:64cf847e843a465b6c1ba90fb6c7f7844d54dbe9eb731e86a60981d03f5b2e6e", + "sha256:917c8662b585470e8fd42f052661fc66d59fccaae450a60044307dcbf82a3335", + "sha256:afed9003d7f2be2c3df20f64220c30faec441073731511728a2cb4cab4cd46a6", + "sha256:bf8e05d638b585d1752c5a84247134a0350d3a8b73d3632489a014a9f6f1e758", + "sha256:d831b047bd69becaf64019a47179eb22118a50dd008340655266a906c69c6417", + "sha256:de2760583ed28749ff885789c1cbc6c9c06d6de92fc825740ab99deb2f25ea4d", + "sha256:eabc4cf1bc19689af8022ba52fd668564a8d96e0d08f3b4732d26a64255216a4", + "sha256:fcff6086c86fb1628d94ea455c7b9de898afc50378042927a59df8065a79a549" + ], + "version": "==3.9.1" + }, "pyaml": { "hashes": [ "sha256:a2dcbc4a8bb00b541efd1c5a064d93474d4f41ded1484fbb08bec9d236523931", diff --git a/config/make-ramcloud b/config/make-ramcloud index e8f892f..d6cedb5 100755 --- a/config/make-ramcloud +++ b/config/make-ramcloud @@ -48,3 +48,10 @@ mv install/bin/server install/bin/rc-server # Move the libraries to the correct place instead of in the ramcloud subdirectory. mv install/lib/ramcloud/* install/lib && rmdir install/lib/ramcloud + +# Build the proto files so we can read what RAMCloud puts in ZooKeeper. +cd src +PROTO_OUT=/src/RAMCloud/bindings/python +for proto_file in $(ls *.proto); do + python -m grpc_tools.protoc -I. --python_out=${PROTO_OUT} --grpc_python_out=${PROTO_OUT} ${proto_file} +done diff --git a/testing/cluster_test_utils.py b/testing/cluster_test_utils.py index da0b408..f45fd82 100644 --- a/testing/cluster_test_utils.py +++ b/testing/cluster_test_utils.py @@ -1,4 +1,5 @@ import docker +import kazoo.client import logging import logging.config import ramcloud @@ -16,7 +17,7 @@ def get_host(locator): return arg_map['basic+udp:host'] def external_storage_string(ensemble): - return 'zk:' + ','.join(['{}:2181'.format(ip) for (_, ip) in ensemble.items()]) + return ','.join(['{}:2181'.format(ip) for (_, ip) in ensemble.items()]) def ensemble_servers_string(ensemble): return ' '.join(['server.{}={}:2888:3888;2181'.format(zkid, ip) for (zkid, ip) in ensemble.items()]) @@ -69,3 +70,8 @@ def launch_node(cluster_name, hostname, zk_servers, external_storage, zkid, ip, logger.info('Launching node container %s with IP address %s...successful', hostname, ip) return docker_client.containers.get(container_id) + +def get_zookeeper_client(ensemble, read_only=True): + client = kazoo.client.KazooClient(hosts=external_storage_string(ensemble), read_only=read_only) + client.start() + return client diff --git a/testing/test_cluster.py b/testing/test_cluster.py index 80f00f7..7c37658 100644 --- a/testing/test_cluster.py +++ b/testing/test_cluster.py @@ -1,5 +1,6 @@ -import ramcloud import os +import ramcloud +import Table_pb2 import unittest from pyexpect import expect import cluster_test_utils as ctu @@ -24,19 +25,19 @@ def createTestValue(self): def make_cluster(self, num_nodes): self.assertGreaterEqual(num_nodes, 3) - ensemble = {i: '10.0.1.{}'.format(i) for i in xrange(1, num_nodes + 1)} - zk_servers = ctu.ensemble_servers_string(ensemble) - external_storage = ctu.external_storage_string(ensemble) + self.ensemble = {i: '10.0.1.{}'.format(i) for i in xrange(1, num_nodes + 1)} + zk_servers = ctu.ensemble_servers_string(self.ensemble) + external_storage = 'zk:' + ctu.external_storage_string(self.ensemble) for i in xrange(1, num_nodes + 1): hostname = 'ramcloud-node-{}'.format(i) - self.node_containers[ensemble[i]] = ctu.launch_node('main', - hostname, - zk_servers, - external_storage, - i, - ensemble[i], - self.node_image, - self.ramcloud_network) + self.node_containers[self.ensemble[i]] = ctu.launch_node('main', + hostname, + zk_servers, + external_storage, + i, + self.ensemble[i], + self.node_image, + self.ramcloud_network) self.rc_client.connect(external_storage, 'main') def simple_recovery(self, kill_command): @@ -56,6 +57,20 @@ def simple_recovery(self, kill_command): value = self.rc_client.read(self.table, 'testKey') expect(value).equals(('testValue', 1)) + def test_zookeeper_read(self): + self.make_cluster(num_nodes=4) + self.createTestValue() + zk_client = ctu.get_zookeeper_client(self.ensemble) + + # Read the ZooKeeper entry for the table and make sure it looks sane. + # This mostly tests our ability to read from ZooKeeper and parse the + # GRPC contents correctly. + table_data = zk_client.get('/ramcloud/main/tables/test')[0] + table_parsed = Table_pb2.Table() + table_parsed.ParseFromString(table_data) + expect(table_parsed.id).equals(1L) + expect(table_parsed.name).equals("test") + def test_read_write(self): self.make_cluster(num_nodes=3) self.rc_client.create_table('test_table')