Support subfolders for distribution types for build and assemble locally and in Jenkins

Signed-off-by: Tianle Huang<EMAIL_ADDRESS>Description
Support subfolders for distribution types. E.g
current builds/opensearch/dist/ -> builds/opensearch/tar/dist/
current dist/opensearch/ -> dist/opensearch/rpm/
Issues Resolved
Resolves https://github.com/opensearch-project/opensearch-build/issues/1800
Check List

[x] Commits are signed per the DCO using --signoff

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.

Codecov Report

Merging #1807 (9a76320) into main (a7a7fb3) will increase coverage by 5.67%.
The diff coverage is n/a.

@@              Coverage Diff              @@
##               main     #1807      +/-   ##
=============================================
+ Coverage     94.32%   100.00%   +5.67%
=============================================
  Files           168         6     -162
  Lines          3507       105    -3402
  Branches          8        19      +11
=============================================
- Hits           3308       105    -3203
+ Misses          195         0     -195
+ Partials          4         0       -4

Impacted Files
Coverage Δ

src/assemble_workflow/bundle_file_location.py

src/assemble_workflow/bundle_location.py

src/assemble_workflow/bundle_locations.py

src/assemble_workflow/bundle_url_location.py

src/build_workflow/build_args.py

src/jenkins/BuildManifest.groovy

src/paths/assemble_output_dir.py

src/paths/build_output_dir.py

src/paths/output_dir.py

src/run_assemble.py

... and 164 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update a7a7fb3...9a76320. Read the comment docs.

Send for early feedback on the functional part. Local test, Jenkins test and unit tests will be added soon.
For now, I put the parameter DISTRIBUTION in the Jenkins input for ease of testing. I would suggest that we always build all supported distribution types together in one job. (Similar to x64 and arm64) Otherwise, I will also need to update the latest feature since different distributions could have a different latest build number.
https://ci.opensearch.org/ci/dbc/distribution-build-opensearch/1.1.1/latest/linux/x64/dist/opensearch/tar/manifest.yml
cc @peterzhuamazon @dblock

Local test for OSD:
Run this
./build.sh manifests/2.0.0/opensearch-dashboards-2.0.0.yml
The output is
2022-03-23 02:28:13 INFO     Created build manifest /usr/share/opensearch/workspace/opensearch-build/builds/opensearch-dashboards/tar/manifest.yml
2022-03-23 02:28:18 INFO     Done.

Verify that the tar subfolder is added.

Local test for assembling OSD
Run ./assemble.sh builds/opensearch-dashboards/tar/manifest.yml
The output is
./assemble.sh builds/opensearch-dashboards/tar/manifest.yml

Verify the file structure

Verify that the content of the manifest has the correct location information

Local test for building OS
Run  ./build.sh manifests/1.3.0/opensearch-1.3.0.yml
Output is
2022-03-23 02:38:48 INFO     Created build manifest /usr/share/opensearch/workspace/opensearch-build/builds/opensearch/tar/manifest.yml
2022-03-23 02:38:50 INFO     Done.

The file structure is

Local test for assembling OS
Run ./assemble.sh builds/opensearch/tar/manifest.yml
Output is
2022-03-23 02:46:23 INFO     Published /usr/share/opensearch/workspace/opensearch-build/dist/opensearch/tar/opensearch-1.3.0-linux-x64.tar.gz.
2022-03-23 02:46:23 INFO     Done.

File structure

Verify content of the manifest file about location

Jenkins test for OS
buildManifestUrl (arm64): https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.0/5/linux/arm64/builds/opensearch/tar/manifest.yml
artifactUrl (arm64): https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.0/5/linux/arm64/dist/opensearch/tar/opensearch-1.3.0-linux-arm64.tar.gz
buildManifestUrl (x64): https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.0/5/linux/x64/builds/opensearch/tar/manifest.yml
artifactUrl (x64): https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.0/5/linux/x64/dist/opensearch/tar/opensearch-1.3.0-linux-x64.tar.gz

Jenkins test for OSD, tar
buildManifestUrl (x64): https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianleh-osd-build-3-22/2.0.0/3/linux/x64/builds/opensearch-dashboards/tar/manifest.yml
artifactUrl (x64): https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianleh-osd-build-3-22/2.0.0/3/linux/x64/dist/opensearch-dashboards/tar/opensearch-dashboards-2.0.0-linux-x64.tar.gz
buildManifestUrl (arm64): https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianleh-osd-build-3-22/2.0.0/3/linux/arm64/builds/opensearch-dashboards/tar/manifest.yml
artifactUrl (arm64): https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianleh-osd-build-3-22/2.0.0/3/linux/arm64/dist/opensearch-dashboards/tar/opensearch-dashboards-2.0.0-linux-arm64.tar.gz

RPM build for OSD 2.0.0 failed. will try to see if 1.3.0 work
  │ info $ fpm --force -t rpm --package /tmp/tmpnngo78v2/OpenSearch-Dashboards/target/NAME-2.0.0-ARCH.TYPE -s dir --name opensearch-dashboards --description Explore and visualize your OpenSearch data --version 2.0.0 --url https://opensearch.org --vendor OpenSearch --maintainer OpenSearch Dashboards Team<EMAIL_ADDRESS>--license ASL 2.0 --conflicts opensearch-dashboards --after-install /tmp/tmpnngo78v2/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/package_scripts/post_install.sh --before-install /tmp/tmpnngo78v2/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/package_scripts/pre_install.sh --before-remove /tmp/tmpnngo78v2/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/package_scripts/pre_remove.sh --after-remove /tmp/tmpnngo78v2/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/package_scripts/post_remove.sh --config-files /etc/opensearch-dashboards/opensearch_dashboards.yml --template-value user=opensearch-dashboards --template-value group=opensearch-dashboards --template-value optimizeDir=/usr/share/opensearch-dashboards/optimize --template-value configDir=/etc/opensearch-dashboards --template-value pluginsDir=/usr/share/opensearch-dashboards/plugins --template-value dataDir=/var/lib/opensearch-dashboards --exclude usr/share/opensearch-dashboards/config --exclude usr/share/opensearch-dashboards/data --exclude usr/share/opensearch-dashboards/assets --architecture x64 --rpm-os linux /tmp/tmpnngo78v2/OpenSearch-Dashboards/build/opensearch-dashboards-2.0.0-linux-x64/=/usr/share/opensearch-dashboards/ /tmp/tmpnngo78v2/OpenSearch-Dashboards/build/opensearch-dashboards-2.0.0-linux-x64/config/=/etc/opensearch-dashboards/ /tmp/tmpnngo78v2/OpenSearch-Dashboards/build/opensearch-dashboards-2.0.0-linux-x64/data/=/var/lib/opensearch-dashboards/ /tmp/tmpnngo78v2/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/service_templates/sysv/=/ /tmp/tmpnngo78v2/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/service_templates/systemd/=/
   │ERROR failure 0 sec
   │ERROR Error [ERR_STREAM_PREMATURE_CLOSE]: Premature close
   │          at new NodeError (internal/errors.js:322:7)
   │          at Socket.onclose (internal/streams/end-of-stream.js:117:38)
   │          at Socket.emit (events.js:412:35)
   │          at Pipe.<anonymous> (net.js:686:12)

error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
2022-03-23 08:04:55 ERROR    Error building OpenSearch-Dashboards, retry with: ./build.sh manifests/2.0.0/opensearch-dashboards-2.0.0.yml --component OpenSearch-Dashboards
Traceback (most recent call last):
  File "./src/run_build.py", line 81, in <module>
    sys.exit(main())
  File "./src/run_build.py", line 69, in main
    builder.build(build_recorder)
  File "/usr/share/opensearch/workspace/opensearch-build/src/build_workflow/builder_from_source.py", line 55, in build
    self.git_repo.execute(build_command)
  File "/usr/share/opensearch/workspace/opensearch-build/src/git/git_repository.py", line 83, in execute
    subprocess.check_call(command, cwd=cwd, shell=True)
  File "/usr/local/lib/python3.7/subprocess.py", line 363, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'bash /usr/share/opensearch/workspace/opensearch-build/scripts/components/OpenSearch-Dashboards/build.sh -v 2.0.0 -p linux -a x64 -d rpm -s false -o builds' returned non-zero exit status 1.

RPM build for OSD 1.3.0 also failed. We may need to fix the RPM build issue or skip the test given the logic flow is proved by tar build.
│ info $ fpm --force -t rpm --package /tmp/tmpend213sm/OpenSearch-Dashboards/target/NAME-1.3.0-ARCH.TYPE -s dir --name opensearch-dashboards --description Explore and visualize your OpenSearch data --version 1.3.0 --url https://opensearch.org/ --vendor OpenSearch --maintainer OpenSearch Dashboards Team<EMAIL_ADDRESS>--license ASL 2.0 --conflicts opensearch-dashboards --after-install /tmp/tmpend213sm/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/package_scripts/post_install.sh --before-install /tmp/tmpend213sm/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/package_scripts/pre_install.sh --before-remove /tmp/tmpend213sm/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/package_scripts/pre_remove.sh --after-remove /tmp/tmpend213sm/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/package_scripts/post_remove.sh --config-files /etc/opensearch-dashboards/opensearch_dashboards.yml --template-value user=opensearch-dashboards --template-value group=opensearch-dashboards --template-value optimizeDir=/usr/share/opensearch-dashboards/optimize --template-value configDir=/etc/opensearch-dashboards --template-value pluginsDir=/usr/share/opensearch-dashboards/plugins --template-value dataDir=/var/lib/opensearch-dashboards --exclude usr/share/opensearch-dashboards/config --exclude usr/share/opensearch-dashboards/data --exclude usr/share/opensearch-dashboards/assets --architecture x64 --rpm-os linux /tmp/tmpend213sm/OpenSearch-Dashboards/build/opensearch-dashboards-1.3.0-linux-x64/=/usr/share/opensearch-dashboards/ /tmp/tmpend213sm/OpenSearch-Dashboards/build/opensearch-dashboards-1.3.0-linux-x64/config/=/etc/opensearch-dashboards/ /tmp/tmpend213sm/OpenSearch-Dashboards/build/opensearch-dashboards-1.3.0-linux-x64/data/=/var/lib/opensearch-dashboards/ /tmp/tmpend213sm/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/service_templates/sysv/=/ /tmp/tmpend213sm/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/service_templates/systemd/=/
   │ERROR failure 0 sec
   │ERROR Error [ERR_STREAM_PREMATURE_CLOSE]: Premature close
   │          at Socket.onclose (internal/streams/end-of-stream.js:52:15)
   │          at Socket.emit (events.js:203:15)
   │          at Pipe._handle.close (net.js:607:12)

error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
2022-03-23 08:11:55 ERROR    Error building OpenSearch-Dashboards, retry with: ./build.sh manifests/1.3.0/opensearch-dashboards-1.3.0.yml --component OpenSearch-Dashboards
Traceback (most recent call last):
  File "./src/run_build.py", line 81, in <module>
    sys.exit(main())
  File "./src/run_build.py", line 69, in main
    builder.build(build_recorder)
  File "/var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/src/build_workflow/builder_from_source.py", line 55, in build
    self.git_repo.execute(build_command)
  File "/var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/src/git/git_repository.py", line 83, in execute
    subprocess.check_call(command, cwd=cwd, shell=True)
  File "/usr/local/lib/python3.7/subprocess.py", line 363, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'bash /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/scripts/components/OpenSearch-Dashboards/build.sh -v 1.3.0 -p linux -a x64 -d rpm -s false -o builds' returned non-zero exit status 1.

RPM build for OS. will add RPM support
Not generating sha for /var/jenkins/workspace/Playground/tianleh-test/tianle-opensearch-build-3-22/builds/opensearch/dist/opensearch-min-1.3.0-SNAPSHOT.x86_64.rpm with artifact Path /var/jenkins/workspace/Playground/tianleh-test/tianle-opensearch-build-3-22/builds/opensearch/dist, doesn't match allowed types [.tar.gz, .zip]

RPM build for OS 2.0.0 failed
> Task :opensearch-job-scheduler-spi:compileJava FAILED
/tmp/tmp4dsppnd1/job-scheduler/spi/src/main/java/org/opensearch/jobscheduler/spi/utils/LockService.java:86: error: no suitable method found for mapping(String,String,XContentType)
                    .mapping(MAPPING_TYPE, lockMapping(), XContentType.JSON);
                    ^
    method CreateIndexRequest.mapping(String) is not applicable
      (actual and formal argument lists differ in length)
    method CreateIndexRequest.mapping(BytesReference,XContentType) is not applicable
      (actual and formal argument lists differ in length)
    method CreateIndexRequest.mapping(XContentBuilder) is not applicable
      (actual and formal argument lists differ in length)
    method CreateIndexRequest.mapping(Map<String,?>) is not applicable
      (actual and formal argument lists differ in length)
    method CreateIndexRequest.mapping(String,Map<String,?>) is not applicable
      (actual and formal argument lists differ in length)
1 error

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':opensearch-job-scheduler-spi:compileJava'.
> Compilation failed; see the compiler error output for details.

* Try:
> Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':opensearch-job-scheduler-spi:compileJava'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:145)
	at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:143)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:131)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:402)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:389)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:382)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:368)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:61)
Caused by: org.gradle.api.internal.tasks.compile.CompilationFailedException: Compilation failed; see the compiler error output for details.
	at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:56)
	at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:39)
	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:97)
	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:51)
	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:37)
	at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:51)
	at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:37)
	at org.gradle.api.internal.tasks.compile.ModuleApplicationNameWritingCompiler.execute(ModuleApplicationNameWritingCompiler.java:46)
	at org.gradle.api.internal.tasks.compile.ModuleApplicationNameWritingCompiler.execute(ModuleApplicationNameWritingCompiler.java:36)
	at org.gradle.jvm.toolchain.internal.DefaultToolchainJavaCompiler.execute(DefaultToolchainJavaCompiler.java:57)
	at org.gradle.api.tasks.compile.JavaCompile.lambda$createToolchainCompiler$1(JavaCompile.java:232)
	at org.gradle.api.internal.tasks.compile.CleaningJavaCompiler.execute(CleaningJavaCompiler.java:53)
	at org.gradle.api.internal.tasks.compile.incremental.IncrementalCompilerFactory.lambda$createRebuildAllCompiler$0(IncrementalCompilerFactory.java:52)
	at org.gradle.api.internal.tasks.compile.incremental.SelectiveCompiler.execute(SelectiveCompiler.java:67)
	at org.gradle.api.internal.tasks.compile.incremental.SelectiveCompiler.execute(SelectiveCompiler.java:41)
	at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringCompiler.execute(IncrementalResultStoringCompiler.java:66)
	at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringCompiler.execute(IncrementalResultStoringCompiler.java:52)
	at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler$2.call(CompileJavaBuildOperationReportingCompiler.java:59)
	at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler$2.call(CompileJavaBuildOperationReportingCompiler.java:51)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
	at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler.execute(CompileJavaBuildOperationReportingCompiler.java:51)
	at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:279)
	at org.gradle.api.tasks.compile.JavaCompile.performIncrementalCompilation(JavaCompile.java:165)
	at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:146)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
	at org.gradle.api.internal.project.taskfactory.IncrementalInputsTaskAction.doExecute(IncrementalInputsTaskAction.java:32)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
	at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTaskAction.execute(AbstractIncrementalTaskAction.java:25)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
	at org.gradle.api.internal.tasks.execution.TaskExecution$2.run(TaskExecution.java:239)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:224)
	at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:207)
	at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:190)
	at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:168)
	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89)
	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40)
	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53)
	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:50)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:40)
	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
	at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:61)
	at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:42)
	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60)
	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27)
	at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:188)
	at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
	at org.gradle.internal.Either$Right.fold(Either.java:175)
	at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:38)
	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:27)
	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:109)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:56)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:56)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:73)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:89)
	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:50)
	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:114)
	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:57)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:76)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:50)
	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:93)
	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:93)
	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:43)
	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:31)
	at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
	at org.gradle.api.internal.tasks.execution.TaskExecution$3.withWorkspace(TaskExecution.java:284)
	at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
	at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)
	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33)
	at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:142)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:131)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:402)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:389)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:382)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:368)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:61)

* Get more help at https://help.gradle.org/

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

See https://docs.gradle.org/7.3.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 5s
1 actionable task: 1 executed
2022-03-23 17:53:45 ERROR    Error building job-scheduler, retry with: ./build.sh manifests/2.0.0/opensearch-2.0.0.yml --component job-scheduler --snapshot
Traceback (most recent call last):
  File "./src/run_build.py", line 80, in <module>
    sys.exit(main())
  File "./src/run_build.py", line 68, in main
    builder.build(build_recorder)
  File "/var/jenkins/workspace/Playground/tianleh-test/tianle-opensearch-build-3-22/src/build_workflow/builder_from_source.py", line 55, in build
    self.git_repo.execute(build_command)
  File "/var/jenkins/workspace/Playground/tianleh-test/tianle-opensearch-build-3-22/src/git/git_repository.py", line 83, in execute
    subprocess.check_call(command, cwd=cwd, shell=True)
  File "/usr/local/lib/python3.7/subprocess.py", line 363, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'bash /tmp/tmp4dsppnd1/job-scheduler/scripts/build.sh -v 2.0.0 -q alpha1 -p linux -a arm64 -s true -o builds' returned non-zero exit status 1.

RPM assemble for OS 1.3.0 failed
+ ./assemble.sh builds/opensearch/rpm/manifest.yml --base-url https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.0/11/linux/x64
Installing dependencies in . ...
Installing dependencies from Pipfile.lock (16e10a)...
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
Running ./src/run_assemble.py builds/opensearch/rpm/manifest.yml --base-url https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.0/11/linux/x64 ...
2022-03-23 18:13:17 INFO     Bundling OpenSearch (x64) on linux into /var/jenkins/workspace/Playground/tianleh-test/tianle-opensearch-build-3-22@2/dist/opensearch/rpm ...
2022-03-23 18:13:18 INFO     Copied min bundle to /tmp/tmp10vf1fpb/opensearch-min-1.3.0.x86_64.rpm.
2022-03-23 18:13:18 INFO     Start creating distribution rpm for OpenSearch.
2022-03-23 18:13:18 INFO     Extracting dist into /tmp/tmp10vf1fpb.
2022-03-23 18:13:18 INFO     Convert rpm to cpio for extraction: /tmp/tmp10vf1fpb/opensearch-min-1.3.0.x86_64.rpm to /tmp/tmp10vf1fpb/opensearch-min-1.3.0.x86_64.cpio
2022-03-23 18:13:20 INFO     Extract cpio /tmp/tmp10vf1fpb/opensearch-min-1.3.0.x86_64.cpio content to /tmp/tmp10vf1fpb
Traceback (most recent call last):
  File "./src/run_assemble.py", line 58, in <module>
    sys.exit(main())
  File "./src/run_assemble.py", line 42, in main
    with Bundles.create(build_manifest, artifacts_dir, bundle_recorder, args.keep) as bundle:
  File<EMAIL_ADDRESS>line 31, in create
    return klass(build_manifest, artifacts_dir, bundle_recorder, keep)  # type: ignore[no-any-return, operator]
  File<EMAIL_ADDRESS>line 49, in __init__
    self.min_dist = self.__get_min_dist(build_manifest.components)
  File<EMAIL_ADDRESS>line 140, in __get_min_dist
    min_dist.extract(self.tmp_dir.name)
  File<EMAIL_ADDRESS>line 73, in extract
    self.__extract__(dest)
  File<EMAIL_ADDRESS>line 113, in __extract__
    BundleRpm(self.filename, self.path, self.min_path).extract(dest)
  File<EMAIL_ADDRESS>line 51, in extract
    cwd=dest,
  File "/usr/local/lib/python3.7/subprocess.py", line 363, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['cpio', '-imdv']' returned non-zero exit status 2.

For the test related logic, e.g integ and bwc, I plan to hardcode to tar in this PR. I create an issue to introduce distribution parameter to the test command https://github.com/opensearch-project/opensearch-build/issues/1812

Test OS RPM build and assemble
buildManifestUrl (x64): https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.0/18/linux/x64/builds/opensearch/rpm/manifest.yml
artifactUrl (x64): https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.0/18/linux/x64/dist/opensearch/rpm/opensearch-1.3.0-linux-x64.rpm

During testing in Jenkins, find a strange issue (see example run)
java.nio.file.NoSuchFileException<EMAIL_ADDRESS>	at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
	at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
	at java.nio.file.Files.newByteChannel(Files.java:361)
	at java.nio.file.Files.newByteChannel(Files.java:407)
	at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
	at java.nio.file.Files.newInputStream(Files.java:152)
	at hudson.FilePath.newInputStreamDenyingSymlinkAsNeeded(FilePath.java:2113)
	at hudson.FilePath$Read.invoke(FilePath.java:2195)
	at hudson.FilePath$Read.invoke(FilePath.java:2182)
	at hudson.FilePath$FileCallableWrapper.call(FilePath.java:3317)
	at hudson.remoting.UserRequest.perform(UserRequest.java:211)
	at hudson.remoting.UserRequest.perform(UserRequest.java:54)
	at hudson.remoting.Request$2.run(Request.java:376)
	at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:78)
Caused: java.io.IOException
	at hudson.remoting.FastPipedInputStream.read(FastPipedInputStream.java:170)
	at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
	at java.io.InputStreamReader.read(InputStreamReader.java:184)
	at java.io.Reader.read(Reader.java:140)
	at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1282)
	at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1261)
	at org.apache.commons.io.IOUtils.copy(IOUtils.java:1108)
	at org.apache.commons.io.IOUtils.copy(IOUtils.java:922)
	at org.apache.commons.io.IOUtils.toString(IOUtils.java:2681)
	at org.apache.commons.io.IOUtils.toString(IOUtils.java:2707)
	at org.jenkinsci.plugins.workflow.steps.ReadFileStep$Execution.run(ReadFileStep.java:108)
	at org.jenkinsci.plugins.workflow.steps.ReadFileStep$Execution.run(ReadFileStep.java:94)
	at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

This call failed in bwc test but succeeded in integ test.

This change https://github.com/opensearch-project/opensearch-build/pull/1830 seems suspicious. My assumption is that this read call https://github.com/opensearch-project/opensearch-build/blob/main/src/jenkins/Messages.groovy#L40 happens while this write call in the parallel step https://github.com/opensearch-project/opensearch-build/blob/main/src/jenkins/Messages.groovy#L20
My current plan is to update createTestResultsMessage https://github.com/opensearch-project/opensearch-build/blob/main/jenkins/opensearch/distribution-build.jenkinsfile#L184 to only construct the message but not actually add this message to file. https://github.com/opensearch-project/opensearch-build/blob/main/vars/createTestResultsMessage.groovy#L9
Then move the file write logic (Message.add) to https://github.com/opensearch-project/opensearch-build/blob/main/jenkins/opensearch/distribution-build.jenkinsfile#L196 once both integ and bwc are done.
cc @peterzhuamazon @dblock @kavilla

I won't merge this PR due to research of https://github.com/opensearch-project/opensearch-build/pull/1807#issuecomment-1080374963 and also OpenSearch is not ready yet (currently using a branch from @peterzhuamazon )

Keep running more rounds of the Jenkins build. Find this issue randomly surface up. Sample run

Checking for unpackaged file(s): /usr/lib/rpm/check-files /tmp/tmpl6lg4o5b/BUILDROOT/opensearch-1.3.0-1.x86_64
error: Installed (but unpackaged) file(s) found:
   /usr/share/opensearch/.attach_pid21367

RPM build errors:
    Installed (but unpackaged) file(s) found:
   /usr/share/opensearch/.attach_pid21367
Traceback (most recent call last):
  File "./src/run_assemble.py", line 58, in <module>
    sys.exit(main())
  File "./src/run_assemble.py", line 49, in main
    bundle.package(output_dir)
  File "/var/jenkins/workspace/Playground/tianleh-test/tianle-opensearch-build-3-22/src/assemble_workflow/bundle.py", line 102, in package
    self.min_dist.build(self.bundle_recorder.package_name, dest)
  File "/var/jenkins/workspace/Playground/tianleh-test/tianle-opensearch-build-3-22/src/assemble_workflow/dist.py", line 82, in build
    self.__build__(name, dest)
  File "/var/jenkins/workspace/Playground/tianleh-test/tianle-opensearch-build-3-22/src/assemble_workflow/dist.py", line 118, in __build__
    BundleRpm(self.filename, self.path, self.min_path).build(name, dest, self.archive_path, self.build_cls)
  File "/var/jenkins/workspace/Playground/tianleh-test/tianle-opensearch-build-3-22/src/assemble_workflow/bundle_rpm.py", line 108, in build
    subprocess.check_call(bundle_cmd, cwd=ext_dest, shell=True)
  File "/usr/local/lib/python3.7/subprocess.py", line 363, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'rpmbuild -bb --define '_topdir /tmp/tmpl6lg4o5b' --define '_version 1.3.0' --define '_architecture x86_64' opensearch.rpm.spec' returned non-zero exit status 1.

cc @peterzhuamazon @dblock

A similar issue to https://github.com/opensearch-project/opensearch-build/pull/1807#issuecomment-1080374963
Error

Also:   hudson.remoting.Channel$CallSiteStackTrace: Remote call to EC2 (Amazon_ec2_cloud) - Jenkins-Agent-al2-arm64-c6g4xlarge-Docker-Host (i-027a502a4b7d4e840)
		at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1800)
		at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:356)
		at hudson.remoting.Channel.call(Channel.java:1001)
		at hudson.FilePath.act(FilePath.java:1159)
		at hudson.FilePath.act(FilePath.java:1148)
		at hudson.FilePath.list(FilePath.java:2041)
		at hudson.FilePath.list(FilePath.java:2025)
		at org.jenkinsci.plugins.pipeline.utility.steps.fs.FindFilesStepExecution.run(FindFilesStepExecution.java:61)
		at org.jenkinsci.plugins.pipeline.utility.steps.fs.FindFilesStepExecution.run(FindFilesStepExecution.java:42)
		at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
		at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
java.io.IOException: /var/jenkins/workspace/Playground/tianleh-test/tianle-opensearch-build-3-22@2/messages does not exist.
	at hudson.FilePath.glob(FilePath.java:2081)
	at hudson.FilePath.access$3400(FilePath.java:215)
	at hudson.FilePath$ListGlob.invoke(FilePath.java:2055)
	at hudson.FilePath$ListGlob.invoke(FilePath.java:2043)
	at hudson.FilePath$FileCallableWrapper.call(FilePath.java:3317)
	at hudson.remoting.UserRequest.perform(UserRequest.java:211)
	at hudson.remoting.UserRequest.perform(UserRequest.java:54)
	at hudson.remoting.Request$2.run(Request.java:376)
	at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:78)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

The same step succeeded in bwc test but failed in integ test. See this sample run.

cc @peterzhuamazon @dblock

Trying to fix the random Jenkins file read error in https://github.com/opensearch-project/opensearch-build/pull/1807/commits/5cc3477eb7a39286e25c541a90c037fa2e49c924

will run multiple Jenkins builds to see the random error is fixed.

Is there going to be issues with URLs pointing to latest?

The latest is working.
https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.0/latest/linux/x64/rpm/builds/opensearch/manifest.yml
But I do notice that there may be a situation that rpm build is finished and updates the index.json while the tar build is ongoing.  If users try to access the latest url for tar, it will be failure. I could update index.json after rpm and tar builds are both finished.

I suggest we move things in S3 for unreleased versions (2.0) to avoid accidentally referencing an older build.

I didn't get your idea. Could you please elaborate more? @dblock

issue to support running RPM integ test https://github.com/opensearch-project/opensearch-build/issues/1857

JOB_NAME=Playground/tianleh-test/tianle-opensearch-build-3-22
BUILD_NUMBER=[77]
MESSAGE=Successful Build
BUILD_URL: http://jenki-jenki-fpgmrv2ryxko-1366042710.us-east-1.elb.amazonaws.com/job/Playground/job/tianleh-test/job/tianle-opensearch-build-3-22/77/
MANIFEST: 1.3.1/opensearch-1.3.1.yml
https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.1/77/linux/arm64/rpm/rpm/builds/opensearch/manifest.yml
https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.1/77/linux/arm64/rpm/rpm/dist/opensearch/manifest.yml
Integ Tests (arm64, rpm): :warning: FAILURE http://jenki-jenki-fpgmrv2ryxko-1366042710.us-east-1.elb.amazonaws.com/job/integ-test/813/
BWC Tests (arm64, rpm): :warning: FAILURE http://jenki-jenki-fpgmrv2ryxko-1366042710.us-east-1.elb.amazonaws.com/job/bwc-test/296/
https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.1/77/linux/arm64/tar/tar/builds/opensearch/manifest.yml
https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.1/77/linux/arm64/tar/tar/dist/opensearch/manifest.yml
Integ Tests (arm64, tar): :warning: FAILURE http://jenki-jenki-fpgmrv2ryxko-1366042710.us-east-1.elb.amazonaws.com/job/integ-test/812/
BWC Tests (arm64, tar): :warning: FAILURE http://jenki-jenki-fpgmrv2ryxko-1366042710.us-east-1.elb.amazonaws.com/job/bwc-test/295/
https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.1/77/linux/x64/rpm/rpm/builds/opensearch/manifest.yml
https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.1/77/linux/x64/rpm/rpm/dist/opensearch/manifest.yml
Integ Tests (x64, rpm): :warning: FAILURE http://jenki-jenki-fpgmrv2ryxko-1366042710.us-east-1.elb.amazonaws.com/job/integ-test/811/
BWC Tests (x64, rpm): :warning: FAILURE http://jenki-jenki-fpgmrv2ryxko-1366042710.us-east-1.elb.amazonaws.com/job/bwc-test/294/
https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.1/77/linux/x64/tar/tar/builds/opensearch/manifest.yml
https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.1/77/linux/x64/tar/tar/dist/opensearch/manifest.yml
Integ Tests (x64, tar): :warning: FAILURE http://jenki-jenki-fpgmrv2ryxko-1366042710.us-east-1.elb.amazonaws.com/job/integ-test/810/
BWC Tests (x64, tar): :warning: FAILURE http://jenki-jenki-fpgmrv2ryxko-1366042710.us-east-1.elb.amazonaws.com/job/bwc-test/293/

The distribution string is duplicated in urls. https://ci.opensearch.org/ci/dbc/Playground/tianleh-test/tianle-opensearch-build-3-22/1.3.1/77/linux/arm64/rpm/rpm/builds/opensearch/manifest.yml
Taking a look

OSD rpm build failed.

│ info $ fpm --force -t rpm --package /tmp/tmpltb5n6_e/OpenSearch-Dashboards/target/NAME-1.3.1-arm64.rpm -s dir --name opensearch-dashboards --description Explore and visualize your OpenSearch data --version 1.3.1 --url https://opensearch.org/ --vendor OpenSearch --maintainer OpenSearch Dashboards Team<EMAIL_ADDRESS>--license ASL 2.0 --conflicts opensearch-dashboards --after-install /tmp/tmpltb5n6_e/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/package_scripts/post_install.sh --before-install /tmp/tmpltb5n6_e/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/package_scripts/pre_install.sh --before-remove /tmp/tmpltb5n6_e/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/package_scripts/pre_remove.sh --after-remove /tmp/tmpltb5n6_e/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/package_scripts/post_remove.sh --config-files /etc/opensearch-dashboards/opensearch_dashboards.yml --template-value user=opensearch-dashboards --template-value group=opensearch-dashboards --template-value optimizeDir=/usr/share/opensearch-dashboards/optimize --template-value configDir=/etc/opensearch-dashboards --template-value pluginsDir=/usr/share/opensearch-dashboards/plugins --template-value dataDir=/var/lib/opensearch-dashboards --exclude usr/share/opensearch-dashboards/config --exclude usr/share/opensearch-dashboards/data --exclude usr/share/opensearch-dashboards/assets --architecture arm64 --rpm-os linux /tmp/tmpltb5n6_e/OpenSearch-Dashboards/build/opensearch-dashboards-1.3.1-linux-arm64/=/usr/share/opensearch-dashboards/ /tmp/tmpltb5n6_e/OpenSearch-Dashboards/build/opensearch-dashboards-1.3.1-linux-arm64/config/=/etc/opensearch-dashboards/ /tmp/tmpltb5n6_e/OpenSearch-Dashboards/build/opensearch-dashboards-1.3.1-linux-arm64/data/=/var/lib/opensearch-dashboards/ /tmp/tmpltb5n6_e/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/service_templates/sysv/=/ /tmp/tmpltb5n6_e/OpenSearch-Dashboards/src/dev/build/tasks/os_packages/service_templates/systemd/=/
   │ERROR failure 0 sec
   │ERROR Error [ERR_STREAM_PREMATURE_CLOSE]: Premature close
   │          at Socket.onclose (internal/streams/end-of-stream.js:52:15)
   │          at Socket.emit (events.js:203:15)
   │          at Pipe._handle.close (net.js:607:12)

error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
2022-03-31 06:24:59 ERROR    Error building OpenSearch-Dashboards, retry with: ./build.sh manifests/1.3.1/opensearch-dashboards-1.3.1.yml --component OpenSearch-Dashboards
Traceback (most recent call last):
  File "./src/run_build.py", line 80, in <module>
    sys.exit(main())
  File "./src/run_build.py", line 68, in main
    builder.build(build_recorder)
  File "/var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/src/build_workflow/builder_from_source.py", line 55, in build
    self.git_repo.execute(build_command)
  File "/var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/src/git/git_repository.py", line 83, in execute
    subprocess.check_call(command, cwd=cwd, shell=True)
  File "/usr/local/lib/python3.7/subprocess.py", line 363, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'bash /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/scripts/components/OpenSearch-Dashboards/build.sh -v 1.3.1 -p linux -a arm64 -d rpm -s false -o builds' returned non-zero exit status 1.

will not merge until OSD RPM build is fixed. https://github.com/opensearch-project/opensearch-build/pull/1807#issuecomment-1084148182

The fix for OSD RPM build is https://github.com/opensearch-project/opensearch-build/pull/1888 Once the new image is ready, I will try it out in my current dev branch.

Run Jenkins test by using the new image from https://github.com/opensearch-project/opensearch-build/pull/1888
https://hub.docker.com/r/opensearchstaging/ci-runner/tags?page=1&ordering=last_updated&name=ci-runner-centos7-opensearch-dashboards-build-v1

Find that archived-builds.zip path is shared between rpm and tar. We need to add subfolders for this as well.
Extracting from /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/archived-builds.zip
Extracting: rpm/builds/opensearch-dashboards/dist/opensearch-dashboards-min-1.3.0-arm64.rpm -> /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/rpm/builds/opensearch-dashboards/dist/opensearch-dashboards-min-1.3.0-arm64.rpm
Extracting: rpm/builds/opensearch-dashboards/manifest.yml -> /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/rpm/builds/opensearch-dashboards/manifest.yml
Extracting: rpm/builds/opensearch-dashboards/plugins/alertingDashboards-1.3.0.zip -> /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/rpm/builds/opensearch-dashboards/plugins/alertingDashboards-1.3.0.zip
Extracting: rpm/builds/opensearch-dashboards/plugins/anomalyDetectionDashboards-1.3.0.zip -> /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/rpm/builds/opensearch-dashboards/plugins/anomalyDetectionDashboards-1.3.0.zip
Extracting: rpm/builds/opensearch-dashboards/plugins/ganttChartDashboards-1.3.0.zip -> /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/rpm/builds/opensearch-dashboards/plugins/ganttChartDashboards-1.3.0.zip
Extracting: rpm/builds/opensearch-dashboards/plugins/indexManagementDashboards-1.3.0.zip -> /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/rpm/builds/opensearch-dashboards/plugins/indexManagementDashboards-1.3.0.zip
Extracting: rpm/builds/opensearch-dashboards/plugins/observabilityDashboards-1.3.0.zip -> /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/rpm/builds/opensearch-dashboards/plugins/observabilityDashboards-1.3.0.zip
Extracting: rpm/builds/opensearch-dashboards/plugins/queryWorkbenchDashboards-1.3.0.zip -> /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/rpm/builds/opensearch-dashboards/plugins/queryWorkbenchDashboards-1.3.0.zip
Extracting: rpm/builds/opensearch-dashboards/plugins/reportsDashboards-1.3.0.zip -> /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/rpm/builds/opensearch-dashboards/plugins/reportsDashboards-1.3.0.zip
Extracting: rpm/builds/opensearch-dashboards/plugins/securityDashboards-1.3.0.zip -> /var/jenkins/workspace/Playground/tianleh-test/tianleh-osd-build-3-22/rpm/builds/opensearch-dashboards/plugins/securityDashboards-1.3.0.zip
Extracted: 10 files

After talking with @peterzhuamazon , we need to double check the signing logic, artifact promotion logic and the min upload logic before merging this change.

We will merge this PR once OSD 1.3.1 is released due to the large impact of this PR.

After merging in the main branch code, the whitesource is failing. cc @zelinh
(https://github.com/opensearch-project/opensearch-build/issues/1533#issuecomment-1079485319)

Draft PR as fast follow up https://github.com/tianleh/opensearch-build/pull/6 @peterzhuamazon


Stereo recording with ROS case:454947

I have built a stereo system with 2 cameras DFK23UX174 and a synchronization unit and I'm trying to use ROS to record a synchronized video sequence. I have compiled tiscamera and I can use all the examples. I would like to create a roslaunch file to save to disk a synchronized sequence that I can use later for calibration. Since I have little experience with ROS, I'm starting simple with:
export GSCAM_CONFIG="v4l2src device=/dev/video0 ! video/x-raw-rgb width=640,height=480,framerate=30/1 ! ffmpegcolorspace"
rosrun gscam gscam

But I get the following error msgs:
[ INFO] [1534515426.603167215]: Using gstreamer config from env: "v4l2src device=/dev/video0 ! video/x-raw-rgb width=640,height=480,framerate=30/1 ! ffmpegcolorspace"
[ INFO] [1534515426.608749658]: using default calibration URL
[ INFO] [1534515426.608807766]: camera calibration URL: file:///home/efernand/.ros/camera_info/camera.yaml
[ INFO] [1534515426.608880960]: Unable to open camera calibration file [/home/efernand/.ros/camera_info/camera.yaml]
[ WARN] [1534515426.608920420]: Camera calibration file /home/efernand/.ros/camera_info/camera.yaml not found.
[ INFO] [1534515426.608946052]: Loaded camera calibration from
[ INFO] [1534515426.629491578]: Time offset:<PHONE_NUMBER>,013
libv4l2: error set_fmt gave us a different result then try_fmt!
[FATAL] [1534515426.741726749]: Failed to PAUSE stream, check your gstreamer configuration.
[FATAL] [1534515426.741775569]: Failed to initialize gscam stream!
Could you help me with this? Please

Dear Eduardo
I must admit, your question is rather a question for the ROS community. I do not know, how to use two cameras with ROS. We only used one single camera until now.
Therefore, please ask the question to the ROS community.

Stefan

Thank you for your reply Stefan,
the live stream is not shown with:
gst-launch-0.10 v4l2src device=/dev/video0 ! video/x-raw-rgb, width=640,height=480,framerate=30/1 ! ffmpegcolorspace ! ximagesink
Setting pipeline to PAUSED ...
libv4l2: error set_fmt gave us a different result then try_fmt!
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Device '/dev/video0' cannot capture in the specified format
Additional debug info:
gstv4l2object.c(2218): gst_v4l2_object_set_format (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
Tried to capture in RGB3, but device returned format GREY
Setting pipeline to NULL ...
Freeing pipeline ...
I understand that the question can also be appropriate for the ROS community, but maybe the TIS community has more experience on that.

Hi Eduardo
Supporting the outdated GStreamer 0.10 is a little bit hard, because some of the old modules are missing. Please try
gst-inspect-0.10 | grep bayer
if you do not get an output with "bayer2rgb", you wont get colored images from the camera. You will get Bayer raw data only, which shows a little checkerboard pattern. Unfortunately you need that bayer2rgb module, because the DFK 23 series does not perform the debayer on board.

In case you checked out the "gstreamer-0.10" branch, you get the Gstreamer 0.10 tiscamera modules. After you built and installed them, you can use
gst-launch-0.10 v4l2src device=/dev/video0 ! video/x-raw-gray, width=640,height=480,framerate=30/1 ! tisvideobufferfilter ! tis_auto_exposure ! ffmpegcolorspace ! ximagesink
Now the exposure time is done automatically and with the tisvideobufferfilter module the incomplete frames are dropped. However, the image will look grayscale.
As far as I know, there is a ROS module, that supports GStreamer 1.0. I never tested that on my own, but you may test this.
Stefan

Hi Stefan,
gst-inspect-0.10 | grep bayer
does not return anything.
and
gst-launch-0.10 v4l2src device=/dev/video0 ! video/x-raw-gray, width=640,height=480,framerate=30/1 ! ffmpegcolorspace ! ximagesink
just opens a window with a black image (not the real image that I can see with ./tis_rosstarter)
I'm on the master branch of tiscamera.
My main problem is to record a synchronized sequence to disk, I started trying to do that with ROS because it seemed to me the easiest option after looking at the examples inside tiscamera. But I can use other alternatives if you think there are easier options.

Maybe the black image comes from a very low exposure time.
You only want to save AVI files or images to disk and not to control a robot?
Stefan

That's it. I need to record stereo sequences that I will later use for stereo calibration, visual odometry and semantic segmentation, that's all.

Hello Eduardo,
Then ROS is not necessary.
With the master branch you got a software tcam-capture. You can use it for one camera, but you can start the program twice, one for each camera. You can do AVI capture with it.
How to get the matching image pairs from the both video files is another thing.
I would start with a C++ program or Python scripts, that creates a pipeline for each camera and starts the pipelines more or less at the same point of time. Maybe it is  a good idea to look at https://www.linuxtv.org/wiki/index.php/GStreamer for getting an idea about GStreamer first.
Unfortunately I do not have sample for this yet.
How do you read the AVI files for your calibration stuff?
Stefan

Hi Stefan,
I will need to save the image sequences with timestamp (I prefer to avoid video files). What I have done before with other cameras is to save each image sequence in a separate directory, using the timestamp to name the images. Thus, the synchronized images have the same name-timestamp.
I will have a better look at GStreamer for that. But after browsing it, I think that the main problem will still be getting the synchronized sequences of images. It's a pity that the utilities and libraries provided by TIS for that support only Windows.

Eduardo

It's a pity that the utilities and libraries provided by TIS for that support only Windows.

Well, what you git-cloned is more or less Linux only....
And even IC Capture does not do, what you want to do.
But the good news is, I know, what you want to do now and have an idea, how to solve it. For this I have two questions:
Which frame rate do you want to achieve? At least , that will be limited by the speed of your hard disc
Which programming language do you prefer?
Thank you in advance!
Stefan

I'm looking for a frame rate of 30/1 and a resolution of 1280x720, with color images.
I prefer C++, but python could work as well.
Thank you very much for your help Stefan!

Actually I need to capture very long sequences of about 30 min, thus it needs to be saved almost directly disk. I have an SSD disk and data transfer should not be a problem for that resolution and frame rate.
JPEG format is OK.

Eduardo
well, in our experiences saving longer sequences at 60 frames per second, you have to cameras, will not work, even on fast SSDs. We tested that in Windows. Maybe in Linux the hard disc handling is different, but I can not guarantee, that all images will be saved to hard disc. On my older Linux computer, this wont work.
However, it is worth a try.
Stefan

OK, I could reduce the resolution or the frame rate to 20 fps if it does not work.

Hi Stefan,
did you find out how can I do the synchronized recording?

Eduardo
Please excuse me, being not that fast writing a program for you.
Stefan

Thank you for that Stefan. I didn't know that you were writing the program for me.

Hello Eduardo
here we go.
tcam-stereo-capture.zip
It is the source code of a command line application.  You need to adapt serial numbers, video formats and frame rates, before compiling.
See the included Readme.html
I hope that helps.
Stefan

Thank you for the code Stephan. I'm going to test it and I will let you know.

Dear Stefan,
I tested your program and it seems to work :-) Thank you very much!
There are 2 points that I wanted to discuss with you:

I'm trying to use the highest possible resolution and thus I set the frame rate accordingly with
set_capture_format("BGRx", FrameSize{1920,1200}, FrameRate{15,1})
but the program fails for resulutions >= 20 fps with the following error (and same thing for resolution {1920,1080}):

(tcamstereocapture:17800): GStreamer-CRITICAL **: gst_caps_get_structure: assertion 'index < GST_CAPS_LEN (caps)' failed
(tcamstereocapture:17800): GStreamer-CRITICAL **: gst_structure_get_value: assertion 'structure != NULL' failed
(tcamstereocapture:17800): GStreamer-CRITICAL **: gst_structure_set_value: assertion 'G_IS_VALUE (value)' failed
(tcamstereocapture:17800): GStreamer-CRITICAL **: gst_structure_get_value: assertion 'structure != NULL' failed
(tcamstereocapture:17800): GStreamer-CRITICAL **: gst_structure_set_value: assertion 'G_IS_VALUE (value)' failed
(tcamstereocapture:17800): GStreamer-CRITICAL **: gst_structure_get_value: assertion 'structure != NULL' failed
(tcamstereocapture:17800): GStreamer-CRITICAL **: gst_structure_set_value: assertion 'G_IS_VALUE (value)' failed

When there are frame drops (specially with higher resolutions) and I get a msg like:

2.Trigger
Did not receive an image from all camera 1.
after I check the saved images I see that the corresponding image exists (for a drop msg) and that seems to be a bug in the program (e.g. for the case above: cam1, 2.Trigger I get a saved image with name 00003).

Hello Eduardo
if more that 15 fps do not work, I guess, your cameras are connected to an usb 2.0 controller. You can check this with the tcam-ctrl porgram:
tcam-ctrl -c <serial>
If the camera is connected to USB 3.0, you will get
Available gstreamer-1.0 caps:
video/x-raw, format=(string)GRAY8, width=(int)1920, height=(int)1200, framerate=(fraction){ 54/1, 50/1, 40/1, 30/1, 25/1, 20/1, 15/1, 10/1, 5/1 };

Which gives 54 fps max.
Connected to USB 2.0 you will get the output
Available gstreamer-1.0 caps:
video/x-raw, format=(string)GRAY8, width=(int)1920, height=(int)1200, framerate=(fraction){ 15/1, 10/1, 5/1 };

which indicates only 15 fps max
I connected my camera to an USB 3.0 controller. The maximum allowed frame rate for both cameras running on this controller is 30 fps.
Now to your second issue:
It is a timeout problem. Getting the images is fast, but saving them to hard disc is slow. I guess, I mentioned that above somewhere up. For saving both images to hard disc the timeout loop seems to wait too short,  therefore you got an image saved, where was indicated no image. On my old Core i5 I changed the timeout wait loop like this:
        // Wait with timeout until we got images from both cameras.
        int tries = 10;
        while( !( CustomData1.ReceivedAnImage || CustomData2.ReceivedAnImage) && tries > 0)
        {
            usleep(100000);
            tries--;
        }

You may play with this timeout on your own.
Stefan

Hi Stefan,
You're right, I connected one of my cameras to an USB2, when I connect it to an USB3 it works on higher resolution/fps.
And thank you for the clarification about the timeout for receiving/saving images. Just one more question, about the line
       while( !( CustomData1.ReceivedAnImage || CustomData2.ReceivedAnImage) && tries > 0)
should not we use AND to check that we have both images? :  (  !( CustomData1.ReceivedAnImage && CustomData2.ReceivedAnImage) )

while( !( CustomData1.ReceivedAnImage || CustomData2.ReceivedAnImage) && tries > 0)

should not we use AND to check that we have both images?
no, because it was

!CustomData1.ReceivedAnImage && !CustomData2.ReceivedAnImage
Which goes to
!(CustomData1.ReceivedAnImage || CustomData2.ReceivedAnImage )
its boolean mathematic.
BTW. I think about moving the saving part from the callback into the main loop, because the customData struct contains the cv::Mat. Then you could save the images after they are received and the save process itself does not affect the timeout.
Stefan

Hello Eduardo
here comes the updated source:
tcam-stereo-capture.zip
The image saving is now called from the main loop.
Currently I am not sure, whether the usleep() works fine on my computer, because i get provides timeouts, where no are expected, but I also do not see the program waiting.
The documentation is also updated in the zip file.
Have a nice weekend!
Stefan

Thank you very much Stefan!
Have a nice weekend too!

Eduardo
I have to apologize. You are right about the "&&".
       // Wait with timeout until we got images from both cameras.
        int tries = 8;
        while( !( CustomData1.ReceivedAnImage && CustomData2.ReceivedAnImage) && tries >= 0)
        {
            usleep(10000);
            tries--;
        }

This loop waits 80 ms for images. At 30 fps it is somewhat above the double frame rate time, in which you could expect an image to be delivered.
I am very sorry for my error.
Stefan

Hi Stefan,
I have been using your program and so far it's good to get the pairs of synchronized images for doing stereo calibration, where I need a low frame rate like 5Hz. Then, I wanted to get color sequences at (1920x1200, 20Hz) but the real frame rate that I get is much slower (around 10Hz). I have played with different frame rate values (10/20/25/30/40) but I always get less than half of the value that I set (except for 5Hz for which I get around 4Hz). I tried switching to SoftwareTrigger but the problem persists. I also stopped saving the images to disk but the problem persists. Do you have any idea on how to solve this?
Besides, the time among subsequent images has a high variability, as if the trigger is not doing his job.
Also, my colleagues from another lab have built a 2nd stereo camera like the one I have, and we are wondering if it's possible to make a ROS module for synchronized stereo acquisition. Is that possible?
Thank you for your help

Hello Eduardo
if both cameras are connected to the same USB 3.0 controller, the cameras will run half frame rate only. However, in your case, that should be 25 fps.
The other thing is the speed of your hard disc. You can not save 50 single images per second with that resolution to hard disk. That is far too much data.
Usually for this task AVI (video capture) is used. But you must expect frame drops due to hard disc speed, so synchronizing of images of two files becomes very hard.
Regarding the ROS module: I am the wrong to ask that. That is better to be asked the ROS community. And it wont speed up saving to hard disc.
Stefan

The cameras are actually connected to the same USB 3.0 controller, but as I told you, I'm checking the real frame rate without saving the images to disk (so, that's not the problem).
After some more checks, it looks like the real frame rate is around 10Hz whenever I set it to a value equal or above 20. That means that I get a similar frame rate when I set it to 25 or to 50. Do you have an idea of why this happens?

Hmm. To be checked. What does the tcam-capture program say about the real frame rate?

 Videoformat 1920x1200.
At 40 fps, I got 347 frames in 10 seconds. Removing the output with ximagesink, I got 400 images in 10 seconds.
At 54 fps I got 541 frames without ximagesink.  With ximagesink I got 528 frames.
It does not matter, whether you use GRAY8 or BGRx.
Maybe your USB 3 controller is too slow? Or you have too much CPU load, so you get damaged images and therefore frame drops?
Stefan

Hi Stefan,
actually I have an important CPU load when I run the program.
I don't know how to verify the speed of my USB 3 controller.
Do you have any idea on how can I track down the problem?

Hello Eduardo
which computer model do you use? I use an old Core i5.
Stefan

I'm using a laptop HP ZBook 15 G3.
It's 2 years old, but with high specifications (i7, 32Gb RAM, 512 SSD, ...).
Also, below is the usb information I get from lshw:
*-usb
description: USB controller
product: Sunrise Point-H USB 3.0 xHCI Controller
vendor: Intel Corporation
physical id: 14
bus info: pci@0000:00:14.0
version: 31
width: 64 bits
clock: 33MHz
capabilities: xhci bus_master cap_list
configuration: driver=xhci_hcd latency=0
resources: irq:124 memory:e4420000-e442ffff

Hello Eduard
"less than half" regardless the set frame rate. That remembers me to a problem on Jetson TX2 boards, where engineers limited the maximum USB transfer size. Images bigger than a particular size are received also with "less than half" speed. We solved this problem by specifying the USB Transfer Size in the camera with a script. However, that works in the USB 33U cameras, not in the 23U cameras.
On the Jetson TX2 board is no way to specify a bigger USB Transfer size. Maybe this is possible on your laptop, but I do not think so.
What happens, if you use a lower resolution, e.g 1024x768? I guess, you will receive the full frame rate.
Stefan

When I reduce the resolution the problem persists, even with 640x480. Might the problem come from the trigger?

Maybe. You may try without trigger and see, what happens.

It happens the same without trigger :-(

Then it is a computer problem. Did you try tcam-capture? It shows the current fps in the lower right corner.

Yes, I have tried and it had also a deficient frame rate. But I know that when I tried it some time ago it worked perfectly. So, I disconnected the cameras, connected them again and I run tcam-capture and it works fine, at the right frame rate. Then, I run again the stereo camera program, it still drops too many frames. And after that, I run again tcam-capture with deficient frame rate.
My conclusion: when I use the stereo capture I set some options in the cameras that result in a very high frame drop. What do you think?

Hi Stefan,
The slow frame rate came from my own mistake, I was playing around with different parameters and I had changed by mistake "Softwaretrigger" by "TriggerMode" in the for loop. Then, since the behavior was not what I expected I forced the program to exit without setting the correct options for the cameras. That's probably why tcam-capture did not work properly.
After correcting this issue I'm getting a frame rate of around 25fps for maximum resolution, and that's enough for my application.
One more question about the trigger, in my camera setup I have an IMU from Xsens that produces the pulses to synchronize the cameras through the camera's BNC connector. In this case, do I still need Softwaretrigger in order to obtain synchronized images?

Hi Eduardo
Good to read, you sorted the problem out.
If your IMU generates trigger pulses, you do not need to make the software trigger. While the cameras run in trigger mode, the hardware trigger from your IMU will let the cameras to make images.  The complete source code in the loop for the images is not needed.
The only hard part will be finding the image pairs in case of a frame drop, but I would start first with the IMU trigger and see, what you get.
Stefan

OK. Thank you very much for your help Stefan, I appreciate it very much!
I think that this issue can be closed already.

Hi Stefan,
I re-open this issue for a question that requires remembering our previous exchange. I'm recording a stereo sequence using a modified version of your code. I have a external trigger set at 20Hz, so I have removed the instances of SoftwareTrigger. The program works without trigger (but probably the images are not synchronized):
TriggerMode->set(cam1,0);
TriggerMode->set(cam2,0);
But it seems that the trigger is actually working, even though it's disabled on the code, because when I reduce the frequency of the external trigger (e.g. 4Hz). I get the images at 4Hz, even with
cam1.set_capture_format("BGRx", FrameSize{1920,1200}, FrameRate{m_frequency,1});
cam2.set_capture_format("BGRx", FrameSize{1920,1200}, FrameRate{m_frequency,1});
That is extrange! isn't it?
What it is more strange is that if I set
TriggerMode->set(cam1,1);
TriggerMode->set(cam2,1);
I stop receiving images (the callback is not called anymore).
I went through the doc that you created for the stereo program but I do not find the reason for that. It looks like setting the TriggerMode is activated by default in the cameras when a trigger signal is received, and that
TriggerMode->set(cam2,1);
does not work properly?
Do you have any suggestion to try to debug this problem?
Eduardo

Hi Eduardo
First of all, I would try with one camera only. Set the frame rate to maximal 25 Hz,. I am not sure, which value is the nearest values offered to 25Hz by V4L2.
However, we know, that this is working fine with software trigger, so there is no problem with image data transfer.
How does your external trigger signal looks like? The voltage change is from 0V to 5V and higher?
The signal is clear and not noisy?
You contacted the correct pins 12 with - and 11 with +?
If the trigger mode is enabled, then it does not make any difference whether you use software trigger or hardware trigger. For the camera this is the same.
Stefan

Hi Stefan,
Once again, thank you very much for your help!
We found the problem, the cable that linked one camera was broken, we have replaced it and now everything works. We just have too much frame drops at 1920x1280 and 20Hz, but I realized that setting the automatic settings (like the gain) to fixed values reduces a lot the frame drops. If you have any advice on this issue in order to reduce more the frame drop, that could be very helpful for us.
Eduardo


OVML support still doesn't work in version 7.5.6..

Describe the Bug

Summary:
Host Environment

HAXM version:

Host OS version:

Host OS architecture: x86_64

Host CPU model:

Host RAM size:

(Optional) Host computer model:

Guest Environment

Android Emulator or QEMU version:

Guest OS version:

Guest OS architecture:

To Reproduce

Steps to reproduce the behavior:
1.
2.
3.
Expected Behavior

Expectation:
Reproducibility

Diagnostic Information

Host crash dump:

HAXM log:

Android Emulator or QEMU log:

Screenshots:
Additional context

None

After PR #277 merged and HAXM v7.6.1 released, the user can set CPUID feature from user space. We also shared the user space patch of QEMU here, you may try to customize QEMU according to your requirements. Meanwhile, we will proceed to add more features based on this version, including merging patches from community. Hope future releases can improve HAXM on this aspect and meet community requirements. Thanks a lot.

I will download the patched qemu vrrsion and give it a try.
Thank you,
Oliver Bailey
On Tue, Apr 7, 2020, 7:28 AM Wenchao Wang<EMAIL_ADDRESS>wrote:

After PR #277 https://github.com/intel/haxm/pull/277 merged and HAXM
v7.6.1 released, the user can set CPUID feature from user space. We also
shared the user space patch of QEMU here
https://github.com/intel/haxm/files/4385647/qemu_v4.2.0-haxm_cpuid.zip,
you may try to customize QEMU according to your requirements. Meanwhile, we
will proceed to add more features based on this version, including merging
patches from community. Hope future releases can improve HAXM on this
aspect and meet community requirements. Thanks a lot.
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/intel/haxm/issues/286#issuecomment-610357468, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/AD6CBIERN4PQ7KQV7NO3RHDRLMMAFANCNFSM4MCH2MQA
.


No PEP 604 support (e.g. str | None instead of Optional[str])

Hi, I installed mypy 0.800, and it supports PEP 604, which should allow types like "str | None", instead of Optional[str].  Pydantic doesn't seem to like it.
https://mypy-lang.blogspot.com/2021/01/mypy-0800-released.html
Checks

[x] I added a descriptive title to this issue
[x] I have searched (google, github) for similar issues and couldn't find anything
[x] I have read and followed the docs and still think this is a bug

Bug
Output of python -c "import pydantic.utils; print(pydantic.utils.version_info())":
             pydantic version: 1.8
            pydantic compiled: True
                 install path: /app/env/lib/python3.8/site-packages/pydantic
               python version: 3.8.5 (default, Jan 27 2021, 15:41:15)  [GCC 9.3.0]
                     platform: Linux-5.8.0-44-generic-x86_64-with-glibc2.29
     optional deps. installed: ['dotenv', 'email-validator', 'typing-extensions']

from __future__ import annotations

from decimal import Decimal
import pydantic

class FinanceOverviewCell(pydantic.BaseModel):
    # pl_gbp: Optional[Decimal]
    pl_gbp: Decimal | None

The result is:
Traceback (most recent call last):
  File "foo.py", line 6, in <module>
    class FinanceOverviewCell(pydantic.BaseModel):
  File "pydantic/main.py", line 270, in pydantic.main.ModelMetaclass.__new__
  File "pydantic/typing.py", line 282, in pydantic.typing.resolve_annotations
    """Mixin to prohibit subclassing"""
  File "/usr/lib/python3.8/typing.py", line 270, in _eval_type
    return t._evaluate(globalns, localns)
  File "/usr/lib/python3.8/typing.py", line 518, in _evaluate
    eval(self.__forward_code__, globalns, localns),
  File "<string>", line 1, in <module>
TypeError: unsupported operand type(s) for |: 'type' and 'NoneType'

Hi @gjcarneiro
It won't be directly possible because the future implementation is just for annotation but can't be used at runtime !
So it's useful for mypy but can not be leveraged for runtime inspection.
Only with python 3.10 can pydantic leverage this and support the new types.Union (and not typing.Union)
A solution would be to rewrite at interpretation time | into Union for python version prior to 3.10 (I actually did a quick implementation of it https://github.com/PrettyWood/future-typing but it still requires some work) and it could maybe be used some day but definitely not now!

@gjcarneiro FYI https://github.com/samuelcolvin/pydantic/pull/2609 :)


0.7.3 stopped working for me

While 0.7.2 was compiling properly, 0.7.3 fails with this error:
       /tmp/staged/app/Packages/File-0.7.3/Sources/File.swift:258:34: error: value of optional type 'OpaquePointer?' not unwrapped; did you mean to use '!' or '?'?
               while let file = readdir(dir) {
                                        ^
                                           !

What platform and snapshot is this with? Cc @donut

I did change that method (contentsOfDirectory()), copying it mostly from Quark's implementation. On snapshot 05-09 I was getting runtime errors. Using Quark's implementation worked for me and passes the tests, but I did not test it on Linux, only OS X 10.11.6.

This is on Linux w/ Swift 2016-05-09a.

Can you try editing your local copy of [Packages/File-0.7.3/Sources/File.swift] so that line 257 reads while let file = readdir(dir!) { (adding ! to force unwrap the optional)? I'm going to test it on a Linux box as well, but this is working fine on OS X.

I just pushed 0.7.4 with the above fix. Please test it out and let me know if it resolves your issue or not. Sorry about breaking things for you.

herzi confirmed it's working on slack.


forgot password

I forgot my password. A verify-flow with email address would be handy.

+1 T_T

(duplicate #77)


Route selector for Task modules submit event handler cannot filter the event

The route selector for task module submit event reads data[filterField] and checks whether the value satisfies the string or regex provided by developers. I refer https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-task-module/nodejs to test task module related functionality for python and found there're several potential problems in current implementation (both js/python).
The data for fetch event in above sample is:
{'type': 'task/fetch', 'data': 'CustomForm'}

And the data for submit event in above sample is:
{'data': {'usertext': 'test'}, 'context': {'theme': 'default'}}

The potential problem from that sample is:

The fetch event also reads data[filterField] and does the check. The filterField is same for fetch and submit, but it could be different.
The submit event may not have a filterField to filter. In above example, it just contains user input.
The code is checking whether the data object only contains the filterField, but it may contain more fields as we can see in the sample. By the way, the fetch event should contain at least 2 properties (type and the choosen filter field). I tried to remove type property from the sample and Teams will not send fetch request to my bot. Seems the fetch event will never satisfy our SDK's built-in route selector if that's true.

We probably need to revamp the dev experience for task modules.

@singhk97 @corinagum to investigate

How do you suggest we fix this problem?

Didn't think it deeply, but a quick idea is to only accept a RouteSelector function to let developers add their own logic for following reason:
The task module event does not have a protocol on the data model. For example, bot message event has a protocol that there's always a text property, so adding some filtering features around the protocol (text property) is easy to understand and consume.
But for task module, developers define everything so there's nothing we can leverage and help developers filter the events. That probably is the reason that our library adds new concept like filterField to help us implement the filtering logic when developers provide a string or Regex as filter condition. I'm not sure whether we want this learning curve.
I personally have an assumption that "As a developer, I can easily write the RouteSelector function because I defines all the data models, there's no Teams specific thing there". So, supporting RouteSelector only first may be the most efficient options for us now. And we can always add support on other selector types (e.g. string) in the future when we solves the problems we see now. It won't introduce breaking changes.
Feel free to discuss with me if you have other ideas or I have any misunderstanding.

We should add document about how we suggest developers build Task Modules functionality with the library. Also add some background for the design:
The filterField is added to suggest developers always include this field as a contract for their business logic to determine when to invoke which handlers to handle the event. If developers don't have such a field for some reason, they need to add a custom route selector to trigger the handlers.


ValidationError with Generic BaseModel, evan when passing correct type

Initial Checks

[X] I confirm that I'm using Pydantic V2

Description
When i am running the example code, I get a ValidationError:
Traceback (most recent call last):
  File "/home/philipp/repos/foobar/abcd.py", line 19, in <module>
    model = BatteryModel(mode="Idle", power=power)
  File "/home/philipp/repos/foobar/.venv/lib/python3.10/site-packages/pydantic/main.py", line 164, in __init__
    __pydantic_self__.__pydantic_validator__.validate_python(data, self_instance=__pydantic_self__)
pydantic_core._pydantic_core.ValidationError: 1 validation error for BatteryModel
power
  Input should be a valid dictionary or instance of Measurement[Union[float, int]] [type=model_type, input_value=Measurement[Union[float, ...]](value=4235, unit='W'), input_type=Measurement[Union[float, int]]]
    For further information visit https://errors.pydantic.dev/2.5/v/model_type

In my BatteryModel, I say that power is of Type Measurement, where the value can either be a float or an int.
When I am use the variable power, which is an instance of type Measurement[Union[float, int]]  for the parameter power, I get a ValidationError.
The error says, that the input must either be a dictionary or instance of Measurement[Union[float, int]]. And there you can see my input_value is an instance of Measurement[Union[float, int]]
Where is the problem and how to fix it?
Converting the power object back into a dict to pass it to BatteryModel can not be the solution.
Example Code
from typing import Generic, Literal, TypeVar, Union

from pydantic import BaseModel

T = TypeVar('T')

class Measurement(BaseModel, Generic[T]):
    value: T
    unit: str

class BatteryModel(BaseModel):
    mode: Literal['Idle', 'Charge', 'Discharge']
    power: Measurement[float | int]

power = Measurement[Union[float, int]](value=4235, unit="W")
model = BatteryModel(mode="Idle", power=power)

Python, Pydantic & OS Version
pydantic version: 2.5.3
        pydantic-core version: 2.14.6
          pydantic-core build: profile=release pgo=true
                 install path: /home/philipp/repos/foobar/.venv/lib/python3.10/site-packages/pydantic
               python version: 3.10.5 (main, Jul  6 2022, 10:42:25) [GCC 9.4.0]
                     platform: Linux-5.15.0-91-generic-x86_64-with-glibc2.31
             related packages: pyright-1.1.349 typing_extensions-4.9.0

@PJ-Schulz,
I'm not entirely sure of why this works, but looks like if you're consistent with whether or not you use Union[float, int] vs float | int, things work as expected:
from typing import Generic, Literal, TypeVar, Union

from pydantic import BaseModel

T = TypeVar('T')

class Measurement(BaseModel, Generic[T]):
    value: T
    unit: str

class BatteryModel(BaseModel):
    mode: Literal['Idle', 'Charge', 'Discharge']
    power: Measurement[Union[float, int]]

power = Measurement[Union[float, int]](value=4235, unit="W")
model = BatteryModel(mode="Idle", power=power)

or
from typing import Generic, Literal, TypeVar, Union

from pydantic import BaseModel

T = TypeVar('T')

class Measurement(BaseModel, Generic[T]):
    value: T
    unit: str

class BatteryModel(BaseModel):
    mode: Literal['Idle', 'Charge', 'Discharge']
    power: Measurement[float | int]

power = Measurement[float | int](value=4235, unit="W")
model = BatteryModel(mode="Idle", power=power)

This is a bit of an odd case. I'd be curious to know why the consistency matters in regards to style of union definition here, if anyone knows!
Going to close this as resolved though, given that there's an easy to implement solution :).

@sydney-runkle, thanks for your help.
The message in the traceback is confusing in the case that it expects a type and gets exactly that, but still raises an error.

@PJ-Schulz,
Indeed. Perhaps this error shouldn't happen at all. I think the reason for this behavior is the following inconsistency:
>>> type(typing.Union[int, float])
<class 'typing._UnionGenericAlias'>
>>> type(int | float)
<class 'types.UnionType'>

That being said, we could utilize the origin_is_union function from pydantic to fix this behavior. Something somewhere is likely checking types too strictly. I'll reopen this as a bug 👍


Menu Images

Ensure that the Menu images are wrapped with the menu text

added styling for this to happen


Add Storage support

Here's the clean PR.

Alright, made the changes, let me know what you think!

Alright I think this should be good. Thanks a lot for explaining the JS stuff, makes more sense now.

LGTM! Awesome work, thanks again.
Let me know if you need this published to Pub now, I can upload.

No need for now. I'm gonna add more modules to the next day or two.


Merge Conflict Actions Missing

With the cake extension enabled, I do not see the merge conflicts actions anymore.
See https://github.com/eamodio/vscode-gitlens/issues/344 for a similar issue in another vscode addin.
This is since cake adds its own codelens to run tasks.

@Roemer apologies for not coming back to you sooner about this!
Reading through that issue that you linked it would appear that the underlying issue was with VSCode, and was fixed in an update.
I am going to assume that the same is true here, and I will close out this issue.  Thanks


How can one bring new mon/osd into a existing cluster from a different inventory path

Bug Report
What happened:
This is not a bug report. It is kind of a query.
I have a wired requirement to add/remove additional nodes to/from the cluster from a different ceph-ansible inventory.
I want to bring up a minimum cluster with one mon and dashboard. Once the initial cluster is UP and running; then I want to scale up/down the cluster bring in new node which brings it's own inventory.
Can I provide any state information (like fsid etc) from the cluster to new inventory of the new node and add this new node into the existing Cluster.
Thank you in advance.

Closing this issue as I found a workaround solution for my usecase. I am adding the first Mon address in the repository whenever a new node being added to join the cluster.


Any chance to have this component working with vue.js 2?

It would be great to have this component working with vue.js 2.
Do you have any plan or hint on how to make it work?
Thanks

It's already working with Vue 2.x. Look at the docs! ;)
The beta can be downloaded with:
npm install vue-multiselect@next --save
It should become stable soon. Still want to improve some things so there might be some small breaking changes till that.


Add files via upload

@zigathustra This request remains unanswered for a while, and does not conform the repository rules. I have to close it without merging.