Skip to content

Commit ad7b5e7

Browse files
authored
feat!: add datacenter and resource tests, print offer-info to stdout (#1096)
* feat: add datacenter and resource tests * use sign for txs in tests * fix * add test for new resources * add resource update * use different commit * temporary override addrs * fix * fix * remove unnecessary setTryTimeout * add checks that all metadata is updated * update to the latest compute-marketplace * use latest
1 parent 33720de commit ad7b5e7

File tree

14 files changed

+808
-226
lines changed

14 files changed

+808
-226
lines changed

packages/cli/package/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
"whatwg-url": "^14.0.0"
5757
},
5858
"dependencies": {
59-
"@fluencelabs/deal-ts-clients": "0.23.2-feat-marketplace-v2-resources-eb89b78-7511-1.0",
59+
"@fluencelabs/deal-ts-clients": "0.23.2-feat-marketplace-v2-resources-a3ae33d-7546-1.0",
6060
"@kubernetes/client-node": "github:fluencelabs/kubernetes-client-javascript#e72ee00a52fec4eb4a8327632895d888ee504f4d",
6161
"@libp2p/crypto": "4.0.1",
6262
"@libp2p/peer-id-factory": "4.0.5",

packages/cli/package/src/commands/provider/deal-exit.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,13 @@ export default class DealExit extends BaseCommand<typeof DealExit> {
121121
continue;
122122
}
123123

124-
await signBatch(
125-
`Remove the following workers from deal ${dealId}:\n\n${workers
124+
await signBatch({
125+
title: `Remove the following workers from deal ${dealId}:\n\n${workers
126126
.map(({ worker: { onchainId } }) => {
127127
return onchainId;
128128
})
129129
.join("\n")}`,
130-
[
130+
populatedTxs: [
131131
populateTx(
132132
firstWorker.deal.removeWorker,
133133
firstWorker.worker.onchainId,
@@ -136,7 +136,7 @@ export default class DealExit extends BaseCommand<typeof DealExit> {
136136
return populateTx(deal.removeWorker, onchainId);
137137
}),
138138
],
139-
);
139+
});
140140
}
141141
}
142142
}

packages/cli/package/src/commands/provider/offer-info.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@ export default class OfferInfo extends BaseCommand<typeof OfferInfo> {
3838
const { flags } = await initCli(this, await this.parse(OfferInfo));
3939
const offers = await resolveCreatedOffers(flags);
4040
const offerInfoResult = await getOffersInfo(offers);
41-
commandObj.logToStderr(await offersInfoToString(offerInfoResult));
41+
commandObj.log(await offersInfoToString(offerInfoResult));
4242
}
4343
}

packages/cli/package/src/lib/chain/commitment.ts

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -336,14 +336,14 @@ export async function createCommitments(flags: PeerAndOfferNameFlags) {
336336
let createCommitmentsTxReceipts;
337337

338338
try {
339-
createCommitmentsTxReceipts = await signBatch(
340-
`Create commitments for the following peers:\n\n${computePeers
339+
createCommitmentsTxReceipts = await signBatch({
340+
title: `Create commitments for the following peers:\n\n${computePeers
341341
.map(({ name, peerId }) => {
342342
return `Peer: ${name}\nPeerId: ${peerId}`;
343343
})
344344
.join("\n\n")}`,
345-
[firstCommitmentTx, ...restCommitmentTxs],
346-
);
345+
populatedTxs: [firstCommitmentTx, ...restCommitmentTxs],
346+
});
347347
} catch (e) {
348348
const errorString = stringifyUnknown(e);
349349

@@ -440,9 +440,9 @@ export async function removeCommitments(flags: CCFlags) {
440440
},
441441
).join("\n\n");
442442

443-
await signBatch(
444-
`Remove the following commitments:\n\n${CCsWithWaitDelegationStatusString}`,
445-
[
443+
await signBatch({
444+
title: `Remove the following commitments:\n\n${CCsWithWaitDelegationStatusString}`,
445+
populatedTxs: [
446446
populateTx(
447447
contracts.diamond.removeCommitment,
448448
firstCCWithWaitDelegationStatus.ccId,
@@ -451,7 +451,7 @@ export async function removeCommitments(flags: CCFlags) {
451451
return populateTx(contracts.diamond.removeCommitment, ccId);
452452
}),
453453
],
454-
);
454+
});
455455

456456
commandObj.logToStderr(
457457
`Removed commitments:\n\n${CCsWithWaitDelegationStatusString}`,
@@ -573,10 +573,13 @@ export async function collateralWithdraw(
573573

574574
if (firstMoveResourcesFromDealTx !== undefined) {
575575
try {
576-
await signBatch(
577-
`Moving resources from the following deals:\n${dealsString}`,
578-
[firstMoveResourcesFromDealTx, ...restMoveResourcesFromDealTxs],
579-
);
576+
await signBatch({
577+
title: `Moving resources from the following deals:\n${dealsString}`,
578+
populatedTxs: [
579+
firstMoveResourcesFromDealTx,
580+
...restMoveResourcesFromDealTxs,
581+
],
582+
});
580583
} catch (e) {
581584
commandObj.warn(
582585
`Wasn't able to move resources from deals for ${stringifyBasicCommitmentInfo(commitment)}. Most likely the reason is you must wait until the provider exits from all the following deals:\n${dealsString}`,
@@ -609,22 +612,23 @@ export async function collateralWithdraw(
609612
},
610613
);
611614

612-
await signBatch(
613-
`${firstNotExitedUnit === undefined ? "Finish" : "Remove compute units from capacity commitments and finish"} commitment ${peerName === undefined ? ccId : `for ${peerName} (${ccId})`} ${ccId}`,
614-
firstNotExitedUnit === undefined
615-
? [populateTx(contracts.diamond.finishCommitment, ccId)]
616-
: [
617-
populateTx(contracts.diamond.removeCUFromCC, ccId, [
618-
firstNotExitedUnit.unitId,
619-
]),
620-
...restNotExitedUnits.map(({ unitId }) => {
621-
return populateTx(contracts.diamond.removeCUFromCC, ccId, [
622-
unitId,
623-
]);
624-
}),
625-
populateTx(contracts.diamond.finishCommitment, ccId),
626-
],
627-
);
615+
await signBatch({
616+
title: `${firstNotExitedUnit === undefined ? "Finish" : "Remove compute units from capacity commitments and finish"} commitment ${peerName === undefined ? ccId : `for ${peerName} (${ccId})`} ${ccId}`,
617+
populatedTxs:
618+
firstNotExitedUnit === undefined
619+
? [populateTx(contracts.diamond.finishCommitment, ccId)]
620+
: [
621+
populateTx(contracts.diamond.removeCUFromCC, ccId, [
622+
firstNotExitedUnit.unitId,
623+
]),
624+
...restNotExitedUnits.map(({ unitId }) => {
625+
return populateTx(contracts.diamond.removeCUFromCC, ccId, [
626+
unitId,
627+
]);
628+
}),
629+
populateTx(contracts.diamond.finishCommitment, ccId),
630+
],
631+
});
628632
}
629633
}
630634

@@ -633,19 +637,19 @@ export async function collateralRewardWithdraw(flags: CCFlags) {
633637
const [firstCommitment, ...restCommitments] = commitments;
634638
const { contracts } = await getContracts();
635639

636-
await signBatch(
637-
`Withdraw rewards for commitments:\n\n${commitments
640+
await signBatch({
641+
title: `Withdraw rewards for commitments:\n\n${commitments
638642
.map(({ ccId }) => {
639643
return ccId;
640644
})
641645
.join("\n")}`,
642-
[
646+
populatedTxs: [
643647
populateTx(contracts.diamond.withdrawReward, firstCommitment.ccId),
644648
...restCommitments.map(({ ccId }) => {
645649
return populateTx(contracts.diamond.withdrawReward, ccId);
646650
}),
647651
],
648-
);
652+
});
649653
}
650654

651655
export function stringifyBasicCommitmentInfo({

packages/cli/package/src/lib/chain/offer/offer.ts

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -637,16 +637,15 @@ async function formatOfferInfo(
637637
"Created At": offerIndexerInfo.createdAt,
638638
"Last Updated At": offerIndexerInfo.updatedAt,
639639
"Resource Prices": await Promise.all(
640-
(offerIndexerInfo.resources ?? []).map(
640+
(offerIndexerInfo.offerResources ?? []).map(
641641
async ({
642-
resourceId,
643642
resourcePrice,
644-
resource: { type, metadata },
643+
resourceDescription: { type, metadata, id },
645644
}) => {
646645
const resourceType = onChainResourceTypeToResourceType(type);
647646
return {
648647
"Resource Type": resourceType,
649-
"Resource ID": resourceId,
648+
"Resource ID": id,
650649
Metadata: metadata,
651650
Price: await ptFormatWithSymbol(
652651
resourceType === "cpu"
@@ -789,16 +788,16 @@ export async function resolveOffersFromProviderConfig(
789788
const offersNotDefinedLocally = await Promise.all(
790789
offerInfos.map(async ({ offerId, offerIndexerInfo }) => {
791790
const resourcePricesWithIds = (
792-
offerIndexerInfo.resources ?? []
791+
offerIndexerInfo.offerResources ?? []
793792
).reduce<ResourcePricesWithIds>(
794-
(acc, { resourceId, resourcePrice, resource: { type } }) => {
793+
(acc, { resourcePrice, resourceDescription: { type, id } }) => {
795794
const resourceType = onChainResourceTypeToResourceType(type);
796795

797796
acc[resourceType].push({
798797
ty: type,
799798
resourceType,
800-
resourceId,
801-
resourceName: resourceId,
799+
resourceId: id,
800+
resourceName: id,
802801
price: resourcePrice,
803802
});
804803

@@ -1325,18 +1324,24 @@ type OfferIndexerInfo = Awaited<ReturnType<typeof getOffers>>["offers"][number];
13251324
function indexerResourcesToOnchainResources(
13261325
resourceType: ResourceType,
13271326
resources: NonNullable<
1328-
NonNullable<OfferIndexerInfo["peers"]>[number]["resources"]
1327+
NonNullable<OfferIndexerInfo["peers"]>[number]["peerResources"]
13291328
>,
13301329
offerId: string,
13311330
): [OnChainResource, ...OnChainResource[]] {
13321331
const [firstResource, ...restResources] = resources
1333-
.filter(({ resource: { type } }) => {
1332+
.filter(({ resourceDescription: { type } }) => {
13341333
return onChainResourceTypeToResourceType(type) === resourceType;
13351334
})
1336-
.map(({ details, resource: { id: resourceId, metadata }, maxSupply }) => {
1337-
assertIsHex(resourceId, `Invalid Resource ID for offer ${offerId}`);
1338-
return { resourceId, supply: Number(maxSupply), details, metadata };
1339-
});
1335+
.map(
1336+
({
1337+
details,
1338+
resourceDescription: { id: resourceId, metadata },
1339+
maxSupply,
1340+
}) => {
1341+
assertIsHex(resourceId, `Invalid Resource ID for offer ${offerId}`);
1342+
return { resourceId, supply: Number(maxSupply), details, metadata };
1343+
},
1344+
);
13401345

13411346
if (firstResource === undefined) {
13421347
throw new Error(
@@ -1349,8 +1354,8 @@ function indexerResourcesToOnchainResources(
13491354

13501355
function serializeOfferInfo(offerIndexerInfo: OfferIndexerInfo) {
13511356
const serializedPeers =
1352-
offerIndexerInfo.peers?.map(({ id, computeUnits, resources }) => {
1353-
if (resources === null || resources === undefined) {
1357+
offerIndexerInfo.peers?.map(({ id, computeUnits, peerResources }) => {
1358+
if (peerResources === null || peerResources === undefined) {
13541359
throw new Error(
13551360
`Resources for peer ${id} are not found in indexer for offer ${offerIndexerInfo.id}`,
13561361
);
@@ -1359,27 +1364,27 @@ function serializeOfferInfo(offerIndexerInfo: OfferIndexerInfo) {
13591364
const resourcesByType = {
13601365
cpu: indexerResourcesToOnchainResources(
13611366
"cpu",
1362-
resources,
1367+
peerResources,
13631368
offerIndexerInfo.id,
13641369
)[0],
13651370
ram: indexerResourcesToOnchainResources(
13661371
"ram",
1367-
resources,
1372+
peerResources,
13681373
offerIndexerInfo.id,
13691374
)[0],
13701375
storage: indexerResourcesToOnchainResources(
13711376
"storage",
1372-
resources,
1377+
peerResources,
13731378
offerIndexerInfo.id,
13741379
),
13751380
ip: indexerResourcesToOnchainResources(
13761381
"ip",
1377-
resources,
1382+
peerResources,
13781383
offerIndexerInfo.id,
13791384
)[0],
13801385
bandwidth: indexerResourcesToOnchainResources(
13811386
"bandwidth",
1382-
resources,
1387+
peerResources,
13831388
offerIndexerInfo.id,
13841389
)[0],
13851390
} as const satisfies Record<
@@ -1416,15 +1421,10 @@ function serializeOfferInfo(offerIndexerInfo: OfferIndexerInfo) {
14161421
freeComputeUnits: offerIndexerInfo.computeUnitsAvailable,
14171422
providerId: offerIndexerInfo.provider.id,
14181423
peers: serializedPeers,
1419-
resources: offerIndexerInfo.resources?.map(({ price, resource }) => {
1420-
const resourceId = resource.id;
1421-
1422-
assertIsHex(
1423-
resourceId,
1424-
`Invalid Resource ID for offer ${offerIndexerInfo.id}`,
1425-
);
1426-
1427-
return { resourceId, resourcePrice: BigInt(price), resource };
1428-
}),
1424+
offerResources: offerIndexerInfo.offerResources?.map(
1425+
({ price, resourceDescription }) => {
1426+
return { resourcePrice: BigInt(price), resourceDescription };
1427+
},
1428+
),
14291429
};
14301430
}

packages/cli/package/src/lib/chain/offer/updateOffers.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,15 +122,15 @@ export async function updateOffers(flags: OffersArgs) {
122122
return;
123123
}
124124

125-
await signBatch(
126-
`Updating offers:\n\n${populatedTxs
125+
await signBatch({
126+
title: `Updating offers:\n\n${populatedTxs
127127
.map(({ offerName, offerId }) => {
128128
return `${offerName} (${offerId})`;
129129
})
130130
.join("\n")}`,
131-
[firstUpdateOffersTx, ...restUpdateOffersTxs],
132-
assertProviderIsRegistered,
133-
);
131+
populatedTxs: [firstUpdateOffersTx, ...restUpdateOffersTxs],
132+
validateAddress: assertProviderIsRegistered,
133+
});
134134

135135
const peersToDeploy = populatedTxs.flatMap(({ txs }) => {
136136
return txs.flatMap(({ peersToDeploy }) => {
@@ -190,15 +190,15 @@ export async function removeOffers(flags: OffersArgs) {
190190
return;
191191
}
192192

193-
await signBatch(
194-
`Removing offers:\n\n${populatedTxs
193+
await signBatch({
194+
title: `Removing offers:\n\n${populatedTxs
195195
.map(({ offerName, offerId }) => {
196196
return `${offerName} (${offerId})`;
197197
})
198198
.join("\n")}`,
199-
[firstRemoveOffersTx, ...restRemoveOffersTxs],
200-
assertProviderIsRegistered,
201-
);
199+
populatedTxs: [firstRemoveOffersTx, ...restRemoveOffersTxs],
200+
validateAddress: assertProviderIsRegistered,
201+
});
202202

203203
const providerArtifactsConfig = await initNewProviderArtifactsConfig();
204204

@@ -494,9 +494,9 @@ async function populateChangeResourcePriceTx({
494494
);
495495

496496
const prevResourcePriceChanges = await Promise.all(
497-
(offerIndexerInfo.resources ?? []).map(
498-
async ({ resourceId, resourcePrice }) => {
499-
const newResource = allResourcePrices[resourceId];
497+
(offerIndexerInfo.offerResources ?? []).map(
498+
async ({ resourceDescription: { id }, resourcePrice }) => {
499+
const newResource = allResourcePrices[id];
500500

501501
if (newResource === undefined) {
502502
return null;
@@ -516,7 +516,7 @@ async function populateChangeResourcePriceTx({
516516
tx: populateTx(
517517
contracts.diamond.changeResourcePriceV2,
518518
offerId,
519-
resourceId,
519+
id,
520520
newPrice,
521521
),
522522
};
@@ -527,8 +527,8 @@ async function populateChangeResourcePriceTx({
527527
const newResources = await Promise.all(
528528
resourcePricesWithIdsArr.map(
529529
async ({ price, resourceId, resourceName, resourceType }) => {
530-
const onChainResource = offerIndexerInfo.resources?.find((r) => {
531-
return r.resourceId === resourceId;
530+
const onChainResource = offerIndexerInfo.offerResources?.find((r) => {
531+
return r.resourceDescription.id === resourceId;
532532
});
533533

534534
if (onChainResource !== undefined) {

0 commit comments

Comments
 (0)