sesterce-cli
Version:
A powerful command-line interface tool for managing Sesterce Cloud services. Sesterce CLI provides easy access to GPU cloud instances, AI inference services, container registries, and SSH key management directly from your terminal.
239 lines • 10.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createGpuCloudInstanceLaunchCommand = createGpuCloudInstanceLaunchCommand;
const list_docker_image_tags_1 = require("@/modules/docker/use-cases/list-docker-image-tags");
const list_docker_images_1 = require("@/modules/docker/use-cases/list-docker-images");
const launch_instance_1 = require("@/modules/gpu-cloud/use-cases/launch-instance");
const list_instance_offers_1 = require("@/modules/gpu-cloud/use-cases/list-instance-offers");
const list_volumes_1 = require("@/modules/gpu-cloud/use-cases/list-volumes");
const list_ssh_keys_1 = require("@/modules/ssh-keys/use-cases/list-ssh-keys");
const prompts_1 = require("@inquirer/prompts");
const luxon_1 = require("luxon");
const printOffer = (offer, regions) => {
return `${offer.gpuCount} x ${offer.gpuName} [${offer.deploymentType}] - vRAM ${offer.configuration.vRamGB}GB | vCPU ${offer.configuration.vCpu} | RAM ${offer.configuration.ramGB}GB - ${offer.cloud.name} - $${offer.hourlyPrice.toFixed(2)}/h in ${regions.map((region) => region.frontendName).join(", ")}`;
};
const printOfferShort = (offer) => {
return `${offer.gpuCount} x ${offer.gpuName} [${offer.deploymentType}] - vRAM ${offer.configuration.vRamGB}GB | vCPU ${offer.configuration.vCpu} | RAM ${offer.configuration.ramGB}GB - $${offer.hourlyPrice.toFixed(2)}/h`;
};
const printVolume = (volume) => {
return `${volume.name} (${volume.capacity} GB) | ${volume.availabilityZone} | ${volume.region.name} | $${volume.hourlyPrice.toFixed(2)}/hour`;
};
const printSSHKey = (sshKey) => {
return `${sshKey.isDefault ? "[Default] " : ""}${sshKey.name} (${luxon_1.DateTime.fromISO(sshKey.createdAt).toLocaleString(luxon_1.DateTime.DATETIME_FULL)})`;
};
const printDockerImage = (image) => {
return `${image.name} (${image.url})`;
};
function createGpuCloudInstanceLaunchCommand(gpuCloudInstanceCommand) {
gpuCloudInstanceCommand
.command("launch")
.description("Launch a GPU instance in Sesterce Cloud")
.action(async () => {
console.log("Loading instance offers...");
const result = await list_instance_offers_1.listGpuCloudOffers.execute();
if (result.isLeft()) {
console.error(result.value.message);
return;
}
const offers = result.value;
const offer = await (0, prompts_1.search)({
message: "Select an offer",
source: async (input, { signal }) => {
if (!input) {
return offers.map(({ offer, regions }) => ({
name: printOffer(offer, regions),
value: { ...offer, regions },
short: printOfferShort(offer),
}));
}
return offers
.filter(({ offer }) => offer.gpuName.toLowerCase().includes(input.toLowerCase()) ||
offer.gpuCount.toString().includes(input) ||
offer.deploymentType.toLowerCase().includes(input) ||
offer.availability.some(({ name }) => name.includes(input)))
.map(({ offer, regions }) => ({
name: printOffer(offer, regions),
value: { ...offer, regions },
short: printOfferShort(offer),
}));
},
});
const selectedRegion = await (0, prompts_1.search)({
message: "Select a region",
source: async (input, { signal }) => {
if (!input) {
return offer.regions.map((region) => ({
name: region.frontendName,
value: region,
}));
}
return offer.regions
.filter((region) => region.frontendName.toLowerCase().includes(input.toLowerCase()))
.map((region) => ({
name: region.frontendName,
value: region,
}));
},
});
console.log("Loading volumes...");
const volumesResult = await list_volumes_1.listGpuCloudVolumes.execute();
if (volumesResult.isLeft()) {
console.error(volumesResult.value.message);
return;
}
const availableVolumes = volumesResult.value.filter((volume) => volume.region.region === selectedRegion.region);
const volume = await (0, prompts_1.search)({
message: "Select a volume (optional)",
source: (input, { signal }) => {
if (availableVolumes.length === 0) {
return [{ value: null, name: "No volumes found" }];
}
if (!input) {
return availableVolumes.map((volume) => ({
name: printVolume(volume),
value: volume,
}));
}
return availableVolumes
.filter((volume) => volume.name.toLowerCase().includes(input.toLowerCase()) ||
volume.capacity.toString().includes(input) ||
volume.availabilityZone
.toLowerCase()
.includes(input.toLowerCase()) ||
volume.region.name.toLowerCase().includes(input.toLowerCase()))
.map((volume) => ({
name: printVolume(volume),
value: volume,
}));
},
});
const os = await (0, prompts_1.search)({
message: "Select an OS",
source: (input, { signal }) => {
if (!input) {
return offer.configuration.os.map((os) => ({
name: os,
value: os,
}));
}
return offer.configuration.os
.filter((os) => os.toLowerCase().includes(input.toLowerCase()))
.map((os) => ({
name: os,
value: os,
}));
},
});
console.log("Loading docker images...");
const dockerImages = await list_docker_images_1.listDockerImages.execute();
if (dockerImages.isLeft()) {
console.error(dockerImages.value.message);
return;
}
const dockerImage = await (0, prompts_1.search)({
message: "Select a Docker image (optional)",
source: (input, { signal }) => {
if (!input) {
return [
{ value: null, name: "None" },
...dockerImages.value.map((image) => ({
name: printDockerImage(image),
value: image,
})),
];
}
return [
{ value: null, name: "None" },
...dockerImages.value
.filter((image) => image.name.toLowerCase().includes(input.toLowerCase()))
.map((image) => ({
name: printDockerImage(image),
value: image,
})),
];
},
});
let dockerImageTag = null;
if (dockerImage) {
console.log("Loading docker image tags...");
const dockerImageTags = await list_docker_image_tags_1.listDockerImageTags.execute({
image: dockerImage.url,
});
if (dockerImageTags.isLeft()) {
console.error(dockerImageTags.value.message);
return;
}
dockerImageTag = await (0, prompts_1.search)({
message: "Select a tag for the docker image",
source: (input, { signal }) => {
if (!input) {
return [
{ value: dockerImage.tag, name: dockerImage.tag }, // default image tag
...dockerImageTags.value.map((tag) => ({
name: tag.name,
value: tag.name,
})),
];
}
return [
{ value: dockerImage.tag, name: dockerImage.tag }, // default image tag
...dockerImageTags.value
.filter((tag) => tag.name.toLowerCase().includes(input.toLowerCase()))
.map((tag) => ({
name: tag.name,
value: tag.name,
})),
];
},
});
}
console.log("Loading SSH keys...");
const sshKeys = await list_ssh_keys_1.listSSHKeys.execute();
if (sshKeys.isLeft()) {
console.error(sshKeys.value.message);
return;
}
const sshKey = await (0, prompts_1.search)({
message: "Select a SSH key",
source: (input, { signal }) => {
if (!input) {
return sshKeys.value.map((sshKey) => ({
name: printSSHKey(sshKey),
value: sshKey,
}));
}
return sshKeys.value
.filter((sshKey) => sshKey.name.toLowerCase().includes(input.toLowerCase()))
.map((sshKey) => ({
name: printSSHKey(sshKey),
value: sshKey,
}));
},
});
const instanceName = await (0, prompts_1.input)({
message: "Enter the name of the instance",
});
console.log("Launching instance, this may take a while...");
const launchInstanceResult = await launch_instance_1.launchInstance.execute({
name: instanceName,
cloudProvider: offer.cloud._id,
instanceId: offer.instanceId,
volumeId: volume === null || volume === void 0 ? void 0 : volume._id,
region: selectedRegion.region,
os,
dockerImage: dockerImage && dockerImageTag
? {
image: dockerImage.url,
tag: dockerImageTag,
}
: null,
sshKeyId: sshKey._id,
});
if (launchInstanceResult.isLeft()) {
console.error(launchInstanceResult.value.message);
return;
}
console.log(`Instance ${launchInstanceResult.value.name} launched successfully! Instance ID: ${launchInstanceResult.value._id}`);
});
}
//# sourceMappingURL=launch.js.map