From 9de47ade1ea45a236bf508a2b58dc511ada27096 Mon Sep 17 00:00:00 2001 From: Luigi Marini Date: Mon, 13 Nov 2023 09:43:15 -0600 Subject: [PATCH 01/10] Ranaming `master` branch to `main`. --- .github/workflows/ci.yml | 10 +++++----- .github/workflows/docker.yml | 12 ++++++------ .github/workflows/swagger.yml | 4 ++-- CONTRIBUTING.md | 2 +- INSTALL.md | 2 +- doc/src/sphinx/_static/logo_full.png | Bin 18068 -> 0 bytes doc/src/sphinx/develop/previewers.rst | 2 +- doc/src/sphinx/index.rst | 2 +- project/Build.scala | 2 +- public/swagger.yml | 2 +- release.sh | 4 ++-- 11 files changed, 21 insertions(+), 21 deletions(-) delete mode 100644 doc/src/sphinx/_static/logo_full.png diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a77d911b5..9eb79da03 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ on: push: branches: - - master + - main - develop pull_request: @@ -39,7 +39,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi echo "GITHUB_BRANCH=${BRANCH}" >> $GITHUB_ENV - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then echo "CLOWDER_VERSION=$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" >> $GITHUB_ENV elif [ "$BRANCH" == "develop" ]; then echo "CLOWDER_VERSION=develop" >> $GITHUB_ENV @@ -94,7 +94,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi echo "GITHUB_BRANCH=${BRANCH}" >> $GITHUB_ENV - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then echo "CLOWDER_VERSION=$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" >> $GITHUB_ENV elif [ "$BRANCH" == "develop" ]; then echo "CLOWDER_VERSION=develop" >> $GITHUB_ENV @@ -139,7 +139,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi echo "GITHUB_BRANCH=${BRANCH}" >> $GITHUB_ENV - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then echo "CLOWDER_VERSION=$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" >> $GITHUB_ENV elif [ "$BRANCH" == "develop" ]; then echo "CLOWDER_VERSION=develop" >> $GITHUB_ENV @@ -216,7 +216,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi echo "GITHUB_BRANCH=${BRANCH}" >> $GITHUB_ENV - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then echo "CLOWDER_VERSION=$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" >> $GITHUB_ENV elif [ "$BRANCH" == "develop" ]; then echo "CLOWDER_VERSION=develop" >> $GITHUB_ENV diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 7702ae180..e8823d464 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -5,7 +5,7 @@ name: Docker # and would not set the right version flags. # This will run when: -# - when new code is pushed to master/develop to push the tags +# - when new code is pushed to main/develop to push the tags # latest and develop # - when a pull request is created and updated to make sure the # Dockerfile is still valid. @@ -16,14 +16,14 @@ name: Docker on: push: branches: - - master + - main - develop pull_request: -# Certain actions will only run when this is the master repo. +# Certain actions will only run when this is the main repo. env: - MASTER_REPO: clowder-framework/clowder + main_REPO: clowder-framework/clowder DOCKERHUB_ORG: clowder jobs: @@ -77,7 +77,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then version="$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" tags="latest" oldversion="" @@ -198,7 +198,7 @@ jobs: # update README at DockerHub - name: Docker Hub Description - if: env.dockerhub != '' && matrix.README != '' && github.event_name == 'push' && github.repository == env.MASTER_REPO && env.BRANCH == 'master' + if: env.dockerhub != '' && matrix.README != '' && github.event_name == 'push' && github.repository == env.main_REPO && env.BRANCH == 'main' uses: peter-evans/dockerhub-description@v2 env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} diff --git a/.github/workflows/swagger.yml b/.github/workflows/swagger.yml index b55dfb26f..dd3f0715f 100644 --- a/.github/workflows/swagger.yml +++ b/.github/workflows/swagger.yml @@ -1,14 +1,14 @@ name: swagger # This will run when: -# - when new code is pushed to master/develop to make sure the +# - when new code is pushed to main/develop to make sure the # code does compile. # - when a pull request is created and updated to make sure the # code does compile. on: push: branches: - - master + - main - develop pull_request: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3a2fd3f99..0187dc6d2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ below. By participating in this project, you agree to abide by the [code of cond Before your code can be accepted, you will have to sign a [CLA](https://clowderframework.org/pdf/Clowder-CLA.pdf) and mail it to lmarini@illinois.edu. -Most of the core development happens on [NCSA Bitbucket][bitbucket]. The `master` and `develop` branches are pushed to +Most of the core development happens on [NCSA Bitbucket][bitbucket]. The `` and `develop` branches are pushed to [GitHub][github] nightly. We encourage contributors to create an account on [NCSA Bitbucket][bitbucket] and make pull requests there. We also accept diff --git a/INSTALL.md b/INSTALL.md index ae9c8ba33..dc1c5e0ab 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -85,7 +85,7 @@ Next we install the script that will install or update clowder. cat > /home/browndog/update-clowder.sh << EOF #!/bin/bash -# CATS-WWW (master) is the main branch for this server +# CATS-WWW () is the main branch for this server # CATS-WWW1 (develop) if you want the latest version clowder_BRANCH=${clowder_BRANCH:-"CATS-WWW1"} diff --git a/doc/src/sphinx/_static/logo_full.png b/doc/src/sphinx/_static/logo_full.png deleted file mode 100644 index 0ecf1c8413f241bed62d96ae0e43d02f0bb446ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18068 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 diff --git a/doc/src/sphinx/develop/previewers.rst b/doc/src/sphinx/develop/previewers.rst index b9dc3da31..71da64895 100644 --- a/doc/src/sphinx/develop/previewers.rst +++ b/doc/src/sphinx/develop/previewers.rst @@ -12,4 +12,4 @@ Previewer can work together with extractors and external services. Here is a list of previewer embedded with the core -`source `_. +`source `_. diff --git a/doc/src/sphinx/index.rst b/doc/src/sphinx/index.rst index 25dc21225..7b067518f 100644 --- a/doc/src/sphinx/index.rst +++ b/doc/src/sphinx/index.rst @@ -25,7 +25,7 @@ be customized and deployed on your own cloud. `NCSA Opensource `_. A copy of the source code can also be found on `GitHub `_. - * We are always looking for `contributions `_. + * We are always looking for `contributions `_. ******** Contents diff --git a/project/Build.scala b/project/Build.scala index 585a8137b..ce954ab85 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -18,7 +18,7 @@ object ApplicationBuild extends Build { def appVersion: String = { gitBranchName match { - case "master" => getVersion + case "" => getVersion case _ => s"${getVersion}-develop" } } diff --git a/public/swagger.yml b/public/swagger.yml index 221e16ff2..f9338cd80 100644 --- a/public/swagger.yml +++ b/public/swagger.yml @@ -16,7 +16,7 @@ info: url: https://clowder.ncsa.illinois.edu/clowder/email license: name: The University of Illinois/NCSA Open Source License (NCSA) - url: https://github.com/clowder-framework/clowder/blob/master/LICENSE + url: https://github.com/clowder-framework/clowder/blob//LICENSE ################################################################################ # Servers # diff --git a/release.sh b/release.sh index ec6c83ba8..e80f404dc 100755 --- a/release.sh +++ b/release.sh @@ -4,7 +4,7 @@ set -e # can use the following to push to isda-registry for testing: -# BRANCH="master" SERVER=isda-registry.ncsa.illinois.edu/ ./release.sh +# BRANCH="" SERVER=isda-registry.ncsa.illinois.edu/ ./release.sh # use DEBUG=echo ./release.sh to print all commands DEBUG=${DEBUG:-""} @@ -19,7 +19,7 @@ BRANCH=${BRANCH:-"$(git rev-parse --abbrev-ref HEAD)"} BRANCH=${BRANCH} VERSION=${TMPVERSION} DEBUG=${DEBUG} $(dirname $0)/docker.sh # find out the version -if [ "${BRANCH}" = "master" ]; then +if [ "${BRANCH}" = "" ]; then VERSION=${VERSION:-""} if [ "${VERSION}" = "" ]; then TMPVERSION=$(awk '/version = / { print $4 }' $(dirname $0)/project/Build.scala | sed 's/"//g') From 8b93e4b1e3ce6f676a31bbc45dfbb8415b00b293 Mon Sep 17 00:00:00 2001 From: Rob Kooper Date: Fri, 11 Jul 2025 13:13:48 -0400 Subject: [PATCH 02/10] Update GitHub Actions to latest versions Upgraded various GitHub Actions in ci.yml, docker.yml, and swagger.yml to their latest major versions for improved security and maintenance. Also updated environment variable naming and DockerHub description action usage in docker.yml for consistency and compatibility. --- .github/workflows/ci.yml | 12 ++++++------ .github/workflows/docker.yml | 32 ++++++++++++++++---------------- .github/workflows/swagger.yml | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9eb79da03..53f31ca42 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,7 +30,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: github branch run: | if [ "${{ github.event.release.target_commitish }}" != "" ]; then @@ -51,12 +51,12 @@ jobs: distribution: 'zulu' java-version: 8 - name: Cache SBT ivy cache - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.ivy2/cache key: ${{ runner.os }}-sbt-ivy-cache-${{ hashFiles('project/Build.scala') }} - name: Cache SBT - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.sbt key: ${{ runner.os }}-sbt-${{ hashFiles('project/Build.scala') }} @@ -85,7 +85,7 @@ jobs: ports: - 27017:27017 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: github branch run: | if [ "${{ github.event.release.target_commitish }}" != "" ]; then @@ -130,7 +130,7 @@ jobs: runs-on: ubuntu-latest needs: build steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: github branch run: | if [ "${{ github.event.release.target_commitish }}" != "" ]; then @@ -207,7 +207,7 @@ jobs: runs-on: ubuntu-latest needs: build steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: github branch run: | if [ "${{ github.event.release.target_commitish }}" != "" ]; then diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index e8823d464..5e1053543 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -23,7 +23,7 @@ on: # Certain actions will only run when this is the main repo. env: - main_REPO: clowder-framework/clowder + MAIN_REPO: clowder-framework/clowder DOCKERHUB_ORG: clowder jobs: @@ -64,7 +64,7 @@ jobs: PLATFORM: "linux/amd64" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # calculate some variables that are used later - name: variable setup @@ -115,11 +115,11 @@ jobs: # setup docker build - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Inspect Builder run: | @@ -132,13 +132,13 @@ jobs: # login to registries - name: Login to DockerHub if: env.dockerhub != '' - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} @@ -147,7 +147,7 @@ jobs: # build the clowder docker images - name: Build and push ${{ matrix.IMAGE }}-build if: matrix.IMAGE == 'clowder' - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v6 with: push: true context: ${{ matrix.FOLDER }} @@ -164,7 +164,7 @@ jobs: - name: Build and push ${{ matrix.IMAGE }}-runtime if: matrix.IMAGE == 'clowder' - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v6 with: push: true context: ${{ matrix.FOLDER }} @@ -182,7 +182,7 @@ jobs: # build the other docker images - name: Build and push ${{ matrix.IMAGE }} if: matrix.IMAGE != 'clowder' - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v6 with: push: true context: ${{ matrix.FOLDER }} @@ -198,10 +198,10 @@ jobs: # update README at DockerHub - name: Docker Hub Description - if: env.dockerhub != '' && matrix.README != '' && github.event_name == 'push' && github.repository == env.main_REPO && env.BRANCH == 'main' - uses: peter-evans/dockerhub-description@v2 - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} - DOCKERHUB_REPOSITORY: ${{ env.DOCKERHUB_ORG }}/${{ matrix.IMAGE }} - README_FILEPATH: ${{ matrix.README }} + if: env.dockerhub != '' && matrix.README != '' && github.event_name == 'push' && github.repository == env.MAIN_REPO && env.BRANCH == 'main' + uses: peter-evans/dockerhub-description@v4 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + repository: ${{ env.DOCKERHUB_ORG }}/${{ matrix.IMAGE }} + readme-filepath : ${{ matrix.README }} diff --git a/.github/workflows/swagger.yml b/.github/workflows/swagger.yml index dd3f0715f..ad68e05e5 100644 --- a/.github/workflows/swagger.yml +++ b/.github/workflows/swagger.yml @@ -20,7 +20,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: openapi-lint uses: mbowman100/swagger-validator-action@master From da7b7f5da2ff7b1737b38c03bb7c298aa6d32f0e Mon Sep 17 00:00:00 2001 From: Rob Kooper Date: Fri, 11 Jul 2025 13:46:58 -0400 Subject: [PATCH 03/10] fix resolvers small tweak to dockerfile to remove warning --- Dockerfile | 2 +- project/Build.scala | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3ef75036b..b3439ee2d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,7 +40,7 @@ RUN rm -rf target/universal/clowder-*.zip clowder clowder-* \ # ---------------------------------------------------------------------- # BUILD CLOWDER # ---------------------------------------------------------------------- -FROM openjdk:8-jre-bullseye as clowder-runtime +FROM openjdk:8-jre-bullseye AS clowder-runtime # environemnt variables ARG BRANCH="unknown" diff --git a/project/Build.scala b/project/Build.scala index ce954ab85..06b9ca764 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -153,13 +153,14 @@ object ApplicationBuild extends Build { routesImport += "models._", routesImport += "Binders._", templatesImport += "org.bson.types.ObjectId", - resolvers += Resolver.url("sbt-plugin-releases", url("http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns), - resolvers += Resolver.url("sbt-plugin-snapshots", url("http://repo.scala-sbt.org/scalasbt/sbt-plugin-snapshots/"))(Resolver.ivyStylePatterns), + resolvers += Resolver.url("sbt-plugin-releases", url("https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns), + resolvers += Resolver.url("sbt-plugin-snapshots", url("https://repo.scala-sbt.org/scalasbt/sbt-plugin-snapshots/"))(Resolver.ivyStylePatterns), resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots", - resolvers += "Aduna" at "http://maven-us.nuxeo.org/nexus/content/repositories/public/", + resolvers += "Aduna" at "https://maven-us.nuxeo.org/nexus/content/repositories/public/", //resolvers += "Forth" at "http://139.91.183.63/repository", resolvers += "NCSA" at "https://opensource.ncsa.illinois.edu/nexus/content/repositories/thirdparty", - resolvers += "Typesafe repository" at "https://repo.typesafe.com/typesafe/releases/", + resolvers += "Typesafe repository" at "https://repo.lightbend.com/typesafe/releases/", + resolvers += "Maven Central" at "https://repo1.maven.org/maven2/", // add custom folder to the classpath, use this to add/modify clowder: // custom/public/stylesheets/themes - for custom themes From 73f7677b4336e66b8c4788590d6d4b3266d3ad23 Mon Sep 17 00:00:00 2001 From: Rob Kooper Date: Fri, 11 Jul 2025 13:47:35 -0400 Subject: [PATCH 04/10] second reference to as in dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index b3439ee2d..4e03e13dc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------- # BUILD CLOWDER DIST # ---------------------------------------------------------------------- -FROM openjdk:8-jdk-bullseye as clowder-build +FROM openjdk:8-jdk-bullseye AS clowder-build ARG BRANCH="unknown" ARG VERSION="unknown" From 85df2b0e0155d4f37c4b5f4b4bfe0f073efd02a9 Mon Sep 17 00:00:00 2001 From: Rob Kooper Date: Fri, 11 Jul 2025 13:56:32 -0400 Subject: [PATCH 05/10] another location where typesafe has wrong url --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 92dfe0fd5..b178cd7a7 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -2,7 +2,7 @@ logLevel := Level.Warn // The Typesafe repository -resolvers += "Typesafe repository" at "https://repo.typesafe.com/typesafe/releases/" +resolvers += "Typesafe repository" at "https://repo.lightbend.com/typesafe/releases/" // Use the Play sbt plugin for Play projects addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.6") From 790fb849a164e54a26080a47cc7c1ab2aba7ef70 Mon Sep 17 00:00:00 2001 From: Rob Kooper Date: Fri, 11 Jul 2025 17:59:35 -0400 Subject: [PATCH 06/10] Remove iRods integration: delete iRods storage service, plugin, config, and docs. Update changelog. Users must use another storage backend (filesystem, MongoDB GridFS, or AWS S3). --- CHANGELOG.md | 5 + .../irods/IRODSByteStorageService.scala | 198 ------------------ app/services/irods/IRODSPlugin.scala | 93 -------- conf/application.conf | 24 --- doc/src/sphinx/develop/architecture.rst | 2 +- project/Build.scala | 11 +- 6 files changed, 12 insertions(+), 321 deletions(-) delete mode 100644 app/services/irods/IRODSByteStorageService.scala delete mode 100644 app/services/irods/IRODSPlugin.scala diff --git a/CHANGELOG.md b/CHANGELOG.md index 37eb95678..5929f9973 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [Unreleased] + +### Removed +- Removed iRods integration and dependencies. The iRods file storage service and plugin have been completely removed from the codebase. Users who were using iRods for file storage will need to configure an alternative storage backend (filesystem, MongoDB GridFS, or AWS S3). + ## 1.22.1 - 2023-11-10 ### Fixed diff --git a/app/services/irods/IRODSByteStorageService.scala b/app/services/irods/IRODSByteStorageService.scala deleted file mode 100644 index e36952a86..000000000 --- a/app/services/irods/IRODSByteStorageService.scala +++ /dev/null @@ -1,198 +0,0 @@ -package services.irods - -import java.io._ -import java.security.{DigestInputStream, MessageDigest} - -import models.UUID -import org.apache.commons.codec.binary.Hex -import org.apache.commons.io.input.CountingInputStream -import org.irods.jargon.core.exception.JargonException -import org.irods.jargon.core.pub.io.IRODSFile -import play.api.{Logger, Play} -import play.api.Play._ -import services.ByteStorageService - -/** - * Helper to store data on disk. - * - */ -class IRODSByteStorageService extends ByteStorageService { - /** - * Save the bytes to IRODS - */ - def save(inputStream: InputStream, prefix: String, length: Long): Option[(String, Long)] = { - current.plugin[IRODSPlugin] match { - case None => { - Logger.error("No IRODSPlugin") - None - } - case Some(ipg) => { - var depth = Play.current.configuration.getInt("irods.depth").getOrElse(2) - - var relativePath = "" - var idstr = UUID.generate().stringify - // id seems to be same at the start but more variable at the end - while (depth > 0 && idstr.length > 4) { - depth -= 1 - if (relativePath == "") { - relativePath = idstr.takeRight(2) - } else { - relativePath += java.io.File.separatorChar + idstr.takeRight(2) - } - idstr = idstr.dropRight(2) - } - - // need to use whole id again, to make sure it is unique - relativePath += java.io.File.separatorChar + idstr - - // combine all pieces - val filePath = makePath(ipg.userhome, prefix, relativePath) - - // make sure the connection is open - if (!ipg.conn) { - ipg.openIRODSConnection() - } - - try { - // create folder structure - val file = ipg.getFileFactory().instanceIRODSFile(filePath) - if (!file.getParentFile.isDirectory && !file.getParentFile.mkdirs()) { - return None - } - - // fill a buffer Array - val cis = new CountingInputStream(inputStream) - val fos = ipg.getFileFactory().instanceIRODSFileOutputStream(file) - val buffer = new Array[Byte](16384) - var count: Int = -1 - while ( { - count = cis.read(buffer); count > 0 - }) { - fos.write(buffer, 0, count) - } - fos.close() - - val length = cis.getByteCount - - // finished - Some(relativePath, length) - } catch { - case e: JargonException => { - Logger.error("Could not save file " + filePath) - None - } - case e: IOException => { - Logger.error("Could not save file " + filePath) - None - } - } finally { - ipg.closeIRODSConnection() - } - } - } - } - - /** - * Get the bytes from IRODS - */ - def load(id: String, prefix: String): Option[InputStream] = { - current.plugin[IRODSPlugin] match { - case None => { - Logger.error("No IRODSPlugin") - None - } - case Some(ipg) => { - // combine all pieces - val filePath = makePath(ipg.userhome, prefix, id) - - // find actual file and delete it - if (!ipg.conn) { - ipg.openIRODSConnection() - } - try { - val file = ipg.getFileFactory().instanceIRODSFile(filePath) - val is = ipg.getFileFactory().instanceIRODSFileInputStream(file) - - // HACK with an intermediary buffer - works, no errors - // I could not pass the InputStream is directly to Some(InputStream, String, String, Long) because, - // I think the is.close does not propagate from File > downloads > Enumerator through the chain - // to the IRODSFileInputStream. Closing the stream here works. - val buffer = new ByteArrayOutputStream() - var count: Int = -1 - val data = new Array[Byte](16384) - - while ({count = is.read(data, 0, data.length); count > 0}) { - buffer.write(data, 0, count) - } - is.close() - - Some(new ByteArrayInputStream(buffer.toByteArray)) - } catch { - case e: JargonException => { - Logger.error("Could not retrieve file " + filePath) - None - } - case e: IOException => { - Logger.error("Could not retrieve file " + filePath) - None - } - } finally { - ipg.closeIRODSConnection() - } - } - } - } - - /** - * Delete actual bytes from IRODS - */ - def delete(id: String, prefix: String): Boolean = { - current.plugin[IRODSPlugin] match { - case None => { - Logger.error("No IRODSPlugin") - false - } - case Some(ipg) => { - // combine all pieces - val filePath = makePath(ipg.userhome, prefix, id) - - // find actual file and delete it - if (!ipg.conn) { - ipg.openIRODSConnection() - } - try { - val file = ipg.getFileFactory().instanceIRODSFile(filePath) - if (file.exists()) file.deleteWithForceOption() else true - } catch { - case e: JargonException => { - Logger.error("Could not delete file " + filePath) - false - } - case e: IOException => { - Logger.error("Could not delete file " + filePath) - false - } - } finally { - ipg.closeIRODSConnection() - } - } - } - } - - def makePath(root: String, prefix: String, relativePath: String) = { - // create absolute path - var filePath = if (root.last != IRODSFile.PATH_SEPARATOR_CHAR) { - root + IRODSFile.PATH_SEPARATOR - } else { - root - } - - // add the prefix - if (prefix != "") { - filePath += prefix + IRODSFile.PATH_SEPARATOR - } - - // finally create full path - filePath + relativePath - } -} diff --git a/app/services/irods/IRODSPlugin.scala b/app/services/irods/IRODSPlugin.scala deleted file mode 100644 index 4a4921009..000000000 --- a/app/services/irods/IRODSPlugin.scala +++ /dev/null @@ -1,93 +0,0 @@ -package services.irods - -import play.api.{ Play, Plugin, Logger, Application } -import org.irods.jargon.core.connection.IRODSAccount -import org.irods.jargon.core.pub.IRODSFileSystem -import org.irods.jargon.core.pub.io.IRODSFileFactory -import org.irods.jargon.core.exception.JargonException - -/** - * A concrete storage based on the iRODS file storage system. There are 7 - * required parameters to establish a connection to iRODS including a - * host, port, username, password, user home, zone, and default storage resource - * name. - * - * Setup iRODS connection using Jargon. - * - * @date 2014-08-18 - * - */ -class IRODSPlugin(app: Application) extends Plugin { - - var userhome: String = _ - - var account: IRODSAccount = _ - var irodsFileSystem: IRODSFileSystem = _ - var irodsFileFactory: IRODSFileFactory = _ - private var _conn: Boolean = false - - override def onStart() { - Logger.info("Starting iRODS Plugin.") - openIRODSConnection() - Logger.info("irods: Connected. " + conn) - } - - override def onStop() { - // close connection - closeIRODSConnection() - Logger.info("iRODSPlugin has stopped.") - } - - //Is the plugin enabled? - override def enabled = true - - - def openIRODSConnection() = { - lazy val configuration = Play.current.configuration - // you can now access the application.conf settings - - // seven required fields (similar to .irodsEnv file used in icommands client) - val host = configuration.getString("irods.host").getOrElse("") - val port = configuration.getInt("irods.port").getOrElse(0) - val username = configuration.getString("irods.username").getOrElse("") - val password = configuration.getString("irods.password").getOrElse("") - val zone = configuration.getString("irods.zone").getOrElse("") - val defaultStorageResource = configuration.getString("irods.defaultStorageResource").getOrElse("") - userhome = configuration.getString("irods.userhome").getOrElse("") - - val usercurrent = configuration.getString("irods.usercurrent").getOrElse("") - - try { - account = IRODSAccount.instance(host, port, username, password, userhome, zone, defaultStorageResource) - irodsFileSystem = IRODSFileSystem.instance() // RODSFileSystem shared object, initialized - Logger.debug("irods: Connecting to " + account.toString()) - - // the actual connection, For a given account creates an IRODSFileFactory that can return iRODS file objects for this particular connection. - irodsFileFactory = irodsFileSystem.getIRODSFileFactory(account) - - _conn = true - } catch { - case je: org.irods.jargon.core.exception.JargonException => Logger.error("irods: Error connecting to iRODS server. " + je.toString); _conn = false - case t: Throwable => Logger.error("irods: Unknown error connecting to iRODS server: " + t.toString); _conn = false - } - } - - def closeIRODSConnection() = { - Logger.info("irods: Closing connection.") - irodsFileSystem.closeAndEatExceptions() - _conn = false - } - - // Close the session that is connected to the particular iRODS server with the given account. - def closeIRODSAccountConnection() = { - Logger.info("irods: Closing account connection.") - irodsFileSystem.closeAndEatExceptions(account) - _conn = false - } - - //getters - def getFileFactory(): IRODSFileFactory = { return irodsFileFactory } - def conn = _conn - // setter - def conn_= (value:Boolean):Unit = _conn = value -} \ No newline at end of file diff --git a/conf/application.conf b/conf/application.conf index 2aad1f5df..c63dc009d 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -324,30 +324,6 @@ filesystem.sourcepaths=[ "/home/globus", ] -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# IRODSPlugin Plugin -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# To use the IRODS filesystem uncomment the following line -#service.byteStorage=services.irods.IRODSByteStorageService -# -# iRODS server host name -irods.host=localhost -# iRODS server port number -irods.port=1247 -# Account name -irods.username=anonymous -# Account password -## if irods.username=anonymous use "" for password (irods.password="") -irods.password="" -# Default storage resource name -irods.defaultStorageResource= demoResc -# iRODS zone -irods.zone=tempZone -# Home directory in iRODS -irods.userhome=/tempZone/home/public -# Current directory in iRODS -irods.usercurrent=/tempZone/home/public - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Elasticsearch # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/src/sphinx/develop/architecture.rst b/doc/src/sphinx/develop/architecture.rst index 3e36c8cc2..cb856f5b6 100644 --- a/doc/src/sphinx/develop/architecture.rst +++ b/doc/src/sphinx/develop/architecture.rst @@ -9,7 +9,7 @@ provided for external clients to communicate with the system. These clients can cases as well as headless scripts for system to system communication. A service layer abstracts backend services so that individual deployments can be customized based on available resources. -For example a user might want to store raw files on the file system, MongoDB GridFS, iRods or AWS S3 buckets. +For example a user might want to store raw files on the file system, MongoDB GridFS, or AWS S3 buckets. When new data is added to the system, whether it is via the web interface or through the RESTful API, preprocessing is off-loaded to extraction services in charge of extracting appropriate data and metadata. The extraction services attempt diff --git a/project/Build.scala b/project/Build.scala index 06b9ca764..05d5ae99c 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -118,9 +118,6 @@ object ApplicationBuild extends Build { // Testing framework "org.scalatestplus" % "play_2.10" % "1.0.0" % "test", - // iRods filestorage - "org.irods.jargon" % "jargon-core" % "3.3.3-beta1", - // jsonp return from /api "org.julienrf" %% "play-jsonp-filter" % "1.1", @@ -153,15 +150,19 @@ object ApplicationBuild extends Build { routesImport += "models._", routesImport += "Binders._", templatesImport += "org.bson.types.ObjectId", + resolvers := Seq( + "Typesafe Releases Repository" at "https://repo.lightbend.com/typesafe/releases/", + "Typesafe repository" at "https://repo.lightbend.com/typesafe/releases/" + ) ++ resolvers.value.filterNot(r => r.name == "Typesafe Releases Repository" || r.name == "Typesafe repository"), resolvers += Resolver.url("sbt-plugin-releases", url("https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns), resolvers += Resolver.url("sbt-plugin-snapshots", url("https://repo.scala-sbt.org/scalasbt/sbt-plugin-snapshots/"))(Resolver.ivyStylePatterns), resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots", resolvers += "Aduna" at "https://maven-us.nuxeo.org/nexus/content/repositories/public/", //resolvers += "Forth" at "http://139.91.183.63/repository", - resolvers += "NCSA" at "https://opensource.ncsa.illinois.edu/nexus/content/repositories/thirdparty", - resolvers += "Typesafe repository" at "https://repo.lightbend.com/typesafe/releases/", + //resolvers += "NCSA" at "https://opensource.ncsa.illinois.edu/nexus/content/repositories/thirdparty", resolvers += "Maven Central" at "https://repo1.maven.org/maven2/", + // add custom folder to the classpath, use this to add/modify clowder: // custom/public/stylesheets/themes - for custom themes // custom/public/javascripts/previewers - for custom previewers From 64e41836801856e0ddf7d8f602283087293dae67 Mon Sep 17 00:00:00 2001 From: Rob Kooper Date: Fri, 11 Jul 2025 18:02:19 -0400 Subject: [PATCH 07/10] remove typesafe references from jar file --- CHANGELOG.md | 3 +++ sbt-launch.jar | Bin 1208385 -> 1208393 bytes 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5929f9973..e5b170fca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Fixed +- Removed refrences to repo.typesafe.com from sbt-launch.jar and build.scala + ### Removed - Removed iRods integration and dependencies. The iRods file storage service and plugin have been completely removed from the codebase. Users who were using iRods for file storage will need to configure an alternative storage backend (filesystem, MongoDB GridFS, or AWS S3). diff --git a/sbt-launch.jar b/sbt-launch.jar index 0d9dd94c57e48c8b08c90e44ad9379fc0ebcde2c..8779d859b89ef61224bc4ede2eabfc1697234b3a 100644 GIT binary patch delta 49727 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 delta 48771 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 sd5@9C!;#+lhUQd`o$_+ Date: Fri, 11 Jul 2025 18:51:12 -0400 Subject: [PATCH 08/10] Fix upload artifact --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 53f31ca42..e9f2a03a4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -177,7 +177,7 @@ jobs: done rm ${ZIPFILE} zip -r ${ZIPFILE} ${DIR} - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: clowder.zip path: target/universal/clowder-*.zip @@ -248,7 +248,7 @@ jobs: VERSION: ${{ env.CLOWDER_VERSION }} BUILDNUMBER: ${{ github.run_number }} GITSHA1: ${{ github.sha }} - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: ScalaDoc path: target/scala-*/api/ From 5c0f0efd8c40441dfa10a6ac8e72d7e56845ecd1 Mon Sep 17 00:00:00 2001 From: Rob Kooper Date: Fri, 11 Jul 2025 20:27:10 -0400 Subject: [PATCH 09/10] more version bumps --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e9f2a03a4..37bd57507 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -183,7 +183,7 @@ jobs: path: target/universal/clowder-*.zip - name: Upload files to a GitHub release if: github.event_name == 'release' && github.event.action == 'created' - uses: svenstaro/upload-release-action@1.1.0 + uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} tag: ${{ github.ref }} @@ -266,7 +266,7 @@ jobs: cd doc/src/sphinx/ python -m pip install -r requirements.txt make html epub - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: HTML Documentation path: doc/src/sphinx/_build/html @@ -279,13 +279,13 @@ jobs: key: ${{ secrets.SCP_KEY }} files: "doc/src/sphinx/_build/html/*" target: "CATS/${{ env.CLOWDER_VERSION }}/documentation/sphinx" - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: EPUB Documentation path: doc/src/sphinx/_build/epub/Clowder.epub - name: Upload files to a GitHub release if: github.event_name == 'release' && github.event.action == 'created' - uses: svenstaro/upload-release-action@1.1.0 + uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} tag: ${{ github.ref }} From f3cd9585a6f9ca78ac0235175a73f907b08d7928 Mon Sep 17 00:00:00 2001 From: Rob Kooper Date: Fri, 11 Jul 2025 20:36:38 -0400 Subject: [PATCH 10/10] fix python version --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 37bd57507..0f3f876d7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -237,10 +237,10 @@ jobs: with: path: ~/.sbt key: ${{ runner.os }}-sbt-${{ hashFiles('project/Build.scala') }} - - name: Set up Python 3.7 - uses: actions/setup-python@v1 + - name: Set up Python 3.11 + uses: actions/setup-python@v5 with: - python-version: 3.7 + python-version: 3.11 - name: sbt doc run: ./sbt doc env: