chore: import upstream snapshot with attribution
This commit is contained in:
+299
@@ -0,0 +1,299 @@
|
||||
# 0. constants
|
||||
|
||||
## 0.1. ports
|
||||
|
||||
READINESS_PORT = 8086
|
||||
CHAT_INTEGRATION_PORT = 8089
|
||||
ECHO_BOT_PORT = 8090
|
||||
PUSHPIN_PUBLIC_INNER_PORT = 7999
|
||||
PUSHPIN_PRIVATE_INNER_PORT = 5561
|
||||
PUSHPIN_PUBLIC_PORT = 7001
|
||||
PUSHPIN_PRIVATE_PORT = 6001
|
||||
DYNAMO_DB_PORT = 8000
|
||||
|
||||
## 0.2. strings
|
||||
|
||||
AUTH_ENCRYPTION_KEY = "allo"
|
||||
WORK_DIR = os.path.dirname(__file__)
|
||||
BOTPRESS_HOME_DIR = "%s/.botpresshome.echo" % WORK_DIR
|
||||
PUSHPIN_CONFIG_PATH="%s/pushpin.conf" % WORK_DIR
|
||||
LOCAL_AWS_ACCESS_KEY_ID = "FOO"
|
||||
LOCAL_AWS_SECRET_ACCESS_KEY = "BAR"
|
||||
ECHO_BOT_PATH = "%s/bots/echo" % WORK_DIR
|
||||
CHAT_INT_PATH = "%s/integrations/chat" % WORK_DIR
|
||||
|
||||
CONV_FID_STORE = struct(
|
||||
table_name='chat-integration-conversation-fid-store',
|
||||
index_name='chat-integration-conversation-id-store',
|
||||
partition_key='bot_id',
|
||||
sort_key='fid',
|
||||
index_sort_key='id',
|
||||
)
|
||||
|
||||
USER_FID_STORE = struct(
|
||||
table_name='chat-integration-user-fid-store',
|
||||
index_name='chat-integration-user-id-store',
|
||||
partition_key='bot_id',
|
||||
sort_key='fid',
|
||||
index_sort_key='id',
|
||||
)
|
||||
|
||||
## 0.3. utils
|
||||
|
||||
def encode_base64(content):
|
||||
return str(local(
|
||||
command=['base64'],
|
||||
quiet=True,
|
||||
echo_off=True,
|
||||
stdin=content,
|
||||
)).strip()
|
||||
|
||||
# 0.4. env
|
||||
|
||||
BP_HOME_ENV = struct(key='BP_BOTPRESS_HOME', value=BOTPRESS_HOME_DIR)
|
||||
|
||||
# 1. config
|
||||
|
||||
config.define_bool('skip-install')
|
||||
config.define_bool('skip-build')
|
||||
config.define_string('bp-domain')
|
||||
config.define_string('bp-token')
|
||||
config.define_string('bp-workspace-id')
|
||||
cfg = config.parse()
|
||||
|
||||
config_skip_install = cfg.get('skip-install', False)
|
||||
config_skip_build = cfg.get('skip-build', False)
|
||||
config_bp_domain = cfg.get('bp-domain', None)
|
||||
config_bp_token = cfg.get('bp-token', None)
|
||||
config_bp_workspace_id = cfg.get('bp-workspace-id', None)
|
||||
|
||||
if not config_bp_domain:
|
||||
fail("config 'bp-domain' is required")
|
||||
|
||||
if not config_bp_token:
|
||||
fail("config 'bp-token' is required")
|
||||
|
||||
if not config_bp_workspace_id:
|
||||
fail("config 'bp-workspace-id' is required")
|
||||
|
||||
CONFIG = struct(
|
||||
skip_install=config_skip_install,
|
||||
skip_build=config_skip_build,
|
||||
bp_domain=config_bp_domain,
|
||||
bp_token=config_bp_token,
|
||||
bp_workspace_id=config_bp_workspace_id,
|
||||
)
|
||||
|
||||
api_webhook_domain = "webhook.%s" % CONFIG.bp_domain
|
||||
api_api_domain = "api.%s" % CONFIG.bp_domain
|
||||
api_tunnel_domain = "tunnel.%s" % CONFIG.bp_domain
|
||||
api_api_url = "https://%s" % api_api_domain
|
||||
api_tunnel_url = "https://%s" % api_tunnel_domain
|
||||
|
||||
API = struct(
|
||||
bp_webhook_domain = api_webhook_domain,
|
||||
bp_api_domain = api_api_domain,
|
||||
bp_tunnel_domain = api_tunnel_domain,
|
||||
bp_api_url = api_api_url,
|
||||
bp_tunnel_url = api_tunnel_url,
|
||||
)
|
||||
|
||||
# 2. docker compose
|
||||
|
||||
dynamodb_resource = {
|
||||
"image": "amazon/dynamodb-local",
|
||||
"ports": ["%s:%s" % (DYNAMO_DB_PORT, DYNAMO_DB_PORT)],
|
||||
"environment": {
|
||||
"DYNAMODB_LOCAL_LOG": "DEBUG"
|
||||
}
|
||||
}
|
||||
|
||||
PUSHPIN_ROUTES = "*,proto=ws %s:443,ssl,insecure,host=%s,over_http\n* %s:443,ssl,insecure,host=%s" % (API.bp_webhook_domain, API.bp_webhook_domain, API.bp_webhook_domain, API.bp_webhook_domain)
|
||||
PUSHPIN_CONFIG = "%s" % read_file(PUSHPIN_CONFIG_PATH, '')
|
||||
pushpin_ressource = {
|
||||
"image": "botpress/pushpin",
|
||||
"environment": {
|
||||
"PUSHPIN_ROUTES": PUSHPIN_ROUTES,
|
||||
"PUSHPIN_CONFIG": PUSHPIN_CONFIG,
|
||||
},
|
||||
'ports': ['%s:%s' % (PUSHPIN_PUBLIC_PORT, PUSHPIN_PUBLIC_INNER_PORT), '%s:%s' % (PUSHPIN_PRIVATE_PORT, PUSHPIN_PRIVATE_INNER_PORT)],
|
||||
'platform': 'linux/amd64',
|
||||
}
|
||||
|
||||
docker_compose(encode_yaml({
|
||||
'version': '3.5',
|
||||
'services': {
|
||||
'run-pushpin': pushpin_ressource,
|
||||
'run-dynamodb': dynamodb_resource,
|
||||
},
|
||||
}))
|
||||
|
||||
dc_readiness = [
|
||||
{ 'type': 'http', 'name': 'run-pushpin', 'url': 'http://localhost:%s' % PUSHPIN_PUBLIC_PORT },
|
||||
{ 'type': 'dynamodb', 'name': 'run-dynamodb', 'uri': 'http://localhost:%s' % DYNAMO_DB_PORT },
|
||||
]
|
||||
|
||||
# 3. ressources
|
||||
|
||||
## 3.1. utils
|
||||
|
||||
local_resource(
|
||||
name='pnpm-install',
|
||||
cmd='pnpm install' if not CONFIG.skip_install else 'echo skipped',
|
||||
labels=['utils']
|
||||
)
|
||||
|
||||
local_resource(
|
||||
name='pnpm-build',
|
||||
cmd='pnpm build' if not CONFIG.skip_build else 'echo skipped',
|
||||
labels=['utils'],
|
||||
resource_deps=['pnpm-install']
|
||||
)
|
||||
|
||||
local_resource(
|
||||
name='login-botpress',
|
||||
cmd='pnpm bp login',
|
||||
env={
|
||||
BP_HOME_ENV.key: BP_HOME_ENV.value,
|
||||
'BP_API_URL': API.bp_api_url,
|
||||
'BP_TOKEN': CONFIG.bp_token,
|
||||
'BP_WORKSPACE_ID': CONFIG.bp_workspace_id,
|
||||
},
|
||||
resource_deps=['pnpm-install', 'pnpm-build'],
|
||||
labels=['utils'],
|
||||
)
|
||||
|
||||
readiness_deps=[r['name'] for r in dc_readiness] + ['pnpm-install', 'pnpm-build']
|
||||
local_resource(
|
||||
name="readiness",
|
||||
allow_parallel=True,
|
||||
serve_cmd='pnpm ready',
|
||||
serve_env={
|
||||
'PORT': '%s' % READINESS_PORT,
|
||||
'LOG_LEVEL': 'info',
|
||||
'CONFIG': encode_json(dc_readiness),
|
||||
'AWS_REGION': 'localhost',
|
||||
'AWS_ACCESS_KEY_ID': LOCAL_AWS_ACCESS_KEY_ID,
|
||||
'AWS_SECRET_ACCESS_KEY': LOCAL_AWS_SECRET_ACCESS_KEY,
|
||||
},
|
||||
labels=['utils'],
|
||||
readiness_probe=probe(http_get=http_get_action(port=READINESS_PORT, path='/ready'), period_secs=2, failure_threshold=20),
|
||||
resource_deps=readiness_deps,
|
||||
)
|
||||
|
||||
# 3.2. scripts
|
||||
|
||||
local_resource(
|
||||
name='create-conv-fid-store',
|
||||
cmd='pnpm ts-node -T ./scripts/dynamodb-create-table.ts',
|
||||
env={
|
||||
'AWS_REGION': "localhost",
|
||||
'AWS_ACCESS_KEY_ID': LOCAL_AWS_ACCESS_KEY_ID,
|
||||
'AWS_SECRET_ACCESS_KEY': LOCAL_AWS_SECRET_ACCESS_KEY,
|
||||
'endpoint': "http://localhost:%s" % DYNAMO_DB_PORT,
|
||||
'table_name': CONV_FID_STORE.table_name,
|
||||
'index_name': CONV_FID_STORE.index_name,
|
||||
'partition_key': CONV_FID_STORE.partition_key,
|
||||
'sort_key': CONV_FID_STORE.sort_key,
|
||||
'index_sort_key': CONV_FID_STORE.index_sort_key,
|
||||
},
|
||||
labels=['scripts'],
|
||||
resource_deps=['readiness'],
|
||||
)
|
||||
|
||||
local_resource(
|
||||
name='create-user-fid-store',
|
||||
cmd='pnpm ts-node -T ./scripts/dynamodb-create-table.ts',
|
||||
env={
|
||||
'AWS_REGION': "localhost",
|
||||
'AWS_ACCESS_KEY_ID': LOCAL_AWS_ACCESS_KEY_ID,
|
||||
'AWS_SECRET_ACCESS_KEY': LOCAL_AWS_SECRET_ACCESS_KEY,
|
||||
'endpoint': "http://localhost:%s" % DYNAMO_DB_PORT,
|
||||
'table_name': USER_FID_STORE.table_name,
|
||||
'index_name': USER_FID_STORE.index_name,
|
||||
'partition_key': USER_FID_STORE.partition_key,
|
||||
'sort_key': USER_FID_STORE.sort_key,
|
||||
'index_sort_key': USER_FID_STORE.index_sort_key,
|
||||
},
|
||||
labels=['scripts'],
|
||||
resource_deps=['readiness'],
|
||||
)
|
||||
|
||||
## 3.3. run
|
||||
|
||||
dc_resource(name='run-pushpin', labels=['run'])
|
||||
dc_resource(name='run-dynamodb', labels=['run'])
|
||||
|
||||
local_resource(
|
||||
name='run-chat-integration',
|
||||
serve_cmd=" ".join([
|
||||
"pnpm -F @botpresshub/chat exec bp dev -v",
|
||||
"--secrets SIGNAL_URL=http://localhost:%s" % PUSHPIN_PRIVATE_PORT,
|
||||
"--secrets AUTH_ENCRYPTION_KEY=%s" % AUTH_ENCRYPTION_KEY,
|
||||
'--secrets FID_STORE_CONFIG="%s"' % encode_base64(encode_json({
|
||||
"strategy": "dynamo-db",
|
||||
"endpoint": "http://localhost:%s" % DYNAMO_DB_PORT,
|
||||
"region": "localhost",
|
||||
"accessKeyId": LOCAL_AWS_ACCESS_KEY_ID,
|
||||
"secretAccessKey": LOCAL_AWS_SECRET_ACCESS_KEY,
|
||||
"conversationTable": {
|
||||
"tableName": CONV_FID_STORE.table_name,
|
||||
"indexName": CONV_FID_STORE.index_name,
|
||||
"partitionKey": CONV_FID_STORE.partition_key,
|
||||
"sortKey": CONV_FID_STORE.sort_key,
|
||||
"indexSortKey": CONV_FID_STORE.index_sort_key,
|
||||
},
|
||||
"userTable": {
|
||||
"tableName": USER_FID_STORE.table_name,
|
||||
"indexName": USER_FID_STORE.index_name,
|
||||
"partitionKey": USER_FID_STORE.partition_key,
|
||||
"sortKey": USER_FID_STORE.sort_key,
|
||||
"indexSortKey": USER_FID_STORE.index_sort_key,
|
||||
}
|
||||
}))
|
||||
]),
|
||||
serve_env={
|
||||
BP_HOME_ENV.key: BP_HOME_ENV.value,
|
||||
'BP_CONFIRM': 'true',
|
||||
'BP_TUNNEL_URL': API.bp_tunnel_url,
|
||||
'BP_PORT': str(CHAT_INTEGRATION_PORT),
|
||||
},
|
||||
resource_deps=['login-botpress', 'readiness', 'run-pushpin', 'create-conv-fid-store', 'create-user-fid-store'],
|
||||
labels=['run'],
|
||||
readiness_probe=probe(http_get=http_get_action(port=CHAT_INTEGRATION_PORT, path='/health'), period_secs=1, failure_threshold=10),
|
||||
)
|
||||
|
||||
local_resource(
|
||||
name='run-echo-bot',
|
||||
cmd="pnpm -F echo exec bp add --use-dev -y -v",
|
||||
serve_cmd="pnpm -F echo exec bp dev -y --tunnel-url %s --port %s" % (API.bp_tunnel_url, ECHO_BOT_PORT),
|
||||
serve_env={
|
||||
BP_HOME_ENV.key: BP_HOME_ENV.value,
|
||||
},
|
||||
resource_deps=['login-botpress', 'run-chat-integration'],
|
||||
labels=['run'],
|
||||
readiness_probe=probe(http_get=http_get_action(port=ECHO_BOT_PORT, path='/health'), period_secs=1, failure_threshold=10),
|
||||
)
|
||||
|
||||
## 3.3. test
|
||||
|
||||
# TODO: find a way to make this work without bash specific syntax
|
||||
local_resource(
|
||||
name='test-chat-integration',
|
||||
cmd=" ".join([
|
||||
'wh_id=$(pnpm ts-node -T ./scripts/fetch-chat-wh.ts);',
|
||||
'API_URL=http://localhost:%s/$wh_id' % PUSHPIN_PUBLIC_PORT,
|
||||
'pnpm run -F @botpress/chat test:e2e'
|
||||
]),
|
||||
env={
|
||||
BP_HOME_ENV.key: BP_HOME_ENV.value,
|
||||
'BP_API_URL': API.bp_api_url,
|
||||
'BP_TOKEN': CONFIG.bp_token,
|
||||
'BP_WORKSPACE_ID': CONFIG.bp_workspace_id,
|
||||
'ECHO_PATH': ECHO_BOT_PATH,
|
||||
'CHAT_PATH': CHAT_INT_PATH,
|
||||
'ENCRYPTION_KEY': AUTH_ENCRYPTION_KEY,
|
||||
},
|
||||
resource_deps=['run-chat-integration', 'run-echo-bot'],
|
||||
labels=['test'],
|
||||
)
|
||||
Reference in New Issue
Block a user