1f3f724bbb
These may be useful for zuul developers to understand issues with the ZK data storage. zk-dump will dump an approximation of the contents of ZK to the filesystem for manual examination. zk-analyze will perform some analysis on the tree to identify objects which may be execessively large. Change-Id: I1a90cce42da719eee0a5e50242034390722d518e
69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
# Copyright 2022 Acme Gating, LLC
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
# Dump the data in ZK to the local filesystem.
|
|
|
|
import argparse
|
|
import os
|
|
import zlib
|
|
|
|
import kazoo.client
|
|
|
|
|
|
def getTree(client, root, path, decompress=False):
|
|
try:
|
|
data, zstat = client.get(path)
|
|
except kazoo.exceptions.NoNodeError:
|
|
print(f"No node at {path}")
|
|
return
|
|
|
|
if decompress:
|
|
try:
|
|
data = zlib.decompress(data)
|
|
except Exception:
|
|
pass
|
|
|
|
os.makedirs(root + path)
|
|
with open(root + path + '/ZKDATA', 'wb') as f:
|
|
f.write(data)
|
|
for child in client.get_children(path):
|
|
getTree(client, root, path + '/' + child, decompress)
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('host', help='ZK host string')
|
|
parser.add_argument('path', help='Filesystem output path for data dump')
|
|
parser.add_argument('--cert', help='Path to TLS certificate')
|
|
parser.add_argument('--key', help='Path to TLS key')
|
|
parser.add_argument('--ca', help='Path to TLS CA cert')
|
|
parser.add_argument('--decompress', action='store_true',
|
|
help='Decompress data')
|
|
args = parser.parse_args()
|
|
|
|
kwargs = {}
|
|
if args.cert:
|
|
kwargs['use_ssl'] = True
|
|
kwargs['keyfile'] = args.key
|
|
kwargs['certfile'] = args.cert
|
|
kwargs['ca'] = args.ca
|
|
client = kazoo.client.KazooClient(args.host, **kwargs)
|
|
client.start()
|
|
|
|
getTree(client, args.path, '/zuul', args.decompress)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|