From ee8de424d7919991282d8a7333dd5faeb969b068 Mon Sep 17 00:00:00 2001 From: Justin Kolberg Date: Thu, 31 Oct 2024 12:14:57 -0700 Subject: [PATCH 1/5] chore(ci): pkg trigger & release workflow updates Packaging is now only triggered from Dev & PR builds. The only input sent when triggering packaging is now the Workflow Run ID of the workflow run that packaging should pull its artifacts from. The version of otelcol-sumo & otelcol-config is now determined using a combination of the otelcol_version in `otelcolbuilder/.otelcol-builder.yaml` and git tags. Releases are no longer triggered by the creation of a tag. A release can now be triggered via the new 'Publish release' workflow. The new release workflow requires the ID of a workflow run that contains the artifacts to be released. The Git SHA used to build the otelcol-sumo binary is now included in the version of the --version flag. Signed-off-by: Justin Kolberg --- .changelog/1693.changed.txt | 1 + .github/workflows/dev_builds.yml | 53 --- .github/workflows/pull_requests.yml | 26 +- .github/workflows/release-packaging.yml | 13 - .../{release_builds.yml => releases.yml} | 214 ++++----- .../workflows/workflow-trigger-packaging.yml | 37 +- ci/get_version.sh | 134 +++--- ci/get_version_from_binary.sh | 95 ++++ otelcolbuilder/Makefile | 2 +- .../msi/SumoLogic.wixext/SumoLogic.wixext.sln | 50 --- .../SumoLogic.wixext/Config.cs | 62 --- .../SumoLogic.wixext/ConfigUpdater.cs | 168 ------- .../SumoLogic.wixext/CustomAction.config | 18 - .../SumoLogic.wixext/CustomAction.cs | 138 ------ .../SumoLogic.wixext/Exceptions.cs | 42 -- .../SumoLogic.wixext/Logger.cs | 30 -- .../SumoLogic.wixext/SumoLogic.wixext.csproj | 19 - .../SumoLogicTests/ConfigTests.cs | 90 ---- .../SumoLogicTests/ConfigUpdaterTests.cs | 410 ------------------ .../SumoLogicTests/Properties/AssemblyInfo.cs | 20 - .../SumoLogicTests/SumoLogicTests.csproj | 105 ----- .../SumoLogicTests/TestData/empty.yaml | 0 .../SumoLogicTests/TestData/invalid.yaml | 1 - .../TestData/no-indentation.yaml | 11 - .../TestData/with-extensions-block.yaml | 104 ----- .../TestData/without-extensions-block.yaml | 85 ---- .../SumoLogicTests/packages.config | 6 - packaging/msi/wix/assets/LICENSE.rtf | 236 ---------- .../msi/wix/assets/banner_background.bmp | Bin 114432 -> 0 bytes packaging/msi/wix/assets/common.yaml | 3 - .../msi/wix/assets/dialog_background.bmp | Bin 615320 -> 0 bytes packaging/msi/wix/assets/project.ico | Bin 270398 -> 0 bytes packaging/msi/wix/components.wxs | 104 ----- packaging/msi/wix/folders.wxs | 28 -- packaging/msi/wix/otelcol-sumo.wixproj | 68 --- packaging/msi/wix/package.en-us.wxl | 29 -- packaging/msi/wix/package.wxs | 151 ------- packaging/msi/wix/ui/appdata-dir-dlg.wxs | 28 -- packaging/msi/wix/ui/otelcol-sumo.wxs | 60 --- packaging/msi/wix/variables.wxi | 14 - 40 files changed, 243 insertions(+), 2412 deletions(-) create mode 100644 .changelog/1693.changed.txt delete mode 100644 .github/workflows/release-packaging.yml rename .github/workflows/{release_builds.yml => releases.yml} (70%) create mode 100755 ci/get_version_from_binary.sh delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogic.wixext.sln delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogic.wixext/Config.cs delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogic.wixext/ConfigUpdater.cs delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogic.wixext/CustomAction.config delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogic.wixext/CustomAction.cs delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogic.wixext/Exceptions.cs delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogic.wixext/Logger.cs delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogic.wixext/SumoLogic.wixext.csproj delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogicTests/ConfigTests.cs delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogicTests/ConfigUpdaterTests.cs delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogicTests/Properties/AssemblyInfo.cs delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogicTests/SumoLogicTests.csproj delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/empty.yaml delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/invalid.yaml delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/no-indentation.yaml delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/with-extensions-block.yaml delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/without-extensions-block.yaml delete mode 100644 packaging/msi/SumoLogic.wixext/SumoLogicTests/packages.config delete mode 100644 packaging/msi/wix/assets/LICENSE.rtf delete mode 100644 packaging/msi/wix/assets/banner_background.bmp delete mode 100644 packaging/msi/wix/assets/common.yaml delete mode 100644 packaging/msi/wix/assets/dialog_background.bmp delete mode 100644 packaging/msi/wix/assets/project.ico delete mode 100644 packaging/msi/wix/components.wxs delete mode 100644 packaging/msi/wix/folders.wxs delete mode 100644 packaging/msi/wix/otelcol-sumo.wixproj delete mode 100644 packaging/msi/wix/package.en-us.wxl delete mode 100644 packaging/msi/wix/package.wxs delete mode 100644 packaging/msi/wix/ui/appdata-dir-dlg.wxs delete mode 100644 packaging/msi/wix/ui/otelcol-sumo.wxs delete mode 100644 packaging/msi/wix/variables.wxi diff --git a/.changelog/1693.changed.txt b/.changelog/1693.changed.txt new file mode 100644 index 0000000000..9ebbb534a1 --- /dev/null +++ b/.changelog/1693.changed.txt @@ -0,0 +1 @@ +chore(ci): remove MSIs from this repo \ No newline at end of file diff --git a/.github/workflows/dev_builds.yml b/.github/workflows/dev_builds.yml index 78a1b71af9..2f8c7cdb78 100644 --- a/.github/workflows/dev_builds.yml +++ b/.github/workflows/dev_builds.yml @@ -451,57 +451,6 @@ jobs: REPO_URL=sumologic/sumologic-otel-collector-dev \ BUILD_TYPE_SUFFIX="-ubi" - package-msi: - name: Package MSI - runs-on: windows-2019 - needs: - - build - strategy: - matrix: - include: - - arch_os: windows_amd64 - platform: x64 - fips: false - - arch_os: windows_amd64 - platform: x64 - fips: true - steps: - - uses: actions/checkout@v4 - - - name: Fetch current branch - run: ./ci/fetch_current_branch.sh - - - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v2 - - - name: Fetch binary artifact for ${{ matrix.arch_os }} - uses: actions/download-artifact@v4 - with: - name: otelcol-sumo${{ matrix.fips && '-fips' || '' }}-${{ matrix.arch_os }}.exe - path: ./otelcolbuilder/cmd - - - name: Rename fips binary artifact for ${{ matrix.arch_os }} - if: matrix.fips - working-directory: ./otelcolbuilder/cmd - run: mv otelcol-sumo-fips-${{ matrix.arch_os }}.exe otelcol-sumo-${{ matrix.arch_os }}.exe - - - name: Set OVERRIDE_BUILD_NUMBER - run: echo "OVERRIDE_BUILD_VERSION=$GITHUB_RUN_NUMBER" >> $GITHUB_ENV - - - name: Set PRODUCT_VERSION - run: echo "PRODUCT_VERSION=$(./ci/get_version.sh productversion)" >> $GITHUB_ENV - - - name: Build MSI for ${{ matrix.arch_os }} - working-directory: ./packaging/msi/wix - run: msbuild.exe -p:Configuration=Release -p:Platform=${{ matrix.platform }} -p:ProductVersion=$PRODUCT_VERSION -p:FIPSEnabled=${{ matrix.fips }} -Restore - - - name: Store MSI as action artifact for ${{ matrix.arch_os }} - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.arch_os }}${{ matrix.fips && '_fips' || '' }}_msi - path: ./packaging/msi/wix/bin/${{ matrix.platform }}/en-US/*.msi - if-no-files-found: error - install-script: name: Store install script runs-on: ubuntu-latest @@ -530,10 +479,8 @@ jobs: - build - build-otelcol-config - lint - - package-msi - push-docker-manifest uses: ./.github/workflows/workflow-trigger-packaging.yml secrets: inherit with: workflow_id: ${{ github.run_id }} - create_release: false diff --git a/.github/workflows/pull_requests.yml b/.github/workflows/pull_requests.yml index 267e24bd4b..54be4830ab 100644 --- a/.github/workflows/pull_requests.yml +++ b/.github/workflows/pull_requests.yml @@ -175,30 +175,6 @@ jobs: save-cache: true boringcrypto: ${{ matrix.boringcrypto == true }} - test-wixext: - name: Test (SumoLogic.wixext) - runs-on: windows-2019 - steps: - - uses: actions/checkout@v4 - - - name: Fetch current branch - run: ./ci/fetch_current_branch.sh - - - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v2 - - - name: Restore NuGet packages - working-directory: ./packaging/msi/SumoLogic.wixext/SumoLogicTests - run: nuget.exe restore -PackagesDirectory ../packages - - - name: Build unit tests - working-directory: ./packaging/msi/SumoLogic.wixext/SumoLogicTests - run: msbuild.exe -p:Configuration=Release -p:Platform=AnyCPU -Restore - - - name: Run unit tests - working-directory: ./packaging/msi/SumoLogic.wixext/SumoLogicTests/bin/Release - run: dotnet test -v:n ./SumoLogicTests.dll - lint: name: Lint (golangci-lint) runs-on: ubuntu-20.04 @@ -404,4 +380,4 @@ jobs: - name: Test built image run: make test-built-image - # ToDo: build windows FIPS image + # TODO: build windows FIPS image diff --git a/.github/workflows/release-packaging.yml b/.github/workflows/release-packaging.yml deleted file mode 100644 index 5377726504..0000000000 --- a/.github/workflows/release-packaging.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: Trigger packaging for release - -on: - release: - types: [published] - -jobs: - trigger-packaging: - name: Trigger Packaging for release ${{ github.event.release.name }} - uses: ./.github/workflows/workflow-trigger-packaging.yml - secrets: inherit - with: - create_release: true diff --git a/.github/workflows/release_builds.yml b/.github/workflows/releases.yml similarity index 70% rename from .github/workflows/release_builds.yml rename to .github/workflows/releases.yml index 006162b0bd..515a979c58 100644 --- a/.github/workflows/release_builds.yml +++ b/.github/workflows/releases.yml @@ -1,88 +1,85 @@ -name: Releases +name: 'Publish release' + +run-name: > + ${{ format('Publish Release for Workflow: {0}', inputs.workflow_id) }} on: - push: - tags: - - "v[0-9]+.[0-9]+.[0-9]+" - - "v[0-9]+.[0-9]+.[0-9]+-alpha.[0-9]+" - - "v[0-9]+.[0-9]+.[0-9]+-beta.[0-9]+" - - "v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+" - - - "v[0-9]+.[0-9]+.[0-9]+-sumo-[0-9]+" - - "v[0-9]+.[0-9]+.[0-9]+-sumo-[0-9]+-alpha.[0-9]+" - - "v[0-9]+.[0-9]+.[0-9]+-sumo-[0-9]+-beta.[0-9]+" - - "v[0-9]+.[0-9]+.[0-9]+-sumo-[0-9]+-rc.[0-9]+" + workflow_dispatch: + inputs: + workflow_id: + description: | + Workflow Run ID from this repository to fetch artifacts from for this + release. + required: true + type: string defaults: run: shell: bash -env: - GO_VERSION: "1.22.6" - jobs: get-version: name: Get application version for this revision runs-on: ubuntu-latest outputs: + sha: ${{ steps.get-sha.outputs.git-sha }} + otc-version: ${{ steps.get-version.outputs.otc-version }} + sumo-version: ${{ steps.get-version.outputs.sumo-version }} version: ${{ steps.get-version.outputs.version }} steps: - uses: actions/checkout@v4 + + - name: Outuput Workflow ID + run: echo ::notice title=Workflow ID::${{ inputs.workflow_id }} + + - name: Output Workflow URL + run: | + repo_url="https://github.com/SumoLogic/sumologic-otel-collector" + url="${repo_url}/actions/runs/${{ inputs.workflow_id }}" + echo ::notice title=Workflow URL::${url} + + - name: Download otelcol-sumo artifact from workflow + uses: actions/download-artifact@v4 with: - fetch-depth: 0 - - name: Get version + name: otelcol-sumo-linux_amd64 + path: artifacts/ + merge-multiple: true + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ inputs.workflow_id }} + + - name: Determine version from artifact id: get-version run: | - echo "version=$(echo ${GITHUB_REF#refs/tags/v})" > $GITHUB_OUTPUT - - name: Print version - run: echo ::notice title=Version::${{ steps.get-version.outputs.version }} - - build: - name: Build - uses: ./.github/workflows/workflow-build.yml - needs: [get-version] - strategy: - matrix: - include: - - arch_os: linux_amd64 - runs-on: ubuntu-20.04 - - arch_os: linux_amd64 - runs-on: ubuntu-20.04 - fips: true - - arch_os: linux_arm64 - runs-on: ubuntu-20.04 - - arch_os: linux_arm64 - runs-on: ubuntu-20.04 - fips: true - - arch_os: darwin_amd64 - runs-on: macos-15 - - arch_os: darwin_arm64 - runs-on: macos-15 - - arch_os: windows_amd64 - runs-on: windows-2022 - - arch_os: windows_amd64 - runs-on: windows-2022 - fips: true - with: - arch_os: ${{ matrix.arch_os }} - runs-on: ${{ matrix.runs-on }} - fips: ${{ matrix.fips == true }} - sumo_component_gomod_version: "v${{ needs.get-version.outputs.version }}" - secrets: - apple_developer_certificate_p12_base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }} - apple_developer_certificate_password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }} - app_store_connect_password: ${{ secrets.AC_PASSWORD }} - microsoft_certificate: ${{ secrets.MICROSOFT_CERTIFICATE }} - microsoft_certificate_password: ${{ secrets.MICROSOFT_CERTIFICATE_PASSWORD }} - microsoft_certificate_hash: ${{ secrets.MICROSOFT_CERTHASH }} - microsoft_certificate_name: ${{ secrets.MICROSOFT_CERTNAME }} - microsoft_description: ${{ secrets.MICROSOFT_DESCRIPTION }} + artifact="artifacts/otelcol-sumo-linux_amd64" + chmod +x "${artifact}" + script="ci/get_version_from_binary.sh" + core="$("$script" core "${artifact}")" + sumo="$("$script" sumo "${artifact}")" + echo "otc-version=$core" >> $GITHUB_OUTPUT + echo "sumo-version=$sumo" >> $GITHUB_OUTPUT + echo "version=${core}-sumo-${sumo}" >> $GITHUB_OUTPUT + + - name: Output Version + run: | + echo ::notice title=Version::${{ steps.get-version.outputs.version }} + + - name: Determine Git SHA of workflow + id: get-sha + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + workflow="${{ inputs.workflow_id }}" + sha="$(gh run view ${workflow} --json headSha -t '{{.headSha}}')" + echo "git-sha=$sha" >> $GITHUB_OUTPUT + + - name: Output Git SHA + run: | + echo ::notice title=Git SHA::${{ steps.get-sha.outputs.git-sha }} build-container-images: name: Build container runs-on: ubuntu-20.04 needs: - - build - get-version strategy: matrix: @@ -112,17 +109,13 @@ jobs: --username ${{ secrets.DOCKERHUB_LOGIN }} \ --password ${{ secrets.DOCKERHUB_PASSWORD }} - - name: Download binary action artifact from build phase + - name: Download platform otelcol-sumo artifacts from workflow uses: actions/download-artifact@v4 with: - name: otelcol-sumo-${{matrix.arch_os}} - path: artifacts/ - - - name: Download binary action artifact from build phase (FIPS) - uses: actions/download-artifact@v4 - with: - name: otelcol-sumo-fips-${{matrix.arch_os}} + pattern: otelcol-sumo-*-${{ matrix.arch_os }} path: artifacts/ + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ inputs.workflow_id }} - name: Build and push FIPS image to Open Source ECR run: | @@ -196,7 +189,6 @@ jobs: needs: # Require darwin build to succeed to prevent pushing container images # when darwin build fails. - - build - build-container-images - get-version steps: @@ -282,64 +274,6 @@ jobs: REPO_URL=sumologic/sumologic-otel-collector \ BUILD_TYPE_SUFFIX="-ubi" - package-msi: - name: Package MSI - runs-on: windows-2019 - needs: - - build - strategy: - matrix: - include: - - arch_os: windows_amd64 - platform: x64 - fips: false - - arch_os: windows_amd64 - platform: x64 - fips: true - steps: - - uses: actions/checkout@v4 - - - name: Fetch current branch - run: ./ci/fetch_current_branch.sh - - - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v2 - - - name: Fetch binary artifact for ${{ matrix.arch_os }} ${{ matrix.fips && '(FIPS)' || '' }} - uses: actions/download-artifact@v4 - with: - name: otelcol-sumo${{ matrix.fips && '-fips' || '' }}-windows_amd64.exe - path: ./otelcolbuilder/cmd - - - name: Rename FIPS binary artifact for ${{ matrix.arch_os }} - if: matrix.fips - working-directory: ./otelcolbuilder/cmd - run: mv otelcol-sumo${{ matrix.fips && '-fips' || '' }}-windows_amd64.exe otelcol-sumo-${{ matrix.arch_os }}.exe - - - name: Set PRODUCT_VERSION - run: echo "PRODUCT_VERSION=$(./ci/get_version.sh productversion)" >> $GITHUB_ENV - - - name: Build MSI for ${{ matrix.arch_os }} - working-directory: ./packaging/msi/wix - run: msbuild.exe -p:Configuration=Release -p:Platform=${{ matrix.platform }} -p:ProductVersion=$PRODUCT_VERSION -p:FIPSEnabled=${{ matrix.fips }} -Restore - - - name: Sign MSI - uses: skymatic/code-sign-action@v3 - with: - certificate: "${{ secrets.MICROSOFT_CERTIFICATE }}" - password: "${{ secrets.MICROSOFT_CERTIFICATE_PASSWORD }}" - certificatesha1: "${{ secrets.MICROSOFT_CERTHASH }}" - certificatename: "${{ secrets.MICROSOFT_CERTNAME }}" - description: "${{ secrets.MICROSOFT_DESCRIPTION }}" - folder: ./packaging/msi/wix/bin/${{ matrix.platform }}/en-US - - - name: Store MSI as action artifact for ${{ matrix.arch_os }} - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.arch_os }}${{ matrix.fips && '_fips' || '' }}_msi - path: ./packaging/msi/wix/bin/${{ matrix.platform }}/en-US/*.msi - if-no-files-found: error - # Store the install script from the packaging repository as a release artifact. # Originally, this script was stored in this repository, and the official download url pointed # to the most recent release here. The script has since been moved to the packaging repository. @@ -411,32 +345,42 @@ jobs: name: Create Github release runs-on: ubuntu-20.04 needs: - - build + - get-version - build-container-images - push-docker-manifest - - package-msi - - get-version steps: - - name: Download all binaries stored as artifact + - name: Download all artifacts from workflow uses: actions/download-artifact@v4 with: path: artifacts/ merge-multiple: true + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ inputs.workflow_id }} + - name: Add version to binary names working-directory: artifacts/ run: | + version="${{ needs.get-version.outputs.version }}" find . -type f -name 'otelcol-sumo*' \ - | grep -v '\.msi' \ | sed 's/^\.\///' \ | while read -r file; do - new_name=$(echo "$file" | sed 's/otelcol-sumo/otelcol-sumo-${{ needs.get-version.outputs.version }}/g') + new_name=$(echo "$file" | sed "s/otelcol-sumo/otelcol-sumo-${version}/g") + mv "$file" "$new_name" + done + find . -type f -name 'otelcol-config*' \ + | sed 's/^\.\///' \ + | while read -r file; do + new_name=$(echo "$file" | sed "s/otelcol-config/otelcol-config-${version}/g") mv "$file" "$new_name" done + - uses: ncipollo/release-action@v1 with: token: ${{ secrets.GITHUB_TOKEN }} draft: true prerelease: false + commit: ${{ needs.get-sha.outputs.git-sha }} + tag: v${{ needs.get-version.outputs.version }} allowUpdates: true omitBodyDuringUpdate: true diff --git a/.github/workflows/workflow-trigger-packaging.yml b/.github/workflows/workflow-trigger-packaging.yml index e2e2fd2665..4a50172918 100644 --- a/.github/workflows/workflow-trigger-packaging.yml +++ b/.github/workflows/workflow-trigger-packaging.yml @@ -3,14 +3,10 @@ name: Trigger Packaging on: workflow_call: inputs: - create_release: - description: The packaging workflow will create a draft release in the packaging repository. - required: true - type: boolean workflow_id: - description: ID of the workflow to fetch artifacts from. If empty, artifacts will be fetched from the latest release. + description: ID of the Collector workflow that Packaging will fetch artifacts from. type: string - required: false + required: true defaults: run: @@ -30,20 +26,6 @@ jobs: fetch-depth: 0 filter: 'tree:0' - - name: Determine version core - id: version-core - run: > - ./ci/get_version.sh core > /tmp/version_core && - cat /tmp/version_core && - echo version=$(cat /tmp/version_core) >> $GITHUB_OUTPUT - - - name: Determine sumo version - id: sumo-version - run: > - ./ci/get_version.sh sumo > /tmp/sumo_version && - cat /tmp/sumo_version && - echo version=$(cat /tmp/sumo_version) >> $GITHUB_OUTPUT - # TODO: output the workflow url - name: Trigger packaging workflow id: trigger-packaging-workflow @@ -52,12 +34,9 @@ jobs: REPO: SumoLogic/sumologic-otel-collector-packaging WORKFLOW: build_packages.yml run: | - gh workflow run --repo ${REPO} ${WORKFLOW} --json << EOF + gh workflow run --repo ${REPO} ${WORKFLOW} --ref use-binary-version --json << EOF { - "workflow_id": "${{ inputs.workflow_id }}", - "otc_version": "${{ steps.version-core.outputs.version }}", - "otc_sumo_version": "${{ steps.sumo-version.outputs.version }}", - "release": "${{ inputs.create_release }}" + "workflow_id": "${{ inputs.workflow_id }}" } EOF @@ -65,9 +44,5 @@ jobs: # packaging workflow has completed. - name: Packaging Workflow URL run: echo ::notice title=Packaging Workflow URL::https://github.com/SumoLogic/sumologic-otel-collector-packaging/actions/workflows/build_packages.yml - - name: Workflow ID - run: echo ::notice title=Workflow ID::${{ inputs.workflow_id }} - - name: OTC Version - run: echo ::notice title=OTC Version::${{ steps.version-core.outputs.version }} - - name: OTC Sumo Version - run: echo ::notice title=OTC Sumo Version::${{ steps.sumo-version.outputs.version }} + - name: Collector Workflow ID + run: echo ::notice title=Collector Workflow ID::${{ inputs.workflow_id }} diff --git a/ci/get_version.sh b/ci/get_version.sh index 318e56a18a..3ae74f1833 100755 --- a/ci/get_version.sh +++ b/ci/get_version.sh @@ -3,27 +3,24 @@ declare -i major_version declare -i minor_version declare -i patch_version -declare build_version -declare build_windows_version -declare ot_channel -declare -i ot_channel_version -declare sumo_channel -declare -i sumo_channel_version +declare -i sumo_version usage() { cat <&2 + exit 1 fi - version_regex="^v([0-9]+).([0-9]+).([0-9]+)((-(alpha|beta|rc|sumo)[-.]([0-9]+))(-(alpha|beta|rc).([0-9])+)?)?$" + version_regex="^([0-9]+).([0-9]+).([0-9]+)$" - if [[ $version_tag =~ $version_regex ]]; then + if [[ $version =~ $version_regex ]]; then major_version="${BASH_REMATCH[1]}" minor_version="${BASH_REMATCH[2]}" patch_version="${BASH_REMATCH[3]}" - ot_channel="${BASH_REMATCH[6]}" - ot_channel_version="${BASH_REMATCH[7]}" - sumo_channel="${BASH_REMATCH[9]}" - sumo_channel_version="${BASH_REMATCH[10]}" else - echo "Error: Tag does not match required version regex: ${version_tag}" >&2 + echo "Error: otc version does not match required version regex: ${version}" >&2 exit 1 fi +} - if [[ $ot_channel == "sumo" ]]; then - if [[ $sumo_channel != "" ]]; then - build_version="${ot_channel_version}-${sumo_channel}.${sumo_channel_version}" - build_windows_version="${ot_channel_version}" - else - build_version="${ot_channel_version}" - build_windows_version="${ot_channel_version}" - fi - elif [[ $ot_channel != "" ]]; then - build_version="${ot_channel_version}" - build_windows_version="${ot_channel_version}" - fi +parse_sumo_version() { + tags=() + for tag in $(git tag -l "v$(version_core)-sumo-*"); do + tags+=( "${tag}" ) + done - if [[ $OVERRIDE_BUILD_VERSION != "" ]]; then - number_regex='^[0-9]+$' - if ! [[ $OVERRIDE_BUILD_VERSION =~ $number_regex ]]; then - echo "Error: OVERRIDE_BUILD_VERSION is not a number" >&2 - exit 1 + for tag in "${tags[@]}"; do + tag_regex="^v[0-9]+.[0-9]+.[0-9]+-sumo-([0-9])+$" + if [[ $tag =~ $tag_regex ]]; then + sumo_version="${BASH_REMATCH[1]}" fi - build_version="${OVERRIDE_BUILD_VERSION}" - build_windows_version="${OVERRIDE_BUILD_VERSION}" + done + + if [[ -z "${sumo_version}" ]]; then + # No matching tags were found. Sumo version is 0. + sumo_version="0" + else + # Matching tags found. Increment sumo_version by 1. + (( sumo_version++ )) fi } # Validate version information using the Windows ProductVersion requirements. validate() { if [[ -z "${major_version}" ]]; then - echo "Major version cannot be empty" + echo "Major version cannot be empty" >&2 exit 1 fi if [[ $major_version -lt 0 ]]; then - echo "Major version cannot be less than 0" + echo "Major version cannot be less than 0" >&2 exit 1 fi if [[ $major_version -gt 255 ]]; then - echo "Major version cannot be greater than 255" + echo "Major version cannot be greater than 255" >&2 exit 1 fi if [[ -z "${minor_version}" ]]; then - echo "Minor version cannot be empty" + echo "Minor version cannot be empty" >&2 exit 1 fi if [[ $minor_version -lt 0 ]]; then - echo "Minor version cannot be less than 0" + echo "Minor version cannot be less than 0" >&2 exit 1 fi if [[ $minor_version -gt 255 ]]; then - echo "Minor version cannot be greater than 255" + echo "Minor version cannot be greater than 255" >&2 exit 1 fi - # Patch version is also known as the build version on Windows + # Patch version (known as the build version on Windows) if [[ -z "${patch_version}" ]]; then - echo "Patch version cannot be empty" + echo "Patch version cannot be empty" >&2 exit 1 fi if [[ $patch_version -lt 0 ]]; then - echo "Patch version cannot be less than 0" + echo "Patch version cannot be less than 0" >&2 exit 1 fi if [[ $patch_version -gt 65535 ]]; then - echo "Patch version cannot be greater than 65,535" - exit 1 - fi - - # Build version is also known as the internal version on Windows - if [[ -z "${build_version}" ]]; then - echo "Build version cannot be empty" - exit 1 - fi - - # Build version is also known as the internal version on Windows - if [[ -z "${build_windows_version}" ]]; then - echo "Windows Build version cannot be empty" + echo "Patch version cannot be greater than 65,535" >&2 exit 1 fi - if [[ $ot_channel_version -lt 0 ]]; then - echo "Build version cannot be less than 0" - exit 1 - fi - - if [[ $ot_channel_version -gt 65535 ]]; then - echo "Build version cannot be greater than 65,535" + # Sumo version (known as the internal version on Windows) + if [[ -z "${sumo_version}" ]]; then + echo "Sumo version cannot be empty" >&2 exit 1 fi } @@ -177,24 +156,31 @@ version_core() { # Prints the sumo version. (e.g. the X in A.B.C-sumo-X) sumo_version() { - echo "${build_version}" + echo "${sumo_version}" +} + +# Prints the full version. (e.g. A.B.C-sumo-X) +full_version() { + echo "$(version_core)-sumo-$(sumo_version)" } # Convert the version to a Windows ProductVersion. # # https://learn.microsoft.com/en-us/windows/win32/msi/productversion -# MAJOR.MINOR.PATCH.BUILD -> MAJOR.MINOR.BUILD.INTERNAL +# MAJOR.MINOR.PATCH.SUMO -> MAJOR.MINOR.BUILD.INTERNAL windows_product_version() { - echo "${major_version}.${minor_version}.${patch_version}.${build_windows_version}" + echo "${major_version}.${minor_version}.${patch_version}.${sumo_version}" } parse_params "$@" -parse_version_tag +parse_core_version +parse_sumo_version validate case "$1" in core) version_core ;; sumo) sumo_version ;; + full) full_version ;; productversion) windows_product_version ;; *) bad_usage "Unknown argument: ${1}" ;; esac diff --git a/ci/get_version_from_binary.sh b/ci/get_version_from_binary.sh new file mode 100755 index 0000000000..6a3c96f17a --- /dev/null +++ b/ci/get_version_from_binary.sh @@ -0,0 +1,95 @@ +#!/bin/bash + +declare -i major_version +declare -i minor_version +declare -i patch_version +declare -i sumo_version + +usage() { + cat <&2 + exit 1 + fi +} + +# Prints the semver version core. (e.g. A.B.C) +version_core() { + echo "${major_version}.${minor_version}.${patch_version}" +} + +# Prints the sumo version. (e.g. the X in A.B.C-sumo-X) +version_sumo() { + echo "${sumo_version}" +} + +# Convert the version to a Windows ProductVersion. +# +# https://learn.microsoft.com/en-us/windows/win32/msi/productversion +# MAJOR.MINOR.PATCH.SUMO -> MAJOR.MINOR.BUILD.INTERNAL +windows_product_version() { + echo "${major_version}.${minor_version}.${patch_version}.${sumo_version}" +} + +parse_params "$@" +parse_version "$2" + +case "$1" in + core) version_core ;; + sumo) version_sumo ;; + productversion) windows_product_version ;; + *) bad_usage "Unknown argument: ${1}" ;; +esac diff --git a/otelcolbuilder/Makefile b/otelcolbuilder/Makefile index 5b36318408..d7237687ed 100644 --- a/otelcolbuilder/Makefile +++ b/otelcolbuilder/Makefile @@ -86,7 +86,7 @@ install-builder: .PHONY: _builder _builder: - $(eval VERSION ?= $(shell git describe --tags --abbrev=5 --match "v[0-9]*")) + $(eval VERSION ?= $(shell ./ci/get_version.sh full | xargs)-$(shell git rev-parse HEAD | xargs)) # Need to specify go path because otherwise opentelemetry-collector-builder # uses /usr/bin/go which on Github Actions is using preinstalled 1.15.12 by default. CGO_ENABLED=$(CGO_ENABLED) $(BUILDER_BIN_NAME) \ diff --git a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext.sln b/packaging/msi/SumoLogic.wixext/SumoLogic.wixext.sln deleted file mode 100644 index 9d259d8089..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext.sln +++ /dev/null @@ -1,50 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.33027.164 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SumoLogic.wixext", "SumoLogic.wixext\SumoLogic.wixext.csproj", "{C2671341-19D5-4CD6-84A3-F7207DE74E30}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SumoLogicTests", "SumoLogicTests\SumoLogicTests.csproj", "{C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C2671341-19D5-4CD6-84A3-F7207DE74E30}.Debug|Any CPU.ActiveCfg = Debug|x86 - {C2671341-19D5-4CD6-84A3-F7207DE74E30}.Debug|x64.ActiveCfg = Debug|x64 - {C2671341-19D5-4CD6-84A3-F7207DE74E30}.Debug|x64.Build.0 = Debug|x64 - {C2671341-19D5-4CD6-84A3-F7207DE74E30}.Debug|x86.ActiveCfg = Debug|x86 - {C2671341-19D5-4CD6-84A3-F7207DE74E30}.Debug|x86.Build.0 = Debug|x86 - {C2671341-19D5-4CD6-84A3-F7207DE74E30}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C2671341-19D5-4CD6-84A3-F7207DE74E30}.Release|Any CPU.Build.0 = Release|Any CPU - {C2671341-19D5-4CD6-84A3-F7207DE74E30}.Release|x64.ActiveCfg = Release|x64 - {C2671341-19D5-4CD6-84A3-F7207DE74E30}.Release|x64.Build.0 = Release|x64 - {C2671341-19D5-4CD6-84A3-F7207DE74E30}.Release|x86.ActiveCfg = Release|x64 - {C2671341-19D5-4CD6-84A3-F7207DE74E30}.Release|x86.Build.0 = Release|x64 - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}.Debug|x64.ActiveCfg = Debug|Any CPU - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}.Debug|x64.Build.0 = Debug|Any CPU - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}.Debug|x86.ActiveCfg = Debug|Any CPU - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}.Debug|x86.Build.0 = Debug|Any CPU - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}.Release|Any CPU.Build.0 = Release|Any CPU - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}.Release|x64.ActiveCfg = Release|Any CPU - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}.Release|x64.Build.0 = Release|Any CPU - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}.Release|x86.ActiveCfg = Release|Any CPU - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {AF3C92B2-597B-4A89-A66F-9B4FBD962809} - EndGlobalSection -EndGlobal diff --git a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/Config.cs b/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/Config.cs deleted file mode 100644 index d9ec4e9b5d..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/Config.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace SumoLogic.wixext -{ - public class Config - { - public string InstallationToken { get; set; } - public Dictionary CollectorFields { get; set; } - public bool RemotelyManaged { get; set; } - public bool Ephemeral { get; set; } - public string OpAmpFolder { get; set; } - public string Api { get; set; } - - public Config() { - this.CollectorFields = new Dictionary(); - } - - public void SetCollectorFieldsFromTags(string tags) - { - if (tags.Length == 0) { return; } - - var tagsRx = new Regex(@"([^=,]+)=([^\0]+?)(?=,[^,]+=|$)", RegexOptions.Compiled); - var matches = tagsRx.Matches(tags); - - if (matches.Count == 0) - { - throw new TagsSyntaxException("tags were provided with invalid syntax"); - } - if (matches.Count > 10) - { - throw new TagsLimitExceededException("the limit of 10 tags was exceeded"); - } - - foreach (Match match in matches) - { - if (match.Groups.Count != 3) - { - Console.WriteLine("Groups: {0}", match.Groups.Count); - var msg = string.Format("invalid syntax for tag: {0}", match.Value); - throw new TagSyntaxException(msg); - } - var key = match.Groups[1].Value.Trim(); - var value = match.Groups[2].Value.Trim(); - - if (key.Length > 255) - { - var msg = string.Format("tag key exceeds maximum length of 255: {0}", key); - throw new TagKeyLengthExceededException(msg); - } - if (value.Length > 200) - { - var msg = string.Format("tag value exceeds maximum length of 200: {0}", value); - throw new TagValueLengthExceededException(msg); - } - - this.CollectorFields.Add(key, value); - } - } - } -} diff --git a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/ConfigUpdater.cs b/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/ConfigUpdater.cs deleted file mode 100644 index 3f32026f86..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/ConfigUpdater.cs +++ /dev/null @@ -1,168 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using YamlDotNet.RepresentationModel; -using YamlDotNet.Serialization; - -namespace SumoLogic.wixext -{ - public class ConfigUpdater - { - public YamlDocument Document { get; set; } - - public ConfigUpdater(StreamReader streamReader) { - try - { - var ys = new YamlStream(); - ys.Load(streamReader); - if (ys.Documents.Count == 0) - { - throw new EmptyConfigException("config file is empty"); - } - this.Document = ys.Documents[0]; - } - finally - { - streamReader.Dispose(); - } - } - - public void Update(Config config) - { - if (config.RemotelyManaged && string.IsNullOrEmpty(config.OpAmpFolder)) - { - throw new MissingConfigurationException("OpAmpFolder"); - } - - YamlMappingNode root = (YamlMappingNode)this.Document.RootNode; - - EnsureMapKey(root, "extensions"); - YamlMappingNode extensions = (YamlMappingNode)root.Children["extensions"]; - - EnsureMapKey(extensions, "sumologic"); - YamlMappingNode sumologic = (YamlMappingNode)extensions.Children["sumologic"]; - - if (config.InstallationToken != "") - { - EnsureScalarKey(sumologic, "installation_token"); - sumologic.Children["installation_token"] = config.InstallationToken; - } - - if (config.CollectorFields.Count > 0) - { - EnsureMapKey(sumologic, "collector_fields"); - YamlMappingNode collectorFields = (YamlMappingNode)sumologic.Children["collector_fields"]; - - foreach (KeyValuePair field in config.CollectorFields) - { - EnsureScalarKey(collectorFields, field.Key); - collectorFields.Children[field.Key] = field.Value; - } - } - - if (config.RemotelyManaged) - { - EnsureMapKey(extensions, "opamp"); - YamlMappingNode opamp = (YamlMappingNode)extensions.Children["opamp"]; - EnsureScalarKey(opamp, "remote_configuration_directory"); - opamp.Children["remote_configuration_directory"] = config.OpAmpFolder; - - // Add OpAmp extension to service section - EnsureMapKey(root, "service"); - YamlMappingNode service = (YamlMappingNode)root.Children["service"]; - EnsureSequenceKey(service, "extensions"); - YamlSequenceNode serviceExtensions = (YamlSequenceNode)service.Children["extensions"]; - if (!serviceExtensions.Children.Contains("opamp")) - { - serviceExtensions.Children.Add("opamp"); - } - } - - if (config.Ephemeral) - { - EnsureScalarKey(sumologic, "ephemeral"); - sumologic.Children["ephemeral"] = "true"; - } - - if (!string.IsNullOrEmpty(config.Api)) - { - EnsureScalarKey(sumologic, "api_base_url"); - sumologic.Children["api_base_url"] = config.Api; - } - - // Make sure the sumologic processor node is a map node, otherwise an empty string - // is generated as the value instead of an empty node. - if (root.Children.ContainsKey("processors")) - { - EnsureMapKey(root, "processors"); - YamlMappingNode processors = (YamlMappingNode)root.Children["processors"]; - if (processors.Children.ContainsKey("sumologic")) - { - EnsureMapKey(processors, "sumologic"); - } - } - } - - public void Save(StreamWriter streamWriter) - { - try - { - var serializer = new Serializer(); - serializer.Serialize(streamWriter, this.Document.RootNode); - } - finally - { - streamWriter.Flush(); - } - } - - private void EnsureMapKey(YamlMappingNode node, string key) - { - if (node.Children.ContainsKey(key)) - { - if (node.Children[key].NodeType == YamlNodeType.Mapping) { - return; - } - - // TODO: is this how we want to handle incorrect node types? - // YamlNode is wrong type, remove it - node.Children.Remove(key); - } - // Add empty YamlMappingNode to key - node.Children.Add(key, new YamlMappingNode()); - } - - private void EnsureScalarKey(YamlMappingNode node, string key) - { - if (node.Children.ContainsKey(key)) - { - if (node.Children[key].NodeType == YamlNodeType.Scalar) - { - return; - } - - // TODO: is this how we want to handle incorrect node types? - // YamlNode is wrong type, remove it - node.Children.Remove(key); - } - // Add empty YamlScalarNode to key - node.Children.Add(key, new YamlScalarNode()); - } - - private void EnsureSequenceKey(YamlMappingNode node, string key) - { - if (node.Children.ContainsKey(key)) - { - if (node.Children[key].NodeType == YamlNodeType.Sequence) - { - return; - } - - // TODO: is this how we want to handle incorrect node types? - // YamlNode is wrong type, remove it - node.Children.Remove(key); - } - // Add empty YamlScalarNode to key - node.Children.Add(key, new YamlSequenceNode()); - } - } -} diff --git a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/CustomAction.config b/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/CustomAction.config deleted file mode 100644 index 19bffa211e..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/CustomAction.config +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - diff --git a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/CustomAction.cs b/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/CustomAction.cs deleted file mode 100644 index af566b9e81..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/CustomAction.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System; -using System.IO; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using WixToolset.Dtf.WindowsInstaller; - -namespace SumoLogic.wixext -{ - public class CustomActions - { - // WiX error codes - private const short ecMissingCustomActionData = 9001; - private const short ecConfigError = 9002; - - // WiX property names - private const string pCommonConfigPath = "CommonConfigPath"; - private const string pSumoLogicConfigPath = "SumoLogicConfigPath"; - private const string pInstallationToken = "InstallationToken"; - private const string pInstallToken = "InstallToken"; - private const string pTags = "Tags"; - private const string pApi = "Api"; - private const string pRemotelyManaged = "RemotelyManaged"; - private const string pEphemeral = "Ephemeral"; - private const string pConfigFolder = "ConfigFolder"; - private const string pOpAmpFolder = "OpAmpFolder"; - private const string pConfigFragmentsFolder = "ConfigFragmentsFolder"; - - // WiX features - private const string fRemotelyManaged = "REMOTELYMANAGED"; - - [CustomAction] - public static ActionResult UpdateConfig(Session session) - { - Logger logger = new Logger("UpdateConfig", session); - logger.Log("Begin"); - - // Validate presence of required WiX properties - if (!session.CustomActionData.ContainsKey(pCommonConfigPath)) - { - ShowErrorMessage(session, ecMissingCustomActionData, pCommonConfigPath); - return ActionResult.Failure; - } - if (!session.CustomActionData.ContainsKey(pInstallToken) && !session.CustomActionData.ContainsKey(pInstallationToken)) - { - ShowErrorMessage(session, ecMissingCustomActionData, pInstallationToken); - return ActionResult.Failure; - } - if (!session.CustomActionData.ContainsKey(pTags)) - { - ShowErrorMessage(session, ecMissingCustomActionData, pTags); - return ActionResult.Failure; - } - - var commonConfigPath = session.CustomActionData[pCommonConfigPath]; - var sumoLogicConfigPath = session.CustomActionData[pSumoLogicConfigPath]; - var tags = session.CustomActionData[pTags]; - - var installationToken = ""; - if (session.CustomActionData.ContainsKey(pInstallationToken) && session.CustomActionData[pInstallationToken] != "") - { - installationToken = session.CustomActionData[pInstallationToken]; - } - else if (session.CustomActionData.ContainsKey(pInstallToken)) - { - installationToken = session.CustomActionData[pInstallToken]; - } - - var remotelyManaged = (session.CustomActionData.ContainsKey(pRemotelyManaged) && session.CustomActionData[pRemotelyManaged] == "true"); - var ephemeral = (session.CustomActionData.ContainsKey(pEphemeral) && session.CustomActionData[pEphemeral] == "true"); - var opAmpFolder = session.CustomActionData[pOpAmpFolder]; - var api = session.CustomActionData[pApi]; - - if (remotelyManaged && string.IsNullOrEmpty(opAmpFolder)) - { - ShowErrorMessage(session, ecMissingCustomActionData, pOpAmpFolder); - return ActionResult.Failure; - } - - // Load config from disk and replace values - Config config = new Config { InstallationToken = installationToken, RemotelyManaged = remotelyManaged, Ephemeral = ephemeral, - OpAmpFolder = opAmpFolder, Api = api }; - config.SetCollectorFieldsFromTags(tags); - - var configFile = remotelyManaged ? sumoLogicConfigPath : commonConfigPath; - try - { - ConfigUpdater configUpdater = new ConfigUpdater(new StreamReader(configFile)); - configUpdater.Update(config); - configUpdater.Save(new StreamWriter(configFile)); - } - catch (Exception e) - { - ShowErrorMessage(session, ecConfigError, e.Message); - return ActionResult.Failure; - } - - logger.Log("End"); - - return ActionResult.Success; - } - - [CustomAction] - public static ActionResult PopulateServiceArguments(Session session) - { - try - { - var configFolder = session.GetTargetPath(pConfigFolder); - var configFragmentsFolder = session.GetTargetPath(pConfigFragmentsFolder); - var remotelyManaged = session.Features.Contains(fRemotelyManaged) && session.Features[fRemotelyManaged].RequestState == InstallState.Local; - - if (remotelyManaged) - { - session["SERVICEARGUMENTS"] = " --remote-config \"opamp:" + configFolder + "sumologic.yaml\""; - } - else - { - session["SERVICEARGUMENTS"] = " --config \"" + configFolder + "sumologic.yaml\" --config \"glob:" + configFragmentsFolder + "*.yaml\""; - } - } - catch (Exception e) - { - ShowErrorMessage(session, ecConfigError, e.Message + e.StackTrace); - return ActionResult.Failure; - } - - return ActionResult.Success; - } - - private static void ShowErrorMessage(Session session, short errCode, string key) - { - Record record = new Record(3); - record.SetInteger(1, errCode); - record.SetString(2, key); - session.Message(InstallMessage.Error | (InstallMessage)MessageIcon.Error, record); - record.Close(); - } - } -} diff --git a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/Exceptions.cs b/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/Exceptions.cs deleted file mode 100644 index 3c8519ad44..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/Exceptions.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SumoLogic.wixext -{ - public class EmptyConfigException : Exception - { - public EmptyConfigException(string message) { } - } - - public class TagsSyntaxException : Exception - { - public TagsSyntaxException(string message) { } - } - - public class TagSyntaxException : Exception - { - public TagSyntaxException(string message) { } - } - - public class TagsLimitExceededException : Exception - { - public TagsLimitExceededException(string message) { } - } - - public class TagKeyLengthExceededException : Exception - { - public TagKeyLengthExceededException(string message) { } - } - - public class TagValueLengthExceededException : Exception - { - public TagValueLengthExceededException(string message) { } - } - - public class MissingConfigurationException : Exception - { - public MissingConfigurationException(string message) { } - } -} diff --git a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/Logger.cs b/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/Logger.cs deleted file mode 100644 index 5d507392fb..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/Logger.cs +++ /dev/null @@ -1,30 +0,0 @@ -using WixToolset.Dtf.WindowsInstaller; - -namespace SumoLogic.wixext -{ - class Logger - { - private string actionName; - private Session session; - - public Logger(string actionName, Session session) - { - this.actionName = actionName; - this.session = session; - } - - public void Log(string msg) - { - this.session.Log(this.Format(msg)); - } - public void Log(string format, params object[] args) - { - this.session.Log(this.Format(format), args); - } - - private string Format(string msg) - { - return string.Format("{0}: {1}", this.actionName, msg); - } - } -} diff --git a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/SumoLogic.wixext.csproj b/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/SumoLogic.wixext.csproj deleted file mode 100644 index f6ec09218f..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogic.wixext/SumoLogic.wixext.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - net35 - x64;x86;AnyCPU - - - - - - - - - - - - - - - diff --git a/packaging/msi/SumoLogic.wixext/SumoLogicTests/ConfigTests.cs b/packaging/msi/SumoLogic.wixext/SumoLogicTests/ConfigTests.cs deleted file mode 100644 index 4953c3e2f8..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogicTests/ConfigTests.cs +++ /dev/null @@ -1,90 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using SumoLogic.wixext; -using System; -using System.Linq; - -namespace SumoLogicTests -{ - [TestClass] - public class ConfigTests - { - private static readonly Random random = new Random(); - - public static string RandomString(int length) - { - const string chars = "abcdefghijklmnopqrstuvwxyz"; - return new string(Enumerable.Repeat(chars, length) - .Select(s => s[random.Next(s.Length)]).ToArray()); - } - - [TestMethod] - public void TestSetCollectorFieldsFromTags_Valid() - { - var tags = @"foo=bar,baz=kaz , xaz=yaz"; - - var config = new Config(); - config.SetCollectorFieldsFromTags(tags); - - Assert.AreEqual(config.CollectorFields.Keys.Count, 3); - - Assert.IsTrue(config.CollectorFields.ContainsKey("foo")); - Assert.IsTrue(config.CollectorFields.ContainsKey("baz")); - Assert.IsTrue(config.CollectorFields.ContainsKey("xaz")); - - Assert.AreEqual("bar", config.CollectorFields["foo"]); - Assert.AreEqual("kaz", config.CollectorFields["baz"]); - Assert.AreEqual("yaz", config.CollectorFields["xaz"]); - } - - [TestMethod] - public void TestSetCollectorFieldsFromTags_Empty() - { - var tags = @""; - - var config = new Config(); - config.SetCollectorFieldsFromTags(tags); - - Assert.AreEqual(config.CollectorFields.Keys.Count, 0); - } - - [TestMethod] - [ExpectedException(typeof(TagsSyntaxException), "Invalid tags syntax did not throw a TagsSyntaxException.")] - public void TestSetCollectorFieldsFromTags_NoMatches() - { - var tags = @"key"; - - var config = new Config(); - config.SetCollectorFieldsFromTags(tags); - } - - [TestMethod] - [ExpectedException(typeof(TagsLimitExceededException), "Tag count exceeding 10 did not throw a TagsLimitExceededException.")] - public void TestSetCollectorFieldsFromTags_LimitExceeded() - { - var tags = @"a=b,c=d,e=f,g=h,i=j,k=l,m=n,o=p,q=r,s=t,u=v"; - - var config = new Config(); - config.SetCollectorFieldsFromTags(tags); - } - - [TestMethod] - [ExpectedException(typeof(TagKeyLengthExceededException), "Tag key exceeding 255 characters did not throw a TagKeyLengthExceededException.")] - public void TestSetCollectorFieldsFromTags_KeyLengthExceeded() - { - var tags = string.Format("{0}=value", RandomString(256)); - - var config = new Config(); - config.SetCollectorFieldsFromTags(tags); - } - - [TestMethod] - [ExpectedException(typeof(TagValueLengthExceededException), "Tag value exceeding 200 characters did not throw a TagValueLengthExceededException.")] - public void TestSetCollectorFieldsFromTags_ValueLengthExceeded() - { - var tags = string.Format("key={0}", RandomString(201)); - - var config = new Config(); - config.SetCollectorFieldsFromTags(tags); - } - } -} diff --git a/packaging/msi/SumoLogic.wixext/SumoLogicTests/ConfigUpdaterTests.cs b/packaging/msi/SumoLogic.wixext/SumoLogicTests/ConfigUpdaterTests.cs deleted file mode 100644 index f812e4bab9..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogicTests/ConfigUpdaterTests.cs +++ /dev/null @@ -1,410 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using SumoLogic.wixext; -using System; -using System.IO; -using YamlDotNet.RepresentationModel; - -namespace SumoLogicTests -{ - [TestClass] - public class ConfigUpdaterTests - { - readonly string testDataPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestData"); - - public void InstallationTokenAssertions(Config config, StreamReader sr) - { - YamlStream ys = new YamlStream(); - ys.Load(sr); - YamlMappingNode root = (YamlMappingNode)ys.Documents[0].RootNode; - - Assert.IsTrue(root.Children.ContainsKey("extensions")); - Assert.AreEqual(YamlNodeType.Mapping, root.Children["extensions"].NodeType); - var extensions = (YamlMappingNode)root.Children["extensions"]; - - Assert.IsTrue(extensions.Children.ContainsKey("sumologic")); - Assert.AreEqual(YamlNodeType.Mapping, extensions.Children["sumologic"].NodeType); - var sumologic = (YamlMappingNode)extensions.Children["sumologic"]; - - Assert.IsTrue(sumologic.Children.ContainsKey("installation_token")); - Assert.AreEqual(YamlNodeType.Scalar, sumologic.Children["installation_token"].NodeType); - Assert.AreEqual(config.InstallationToken, sumologic.Children["installation_token"].ToString()); - - if (config.Ephemeral) - { - Assert.IsTrue(sumologic.Children.ContainsKey("ephemeral")); - Assert.AreEqual(YamlNodeType.Scalar, sumologic.Children["ephemeral"].NodeType); - Assert.AreEqual("true", sumologic.Children["ephemeral"].ToString()); - } - else - { - Assert.IsFalse(sumologic.Children.ContainsKey("ephemeral")); - } - - Assert.IsTrue(sumologic.Children.ContainsKey("collector_fields")); - Assert.AreEqual(YamlNodeType.Mapping, sumologic.Children["collector_fields"].NodeType); - var collectorFields = (YamlMappingNode)sumologic.Children["collector_fields"]; - - Assert.IsTrue(collectorFields.Children.ContainsKey("foo")); - Assert.IsTrue(collectorFields.Children.ContainsKey("baz")); - Assert.IsTrue(collectorFields.Children.ContainsKey("xaz")); - Assert.AreEqual(YamlNodeType.Scalar, collectorFields.Children["foo"].NodeType); - Assert.AreEqual(YamlNodeType.Scalar, collectorFields.Children["baz"].NodeType); - Assert.AreEqual(YamlNodeType.Scalar, collectorFields.Children["xaz"].NodeType); - Assert.AreEqual("bar", collectorFields.Children["foo"]); - Assert.AreEqual("kaz", collectorFields.Children["baz"]); - Assert.AreEqual("yaz", collectorFields.Children["xaz"]); - } - - public void OpAmpAssertions(Config config, StreamReader sr) - { - YamlStream ys = new YamlStream(); - ys.Load(sr); - YamlMappingNode root = (YamlMappingNode)ys.Documents[0].RootNode; - - Assert.IsTrue(root.Children.ContainsKey("extensions")); - Assert.AreEqual(YamlNodeType.Mapping, root.Children["extensions"].NodeType); - var extensions = (YamlMappingNode)root.Children["extensions"]; - - if (config.RemotelyManaged) - { - Assert.IsTrue(extensions.Children.ContainsKey("opamp")); - Assert.AreEqual(YamlNodeType.Mapping, extensions.Children["opamp"].NodeType); - var opamp = (YamlMappingNode)extensions.Children["opamp"]; - - Assert.IsTrue(opamp.Children.ContainsKey("remote_configuration_directory")); - Assert.AreEqual(YamlNodeType.Scalar, opamp.Children["remote_configuration_directory"].NodeType); - Assert.AreEqual(config.OpAmpFolder, opamp.Children["remote_configuration_directory"].ToString()); - } - else - { - Assert.IsFalse(extensions.Children.ContainsKey("opamp")); - } - - Assert.IsTrue(root.Children.ContainsKey("service")); - Assert.AreEqual(YamlNodeType.Mapping, root.Children["service"].NodeType); - var service = (YamlMappingNode)root.Children["service"]; - - Assert.IsTrue(service.Children.ContainsKey("extensions")); - Assert.AreEqual(YamlNodeType.Sequence, service.Children["extensions"].NodeType); - var serviceExtensions = (YamlSequenceNode)service.Children["extensions"]; - if (config.RemotelyManaged) - { - Assert.IsTrue(serviceExtensions.Children.Contains("opamp")); - } - else - { - Assert.IsFalse(serviceExtensions.Children.Contains("opamp")); - } - } - - public void EphemeralAssertions(Config config, StreamReader sr) - { - YamlStream ys = new YamlStream(); - ys.Load(sr); - YamlMappingNode root = (YamlMappingNode)ys.Documents[0].RootNode; - - Assert.IsTrue(root.Children.ContainsKey("extensions")); - Assert.AreEqual(YamlNodeType.Mapping, root.Children["extensions"].NodeType); - var extensions = (YamlMappingNode)root.Children["extensions"]; - - Assert.IsTrue(extensions.Children.ContainsKey("sumologic")); - Assert.AreEqual(YamlNodeType.Mapping, extensions.Children["sumologic"].NodeType); - var sumologic = (YamlMappingNode)extensions.Children["sumologic"]; - - if (config.Ephemeral) - { - Assert.IsTrue(sumologic.Children.ContainsKey("ephemeral")); - Assert.AreEqual(YamlNodeType.Scalar, sumologic.Children["ephemeral"].NodeType); - Assert.AreEqual("true", sumologic.Children["ephemeral"].ToString()); - } - else - { - if (sumologic.Children.ContainsKey("ephemeral")) - { - Assert.AreEqual(YamlNodeType.Scalar, sumologic.Children["ephemeral"].NodeType); - Assert.AreEqual("false", sumologic.Children["ephemeral"].ToString()); - } - } - } - - public void ApiAssertions(Config config, StreamReader sr) - { - YamlStream ys = new YamlStream(); - ys.Load(sr); - YamlMappingNode root = (YamlMappingNode)ys.Documents[0].RootNode; - - Assert.IsTrue(root.Children.ContainsKey("extensions")); - Assert.AreEqual(YamlNodeType.Mapping, root.Children["extensions"].NodeType); - var extensions = (YamlMappingNode)root.Children["extensions"]; - - Assert.IsTrue(extensions.Children.ContainsKey("sumologic")); - Assert.AreEqual(YamlNodeType.Mapping, extensions.Children["sumologic"].NodeType); - var sumologic = (YamlMappingNode)extensions.Children["sumologic"]; - - Assert.IsTrue(sumologic.Children.ContainsKey("api_base_url")); - Assert.AreEqual(YamlNodeType.Scalar, sumologic.Children["api_base_url"].NodeType); - var apiBaseUrl = (YamlScalarNode)sumologic.Children["api_base_url"]; - Assert.AreEqual(config.Api, apiBaseUrl.ToString()); - } - - [TestMethod] - public void TestUpdate_WithExtensionsBlock() - { - var filePath = Path.Combine(testDataPath, "with-extensions-block.yaml"); - var config = new Config { InstallationToken = "foobar", Ephemeral = true }; - config.SetCollectorFieldsFromTags(@"foo=bar,baz=kaz,xaz=yaz"); - - using (MemoryStream ms = new MemoryStream()) - { - var configUpdater = new ConfigUpdater(new StreamReader(filePath)); - configUpdater.Update(config); - configUpdater.Save(new StreamWriter(ms)); - - ms.Seek(0, SeekOrigin.Begin); - - StreamReader sr = new StreamReader(ms); - while (!sr.EndOfStream) - { - Console.WriteLine(sr.ReadLine()); - } - - ms.Seek(0, SeekOrigin.Begin); - - InstallationTokenAssertions(config, sr); - } - } - - [TestMethod] - public void TestUpdate_WithoutExtensionsBlock() - { - var filePath = Path.Combine(testDataPath, "without-extensions-block.yaml"); - var config = new Config { InstallationToken = "foobar", Ephemeral = false }; - config.SetCollectorFieldsFromTags(@"foo=bar,baz=kaz,xaz=yaz"); - - using (MemoryStream ms = new MemoryStream()) - { - var configUpdater = new ConfigUpdater(new StreamReader(filePath)); - configUpdater.Update(config); - configUpdater.Save(new StreamWriter(ms)); - - ms.Seek(0, SeekOrigin.Begin); - - StreamReader sr = new StreamReader(ms); - while (!sr.EndOfStream) - { - Console.WriteLine(sr.ReadLine()); - } - - ms.Seek(0, SeekOrigin.Begin); - - InstallationTokenAssertions(config, sr); - } - } - - [TestMethod] - public void TestUpdate_NoIndentation() - { - var filePath = Path.Combine(testDataPath, "no-indentation.yaml"); - var config = new Config { InstallationToken = "foobar" }; - config.SetCollectorFieldsFromTags(@"foo=bar,baz=kaz,xaz=yaz"); - - using (MemoryStream ms = new MemoryStream()) - { - var configUpdater = new ConfigUpdater(new StreamReader(filePath)); - configUpdater.Update(config); - configUpdater.Save(new StreamWriter(ms)); - - ms.Seek(0, SeekOrigin.Begin); - - StreamReader sr = new StreamReader(ms); - while (!sr.EndOfStream) - { - Console.WriteLine(sr.ReadLine()); - } - - ms.Seek(0, SeekOrigin.Begin); - - InstallationTokenAssertions(config, sr); - } - } - - [TestMethod] - [ExpectedException(typeof(EmptyConfigException), "Loading an empty config did not throw an EmptyConfigException.")] - public void TestUpdate_Empty() - { - var filePath = Path.Combine(testDataPath, "empty.yaml"); - var config = new Config { InstallationToken = "foobar" }; - config.SetCollectorFieldsFromTags(@"foo=bar,baz=kaz,xaz=yaz"); - - using (MemoryStream ms = new MemoryStream()) - { - var configUpdater = new ConfigUpdater(new StreamReader(filePath)); - } - } - - [TestMethod] - [ExpectedException(typeof(YamlDotNet.Core.SyntaxErrorException), "Loading an invalid config did not throw a YamlDotNet.Core.SyntaxErrorException.")] - public void TestUpdate_Invalid() - { - var filePath = Path.Combine(testDataPath, "invalid.yaml"); - var config = new Config { InstallationToken = "foobar" }; - config.SetCollectorFieldsFromTags(@"foo=bar,baz=kaz,xaz=yaz"); - - using (MemoryStream ms = new MemoryStream()) - { - var configUpdater = new ConfigUpdater(new StreamReader(filePath)); - } - } - - [TestMethod] - public void TestUpdate_OpAmp() - { - var filePath = Path.Combine(testDataPath, "with-extensions-block.yaml"); - var config = new Config { InstallationToken = "foobar", Ephemeral = true, RemotelyManaged = true, OpAmpFolder = "/opamp" }; - config.SetCollectorFieldsFromTags(@"foo=bar,baz=kaz,xaz=yaz"); - - using (MemoryStream ms = new MemoryStream()) - { - var configUpdater = new ConfigUpdater(new StreamReader(filePath)); - configUpdater.Update(config); - configUpdater.Save(new StreamWriter(ms)); - - ms.Seek(0, SeekOrigin.Begin); - - StreamReader sr = new StreamReader(ms); - while (!sr.EndOfStream) - { - Console.WriteLine(sr.ReadLine()); - } - - ms.Seek(0, SeekOrigin.Begin); - - OpAmpAssertions(config, sr); - } - } - - [TestMethod] - [ExpectedException(typeof(MissingConfigurationException), "OpAmpFolder")] - public void TestUpdate_OpAmpNoFolder() - { - var filePath = Path.Combine(testDataPath, "with-extensions-block.yaml"); - var config = new Config { InstallationToken = "foobar", Ephemeral = true, RemotelyManaged = true }; - config.SetCollectorFieldsFromTags(@"foo=bar,baz=kaz,xaz=yaz"); - - using (MemoryStream ms = new MemoryStream()) - { - var configUpdater = new ConfigUpdater(new StreamReader(filePath)); - configUpdater.Update(config); - configUpdater.Save(new StreamWriter(ms)); - } - } - - [TestMethod] - public void TestUpdate_NoOpAmpWithFolder() - { - var filePath = Path.Combine(testDataPath, "with-extensions-block.yaml"); - var config = new Config { InstallationToken = "foobar", Ephemeral = true, RemotelyManaged = false, OpAmpFolder = "/opamp" }; - config.SetCollectorFieldsFromTags(@"foo=bar,baz=kaz,xaz=yaz"); - - using (MemoryStream ms = new MemoryStream()) - { - var configUpdater = new ConfigUpdater(new StreamReader(filePath)); - configUpdater.Update(config); - configUpdater.Save(new StreamWriter(ms)); - - ms.Seek(0, SeekOrigin.Begin); - - StreamReader sr = new StreamReader(ms); - while (!sr.EndOfStream) - { - Console.WriteLine(sr.ReadLine()); - } - - ms.Seek(0, SeekOrigin.Begin); - - OpAmpAssertions(config, sr); - } - } - - [TestMethod] - public void TestUpdate_Ephemeral() - { - var filePath = Path.Combine(testDataPath, "with-extensions-block.yaml"); - var config = new Config { InstallationToken = "foobar", Ephemeral = true }; - config.SetCollectorFieldsFromTags(@"foo=bar,baz=kaz,xaz=yaz"); - - using (MemoryStream ms = new MemoryStream()) - { - var configUpdater = new ConfigUpdater(new StreamReader(filePath)); - configUpdater.Update(config); - configUpdater.Save(new StreamWriter(ms)); - - ms.Seek(0, SeekOrigin.Begin); - - StreamReader sr = new StreamReader(ms); - while (!sr.EndOfStream) - { - Console.WriteLine(sr.ReadLine()); - } - - ms.Seek(0, SeekOrigin.Begin); - - EphemeralAssertions(config, sr); - } - } - - [TestMethod] - public void TestUpdate_NotEphemeral() - { - var filePath = Path.Combine(testDataPath, "with-extensions-block.yaml"); - var config = new Config { InstallationToken = "foobar", Ephemeral = false }; - config.SetCollectorFieldsFromTags(@"foo=bar,baz=kaz,xaz=yaz"); - - using (MemoryStream ms = new MemoryStream()) - { - var configUpdater = new ConfigUpdater(new StreamReader(filePath)); - configUpdater.Update(config); - configUpdater.Save(new StreamWriter(ms)); - - ms.Seek(0, SeekOrigin.Begin); - - StreamReader sr = new StreamReader(ms); - while (!sr.EndOfStream) - { - Console.WriteLine(sr.ReadLine()); - } - - ms.Seek(0, SeekOrigin.Begin); - - EphemeralAssertions(config, sr); - } - } - - [TestMethod] - public void TestUpdate_Api() - { - var filePath = Path.Combine(testDataPath, "with-extensions-block.yaml"); - var config = new Config { InstallationToken = "foobar", Api = "http://apiurl.local" }; - config.SetCollectorFieldsFromTags(@"foo=bar,baz=kaz,xaz=yaz"); - - using (MemoryStream ms = new MemoryStream()) - { - var configUpdater = new ConfigUpdater(new StreamReader(filePath)); - configUpdater.Update(config); - configUpdater.Save(new StreamWriter(ms)); - - ms.Seek(0, SeekOrigin.Begin); - - StreamReader sr = new StreamReader(ms); - while (!sr.EndOfStream) - { - Console.WriteLine(sr.ReadLine()); - } - - ms.Seek(0, SeekOrigin.Begin); - - ApiAssertions(config, sr); - } - } - } -} diff --git a/packaging/msi/SumoLogic.wixext/SumoLogicTests/Properties/AssemblyInfo.cs b/packaging/msi/SumoLogic.wixext/SumoLogicTests/Properties/AssemblyInfo.cs deleted file mode 100644 index 08b3c70bcb..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogicTests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("SumoLogicTests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("SumoLogicTests")] -[assembly: AssemblyCopyright("Copyright © 2022")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] - -[assembly: Guid("c2b5b3eb-dbd0-4bd2-a90e-d4f2f1a615bc")] - -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/packaging/msi/SumoLogic.wixext/SumoLogicTests/SumoLogicTests.csproj b/packaging/msi/SumoLogic.wixext/SumoLogicTests/SumoLogicTests.csproj deleted file mode 100644 index f83f8d9f4e..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogicTests/SumoLogicTests.csproj +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - Debug - AnyCPU - {C2B5B3EB-DBD0-4BD2-A90E-D4F2F1A615BC} - Library - Properties - SumoLogicTests - SumoLogicTests - v4.5.1 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 15.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - - - - - - - 15.0 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - MinimumRecommendedRules.ruleset - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - MinimumRecommendedRules.ruleset - false - AnyCPU - - - - ..\packages\MSTest.TestFramework.2.2.10\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll - - - ..\packages\MSTest.TestFramework.2.2.10\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll - - - - - ..\packages\YamlDotNet.12.0.2\lib\net45\YamlDotNet.dll - - - - - - - - - - {c2671341-19d5-4cd6-84a3-f7207de74e30} - SumoLogic.wixext - - - - - - Always - - - Always - - - Always - - - Always - - - Always - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - diff --git a/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/empty.yaml b/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/empty.yaml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/invalid.yaml b/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/invalid.yaml deleted file mode 100644 index bf1ee551ce..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/invalid.yaml +++ /dev/null @@ -1 +0,0 @@ -"invalid-yaml: foobar diff --git a/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/no-indentation.yaml b/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/no-indentation.yaml deleted file mode 100644 index d01f538872..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/no-indentation.yaml +++ /dev/null @@ -1,11 +0,0 @@ -## This file is generated automatically and shouldn't be changed -## All modifications should be put as separate files in conf.d subdirectory -extensions: - -receivers: - -exporters: - -processors: - -service: diff --git a/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/with-extensions-block.yaml b/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/with-extensions-block.yaml deleted file mode 100644 index 67581a6b61..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/with-extensions-block.yaml +++ /dev/null @@ -1,104 +0,0 @@ -## This file is generated automatically and shouldn't be changed -## All modifications should be put as separate files in conf.d subdirectory -extensions: - ## Configuration for Sumo Logic Extension - ## Manages registration, heartbeats and authentication to Sumo Logic - ## ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/sumologicextension - sumologic: - installation_token: ${SUMOLOGIC_INSTALLATION_TOKEN} - collector_credentials_directory: ${PROGRAMDATA}\Sumo Logic\otelcol-sumo\data\credentials - - ## Configuration for Health Check Extension - ## Health Check extension enables an HTTP url that can be probed to check the status of the OpenTelemetry Collector - ## ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/healthcheckextension - health_check: - - ## Configuration for File Storage Extension - ## The File Storage extension can persist state to the local file system - ## ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/storage/filestorage - file_storage: - directory: ${PROGRAMDATA}\Sumo Logic\otelcol-sumo\data\file_storage - -receivers: - ## Configuration for OTLP Receiver - ## Receives data via gRPC or HTTP using OTLP format. - ## ref: https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/otlpreceiver - otlp: - protocols: - grpc: - endpoint: localhost:4317 - http: - endpoint: localhost:4318 - -exporters: - ## Configuration for Sumo Logic Exporter - ## This exporter supports sending logs, metrics and traces data to Sumo Logic. - ## ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.103.0/exporter/sumologicexporter - sumologic: - sending_queue: - enabled: true - storage: file_storage - -processors: - ## Configuration for Memory Limiter Processor - ## The memory_limiter processor is used to prevent out of memory situations on the collector. - ## ref: https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor/memorylimiterprocessor - memory_limiter: - ## check_interval is the time between measurements of memory usage for the - ## purposes of avoiding going over the limits. Defaults to zero, so no - ## checks will be performed. Values below 1 second are not recommended since - ## it can result in unnecessary CPU consumption. - check_interval: 5s - ## Maximum amount of memory, in %, targeted to be allocated by the process heap. - limit_percentage: 75 - ## Spike limit (calculated from available memory). Must be less than limit_percentage. - spike_limit_percentage: 20 - - ## Configuration for Batch Processor - ## The batch processor accepts records and places them into batches grouped by node and resource - ## ref: https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/batchprocessor - batch: - ## Number of records after which a batch will be sent regardless of time - send_batch_size: 1_024 - ## Time duration after which a batch will be sent regardless of size - timeout: 1s - - ## Configuration for Sumo Logic Schema Processor - ## The Sumo Logic Schema processor modifies the metadata on logs, metrics and traces sent to Sumo Logic - ## so that the Sumo Logic apps can make full use of the ingested data. - ## ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/sumologicprocessor - sumologic: - -service: - extensions: - - sumologic - - health_check - - file_storage - pipelines: - metrics/default: - receivers: - - otlp - processors: - - memory_limiter - - batch - - sumologic - exporters: - - sumologic - logs/default: - receivers: - - otlp - processors: - - memory_limiter - - batch - - sumologic - exporters: - - sumologic - traces/default: - receivers: - - otlp - processors: - - memory_limiter - - batch - - sumologic - exporters: - - sumologic diff --git a/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/without-extensions-block.yaml b/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/without-extensions-block.yaml deleted file mode 100644 index f1b0ea41d6..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogicTests/TestData/without-extensions-block.yaml +++ /dev/null @@ -1,85 +0,0 @@ -## This file is generated automatically and shouldn't be changed -## All modifications should be put as separate files in conf.d subdirectory -receivers: - ## Configuration for OTLP Receiver - ## Receives data via gRPC or HTTP using OTLP format. - ## ref: https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/otlpreceiver - otlp: - protocols: - grpc: - endpoint: localhost:4317 - http: - endpoint: localhost:4318 - -exporters: - ## Configuration for Sumo Logic Exporter - ## This exporter supports sending logs, metrics and traces data to Sumo Logic. - ## ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.103.0/exporter/sumologicexporter - sumologic: - sending_queue: - enabled: true - storage: file_storage - -processors: - ## Configuration for Memory Limiter Processor - ## The memory_limiter processor is used to prevent out of memory situations on the collector. - ## ref: https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor/memorylimiterprocessor - memory_limiter: - ## check_interval is the time between measurements of memory usage for the - ## purposes of avoiding going over the limits. Defaults to zero, so no - ## checks will be performed. Values below 1 second are not recommended since - ## it can result in unnecessary CPU consumption. - check_interval: 5s - ## Maximum amount of memory, in %, targeted to be allocated by the process heap. - limit_percentage: 75 - ## Spike limit (calculated from available memory). Must be less than limit_percentage. - spike_limit_percentage: 20 - - ## Configuration for Batch Processor - ## The batch processor accepts records and places them into batches grouped by node and resource - ## ref: https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/batchprocessor - batch: - ## Number of records after which a batch will be sent regardless of time - send_batch_size: 1_024 - ## Time duration after which a batch will be sent regardless of size - timeout: 1s - - ## Configuration for Sumo Logic Schema Processor - ## The Sumo Logic Schema processor modifies the metadata on logs, metrics and traces sent to Sumo Logic - ## so that the Sumo Logic apps can make full use of the ingested data. - ## ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/sumologicprocessor - sumologic: - -service: - extensions: - - sumologic - - health_check - - file_storage - pipelines: - metrics/default: - receivers: - - otlp - processors: - - memory_limiter - - batch - - sumologic - exporters: - - sumologic - logs/default: - receivers: - - otlp - processors: - - memory_limiter - - batch - - sumologic - exporters: - - sumologic - traces/default: - receivers: - - otlp - processors: - - memory_limiter - - batch - - sumologic - exporters: - - sumologic diff --git a/packaging/msi/SumoLogic.wixext/SumoLogicTests/packages.config b/packaging/msi/SumoLogic.wixext/SumoLogicTests/packages.config deleted file mode 100644 index 673ede4a7d..0000000000 --- a/packaging/msi/SumoLogic.wixext/SumoLogicTests/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/packaging/msi/wix/assets/LICENSE.rtf b/packaging/msi/wix/assets/LICENSE.rtf deleted file mode 100644 index 0184c5c42a..0000000000 --- a/packaging/msi/wix/assets/LICENSE.rtf +++ /dev/null @@ -1,236 +0,0 @@ -{\rtf1\ansi\deff0\nouicompat{\fonttbl{\f0\fnil\fcharset0 Courier New;}} -{\*\generator Riched20 10.0.22000}\viewkind4\uc1 -\pard\f0\fs22\lang1033 Copyright 2021 Sumo Logic Inc.\par -\par - -\pard\qc Apache License\par -Version 2.0, January 2004\par -http://www.apache.org/licenses/\par - -\pard\par - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\par -\par - 1. Definitions.\par -\par - "License" shall mean the terms and conditions for use, reproduction,\par - and distribution as defined by Sections 1 through 9 of this document.\par -\par - "Licensor" shall mean the copyright owner or entity authorized by\par - the copyright owner that is granting the License.\par -\par - "Legal Entity" shall mean the union of the acting entity and all\par - other entities that control, are controlled by, or are under common\par - control with that entity. For the purposes of this definition,\par - "control" means (i) the power, direct or indirect, to cause the\par - direction or management of such entity, whether by contract or\par - otherwise, or (ii) ownership of fifty percent (50%) or more of the\par - outstanding shares, or (iii) beneficial ownership of such entity.\par -\par - "You" (or "Your") shall mean an individual or Legal Entity\par - exercising permissions granted by this License.\par -\par - "Source" form shall mean the preferred form for making modifications,\par - including but not limited to software source code, documentation\par - source, and configuration files.\par -\par - "Object" form shall mean any form resulting from mechanical\par - transformation or translation of a Source form, including but\par - not limited to compiled object code, generated documentation,\par - and conversions to other media types.\par -\par - "Work" shall mean the work of authorship, whether in Source or\par - Object form, made available under the License, as indicated by a\par - copyright notice that is included in or attached to the work\par - (an example is provided in the Appendix below).\par -\par - "Derivative Works" shall mean any work, whether in Source or Object\par - form, that is based on (or derived from) the Work and for which the\par - editorial revisions, annotations, elaborations, or other modifications\par - represent, as a whole, an original work of authorship. For the purposes\par - of this License, Derivative Works shall not include works that remain\par - separable from, or merely link (or bind by name) to the interfaces of,\par - the Work and Derivative Works thereof.\par -\par - "Contribution" shall mean any work of authorship, including\par - the original version of the Work and any modifications or additions\par - to that Work or Derivative Works thereof, that is intentionally\par - submitted to Licensor for inclusion in the Work by the copyright owner\par - or by an individual or Legal Entity authorized to submit on behalf of\par - the copyright owner. For the purposes of this definition, "submitted"\par - means any form of electronic, verbal, or written communication sent\par - to the Licensor or its representatives, including but not limited to\par - communication on electronic mailing lists, source code control systems,\par - and issue tracking systems that are managed by, or on behalf of, the\par - Licensor for the purpose of discussing and improving the Work, but\par - excluding communication that is conspicuously marked or otherwise\par - designated in writing by the copyright owner as "Not a Contribution."\par -\par - "Contributor" shall mean Licensor and any individual or Legal Entity\par - on behalf of whom a Contribution has been received by Licensor and\par - subsequently incorporated within the Work.\par -\par - 2. Grant of Copyright License. Subject to the terms and conditions of\par - this License, each Contributor hereby grants to You a perpetual,\par - worldwide, non-exclusive, no-charge, royalty-free, irrevocable\par - copyright license to reproduce, prepare Derivative Works of,\par - publicly display, publicly perform, sublicense, and distribute the\par - Work and such Derivative Works in Source or Object form.\par -\par - 3. Grant of Patent License. Subject to the terms and conditions of\par - this License, each Contributor hereby grants to You a perpetual,\par - worldwide, non-exclusive, no-charge, royalty-free, irrevocable\par - (except as stated in this section) patent license to make, have made,\par - use, offer to sell, sell, import, and otherwise transfer the Work,\par - where such license applies only to those patent claims licensable\par - by such Contributor that are necessarily infringed by their\par - Contribution(s) alone or by combination of their Contribution(s)\par - with the Work to which such Contribution(s) was submitted. If You\par - institute patent litigation against any entity (including a\par - cross-claim or counterclaim in a lawsuit) alleging that the Work\par - or a Contribution incorporated within the Work constitutes direct\par - or contributory patent infringement, then any patent licenses\par - granted to You under this License for that Work shall terminate\par - as of the date such litigation is filed.\par -\par - 4. Redistribution. You may reproduce and distribute copies of the\par - Work or Derivative Works thereof in any medium, with or without\par - modifications, and in Source or Object form, provided that You\par - meet the following conditions:\par -\par - (a) You must give any other recipients of the Work or\par - Derivative Works a copy of this License; and\par -\par - (b) You must cause any modified files to carry prominent notices\par - stating that You changed the files; and\par -\par - (c) You must retain, in the Source form of any Derivative Works\par - that You distribute, all copyright, patent, trademark, and\par - attribution notices from the Source form of the Work,\par - excluding those notices that do not pertain to any part of\par - the Derivative Works; and\par -\par - (d) If the Work includes a "NOTICE" text file as part of its\par - distribution, then any Derivative Works that You distribute must\par - include a readable copy of the attribution notices contained\par - within such NOTICE file, excluding those notices that do not\par - pertain to any part of the Derivative Works, in at least one\par - of the following places: within a NOTICE text file distributed\par - as part of the Derivative Works; within the Source form or\par - documentation, if provided along with the Derivative Works; or,\par - within a display generated by the Derivative Works, if and\par - wherever such third-party notices normally appear. The contents\par - of the NOTICE file are for informational purposes only and\par - do not modify the License. You may add Your own attribution\par - notices within Derivative Works that You distribute, alongside\par - or as an addendum to the NOTICE text from the Work, provided\par - that such additional attribution notices cannot be construed\par - as modifying the License.\par -\par - You may add Your own copyright statement to Your modifications and\par - may provide additional or different license terms and conditions\par - for use, reproduction, or distribution of Your modifications, or\par - for any such Derivative Works as a whole, provided Your use,\par - reproduction, and distribution of the Work otherwise complies with\par - the conditions stated in this License.\par -\par - 5. Submission of Contributions. Unless You explicitly state otherwise,\par - any Contribution intentionally submitted for inclusion in the Work\par - by You to the Licensor shall be under the terms and conditions of\par - this License, without any additional terms or conditions.\par - Notwithstanding the above, nothing herein shall supersede or modify\par - the terms of any separate license agreement you may have executed\par - with Licensor regarding such Contributions.\par -\par - 6. Trademarks. This License does not grant permission to use the trade\par - names, trademarks, service marks, or product names of the Licensor,\par - except as required for reasonable and customary use in describing the\par - origin of the Work and reproducing the content of the NOTICE file.\par -\par - 7. Disclaimer of Warranty. Unless required by applicable law or\par - agreed to in writing, Licensor provides the Work (and each\par - Contributor provides its Contributions) on an "AS IS" BASIS,\par - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\par - implied, including, without limitation, any warranties or conditions\par - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\par - PARTICULAR PURPOSE. You are solely responsible for determining the\par - appropriateness of using or redistributing the Work and assume any\par - risks associated with Your exercise of permissions under this License.\par -\par - 8. Limitation of Liability. In no event and under no legal theory,\par - whether in tort (including negligence), contract, or otherwise,\par - unless required by applicable law (such as deliberate and grossly\par - negligent acts) or agreed to in writing, shall any Contributor be\par - liable to You for damages, including any direct, indirect, special,\par - incidental, or consequential damages of any character arising as a\par - result of this License or out of the use or inability to use the\par - Work (including but not limited to damages for loss of goodwill,\par - work stoppage, computer failure or malfunction, or any and all\par - other commercial damages or losses), even if such Contributor\par - has been advised of the possibility of such damages.\par -\par - 9. Accepting Warranty or Additional Liability. While redistributing\par - the Work or Derivative Works thereof, You may choose to offer,\par - and charge a fee for, acceptance of support, warranty, indemnity,\par - or other liability obligations and/or rights consistent with this\par - License. However, in accepting such obligations, You may act only\par - on Your own behalf and on Your sole responsibility, not on behalf\par - of any other Contributor, and only if You agree to indemnify,\par - defend, and hold each Contributor harmless for any liability\par - incurred by, or claims asserted against, such Contributor by reason\par - of your accepting any such warranty or additional liability.\par -\par - END OF TERMS AND CONDITIONS\par -\par - APPENDIX: How to apply the Apache License to your work.\par -\par - To apply the Apache License to your work, attach the following\par - boilerplate notice, with the fields enclosed by brackets "[]"\par - replaced with your own identifying information. (Don't include\par - the brackets!) The text should be enclosed in the appropriate\par - comment syntax for the file format. We also recommend that a\par - file or class name and description of purpose be included on the\par - same "printed page" as the copyright notice for easier\par - identification within third-party archives.\par -\par - Copyright 2021 Sumo Logic Inc.\par -\par - Licensed under the Apache License, Version 2.0 (the "License");\par - you may not use this file except in compliance with the License.\par - You may obtain a copy of the License at\par -\par - http://www.apache.org/licenses/LICENSE-2.0\par -\par - Unless required by applicable law or agreed to in writing, software\par - distributed under the License is distributed on an "AS IS" BASIS,\par - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\par - See the License for the specific language governing permissions and\par - limitations under the License.\par -\par -Contains code from https://github.com/SumoLogic/telegraf/blob/master/LICENSE\par -under the MIT license in the following directory:\par -https://github.com/SumoLogic/sumologic-otel-collector/tree/main/pkg/receiver/telegrafreceiver\par -\par -The MIT License (MIT)\par -\par -Copyright (c) 2015-2020 InfluxData Inc.\par -\par -Permission is hereby granted, free of charge, to any person obtaining a copy\par -of this software and associated documentation files (the "Software"), to deal\par -in the Software without restriction, including without limitation the rights\par -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\par -copies of the Software, and to permit persons to whom the Software is\par -furnished to do so, subject to the following conditions:\par -\par -The above copyright notice and this permission notice shall be included in all\par -copies or substantial portions of the Software.\par -\par -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\par -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\par -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\par -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\par -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\par -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\par -SOFTWARE.\par -\par -} - diff --git a/packaging/msi/wix/assets/banner_background.bmp b/packaging/msi/wix/assets/banner_background.bmp deleted file mode 100644 index 8ea0a1292a4c8a30eb39db444f8cc4c8d29b35e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114432 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packaging/msi/wix/folders.wxs b/packaging/msi/wix/folders.wxs deleted file mode 100644 index 35d209252b..0000000000 --- a/packaging/msi/wix/folders.wxs +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packaging/msi/wix/otelcol-sumo.wixproj b/packaging/msi/wix/otelcol-sumo.wixproj deleted file mode 100644 index e538f9fb35..0000000000 --- a/packaging/msi/wix/otelcol-sumo.wixproj +++ /dev/null @@ -1,68 +0,0 @@ - - - - 1.0.0.0 - 25ec8859-fe5e-4110-a6e4-915b6ed83072 - 33D8E84A-1581-41DC-AF17-E48459B895C5 - en-US - none - $([System.IO.Path]::GetFullPath('..\..\..')) - false - - - - ICE61 - - - - bin\$(Platform)\ - obj\$(Platform)\ - - - - otelcol-sumo_$(ProductVersion)_en-US.$(Platform) - - - - otelcol-sumo_$(ProductVersion)_en-US.$(Platform)-fips - - - - $(DefineConstants);ProductVersion=$(ProductVersion) - $(DefineConstants);UpgradeCode=$(UpgradeCode) - - - - - - - - - - - SumoLogic - - - - - - - - - - - - - - - true - - - - - - - - - - diff --git a/packaging/msi/wix/package.en-us.wxl b/packaging/msi/wix/package.en-us.wxl deleted file mode 100644 index b677409a10..0000000000 --- a/packaging/msi/wix/package.en-us.wxl +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packaging/msi/wix/package.wxs b/packaging/msi/wix/package.wxs deleted file mode 100644 index 4903853990..0000000000 --- a/packaging/msi/wix/package.wxs +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packaging/msi/wix/ui/appdata-dir-dlg.wxs b/packaging/msi/wix/ui/appdata-dir-dlg.wxs deleted file mode 100644 index 5736fc8de1..0000000000 --- a/packaging/msi/wix/ui/appdata-dir-dlg.wxs +++ /dev/null @@ -1,28 +0,0 @@ - - - - -

- - - - - - - - - - - - - - - - - - - - - - - diff --git a/packaging/msi/wix/ui/otelcol-sumo.wxs b/packaging/msi/wix/ui/otelcol-sumo.wxs deleted file mode 100644 index 73765b66af..0000000000 --- a/packaging/msi/wix/ui/otelcol-sumo.wxs +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packaging/msi/wix/variables.wxi b/packaging/msi/wix/variables.wxi deleted file mode 100644 index 2b6c3ba33f..0000000000 --- a/packaging/msi/wix/variables.wxi +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - From 7d3ad946ff9d3788b745775e84a3e2d73a6d0da5 Mon Sep 17 00:00:00 2001 From: Justin Kolberg Date: Mon, 4 Nov 2024 17:27:15 -0800 Subject: [PATCH 2/5] docs: update release docs Signed-off-by: Justin Kolberg --- docs/bump-journalctl.md | 15 ++ docs/bump-upstream-version.md | 172 +++++++++++++++++++ docs/release.md | 307 +++++++++------------------------- docs/testing.md | 19 +++ images/release_0.png | Bin 0 -> 42381 bytes images/release_1.png | Bin 0 -> 39955 bytes images/release_2.png | Bin 0 -> 65974 bytes 7 files changed, 286 insertions(+), 227 deletions(-) create mode 100644 docs/bump-journalctl.md create mode 100644 docs/bump-upstream-version.md create mode 100644 docs/testing.md create mode 100644 images/release_0.png create mode 100644 images/release_1.png create mode 100644 images/release_2.png diff --git a/docs/bump-journalctl.md b/docs/bump-journalctl.md new file mode 100644 index 0000000000..1c3715537e --- /dev/null +++ b/docs/bump-journalctl.md @@ -0,0 +1,15 @@ +# Updating journalctl + +The [journaldreceiver] has `journalctl` as a dependency. It is included in our +Docker images. In order to update it, please update debian version in each of +the Dockerfile files. This can be done using the command below. + +Please see available [debian versions][debian_versions]. + +```bash +export DEBIAN_VERSION=11.3 +make update-journalctl +``` + +[debian_versions]: https://hub.docker.com/_/debian/?tab=description +[journaldreceiver]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/receiver/journaldreceiver diff --git a/docs/bump-upstream-version.md b/docs/bump-upstream-version.md new file mode 100644 index 0000000000..f8506cc1c8 --- /dev/null +++ b/docs/bump-upstream-version.md @@ -0,0 +1,172 @@ +# Updating Upstream OT Version + +- [Update OT version](#update-ot-version) +- [Fix lint errors and tests](#fix-lint-errors-and-tests) +- [Check out the developer changelog](#check-out-the-developer-changelog) +- [Add missing upstream components](#add-missing-upstream-components) +- [Adding components from scratch](#adding-components-from-scratch) + +## Steps + +Here are the steps to update OT to next version: + +1. Update the version number where necessary +1. Verify that Sumo OT distro builds correctly +1. Fix lint and test errors +1. Add missing upstream components +1. Ensure all [milestone] tasks and issues have been done + +## Update OT version + +Take note of the [core][otcore_releases] and [contrib][otcontrib_releases] +versions you want to update to. They are often the same version (e.g. v0.77.0), +but for some releases, these versions are different (e.g. v0.76.1/v0.76.3 or +v0.78.2/v0.78.0). + +Run: + +```shell +make update-ot OT_CORE_NEW=x.x.x OT_CONTRIB_NEW=y.y.y +``` + +This make target also builds the Sumo OT distro binary to check that there are +no build errors. + +### Fix lint errors and tests + +Run: + +```shell +make golint +make gotest +``` + +### Check out the developer changelog + +Contrib maintains a [separate changelog][otelcol_api_changelog] for distribution +maintainers and component authors. Check this for any changes that may affect +our components or distribution. One example of this is increases to the minimal +supported Go version. + +### Add missing upstream components + +We include all of the components from the following list which are at least in +*alpha* stability level: + +- [OpenTelemetry Collector][otelcol_components] extensions, receivers, + processors, connectors +- [OpenTelemetry Collector Contrib][otelcol_contrib_components] extensions, + receivers, processors, connectors + +Additionally, the following components are supported: + +- [logstransformprocessor] +- [windowseventlogreceiver] +- [db_storage][dbstorage] +- [docker_observer][dockerobserver] +- [ecs_observer][ecsobserver] +- [ecs_task_observer][ecstaskobserver] + +As a fourth step, please check [OpenTelemetry Collector][otcore_releases] and +[OpenTelemetry Collector Contrib][otcontrib_releases] release pages for new +components and update [builder configuration][builder_config] and [README.md] if +they are any. + +New exporters should not be added without a reason. Please consider example pull +request: [#604] + +#### Adding components from scratch + +This shouldn't be required as long as list of components is regularly updated, +but in case you want to generate full list of components, the following +instruction can be helpful: + +1. [Update builder configuration][builder_config] + + You can use the following snippet inside [OpenTelemetry Contrib repository][otc_repository] + in order to get list of components: + + ```bash + export TAG=vx.y.z + git fetch --all + git checkout "${TAG}" + contrib_repo="github.com/open-telemetry/opentelemetry-collector-contrib" + for dir in receiver processor extension; do + echo "###############${dir}s###############" + for file in $(ls "${dir}"); do + echo " - gomod: \"${contrib_repo}/${dir}/${file} ${TAG}\""; + done; + done; + ``` + +1. Run `make build` in order to generate updated components file (`otelcolbuilder/cmd/components.go`) +1. Update markdown table: + + 1. Prepare `local/receiver.txt`, `local/exporter.txt`, `local/extension.txt` and + `local/processor.txt` + in [OpenTelemetry Contrib repository][otc_repository] based on components file. + Example content of `local/extension.txt`: + + ```text + sumologicextension.NewFactory(), + ballastextension.NewFactory(), + zpagesextension.NewFactory(), + asapauthextension.NewFactory(), + awsproxy.NewFactory(), + basicauthextension.NewFactory(), + bearertokenauthextension.NewFactory(), + fluentbitextension.NewFactory(), + healthcheckextension.NewFactory(), + httpforwarderextension.NewFactory(), + jaegerremotesampling.NewFactory(), + oauth2clientauthextension.NewFactory(), + dockerobserver.NewFactory(), + ecsobserver.NewFactory(), + ecstaskobserver.NewFactory(), + hostobserver.NewFactory(), + k8sobserver.NewFactory(), + oidcauthextension.NewFactory(), + pprofextension.NewFactory(), + sigv4authextension.NewFactory(), + filestorage.NewFactory(), + dbstorage.NewFactory(), + ``` + + 1. Run the following snippet in order to prepare markdown links for [README.md]: + + ```bash + for kind in extension processor receiver exporter; do + echo "#####${kind}#####" + for component in $(cat local/${kind}.txt | sed "s/\..*//g"); do + export dir=$(find ${kind} -name "${component}"); + NAME=$(grep -oRP '(?<=typeStr\s)(.*?)=(.*?)"(.*?)"' "${dir}" | grep -oP '\w+"$' | sed 's/"//g'); + echo "[${NAME}][${component}]"; + done 2>/dev/null + done + ``` + + 1. Copy and fix the output + 1. Copy fixed output to spreadsheet. Every component in separate column as in [README.md]. + 1. Sort components and add placeholder to empty rows. + Placeholders make it easier to format table as markdown in next steps. + 1. Copy table into text editor with support for regexp replacement. + 1. Prepare table in markdown format. We recommend to use regexp replacement. + 1. Prepare links for the table. You can use regexp replacement in order to generate it + 1. Carefully analyse `git diff` and fix unwanted changes. + +[#604]: https://github.com/SumoLogic/sumologic-otel-collector/pull/604/files +[builder_config]: ../otelcolbuilder/.otelcol-builder.yaml +[milestone]: https://github.com/SumoLogic/sumologic-otel-collector/milestones +[otcontrib_releases]: https://github.com/open-telemetry/opentelemetry-collector-contrib/releases +[otcore_releases]: https://github.com/open-telemetry/opentelemetry-collector/releases +[otelcol_components]: https://github.com/open-telemetry/opentelemetry-collector-releases/blob/main/distributions/otelcol/manifest.yaml +[otelcol_contrib_components]: https://github.com/open-telemetry/opentelemetry-collector-releases/blob/main/distributions/otelcol-contrib/manifest.yaml +[otc_repository]: https://github.com/open-telemetry/opentelemetry-collector-contrib +[otelcol_api_changelog]: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CHANGELOG-API.md +[readme.md]: ../README.md +[dbstorage]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/extension/storage/dbstorage +[dockerobserver]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/extension/observer/dockerobserver +[ecsobserver]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/extension/observer/ecsobserver +[ecstaskobserver]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/extension/observer/ecstaskobserver +[logstransformprocessor]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/processor/logstransformprocessor +[windowseventlogreceiver]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/receiver/windowseventlogreceiver diff --git a/docs/release.md b/docs/release.md index 996c84e534..db64266269 100644 --- a/docs/release.md +++ b/docs/release.md @@ -2,19 +2,12 @@ - [How to release](#how-to-release) - [Check end-to-end tests](#check-end-to-end-tests) - - [Update Changelog and upgrading guide](#update-changelog-and-upgrading-guide) - - [Create and push Git tag](#create-and-push-git-tag) - - [Remove tag in case of a failed release job](#remove-tag-in-case-of-a-failed-release-job) + - [Determine the Workflow Run ID to release](#determine-the-workflow-run-id-to-release) + - [Find the package build number](#find-the-package-build-number) + - [Find the collector workflow run](#find-the-collector-workflow-run) + - [Trigger the release](#trigger-the-release) - [Publish GitHub release](#publish-github-release) - - [Build packages](#build-packages) -- [Updating OT to next version](#updating-ot-to-next-version) - - [Update OT version](#update-ot-version) - - [Fix lint errors and tests](#fix-lint-errors-and-tests) - - [Check out the developer changelog](#check-out-the-developer-changelog) - - [Add missing upstream components](#add-missing-upstream-components) - - [Adding components from scratch](#adding-components-from-scratch) -- [Running Tracing E2E tests](#running-tracing-e2e-tests) -- [Updating journalctl](#updating-journalctl) + - [Release packages](#release-packages) ## How to release @@ -22,252 +15,112 @@ Check if the Sumo internal e2e tests are passing. -### Update Changelog and upgrading guide +### Determine the Workflow Run ID to release -Update the [CHANGELOG.md][changelog] by running `make update-changelog VERSION=x.x.x-sumo-x`. +We can begin the process of creating a release once QE has given a thumbs up for +a given package version. We can determine the Workflow Run ID to use for a +release using the following steps: -Make sure the [upgrading.md][upgrading] file has entries for the breaking changes for this release. +#### Find the package build number -### Create and push Git tag +Each package has a build number and it's included in the package version & +filename. For example, if the package version that QE validates is 0.108.0-1790 +then the build number is 1790. -In order to release a new version of Sumo OT distro you'd export `TAG` env variable -and create a tag and push it. +#### Find the collector workflow run -This can be done using `add-tag` and `push-tag` `make` targets which will handle -that for you as well as pushing tags for all the plugins in this repo so that -they can be imported from other repositories. +Each package uses binaries built from this repository. We can find the workflow +used to build the binaries by tracing our way back from the package build number. -```shell -export TAG=v0.75.0-sumo-0 -make add-tag push-tag -``` - -> **NOTE**: -> -> [Release build CI job][release_job] -> is additionally using the `prepare-tag` `make` target in order to substitute -> the version placeholders in [opentelemetry collector builder config][builder_config] -> so that the versions in the released binary match the repository tag. -> -> If you'd like to build a binary to mimic the release binary you'd have to run -> that yourself like so: -> -> ```shell -> make prepare-tag TAG=$(git describe --tags --abbrev=10 --match "v[0-9]*") -> ``` - -#### Remove tag in case of a failed release job +The build number corresponds directly to the GitHub Run Number for a packaging +workflow run in GitHub Actions. Unfortunately, there does not currently appear to +be a way to reference a workflow run using the run number. Instead, we can use +one of two methods to find the workflow run: -Pushing a new version tag to GitHub starts the [release build](../.github/workflows/release_builds.yml) jobs. +#### Option 1 - Use the `gh` cli tool to find the workflow -If one of these jobs fails for whatever reason (real world example: failing to notarize the MacOS binary), -you might need to remove the created tags, perhaps change something, and create the tags again. +```shell +BUILD_NUMBER="1790" +gh run list -R sumologic/sumologic-otel-collector-packaging -s success \ +-w build_packages.yml -L 200 -b main --json displayTitle,number,url \ +-q ".[] | select(.number == ${BUILD_NUMBER})" +``` -To delete the tags both locally and remotely, run the following commands: +This will output a number of fields, for example: -```shell -export TAG=v0.75.0-sumo-0 -make delete-tag delete-remote-tag +```json +{ + "displayTitle": "Build for Remote Workflow: 11672946742, Version: 0.108.0-sumo-1\n", + "number": 1790, + "url": "https://github.com/SumoLogic/sumologic-otel-collector-packaging/actions/runs/11673248730" +} ``` -### Publish GitHub release +We need the number to the right of `Build for Remote Workflow`. This number is +the ID of the workflow run that built the binaries used in the package. -The GitHub release is created as draft by the [create-release](../.github/workflows/release_builds.yml) GitHub Action. +#### Option 2 - Search the GitHub website manually -After the release draft is created, go to [GitHub releases](https://github.com/SumoLogic/sumologic-otel-collector/releases), -edit the release draft and fill in missing information: +Manually search for the run number on the +[Build packages workflow][build_workflow] page. Search for the build number +(e.g. 1790) until you find the corresponding workflow. -- Specify versions for upstream OT core and contrib releases -- Copy and paste the Changelog entry for this release from [CHANGELOG.md][changelog] +![Finding the packaging workflow run][release_0] -After verifying that the release text and all links are good, publish the release. +Once you've found the packaging workflow run, we need the number to the right of +`Build for Remote Workflow`. This number is +the ID of the workflow run that built the binaries used in the package. -### Build packages +![Finding the collector workflow ID][release_1] -1. Go to the releases section of the [sumologic-otel-collector-packaging repository][package_releases]. +### Trigger the release -2. Find the draft release for the new version. After verifying that the release text and all links are good, publish the release. +Now that we have the Workflow Run ID we can trigger a release. There are two +methods of doing this. -## Updating OT to next version +#### Option 1 - Use the `gh` cli tool to trigger the release -Here are the steps to update OT to next version: +A release can be triggered by using the following command: -1. Update the version number where necessary -1. Verify that Sumo OT distro builds correctly -1. Fix lint and test errors -1. Add missing upstream components -1. Ensure all [milestone] tasks and issues have been done +```shell +# Be sure to replace this with workflow ID from the previous step +WORKFLOW_ID=11672946742 +gh workflow run releases.yml -R sumologic/sumologic-otel-collector -f workflow_id=${WORKFLOW_ID} +``` -[milestone]: https://github.com/SumoLogic/sumologic-otel-collector/milestones +#### Option 2 - Use the GitHub website to trigger the release -### Update OT version +Navigate to the [Publish release][releases_workflow] workflow in GitHub Actions. +Find and click the `Run workflow` button on the right-hand side of the page. +Fill in the Workflow Run ID from the previous step and then click the green +`Run workflow` button. -Take note of the [core][otcore_releases] and [contrib][otcontrib_releases] versions you want to update to. -They are often the same version (e.g. v0.77.0), -but for some releases, these versions are different (e.g. v0.76.1/v0.76.3 or v0.78.2/v0.78.0). +![Triggering a release][release_2] -Run: +### Publish GitHub release -```shell -make update-ot OT_CORE_NEW=x.x.x OT_CONTRIB_NEW=y.y.y -``` +The GitHub release is created as draft by the +[releases](../.github/workflows/releases.yml) GitHub Action. -This make target also builds the Sumo OT distro binary to check that there are no build errors. +After the release draft is created, go to [GitHub releases](https://github.com/SumoLogic/sumologic-otel-collector/releases), +edit the release draft and fill in missing information: -### Fix lint errors and tests +- Specify versions for upstream OT core and contrib releases +- Copy and paste the Changelog entry for this release from [CHANGELOG.md][changelog] -Run: +After verifying that the release text and all links are good, publish the release. -```shell -make golint -make gotest -``` +### Release packages -### Check out the developer changelog - -Contrib maintains a [separate changelog][otelcol_api_changelog] for distribution maintainers and component authors. -Check this for any changes that may affect our components or distribution. One example of this is increases -to the minimal supported Go version. - -### Add missing upstream components - -We include all of the components from the following list which are at least in *alpha* stability level: - -- [OpenTelemetry Collector][otelcol_components] extensions, receivers, processors, connectors -- [OpenTelemetry Collector Contrib][otelcol_contrib_components] extensions, receivers, processors, connectors - -Additionally, the following components are supported: - -- [logstransformprocessor] -- [windowseventlogreceiver] -- [db_storage][dbstorage] -- [docker_observer][dockerobserver] -- [ecs_observer][ecsobserver] -- [ecs_task_observer][ecstaskobserver] - -As a fourth step, please check [OpenTelemetry Collector][otcore_releases] and [OpenTelemetry Collector Contrib][otcontrib_releases] -release pages for new components and update [builder configuration][builder_config] and [README.md] if they are any. -New exporters should not be added without a reason. -Please consider example pull request: [#604] - -#### Adding components from scratch - -This shouldn't be required as long as list of components is regularly updated, -but in case you want to generate full list of components, the following instruction can be helpful: - -1. [update builder configuration][builder_config] - You can use the following snippet inside [OpenTelemetry Contrib repository][otc_repository] - in order to get list of components: - - ```bash - export TAG=vx.y.z - git fetch --all - git checkout "${TAG}" - for dir in receiver processor extension; do - echo "###############${dir}s###############" - for file in $(ls "${dir}"); do - echo " - gomod: \"github.com/open-telemetry/opentelemetry-collector-contrib/${dir}/${file} ${TAG}\""; - done; - done; - ``` - -1. Run `make build` in order to generate updated components file (`otelcolbuilder/cmd/components.go`) -1. Update markdown table: - - 1. Prepare `local/receiver.txt`, `local/exporter.txt`, `local/extension.txt` and `local/processor.txt` - in [OpenTelemetry Contrib repository][otc_repository] based on components file. - Example content of `local/extension.txt`: - - ```text - sumologicextension.NewFactory(), - ballastextension.NewFactory(), - zpagesextension.NewFactory(), - asapauthextension.NewFactory(), - awsproxy.NewFactory(), - basicauthextension.NewFactory(), - bearertokenauthextension.NewFactory(), - fluentbitextension.NewFactory(), - healthcheckextension.NewFactory(), - httpforwarderextension.NewFactory(), - jaegerremotesampling.NewFactory(), - oauth2clientauthextension.NewFactory(), - dockerobserver.NewFactory(), - ecsobserver.NewFactory(), - ecstaskobserver.NewFactory(), - hostobserver.NewFactory(), - k8sobserver.NewFactory(), - oidcauthextension.NewFactory(), - pprofextension.NewFactory(), - sigv4authextension.NewFactory(), - filestorage.NewFactory(), - dbstorage.NewFactory(), - ``` - - 1. Run the following snippet in order to prepare markdown links for [README.md]: - - ```bash - for kind in extension processor receiver exporter; do - echo "#####${kind}#####" - for component in $(cat local/${kind}.txt | sed "s/\..*//g"); do - export dir=$(find ${kind} -name "${component}"); - NAME=$(grep -oRP '(?<=typeStr\s)(.*?)=(.*?)"(.*?)"' "${dir}" | grep -oP '\w+"$' | sed 's/"//g'); - echo "[${NAME}][${component}]"; - done 2>/dev/null - done - ``` - - 1. Copy and fix the output - 1. Copy fixed output to spreadsheet. Every component in separate column as in [README.md]. - 1. Sort components and add placeholder to empty rows. - Placeholders make it easier to format table as markdown in next steps. - 1. Copy table into text editor with support for regexp replacement. - 1. Prepare table in markdown format. We recommend to use regexp replacement. - 1. Prepare links for the table. You can use regexp replacement in order to generate it - 1. Carefully analyse `git diff` and fix unwanted changes. - -## Running Tracing E2E tests - -We currently have some legacy E2E tests ported from [our OT fork][ot_fork], which serve as a means of -verifying feature parity for tracing as we migrate it to this distribution. The tests -are run by CircleCI on demand for `main` and release branches, and are defined [here][tracing_tests]. - -In order to run the tests, go to the [CircleCI page][circleci], choose the branch you want, and manually -approve the workflow to run. Note that you need commiter rights in this repository to run the tests. - -![Approving the workflow in CircleCI][circleci_approve] - -## Updating journalctl - -Journalctl is dependency for [journaldreceiver]. In order to update it, please update debian version in Dockerfile files. -Please see available [debian versions][debian_versions]. - -```bash -export DEBIAN_VERSION=11.3 -make update-journalctl -``` +The docs for triggering a package release can be found in the +[Packaging Release docs][release_packaging] in the +[sumologic-otel-collector-packaging][packaging_repo] repository. -[builder_config]: ../otelcolbuilder/.otelcol-builder.yaml -[release_job]: ../.github/workflows/release_builds.yml -[ot_fork]: https://github.com/SumoLogic/opentelemetry-collector-contrib -[tracing_tests]: ../.circleci/config.yml -[circleci]: https://app.circleci.com/pipelines/github/SumoLogic/sumologic-otel-collector -[circleci_approve]: ../images/circleci_approve_workflow.png [changelog]: ../CHANGELOG.md -[upgrading]: ./upgrading.md -[journaldreceiver]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/receiver/journaldreceiver -[debian_versions]: https://hub.docker.com/_/debian/?tab=description -[otelcol_components]: https://github.com/open-telemetry/opentelemetry-collector-releases/blob/main/distributions/otelcol/manifest.yaml -[otelcol_contrib_components]: https://github.com/open-telemetry/opentelemetry-collector-releases/blob/main/distributions/otelcol-contrib/manifest.yaml -[otc_repository]: https://github.com/open-telemetry/opentelemetry-collector-contrib -[otelcol_api_changelog]: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CHANGELOG-API.md -[readme.md]: ../README.md -[#604]: https://github.com/SumoLogic/sumologic-otel-collector/pull/604/files -[otcontrib_releases]: https://github.com/open-telemetry/opentelemetry-collector-contrib/releases -[otcore_releases]: https://github.com/open-telemetry/opentelemetry-collector/releases -[windowseventlogreceiver]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/receiver/windowseventlogreceiver -[logstransformprocessor]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/processor/logstransformprocessor -[dbstorage]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/extension/storage/dbstorage -[dockerobserver]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/extension/observer/dockerobserver -[ecsobserver]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/extension/observer/ecsobserver -[ecstaskobserver]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.75.0/extension/observer/ecstaskobserver -[package_releases]: https://github.com/SumoLogic/sumologic-otel-collector-packaging/releases +[build_workflow]: https://github.com/SumoLogic/sumologic-otel-collector-packaging/actions/workflows/build_packages.yml?query=branch%3Amain +[releases_workflow]: https://github.com/SumoLogic/sumologic-otel-collector/actions/workflows/releases.yml +[release_packaging]: https://github.com/SumoLogic/sumologic-otel-collector-packaging/blob/main/docs/release.md +[packaging_repo]: https://github.com/SumoLogic/sumologic-otel-collector-packaging +[release_0]: ../images/release_0.png +[release_1]: ../images/release_1.png +[release_2]: ../images/release_2.png diff --git a/docs/testing.md b/docs/testing.md new file mode 100644 index 0000000000..4960d27041 --- /dev/null +++ b/docs/testing.md @@ -0,0 +1,19 @@ +# Testing + +## Running Tracing E2E tests + +We currently have some legacy E2E tests ported from [our OT fork][ot_fork], +which serve as a means of verifying feature parity for tracing as we migrate it +to this distribution. The tests are run by CircleCI on demand for `main` and +release branches, and are defined [here][tracing_tests]. + +In order to run the tests, go to the [CircleCI page][circleci], choose the branch +you want, and manually approve the workflow to run. Note that you need commiter +rights in this repository to run the tests. + +![Approving the workflow in CircleCI][circleci_approve] + +[circleci]: https://app.circleci.com/pipelines/github/SumoLogic/sumologic-otel-collector +[circleci_approve]: ../images/circleci_approve_workflow.png +[ot_fork]: https://github.com/SumoLogic/opentelemetry-collector-contrib +[tracing_tests]: ../.circleci/config.yml diff --git a/images/release_0.png b/images/release_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2847d3ecd1fcc48e3fe1311482d5b050c058cbb5 GIT binary patch literal 42381 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 DIhTs` literal 0 HcmV?d00001 diff --git a/images/release_1.png b/images/release_1.png new file mode 100644 index 0000000000000000000000000000000000000000..25be2eabd858e91d385dfb0d850f0182282fed46 GIT binary patch literal 39955 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 literal 0 HcmV?d00001 diff --git a/images/release_2.png b/images/release_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f383dc38df4a40ab981ae38dcdfdf23d176d9e39 GIT binary patch literal 65974 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 D95F>& literal 0 HcmV?d00001 From 6684f65655216430ed54e0aef5566f1cfb91d159 Mon Sep 17 00:00:00 2001 From: Justin Kolberg Date: Mon, 4 Nov 2024 17:28:30 -0800 Subject: [PATCH 3/5] update doc filenames Signed-off-by: Justin Kolberg --- docs/{bump-journalctl.md => update-journalctl.md} | 0 docs/{bump-upstream-version.md => update-upstream-versions.md} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename docs/{bump-journalctl.md => update-journalctl.md} (100%) rename docs/{bump-upstream-version.md => update-upstream-versions.md} (100%) diff --git a/docs/bump-journalctl.md b/docs/update-journalctl.md similarity index 100% rename from docs/bump-journalctl.md rename to docs/update-journalctl.md diff --git a/docs/bump-upstream-version.md b/docs/update-upstream-versions.md similarity index 100% rename from docs/bump-upstream-version.md rename to docs/update-upstream-versions.md From db5b01e247214d40f5f42c606df7e6aedcf0a4d0 Mon Sep 17 00:00:00 2001 From: Justin Kolberg Date: Mon, 4 Nov 2024 19:52:38 -0800 Subject: [PATCH 4/5] retry mac binary signing Signed-off-by: Justin Kolberg --- .github/workflows/workflow-build.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/workflow-build.yml b/.github/workflows/workflow-build.yml index f7584b74eb..11f77d5239 100644 --- a/.github/workflows/workflow-build.yml +++ b/.github/workflows/workflow-build.yml @@ -197,7 +197,10 @@ jobs: env: AC_PASSWORD: ${{ secrets.app_store_connect_password }} working-directory: ./otelcolbuilder/ - run: make ${{ inputs.arch_os }}-sign + run: | + for i in $(seq 1 5); do + make ${{ inputs.arch_os }}-sign && break || sleep 5 + done - name: Sign Windows binary if: runner.os == 'Windows' && env.WINDOWS_SIGNING_ENABLED == 'true' From 594d689e87d2638f11c0efec11848d14d829f7f1 Mon Sep 17 00:00:00 2001 From: Justin Kolberg Date: Tue, 5 Nov 2024 14:23:32 -0800 Subject: [PATCH 5/5] chore(docs): improve instructions Signed-off-by: Justin Kolberg --- .github/workflows/releases.yml | 8 ++++++++ docs/release.md | 29 ++++++++++++++++++++++++----- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 515a979c58..6f018813e5 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -279,6 +279,14 @@ jobs: # to the most recent release here. The script has since been moved to the packaging repository. # It is kept here for backwards compatibility. Once the download count for this artifact # reaches 0 for new releases, this can be removed. + # + # TODO: This pulls the latest install scripts from the main branch of the + # packaging reopsitory. There is a chance that the install scripts attached to + # a collector release will differ from the install scripts attached to a + # packaging release. We can either remove install scripts from releases here + # or we should ensure that the install scripts are always automically synced + # to this repository and use the install scripts from the HEAD SHA of the + # collector workflow run specified for a release. install-script: name: Store install script runs-on: ubuntu-latest diff --git a/docs/release.md b/docs/release.md index db64266269..95d078e274 100644 --- a/docs/release.md +++ b/docs/release.md @@ -39,8 +39,11 @@ one of two methods to find the workflow run: #### Option 1 - Use the `gh` cli tool to find the workflow +Run the following command (be sure to replace `BUILD_NUMBER` with the build +number of the package): + ```shell -BUILD_NUMBER="1790" +PAGER=""; BUILD_NUMBER="1790"; \ gh run list -R sumologic/sumologic-otel-collector-packaging -s success \ -w build_packages.yml -L 200 -b main --json displayTitle,number,url \ -q ".[] | select(.number == ${BUILD_NUMBER})" @@ -59,6 +62,21 @@ This will output a number of fields, for example: We need the number to the right of `Build for Remote Workflow`. This number is the ID of the workflow run that built the binaries used in the package. +The workflow run can be viewed by first running: + +```shell +PAGER=""; WORKFLOW_ID="11672946742"; \ +gh run list -R sumologic/sumologic-otel-collector -s success \ +-w dev_builds.yml -L 200 -b main --json displayTitle,databaseId,url \ +-q ".[] | select(.databaseId == ${WORKFLOW_ID})" +``` + +Which will output the URL of the workflow run: + +```text +https://github.com/SumoLogic/sumologic-otel-collector/actions/runs/11672946742 +``` + #### Option 2 - Search the GitHub website manually Manually search for the run number on the @@ -80,12 +98,13 @@ methods of doing this. #### Option 1 - Use the `gh` cli tool to trigger the release -A release can be triggered by using the following command: +A release can be triggered by using the following command (be sure to replace +`WORKFLOW_ID` with the Workflow Run ID from the previous step): ```shell -# Be sure to replace this with workflow ID from the previous step -WORKFLOW_ID=11672946742 -gh workflow run releases.yml -R sumologic/sumologic-otel-collector -f workflow_id=${WORKFLOW_ID} +PAGER=""; WORKFLOW_ID="11672946742"; \ +gh workflow run releases.yml -R sumologic/sumologic-otel-collector \ +-f workflow_id=${WORKFLOW_ID} ``` #### Option 2 - Use the GitHub website to trigger the release