mirror of
https://github.com/EvernodeXRPL/hp-devkit.git
synced 2026-04-29 15:37:58 +00:00
Cleanup.
This commit is contained in:
97
README.md
97
README.md
@@ -1,96 +1,51 @@
|
||||
# HotPocket developer toolkit
|
||||
Developer toolkit for HotPocket smart contract development. This toolkit makes use of Docker to provide a cross-platform development tools for developers. Using the toolkit, developers can spin-up local HotPocket clusters on their developer machines and test HotPocket smart contracts.
|
||||
# HotPocket developer kit
|
||||
|
||||
We use Docker containers to run HotPocket and smart contracts in a Linux environment. We also use Docker containers to distribute developer tools so developers can use the tools on any platform as long as they install Docker.
|
||||
This is the source repository of developer kit for HotPocket smart contract development. This toolkit makes use of Docker and NodeJS to provide a cross-platform HotPocket development tool for developers. Using the HotPocket developer kit, developers can spin-up local HotPocket clusters on their development machines and test HotPocket smart contracts.
|
||||
|
||||
<img width="829" alt="image" src="https://user-images.githubusercontent.com/33562092/174513691-4700f356-09c5-47f9-ad5c-550abaefc1b1.png">
|
||||
We use Docker containers to run HotPocket and smart contracts in a Linux environment. We also use Docker containers and NodeJS for tooling so developers can use the tools on any platform as long as they install Docker and NodeJS.
|
||||
|
||||
<img width="829" alt="image" src="https://user-images.githubusercontent.com/33562092/236629093-f4357d2c-8e4c-43d4-9b52-8e76e5a4095e.png">
|
||||
|
||||
## Public documentation
|
||||
Available [here](https://github.com/HotPocketDev/evernode-sdk/tree/main/hpdevkit)
|
||||
|
||||
https://github.com/EvernodeXRPL/evernode-sdk/blob/main/hpdevkit/index.md
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- [Docker](https://docs.docker.com/engine/install/)
|
||||
- [NodeJS](https://nodejs.org/)
|
||||
|
||||
## Docker build
|
||||
Docker image containing cross-platform cluster management scripts.
|
||||
|
||||
### Local build
|
||||
Docker image containing cluster management shell scripts.
|
||||
|
||||
```
|
||||
cd docker
|
||||
docker build -t evernodedev/hpdevkit .
|
||||
```
|
||||
|
||||
### Push to Docker hub
|
||||
```
|
||||
docker push evernodedev/hpdevkit
|
||||
```
|
||||
|
||||
### Run
|
||||
|
||||
```
|
||||
docker run -it --rm --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock evernodedev/hpdevkit cluster create 2
|
||||
```
|
||||
|
||||
## Windows build
|
||||
Contains windows launcher scripts. Written using powershell and compiled to exe using [ps2exe](https://github.com/MScholtes/PS2EXE).
|
||||
## hpdevkit npm build
|
||||
|
||||
### Prerequisites
|
||||
```powershell
|
||||
Install-Module ps2exe
|
||||
hpdevkit is a cross-platform CLI tool distributed via NPM.
|
||||
|
||||
```
|
||||
# local build
|
||||
cd npm
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
# publish to npm
|
||||
npm login
|
||||
npm run publish
|
||||
```
|
||||
|
||||
### Powershell script usage
|
||||
```powershell
|
||||
# Deploy contract to single-node cluster.
|
||||
.\hpdevkit.ps1 deploy <contract files directory>
|
||||
### NPM package
|
||||
|
||||
# Stop and cleanup everything (required for changing cluster size)
|
||||
.\hpdevkit.ps1 clean
|
||||
|
||||
# Use different cluster size.
|
||||
$env:HP_CLUSTER_SIZE = 3
|
||||
.\hpdevkit.ps1 deploy <contract files directory>
|
||||
|
||||
# Look at specific node's logs.
|
||||
.\hpdevkit.ps1 logs <node number>
|
||||
|
||||
# Start/stop all nodes.
|
||||
.\hpdevkit.ps1 start
|
||||
.\hpdevkit.ps1 stop
|
||||
|
||||
# Start/stop specific node.
|
||||
.\hpdevkit.ps1 start <node number>
|
||||
.\hpdevkit.ps1 stop <node number>
|
||||
```
|
||||
|
||||
If the contract files directory also contains a file named `hp.cfg.override`, it will be used to override the hp.cfg of all nodes. This can be used to set contract specific parameters like 'bin_path' and 'bin_args'
|
||||
|
||||
Example `hp.cfg.override` for a nodejs application:
|
||||
```
|
||||
{
|
||||
"contract": {
|
||||
"bin_path": "/usr/bin/node",
|
||||
"bin_args": "app.js"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Code generator
|
||||
```
|
||||
# Generate nodejs starter contract project
|
||||
.\hpdevkit.ps1 gen nodejs starter-contract <project name>
|
||||
```
|
||||
|
||||
### Generate executable
|
||||
```powershell
|
||||
cd windows
|
||||
Invoke-ps2exe .\hpdevkit.ps1 hpdevkit.exe
|
||||
```
|
||||
The executable can be distributed to be run as a CLI tool on developer machine.
|
||||
|
||||
## Environment variables
|
||||
| Name | Description | Default value |
|
||||
| --- | --- | --- |
|
||||
| HP_CLUSTER_SIZE | Number of nodes in the cluster. Applied with 'deploy' command. | `1` |
|
||||
| HP_DEFAULT_NODE | The node the 'deploy' command uses to display logs. | `1` |
|
||||
| HP_DEVKIT_IMAGE | Docker image to be used for devkit cluster management. | `evernodedev/hpdevkit` |
|
||||
| HP_INSTANCE_IMAGE | Docker image to be used for HotPocket instances. | `evernodedev/hotpocket:0.6.0-ubt.20.04-njs.16` |
|
||||
https://www.npmjs.com/package/hpdevkit
|
||||
|
||||
@@ -1,319 +0,0 @@
|
||||
#!/bin/bash
|
||||
globalPrefix="hpdevkit"
|
||||
version="0.1.0"
|
||||
|
||||
cluster="default"
|
||||
clusterSize=$([ -z $HP_CLUSTER_SIZE ] && echo 3 || echo "$HP_CLUSTER_SIZE")
|
||||
defaultNode=$([ -z $HP_DEFAULT_NODE ] && echo 1 || echo "$HP_DEFAULT_NODE")
|
||||
devkitImage=$([ -z $HP_DEVKIT_IMAGE ] && echo "evernodedev/hpdevkit" || echo "$HP_DEVKIT_IMAGE")
|
||||
instanceImage=$([ -z $HP_INSTANCE_IMAGE ] && echo "evernodedev/hotpocket:0.6.0-ubt.20.04-njs.16" || echo "$HP_INSTANCE_IMAGE")
|
||||
hpUserPortBegin=$([ -z $HP_USER_PORT_BEGIN ] && echo 8081 || echo "$HP_USER_PORT_BEGIN")
|
||||
hpPeerPortBegin=$([ -z $HP_PEER_PORT_BEGIN ] && echo 22861 || echo "$HP_PEER_PORT_BEGIN")
|
||||
|
||||
volumeMount=/$globalPrefix\_vol
|
||||
volume=$globalPrefix\_$cluster\_vol
|
||||
network=$globalPrefix\_$cluster\_net
|
||||
containerPrefix=$globalPrefix\_$cluster\_node
|
||||
bundleMount=$volumeMount/contract_bundle
|
||||
deploymentContainerName=$globalPrefix\_$cluster\_deploymgr
|
||||
codegenContainerName=$globalPrefix\_codegen
|
||||
configOverridesFile="hp.cfg.override"
|
||||
codegenOutputDir="/codegen-output"
|
||||
|
||||
cloudStorage="https://stevernode.blob.core.windows.net/evernode-dev-bb7ec110-f72e-430e-b297-9210468a4cbb"
|
||||
bashScriptUrl="$cloudStorage/$globalPrefix-linux/$globalPrefix.sh"
|
||||
hpdevkitDataDir="/etc/$globalPrefix"
|
||||
versionTimestampFile="$hpdevkitDataDir/linuxlauncherscript.timestamp"
|
||||
scriptBinPath="/usr/bin/$globalPrefix"
|
||||
|
||||
function devKitContainer() {
|
||||
command="docker $1 -it"
|
||||
if [ ! -z "$NAME" ]; then
|
||||
command+=" --name $NAME"
|
||||
fi
|
||||
|
||||
if [ ! -z "$DETACHED" ]; then
|
||||
command+=" -d"
|
||||
fi
|
||||
|
||||
if [ ! -z "$AUTOREMOVE" ]; then
|
||||
command+=" --rm"
|
||||
fi
|
||||
|
||||
if [ ! -z "$MOUNTSOCK" ]; then
|
||||
command+=" --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock"
|
||||
fi
|
||||
|
||||
if [ ! -z "$MOUNTVOLUME" ]; then
|
||||
command+=" --mount type=volume,src=$volume,dst=$volumeMount"
|
||||
fi
|
||||
|
||||
if [ ! -z "$ENTRYPOINT" ]; then
|
||||
command+=" --entrypoint $ENTRYPOINT"
|
||||
else
|
||||
command+=" --entrypoint /bin/bash"
|
||||
fi
|
||||
|
||||
if [ ! -z "$RESTARTPOLICY" ]; then
|
||||
command+=" --restart $RESTARTPOLICY"
|
||||
fi
|
||||
|
||||
command+=" -e CLUSTER=$cluster -e CLUSTER_SIZE=$clusterSize -e DEFAULT_NODE=$defaultNode -e VOLUME=$volume -e NETWORK=$network"
|
||||
command+=" -e CONTAINER_PREFIX=$containerPrefix -e VOLUME_MOUNT=$volumeMount -e BUNDLE_MOUNT=$bundleMount -e HOTPOCKET_IMAGE=$instanceImage"
|
||||
command+=" -e CONFIG_OVERRIDES_FILE=$configOverridesFile -e CODEGEN_OUTPUT=$codegenOutputDir"
|
||||
command+=" -e HP_USER_PORT_BEGIN=$hpUserPortBegin -e HP_PEER_PORT_BEGIN=$hpPeerPortBegin"
|
||||
|
||||
command+=" $devkitImage"
|
||||
|
||||
if [ ! -z "$CMD" ]; then
|
||||
if [ ! -z "$ENTRYPOINT" ]; then
|
||||
command+=" $CMD"
|
||||
else
|
||||
command+=" -c '$CMD'"
|
||||
fi
|
||||
fi
|
||||
|
||||
eval $command
|
||||
lastExitedCode=$?
|
||||
if [ ! -z "STATUS" ]; then
|
||||
if [ $lastExitedCode -eq 0 ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function executeInContainer() {
|
||||
if [ ! -z "$CONTAINERNAME" ]; then
|
||||
cmd="docker exec -it $CONTAINERNAME /bin/bash -c '$1'"
|
||||
! eval $cmd && echo "Docker execution failed."
|
||||
fi
|
||||
}
|
||||
|
||||
function initializeDeploymentCluster() {
|
||||
docker inspect $deploymentContainerName &>/dev/null
|
||||
if [[ $? -gt 0 ]]; then
|
||||
echo "Initializing deployment cluster"
|
||||
|
||||
# Stop cluster if running. Create cluster if not exists.
|
||||
AUTOREMOVE="true" MOUNTSOCK="true" CMD="cluster stop ; cluster create" devKitContainer run
|
||||
|
||||
# Spin up management container.
|
||||
NAME="$deploymentContainerName" DETACHED="true" MOUNTSOCK="true" MOUNTVOLUME="true" RESTARTPOLICY="unless-stopped" devKitContainer run
|
||||
|
||||
# Bind the instance mesh network config together.
|
||||
CONTAINERNAME="$deploymentContainerName" executeInContainer "cluster bindmesh"
|
||||
fi
|
||||
}
|
||||
|
||||
function teardownDeploymentCluster() {
|
||||
docker stop $deploymentContainerName 2>/dev/null
|
||||
docker rm $deploymentContainerName 2>/dev/null
|
||||
AUTOREMOVE="true" MOUNTSOCK="true" CMD="cluster stop ; cluster destroy" devKitContainer run
|
||||
}
|
||||
|
||||
function deploy() {
|
||||
if [ ! -z "$1" ]; then
|
||||
path="$1"
|
||||
initializeDeploymentCluster
|
||||
|
||||
# If copying a directory, delete target bundle directory. If not create empty target bundle directory to copy a file.
|
||||
prepareBundleDir=" "
|
||||
if [[ -d "$path" ]]; then
|
||||
prepareBundleDir="rm -rf $bundleMount"
|
||||
|
||||
else
|
||||
prepareBundleDir="mkdir -p $bundleMount && rm -rf $bundleMount/* $bundleMount/.??*"
|
||||
fi
|
||||
|
||||
CONTAINERNAME="$deploymentContainerName" executeInContainer "$prepareBundleDir"
|
||||
docker cp "$path" "$deploymentContainerName:$bundleMount"
|
||||
|
||||
# Sync contract bundle to all instance directories in the cluster.
|
||||
CONTAINERNAME="$deploymentContainerName" executeInContainer "cluster stop ; cluster sync ; cluster start"
|
||||
|
||||
if [ $defaultNode -gt 0 ]; then
|
||||
echo "Streaming logs of node $defaultNode:"
|
||||
CONTAINERNAME="$deploymentContainerName" executeInContainer "cluster logs $defaultNode"
|
||||
fi
|
||||
|
||||
else
|
||||
echo "Please specify directory or file path to deploy."
|
||||
fi
|
||||
}
|
||||
|
||||
function codeGenerator() {
|
||||
platform=$1
|
||||
apptype=$2
|
||||
projName=$3
|
||||
if [[ -d $projName ]]; then
|
||||
echo "Directory '$projName' already exists."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
NAME="$codegenContainerName" ENTRYPOINT="codegen" STATUS="true" CMD="$platform $apptype $projName" devKitContainer run
|
||||
lastExitedCode=$?
|
||||
if [ $lastExitedCode == 0 ]; then
|
||||
! docker cp $codegenContainerName:$codegenOutputDir ./$projName && echo "Project '$projName' generation failed." && exit 1
|
||||
echo "Project '$projName' created."
|
||||
fi
|
||||
|
||||
docker rm $codegenContainerName &>/dev/null
|
||||
|
||||
}
|
||||
|
||||
function removeLauncher() {
|
||||
rm $scriptBinPath
|
||||
}
|
||||
|
||||
function createLauncher() {
|
||||
# Copying the current script file to the bin directory
|
||||
! curl -fsSL $bashScriptUrl --output $scriptBinPath &>/dev/null && echo "Error in creating launcher." && return 1
|
||||
! chmod +x $scriptBinPath &>/dev/null && echo "Error in changing permission for the launcher." && return 1
|
||||
return 0
|
||||
}
|
||||
|
||||
function updateDevKit() {
|
||||
local latestVersionTimestamp=$(online_version_timestamp $bashScriptUrl)
|
||||
[ -z "$latestVersionTimestamp" ] && echo "Online launcher not found." && exit 1
|
||||
|
||||
# If Timestamp file is not found, re-run the install function.
|
||||
if [ ! -f $versionTimestampFile ]; then
|
||||
install
|
||||
else
|
||||
local currentVersionTimestamp=$(cat $versionTimestampFile)
|
||||
if [ "$currentVersionTimestamp" == "$latestVersionTimestamp" ]; then
|
||||
echo "HotPocket devkit is already upto date."
|
||||
else
|
||||
echo "Found a new version of HotPocket devkit."
|
||||
! removeLauncher && echo "Removing the launcher failed."
|
||||
! createLauncher && echo "Launcher creation failed."
|
||||
echo $latestVersionTimestamp >$versionTimestampFile
|
||||
echo "HotPocket devkit update completed !!"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Updating docker images..."
|
||||
docker pull $devkitImage &>/dev/null
|
||||
docker pull $instanceImage &>/dev/null
|
||||
|
||||
# Clear if there's already deployed cluster since they are outdated now.
|
||||
if docker inspect $deploymentContainerName &>/dev/null; then
|
||||
echo "Cleaning the deployed contracts..."
|
||||
teardownDeploymentCluster
|
||||
fi
|
||||
|
||||
echo "Update Completed !!"
|
||||
echo "NOTE: You need to re-deploy your contracts to make the new changes effective."
|
||||
}
|
||||
|
||||
function checkExistance() {
|
||||
command -v hpdevkit &>/dev/null && [ -f $scriptBinPath ] && [ -d $hpdevkitDataDir ] &&
|
||||
echo -e "hpdevkit is already installed on your host. \nUse the 'hpdevkit' start your local HotPocket testing." &&
|
||||
exit 1
|
||||
}
|
||||
|
||||
function online_version_timestamp() {
|
||||
# Send HTTP HEAD request and get last modified timestamp of the installer package or setup.sh.
|
||||
curl --silent --head $1 | grep 'Last-Modified:' | sed 's/[^ ]* //'
|
||||
}
|
||||
|
||||
function install() {
|
||||
checkExistance
|
||||
|
||||
if [[ ! -d $hpdevkitDataDir ]]; then
|
||||
! mkdir $hpdevkitDataDir && echo "Data path creation error." && exit 1
|
||||
fi
|
||||
|
||||
! createLauncher && echo "Launcher creation failed."
|
||||
|
||||
# Creating timestamp file
|
||||
local latestVersionTimestamp=$(online_version_timestamp $bashScriptUrl)
|
||||
echo $latestVersionTimestamp >$versionTimestampFile
|
||||
}
|
||||
|
||||
function uninstall() {
|
||||
# Remove deployment cluster if exist.
|
||||
if docker inspect $deploymentContainerName &>/dev/null; then
|
||||
echo "Cleaning the deployed contracts..."
|
||||
teardownDeploymentCluster
|
||||
fi
|
||||
|
||||
# Remove docker images if exist.
|
||||
if docker image inspect $devkitImage &>/dev/null; then
|
||||
echo "Removing devkit docker image..."
|
||||
docker image rm $devkitImage &>/dev/null
|
||||
fi
|
||||
if docker image inspect $instanceImage &>/dev/null; then
|
||||
echo "Removing instance docker image..."
|
||||
docker image rm $instanceImage &>/dev/null
|
||||
fi
|
||||
|
||||
echo "Removing binaries..."
|
||||
if [[ -d $hpdevkitDataDir ]]; then
|
||||
rm -r $hpdevkitDataDir
|
||||
fi
|
||||
|
||||
echo "Removing the launcher..."
|
||||
removeLauncher
|
||||
}
|
||||
|
||||
function is_user_root() {
|
||||
[ "$(id -u)" -ne 0 ] && echo "Please run with root privileges (sudo)." && exit 1
|
||||
}
|
||||
|
||||
echo "HotPocket devkit launcher ($version)"
|
||||
|
||||
funcCommand=$1
|
||||
helpMessage="\nAvailable commands: hpdevkit <COMMAND> <ARGUMENTS if any>
|
||||
\n COMMANDS:
|
||||
\n\tdeploy <Contract path>
|
||||
\n\tclean
|
||||
\n\tstart <Node number>
|
||||
\n\tstop <Node number>
|
||||
\n\tlogs <Node number>
|
||||
\n\tgen <Platform> <App type> <Project name>
|
||||
\n\tupdate
|
||||
\n\tuninstall
|
||||
\n\thelp"
|
||||
funcCommandError="Invalid command. Try 'hpdevkit help' for available commands."
|
||||
|
||||
if [ ! -z "$funcCommand" ]; then
|
||||
if [ "$funcCommand" == "gen" ]; then
|
||||
echo "Code generator"
|
||||
codeGenerator $2 $3 $4
|
||||
elif [ "$funcCommand" == "update" ]; then
|
||||
is_user_root
|
||||
echo "Checking for updates..."
|
||||
updateDevKit
|
||||
elif [ "$funcCommand" == "install" ]; then
|
||||
is_user_root
|
||||
echo "Installing..."
|
||||
install
|
||||
echo "Installation completed."
|
||||
echo -e $helpMessage
|
||||
elif [ "$funcCommand" == "uninstall" ]; then
|
||||
is_user_root
|
||||
echo "Unstalling hpdevkit..."
|
||||
uninstall
|
||||
echo -e "Unstallation Completed.\nThank you for using HotPocket devkit !"
|
||||
elif [ "$funcCommand" == "help" ]; then
|
||||
echo -e $helpMessage
|
||||
else
|
||||
echo "command: $funcCommand (cluster: $cluster)"
|
||||
if [ "$funcCommand" == "deploy" ]; then
|
||||
deploy "$2"
|
||||
elif [ "$funcCommand" == "clean" ]; then
|
||||
teardownDeploymentCluster
|
||||
elif [[ "$funcCommand" == "logs" || "$funcCommand" == "start" || "$funcCommand" == "stop" ]]; then
|
||||
AUTOREMOVE="true" MOUNTSOCK="true" ENTRYPOINT="cluster" CMD="$1 $2" devKitContainer run
|
||||
else
|
||||
echo "$funcCommandError"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo -e $helpMessage
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -1,43 +1,7 @@
|
||||
# HotPocket developer kit
|
||||
|
||||
Evernode uses HotPocket as its smart contract engine. HotPocket smart contracts can be developed using any POSIX-compliant language/framework. To make it easy to develop and test HotPocket smart contracts on your local PC, you can use HotPocket developer kit.
|
||||
|
||||
## Installation
|
||||
## Public documentation
|
||||
|
||||
### Prerequisites
|
||||
HotPocket developer kit requires you to install [Docker Engine](https://docs.docker.com/engine/install/) and [NodeJs](https://nodejs.org/en/) on your development machine.
|
||||
|
||||
### Supports cross platform
|
||||
This is a npm global package which supports both Linux and Windows
|
||||
1. Install [prerequisites](#prerequisites).
|
||||
2. Run the following command to install hpdevkit on your machine.
|
||||
```
|
||||
npm i -g hpdevkit
|
||||
```
|
||||
|
||||
## Updates
|
||||
Update `hpdevkit` to the latest and update the supporting docker images.
|
||||
|
||||
Run one of following commands to update hpdevkit.
|
||||
- Method 1 - Using hpdevkit CLI
|
||||
```
|
||||
hpdevkit update
|
||||
```
|
||||
|
||||
- Method 2 - Using npm
|
||||
```
|
||||
npm update -g hpdevkit
|
||||
```
|
||||
|
||||
**NOTE: You need to re-deploy your contracts to make the new changes effective.**
|
||||
|
||||
## Uninstall
|
||||
Uninstall `hpdevkit` and the supporting docker images and containers.
|
||||
|
||||
- Using hpdevkit CLI
|
||||
```
|
||||
hpdevkit uninstall
|
||||
```
|
||||
|
||||
**NOTE: Uninstalling from hpdevkit CLI is recommended. If you uninstall using npm you'll have to clean hpdevkit supporting docker images and containers manually.**
|
||||
|
||||
_**NOTE:** In Linux platforms, for Installation, Update and Uninstallation you'll need root privileges. Add `sudo` to above commands._
|
||||
https://github.com/EvernodeXRPL/evernode-sdk/blob/main/hpdevkit/index.md
|
||||
|
||||
1
windows/.gitignore
vendored
1
windows/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
*.exe
|
||||
@@ -1,268 +0,0 @@
|
||||
$GlobalPrefix = "hpdevkit"
|
||||
$Version = "0.1.0"
|
||||
|
||||
$Cluster = "default"
|
||||
$ClusterSize = if ($env:HP_CLUSTER_SIZE) { $env:HP_CLUSTER_SIZE } else { 3 };
|
||||
$DefaultNode = if ($env:HP_DEFAULT_NODE) { $env:HP_DEFAULT_NODE } else { 1 };
|
||||
$DevKitImage = if ($env:HP_DEVKIT_IMAGE) { $env:HP_DEVKIT_IMAGE } else { "evernodedev/hpdevkit" };
|
||||
$InstanceImage = if ($env:HP_INSTANCE_IMAGE) { $env:HP_INSTANCE_IMAGE } else { "evernodedev/hotpocket:0.6.0-ubt.20.04-njs.16" };
|
||||
$HpUserPortBegin = if ($env:HP_USER_PORT_BEGIN) { $env:HP_USER_PORT_BEGIN } else { 8081 };
|
||||
$HpPeerPortBegin = if ($env:HP_PEER_PORT_BEGIN) { $env:HP_PEER_PORT_BEGIN } else { 22861 };
|
||||
|
||||
$VolumeMount = "/$($GlobalPrefix)_vol"
|
||||
$Volume = "$($GlobalPrefix)_$($Cluster)_vol"
|
||||
$Network = "$($GlobalPrefix)_$($Cluster)_net"
|
||||
$ContainerPrefix = "$($GlobalPrefix)_$($Cluster)_node"
|
||||
$BundleMount = "$($VolumeMount)/contract_bundle"
|
||||
$DeploymentContainerName = "$($GlobalPrefix)_$($Cluster)_deploymgr"
|
||||
$CodegenContainerName = "$($GlobalPrefix)_codegen"
|
||||
$ConfigOverridesFile = "hp.cfg.override"
|
||||
$CodegenOutputDir = "/codegen-output"
|
||||
$CloudStorage = "https://stevernode.blob.core.windows.net/evernode-dev-bb7ec110-f72e-430e-b297-9210468a4cbb"
|
||||
$HPDevKitExeUrl = "$($CloudStorage)/hpdevkit-windows/hpdevkit.exe";
|
||||
$HPDevKitBackup = "\hpdevkit.exe.bak";
|
||||
$ExePath = (Get-Process -Id $pid).Path
|
||||
|
||||
function DevKitContainer([string]$Mode, [string]$Name, [switch]$Detached, [switch]$AutoRemove, [switch]$MountSock, [switch]$MountVolume, [string]$EntryPoint, [string]$RestartPolicy, [string]$Cmd, [switch]$Status) {
|
||||
|
||||
$Command = "docker $($Mode) -it"
|
||||
if ($Name) {
|
||||
$Command += " --name $($Name)"
|
||||
}
|
||||
if ($Detached) {
|
||||
$Command += " -d"
|
||||
}
|
||||
if ($AutoRemove) {
|
||||
$Command += " --rm"
|
||||
}
|
||||
if ($MountSock) {
|
||||
# We mount the host docker socket into the container so we can use it to issue commands to the docker host.
|
||||
# We use this ability to spin up other containers (HotPocket nodes) on the host.
|
||||
$Command += " --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock"
|
||||
}
|
||||
if ($MountVolume) {
|
||||
$Command += " --mount type=volume,src=$($Volume),dst=$($VolumeMount)"
|
||||
}
|
||||
|
||||
if ($EntryPoint) {
|
||||
$Command += " --entrypoint $($EntryPoint)"
|
||||
}
|
||||
else {
|
||||
$Command += " --entrypoint /bin/bash"
|
||||
}
|
||||
|
||||
if ($RestartPolicy) {
|
||||
$Command += " --restart $($RestartPolicy)"
|
||||
}
|
||||
|
||||
# Pass environment variables used by our scripts.
|
||||
$Command += " -e CLUSTER=$($Cluster) -e CLUSTER_SIZE=$($ClusterSize) -e DEFAULT_NODE=$($DefaultNode) -e VOLUME=$($Volume) -e NETWORK=$($Network)"
|
||||
$Command += " -e CONTAINER_PREFIX=$($ContainerPrefix) -e VOLUME_MOUNT=$($VolumeMount) -e BUNDLE_MOUNT=$($BundleMount) -e HOTPOCKET_IMAGE=$($InstanceImage)"
|
||||
$Command += " -e CONFIG_OVERRIDES_FILE=$($ConfigOverridesFile) -e CODEGEN_OUTPUT=$($CodegenOutputDir)"
|
||||
$Command += " -e HP_USER_PORT_BEGIN=$($HpUserPortBegin) -e HP_PEER_PORT_BEGIN=$($HpPeerPortBegin)"
|
||||
|
||||
$Command += " $($DevKitImage)"
|
||||
if ($Cmd) {
|
||||
if ($EntryPoint) {
|
||||
$Command += " $($Cmd)"
|
||||
}
|
||||
else {
|
||||
$Command += " -c '$($Cmd)'"
|
||||
}
|
||||
}
|
||||
|
||||
Invoke-Expression $Command 2>&1 | Write-Host
|
||||
|
||||
if ($Status) {
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
return $True
|
||||
}
|
||||
else {
|
||||
return $False
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function ExecuteInDeploymentContainer([string]$Cmd) {
|
||||
docker exec -it $DeploymentContainerName /bin/bash -c $Cmd
|
||||
}
|
||||
|
||||
function InitializeDeploymentCluster() {
|
||||
$Null = docker inspect $DeploymentContainerName *>&1
|
||||
if (! ($?)) {
|
||||
Write-Host "Initializing deployment cluster"
|
||||
|
||||
# Stop cluster if running. Create cluster if not exists.
|
||||
DevKitContainer -Mode "run" -AutoRemove -MountSock -Cmd "cluster stop ; cluster create"
|
||||
|
||||
# Spin up management container.
|
||||
DevKitContainer -Mode "run" -Name $DeploymentContainerName -Detached -MountSock -MountVolume -RestartPolicy "unless-stopped"
|
||||
|
||||
# Bind the instance mesh network config together.
|
||||
ExecuteInDeploymentContainer -Cmd "cluster bindmesh"
|
||||
}
|
||||
}
|
||||
|
||||
function TeardownDeploymentCluster() {
|
||||
$Null = docker stop $DeploymentContainerName *>&1
|
||||
$Null = docker rm $DeploymentContainerName *>&1
|
||||
DevKitContainer -Mode "run" -AutoRemove -MountSock -Cmd "cluster stop ; cluster destroy"
|
||||
}
|
||||
|
||||
Function Deploy([string]$Path) {
|
||||
|
||||
if ($Path) {
|
||||
|
||||
InitializeDeploymentCluster
|
||||
|
||||
# If copying a directory, delete target bundle directory. If not create empty target bundle directory to copy a file.
|
||||
$PrepareBundleDir = ""
|
||||
if ((Get-Item $Path) -is [System.IO.DirectoryInfo]) {
|
||||
$PrepareBundleDir = "rm -rf $($BundleMount)"
|
||||
}
|
||||
else {
|
||||
$PrepareBundleDir = "mkdir -p $($BundleMount) && rm -rf $($BundleMount)/* $($BundleMount)/.??*"
|
||||
}
|
||||
ExecuteInDeploymentContainer -Cmd $PrepareBundleDir
|
||||
docker cp $Path "$($DeploymentContainerName):$($BundleMount)"
|
||||
|
||||
# Sync contract bundle to all instance directories in the cluster.
|
||||
ExecuteInDeploymentContainer -Cmd "cluster stop ; cluster sync ; cluster start"
|
||||
|
||||
if ($DefaultNode -gt 0) {
|
||||
Write-Host "Streaming logs of node $($DefaultNode):"
|
||||
ExecuteInDeploymentContainer -Cmd "cluster logs $($DefaultNode)"
|
||||
}
|
||||
}
|
||||
else {
|
||||
Write-Host "Please specify directory or file path to deploy."
|
||||
}
|
||||
}
|
||||
|
||||
Function CodeGenerator() {
|
||||
$ProjName = $args[2]
|
||||
if (Test-Path -Path $ProjName) {
|
||||
"Directory '$($ProjName)' already exists."
|
||||
return
|
||||
}
|
||||
|
||||
if (DevKitContainer -Status -Mode "run" -Name $CodegenContainerName -EntryPoint "codegen" -Cmd "$($args[0]) $($args[1]) $($ProjName)") {
|
||||
docker cp "$($CodegenContainerName):$($CodegenOutputDir)" ./$ProjName
|
||||
Write-Host "Project '$($ProjName)' created."
|
||||
}
|
||||
docker rm "$($CodegenContainerName)" 2>&1 | Out-Null
|
||||
}
|
||||
|
||||
Function UpdateHPDevKit() {
|
||||
Write-Host "Checking for HotPocket devkit updates..."
|
||||
$ResHeaders = (Invoke-WebRequest -Uri $HPDevKitExeUrl -Method Head -UseBasicParsing).Headers
|
||||
$LastRemoteModifiedTime = [datetime]$ResHeaders["Last-Modified"]
|
||||
|
||||
$currentExeModifiedTime = [datetime]((Get-ItemProperty -Path "$($ExePath)\hpdevkit.exe" -Name LastWriteTime).LastWriteTime).ToUniversalTime()
|
||||
if ($ResHeaders["Last-Modified"]) {
|
||||
if ($LastRemoteModifiedTime -lt $currentExeModifiedTime) {
|
||||
Write-Host "Your HotPocket devkit is up to date."
|
||||
}
|
||||
else {
|
||||
Write-Host "An HotPocket devkit update is available."
|
||||
# Download the updated version.
|
||||
Write-Host "Downloading the update..."
|
||||
Invoke-WebRequest -Uri $HPDevKitExeUrl -OutFile "$($ExePath)\hpdevkit.exe.new"
|
||||
|
||||
# Swap the files.
|
||||
Rename-Item -Path "$($ExePath)\hpdevkit.exe" -NewName "$($ExePath)\$($HPDevKitBackup)"
|
||||
Rename-Item -Path "$($ExePath)\hpdevkit.exe.new" -NewName "$($ExePath)\hpdevkit.exe"
|
||||
Write-Host "HotPocket devkit update completed !!"
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
Write-Host "Could not check for hpdevkit updates. Online installer not found."
|
||||
}
|
||||
|
||||
## Pull the HPDevkit updated Docker Image from Docker Hub.
|
||||
Write-Host "Pulling the latest $DevKitImage Image."
|
||||
docker pull $DevKitImage
|
||||
|
||||
## Pull the updated Docker instance image from Docker Hub.
|
||||
Write-Host "Pulling the latest $InstanceImage Image."
|
||||
docker pull $InstanceImage
|
||||
|
||||
## Clear if there's already deployed cluster since they are outdated now.
|
||||
$Null = docker inspect $DeploymentContainerName *>&1
|
||||
if ($?) {
|
||||
Write-Host "Cleaning the deployed contracts."
|
||||
TeardownDeploymentCluster
|
||||
}
|
||||
|
||||
Write-Host "Update Completed !!"
|
||||
Write-Host "NOTE: You need to re-deploy your contracts to make the new changes effective."
|
||||
}
|
||||
|
||||
if ($ExePath.Contains('hpdevkit.exe')) {
|
||||
$ExePath = $ExePath.Replace("\hpdevkit.exe", "")
|
||||
}
|
||||
elseif ($ExePath.Contains('powershell.exe')) {
|
||||
# If Powershell script is used.
|
||||
$ExePath = $PSScriptRoot
|
||||
}
|
||||
|
||||
if (Test-Path -Path "$($ExePath)\$($HPDevKitBackup)") {
|
||||
# Removing the previous version backup file when launching the new version.
|
||||
Remove-Item "$($ExePath)\$($HPDevKitBackup)"
|
||||
}
|
||||
|
||||
Write-Host "HotPocket devkit launcher ($($Version))"
|
||||
|
||||
$Command = $args[0]
|
||||
$CommandError = "Invalid command. Try 'hpdevkit help' for available commands."
|
||||
$HelpMessage = "Available commands: hpdevkit <COMMAND> <ARGUMENTS if any>
|
||||
COMMANDS:
|
||||
deploy <Contract path>
|
||||
clean
|
||||
start <Node number>
|
||||
stop <Node number>
|
||||
logs <Node number>
|
||||
gen <Platform> <App type> <Project name>
|
||||
update
|
||||
help"
|
||||
|
||||
if ($Command) {
|
||||
|
||||
if ($Command -eq "gen") {
|
||||
Write-Host "Code generator"
|
||||
CodeGenerator $args[1] $args[2] $args[3]
|
||||
}
|
||||
elseif ($Command -eq "help") {
|
||||
Write-Host $HelpMessage
|
||||
}
|
||||
elseif ($Command -eq "update") {
|
||||
try {
|
||||
if (Test-Path -Path "$($ExePath)\hpdevkit.exe") {
|
||||
UpdateHPDevKit
|
||||
}
|
||||
else {
|
||||
Write-Host "No HotPocket devkit executable file was found."
|
||||
}
|
||||
}
|
||||
catch { "An error occurred while updating." }
|
||||
}
|
||||
else {
|
||||
Write-Host "command: $($Command) (cluster: $($Cluster))"
|
||||
if ($Command -eq "deploy") {
|
||||
Deploy -Path $args[1]
|
||||
}
|
||||
elseif ($Command -eq "clean") {
|
||||
TeardownDeploymentCluster
|
||||
}
|
||||
elseif ($Command -eq "logs" -OR $Command -eq "start" -OR $Command -eq "stop") {
|
||||
DevKitContainer -Mode "run" -AutoRemove -MountSock -EntryPoint "cluster" -Cmd "$($args)"
|
||||
}
|
||||
else {
|
||||
Write-Host $CommandError
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
Write-Host $CommandError
|
||||
}
|
||||
Reference in New Issue
Block a user