UNPKG

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.

103 lines (91 loc) 3.27 kB
import { GpuCloudVolumeOffer, GpuCloudVolumeOfferRegion, } from "@/modules/gpu-cloud/domain/volume-offer"; import { createGpuCloudVolume } from "@/modules/gpu-cloud/use-cases/create-volume"; import { listGpuCloudVolumeOffers } from "@/modules/gpu-cloud/use-cases/list-volume-offers"; import { input, number, search } from "@inquirer/prompts"; import type { Command } from "commander"; const printVolumeOffer = ( offer: GpuCloudVolumeOffer, region: GpuCloudVolumeOfferRegion ) => { return `${offer.provider} - ${region.name} - Min size ${region.minSizeInGb}GB - $${region.pricePerGbPerHour.toFixed(6)}/GB/hour`; }; export function createGpuCloudVolumeCreateCommand( gpuCloudVolumeCommand: Command ) { gpuCloudVolumeCommand .command("create") .description("Create a new GPU Cloud volume") .action(async () => { console.log("Listing GPU Cloud volume offers..."); const offersResult = await listGpuCloudVolumeOffers.execute(); if (offersResult.isLeft()) { console.error(offersResult.value.message); return; } const offers = offersResult.value; offers.sort((a, b) => a.provider.localeCompare(b.provider)); const selectedOffer = await search({ message: "Select a GPU Cloud volume offer", source: (input, { signal }) => { if (!input) { return offers.flatMap((offer) => offer.regions.map((region) => ({ name: printVolumeOffer(offer, region), value: { offer, region, }, })) ); } return offers.flatMap((offer) => offer.regions .filter( (region) => region.name.toLowerCase().includes(input.toLowerCase()) || region.region?.toLowerCase().includes(input.toLowerCase()) || region.minSizeInGb.toString().includes(input) || region.pricePerGbPerHour.toString().includes(input) ) .map((region) => ({ name: printVolumeOffer(offer, region), value: { offer, region, }, })) ); }, }); const name = await input({ message: "Enter the name of the volume", default: "my-volume", }); const size = await number({ message: `Enter the size of the volume in GB (min: ${selectedOffer.region.minSizeInGb} GB)`, default: selectedOffer.region.minSizeInGb, }); if (size && size < selectedOffer.region.minSizeInGb) { console.error( `Size must be at least ${selectedOffer.region.minSizeInGb} GB` ); return; } const result = await createGpuCloudVolume.execute({ name, sizeInGb: size ?? selectedOffer.region.minSizeInGb, cloudProvider: selectedOffer.offer.availabilityZone._id, region: selectedOffer.region.region!, }); if (result.isLeft()) { console.error(result.value.message); return; } console.log( `Volume created successfully! Volume ID: ${result.value._id}` ); }); }