Skip to content

Commit

Permalink
Merge branch 'development' into development_2.6
Browse files Browse the repository at this point in the history
  • Loading branch information
AhmedHanafy725 committed Jun 11, 2024
2 parents d9a3d28 + 408184e commit ae864d9
Show file tree
Hide file tree
Showing 39 changed files with 1,047 additions and 188 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/grid_client_nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ jobs:
- uses: actions/checkout@v4
if: ${{ env.NETWORK == 'qa' }}
with:
ref: refs/tags/v2.3.5
ref: refs/tags/v2.4.3
- uses: actions/checkout@v4
if: ${{ env.NETWORK == 'test' }}
with:
ref: refs/tags/v2.3.5
ref: refs/tags/v2.4.3
- uses: actions/checkout@v4
if: ${{ env.NETWORK == 'main' }}
with:
ref: refs/tags/v2.3.5
ref: refs/tags/v2.4.3

- name: Set up node 18
uses: actions/setup-node@v3
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/mass_deployments.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ jobs:

steps:
- uses: actions/checkout@v4
with:
ref: refs/tags/v2.4.3
- name: Set up node 18
uses: actions/setup-node@v3
with:
Expand Down
2 changes: 1 addition & 1 deletion lerna.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"version": "2.5.0-rc1",
"version": "2.5.0-rc2",
"npmClient": "yarn"
}
2 changes: 1 addition & 1 deletion packages/UI/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@threefold/ui",
"version": "2.5.0-rc1",
"version": "2.5.0-rc2",
"private": false,
"main": "dist/threefold-ui.umd.js",
"publishConfig": {
Expand Down
4 changes: 2 additions & 2 deletions packages/graphql_client/package.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"name": "@threefold/graphql_client",
"version": "2.5.0-rc1",
"version": "2.5.0-rc2",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"license": "MIT",
"scripts": {
"build": "tsc"
},
"dependencies": {
"@threefold/types": "^2.5.0-rc1",
"@threefold/types": "^2.5.0-rc2",
"ts-mixer": "^6.0.2"
},
"devDependencies": {
Expand Down
8 changes: 4 additions & 4 deletions packages/grid_client/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@threefold/grid_client",
"author": "Ahmed Hanafy",
"version": "2.5.0-rc1",
"version": "2.5.0-rc2",
"license": "ISC",
"homepage": "https://github.com/threefoldtech/tfgrid-sdk-ts/tree/development/packages/grid_client/README.md",
"repository": {
Expand All @@ -14,9 +14,9 @@
"dependencies": {
"@jimber/pkid": "1.0.4",
"@noble/secp256k1": "^1.7.1",
"@threefold/rmb_direct_client": "^2.5.0-rc1",
"@threefold/tfchain_client": "^2.5.0-rc1",
"@threefold/types": "^2.5.0-rc1",
"@threefold/rmb_direct_client": "^2.5.0-rc2",
"@threefold/tfchain_client": "^2.5.0-rc2",
"@threefold/types": "^2.5.0-rc2",
"algosdk": "^1.19.0",
"appdata-path": "^1.0.0",
"await-lock": "^2.2.2",
Expand Down
240 changes: 240 additions & 0 deletions packages/grid_client/tests/modules/applications/casperlabs.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,240 @@
import axios from "axios";
import { setTimeout } from "timers/promises";

import { FilterOptions, GatewayNameModel, generateString, GridClient, MachinesModel, randomChoice } from "../../../src";
import { config, getClient } from "../../client_loader";
import { bytesToGB, generateInt, getOnlineNode, log, splitIP } from "../../utils";

jest.setTimeout(900000);

let gridClient: GridClient;
let deploymentName: string;

beforeAll(async () => {
gridClient = await getClient();
deploymentName = "cl" + generateString(10);
gridClient.clientOptions.projectName = `casperlabs/${deploymentName}`;
gridClient._connect();
return gridClient;
});

//Private IP Regex
const ipRegex = /(^127\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)/;

test("TC2683 - Applications: Deploy Casperlabs", async () => {
/**********************************************
Test Suite: Grid3_Client_TS (Automated)
Test Cases: TC2683 - Applications: Deploy Casperlabs
Scenario:
- Generate Test Data/casperlabs Config/Gateway Config.
- Select a Node To Deploy the casperlabs on.
- Select a Gateway Node To Deploy the gateway on.
- Deploy the casperlabs solution.
- Assert that the generated data matches
the deployment details.
- Pass the IP of the Created casperlabs to the Gateway
Config.
- Deploy the Gateway.
- Assert that the generated data matches
the deployment details.
- Assert that the Gateway points at the IP
of the created casperlabs.
- Assert that the returned domain is working
and returns correct data.
**********************************************/

//Test Data
const name = "gw" + generateString(10).toLowerCase();
const tlsPassthrough = false;
const cpu = 2;
const memory = 4;
const rootfsSize = 2;
const diskSize = 100;
const networkName = generateString(15);
const vmName = generateString(15);
const diskName = generateString(15);
const mountPoint = "/data";
const publicIp = false;
const ipRangeClassA = "10." + generateInt(1, 255) + ".0.0/16";
const ipRangeClassB = "172." + generateInt(16, 31) + ".0.0/16";
const ipRangeClassC = "192.168.0.0/16";
const ipRange = randomChoice([ipRangeClassA, ipRangeClassB, ipRangeClassC]);
const metadata = "{'deploymentType': 'casperlabs'}";
const description = "test deploying Casperlabs via ts grid3 client";

//GatewayNode Selection
const gatewayNodes = await gridClient.capacity.filterNodes({
gateway: true,
farmId: 1,
availableFor: await gridClient.twins.get_my_twin_id(),
} as FilterOptions);
if (gatewayNodes.length == 0) throw new Error("no gateway nodes available to complete this test");
const GatewayNode = gatewayNodes[generateInt(0, gatewayNodes.length - 1)];

//Node Selection
const nodes = await gridClient.capacity.filterNodes({
cru: cpu,
mru: memory,
sru: rootfsSize + diskSize,
farmId: 1,
availableFor: await gridClient.twins.get_my_twin_id(),
} as FilterOptions);
const nodeId = await getOnlineNode(nodes);
if (nodeId == -1) throw new Error("no nodes available to complete this test");
const domain = name + "." + GatewayNode.publicConfig.domain;

//VM Model
const vms: MachinesModel = {
name: deploymentName,
network: {
name: networkName,
ip_range: ipRange,
},
machines: [
{
name: vmName,
node_id: nodeId,
cpu: cpu,
memory: 1024 * memory,
rootfs_size: rootfsSize,
disks: [
{
name: diskName,
size: diskSize,
mountpoint: mountPoint,
},
],
flist: "https://hub.grid.tf/tf-official-apps/casperlabs-latest.flist",
entrypoint: "/sbin/zinit init",
public_ip: publicIp,
planetary: true,
mycelium: false,
env: {
SSH_KEY: config.ssh_key,
CASPERLABS_HOSTNAME: domain,
},
},
],
metadata: metadata,
description: description,
};
const res = await gridClient.machines.deploy(vms);
log(res);

//Contracts Assertions
expect(res.contracts.created).toHaveLength(1);
expect(res.contracts.updated).toHaveLength(0);
expect(res.contracts.deleted).toHaveLength(0);

const vmsList = await gridClient.machines.list();
log(vmsList);

//VM List Assertions
expect(vmsList.length).toBeGreaterThanOrEqual(1);
expect(vmsList).toContain(vms.name);

const result = await gridClient.machines.getObj(vms.name);
log(result);

//VM Assertions
expect(result[0].nodeId).toBe(nodeId);
expect(result[0].status).toBe("ok");
expect(result[0].flist).toBe(vms.machines[0].flist);
expect(result[0].entrypoint).toBe(vms.machines[0].entrypoint);
expect(result[0].mounts).toHaveLength(1);
expect(result[0].interfaces[0]["network"]).toBe(vms.network.name);
expect(result[0].interfaces[0]["ip"]).toContain(splitIP(vms.network.ip_range));
expect(result[0].interfaces[0]["ip"]).toMatch(ipRegex);
expect(result[0].capacity["cpu"]).toBe(cpu);
expect(result[0].capacity["memory"]).toBe(memory * 1024);
expect(result[0].planetary).toBeDefined();
expect(result[0].publicIP).toBeNull();
expect(result[0].description).toBe(description);
expect(result[0].rootfs_size).toBe(bytesToGB(rootfsSize));
expect(result[0].mounts[0]["name"]).toBe(diskName);
expect(result[0].mounts[0]["size"]).toBe(bytesToGB(diskSize));
expect(result[0].mounts[0]["mountPoint"]).toBe(mountPoint);
expect(result[0].mounts[0]["state"]).toBe("ok");

const backends = ["http://[" + result[0].planetary + "]:80"];
log(backends);

//Name Gateway Model
const gw: GatewayNameModel = {
name: name,
node_id: GatewayNode.nodeId,
tls_passthrough: tlsPassthrough,
backends: backends,
};

const gatewayRes = await gridClient.gateway.deploy_name(gw);
log(gatewayRes);

//Contracts Assertions
expect(gatewayRes.contracts.created).toHaveLength(1);
expect(gatewayRes.contracts.updated).toHaveLength(0);
expect(gatewayRes.contracts.deleted).toHaveLength(0);
expect(gatewayRes.contracts.created[0].contractType.nodeContract.nodeId).toBe(GatewayNode.nodeId);

const gatewayResult = await gridClient.gateway.getObj(gw.name);
log(gatewayResult);

//Gateway Assertions
expect(gatewayResult[0].name).toBe(name);
expect(gatewayResult[0].status).toBe("ok");
expect(gatewayResult[0].type).toContain("name");
expect(gatewayResult[0].domain).toContain(name);
expect(gatewayResult[0].tls_passthrough).toBe(tlsPassthrough);
expect(gatewayResult[0].backends).toStrictEqual(backends);

const site = "https://" + gatewayResult[0].domain;
let reachable = false;

for (let i = 0; i < 180; i++) {
const wait = await setTimeout(5000, "Waiting for gateway to be ready");
log(wait);

await axios
.get(site)
.then(res => {
log("gateway is reachable");
log(res.status);
log(res.statusText);
log(res.data);
expect(res.status).toBe(200);
expect(res.statusText).toBe("OK");
expect(res.data).toContain("Your Casper node is now running succesfully on the ThreeFold Grid.");
reachable = true;
})
.catch(() => {
log("gateway is not reachable");
});
if (reachable) {
break;
} else if (i == 180) {
throw new Error("Gateway is unreachable after multiple retries");
}
}
});

afterAll(async () => {
const vmNames = await gridClient.machines.list();
for (const name of vmNames) {
const res = await gridClient.machines.delete({ name });
log(res);
expect(res.created).toHaveLength(0);
expect(res.updated).toHaveLength(0);
expect(res.deleted).toBeDefined();
}

const gwNames = await gridClient.gateway.list();
for (const name of gwNames) {
const res = await gridClient.gateway.delete_name({ name });
log(res);
expect(res.created).toHaveLength(0);
expect(res.updated).toHaveLength(0);
expect(res.deleted).toBeDefined();
}

return await gridClient.disconnect();
}, 130000);
Loading

0 comments on commit ae864d9

Please sign in to comment.