Browse Source

Merge pull request #2560 from shamil-gadelshin/distribution_bucket_family_metadata

Add `set_distribution_bucket_family_metadata` extrinsic to the storage pallet.
Bedeho Mender 3 years ago
parent
commit
b73c359474

+ 35 - 0
runtime-modules/storage/src/lib.rs

@@ -76,6 +76,8 @@
 //!  Cancels pending invite for a distribution bucket.
 //! - [remove_distribution_bucket_operator](./struct.Module.html#method.remove_distribution_bucket_operator) -
 //!  Removes a distribution bucket operator.
+//! - [set_distribution_bucket_family_metadata](./struct.Module.html#method.set_distribution_bucket_family_metadata) -
+//! Sets distribution bucket family metadata.
 //!
 //! #### Distribution provider extrinsics
 //! - [accept_distribution_bucket_invitation](./struct.Module.html#method.accept_distribution_bucket_invitation) -
@@ -1239,6 +1241,15 @@ decl_event! {
             DistributionBucketId,
             WorkerId
         ),
+
+        /// Emits on setting the metadata by a distribution bucket family.
+        /// Params
+        /// - distribution bucket family ID
+        /// - metadata
+        DistributionBucketFamilyMetadataSet(
+            DistributionBucketFamilyId,
+            Vec<u8>
+        ),
     }
 }
 
@@ -2371,6 +2382,30 @@ decl_module! {
             );
         }
 
+        /// Set distribution bucket family metadata.
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn set_distribution_bucket_family_metadata(
+            origin,
+            family_id: T::DistributionBucketFamilyId,
+            metadata: Vec<u8>,
+        ) {
+            T::ensure_distribution_working_group_leader_origin(origin)?;
+
+            Self::ensure_distribution_bucket_family_exists(&family_id)?;
+
+            //
+            // == MUTATION SAFE ==
+            //
+
+            Self::deposit_event(
+                RawEvent::DistributionBucketFamilyMetadataSet(
+                    family_id,
+                    metadata
+                )
+            );
+        }
+
+
         // ===== Distribution Operator actions =====
 
         /// Accept pending invite.

+ 38 - 0
runtime-modules/storage/src/tests/fixtures.rs

@@ -1902,3 +1902,41 @@ impl RemoveDistributionBucketOperatorFixture {
         }
     }
 }
+
+pub struct SetDistributionBucketFamilyMetadataFixture {
+    origin: RawOrigin<u64>,
+    family_id: u64,
+    metadata: Vec<u8>,
+}
+
+impl SetDistributionBucketFamilyMetadataFixture {
+    pub fn default() -> Self {
+        Self {
+            origin: RawOrigin::Signed(DEFAULT_DISTRIBUTION_PROVIDER_ACCOUNT_ID),
+            family_id: Default::default(),
+            metadata: Default::default(),
+        }
+    }
+
+    pub fn with_metadata(self, metadata: Vec<u8>) -> Self {
+        Self { metadata, ..self }
+    }
+
+    pub fn with_origin(self, origin: RawOrigin<u64>) -> Self {
+        Self { origin, ..self }
+    }
+
+    pub fn with_family_id(self, family_id: u64) -> Self {
+        Self { family_id, ..self }
+    }
+
+    pub fn call_and_assert(&self, expected_result: DispatchResult) {
+        let actual_result = Storage::set_distribution_bucket_family_metadata(
+            self.origin.clone().into(),
+            self.family_id,
+            self.metadata.clone(),
+        );
+
+        assert_eq!(actual_result, expected_result);
+    }
+}

+ 48 - 1
runtime-modules/storage/src/tests/mod.rs

@@ -4810,7 +4810,7 @@ fn accept_distribution_bucket_operator_invite_fails_with_invalid_distribution_bu
 }
 
 #[test]
-fn set_distribution_operator_metadata_invite_succeeded() {
+fn set_distribution_operator_metadata_succeeded() {
     build_test_externalities().execute_with(|| {
         let starting_block = 1;
         run_to_block(starting_block);
@@ -5046,3 +5046,50 @@ fn remove_distribution_bucket_operator_fails_with_non_accepted_distribution_prov
             ));
     });
 }
+
+#[test]
+fn set_distribution_bucket_family_metadata_succeeded() {
+    build_test_externalities().execute_with(|| {
+        let starting_block = 1;
+        run_to_block(starting_block);
+
+        let metadata = b"Metadata".to_vec();
+
+        let family_id = CreateDistributionBucketFamilyFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Ok(()))
+            .unwrap();
+
+        SetDistributionBucketFamilyMetadataFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .with_family_id(family_id)
+            .with_metadata(metadata.clone())
+            .call_and_assert(Ok(()));
+
+        EventFixture::assert_last_crate_event(RawEvent::DistributionBucketFamilyMetadataSet(
+            family_id, metadata,
+        ));
+    });
+}
+
+#[test]
+fn set_distribution_bucket_family_metadata_fails_with_non_leader_origin() {
+    build_test_externalities().execute_with(|| {
+        let invalid_account_id = 11111;
+
+        SetDistributionBucketFamilyMetadataFixture::default()
+            .with_origin(RawOrigin::Signed(invalid_account_id))
+            .call_and_assert(Err(DispatchError::BadOrigin));
+    });
+}
+
+#[test]
+fn set_distribution_bucket_family_metadata_fails_with_invalid_distribution_bucket_family() {
+    build_test_externalities().execute_with(|| {
+        SetDistributionBucketFamilyMetadataFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Err(
+                Error::<Test>::DistributionBucketFamilyDoesntExist.into()
+            ));
+    });
+}