Beispiel #1
0
def get_client(task: BaseTask) -> ZGWClient:
    # find the configured service
    task_variables = task.get_variables()
    app_id = task_variables.get(PROCESS_VAR_NAME)
    topic_name = task.topic_name

    default_services = DefaultService.objects.filter(
        task_mapping__topic_name=topic_name,
        service__api_type=APITypes.orc,
        alias=ALIAS).select_related("service")

    if not default_services:
        raise NoService(
            f"Topic '{topic_name}' is missing service with alias '{ALIAS}'.")

    service = default_services[0].service
    client = service.build_client()
    client._log.task = task
    client.operation_suffix_mapping = {
        **client.operation_suffix_mapping,
        "retrieve": "_retrieve",
    }

    # set the auth if we have the bptlAppId set
    if app_id:
        auth_headers = get_credentials(app_id, service)[service]
        if auth_headers:
            client.set_auth_value(auth_headers)

    return client
Beispiel #2
0
 def get_client_for(self, document_url: str) -> ZGWClient:
     for client in self._clients:
         if document_url.startswith(client.base_url):
             return client
     else:
         service = Service.get_service(document_url)
         auth_headers = get_credentials(self.app_id, service).get(service)
         client = service.build_client()
         if auth_headers:
             client.set_auth_value(auth_headers)
         return client
Beispiel #3
0
    def get_client(self, service_type: str):
        """
        create ZGW client with requested parameters
        """
        task_variables = self.task.get_variables()
        topic_name = self.task.topic_name
        default_services = DefaultService.objects.filter(
            task_mapping__topic_name=topic_name,
            service__api_type=service_type).select_related("service")

        if not default_services:
            raise NoService(
                f"No {service_type} service is configured for topic '{topic_name}'"
            )
        if len(default_services) > 1:
            raise MultipleServices(
                f"Multiple '{service_type}' services configured for topic '{topic_name}'"
            )

        service = default_services[0].service

        client = service.build_client()
        client._log.task = self.task

        if PROCESS_VAR_NAME not in task_variables and "services" not in task_variables:
            raise NoService("Could not determine service credentials.")

        if PROCESS_VAR_NAME in task_variables:
            app_id = task_variables[PROCESS_VAR_NAME]
            auth_headers = get_credentials(app_id, service)[service]
            if auth_headers:
                client.set_auth_value(auth_headers)

        # fall back on the old behaviour
        else:
            warnings.warn(
                "The 'services' credentials variable is deprecated. Please migrate "
                f"as soon as possible to the new {PROCESS_VAR_NAME} application identifier "
                "variable",
                DeprecationWarning,
            )
            services_vars = task_variables["services"]
            alias = default_services[0].alias
            jwt = services_vars.get(alias, {}).get("jwt")
            if not jwt:
                raise NoAuth(
                    f"Expected 'jwt' key for service with alias '{alias}'")
            client.set_auth_value({"Authorization": jwt})

        return client
Beispiel #4
0
def get_client(task: BaseTask) -> ZGWClient:
    service = get_alias_service(task, ALIAS)

    client = service.build_client()
    client._log.task = task

    # set the auth if we have the bptlAppId set
    app_id = task.get_variables().get(APP_ID_PROCESS_VAR_NAME)
    if app_id:
        auth_headers = get_credentials(app_id, service)[service]
        if auth_headers:
            client.set_auth_value(auth_headers)

    # export the client
    return client
Beispiel #5
0
def get_client(task: BaseTask, service: Service, cls=None) -> "JSONClient":
    """
    Get a client instance for the given task and service.

    :param task: An instance of the work unit task being executed
    :param service: The service to build an authenticated client for
    :param cls: The particular (sub)class to use for the client instance. Defaults to
      :class:`JSONClient`.
    """
    cls = cls or JSONClient
    app_id = task.get_variables().get(APP_ID_PROCESS_VAR_NAME)
    auth_header = get_credentials(app_id, service)[service]

    # export the client
    client = cls(service, auth_header)
    client.task = task
    return client
Beispiel #6
0
    def populate_clients(self, task, document_urls: List[str]) -> None:
        # fetch all the DRC services, single query
        drcs = Service.objects.filter(api_type=APITypes.drc)
        # only keep the DRCs that we actually need
        _relevant_drcs = []
        for drc in drcs:
            if any(doc.startswith(drc.api_root) for doc in document_urls):
                _relevant_drcs.append(drc)
                continue

        # support for old services-style credentials, remove in 1.1
        if self._services:
            default_services = DefaultService.objects.filter(
                task_mapping__topic_name=task.topic_name,
                service__in=_relevant_drcs,
            ).select_related("service")
            default_service_aliases = {
                default_service.service: default_service.alias
                for default_service in default_services
            }

        # build the clients
        service_credentials = get_credentials(self.app_id, *_relevant_drcs)
        for drc in sorted(_relevant_drcs,
                          key=lambda svc: len(svc.api_root),
                          reverse=True):
            client = drc.build_client()

            auth_headers = service_credentials.get(drc)
            if self.app_id and auth_headers:
                client.set_auth_value(auth_headers)
            elif self._services:
                warnings.warn(
                    "Support for credentials in services variable will be removed in 1.1",
                    DeprecationWarning,
                )
                alias = default_service_aliases[drc]
                jwt = self._services.get(alias, {}).get("jwt")
                if jwt:
                    client.set_auth_value(jwt)

            client._log.task = task
            self._clients.append(client)