Ver Fonte

storage-node-v2: Start adding ‘Upload’ command.

Shamil Gadelshin há 3 anos atrás
pai
commit
2438f75c50

+ 26 - 8
storage-node-v2/README.md

@@ -28,11 +28,28 @@ USAGE
 <!-- usagestop -->
 # Commands
 <!-- commands -->
+* [`storage-node dev:upload [FILE]`](#storage-node-devupload-file)
 * [`storage-node help [COMMAND]`](#storage-node-help-command)
 * [`storage-node leader:create-bucket`](#storage-node-leadercreate-bucket)
-* [`storage-node leader:update-bags [FILE]`](#storage-node-leaderupdate-bags-file)
+* [`storage-node leader:update-bag [FILE]`](#storage-node-leaderupdate-bag-file)
 * [`storage-node operator:accept-invitation [FILE]`](#storage-node-operatoraccept-invitation-file)
 
+## `storage-node dev:upload [FILE]`
+
+describe the command here
+
+```
+USAGE
+  $ storage-node dev:upload [FILE]
+
+OPTIONS
+  -f, --force
+  -h, --help       show CLI help
+  -n, --name=name  name to print
+```
+
+_See code: [src/commands/dev/upload.ts](https://github.com/shamil-gadelshin/storage-node-v2/blob/v0.1.0/src/commands/dev/upload.ts)_
+
 ## `storage-node help [COMMAND]`
 
 display help for storage-node
@@ -69,21 +86,22 @@ OPTIONS
 
 _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 leader:update-bags [FILE]`
+## `storage-node leader:update-bag [FILE]`
 
-describe the command here
+Add/remove a storage bucket from a bag (adds by default).
 
 ```
 USAGE
-  $ storage-node leader:update-bags [FILE]
+  $ storage-node leader:update-bag [FILE]
 
 OPTIONS
-  -f, --force
-  -h, --help       show CLI help
-  -n, --name=name  name to print
+  -b, --bucket=bucket  (required) Storage bucket ID
+  -d, --dev            Use development mode
+  -h, --help           show CLI help
+  -r, --remove         Remove a bucket from the bag
 ```
 
-_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)_
+_See code: [src/commands/leader/update-bag.ts](https://github.com/shamil-gadelshin/storage-node-v2/blob/v0.1.0/src/commands/leader/update-bag.ts)_
 
 ## `storage-node operator:accept-invitation [FILE]`
 

+ 31 - 0
storage-node-v2/src/commands/dev/upload.ts

@@ -0,0 +1,31 @@
+import {Command, flags} from '@oclif/command'
+import { uploadDataObjects } from '../../services/extrinsics'
+
+export default class DevUpload extends Command {
+  static description = 'describe the command here'
+
+  static flags = {
+    help: flags.help({char: 'h'}),
+    dev: flags.boolean({ char: 'd', description: 'Use development mode' }),
+  }
+
+  static args = [{name: 'file'}]
+
+  async run(): Promise<void> {
+    const { flags } = this.parse(DevUpload)
+
+    this.log('Uploading data objects...')
+    if (flags.dev) {
+      this.log('development mode is ON')
+    }
+
+    await uploadDataObjects()
+  }
+
+  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)
+  }
+}

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

@@ -22,7 +22,7 @@ export default class LeaderUpdateBag extends Command {
 
     const bucket = flags.bucket ?? 0
 
-    this.log('Creating storage bucket...')
+    this.log('Update bag - add storage buckets...')
     if (flags.dev) {
       this.log('development mode is ON')
     }

+ 23 - 1
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.UploadParameters = {}
   extendedTypes.DynamicBagId = {}
   extendedTypes.StorageBucketsPerBagValueConstraint = {}
   extendedTypes.Voucher = {}
@@ -31,6 +30,15 @@ function createExtendedTypes(): RegistryTypes {
   extendedTypes.Static = 'StaticBagId'
   extendedTypes.StaticBagId = {_enum: ['Council']}
 
+  extendedTypes.DataObjectCreationParameters = {}
+  extendedTypes.BagIdType = {_enum: {Static: 'StaticBagId'}}
+  extendedTypes.UploadParameters = {
+    authenticationKey: 'Vec<u8>',
+    bagId: 'BagId',
+    objectCreationList: 'Vec<DataObjectCreationParameters>',
+    deletionPrizeSourceAccountId : 'AccountId'
+  }
+
   return extendedTypes
 }
 
@@ -136,3 +144,17 @@ export async function sendAndFollowNamedTx(
   const tx = api.tx[module][method](...params)
   return await sendAndFollowTx(api, account, tx, warnOnly)
 }
+
+//TODO: handle SUDO errors
+export async function sendAndFollowSudoNamedTx(
+  api: ApiPromise,
+  account: KeyringPair,
+  module: string,
+  method: string,
+  params: CodecArg[],
+  warnOnly = false
+): Promise<boolean> {
+  console.log(chalk.white(`\nSending ${module}.${method} extrinsic...`))
+  const tx = api.tx.sudo.sudo(api.tx[module][method](...params))
+  return await sendAndFollowTx(api, account, tx, warnOnly)
+}

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

@@ -84,3 +84,26 @@ export async function updateStorageBucketsForBag(
     console.error(`Api Error: ${err}`)
   }
 }
+
+export async function uploadDataObjects(): Promise<void> {
+  try {
+    const api = await createApi()
+
+    const keyring = new Keyring({ type: 'sr25519' })
+    const alice = keyring.addFromUri('//Alice')
+
+    let data = api.createType('UploadParameters', {
+      deletionPrizeSourceAccountId: alice.address
+    })
+
+    await sendAndFollowNamedTx(
+      api,
+      alice,
+      'storage',
+      'sudoUploadDataObjects',
+      [data]
+    )
+  } catch (err) {
+    console.error(`Api Error: ${err}`)
+  }
+}

+ 17 - 0
storage-node-v2/test/commands/dev/upload.test.ts

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