Procházet zdrojové kódy

Merge pull request #2399 from ondratra/query_node_working_group_leader

query node - working group leader support
Mokhtar Naamani před 3 roky
rodič
revize
297ac10a62

+ 64 - 16
query-node/generated/types/gateway-working-group.ts

@@ -9,7 +9,7 @@ import {
   OpeningId,
   RationaleText,
   RewardPolicy,
-  WorkerId
+  WorkerId,
 } from "@joystream/types/augment";
 import { Bytes, Option, bool } from "@polkadot/types";
 
@@ -50,13 +50,13 @@ export namespace GatewayWorkingGroup {
 
     get workerId(): WorkerId {
       return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
-        this.ctx.params[0].value
+        this.ctx.params[0].value,
       ]);
     }
 
     get bytes(): Bytes {
       return createTypeUnsafe<Bytes & Codec>(typeRegistry, "Bytes", [
-        this.ctx.params[1].value
+        this.ctx.params[1].value,
       ]);
     }
   }
@@ -71,7 +71,7 @@ export namespace GatewayWorkingGroup {
   export class OpeningFilledEvent {
     public readonly expectedParamTypes = [
       "OpeningId",
-      "ApplicationIdToWorkerIdMap"
+      "ApplicationIdToWorkerIdMap",
     ];
 
     constructor(public readonly ctx: SubstrateEvent) {}
@@ -99,7 +99,7 @@ export namespace GatewayWorkingGroup {
 
     get openingId(): OpeningId {
       return createTypeUnsafe<OpeningId & Codec>(typeRegistry, "OpeningId", [
-        this.ctx.params[0].value
+        this.ctx.params[0].value,
       ]);
     }
 
@@ -147,7 +147,7 @@ export namespace GatewayWorkingGroup {
 
     get workerId(): WorkerId {
       return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
-        this.ctx.params[0].value
+        this.ctx.params[0].value,
       ]);
     }
 
@@ -195,7 +195,55 @@ export namespace GatewayWorkingGroup {
 
     get workerId(): WorkerId {
       return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
-        this.ctx.params[0].value
+        this.ctx.params[0].value,
+      ]);
+    }
+
+    get rationaleText(): RationaleText {
+      return createTypeUnsafe<RationaleText & Codec>(
+        typeRegistry,
+        "RationaleText",
+        [this.ctx.params[1].value]
+      );
+    }
+  }
+  /**
+   *  Emits on terminating the leader.
+   *  Params:
+   *  - leader worker id.
+   *  - termination rationale text
+   *
+   *  Event parameters: [WorkerId, RationaleText, ]
+   */
+  export class TerminatedLeaderEvent {
+    public readonly expectedParamTypes = ["WorkerId", "RationaleText"];
+
+    constructor(public readonly ctx: SubstrateEvent) {}
+
+    get data(): TerminatedLeader_Params {
+      return new TerminatedLeader_Params(this.ctx);
+    }
+
+    validateParams(): boolean {
+      if (this.expectedParamTypes.length !== this.ctx.params.length) {
+        return false;
+      }
+      let valid = true;
+      this.expectedParamTypes.forEach((type, i) => {
+        if (type !== this.ctx.params[i].type) {
+          valid = false;
+        }
+      });
+      return valid;
+    }
+  }
+
+  class TerminatedLeader_Params {
+    constructor(public readonly ctx: SubstrateEvent) {}
+
+    get workerId(): WorkerId {
+      return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
+        this.ctx.params[0].value,
       ]);
     }
 
@@ -245,13 +293,13 @@ export namespace GatewayWorkingGroup {
 
     get workerId(): WorkerId {
       return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
-        this.extrinsic.args[0].value
+        this.extrinsic.args[0].value,
       ]);
     }
 
     get storage(): Bytes {
       return createTypeUnsafe<Bytes & Codec>(typeRegistry, "Bytes", [
-        this.extrinsic.args[1].value
+        this.extrinsic.args[1].value,
       ]);
     }
   }
@@ -264,7 +312,7 @@ export namespace GatewayWorkingGroup {
     public readonly expectedArgTypes = [
       "OpeningId",
       "ApplicationIdSet",
-      "Option<RewardPolicy>"
+      "Option<RewardPolicy>",
     ];
 
     constructor(public readonly ctx: SubstrateEvent) {
@@ -297,7 +345,7 @@ export namespace GatewayWorkingGroup {
 
     get openingId(): OpeningId {
       return createTypeUnsafe<OpeningId & Codec>(typeRegistry, "OpeningId", [
-        this.extrinsic.args[0].value
+        this.extrinsic.args[0].value,
       ]);
     }
 
@@ -354,13 +402,13 @@ export namespace GatewayWorkingGroup {
 
     get workerId(): WorkerId {
       return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
-        this.extrinsic.args[0].value
+        this.extrinsic.args[0].value,
       ]);
     }
 
     get rationaleText(): Bytes {
       return createTypeUnsafe<Bytes & Codec>(typeRegistry, "Bytes", [
-        this.extrinsic.args[1].value
+        this.extrinsic.args[1].value,
       ]);
     }
   }
@@ -402,19 +450,19 @@ export namespace GatewayWorkingGroup {
 
     get workerId(): WorkerId {
       return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
-        this.extrinsic.args[0].value
+        this.extrinsic.args[0].value,
       ]);
     }
 
     get rationaleText(): Bytes {
       return createTypeUnsafe<Bytes & Codec>(typeRegistry, "Bytes", [
-        this.extrinsic.args[1].value
+        this.extrinsic.args[1].value,
       ]);
     }
 
     get slashStake(): bool {
       return createTypeUnsafe<bool & Codec>(typeRegistry, "bool", [
-        this.extrinsic.args[2].value
+        this.extrinsic.args[2].value,
       ]);
     }
   }

+ 64 - 16
query-node/generated/types/storage-working-group.ts

@@ -9,7 +9,7 @@ import {
   OpeningId,
   RationaleText,
   RewardPolicy,
-  WorkerId
+  WorkerId,
 } from "@joystream/types/augment";
 import { Bytes, Option, bool } from "@polkadot/types";
 
@@ -50,13 +50,13 @@ export namespace StorageWorkingGroup {
 
     get workerId(): WorkerId {
       return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
-        this.ctx.params[0].value
+        this.ctx.params[0].value,
       ]);
     }
 
     get bytes(): Bytes {
       return createTypeUnsafe<Bytes & Codec>(typeRegistry, "Bytes", [
-        this.ctx.params[1].value
+        this.ctx.params[1].value,
       ]);
     }
   }
@@ -71,7 +71,7 @@ export namespace StorageWorkingGroup {
   export class OpeningFilledEvent {
     public readonly expectedParamTypes = [
       "OpeningId",
-      "ApplicationIdToWorkerIdMap"
+      "ApplicationIdToWorkerIdMap",
     ];
 
     constructor(public readonly ctx: SubstrateEvent) {}
@@ -99,7 +99,7 @@ export namespace StorageWorkingGroup {
 
     get openingId(): OpeningId {
       return createTypeUnsafe<OpeningId & Codec>(typeRegistry, "OpeningId", [
-        this.ctx.params[0].value
+        this.ctx.params[0].value,
       ]);
     }
 
@@ -147,7 +147,7 @@ export namespace StorageWorkingGroup {
 
     get workerId(): WorkerId {
       return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
-        this.ctx.params[0].value
+        this.ctx.params[0].value,
       ]);
     }
 
@@ -195,7 +195,55 @@ export namespace StorageWorkingGroup {
 
     get workerId(): WorkerId {
       return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
-        this.ctx.params[0].value
+        this.ctx.params[0].value,
+      ]);
+    }
+
+    get rationaleText(): RationaleText {
+      return createTypeUnsafe<RationaleText & Codec>(
+        typeRegistry,
+        "RationaleText",
+        [this.ctx.params[1].value]
+      );
+    }
+  }
+  /**
+   *  Emits on terminating the leader.
+   *  Params:
+   *  - leader worker id.
+   *  - termination rationale text
+   *
+   *  Event parameters: [WorkerId, RationaleText, ]
+   */
+  export class TerminatedLeaderEvent {
+    public readonly expectedParamTypes = ["WorkerId", "RationaleText"];
+
+    constructor(public readonly ctx: SubstrateEvent) {}
+
+    get data(): TerminatedLeader_Params {
+      return new TerminatedLeader_Params(this.ctx);
+    }
+
+    validateParams(): boolean {
+      if (this.expectedParamTypes.length !== this.ctx.params.length) {
+        return false;
+      }
+      let valid = true;
+      this.expectedParamTypes.forEach((type, i) => {
+        if (type !== this.ctx.params[i].type) {
+          valid = false;
+        }
+      });
+      return valid;
+    }
+  }
+
+  class TerminatedLeader_Params {
+    constructor(public readonly ctx: SubstrateEvent) {}
+
+    get workerId(): WorkerId {
+      return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
+        this.ctx.params[0].value,
       ]);
     }
 
@@ -245,13 +293,13 @@ export namespace StorageWorkingGroup {
 
     get workerId(): WorkerId {
       return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
-        this.extrinsic.args[0].value
+        this.extrinsic.args[0].value,
       ]);
     }
 
     get storage(): Bytes {
       return createTypeUnsafe<Bytes & Codec>(typeRegistry, "Bytes", [
-        this.extrinsic.args[1].value
+        this.extrinsic.args[1].value,
       ]);
     }
   }
@@ -264,7 +312,7 @@ export namespace StorageWorkingGroup {
     public readonly expectedArgTypes = [
       "OpeningId",
       "ApplicationIdSet",
-      "Option<RewardPolicy>"
+      "Option<RewardPolicy>",
     ];
 
     constructor(public readonly ctx: SubstrateEvent) {
@@ -297,7 +345,7 @@ export namespace StorageWorkingGroup {
 
     get openingId(): OpeningId {
       return createTypeUnsafe<OpeningId & Codec>(typeRegistry, "OpeningId", [
-        this.extrinsic.args[0].value
+        this.extrinsic.args[0].value,
       ]);
     }
 
@@ -354,13 +402,13 @@ export namespace StorageWorkingGroup {
 
     get workerId(): WorkerId {
       return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
-        this.extrinsic.args[0].value
+        this.extrinsic.args[0].value,
       ]);
     }
 
     get rationaleText(): Bytes {
       return createTypeUnsafe<Bytes & Codec>(typeRegistry, "Bytes", [
-        this.extrinsic.args[1].value
+        this.extrinsic.args[1].value,
       ]);
     }
   }
@@ -402,19 +450,19 @@ export namespace StorageWorkingGroup {
 
     get workerId(): WorkerId {
       return createTypeUnsafe<WorkerId & Codec>(typeRegistry, "WorkerId", [
-        this.extrinsic.args[0].value
+        this.extrinsic.args[0].value,
       ]);
     }
 
     get rationaleText(): Bytes {
       return createTypeUnsafe<Bytes & Codec>(typeRegistry, "Bytes", [
-        this.extrinsic.args[1].value
+        this.extrinsic.args[1].value,
       ]);
     }
 
     get slashStake(): bool {
       return createTypeUnsafe<bool & Codec>(typeRegistry, "bool", [
-        this.extrinsic.args[2].value
+        this.extrinsic.args[2].value,
       ]);
     }
   }

+ 11 - 1
query-node/manifest.yml

@@ -58,11 +58,13 @@ typegen:
     - storage_working_group.OpeningFilled
     - storage_working_group.TerminatedWorker
     - storage_working_group.WorkerExited
+    - storage_working_group.TerminatedLeader
 
     - gateway_working_group.WorkerStorageUpdated
     - gateway_working_group.OpeningFilled
     - gateway_working_group.TerminatedWorker
     - gateway_working_group.WorkerExited
+    - gateway_working_group.TerminatedLeader
   calls:
     # members
     - members.buyMembership
@@ -202,6 +204,7 @@ mappings:
     #  handler: data_directory_ContentUploadingStatusUpdated(DatabaseManager, SubstrateEvent)
 
     # working groups
+    ## storage - workers
     - event: storageWorkingGroup.WorkerStorageUpdated
       handler: storageWorkingGroup_WorkerStorageUpdated(DatabaseManager, SubstrateEvent)
     - event: storageWorkingGroup.OpeningFilled
@@ -211,8 +214,11 @@ mappings:
     - event: storageWorkingGroup.WorkerExited
       handler: storageWorkingGroup_WorkerExited(DatabaseManager, SubstrateEvent)
 
+    ## storage - leader
+    - event: storageWorkingGroup.TerminatedLeader
+      handler: storageWorkingGroup_TerminatedLeader(DatabaseManager, SubstrateEvent)
 
-
+    ## gateway - workers
     - event: gatewayWorkingGroup.WorkerStorageUpdated
       handler: gatewayWorkingGroup_WorkerStorageUpdated(DatabaseManager, SubstrateEvent)
     - event: gatewayWorkingGroup.OpeningFilled
@@ -222,6 +228,10 @@ mappings:
     - event: gatewayWorkingGroup.WorkerExited
       handler: gatewayWorkingGroup_WorkerExited(DatabaseManager, SubstrateEvent)
 
+    ## gateway - leader
+    - event: gatewayWorkingGroup.TerminatedLeader
+      handler: gatewayWorkingGroup_TerminatedLeader(DatabaseManager, SubstrateEvent)
+
   extrinsicHandlers:
     # infer defaults here
     #- extrinsic: Balances.Transfer

+ 42 - 14
query-node/mappings/src/workingGroup.ts

@@ -57,6 +57,14 @@ export async function storageWorkingGroup_WorkerExited(db: DatabaseManager, even
   await workingGroup_WorkerExited(db, WorkerType.STORAGE, workerId)
 }
 
+export async function storageWorkingGroup_TerminatedLeader(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
+  // read event data
+  const {workerId} = new StorageWorkingGroup.TerminatedLeaderEvent(event).data
+
+  // call generic processing
+  await workingGroup_TerminatedLeader(db, WorkerType.STORAGE, workerId)
+}
+
 /////////////////// Gateway working group //////////////////////////////////////
 
 export async function gatewayWorkingGroup_OpeningFilled(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
@@ -77,7 +85,7 @@ export async function gatewayWorkingGroup_WorkerStorageUpdated(db: DatabaseManag
 
 export async function gatewayWorkingGroup_TerminatedWorker(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
   // read event data
-  const {workerId} = new StorageWorkingGroup.TerminatedWorkerEvent(event).data
+  const {workerId} = new GatewayWorkingGroup.TerminatedWorkerEvent(event).data
 
   // call generic processing
   await workingGroup_TerminatedWorker(db, WorkerType.GATEWAY, workerId)
@@ -85,12 +93,20 @@ export async function gatewayWorkingGroup_TerminatedWorker(db: DatabaseManager,
 
 export async function gatewayWorkingGroup_WorkerExited(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
   // read event data
-  const {workerId} = new StorageWorkingGroup.WorkerExitedEvent(event).data
+  const {workerId} = new GatewayWorkingGroup.WorkerExitedEvent(event).data
 
   // call generic processing
   await workingGroup_WorkerExited(db, WorkerType.GATEWAY, workerId)
 }
 
+export async function gatewayWorkingGroup_TerminatedLeader(db: DatabaseManager, event: SubstrateEvent): Promise<void> {
+  // read event data
+  const {workerId} = new GatewayWorkingGroup.TerminatedLeaderEvent(event).data
+
+  // call generic processing
+  await workingGroup_TerminatedLeader(db, WorkerType.GATEWAY, workerId)
+}
+
 /////////////////// Generic working group processing ///////////////////////////
 
 export async function workingGroup_OpeningFilled(
@@ -101,18 +117,11 @@ export async function workingGroup_OpeningFilled(
   const workerIds = [...applicationIdToWorkerIdMap.values()]
 
   for (const workerId of workerIds) {
-    // create new worker
-    const newWorker = new Worker({
-      workerId: workerId.toString(),
-      type: workerType,
-      isActive: true,
-    })
-
-    await db.save<Worker>(newWorker)
+    await createWorker(db, workerId, workerType)
   }
 
   // emit log event
-  logger.info("Worker has been created", {ids: workerIds.map(item => item.toString()), workerType})
+  logger.info("Workers have been created", {ids: workerIds.map(item => item.toString()), workerType})
 }
 
 export async function workingGroup_WorkerStorageUpdated(db: DatabaseManager, workerType: WorkerType, workerId: WorkerId, newMetadata: Bytes): Promise<void> {
@@ -134,7 +143,7 @@ export async function workingGroup_WorkerStorageUpdated(db: DatabaseManager, wor
   await db.save<Worker>(worker)
 
   // emit log event
-  logger.info("Storage provider has been updated", {workerId, workerType})
+  logger.info("Worker has been updated", {workerId, workerType})
 }
 
 export async function workingGroup_TerminatedWorker(db: DatabaseManager, workerType: WorkerType, workerId: WorkerId): Promise<void> {
@@ -142,7 +151,7 @@ export async function workingGroup_TerminatedWorker(db: DatabaseManager, workerT
   await deactivateWorker(db, workerType, workerId)
 
   // emit log event
-  logger.info("Storage provider has beed removed (worker terminated)", {workerId, workerType})
+  logger.info("Worker has been removed (worker terminated)", {workerId, workerType})
 }
 
 export async function workingGroup_WorkerExited(db: DatabaseManager, workerType: WorkerType, workerId: WorkerId): Promise<void> {
@@ -150,11 +159,30 @@ export async function workingGroup_WorkerExited(db: DatabaseManager, workerType:
   await deactivateWorker(db, workerType, workerId)
 
   // emit log event
-  logger.info("Storage provider has beed removed (worker exited)", {workerId, workerType})
+  logger.info("Worker has been removed (worker exited)", {workerId, workerType})
+}
+
+export async function workingGroup_TerminatedLeader(db: DatabaseManager, workerType: WorkerType, workerId: WorkerId): Promise<void> {
+  // do removal logic
+  await deactivateWorker(db, workerType, workerId)
+
+  // emit log event
+  logger.info("Working group leader has been removed (worker exited)", {workerId, workerType})
 }
 
 /////////////////// Helpers ////////////////////////////////////////////////////
 
+async function createWorker(db: DatabaseManager, workerId: WorkerId, workerType: WorkerType): Promise<void> {
+  // create new worker
+  const newWorker = new Worker({
+    workerId: workerId.toString(),
+    type: workerType,
+    isActive: true,
+  })
+
+  await db.save<Worker>(newWorker)
+}
+
 async function deactivateWorker(db: DatabaseManager, workerType: WorkerType, workerId: WorkerId) {
   // load worker
   const worker = await db.get(Worker, {