wyzhang <wyzhang@google.com>: Author Summary

Builds triggered by wyzhang <wyzhang@google.com>

Builds triggered by an author are those builds which contains changes committed by the author.
258
32 (12%)
226 (88%)

Breakages and fixes

Broken means the build has failed but the previous build was successful.
Fixed means that the build was successful but the previous build has failed.
17 (7% of all builds triggered)
12 (5% of all builds triggered)
-5
Build Completed Code commits Tests
CDAP › DUT › #3384 5 days ago
CDAP-18272: Fix missing binding for InternalAuthenticator
Otherwise wrangler fails to load data with the following error

1) No implementation for io.cdap.cdap.common.internal.remote.InternalAuthenticator was bound.
   while locating io.cdap.cdap.common.internal.remote.InternalAuthenticator
    for parameter 1 at io.cdap.cdap.common.internal.remote.RemoteClientFactory.<init>(RemoteClientFactory.java:36)
   while locating io.cdap.cdap.common.internal.remote.RemoteClientFactory
     for parameter 0 at io.cdap.cdap.security.store.client.RemoteSecureStore.<init>(RemoteSecureStore.java:58)
   at io.cdap.cdap.security.guice.SecureStoreClientModule.configure(SecureStoreClientModule.java:33)

...

6) No implementation for io.cdap.cdap.common.internal.remote.InternalAuthenticator was bound.
  while locating io.cdap.cdap.common.internal.remote.InternalAuthenticator
    for parameter 1 at io.cdap.cdap.common.internal.remote.RemoteClientFactory.<init>(RemoteClientFactory.java:36)
  while locating io.cdap.cdap.common.internal.remote.RemoteClientFactory
    for parameter 1 at io.cdap.cdap.internal.app.worker.RemoteWorkerPluginFinder.<init>(RemoteWorkerPluginFinder.java:42)
  at io.cdap.cdap.internal.app.worker.SystemAppModule.configure(SystemAppModule.java:70)
Merge pull request #13578 from cdapio/bug/CDAP-18272/wyzhang-rbac-wrangler
CDAP-18272: Fix missing binding for InternalAuthenticator
3064 passed
CDAP › RUT › #1567 5 days ago
Merge pull request #13578 from cdapio/bug/CDAP-18272/wyzhang-rbac-wrangler
CDAP-18272: Fix missing binding for InternalAuthenticator
CDAP-18272: Fix missing binding for InternalAuthenticator
Otherwise wrangler fails to load data with the following error

1) No implementation for io.cdap.cdap.common.internal.remote.InternalAuthenticator was bound.
   while locating io.cdap.cdap.common.internal.remote.InternalAuthenticator
    for parameter 1 at io.cdap.cdap.common.internal.remote.RemoteClientFactory.<init>(RemoteClientFactory.java:36)
   while locating io.cdap.cdap.common.internal.remote.RemoteClientFactory
     for parameter 0 at io.cdap.cdap.security.store.client.RemoteSecureStore.<init>(RemoteSecureStore.java:58)
   at io.cdap.cdap.security.guice.SecureStoreClientModule.configure(SecureStoreClientModule.java:33)

...

6) No implementation for io.cdap.cdap.common.internal.remote.InternalAuthenticator was bound.
  while locating io.cdap.cdap.common.internal.remote.InternalAuthenticator
    for parameter 1 at io.cdap.cdap.common.internal.remote.RemoteClientFactory.<init>(RemoteClientFactory.java:36)
  while locating io.cdap.cdap.common.internal.remote.RemoteClientFactory
    for parameter 1 at io.cdap.cdap.internal.app.worker.RemoteWorkerPluginFinder.<init>(RemoteWorkerPluginFinder.java:42)
  at io.cdap.cdap.internal.app.worker.SystemAppModule.configure(SystemAppModule.java:70)
3064 passed
CDAP › BPP › #1801 5 days ago
CDAP-18272: Fix missing binding for InternalAuthenticator
Otherwise wrangler fails to load data with the following error

1) No implementation for io.cdap.cdap.common.internal.remote.InternalAuthenticator was bound.
   while locating io.cdap.cdap.common.internal.remote.InternalAuthenticator
    for parameter 1 at io.cdap.cdap.common.internal.remote.RemoteClientFactory.<init>(RemoteClientFactory.java:36)
   while locating io.cdap.cdap.common.internal.remote.RemoteClientFactory
     for parameter 0 at io.cdap.cdap.security.store.client.RemoteSecureStore.<init>(RemoteSecureStore.java:58)
   at io.cdap.cdap.security.guice.SecureStoreClientModule.configure(SecureStoreClientModule.java:33)

...

6) No implementation for io.cdap.cdap.common.internal.remote.InternalAuthenticator was bound.
  while locating io.cdap.cdap.common.internal.remote.InternalAuthenticator
    for parameter 1 at io.cdap.cdap.common.internal.remote.RemoteClientFactory.<init>(RemoteClientFactory.java:36)
  while locating io.cdap.cdap.common.internal.remote.RemoteClientFactory
    for parameter 1 at io.cdap.cdap.internal.app.worker.RemoteWorkerPluginFinder.<init>(RemoteWorkerPluginFinder.java:42)
  at io.cdap.cdap.internal.app.worker.SystemAppModule.configure(SystemAppModule.java:70)
Merge pull request #13578 from cdapio/bug/CDAP-18272/wyzhang-rbac-wrangler
CDAP-18272: Fix missing binding for InternalAuthenticator
Testless build
CDAP › DRC › #5533 5 days ago
CDAP-18272: Fix missing binding for InternalAuthenticator
Otherwise wrangler fails to load data with the following error

1) No implementation for io.cdap.cdap.common.internal.remote.InternalAuthenticator was bound.
   while locating io.cdap.cdap.common.internal.remote.InternalAuthenticator
    for parameter 1 at io.cdap.cdap.common.internal.remote.RemoteClientFactory.<init>(RemoteClientFactory.java:36)
   while locating io.cdap.cdap.common.internal.remote.RemoteClientFactory
     for parameter 0 at io.cdap.cdap.security.store.client.RemoteSecureStore.<init>(RemoteSecureStore.java:58)
   at io.cdap.cdap.security.guice.SecureStoreClientModule.configure(SecureStoreClientModule.java:33)

...

6) No implementation for io.cdap.cdap.common.internal.remote.InternalAuthenticator was bound.
  while locating io.cdap.cdap.common.internal.remote.InternalAuthenticator
    for parameter 1 at io.cdap.cdap.common.internal.remote.RemoteClientFactory.<init>(RemoteClientFactory.java:36)
  while locating io.cdap.cdap.common.internal.remote.RemoteClientFactory
    for parameter 1 at io.cdap.cdap.internal.app.worker.RemoteWorkerPluginFinder.<init>(RemoteWorkerPluginFinder.java:42)
  at io.cdap.cdap.internal.app.worker.SystemAppModule.configure(SystemAppModule.java:70)
Merge pull request #13578 from cdapio/bug/CDAP-18272/wyzhang-rbac-wrangler
CDAP-18272: Fix missing binding for InternalAuthenticator
Testless build
CDAP › RUT › #1543 4 weeks ago
CDAP-18010: Code refactoring to move parentClassloader creation into DefaultArtifactInspector
This is part 2 of isolating artifact inspection.

Why:
Currently artifact inspection caller creates parent classloader and
then pass to inspector. This requires duplicating the logic of
parent classloader for local and remote execution.

Moving the parent classloader creation into DefaultArtifactInspector
avoids such duplication.

BEFORE
- artifact inspection
  CreateParentClassLoader()
     DefaultArtifactInspector(ArtifactId, parentClassLoader)
       // Inspect artifact

AFTER
- artifact inspection
  getParentArtifactDescriptor()
  DefaultArtifactInspector (ArtifactId, parent ArtifactDescriptor)
    CreateParentClassLoader(parent ArtifactDescriptor)
    // Inspect artifact

FUTURE
- local artifact inspection
    getParentArtifactDescriptor()
      DefaultArtifactInspector (ArtifactId, parent ArtifactDescriptor)
        CreateParentClassLoader(parent ArtifactDescriptor)
        // Inpsect artifact
- remote artifact inspection:
  getParentArtifactDescriptor()
    CallRemote(parent ArtifactDescriptor)
      DefaultArtifactInspector (ArtifactId, parent ArtifactDescriptor)
        CreateParentClassLoader(parent ArtifactDescriptor)
        // Inspect artifact
Merge pull request #13493 from cdapio/feature/CDAP-18010/wyzhang-pod-isolation-artifact-part2
CDAP-18010: Code refactoring to move parentClassloader creation into DefaultArtifactInspector
3035 passed
CDAP › DUT › #3360 4 weeks ago
CDAP-18010: Code refactoring to move parentClassloader creation into DefaultArtifactInspector
This is part 2 of isolating artifact inspection.

Why:
Currently artifact inspection caller creates parent classloader and
then pass to inspector. This requires duplicating the logic of
parent classloader for local and remote execution.

Moving the parent classloader creation into DefaultArtifactInspector
avoids such duplication.

BEFORE
- artifact inspection
  CreateParentClassLoader()
     DefaultArtifactInspector(ArtifactId, parentClassLoader)
       // Inspect artifact

AFTER
- artifact inspection
  getParentArtifactDescriptor()
  DefaultArtifactInspector (ArtifactId, parent ArtifactDescriptor)
    CreateParentClassLoader(parent ArtifactDescriptor)
    // Inspect artifact

FUTURE
- local artifact inspection
    getParentArtifactDescriptor()
      DefaultArtifactInspector (ArtifactId, parent ArtifactDescriptor)
        CreateParentClassLoader(parent ArtifactDescriptor)
        // Inpsect artifact
- remote artifact inspection:
  getParentArtifactDescriptor()
    CallRemote(parent ArtifactDescriptor)
      DefaultArtifactInspector (ArtifactId, parent ArtifactDescriptor)
        CreateParentClassLoader(parent ArtifactDescriptor)
        // Inspect artifact
Merge pull request #13493 from cdapio/feature/CDAP-18010/wyzhang-pod-isolation-artifact-part2
CDAP-18010: Code refactoring to move parentClassloader creation into DefaultArtifactInspector
3035 passed
CDAP › DRC › #5504 4 weeks ago
Merge pull request #13493 from cdapio/feature/CDAP-18010/wyzhang-pod-isolation-artifact-part2
CDAP-18010: Code refactoring to move parentClassloader creation into DefaultArtifactInspector
CDAP-18010: Code refactoring to move parentClassloader creation into DefaultArtifactInspector
This is part 2 of isolating artifact inspection.

Why:
Currently artifact inspection caller creates parent classloader and
then pass to inspector. This requires duplicating the logic of
parent classloader for local and remote execution.

Moving the parent classloader creation into DefaultArtifactInspector
avoids such duplication.

BEFORE
- artifact inspection
  CreateParentClassLoader()
     DefaultArtifactInspector(ArtifactId, parentClassLoader)
       // Inspect artifact

AFTER
- artifact inspection
  getParentArtifactDescriptor()
  DefaultArtifactInspector (ArtifactId, parent ArtifactDescriptor)
    CreateParentClassLoader(parent ArtifactDescriptor)
    // Inspect artifact

FUTURE
- local artifact inspection
    getParentArtifactDescriptor()
      DefaultArtifactInspector (ArtifactId, parent ArtifactDescriptor)
        CreateParentClassLoader(parent ArtifactDescriptor)
        // Inpsect artifact
- remote artifact inspection:
  getParentArtifactDescriptor()
    CallRemote(parent ArtifactDescriptor)
      DefaultArtifactInspector (ArtifactId, parent ArtifactDescriptor)
        CreateParentClassLoader(parent ArtifactDescriptor)
        // Inspect artifact
Testless build
CDAP › DUT › #3353 1 month ago
address comments
Merge pull request #13494 from cdapio/feature/CDAP-18010/wyzhang-pod-isolation-artifact-part3
CDAP-18010: Remove unused http REST endpoint TaskWorkerHttpHandlerInternal
remove the test cases that are no longer needed
CDAP-18010: Remove unused http REST endpoint TaskWorkerHttpHandlerInternal
Why:
This REST endpoint was introduced with the intention for artifact inspector
to upload artifact jar to run inspection in task worker.

Changing the implementation to upload jar to HDFS/GCS and send the location
to task worker service for it to download the jar, thus this REST endpoint
is obsolete and no longer needed.
3033 passed
CDAP › RUT › #1536 1 month ago
CDAP-18010: Remove unused http REST endpoint TaskWorkerHttpHandlerInternal
Why:
This REST endpoint was introduced with the intention for artifact inspector
to upload artifact jar to run inspection in task worker.

Changing the implementation to upload jar to HDFS/GCS and send the location
to task worker service for it to download the jar, thus this REST endpoint
is obsolete and no longer needed.
remove the test cases that are no longer needed
address comments
Merge pull request #13494 from cdapio/feature/CDAP-18010/wyzhang-pod-isolation-artifact-part3
CDAP-18010: Remove unused http REST endpoint TaskWorkerHttpHandlerInternal
3033 passed
CDAP › DRC › #5497 1 month ago
remove the test cases that are no longer needed
CDAP-18010: Remove unused http REST endpoint TaskWorkerHttpHandlerInternal
Why:
This REST endpoint was introduced with the intention for artifact inspector
to upload artifact jar to run inspection in task worker.

Changing the implementation to upload jar to HDFS/GCS and send the location
to task worker service for it to download the jar, thus this REST endpoint
is obsolete and no longer needed.
Merge pull request #13494 from cdapio/feature/CDAP-18010/wyzhang-pod-isolation-artifact-part3
CDAP-18010: Remove unused http REST endpoint TaskWorkerHttpHandlerInternal
address comments
Testless build
Build Completed Code commits Tests
CDAP › RUT › #1526 1 month ago
Merge pull request #13484 from cdapio/bug/CDAP-18076/wyzhang-task-worker-certificate
CDAP-18076: Unset certificate path in CConfiguration when launching TaskWorkerTwillApplication
CDAP-18076: Unset certificate path in CConfiguration when launching TaskWorkerTwillApplication
Why:
TaskWorkerService is currently used to run user code in isolation and
cdap-security is not exposed to it. So it has no access to certificate.
Unset the path in the cConf for TaskWorkerService, so it will generate
a certifacte itself if SSL is enabled. This is fine for now as currently
there is no code path verify the certificate (e.g. always trust servers)
1 of 458 failed
CDAP › DUT › #3327 1 month ago
CDAP-18045: Introduce Tink-based cipher class to be used later for encrypting credentials
Merge pull request #13456 from cdapio/feature/CDAP-18045/wyzhang-euc-20
CDAP-18045: Introduce Tink-based cipher class to be used later for encrypting credentials
1 of 2500 failed
CDAP › RUT › #1496 1 month ago
CDAP-18010: Run artifact inspection in isolation.
Part 1: Add an endpoint in task worker to allow submit tasks via query params.
Part 2: Allow new endpoint to allow uploading a file which is made
        available for task runnable via RunnableTaskContext

Why:
Artifact inspection takes places right after upload completes, it resides
in a temp dir in appfab. To run artifact inspection in worker pod, appfab
needs to send file over. Current rest endpoint "/run" use request body
to store task specification, which makes it challenging to send file
as well. Thus introducing a new endpoint to specify task specifiction
via query parameter, then file content can be streamed over via
request body.
Merge pull request #13413 from cdapio/feature/CDAP-18010/wyzhang-pod-isolation-artifact-part1
CDAP-18010: Run artifact inspection in isolation.
1 of 1221 failed
CDAP › DUT › #3311 1 month ago
Merge pull request #13413 from cdapio/feature/CDAP-18010/wyzhang-pod-isolation-artifact-part1
CDAP-18010: Run artifact inspection in isolation.
CDAP-18010: Run artifact inspection in isolation.
Part 1: Add an endpoint in task worker to allow submit tasks via query params.
Part 2: Allow new endpoint to allow uploading a file which is made
        available for task runnable via RunnableTaskContext

Why:
Artifact inspection takes places right after upload completes, it resides
in a temp dir in appfab. To run artifact inspection in worker pod, appfab
needs to send file over. Current rest endpoint "/run" use request body
to store task specification, which makes it challenging to send file
as well. Thus introducing a new endpoint to specify task specifiction
via query parameter, then file content can be streamed over via
request body.
1 of 2484 failed
CDAP › DUT › #3284 2 months ago
address comments
add comments and fix logs msg
Add copyrights
Checkpoint: task dispatcher and task worker pods & services are up
Test more than 1 worker: fix worker http server port and have 2 worker
Adding http handler for task worker
Extend TaskWorkerServiceTest to cover all http endpoints
fix incorrect comment
Make TaskDispatchServer launch worker pool via TaskWorkerTwillApplication
Adding missing TwillRunnerService startup, otherwise twill application launch fails with k8s apiClient null exception
change task worker http port 80->11020
address comments
Add TaskWorkerTwillApp -> TaskRunnableTwillRunnable -> TaskWorkerService
Samll fix for missing default paramter causing null pointer exception
Add TaskDispatcherServiceMain
Simplify client->dispatcher->workerpool to client->workerpool
Checkpoint: task dispatcher http and worker http test passed
Make TaskDispatcher http handler call TaskWorker http handler
1 of 2471 failed
CDAP › RUT › #1436 4 months ago
Merge pull request #13296 from cdapio/bug/CDAP-17837-dev
[CDAP-17837] Add auth enforcement for profile at system namespace
[CDAP-17837] Add auth enforcement for profile at system namespace
1 of 2455 failed
CDAP › DUT › #3249 4 months ago
[CDAP-17837] Add auth enforcement for profile at system namespace
Merge pull request #13296 from cdapio/bug/CDAP-17837-dev
[CDAP-17837] Add auth enforcement for profile at system namespace
1 of 2455 failed
CDAP › RUT › #1430 4 months ago
Merge pull request #13281 from cdapio/bugfix-ui/CDAP-17822
[CDAP-17822] Properly strip auth headers in response sent back to client in PROXY mode
1 of 2451 failed
CDAP › RUT › #1428 4 months ago
[CDAP-17800] Add auth enforcement for profile http handler
Merge pull request #13264 from cdapio/bug/CDAP-17800
[CDAP-17800] Add auth enforcement for profile http handler
1 of 2451 failed
CDAP › RUT › #1108 1 year ago
Merge pull request #12092 from cdapio/feature/CDAP-16610/wyzhang/cherrypick/runtime
(CDAP-16610) Fixing DataprocUtils.getBucketName null pointer exception
Merge pull request #12126 from cdapio/feature/CDAP-16672/cherrypick/dataproc
(CDAP-16672) Support GCP Dataproc cluster property override via cdap-site.xml
(CDAP-16672) Support GCP Dataproc cluster property override via cdap-site.xml
Why:
When creating Dataproc cluster, overriding cluster properties
(i.e. property key-val pairs in config files) cannot be done dynamically.
Currenlty they are hard-coded.

What:
This change gets property overrides from ProvisionerSystemContext and set them
in the context used for dataproc creation, which get passed to Dataproc via
creation API.

How to use:
Format of property override in cdap-site.xml:
"[prefix].gcp-dataproc.[dataproc config file]:[property key]" : "[property val]"
where "prefix" is "provisioner.system.properties"

E.g.
provisioner.system.properties.gcp-dataproc.capacity-scheduler:yarn.scheduler.capacity.maximum-am-resource-percent: "0.5"

Needs to comply with format
"[prefix].gcp-dataproc.[dataproc config file]:[property key]" : "[property val]"
(CDAP-16610) Fixing DataprocUtils.getBucketName null pointer exception
Why:
Starting a pipline failed with the null pointer exception.

What:
This bucket is used for launching jobs in dataproc. Its name is set
via provisioner.system.properties.gcp-dataproc.bucket which is in
system context. But we failed to propagate it to the context
when setting one up for runtime job manager
1 of 1139 failed
Build Completed Code commits Tests
CDAP › DUT › #3334 1 month ago
CDAP-17981: Introduce FileFetcherInternalHttpHandler in AppFabric
This is intended to be used for appfab to proxy files from distributed
file system, since it is possible that other services may not have
direct access to the distributed file system (e.g. in k8s where we
may want to run user code in isolated pods which don't have permission
to access distributed file system that appfab has access to)
Merge pull request #13465 from cdapio/feature/CDAP-17981/wyzhang-file-fetcher
CDAP-17981: Introduce FileFetcherInternalHttpHandler in AppFabric
3032 passed
CDAP › RUT › #1509 1 month ago
Merge pull request #13462 from cdapio/bugfix/CDAP-18053
CDAP-18053: Fix hanging issue of testConcurrentRequests in TaskWorkerServiceTest
3023 passed
CDAP › DUT › #3326 1 month ago
Merge pull request #13462 from cdapio/bugfix/CDAP-18053
CDAP-18053: Fix hanging issue of testConcurrentRequests in TaskWorkerServiceTest
3023 passed
CDAP › RUT › #1431 4 months ago
[CDAP-17833] Add auth enforcement for log http handler
Merge pull request #13286 from cdapio/bug/CDAP-17833/authForLogHttp
[CDAP-17833] Add auth enforcement for log http handler
2957 passed
CDAP › RUT › #1111 1 year ago
Merge pull request #12142 from cdapio/bugfix/CDAP-16730/wyzhang/kubeMem
(CDAP-16730) Set correct -xmx for pods in k8s to run programs
(CDAP-16730) Set correct -xmx for pods in k8s to run programs
Bug:
We have introduced a multiplier to determine the actual CPU and RAM
to request for creating the pod to run a program. But we fail to
set the correct -xmx based on the RAM requested for the pod.

This change
- Set memory requested to be memory * multiplier
- Set xmx using org.apache.twill.internal.utils.Resources.computeMaxHeapSiz
  based on the memory request size
2713 passed
CDAP › RUT › #1073 1 year ago
Merge pull request #12022 from cdapio/feature/CDAP-16353/wyzhang/preview/providers
(CDAP-16353) Add binding providers to allow local vs remote bindings
(CDAP-16353) Add binding providers to allow local vs remote bindings
Motivation:
We have local vs remote implications for
* ApplicationDetailFetcher
* ArtifactRepositoryReader
* PluginFinder
* PreferencesFetcher

This change introduces providers for each of them to bind interface
to local impl for SQL and remote for NOSQL
2702 passed
CDAP › DUT › #2870 1 year ago
{CDAP-16353) Implement LocalApplicationDetailFetcher to get ApplicationDetail
Motiviation:
Having local vs remote impliation for ApplicationDetailFetcher allows us to
fetcher ApplicationDetail from local when using shared SQL as storage and
from remote when using non-sharing NOSQL.

We have already implemented RemoteApplicationDetailFetcher. This change is
to introduce a local version.

Currently neither local nor remote is being used. A follow-up PR
will make profile metadata service use either local or remote depending on
storage implementation configuration.
(CDAP-16353) Cleanup: remove MetadataServiceModule from AppFabricServiceRuntimeModule
Reason:
MetadataServiceModule contains metadata and lineage http handler bindings and
a binding for MetadataAdmin.  All these are specific to metadata service and are
not needed by AppFabric.
Merge pull request #12010 from cdapio/feature/CDAP-16353/wyzhang/fetcher
{CDAP-16353) Implement LocalApplicationDetailFetcher to get ApplicationDetail
Merge pull request #12012 from cdapio/feature/CDAP-16353/wyzhang/cleanup/module
(CDAP-16353) Cleanup: remove MetadataServiceModule from AppFabricServiceRuntimeModule
2691 passed
IT › UPD2 › #468 1 year ago
(CDAP-16353) Replace ArtifactRepository param with PluginFinder for AbstractConfigurer
Motivation:
AbstractConfigurer uses ArtifactRepository just to find the artifact for a given plugin,
this functionality is already provided by PluginFinder which has local and remote implementations,
thereby allowing us to use local impl when having shared SQL and remote version for non-shared
per service local levelDB.
Merge pull request #11988 from cdapio/feature/CDAP-16353/wyzhang/preview/pluginFinder
(CDAP-16353) Replace ArtifactRepository param with PluginFinder for AbstractConfigurer…
Merge pull request #12000 from cdapio/feature/CDAP-16353/wyzhang/cleanup
(CDAP-16353) Adding a log entry for twill program termination status
(CDAP-16353) Adding an info log entry for twill program termination status
This is to facilitate debugging.
Testless build
CDAP › RUT › #1018 1 year ago
Merge pull request #11914 from cdapio/feature/CDAP-16353/wyzhang/leveldb/logs
(CDAP-16353)Add local/remote program run record fetcher for LogHttpHandler
(CDAP-16353) Add local/remote program run record fetcher for LogHttpHandler
2666 passed
CDAP › DUT › #2818 1 year ago
(CDAP-16353) Add clients for fetching ApplicationDetail, PreferencesDetail, ScheduleDetail
Merge pull request #11903 from cdapio/feature/CDAP-16353/wyzhang/leveldb/fetcher
Add client to fetch Application/Schedule/Preferences details
2665 passed