فهرست منبع

storage-node-v2: Add ‘UpdateBag’ command.

- it runs the `updateStorageBucketsForBag` extrinsic.
Shamil Gadelshin 3 سال پیش
والد
کامیت
2fc8bb3914

+ 32 - 13
storage-node-v2/README.md

@@ -29,8 +29,9 @@ USAGE
 # Commands
 <!-- commands -->
 * [`storage-node help [COMMAND]`](#storage-node-help-command)
-* [`storage-node wg:leader:create-bucket`](#storage-node-wgleadercreate-bucket)
-* [`storage-node wg:operator:accept-invitation [FILE]`](#storage-node-wgoperatoraccept-invitation-file)
+* [`storage-node leader:create-bucket`](#storage-node-leadercreate-bucket)
+* [`storage-node leader:update-bags [FILE]`](#storage-node-leaderupdate-bags-file)
+* [`storage-node operator:accept-invitation [FILE]`](#storage-node-operatoraccept-invitation-file)
 
 ## `storage-node help [COMMAND]`
 
@@ -49,31 +50,32 @@ OPTIONS
 
 _See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v3.2.2/src/commands/help.ts)_
 
-## `storage-node wg:leader:create-bucket`
+## `storage-node leader:create-bucket`
 
 Create new storage bucket. Requires storage working group leader permissions.
 
 ```
 USAGE
-  $ storage-node wg:leader:create-bucket
+  $ storage-node leader:create-bucket
 
 OPTIONS
-  -a, --allow          Accepts new bags
-  -d, --dev            Use development mode
-  -h, --help           show CLI help
-  -n, --number=number  Storage bucket max total objects number
-  -s, --size=size      Storage bucket max total objects size
+  -a, --allow            Accepts new bags
+  -d, --dev              Use development mode
+  -h, --help             show CLI help
+  -i, --invited=invited  Invited storage operator ID (storage WG worker ID)
+  -n, --number=number    Storage bucket max total objects number
+  -s, --size=size        Storage bucket max total objects size
 ```
 
-_See code: [src/commands/wg/leader/create-bucket.ts](https://github.com/shamil-gadelshin/storage-node-v2/blob/v0.1.0/src/commands/wg/leader/create-bucket.ts)_
+_See code: [src/commands/leader/create-bucket.ts](https://github.com/shamil-gadelshin/storage-node-v2/blob/v0.1.0/src/commands/leader/create-bucket.ts)_
 
-## `storage-node wg:operator:accept-invitation [FILE]`
+## `storage-node leader:update-bags [FILE]`
 
 describe the command here
 
 ```
 USAGE
-  $ storage-node wg:operator:accept-invitation [FILE]
+  $ storage-node leader:update-bags [FILE]
 
 OPTIONS
   -f, --force
@@ -81,5 +83,22 @@ OPTIONS
   -n, --name=name  name to print
 ```
 
-_See code: [src/commands/wg/operator/accept-invitation.ts](https://github.com/shamil-gadelshin/storage-node-v2/blob/v0.1.0/src/commands/wg/operator/accept-invitation.ts)_
+_See code: [src/commands/leader/update-bags.ts](https://github.com/shamil-gadelshin/storage-node-v2/blob/v0.1.0/src/commands/leader/update-bags.ts)_
+
+## `storage-node operator:accept-invitation [FILE]`
+
+Accept pending storage bucket invitation.
+
+```
+USAGE
+  $ storage-node operator:accept-invitation [FILE]
+
+OPTIONS
+  -b, --bucket=bucket  (required) Storage bucket ID
+  -d, --dev            Use development mode
+  -h, --help           show CLI help
+  -w, --worker=worker  (required) Storage operator worker ID
+```
+
+_See code: [src/commands/operator/accept-invitation.ts](https://github.com/shamil-gadelshin/storage-node-v2/blob/v0.1.0/src/commands/operator/accept-invitation.ts)_
 <!-- commandsstop -->

+ 3 - 3
storage-node-v2/src/commands/wg/leader/create-bucket.ts → storage-node-v2/src/commands/leader/create-bucket.ts

@@ -1,7 +1,7 @@
-import { createStorageBucket } from '../../../services/extrinsics'
+import { createStorageBucket } from '../../services/extrinsics'
 import { Command, flags } from '@oclif/command'
 
-export default class WgLeaderCreateBucket extends Command {
+export default class LeaderCreateBucket extends Command {
   static description = `Create new storage bucket. Requires storage working group leader permissions.`
 
   static flags = {
@@ -23,7 +23,7 @@ export default class WgLeaderCreateBucket extends Command {
   }
 
   async run(): Promise<void> {
-    const { flags } = this.parse(WgLeaderCreateBucket)
+    const { flags } = this.parse(LeaderCreateBucket)
 
     const objectSize = flags.size ?? 0
     const objectNumber = flags.number ?? 0

+ 39 - 0
storage-node-v2/src/commands/leader/update-bag.ts

@@ -0,0 +1,39 @@
+import {Command, flags} from '@oclif/command'
+import { updateStorageBucketsForBag } from '../../services/extrinsics'
+
+export default class LeaderUpdateBag extends Command {
+  static description = 'Add/remove a storage bucket from a bag (adds by default).'
+
+  static flags = {
+    help: flags.help({char: 'h'}),
+    dev: flags.boolean({ char: 'd', description: 'Use development mode' }),
+    bucket: flags.integer({
+      char: 'b',
+      required: true,
+      description: 'Storage bucket ID',
+    }),
+    remove: flags.boolean({ char: 'r', description: 'Remove a bucket from the bag' }),
+  }
+
+  static args = [{name: 'file'}]
+
+  async run() {
+    const { flags } = this.parse(LeaderUpdateBag)
+
+    const bucket = flags.bucket ?? 0
+
+    this.log('Creating storage bucket...')
+    if (flags.dev) {
+      this.log('development mode is ON')
+    }
+
+    await updateStorageBucketsForBag(bucket, flags.remove)
+  }
+
+  async finally(err: Error | undefined): Promise<void> {
+    // called after run and catch regardless of whether or not the command errored
+    // We'll force exit here, in case there is no error, to prevent console.log from hanging the process
+    if (!err) this.exit(0)
+    super.finally(err)
+  }
+}

+ 3 - 3
storage-node-v2/src/commands/wg/operator/accept-invitation.ts → storage-node-v2/src/commands/operator/accept-invitation.ts

@@ -1,7 +1,7 @@
 import { Command, flags } from '@oclif/command'
-import { acceptStorageBucketInvitation } from '../../../services/extrinsics'
+import { acceptStorageBucketInvitation } from '../../services/extrinsics'
 
-export default class WgOperatorAcceptInvitation extends Command {
+export default class OperatorAcceptInvitation extends Command {
   static description = 'Accept pending storage bucket invitation.'
 
   static flags = {
@@ -22,7 +22,7 @@ export default class WgOperatorAcceptInvitation extends Command {
   static args = [{ name: 'file' }]
 
   async run(): Promise<void> {
-    const { flags } = this.parse(WgOperatorAcceptInvitation)
+    const { flags } = this.parse(OperatorAcceptInvitation)
 
     const worker = flags.worker ?? 0
     const bucket = flags.bucket ?? 0

+ 4 - 3
storage-node-v2/src/services/api.ts

@@ -16,7 +16,6 @@ export class ExtrinsicFailedError extends Error {}
 function createExtendedTypes(): RegistryTypes {
   const extendedTypes = types
   extendedTypes.StorageBucketId = 'u64'
-  extendedTypes.BagId = {}
   extendedTypes.UploadParameters = {}
   extendedTypes.DynamicBagId = {}
   extendedTypes.StorageBucketsPerBagValueConstraint = {}
@@ -26,10 +25,12 @@ function createExtendedTypes(): RegistryTypes {
   extendedTypes.DataObjectId = {}
   extendedTypes.DynamicBag = {}
   extendedTypes.StaticBag = {}
-  extendedTypes.StaticBag = {}
-  extendedTypes.StaticBagId = {}
   extendedTypes.StorageBucket = {}
 
+  extendedTypes.BagId = {_enum: {Static: 'StaticBagId'}}
+  extendedTypes.Static = 'StaticBagId'
+  extendedTypes.StaticBagId = {_enum: ['Council']}
+
   return extendedTypes
 }
 

+ 37 - 0
storage-node-v2/src/services/extrinsics.ts

@@ -47,3 +47,40 @@ export async function acceptStorageBucketInvitation(
     console.error(`Api Error: ${err}`)
   }
 }
+
+//TODO: 
+// export enum BagId {
+//   Static = 'static',
+//   Dynamic = 'dynamic',
+// }
+
+export async function updateStorageBucketsForBag(
+  bucketId: number,
+  removeBucket: boolean
+): Promise<void> {
+  try {
+    const api = await createApi()
+
+    const keyring = new Keyring({ type: 'sr25519' })
+    const alice = keyring.addFromUri('//Alice')
+
+    let addBuckets = api.createType('BTreeSet<StorageBucketId>', [bucketId])
+    let removeBuckets = api.createType('BTreeSet<StorageBucketId>', [bucketId])
+
+    if (removeBucket) {
+      addBuckets = null
+    } else {
+      removeBuckets = null
+    }
+
+    await sendAndFollowNamedTx(
+      api,
+      alice,
+      'storage',
+      'updateStorageBucketsForBag',
+      [{"Static":"Council"}, addBuckets, removeBuckets]
+    )
+  } catch (err) {
+    console.error(`Api Error: ${err}`)
+  }
+}

+ 0 - 0
storage-node-v2/test/commands/wg/leader/create-bucket.test.ts → storage-node-v2/test/commands/leader/create-bucket.test.ts


+ 17 - 0
storage-node-v2/test/commands/leader/update-bags.test.ts

@@ -0,0 +1,17 @@
+import {expect, test} from '@oclif/test'
+
+describe('leader:update-bags', () => {
+  test
+  .stdout()
+  .command(['leader:update-bags'])
+  .it('runs hello', ctx => {
+    expect(ctx.stdout).to.contain('hello world')
+  })
+
+  test
+  .stdout()
+  .command(['leader:update-bags', '--name', 'jeff'])
+  .it('runs hello --name jeff', ctx => {
+    expect(ctx.stdout).to.contain('hello jeff')
+  })
+})

+ 0 - 0
storage-node-v2/test/commands/wg/operator/accept-invitation.test.ts → storage-node-v2/test/commands/operator/accept-invitation.test.ts