def daemon_config(self, environment):
     organization = OrganizationPublisherRepository().get_org_for_org_uuid(
         self._org_uuid)
     if not organization:
         raise OrganizationNotFoundException()
     service = ServicePublisherRepository(
     ).get_service_for_given_service_uuid(self._org_uuid,
                                          self._service_uuid)
     if not service:
         raise ServiceNotFoundException()
     organization_members = OrganizationPublisherRepository(
     ).get_org_member(org_uuid=self._org_uuid)
     network_name = NETWORKS[NETWORK_ID]["name"].lower()
     # this is how network name is set in daemon for mainnet
     network_name = "main" if network_name == "mainnet" else network_name
     if environment is EnvironmentType.TEST.value:
         daemon_config = {
             "allowed_user_flag":
             True,
             "allowed_user_addresses":
             [member.address for member in organization_members] +
             [BLOCKCHAIN_TEST_ENV["publisher_address"]],
             "authentication_addresses":
             [member.address for member in organization_members],
             "blockchain_enabled":
             False,
             "passthrough_enabled":
             True,
             "organization_id":
             organization.id,
             "service_id":
             service.service_id
         }
     elif environment is EnvironmentType.MAIN.value:
         daemon_config = {
             "ipfs_end_point":
             f"{IPFS_URL['url']}:{IPFS_URL['port']}",
             "blockchain_network_selected":
             network_name,
             "organization_id":
             organization.id,
             "service_id":
             service.service_id,
             "metering_end_point":
             f"https://{network_name}-marketplace.singularitynet.io",
             "authentication_addresses":
             [member.address for member in organization_members],
             "blockchain_enabled":
             True,
             "passthrough_enabled":
             True
         }
     else:
         raise EnvironmentNotFoundException()
     return daemon_config
Exemple #2
0
 def process_approval_comment(self, approval_type, state, comment, params):
     if approval_type == "organization":
         org = OrganizationPublisherRepository().get_org_for_org_id(
             org_id=params["org_id"])
         if org.org_state.state in [
                 OrganizationStatus.APPROVAL_PENDING.value,
                 OrganizationStatus.ONBOARDING.value
         ]:
             self.callback_verification_service(
                 org.uuid,
                 getattr(OrganizationStatus, state).value, self._username,
                 comment)
     elif approval_type == "service":
         org_uuid, service = ServicePublisherRepository(). \
             get_service_for_given_service_id_and_org_id(org_id=params["org_id"], service_id=params["service_id"])
         if service.service_state.state == ServiceStatus.APPROVAL_PENDING.value:
             ServicePublisherRepository().save_service(
                 username=self._username,
                 service=service,
                 state=getattr(ServiceStatus, state).value)
             service_comments = ServiceComment(
                 org_uuid=service.org_uuid,
                 service_uuid=service.uuid,
                 support_type=ServiceSupportType.SERVICE_APPROVAL.value,
                 user_type=UserType.SERVICE_APPROVER.value,
                 commented_by=self._username,
                 comment=comment)
             ServicePublisherRepository().save_service_comments(
                 service_comment=service_comments)
             slack_msg = f"Reviews for service with {service.service_id} is successfully submitted."
             # send_slack_notification(slack_msg=slack_msg, slack_url=SLACK_APPROVAL_CHANNEL_URL,
             #                         slack_channel="ai-approvals")
             recipients = [
                 contributor.get("email_id", "")
                 for contributor in service.contributors
             ]
             if not recipients:
                 logger.info(
                     f"Unable to find service contributors for service {service.service_id} under {params['org_id']}"
                 )
                 return
             notification_subject = f"Your service {service.service_id} is reviewed"
             notification_message = f"Your service {service.service_id} under {params['org_id']} is reviewed"
             send_email_notification(
                 recipients=recipients,
                 notification_subject=notification_subject,
                 notification_message=notification_message,
                 notification_arn=NOTIFICATION_ARN,
                 boto_util=boto_util)
         else:
             logger.info("Service state is not valid.")
     else:
         logger.info("Approval type is not valid")
    def publish_service_data(self):
        # Validate service metadata
        current_service = self.publish_service_data_to_ipfs()

        is_valid = Service.is_metadata_valid(
            service_metadata=current_service.to_metadata())
        logger.info(
            f"is_valid :: {is_valid} :: validated current_metadata :: {current_service.to_metadata()}"
        )
        if not is_valid:
            raise InvalidMetadataException()

        # Monitor blockchain and offchain changes
        current_org = OrganizationPublisherRepository().get_organization(
            org_uuid=self._org_uuid)
        existing_service_data = self.get_existing_service_details_from_contract_api(
            current_service.service_id, current_org.id)
        if existing_service_data:
            existing_metadata = ipfs_util.read_file_from_ipfs(
                existing_service_data["ipfs_hash"])
        else:
            existing_metadata = {}
        publish_to_blockchain = self.are_blockchain_attributes_got_updated(
            existing_metadata, current_service.to_metadata())
        existing_offchain_configs = self.get_existing_offchain_configs(
            existing_service_data)
        current_offchain_attributes = ServicePublisherRepository(
        ).get_offchain_service_config(org_uuid=self._org_uuid,
                                      service_uuid=self._service_uuid)
        new_offchain_attributes = self.get_offchain_changes(
            current_offchain_config=current_offchain_attributes.configs,
            existing_offchain_config=existing_offchain_configs,
            current_service=current_service)

        status = {"publish_to_blockchain": publish_to_blockchain}
        if publish_to_blockchain:
            filename = f"{METADATA_FILE_PATH}/{current_service.uuid}_service_metadata.json"
            ipfs_hash = ServicePublisherService.publish_to_ipfs(
                filename, current_service.to_metadata())
            status["service_metadata_ipfs_hash"] = "ipfs://" + ipfs_hash
        self.publish_offchain_service_configs(
            org_id=current_org.id,
            service_id=current_service.service_id,
            payload=json.dumps(new_offchain_attributes))
        # if there is no blockchain change update state as published
        # else status will be marked based event received from blockchain
        if not publish_to_blockchain:
            ServicePublisherRepository().save_service(
                username=self._username,
                service=current_service,
                state=ServiceStatus.PUBLISHED.value)
        return status
    def submit_service_for_approval(self, payload):

        user_as_contributor = [{"email_id": self._username, "name": ""}]
        payload["contributors"] = payload.get(
            "contributors", user_as_contributor) + user_as_contributor

        organization = OrganizationPublisherRepository().get_org_for_org_uuid(
            self._org_uuid)
        if not organization:
            raise OrganizationNotFoundException()
        if not organization.org_state:
            raise InvalidOrganizationStateException()
        if not organization.org_state.state == OrganizationStatus.PUBLISHED.value:
            raise OrganizationNotPublishedException()

        service = service_factory.create_service_entity_model(
            self._org_uuid, self._service_uuid, payload,
            ServiceStatus.APPROVAL_PENDING.value)

        # publish service data with test config on ipfs
        service = self.obj_service_publisher_domain_service.publish_service_data_to_ipfs(
            service, EnvironmentType.TEST.value)

        comments = payload.get("comments",
                               {}).get(UserType.SERVICE_PROVIDER.value, "")
        if bool(comments):
            service_provider_comment = service_factory. \
                create_service_comment_entity_model(org_uuid=self._org_uuid,
                                                    service_uuid=self._service_uuid,
                                                    support_type="SERVICE_APPROVAL",
                                                    user_type="SERVICE_PROVIDER",
                                                    commented_by=self._username,
                                                    comment=comments)
            ServicePublisherRepository().save_service_comments(
                service_provider_comment)
        service = ServicePublisherRepository().save_service(
            self._username, service, service.service_state.state)

        # publish service on test network
        response = self.obj_service_publisher_domain_service.publish_service_on_blockchain(
            org_id=organization.id,
            service=service,
            environment=EnvironmentType.TEST.value)

        # notify service contributors via email
        self.notify_service_contributor_when_user_submit_for_approval(
            organization.id, service.service_id, service.contributors)

        # notify approval team via slack
        self.notify_approval_team(service.service_id, service.display_name,
                                  organization.id, organization.name)
        return response
    def get_list_of_service_pending_for_approval(limit):
        list_of_services = []
        services = ServicePublisherRepository(
        ).get_list_of_service_pending_for_approval(limit)
        for service in services:
            org = OrganizationPublisherRepository().get_org_for_org_uuid(
                org_uuid=service.org_uuid)
            list_of_services.append({
                "org_uuid": service.org_uuid,
                "org_id": org.id,
                "service_uuid": service.uuid,
                "service_id": service.service_id,
                "display_name": service.display_name,
                "requested_at": None
            })

        return list_of_services
Exemple #6
0
 def create_and_send_view_org_modal(self, org_id, trigger_id):
     org = OrganizationPublisherRepository().get_org_for_org_id(
         org_id=org_id)
     if not org:
         logger.info("org not found")
     comment = self.get_verification_latest_comments(org.uuid)
     comment = "No comment" if not comment else comment
     view = self.generate_view_org_modal(org, None, comment)
     slack_payload = {"trigger_id": trigger_id, "view": view}
     OPEN_SLACK_VIEW_URL = "https://slack.com/api/views.open"
     headers = {
         "Authorization": SLACK_APPROVAL_OAUTH_ACCESS_TOKEN,
         "content-type": "application/json"
     }
     response = requests.post(url=OPEN_SLACK_VIEW_URL,
                              data=json.dumps(slack_payload),
                              headers=headers)
     logger.info(f"{response.status_code} | {response.text}")
 def setUp(self):
     self.org_repo = OrganizationPublisherRepository()
class TestOrganizationService(unittest.TestCase):
    def setUp(self):
        self.org_repo = OrganizationPublisherRepository()

    @patch("common.ipfs_util.IPFSUtil",
           return_value=Mock(write_file_in_ipfs=Mock(return_value="Q3E12")))
    @patch('common.s3_util.S3Util.push_io_bytes_to_s3')
    @patch('common.ipfs_util.IPFSUtil.read_file_from_ipfs')
    @patch('common.ipfs_util.IPFSUtil.read_bytesio_from_ipfs')
    @patch('common.blockchain_util.BlockChainUtil')
    @patch(
        'registry.consumer.organization_event_consumer.OrganizationEventConsumer._get_org_details_from_blockchain'
    )
    def test_organization_create_event(self,
                                       mock_get_org_details_from_blockchain,
                                       mock_blockchain_util,
                                       mock_read_bytesio_from_ipfs,
                                       mock_ipfs_read, mock_s3_push,
                                       mock_ipfs_write):
        test_org_uuid = uuid4().hex
        test_org_id = "org_id"
        username = "******"
        current_time = datetime.now()
        org_state = OrganizationState(
            org_uuid=test_org_uuid,
            state=OrganizationStatus.PUBLISH_IN_PROGRESS.value,
            transaction_hash="0x123",
            test_transaction_hash="0x456",
            wallet_address="0x987",
            created_by=username,
            created_on=current_time,
            updated_by=username,
            updated_on=current_time,
            reviewed_by="admin",
            reviewed_on=current_time)

        group = Group(name="default_group",
                      id="group_id",
                      org_uuid=test_org_uuid,
                      payment_address="0x123",
                      payment_config={
                          "payment_expiration_threshold": 40320,
                          "payment_channel_storage_type": "etcd",
                          "payment_channel_storage_client": {
                              "connection_timeout": "5s",
                              "request_timeout": "3s",
                              "endpoints": ["http://127.0.0.1:2379"]
                          }
                      },
                      status="0")

        organization = Organization(
            uuid=test_org_uuid,
            name="test_org",
            org_id=test_org_id,
            org_type="organization",
            origin="PUBLISHER_PORTAL",
            description="this is long description",
            short_description="this is short description",
            url="https://dummy.com",
            duns_no="123456789",
            contacts=[],
            assets={"hero_image": {
                "url": "some_url",
                "ipfs_hash": "Q123"
            }},
            metadata_ipfs_uri="Q3E12",
            org_state=[org_state],
            groups=[group])
        owner = OrganizationMember(
            invite_code="123",
            org_uuid=test_org_uuid,
            role=Role.OWNER.value,
            username=username,
            status=OrganizationMemberStatus.ACCEPTED.value,
            address="0x123",
            created_on=current_time,
            updated_on=current_time,
            invited_on=current_time)
        self.org_repo.add_item(organization)
        self.org_repo.add_item(owner)
        mock_read_bytesio_from_ipfs.return_value = ""
        mock_s3_push.return_value = "http://test-s3-push"
        ipfs_mock_value = {
            "org_name":
            "test_org",
            "org_id":
            "org_id",
            "metadata_ipfs_hash":
            "Q3E12",
            "org_type":
            "organization",
            "contacts": [],
            "description": {
                "description": "this is long description",
                "short_description": "this is short description",
                "url": "https://dummy.com"
            },
            "assets": {
                'hero_image': 'Q123'
            },
            "groups": [{
                "group_name": "default_group",
                "group_id": "group_id",
                "payment": {
                    "payment_address": "0x123",
                    "payment_expiration_threshold": 40320,
                    "payment_channel_storage_type": "etcd",
                    "payment_channel_storage_client": {
                        "connection_timeout": "5s",
                        "request_timeout": "3s",
                        "endpoints": ["http://127.0.0.1:2379"]
                    }
                }
            }]
        }
        mock_ipfs_read.return_value = ipfs_mock_value
        mock_get_org_details_from_blockchain.return_value = "org_id", ipfs_mock_value, "Q3E12", "0x123", "0x123", []
        org_event_consumer = OrganizationCreatedAndModifiedEventConsumer(
            "wss://ropsten.infura.io/ws", "http://ipfs.singularitynet.io", 80,
            self.org_repo)

        org_event_consumer.on_event({})
        published_org = self.org_repo.get_organization(org_id=test_org_id)
        org_owner = self.org_repo.session.query(OrganizationMember).filter(
            OrganizationMember.org_uuid == test_org_uuid).filter(
                OrganizationMember.role == Role.OWNER.value).all()
        if len(org_owner) != 1:
            assert False
        self.assertEqual(org_owner[0].address, "0x123")
        self.assertEqual(org_owner[0].username, username)
        assert published_org.name == "test_org"
        assert published_org.id == "org_id"
        assert published_org.org_type == "organization"
        assert published_org.metadata_ipfs_uri == "Q3E12"
        assert published_org.groups[0].group_id == "group_id"
        assert published_org.groups[0].name == "default_group"
        assert published_org.groups[0].payment_address == "0x123"
        assert published_org.duns_no == '123456789'
        assert published_org.org_state.state == "PUBLISHED"

    @patch("common.ipfs_util.IPFSUtil",
           return_value=Mock(write_file_in_ipfs=Mock(return_value="Q3E12")))
    @patch('common.s3_util.S3Util.push_io_bytes_to_s3')
    @patch('common.ipfs_util.IPFSUtil.read_file_from_ipfs')
    @patch('common.ipfs_util.IPFSUtil.read_bytesio_from_ipfs')
    @patch('common.blockchain_util.BlockChainUtil')
    @patch(
        'registry.consumer.organization_event_consumer.OrganizationEventConsumer._get_org_details_from_blockchain'
    )
    def test_organization_create_event_from_snet_cli(
            self, mock_get_org_details_from_blockchain, mock_block_chain_util,
            mock_read_bytesio_from_ipfs, mock_ipfs_read, mock_s3_push,
            mock_ipfs_write):
        username = "******"
        test_org_uuid = uuid4().hex
        test_org_id = "org_id"
        username = "******"

        event = {
            "data": {
                'row_id': 2,
                'block_no': 6243627,
                'event': 'OrganizationCreated',
                'json_str':
                "{'orgId': b'org_id\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}",
                'processed': b'\x00',
                'transactionHash':
                "b'y4\\xa4$By/mZ\\x17\\x1d\\xf2\\x18\\xb6aa\\x02\\x1c\\x88P\\x85\\x18w\\x19\\xc9\\x91\\xecX\\xd7E\\x98!'",
                'logIndex': '1',
                'error_code': 1,
                'error_msg': '',
                'row_updated': datetime(2019, 10, 21, 9, 44, 9),
                'row_created': datetime(2019, 10, 21, 9, 44, 9)
            },
            "name": "OrganizationCreated"
        }
        mock_read_bytesio_from_ipfs.return_value = ""
        mock_s3_push.return_value = "http://test-s3-push"
        ipfs_mock_value = {
            "org_name":
            "test_org",
            "org_id":
            "org_id",
            "metadata_ipfs_hash":
            "Q3E12",
            "org_type":
            "organization",
            "contacts": [],
            "description": {
                "description": "that is the dummy org for testcases",
                "short_description": "that is the short description",
                "url": "dummy.com"
            },
            "assets": {
                'hero_image':
                'QmagaSbQAdEtFkwc9ZQUDdYgUtXz93MPByngbx1b4cPidj/484b38d1c1fe4717ad4acab99394ea82-hero_image-20200107083215.png'
            },
            "groups": [{
                "group_name": "my-group",
                "group_id": "group_id",
                "payment": {
                    "payment_address": "0x123",
                    "payment_expiration_threshold": 40320,
                    "payment_channel_storage_type": "etcd",
                    "payment_channel_storage_client": {
                        "connection_timeout": "5s",
                        "request_timeout": "3s",
                        "endpoints": ["http://127.0.0.1:2379"]
                    }
                }
            }]
        }
        self.org_repo.session.commit()
        mock_ipfs_read.return_value = ipfs_mock_value
        mock_get_org_details_from_blockchain.return_value = "org_id", ipfs_mock_value, "Q3E12", "79345c7861342442792f6d5a5c7831375c7831645c7866325c7831385c78623661615c7830325c7831635c783838505c7838355c783138775c7831395c7863395c7839315c786563585c786437455c78393821", "0x123", []

        org_event_consumer = OrganizationCreatedAndModifiedEventConsumer(
            "wss://ropsten.infura.io/ws", "http://ipfs.singularitynet.io", 80,
            self.org_repo)
        org_event_consumer.on_event(event)

        published_org = self.org_repo.get_organization(org_id=test_org_id)

        assert published_org.name == "test_org"
        assert published_org.id == "org_id"
        assert published_org.org_type == "organization"
        assert published_org.metadata_ipfs_uri == "Q3E12"

        assert published_org.groups[0].group_id == "group_id"
        assert published_org.groups[0].name == "my-group"
        assert published_org.groups[0].payment_address == "0x123"
        assert published_org.org_state.state == OrganizationStatus.PUBLISHED_UNAPPROVED.value

    @patch("common.ipfs_util.IPFSUtil",
           return_value=Mock(write_file_in_ipfs=Mock(return_value="Q3E12")))
    @patch('common.s3_util.S3Util.push_io_bytes_to_s3')
    @patch('common.ipfs_util.IPFSUtil.read_file_from_ipfs')
    @patch('common.ipfs_util.IPFSUtil.read_bytesio_from_ipfs')
    @patch('common.blockchain_util.BlockChainUtil')
    @patch(
        'registry.consumer.organization_event_consumer.OrganizationEventConsumer._get_org_details_from_blockchain'
    )
    def test_organization_owner_change_event(
            self, mock_get_org_details_from_blockchain, mock_blockchain_util,
            mock_read_bytesio_from_ipfs, mock_ipfs_read, mock_s3_push,
            mock_ipfs_write):
        username = "******"
        test_org_uuid = uuid4().hex
        test_org_id = "org_id"
        username = "******"
        current_time = datetime.now()
        org_state = OrganizationState(
            org_uuid=test_org_uuid,
            state=OrganizationStatus.PUBLISH_IN_PROGRESS.value,
            transaction_hash="0x123",
            test_transaction_hash="0x456",
            wallet_address="0x987",
            created_by=username,
            created_on=current_time,
            updated_by=username,
            updated_on=current_time,
            reviewed_by="admin",
            reviewed_on=current_time)

        group = Group(name="default_group",
                      id="group_id",
                      org_uuid=test_org_uuid,
                      payment_address="0x123",
                      payment_config={
                          "payment_expiration_threshold": 40320,
                          "payment_channel_storage_type": "etcd",
                          "payment_channel_storage_client": {
                              "connection_timeout": "5s",
                              "request_timeout": "3s",
                              "endpoints": ["http://127.0.0.1:2379"]
                          }
                      },
                      status="0")

        organization = Organization(
            uuid=test_org_uuid,
            name="test_org",
            org_id=test_org_id,
            org_type="organization",
            origin="PUBLISHER_PORTAL",
            description="this is long description",
            short_description="this is short description",
            url="https://dummy.com",
            duns_no="123456789",
            contacts=[],
            assets={"hero_image": {
                "url": "some_url",
                "ipfs_hash": "Q123"
            }},
            metadata_ipfs_uri="Q3E12",
            org_state=[org_state],
            groups=[group])
        owner = OrganizationMember(
            invite_code="123",
            org_uuid=test_org_uuid,
            role=Role.OWNER.value,
            username=username,
            status=OrganizationMemberStatus.PUBLISHED.value,
            address="0x123",
            created_on=current_time,
            updated_on=current_time,
            invited_on=current_time)
        self.org_repo.add_item(organization)
        self.org_repo.add_item(owner)
        event = {
            "data": {
                'row_id': 2,
                'block_no': 6243627,
                'event': 'OrganizationCreated',
                'json_str':
                "{'orgId': b'org_id\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}",
                'processed': b'\x00',
                'transactionHash':
                "b'y4\\xa4$By/mZ\\x17\\x1d\\xf2\\x18\\xb6aa\\x02\\x1c\\x88P\\x85\\x18w\\x19\\xc9\\x91\\xecX\\xd7E\\x98!'",
                'logIndex': '1',
                'error_code': 1,
                'error_msg': '',
                'row_updated': datetime(2019, 10, 21, 9, 44, 9),
                'row_created': datetime(2019, 10, 21, 9, 44, 9)
            },
            "name": "OrganizationCreated"
        }
        mock_read_bytesio_from_ipfs.return_value = ""
        mock_s3_push.return_value = "http://test-s3-push"
        ipfs_mock_value = {
            "org_name":
            "test_org",
            "org_id":
            "org_id",
            "org_type":
            "organization",
            "contacts": [],
            "description": {
                "description": "this is long description",
                "short_description": "this is short description",
                "url": "https://dummy.com"
            },
            "assets": {
                'hero_image': 'Q123'
            },
            "groups": [{
                "group_name": "default_group",
                "group_id": "group_id",
                "payment": {
                    "payment_address": "0x123",
                    "payment_expiration_threshold": 40320,
                    "payment_channel_storage_type": "etcd",
                    "payment_channel_storage_client": {
                        "connection_timeout": "5s",
                        "request_timeout": "3s",
                        "endpoints": ["http://127.0.0.1:2379"]
                    }
                }
            }]
        }
        self.org_repo.session.commit()
        mock_ipfs_read.return_value = ipfs_mock_value
        mock_get_org_details_from_blockchain.return_value = "org_id", ipfs_mock_value, "Q3E12", "79345c7861342442792f6d5a5c7831375c7831645c7866325c7831385c78623661615c7830325c7831635c783838505c7838355c783138775c7831395c7863395c7839315c786563585c786437455c78393821", "0x1234", []
        org_event_consumer = OrganizationCreatedAndModifiedEventConsumer(
            "wss://ropsten.infura.io/ws", "http://ipfs.singularitynet.io", 80,
            self.org_repo)

        org_event_consumer.on_event({})
        published_org = self.org_repo.get_organization(org_id=test_org_id)
        owner = self.org_repo.session.query(OrganizationMember).filter(
            OrganizationMember.org_uuid == test_org_uuid).filter(
                OrganizationMember.role == Role.OWNER.value).all()
        if len(owner) != 1:
            assert False
        self.assertEqual(owner[0].address, "0x1234")
        self.assertEqual(owner[0].username, "")

        assert published_org.name == "test_org"
        assert published_org.id == "org_id"
        assert published_org.org_type == "organization"
        assert published_org.metadata_ipfs_uri == "Q3E12"
        assert published_org.groups[0].group_id == "group_id"
        assert published_org.groups[0].name == "default_group"
        assert published_org.groups[0].payment_address == "0x123"
        assert published_org.duns_no == '123456789'
        assert published_org.org_state.state == "PUBLISHED"

    def tearDown(self):
        self.org_repo.session.query(Organization).delete()
        self.org_repo.session.query(OrganizationState).delete()
        self.org_repo.session.query(OrganizationMember).delete()
        self.org_repo.session.query(OrganizationAddress).delete()
        self.org_repo.session.commit()
Exemple #9
0
from registry.application.handlers.slack_chat_operation_handler import get_list_of_service_pending_for_approval
from registry.application.handlers.slack_chat_operation_handler import slack_interaction_handler
from registry.infrastructure.repositories.organization_repository import OrganizationPublisherRepository
from registry.infrastructure.repositories.service_publisher_repository import ServicePublisherRepository
from registry.infrastructure.models import Service as ServiceDBModel
from registry.infrastructure.models import ServiceState as ServiceStateDBModel
from registry.infrastructure.models import ServiceComment as ServiceCommentDBModel
from registry.infrastructure.models import Organization as OrganizationDBModel
from registry.infrastructure.models import OrganizationState as OrganizationStateDBModel
from registry.infrastructure.models import OrganizationAddress as OrganizationAddressDBModel
from registry.domain.models.organization import Organization as OrganizationDomainModel
from registry.constants import OrganizationStatus, ServiceStatus, OrganizationAddressType
from unittest.mock import patch
from urllib.parse import urlencode

org_repo = OrganizationPublisherRepository()
service_repo = ServicePublisherRepository()


class TestSlackChatOperation(TestCase):
    def setUp(self):
        pass

    @patch(
        "registry.application.services.slack_chat_operation.SlackChatOperation.validate_slack_user"
    )
    @patch(
        "registry.application.services.slack_chat_operation.SlackChatOperation.validate_slack_channel_id"
    )
    @patch(
        "registry.application.services.slack_chat_operation.SlackChatOperation.validate_slack_signature"
Exemple #10
0
 def setUp(self):
     self.org_repo = OrganizationPublisherRepository()
     self.service_repo = ServicePublisherRepository()
Exemple #11
0
class TestServiceEventConsumer(unittest.TestCase):
    def setUp(self):
        self.org_repo = OrganizationPublisherRepository()
        self.service_repo = ServicePublisherRepository()

    @patch("common.ipfs_util.IPFSUtil",
           return_value=Mock(
               read_bytesio_from_ipfs=Mock(return_value=""),
               read_file_from_ipfs=Mock(
                   return_value=json.loads(json.dumps(service_metadata))),
               write_file_in_ipfs=Mock(return_value="Q3E12")))
    @patch("common.boto_utils.BotoUtils.invoke_lambda",
           return_value={"statusCode": StatusCode.CREATED})
    @patch('common.s3_util.S3Util.push_io_bytes_to_s3')
    @patch('common.blockchain_util.BlockChainUtil')
    @patch(
        'registry.consumer.service_event_consumer.ServiceEventConsumer._fetch_tags'
    )
    def test_on_service_created_event(self, mock_fetch_tags,
                                      mock_block_chain_util, mock_s3_push,
                                      mock_boto, mock_ipfs):
        org_uuid = str(uuid4())
        service_uuid = str(uuid4())
        self.org_repo.add_item(
            Organization(name="test_org",
                         org_id="test_org_id",
                         uuid=org_uuid,
                         org_type="organization",
                         description="that is the dummy org for testcases",
                         short_description="that is the short description",
                         url="https://dummy.url",
                         contacts=[],
                         assets={},
                         duns_no=12345678,
                         origin="PUBLISHER_DAPP",
                         groups=[],
                         addresses=[],
                         metadata_ipfs_uri="#dummyhashdummyhash"))
        self.service_repo.add_item(
            Service(org_uuid=org_uuid,
                    uuid=service_uuid,
                    display_name="test_display_name",
                    service_id="test_service_id",
                    metadata_uri="Qasdfghjklqwertyuiopzxcvbnm",
                    short_description="test_short_description",
                    description="test_description",
                    project_url="https://dummy.io",
                    ranking=1,
                    created_on=datetime.utcnow(),
                    updated_on=datetime.utcnow()))
        self.service_repo.add_item(
            ServiceState(row_id=randrange(10000),
                         org_uuid=org_uuid,
                         service_uuid=service_uuid,
                         state=ServiceStatus.DRAFT.value,
                         transaction_hash='0x1234',
                         created_by="dummy_user",
                         updated_by="dummy_user",
                         created_on=datetime.utcnow(),
                         updated_on=datetime.utcnow()))
        self.service_repo.add_item(
            ServiceGroup(row_id=randrange(1000),
                         org_uuid=org_uuid,
                         service_uuid=service_uuid,
                         group_id="test_group_id",
                         endpoints={
                             "https://dummydaemonendpoint.io": {
                                 "verfied": True
                             }
                         },
                         daemon_address=["0xq2w3e4rr5t6y7u8i9"],
                         free_calls=10,
                         free_call_signer_address="0xq2s3e4r5t6y7u8i9o0",
                         created_on=datetime.utcnow(),
                         updated_on=datetime.utcnow()))
        event = {
            "data": {
                'row_id': 202,
                'block_no': 6325625,
                'event': 'ServiceCreated',
                'json_str':
                "{'orgId': b'test_org_id\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00', 'serviceId': b'test_service_id\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00', 'metadataURI': b'ipfs://QmdGjaVYPMSGpC1qT3LDALSNCCu7JPf7j51H1GQirvQJYf\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}",
                'processed': b'\x00',
                'transactionHash': '0x12345',
                'logIndex': '0',
                'error_code': 1,
                'error_msg': '',
                'row_updated': datetime(2019, 10, 21, 9, 59, 37),
                'row_created': datetime(2019, 10, 21, 9, 59, 37)
            },
            "name": "ServiceCreated"
        }

        mock_fetch_tags.return_value = ["tag1", "tag2"]
        mock_s3_push.return_value = "https://test-s3-push"
        service_event_consumer = ServiceCreatedEventConsumer(
            "wss://ropsten.infura.io/ws", "http://ipfs.singularitynet.io", 80,
            self.service_repo, self.org_repo)
        service_event_consumer.on_event(event=event)

        published_service = self.service_repo.get_service_for_given_service_uuid(
            org_uuid, service_uuid)

        self.assertEqual(["tag1", "tag2"], published_service.tags)
        self.assertEqual(ServiceStatus.PUBLISHED.value,
                         published_service.service_state.state)
        self.assertEqual(service_metadata["display_name"],
                         published_service.display_name)
        self.assertEqual(
            service_metadata["service_description"]["description"],
            published_service.description)
        self.assertEqual(
            service_metadata["service_description"]["short_description"],
            published_service.short_description)
        self.assertEqual(service_metadata["service_description"]["url"],
                         published_service.project_url)
        self.assertDictEqual(
            {
                "encoding": "proto",
                "service_type": "grpc",
                "model_ipfs_hash":
                "QmXqonxB9EvNBe11J8oCYXMQAtPKAb2x8CyFLmQpkvVaLf"
            }, published_service.proto)
        self.assertEqual(service_metadata["mpe_address"],
                         published_service.mpe_address)
        self.assertEqual(
            "ipfs://QmdGjaVYPMSGpC1qT3LDALSNCCu7JPf7j51H1GQirvQJYf",
            published_service.metadata_uri)
        self.assertDictEqual(service_metadata["contributors"][0],
                             published_service.contributors[0])

        group = published_service.groups[0]
        expected_group = service_metadata["groups"][0]

        self.assertEqual(expected_group["daemon_addresses"],
                         group.daemon_address)
        self.assertEqual(expected_group["group_name"], group.group_name)
        self.assertEqual(expected_group["endpoints"], group._get_endpoints())
        self.assertEqual(expected_group["free_calls"], group.free_calls)
        self.assertEqual(expected_group["free_call_signer_address"],
                         group.free_call_signer_address)
        self.assertEqual(expected_group["group_id"], group.group_id)
        self.assertEqual(expected_group["pricing"], group.pricing)

    @patch("common.ipfs_util.IPFSUtil",
           return_value=Mock(
               read_bytesio_from_ipfs=Mock(return_value=""),
               read_file_from_ipfs=Mock(
                   return_value=json.loads(json.dumps(service_metadata))),
               write_file_in_ipfs=Mock(return_value="Q3E12")))
    @patch('common.s3_util.S3Util.push_io_bytes_to_s3')
    @patch('common.blockchain_util.BlockChainUtil')
    @patch(
        'registry.consumer.service_event_consumer.ServiceEventConsumer._fetch_tags'
    )
    def test_on_service_created_event_from_snet_cli(self, mock_fetch_tags,
                                                    mock_block_chain_util,
                                                    mock_s3_push, mock_ipfs):
        org_uuid = str(uuid4())
        self.org_repo.add_item(
            Organization(name="test_org",
                         org_id="test_org_id",
                         uuid=org_uuid,
                         org_type="organization",
                         description="that is the dummy org for testcases",
                         short_description="that is the short description",
                         url="https://dummy.url",
                         contacts=[],
                         assets={},
                         duns_no=12345678,
                         origin="PUBLISHER_DAPP",
                         groups=[],
                         addresses=[],
                         metadata_ipfs_uri="#dummyhashdummyhash"))

        event = {
            "data": {
                'row_id': 202,
                'block_no': 6325625,
                'event': 'ServiceCreated',
                'json_str':
                "{'orgId': b'test_org_id\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00', 'serviceId': b'test_service_id\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00', 'metadataURI': b'ipfs://QmdGjaVYPMSGpC1qT3LDALSNCCu7JPf7j51H1GQirvQJYf\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'}",
                'processed': b'\x00',
                'transactionHash': '0x12345',
                'logIndex': '0',
                'error_code': 1,
                'error_msg': '',
                'row_updated': datetime(2019, 10, 21, 9, 59, 37),
                'row_created': datetime(2019, 10, 21, 9, 59, 37)
            },
            "name": "ServiceCreated"
        }

        mock_fetch_tags.return_value = ["tag1", "tag2"]
        mock_s3_push.return_value = "https://test-s3-push"
        service_event_consumer = ServiceCreatedEventConsumer(
            "wss://ropsten.infura.io/ws", "http://ipfs.singularitynet.io", 80,
            self.service_repo, self.org_repo)
        service_event_consumer.on_event(event=event)

        org_uuid, published_service = self.service_repo.get_service_for_given_service_id_and_org_id(
            "test_org_id", "test_service_id")
        self.assertEqual(["tag1", "tag2"], published_service.tags)
        self.assertEqual(ServiceStatus.PUBLISHED_UNAPPROVED.value,
                         published_service.service_state.state)
        self.assertEqual(service_metadata["display_name"],
                         published_service.display_name)
        self.assertEqual(
            service_metadata["service_description"]["description"],
            published_service.description)
        self.assertEqual(
            service_metadata["service_description"]["short_description"],
            published_service.short_description)
        self.assertEqual(service_metadata["service_description"]["url"],
                         published_service.project_url)
        self.assertDictEqual(
            {
                "encoding": "proto",
                "service_type": "grpc",
                "model_ipfs_hash":
                "QmXqonxB9EvNBe11J8oCYXMQAtPKAb2x8CyFLmQpkvVaLf"
            }, published_service.proto)
        self.assertEqual(service_metadata["mpe_address"],
                         published_service.mpe_address)
        self.assertDictEqual(service_metadata["contributors"][0],
                             published_service.contributors[0])

        group = published_service.groups[0]
        expected_group = service_metadata["groups"][0]

        self.assertEqual(expected_group["daemon_addresses"],
                         group.daemon_address)
        self.assertEqual(expected_group["group_name"], group.group_name)
        self.assertEqual(expected_group["endpoints"], group._get_endpoints())
        self.assertEqual(expected_group["free_calls"], group.free_calls)
        self.assertEqual(expected_group["free_call_signer_address"],
                         group.free_call_signer_address)
        self.assertEqual(expected_group["group_id"], group.group_id)
        self.assertEqual(expected_group["pricing"], group.pricing)

    def tearDown(self):
        self.org_repo.session.query(Organization).delete()
        self.org_repo.session.query(Service).delete()
        self.org_repo.session.query(ServiceGroup).delete()
        self.org_repo.session.query(ServiceState).delete()
        self.org_repo.session.query(ServiceReviewHistory).delete()
        self.org_repo.session.commit()