This commit is contained in:
ravinsp
2023-05-06 19:53:27 +05:30
parent 151596b2b3
commit f488153841
5 changed files with 29 additions and 698 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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
View File

@@ -1 +0,0 @@
*.exe

View File

@@ -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
}