Skip to content

Commit

Permalink
Merge pull request #235 from golemfactory/feature/JST-1059/one-of
Browse files Browse the repository at this point in the history
feat: added example of using `oneOf` to nodejs template
  • Loading branch information
grisha87 authored Aug 28, 2024
2 parents ad1d561 + 82e008d commit f6b8ebb
Show file tree
Hide file tree
Showing 4 changed files with 216 additions and 92 deletions.
77 changes: 54 additions & 23 deletions data/project-templates/js-node-esm/src/index.js
Original file line number Diff line number Diff line change
@@ -1,56 +1,87 @@
import "dotenv/config";
import { GolemNetwork } from "@golem-sdk/golem-js";

const order = {
demand: {
workload: { imageTag: "golem/alpine:latest" },
},
market: {
// 15 minutes
rentHours: 15 / 60,
pricing: {
model: "linear",
maxStartPrice: 0.5,
maxCpuPerHourPrice: 1.0,
maxEnvPerHourPrice: 0.5,
},
},
};

(async () => {
// Initialize a new GolemNetwork instance,
// you can also pass additional options here like logger or api key
const glm = new GolemNetwork();

try {
// Connect to the Golem network using the Yagna node
await glm.connect();
// create a pool that can grow up to 3 rentals at the same time

// Define the specifications for a market order
const order = {
demand: {
// Specify workload options such as image tag from golem registry
// or other criteria for rented machines
workload: { imageTag: "golem/alpine:latest" },
},
market: {
// Specify the rental time (15 minutes)
rentHours: 15 / 60,
pricing: {
// Pricing model set to linear
model: "linear",
// Set the maximum starting price
maxStartPrice: 0.5,
// Set the maximum price per CPU per hour
maxCpuPerHourPrice: 1.0,
// Set the maximum price per environment per hour
maxEnvPerHourPrice: 0.5,
},
},
};

// Create a pool that can handle up to 3 rentals simultaneously
const pool = await glm.manyOf({
poolSize: 3,
order,
});

console.log("Starting work on Golem!");

console.log("Running three different commands on a pool of three rented machines");

// Execute three tasks concurrently, each on a different rented machine in the pool
await Promise.allSettled([
pool.withRental(async (rental) =>
rental
.getExeUnit()
.then((exe) => exe.run("echo Hello, Golem from the first machine! πŸ‘‹"))
.then((res) => console.log(res.stdout)),
.then((exe) => exe.run(`echo Hello Golem from provider ${exe.provider.name} 😻`))
.then((res) => console.log(res.stdout))
.catch((err) => console.error(`Something went wrong:`, err)),
),
pool.withRental(async (rental) =>
rental
.getExeUnit()
.then((exe) => exe.run("echo Hello, Golem from the second machine! πŸ‘‹"))
.then((res) => console.log(res.stdout)),
.then((exe) => exe.run(`echo Hello Golem from provider ${exe.provider.name} 🀠`))
.then((res) => console.log(res.stdout))
.catch((err) => console.error(`Something went wrong:`, err)),
),
pool.withRental(async (rental) =>
rental
.getExeUnit()
.then((exe) => exe.run("echo Hello, Golem from the third machine! πŸ‘‹"))
.then((res) => console.log(res.stdout)),
.then((exe) => exe.run(`echo Hello Golem from provider ${exe.provider.name} πŸ‘»`))
.then((res) => console.log(res.stdout))
.catch((err) => console.error(`Something went wrong:`, err)),
),
]);

console.log("Running a command on a single rented machine");

// Acquire a single rental, execute a command, and log the output or an error
const singleRental = await glm.oneOf({ order });
await singleRental
.getExeUnit()
.then((exe) => exe.run(`echo Hello Golem from provider ${exe.provider.name} πŸ‘½`))
.then((res) => console.log(res.stdout))
.catch((err) => console.error(`Something went wrong:`, err));
} catch (err) {
console.error("Something went wrong:", err);
} finally {
// Disconnect from the Golem Network.
// This will clear the rental pools and finalize and pay all rentals that were created within the Golem Network
await glm.disconnect();
}
})().catch(console.error);
77 changes: 54 additions & 23 deletions data/project-templates/js-node/src/index.js
Original file line number Diff line number Diff line change
@@ -1,56 +1,87 @@
require("dotenv").config();
const { GolemNetwork } = require("@golem-sdk/golem-js");

const order = {
demand: {
workload: { imageTag: "golem/alpine:latest" },
},
market: {
// 15 minutes
rentHours: 15 / 60,
pricing: {
model: "linear",
maxStartPrice: 0.5,
maxCpuPerHourPrice: 1.0,
maxEnvPerHourPrice: 0.5,
},
},
};

(async () => {
// Initialize a new GolemNetwork instance,
// you can also pass additional options here like logger or api key
const glm = new GolemNetwork();

try {
// Connect to the Golem network using the Yagna node
await glm.connect();
// create a pool that can grow up to 3 rentals at the same time

// Define the specifications for a market order
const order = {
demand: {
// Specify workload options such as image tag from golem registry
// or other criteria for rented machines
workload: { imageTag: "golem/alpine:latest" },
},
market: {
// Specify the rental time (15 minutes)
rentHours: 15 / 60,
pricing: {
// Pricing model set to linear
model: "linear",
// Set the maximum starting price
maxStartPrice: 0.5,
// Set the maximum price per CPU per hour
maxCpuPerHourPrice: 1.0,
// Set the maximum price per environment per hour
maxEnvPerHourPrice: 0.5,
},
},
};

// Create a pool that can handle up to 3 rentals simultaneously
const pool = await glm.manyOf({
poolSize: 3,
order,
});

console.log("Starting work on Golem!");

console.log("Running three different commands on a pool of three rented machines");

// Execute three tasks concurrently, each on a different rented machine in the pool
await Promise.allSettled([
pool.withRental(async (rental) =>
rental
.getExeUnit()
.then((exe) => exe.run("echo Hello, Golem from the first machine! πŸ‘‹"))
.then((res) => console.log(res.stdout)),
.then((exe) => exe.run(`echo Hello Golem from provider ${exe.provider.name} 😻`))
.then((res) => console.log(res.stdout))
.catch((err) => console.error(`Something went wrong:`, err)),
),
pool.withRental(async (rental) =>
rental
.getExeUnit()
.then((exe) => exe.run("echo Hello, Golem from the second machine! πŸ‘‹"))
.then((res) => console.log(res.stdout)),
.then((exe) => exe.run(`echo Hello Golem from provider ${exe.provider.name} 🀠`))
.then((res) => console.log(res.stdout))
.catch((err) => console.error(`Something went wrong:`, err)),
),
pool.withRental(async (rental) =>
rental
.getExeUnit()
.then((exe) => exe.run("echo Hello, Golem from the third machine! πŸ‘‹"))
.then((res) => console.log(res.stdout)),
.then((exe) => exe.run(`echo Hello Golem from provider ${exe.provider.name} πŸ‘»`))
.then((res) => console.log(res.stdout))
.catch((err) => console.error(`Something went wrong:`, err)),
),
]);

console.log("Running a command on a single rented machine");

// Acquire a single rental, execute a command, and log the output or an error
const singleRental = await glm.oneOf({ order });
await singleRental
.getExeUnit()
.then((exe) => exe.run(`echo Hello Golem from provider ${exe.provider.name} πŸ‘½`))
.then((res) => console.log(res.stdout))
.catch((err) => console.error(`Something went wrong:`, err));
} catch (err) {
console.error("Something went wrong:", err);
} finally {
// Disconnect from the Golem Network.
// This will clear the rental pools and finalize and pay all rentals that were created within the Golem Network
await glm.disconnect();
}
})().catch(console.error);
77 changes: 54 additions & 23 deletions data/project-templates/ts-node-esm/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,56 +1,87 @@
import "dotenv/config";
import { GolemNetwork, MarketOrderSpec } from "@golem-sdk/golem-js";

const order: MarketOrderSpec = {
demand: {
workload: { imageTag: "golem/alpine:latest" },
},
market: {
// 15 minutes
rentHours: 15 / 60,
pricing: {
model: "linear",
maxStartPrice: 0.5,
maxCpuPerHourPrice: 1.0,
maxEnvPerHourPrice: 0.5,
},
},
};

(async () => {
// Initialize a new GolemNetwork instance,
// you can also pass additional options here like logger or api key
const glm = new GolemNetwork();

try {
// Connect to the Golem network using the Yagna node
await glm.connect();
// create a pool that can grow up to 3 rentals at the same time

// Define the specifications for a market order
const order: MarketOrderSpec = {
demand: {
// Specify workload options such as image tag from golem registry
// or other criteria for rented machines
workload: { imageTag: "golem/alpine:latest" },
},
market: {
// Specify the rental time (15 minutes)
rentHours: 15 / 60,
pricing: {
// Pricing model set to linear
model: "linear",
// Set the maximum starting price
maxStartPrice: 0.5,
// Set the maximum price per CPU per hour
maxCpuPerHourPrice: 1.0,
// Set the maximum price per environment per hour
maxEnvPerHourPrice: 0.5,
},
},
};

// Create a pool that can handle up to 3 rentals simultaneously
const pool = await glm.manyOf({
poolSize: 3,
order,
});

console.log("Starting work on Golem!");

console.log("Running three different commands on a pool of three rented machines");

// Execute three tasks concurrently, each on a different rented machine in the pool
await Promise.allSettled([
pool.withRental(async (rental) =>
rental
.getExeUnit()
.then((exe) => exe.run("echo Hello, Golem from the first machine! πŸ‘‹"))
.then((res) => console.log(res.stdout)),
.then((exe) => exe.run(`echo Hello Golem from provider ${exe.provider.name} 😻`))
.then((res) => console.log(res.stdout))
.catch((err) => console.error(`Something went wrong:`, err)),
),
pool.withRental(async (rental) =>
rental
.getExeUnit()
.then((exe) => exe.run("echo Hello, Golem from the second machine! πŸ‘‹"))
.then((res) => console.log(res.stdout)),
.then((exe) => exe.run(`echo Hello Golem from provider ${exe.provider.name} 🀠`))
.then((res) => console.log(res.stdout))
.catch((err) => console.error(`Something went wrong:`, err)),
),
pool.withRental(async (rental) =>
rental
.getExeUnit()
.then((exe) => exe.run("echo Hello, Golem from the third machine! πŸ‘‹"))
.then((res) => console.log(res.stdout)),
.then((exe) => exe.run(`echo Hello Golem from provider ${exe.provider.name} πŸ‘»`))
.then((res) => console.log(res.stdout))
.catch((err) => console.error(`Something went wrong:`, err)),
),
]);

console.log("Running a command on a single rented machine");

// Acquire a single rental, execute a command, and log the output or an error
const singleRental = await glm.oneOf({ order });
await singleRental
.getExeUnit()
.then((exe) => exe.run(`echo Hello Golem from provider ${exe.provider.name} πŸ‘½`))
.then((res) => console.log(res.stdout))
.catch((err) => console.error(`Something went wrong:`, err));
} catch (err) {
console.error("Something went wrong:", err);
} finally {
// Disconnect from the Golem Network.
// This will clear the rental pools and finalize and pay all rentals that were created within the Golem Network
await glm.disconnect();
}
})().catch(console.error);
Loading

0 comments on commit f6b8ebb

Please sign in to comment.