diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index e342a140b76..00000000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-version: 2
-updates:
- - package-ecosystem: 'npm'
- directory: '/'
- schedule:
- interval: daily
- allow:
- - dependency-name: '@spinnaker/kayenta'
- - dependency-name: '@spinnaker/styleguide'
- - dependency-name: '@spinnaker/presentation'
- # Maintain dependencies for GitHub Actions
- - package-ecosystem: "github-actions"
- directory: "/"
- schedule:
- interval: "monthly"
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
deleted file mode 100644
index 8e223f1e370..00000000000
--- a/.github/workflows/build.yml
+++ /dev/null
@@ -1,99 +0,0 @@
-name: Branch Build
-
-on:
- push:
- branches:
- - master
- - release-*
-
-env:
- GRADLE_OPTS: -Dorg.gradle.daemon=false -Xmx2g -Xms2g
- CONTAINER_REGISTRY: us-docker.pkg.dev/spinnaker-community/docker
- NODE_VERSION: 12.16.0
-
-permissions:
- contents: read
-
-jobs:
- branch-build:
- # Only run this on repositories in the 'spinnaker' org, not on forks.
- if: startsWith(github.repository, 'spinnaker/')
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- with:
- fetch-depth: 0
-
- - name: Set up QEMU
- uses: docker/setup-qemu-action@v2
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v2
- - uses: actions/setup-node@v1
- with:
- node-version: ${{ env.NODE_VERSION }}
-
- - name: Get yarn cache
- id: yarn-cache
- run: echo "::set-output name=dir::$(yarn cache dir)"
-
- - uses: actions/cache@v1
- with:
- path: ${{ steps.yarn-cache.outputs.dir }}
- key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-yarn-
-
- - uses: actions/setup-java@v2
- with:
- java-version: 11
- distribution: 'zulu'
- cache: 'gradle'
-
- - name: Prepare build variables
- id: build_variables
- run: |
- echo ::set-output name=REPO::${GITHUB_REPOSITORY##*/}
- echo ::set-output name=VERSION::"$(git describe --tags --abbrev=0 --match="v[0-9]*" | cut -c2-)-dev-${GITHUB_REF_NAME}-$(git rev-parse --short HEAD)-$(date --utc +'%Y%m%d%H%M')"
-
- - name: Build
- env:
- ORG_GRADLE_PROJECT_version: ${{ steps.build_variables.outputs.VERSION }}
- run: ./gradlew build --stacktrace
-
- - name: Login to GAR
- # Only run this on repositories in the 'spinnaker' org, not on forks.
- if: startsWith(github.repository, 'spinnaker/')
- uses: docker/login-action@v1
- # use service account flow defined at: https://github.com/docker/login-action#service-account-based-authentication-1
- with:
- registry: us-docker.pkg.dev
- username: _json_key
- password: ${{ secrets.GAR_JSON_KEY }}
-
- - name: Build and publish slim container image
- # Only run this on repositories in the 'spinnaker' org, not on forks.
- if: startsWith(github.repository, 'spinnaker/')
- uses: docker/build-push-action@v3
- with:
- context: .
- file: Dockerfile.slim
- platforms: linux/amd64,linux/arm64
- push: true
- tags: |
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ github.ref_name }}-latest-unvalidated"
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ steps.build_variables.outputs.VERSION }}-unvalidated"
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ github.ref_name }}-latest-unvalidated-slim"
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ steps.build_variables.outputs.VERSION }}-unvalidated-slim"
-
- - name: Build and publish ubuntu container image
- # Only run this on repositories in the 'spinnaker' org, not on forks.
- if: startsWith(github.repository, 'spinnaker/')
- uses: docker/build-push-action@v3
- with:
- context: .
- file: Dockerfile.ubuntu
- platforms: linux/amd64,linux/arm64
- push: true
- tags: |
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ github.ref_name }}-latest-unvalidated-ubuntu"
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ steps.build_variables.outputs.VERSION }}-unvalidated-ubuntu"
diff --git a/.github/workflows/deck-oes.yml b/.github/workflows/deck-oes.yml
index b53ecf3f9a4..8bb474fa3a7 100644
--- a/.github/workflows/deck-oes.yml
+++ b/.github/workflows/deck-oes.yml
@@ -4,7 +4,7 @@ on:
workflow_call:
push:
branches:
- - OES-1.30.1
+ - OES-1.33.x
env:
GRADLE_OPTS: -Dorg.gradle.daemon=false -Xmx6g -Xms6g
@@ -29,8 +29,8 @@ jobs:
id: build_variables
run: |
echo ::set-output name=REPO::ubi8-deck-cve
- #echo ::set-output name=VERSION::"1.30.1$(date --utc +'%Y%m%d')"
- echo ::set-output name=VERSION::"1.30.1"
+ #echo ::set-output name=VERSION::"1.33.x$(date --utc +'%Y%m%d')"
+ echo ::set-output name=VERSION::"1.33.x"
echo "::set-output name=GITHASH::$(git rev-parse --short HEAD)"
echo "::set-output name=BUILDDATE::$(date -u +"%Y%m%d%H%M")"
- name: Login to Quay
diff --git a/.github/workflows/package-bump-pr.yml b/.github/workflows/package-bump-pr.yml
deleted file mode 100644
index add66d84e12..00000000000
--- a/.github/workflows/package-bump-pr.yml
+++ /dev/null
@@ -1,118 +0,0 @@
-name: Create package bump PR
-
-concurrency:
- group: create-package-bump-pr
- cancel-in-progress: true
-
-on:
- push:
- branches:
- - 'master'
- tags:
- - '@spinnaker/*'
-
-env:
- NODE_VERSION: 12.16.0
-
-jobs:
- build:
- # Only run this on repositories in the 'spinnaker' org, not on forks.
- if: startsWith(github.repository, 'spinnaker/')
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- with:
- fetch-depth: 0
- ref: master
-
- - name: git - configure commit user
- run: |
- git config user.name spinnakerbot
- git config user.email spinnakerbot@spinnaker.io
- git checkout master
-
- - uses: actions/setup-node@v1
- with:
- node-version: ${{ env.NODE_VERSION }}
-
- - name: yarn - get cache dir
- id: yarn-cache
- run: echo "::set-output name=dir::$(yarn cache dir)"
-
- - uses: actions/cache@v1
- with:
- path: ${{ steps.yarn-cache.outputs.dir }}
- key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-yarn-
-
- - name: yarn - Install Dependencies
- run: yarn --frozen-lockfile
-
- - name: lerna - Bump packages
- id: lerna_bump
- run: |
- scripts/gha_bump_packages.sh
- env:
- COMMIT_SHA: ${{ github.sha }}
- - name: gha - get bumped packages
- id: bumps
- run: |
- scripts/gha_output_bumped_packages.sh
- scripts/gha_output_changelog.sh
- env:
- PACKAGE_BUMP_COMMIT_HASH: ${{ steps.lerna_bump.outputs.packageBumpCommitHash }}
- PEERDEP_BUMP_COMMIT_HASH: ${{ steps.lerna_bump.outputs.peerdepBumpCommitHash }}
- - name: Create Pull Request
- id: createpullrequest
- uses: peter-evans/create-pull-request@v3
- with:
- token: '${{ secrets.SPINNAKERBOT_PERSONAL_ACCESS_TOKEN }}'
- commit-message: 'chore(package): Publish ${{ steps.bumps.outputs.bumps }}'
- title: 'Publish packages to NPM'
- labels: publish
- body: |
- ### This PR bumps the version(s) of all Deck package(s) that have unpublished changes.
-
- ${{ steps.bumps.outputs.changelog }}
-
- ---
-
- This PR bumps each package to the next semver version (patch/minor/major) based on the commit messages of unpublished changes using [Conventional Commits](https://conventionalcommits.org).
-
- - fix: patch release
- - feat: minor release
- - BREAKING CHANGE: major release
-
- It also updates dependency versions in other packages in the monorepo which depend on the bumped package(s).
-
- After this PR is merged, Github Actions will publish any bumped packages to the NPM registry.
-
- _Auto-generated by `.github/workflows/package-bump-pr.yml`_
-
- - name: Close package bump due to no changes
- if: ${{ steps.lerna_bump.outputs.packageBumpCommitHash == '' && steps.createpullrequest.outputs.pull-request-number != '' }}
- uses: actions/github-script@0.9.0
- with:
- github-token: '${{ secrets.SPINNAKERBOT_PERSONAL_ACCESS_TOKEN }}'
- script: |
- const { owner, repo } = context.repo;
- const pull_number = ${{ steps.createpullrequest.outputs.pull-request-number }};
- await github.pulls.update({ owner, repo, pull_number, state: 'closed' });
-
- - name: Approve package bump
- if: ${{ steps.lerna_bump.outputs.packageBumpCommitHash != '' && steps.createpullrequest.outputs.pull-request-number != '' }}
- uses: actions/github-script@0.9.0
- with:
- github-token: '${{ secrets.SPINNAKERBOT_TOKEN }}'
- script: |
- const { owner, repo } = context.repo;
- const pull_number = ${{ steps.createpullrequest.outputs.pull-request-number }};
- const users = ['spinnakerbot', 'spinnakerbot2'];
-
- const reviews = await github.pulls.listReviews({ owner, repo, pull_number });
- const approved = reviews.data.some((review) => users.includes(review.user.login) && review.state == 'APPROVED');
-
- if (!approved) {
- await github.pulls.createReview({ owner, repo, pull_number, event: 'APPROVE' });
- }
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
deleted file mode 100644
index 068486d6bae..00000000000
--- a/.github/workflows/pr.yml
+++ /dev/null
@@ -1,77 +0,0 @@
-name: PR Build
-
-on: [ pull_request ]
-
-env:
- GRADLE_OPTS: -Dorg.gradle.daemon=false -Xmx2g -Xms2g
- CONTAINER_REGISTRY: us-docker.pkg.dev/spinnaker-community/docker
- NODE_VERSION: 12.16.0
-
-permissions:
- contents: read
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- with:
- fetch-depth: 0
-
- - name: Set up QEMU
- uses: docker/setup-qemu-action@v2
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v2
- - uses: actions/setup-node@v1
- with:
- node-version: ${{ env.NODE_VERSION }}
-
- - name: Get yarn cache
- id: yarn-cache
- run: echo "::set-output name=dir::$(yarn cache dir)"
-
- - uses: actions/cache@v1
- with:
- path: ${{ steps.yarn-cache.outputs.dir }}
- key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-yarn-
-
- - uses: actions/setup-java@v2
- with:
- java-version: 11
- distribution: 'zulu'
- cache: 'gradle'
-
- - name: Prepare build variables
- id: build_variables
- run: |
- echo ::set-output name=REPO::${GITHUB_REPOSITORY##*/}
- echo ::set-output name=VERSION::"$(git describe --tags --abbrev=0 --match="v[0-9]*" | cut -c2-)-dev-pr-$(git rev-parse --short HEAD)-$(date --utc +'%Y%m%d%H%M')"
-
- - name: Build
- env:
- ORG_GRADLE_PROJECT_version: ${{ steps.build_variables.outputs.VERSION }}
- run: ./gradlew build
-
- - name: Build slim container image
- uses: docker/build-push-action@v3
- with:
- context: .
- file: Dockerfile.slim
- platforms: linux/amd64,linux/arm64
- tags: |
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:latest"
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ steps.build_variables.outputs.VERSION }}"
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:latest-slim"
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ steps.build_variables.outputs.VERSION }}-slim"
-
- - name: Build ubuntu container image
- uses: docker/build-push-action@v3
- with:
- context: .
- file: Dockerfile.ubuntu
- platforms: linux/amd64,linux/arm64
- tags: |
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:latest-ubuntu"
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ steps.build_variables.outputs.VERSION }}-ubuntu"
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index d734c9a0718..e79fcc03523 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -3,12 +3,12 @@ name: Publish packages to NPM
on:
push:
branches:
- - 'master'
+ - 'OES-1.33.x'
paths:
- 'packages/*/package.json'
env:
- NODE_VERSION: 12.16.0
+ NODE_VERSION: 14.21.3
permissions:
contents: read
@@ -20,12 +20,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
with:
fetch-depth: 0
token: '${{ secrets.SPINNAKERBOT_PERSONAL_ACCESS_TOKEN }}'
- - uses: actions/setup-node@v1
+ - uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
deleted file mode 100644
index 628b8c68e2e..00000000000
--- a/.github/workflows/release.yml
+++ /dev/null
@@ -1,139 +0,0 @@
-name: Release
-
-on:
- push:
- tags:
- - "v[0-9]+.[0-9]+.[0-9]+"
- - "v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+"
-
-env:
- GRADLE_OPTS: -Dorg.gradle.daemon=false -Xmx2g -Xms2g
- CONTAINER_REGISTRY: us-docker.pkg.dev/spinnaker-community/docker
- NODE_VERSION: 12.16.0
-
-jobs:
- release:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- with:
- fetch-depth: 0
-
- - name: Set up QEMU
- uses: docker/setup-qemu-action@v2
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v2
- - uses: actions/setup-node@v1
- with:
- node-version: ${{ env.NODE_VERSION }}
-
- - name: Get yarn cache
- id: yarn-cache
- run: echo "::set-output name=dir::$(yarn cache dir)"
-
- - uses: actions/cache@v1
- with:
- path: ${{ steps.yarn-cache.outputs.dir }}
- key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-yarn-
-
- - uses: actions/setup-java@v2
- with:
- java-version: 11
- distribution: 'zulu'
- cache: 'gradle'
- - name: Assemble release info
- id: release_info
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: |
- . .github/workflows/release_info.sh ${{ github.event.repository.full_name }}
- echo ::set-output name=CHANGELOG::$(echo -e "${CHANGELOG}")
- echo ::set-output name=SKIP_RELEASE::${SKIP_RELEASE}
- echo ::set-output name=IS_CANDIDATE::${IS_CANDIDATE}
- echo ::set-output name=RELEASE_VERSION::${RELEASE_VERSION}
- - name: Prepare build variables
- id: build_variables
- run: |
- echo ::set-output name=REPO::${GITHUB_REPOSITORY##*/}
- echo ::set-output name=VERSION::"$(git rev-parse --short HEAD)-$(date --utc +'%Y%m%d%H%M')"
- - name: Release build
- env:
- ORG_GRADLE_PROJECT_version: ${{ steps.release_info.outputs.RELEASE_VERSION }}
- ORG_GRADLE_PROJECT_nexusPublishEnabled: true
- ORG_GRADLE_PROJECT_nexusUsername: ${{ secrets.NEXUS_USERNAME }}
- ORG_GRADLE_PROJECT_nexusPassword: ${{ secrets.NEXUS_PASSWORD }}
- ORG_GRADLE_PROJECT_nexusPgpSigningKey: ${{ secrets.NEXUS_PGP_SIGNING_KEY }}
- ORG_GRADLE_PROJECT_nexusPgpSigningPassword: ${{ secrets.NEXUS_PGP_SIGNING_PASSWORD }}
- run: |
- ./gradlew --info build
- - name: Publish apt packages to Google Artifact Registry
- env:
- ORG_GRADLE_PROJECT_version: ${{ steps.release_info.outputs.RELEASE_VERSION }}
- ORG_GRADLE_PROJECT_artifactRegistryPublishEnabled: true
- GAR_JSON_KEY: ${{ secrets.GAR_JSON_KEY }}
- run: |
- ./gradlew --info publishDebToArtifactRegistry
- - name: Login to Google Cloud
- # Only run this on repositories in the 'spinnaker' org, not on forks.
- if: startsWith(github.repository, 'spinnaker/')
- uses: 'google-github-actions/auth@v0'
- # use service account flow defined at: https://github.com/google-github-actions/upload-cloud-storage#authenticating-via-service-account-key-json
- with:
- credentials_json: '${{ secrets.GAR_JSON_KEY }}'
- - name: Upload halconfig profiles to GCS
- # https://console.cloud.google.com/storage/browser/halconfig
- # Only run this on repositories in the 'spinnaker' org, not on forks.
- if: startsWith(github.repository, 'spinnaker/')
- uses: 'google-github-actions/upload-cloud-storage@v0'
- with:
- path: 'halconfig/'
- destination: 'halconfig/${{ steps.build_variables.outputs.REPO }}/${{ steps.release_info.outputs.RELEASE_VERSION }}'
- parent: false
- - name: Login to GAR
- # Only run this on repositories in the 'spinnaker' org, not on forks.
- if: startsWith(github.repository, 'spinnaker/')
- uses: docker/login-action@v1
- # use service account flow defined at: https://github.com/docker/login-action#service-account-based-authentication-1
- with:
- registry: us-docker.pkg.dev
- username: _json_key
- password: ${{ secrets.GAR_JSON_KEY }}
- - name: Build and publish slim container image
- # Only run this on repositories in the 'spinnaker' org, not on forks.
- if: startsWith(github.repository, 'spinnaker/')
- uses: docker/build-push-action@v3
- with:
- context: .
- file: Dockerfile.slim
- platforms: linux/amd64,linux/arm64
- push: true
- tags: |
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ steps.release_info.outputs.RELEASE_VERSION }}-unvalidated"
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ steps.release_info.outputs.RELEASE_VERSION }}-unvalidated-slim"
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ steps.release_info.outputs.RELEASE_VERSION }}-${{ steps.build_variables.outputs.VERSION }}-unvalidated-slim"
- - name: Build and publish ubuntu container image
- # Only run this on repositories in the 'spinnaker' org, not on forks.
- if: startsWith(github.repository, 'spinnaker/')
- uses: docker/build-push-action@v3
- with:
- context: .
- file: Dockerfile.ubuntu
- platforms: linux/amd64,linux/arm64
- push: true
- tags: |
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ steps.release_info.outputs.RELEASE_VERSION }}-unvalidated-ubuntu"
- "${{ env.CONTAINER_REGISTRY }}/${{ steps.build_variables.outputs.REPO }}:${{ steps.release_info.outputs.RELEASE_VERSION }}-${{ steps.build_variables.outputs.VERSION }}-unvalidated-ubuntu"
- - name: Create release
- if: steps.release_info.outputs.SKIP_RELEASE == 'false'
- uses: actions/create-release@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- tag_name: ${{ github.ref }}
- release_name: ${{ github.event.repository.name }} ${{ github.ref }}
- body: |
- ${{ steps.release_info.outputs.CHANGELOG }}
- draft: false
- prerelease: ${{ steps.release_info.outputs.IS_CANDIDATE }}
diff --git a/Dockerfile.compile b/Dockerfile.compile
index 4094234f44a..1b12714ff41 100644
--- a/Dockerfile.compile
+++ b/Dockerfile.compile
@@ -1,4 +1,6 @@
-FROM openjdk:11-slim
+FROM alpine:3.18
+RUN apk add --update \
+ openjdk17-jre-headless \
RUN apt-get update && apt-get install -y \
git
diff --git a/Dockerfile.ubuntu b/Dockerfile.ubuntu
index 9ed2c2c5aab..d4f16122192 100644
--- a/Dockerfile.ubuntu
+++ b/Dockerfile.ubuntu
@@ -1,4 +1,4 @@
-FROM ubuntu:bionic
+FROM ubuntu:jammy
LABEL maintainer="sig-platform@spinnaker.io"
WORKDIR /opt/deck
diff --git a/docker/ports.conf.gen b/docker/ports.conf.gen
index c933beca13b..a9eee73e0b9 100644
--- a/docker/ports.conf.gen
+++ b/docker/ports.conf.gen
@@ -2,4 +2,7 @@ Listen {%DECK_HOST%}:{%DECK_PORT%}
SSLPassPhraseDialog exec:/etc/apache2/passphrase
-
\ No newline at end of file
+
+
+ServerSignature Off
+ServerTokens Prod
diff --git a/gradle.properties b/gradle.properties
index 68ead1f18b5..46932294d9e 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1 +1 @@
-spinnakerGradleVersion=8.25.0
+spinnakerGradleVersion=8.32.1
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 490fda8577d..943f0cbfa75 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index a4b4429748d..508322917bd 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
+networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index 2fe81a7d95e..65dcd68d65c 100755
--- a/gradlew
+++ b/gradlew
@@ -1,7 +1,7 @@
-#!/usr/bin/env sh
+#!/bin/sh
#
-# Copyright 2015 the original author or authors.
+# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,78 +17,113 @@
#
##############################################################################
-##
-## Gradle start up script for UN*X
-##
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
##############################################################################
# Attempt to set APP_HOME
+
# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
warn () {
echo "$*"
-}
+} >&2
die () {
echo
echo "$*"
echo
exit 1
-}
+} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
+ JAVACMD=$JAVA_HOME/jre/sh/java
else
- JAVACMD="$JAVA_HOME/bin/java"
+ JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -97,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
- JAVACMD="java"
+ JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -105,79 +140,105 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
fi
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
-if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
# Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
fi
- i=`expr $i + 1`
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
done
- case $i in
- 0) set -- ;;
- 1) set -- "$args0" ;;
- 2) set -- "$args0" "$args1" ;;
- 3) set -- "$args0" "$args1" "$args2" ;;
- 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
fi
-# Escape application args
-save () {
- for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
- echo " "
-}
-APP_ARGS=`save "$@"`
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index 62bd9b9ccef..93e3f59f135 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
-@if "%DEBUG%" == "" @echo off
+@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,7 +25,8 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -54,7 +55,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -64,38 +65,26 @@ echo location of your Java installation.
goto fail
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
+if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
diff --git a/package.json b/package.json
index 189c3f8b7bf..7e441d25c02 100644
--- a/package.json
+++ b/package.json
@@ -11,8 +11,8 @@
"registry": "http://artifacts.netflix.com/api/npm/npm-local"
},
"engines": {
- "node": ">=12.16.0",
- "npm": ">=6.13.4",
+ "node": ">=14.21.3",
+ "npm": ">=6.14.18",
"yarn": ">=1.21.1"
},
"private": true,
diff --git a/packages/amazon/CHANGELOG.md b/packages/amazon/CHANGELOG.md
index f4ca39fdf2a..d2fb5d58a09 100644
--- a/packages/amazon/CHANGELOG.md
+++ b/packages/amazon/CHANGELOG.md
@@ -3,6 +3,51 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.14.3](https://github.com/spinnaker/deck/compare/@spinnaker/amazon@0.14.2...@spinnaker/amazon@0.14.3) (2023-12-07)
+
+
+### Bug Fixes
+
+* **amazon:** Allow scaling bounds to use floats between input steps ([#10059](https://github.com/spinnaker/deck/issues/10059)) ([5c1ebfd](https://github.com/spinnaker/deck/commit/5c1ebfdf924e73aa6877943cb008c216177b8256))
+* **lambda:** available Runtimes shared between Deploy stage and Functions tab ([#10050](https://github.com/spinnaker/deck/issues/10050)) ([889d769](https://github.com/spinnaker/deck/commit/889d769c600e298917ec2471cd88a4bdd808ed91))
+
+
+
+
+
+## [0.14.2](https://github.com/spinnaker/deck/compare/@spinnaker/amazon@0.14.1...@spinnaker/amazon@0.14.2) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.14.1](https://github.com/spinnaker/deck/compare/@spinnaker/amazon@0.14.0...@spinnaker/amazon@0.14.1) (2023-09-06)
+
+
+### Bug Fixes
+
+* Scaling bounds should parse float not int ([#10026](https://github.com/spinnaker/deck/issues/10026)) ([b763cae](https://github.com/spinnaker/deck/commit/b763cae826039df46b8dbe019689316ff5034e33))
+
+
+
+
+
+# [0.14.0](https://github.com/spinnaker/deck/compare/@spinnaker/amazon@0.13.9...@spinnaker/amazon@0.14.0) (2023-07-20)
+
+
+### Features
+
+* **lambda:** Migrate Lambda plugin to OSS ([#9988](https://github.com/spinnaker/deck/issues/9988)) ([11f1cab](https://github.com/spinnaker/deck/commit/11f1cabb8efe8d7e034faf06ae3cb455eef6369a)), closes [#9984](https://github.com/spinnaker/deck/issues/9984)
+
+
+
+
+
## [0.13.9](https://github.com/spinnaker/deck/compare/@spinnaker/amazon@0.13.8...@spinnaker/amazon@0.13.9) (2023-06-02)
**Note:** Version bump only for package @spinnaker/amazon
diff --git a/packages/amazon/package.json b/packages/amazon/package.json
index 7449b0f61e9..ff267f3aca8 100644
--- a/packages/amazon/package.json
+++ b/packages/amazon/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/amazon",
"license": "Apache-2.0",
- "version": "0.13.9",
+ "version": "0.14.3",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,7 +16,7 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/core": "^0.24.1",
+ "@spinnaker/core": "^0.28.0",
"@uirouter/angularjs": "1.0.26",
"@uirouter/core": "6.0.8",
"@uirouter/react": "1.0.7",
@@ -39,9 +42,9 @@
"rxjs": "6.6.7"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
+ "@spinnaker/eslint-plugin": "^3.0.2",
"@spinnaker/mocks": "1.0.7",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"@types/angular-ui-bootstrap": "0.13.41",
"@types/classnames": "2.2.0",
diff --git a/packages/amazon/src/aws.module.ts b/packages/amazon/src/aws.module.ts
index a23f9b89274..d06b6dc7c21 100644
--- a/packages/amazon/src/aws.module.ts
+++ b/packages/amazon/src/aws.module.ts
@@ -6,9 +6,9 @@ import { AWSProviderSettings } from './aws.settings';
import { COMMON_MODULE } from './common/common.module';
import './deploymentStrategy/rollingPush.strategy';
import { AmazonFunctionDetails } from './function';
-import { CreateLambdaFunction } from './function/CreateLambdaFunction';
+import { CreateLambdaFunction } from './function';
+import { AwsFunctionTransformer } from './function';
import { AWS_FUNCTION_MODULE } from './function/function.module';
-import { AwsFunctionTransformer } from './function/function.transformer';
import './help/amazon.help';
import { AwsImageReader } from './image';
import { AMAZON_INSTANCE_AWSINSTANCETYPE_SERVICE } from './instance/awsInstanceType.service';
@@ -18,11 +18,11 @@ import { INSTANCE_DNS_COMPONENT } from './instance/details/instanceDns.component
import { INSTANCE_SECURITY_GROUPS_COMPONENT } from './instance/details/instanceSecurityGroups.component';
import { INSTANCE_STATUS_COMPONENT } from './instance/details/instanceStatus.component';
import { INSTANCE_TAGS_COMPONENT } from './instance/details/instanceTags.component';
-import { AmazonLoadBalancerClusterContainer } from './loadBalancer/AmazonLoadBalancerClusterContainer';
-import { AmazonLoadBalancersTag } from './loadBalancer/AmazonLoadBalancersTag';
-import { AmazonLoadBalancerChoiceModal } from './loadBalancer/configure/AmazonLoadBalancerChoiceModal';
+import { AmazonLoadBalancerClusterContainer } from './loadBalancer';
+import { AmazonLoadBalancersTag } from './loadBalancer';
+import { AmazonLoadBalancerChoiceModal } from './loadBalancer';
+import { AwsLoadBalancerTransformer } from './loadBalancer';
import { AWS_LOAD_BALANCER_MODULE } from './loadBalancer/loadBalancer.module';
-import { AwsLoadBalancerTransformer } from './loadBalancer/loadBalancer.transformer';
import amazonLogo from './logo/amazon.logo.svg';
import { AMAZON_PIPELINE_STAGES_BAKE_AWSBAKESTAGE } from './pipeline/stages/bake/awsBakeStage';
import { AMAZON_PIPELINE_STAGES_CLONESERVERGROUP_AWSCLONESERVERGROUPSTAGE } from './pipeline/stages/cloneServerGroup/awsCloneServerGroupStage';
diff --git a/packages/amazon/src/aws.validators.ts b/packages/amazon/src/aws.validators.ts
index b899f616862..f0abed132f1 100644
--- a/packages/amazon/src/aws.validators.ts
+++ b/packages/amazon/src/aws.validators.ts
@@ -1,7 +1,7 @@
import { isEmpty } from 'lodash';
export const iamRoleValidator = (value: string, label: string) => {
- const isIAMRole = value.match(/^arn:aws:iam::\d{12}:role\/?\/[a-zA-Z_0-9+=,.@\-_/]+/);
+ const isIAMRole = value.match(/^arn:aws:iam::\d{12}:role\/?\/[a-zA-Z_0-9+=,.@\-/]+/);
return isIAMRole
? undefined
: `Invalid role. ${label} must match regular expression: arn:aws:iam::d{12}:role/?[a-zA-Z_0-9+=,.@-_/]+`;
@@ -9,10 +9,9 @@ export const iamRoleValidator = (value: string, label: string) => {
export const s3BucketNameValidator = (value: string, label: string) => {
const s3BucketName = value.match(/^[0-9A-Za-z.-]*[^.]$/);
- const err = s3BucketName
+ return s3BucketName
? undefined
: `Invalid S3 Bucket name. ${label} must match regular expression: [0-9A-Za-z.-]*[^.]$`;
- return err;
};
export const awsArnValidator = (value: string, label: string) => {
@@ -25,3 +24,8 @@ export const awsArnValidator = (value: string, label: string) => {
export const awsTagsValidator = (value: string | { [key: string]: string }, label: string) => {
return isEmpty(value) ? `At least one ${label} is required` : undefined;
};
+
+export const simpleStringValidator = (value: string, label: string) => {
+ const simpleString = value.match(/^[0-9A-Za-z]*$/);
+ return simpleString ? undefined : `Invalid String Value. ${label} must match regular expression: [0-9A-Za-z]`;
+};
diff --git a/packages/amazon/src/function/configure/FunctionBasicInformation.tsx b/packages/amazon/src/function/configure/FunctionBasicInformation.tsx
index 545eee601e1..fe965b026b8 100644
--- a/packages/amazon/src/function/configure/FunctionBasicInformation.tsx
+++ b/packages/amazon/src/function/configure/FunctionBasicInformation.tsx
@@ -19,22 +19,7 @@ import { s3BucketNameValidator } from '../../aws.validators';
import type { IAmazonFunction } from '../../domain';
import type { IAmazonFunctionUpsertCommand } from '../../index';
-const availableRuntimes = [
- 'nodejs10.x',
- 'nodejs12.x',
- 'java8',
- 'java11',
- 'python2.7',
- 'python3.6',
- 'python3.7',
- 'python3.8',
- 'dotnetcore2.1',
- 'dotnetcore3.1',
- 'go1.x',
- 'ruby2.5',
- 'ruby2.7',
- 'provided',
-];
+import { availableRuntimes } from '../../pipeline/stages/deployLambda/components/function.constants';
export interface IFunctionProps {
app: Application;
diff --git a/packages/amazon/src/pipeline/stages/deleteLambda/DeleteLambdaFunctionStageForm.tsx b/packages/amazon/src/pipeline/stages/deleteLambda/DeleteLambdaFunctionStageForm.tsx
new file mode 100644
index 00000000000..2e3bfe43111
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deleteLambda/DeleteLambdaFunctionStageForm.tsx
@@ -0,0 +1,143 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type {
+ IAccount,
+ IAccountDetails,
+ IFormikStageConfigInjectedProps,
+ IFormInputProps,
+ IFunction,
+ IRegion,
+} from '@spinnaker/core';
+import { AccountService, FormikFormField, HelpField, NumberInput, ReactSelectInput, useData } from '@spinnaker/core';
+
+import { DeleteVersionList, DeleteVersionPicker } from './constants';
+import type { IAmazonFunctionSourceData } from '../../../domain';
+
+export function DeleteLambdaFunctionStageForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+ const { functions } = props.application;
+
+ const { result: fetchAccountsResult, status: fetchAccountsStatus } = useData(
+ () => AccountService.listAccounts('aws'),
+ [],
+ [],
+ );
+
+ const onAccountChange = (fieldName: string, fieldValue: any): void => {
+ props.formik.setFieldValue('region', null);
+ props.formik.setFieldValue('functionName', null);
+
+ props.formik.setFieldValue(fieldName, fieldValue);
+ };
+
+ const onRegionChange = (fieldName: string, fieldValue: any): void => {
+ props.formik.setFieldValue('functionName', null);
+
+ props.formik.setFieldValue(fieldName, fieldValue);
+ };
+
+ const availableFunctions =
+ values.account && values.region
+ ? functions.data
+ .filter((f: IFunction) => f.account === values.account)
+ .filter((f: IFunction) => f.region === values.region)
+ .map((f: IFunction) => f.functionName)
+ : [];
+
+ return (
+
+ (
+ acc.name)}
+ />
+ )}
+ />
+ (
+ acc.name === values.account)
+ .flatMap((acc: IAccountDetails) => acc.regions)
+ .map((reg: IRegion) => reg.name)}
+ />
+ )}
+ />
+ (
+
+ )}
+ />
+ (
+ (
+
+ )}
+ />
+ )}
+ />
+ {values.version === '$PROVIDED' ? (
+ (
+ f.account === values.account)
+ .filter((f: IAmazonFunctionSourceData) => f.region === values.region)
+ .filter((f: IAmazonFunctionSourceData) => f.functionName === values.functionName)
+ .flatMap((f: IAmazonFunctionSourceData) =>
+ Object.values(f.revisions).sort(function (a: number, b: number) {
+ return b - a;
+ }),
+ )
+ .filter((r: any) => r !== '$LATEST')}
+ />
+ )}
+ />
+ ) : null}
+ {values.version === '$MOVING' ? (
+ }
+ label="Prior Versions to Retain"
+ input={(props) => }
+ />
+ ) : null}
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/deleteLambda/LambdaDeleteStage.tsx b/packages/amazon/src/pipeline/stages/deleteLambda/LambdaDeleteStage.tsx
new file mode 100644
index 00000000000..ffd2476074e
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deleteLambda/LambdaDeleteStage.tsx
@@ -0,0 +1,86 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type {
+ IExecutionDetailsSectionProps,
+ IFormikStageConfigInjectedProps,
+ IStage,
+ IStageConfigProps,
+ IStageTypeConfig,
+} from '@spinnaker/core';
+import {
+ ExecutionDetailsSection,
+ ExecutionDetailsTasks,
+ FormikStageConfig,
+ FormValidator,
+ HelpContentsRegistry,
+ StageFailureMessage,
+} from '@spinnaker/core';
+
+import { DeleteLambdaFunctionStageForm } from './DeleteLambdaFunctionStageForm';
+
+export function DeleteLambdaExecutionDetails(props: IExecutionDetailsSectionProps) {
+ const { stage, name, current } = props;
+ return (
+
+
+
+
+ {' '}
+ Status: {stage.outputs.deleteTask === 'done' ? 'COMPLETE' : stage.outputs.deleteTask}{' '}
+
+
+ {' '}
+ Deleted Version: {' '}
+ {stage.outputs['deleteTask:deleteVersion'] ? stage.outputs['deleteTask:deleteVersion'] : 'N/A'}{' '}
+
+
+
+ );
+}
+
+function DeleteLambdaConfig(props: IStageConfigProps) {
+ return (
+
+ }
+ />
+
+ );
+}
+
+export const initialize = () => {
+ HelpContentsRegistry.register('aws.lambdaDeploymentStage.lambda', 'Lambda Name');
+};
+
+function validate(stageConfig: IStage) {
+ const validator = new FormValidator(stageConfig);
+ validator.field('account', 'Account Name').required();
+
+ validator.field('region', 'Region').required();
+
+ validator.field('functionName', 'Lambda Function Name').required();
+
+ validator.field('version', 'Lambda Function Version').required();
+
+ return validator.validateForm();
+}
+
+// eslint-disable-next-line
+export namespace DeleteLambdaExecutionDetails {
+ export const title = 'Delete Lambda Stage';
+}
+
+export const lambdaDeleteStage: IStageTypeConfig = {
+ key: 'Aws.LambdaDeleteStage',
+ label: `AWS Lambda Delete`,
+ description: 'Delete an AWS Lambda Function',
+ component: DeleteLambdaConfig, // stage config
+ executionDetailsSections: [DeleteLambdaExecutionDetails, ExecutionDetailsTasks],
+ validateFn: validate,
+};
diff --git a/packages/amazon/src/pipeline/stages/deleteLambda/constants/deleteVersion.constants.ts b/packages/amazon/src/pipeline/stages/deleteLambda/constants/deleteVersion.constants.ts
new file mode 100644
index 00000000000..d172309f67c
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deleteLambda/constants/deleteVersion.constants.ts
@@ -0,0 +1,37 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+export interface IDeleteVersionConstant {
+ description: string;
+ label: string;
+ value: string;
+}
+
+export const DeleteVersionList: IDeleteVersionConstant[] = [
+ {
+ label: 'Newest Function Version',
+ value: '$LATEST',
+ description: 'Delete the most recently deployed function version when this stage starts.',
+ },
+ {
+ label: 'Previous Function Version',
+ value: '$PREVIOUS',
+ description: 'Delete the second-most recently deployed function version when this stage starts.',
+ },
+ {
+ label: 'Older Than N',
+ value: '$MOVING',
+ description: 'Delete all version but the N most recent versions.',
+ },
+ {
+ label: 'Provide Version Number',
+ value: '$PROVIDED',
+ description: 'Provide a specific version number to delete.',
+ },
+ {
+ label: 'All Function Versions',
+ value: '$ALL',
+ description:
+ 'Delete all function versions and function infrastructure. This will completely delete the Lambda function.',
+ },
+];
diff --git a/packages/amazon/src/pipeline/stages/deleteLambda/constants/deleteVersion.picker.tsx b/packages/amazon/src/pipeline/stages/deleteLambda/constants/deleteVersion.picker.tsx
new file mode 100644
index 00000000000..cd48464ed70
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deleteLambda/constants/deleteVersion.picker.tsx
@@ -0,0 +1,47 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IFormikStageConfigInjectedProps } from '@spinnaker/core';
+
+import type { IDeleteVersionConstant } from './deleteVersion.constants';
+import { DeleteVersionList } from './deleteVersion.constants';
+
+export interface IVersionPickerProps {
+ config: IFormikStageConfigInjectedProps;
+ value: string;
+ showingDetails: boolean;
+}
+
+export interface IVersionPickerState {
+ value: string;
+ label: string;
+ description: string;
+}
+
+export class DeleteVersionPicker extends React.Component {
+ constructor(props: IVersionPickerProps) {
+ super(props);
+
+ const { value } = this.props;
+
+ const versionDetails = DeleteVersionList.filter((v: IDeleteVersionConstant) => v.value === value)[0];
+
+ this.state = {
+ label: versionDetails.label,
+ value: versionDetails.value,
+ description: versionDetails.description,
+ };
+ }
+
+ public render() {
+ return (
+
+ {this.state.label}
+
+ {this.state.description}
+
+ );
+ }
+}
diff --git a/packages/amazon/src/pipeline/stages/deleteLambda/constants/index.ts b/packages/amazon/src/pipeline/stages/deleteLambda/constants/index.ts
new file mode 100644
index 00000000000..d63b1fe90f7
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deleteLambda/constants/index.ts
@@ -0,0 +1,5 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+export * from './deleteVersion.constants';
+export * from './deleteVersion.picker';
diff --git a/packages/amazon/src/pipeline/stages/deleteLambda/index.ts b/packages/amazon/src/pipeline/stages/deleteLambda/index.ts
new file mode 100644
index 00000000000..a2bcdd62906
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deleteLambda/index.ts
@@ -0,0 +1,11 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import { Registry, SETTINGS } from '@spinnaker/core';
+import { lambdaDeleteStage } from './LambdaDeleteStage';
+
+export * from './LambdaDeleteStage';
+
+if (SETTINGS.feature.lambdaAdditionalStages) {
+ Registry.pipeline.registerStage(lambdaDeleteStage);
+}
diff --git a/packages/amazon/src/pipeline/stages/deployCloudFormation/CloudFormationChangeSetInfo.tsx b/packages/amazon/src/pipeline/stages/deployCloudFormation/CloudFormationChangeSetInfo.tsx
index 5a849ad7969..a89f4b0e774 100644
--- a/packages/amazon/src/pipeline/stages/deployCloudFormation/CloudFormationChangeSetInfo.tsx
+++ b/packages/amazon/src/pipeline/stages/deployCloudFormation/CloudFormationChangeSetInfo.tsx
@@ -13,7 +13,7 @@ export interface ICloudFormationChangeSetInfoProps {
export const CloudFormationChangeSetInfo = (props: ICloudFormationChangeSetInfoProps) => {
const { stage, stageconfig } = props;
const [changeSetName, setChangeSetName] = useState(
- (stage as any).changeSetName ? (stage as any).changeSetName : "ChangeSet-${ execution['id']}",
+ (stage as any).changeSetName ? (stage as any).changeSetName : "ChangeSet-${execution['id']}",
);
const [executeChangeSet, setExecuteChangeSet] = useState((stage as any).executeChangeSet);
const [actionOnReplacement, setActionOnReplacement] = useState((stage as any).actionOnReplacement);
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/components/AwsLambdaFunctionStageForm.tsx b/packages/amazon/src/pipeline/stages/deployLambda/components/AwsLambdaFunctionStageForm.tsx
new file mode 100644
index 00000000000..bbe837f855b
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/components/AwsLambdaFunctionStageForm.tsx
@@ -0,0 +1,139 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import classNames from 'classnames';
+import React from 'react';
+import type { Option } from 'react-select';
+
+import type { IFormikStageConfigInjectedProps, IFormInputProps } from '@spinnaker/core';
+import {
+ FormikFormField,
+ HelpField,
+ MapEditorInput,
+ NumberInput,
+ ReactSelectInput,
+ TetheredCreatable,
+ TextInput,
+} from '@spinnaker/core';
+import { NumberConcurrencyInput } from '@spinnaker/core/dist/presentation/forms/inputs/NumberConcurrencyInput';
+
+import { BasicSettingsForm, ExecutionRoleForm, LambdaAtEdgeForm, NetworkForm, TriggerEventsForm } from './index';
+
+export function AwsLambdaFunctionStageForm(props: IFormikStageConfigInjectedProps) {
+ const { values, errors } = props.formik;
+
+ const className = classNames({
+ well: true,
+ 'alert-danger': !!errors.functionName,
+ 'alert-info': !errors.functionName,
+ });
+
+ const onLayerChange = (o: Option, field: any) => {
+ props.formik.setFieldValue(
+ field,
+ o.map((layer: any) => layer.value),
+ );
+ };
+
+ return (
+
+
+ Your function will be named:
+
+ {values.functionName ? values.functionName : props.application.name}
+ null} />
+
+
Basic Settings
+
+
Execution Role
+
+
Environment
+ {values.enableLambdaAtEdge !== true ? (
+ <>
+
}
+ />
+ }
+ input={(props) => }
+ />
+ >
+ ) : (
+ Environment variables not available with Lambda@Edge functions.
+ )}
+ Tags
+ }
+ />
+ Settings
+ } />
+
+ }
+ input={(inputProps: IFormInputProps) => (
+ {
+ onLayerChange(e, 'layers');
+ }}
+ value={values.layers ? values.layers.map((layer: string) => ({ value: layer, label: layer })) : []}
+ />
+ )}
+ />
+
+ }
+ input={(props) => }
+ />
+ }
+ input={(props) => }
+ />
+ }
+ input={(props) => }
+ />
+
+ Network
+ {values.enableLambdaAtEdge !== true ? (
+
+ ) : (
+ VPC configuration not available with Lambda@Edge functions.
+ )}
+ Event Triggers
+
+ Debugging and Error Handling
+ Dead Letter Config
+ }
+ input={(props) => }
+ />
+ X-Ray Tracing
+ }
+ input={(props) => }
+ />
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/components/BasicSettingsForm.tsx b/packages/amazon/src/pipeline/stages/deployLambda/components/BasicSettingsForm.tsx
new file mode 100644
index 00000000000..54249f6a049
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/components/BasicSettingsForm.tsx
@@ -0,0 +1,176 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { Option } from 'react-select';
+
+import type {
+ IAccount,
+ IAccountDetails,
+ IFormikStageConfigInjectedProps,
+ IFormInputProps,
+ IRegion,
+} from '@spinnaker/core';
+import {
+ AccountService,
+ CheckboxInput,
+ FormikFormField,
+ HelpField,
+ NameUtils,
+ ReactSelectInput,
+ TetheredCreatable,
+ TextInput,
+ useData,
+} from '@spinnaker/core';
+
+import { availableRuntimes, lambdaHelpFields } from './function.constants';
+
+export function BasicSettingsForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+
+ const setFunctionName = () => {
+ const ns = NameUtils.getClusterName(props.application.name, values.stackName, values.detailName);
+ const fn = values.functionUid;
+
+ props.formik.setFieldValue('functionName', `${ns}-${fn}`);
+ };
+
+ const onAliasChange = (o: Option, field: any) => {
+ props.formik.setFieldValue(
+ field,
+ o.map((layer: any) => layer.value),
+ );
+ };
+
+ const onRegionChange = (fieldValue: string) => {
+ props.formik.setFieldValue('enableLambdaAtEdge', false);
+ props.formik.setFieldValue('region', fieldValue);
+ };
+
+ const onFunctionUidChange = (fieldValue: string) => {
+ props.formik.setFieldValue('functionUid', fieldValue);
+ setFunctionName();
+ };
+
+ const onStackNameChange = (fieldValue: string) => {
+ props.formik.setFieldValue('stackName', fieldValue);
+ setFunctionName();
+ };
+
+ const onDetailChange = (fieldValue: string) => {
+ props.formik.setFieldValue('detailName', fieldValue);
+ setFunctionName();
+ };
+
+ const { result: fetchAccountsResult, status: fetchAccountsStatus } = useData(
+ () => AccountService.listAccounts('aws'),
+ [],
+ [],
+ );
+
+ return (
+
+ (
+ acc.name)}
+ />
+ )}
+ />
+ (
+ acc.name === values.account)
+ .flatMap((acc: IAccountDetails) => acc.regions)
+ .map((reg: IRegion) => reg.name)}
+ />
+ )}
+ />
+
+ }
+ input={(props) => }
+ />
+
+ }
+ onChange={onStackNameChange}
+ input={(props) => }
+ />
+ }
+ onChange={onDetailChange}
+ input={(props) => }
+ />
+
+ }
+ input={(inputProps: IFormInputProps) => (
+ {
+ onAliasChange(e, 'aliases');
+ }}
+ value={values.aliases ? values.aliases.map((alias: string) => ({ value: alias, label: alias })) : []}
+ />
+ )}
+ />
+ }
+ input={(props) => }
+ />
+ }
+ input={(props) => }
+ />
+ }
+ input={(props) => }
+ />
+ }
+ input={(props) => }
+ />
+ }
+ input={(props) => }
+ />
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/components/EnvironmentForm.tsx b/packages/amazon/src/pipeline/stages/deployLambda/components/EnvironmentForm.tsx
new file mode 100644
index 00000000000..b78fa583dec
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/components/EnvironmentForm.tsx
@@ -0,0 +1,24 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import { FormikFormField, HelpField, MapEditorInput, TextInput } from '@spinnaker/core';
+
+export function ExecutionRoleForm() {
+ return (
+
+ }
+ />
+ }
+ input={(props) => }
+ />
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/components/ExecutionRoleForm.tsx b/packages/amazon/src/pipeline/stages/deployLambda/components/ExecutionRoleForm.tsx
new file mode 100644
index 00000000000..7e12b3ab0d0
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/components/ExecutionRoleForm.tsx
@@ -0,0 +1,15 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+import React from 'react';
+
+import { FormikFormField, TextInput } from '@spinnaker/core';
+
+export function ExecutionRoleForm() {
+ return (
+ }
+ />
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/components/LambdaAtEdgeForm.tsx b/packages/amazon/src/pipeline/stages/deployLambda/components/LambdaAtEdgeForm.tsx
new file mode 100644
index 00000000000..f3b27c56766
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/components/LambdaAtEdgeForm.tsx
@@ -0,0 +1,28 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IFormikStageConfigInjectedProps } from '@spinnaker/core';
+import { CheckboxInput, FormikFormField, HelpField } from '@spinnaker/core';
+
+const helpFieldContent = {
+ lambdaAtEdge:
+ 'Validate AWS Lambda function configuration against Lambda@Edge requirements. This will not enable Lambda@Edge on this function. ',
+};
+export function LambdaAtEdgeForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+ if (values.region !== 'us-east-1') {
+ return Lambda@Edge is only available in region us-east-1.
;
+ }
+ return (
+
+ }
+ input={(props) => }
+ />
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/components/NetworkForm.tsx b/packages/amazon/src/pipeline/stages/deployLambda/components/NetworkForm.tsx
new file mode 100644
index 00000000000..f034c565737
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/components/NetworkForm.tsx
@@ -0,0 +1,123 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import { uniqBy } from 'lodash';
+import React from 'react';
+import type { Option } from 'react-select';
+
+import type { IFormikStageConfigInjectedProps, IFormInputProps, ISecurityGroup, ISubnet, IVpc } from '@spinnaker/core';
+import {
+ FormikFormField,
+ NetworkReader,
+ ReactInjector,
+ ReactSelectInput,
+ SubnetReader,
+ TetheredSelect,
+ useData,
+} from '@spinnaker/core';
+
+const toSubnetOption = (value: ISubnet): Option => {
+ return { value: value.id, label: value.id };
+};
+
+export function NetworkForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+
+ const onChangeVpc = (vpcs: any) => {
+ props.formik.setFieldValue('securityGroupIds', null);
+ props.formik.setFieldValue('subnetIds', null);
+ props.formik.setFieldValue('vpcId', vpcs.target.value);
+ };
+
+ const onChangeSubnet = (subnets: any) => {
+ const subnetsSelected = subnets.map((o: any) => o.value);
+ props.formik.setFieldValue('subnetIds', subnetsSelected);
+ };
+
+ const onChangeSG = (sgs: any) => {
+ const sgsSelected = sgs.map((o: any) => o.value);
+ props.formik.setFieldValue('securityGroupIds', sgsSelected);
+ };
+
+ const { result: fetchVpcsResult, status: fetchVpcsStatus } = useData(
+ () => NetworkReader.listNetworksByProvider('aws'),
+ [],
+ [],
+ );
+
+ const { result: fetchSubnetsResult } = useData(() => SubnetReader.listSubnetsByProvider('aws'), [], []);
+
+ const { result: fetchSGsResult } = useData(
+ () => ReactInjector.securityGroupReader.getAllSecurityGroups(),
+ undefined,
+ [],
+ );
+
+ const availableVpcs =
+ values.account && values.region && fetchVpcsStatus !== 'PENDING'
+ ? fetchVpcsResult
+ .filter((v: IVpc) => v.deprecated === false)
+ .filter((v: IVpc) => v.account === values.account)
+ .filter((v: IVpc) => v.region === values.region)
+ .map((v: IVpc) => v.id)
+ : [];
+
+ const dedupedSubnets = uniqBy(
+ fetchSubnetsResult.filter((s: ISubnet) => s.vpcId === values.vpcId),
+ 'id',
+ );
+
+ const availableSGs =
+ values.account && values.region && values.vpcId
+ ? fetchSGsResult[values.account]['aws'][values.region]
+ .filter((sg: ISecurityGroup) => sg.vpcId === values.vpcId)
+ .map((sg: ISecurityGroup) => ({ value: sg.id, label: sg.name }))
+ : [];
+
+ return (
+
+
(
+
+ )}
+ />
+
+
+ Subnets
+
+ {dedupedSubnets.length === 0 ? (
+
No subnets found in the selected account/region/VPC
+ ) : (
+
+ toSubnetOption(s))}
+ value={values.subnetIds}
+ onChange={onChangeSubnet}
+ />
+
+ )}
+
+
+
+ Security Groups
+
+ {availableSGs.length === 0 ? (
+
No security groups found in the selected account/region/VPC
+ ) : (
+
+
+
+ )}
+
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/components/TriggerEventsForm.tsx b/packages/amazon/src/pipeline/stages/deployLambda/components/TriggerEventsForm.tsx
new file mode 100644
index 00000000000..440bcd684e8
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/components/TriggerEventsForm.tsx
@@ -0,0 +1,49 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { Option } from 'react-select';
+
+import type { IFormikStageConfigInjectedProps, IFormInputProps } from '@spinnaker/core';
+import { FormikFormField, HelpField, NumberInput, TetheredCreatable } from '@spinnaker/core';
+
+export function TriggerEventsForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+
+ const onChange = (o: Option, field: any) => {
+ props.formik.setFieldValue(
+ field,
+ o.map((arn: any) => arn.value),
+ );
+ };
+
+ return (
+
+
+ }
+ input={(inputProps: IFormInputProps) => (
+ {
+ onChange(e, 'triggerArns');
+ }}
+ value={values.triggerArns ? values.triggerArns.map((arn: string) => ({ value: arn, label: arn })) : []}
+ />
+ )}
+ />
+
+ }
+ />
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/components/function.constants.ts b/packages/amazon/src/pipeline/stages/deployLambda/components/function.constants.ts
new file mode 100644
index 00000000000..5b517b8e91c
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/components/function.constants.ts
@@ -0,0 +1,32 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+// https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html
+export const availableRuntimes = [
+ 'nodejs12.x',
+ 'nodejs14.x',
+ 'nodejs16.x',
+ 'nodejs18.x',
+ 'java8',
+ 'java8.al2',
+ 'java11',
+ 'java17',
+ 'python3.7',
+ 'python3.8',
+ 'python3.9',
+ 'python3.10',
+ 'dotnetcore3.1',
+ 'dotnet7',
+ 'dotnet6',
+ 'dotnet5.0',
+ 'go1.x',
+ 'ruby2.7',
+ 'provided',
+ 'provided.al2',
+];
+
+export const lambdaHelpFields = {
+ stack:
+ '(Optional) Stack is naming components of a function, used to create vertical stacks of dependent services for integration testing.',
+ detail:
+ '(Optional) Detail is a string of free-form alphanumeric characters to describe any other variables in naming a function.',
+};
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/components/index.ts b/packages/amazon/src/pipeline/stages/deployLambda/components/index.ts
new file mode 100644
index 00000000000..72391e4eabe
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/components/index.ts
@@ -0,0 +1,8 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+export * from './BasicSettingsForm';
+export * from './NetworkForm';
+export * from './ExecutionRoleForm';
+export * from './TriggerEventsForm';
+export * from './LambdaAtEdgeForm';
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/config/LambdaDeploymentStage.tsx b/packages/amazon/src/pipeline/stages/deployLambda/config/LambdaDeploymentStage.tsx
new file mode 100644
index 00000000000..a99f031cb62
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/config/LambdaDeploymentStage.tsx
@@ -0,0 +1,20 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+import type { IStageTypeConfig } from '@spinnaker/core';
+import { ExecutionDetailsTasks, HelpContentsRegistry } from '@spinnaker/core';
+
+import { LambdaDeploymentConfig, validate } from './LambdaDeploymentStageConfig';
+import { LambdaDeploymentExecutionDetails } from './LambdaDeploymentStageExecutionDetails';
+
+export const initialize = () => {
+ HelpContentsRegistry.register('aws.lambdaDeploymentStage.lambda', 'Lambda Name');
+};
+
+export const lambdaDeploymentStage: IStageTypeConfig = {
+ key: 'Aws.LambdaDeploymentStage',
+ label: `AWS Lambda Deployment`,
+ description: 'Create a Single AWS Lambda Function',
+ component: LambdaDeploymentConfig, // stage config
+ executionDetailsSections: [LambdaDeploymentExecutionDetails, ExecutionDetailsTasks],
+ validateFn: validate,
+};
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/config/LambdaDeploymentStageConfig.tsx b/packages/amazon/src/pipeline/stages/deployLambda/config/LambdaDeploymentStageConfig.tsx
new file mode 100644
index 00000000000..5cedb70e6c2
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/config/LambdaDeploymentStageConfig.tsx
@@ -0,0 +1,64 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+import React from 'react';
+
+import type { IFormikStageConfigInjectedProps, IStage, IStageConfigProps } from '@spinnaker/core';
+import { FormikStageConfig, FormValidator } from '@spinnaker/core';
+
+import { upsertDefaults } from './UpsertDefaults';
+import {
+ awsArnValidator,
+ iamRoleValidator,
+ s3BucketNameValidator,
+ simpleStringValidator,
+} from '../../../../aws.validators';
+import { AwsLambdaFunctionStageForm } from '../components/AwsLambdaFunctionStageForm';
+import { constructNewAwsFunctionTemplate } from './function.defaults';
+
+export function LambdaDeploymentConfig(props: IStageConfigProps) {
+ const defaultFunction = constructNewAwsFunctionTemplate();
+
+ return (
+
+ );
+}
+
+export function validate(stageConfig: IStage) {
+ const validator = new FormValidator(stageConfig);
+
+ validator.field('runtime', 'Runtime').required();
+ validator.field('s3key', 'S3 Object Key').required();
+ validator.field('handler', 'Handler').required();
+ validator.field('functionUid', 'Function Name').required();
+
+ validator.field('stackName', 'Stack Name').optional().withValidators(simpleStringValidator);
+
+ validator.field('detailName', 'Detail Name').optional().withValidators(simpleStringValidator);
+
+ validator.field('s3bucket', 'S3 Bucket Name').required().withValidators(s3BucketNameValidator);
+
+ validator.field('role', 'Role ARN').required().withValidators(iamRoleValidator);
+
+ validator
+ .field('triggerArns', 'Trigger ARNs')
+ .optional()
+ .withValidators((value: any, _: string) => {
+ const tmp: any[] = value.map((arn: string) => {
+ return awsArnValidator(arn, arn);
+ });
+ const ret: boolean = tmp.every((el) => el === undefined);
+ return ret
+ ? undefined
+ : 'Invalid ARN. Event ARN must match regular expression: /^arn:aws[a-zA-Z-]?:[a-zA-Z_0-9.-]+:./';
+ });
+
+ return validator.validateForm();
+}
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/config/LambdaDeploymentStageExecutionDetails.tsx b/packages/amazon/src/pipeline/stages/deployLambda/config/LambdaDeploymentStageExecutionDetails.tsx
new file mode 100644
index 00000000000..72b7be6acac
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/config/LambdaDeploymentStageExecutionDetails.tsx
@@ -0,0 +1,31 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IExecutionDetailsSectionProps } from '@spinnaker/core';
+import { ExecutionDetailsSection, StageFailureMessage } from '@spinnaker/core';
+
+export function LambdaDeploymentExecutionDetails(props: IExecutionDetailsSectionProps) {
+ const { stage, current, name } = props;
+ return (
+
+
+
+
+ {' '}
+ Function Name: {stage.outputs.functionName ? stage.outputs.functionName : 'N/A'}{' '}
+
+
+ {' '}
+ Function ARN: {stage.outputs.functionARN ? stage.outputs.functionARN : 'N/A'}{' '}
+
+
+
+ );
+}
+
+// eslint-disable-next-line
+export namespace LambdaDeploymentExecutionDetails {
+ export const title = 'Lambda Deployment Stage';
+}
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/config/UpsertDefaults.tsx b/packages/amazon/src/pipeline/stages/deployLambda/config/UpsertDefaults.tsx
new file mode 100644
index 00000000000..793077b5acb
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/config/UpsertDefaults.tsx
@@ -0,0 +1,21 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+import { isNil, isString } from 'lodash';
+
+function isEmptyString(val: any) {
+ if (isString(val)) {
+ if (isNil(val) || val === '') {
+ return true;
+ }
+ }
+ return false;
+}
+
+export function upsertDefaults(initialValues: any, defaultValues: any) {
+ Object.entries(defaultValues).forEach(([key, value]) => {
+ if (!initialValues[key] && !isEmptyString(value)) {
+ initialValues[key] = value;
+ }
+ });
+ return initialValues;
+}
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/config/function.defaults.ts b/packages/amazon/src/pipeline/stages/deployLambda/config/function.defaults.ts
new file mode 100644
index 00000000000..f18eab6c3ce
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/config/function.defaults.ts
@@ -0,0 +1,39 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+import type { IAmazonFunctionUpsertCommand } from '../../../../domain';
+
+export function constructNewAwsFunctionTemplate(): IAmazonFunctionUpsertCommand {
+ const defaultCredentials = '';
+ const defaultRegion = '';
+ return {
+ role: '',
+ runtime: '',
+ s3key: '',
+ s3bucket: '',
+ handler: '',
+ functionName: '',
+ publish: false,
+ tags: {},
+ memorySize: 128,
+ description: '',
+
+ credentials: defaultCredentials,
+ cloudProvider: 'aws',
+ region: defaultRegion,
+ envVariables: {},
+
+ tracingConfig: {
+ mode: 'PassThrough',
+ },
+ kmskeyArn: '',
+ vpcId: '',
+ subnetIds: [],
+ securityGroupIds: [],
+ timeout: 3,
+ deadLetterConfig: {
+ targetArn: '',
+ },
+ operation: '',
+ targetGroups: '',
+ };
+}
diff --git a/packages/amazon/src/pipeline/stages/deployLambda/index.ts b/packages/amazon/src/pipeline/stages/deployLambda/index.ts
new file mode 100644
index 00000000000..bd78a1dd344
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/deployLambda/index.ts
@@ -0,0 +1,11 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import { Registry, SETTINGS } from '@spinnaker/core';
+import { lambdaDeploymentStage } from './config/LambdaDeploymentStage';
+
+export * from './config/LambdaDeploymentStage';
+
+if (SETTINGS.feature.lambdaAdditionalStages) {
+ Registry.pipeline.registerStage(lambdaDeploymentStage);
+}
diff --git a/packages/amazon/src/pipeline/stages/invokeLambda/InvokeLambdaFunctionStageForm.tsx b/packages/amazon/src/pipeline/stages/invokeLambda/InvokeLambdaFunctionStageForm.tsx
new file mode 100644
index 00000000000..327ed12e26f
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/invokeLambda/InvokeLambdaFunctionStageForm.tsx
@@ -0,0 +1,106 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+import React from 'react';
+
+import type {
+ IAccount,
+ IAccountDetails,
+ IFormikStageConfigInjectedProps,
+ IFormInputProps,
+ IFunction,
+ IRegion,
+} from '@spinnaker/core';
+import { AccountService, FormikFormField, ReactSelectInput, TextInput, useData } from '@spinnaker/core';
+
+import { InvokeLambdaOperation } from './components';
+
+export function InvokeLambdaFunctionStageForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+ const { functions } = props.application;
+
+ const { result: fetchAccountsResult, status: fetchAccountsStatus } = useData(
+ () => AccountService.listAccounts('aws'),
+ [],
+ [],
+ );
+
+ const onAccountChange = (fieldValue: any): void => {
+ props.formik.setFieldValue('region', null);
+ props.formik.setFieldValue('functionName', null);
+
+ props.formik.setFieldValue('account', fieldValue);
+ };
+
+ const onRegionChange = (fieldValue: any): void => {
+ props.formik.setFieldValue('functionName', null);
+ props.formik.setFieldValue('region', fieldValue);
+ };
+
+ const availableFunctions =
+ values.account && values.region
+ ? functions.data
+ .filter((f: IFunction) => f.account === values.account)
+ .filter((f: IFunction) => f.region === values.region)
+ .map((f: IFunction) => f.functionName)
+ : [];
+
+ return (
+
+
Basic Settings
+ (
+ acc.name)}
+ />
+ )}
+ />
+ (
+ acc.name === values.account)
+ .flatMap((acc: IAccountDetails) => acc.regions)
+ .map((reg: IRegion) => reg.name)}
+ />
+ )}
+ />
+ (
+
+ )}
+ />
+
+ }
+ />
+
+ Invoke Settings
+
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/invokeLambda/LambdaInvokeStage.tsx b/packages/amazon/src/pipeline/stages/invokeLambda/LambdaInvokeStage.tsx
new file mode 100644
index 00000000000..45000fe3e48
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/invokeLambda/LambdaInvokeStage.tsx
@@ -0,0 +1,125 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type {
+ IExecutionDetailsSectionProps,
+ IFormikStageConfigInjectedProps,
+ IStage,
+ IStageConfigProps,
+ IStageTypeConfig,
+} from '@spinnaker/core';
+import {
+ ExecutionDetailsSection,
+ ExecutionDetailsTasks,
+ FormikStageConfig,
+ FormValidator,
+ HelpContentsRegistry,
+ StageFailureMessage,
+} from '@spinnaker/core';
+
+import { InvokeLambdaFunctionStageForm } from './InvokeLambdaFunctionStageForm';
+import { awsArnValidator } from '../../../aws.validators';
+
+export function InvokeLambdaExecutionDetails(props: IExecutionDetailsSectionProps) {
+ const { stage } = props;
+
+ return (
+
+
+
+
Function Name: {stage.outputs.functionName ? stage.outputs.functionName : 'N/A'}
+
+ {' '}
+ Deployed Alias:{' '}
+ {stage.outputs['deployment:aliasDeployed'] ? stage.outputs['deployment:aliasDeployed'] : 'N/A'}{' '}
+
+
+ {' '}
+ Deployed Major Version:{' '}
+ {stage.outputs['deployment:majorVersionDeployed']
+ ? stage.outputs['deployment:majorVersionDeployed']
+ : 'N/A'}{' '}
+
+
+
+ );
+}
+
+/*
+ IStageConfigProps defines properties passed to all Spinnaker Stages.
+ See IStageConfigProps.ts (https://github.com/spinnaker/deck/blob/master/app/scripts/modules/core/src/pipeline/config/stages/common/IStageConfigProps.ts) for a complete list of properties.
+ Pass a JSON object to the `updateStageField` method to add the `account` to the Stage.
+
+ This method returns JSX (https://reactjs.org/docs/introducing-jsx.html) that gets displayed in the Spinnaker UI.
+ */
+function InvokeLambdaConfig(props: IStageConfigProps) {
+ return (
+
+ }
+ />
+
+ );
+}
+
+/*
+ This is a contrived example of how to use an `initialize` function to hook into arbitrary Deck services.
+ This `initialize` function provides the help field text for the `LambdaDeploymentConfig` stage form defined above.
+
+ You can hook into any service exported by the `@spinnaker/core` NPM module, e.g.:
+ - CloudProviderRegistry
+ - DeploymentStrategyRegistry
+
+ When you use a registry, you are diving into Deck's implementation to add functionality.
+ These registries and their methods may change without warning.
+*/
+export const initialize = () => {
+ HelpContentsRegistry.register('aws.lambdaDeploymentStage.lambda', 'Lambda Name');
+};
+
+function validate(stageConfig: IStage) {
+ const validator = new FormValidator(stageConfig);
+
+ validator
+ .field('triggerArns', 'Trigger ARNs')
+ .optional()
+ .withValidators((value: any, _: string) => {
+ const tmp: any[] = value.map((arn: string) => {
+ return awsArnValidator(arn, arn);
+ });
+ const ret: boolean = tmp.every((el) => el === undefined);
+ return ret
+ ? undefined
+ : 'Invalid ARN. Event ARN must match regular expression: /^arn:aws[a-zA-Z-]?:[a-zA-Z_0-9.-]+:./';
+ });
+
+ return validator.validateForm();
+}
+
+// eslint-disable-next-line
+export namespace InvokeLambdaExecutionDetails {
+ export const title = 'Invoke Lambda Stage';
+}
+
+/*
+ Define Spinnaker Stages with IStageTypeConfig.
+ Required options: https://github.com/spinnaker/deck/master/app/scripts/modules/core/src/domain/IStageTypeConfig.ts
+ - label -> The name of the Stage
+ - description -> Long form that describes what the Stage actually does
+ - key -> A unique name for the Stage in the UI; ties to Orca backend
+ - component -> The rendered React component
+ - validateFn -> A validation function for the stage config form.
+ */
+export const lambdaInvokeStage: IStageTypeConfig = {
+ key: 'Aws.LambdaInvokeStage',
+ label: `AWS Lambda Invoke`,
+ description: 'Invoke a Lambda function',
+ component: InvokeLambdaConfig, // stage config
+ executionDetailsSections: [InvokeLambdaExecutionDetails, ExecutionDetailsTasks],
+ validateFn: validate,
+};
diff --git a/packages/amazon/src/pipeline/stages/invokeLambda/components/InvokeLambdaOperation.tsx b/packages/amazon/src/pipeline/stages/invokeLambda/components/InvokeLambdaOperation.tsx
new file mode 100644
index 00000000000..d328d53735f
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/invokeLambda/components/InvokeLambdaOperation.tsx
@@ -0,0 +1,77 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IArtifact, IExpectedArtifact, IFormikStageConfigInjectedProps } from '@spinnaker/core';
+import {
+ ArtifactTypePatterns,
+ excludeAllTypesExcept,
+ FormikFormField,
+ NumberInput,
+ StageArtifactSelectorDelegate,
+} from '@spinnaker/core';
+
+export function InvokeLambdaOperation(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+
+ const excludedArtifactTypes = excludeAllTypesExcept(
+ ArtifactTypePatterns.BITBUCKET_FILE,
+ ArtifactTypePatterns.CUSTOM_OBJECT,
+ ArtifactTypePatterns.EMBEDDED_BASE64,
+ ArtifactTypePatterns.GCS_OBJECT,
+ ArtifactTypePatterns.GITHUB_FILE,
+ ArtifactTypePatterns.GITLAB_FILE,
+ ArtifactTypePatterns.S3_OBJECT,
+ ArtifactTypePatterns.HTTP_FILE,
+ );
+
+ const onTemplateArtifactEdited = (artifact: IArtifact, name: string) => {
+ props.formik.setFieldValue(`${name}.id`, null);
+ props.formik.setFieldValue(`${name}.artifact`, artifact);
+ props.formik.setFieldValue(`${name}.account`, artifact.artifactAccount);
+ };
+
+ const onTemplateArtifactSelected = (id: string, name: string) => {
+ props.formik.setFieldValue(`${name}.id`, id);
+ props.formik.setFieldValue(`${name}.artifact`, null);
+ };
+
+ const getInputArtifact = (stage: any, name: string) => {
+ if (!stage[name]) {
+ return {
+ account: '',
+ id: '',
+ };
+ } else {
+ return stage[name];
+ }
+ };
+
+ return (
+
+ } />
+ }
+ />
+
+ {
+ onTemplateArtifactEdited(artifact, 'payloadArtifact');
+ }}
+ helpKey={''}
+ onExpectedArtifactSelected={(artifact: IExpectedArtifact) =>
+ onTemplateArtifactSelected(artifact.id, 'payloadrtifact')
+ }
+ pipeline={props.pipeline}
+ stage={values}
+ />
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/invokeLambda/components/index.ts b/packages/amazon/src/pipeline/stages/invokeLambda/components/index.ts
new file mode 100644
index 00000000000..7843372e5ff
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/invokeLambda/components/index.ts
@@ -0,0 +1,4 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+export * from './InvokeLambdaOperation';
diff --git a/packages/amazon/src/pipeline/stages/invokeLambda/index.ts b/packages/amazon/src/pipeline/stages/invokeLambda/index.ts
new file mode 100644
index 00000000000..5ca923ad4ea
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/invokeLambda/index.ts
@@ -0,0 +1,11 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import { Registry, SETTINGS } from '@spinnaker/core';
+import { lambdaInvokeStage } from './LambdaInvokeStage';
+
+export * from './LambdaInvokeStage';
+
+if (SETTINGS.feature.lambdaAdditionalStages) {
+ Registry.pipeline.registerStage(lambdaInvokeStage);
+}
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/LambdaRouteStage.tsx b/packages/amazon/src/pipeline/stages/routeLambda/LambdaRouteStage.tsx
new file mode 100644
index 00000000000..ba5ad5e0cc3
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/LambdaRouteStage.tsx
@@ -0,0 +1,98 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type {
+ IExecutionDetailsSectionProps,
+ IFormikStageConfigInjectedProps,
+ IStage,
+ IStageConfigProps,
+ IStageTypeConfig,
+} from '@spinnaker/core';
+import {
+ ExecutionDetailsSection,
+ ExecutionDetailsTasks,
+ FormikStageConfig,
+ FormValidator,
+ HelpContentsRegistry,
+ StageFailureMessage,
+} from '@spinnaker/core';
+
+import { RouteLambdaFunctionStageForm } from './RouteLambdaFunctionStageForm';
+import { awsArnValidator } from '../../../aws.validators';
+
+export function RouteLambdaExecutionDetails(props: IExecutionDetailsSectionProps) {
+ const { stage } = props;
+
+ return (
+
+
+
+
Function Name: {stage.outputs.functionName ? stage.outputs.functionName : 'N/A'}
+
+ {' '}
+ Deployed Alias:{' '}
+ {stage.outputs['deployment:aliasDeployed'] ? stage.outputs['deployment:aliasDeployed'] : 'N/A'}{' '}
+
+
+ {' '}
+ Deployed Major Version:{' '}
+ {stage.outputs['deployment:majorVersionDeployed']
+ ? stage.outputs['deployment:majorVersionDeployed']
+ : 'N/A'}{' '}
+
+
+
+ );
+}
+
+function RouteLambdaConfig(props: IStageConfigProps) {
+ return (
+
+ }
+ />
+
+ );
+}
+
+export const initialize = () => {
+ HelpContentsRegistry.register('aws.lambdaDeploymentStage.lambda', 'Lambda Name');
+};
+
+function validate(stageConfig: IStage) {
+ const validator = new FormValidator(stageConfig);
+
+ validator
+ .field('triggerArns', 'Trigger ARNs')
+ .optional()
+ .withValidators((value: any, _: string) => {
+ const tmp: any[] = value.map((arn: string) => {
+ return awsArnValidator(arn, arn);
+ });
+ const ret: boolean = tmp.every((el) => el === undefined);
+ return ret
+ ? undefined
+ : 'Invalid ARN. Event ARN must match regular expression: /^arn:aws[a-zA-Z-]?:[a-zA-Z_0-9.-]+:./';
+ });
+
+ return validator.validateForm();
+}
+
+// eslint-disable-next-line
+export namespace RouteLambdaExecutionDetails {
+ export const title = 'Route Lambda Traffic Stage';
+}
+
+export const lambdaRouteStage: IStageTypeConfig = {
+ key: 'Aws.LambdaTrafficRoutingStage',
+ label: `AWS Lambda Route`,
+ description: 'Route traffic across various versions of your Lambda function',
+ component: RouteLambdaConfig, // stage config
+ executionDetailsSections: [RouteLambdaExecutionDetails, ExecutionDetailsTasks],
+ validateFn: validate,
+};
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/RouteLambdaFunctionStageForm.tsx b/packages/amazon/src/pipeline/stages/routeLambda/RouteLambdaFunctionStageForm.tsx
new file mode 100644
index 00000000000..17f25e76319
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/RouteLambdaFunctionStageForm.tsx
@@ -0,0 +1,151 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+import React from 'react';
+
+import type {
+ IAccount,
+ IAccountDetails,
+ IFormikStageConfigInjectedProps,
+ IFormInputProps,
+ IFunction,
+ IRegion,
+} from '@spinnaker/core';
+import {
+ AccountService,
+ FormikFormField,
+ HelpField,
+ NumberInput,
+ ReactSelectInput,
+ TextInput,
+ useData,
+} from '@spinnaker/core';
+import { NumberConcurrencyInput } from '@spinnaker/core/dist/presentation/forms/inputs/NumberConcurrencyInput';
+
+import { TriggerEventsForm } from './TriggerEventsForm';
+import { DeploymentStrategyForm } from './components';
+import { DeploymentStrategyList, DeploymentStrategyPicker } from './constants';
+
+export function RouteLambdaFunctionStageForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+ const { functions } = props.application;
+
+ const { result: fetchAccountsResult, status: fetchAccountsStatus } = useData(
+ () => AccountService.listAccounts('aws'),
+ [],
+ [],
+ );
+
+ const onAccountChange = (fieldValue: any): void => {
+ props.formik.setFieldValue('region', null);
+ props.formik.setFieldValue('functionName', null);
+
+ props.formik.setFieldValue('account', fieldValue);
+ };
+
+ const onRegionChange = (fieldValue: any): void => {
+ props.formik.setFieldValue('functionName', null);
+ props.formik.setFieldValue('region', fieldValue);
+ };
+
+ const availableFunctions =
+ values.account && values.region
+ ? functions.data
+ .filter((f: IFunction) => f.account === values.account)
+ .filter((f: IFunction) => f.region === values.region)
+ .map((f: IFunction) => f.functionName)
+ : [];
+
+ return (
+
+
Basic Settings
+ (
+ acc.name)}
+ />
+ )}
+ />
+ (
+ acc.name === values.account)
+ .flatMap((acc: IAccountDetails) => acc.regions)
+ .map((reg: IRegion) => reg.name)}
+ />
+ )}
+ />
+ (
+
+ )}
+ />
+
+ }
+ />
+
+ Alias Settings
+
+
+
+ }
+ input={(props) =>
+ values.deploymentStrategy === '$WEIGHTED' ? (
+
+ ) : (
+
+ )
+ }
+ required={false}
+ />
+
+ Deployment Strategy
+ }
+ input={(inputProps: IFormInputProps) => (
+ (
+
+ )}
+ />
+ )}
+ />
+ {values.deploymentStrategy ? : null}
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/TriggerEventsForm.tsx b/packages/amazon/src/pipeline/stages/routeLambda/TriggerEventsForm.tsx
new file mode 100644
index 00000000000..8906f0f1f7b
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/TriggerEventsForm.tsx
@@ -0,0 +1,51 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { Option } from 'react-select';
+
+import type { IFormikStageConfigInjectedProps, IFormInputProps } from '@spinnaker/core';
+import { FormikFormField, HelpField, NumberInput, TetheredCreatable } from '@spinnaker/core';
+
+export function TriggerEventsForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+
+ const onChange = (o: Option, field: any) => {
+ props.formik.setFieldValue(
+ field,
+ o.map((arn: any) => arn.value),
+ );
+ };
+
+ return (
+
+
+ }
+ input={(inputProps: IFormInputProps) => (
+ {
+ onChange(e, 'triggerArns');
+ }}
+ value={values.triggerArns ? values.triggerArns.map((arn: string) => ({ value: arn, label: arn })) : []}
+ />
+ )}
+ required={false}
+ />
+
+ }
+ required={false}
+ />
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/BlueGreenDeploymentForm.tsx b/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/BlueGreenDeploymentForm.tsx
new file mode 100644
index 00000000000..7a21197befa
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/BlueGreenDeploymentForm.tsx
@@ -0,0 +1,27 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IFormikStageConfigInjectedProps, IFormInputProps } from '@spinnaker/core';
+import { FormikFormField, ReactSelectInput } from '@spinnaker/core';
+
+import { retrieveHealthCheck } from './HealthCheckStrategy';
+import { HealthCheckList } from './health.constants';
+
+export function BlueGreenDeploymentForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+
+ return (
+
+ (
+
+ )}
+ />
+ {values.healthCheckType ? retrieveHealthCheck(values.healthCheckType, props) : null}
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/HealthCheckStrategy.tsx b/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/HealthCheckStrategy.tsx
new file mode 100644
index 00000000000..bc37b210f0b
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/HealthCheckStrategy.tsx
@@ -0,0 +1,21 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IFormikStageConfigInjectedProps } from '@spinnaker/core';
+
+import { InvokeLambdaHealthCheck } from './InvocationHealthCheck';
+
+export function retrieveHealthCheck(value: string, props: IFormikStageConfigInjectedProps) {
+ switch (value) {
+ case '$LAMBDA':
+ return ;
+ case '$WEIGHTED':
+ return null;
+ case '$BLUEGREEN':
+ return null;
+ default:
+ return null;
+ }
+}
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/InvocationHealthCheck.tsx b/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/InvocationHealthCheck.tsx
new file mode 100644
index 00000000000..a229bbc1686
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/InvocationHealthCheck.tsx
@@ -0,0 +1,93 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IArtifact, IExpectedArtifact, IFormikStageConfigInjectedProps } from '@spinnaker/core';
+import {
+ ArtifactTypePatterns,
+ CheckboxInput,
+ excludeAllTypesExcept,
+ FormikFormField,
+ NumberInput,
+ StageArtifactSelectorDelegate,
+} from '@spinnaker/core';
+
+export function InvokeLambdaHealthCheck(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+
+ const excludedArtifactTypes = excludeAllTypesExcept(
+ ArtifactTypePatterns.BITBUCKET_FILE,
+ ArtifactTypePatterns.CUSTOM_OBJECT,
+ ArtifactTypePatterns.EMBEDDED_BASE64,
+ ArtifactTypePatterns.GCS_OBJECT,
+ ArtifactTypePatterns.GITHUB_FILE,
+ ArtifactTypePatterns.GITLAB_FILE,
+ ArtifactTypePatterns.S3_OBJECT,
+ ArtifactTypePatterns.HTTP_FILE,
+ );
+
+ const onTemplateArtifactEdited = (artifact: IArtifact, name: string) => {
+ props.formik.setFieldValue(`${name}.id`, null);
+ props.formik.setFieldValue(`${name}.artifact`, artifact);
+ props.formik.setFieldValue(`${name}.account`, artifact.artifactAccount);
+ };
+
+ const onTemplateArtifactSelected = (id: string, name: string) => {
+ props.formik.setFieldValue(`${name}.id`, id);
+ props.formik.setFieldValue(`${name}.artifact`, null);
+ };
+
+ const getInputArtifact = (stage: any, name: string) => {
+ if (!stage[name]) {
+ return {
+ account: '',
+ id: '',
+ };
+ } else {
+ return stage[name];
+ }
+ };
+
+ return (
+
+ }
+ />
+ } />
+
+ {
+ onTemplateArtifactEdited(artifact, 'payloadArtifact');
+ }}
+ helpKey={''}
+ onExpectedArtifactSelected={(artifact: IExpectedArtifact) =>
+ onTemplateArtifactSelected(artifact.id, 'payloadrtifact')
+ }
+ pipeline={props.pipeline}
+ stage={values}
+ />
+ {
+ onTemplateArtifactEdited(artifact, 'outputArtifact');
+ }}
+ helpKey={''}
+ onExpectedArtifactSelected={(artifact: IExpectedArtifact) =>
+ onTemplateArtifactSelected(artifact.id, 'outputArtifact')
+ }
+ pipeline={props.pipeline}
+ stage={values}
+ />
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/health.constants.ts b/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/health.constants.ts
new file mode 100644
index 00000000000..559185e1c3d
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/health.constants.ts
@@ -0,0 +1,14 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+export interface IHealthConstant {
+ label: string;
+ value: string;
+}
+
+export const HealthCheckList: IHealthConstant[] = [
+ {
+ label: 'Lambda Invocation',
+ value: '$LAMBDA',
+ },
+];
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/index.ts b/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/index.ts
new file mode 100644
index 00000000000..7af96d23f00
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/components/BlueGreenDeployment/index.ts
@@ -0,0 +1,4 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+export * from './BlueGreenDeploymentForm';
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/components/DeploymentStrategyForm.tsx b/packages/amazon/src/pipeline/stages/routeLambda/components/DeploymentStrategyForm.tsx
new file mode 100644
index 00000000000..f3b6f5aa05c
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/components/DeploymentStrategyForm.tsx
@@ -0,0 +1,18 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IFormikStageConfigInjectedProps } from '@spinnaker/core';
+
+import { retrieveComponent } from './RenderStrategy';
+
+export function DeploymentStrategyForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+
+ return (
+
+ {values.deploymentStrategy ? retrieveComponent(values.deploymentStrategy, props) : null}
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/components/RenderStrategy.tsx b/packages/amazon/src/pipeline/stages/routeLambda/components/RenderStrategy.tsx
new file mode 100644
index 00000000000..0f5a6759a05
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/components/RenderStrategy.tsx
@@ -0,0 +1,23 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IFormikStageConfigInjectedProps } from '@spinnaker/core';
+
+import { BlueGreenDeploymentForm } from './BlueGreenDeployment';
+import { SimpleDeploymentForm } from './SimpleDeploymentForm';
+import { WeightedDeploymentForm } from './WeightedDeploymentForm';
+
+export function retrieveComponent(value: string, props: IFormikStageConfigInjectedProps) {
+ switch (value) {
+ case '$SIMPLE':
+ return ;
+ case '$WEIGHTED':
+ return ;
+ case '$BLUEGREEN':
+ return ;
+ default:
+ return null;
+ }
+}
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/components/SimpleDeploymentForm.tsx b/packages/amazon/src/pipeline/stages/routeLambda/components/SimpleDeploymentForm.tsx
new file mode 100644
index 00000000000..f48328d18b4
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/components/SimpleDeploymentForm.tsx
@@ -0,0 +1,67 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IFormikStageConfigInjectedProps, IFormInputProps } from '@spinnaker/core';
+import { FormikFormField, NumberInput, ReactSelectInput } from '@spinnaker/core';
+
+import { VersionPicker } from './VersionPicker';
+import { VersionList } from '../constants';
+import type { IAmazonFunctionSourceData } from '../../../../domain';
+
+export function SimpleDeploymentForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+ const { functions } = props.application;
+
+ const onVersionChange = (fieldValue: any): void => {
+ props.formik.setFieldValue('trafficPercentA', 100);
+ props.formik.setFieldValue('versionNameA', fieldValue);
+ };
+
+ return (
+
+ (
+ }
+ />
+ )}
+ />
+ {values.versionNameA === '$PROVIDED' ? (
+ (
+ f.account === values.account)
+ .filter((f: IAmazonFunctionSourceData) => f.region === values.region)
+ .filter((f: IAmazonFunctionSourceData) => f.functionName === values.functionName)
+ .flatMap((f: IAmazonFunctionSourceData) =>
+ Object.values(f.revisions).sort(function (a: number, b: number) {
+ return b - a;
+ }),
+ )
+ .filter((r: any) => r !== '$LATEST')}
+ />
+ )}
+ />
+ ) : null}
+
+ }
+ />
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/components/VersionPicker.tsx b/packages/amazon/src/pipeline/stages/routeLambda/components/VersionPicker.tsx
new file mode 100644
index 00000000000..6fdf954130d
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/components/VersionPicker.tsx
@@ -0,0 +1,43 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IVersionConstant } from '../constants';
+import { VersionList } from '../constants';
+
+export interface IVersionPickerProps {
+ value: string;
+ showingDetails: boolean;
+}
+
+export interface IVersionPickerState {
+ value: string;
+ label: string;
+ description: string;
+}
+
+export class VersionPicker extends React.Component {
+ constructor(props: IVersionPickerProps) {
+ super(props);
+
+ // In here we will link the 'value' to an actual version id - when this is passed to Orca it will have the ID
+
+ const { value } = this.props;
+ const versionDetails = VersionList.filter((v: IVersionConstant) => v.value === value)[0];
+ this.state = {
+ label: versionDetails.label,
+ value: versionDetails.value,
+ description: versionDetails.description,
+ };
+ }
+
+ public render() {
+ return (
+
+ {this.state.label}
+ {this.state.description}
+
+ );
+ }
+}
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/components/WeightedDeploymentForm.tsx b/packages/amazon/src/pipeline/stages/routeLambda/components/WeightedDeploymentForm.tsx
new file mode 100644
index 00000000000..f8f03b0dba9
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/components/WeightedDeploymentForm.tsx
@@ -0,0 +1,107 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+import React from 'react';
+
+import type { IFormikStageConfigInjectedProps, IFormInputProps } from '@spinnaker/core';
+import { FormikFormField, NumberInput, ReactSelectInput } from '@spinnaker/core';
+
+import { VersionPicker } from './VersionPicker';
+import { VersionList } from '../constants';
+import type { IAmazonFunctionSourceData } from '../../../../domain';
+
+export function WeightedDeploymentForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+ const { functions } = props.application;
+
+ return (
+
+ (
+ }
+ />
+ )}
+ />
+ {values.versionNameA === '$PROVIDED' ? (
+ (
+ f.account === values.account)
+ .filter((f: IAmazonFunctionSourceData) => f.region === values.region)
+ .filter((f: IAmazonFunctionSourceData) => f.functionName === values.functionName)
+ .flatMap((f: IAmazonFunctionSourceData) =>
+ Object.values(f.revisions).sort(function (a: number, b: number) {
+ return b - a;
+ }),
+ )
+ .filter((r: any) => r !== '$LATEST')}
+ />
+ )}
+ />
+ ) : null}
+ }
+ />
+
+ (
+ }
+ />
+ )}
+ />
+ {values.versionNameB === '$PROVIDED' ? (
+ (
+ f.account === values.account)
+ .filter((f: IAmazonFunctionSourceData) => f.region === values.region)
+ .filter((f: IAmazonFunctionSourceData) => f.functionName === values.functionName)
+ .flatMap((f: IAmazonFunctionSourceData) =>
+ Object.values(f.revisions).sort(function (a: number, b: number) {
+ return b - a;
+ }),
+ )
+ .filter((r: any) => r !== '$LATEST')}
+ />
+ )}
+ />
+ ) : null}
+ (
+
+ )}
+ />
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/components/index.ts b/packages/amazon/src/pipeline/stages/routeLambda/components/index.ts
new file mode 100644
index 00000000000..2e67e40691d
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/components/index.ts
@@ -0,0 +1,4 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+export * from './DeploymentStrategyForm';
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/constants/index.ts b/packages/amazon/src/pipeline/stages/routeLambda/constants/index.ts
new file mode 100644
index 00000000000..48dd87f71e9
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/constants/index.ts
@@ -0,0 +1,6 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+export * from './strategy.constants';
+export * from './strategy.picker';
+export * from './versions.constants';
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/constants/strategy.constants.tsx b/packages/amazon/src/pipeline/stages/routeLambda/constants/strategy.constants.tsx
new file mode 100644
index 00000000000..c10ae5f05f2
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/constants/strategy.constants.tsx
@@ -0,0 +1,26 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+export interface IStrategyConstant {
+ description: string;
+ label: string;
+ value: string;
+}
+
+export const DeploymentStrategyList: IStrategyConstant[] = [
+ {
+ label: 'Simple',
+ value: '$SIMPLE',
+ description: 'Route 100% of traffic to specified version',
+ },
+ {
+ label: 'Weighted Deployment',
+ value: '$WEIGHTED',
+ description: 'Split the traffic weight between two function versions.',
+ },
+ {
+ label: 'Blue/Green',
+ value: '$BLUEGREEN',
+ description: 'Disable all previous versions once the latest version passes health checks.',
+ },
+];
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/constants/strategy.picker.tsx b/packages/amazon/src/pipeline/stages/routeLambda/constants/strategy.picker.tsx
new file mode 100644
index 00000000000..cfede88fcc1
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/constants/strategy.picker.tsx
@@ -0,0 +1,47 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IFormikStageConfigInjectedProps } from '@spinnaker/core';
+
+import type { IStrategyConstant } from './strategy.constants';
+import { DeploymentStrategyList } from './strategy.constants';
+
+export interface IVersionPickerProps {
+ config: IFormikStageConfigInjectedProps;
+ value: string;
+ showingDetails: boolean;
+}
+
+export interface IVersionPickerState {
+ value: string;
+ label: string;
+ description: string;
+}
+
+export class DeploymentStrategyPicker extends React.Component {
+ constructor(props: IVersionPickerProps) {
+ super(props);
+
+ const { value } = this.props;
+
+ const strategyDetails = DeploymentStrategyList.filter((v: IStrategyConstant) => v.value === value)[0];
+
+ this.state = {
+ label: strategyDetails.label,
+ value: strategyDetails.value,
+ description: strategyDetails.description,
+ };
+ }
+
+ public render() {
+ return (
+
+ {this.state.label}
+
+ {this.state.description}
+
+ );
+ }
+}
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/constants/versions.constants.ts b/packages/amazon/src/pipeline/stages/routeLambda/constants/versions.constants.ts
new file mode 100644
index 00000000000..55c43b62f3e
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/constants/versions.constants.ts
@@ -0,0 +1,31 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+export interface IVersionConstant {
+ description: string;
+ label: string;
+ value: string;
+}
+
+export const VersionList: IVersionConstant[] = [
+ {
+ label: 'Newest Function Version',
+ value: '$LATEST',
+ description: 'Selects the most recently deployed function when this stage starts.',
+ },
+ {
+ label: 'Previous Function Version',
+ value: '$PREVIOUS',
+ description: 'Selects the second-most recently deployed function when this stage starts.',
+ },
+ {
+ label: 'Oldest Function Verion',
+ value: '$OLDEST',
+ description: 'Selects the least recently deployed function when this stage starts.',
+ },
+ {
+ label: 'Provide Version Number',
+ value: '$PROVIDED',
+ description: 'Provide a specific version number to destroy.',
+ },
+];
diff --git a/packages/amazon/src/pipeline/stages/routeLambda/index.ts b/packages/amazon/src/pipeline/stages/routeLambda/index.ts
new file mode 100644
index 00000000000..154d3d60cb2
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/routeLambda/index.ts
@@ -0,0 +1,11 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import { Registry, SETTINGS } from '@spinnaker/core';
+import { lambdaRouteStage } from './LambdaRouteStage';
+
+export * from './LambdaRouteStage';
+
+if (SETTINGS.feature.lambdaAdditionalStages) {
+ Registry.pipeline.registerStage(lambdaRouteStage);
+}
diff --git a/packages/amazon/src/pipeline/stages/updateCodeLambda/LambdaUpdateCodeStage.tsx b/packages/amazon/src/pipeline/stages/updateCodeLambda/LambdaUpdateCodeStage.tsx
new file mode 100644
index 00000000000..a0a12e512f3
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/updateCodeLambda/LambdaUpdateCodeStage.tsx
@@ -0,0 +1,20 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+import type { IStageTypeConfig } from '@spinnaker/core';
+import { ExecutionDetailsTasks, HelpContentsRegistry } from '@spinnaker/core';
+
+import { LambdaUpdateCodeConfig, validate } from './LambdaUpdateCodeStageConfig';
+import { LambdaUpdateCodeExecutionDetails } from './LambdaUpdateCodeStageExecutionDetails';
+
+export const initialize = () => {
+ HelpContentsRegistry.register('aws.lambdaDeploymentStage.lambda', 'Lambda Name');
+};
+
+export const lambdaUpdateCodeStage: IStageTypeConfig = {
+ key: 'Aws.LambdaUpdateCodeStage',
+ label: `AWS Lambda Update Code`,
+ description: 'Update code for a single AWS Lambda Function',
+ component: LambdaUpdateCodeConfig, // stage config
+ executionDetailsSections: [LambdaUpdateCodeExecutionDetails, ExecutionDetailsTasks],
+ validateFn: validate,
+};
diff --git a/packages/amazon/src/pipeline/stages/updateCodeLambda/LambdaUpdateCodeStageConfig.tsx b/packages/amazon/src/pipeline/stages/updateCodeLambda/LambdaUpdateCodeStageConfig.tsx
new file mode 100644
index 00000000000..d56483e11e1
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/updateCodeLambda/LambdaUpdateCodeStageConfig.tsx
@@ -0,0 +1,41 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IFormikStageConfigInjectedProps, IStage, IStageConfigProps } from '@spinnaker/core';
+import { FormikStageConfig, FormValidator } from '@spinnaker/core';
+import { s3BucketNameValidator } from '../../../aws.validators';
+
+import { UpdateCodeLambdaFunctionStageForm } from './components';
+
+import './LambdaUpdateCodeStage.less';
+
+export function LambdaUpdateCodeConfig(props: IStageConfigProps) {
+ return (
+
+ }
+ />
+
+ );
+}
+
+export function validate(stageConfig: IStage) {
+ const validator = new FormValidator(stageConfig);
+
+ validator.field('account', 'Account Name').required();
+
+ validator.field('region', 'Region').required();
+
+ validator.field('functionName', 'Lambda Function Name').required();
+
+ validator.field('s3key', 'S3 Object Key').required();
+
+ validator.field('s3bucket', 'S3 Bucket Name').required().withValidators(s3BucketNameValidator);
+
+ return validator.validateForm();
+}
diff --git a/packages/amazon/src/pipeline/stages/updateCodeLambda/LambdaUpdateCodeStageExecutionDetails.tsx b/packages/amazon/src/pipeline/stages/updateCodeLambda/LambdaUpdateCodeStageExecutionDetails.tsx
new file mode 100644
index 00000000000..f5369f9602a
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/updateCodeLambda/LambdaUpdateCodeStageExecutionDetails.tsx
@@ -0,0 +1,31 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type { IExecutionDetailsSectionProps } from '@spinnaker/core';
+import { ExecutionDetailsSection, StageFailureMessage } from '@spinnaker/core';
+
+export function LambdaUpdateCodeExecutionDetails(props: IExecutionDetailsSectionProps) {
+ const { stage, current, name } = props;
+ return (
+
+
+
+
+ {' '}
+ Function Name: {stage.outputs.functionName ? stage.outputs.functionName : 'N/A'}{' '}
+
+
+ {' '}
+ Function ARN: {stage.outputs.functionARN ? stage.outputs.functionARN : 'N/A'}{' '}
+
+
+
+ );
+}
+
+// eslint-disable-next-line
+export namespace LambdaUpdateCodeExecutionDetails {
+ export const title = 'Lambda Update Code Stage';
+}
diff --git a/packages/amazon/src/pipeline/stages/updateCodeLambda/components/UpdateCodeStageForm.tsx b/packages/amazon/src/pipeline/stages/updateCodeLambda/components/UpdateCodeStageForm.tsx
new file mode 100644
index 00000000000..c2fcf423c8c
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/updateCodeLambda/components/UpdateCodeStageForm.tsx
@@ -0,0 +1,122 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import React from 'react';
+
+import type {
+ IAccount,
+ IAccountDetails,
+ IFormikStageConfigInjectedProps,
+ IFormInputProps,
+ IFunction,
+ IRegion,
+} from '@spinnaker/core';
+import {
+ AccountService,
+ CheckboxInput,
+ FormikFormField,
+ HelpField,
+ ReactSelectInput,
+ TextInput,
+ useData,
+} from '@spinnaker/core';
+
+export function UpdateCodeLambdaFunctionStageForm(props: IFormikStageConfigInjectedProps) {
+ const { values } = props.formik;
+ const { functions } = props.application;
+
+ const { result: fetchAccountsResult, status: fetchAccountsStatus } = useData(
+ () => AccountService.listAccounts('aws'),
+ [],
+ [],
+ );
+
+ const onAccountChange = (fieldValue: any): void => {
+ props.formik.setFieldValue('region', null);
+ props.formik.setFieldValue('functionName', null);
+
+ props.formik.setFieldValue('account', fieldValue);
+ };
+
+ const onRegionChange = (fieldValue: any): void => {
+ props.formik.setFieldValue('functionName', null);
+ props.formik.setFieldValue('region', fieldValue);
+ };
+
+ const availableFunctions =
+ values.account && values.region
+ ? functions.data
+ .filter((f: IFunction) => f.account === values.account)
+ .filter((f: IFunction) => f.region === values.region)
+ .map((f: IFunction) => f.functionName)
+ : [];
+
+ return (
+
+
Basic Settings
+ (
+ acc.name)}
+ />
+ )}
+ />
+ (
+ acc.name === values.account)
+ .flatMap((acc: IAccountDetails) => acc.regions)
+ .map((reg: IRegion) => reg.name)}
+ />
+ )}
+ />
+ (
+
+ )}
+ />
+ }
+ input={(props) => }
+ />
+ }
+ input={(props) => }
+ />
+ }
+ input={(props) => }
+ />
+
+ );
+}
diff --git a/packages/amazon/src/pipeline/stages/updateCodeLambda/components/index.ts b/packages/amazon/src/pipeline/stages/updateCodeLambda/components/index.ts
new file mode 100644
index 00000000000..77613225d78
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/updateCodeLambda/components/index.ts
@@ -0,0 +1,4 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+export * from './UpdateCodeStageForm';
diff --git a/packages/amazon/src/pipeline/stages/updateCodeLambda/index.ts b/packages/amazon/src/pipeline/stages/updateCodeLambda/index.ts
new file mode 100644
index 00000000000..f8f0dccc76a
--- /dev/null
+++ b/packages/amazon/src/pipeline/stages/updateCodeLambda/index.ts
@@ -0,0 +1,11 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+import { Registry, SETTINGS } from '@spinnaker/core';
+import { lambdaUpdateCodeStage } from './LambdaUpdateCodeStage';
+
+export * from './LambdaUpdateCodeStage';
+
+if (SETTINGS.feature.lambdaAdditionalStages) {
+ Registry.pipeline.registerStage(lambdaUpdateCodeStage);
+}
diff --git a/packages/amazon/src/serverGroup/details/scalingPolicy/upsert/step/StepPolicyAction.tsx b/packages/amazon/src/serverGroup/details/scalingPolicy/upsert/step/StepPolicyAction.tsx
index 0be68fedeaf..215e362e5d8 100644
--- a/packages/amazon/src/serverGroup/details/scalingPolicy/upsert/step/StepPolicyAction.tsx
+++ b/packages/amazon/src/serverGroup/details/scalingPolicy/upsert/step/StepPolicyAction.tsx
@@ -106,8 +106,9 @@ export const StepPolicyAction = ({
- updateStep({ ...step, metricIntervalLowerBound: Number.parseInt(e.target.value) }, index)
+ updateStep({ ...step, metricIntervalLowerBound: Number.parseFloat(e.target.value) }, index)
}
inputClassName="action-input"
/>
@@ -121,8 +122,9 @@ export const StepPolicyAction = ({
- updateStep({ ...step, metricIntervalUpperBound: Number.parseInt(e.target.value) }, index)
+ updateStep({ ...step, metricIntervalUpperBound: Number.parseFloat(e.target.value) }, index)
}
inputClassName="action-input"
/>
diff --git a/packages/amazon/src/serverGroup/serverGroup.transformer.spec.ts b/packages/amazon/src/serverGroup/serverGroup.transformer.spec.ts
index 9236d73ab62..507d304e1e2 100644
--- a/packages/amazon/src/serverGroup/serverGroup.transformer.spec.ts
+++ b/packages/amazon/src/serverGroup/serverGroup.transformer.spec.ts
@@ -169,6 +169,17 @@ describe('awsServerGroupTransformer', () => {
[0, 10, -5],
);
});
+
+ it('verify float adjustments work within the range', function () {
+ this.test(
+ [
+ { id: 1, scalingAdjustment: 10, metricIntervalLowerBound: 3.5, metricIntervalUpperBound: 5.5 },
+ { id: 2, scalingAdjustment: 0, metricIntervalLowerBound: 5.5 },
+ { id: 3, scalingAdjustment: -5, metricIntervalLowerBound: 1.2, metricIntervalUpperBound: 3.5 },
+ ],
+ [-5, 10, 0],
+ );
+ });
});
});
});
diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md
index 6a4e7980e02..e38a95af329 100644
--- a/packages/app/CHANGELOG.md
+++ b/packages/app/CHANGELOG.md
@@ -3,6 +3,44 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.7.0](https://github.com/spinnaker/deck/compare/deck-app@2.6.0...deck-app@2.7.0) (2023-12-07)
+
+
+### Features
+
+* Add feature flag for multi block failure messages. ([#10061](https://github.com/spinnaker/deck/issues/10061)) ([374f724](https://github.com/spinnaker/deck/commit/374f724de221d68030a86e1f6452e3303390339a))
+
+
+
+
+
+# [2.6.0](https://github.com/spinnaker/deck/compare/deck-app@2.5.7...deck-app@2.6.0) (2023-10-16)
+
+
+### Features
+
+* **helm/bake:** Add additional input fields where we can fill in details of the APIs versions ([#10036](https://github.com/spinnaker/deck/issues/10036)) ([d968183](https://github.com/spinnaker/deck/commit/d9681830244ecd1c70cc02459f148d0822b7187e))
+
+
+
+
+
+## [2.5.7](https://github.com/spinnaker/deck/compare/deck-app@2.5.6...deck-app@2.5.7) (2023-09-06)
+
+**Note:** Version bump only for package deck-app
+
+
+
+
+
+## [2.5.6](https://github.com/spinnaker/deck/compare/deck-app@2.5.5...deck-app@2.5.6) (2023-07-20)
+
+**Note:** Version bump only for package deck-app
+
+
+
+
+
## [2.5.5](https://github.com/spinnaker/deck/compare/deck-app@2.5.4...deck-app@2.5.5) (2023-06-02)
**Note:** Version bump only for package deck-app
diff --git a/packages/app/package.json b/packages/app/package.json
index ac8b9f83878..90b1a5ca1ff 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,7 +1,7 @@
{
"name": "deck-app",
"private": true,
- "version": "2.5.5",
+ "version": "2.7.0",
"description": "",
"main": "index.js",
"scripts": {
@@ -14,19 +14,19 @@
"author": "",
"license": "ISC",
"dependencies": {
- "@spinnaker/amazon": "^0.13.9",
- "@spinnaker/appengine": "^0.1.7",
- "@spinnaker/cloudfoundry": "^0.1.7",
- "@spinnaker/cloudrun": "^0.1.3",
- "@spinnaker/core": "^0.24.1",
- "@spinnaker/docker": "^0.0.141",
- "@spinnaker/ecs": "^0.0.360",
- "@spinnaker/google": "^0.2.8",
- "@spinnaker/kayenta": "2.0.0",
- "@spinnaker/kubernetes": "^0.4.4",
- "@spinnaker/oracle": "^0.0.85",
+ "@spinnaker/amazon": "^0.14.3",
+ "@spinnaker/appengine": "^0.1.11",
+ "@spinnaker/cloudfoundry": "^0.1.11",
+ "@spinnaker/cloudrun": "^0.1.7",
+ "@spinnaker/core": "^0.28.0",
+ "@spinnaker/docker": "^0.0.145",
+ "@spinnaker/ecs": "^0.0.364",
+ "@spinnaker/google": "^0.2.12",
+ "@spinnaker/kayenta": "2.1.0",
+ "@spinnaker/kubernetes": "^0.6.0",
+ "@spinnaker/oracle": "^0.0.89",
"@spinnaker/styleguide": "^2.0.0",
- "@spinnaker/titus": "^0.5.38",
+ "@spinnaker/titus": "^0.5.42",
"@uirouter/angularjs": "1.0.26",
"angular": "1.8.0",
"graphql": "15.5.0",
@@ -75,7 +75,7 @@
"thread-loader": "2.1.2",
"ts-loader": "8.0.3",
"typescript": "4.3.5",
- "vite": "2.4.2",
+ "vite": "2.9.16",
"vite-plugin-html-config": "^1.0.5",
"vite-plugin-svgr": "^0.3.0",
"webpack": "4.44.2",
diff --git a/packages/app/src/settings.js b/packages/app/src/settings.js
index c860d7b02a7..d22aa9ea513 100644
--- a/packages/app/src/settings.js
+++ b/packages/app/src/settings.js
@@ -51,12 +51,18 @@ const managedServiceAccountsEnabled =
const managedResourcesEnabled =
import.meta.env.VITE_MANAGED_RESOURCES_ENABLED === 'true' || process.env.MANAGED_RESOURCES_ENABLED === 'true';
const manualJudgmentParentPipelineEnabled = import.meta.env.MJ_PARENTPIPELINE_ENABLED !== 'false';
+const multiBlockFailureMessagesEnabled =
+ import.meta.env.MULTI_BLOCK_FAILURE_MESSAGES_ENABLED === 'true' ||
+ process.env.MULTI_BLOCK_FAILURE_MESSAGES_ENABLED === 'true' ||
+ false;
const onDemandClusterThreshold =
import.meta.env.VITE_ON_DEMAND_CLUSTER_THRESHOLD || process.env.ON_DEMAND_CLUSTER_THRESHOLD || '350';
const reduxLoggerEnabled = import.meta.env.VITE_REDUX_LOGGER === 'true' || process.env.REDUX_LOGGER === 'true';
const templatesEnabled = import.meta.env.VITE_TEMPLATES_ENABLED === 'true' || process.env.TEMPLATES_ENABLED === 'true';
const useClassicFirewallLabels =
import.meta.env.VITE_USE_CLASSIC_FIREWALL_LABELS === 'true' || process.env.USE_CLASSIC_FIREWALL_LABELS === 'true';
+const helmApiVersionsEnabled =
+ import.meta.env.VITE_API_VERSIONS_ENABLED === 'true' || process.env.API_VERSIONS_ENABLED === 'true' || false;
const functionsEnabled =
import.meta.env.VITE_FUNCTIONS_ENABLED === 'true' || process.env.FUNCTIONS_ENABLED === 'true' || false;
const k8sRawResourcesEnabled =
@@ -121,6 +127,7 @@ window.spinnakerSettings = {
managedServiceAccounts: managedServiceAccountsEnabled,
managedResources: managedResourcesEnabled,
manualJudgmentParentPipeline: manualJudgmentParentPipelineEnabled,
+ multiBlockFailureMessages: multiBlockFailureMessagesEnabled,
dynamicRollbackTimeout: dynamicRollbackTimeoutEnabled,
notifications: false,
pagerDuty: false,
@@ -131,6 +138,7 @@ window.spinnakerSettings = {
slack: false,
snapshots: false,
functions: functionsEnabled,
+ helmApiVersions: helmApiVersionsEnabled,
kubernetesRawResources: k8sRawResourcesEnabled,
},
gateUrl: apiHost,
diff --git a/packages/appengine/CHANGELOG.md b/packages/appengine/CHANGELOG.md
index 81f397a110c..2a03fb95c58 100644
--- a/packages/appengine/CHANGELOG.md
+++ b/packages/appengine/CHANGELOG.md
@@ -3,6 +3,41 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.1.11](https://github.com/spinnaker/deck/compare/@spinnaker/appengine@0.1.10...@spinnaker/appengine@0.1.11) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/appengine
+
+
+
+
+
+## [0.1.10](https://github.com/spinnaker/deck/compare/@spinnaker/appengine@0.1.9...@spinnaker/appengine@0.1.10) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.1.9](https://github.com/spinnaker/deck/compare/@spinnaker/appengine@0.1.8...@spinnaker/appengine@0.1.9) (2023-09-06)
+
+**Note:** Version bump only for package @spinnaker/appengine
+
+
+
+
+
+## [0.1.8](https://github.com/spinnaker/deck/compare/@spinnaker/appengine@0.1.7...@spinnaker/appengine@0.1.8) (2023-07-20)
+
+**Note:** Version bump only for package @spinnaker/appengine
+
+
+
+
+
## [0.1.7](https://github.com/spinnaker/deck/compare/@spinnaker/appengine@0.1.6...@spinnaker/appengine@0.1.7) (2023-06-02)
**Note:** Version bump only for package @spinnaker/appengine
diff --git a/packages/appengine/package.json b/packages/appengine/package.json
index e6f95627c91..3fdb8f4c105 100644
--- a/packages/appengine/package.json
+++ b/packages/appengine/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/appengine",
"license": "Apache-2.0",
- "version": "0.1.7",
+ "version": "0.1.11",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,7 +16,7 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/core": "^0.24.1",
+ "@spinnaker/core": "^0.28.0",
"@uirouter/angularjs": "1.0.26",
"angular": "1.6.10",
"angular-ui-bootstrap": "2.5.0",
@@ -26,9 +29,9 @@
"rxjs": "6.6.7"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
+ "@spinnaker/eslint-plugin": "^3.0.2",
"@spinnaker/mocks": "1.0.7",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"@types/angular-ui-bootstrap": "0.13.41",
"@types/classnames": "2.2.0",
diff --git a/packages/azure/CHANGELOG.md b/packages/azure/CHANGELOG.md
index bc226e65855..974275469cf 100644
--- a/packages/azure/CHANGELOG.md
+++ b/packages/azure/CHANGELOG.md
@@ -3,6 +3,41 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.4.8](https://github.com/spinnaker/deck/compare/@spinnaker/azure@0.4.7...@spinnaker/azure@0.4.8) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/azure
+
+
+
+
+
+## [0.4.7](https://github.com/spinnaker/deck/compare/@spinnaker/azure@0.4.6...@spinnaker/azure@0.4.7) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.4.6](https://github.com/spinnaker/deck/compare/@spinnaker/azure@0.4.5...@spinnaker/azure@0.4.6) (2023-09-06)
+
+**Note:** Version bump only for package @spinnaker/azure
+
+
+
+
+
+## [0.4.5](https://github.com/spinnaker/deck/compare/@spinnaker/azure@0.4.4...@spinnaker/azure@0.4.5) (2023-07-20)
+
+**Note:** Version bump only for package @spinnaker/azure
+
+
+
+
+
## [0.4.4](https://github.com/spinnaker/deck/compare/@spinnaker/azure@0.4.3...@spinnaker/azure@0.4.4) (2023-06-02)
**Note:** Version bump only for package @spinnaker/azure
diff --git a/packages/azure/package.json b/packages/azure/package.json
index 76972ad58c0..11652890deb 100644
--- a/packages/azure/package.json
+++ b/packages/azure/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/azure",
"license": "Apache-2.0",
- "version": "0.4.4",
+ "version": "0.4.8",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,7 +16,7 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/core": "^0.24.1",
+ "@spinnaker/core": "^0.28.0",
"@uirouter/angularjs": "1.0.26",
"angular": "1.6.10",
"angular-ui-bootstrap": "2.5.0",
@@ -23,8 +26,8 @@
"react-select": "1.2.1"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/eslint-plugin": "^3.0.2",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"@types/angular-ui-bootstrap": "0.13.41",
"@types/lodash": "4.14.64",
diff --git a/packages/cloudfoundry/CHANGELOG.md b/packages/cloudfoundry/CHANGELOG.md
index e04b1fa479a..d079a1eb7b5 100644
--- a/packages/cloudfoundry/CHANGELOG.md
+++ b/packages/cloudfoundry/CHANGELOG.md
@@ -3,6 +3,41 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.1.11](https://github.com/spinnaker/deck/compare/@spinnaker/cloudfoundry@0.1.10...@spinnaker/cloudfoundry@0.1.11) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/cloudfoundry
+
+
+
+
+
+## [0.1.10](https://github.com/spinnaker/deck/compare/@spinnaker/cloudfoundry@0.1.9...@spinnaker/cloudfoundry@0.1.10) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.1.9](https://github.com/spinnaker/deck/compare/@spinnaker/cloudfoundry@0.1.8...@spinnaker/cloudfoundry@0.1.9) (2023-09-06)
+
+**Note:** Version bump only for package @spinnaker/cloudfoundry
+
+
+
+
+
+## [0.1.8](https://github.com/spinnaker/deck/compare/@spinnaker/cloudfoundry@0.1.7...@spinnaker/cloudfoundry@0.1.8) (2023-07-20)
+
+**Note:** Version bump only for package @spinnaker/cloudfoundry
+
+
+
+
+
## [0.1.7](https://github.com/spinnaker/deck/compare/@spinnaker/cloudfoundry@0.1.6...@spinnaker/cloudfoundry@0.1.7) (2023-06-02)
**Note:** Version bump only for package @spinnaker/cloudfoundry
diff --git a/packages/cloudfoundry/package.json b/packages/cloudfoundry/package.json
index 4cbddfe5cc9..5a7a6861095 100644
--- a/packages/cloudfoundry/package.json
+++ b/packages/cloudfoundry/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/cloudfoundry",
"license": "Apache-2.0",
- "version": "0.1.7",
+ "version": "0.1.11",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,7 +16,7 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/core": "^0.24.1",
+ "@spinnaker/core": "^0.28.0",
"@uirouter/react": "1.0.7",
"@uirouter/react-hybrid": "1.0.2",
"angular": "1.6.10",
@@ -30,9 +33,9 @@
},
"devDependencies": {
"@rollup/plugin-alias": "^3.1.2",
- "@spinnaker/eslint-plugin": "^3.0.1",
+ "@spinnaker/eslint-plugin": "^3.0.2",
"@spinnaker/mocks": "1.0.7",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"@types/angular-ui-bootstrap": "0.13.41",
"@types/enzyme": "3.10.3",
diff --git a/packages/cloudrun/CHANGELOG.md b/packages/cloudrun/CHANGELOG.md
index 1131f353b7a..9c91ab89070 100644
--- a/packages/cloudrun/CHANGELOG.md
+++ b/packages/cloudrun/CHANGELOG.md
@@ -3,6 +3,41 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.1.7](https://github.com/spinnaker/deck/compare/@spinnaker/cloudrun@0.1.6...@spinnaker/cloudrun@0.1.7) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/cloudrun
+
+
+
+
+
+## [0.1.6](https://github.com/spinnaker/deck/compare/@spinnaker/cloudrun@0.1.5...@spinnaker/cloudrun@0.1.6) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.1.5](https://github.com/spinnaker/deck/compare/@spinnaker/cloudrun@0.1.4...@spinnaker/cloudrun@0.1.5) (2023-09-06)
+
+**Note:** Version bump only for package @spinnaker/cloudrun
+
+
+
+
+
+## [0.1.4](https://github.com/spinnaker/deck/compare/@spinnaker/cloudrun@0.1.3...@spinnaker/cloudrun@0.1.4) (2023-07-20)
+
+**Note:** Version bump only for package @spinnaker/cloudrun
+
+
+
+
+
## [0.1.3](https://github.com/spinnaker/deck/compare/@spinnaker/cloudrun@0.1.2...@spinnaker/cloudrun@0.1.3) (2023-06-02)
**Note:** Version bump only for package @spinnaker/cloudrun
diff --git a/packages/cloudrun/package.json b/packages/cloudrun/package.json
index c74e16b64c4..2a3926df176 100644
--- a/packages/cloudrun/package.json
+++ b/packages/cloudrun/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/cloudrun",
"license": "Apache-2.0",
- "version": "0.1.3",
+ "version": "0.1.7",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,7 +16,7 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/core": "^0.24.1",
+ "@spinnaker/core": "^0.28.0",
"@uirouter/angularjs": "1.0.26",
"@uirouter/react": "1.0.7",
"angular": "1.6.10",
@@ -24,7 +27,7 @@
"formik": "1.5.1",
"js-yaml": "3.13.1",
"lodash": "4.17.21",
- "luxon": "1.23.0",
+ "luxon": "1.28.1",
"ngimport": "0.6.1",
"react": "16.14.0",
"react-ace": "6.4.0",
@@ -35,9 +38,9 @@
"rxjs": "6.6.7"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
- "@spinnaker/scripts": "^0.3.0",
- "@types/angular": "1.6.26",
+ "@spinnaker/eslint-plugin": "^3.0.2",
+ "@spinnaker/scripts": "^0.4.0",
+ "@types/angular": "1.8.5",
"@types/angular-ui-bootstrap": "0.13.41",
"@types/dompurify": "^2.3.3",
"@types/enzyme": "3.10.3",
diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md
index 65c2c4b5d41..f312534f8e1 100644
--- a/packages/core/CHANGELOG.md
+++ b/packages/core/CHANGELOG.md
@@ -3,6 +3,78 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [0.28.0](https://github.com/spinnaker/deck/compare/@spinnaker/core@0.27.0...@spinnaker/core@0.28.0) (2023-12-07)
+
+
+### Features
+
+* Add feature flag for multi block failure messages. ([#10061](https://github.com/spinnaker/deck/issues/10061)) ([374f724](https://github.com/spinnaker/deck/commit/374f724de221d68030a86e1f6452e3303390339a))
+* Expose spinnaker/kayenta to the plugin framework to allow us to create kayenta plugins in Deck ([#10072](https://github.com/spinnaker/deck/issues/10072)) ([dbf0574](https://github.com/spinnaker/deck/commit/dbf0574176cbbca781d970c64dfe49f6911ef8b8))
+* Split deployment failure messages. ([#10060](https://github.com/spinnaker/deck/issues/10060)) ([73dda48](https://github.com/spinnaker/deck/commit/73dda48caccd969ef562af3f86bc1f17efbdad7f))
+
+
+
+
+
+# [0.27.0](https://github.com/spinnaker/deck/compare/@spinnaker/core@0.26.0...@spinnaker/core@0.27.0) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+### Features
+
+* **helm/bake:** Add additional input fields where we can fill in details of the APIs versions ([#10036](https://github.com/spinnaker/deck/issues/10036)) ([d968183](https://github.com/spinnaker/deck/commit/d9681830244ecd1c70cc02459f148d0822b7187e))
+
+
+
+
+
+# [0.26.0](https://github.com/spinnaker/deck/compare/@spinnaker/core@0.25.0...@spinnaker/core@0.26.0) (2023-09-06)
+
+
+### Features
+
+* **core:** Add ability to set Default Tag filters for an application in application config ([#10020](https://github.com/spinnaker/deck/issues/10020)) ([c768e88](https://github.com/spinnaker/deck/commit/c768e88fbc893d0bd5dc86959320a7b7d67443e5))
+
+
+### Reverts
+
+* Revert "fix(core): conditionally hide expression evaluation warning messages (#9771)" (#10021) ([62033d0](https://github.com/spinnaker/deck/commit/62033d0fc6f0a953bd3f01e4452664b92fd02dfb)), closes [#9771](https://github.com/spinnaker/deck/issues/9771) [#10021](https://github.com/spinnaker/deck/issues/10021)
+
+
+
+# 3.15.0 (2023-07-27)
+
+
+### Features
+
+* **core:** set Cancellation Reason to be expanded by default ([#10018](https://github.com/spinnaker/deck/issues/10018)) ([db06e88](https://github.com/spinnaker/deck/commit/db06e88bada70fa4065f56fc33af7207943415c5))
+
+
+
+
+
+# [0.25.0](https://github.com/spinnaker/deck/compare/@spinnaker/core@0.24.1...@spinnaker/core@0.25.0) (2023-07-20)
+
+
+### Bug Fixes
+
+* **core/pipeline:** Resolved issue getting during pipeline save with spaces in pipeline name. ([#10009](https://github.com/spinnaker/deck/issues/10009)) ([ec8d2bb](https://github.com/spinnaker/deck/commit/ec8d2bbada0192673cfede4401e5c18d884dec59))
+
+
+### Features
+
+* **artifacts:** Add support for artifact store views and calls ([#10011](https://github.com/spinnaker/deck/issues/10011)) ([b520bae](https://github.com/spinnaker/deck/commit/b520bae8296c85ed096ea6aaee022e114bb6a52f))
+* **lambda:** Migrate Lambda plugin to OSS ([#9988](https://github.com/spinnaker/deck/issues/9988)) ([11f1cab](https://github.com/spinnaker/deck/commit/11f1cabb8efe8d7e034faf06ae3cb455eef6369a)), closes [#9984](https://github.com/spinnaker/deck/issues/9984)
+* **stages/bakeManifests:** add helmfile support ([#9998](https://github.com/spinnaker/deck/issues/9998)) ([a4a0f33](https://github.com/spinnaker/deck/commit/a4a0f331d181b74d7c3a8c1b46724757be17a9f0))
+
+
+
+
+
## [0.24.1](https://github.com/spinnaker/deck/compare/@spinnaker/core@0.24.0...@spinnaker/core@0.24.1) (2023-06-02)
diff --git a/packages/core/package.json b/packages/core/package.json
index 111e652e230..2bb7eb46ef6 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/core",
"license": "Apache-2.0",
- "version": "0.24.1",
+ "version": "0.28.0",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -17,7 +20,7 @@
"@apollo/client": "^3.6.9",
"@fortawesome/fontawesome-free": "5.5.0",
"@spinnaker/mocks": "1.0.7",
- "@spinnaker/presentation": "^0.3.0",
+ "@spinnaker/presentation": "^0.3.1",
"@spinnaker/styleguide": "2.0.0",
"@uirouter/angularjs": "1.0.26",
"@uirouter/core": "6.0.8",
@@ -88,8 +91,8 @@
"@graphql-codegen/typescript": "^1.22.4",
"@graphql-codegen/typescript-operations": "^1.18.3",
"@graphql-codegen/typescript-react-apollo": "^2.3.0",
- "@spinnaker/eslint-plugin": "^3.0.1",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/eslint-plugin": "^3.0.2",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"@types/angular-mocks": "1.5.10",
"@types/angular-ui-bootstrap": "0.13.41",
diff --git a/packages/core/src/application/config/applicationConfig.controller.js b/packages/core/src/application/config/applicationConfig.controller.js
index 14fb1cc0bde..4c9d3c2edb2 100644
--- a/packages/core/src/application/config/applicationConfig.controller.js
+++ b/packages/core/src/application/config/applicationConfig.controller.js
@@ -8,6 +8,7 @@ import { CORE_APPLICATION_CONFIG_APPLICATIONSNAPSHOTSECTION_COMPONENT } from './
import { CHAOS_MONKEY_CONFIG_COMPONENT } from '../../chaosMonkey/chaosMonkeyConfig.component';
import { SETTINGS } from '../../config/settings';
import { APPLICATION_DATA_SOURCE_EDITOR } from './dataSources/applicationDataSourceEditor.component';
+import { DEFAULT_TAG_FILTER_CONFIG } from './defaultTagFilter/defaultTagFilterConfig.component';
import { DELETE_APPLICATION_SECTION } from './deleteApplicationSection.module';
import { CORE_APPLICATION_CONFIG_LINKS_APPLICATIONLINKS_COMPONENT } from './links/applicationLinks.component';
import { ApplicationWriter } from '../service/ApplicationWriter';
@@ -25,6 +26,7 @@ module(CORE_APPLICATION_CONFIG_APPLICATIONCONFIG_CONTROLLER, [
CHAOS_MONKEY_CONFIG_COMPONENT,
TRAFFIC_GUARD_CONFIG_COMPONENT,
CORE_APPLICATION_CONFIG_LINKS_APPLICATIONLINKS_COMPONENT,
+ DEFAULT_TAG_FILTER_CONFIG,
]).controller('ApplicationConfigController', [
'$state',
'app',
@@ -63,6 +65,30 @@ module(CORE_APPLICATION_CONFIG_APPLICATIONCONFIG_CONTROLLER, [
});
};
+ this.defaultTagFilterProps = {
+ isSaving: false,
+ saveError: false,
+ };
+ this.updateDefaultTagFilterConfigs = (tagConfigs /* IDefaultTagFilterConfig[] */) => {
+ const applicationAttributes = cloneDeep(this.application.attributes);
+ applicationAttributes.defaultFilteredTags = tagConfigs;
+ $scope.$applyAsync(() => {
+ this.defaultTagFilterProps.isSaving = true;
+ this.defaultTagFilterProps.saveError = false;
+ });
+ ApplicationWriter.updateApplication(applicationAttributes)
+ .then(() => {
+ $scope.$applyAsync(() => {
+ this.defaultTagFilterProps.isSaving = false;
+ this.application.attributes = applicationAttributes;
+ });
+ })
+ .catch(() => {
+ this.defaultTagFilterProps.isSaving = false;
+ this.defaultTagFilterProps.saveError = true;
+ });
+ };
+
this.notifications = [];
this.updateNotifications = (notifications) => {
$scope.$applyAsync(() => {
diff --git a/packages/core/src/application/config/applicationConfig.view.html b/packages/core/src/application/config/applicationConfig.view.html
index 8e268432508..ca2912ce2e7 100644
--- a/packages/core/src/application/config/applicationConfig.view.html
+++ b/packages/core/src/application/config/applicationConfig.view.html
@@ -54,6 +54,15 @@
>
+
+
+
+
diff --git a/packages/core/src/application/config/defaultTagFilter/DefaultTagFilterConfig.spec.tsx b/packages/core/src/application/config/defaultTagFilter/DefaultTagFilterConfig.spec.tsx
new file mode 100644
index 00000000000..981d2affea6
--- /dev/null
+++ b/packages/core/src/application/config/defaultTagFilter/DefaultTagFilterConfig.spec.tsx
@@ -0,0 +1,75 @@
+import { shallow } from 'enzyme';
+import React from 'react';
+
+import type { IDefaultTagFilterConfig } from './DefaultTagFilterConfig';
+import { DefaultTagFilterConfig } from './DefaultTagFilterConfig';
+import { noop } from '../../../utils';
+
+describe(' ', () => {
+ let tagConfigs: IDefaultTagFilterConfig[];
+ let wrapper: any;
+
+ beforeEach(() => {
+ tagConfigs = getTestDefaultFilterTagConfigs();
+ wrapper = shallow(
+ ,
+ );
+ });
+
+ describe('view', () => {
+ it('renders a row for each banner config', () => {
+ expect(wrapper.find('.default-filter-config-row').length).toEqual(tagConfigs.length);
+ });
+ it('renders an "add" button', () => {
+ expect(wrapper.find('.add-new').length).toEqual(1);
+ });
+ });
+
+ describe('functionality', () => {
+ it('update default tag filter config', () => {
+ expect(wrapper.state('defaultTagFilterConfigsEditing')).toEqual(tagConfigs);
+ wrapper
+ .find('textarea')
+ .at(1)
+ .simulate('change', { target: { value: 'hello' } });
+ const updatedConfigs = [
+ {
+ ...tagConfigs[0],
+ tagValue: 'hello',
+ },
+ {
+ ...tagConfigs[1],
+ },
+ ];
+ expect(wrapper.state('defaultTagFilterConfigsEditing')).toEqual(updatedConfigs);
+ });
+ it('add default filter tag config', () => {
+ expect(wrapper.state('defaultTagFilterConfigsEditing').length).toEqual(2);
+ wrapper.find('.add-new').simulate('click');
+ expect(wrapper.state('defaultTagFilterConfigsEditing').length).toEqual(3);
+ });
+ it('remove default filter tag config', () => {
+ expect(wrapper.state('defaultTagFilterConfigsEditing').length).toEqual(2);
+ wrapper.find('.default-filter-config-remove').at(1).simulate('click');
+ expect(wrapper.state('defaultTagFilterConfigsEditing').length).toEqual(1);
+ });
+ });
+});
+
+export function getTestDefaultFilterTagConfigs(): IDefaultTagFilterConfig[] {
+ return [
+ {
+ tagName: 'Pipeline Type',
+ tagValue: 'Deployment Pipelines',
+ },
+ {
+ tagName: 'Pipeline Type',
+ tagValue: 'Repair Pipelines',
+ },
+ ];
+}
diff --git a/packages/core/src/application/config/defaultTagFilter/DefaultTagFilterConfig.tsx b/packages/core/src/application/config/defaultTagFilter/DefaultTagFilterConfig.tsx
new file mode 100644
index 00000000000..8984ab50427
--- /dev/null
+++ b/packages/core/src/application/config/defaultTagFilter/DefaultTagFilterConfig.tsx
@@ -0,0 +1,161 @@
+import { isEqual } from 'lodash';
+import React from 'react';
+
+import { ConfigSectionFooter } from '../footer/ConfigSectionFooter';
+import { noop } from '../../../utils';
+
+import './defaultTagFilterConfig.less';
+
+export interface IDefaultTagFilterConfig {
+ tagName: string;
+ tagValue: string;
+}
+
+export interface IDefaultTagFilterProps {
+ defaultTagFilterConfigs: IDefaultTagFilterConfig[];
+ isSaving: boolean;
+ saveError: boolean;
+ updateDefaultTagFilterConfigs: (defaultTagFilterConfigs: IDefaultTagFilterConfig[]) => void;
+}
+
+export interface IDefaultTagFilterState {
+ defaultTagFilterConfigsEditing: IDefaultTagFilterConfig[];
+}
+
+export class DefaultTagFilterConfig extends React.Component {
+ public static defaultProps: Partial = {
+ defaultTagFilterConfigs: [],
+ isSaving: false,
+ saveError: false,
+ updateDefaultTagFilterConfigs: noop,
+ };
+
+ constructor(props: IDefaultTagFilterProps) {
+ super(props);
+ this.state = {
+ defaultTagFilterConfigsEditing: props.defaultTagFilterConfigs,
+ };
+ }
+
+ private onTagNameChange = (idx: number, text: string) => {
+ this.setState({
+ defaultTagFilterConfigsEditing: this.state.defaultTagFilterConfigsEditing.map((config, i) => {
+ if (i === idx) {
+ return {
+ ...config,
+ tagName: text,
+ };
+ }
+ return config;
+ }),
+ });
+ };
+
+ private onTagValueChange = (idx: number, text: string) => {
+ this.setState({
+ defaultTagFilterConfigsEditing: this.state.defaultTagFilterConfigsEditing.map((config, i) => {
+ if (i === idx) {
+ return {
+ ...config,
+ tagValue: text,
+ };
+ }
+ return config;
+ }),
+ });
+ };
+
+ private addFilterTag = (): void => {
+ this.setState({
+ defaultTagFilterConfigsEditing: this.state.defaultTagFilterConfigsEditing.concat([
+ {
+ tagName: 'Name of the tag (E.g. Pipeline Type)',
+ tagValue: 'Value of the tag (E.g. Default Pipelines)',
+ } as IDefaultTagFilterConfig,
+ ]),
+ });
+ };
+
+ private removeFilterTag = (idx: number): void => {
+ this.setState({
+ defaultTagFilterConfigsEditing: this.state.defaultTagFilterConfigsEditing.filter((_config, i) => i !== idx),
+ });
+ };
+
+ private isDirty = (): boolean => {
+ return !isEqual(this.props.defaultTagFilterConfigs, this.state.defaultTagFilterConfigsEditing);
+ };
+
+ private onRevertClicked = (): void => {
+ this.setState({
+ defaultTagFilterConfigsEditing: this.props.defaultTagFilterConfigs,
+ });
+ };
+
+ private onSaveClicked = (): void => {
+ this.props.updateDefaultTagFilterConfigs(this.state.defaultTagFilterConfigsEditing);
+ };
+
+ public render() {
+ return (
+
+
+ Default Tag filters allow you to specify which tags are immediately filtered to when the pipeline execution
+ page is loaded in.
+
+
+
+
+
+ Tag Name
+ Tag Value
+
+
+
+ {this.state.defaultTagFilterConfigsEditing.map((defaultTagFilter, idx) => (
+
+
+
+
+
+
+ this.removeFilterTag(idx)}>
+
+
+
+
+ ))}
+
+
+
+
+
+ Add Default Filter
+
+
+
+
+ );
+ }
+}
diff --git a/packages/core/src/application/config/defaultTagFilter/defaultTagFilterConfig.component.ts b/packages/core/src/application/config/defaultTagFilter/defaultTagFilterConfig.component.ts
new file mode 100644
index 00000000000..4ed21077e35
--- /dev/null
+++ b/packages/core/src/application/config/defaultTagFilter/defaultTagFilterConfig.component.ts
@@ -0,0 +1,15 @@
+import { module } from 'angular';
+import { react2angular } from 'react2angular';
+import { DefaultTagFilterConfig } from './DefaultTagFilterConfig';
+import { withErrorBoundary } from '../../../presentation/SpinErrorBoundary';
+
+export const DEFAULT_TAG_FILTER_CONFIG = 'spinnaker.micros.application.defaultTagFilterConfig.component';
+module(DEFAULT_TAG_FILTER_CONFIG, []).component(
+ 'defaultTagFilterConfig',
+ react2angular(withErrorBoundary(DefaultTagFilterConfig, 'defaultTagFilterConfig'), [
+ 'defaultTagFilterConfigs',
+ 'isSaving',
+ 'saveError',
+ 'updateDefaultTagFilterConfigs',
+ ]),
+);
diff --git a/packages/core/src/application/config/defaultTagFilter/defaultTagFilterConfig.less b/packages/core/src/application/config/defaultTagFilter/defaultTagFilterConfig.less
new file mode 100755
index 00000000000..2a5cb7d5fcc
--- /dev/null
+++ b/packages/core/src/application/config/defaultTagFilter/defaultTagFilterConfig.less
@@ -0,0 +1,8 @@
+.default-filter-config-container {
+ display: flex;
+ flex-direction: column;
+}
+
+.default-filter-config-description {
+ margin-bottom: 10px;
+}
diff --git a/packages/core/src/artifact/ArtifactIconService.ts b/packages/core/src/artifact/ArtifactIconService.ts
index 2095c420308..10c1279b63b 100644
--- a/packages/core/src/artifact/ArtifactIconService.ts
+++ b/packages/core/src/artifact/ArtifactIconService.ts
@@ -44,6 +44,7 @@ ArtifactIconService.registerType(ArtifactTypePatterns.CUSTOM_OBJECT, unknownArti
ArtifactIconService.registerType(ArtifactTypePatterns.DOCKER_IMAGE, dockerIcon);
ArtifactIconService.registerType(ArtifactTypePatterns.KUBERNETES, kubernetesIcon);
ArtifactIconService.registerType(ArtifactTypePatterns.EMBEDDED_BASE64, embeddedBase64Icon);
+ArtifactIconService.registerType(ArtifactTypePatterns.REMOTE_BASE64, embeddedBase64Icon);
ArtifactIconService.registerType(ArtifactTypePatterns.GCS_OBJECT, gcsObjectIcon);
ArtifactIconService.registerType(ArtifactTypePatterns.GITHUB_FILE, gitHubFileIcon);
ArtifactIconService.registerType(ArtifactTypePatterns.GIT_REPO, gitRepoIcon);
diff --git a/packages/core/src/artifact/ArtifactTypes.ts b/packages/core/src/artifact/ArtifactTypes.ts
index 07386562dc1..d0ffe7b1802 100644
--- a/packages/core/src/artifact/ArtifactTypes.ts
+++ b/packages/core/src/artifact/ArtifactTypes.ts
@@ -7,6 +7,7 @@ export const ArtifactTypePatterns: IArtifactTypePatterns = {
CUSTOM_OBJECT: /custom\/object/,
DOCKER_IMAGE: /docker\/image/,
EMBEDDED_BASE64: /embedded\/base64/,
+ REMOTE_BASE64: /remote\/base64/,
GCS_OBJECT: /gcs\/object/,
GITHUB_FILE: /github\/file/,
GIT_REPO: /git\/repo/,
diff --git a/packages/core/src/config/settings.ts b/packages/core/src/config/settings.ts
index e62cc4c329b..95c2d60cbed 100644
--- a/packages/core/src/config/settings.ts
+++ b/packages/core/src/config/settings.ts
@@ -34,10 +34,12 @@ export interface IFeatures {
executionMarkerInformationModal?: boolean;
fiatEnabled?: boolean;
iapRefresherEnabled?: boolean;
+ lambdaAdditionalStages?: boolean;
managedDelivery?: boolean;
mdGitIntegration?: boolean;
managedServiceAccounts?: boolean;
managedResources?: boolean;
+ multiBlockFailureMessages?: boolean;
notifications?: boolean;
pagerDuty?: boolean;
pipelines?: boolean;
diff --git a/packages/core/src/deploymentStrategy/strategies/rollingredblack/rollingredblack.strategy.ts b/packages/core/src/deploymentStrategy/strategies/rollingredblack/rollingredblack.strategy.ts
index b2b8243a193..076503c67f3 100644
--- a/packages/core/src/deploymentStrategy/strategies/rollingredblack/rollingredblack.strategy.ts
+++ b/packages/core/src/deploymentStrategy/strategies/rollingredblack/rollingredblack.strategy.ts
@@ -2,7 +2,7 @@ import { AdditionalFields } from './AdditionalFields';
import { DeploymentStrategyRegistry } from '../../deploymentStrategy.registry';
DeploymentStrategyRegistry.registerStrategy({
- label: 'Rolling Red/Black (Experimental)',
+ label: 'Rolling Red/Black',
description: `Creates a new version of this server group, then incrementally resizes the new server group while disabling the same percentage in the previous server group.`,
key: 'rollingredblack',
providerRestricted: true,
diff --git a/packages/core/src/domain/IArtifact.ts b/packages/core/src/domain/IArtifact.ts
index 5a9cb285350..c5fd913b8e4 100644
--- a/packages/core/src/domain/IArtifact.ts
+++ b/packages/core/src/domain/IArtifact.ts
@@ -12,3 +12,6 @@ export interface IArtifact {
kind?: string; // TODO delete
customKind?: boolean; // TODO delete
}
+
+export const ARTIFACT_TYPE_EMBEDDED = 'embedded/base64';
+export const ARTIFACT_TYPE_REMOTE = 'remote/base64';
diff --git a/packages/core/src/domain/ITrigger.ts b/packages/core/src/domain/ITrigger.ts
index 74718332332..414013110ea 100644
--- a/packages/core/src/domain/ITrigger.ts
+++ b/packages/core/src/domain/ITrigger.ts
@@ -91,6 +91,10 @@ export interface IWebhookTrigger extends ITrigger {
payloadConstraints: { [key: string]: string };
}
+export interface ICDEventsTrigger extends IWebhookTrigger {
+ attributeConstraints: { [key: string]: string };
+}
+
export interface IWerckerTrigger extends IBuildTrigger {
app: string;
pipeline: string;
diff --git a/packages/core/src/help/help.contents.ts b/packages/core/src/help/help.contents.ts
index 504a7dcb253..18c904ac107 100644
--- a/packages/core/src/help/help.contents.ts
+++ b/packages/core/src/help/help.contents.ts
@@ -178,6 +178,11 @@ const helpContents: { [key: string]: string } = {
When provided, only a webhook with a payload containing at least the specified key/value pairs will be allowed to trigger this pipeline. For example, if you wanted to lock down the systems/users that can trigger this pipeline via this webhook, you could require the key "secret" and value "something-secret" as a constraint.
The constraint values may be supplied as regex.
`,
+ 'pipeline.config.trigger.cdevents.attributeConstraints': `
+ CDEvents messages will have mandatory headers id, source, specversion, type accompanying the payload called attributes .
+ When provided, only a CDEvents message with attributes containing at least the specified key/value pairs will be allowed to trigger this pipeline.
+ The constraint value is a java regex string.
+ `,
'pipeline.config.trigger.pubsub.attributeConstraints': `
Pubsub messages can have system-specific metadata accompanying the payload called attributes .
When provided, only a pubsub message with attributes containing at least the specified key/value pairs will be allowed to trigger this pipeline.
@@ -309,6 +314,11 @@ const helpContents: { [key: string]: string } = {
'pipeline.config.bake.manifest.kustomize.filePath': `
This is the relative path to the kustomization.yaml file within your Git repo.
e.g.: examples/wordpress/mysql/kustomization.yaml
`,
+ 'pipeline.config.bake.manifest.helmfile.filePath': `
+ This is the relative path to the directory containing the helmfile.yaml file within your Git repo.
+ e.g.: chart/helmfile.yml
`,
+ 'pipeline.config.bake.manifest.helmfile.name':
+ ' Name is used to set the expected artifact in the Produces Artifact section.
',
'pipeline.config.bake.cf.manifest.name':
' Name should be the same as the expected artifact in the Produces Artifact section.
',
'pipeline.config.bake.cf.manifest.templateArtifact': `
diff --git a/packages/core/src/manifest/ManifestYaml.tsx b/packages/core/src/manifest/ManifestYaml.tsx
index a291fd20378..faf51a138c6 100644
--- a/packages/core/src/manifest/ManifestYaml.tsx
+++ b/packages/core/src/manifest/ManifestYaml.tsx
@@ -1,26 +1,48 @@
import React from 'react';
import { Modal } from 'react-bootstrap';
+import { ArtifactService } from '../pipeline/config/triggers/artifacts/ArtifactService';
+import { decodeUnicodeBase64 } from '../utils';
-export interface IManifestYamlProps {
+type IManifestYamlProps = {
linkName: string;
- manifestText: string;
modalTitle: string;
-}
+} & ({ manifestText: string; manifestUri?: never } | { manifestText?: never; manifestUri: string });
-export function ManifestYaml(props: IManifestYamlProps) {
+export function ManifestYaml({ linkName, modalTitle, manifestText, manifestUri }: IManifestYamlProps) {
const [modalVisible, setModalVisible] = React.useState(false);
const toggle = () => setModalVisible(!modalVisible);
+ const [fetchedManifestText, setFetchedManifestText] = React.useState('Loading...');
+ const [error, setError] = React.useState(null);
+
+ React.useEffect(() => {
+ if (manifestUri) {
+ ArtifactService.getArtifactByContentReference(manifestUri)
+ .then((manifest) => setFetchedManifestText(decodeUnicodeBase64(manifest.reference)))
+ .catch((e) => setError(`Error: ${typeof e !== 'string' ? e.data?.message ?? JSON.stringify(e) : e}`));
+ }
+ }, []);
+
return (
<>
- {props.linkName}
+ {linkName}
- {props.modalTitle}
+ {modalTitle}
-
+ {error ? (
+
+ ) : null}
+
diff --git a/packages/core/src/manifest/stage/JobStageExecutionLogs.tsx b/packages/core/src/manifest/stage/JobStageExecutionLogs.tsx
index 8eb97bd931d..95b0744521c 100644
--- a/packages/core/src/manifest/stage/JobStageExecutionLogs.tsx
+++ b/packages/core/src/manifest/stage/JobStageExecutionLogs.tsx
@@ -1,4 +1,4 @@
-import { isEmpty, template } from 'lodash';
+import { template } from 'lodash';
import React from 'react';
import { from as observableFrom, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
@@ -62,7 +62,7 @@ export class JobStageExecutionLogs extends React.Component
Console Output (External)
diff --git a/packages/core/src/pipeline/config/actions/PipelineConfigActions.tsx b/packages/core/src/pipeline/config/actions/PipelineConfigActions.tsx
index b9410afd175..b5d185469cf 100644
--- a/packages/core/src/pipeline/config/actions/PipelineConfigActions.tsx
+++ b/packages/core/src/pipeline/config/actions/PipelineConfigActions.tsx
@@ -18,6 +18,7 @@ export interface IPipelineConfigActionsProps {
}
export function PipelineConfigActions(props: IPipelineConfigActionsProps) {
+ const closeDropdown = () => document.body.click();
const {
pipeline,
renamePipeline,
@@ -36,7 +37,7 @@ export function PipelineConfigActions(props: IPipelineConfigActionsProps) {
{pipeline.strategy === true ? 'Strategy' : 'Pipeline'} Actions
-
+
{!pipeline.locked && }
{!pipeline.locked && }
{!pipeline.locked && pipeline.disabled && }
diff --git a/packages/core/src/pipeline/config/graph/PipelineGraph.tsx b/packages/core/src/pipeline/config/graph/PipelineGraph.tsx
index 407cb31c56c..8fe61e9f6ac 100644
--- a/packages/core/src/pipeline/config/graph/PipelineGraph.tsx
+++ b/packages/core/src/pipeline/config/graph/PipelineGraph.tsx
@@ -117,15 +117,22 @@ export class PipelineGraph extends React.Component();
const result: number[] = [];
- this.collect(node.children, result);
+ this.collect(node.children, result, checkedNodeIds);
return max(result);
}
- private collect(nodes: IPipelineGraphNode[], result: number[]) {
+ private collect(nodes: IPipelineGraphNode[], result: number[], checkedNodeIds: Set) {
nodes.forEach((node) => {
+ if (checkedNodeIds.has(node.id)) {
+ return;
+ } else {
+ checkedNodeIds.add(node.id);
+ }
+
if (node.children.length) {
- this.collect(node.children, result);
+ this.collect(node.children, result, checkedNodeIds);
} else {
result.push(node.phase);
}
diff --git a/packages/core/src/pipeline/config/stages/bakeManifest/BakeManifestConfig.tsx b/packages/core/src/pipeline/config/stages/bakeManifest/BakeManifestConfig.tsx
index afc34ef8c76..fda2fadfef9 100644
--- a/packages/core/src/pipeline/config/stages/bakeManifest/BakeManifestConfig.tsx
+++ b/packages/core/src/pipeline/config/stages/bakeManifest/BakeManifestConfig.tsx
@@ -4,7 +4,7 @@ import React from 'react';
import { BakeManifestStageForm, validateProducedArtifacts } from './BakeManifestStageForm';
import { FormikStageConfig } from '../FormikStageConfig';
-import { HELM_RENDERERS } from './ManifestRenderers';
+import { HELM_RENDERERS, HELMFILE_RENDERER } from './ManifestRenderers';
import type { IStageConfigProps } from '../common';
import type { IExpectedArtifact, IStage } from '../../../../domain';
import { FormValidator } from '../../../../presentation';
@@ -46,6 +46,9 @@ export function validateBakeManifestStage(stage: IStage): FormikErrors {
if (HELM_RENDERERS.includes(stage.templateRenderer)) {
formValidator.field('outputName', 'Name').required();
}
+ if (HELMFILE_RENDERER === stage.templateRenderer) {
+ formValidator.field('outputName', 'Name').required();
+ }
return formValidator.validateForm();
}
diff --git a/packages/core/src/pipeline/config/stages/bakeManifest/BakeManifestDetailsTab.tsx b/packages/core/src/pipeline/config/stages/bakeManifest/BakeManifestDetailsTab.tsx
index 40721c848f1..3c5fa658b03 100644
--- a/packages/core/src/pipeline/config/stages/bakeManifest/BakeManifestDetailsTab.tsx
+++ b/packages/core/src/pipeline/config/stages/bakeManifest/BakeManifestDetailsTab.tsx
@@ -3,10 +3,12 @@ import React from 'react';
import type { IExecutionDetailsSectionProps } from '../common';
import { ExecutionDetailsSection } from '../common';
import { StageFailureMessage } from '../../../details';
-import type { IArtifact } from '../../../../domain';
+import { ARTIFACT_TYPE_EMBEDDED } from '../../../../domain';
import { ManifestYaml } from '../../../../manifest';
import { Overridable } from '../../../../overrideRegistry';
import { decodeUnicodeBase64 } from '../../../../utils';
+import { getBakedArtifacts } from './utils/getBakedArtifacts';
+import { getContentReference } from './utils/getContentReference';
@Overridable('bakeManifest.bakeManifestDetailsTab')
export class BakeManifestDetailsTab extends React.Component {
@@ -14,20 +16,30 @@ export class BakeManifestDetailsTab extends React.Component a.type === 'embedded/base64',
- );
+ const bakedArtifacts = getBakedArtifacts(stage.context);
+
return (
- {bakedArtifacts.map((artifact, i) => (
- 1 ? `Baked Manifest ${i} YAML` : 'Baked Manifest YAML'}
- manifestText={decodeUnicodeBase64(artifact.reference)}
- modalTitle="Baked Manifest"
- />
- ))}
+ {bakedArtifacts.map((artifact, i) => {
+ const linkName = bakedArtifacts.length > 1 ? `Baked Manifest ${i} YAML` : 'Baked Manifest YAML';
+
+ return artifact.type === ARTIFACT_TYPE_EMBEDDED ? (
+
+ ) : (
+
+ );
+ })}
);
}
diff --git a/packages/core/src/pipeline/config/stages/bakeManifest/BakeManifestStageForm.tsx b/packages/core/src/pipeline/config/stages/bakeManifest/BakeManifestStageForm.tsx
index 9da513a5af4..623f17b4677 100644
--- a/packages/core/src/pipeline/config/stages/bakeManifest/BakeManifestStageForm.tsx
+++ b/packages/core/src/pipeline/config/stages/bakeManifest/BakeManifestStageForm.tsx
@@ -2,11 +2,12 @@ import { isNil } from 'lodash';
import React from 'react';
import type { IFormikStageConfigInjectedProps } from '../FormikStageConfig';
-import { HELM_RENDERERS, KUSTOMIZE_RENDERERS } from './ManifestRenderers';
+import { HELM_RENDERERS, HELMFILE_RENDERER, KUSTOMIZE_RENDERERS } from './ManifestRenderers';
import { ExpectedArtifactService } from '../../../../artifact';
import { StageConfigField } from '../common';
import type { IExpectedArtifact } from '../../../../domain';
import { BakeHelmConfigForm } from './helm/BakeHelmConfigForm';
+import { BakeHelmfileConfigForm } from './helmfile/BakeHelmfileConfigForm';
import { BakeKustomizeConfigForm } from './kustomize/BakeKustomizeConfigForm';
import { ReactSelectInput } from '../../../../presentation';
import { BASE_64_ARTIFACT_ACCOUNT, BASE_64_ARTIFACT_TYPE } from '../../triggers/artifacts/base64/Base64ArtifactEditor';
@@ -32,10 +33,13 @@ export function BakeManifestStageForm({ application, formik, pipeline }: IFormik
if (HELM_RENDERERS.includes(stage.templateRenderer) && !isNil(stage.inputArtifact)) {
formik.setFieldValue('inputArtifact', null);
}
+ if (HELMFILE_RENDERER === stage.templateRenderer && !isNil(stage.inputArtifact)) {
+ formik.setFieldValue('inputArtifact', null);
+ }
}, [stage.templateRenderer]);
const templateRenderers = React.useMemo(() => {
- return [...KUSTOMIZE_RENDERERS, ...HELM_RENDERERS];
+ return [...KUSTOMIZE_RENDERERS, ...HELM_RENDERERS, HELMFILE_RENDERER];
}, []);
return (
@@ -62,6 +66,9 @@ export function BakeManifestStageForm({ application, formik, pipeline }: IFormik
{HELM_RENDERERS.includes(stage.templateRenderer) && (
)}
+ {HELMFILE_RENDERER === stage.templateRenderer && (
+
+ )}
);
diff --git a/packages/core/src/pipeline/config/stages/bakeManifest/ManifestRenderers.ts b/packages/core/src/pipeline/config/stages/bakeManifest/ManifestRenderers.ts
index 91a06ab0b59..f41d52815cd 100644
--- a/packages/core/src/pipeline/config/stages/bakeManifest/ManifestRenderers.ts
+++ b/packages/core/src/pipeline/config/stages/bakeManifest/ManifestRenderers.ts
@@ -1,11 +1,13 @@
export enum ManifestRenderers {
HELM2 = 'HELM2',
HELM3 = 'HELM3',
+ HELMFILE = 'HELMFILE',
KUSTOMIZE = 'KUSTOMIZE',
KUSTOMIZE4 = 'KUSTOMIZE4',
}
export const HELM_RENDERERS: Readonly = [ManifestRenderers.HELM2, ManifestRenderers.HELM3];
+export const HELMFILE_RENDERER: Readonly = ManifestRenderers.HELMFILE;
export const KUSTOMIZE_RENDERERS: Readonly = [
ManifestRenderers.KUSTOMIZE,
ManifestRenderers.KUSTOMIZE4,
diff --git a/packages/core/src/pipeline/config/stages/bakeManifest/helm/BakeHelmConfigForm.tsx b/packages/core/src/pipeline/config/stages/bakeManifest/helm/BakeHelmConfigForm.tsx
index 6b6d2a74964..2f45d3b44ee 100644
--- a/packages/core/src/pipeline/config/stages/bakeManifest/helm/BakeHelmConfigForm.tsx
+++ b/packages/core/src/pipeline/config/stages/bakeManifest/helm/BakeHelmConfigForm.tsx
@@ -10,6 +10,7 @@ import {
StageArtifactSelectorDelegate,
} from '../../../../../artifact';
import { StageConfigField } from '../../common/stageConfigField/StageConfigField';
+import { SETTINGS } from '../../../../../config';
import type { IArtifact, IExpectedArtifact } from '../../../../../domain';
import { MapEditor } from '../../../../../forms';
import { CheckboxInput, TextInput } from '../../../../../presentation';
@@ -152,9 +153,30 @@ export class BakeHelmConfigForm extends React.Component
Helm Options
+ {enableApiVersions && ( // Only render if enableApiVersions is true
+ <>
+
+ ) => {
+ this.props.formik.setFieldValue('apiVersions', e.target.value);
+ }}
+ value={stage.apiVersions}
+ />
+
+
+ ) => {
+ this.props.formik.setFieldValue('kubeVersion', e.target.value);
+ }}
+ value={stage.kubeVersion}
+ />
+
+ >
+ )}
) => {
diff --git a/packages/core/src/pipeline/config/stages/bakeManifest/helmfile/BakeHelmfileConfigForm.spec.tsx b/packages/core/src/pipeline/config/stages/bakeManifest/helmfile/BakeHelmfileConfigForm.spec.tsx
new file mode 100644
index 00000000000..c2746d12fb3
--- /dev/null
+++ b/packages/core/src/pipeline/config/stages/bakeManifest/helmfile/BakeHelmfileConfigForm.spec.tsx
@@ -0,0 +1,132 @@
+import { mock } from 'angular';
+import { mount } from 'enzyme';
+import React from 'react';
+
+import { StageConfigField } from '../../../..';
+import { BakeHelmfileConfigForm } from './BakeHelmfileConfigForm';
+import { AccountService } from '../../../../../account';
+import { ApplicationModelBuilder } from '../../../../../application';
+import { ExpectedArtifactService } from '../../../../../artifact';
+import type { IExpectedArtifact, IStage } from '../../../../../domain';
+import { SpinFormik } from '../../../../../presentation';
+import { REACT_MODULE } from '../../../../../reactShims';
+
+describe(' ', () => {
+ beforeEach(mock.module(REACT_MODULE));
+ beforeEach(mock.inject());
+
+ const helmfileFilePathFieldName = 'Helmfile File Path';
+
+ const getProps = () => {
+ return {
+ application: ApplicationModelBuilder.createApplicationForTests('my-application'),
+ pipeline: {
+ application: 'my-application',
+ id: 'pipeline-id',
+ limitConcurrent: true,
+ keepWaitingPipelines: true,
+ name: 'My Pipeline',
+ parameterConfig: [],
+ stages: [],
+ triggers: [],
+ },
+ } as any;
+ };
+
+ beforeEach(() =>
+ spyOn(AccountService, 'getArtifactAccounts').and.returnValue(
+ Promise.resolve([
+ { name: 'gitrepo', types: ['something-else', 'git/repo'] },
+ { name: 'notgitrepo', types: ['something-else'] },
+ ]),
+ ),
+ );
+
+ it('renders the helmfile file path element when the template artifact is from an account that handles git/repo artifacts', async () => {
+ const stage = ({
+ inputArtifacts: [{ account: 'gitrepo' }],
+ } as unknown) as IStage;
+
+ const props = getProps();
+
+ const component = mount(
+ null}
+ validate={() => null}
+ render={(formik) => }
+ />,
+ );
+
+ await new Promise((resolve) => setTimeout(resolve)); // wait one js tick for promise to resolve
+ component.setProps({}); // force a re-render
+
+ expect(component.find(StageConfigField).findWhere((x) => x.text() === helmfileFilePathFieldName).length).toBe(1);
+ });
+
+ it('does not render the helmfile file path element when the template artifact is from an account that does not handle git/repo artifacts', async () => {
+ const stage = ({
+ inputArtifacts: [{ account: 'notgitrepo' }],
+ } as unknown) as IStage;
+
+ const props = getProps();
+
+ const component = mount(
+ null}
+ validate={() => null}
+ render={(formik) => }
+ />,
+ );
+
+ await new Promise((resolve) => setTimeout(resolve)); // wait one js tick for promise to resolve
+ component.setProps({}); // force a re-render
+
+ expect(component.find(StageConfigField).findWhere((x) => x.text() === helmfileFilePathFieldName).length).toBe(0);
+ });
+
+ it('render the helmfile file path if the id of the git artifact is given but the account value does not exist', async () => {
+ const expectedArtifactDisplayName = 'test-artifact';
+ const expectedArtifactId = 'test-artifact-id';
+ const expectedGitArtifact: IExpectedArtifact = {
+ defaultArtifact: {
+ customKind: true,
+ id: 'defaultArtifact-id',
+ },
+ displayName: expectedArtifactDisplayName,
+ id: expectedArtifactId,
+ matchArtifact: {
+ artifactAccount: 'gitrepo',
+ id: expectedArtifactId,
+ reference: 'git repo',
+ type: 'git/repo',
+ version: 'master',
+ },
+ useDefaultArtifact: false,
+ usePriorArtifact: false,
+ };
+ const stage = ({
+ inputArtifacts: [{ id: expectedArtifactId }],
+ } as unknown) as IStage;
+
+ spyOn(ExpectedArtifactService, 'getExpectedArtifactsAvailableToStage').and.returnValue([expectedGitArtifact]);
+
+ const props = getProps();
+
+ const component = mount(
+ null}
+ validate={() => null}
+ render={(formik) => }
+ />,
+ );
+
+ await new Promise((resolve) => setTimeout(resolve)); // wait one js tick for promise to resolve
+ component.setProps({}); // force a re-render
+
+ expect(component.find('.Select-value-label > span').text().includes(expectedArtifactDisplayName)).toBe(true);
+ expect(component.find(StageConfigField).findWhere((x) => x.text() === helmfileFilePathFieldName).length).toBe(1);
+ });
+});
diff --git a/packages/core/src/pipeline/config/stages/bakeManifest/helmfile/BakeHelmfileConfigForm.tsx b/packages/core/src/pipeline/config/stages/bakeManifest/helmfile/BakeHelmfileConfigForm.tsx
new file mode 100644
index 00000000000..0f01263ce61
--- /dev/null
+++ b/packages/core/src/pipeline/config/stages/bakeManifest/helmfile/BakeHelmfileConfigForm.tsx
@@ -0,0 +1,271 @@
+import React from 'react';
+
+import type { IFormikStageConfigInjectedProps } from '../../FormikStageConfig';
+import { AccountService } from '../../../../../account';
+import {
+ ArtifactTypePatterns,
+ excludeAllTypesExcept,
+ ExpectedArtifactService,
+ StageArtifactSelectorDelegate,
+} from '../../../../../artifact';
+import { StageConfigField } from '../../common/stageConfigField/StageConfigField';
+import type { IArtifact, IExpectedArtifact } from '../../../../../domain';
+import { MapEditor } from '../../../../../forms';
+import { CheckboxInput, TextInput } from '../../../../../presentation';
+
+export interface IBakeHelmfileConfigFormState {
+ gitRepoArtifactAccountNames: string[];
+}
+
+export class BakeHelmfileConfigForm extends React.Component<
+ IFormikStageConfigInjectedProps,
+ IBakeHelmfileConfigFormState
+> {
+ constructor(props: IFormikStageConfigInjectedProps) {
+ super(props);
+ this.state = { gitRepoArtifactAccountNames: [] };
+ }
+
+ private static readonly excludedArtifactTypes = excludeAllTypesExcept(
+ ArtifactTypePatterns.BITBUCKET_FILE,
+ ArtifactTypePatterns.CUSTOM_OBJECT,
+ ArtifactTypePatterns.EMBEDDED_BASE64,
+ ArtifactTypePatterns.GCS_OBJECT,
+ ArtifactTypePatterns.GIT_REPO,
+ ArtifactTypePatterns.GITHUB_FILE,
+ ArtifactTypePatterns.GITLAB_FILE,
+ ArtifactTypePatterns.S3_OBJECT,
+ ArtifactTypePatterns.HELM_CHART,
+ ArtifactTypePatterns.HTTP_FILE,
+ ArtifactTypePatterns.ORACLE_OBJECT,
+ );
+
+ public componentDidMount() {
+ const stage = this.props.formik.values;
+ if (stage.inputArtifacts && stage.inputArtifacts.length === 0) {
+ this.props.formik.setFieldValue('inputArtifacts', [
+ {
+ account: '',
+ id: '',
+ },
+ ]);
+ }
+
+ // If the Expected Artifact id is provided but the account is not, then attempt to find the artifact from
+ // upstream stages and set the account value.
+ // This is needed because helmfile file path field will need to be rendered if the artifact has a git repo account type
+ const expectedArtifact = this.getInputArtifact(stage, 0);
+ if (expectedArtifact.id && !expectedArtifact.account) {
+ const availableArtifacts = ExpectedArtifactService.getExpectedArtifactsAvailableToStage(
+ stage,
+ this.props.pipeline,
+ );
+ const expectedMatchedArtifact = availableArtifacts.find((a) => a.id === expectedArtifact.id);
+ if (expectedMatchedArtifact && expectedMatchedArtifact.matchArtifact) {
+ this.props.formik.setFieldValue(
+ `inputArtifacts[0].account`,
+ expectedMatchedArtifact.matchArtifact.artifactAccount,
+ );
+ }
+ }
+
+ AccountService.getArtifactAccounts().then((artifactAccounts) => {
+ this.setState({
+ gitRepoArtifactAccountNames: artifactAccounts
+ .filter((account) => account.types.some((type) => ArtifactTypePatterns.GIT_REPO.test(type)))
+ .map((account) => account.name),
+ });
+ });
+ }
+
+ private onTemplateArtifactEdited = (artifact: IArtifact, index: number) => {
+ this.props.formik.setFieldValue(`inputArtifacts[${index}].id`, null);
+ this.props.formik.setFieldValue(`inputArtifacts[${index}].artifact`, artifact);
+ this.props.formik.setFieldValue(`inputArtifacts[${index}].account`, artifact.artifactAccount);
+ };
+
+ private onTemplateArtifactSelected = (artifact: IExpectedArtifact, index: number) => {
+ this.props.formik.setFieldValue(`inputArtifacts[${index}].id`, artifact.id);
+ this.props.formik.setFieldValue(`inputArtifacts[${index}].artifact`, null);
+ // Set the account to matchArtifact.artifactAccount if it exists.
+ // This account value will be used to determine if the Helm Chart File Path should be displayed.
+ if (artifact.matchArtifact) {
+ this.props.formik.setFieldValue(`inputArtifacts[${index}].account`, artifact.matchArtifact.artifactAccount);
+ } else {
+ this.props.formik.setFieldValue(`inputArtifacts[${index}].account`, null);
+ }
+ };
+
+ private addInputArtifact = () => {
+ const stage = this.props.formik.values;
+ const newInputArtifacts = [
+ ...stage.inputArtifacts,
+ {
+ account: '',
+ id: '',
+ },
+ ];
+
+ this.props.formik.setFieldValue('inputArtifacts', newInputArtifacts);
+ };
+
+ private removeInputArtifact = (index: number) => {
+ const stage = this.props.formik.values;
+ const newInputArtifacts = [...stage.inputArtifacts];
+ newInputArtifacts.splice(index, 1);
+ this.props.formik.setFieldValue('inputArtifacts', newInputArtifacts);
+ };
+
+ private getInputArtifact = (stage: any, index: number) => {
+ if (!stage.inputArtifacts || stage.inputArtifacts.length === 0) {
+ return {
+ account: '',
+ id: '',
+ };
+ } else {
+ return stage.inputArtifacts[index];
+ }
+ };
+
+ private outputNameChange = (outputName: string) => {
+ const stage = this.props.formik.values;
+ const expectedArtifacts = stage.expectedArtifacts;
+ if (
+ expectedArtifacts &&
+ expectedArtifacts.length === 1 &&
+ expectedArtifacts[0].matchArtifact &&
+ expectedArtifacts[0].matchArtifact.type === 'embedded/base64'
+ ) {
+ this.props.formik.setFieldValue('expectedArtifacts', [
+ {
+ ...expectedArtifacts[0],
+ matchArtifact: {
+ ...expectedArtifacts[0].matchArtifact,
+ name: outputName,
+ },
+ },
+ ]);
+ }
+ };
+
+ private overrideChanged = (overrides: any) => {
+ this.props.formik.setFieldValue('overrides', overrides);
+ };
+
+ public render() {
+ const stage = this.props.formik.values;
+ return (
+ <>
+ Helmfile Options
+
+ ) => {
+ this.props.formik.setFieldValue('outputName', e.target.value);
+ this.outputNameChange(e.target.value);
+ }}
+ value={stage.outputName}
+ />
+
+ Template Artifact
+ {
+ this.onTemplateArtifactEdited(artifact, 0);
+ }}
+ onExpectedArtifactSelected={(artifact: IExpectedArtifact) => this.onTemplateArtifactSelected(artifact, 0)}
+ pipeline={this.props.pipeline}
+ stage={stage}
+ />
+ {this.state.gitRepoArtifactAccountNames.includes(this.getInputArtifact(stage, 0).account) && (
+
+ ) => {
+ this.props.formik.setFieldValue('helmfileFilePath', e.target.value);
+ }}
+ value={stage.helmfileFilePath}
+ />
+
+ )}
+ Overrides
+ {stage.inputArtifacts && stage.inputArtifacts.length > 1 && (
+
+ {stage.inputArtifacts.slice(1).map((a: any, index: number) => {
+ return (
+
+
+ {
+ this.onTemplateArtifactEdited(artifact, index + 1);
+ }}
+ onExpectedArtifactSelected={(artifact: IExpectedArtifact) =>
+ this.onTemplateArtifactSelected(artifact, index + 1)
+ }
+ pipeline={this.props.pipeline}
+ stage={stage}
+ />
+
+
+
+ this.removeInputArtifact(index + 1)}>
+
+ Remove field
+
+
+
+
+ );
+ })}
+
+ )}
+
+ this.addInputArtifact()}>
+
+ Add value artifact
+
+
+
+ {stage.overrides && (
+ this.overrideChanged(o)}
+ />
+ )}
+
+
+ this.props.formik.setFieldValue('includeCRDs', !stage.includeCRDs)}
+ />
+
+
+
+ this.props.formik.setFieldValue('evaluateOverrideExpressions', !stage.evaluateOverrideExpressions)
+ }
+ />
+
+ >
+ );
+ }
+}
diff --git a/packages/core/src/pipeline/config/stages/bakeManifest/utils/getBakedArtifacts.ts b/packages/core/src/pipeline/config/stages/bakeManifest/utils/getBakedArtifacts.ts
new file mode 100644
index 00000000000..138ceaf981d
--- /dev/null
+++ b/packages/core/src/pipeline/config/stages/bakeManifest/utils/getBakedArtifacts.ts
@@ -0,0 +1,13 @@
+import type { IArtifact, IExecutionContext } from '../../../../../domain';
+import { ARTIFACT_TYPE_EMBEDDED, ARTIFACT_TYPE_REMOTE } from '../../../../../domain';
+
+// IArtifact type is wrong and does not represent the real value
+export const getBakedArtifacts = (context: IExecutionContext): Array => {
+ if ('artifacts' in context) {
+ return context.artifacts.filter(
+ (a: IArtifact) => (a.type === ARTIFACT_TYPE_EMBEDDED || a.type === ARTIFACT_TYPE_REMOTE) && a.reference,
+ );
+ } else {
+ return [];
+ }
+};
diff --git a/packages/core/src/pipeline/config/stages/bakeManifest/utils/getContentReference.ts b/packages/core/src/pipeline/config/stages/bakeManifest/utils/getContentReference.ts
new file mode 100644
index 00000000000..25e1a83bdac
--- /dev/null
+++ b/packages/core/src/pipeline/config/stages/bakeManifest/utils/getContentReference.ts
@@ -0,0 +1,3 @@
+export const getContentReference = (uri: string): string => {
+ return uri.replace(/^ref?:\/\//, '');
+};
diff --git a/packages/core/src/pipeline/config/triggers/artifacts/ArtifactService.ts b/packages/core/src/pipeline/config/triggers/artifacts/ArtifactService.ts
index 1341ec72f6f..fce989c6756 100644
--- a/packages/core/src/pipeline/config/triggers/artifacts/ArtifactService.ts
+++ b/packages/core/src/pipeline/config/triggers/artifacts/ArtifactService.ts
@@ -11,4 +11,8 @@ export class ArtifactService {
.query({ type: type, artifactName: artifactName })
.get();
}
+
+ public static getArtifactByContentReference(contentRef: string): PromiseLike<{ reference: string }> {
+ return REST(`/artifacts/content-address/${contentRef}`).get();
+ }
}
diff --git a/packages/core/src/pipeline/config/triggers/cdevents/CDEventsTrigger.tsx b/packages/core/src/pipeline/config/triggers/cdevents/CDEventsTrigger.tsx
new file mode 100644
index 00000000000..0aef4a8df40
--- /dev/null
+++ b/packages/core/src/pipeline/config/triggers/cdevents/CDEventsTrigger.tsx
@@ -0,0 +1,48 @@
+import type { FormikProps } from 'formik';
+import React from 'react';
+
+import { SETTINGS } from '../../../../config/settings';
+import type { ICDEventsTrigger } from '../../../../domain';
+import { MapEditorInput } from '../../../../forms';
+import { HelpField } from '../../../../help';
+import { FormikFormField, TextInput } from '../../../../presentation';
+
+export interface ICDEventsTriggerProps {
+ formik: FormikProps;
+}
+
+export function CDEventsTrigger(cdeventsTriggerProps: ICDEventsTriggerProps) {
+ const { formik } = cdeventsTriggerProps;
+ const trigger = formik.values;
+ const { source, type } = trigger;
+
+ return (
+ <>
+ }
+ input={(props) => (
+
+
+ {`${SETTINGS.gateUrl}/webhooks/${type}/${source || ''}`}
+
+ )}
+ />
+
+ }
+ input={(props) => }
+ />
+
+ }
+ input={(props) => }
+ />
+ >
+ );
+}
diff --git a/packages/core/src/pipeline/config/triggers/cdevents/cdevents.trigger.ts b/packages/core/src/pipeline/config/triggers/cdevents/cdevents.trigger.ts
new file mode 100644
index 00000000000..6f672cd5854
--- /dev/null
+++ b/packages/core/src/pipeline/config/triggers/cdevents/cdevents.trigger.ts
@@ -0,0 +1,19 @@
+import { CDEventsTrigger } from './CDEventsTrigger';
+import { ArtifactTypePatterns } from '../../../../artifact';
+import { Registry } from '../../../../registry';
+
+Registry.pipeline.registerTrigger({
+ component: CDEventsTrigger,
+ description: 'Executes the pipeline when a CDEvents webhook is received.',
+ excludedArtifactTypePatterns: [ArtifactTypePatterns.JENKINS_FILE],
+ key: 'cdevents',
+ label: 'CDEvents',
+ validators: [
+ {
+ type: 'serviceAccountAccess',
+ message: `You do not have access to the service account configured in this pipeline's CDEvents trigger.
+ You will not be able to save your edits to this pipeline.`,
+ preventSave: true,
+ },
+ ],
+});
diff --git a/packages/core/src/pipeline/config/triggers/index.ts b/packages/core/src/pipeline/config/triggers/index.ts
index 9305c313067..8dfb6683185 100644
--- a/packages/core/src/pipeline/config/triggers/index.ts
+++ b/packages/core/src/pipeline/config/triggers/index.ts
@@ -1,6 +1,7 @@
'use strict';
import './artifactory/artifactory.trigger';
+import './cdevents/cdevents.trigger';
import './concourse/concourse.trigger';
import './cron/cron.trigger';
import './git/git.trigger';
diff --git a/packages/core/src/pipeline/create/CreatePipelineModal.tsx b/packages/core/src/pipeline/create/CreatePipelineModal.tsx
index 4e38129fbbd..8db23507318 100644
--- a/packages/core/src/pipeline/create/CreatePipelineModal.tsx
+++ b/packages/core/src/pipeline/create/CreatePipelineModal.tsx
@@ -129,7 +129,7 @@ export class CreatePipelineModal extends React.Component 0) {
+ if (isFailed || failedTask || message || messages.length) {
const exceptionTitle = isFailed ? (messages.length ? 'Exceptions' : 'Exception') : 'Warning';
-
- // expression evaluation warnings can get really long and hide actual failure messages, source
- // filter out expression evaluation failure messages if either:
- // - there was a stage failure (and failed expressions don't fail the stage)
- // - expression evaluation was explicitly disabled for the stage(as Orca still processes expressions and populates
- // warnings when evaluation is disabled disabled)
- const shouldFilterExpressionFailures =
- (isFailed && !stage.context?.failOnFailedExpressions) || stage.context?.skipExpressionEvaluation;
-
- if (shouldFilterExpressionFailures) {
- stageMessages = stageMessages.filter((m) => !m.startsWith('Failed to evaluate'));
-
- if (stageMessages.length === 0) {
- // no messages to be displayed after filtering
- return null;
- }
- }
-
- const displayMessages = stageMessages.map((m, i) => (
-
- ));
+ const displayMessages =
+ message || !messages.length ? (
+
+ ) : (
+ messages.map((m, i) => (
+
+ ))
+ );
if (displayMessages) {
return (
diff --git a/packages/core/src/pipeline/executions/Executions.tsx b/packages/core/src/pipeline/executions/Executions.tsx
index 644b4e7af7c..109089d7aa2 100644
--- a/packages/core/src/pipeline/executions/Executions.tsx
+++ b/packages/core/src/pipeline/executions/Executions.tsx
@@ -4,6 +4,7 @@ import React from 'react';
import type { Subscription } from 'rxjs';
import type { Application } from '../../application';
+import type { IDefaultTagFilterConfig } from '../../application/config/defaultTagFilter/DefaultTagFilterConfig';
import { CreatePipeline } from '../config/CreatePipeline';
import { CreatePipelineButton } from '../create/CreatePipelineButton';
import type { IExecution, IPipeline, IPipelineCommand } from '../../domain';
@@ -74,6 +75,16 @@ export class Executions extends React.Component {
+ const defaultTags = this.props.app.attributes.defaultFilteredTags;
+ if (defaultTags != null) {
+ this.props.app.attributes.defaultFilteredTags.forEach((defaultTag: IDefaultTagFilterConfig) => {
+ ExecutionState.filterModel.asFilterModel.sortFilter.tags[`${defaultTag.tagName}:${defaultTag.tagValue}`] = true;
+ });
+ this.updateExecutionGroups(true);
+ }
+ };
+
private clearFilters = (): void => {
ExecutionFilterService.clearFilters();
this.updateExecutionGroups(true);
@@ -235,6 +246,8 @@ export class Executions extends React.Component this.dataInitializationFailure(),
);
+ this.loadDefaultFilters();
+
$q.all([app.executions.ready(), app.pipelineConfigs.ready()]).then(() => {
this.updateExecutionGroups();
const nameOrIdToStart = ReactInjector.$stateParams.startManualExecution;
diff --git a/packages/core/src/pipeline/index.ts b/packages/core/src/pipeline/index.ts
index 289b1232c68..bede03bef96 100644
--- a/packages/core/src/pipeline/index.ts
+++ b/packages/core/src/pipeline/index.ts
@@ -23,3 +23,5 @@ export * from './manualExecution/TriggerTemplate';
export * from './service/ExecutionsTransformer';
export * from './service/execution.service';
export * from './status/ArtifactList';
+export * from './config/stages/bakeManifest/utils/getBakedArtifacts';
+export * from './config/stages/bakeManifest/utils/getContentReference';
diff --git a/packages/core/src/pipeline/status/ExecutionCancellationReason.tsx b/packages/core/src/pipeline/status/ExecutionCancellationReason.tsx
index c6c7debb207..0c4b883910b 100644
--- a/packages/core/src/pipeline/status/ExecutionCancellationReason.tsx
+++ b/packages/core/src/pipeline/status/ExecutionCancellationReason.tsx
@@ -7,7 +7,7 @@ interface IExecutionCancellationReasonProps {
}
export function ExecutionCancellationReason({ cancellationReason }: IExecutionCancellationReasonProps) {
- const [isExpanded, setIsExpanded] = React.useState(false);
+ const [isExpanded, setIsExpanded] = React.useState(true);
return (
<>
diff --git a/packages/core/src/plugins/sharedLibraries.ts b/packages/core/src/plugins/sharedLibraries.ts
index 37e44d3f4e6..fe1a71dc008 100644
--- a/packages/core/src/plugins/sharedLibraries.ts
+++ b/packages/core/src/plugins/sharedLibraries.ts
@@ -8,7 +8,6 @@ import * as reactDOM from 'react-dom';
import * as rxjs from 'rxjs';
import * as spinnakerCore from '../index';
-
export const sharedLibraries = {
// This is the global (window) variable that the shared libs will be exposed on
globalVariablePrefix: 'spinnaker.plugins.sharedLibraries',
@@ -30,7 +29,9 @@ export const sharedLibraries = {
if (destinationObject) {
// Temporarily expose @spinnaker/core.
// This should be removed at some point and replaced with a much smaller spinnaker/ui module which doesn't yet exist
+ exposeSharedLibrary('ajv', require('ajv'));
exposeSharedLibrary('@spinnaker/core', spinnakerCore);
+ exposeSharedLibrary('@spinnaker/kayenta', require('@spinnaker/kayenta'));
exposeSharedLibrary('@uirouter/core', uiRouterCore);
exposeSharedLibrary('@uirouter/react', uiRouterReact);
exposeSharedLibrary('@uirouter/rx', uiRouterRx);
@@ -38,6 +39,9 @@ export const sharedLibraries = {
exposeSharedLibrary('prop-types', propTypes);
exposeSharedLibrary('react', react);
exposeSharedLibrary('react-dom', reactDOM);
+ exposeSharedLibrary('react-redux', require('react-redux'));
+ exposeSharedLibrary('redux-actions', require('redux-actions'));
+ exposeSharedLibrary('reselect', require('reselect'));
exposeSharedLibrary('rxjs', rxjs);
exposeSharedLibrary('rxjs/Observable', { Observable: rxjs.Observable });
}
diff --git a/packages/core/src/presentation/forms/inputs/NumberConcurrencyInput.tsx b/packages/core/src/presentation/forms/inputs/NumberConcurrencyInput.tsx
new file mode 100644
index 00000000000..81970637415
--- /dev/null
+++ b/packages/core/src/presentation/forms/inputs/NumberConcurrencyInput.tsx
@@ -0,0 +1,29 @@
+import React from 'react';
+
+import { useInternalValidator } from './hooks';
+import type { IFormInputProps, OmitControlledInputPropsFrom } from './interface';
+import { orEmptyString, validationClassName } from './utils';
+import type { IValidator } from '../validation';
+import { composeValidators, Validators } from '../validation';
+
+interface INumberInputProps extends IFormInputProps, OmitControlledInputPropsFrom
> {
+ inputClassName?: string;
+}
+
+const isNumber = (val: any): val is number => typeof val === 'number';
+
+export function NumberConcurrencyInput(props: INumberInputProps) {
+ const { value, validation, inputClassName, ...otherProps } = props;
+
+ const minMaxValidator: IValidator = (val: any, label?: string) => {
+ const minValidator = isNumber(props.min) ? Validators.minValue(props.min) : undefined;
+ const maxValidator = isNumber(props.max) ? Validators.maxValue(props.max) : undefined;
+ const validator = composeValidators([minValidator, maxValidator]);
+ return validator ? validator(val, label) : null;
+ };
+
+ useInternalValidator(validation, minMaxValidator);
+
+ const className = `NumberInput form-control ${orEmptyString(inputClassName)} ${validationClassName(validation)}`;
+ return ;
+}
diff --git a/packages/core/src/region/regionSelectField.directive.js b/packages/core/src/region/regionSelectField.directive.js
index 2f110547176..e31ce048672 100644
--- a/packages/core/src/region/regionSelectField.directive.js
+++ b/packages/core/src/region/regionSelectField.directive.js
@@ -48,10 +48,12 @@ module(CORE_REGION_REGIONSELECTFIELD_DIRECTIVE, [])
readOnly: '=',
},
controller: function () {
- const vm = this;
- vm.propagate = function (data) {
- vm.component[vm.field] = data;
- vm.onChange();
+ this.$onInit = () => {
+ const vm = this;
+ vm.propagate = function (data) {
+ vm.component[vm.field] = data;
+ vm.onChange();
+ };
};
},
});
diff --git a/packages/dcos/CHANGELOG.md b/packages/dcos/CHANGELOG.md
index 9ce323e9146..3dcc1b698b9 100644
--- a/packages/dcos/CHANGELOG.md
+++ b/packages/dcos/CHANGELOG.md
@@ -3,6 +3,38 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.0.64](https://github.com/spinnaker/deck/compare/@spinnaker/dcos@0.0.63...@spinnaker/dcos@0.0.64) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/dcos
+
+
+
+
+
+## [0.0.63](https://github.com/spinnaker/deck/compare/@spinnaker/dcos@0.0.62...@spinnaker/dcos@0.0.63) (2023-10-16)
+
+**Note:** Version bump only for package @spinnaker/dcos
+
+
+
+
+
+## [0.0.62](https://github.com/spinnaker/deck/compare/@spinnaker/dcos@0.0.61...@spinnaker/dcos@0.0.62) (2023-09-06)
+
+**Note:** Version bump only for package @spinnaker/dcos
+
+
+
+
+
+## [0.0.61](https://github.com/spinnaker/deck/compare/@spinnaker/dcos@0.0.60...@spinnaker/dcos@0.0.61) (2023-07-20)
+
+**Note:** Version bump only for package @spinnaker/dcos
+
+
+
+
+
## [0.0.60](https://github.com/spinnaker/deck/compare/@spinnaker/dcos@0.0.59...@spinnaker/dcos@0.0.60) (2023-06-02)
**Note:** Version bump only for package @spinnaker/dcos
diff --git a/packages/dcos/package.json b/packages/dcos/package.json
index f7ef35b59ad..2da9021988e 100644
--- a/packages/dcos/package.json
+++ b/packages/dcos/package.json
@@ -1,7 +1,7 @@
{
"name": "@spinnaker/dcos",
"license": "Apache-2.0",
- "version": "0.0.60",
+ "version": "0.0.64",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
"private": true,
@@ -14,16 +14,16 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/core": "^0.24.1",
- "@spinnaker/docker": "^0.0.141",
+ "@spinnaker/core": "^0.28.0",
+ "@spinnaker/docker": "^0.0.145",
"angular": "1.6.10",
"lodash": "4.17.21",
"ngimport": "0.6.1",
"rxjs": "6.6.7"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/eslint-plugin": "^3.0.2",
+ "@spinnaker/scripts": "^0.4.0",
"shx": "0.3.3",
"typescript": "4.3.5"
}
diff --git a/packages/dcos/src/job/general.component.js b/packages/dcos/src/job/general.component.js
index 60a92f4c647..fc94b163527 100644
--- a/packages/dcos/src/job/general.component.js
+++ b/packages/dcos/src/job/general.component.js
@@ -10,20 +10,22 @@ module(DCOS_JOB_GENERAL_COMPONENT, []).component('dcosGeneral', {
},
templateUrl: require('./general.component.html'),
controller: function () {
- if (this.general === undefined || this.general == null) {
- this.general = {
- cpus: 0.01,
- gpus: 0.0,
- mem: 128,
- disk: 0,
- };
- }
+ this.$onInit = () => {
+ if (this.general === undefined || this.general == null) {
+ this.general = {
+ cpus: 0.01,
+ gpus: 0.0,
+ mem: 128,
+ disk: 0,
+ };
+ }
- this.idPattern = {
- test: function (id) {
- const pattern = /^([a-z0-9]*(\${.+})*)*$/;
- return pattern.test(id);
- },
+ this.idPattern = {
+ test: function (id) {
+ const pattern = /^([a-z0-9]*(\${.+})*)*$/;
+ return pattern.test(id);
+ },
+ };
};
},
});
diff --git a/packages/dcos/src/job/labels.component.js b/packages/dcos/src/job/labels.component.js
index 368c5f0e60e..a9e7be693db 100644
--- a/packages/dcos/src/job/labels.component.js
+++ b/packages/dcos/src/job/labels.component.js
@@ -10,8 +10,10 @@ module(DCOS_JOB_LABELS_COMPONENT, []).component('dcosLabels', {
},
templateUrl: require('./labels.component.html'),
controller: function () {
- if (this.labels === undefined || this.labels == null) {
- this.labels = {};
- }
+ this.$onInit = () => {
+ if (this.labels === undefined || this.labels == null) {
+ this.labels = {};
+ }
+ };
},
});
diff --git a/packages/dcos/src/job/schedule.component.js b/packages/dcos/src/job/schedule.component.js
index 099ae672321..ebff6e617d4 100644
--- a/packages/dcos/src/job/schedule.component.js
+++ b/packages/dcos/src/job/schedule.component.js
@@ -10,8 +10,10 @@ module(DCOS_JOB_SCHEDULE_COMPONENT, []).component('dcosSchedule', {
},
templateUrl: require('./schedule.component.html'),
controller: function () {
- if (this.schedule === undefined || this.schedule == null) {
- this.schedule = {};
- }
+ this.$onInit = () => {
+ if (this.schedule === undefined || this.schedule == null) {
+ this.schedule = {};
+ }
+ };
},
});
diff --git a/packages/docker/CHANGELOG.md b/packages/docker/CHANGELOG.md
index dda1a15a983..0aa93b0ef68 100644
--- a/packages/docker/CHANGELOG.md
+++ b/packages/docker/CHANGELOG.md
@@ -3,6 +3,41 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.0.145](https://github.com/spinnaker/deck/compare/@spinnaker/docker@0.0.144...@spinnaker/docker@0.0.145) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/docker
+
+
+
+
+
+## [0.0.144](https://github.com/spinnaker/deck/compare/@spinnaker/docker@0.0.143...@spinnaker/docker@0.0.144) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.0.143](https://github.com/spinnaker/deck/compare/@spinnaker/docker@0.0.142...@spinnaker/docker@0.0.143) (2023-09-06)
+
+**Note:** Version bump only for package @spinnaker/docker
+
+
+
+
+
+## [0.0.142](https://github.com/spinnaker/deck/compare/@spinnaker/docker@0.0.141...@spinnaker/docker@0.0.142) (2023-07-20)
+
+**Note:** Version bump only for package @spinnaker/docker
+
+
+
+
+
## [0.0.141](https://github.com/spinnaker/deck/compare/@spinnaker/docker@0.0.140...@spinnaker/docker@0.0.141) (2023-06-02)
**Note:** Version bump only for package @spinnaker/docker
diff --git a/packages/docker/package.json b/packages/docker/package.json
index 4b6056eff25..3e0186d87fa 100644
--- a/packages/docker/package.json
+++ b/packages/docker/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/docker",
"license": "Apache-2.0",
- "version": "0.0.141",
+ "version": "0.0.145",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,7 +16,7 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/core": "^0.24.1",
+ "@spinnaker/core": "^0.28.0",
"@uirouter/angularjs": "1.0.26",
"angular": "1.6.10",
"formik": "1.5.1",
@@ -24,8 +27,8 @@
"rxjs": "6.6.7"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/eslint-plugin": "^3.0.2",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"@types/lodash": "4.14.64",
"@types/react": "16.14.10",
diff --git a/packages/ecs/CHANGELOG.md b/packages/ecs/CHANGELOG.md
index ba3311153be..aef9af0fd4c 100644
--- a/packages/ecs/CHANGELOG.md
+++ b/packages/ecs/CHANGELOG.md
@@ -3,6 +3,44 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.0.364](https://github.com/spinnaker/deck/compare/@spinnaker/ecs@0.0.363...@spinnaker/ecs@0.0.364) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/ecs
+
+
+
+
+
+## [0.0.363](https://github.com/spinnaker/deck/compare/@spinnaker/ecs@0.0.362...@spinnaker/ecs@0.0.363) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.0.362](https://github.com/spinnaker/deck/compare/@spinnaker/ecs@0.0.361...@spinnaker/ecs@0.0.362) (2023-09-06)
+
+
+### Bug Fixes
+
+* Scaling bounds should parse float not int ([#10026](https://github.com/spinnaker/deck/issues/10026)) ([b763cae](https://github.com/spinnaker/deck/commit/b763cae826039df46b8dbe019689316ff5034e33))
+
+
+
+
+
+## [0.0.361](https://github.com/spinnaker/deck/compare/@spinnaker/ecs@0.0.360...@spinnaker/ecs@0.0.361) (2023-07-20)
+
+**Note:** Version bump only for package @spinnaker/ecs
+
+
+
+
+
## [0.0.360](https://github.com/spinnaker/deck/compare/@spinnaker/ecs@0.0.359...@spinnaker/ecs@0.0.360) (2023-06-02)
**Note:** Version bump only for package @spinnaker/ecs
diff --git a/packages/ecs/package.json b/packages/ecs/package.json
index 4550448185d..deb0451ce8e 100644
--- a/packages/ecs/package.json
+++ b/packages/ecs/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/ecs",
"license": "Apache-2.0",
- "version": "0.0.360",
+ "version": "0.0.364",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,9 +16,9 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/amazon": "^0.13.9",
- "@spinnaker/core": "^0.24.1",
- "@spinnaker/docker": "^0.0.141",
+ "@spinnaker/amazon": "^0.14.3",
+ "@spinnaker/core": "^0.28.0",
+ "@spinnaker/docker": "^0.0.145",
"@uirouter/angularjs": "1.0.26",
"@uirouter/react": "1.0.7",
"angular": "1.6.10",
@@ -28,8 +31,8 @@
"react2angular": "3.2.1"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/eslint-plugin": "^3.0.2",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"@types/angular-ui-bootstrap": "0.13.41",
"@types/lodash": "4.14.64",
diff --git a/packages/ecs/src/serverGroup/serverGroup.transformer.spec.ts b/packages/ecs/src/serverGroup/serverGroup.transformer.spec.ts
index 8d7c5ef0512..679d1b05709 100644
--- a/packages/ecs/src/serverGroup/serverGroup.transformer.spec.ts
+++ b/packages/ecs/src/serverGroup/serverGroup.transformer.spec.ts
@@ -159,7 +159,16 @@ describe('ecsServerGroupTransformer', () => {
[-5, 10, 0],
);
});
-
+ it('verify float adjustments work within the range', function () {
+ this.test(
+ [
+ { id: 1, scalingAdjustment: 10, metricIntervalLowerBound: 3.5, metricIntervalUpperBound: 5.5 },
+ { id: 2, scalingAdjustment: 0, metricIntervalLowerBound: 5.5 },
+ { id: 3, scalingAdjustment: -5, metricIntervalLowerBound: 1.2, metricIntervalUpperBound: 3.5 },
+ ],
+ [-5, 10, 0],
+ );
+ });
it('reverse sorts step adjustments by upper bound when all have an upper bound defined', function () {
this.test(
[
diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md
index a811b8991dc..051dddb6af6 100644
--- a/packages/eslint-plugin/CHANGELOG.md
+++ b/packages/eslint-plugin/CHANGELOG.md
@@ -3,6 +3,17 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [3.0.2](https://github.com/spinnaker/deck/compare/@spinnaker/eslint-plugin@3.0.1...@spinnaker/eslint-plugin@3.0.2) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
## [3.0.1](https://github.com/spinnaker/deck/compare/@spinnaker/eslint-plugin@3.0.0...@spinnaker/eslint-plugin@3.0.1) (2021-11-03)
**Note:** Version bump only for package @spinnaker/eslint-plugin
diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json
index c6d63c25279..3a4347c8188 100644
--- a/packages/eslint-plugin/package.json
+++ b/packages/eslint-plugin/package.json
@@ -1,8 +1,11 @@
{
"name": "@spinnaker/eslint-plugin",
- "version": "3.0.1",
+ "version": "3.0.2",
"main": "index.js",
"license": "Apache-2.0",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"create-rule": "create-rule.js",
"dev": "npm run test:debug",
diff --git a/packages/google/CHANGELOG.md b/packages/google/CHANGELOG.md
index 32bb1045531..5f71ecffbc6 100644
--- a/packages/google/CHANGELOG.md
+++ b/packages/google/CHANGELOG.md
@@ -3,6 +3,41 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.2.12](https://github.com/spinnaker/deck/compare/@spinnaker/google@0.2.11...@spinnaker/google@0.2.12) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/google
+
+
+
+
+
+## [0.2.11](https://github.com/spinnaker/deck/compare/@spinnaker/google@0.2.10...@spinnaker/google@0.2.11) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.2.10](https://github.com/spinnaker/deck/compare/@spinnaker/google@0.2.9...@spinnaker/google@0.2.10) (2023-09-06)
+
+**Note:** Version bump only for package @spinnaker/google
+
+
+
+
+
+## [0.2.9](https://github.com/spinnaker/deck/compare/@spinnaker/google@0.2.8...@spinnaker/google@0.2.9) (2023-07-20)
+
+**Note:** Version bump only for package @spinnaker/google
+
+
+
+
+
## [0.2.8](https://github.com/spinnaker/deck/compare/@spinnaker/google@0.2.7...@spinnaker/google@0.2.8) (2023-06-02)
**Note:** Version bump only for package @spinnaker/google
diff --git a/packages/google/package.json b/packages/google/package.json
index 450f5e4b575..be6976dc73c 100644
--- a/packages/google/package.json
+++ b/packages/google/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/google",
"license": "Apache-2.0",
- "version": "0.2.8",
+ "version": "0.2.12",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,7 +16,7 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/core": "^0.24.1",
+ "@spinnaker/core": "^0.28.0",
"@uirouter/angularjs": "1.0.26",
"angular": "1.6.10",
"angular-ui-bootstrap": "2.5.0",
@@ -26,8 +29,8 @@
"ui-select": "0.19.8"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/eslint-plugin": "^3.0.2",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"@types/angular-mocks": "1.5.10",
"@types/angular-ui-bootstrap": "0.13.41",
diff --git a/packages/google/src/autoscalingPolicy/components/metricSettings/metricSettings.component.js b/packages/google/src/autoscalingPolicy/components/metricSettings/metricSettings.component.js
index c3ceffa0ed4..64f8fd70bbb 100644
--- a/packages/google/src/autoscalingPolicy/components/metricSettings/metricSettings.component.js
+++ b/packages/google/src/autoscalingPolicy/components/metricSettings/metricSettings.component.js
@@ -16,91 +16,93 @@ module(GOOGLE_AUTOSCALINGPOLICY_COMPONENTS_METRICSETTINGS_METRICSETTINGS_COMPONE
},
templateUrl: require('./metricSettings.component.html'),
controller: function () {
- const multipleAllowedFor = {
- cpuUtilization: false,
- loadBalancingUtilization: false,
- customMetricUtilizations: true,
- };
-
- const metricTypes = Object.keys(multipleAllowedFor);
-
- this.targetTypesToDisplayMap = {
- GAUGE: 'Gauge',
- DELTA_PER_SECOND: 'Delta / second',
- DELTA_PER_MINUTE: 'Delta / minute',
- };
-
- this.metricScopeTypesToDisplayMap = {
- TIME_SERIES_PER_INSTANCE: 'Time series per instance',
- SINGLE_TIME_SERIES_PER_GROUP: 'Single time series per group',
- };
-
- this.scalingpolicyTypesToDisplayMap = {
- UTILIZATION_TARGET: 'Utilization target',
- SINGLE_INSTANCE_ASSIGNMENT: 'singleInstanceAssignment',
- };
-
- this.addMetric = (metricType) => {
- if (multipleAllowedFor[metricType]) {
- this.policy[metricType] = this.policy[metricType] || [];
- this.policy[metricType].push({});
- } else if (emptyOrUndefined(this.policy[metricType])) {
- this.policy[metricType] = { utilizationTarget: null };
+ this.$onInit = () => {
+ const multipleAllowedFor = {
+ cpuUtilization: false,
+ loadBalancingUtilization: false,
+ customMetricUtilizations: true,
+ };
+
+ const metricTypes = Object.keys(multipleAllowedFor);
+
+ this.targetTypesToDisplayMap = {
+ GAUGE: 'Gauge',
+ DELTA_PER_SECOND: 'Delta / second',
+ DELTA_PER_MINUTE: 'Delta / minute',
+ };
+
+ this.metricScopeTypesToDisplayMap = {
+ TIME_SERIES_PER_INSTANCE: 'Time series per instance',
+ SINGLE_TIME_SERIES_PER_GROUP: 'Single time series per group',
+ };
+
+ this.scalingpolicyTypesToDisplayMap = {
+ UTILIZATION_TARGET: 'Utilization target',
+ SINGLE_INSTANCE_ASSIGNMENT: 'singleInstanceAssignment',
+ };
+
+ this.addMetric = (metricType) => {
+ if (multipleAllowedFor[metricType]) {
+ this.policy[metricType] = this.policy[metricType] || [];
+ this.policy[metricType].push({});
+ } else if (emptyOrUndefined(this.policy[metricType])) {
+ this.policy[metricType] = { utilizationTarget: null };
+ }
+ };
+
+ this.deleteMetric = (metricType, index) => {
+ if (multipleAllowedFor[metricType]) {
+ this.policy[metricType].splice(index, 1);
+ } else {
+ // sending an empty object to the API deletes the policy.
+ this.policy[metricType] = {};
+ }
+ };
+
+ this.showMetric = (metricType) => {
+ const metric = this.policy[metricType];
+ // should not show policy form if the policy is undefined or an empty object.
+ return !emptyOrUndefined(metric);
+ };
+
+ this.isSingleTimeSeriesPerGroup = (scopeType, index) => {
+ if (this.policy.customMetricUtilizations[index].metricExportScope === scopeType) return true;
+ };
+
+ this.isScalingPolicySingleInstanceAssignment = (policyType, index) => {
+ if (this.policy.customMetricUtilizations[index].scalingpolicy === policyType) return true;
+ };
+
+ this.showNoMetricsWarning = () => {
+ return _.every(
+ metricTypes.map((type) => {
+ return _.some([
+ multipleAllowedFor[type] && !_.get(this.policy, [type, 'length']),
+ emptyOrUndefined(this.policy[type]),
+ ]);
+ }),
+ );
+ };
+
+ this.setUtilizationTargetFromDisplay = (metricType, value) => {
+ this.policy[metricType].utilizationTarget = value / 100;
+ };
+
+ this.initializeTargetDisplay = (metricType) => {
+ this[`${metricType}TargetDisplay`] = safeDecimalToPercent(this.policy[metricType].utilizationTarget);
+ };
+
+ function safeDecimalToPercent(value) {
+ if (value === 0) {
+ return 0;
+ }
+ return value ? Math.round(value * 100) : undefined;
}
- };
- this.deleteMetric = (metricType, index) => {
- if (multipleAllowedFor[metricType]) {
- this.policy[metricType].splice(index, 1);
- } else {
- // sending an empty object to the API deletes the policy.
- this.policy[metricType] = {};
+ function emptyOrUndefined(value) {
+ return _.isEqual(value, {}) || _.isUndefined(value);
}
};
-
- this.showMetric = (metricType) => {
- const metric = this.policy[metricType];
- // should not show policy form if the policy is undefined or an empty object.
- return !emptyOrUndefined(metric);
- };
-
- this.isSingleTimeSeriesPerGroup = (scopeType, index) => {
- if (this.policy.customMetricUtilizations[index].metricExportScope === scopeType) return true;
- };
-
- this.isScalingPolicySingleInstanceAssignment = (policyType, index) => {
- if (this.policy.customMetricUtilizations[index].scalingpolicy === policyType) return true;
- };
-
- this.showNoMetricsWarning = () => {
- return _.every(
- metricTypes.map((type) => {
- return _.some([
- multipleAllowedFor[type] && !_.get(this.policy, [type, 'length']),
- emptyOrUndefined(this.policy[type]),
- ]);
- }),
- );
- };
-
- this.setUtilizationTargetFromDisplay = (metricType, value) => {
- this.policy[metricType].utilizationTarget = value / 100;
- };
-
- this.initializeTargetDisplay = (metricType) => {
- this[`${metricType}TargetDisplay`] = safeDecimalToPercent(this.policy[metricType].utilizationTarget);
- };
-
- function safeDecimalToPercent(value) {
- if (value === 0) {
- return 0;
- }
- return value ? Math.round(value * 100) : undefined;
- }
-
- function emptyOrUndefined(value) {
- return _.isEqual(value, {}) || _.isUndefined(value);
- }
},
},
);
diff --git a/packages/google/src/autoscalingPolicy/components/scalingSchedules/scalingSchedules.component.js b/packages/google/src/autoscalingPolicy/components/scalingSchedules/scalingSchedules.component.js
index cd33bca6503..da976b65ecc 100644
--- a/packages/google/src/autoscalingPolicy/components/scalingSchedules/scalingSchedules.component.js
+++ b/packages/google/src/autoscalingPolicy/components/scalingSchedules/scalingSchedules.component.js
@@ -16,44 +16,46 @@ module(GOOGLE_AUTOSCALINGPOLICY_COMPONENTS_SCALINGSCHEDULES_SCALINGSCHEDULES_COM
},
templateUrl: require('./scalingSchedules.component.html'),
controller: function () {
- const multipleAllowedFor = {
- scalingSchedules: true,
- };
-
- this.timezones = timezones;
-
- this.addSchedule = (scheduleType) => {
- if (multipleAllowedFor[scheduleType]) {
- this.policy[scheduleType] = this.policy[scheduleType] || [];
- this.policy[scheduleType].push({});
- } else if (emptyOrUndefined(this.policy[scheduleType])) {
- this.policy[scheduleType] = {};
- }
- };
-
- this.deleteSchedule = (scheduleType, index) => {
- if (multipleAllowedFor[scheduleType]) {
- this.policy[scheduleType].splice(index, 1);
- } else {
- // sending an empty object to the API deletes the policy.
- this.policy[scheduleType] = {};
+ this.$onInit = () => {
+ const multipleAllowedFor = {
+ scalingSchedules: true,
+ };
+
+ this.timezones = timezones;
+
+ this.addSchedule = (scheduleType) => {
+ if (multipleAllowedFor[scheduleType]) {
+ this.policy[scheduleType] = this.policy[scheduleType] || [];
+ this.policy[scheduleType].push({});
+ } else if (emptyOrUndefined(this.policy[scheduleType])) {
+ this.policy[scheduleType] = {};
+ }
+ };
+
+ this.deleteSchedule = (scheduleType, index) => {
+ if (multipleAllowedFor[scheduleType]) {
+ this.policy[scheduleType].splice(index, 1);
+ } else {
+ // sending an empty object to the API deletes the policy.
+ this.policy[scheduleType] = {};
+ }
+ };
+
+ this.selectTimezone = (timezone, index) => {
+ const { scalingSchedules } = this.policy;
+ const schedule = scalingSchedules[index];
+ scalingSchedules[index] = { ...schedule, timezone };
+
+ this.updatePolicy({
+ ...this.policy,
+ scalingSchedules: [...scalingSchedules],
+ });
+ };
+
+ function emptyOrUndefined(value) {
+ return _.isEqual(value, {}) || _.isUndefined(value);
}
};
-
- this.selectTimezone = (timezone, index) => {
- const { scalingSchedules } = this.policy;
- const schedule = scalingSchedules[index];
- scalingSchedules[index] = { ...schedule, timezone };
-
- this.updatePolicy({
- ...this.policy,
- scalingSchedules: [...scalingSchedules],
- });
- };
-
- function emptyOrUndefined(value) {
- return _.isEqual(value, {}) || _.isUndefined(value);
- }
},
},
);
diff --git a/packages/google/src/loadBalancer/configure/http/backendService/backendService.component.js b/packages/google/src/loadBalancer/configure/http/backendService/backendService.component.js
index feb403f937d..1ce144ef923 100644
--- a/packages/google/src/loadBalancer/configure/http/backendService/backendService.component.js
+++ b/packages/google/src/loadBalancer/configure/http/backendService/backendService.component.js
@@ -18,60 +18,62 @@ module(GOOGLE_LOADBALANCER_CONFIGURE_HTTP_BACKENDSERVICE_BACKENDSERVICE_COMPONEN
},
templateUrl: require('./backendService.component.html'),
controller: function () {
- this.backingData = this.command.backingData;
- this.loadBalancer = this.command.loadBalancer;
- const servicesByName = this.backingData.backendServicesKeyedByName;
+ this.$onInit = () => {
+ this.backingData = this.command.backingData;
+ this.loadBalancer = this.command.loadBalancer;
+ const servicesByName = this.backingData.backendServicesKeyedByName;
- this.onBackendServiceSelect = (selectedBackendService) => {
- assign(selectedBackendService);
- this.command.onHealthCheckSelected(selectedBackendService.healthCheck, this.command);
- };
+ this.onBackendServiceSelect = (selectedBackendService) => {
+ assign(selectedBackendService);
+ this.command.onHealthCheckSelected(selectedBackendService.healthCheck, this.command);
+ };
- this.toggleEditExisting = () => {
- this.editExisting = !this.editExisting;
- if (!this.editExisting) {
- const template = new BackendServiceTemplate();
- assign(template);
- } else {
- delete this.backendService.name;
- }
- };
+ this.toggleEditExisting = () => {
+ this.editExisting = !this.editExisting;
+ if (!this.editExisting) {
+ const template = new BackendServiceTemplate();
+ assign(template);
+ } else {
+ delete this.backendService.name;
+ }
+ };
- this.getAllHealthChecks = () => {
- const allHealthChecks = this.loadBalancer.healthChecks.concat(this.backingData.healthChecks);
- return _.chain(allHealthChecks)
- .filter((hc) => hc.account === this.loadBalancer.credentials || !hc.account)
- .map((hc) => hc.name)
- .uniq()
- .value();
- };
+ this.getAllHealthChecks = () => {
+ const allHealthChecks = this.loadBalancer.healthChecks.concat(this.backingData.healthChecks);
+ return _.chain(allHealthChecks)
+ .filter((hc) => hc.account === this.loadBalancer.credentials || !hc.account)
+ .map((hc) => hc.name)
+ .uniq()
+ .value();
+ };
- this.getSessionAffinitySuggestions = () => {
- if (this.loadBalancer.loadBalancerType === 'HTTP') {
- return ['None', 'Client IP', 'Generated Cookie'];
- } else {
- return ['None', 'Client IP', 'Generated Cookie', 'Header Field', 'HTTP Cookie'];
- }
- };
+ this.getSessionAffinitySuggestions = () => {
+ if (this.loadBalancer.loadBalancerType === 'HTTP') {
+ return ['None', 'Client IP', 'Generated Cookie'];
+ } else {
+ return ['None', 'Client IP', 'Generated Cookie', 'Header Field', 'HTTP Cookie'];
+ }
+ };
- this.getAllServiceNames = () => {
- return this.command.backingData.backendServices
- .filter((service) => service.account === this.loadBalancer.credentials)
- .map((service) => service.name);
- };
+ this.getAllServiceNames = () => {
+ return this.command.backingData.backendServices
+ .filter((service) => service.account === this.loadBalancer.credentials)
+ .map((service) => service.name);
+ };
- this.maxCookieTtl = 60 * 60 * 24; // One day.
+ this.maxCookieTtl = 60 * 60 * 24; // One day.
- const getBackendServiceName = () => {
- return _.get(this, 'backendService.name');
- };
+ const getBackendServiceName = () => {
+ return _.get(this, 'backendService.name');
+ };
- if (servicesByName[getBackendServiceName()]) {
- this.editExisting = true;
- }
+ if (servicesByName[getBackendServiceName()]) {
+ this.editExisting = true;
+ }
- const assign = (toAssign) => {
- this.loadBalancer.backendServices[this.index] = this.backendService = toAssign;
+ const assign = (toAssign) => {
+ this.loadBalancer.backendServices[this.index] = this.backendService = toAssign;
+ };
};
},
},
diff --git a/packages/google/src/loadBalancer/configure/http/basicSettings/basicSettings.component.js b/packages/google/src/loadBalancer/configure/http/basicSettings/basicSettings.component.js
index 5aa9af53513..cd55e60371f 100644
--- a/packages/google/src/loadBalancer/configure/http/basicSettings/basicSettings.component.js
+++ b/packages/google/src/loadBalancer/configure/http/basicSettings/basicSettings.component.js
@@ -15,30 +15,32 @@ module(GOOGLE_LOADBALANCER_CONFIGURE_HTTP_BASICSETTINGS_BASICSETTINGS_COMPONENT,
},
templateUrl: require('./basicSettings.component.html'),
controller: function () {
- const c = this.command;
- this.loadBalancer = c.loadBalancer;
- this.accounts = c.backingData.accounts;
- const loadBalancerMap = c.backingData.loadBalancerMap;
+ this.$onInit = () => {
+ const c = this.command;
+ this.loadBalancer = c.loadBalancer;
+ this.accounts = c.backingData.accounts;
+ const loadBalancerMap = c.backingData.loadBalancerMap;
- this.getName = (loadBalancer, applicationName) => {
- const loadBalancerName = [applicationName, loadBalancer.stack || '', loadBalancer.detail || ''].join('-');
- return _.trimEnd(loadBalancerName, '-');
- };
+ this.getName = (loadBalancer, applicationName) => {
+ const loadBalancerName = [applicationName, loadBalancer.stack || '', loadBalancer.detail || ''].join('-');
+ return _.trimEnd(loadBalancerName, '-');
+ };
- this.updateName = (lb, appName) => {
- lb.urlMapName = this.getName(lb, appName);
- };
+ this.updateName = (lb, appName) => {
+ lb.urlMapName = this.getName(lb, appName);
+ };
- this.accountChanged = (account) => {
- this.existingLoadBalancerNames = _.get(loadBalancerMap, [account, 'urlMapNames']) || [];
- c.onAccountChange(c);
- };
+ this.accountChanged = (account) => {
+ this.existingLoadBalancerNames = _.get(loadBalancerMap, [account, 'urlMapNames']) || [];
+ c.onAccountChange(c);
+ };
- if (!this.loadBalancer.name) {
- this.updateName(this.loadBalancer, this.application.name);
- }
+ if (!this.loadBalancer.name) {
+ this.updateName(this.loadBalancer, this.application.name);
+ }
- this.existingLoadBalancerNames = _.get(loadBalancerMap, [this.loadBalancer.credentials, 'urlMapNames']) || [];
+ this.existingLoadBalancerNames = _.get(loadBalancerMap, [this.loadBalancer.credentials, 'urlMapNames']) || [];
+ };
},
},
);
diff --git a/packages/google/src/loadBalancer/configure/http/healthCheck/healthCheck.component.js b/packages/google/src/loadBalancer/configure/http/healthCheck/healthCheck.component.js
index 7a570dbe077..d21e8de66fa 100644
--- a/packages/google/src/loadBalancer/configure/http/healthCheck/healthCheck.component.js
+++ b/packages/google/src/loadBalancer/configure/http/healthCheck/healthCheck.component.js
@@ -19,49 +19,51 @@ module(GOOGLE_LOADBALANCER_CONFIGURE_HTTP_HEALTHCHECK_HEALTHCHECK_COMPONENT, [])
},
templateUrl: require('./healthCheck.component.html'),
controller: function () {
- this.max = Number.MAX_SAFE_INTEGER;
- this.backingData = this.command.backingData;
- this.loadBalancer = this.command.loadBalancer;
- const healthChecksByName = this.backingData.healthChecksKeyedByName;
+ this.$onInit = () => {
+ this.max = Number.MAX_SAFE_INTEGER;
+ this.backingData = this.command.backingData;
+ this.loadBalancer = this.command.loadBalancer;
+ const healthChecksByName = this.backingData.healthChecksKeyedByName;
- this.onHealthCheckSelect = (selectedHealthCheck) => {
- assign(selectedHealthCheck);
- };
+ this.onHealthCheckSelect = (selectedHealthCheck) => {
+ assign(selectedHealthCheck);
+ };
- this.getAllHealthCheckNames = () => {
- return this.command.backingData.healthChecks
- .filter((hc) => hc.account === this.loadBalancer.credentials)
- .map((hc) => hc.name);
- };
+ this.getAllHealthCheckNames = () => {
+ return this.command.backingData.healthChecks
+ .filter((hc) => hc.account === this.loadBalancer.credentials)
+ .map((hc) => hc.name);
+ };
- this.toggleEditExisting = () => {
- this.editExisting = !this.editExisting;
- if (!this.editExisting) {
- assign(new HealthCheckTemplate());
- } else {
- delete this.healthCheck.name;
- }
- };
+ this.toggleEditExisting = () => {
+ this.editExisting = !this.editExisting;
+ if (!this.editExisting) {
+ assign(new HealthCheckTemplate());
+ } else {
+ delete this.healthCheck.name;
+ }
+ };
- const assign = (toAssign) => {
- this.loadBalancer.healthChecks[this.index] = this.healthCheck = toAssign;
- };
+ const assign = (toAssign) => {
+ this.loadBalancer.healthChecks[this.index] = this.healthCheck = toAssign;
+ };
- const getHealthCheckName = () => {
- return _.get(this, 'healthCheck.name');
- };
+ const getHealthCheckName = () => {
+ return _.get(this, 'healthCheck.name');
+ };
- this.onProtocolChange = () => {
- if (this.healthCheck.healthCheckType !== this.healthCheckType) {
- assign(Object.assign({}, new HealthCheckTemplate(), { healthCheckType: this.healthCheckType }));
- }
- };
+ this.onProtocolChange = () => {
+ if (this.healthCheck.healthCheckType !== this.healthCheckType) {
+ assign(Object.assign({}, new HealthCheckTemplate(), { healthCheckType: this.healthCheckType }));
+ }
+ };
- if (healthChecksByName[getHealthCheckName()]) {
- this.editExisting = true;
- }
+ if (healthChecksByName[getHealthCheckName()]) {
+ this.editExisting = true;
+ }
- this.healthCheckType = this.healthCheck.healthCheckType;
+ this.healthCheckType = this.healthCheck.healthCheckType;
+ };
},
},
);
diff --git a/packages/google/src/loadBalancer/configure/http/hostRule/hostRule.component.js b/packages/google/src/loadBalancer/configure/http/hostRule/hostRule.component.js
index e5aba4bba2b..1b46be912f3 100644
--- a/packages/google/src/loadBalancer/configure/http/hostRule/hostRule.component.js
+++ b/packages/google/src/loadBalancer/configure/http/hostRule/hostRule.component.js
@@ -19,15 +19,17 @@ module(GOOGLE_LOADBALANCER_CONFIGURE_HTTP_HOSTRULE_HOSTRULE_COMPONENT, [
},
templateUrl: require('./hostRule.component.html'),
controller: function () {
- this.loadBalancer = this.command.loadBalancer;
- const pathRules = this.hostRule.pathMatcher.pathRules;
+ this.$onInit = () => {
+ this.loadBalancer = this.command.loadBalancer;
+ const pathRules = this.hostRule.pathMatcher.pathRules;
- this.addPathRule = () => {
- pathRules.push(new PathRuleTemplate());
- };
+ this.addPathRule = () => {
+ pathRules.push(new PathRuleTemplate());
+ };
- this.deletePathRule = (index) => {
- pathRules.splice(index, 1);
+ this.deletePathRule = (index) => {
+ pathRules.splice(index, 1);
+ };
};
},
});
diff --git a/packages/google/src/loadBalancer/configure/http/listeners/listener.component.js b/packages/google/src/loadBalancer/configure/http/listeners/listener.component.js
index eb2607326b6..b365172cd74 100644
--- a/packages/google/src/loadBalancer/configure/http/listeners/listener.component.js
+++ b/packages/google/src/loadBalancer/configure/http/listeners/listener.component.js
@@ -20,61 +20,62 @@ module(GOOGLE_LOADBALANCER_CONFIGURE_HTTP_LISTENERS_LISTENER_COMPONENT, [GCE_ADD
},
templateUrl: require('./listener.component.html'),
controller: function () {
- this.certificates = this.command.backingData.certificates;
- const loadBalancerMap = this.command.backingData.loadBalancerMap;
+ this.$onInit = () => {
+ this.certificates = this.command.backingData.certificates;
+ const loadBalancerMap = this.command.backingData.loadBalancerMap;
- this.getName = (listener, applicationName) => {
- const listenerName = [applicationName, listener.stack || '', listener.detail || ''].join('-');
- return _.trimEnd(listenerName, '-');
- };
+ this.getName = (listener, applicationName) => {
+ const listenerName = [applicationName, listener.stack || '', listener.detail || ''].join('-');
+ return _.trimEnd(listenerName, '-');
+ };
- this.getCertificates = () => {
- return this.command.backingData.certificates
- .filter((certificate) => certificate.account === this.command.loadBalancer.credentials)
- .map((certificate) => certificate.name);
- };
+ this.getCertificates = () => {
+ return this.command.backingData.certificates
+ .filter((certificate) => certificate.account === this.command.loadBalancer.credentials)
+ .map((certificate) => certificate.name);
+ };
- this.getSubnets = () => {
- const ret = this.command.backingData.subnetMap[this.command.loadBalancer.network]
- .filter((subnet) => subnet.region === this.command.loadBalancer.region)
- .map((subnet) => subnet.name);
- return _.uniq(ret);
- };
+ this.getSubnets = () => {
+ const ret = this.command.backingData.subnetMap[this.command.loadBalancer.network]
+ .filter((subnet) => subnet.region === this.command.loadBalancer.region)
+ .map((subnet) => subnet.name);
+ return _.uniq(ret);
+ };
- this.getInternalAddresses = () => {
- const ret = this.command.backingData.addresses.filter(
- (address) =>
- address.addressType === 'INTERNAL' && address.subnetwork.split('/').pop() === this.listener.subnet,
- );
- return ret;
- };
+ this.getInternalAddresses = () => {
+ return this.command.backingData.addresses.filter(
+ (address) =>
+ address.addressType === 'INTERNAL' && address.subnetwork.split('/').pop() === this.listener.subnet,
+ );
+ };
- this.updateName = (listener, appName) => {
- listener.name = this.getName(listener, appName);
- };
+ this.updateName = (listener, appName) => {
+ listener.name = this.getName(listener, appName);
+ };
- this.localListenerHasSameName = () => {
- return (
- this.command.loadBalancer.listeners.filter((listener) => listener.name === this.listener.name).length > 1
- );
- };
-
- this.existingListenerNames = () => {
- return _.get(loadBalancerMap, [this.command.loadBalancer.credentials, 'listeners']);
- };
+ this.localListenerHasSameName = () => {
+ return (
+ this.command.loadBalancer.listeners.filter((listener) => listener.name === this.listener.name).length > 1
+ );
+ };
- this.isHttps = (port) => port === 443 || port === '443';
+ this.existingListenerNames = () => {
+ return _.get(loadBalancerMap, [this.command.loadBalancer.credentials, 'listeners']);
+ };
- if (!this.listener.name) {
- this.updateName(this.listener, this.application.name);
- }
+ this.isHttps = (port) => port === 443 || port === '443';
- this.onAddressSelect = (address) => {
- if (address) {
- this.listener.ipAddress = address.address;
- } else {
- this.listener.ipAddress = null;
+ if (!this.listener.name) {
+ this.updateName(this.listener, this.application.name);
}
+
+ this.onAddressSelect = (address) => {
+ if (address) {
+ this.listener.ipAddress = address.address;
+ } else {
+ this.listener.ipAddress = null;
+ }
+ };
};
},
},
diff --git a/packages/google/src/loadBalancer/details/loadBalancerType/loadBalancerType.component.js b/packages/google/src/loadBalancer/details/loadBalancerType/loadBalancerType.component.js
index 02ef31a770d..1c606f2bc24 100644
--- a/packages/google/src/loadBalancer/details/loadBalancerType/loadBalancerType.component.js
+++ b/packages/google/src/loadBalancer/details/loadBalancerType/loadBalancerType.component.js
@@ -12,16 +12,18 @@ module(GOOGLE_LOADBALANCER_DETAILS_LOADBALANCERTYPE_LOADBALANCERTYPE_COMPONENT,
loadBalancer: '=',
},
controller: function () {
- this.type = (function (lb) {
- if (lb.loadBalancerType === 'HTTP') {
- if (_.isString(lb.certificate)) {
- return 'HTTPS';
+ this.$onInit = () => {
+ this.type = (function (lb) {
+ if (lb.loadBalancerType === 'HTTP') {
+ if (_.isString(lb.certificate)) {
+ return 'HTTPS';
+ } else {
+ return 'HTTP';
+ }
} else {
- return 'HTTP';
+ return lb.loadBalancerType;
}
- } else {
- return lb.loadBalancerType;
- }
- })(this.loadBalancer);
+ })(this.loadBalancer);
+ };
},
});
diff --git a/packages/huaweicloud/CHANGELOG.md b/packages/huaweicloud/CHANGELOG.md
index e4a2e2b0132..8286a826a69 100644
--- a/packages/huaweicloud/CHANGELOG.md
+++ b/packages/huaweicloud/CHANGELOG.md
@@ -3,6 +3,41 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.0.76](https://github.com/spinnaker/deck/compare/@spinnaker/huaweicloud@0.0.75...@spinnaker/huaweicloud@0.0.76) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/huaweicloud
+
+
+
+
+
+## [0.0.75](https://github.com/spinnaker/deck/compare/@spinnaker/huaweicloud@0.0.74...@spinnaker/huaweicloud@0.0.75) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.0.74](https://github.com/spinnaker/deck/compare/@spinnaker/huaweicloud@0.0.73...@spinnaker/huaweicloud@0.0.74) (2023-09-06)
+
+**Note:** Version bump only for package @spinnaker/huaweicloud
+
+
+
+
+
+## [0.0.73](https://github.com/spinnaker/deck/compare/@spinnaker/huaweicloud@0.0.72...@spinnaker/huaweicloud@0.0.73) (2023-07-20)
+
+**Note:** Version bump only for package @spinnaker/huaweicloud
+
+
+
+
+
## [0.0.72](https://github.com/spinnaker/deck/compare/@spinnaker/huaweicloud@0.0.71...@spinnaker/huaweicloud@0.0.72) (2023-06-02)
**Note:** Version bump only for package @spinnaker/huaweicloud
diff --git a/packages/huaweicloud/package.json b/packages/huaweicloud/package.json
index 0bc98dc6c92..1c8e8a8b31a 100644
--- a/packages/huaweicloud/package.json
+++ b/packages/huaweicloud/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/huaweicloud",
"license": "Apache-2.0",
- "version": "0.0.72",
+ "version": "0.0.76",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,12 +16,12 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/core": "^0.24.1",
+ "@spinnaker/core": "^0.28.0",
"angular": "1.6.10"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/eslint-plugin": "^3.0.2",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"shx": "0.3.3",
"typescript": "4.3.5"
diff --git a/packages/kubernetes/CHANGELOG.md b/packages/kubernetes/CHANGELOG.md
index 4edea0ccb75..a9c47e17614 100644
--- a/packages/kubernetes/CHANGELOG.md
+++ b/packages/kubernetes/CHANGELOG.md
@@ -3,6 +3,49 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [0.6.0](https://github.com/spinnaker/deck/compare/@spinnaker/kubernetes@0.5.2...@spinnaker/kubernetes@0.6.0) (2023-12-07)
+
+
+### Features
+
+* Add feature flag for multi block failure messages. ([#10061](https://github.com/spinnaker/deck/issues/10061)) ([374f724](https://github.com/spinnaker/deck/commit/374f724de221d68030a86e1f6452e3303390339a))
+* Split deployment failure messages. ([#10060](https://github.com/spinnaker/deck/issues/10060)) ([73dda48](https://github.com/spinnaker/deck/commit/73dda48caccd969ef562af3f86bc1f17efbdad7f))
+
+
+
+
+
+## [0.5.2](https://github.com/spinnaker/deck/compare/@spinnaker/kubernetes@0.5.1...@spinnaker/kubernetes@0.5.2) (2023-10-16)
+
+
+### Bug Fixes
+
+* **kubernetes:** export rollout restart stage so it's actually available for use ([#10037](https://github.com/spinnaker/deck/issues/10037)) ([c19f9ce](https://github.com/spinnaker/deck/commit/c19f9ce9ca411fe16e865d3d3121d497bce93575))
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.5.1](https://github.com/spinnaker/deck/compare/@spinnaker/kubernetes@0.5.0...@spinnaker/kubernetes@0.5.1) (2023-09-06)
+
+**Note:** Version bump only for package @spinnaker/kubernetes
+
+
+
+
+
+# [0.5.0](https://github.com/spinnaker/deck/compare/@spinnaker/kubernetes@0.4.4...@spinnaker/kubernetes@0.5.0) (2023-07-20)
+
+
+### Features
+
+* **kubernetes:** Add Deck stage for Rolling Restart ([#10012](https://github.com/spinnaker/deck/issues/10012)) ([0b0c45f](https://github.com/spinnaker/deck/commit/0b0c45fa077265c83f7d6d495d4607932ed43680))
+
+
+
+
+
## [0.4.4](https://github.com/spinnaker/deck/compare/@spinnaker/kubernetes@0.4.3...@spinnaker/kubernetes@0.4.4) (2023-06-02)
**Note:** Version bump only for package @spinnaker/kubernetes
diff --git a/packages/kubernetes/package.json b/packages/kubernetes/package.json
index 09f014b8d7a..6a5de0ea9f0 100644
--- a/packages/kubernetes/package.json
+++ b/packages/kubernetes/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/kubernetes",
"license": "Apache-2.0",
- "version": "0.4.4",
+ "version": "0.6.0",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,7 +16,7 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/core": "^0.24.1",
+ "@spinnaker/core": "^0.28.0",
"@uirouter/angularjs": "1.0.26",
"@uirouter/react": "1.0.7",
"angular": "1.6.10",
@@ -35,8 +38,8 @@
"rxjs": "6.6.7"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/eslint-plugin": "^3.0.2",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"@types/angular-ui-bootstrap": "0.13.41",
"@types/dompurify": "^2.3.3",
diff --git a/packages/kubernetes/src/pipelines/stages/deployManifest/manifestStatus/DeployStatus.tsx b/packages/kubernetes/src/pipelines/stages/deployManifest/manifestStatus/DeployStatus.tsx
index 2a09d588fe2..5c94d83c877 100644
--- a/packages/kubernetes/src/pipelines/stages/deployManifest/manifestStatus/DeployStatus.tsx
+++ b/packages/kubernetes/src/pipelines/stages/deployManifest/manifestStatus/DeployStatus.tsx
@@ -2,7 +2,7 @@ import { get } from 'lodash';
import React from 'react';
import type { IExecutionDetailsSectionProps, IManifest } from '@spinnaker/core';
-import { ExecutionDetailsSection, StageFailureMessage } from '@spinnaker/core';
+import { CollapsibleElement, ExecutionDetailsSection, SETTINGS, StageFailureMessage } from '@spinnaker/core';
import { ManifestStatus } from './ManifestStatus';
import type { IStageManifest } from '../../../../manifest/manifest.service';
@@ -87,22 +87,32 @@ export class DeployStatus extends React.Component !!sub.manifest).map((sub) => sub.manifest);
return (
-
-
- {manifests && (
-
-
-
- {manifests.map((manifest) => {
- const uid =
- manifest.manifest.metadata.uid || KubernetesManifestService.manifestIdentifier(manifest.manifest);
- return
;
- })}
+
+
+ {SETTINGS.feature.multiBlockFailureMessages ? (
+ stage.failureMessages.map((failureMessage: any) => (
+
+
+
+ ))
+ ) : (
+
+ )}
+ {!!manifests?.length && (
+
+
+
+ {manifests.map((manifest) => {
+ const uid =
+ manifest.manifest.metadata.uid || KubernetesManifestService.manifestIdentifier(manifest.manifest);
+ return ;
+ })}
+
-
- )}
-
+ )}
+
+
);
}
}
diff --git a/packages/kubernetes/src/pipelines/stages/index.ts b/packages/kubernetes/src/pipelines/stages/index.ts
index 5f117310589..3fea0d97e20 100644
--- a/packages/kubernetes/src/pipelines/stages/index.ts
+++ b/packages/kubernetes/src/pipelines/stages/index.ts
@@ -1,4 +1,5 @@
export * from './deleteManifest/deleteManifestStage';
export * from './deployManifest/deployManifestStage';
export * from './patchManifest/patchManifestStage';
+export * from './rolloutRestartManifest/rolloutRestartManifestStage';
export * from './runJob/runJobStage';
diff --git a/packages/kubernetes/src/pipelines/stages/rolloutRestartManifest/RolloutRestartManifestStageConfig.tsx b/packages/kubernetes/src/pipelines/stages/rolloutRestartManifest/RolloutRestartManifestStageConfig.tsx
new file mode 100644
index 00000000000..bbd7b243303
--- /dev/null
+++ b/packages/kubernetes/src/pipelines/stages/rolloutRestartManifest/RolloutRestartManifestStageConfig.tsx
@@ -0,0 +1,46 @@
+import { defaults } from 'lodash';
+import React from 'react';
+
+import type { Application, IStage, IStageConfigProps } from '@spinnaker/core';
+
+import type { IManifestSelector } from '../../../manifest/selector/IManifestSelector';
+import { SelectorMode } from '../../../manifest/selector/IManifestSelector';
+import { ManifestSelector } from '../../../manifest/selector/ManifestSelector';
+
+export interface IKubernetesManifestStageConfigProps extends IStageConfigProps {
+ application: Application;
+ stage: IManifestSelector & IStage;
+ stageFieldUpdated: () => void;
+}
+
+export class RolloutRestartManifestStageConfig extends React.Component
{
+ public componentDidMount = (): void => {
+ defaults(this.props.stage, {
+ app: this.props.application.name,
+ cloudProvider: 'kubernetes',
+ });
+ this.props.stageFieldUpdated();
+ };
+
+ private onChange = (stage: IManifestSelector): void => {
+ Object.assign(this.props.stage, stage);
+ this.props.stageFieldUpdated();
+ };
+
+ public render() {
+ const selector = { ...this.props.stage };
+ return (
+
+ );
+ }
+}
diff --git a/packages/kubernetes/src/pipelines/stages/rolloutRestartManifest/rolloutRestartManifestStage.ts b/packages/kubernetes/src/pipelines/stages/rolloutRestartManifest/rolloutRestartManifestStage.ts
new file mode 100644
index 00000000000..feef9e559ef
--- /dev/null
+++ b/packages/kubernetes/src/pipelines/stages/rolloutRestartManifest/rolloutRestartManifestStage.ts
@@ -0,0 +1,20 @@
+import { ExecutionDetailsTasks, Registry } from '@spinnaker/core';
+
+import { RolloutRestartManifestStageConfig } from './RolloutRestartManifestStageConfig';
+import { DeployStatus } from '../deployManifest/manifestStatus/DeployStatus';
+import { manifestSelectorValidators } from '../validators/manifestSelectorValidators';
+
+export class RolloutRestartStatus extends DeployStatus {
+ public static title = 'RolloutRestartStatus';
+}
+
+const STAGE_NAME = 'Rollout Restart (Manifest)';
+Registry.pipeline.registerStage({
+ label: STAGE_NAME,
+ description: 'Perform a rolling restart of a manifest.',
+ key: 'rollingRestartManifest',
+ cloudProvider: 'kubernetes',
+ component: RolloutRestartManifestStageConfig,
+ executionDetailsSections: [RolloutRestartStatus, ExecutionDetailsTasks],
+ validators: manifestSelectorValidators(STAGE_NAME),
+});
diff --git a/packages/mocks/package.json b/packages/mocks/package.json
index 48d0399f12f..cbe95bc0900 100644
--- a/packages/mocks/package.json
+++ b/packages/mocks/package.json
@@ -4,6 +4,9 @@
"module": "dist/index.js",
"typings": "dist/index.d.ts",
"license": "Apache-2.0",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"prepublishOnly": "tsc"
},
diff --git a/packages/oracle/CHANGELOG.md b/packages/oracle/CHANGELOG.md
index b6fe2333d59..e3a6f696310 100644
--- a/packages/oracle/CHANGELOG.md
+++ b/packages/oracle/CHANGELOG.md
@@ -3,6 +3,41 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.0.89](https://github.com/spinnaker/deck/compare/@spinnaker/oracle@0.0.88...@spinnaker/oracle@0.0.89) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/oracle
+
+
+
+
+
+## [0.0.88](https://github.com/spinnaker/deck/compare/@spinnaker/oracle@0.0.87...@spinnaker/oracle@0.0.88) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.0.87](https://github.com/spinnaker/deck/compare/@spinnaker/oracle@0.0.86...@spinnaker/oracle@0.0.87) (2023-09-06)
+
+**Note:** Version bump only for package @spinnaker/oracle
+
+
+
+
+
+## [0.0.86](https://github.com/spinnaker/deck/compare/@spinnaker/oracle@0.0.85...@spinnaker/oracle@0.0.86) (2023-07-20)
+
+**Note:** Version bump only for package @spinnaker/oracle
+
+
+
+
+
## [0.0.85](https://github.com/spinnaker/deck/compare/@spinnaker/oracle@0.0.84...@spinnaker/oracle@0.0.85) (2023-06-02)
**Note:** Version bump only for package @spinnaker/oracle
diff --git a/packages/oracle/package.json b/packages/oracle/package.json
index 3c74e5b9a5d..48e0e6120e6 100644
--- a/packages/oracle/package.json
+++ b/packages/oracle/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/oracle",
"license": "Apache-2.0",
- "version": "0.0.85",
+ "version": "0.0.89",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,7 +16,7 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/core": "^0.24.1",
+ "@spinnaker/core": "^0.28.0",
"@uirouter/angularjs": "1.0.26",
"@uirouter/core": "6.0.8",
"angular": "1.6.10",
@@ -22,8 +25,8 @@
"ngimport": "0.6.1"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/eslint-plugin": "^3.0.2",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"@types/angular-ui-bootstrap": "0.13.41",
"@types/lodash": "4.14.64",
diff --git a/packages/pluginsdk-peerdeps/CHANGELOG.md b/packages/pluginsdk-peerdeps/CHANGELOG.md
index 978bf02945c..922a8557b30 100644
--- a/packages/pluginsdk-peerdeps/CHANGELOG.md
+++ b/packages/pluginsdk-peerdeps/CHANGELOG.md
@@ -3,6 +3,61 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [0.19.0](https://github.com/spinnaker/deck/compare/@spinnaker/pluginsdk-peerdeps@0.18.0...@spinnaker/pluginsdk-peerdeps@0.19.0) (2023-12-07)
+
+
+### Features
+
+* **peerdep-sync:** Synchronize peerdependencies ([d254239](https://github.com/spinnaker/deck/commit/d254239836fb209de442fcdc3638cbafe5501a41))
+
+
+
+
+
+# [0.18.0](https://github.com/spinnaker/deck/compare/@spinnaker/pluginsdk-peerdeps@0.17.1...@spinnaker/pluginsdk-peerdeps@0.18.0) (2023-10-16)
+
+
+### Features
+
+* **peerdep-sync:** Synchronize peerdependencies ([911444b](https://github.com/spinnaker/deck/commit/911444ba5559637b64fb6fed483ff83f75773f25))
+
+
+
+
+
+## [0.17.1](https://github.com/spinnaker/deck/compare/@spinnaker/pluginsdk-peerdeps@0.17.0...@spinnaker/pluginsdk-peerdeps@0.17.1) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+# [0.17.0](https://github.com/spinnaker/deck/compare/@spinnaker/pluginsdk-peerdeps@0.16.0...@spinnaker/pluginsdk-peerdeps@0.17.0) (2023-09-06)
+
+
+### Features
+
+* **peerdep-sync:** Synchronize peerdependencies ([355310d](https://github.com/spinnaker/deck/commit/355310da81ddc51629ce5d9d191043ced8d9dfd8))
+
+
+
+
+
+# [0.16.0](https://github.com/spinnaker/deck/compare/@spinnaker/pluginsdk-peerdeps@0.15.0...@spinnaker/pluginsdk-peerdeps@0.16.0) (2023-07-20)
+
+
+### Features
+
+* **peerdep-sync:** Synchronize peerdependencies ([b6803c3](https://github.com/spinnaker/deck/commit/b6803c35de202d7f0cc2f80115dffb326dbf1ccd))
+
+
+
+
+
# [0.15.0](https://github.com/spinnaker/deck/compare/@spinnaker/pluginsdk-peerdeps@0.14.0...@spinnaker/pluginsdk-peerdeps@0.15.0) (2023-06-02)
diff --git a/packages/pluginsdk-peerdeps/package.json b/packages/pluginsdk-peerdeps/package.json
index 61c081f4c2d..7e18688aa43 100644
--- a/packages/pluginsdk-peerdeps/package.json
+++ b/packages/pluginsdk-peerdeps/package.json
@@ -1,8 +1,11 @@
{
"name": "@spinnaker/pluginsdk-peerdeps",
"description": "Provides package dependencies to plugin developers",
- "version": "0.15.0",
+ "version": "0.19.0",
"license": "Apache-2.0",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"temp": "./convert-peerdeps.js --from-peerdeps --input package.json --output package.temp.json",
"restoretemp": "./convert-peerdeps.js --to-peerdeps --output package.json --input package.temp.json && rm package.temp.json",
@@ -18,10 +21,10 @@
"@rollup/plugin-replace": "2.4.2",
"@rollup/plugin-typescript": "8.2.1",
"@rollup/plugin-url": "6.0.0",
- "@spinnaker/core": "0.24.1",
+ "@spinnaker/core": "0.28.0",
"@spinnaker/eslint-plugin": "3.0.1",
"@spinnaker/pluginsdk": "*",
- "@spinnaker/presentation": "0.3.0",
+ "@spinnaker/presentation": "0.3.1",
"@types/react": "~16.8.0",
"@uirouter/core": "6.0.4",
"@uirouter/react": "1.0.2",
diff --git a/packages/pluginsdk/CHANGELOG.md b/packages/pluginsdk/CHANGELOG.md
index abff67ed5e3..7bd19751a5d 100644
--- a/packages/pluginsdk/CHANGELOG.md
+++ b/packages/pluginsdk/CHANGELOG.md
@@ -3,6 +3,25 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.3.2](https://github.com/spinnaker/deck/compare/@spinnaker/pluginsdk@0.3.1...@spinnaker/pluginsdk@0.3.2) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/pluginsdk
+
+
+
+
+
+## [0.3.1](https://github.com/spinnaker/deck/compare/@spinnaker/pluginsdk@0.3.0...@spinnaker/pluginsdk@0.3.1) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
# [0.3.0](https://github.com/spinnaker/deck/compare/@spinnaker/pluginsdk@0.2.3...@spinnaker/pluginsdk@0.3.0) (2022-08-03)
diff --git a/packages/pluginsdk/package.json b/packages/pluginsdk/package.json
index f9729899c91..f934d49a00c 100644
--- a/packages/pluginsdk/package.json
+++ b/packages/pluginsdk/package.json
@@ -1,10 +1,13 @@
{
"name": "@spinnaker/pluginsdk",
"description": "Provides blessed opinions (rollup, code format, lint) and packages (react, etc) to plugin developers",
- "version": "0.3.0",
+ "version": "0.3.2",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
"license": "Apache-2.0",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"build": "spinnaker-scripts build",
@@ -19,7 +22,7 @@
"scaffold": "scripts/scaffold.js"
},
"dependencies": {
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/scripts": "^0.4.0",
"check-peer-dependencies": "^4.0.0",
"chokidar": "^3.5.1",
"express": "^4.17.1",
diff --git a/packages/presentation/CHANGELOG.md b/packages/presentation/CHANGELOG.md
index 995196b810b..789116e77f3 100644
--- a/packages/presentation/CHANGELOG.md
+++ b/packages/presentation/CHANGELOG.md
@@ -3,6 +3,17 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.3.1](https://github.com/spinnaker/deck/compare/@spinnaker/presentation@0.3.0...@spinnaker/presentation@0.3.1) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
# [0.3.0](https://github.com/spinnaker/deck/compare/@spinnaker/presentation@0.2.1...@spinnaker/presentation@0.3.0) (2023-06-02)
diff --git a/packages/presentation/package.json b/packages/presentation/package.json
index 0d482427012..9781277a727 100644
--- a/packages/presentation/package.json
+++ b/packages/presentation/package.json
@@ -1,10 +1,13 @@
{
"name": "@spinnaker/presentation",
"description": "Provides re-usable UI components for deck",
- "version": "0.3.0",
+ "version": "0.3.1",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
"license": "Apache-2.0",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"build": "rollup -c",
"clean": "shx rm -rf dist",
diff --git a/packages/scripts/CHANGELOG.md b/packages/scripts/CHANGELOG.md
index 1ae41ed7e2b..5e3fb017944 100644
--- a/packages/scripts/CHANGELOG.md
+++ b/packages/scripts/CHANGELOG.md
@@ -3,6 +3,28 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [0.4.0](https://github.com/spinnaker/deck/compare/@spinnaker/scripts@0.3.1...@spinnaker/scripts@0.4.0) (2023-12-07)
+
+
+### Features
+
+* Expose spinnaker/kayenta to the plugin framework to allow us to create kayenta plugins in Deck ([#10072](https://github.com/spinnaker/deck/issues/10072)) ([dbf0574](https://github.com/spinnaker/deck/commit/dbf0574176cbbca781d970c64dfe49f6911ef8b8))
+
+
+
+
+
+## [0.3.1](https://github.com/spinnaker/deck/compare/@spinnaker/scripts@0.3.0...@spinnaker/scripts@0.3.1) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
# [0.3.0](https://github.com/spinnaker/deck/compare/@spinnaker/scripts@0.2.5...@spinnaker/scripts@0.3.0) (2022-08-03)
diff --git a/packages/scripts/config/rollup.config.base.plugin.js b/packages/scripts/config/rollup.config.base.plugin.js
index 7c353f3e300..17dc1f18578 100644
--- a/packages/scripts/config/rollup.config.base.plugin.js
+++ b/packages/scripts/config/rollup.config.base.plugin.js
@@ -15,7 +15,9 @@ module.exports = {
function spinnakerSharedLibraries() {
// Updates here should also be added in core/src/plugins/sharedLibraries.ts
const libraries = [
+ 'ajv',
'@spinnaker/core',
+ '@spinnaker/kayenta',
'@uirouter/core',
'@uirouter/react',
'@uirouter/rx',
@@ -23,6 +25,9 @@ function spinnakerSharedLibraries() {
'prop-types',
'react',
'react-dom',
+ 'react-redux',
+ 'redux-actions',
+ 'reselect',
'rxjs',
'rxjs/Observable',
];
diff --git a/packages/scripts/package.json b/packages/scripts/package.json
index 745197d9205..78d97939802 100644
--- a/packages/scripts/package.json
+++ b/packages/scripts/package.json
@@ -1,12 +1,15 @@
{
"name": "@spinnaker/scripts",
- "version": "0.3.0",
+ "version": "0.4.0",
"description": "Spinnaker scripts",
"main": "index.js",
"bin": {
"spinnaker-scripts": "./index.js",
"read-write-json": "./read-write-json.js"
},
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {},
"keywords": [],
"author": "",
@@ -18,7 +21,7 @@
"@rollup/plugin-replace": "2.4.2",
"@rollup/plugin-typescript": "^8.1.0",
"@rollup/plugin-url": "^6.0.0",
- "@spinnaker/eslint-plugin": "^3.0.1",
+ "@spinnaker/eslint-plugin": "^3.0.2",
"@spinnaker/styleguide": "^2.0.0",
"@svgr/rollup": "^6.3.1",
"autoprefixer": "^10.4.8",
diff --git a/packages/tencentcloud/CHANGELOG.md b/packages/tencentcloud/CHANGELOG.md
index 420217eb30c..38d47ed41c7 100644
--- a/packages/tencentcloud/CHANGELOG.md
+++ b/packages/tencentcloud/CHANGELOG.md
@@ -3,6 +3,41 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.0.82](https://github.com/spinnaker/deck/compare/@spinnaker/tencentcloud@0.0.81...@spinnaker/tencentcloud@0.0.82) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/tencentcloud
+
+
+
+
+
+## [0.0.81](https://github.com/spinnaker/deck/compare/@spinnaker/tencentcloud@0.0.80...@spinnaker/tencentcloud@0.0.81) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.0.80](https://github.com/spinnaker/deck/compare/@spinnaker/tencentcloud@0.0.79...@spinnaker/tencentcloud@0.0.80) (2023-09-06)
+
+**Note:** Version bump only for package @spinnaker/tencentcloud
+
+
+
+
+
+## [0.0.79](https://github.com/spinnaker/deck/compare/@spinnaker/tencentcloud@0.0.78...@spinnaker/tencentcloud@0.0.79) (2023-07-20)
+
+**Note:** Version bump only for package @spinnaker/tencentcloud
+
+
+
+
+
## [0.0.78](https://github.com/spinnaker/deck/compare/@spinnaker/tencentcloud@0.0.77...@spinnaker/tencentcloud@0.0.78) (2023-06-02)
**Note:** Version bump only for package @spinnaker/tencentcloud
diff --git a/packages/tencentcloud/package.json b/packages/tencentcloud/package.json
index 07b38e712b7..1a5f18d285a 100644
--- a/packages/tencentcloud/package.json
+++ b/packages/tencentcloud/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/tencentcloud",
"license": "Apache-2.0",
- "version": "0.0.78",
+ "version": "0.0.82",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,15 +16,15 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/core": "^0.24.1",
+ "@spinnaker/core": "^0.28.0",
"angular": "1.6.10",
"lodash": "^4.17.19",
"ngimport": "^0.6.0",
"react": "~16.14.0"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/eslint-plugin": "^3.0.2",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"@types/lodash": "4.14.64",
"@types/node": "7.0.5",
diff --git a/packages/titus/CHANGELOG.md b/packages/titus/CHANGELOG.md
index 765619d843c..1907721492c 100644
--- a/packages/titus/CHANGELOG.md
+++ b/packages/titus/CHANGELOG.md
@@ -3,6 +3,41 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [0.5.42](https://github.com/spinnaker/deck/compare/@spinnaker/titus@0.5.41...@spinnaker/titus@0.5.42) (2023-12-07)
+
+**Note:** Version bump only for package @spinnaker/titus
+
+
+
+
+
+## [0.5.41](https://github.com/spinnaker/deck/compare/@spinnaker/titus@0.5.40...@spinnaker/titus@0.5.41) (2023-10-16)
+
+
+### Bug Fixes
+
+* **publish:** set access config in deck libraries ([#10049](https://github.com/spinnaker/deck/issues/10049)) ([2a5ebe2](https://github.com/spinnaker/deck/commit/2a5ebe25662eeb9d41b5071749266bf9d6d51104))
+
+
+
+
+
+## [0.5.40](https://github.com/spinnaker/deck/compare/@spinnaker/titus@0.5.39...@spinnaker/titus@0.5.40) (2023-09-06)
+
+**Note:** Version bump only for package @spinnaker/titus
+
+
+
+
+
+## [0.5.39](https://github.com/spinnaker/deck/compare/@spinnaker/titus@0.5.38...@spinnaker/titus@0.5.39) (2023-07-20)
+
+**Note:** Version bump only for package @spinnaker/titus
+
+
+
+
+
## [0.5.38](https://github.com/spinnaker/deck/compare/@spinnaker/titus@0.5.37...@spinnaker/titus@0.5.38) (2023-06-02)
**Note:** Version bump only for package @spinnaker/titus
diff --git a/packages/titus/package.json b/packages/titus/package.json
index 027e81a9b2e..02442504b7b 100644
--- a/packages/titus/package.json
+++ b/packages/titus/package.json
@@ -1,9 +1,12 @@
{
"name": "@spinnaker/titus",
"license": "Apache-2.0",
- "version": "0.5.38",
+ "version": "0.5.42",
"module": "dist/index.js",
"typings": "dist/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"clean": "shx rm -rf dist",
"prepublishOnly": "npm run build",
@@ -13,9 +16,9 @@
"lib": "npm run build"
},
"dependencies": {
- "@spinnaker/amazon": "^0.13.9",
- "@spinnaker/core": "^0.24.1",
- "@spinnaker/docker": "^0.0.141",
+ "@spinnaker/amazon": "^0.14.3",
+ "@spinnaker/core": "^0.28.0",
+ "@spinnaker/docker": "^0.0.145",
"@spinnaker/mocks": "1.0.7",
"@uirouter/angularjs": "1.0.26",
"@uirouter/react": "1.0.7",
@@ -33,8 +36,8 @@
"rxjs": "6.6.7"
},
"devDependencies": {
- "@spinnaker/eslint-plugin": "^3.0.1",
- "@spinnaker/scripts": "^0.3.0",
+ "@spinnaker/eslint-plugin": "^3.0.2",
+ "@spinnaker/scripts": "^0.4.0",
"@types/angular": "1.6.26",
"@types/angular-ui-bootstrap": "0.13.41",
"@types/lodash": "4.14.64",
diff --git a/packages/tsconfig.app.base.json b/packages/tsconfig.app.base.json
index f51d62ea226..c3004c06e99 100644
--- a/packages/tsconfig.app.base.json
+++ b/packages/tsconfig.app.base.json
@@ -6,7 +6,7 @@
"jsx": "react",
"module": "esnext",
"sourceMap": true,
- "target": "es2018",
+ "target": "es2019",
// strict checks
"noImplicitAny": true,
diff --git a/packages/tsconfig.tools.base.json b/packages/tsconfig.tools.base.json
index ce38bda8d31..05c4577aba7 100644
--- a/packages/tsconfig.tools.base.json
+++ b/packages/tsconfig.tools.base.json
@@ -6,7 +6,7 @@
"esModuleInterop": true,
"experimentalDecorators": true,
"jsx": "react",
- "lib": ["es2017", "dom"],
+ "lib": ["es2019", "dom"],
"module": "esnext",
"moduleResolution": "node",
"noImplicitAny": true,
diff --git a/tsconfig.json b/tsconfig.json
index 978da4e0ae8..5fc13ad8c96 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -8,7 +8,7 @@
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"jsx": "react",
- "lib": ["es2017", "dom", "ES2018.Promise"],
+ "lib": ["es2019", "dom"],
"moduleResolution": "node",
"module": "esnext",
"noEmitHelpers": false,
diff --git a/version.json b/version.json
index cc9eaea11e9..7f73eb57876 100644
--- a/version.json
+++ b/version.json
@@ -1,4 +1,4 @@
{
- "version": "n/a",
- "created": 1683116302016
-}
\ No newline at end of file
+ "version": "n/a",
+ "created": 1683116302016
+}
diff --git a/yarn.lock b/yarn.lock
index ff1723e3835..3d3034a9dea 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1880,6 +1880,11 @@
ts-node "^9"
tslib "^2"
+"@esbuild/linux-loong64@0.14.54":
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028"
+ integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==
+
"@eslint/eslintrc@^0.4.1", "@eslint/eslintrc@^0.4.3":
version "0.4.3"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
@@ -3505,22 +3510,22 @@
resolved "https://registry.yarnpkg.com/@spinnaker/core/-/core-0.0.549.tgz#e7246140825705e6d295c30010de4f71a78d1670"
integrity sha512-8EDwICoaqOtWFYQHvSNrTNh0ksIEVp9i/GueClvHbrcSRxYOqPDxQcSs3RGihxahjlfXIi7zjqvK0aDvSYBo0w==
-"@spinnaker/kayenta@2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@spinnaker/kayenta/-/kayenta-2.0.0.tgz#0fc18a641ee2577c21c0bdf5eb24ac1a5ab1caf5"
- integrity sha512-h0Vu1X6wXBJwqXfrosc4d3DbyWuv7u7cSfMAt+BPFcbu3qU9Ua2TF9jSGRcMvI0Vo3C+fC+HxufvKJh7ZQ83vg==
+"@spinnaker/kayenta@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@spinnaker/kayenta/-/kayenta-2.1.0.tgz#d2a3c02034ea38014ae1565724b2e4d7a36dd593"
+ integrity sha512-8HhcEFjjibPCGxzkKZ6KPIo0lBAFHa8GSEUILmp5AN2IkGIB98OKRCZ7bwg0LOg+BnW8g1a9TydZE2OkQA26Mg==
dependencies:
"@uirouter/core" "6.0.4"
"@uirouter/react" "1.0.2"
"@uirouter/react-hybrid" "1.0.2"
angular-ui-bootstrap "^2.5.0"
- ansi_up "^4.0.4"
+ ansi_up "^5.0.0"
bootstrap "3.4.1"
class-autobind-decorator "^2.2.1"
human-readable-ids "^1.0.4"
lodash "4.17.21"
lodash-decorators "4.5.0"
- lodash-es "4.17.15"
+ lodash-es "4.17.21"
memoize-one "^4.0.2"
ngimport "^0.6.0"
react "~16.14.0"
@@ -3797,7 +3802,7 @@
dependencies:
"@types/angular" "*"
-"@types/angular@*", "@types/angular@1.6.26", "@types/angular@>=1.5", "@types/angular@^1.6.16", "@types/angular@^1.6.34", "@types/angular@^1.6.39":
+"@types/angular@*", "@types/angular@1.6.26", "@types/angular@1.8.5", "@types/angular@>=1.5", "@types/angular@^1.6.16", "@types/angular@^1.6.34", "@types/angular@^1.6.39":
version "1.6.26"
resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.6.26.tgz#a96cccef648de0bf7435f3b9bad13f2430719305"
integrity sha512-PdoZ2kKe2AytqVSReTdqYV1Wxqf70zREnys+kCeAh0wUMXOZboA1IFzqcKOxUMRGEL2npbfCCiv2FJBOaOCdNA==
@@ -4858,10 +4863,10 @@ ansi_up@5.1.0:
resolved "https://registry.yarnpkg.com/ansi_up/-/ansi_up-5.1.0.tgz#9cf10e6d359bb434bdcfab5ae4c3abfe1617b6db"
integrity sha512-3wwu+nJCKBVBwOCurm0uv91lMoVkhFB+3qZQz3U11AmAdDJ4tkw1sNPWJQcVxMVYwe0pGEALOjSBOxdxNc+pNQ==
-ansi_up@^4.0.4:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/ansi_up/-/ansi_up-4.0.4.tgz#5b8c35f0b02e4476f3f18cf89c3bf48d15d054f6"
- integrity sha512-vRxC8q6QY918MbehO869biJW4tiunJdjOhi5fpY6NLOliBQlZhOkKgABJKJqH+JZfb/WfjvjN1chLWI6tODerw==
+ansi_up@^5.0.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/ansi_up/-/ansi_up-5.2.1.tgz#9437082c7ad4975c15ec57d30a6b55da295bee36"
+ integrity sha512-5bz5T/7FRmlxA37zDXhG6cAwlcZtfnmNLDJra66EEIT3kYlw5aPJdbkJEhm59D6kA4Wi5ict6u6IDYHJaQlH+g==
any-observable@^0.3.0:
version "0.3.0"
@@ -8109,11 +8114,138 @@ es6-templates@^0.2.3:
recast "~0.11.12"
through "~2.3.6"
-esbuild@^0.12.14, esbuild@^0.12.8:
+esbuild-android-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be"
+ integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==
+
+esbuild-android-arm64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771"
+ integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==
+
+esbuild-darwin-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25"
+ integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==
+
+esbuild-darwin-arm64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73"
+ integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==
+
+esbuild-freebsd-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d"
+ integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==
+
+esbuild-freebsd-arm64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48"
+ integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==
+
+esbuild-linux-32@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5"
+ integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==
+
+esbuild-linux-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652"
+ integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==
+
+esbuild-linux-arm64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b"
+ integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==
+
+esbuild-linux-arm@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59"
+ integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==
+
+esbuild-linux-mips64le@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34"
+ integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==
+
+esbuild-linux-ppc64le@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e"
+ integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==
+
+esbuild-linux-riscv64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8"
+ integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==
+
+esbuild-linux-s390x@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6"
+ integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==
+
+esbuild-netbsd-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81"
+ integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==
+
+esbuild-openbsd-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b"
+ integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==
+
+esbuild-sunos-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da"
+ integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==
+
+esbuild-windows-32@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31"
+ integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==
+
+esbuild-windows-64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4"
+ integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==
+
+esbuild-windows-arm64@0.14.54:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982"
+ integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==
+
+esbuild@^0.12.14:
version "0.12.20"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.12.20.tgz#4d3c9d83c99a4031e027b42a4c398c23b6827cb0"
integrity sha512-u7+0qTo9Z64MD9PhooEngCmzyEYJ6ovFhPp8PLNh3UasR5Ihjv6HWVXqm8uHmasdQlpsAf0IsY4U0YVUfCpt4Q==
+esbuild@^0.14.27:
+ version "0.14.54"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2"
+ integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==
+ optionalDependencies:
+ "@esbuild/linux-loong64" "0.14.54"
+ esbuild-android-64 "0.14.54"
+ esbuild-android-arm64 "0.14.54"
+ esbuild-darwin-64 "0.14.54"
+ esbuild-darwin-arm64 "0.14.54"
+ esbuild-freebsd-64 "0.14.54"
+ esbuild-freebsd-arm64 "0.14.54"
+ esbuild-linux-32 "0.14.54"
+ esbuild-linux-64 "0.14.54"
+ esbuild-linux-arm "0.14.54"
+ esbuild-linux-arm64 "0.14.54"
+ esbuild-linux-mips64le "0.14.54"
+ esbuild-linux-ppc64le "0.14.54"
+ esbuild-linux-riscv64 "0.14.54"
+ esbuild-linux-s390x "0.14.54"
+ esbuild-netbsd-64 "0.14.54"
+ esbuild-openbsd-64 "0.14.54"
+ esbuild-sunos-64 "0.14.54"
+ esbuild-windows-32 "0.14.54"
+ esbuild-windows-64 "0.14.54"
+ esbuild-windows-arm64 "0.14.54"
+
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
@@ -10346,6 +10478,13 @@ is-ci@^3.0.0:
dependencies:
ci-info "^3.1.1"
+is-core-module@^2.13.0:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db"
+ integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==
+ dependencies:
+ has "^1.0.3"
+
is-core-module@^2.2.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
@@ -12041,12 +12180,7 @@ lodash-decorators@4.5.0:
dependencies:
tslib "^1.7.1"
-lodash-es@4.17.15:
- version "4.17.15"
- resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78"
- integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==
-
-lodash-es@^4.17.11, lodash-es@^4.17.21, lodash-es@^4.2.1:
+lodash-es@4.17.21, lodash-es@^4.17.11, lodash-es@^4.17.21, lodash-es@^4.2.1:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
@@ -12301,6 +12435,11 @@ luxon@1.23.0:
resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.23.0.tgz#23b748ad0f2d5494dc4d2878c19278c1e651410c"
integrity sha512-+6a/bXsCWrrR8vfbL41iM92es12zwV2Rum/KPkT+ubOZnnU3Sqbqok/FmD1xsWlWN2Y9Hu0fU/vNgU24ns7bpA==
+luxon@1.28.1:
+ version "1.28.1"
+ resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.28.1.tgz#528cdf3624a54506d710290a2341aa8e6e6c61b0"
+ integrity sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==
+
magic-string@0.25.3:
version "0.25.3"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.3.tgz#34b8d2a2c7fec9d9bdf9929a3fd81d271ef35be9"
@@ -12891,7 +13030,7 @@ nan@^2.12.1:
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
-nanoid@^3.1.22, nanoid@^3.1.23:
+nanoid@^3.1.22:
version "3.2.0"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c"
integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==
@@ -12901,6 +13040,11 @@ nanoid@^3.3.4:
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+nanoid@^3.3.6:
+ version "3.3.6"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
+ integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
+
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@@ -14455,14 +14599,14 @@ postcss@^7.0.14, postcss@^7.0.5, postcss@^7.0.6:
source-map "^0.6.1"
supports-color "^6.1.0"
-postcss@^8.3.5:
- version "8.3.6"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.6.tgz#2730dd76a97969f37f53b9a6096197be311cc4ea"
- integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==
+postcss@^8.4.13:
+ version "8.4.31"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
+ integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
dependencies:
- colorette "^1.2.2"
- nanoid "^3.1.23"
- source-map-js "^0.6.2"
+ nanoid "^3.3.6"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
postcss@^8.4.14:
version "8.4.14"
@@ -15780,6 +15924,15 @@ resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.2
is-core-module "^2.2.0"
path-parse "^1.0.6"
+resolve@^1.22.0:
+ version "1.22.8"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
responselike@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
@@ -15976,6 +16129,13 @@ rollup-pluginutils@^2.8.2:
dependencies:
estree-walker "^0.6.1"
+"rollup@>=2.59.0 <2.78.0":
+ version "2.77.3"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12"
+ integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
rollup@^0.34.7:
version "0.34.13"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.34.13.tgz#a211cdde31f96cb39e7cb4e35becb15ddc3efa19"
@@ -15983,7 +16143,7 @@ rollup@^0.34.7:
dependencies:
source-map-support "^0.4.0"
-rollup@^2.35.1, rollup@^2.38.5:
+rollup@^2.35.1:
version "2.56.2"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.56.2.tgz#a045ff3f6af53ee009b5f5016ca3da0329e5470f"
integrity sha512-s8H00ZsRi29M2/lGdm1u8DJpJ9ML8SUOpVVBd33XNeEeL3NVaTiUcSBHzBdF3eAyR0l7VSpsuoVUGrRHq7aPwQ==
@@ -16564,11 +16724,6 @@ source-list-map@^2.0.0:
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
-source-map-js@^0.6.2:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e"
- integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==
-
source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
@@ -18137,15 +18292,15 @@ vite-plugin-svgr@^0.3.0:
dependencies:
"@svgr/core" "^5.5.0"
-vite@2.4.2:
- version "2.4.2"
- resolved "https://registry.yarnpkg.com/vite/-/vite-2.4.2.tgz#07d00615775c808530bc9f65641062b349b67929"
- integrity sha512-2MifxD2I9fjyDmmEzbULOo3kOUoqX90A58cT6mECxoVQlMYFuijZsPQBuA14mqSwvV3ydUsqnq+BRWXyO9Qa+w==
+vite@2.9.16:
+ version "2.9.16"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.16.tgz#daf7ba50f5cc37a7bf51b118ba06bc36e97898e9"
+ integrity sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA==
dependencies:
- esbuild "^0.12.8"
- postcss "^8.3.5"
- resolve "^1.20.0"
- rollup "^2.38.5"
+ esbuild "^0.14.27"
+ postcss "^8.4.13"
+ resolve "^1.22.0"
+ rollup ">=2.59.0 <2.78.0"
optionalDependencies:
fsevents "~2.3.2"