def test_put_multi_replica_rule(self):

        rule_id = 'test-id'
        action_list = [
            ReplicationRule.PUT, ReplicationRule.DELETE, ReplicationRule.ABORT
        ]
        replica_config = ReplicationRule(
            rule_id=rule_id,
            target_bucket_name=self.replica_bucket_name,
            target_bucket_location=self.replica_endpoint,
            action_list=action_list)
        self.source_bucket.put_bucket_replication(replica_config)

        rule_id_2 = 'test-id-2'
        action_list = [
            ReplicationRule.PUT, ReplicationRule.DELETE, ReplicationRule.ABORT
        ]
        replica_config = ReplicationRule(
            rule_id=rule_id_2,
            target_bucket_name=self.replica_bucket_name,
            target_bucket_location=self.replica_endpoint,
            action_list=action_list)
        self.assertRaises(oss2.exceptions.BucketReplicationAlreadyExist,
                          self.source_bucket.put_bucket_replication,
                          replica_config)
    def test_kms_encrypted_status_disabled(self):
        rule_id = 'test-id'
        prefix_list = ['prefix-1', 'prefix-2']
        replica_config = ReplicationRule(
            rule_id=rule_id,
            prefix_list=prefix_list,
            target_bucket_name=self.replica_bucket_name,
            target_bucket_location=self.replica_endpoint,
            target_transfer_type=self.transfer_type,
            sync_role_name=self.sync_role_name,
            replica_kms_keyid=OSS_CMK,
            sse_kms_encrypted_objects_status=ReplicationRule.DISABLED)
        result = self.source_bucket.put_bucket_replication(replica_config)
        self.assertEqual(200, result.status)

        result = self.source_bucket.get_bucket_replication()
        self.assertEqual(1, len(result.rule_list))
        rule = result.rule_list[0]
        self.assertEqual(rule_id, rule.rule_id)
        self.assertEqual(self.replica_bucket_name, rule.target_bucket_name)
        self.assertEqual(self.replica_endpoint, rule.target_bucket_location)
        self.assertEqual(self.transfer_type, rule.target_transfer_type)
        self.assertEqual(2, len(rule.prefix_list))
        self.assertTrue('prefix-1' in rule.prefix_list)
        self.assertTrue('prefix-2' in rule.prefix_list)
        self.assertEqual(1, len(rule.action_list))
        self.assertEqual(ReplicationRule.ALL, rule.action_list[0])
        self.assertTrue(rule.is_enable_historical_object_replication)
        self.assertEqual(ReplicationRule.STARTING, rule.status)
        self.assertEqual(self.sync_role_name, rule.sync_role_name)
        self.assertEqual(ReplicationRule.DISABLED,
                         rule.sse_kms_encrypted_objects_status)
        # kms will be None
        self.assertIsNone(rule.replica_kms_keyid)
    def test_put_replica_without_prefix(self):
        rule_id = 'test-id'
        replica_config = ReplicationRule(
            rule_id=rule_id,
            target_bucket_name=self.replica_bucket_name,
            target_bucket_location=self.replica_endpoint,
            target_transfer_type=self.transfer_type,
            sync_role_name=self.sync_role_name,
            replica_kms_keyid=OSS_CMK,
            sse_kms_encrypted_objects_status='Enabled')
        result = self.source_bucket.put_bucket_replication(replica_config)
        self.assertEqual(200, result.status)

        result = self.source_bucket.get_bucket_replication()
        self.assertEqual(1, len(result.rule_list))
        rule = result.rule_list[0]
        self.assertIsInstance(rule.prefix_list, list)
        self.assertEqual(0, len(rule.prefix_list))

        result = self.source_bucket.get_bucket_replication_progress(rule_id)
        progress = result.progress
        self.assertEqual(0, len(progress.prefix_list))

        result = self.source_bucket.delete_bucket_replication(rule_id)
        self.assertEqual(200, result.status)
    def test_put_without_rule_id(self):
        prefix_list = ['prefix-1', 'prefix-2']
        replica_config = ReplicationRule(
            prefix_list=prefix_list,
            target_bucket_name=self.replica_bucket_name,
            target_bucket_location=self.replica_endpoint,
            target_transfer_type=self.transfer_type,
            sync_role_name=self.sync_role_name,
            replica_kms_keyid=OSS_CMK,
            sse_kms_encrypted_objects_status='Enabled')
        result = self.source_bucket.put_bucket_replication(replica_config)
        self.assertEqual(200, result.status)

        result = self.source_bucket.get_bucket_replication()
        self.assertEqual(1, len(result.rule_list))
        rule = result.rule_list[0]
        self.assertIsNotNone(rule.rule_id)
        self.assertEqual(self.replica_bucket_name, rule.target_bucket_name)
        self.assertEqual(self.replica_endpoint, rule.target_bucket_location)
        self.assertEqual(self.transfer_type, rule.target_transfer_type)
        self.assertEqual(2, len(rule.prefix_list))
        self.assertTrue('prefix-1' in rule.prefix_list)
        self.assertTrue('prefix-2' in rule.prefix_list)
        self.assertEqual(1, len(rule.action_list))
        self.assertEqual(ReplicationRule.ALL, rule.action_list[0])
        self.assertTrue(rule.is_enable_historical_object_replication)
        self.assertEqual(ReplicationRule.STARTING, rule.status)
        self.assertEqual(self.sync_role_name, rule.sync_role_name)
        self.assertEqual(OSS_CMK, rule.replica_kms_keyid)
        self.assertEqual('Enabled', rule.sse_kms_encrypted_objects_status)
        rule_id = rule.rule_id

        result = self.source_bucket.delete_bucket_replication(rule_id)
        self.assertEqual(200, result.status)
    def test_wrong_enable_historical_setting(self):
        right_rule = ReplicationRule(
            target_bucket_name=self.replica_bucket_name,
            target_bucket_location=self.replica_endpoint,
            target_transfer_type=self.transfer_type,
            is_enable_historical_object_replication=True)

        self.assertRaises(oss2.exceptions.ClientError,
                          ReplicationRule,
                          target_bucket_name=self.replica_bucket_name,
                          target_bucket_location=self.replica_endpoint,
                          target_transfer_type=self.transfer_type,
                          is_enable_historical_object_replication='wrong')
    def test_wrong_kms_encrypted_status(self):

        right_rule = ReplicationRule(
            target_bucket_name=self.replica_bucket_name,
            target_bucket_location=self.replica_endpoint,
            target_transfer_type=self.transfer_type,
            sse_kms_encrypted_objects_status=ReplicationRule.ENABLED)

        self.assertRaises(oss2.exceptions.ClientError,
                          ReplicationRule,
                          target_bucket_name=self.replica_bucket_name,
                          target_bucket_location=self.replica_endpoint,
                          target_transfer_type=self.transfer_type,
                          sse_kms_encrypted_objects_status='wrong')
    def test_put_replica_without_action(self):
        rule_id = 'test-id'
        replica_config = ReplicationRule(
            rule_id=rule_id,
            target_bucket_name=self.replica_bucket_name,
            target_bucket_location=self.replica_endpoint,
            is_enable_historical_object_replication=True)
        self.source_bucket.put_bucket_replication(replica_config)

        result = self.source_bucket.get_bucket_replication()
        self.assertEqual(1, len(result.rule_list))
        rule = result.rule_list[0]
        self.assertTrue(rule.is_enable_historical_object_replication)
        self.assertEqual(ReplicationRule.ALL, rule.action_list[0])
    def test_put_replica_with_multi_action(self):
        rule_id = 'test-id'
        action_list = [
            ReplicationRule.PUT, ReplicationRule.DELETE, ReplicationRule.ABORT
        ]
        replica_config = ReplicationRule(
            rule_id=rule_id,
            target_bucket_name=self.replica_bucket_name,
            target_bucket_location=self.replica_endpoint,
            action_list=action_list)
        self.source_bucket.put_bucket_replication(replica_config)

        result = self.source_bucket.get_bucket_replication()
        self.assertEqual(1, len(result.rule_list))
        rule = result.rule_list[0]
        self.assertEqual(3, len(rule.action_list))
        self.assertTrue('PUT' in rule.action_list)
        self.assertTrue('DELETE' in rule.action_list)
        self.assertTrue('ABORT' in rule.action_list)
    def test_put_replica_without_sync_role(self):
        rule_id = 'test-id'
        prefix_list = ['prefix-1', 'prefix-2']
        replica_config = ReplicationRule(
            rule_id=rule_id,
            prefix_list=prefix_list,
            target_bucket_name=self.replica_bucket_name,
            target_bucket_location=self.replica_endpoint,
            target_transfer_type=self.transfer_type,
            replica_kms_keyid=OSS_CMK,
            sse_kms_encrypted_objects_status='Enabled')
        result = self.source_bucket.put_bucket_replication(replica_config)
        self.assertEqual(200, result.status)

        result = self.source_bucket.get_bucket_replication()
        self.assertEqual(1, len(result.rule_list))
        rule = result.rule_list[0]
        self.assertEqual(rule_id, rule.rule_id)
        self.assertIsNone(rule.sync_role_name)
        self.assertIsNone(rule.replica_kms_keyid)
        self.assertIsNone(rule.sse_kms_encrypted_objects_status)

        result = self.source_bucket.delete_bucket_replication(rule_id)
        self.assertEqual(200, result.status)
    def test_replication_with_full_parameter(self):
        rule_id = 'test-id'
        prefix_list = ['prefix-1', 'prefix-2']
        replica_config = ReplicationRule(
            rule_id=rule_id,
            prefix_list=prefix_list,
            action_list=[ReplicationRule.ALL],
            target_bucket_name=self.replica_bucket_name,
            target_bucket_location=self.replica_endpoint,
            target_transfer_type=self.transfer_type,
            is_enable_historical_object_replication=False,
            sync_role_name=self.sync_role_name,
            replica_kms_keyid=OSS_CMK,
            sse_kms_encrypted_objects_status=ReplicationRule.ENABLED)
        result = self.source_bucket.put_bucket_replication(replica_config)
        self.assertEqual(200, result.status)

        result = self.source_bucket.get_bucket_replication()
        self.assertEqual(1, len(result.rule_list))
        rule = result.rule_list[0]
        self.assertEqual(rule_id, rule.rule_id)
        self.assertEqual(self.replica_bucket_name, rule.target_bucket_name)
        self.assertEqual(self.replica_endpoint, rule.target_bucket_location)
        self.assertEqual(self.transfer_type, rule.target_transfer_type)
        self.assertEqual(2, len(rule.prefix_list))
        self.assertTrue('prefix-1' in rule.prefix_list)
        self.assertTrue('prefix-2' in rule.prefix_list)
        self.assertEqual(1, len(rule.action_list))
        self.assertEqual(ReplicationRule.ALL, rule.action_list[0])
        self.assertFalse(rule.is_enable_historical_object_replication)
        self.assertEqual(ReplicationRule.STARTING, rule.status)
        self.assertEqual(self.sync_role_name, rule.sync_role_name)
        self.assertEqual(OSS_CMK, rule.replica_kms_keyid)
        self.assertEqual(ReplicationRule.ENABLED,
                         rule.sse_kms_encrypted_objects_status)

        result = self.source_bucket.get_bucket_replication_progress(rule_id)
        progress = result.progress
        self.assertEqual(self.replica_bucket_name, progress.target_bucket_name)
        self.assertEqual(self.replica_endpoint,
                         progress.target_bucket_location)
        self.assertEqual(rule_id, progress.rule_id)
        self.assertEqual(self.transfer_type, progress.target_transfer_type)
        self.assertEqual(2, len(rule.prefix_list))
        self.assertTrue('prefix-1' in rule.prefix_list)
        self.assertTrue('prefix-2' in rule.prefix_list)
        self.assertEqual(1, len(progress.action_list))
        self.assertEqual(ReplicationRule.ALL, progress.action_list[0])
        self.assertFalse(progress.is_enable_historical_object_replication)
        self.assertEqual(ReplicationRule.STARTING, progress.status)

        self.assertEqual(0, progress.historical_object_progress)
        self.assertIsNone(progress.new_object_progress)

        result = self.source_bucket.delete_bucket_replication(rule_id)
        self.assertEqual(200, result.status)

        result = self.source_bucket.get_bucket_replication()
        self.assertEqual(ReplicationRule.CLOSING, result.rule_list[0].status)

        result = self.source_bucket.get_bucket_replication_progress(rule_id)
        self.assertEqual(ReplicationRule.CLOSING, result.progress.status)