소스 검색

accept-distribution-bucket-invitation

Leszek Wiesner 3 년 전
부모
커밋
ac62d24856

+ 8 - 2
distributor-node/scripts/test-commands.sh

@@ -18,5 +18,11 @@ ${CLI} leader:update-dynamic-bag-policy -t Member -p ${FAMILY_ID}:5
 ${CLI} leader:update-dynamic-bag-policy -t Member
 ${CLI} leader:invite-bucket-operator -f ${FAMILY_ID} -B ${BUCKET_ID} -w 0
 ${CLI} leader:cancel-invitation -f ${FAMILY_ID} -B ${BUCKET_ID} -w 0
-${CLI} leader:delete-bucket -f ${FAMILY_ID} -B ${BUCKET_ID}
-${CLI} leader:delete-bucket-family -f ${FAMILY_ID}
+${CLI} leader:invite-bucket-operator -f ${FAMILY_ID} -B ${BUCKET_ID} -w 0
+${CLI} operator:accept-invitation -f ${FAMILY_ID} -B ${BUCKET_ID} -w 0
+
+# Deletion commands tested separately, since bucket operator removal is not yet supported
+FAMILY_TO_DELETE_ID=`${CLI} leader:create-bucket-family ${CONFIG}`
+BUCKET_TO_DELETE_ID=`${CLI} leader:create-bucket -f ${FAMILY_TO_DELETE_ID} -a yes`
+${CLI} leader:delete-bucket -f ${FAMILY_TO_DELETE_ID} -B ${BUCKET_TO_DELETE_ID}
+${CLI} leader:delete-bucket-family -f ${FAMILY_TO_DELETE_ID}

+ 8 - 0
distributor-node/src/command-base/accounts.ts

@@ -50,6 +50,14 @@ export default abstract class AccountsCommandBase extends ApiCommandBase {
     return worker.role_account_id.toString()
   }
 
+  async getDistributorWorkerRoleKey(workerId: number): Promise<string> {
+    const worker = await this.api.query.distributionWorkingGroup.workerById(workerId)
+    if (!worker) {
+      throw new CLIError(`Worker not found by id: ${workerId}!`)
+    }
+    return worker.role_account_id.toString()
+  }
+
   async init(): Promise<void> {
     await super.init()
     await this.initKeyring()

+ 38 - 0
distributor-node/src/commands/operator/accept-invitation.ts

@@ -0,0 +1,38 @@
+import AccountsCommandBase from '../../command-base/accounts'
+import DefaultCommandBase, { flags } from '../../command-base/default'
+
+export default class OperatorAcceptInvitation extends AccountsCommandBase {
+  static description = `Accept pending distribution bucket operator invitation.
+  Requires the invited distribution group worker role key.`
+
+  static flags = {
+    bucketId: flags.integer({
+      char: 'B',
+      description: 'Distribution bucket id',
+      required: true,
+    }),
+    familyId: flags.integer({
+      char: 'f',
+      description: 'Distribution bucket family id',
+      required: true,
+    }),
+    workerId: flags.integer({
+      char: 'w',
+      description: 'ID of the invited operator (distribution group worker)',
+      required: true,
+    }),
+    ...DefaultCommandBase.flags,
+  }
+
+  async run(): Promise<void> {
+    const { bucketId, familyId, workerId } = this.parse(OperatorAcceptInvitation).flags
+    const workerKey = await this.getDistributorWorkerRoleKey(workerId)
+
+    this.log(`Accepting distribution bucket operator invitation (bucket: ${bucketId}, worker: ${workerId})...`)
+    await this.sendAndFollowTx(
+      await this.getDecodedPair(workerKey),
+      this.api.tx.storage.acceptDistributionBucketInvitation(workerId, familyId, bucketId)
+    )
+    this.log('Invitation succesfully accepted!')
+  }
+}