ManagedkdbInsights/update_cluster/update_cluster_file.py (57 lines of code) (raw):
import argparse
import pprint
import pykx as kx
from urllib.parse import urlparse
from pathlib import Path
from managed_kx import *
from update_cluster_code import *
pp = pprint.PrettyPrinter(indent=2)
def divide_chunks(l, n):
# looping till length l
for i in range(0, len(l), n):
yield l[i:i + n]
class S3Url(object):
def __init__(self, url):
self._parsed = urlparse(url, allow_fragments=False)
@property
def bucket(self):
return self._parsed.netloc
@property
def key(self):
if self._parsed.query:
return self._parsed.path.lstrip('/') + '?' + self._parsed.query
else:
return self._parsed.path.lstrip('/')
@property
def url(self):
return self._parsed.geturl()
#
# This program assumes that you have credentials in $HOME/.aws/credentials
# those credentials must also be linked to a FinSpace user with ability to create datasets
#
if __name__ == '__main__':
parser = argparse.ArgumentParser()
# arguments
parser.add_argument("-environmentId", "-e", help="Finspace with managed kdb Insights Environment ID", required=True)
parser.add_argument("-profile", "-p", help="profile to use for API access", default ="default")
parser.add_argument("-cluster", "-cl", help="Cluster to update", required=True)
parser.add_argument("-user", "-u", help="FinSpace user name", required=True)
parser.add_argument("-code", "-co", help="Code directory", required=True)
parser.add_argument("-file", "-f", help="File to send to cluster, path must be relative to code directory", required=True)
args = parser.parse_args()
ENV_ID = args.environmentId
CLUSTER_NAME = args.cluster
KDB_USERNAME = args.user
local_code_home = Path(args.code)
source_file = args.file
cluster_code_home = "/opt/kx/app/code"
# use the user's AWS credentials from environment
session = boto3.Session(profile_name = args.profile)
client = session.client(service_name='finspace')
# check arguments
# - code location exists
# - file in code location exists
# - cluster exists
# -------------------------------------------------------------
# does code location exist?
if local_code_home.is_dir() is False:
sys.exit(f"directory {local_code_home.absolute()} not found")
# does the source file exist?
if local_code_home.is_dir() is False:
sys.exit(f"file {source_file} not found in {local_code_home.absolute()}")
# cluster exists?
if has_cluster(client, environmentId=ENV_ID, clusterName=CLUSTER_NAME) is False:
sys.exit(f"cluster {CLUSTER_NAME} not found")
# connect to cluster
local_file = f"{local_code_home.absolute()}/{source_file}"
remote_file = f"{cluster_code_home}/{source_file}"
conn = get_pykx_connection(client,
environmentId=ENV_ID, clusterName=CLUSTER_NAME,
userName=KDB_USERNAME, boto_session=session)
# read file contents into local q
update_cluster_code(kx_remote=conn,
filesPath=local_file,
remotePath=remote_file)
# push file contents to cluster
# save file on cluster