Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
82e1ff76a5 | ||
|
|
e7cfb06afa | ||
|
|
d9d9d226d3 | ||
|
|
bcd1872ffa | ||
|
|
0bd3a5957b | ||
|
|
a450dfebc7 | ||
|
|
5f90095470 | ||
|
|
eb865e137f | ||
|
|
b7819fda76 | ||
|
|
0e2883d0c6 | ||
|
|
a8322b5ed2 | ||
|
|
43dc34ee8f | ||
|
|
0300051e7c | ||
|
|
b8cb98510f | ||
|
|
20e0f6af45 | ||
|
|
50b061527e | ||
|
|
22b30cf92f | ||
|
|
e0c7a80fe0 | ||
|
|
87cfb2fb20 | ||
|
|
ebdce4c0ed | ||
|
|
4ebdb077b5 | ||
|
|
2eb14db055 | ||
|
|
776dec14b7 | ||
|
|
320b1dd5a9 | ||
|
|
a6ecd0496f | ||
|
|
7f3a003200 | ||
|
|
8b1f0ba0b9 | ||
|
|
84631f03c5 | ||
|
|
e506ba2326 | ||
|
|
c5171cf014 | ||
|
|
757b84f952 | ||
|
|
0e89f8af41 | ||
|
|
7403598df9 | ||
|
|
322d3a21b0 | ||
|
|
aa9a2142b8 | ||
|
|
ed64644d10 | ||
|
|
45d6132ffd | ||
|
|
b26e28e733 | ||
|
|
2b13af0a5e | ||
|
|
6cc6498844 | ||
|
|
313ceef1ed | ||
|
|
9e275e7ced | ||
|
|
3ee30cf4f1 | ||
|
|
0ea24b399d | ||
|
|
aea8e0a470 | ||
|
|
ba13d1fd79 | ||
|
|
8ec6f313a4 | ||
|
|
0b4b78ff21 | ||
|
|
52f0b47273 | ||
|
|
df4a121d77 | ||
|
|
f839142530 | ||
|
|
b58525263e | ||
|
|
46c99e382f | ||
|
|
268fee7f94 | ||
|
|
caffed92f4 | ||
|
|
2fd44174ce | ||
|
|
7119380716 | ||
|
|
5eed09a8fc | ||
|
|
3e253c2ee4 | ||
|
|
8d70da4d8e | ||
|
|
2853498a98 | ||
|
|
b6bd921ac1 | ||
|
|
5d97ea7762 | ||
|
|
fb60a14ecc | ||
|
|
38ec6528e3 | ||
|
|
7d7f532c46 | ||
|
|
14e829f6a4 | ||
|
|
703613a475 | ||
|
|
0bbb5c5f38 | ||
|
|
d8aa5b7374 | ||
|
|
f44983f02a | ||
|
|
9f0bb6d11f | ||
|
|
a8157e94a9 | ||
|
|
cd23fc6f63 | ||
|
|
40678800e6 | ||
|
|
6acb59f979 | ||
|
|
4bce904c96 | ||
|
|
54b67b5171 | ||
|
|
96b07bf9a8 | ||
|
|
b156625997 | ||
|
|
6cf15f6cec | ||
|
|
3f0e4f5e81 | ||
|
|
1358aa2a81 | ||
|
|
f0aaef203e | ||
|
|
77d24fc544 | ||
|
|
a083ba3de5 | ||
|
|
6a50eac9eb | ||
|
|
b954eedff7 | ||
|
|
0247627494 | ||
|
|
158c40a7af | ||
|
|
699011e18e | ||
|
|
e7dc87843a | ||
|
|
e67c3b7945 | ||
|
|
36ed2e44aa | ||
|
|
38779b9318 | ||
|
|
7058130c3b | ||
|
|
9644477d08 | ||
|
|
87cac28cad | ||
|
|
238cfd854b | ||
|
|
f7cc0ac32d | ||
|
|
d8108c6742 | ||
|
|
d5eafded1a | ||
|
|
48e8acedfb | ||
|
|
11a2fdbdab | ||
|
|
0aa1a12cdc | ||
|
|
f37c5ee102 | ||
|
|
59267e3a6b | ||
|
|
82c0fbaeda | ||
|
|
2d70c9d65f | ||
|
|
c43f6fe9c0 | ||
|
|
36f318186b | ||
|
|
fe7f1b07c9 | ||
|
|
352090d092 | ||
|
|
db2b0ad4a0 | ||
|
|
4b76ec9057 | ||
|
|
15857b02d9 | ||
|
|
9bdac9a334 | ||
|
|
2f8ad16639 | ||
|
|
687a84a2d6 | ||
|
|
2db9db0b38 | ||
|
|
2bf00025ed | ||
|
|
b8f746cb98 | ||
|
|
93869d3bc8 | ||
|
|
5d580e01aa | ||
|
|
1f41de9991 | ||
|
|
5cdecefc49 | ||
|
|
21bccdaecf |
@@ -0,0 +1,62 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
open-pull-requests-limit: 5
|
||||||
|
groups:
|
||||||
|
github-actions:
|
||||||
|
patterns:
|
||||||
|
- "*"
|
||||||
|
|
||||||
|
- package-ecosystem: docker
|
||||||
|
directories:
|
||||||
|
- /cmd/builder
|
||||||
|
- /cmd/fetcher
|
||||||
|
- /cmd/fission-bundle
|
||||||
|
- /cmd/preupgradechecks
|
||||||
|
- /cmd/reporter
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
open-pull-requests-limit: 5
|
||||||
|
exclude-paths:
|
||||||
|
- "test/**"
|
||||||
|
groups:
|
||||||
|
docker-images:
|
||||||
|
patterns:
|
||||||
|
- "*"
|
||||||
|
|
||||||
|
- package-ecosystem: gomod
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
open-pull-requests-limit: 5
|
||||||
|
exclude-paths:
|
||||||
|
- "test/**"
|
||||||
|
groups:
|
||||||
|
go-dependencies:
|
||||||
|
patterns:
|
||||||
|
- "*"
|
||||||
|
|
||||||
|
- package-ecosystem: helm
|
||||||
|
directory: /charts/fission-all
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
open-pull-requests-limit: 5
|
||||||
|
groups:
|
||||||
|
helm-charts:
|
||||||
|
patterns:
|
||||||
|
- "*"
|
||||||
|
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
open-pull-requests-limit: 5
|
||||||
|
exclude-paths:
|
||||||
|
- "test/**"
|
||||||
|
groups:
|
||||||
|
npm-dependencies:
|
||||||
|
patterns:
|
||||||
|
- "*"
|
||||||
@@ -4,39 +4,47 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
paths:
|
- '!dependabot/**'
|
||||||
- '**.go'
|
|
||||||
- go.mod
|
|
||||||
- go.sum
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
paths:
|
|
||||||
- '**.go'
|
|
||||||
- go.mod
|
|
||||||
- go.sum
|
|
||||||
schedule:
|
schedule:
|
||||||
- cron: "0 0 * * 0"
|
- cron: "0 0 * * 0"
|
||||||
workflow_dispatch:
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: fission-codeql-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
CodeQL-Build:
|
CodeQL-Build:
|
||||||
runs-on: ubuntu-latest
|
permissions:
|
||||||
|
actions: read # for github/codeql-action/init to get workflow details
|
||||||
|
contents: read # for actions/checkout to fetch code
|
||||||
|
security-events: write # for github/codeql-action/analyze to upload SARIF results
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip-ci') }}
|
if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip-ci') }}
|
||||||
steps:
|
steps:
|
||||||
|
- name: Harden Runner
|
||||||
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
|
with:
|
||||||
|
egress-policy: audit
|
||||||
|
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
|
||||||
- name: setup go
|
- name: setup go
|
||||||
uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
|
uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
cache: true
|
cache: true
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@66b90a5db151a8042fa97405c6cf843bbe433f7b # v2.22.7
|
uses: github/codeql-action/init@1b168cd39490f61582a9beae412bb7057a6b2c4e # v4.31.8
|
||||||
with:
|
with:
|
||||||
languages: go
|
languages: go
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@66b90a5db151a8042fa97405c6cf843bbe433f7b # v2.22.7
|
uses: github/codeql-action/analyze@1b168cd39490f61582a9beae412bb7057a6b2c4e # v4.31.8
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# Dependency Review Action
|
||||||
|
#
|
||||||
|
# This Action will scan dependency manifest files that change as part of a Pull Request,
|
||||||
|
# surfacing known-vulnerable versions of the packages declared or updated in the PR.
|
||||||
|
# Once installed, if the workflow run is marked as required,
|
||||||
|
# PRs introducing known-vulnerable packages will be blocked from merging.
|
||||||
|
#
|
||||||
|
# Source repository: https://github.com/actions/dependency-review-action
|
||||||
|
name: 'Dependency Review'
|
||||||
|
on: [pull_request]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: fission-dependency-review-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
dependency-review:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- name: Harden Runner
|
||||||
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
|
with:
|
||||||
|
egress-policy: audit
|
||||||
|
|
||||||
|
- name: 'Checkout Repository'
|
||||||
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
- name: 'Dependency Review'
|
||||||
|
uses: actions/dependency-review-action@3c4e3dcb1aa7874d2c16be7d79418e9b7efd6261 # v4.8.2
|
||||||
@@ -11,25 +11,27 @@ on:
|
|||||||
- main
|
- main
|
||||||
paths:
|
paths:
|
||||||
- 'charts/fission-all/dashboards/**.json'
|
- 'charts/fission-all/dashboards/**.json'
|
||||||
workflow_dispatch:
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint-dashboards:
|
lint-dashboards:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip-ci') }}
|
if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip-ci') }}
|
||||||
steps:
|
steps:
|
||||||
|
- name: Harden Runner
|
||||||
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
|
with:
|
||||||
|
egress-policy: audit
|
||||||
|
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
|
||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
|
uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
|
|
||||||
- name: Install dashboard linter
|
|
||||||
run: |
|
|
||||||
go get github.com/grafana/dashboard-linter
|
|
||||||
go install github.com/grafana/dashboard-linter
|
|
||||||
|
|
||||||
- name: Run dashboard linter
|
- name: Run dashboard linter
|
||||||
run: ./hack/lint-dashboards.sh
|
run: ./hack/lint-dashboards.sh
|
||||||
|
|||||||
@@ -15,22 +15,36 @@ on:
|
|||||||
- "**.go"
|
- "**.go"
|
||||||
- go.mod
|
- go.mod
|
||||||
- go.sum
|
- go.sum
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
GOLANGCI_LINT_VERSION: v1.57.0
|
GOLANGCI_LINT_VERSION: v2.6.2
|
||||||
GOLANGCI_LINT_TIMEOUT: 5m
|
GOLANGCI_LINT_TIMEOUT: 5m
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: fission-lint-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
permissions:
|
||||||
|
contents: read # for actions/checkout to fetch code
|
||||||
|
pull-requests: read # for golangci/golangci-lint-action to fetch pull requests
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
# if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip-ci') }}
|
# if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip-ci') }}
|
||||||
steps:
|
steps:
|
||||||
|
- name: Harden Runner
|
||||||
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
|
with:
|
||||||
|
egress-policy: audit
|
||||||
|
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
|
||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
|
uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
cache: true
|
cache: true
|
||||||
@@ -41,7 +55,7 @@ jobs:
|
|||||||
go mod download
|
go mod download
|
||||||
|
|
||||||
- name: Run golangci-lint
|
- name: Run golangci-lint
|
||||||
uses: golangci/golangci-lint-action@3a919529898de77ec3da873e3063ca4b10e7f5cc # v3.7.0
|
uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9.2.0
|
||||||
with:
|
with:
|
||||||
skip-cache: true
|
skip-cache: true
|
||||||
version: ${{ env.GOLANGCI_LINT_VERSION }}
|
version: ${{ env.GOLANGCI_LINT_VERSION }}
|
||||||
@@ -62,8 +76,8 @@ jobs:
|
|||||||
run: ./hack/runtests.sh
|
run: ./hack/runtests.sh
|
||||||
|
|
||||||
- name: Upload Coverage report to CodeCov
|
- name: Upload Coverage report to CodeCov
|
||||||
uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d # v3.1.4
|
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
|
||||||
with:
|
with:
|
||||||
token: ${{secrets.CODECOV_TOKEN}}
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
flags: unittests
|
flags: unittests
|
||||||
file: ./coverage.txt
|
file: ./coverage.txt
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
- '!dependabot/**'
|
||||||
paths:
|
paths:
|
||||||
- "**.go"
|
- "**.go"
|
||||||
- "charts/**"
|
- "charts/**"
|
||||||
@@ -19,12 +20,19 @@ on:
|
|||||||
- "test/**"
|
- "test/**"
|
||||||
- go.mod
|
- go.mod
|
||||||
- go.sum
|
- go.sum
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
HELM_VERSION: v3.13.0
|
HELM_VERSION: v4.0.1
|
||||||
KIND_VERSION: v0.23.0
|
KIND_VERSION: v0.30.0
|
||||||
KIND_CLUSTER_NAME: kind
|
KIND_CLUSTER_NAME: kind
|
||||||
|
SKAFFOLD_VERSION: v2.17.0
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: fission-ci-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# Job to run change detection
|
# Job to run change detection
|
||||||
@@ -34,31 +42,36 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
kindversion: ["v1.25.16", "v1.27.13", "v1.30.0"]
|
kindversion: ["v1.28.15", "v1.32.8", "v1.34.0"]
|
||||||
os: [ubuntu-latest]
|
os: [ubuntu-24.04]
|
||||||
steps:
|
steps:
|
||||||
|
- name: Harden Runner
|
||||||
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
|
with:
|
||||||
|
egress-policy: audit
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
|
||||||
- name: setup go
|
- name: setup go
|
||||||
uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
|
uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
cache: true
|
cache: true
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
repository: fission/examples
|
repository: fission/examples
|
||||||
path: examples
|
path: examples
|
||||||
|
|
||||||
- name: Helm installation
|
- name: Helm installation
|
||||||
uses: Azure/setup-helm@5119fcb9089d432beecbf79bb2c7915207344b78 # v3.5
|
uses: Azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4.3.1
|
||||||
with:
|
with:
|
||||||
version: ${{ env.HELM_VERSION }}
|
version: ${{ env.HELM_VERSION }}
|
||||||
|
|
||||||
- name: Kind Cluster
|
- name: Kind Cluster
|
||||||
uses: helm/kind-action@0025e74a8c7512023d06dc019c617aa3cf561fde # v1.10.0
|
uses: helm/kind-action@92086f6be054225fa813e0a4b13787fc9088faab # v1.13.0
|
||||||
with:
|
with:
|
||||||
node_image: kindest/node:${{ matrix.kindversion }}
|
node_image: kindest/node:${{ matrix.kindversion }}
|
||||||
version: ${{ env.KIND_VERSION }}
|
version: ${{ env.KIND_VERSION }}
|
||||||
@@ -79,15 +92,15 @@ jobs:
|
|||||||
|
|
||||||
- name: Install Skaffold
|
- name: Install Skaffold
|
||||||
run: |
|
run: |
|
||||||
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/v2.0.3/skaffold-linux-amd64
|
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/${{ env.SKAFFOLD_VERSION }}/skaffold-linux-amd64
|
||||||
sudo install skaffold /usr/local/bin/
|
sudo install skaffold /usr/local/bin/
|
||||||
skaffold version
|
skaffold version
|
||||||
|
|
||||||
- name: Install GoReleaser
|
- name: Install GoReleaser
|
||||||
uses: goreleaser/goreleaser-action@7ec5c2b0c6cdda6e8bbb49444bc797dd33d74dd8 # v5.0.0
|
uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v6.4.0
|
||||||
with:
|
with:
|
||||||
install-only: true
|
install-only: true
|
||||||
version: "~> v1"
|
version: "~> v2"
|
||||||
|
|
||||||
- name: Setup Prometheus Stack
|
- name: Setup Prometheus Stack
|
||||||
run: |
|
run: |
|
||||||
@@ -145,7 +158,7 @@ jobs:
|
|||||||
- name: Archive fission dump
|
- name: Archive fission dump
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
if: ${{ failure() || cancelled() }}
|
if: ${{ failure() || cancelled() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: fission-dump-${{ github.run_id }}-${{ matrix.kindversion }}
|
name: fission-dump-${{ github.run_id }}-${{ matrix.kindversion }}
|
||||||
path: fission-dump/*.zip
|
path: fission-dump/*.zip
|
||||||
@@ -154,7 +167,7 @@ jobs:
|
|||||||
- name: Archive prometheus dump
|
- name: Archive prometheus dump
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: prom-dump-${{ github.run_id }}-${{ matrix.kindversion }}
|
name: prom-dump-${{ github.run_id }}-${{ matrix.kindversion }}
|
||||||
path: /tmp/prometheus/*
|
path: /tmp/prometheus/*
|
||||||
@@ -163,7 +176,7 @@ jobs:
|
|||||||
- name: Archive kind logs
|
- name: Archive kind logs
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: kind-logs-${{ github.run_id }}-${{ matrix.kindversion }}
|
name: kind-logs-${{ github.run_id }}-${{ matrix.kindversion }}
|
||||||
path: kind-logs/*
|
path: kind-logs/*
|
||||||
@@ -177,31 +190,36 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
kindversion: ["v1.19.16"]
|
kindversion: ["v1.31.12"]
|
||||||
os: [ubuntu-latest]
|
os: [ubuntu-24.04]
|
||||||
steps:
|
steps:
|
||||||
|
- name: Harden Runner
|
||||||
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
|
with:
|
||||||
|
egress-policy: audit
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
|
||||||
- name: setup go
|
- name: setup go
|
||||||
uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
|
uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
cache: true
|
cache: true
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
repository: fission/examples
|
repository: fission/examples
|
||||||
path: examples
|
path: examples
|
||||||
|
|
||||||
- name: Helm installation
|
- name: Helm installation
|
||||||
uses: Azure/setup-helm@5119fcb9089d432beecbf79bb2c7915207344b78 # v3.5
|
uses: Azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4.3.1
|
||||||
with:
|
with:
|
||||||
version: ${{ env.HELM_VERSION }}
|
version: ${{ env.HELM_VERSION }}
|
||||||
|
|
||||||
- name: Kind Cluster
|
- name: Kind Cluster
|
||||||
uses: helm/kind-action@0025e74a8c7512023d06dc019c617aa3cf561fde # v1.10.0
|
uses: helm/kind-action@92086f6be054225fa813e0a4b13787fc9088faab # v1.13.0
|
||||||
with:
|
with:
|
||||||
node_image: kindest/node:${{ matrix.kindversion }}
|
node_image: kindest/node:${{ matrix.kindversion }}
|
||||||
version: ${{ env.KIND_VERSION }}
|
version: ${{ env.KIND_VERSION }}
|
||||||
@@ -222,15 +240,15 @@ jobs:
|
|||||||
|
|
||||||
- name: Install Skaffold
|
- name: Install Skaffold
|
||||||
run: |
|
run: |
|
||||||
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/v2.0.3/skaffold-linux-amd64
|
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/${{ env.SKAFFOLD_VERSION }}/skaffold-linux-amd64
|
||||||
sudo install skaffold /usr/local/bin/
|
sudo install skaffold /usr/local/bin/
|
||||||
skaffold version
|
skaffold version
|
||||||
|
|
||||||
- name: Install GoReleaser
|
- name: Install GoReleaser
|
||||||
uses: goreleaser/goreleaser-action@7ec5c2b0c6cdda6e8bbb49444bc797dd33d74dd8 # v5.0.0
|
uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v6.4.0
|
||||||
with:
|
with:
|
||||||
install-only: true
|
install-only: true
|
||||||
version: "~> v1"
|
version: "~> v2"
|
||||||
|
|
||||||
- name: Setup Prometheus Stack
|
- name: Setup Prometheus Stack
|
||||||
run: |
|
run: |
|
||||||
@@ -291,26 +309,26 @@ jobs:
|
|||||||
- name: Archive fission dump
|
- name: Archive fission dump
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
if: ${{ failure() || cancelled() }}
|
if: ${{ failure() || cancelled() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: fission-dump-${{ github.run_id }}-${{ github.job_id }}-${{ matrix.kindversion }}
|
name: fission-dump-${{ github.run_id }}-${{ matrix.kindversion }}
|
||||||
path: fission-dump/*.zip
|
path: fission-dump/*.zip
|
||||||
retention-days: 5
|
retention-days: 5
|
||||||
|
|
||||||
- name: Archive prometheus dump
|
- name: Archive prometheus dump
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: prom-dump-${{ github.run_id }}-${{ github.job_id }}-${{ matrix.kindversion }}
|
name: prom-dump-${{ github.run_id }}-${{ matrix.kindversion }}
|
||||||
path: /tmp/prometheus/*
|
path: /tmp/prometheus/*
|
||||||
retention-days: 5
|
retention-days: 5
|
||||||
|
|
||||||
- name: Archive kind logs
|
- name: Archive kind logs
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: kind-logs-${{ github.run_id }}-${{ github.job_id }}-${{ matrix.kindversion }}
|
name: kind-logs-${{ github.run_id }}-${{ matrix.kindversion }}
|
||||||
path: kind-logs/*
|
path: kind-logs/*
|
||||||
retention-days: 5
|
retention-days: 5
|
||||||
+138
-29
@@ -6,37 +6,52 @@ on:
|
|||||||
- v2.**
|
- v2.**
|
||||||
|
|
||||||
env:
|
env:
|
||||||
KIND_VERSION: v0.23.0
|
KIND_VERSION: v0.30.0
|
||||||
KIND_NODE_IMAGE_TAG: v1.25.16
|
KIND_NODE_IMAGE_TAG: v1.28.15
|
||||||
KIND_CLUSTER_NAME: kind
|
KIND_CLUSTER_NAME: kind
|
||||||
|
COSIGN_VERSION: v3.0.3
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
create-draft-release:
|
create-draft-release:
|
||||||
runs-on: ubuntu-latest
|
name: Create Draft Release with Goreleaser
|
||||||
|
outputs:
|
||||||
|
ghcr_images: ${{ steps.image.outputs.ghcr_images }}
|
||||||
|
version: ${{ steps.get_version.outputs.VERSION }}
|
||||||
|
permissions:
|
||||||
|
contents: write # for goreleaser/goreleaser-action to create a GitHub release
|
||||||
|
packages: write # for goreleaser/goreleaser-action to upload artifacts to GitHub Packages
|
||||||
|
id-token: write # for cosign to sign the image and binary
|
||||||
|
attestations: write # for goreleaser/goreleaser-action to upload attestations
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
|
- name: Harden Runner
|
||||||
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
|
with:
|
||||||
|
egress-policy: audit
|
||||||
|
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Setup go
|
- name: Setup go
|
||||||
uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
|
uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
cache: true
|
cache: true
|
||||||
|
|
||||||
- name: Get the version
|
- name: Get the version
|
||||||
id: get_version
|
id: get_version
|
||||||
run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//}
|
run: echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Install GoReleaser
|
- name: Install GoReleaser
|
||||||
uses: goreleaser/goreleaser-action@7ec5c2b0c6cdda6e8bbb49444bc797dd33d74dd8 # v5.0.0
|
uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v6.4.0
|
||||||
with:
|
with:
|
||||||
install-only: true
|
install-only: true
|
||||||
version: "~> v1"
|
version: "~> v2"
|
||||||
|
|
||||||
- name: Kind Clutser
|
- name: Kind Cluster
|
||||||
uses: helm/kind-action@0025e74a8c7512023d06dc019c617aa3cf561fde # v1.10.0
|
uses: helm/kind-action@92086f6be054225fa813e0a4b13787fc9088faab # v1.13.0
|
||||||
with:
|
with:
|
||||||
node_image: kindest/node:${{ env.KIND_NODE_IMAGE_TAG }}
|
node_image: kindest/node:${{ env.KIND_NODE_IMAGE_TAG }}
|
||||||
version: ${{ env.KIND_VERSION }}
|
version: ${{ env.KIND_VERSION }}
|
||||||
@@ -44,34 +59,27 @@ jobs:
|
|||||||
cluster_name: ${{ env.KIND_CLUSTER_NAME }}
|
cluster_name: ${{ env.KIND_CLUSTER_NAME }}
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0
|
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||||
|
|
||||||
- name: Login to ghcr.io
|
- name: Login to ghcr.io
|
||||||
uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0
|
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Login to docker.io
|
|
||||||
uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Install Cosign
|
- name: Install Cosign
|
||||||
uses: sigstore/cosign-installer@1fc5bd396d372bee37d608f955b336615edf79c8 # v3.2.0
|
uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
|
||||||
with:
|
with:
|
||||||
cosign-release: "v2.2.1"
|
cosign-release: ${{ env.COSIGN_VERSION }}
|
||||||
|
|
||||||
- name: Check cosign install!
|
- name: Check cosign install!
|
||||||
run: cosign version
|
run: cosign version
|
||||||
|
|
||||||
- name: Write cosign signing key to disk
|
- uses: anchore/sbom-action/download-syft@43a17d6e7add2b5535efe4dcae9952337c479a93 #v0.20.11
|
||||||
run: 'echo "$KEY" > cosign.key'
|
|
||||||
shell: bash
|
|
||||||
env:
|
|
||||||
KEY: ${{ secrets.COSIGN_PRIVATE_KEY }}
|
|
||||||
|
|
||||||
- name: Generate yaml for manifest, Minikube and Openshift installation
|
- name: Generate yaml for manifest, Minikube and Openshift installation
|
||||||
run: ${GITHUB_WORKSPACE}/hack/build-yaml.sh $VERSION
|
run: ${GITHUB_WORKSPACE}/hack/build-yaml.sh $VERSION
|
||||||
@@ -80,14 +88,115 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: Run GoReleaser
|
- name: Run GoReleaser
|
||||||
uses: goreleaser/goreleaser-action@7ec5c2b0c6cdda6e8bbb49444bc797dd33d74dd8 # v5.0.0
|
id: goreleaser
|
||||||
|
uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v6.4.0
|
||||||
with:
|
with:
|
||||||
version: "~> v1"
|
version: "~> v2"
|
||||||
args: release
|
args: release
|
||||||
env:
|
env:
|
||||||
COSIGN_PWD: ${{ secrets.COSIGN_PWD }}
|
|
||||||
GORELEASER_CURRENT_TAG: ${{ steps.get_version.outputs.VERSION }}
|
GORELEASER_CURRENT_TAG: ${{ steps.get_version.outputs.VERSION }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
DOCKER_CLI_EXPERIMENTAL: "enabled"
|
DOCKER_CLI_EXPERIMENTAL: "enabled"
|
||||||
|
|
||||||
#ToDo - Verify and upload releases
|
# Attest binary artifacts
|
||||||
|
# https://goreleaser.com/customization/attestations/
|
||||||
|
- name: Attest binary artifacts
|
||||||
|
uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0
|
||||||
|
with:
|
||||||
|
subject-checksums: ./dist/checksums.txt
|
||||||
|
|
||||||
|
- name: Image digest
|
||||||
|
id: image
|
||||||
|
env:
|
||||||
|
ARTIFACTS: "${{ steps.goreleaser.outputs.artifacts }}"
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
image_and_digest=$(echo "$ARTIFACTS" | jq -r '.[] | select (.type=="Docker Image") | {name, "digest": (.extra.Digest // .extra.Checksum)} | select(.digest) | {name} + {digest} | join("@") | sub("^sha256:";"")' | grep -v latest)
|
||||||
|
ghcr_images=$(echo "${image_and_digest}" | grep ghcr.io | jq -R -s -c '
|
||||||
|
split("\n")
|
||||||
|
| map(select(. != ""))
|
||||||
|
| map(
|
||||||
|
split("@")
|
||||||
|
| {
|
||||||
|
"image": .[0] | split(":")[0],
|
||||||
|
"checksum": .[1]
|
||||||
|
}
|
||||||
|
)')
|
||||||
|
echo "ghcr_images=$ghcr_images" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
image-sbom-provenance-ghcr:
|
||||||
|
name: Create SBOM & Provenance for container images
|
||||||
|
# Goreleaser does not support generating SBOM for container images.
|
||||||
|
needs: [create-draft-release]
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include: ${{ fromJson(needs.create-draft-release.outputs.ghcr_images) }}
|
||||||
|
permissions:
|
||||||
|
actions: write
|
||||||
|
id-token: write
|
||||||
|
packages: write
|
||||||
|
attestations: write
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Run Trivy in fs mode to generate SBOM
|
||||||
|
uses: aquasecurity/trivy-action@b6643a29fecd7f34b3597bc6acb0a98b03d33ff8 # v0.33.1
|
||||||
|
with:
|
||||||
|
scan-type: "fs"
|
||||||
|
format: "spdx-json"
|
||||||
|
output: "sbom.spdx.json"
|
||||||
|
- name: Attest SBOM for image
|
||||||
|
uses: actions/attest-sbom@4651f806c01d8637787e274ac3bdf724ef169f34 # v3.0.0
|
||||||
|
with:
|
||||||
|
sbom-path: sbom.spdx.json
|
||||||
|
subject-name: ${{ fromJson(toJson(matrix)).image }}
|
||||||
|
subject-digest: ${{ fromJson(toJson(matrix)).checksum }}
|
||||||
|
push-to-registry: true
|
||||||
|
- name: Attest provenance for image
|
||||||
|
uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0
|
||||||
|
with:
|
||||||
|
subject-name: ${{ fromJson(toJson(matrix)).image }}
|
||||||
|
subject-digest: ${{ fromJson(toJson(matrix)).checksum }}
|
||||||
|
push-to-registry: true
|
||||||
|
|
||||||
|
image-provenance-verification-with-cosign:
|
||||||
|
name: Verify Image Provenance
|
||||||
|
needs: [create-draft-release, image-sbom-provenance-ghcr]
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include: ${{ fromJson(needs.create-draft-release.outputs.ghcr_images) }}
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
permissions: read-all
|
||||||
|
steps:
|
||||||
|
- name: Login
|
||||||
|
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Install Cosign
|
||||||
|
uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
|
||||||
|
with:
|
||||||
|
cosign-release: ${{ env.COSIGN_VERSION }}
|
||||||
|
|
||||||
|
- name: Verify image
|
||||||
|
env:
|
||||||
|
IMAGE: ${{ fromJson(toJson(matrix)).image }}
|
||||||
|
DIGEST: ${{ fromJson(toJson(matrix)).checksum }}
|
||||||
|
run: |
|
||||||
|
echo "Verifying $IMAGE@$DIGEST"
|
||||||
|
cosign verify-attestation \
|
||||||
|
--type https://slsa.dev/provenance/v1 \
|
||||||
|
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
|
||||||
|
--certificate-identity-regexp '^https://github.com/fission/fission/.github/workflows/release.yaml@refs/tags/v[0-9]+\.[0-9]+\.[0-9]+(?:-rc[0-9]+)?$' \
|
||||||
|
$IMAGE@$DIGEST
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
# This workflow uses actions that are not certified by GitHub. They are provided
|
||||||
|
# by a third-party and are governed by separate terms of service, privacy
|
||||||
|
# policy, and support documentation.
|
||||||
|
|
||||||
|
name: Scorecard supply-chain security
|
||||||
|
on:
|
||||||
|
# For Branch-Protection check. Only the default branch is supported. See
|
||||||
|
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
|
||||||
|
branch_protection_rule:
|
||||||
|
# To guarantee Maintained check is occasionally updated. See
|
||||||
|
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
|
||||||
|
schedule:
|
||||||
|
- cron: '41 18 * * 0'
|
||||||
|
push:
|
||||||
|
branches: [ "main" ]
|
||||||
|
|
||||||
|
# Declare default permissions as read only.
|
||||||
|
permissions: read-all
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analysis:
|
||||||
|
name: Scorecard analysis
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
permissions:
|
||||||
|
# Needed to upload the results to code-scanning dashboard.
|
||||||
|
security-events: write
|
||||||
|
# Needed to publish results and get a badge (see publish_results below).
|
||||||
|
id-token: write
|
||||||
|
# Uncomment the permissions below if installing in a private repository.
|
||||||
|
# contents: read
|
||||||
|
# actions: read
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Harden Runner
|
||||||
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
|
with:
|
||||||
|
egress-policy: audit
|
||||||
|
|
||||||
|
- name: "Checkout code"
|
||||||
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: "Run analysis"
|
||||||
|
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
|
||||||
|
with:
|
||||||
|
results_file: results.sarif
|
||||||
|
results_format: sarif
|
||||||
|
# (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
|
||||||
|
# - you want to enable the Branch-Protection check on a *public* repository, or
|
||||||
|
# - you are installing Scorecard on a *private* repository
|
||||||
|
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional.
|
||||||
|
# repo_token: ${{ secrets.SCORECARD_TOKEN }}
|
||||||
|
|
||||||
|
# Public repositories:
|
||||||
|
# - Publish results to OpenSSF REST API for easy access by consumers
|
||||||
|
# - Allows the repository to include the Scorecard badge.
|
||||||
|
# - See https://github.com/ossf/scorecard-action#publishing-results.
|
||||||
|
# For private repositories:
|
||||||
|
# - `publish_results` will always be set to `false`, regardless
|
||||||
|
# of the value entered here.
|
||||||
|
publish_results: true
|
||||||
|
|
||||||
|
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
|
||||||
|
# format to the repository Actions tab.
|
||||||
|
- name: "Upload artifact"
|
||||||
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v3.pre.node20
|
||||||
|
with:
|
||||||
|
name: SARIF file
|
||||||
|
path: results.sarif
|
||||||
|
retention-days: 5
|
||||||
|
|
||||||
|
# Upload the results to GitHub's code scanning dashboard (optional).
|
||||||
|
# Commenting out will disable upload of results to your repo's Code Scanning dashboard
|
||||||
|
- name: "Upload to code-scanning"
|
||||||
|
uses: github/codeql-action/upload-sarif@1b168cd39490f61582a9beae412bb7057a6b2c4e # v4.31.8
|
||||||
|
with:
|
||||||
|
sarif_file: results.sarif
|
||||||
@@ -4,6 +4,7 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
- '!dependabot/**'
|
||||||
paths:
|
paths:
|
||||||
- "**.go"
|
- "**.go"
|
||||||
- "charts/**"
|
- "charts/**"
|
||||||
@@ -19,13 +20,19 @@ on:
|
|||||||
- "test/**"
|
- "test/**"
|
||||||
- go.mod
|
- go.mod
|
||||||
- go.sum
|
- go.sum
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
HELM_VERSION: v3.13.0
|
HELM_VERSION: v3.19.0
|
||||||
KIND_VERSION: v0.23.0
|
KIND_VERSION: v0.30.0
|
||||||
KIND_CLUSTER_NAME: kind
|
KIND_CLUSTER_NAME: kind
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: fission-upgrade-test-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
upgrade-test:
|
upgrade-test:
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
@@ -33,35 +40,40 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
kindimage: ["kindest/node:v1.25.16"]
|
kindversion: ["v1.31.12"]
|
||||||
os: [ubuntu-latest]
|
os: [ubuntu-24.04]
|
||||||
steps:
|
steps:
|
||||||
|
- name: Harden Runner
|
||||||
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
|
with:
|
||||||
|
egress-policy: audit
|
||||||
|
|
||||||
- name: Checkout action sources
|
- name: Checkout action sources
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
|
||||||
- name: Setup go
|
- name: Setup go
|
||||||
uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
|
uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
|
||||||
with:
|
with:
|
||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
cache: true
|
cache: true
|
||||||
|
|
||||||
- name: Setup Helm
|
- name: Setup Helm
|
||||||
uses: Azure/setup-helm@5119fcb9089d432beecbf79bb2c7915207344b78 # v3.5
|
uses: Azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4.3.1
|
||||||
with:
|
with:
|
||||||
version: ${{ env.HELM_VERSION }}
|
version: ${{ env.HELM_VERSION }}
|
||||||
|
|
||||||
- name: Setup Kind Clutser
|
- name: Setup Kind Cluster
|
||||||
uses: helm/kind-action@0025e74a8c7512023d06dc019c617aa3cf561fde # v1.10.0
|
uses: helm/kind-action@92086f6be054225fa813e0a4b13787fc9088faab # v1.13.0
|
||||||
with:
|
with:
|
||||||
node_image: ${{ matrix.kindimage }}
|
node_image: kindest/node:${{ matrix.kindversion }}
|
||||||
version: ${{ env.KIND_VERSION }}
|
version: ${{ env.KIND_VERSION }}
|
||||||
cluster_name: ${{ env.KIND_CLUSTER_NAME }}
|
cluster_name: ${{ env.KIND_CLUSTER_NAME }}
|
||||||
|
|
||||||
- name: Install GoReleaser
|
- name: Install GoReleaser
|
||||||
uses: goreleaser/goreleaser-action@7ec5c2b0c6cdda6e8bbb49444bc797dd33d74dd8 # v5.0.0
|
uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v6.4.0
|
||||||
with:
|
with:
|
||||||
install-only: true
|
install-only: true
|
||||||
version: "~> v1"
|
version: "~> v2"
|
||||||
|
|
||||||
- name: Setup kubectl & fetch node information
|
- name: Setup kubectl & fetch node information
|
||||||
run: |
|
run: |
|
||||||
@@ -106,7 +118,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Archive fission dump
|
- name: Archive fission dump
|
||||||
if: ${{ failure() || cancelled() }}
|
if: ${{ failure() || cancelled() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: fission-dump-${{ github.run_id }}-${{ matrix.kindversion }}
|
name: fission-dump-${{ github.run_id }}-${{ matrix.kindversion }}
|
||||||
path: fission-dump/*.zip
|
path: fission-dump/*.zip
|
||||||
@@ -114,7 +126,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Archive kind logs
|
- name: Archive kind logs
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: kind-logs-${{ github.run_id }}-${{ matrix.kindversion }}
|
name: kind-logs-${{ github.run_id }}-${{ matrix.kindversion }}
|
||||||
path: kind-logs/*
|
path: kind-logs/*
|
||||||
|
|||||||
+43
-27
@@ -1,35 +1,51 @@
|
|||||||
|
version: "2"
|
||||||
linters:
|
linters:
|
||||||
enable:
|
enable:
|
||||||
# Default linter
|
|
||||||
- errcheck
|
- errcheck
|
||||||
- gosimple
|
|
||||||
- govet
|
- govet
|
||||||
- ineffassign
|
- ineffassign
|
||||||
- staticcheck
|
|
||||||
- typecheck
|
|
||||||
- unused
|
|
||||||
# Additional linters
|
|
||||||
- gofmt
|
|
||||||
- goimports
|
|
||||||
- misspell
|
- misspell
|
||||||
- nakedret
|
- nakedret
|
||||||
- unconvert
|
|
||||||
- promlinter
|
- promlinter
|
||||||
# Enable in future
|
- unconvert
|
||||||
# - bodyclose
|
- unused
|
||||||
# - dogsled
|
- staticcheck
|
||||||
# - dupl
|
settings:
|
||||||
# - gosec
|
errcheck:
|
||||||
# - nilerr
|
exclude-functions:
|
||||||
# - prealloc
|
- (*go.uber.org/zap.Logger).Sync
|
||||||
# - revive
|
exclusions:
|
||||||
# - unparam
|
generated: lax
|
||||||
# - wrapcheck
|
presets:
|
||||||
# - gocritic
|
- comments
|
||||||
linters-settings:
|
- common-false-positives
|
||||||
errcheck:
|
- legacy
|
||||||
ignore: go.uber.org/zap:Sync
|
- std-error-handling
|
||||||
goimports:
|
paths:
|
||||||
# put imports beginning with prefix after 3rd-party packages;
|
- third_party$
|
||||||
# it's a comma-separated list of prefixes
|
- builtin$
|
||||||
local: github.com/fission/fission
|
- examples$
|
||||||
|
rules:
|
||||||
|
- linters:
|
||||||
|
- staticcheck
|
||||||
|
text: "QF1008"
|
||||||
|
- linters:
|
||||||
|
- staticcheck
|
||||||
|
text: "QF1001"
|
||||||
|
- linters:
|
||||||
|
- staticcheck
|
||||||
|
text: "QF1003"
|
||||||
|
formatters:
|
||||||
|
enable:
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
settings:
|
||||||
|
goimports:
|
||||||
|
local-prefixes:
|
||||||
|
- github.com/fission/fission
|
||||||
|
exclusions:
|
||||||
|
generated: lax
|
||||||
|
paths:
|
||||||
|
- third_party$
|
||||||
|
- builtin$
|
||||||
|
- examples$
|
||||||
|
|||||||
+118
-269
@@ -1,9 +1,14 @@
|
|||||||
|
version: 2
|
||||||
|
|
||||||
|
env:
|
||||||
|
- GHCR_REPO=ghcr.io/fission
|
||||||
|
|
||||||
project_name: fission
|
project_name: fission
|
||||||
release:
|
release:
|
||||||
github:
|
github:
|
||||||
owner: fission
|
owner: fission
|
||||||
name: fission
|
name: fission
|
||||||
prerelease: true
|
prerelease: "true"
|
||||||
draft: true
|
draft: true
|
||||||
header: |
|
header: |
|
||||||
Release Highlights: https://fission.io/docs/releases/{{ .Tag }}/
|
Release Highlights: https://fission.io/docs/releases/{{ .Tag }}/
|
||||||
@@ -16,7 +21,7 @@ before:
|
|||||||
hooks:
|
hooks:
|
||||||
- go mod tidy
|
- go mod tidy
|
||||||
snapshot:
|
snapshot:
|
||||||
name_template: "{{ .Tag }}"
|
version_template: "{{ .Tag }}"
|
||||||
builds:
|
builds:
|
||||||
- &build-linux
|
- &build-linux
|
||||||
id: builder
|
id: builder
|
||||||
@@ -65,290 +70,134 @@ builds:
|
|||||||
id: reporter
|
id: reporter
|
||||||
binary: reporter
|
binary: reporter
|
||||||
dir: ./cmd/reporter
|
dir: ./cmd/reporter
|
||||||
dockers:
|
dockers_v2:
|
||||||
- &docker-amd64
|
- id: builder
|
||||||
use: buildx
|
tags:
|
||||||
goos: linux
|
- latest
|
||||||
goarch: amd64
|
- "{{ .Tag }}"
|
||||||
ids:
|
images:
|
||||||
- builder
|
- "{{ .Env.GHCR_REPO }}/builder"
|
||||||
image_templates:
|
labels:
|
||||||
- "fission/builder:latest-amd64"
|
org.opencontainers.image.description: "The builder assists in building the fission function source code for deployment."
|
||||||
- "fission/builder:{{ .Tag }}-amd64"
|
org.opencontainers.image.source: "{{.GitURL}}"
|
||||||
- "ghcr.io/fission/builder:latest-amd64"
|
org.opencontainers.image.created: "{{.Date}}"
|
||||||
- "ghcr.io/fission/builder:{{ .Tag }}-amd64"
|
org.opencontainers.image.revision: "{{.FullCommit}}"
|
||||||
|
org.opencontainers.image.version: "{{.Tag}}"
|
||||||
|
org.opencontainers.image.authors: "The Fission Authors https://fission.io/"
|
||||||
|
org.opencontainers.image.vendor: "Fission"
|
||||||
|
org.opencontainers.image.url: "https://fission.io/"
|
||||||
dockerfile: cmd/builder/Dockerfile
|
dockerfile: cmd/builder/Dockerfile
|
||||||
build_flag_templates:
|
- id: fetcher
|
||||||
- "--label=org.opencontainers.image.description=The builder assists in building the fission function source code for deployment."
|
tags:
|
||||||
- "--label=org.opencontainers.image.source={{.GitURL}}"
|
- latest
|
||||||
- "--platform=linux/amd64"
|
- "{{ .Tag }}"
|
||||||
- "--label=org.opencontainers.image.created={{.Date}}"
|
images:
|
||||||
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
|
- "{{ .Env.GHCR_REPO }}/fetcher"
|
||||||
- "--label=org.opencontainers.image.version={{.Tag}}"
|
labels:
|
||||||
- <<: *docker-amd64
|
org.opencontainers.image.description: "Fetcher is a lightweight component used by environment and builder pods. Fetcher helps in fetch and upload of source/deployment packages and specializing environments."
|
||||||
ids:
|
org.opencontainers.image.source: "{{.GitURL}}"
|
||||||
- fetcher
|
org.opencontainers.image.created: "{{.Date}}"
|
||||||
image_templates:
|
org.opencontainers.image.revision: "{{.FullCommit}}"
|
||||||
- "fission/fetcher:latest-amd64"
|
org.opencontainers.image.version: "{{.Tag}}"
|
||||||
- "fission/fetcher:{{ .Tag }}-amd64"
|
org.opencontainers.image.authors: "The Fission Authors https://fission.io/"
|
||||||
- "ghcr.io/fission/fetcher:latest-amd64"
|
org.opencontainers.image.vendor: "Fission"
|
||||||
- "ghcr.io/fission/fetcher:{{ .Tag }}-amd64"
|
org.opencontainers.image.url: "https://fission.io/"
|
||||||
dockerfile: cmd/fetcher/Dockerfile
|
dockerfile: cmd/fetcher/Dockerfile
|
||||||
build_flag_templates:
|
- id: fission-bundle
|
||||||
- "--label=org.opencontainers.image.description=Fetcher is a lightweight component used by environment and builder pods. Fetcher helps in fetch and upload of source/deployment packages and specializing environments."
|
tags:
|
||||||
- "--label=org.opencontainers.image.source={{.GitURL}}"
|
- latest
|
||||||
- "--platform=linux/amd64"
|
- "{{ .Tag }}"
|
||||||
- "--label=org.opencontainers.image.created={{.Date}}"
|
images:
|
||||||
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
|
- "{{ .Env.GHCR_REPO }}/fission-bundle"
|
||||||
- "--label=org.opencontainers.image.version={{.Tag}}"
|
labels:
|
||||||
- <<: *docker-amd64
|
org.opencontainers.image.description: "fission-bundle is a component which is a single binary for all components. Most server side components running on server side are fission-bundle binary wrapped in container and used with different arguments."
|
||||||
ids:
|
org.opencontainers.image.source: "{{.GitURL}}"
|
||||||
- fission-bundle
|
org.opencontainers.image.created: "{{.Date}}"
|
||||||
image_templates:
|
org.opencontainers.image.revision: "{{.FullCommit}}"
|
||||||
- "fission/fission-bundle:latest-amd64"
|
org.opencontainers.image.version: "{{.Tag}}"
|
||||||
- "fission/fission-bundle:{{ .Tag }}-amd64"
|
org.opencontainers.image.authors: "The Fission Authors https://fission.io/"
|
||||||
- "ghcr.io/fission/fission-bundle:latest-amd64"
|
org.opencontainers.image.vendor: "Fission"
|
||||||
- "ghcr.io/fission/fission-bundle:{{ .Tag }}-amd64"
|
org.opencontainers.image.url: "https://fission.io/"
|
||||||
dockerfile: cmd/fission-bundle/Dockerfile
|
dockerfile: cmd/fission-bundle/Dockerfile
|
||||||
build_flag_templates:
|
- id: pre-upgrade-checks
|
||||||
- "--label=org.opencontainers.image.description=fission-bundle is a component which is a single binary for all components. Most server side components running on server side are fission-bundle binary wrapped in container and used with different arguments."
|
tags:
|
||||||
- "--label=org.opencontainers.image.source={{.GitURL}}"
|
- latest
|
||||||
- "--platform=linux/amd64"
|
- "{{ .Tag }}"
|
||||||
- "--label=org.opencontainers.image.created={{.Date}}"
|
images:
|
||||||
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
|
- "{{ .Env.GHCR_REPO }}/pre-upgrade-checks"
|
||||||
- "--label=org.opencontainers.image.version={{.Tag}}"
|
labels:
|
||||||
- <<: *docker-amd64
|
org.opencontainers.image.description: "Preupgradechecks ensures that Fission is ready for the targeted version upgrade by performing checks beforehand."
|
||||||
ids:
|
org.opencontainers.image.source: "{{.GitURL}}"
|
||||||
- pre-upgrade-checks
|
org.opencontainers.image.created: "{{.Date}}"
|
||||||
image_templates:
|
org.opencontainers.image.revision: "{{.FullCommit}}"
|
||||||
- "fission/pre-upgrade-checks:latest-amd64"
|
org.opencontainers.image.version: "{{.Tag}}"
|
||||||
- "fission/pre-upgrade-checks:{{ .Tag }}-amd64"
|
org.opencontainers.image.authors: "The Fission Authors https://fission.io/"
|
||||||
- "ghcr.io/fission/pre-upgrade-checks:latest-amd64"
|
org.opencontainers.image.vendor: "Fission"
|
||||||
- "ghcr.io/fission/pre-upgrade-checks:{{ .Tag }}-amd64"
|
org.opencontainers.image.url: "https://fission.io/"
|
||||||
dockerfile: cmd/preupgradechecks/Dockerfile
|
dockerfile: cmd/preupgradechecks/Dockerfile
|
||||||
build_flag_templates:
|
- id: reporter
|
||||||
- "--label=org.opencontainers.image.description=Preupgradechecks ensures that Fission is ready for the targeted version upgrade by performing checks beforehand."
|
tags:
|
||||||
- "--label=org.opencontainers.image.source={{.GitURL}}"
|
- latest
|
||||||
- "--platform=linux/amd64"
|
- "{{ .Tag }}"
|
||||||
- "--label=org.opencontainers.image.created={{.Date}}"
|
images:
|
||||||
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
|
- "{{ .Env.GHCR_REPO }}/reporter"
|
||||||
- "--label=org.opencontainers.image.version={{.Tag}}"
|
labels:
|
||||||
- <<: *docker-amd64
|
org.opencontainers.image.description: "The reporter gathers information that assists in improving fission."
|
||||||
ids:
|
org.opencontainers.image.source: "{{.GitURL}}"
|
||||||
- reporter
|
org.opencontainers.image.created: "{{.Date}}"
|
||||||
image_templates:
|
org.opencontainers.image.revision: "{{.FullCommit}}"
|
||||||
- "fission/reporter:latest-amd64"
|
org.opencontainers.image.version: "{{.Tag}}"
|
||||||
- "fission/reporter:{{ .Tag }}-amd64"
|
org.opencontainers.image.authors: "The Fission Authors https://fission.io/"
|
||||||
- "ghcr.io/fission/reporter:latest-amd64"
|
org.opencontainers.image.vendor: "Fission"
|
||||||
- "ghcr.io/fission/reporter:{{ .Tag }}-amd64"
|
org.opencontainers.image.url: "https://fission.io/"
|
||||||
dockerfile: cmd/reporter/Dockerfile
|
dockerfile: cmd/reporter/Dockerfile
|
||||||
build_flag_templates:
|
|
||||||
- "--label=org.opencontainers.image.description=The reporter gathers information that assists in improving fission."
|
|
||||||
- "--label=org.opencontainers.image.source={{.GitURL}}"
|
|
||||||
- "--platform=linux/amd64"
|
|
||||||
- "--label=org.opencontainers.image.created={{.Date}}"
|
|
||||||
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
|
|
||||||
- "--label=org.opencontainers.image.version={{.Tag}}"
|
|
||||||
- &docker-arm64
|
|
||||||
use: buildx
|
|
||||||
goos: linux
|
|
||||||
goarch: arm64
|
|
||||||
ids:
|
|
||||||
- builder
|
|
||||||
image_templates:
|
|
||||||
- "fission/builder:latest-arm64"
|
|
||||||
- "fission/builder:{{ .Tag }}-arm64"
|
|
||||||
- "ghcr.io/fission/builder:latest-arm64"
|
|
||||||
- "ghcr.io/fission/builder:{{ .Tag }}-arm64"
|
|
||||||
dockerfile: cmd/builder/Dockerfile
|
|
||||||
build_flag_templates:
|
|
||||||
- "--label=org.opencontainers.image.description=The builder assists in building the fission function source code for deployment."
|
|
||||||
- "--label=org.opencontainers.image.source={{.GitURL}}"
|
|
||||||
- "--platform=linux/arm64"
|
|
||||||
- "--label=org.opencontainers.image.created={{.Date}}"
|
|
||||||
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
|
|
||||||
- "--label=org.opencontainers.image.version={{.Tag}}"
|
|
||||||
- <<: *docker-arm64
|
|
||||||
ids:
|
|
||||||
- fetcher
|
|
||||||
image_templates:
|
|
||||||
- "fission/fetcher:latest-arm64"
|
|
||||||
- "fission/fetcher:{{ .Tag }}-arm64"
|
|
||||||
- "ghcr.io/fission/fetcher:latest-arm64"
|
|
||||||
- "ghcr.io/fission/fetcher:{{ .Tag }}-arm64"
|
|
||||||
dockerfile: cmd/fetcher/Dockerfile
|
|
||||||
build_flag_templates:
|
|
||||||
- "--label=org.opencontainers.image.description=Fetcher is a lightweight component used by environment and builder pods. Fetcher helps in fetch and upload of source/deployment packages and specializing environments."
|
|
||||||
- "--label=org.opencontainers.image.source={{.GitURL}}"
|
|
||||||
- "--platform=linux/arm64"
|
|
||||||
- "--label=org.opencontainers.image.created={{.Date}}"
|
|
||||||
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
|
|
||||||
- "--label=org.opencontainers.image.version={{.Tag}}"
|
|
||||||
- <<: *docker-arm64
|
|
||||||
ids:
|
|
||||||
- fission-bundle
|
|
||||||
image_templates:
|
|
||||||
- "fission/fission-bundle:latest-arm64"
|
|
||||||
- "fission/fission-bundle:{{ .Tag }}-arm64"
|
|
||||||
- "ghcr.io/fission/fission-bundle:latest-arm64"
|
|
||||||
- "ghcr.io/fission/fission-bundle:{{ .Tag }}-arm64"
|
|
||||||
dockerfile: cmd/fission-bundle/Dockerfile
|
|
||||||
build_flag_templates:
|
|
||||||
- "--label=org.opencontainers.image.description=fission-bundle is a component which is a single binary for all components. Most server side components running on server side are fission-bundle binary wrapped in container and used with different arguments."
|
|
||||||
- "--label=org.opencontainers.image.source={{.GitURL}}"
|
|
||||||
- "--platform=linux/arm64"
|
|
||||||
- "--label=org.opencontainers.image.created={{.Date}}"
|
|
||||||
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
|
|
||||||
- "--label=org.opencontainers.image.version={{.Tag}}"
|
|
||||||
- <<: *docker-arm64
|
|
||||||
ids:
|
|
||||||
- pre-upgrade-checks
|
|
||||||
image_templates:
|
|
||||||
- "fission/pre-upgrade-checks:latest-arm64"
|
|
||||||
- "fission/pre-upgrade-checks:{{ .Tag }}-arm64"
|
|
||||||
- "ghcr.io/fission/pre-upgrade-checks:latest-arm64"
|
|
||||||
- "ghcr.io/fission/pre-upgrade-checks:{{ .Tag }}-arm64"
|
|
||||||
dockerfile: cmd/preupgradechecks/Dockerfile
|
|
||||||
build_flag_templates:
|
|
||||||
- "--label=org.opencontainers.image.description=Preupgradechecks ensures that Fission is ready for the targeted version upgrade by performing checks beforehand."
|
|
||||||
- "--label=org.opencontainers.image.source={{.GitURL}}"
|
|
||||||
- "--platform=linux/arm64"
|
|
||||||
- "--label=org.opencontainers.image.created={{.Date}}"
|
|
||||||
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
|
|
||||||
- "--label=org.opencontainers.image.version={{.Tag}}"
|
|
||||||
- <<: *docker-arm64
|
|
||||||
ids:
|
|
||||||
- reporter
|
|
||||||
image_templates:
|
|
||||||
- "fission/reporter:latest-arm64"
|
|
||||||
- "fission/reporter:{{ .Tag }}-arm64"
|
|
||||||
- "ghcr.io/fission/reporter:latest-arm64"
|
|
||||||
- "ghcr.io/fission/reporter:{{ .Tag }}-arm64"
|
|
||||||
dockerfile: cmd/reporter/Dockerfile
|
|
||||||
build_flag_templates:
|
|
||||||
- "--label=org.opencontainers.image.description=The reporter gathers information that assists in improving fission."
|
|
||||||
- "--label=org.opencontainers.image.source={{.GitURL}}"
|
|
||||||
- "--platform=linux/arm64"
|
|
||||||
- "--label=org.opencontainers.image.created={{.Date}}"
|
|
||||||
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
|
|
||||||
- "--label=org.opencontainers.image.version={{.Tag}}"
|
|
||||||
docker_manifests:
|
|
||||||
- name_template: ghcr.io/fission/builder:{{ .Tag }}
|
|
||||||
image_templates:
|
|
||||||
- ghcr.io/fission/builder:{{ .Tag }}-amd64
|
|
||||||
- ghcr.io/fission/builder:{{ .Tag }}-arm64
|
|
||||||
- name_template: fission/builder:{{ .Tag }}
|
|
||||||
image_templates:
|
|
||||||
- fission/builder:{{ .Tag }}-amd64
|
|
||||||
- fission/builder:{{ .Tag }}-arm64
|
|
||||||
- name_template: ghcr.io/fission/fetcher:{{ .Tag }}
|
|
||||||
image_templates:
|
|
||||||
- ghcr.io/fission/fetcher:{{ .Tag }}-amd64
|
|
||||||
- ghcr.io/fission/fetcher:{{ .Tag }}-arm64
|
|
||||||
- name_template: fission/fetcher:{{ .Tag }}
|
|
||||||
image_templates:
|
|
||||||
- fission/fetcher:{{ .Tag }}-amd64
|
|
||||||
- fission/fetcher:{{ .Tag }}-arm64
|
|
||||||
- name_template: ghcr.io/fission/fission-bundle:{{ .Tag }}
|
|
||||||
image_templates:
|
|
||||||
- ghcr.io/fission/fission-bundle:{{ .Tag }}-amd64
|
|
||||||
- ghcr.io/fission/fission-bundle:{{ .Tag }}-arm64
|
|
||||||
- name_template: fission/fission-bundle:{{ .Tag }}
|
|
||||||
image_templates:
|
|
||||||
- fission/fission-bundle:{{ .Tag }}-amd64
|
|
||||||
- fission/fission-bundle:{{ .Tag }}-arm64
|
|
||||||
- name_template: ghcr.io/fission/pre-upgrade-checks:{{ .Tag }}
|
|
||||||
image_templates:
|
|
||||||
- ghcr.io/fission/pre-upgrade-checks:{{ .Tag }}-amd64
|
|
||||||
- ghcr.io/fission/pre-upgrade-checks:{{ .Tag }}-arm64
|
|
||||||
- name_template: fission/pre-upgrade-checks:{{ .Tag }}
|
|
||||||
image_templates:
|
|
||||||
- fission/pre-upgrade-checks:{{ .Tag }}-amd64
|
|
||||||
- fission/pre-upgrade-checks:{{ .Tag }}-arm64
|
|
||||||
- name_template: ghcr.io/fission/reporter:{{ .Tag }}
|
|
||||||
image_templates:
|
|
||||||
- ghcr.io/fission/reporter:{{ .Tag }}-amd64
|
|
||||||
- ghcr.io/fission/reporter:{{ .Tag }}-arm64
|
|
||||||
- name_template: fission/reporter:{{ .Tag }}
|
|
||||||
image_templates:
|
|
||||||
- fission/reporter:{{ .Tag }}-amd64
|
|
||||||
- fission/reporter:{{ .Tag }}-arm64
|
|
||||||
- name_template: ghcr.io/fission/builder:latest
|
|
||||||
image_templates:
|
|
||||||
- ghcr.io/fission/builder:latest-amd64
|
|
||||||
- ghcr.io/fission/builder:latest-arm64
|
|
||||||
- name_template: fission/builder:latest
|
|
||||||
image_templates:
|
|
||||||
- fission/builder:latest-amd64
|
|
||||||
- fission/builder:latest-arm64
|
|
||||||
- name_template: ghcr.io/fission/fetcher:latest
|
|
||||||
image_templates:
|
|
||||||
- ghcr.io/fission/fetcher:latest-amd64
|
|
||||||
- ghcr.io/fission/fetcher:latest-arm64
|
|
||||||
- name_template: fission/fetcher:latest
|
|
||||||
image_templates:
|
|
||||||
- fission/fetcher:latest-amd64
|
|
||||||
- fission/fetcher:latest-arm64
|
|
||||||
- name_template: ghcr.io/fission/fission-bundle:latest
|
|
||||||
image_templates:
|
|
||||||
- ghcr.io/fission/fission-bundle:latest-amd64
|
|
||||||
- ghcr.io/fission/fission-bundle:latest-arm64
|
|
||||||
- name_template: fission/fission-bundle:latest
|
|
||||||
image_templates:
|
|
||||||
- fission/fission-bundle:latest-amd64
|
|
||||||
- fission/fission-bundle:latest-arm64
|
|
||||||
- name_template: ghcr.io/fission/pre-upgrade-checks:latest
|
|
||||||
image_templates:
|
|
||||||
- ghcr.io/fission/pre-upgrade-checks:latest-amd64
|
|
||||||
- ghcr.io/fission/pre-upgrade-checks:latest-arm64
|
|
||||||
- name_template: fission/pre-upgrade-checks:latest
|
|
||||||
image_templates:
|
|
||||||
- fission/pre-upgrade-checks:latest-amd64
|
|
||||||
- fission/pre-upgrade-checks:latest-arm64
|
|
||||||
- name_template: ghcr.io/fission/reporter:latest
|
|
||||||
image_templates:
|
|
||||||
- ghcr.io/fission/reporter:latest-amd64
|
|
||||||
- ghcr.io/fission/reporter:latest-arm64
|
|
||||||
- name_template: fission/reporter:latest
|
|
||||||
image_templates:
|
|
||||||
- fission/reporter:latest-amd64
|
|
||||||
- fission/reporter:latest-arm64
|
|
||||||
changelog:
|
changelog:
|
||||||
skip: false
|
disable: true
|
||||||
archives:
|
archives:
|
||||||
- id: fission
|
- id: fission
|
||||||
builds:
|
ids:
|
||||||
- fission-cli
|
- fission-cli
|
||||||
name_template: "{{ .ProjectName }}-{{ .Tag }}-{{ .Os }}-{{ .Arch }}"
|
name_template: "{{ .ProjectName }}-{{ .Tag }}-{{ .Os }}-{{ .Arch }}"
|
||||||
format: binary
|
formats:
|
||||||
|
- binary
|
||||||
checksum:
|
checksum:
|
||||||
name_template: "checksums.txt"
|
name_template: "checksums.txt"
|
||||||
algorithm: sha256
|
docker_digest:
|
||||||
|
name_template: "docker-digests.txt"
|
||||||
|
|
||||||
# signs the checksum file
|
# signs the checksum file
|
||||||
# https://goreleaser.com/customization/sign
|
# https://goreleaser.com/customization/sign
|
||||||
signs:
|
signs:
|
||||||
- cmd: cosign
|
- id: cosign-binary
|
||||||
artifacts: all
|
env:
|
||||||
stdin: '{{ .Env.COSIGN_PWD }}'
|
- COSIGN_EXPERIMENTAL=1
|
||||||
output: true
|
signature: "${artifact}.sig.bundle"
|
||||||
args:
|
cmd: cosign
|
||||||
- sign-blob
|
artifacts: all
|
||||||
- '--key=cosign.key'
|
args:
|
||||||
- '--output-certificate=${certificate}'
|
- sign-blob
|
||||||
- '--output-signature=${signature}'
|
- "--bundle=${signature}"
|
||||||
- '${artifact}'
|
- "${artifact}"
|
||||||
- '--yes' # needed for cosign 2.0.0+
|
- "--yes" # needed for cosign 2.0.0+
|
||||||
|
|
||||||
# signs our docker image
|
# signs our docker image
|
||||||
# https://goreleaser.com/customization/docker_sign
|
# https://goreleaser.com/customization/docker_sign
|
||||||
docker_signs:
|
docker_signs:
|
||||||
- cmd: cosign
|
- cmd: cosign
|
||||||
artifacts: all
|
env:
|
||||||
stdin: '{{ .Env.COSIGN_PWD }}'
|
- COSIGN_EXPERIMENTAL=1
|
||||||
output: true
|
artifacts: all
|
||||||
args:
|
args:
|
||||||
- 'sign'
|
- sign
|
||||||
- '--key=cosign.key'
|
- "${artifact}"
|
||||||
- '${artifact}'
|
- "--yes" # needed for cosign 2.0.0+
|
||||||
- '--yes' # needed for cosign 2.0.0+
|
|
||||||
|
sboms:
|
||||||
|
- artifacts: archive
|
||||||
|
id: archive
|
||||||
|
- artifacts: source
|
||||||
|
id: source
|
||||||
|
- artifacts: binary
|
||||||
|
id: binary
|
||||||
|
- artifacts: package
|
||||||
|
id: package
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
repos:
|
||||||
|
- repo: https://github.com/gitleaks/gitleaks
|
||||||
|
rev: v8.16.3
|
||||||
|
hooks:
|
||||||
|
- id: gitleaks
|
||||||
|
- repo: https://github.com/golangci/golangci-lint
|
||||||
|
rev: v1.52.2
|
||||||
|
hooks:
|
||||||
|
- id: golangci-lint
|
||||||
|
- repo: https://github.com/jumanjihouse/pre-commit-hooks
|
||||||
|
rev: 3.0.0
|
||||||
|
hooks:
|
||||||
|
- id: shellcheck
|
||||||
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
|
rev: v4.4.0
|
||||||
|
hooks:
|
||||||
|
- id: end-of-file-fixer
|
||||||
|
- id: trailing-whitespace
|
||||||
@@ -59,23 +59,20 @@ install-fission-cli:
|
|||||||
mv dist/fission-cli_$(GOOS)_$(GOARCH)_v1/fission$(FISSION-CLI-SUFFIX) /usr/local/bin/fission
|
mv dist/fission-cli_$(GOOS)_$(GOARCH)_v1/fission$(FISSION-CLI-SUFFIX) /usr/local/bin/fission
|
||||||
|
|
||||||
### Codegen
|
### Codegen
|
||||||
codegen: controller-gen-install
|
codegen:
|
||||||
@./hack/update-codegen.sh
|
@./hack/update-codegen.sh
|
||||||
$(GOPATH)/bin/controller-gen object:headerFile="hack/boilerplate.txt" paths="./..."
|
go tool controller-gen object:headerFile="hack/boilerplate.txt" paths="./..."
|
||||||
|
|
||||||
### CRDs
|
### CRDs
|
||||||
controller-gen-install:
|
generate-crds:
|
||||||
go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.15.0
|
go tool controller-gen crd \
|
||||||
|
|
||||||
generate-crds: controller-gen-install
|
|
||||||
$(GOPATH)/bin/controller-gen crd \
|
|
||||||
paths=./pkg/apis/core/v1 \
|
paths=./pkg/apis/core/v1 \
|
||||||
output:crd:artifacts:config=crds/v1
|
output:crd:artifacts:config=crds/v1
|
||||||
|
|
||||||
### Webhook generation: it generates webhook configs with help of kubebuilder:webhook tag
|
### Webhook generation: it generates webhook configs with help of kubebuilder:webhook tag
|
||||||
generate-webhooks: controller-gen-install
|
generate-webhooks:
|
||||||
$(GOPATH)/bin/controller-gen webhook \
|
go tool controller-gen webhook \
|
||||||
paths=./pkg/apis/core/v1 \
|
paths=./pkg/webhook \
|
||||||
output:dir=charts/fission-all/templates/webhook-server
|
output:dir=charts/fission-all/templates/webhook-server
|
||||||
|
|
||||||
|
|
||||||
@@ -99,12 +96,9 @@ generate-swagger-doc:
|
|||||||
generate-cli-docs:
|
generate-cli-docs:
|
||||||
go run tools/cmd-docs/main.go -o "../fission.io/content/en/docs/reference/fission-cli"
|
go run tools/cmd-docs/main.go -o "../fission.io/content/en/docs/reference/fission-cli"
|
||||||
|
|
||||||
install-crd-ref-docs:
|
generate-crd-ref-docs:
|
||||||
go install github.com/elastic/crd-ref-docs@v0.0.12
|
|
||||||
|
|
||||||
generate-crd-ref-docs: install-crd-ref-docs
|
|
||||||
# crd-ref-docs: https://github.com/elastic/crd-ref-docs
|
# crd-ref-docs: https://github.com/elastic/crd-ref-docs
|
||||||
$(GOPATH)/bin/crd-ref-docs --source-path=pkg/apis/core/v1 --config=tools/crd-ref-docs/config.yaml --renderer markdown
|
go tool crd-ref-docs --source-path=pkg/apis/core/v1 --config=tools/crd-ref-docs/config.yaml --renderer markdown
|
||||||
cp tools/crd-ref-docs/header.md crd_docs.md
|
cp tools/crd-ref-docs/header.md crd_docs.md
|
||||||
cat out.md >> crd_docs.md && rm out.md
|
cat out.md >> crd_docs.md && rm out.md
|
||||||
mv crd_docs.md ../fission.io/content/en/docs/reference/crd-reference.md
|
mv crd_docs.md ../fission.io/content/en/docs/reference/crd-reference.md
|
||||||
@@ -118,6 +112,7 @@ skaffold-prebuild:
|
|||||||
@cp -v cmd/fission-bundle/Dockerfile dist/fission-bundle_linux_amd64_v1/Dockerfile
|
@cp -v cmd/fission-bundle/Dockerfile dist/fission-bundle_linux_amd64_v1/Dockerfile
|
||||||
@cp -v cmd/reporter/Dockerfile dist/reporter_linux_amd64_v1/Dockerfile
|
@cp -v cmd/reporter/Dockerfile dist/reporter_linux_amd64_v1/Dockerfile
|
||||||
@cp -v cmd/preupgradechecks/Dockerfile dist/pre-upgrade-checks_linux_amd64_v1/Dockerfile
|
@cp -v cmd/preupgradechecks/Dockerfile dist/pre-upgrade-checks_linux_amd64_v1/Dockerfile
|
||||||
|
@find dist/ -name 'Dockerfile' -exec sed -i.bak 's|$$TARGETPLATFORM/||g' {} +; find dist/ -name 'Dockerfile.bak' -delete
|
||||||
|
|
||||||
skaffold-deploy: skaffold-prebuild
|
skaffold-deploy: skaffold-prebuild
|
||||||
skaffold run -p $(SKAFFOLD_PROFILE)
|
skaffold run -p $(SKAFFOLD_PROFILE)
|
||||||
@@ -128,10 +123,3 @@ release:
|
|||||||
@./hack/release.sh $(VERSION)
|
@./hack/release.sh $(VERSION)
|
||||||
@./hack/release-tag.sh $(VERSION)
|
@./hack/release-tag.sh $(VERSION)
|
||||||
@./hack/changelog.sh
|
@./hack/changelog.sh
|
||||||
|
|
||||||
## Envtest
|
|
||||||
install-envtest:
|
|
||||||
go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
|
|
||||||
|
|
||||||
setup-envtest:
|
|
||||||
setup-envtest -p path use 1.23.x
|
|
||||||
|
|||||||
@@ -36,6 +36,12 @@
|
|||||||
<a href="https://github.com/fission/fission">
|
<a href="https://github.com/fission/fission">
|
||||||
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/fission/fission?style=social">
|
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/fission/fission?style=social">
|
||||||
</a>
|
</a>
|
||||||
|
<a href="https://scorecard.dev/viewer/?uri=github.com/fission/fission">
|
||||||
|
<image alt="OpenSSF Scorecard" src="https://api.scorecard.dev/projects/github.com/fission/fission/badge">
|
||||||
|
</a>
|
||||||
|
<a href="https://www.bestpractices.dev/projects/4986">
|
||||||
|
<img src="https://www.bestpractices.dev/projects/4986/badge">
|
||||||
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
--------------
|
--------------
|
||||||
@@ -88,7 +94,7 @@ aggregation — also helps with ops on your Fission deployment.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Add the stock NodeJS env to your Fission deployment
|
# Add the stock NodeJS env to your Fission deployment
|
||||||
$ fission env create --name nodejs --image fission/node-env
|
$ fission env create --name nodejs --image ghcr.io/fission/node-env
|
||||||
|
|
||||||
# Create a function with a javascript one-liner that prints "hello world"
|
# Create a function with a javascript one-liner that prints "hello world"
|
||||||
$ fission function create --name hello --env nodejs --code https://raw.githubusercontent.com/fission/examples/master/nodejs/hello.js
|
$ fission function create --name hello --env nodejs --code https://raw.githubusercontent.com/fission/examples/master/nodejs/hello.js
|
||||||
|
|||||||
+4
-4
@@ -6,12 +6,12 @@ Please refer using [latest stable release](https://github.com/fission/fission/re
|
|||||||
|
|
||||||
| Version | Supported |
|
| Version | Supported |
|
||||||
| ------- | ------------------ |
|
| ------- | ------------------ |
|
||||||
| >=1.14.x | :white_check_mark: |
|
| >=1.20.x | :white_check_mark: |
|
||||||
| < 1.14.0 | :x: |
|
| < 1.20.0 | :x: |
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
Please send the details to both of us:
|
Please send the details to both of us:
|
||||||
|
|
||||||
- Sanket Sudake sanket@infracloud.io
|
- Sanket Sudake sanket[at]infracloud.io
|
||||||
- Vishal Biyani vishal@infracloud.io
|
- Vishal Biyani vishal[at]infracloud.io
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
name: fission-all
|
name: fission-all
|
||||||
version: v1.20.4
|
version: 1.22.0
|
||||||
appVersion: v1.20.4
|
appVersion: v1.22.0
|
||||||
description: Fission is a fast serverless framework for Kubernetes.
|
description: Fission is a fast serverless framework for Kubernetes.
|
||||||
kubeVersion: ">=1.25.0-0"
|
kubeVersion: ">=1.28.0-0"
|
||||||
home: https://fission.io/
|
home: https://fission.io/
|
||||||
icon: https://fission.io/images/fission-logo-white.svg
|
icon: https://fission.io/images/fission-logo-white.svg
|
||||||
sources:
|
sources:
|
||||||
@@ -21,7 +21,6 @@ maintainers:
|
|||||||
email: vishal@infracloud.io
|
email: vishal@infracloud.io
|
||||||
- name: Sanket Sudake
|
- name: Sanket Sudake
|
||||||
email: sanket@infracloud.io
|
email: sanket@infracloud.io
|
||||||
engine: gotpl
|
|
||||||
type: application
|
type: application
|
||||||
annotations:
|
annotations:
|
||||||
artifacthub.io/signKey: |
|
artifacthub.io/signKey: |
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- Kubernetes 1.23+
|
- Kubernetes 1.28+
|
||||||
- Helm 3+
|
- Helm 3+
|
||||||
|
|
||||||
## Get Repo Info
|
## Get Repo Info
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
{{ template "deprecationWarnings" . }}
|
||||||
|
|
||||||
1. Install the client CLI.
|
1. Install the client CLI.
|
||||||
|
|
||||||
Mac:
|
Mac:
|
||||||
@@ -18,7 +20,7 @@ Windows:
|
|||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
# Create an environment
|
# Create an environment
|
||||||
$ fission env create --name nodejs --image fission/node-env --namespace {{ .Values.defaultNamespace }}
|
$ fission env create --name nodejs --image ghcr.io/fission/node-env --namespace {{ .Values.defaultNamespace }}
|
||||||
|
|
||||||
# Get a hello world
|
# Get a hello world
|
||||||
$ curl https://raw.githubusercontent.com/fission/examples/master/nodejs/hello.js > hello.js
|
$ curl https://raw.githubusercontent.com/fission/examples/master/nodejs/hello.js > hello.js
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{{- define "deprecationWarnings" -}}
|
||||||
|
{{- $deprecations := list -}}
|
||||||
|
|
||||||
|
{{- if .Values.builderNamespace -}}
|
||||||
|
{{- $deprecations = append $deprecations "The 'builderNamespace' parameter is deprecated and will be removed in future release." -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if .Values.functionNamespace -}}
|
||||||
|
{{- $deprecations = append $deprecations "The 'functionNamespace' parameter is deprecated and will be removed in future release." -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if .Values.disableOwnerReference -}}
|
||||||
|
{{- $deprecations = append $deprecations "The 'disableOwnerReference' flag is temporary addition and will be removed in future release." -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if $deprecations -}}
|
||||||
|
{{- range $deprecations }}
|
||||||
|
{{- printf "WARNING: %s" . | nindent 0 }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
@@ -37,38 +37,37 @@ auth:
|
|||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{/*
|
{{/*
|
||||||
This template generates the image name for the deployment depending on the value of "repository" field in values.yaml file.
|
Helper template to construct image names with repository and tag
|
||||||
*/}}
|
*/}}
|
||||||
{{- define "fission-bundleImage" -}}
|
{{- define "imageWithTag" -}}
|
||||||
{{- if .Values.repository -}}
|
{{- $repository := index . 0 -}}
|
||||||
{{- if eq .Values.imageTag "" -}}
|
{{- $image := index . 1 -}}
|
||||||
{{ .Values.repository }}/{{ .Values.image }}
|
{{- $tag := index . 2 -}}
|
||||||
{{- else -}}
|
{{- if $repository -}}
|
||||||
{{ .Values.repository }}/{{ .Values.image }}:{{ .Values.imageTag }}
|
{{- printf "%s/%s%s" $repository $image (ne $tag "" | ternary (printf ":%s" $tag) "") -}}
|
||||||
{{- end }}
|
|
||||||
{{- else -}}
|
{{- else -}}
|
||||||
{{- if eq .Values.imageTag "" -}}
|
{{- printf "%s%s" $image (ne $tag "" | ternary (printf ":%s" $tag) "") -}}
|
||||||
{{ .Values.image }}
|
{{- end -}}
|
||||||
{{- else -}}
|
{{- end -}}
|
||||||
{{ .Values.image }}:{{ .Values.imageTag }}
|
|
||||||
{{- end }}
|
{{- define "fission-bundleImage" -}}
|
||||||
{{- end }}
|
{{- $args := list .Values.repository .Values.image .Values.imageTag -}}
|
||||||
|
{{- include "imageWithTag" $args -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- define "reporterImage" -}}
|
{{- define "reporterImage" -}}
|
||||||
{{- if .Values.repository -}}
|
{{- $args := list .Values.repository .Values.postInstallReportImage .Values.imageTag -}}
|
||||||
{{- if eq .Values.imageTag "" -}}
|
{{- include "imageWithTag" $args -}}
|
||||||
{{ .Values.repository }}/{{ .Values.postInstallReportImage }}
|
{{- end -}}
|
||||||
{{- else -}}
|
|
||||||
{{ .Values.repository }}/{{ .Values.postInstallReportImage }}:{{ .Values.imageTag }}
|
{{- define "fetcherImage" -}}
|
||||||
{{- end }}
|
{{- $args := list (.Values.fetcher.repository | default .Values.repository) .Values.fetcher.image .Values.fetcher.imageTag -}}
|
||||||
{{- else -}}
|
{{- include "imageWithTag" $args -}}
|
||||||
{{- if eq .Values.imageTag "" -}}
|
{{- end -}}
|
||||||
{{ .Values.postInstallReportImage }}
|
|
||||||
{{- else -}}
|
{{- define "preUpgradeChecksImage" -}}
|
||||||
{{ .Values.postInstallReportImage }}:{{ .Values.imageTag }}
|
{{- $args := list (.Values.preUpgradeChecks.repository | default .Values.repository) .Values.preUpgradeChecks.image .Values.preUpgradeChecks.imageTag -}}
|
||||||
{{- end }}
|
{{- include "imageWithTag" $args -}}
|
||||||
{{- end }}
|
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- define "opentelemtry.envs" }}
|
{{- define "opentelemtry.envs" }}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
apiVersion: batch/v1
|
apiVersion: batch/v1
|
||||||
kind: Job
|
kind: Job
|
||||||
metadata:
|
metadata:
|
||||||
name: {{ template "fullname" . }}-{{ .Chart.Version }}
|
name: {{ template "fullname" . }}-{{ .Chart.Version }}-post-install
|
||||||
labels:
|
labels:
|
||||||
# The "release" convention makes it easy to tie a release to all of the
|
# The "release" convention makes it easy to tie a release to all of the
|
||||||
# Kubernetes resources that were created as part of that release.
|
# Kubernetes resources that were created as part of that release.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
apiVersion: batch/v1
|
apiVersion: batch/v1
|
||||||
kind: Job
|
kind: Job
|
||||||
metadata:
|
metadata:
|
||||||
name: {{ template "fullname" . }}-{{ .Chart.Version }}
|
name: {{ template "fullname" . }}-{{ .Chart.Version }}-post-upgrade
|
||||||
labels:
|
labels:
|
||||||
# The "release" convention makes it easy to tie a release to all of the
|
# The "release" convention makes it easy to tie a release to all of the
|
||||||
# Kubernetes resources that were created as part of that release.
|
# Kubernetes resources that were created as part of that release.
|
||||||
|
|||||||
@@ -30,11 +30,7 @@ spec:
|
|||||||
args: ["--builderMgr", "--storageSvcUrl", "http://storagesvc.{{ .Release.Namespace }}"]
|
args: ["--builderMgr", "--storageSvcUrl", "http://storagesvc.{{ .Release.Namespace }}"]
|
||||||
env:
|
env:
|
||||||
- name: FETCHER_IMAGE
|
- name: FETCHER_IMAGE
|
||||||
{{- if eq .Values.fetcher.imageTag "" }}
|
value: {{ include "fetcherImage" . | quote }}
|
||||||
value: "{{ .Values.fetcher.image }}"
|
|
||||||
{{- else }}
|
|
||||||
value: "{{ .Values.fetcher.image }}:{{ .Values.fetcher.imageTag }}"
|
|
||||||
{{- end }}
|
|
||||||
- name: FETCHER_IMAGE_PULL_POLICY
|
- name: FETCHER_IMAGE_PULL_POLICY
|
||||||
value: "{{ .Values.pullPolicy }}"
|
value: "{{ .Values.pullPolicy }}"
|
||||||
- name: BUILDER_IMAGE_PULL_POLICY
|
- name: BUILDER_IMAGE_PULL_POLICY
|
||||||
@@ -51,6 +47,8 @@ spec:
|
|||||||
value: {{ .Values.fetcher.resource.mem.limits | quote }}
|
value: {{ .Values.fetcher.resource.mem.limits | quote }}
|
||||||
- name: DEBUG_ENV
|
- name: DEBUG_ENV
|
||||||
value: {{ .Values.debugEnv | quote }}
|
value: {{ .Values.debugEnv | quote }}
|
||||||
|
- name: DISABLE_OWNER_REFERENCES
|
||||||
|
value: {{ .Values.disableOwnerReference | quote }}
|
||||||
- name: PPROF_ENABLED
|
- name: PPROF_ENABLED
|
||||||
value: {{ .Values.pprof.enabled | quote }}
|
value: {{ .Values.pprof.enabled | quote }}
|
||||||
- name: HELM_RELEASE_NAME
|
- name: HELM_RELEASE_NAME
|
||||||
|
|||||||
@@ -30,11 +30,7 @@ spec:
|
|||||||
args: ["--executorPort", "8888"]
|
args: ["--executorPort", "8888"]
|
||||||
env:
|
env:
|
||||||
- name: FETCHER_IMAGE
|
- name: FETCHER_IMAGE
|
||||||
{{- if eq .Values.fetcher.imageTag "" }}
|
value: {{ include "fetcherImage" . | quote }}
|
||||||
value: "{{ .Values.fetcher.image }}"
|
|
||||||
{{- else }}
|
|
||||||
value: "{{ .Values.fetcher.image }}:{{ .Values.fetcher.imageTag }}"
|
|
||||||
{{- end }}
|
|
||||||
- name: FETCHER_IMAGE_PULL_POLICY
|
- name: FETCHER_IMAGE_PULL_POLICY
|
||||||
value: "{{ .Values.pullPolicy }}"
|
value: "{{ .Values.pullPolicy }}"
|
||||||
- name: RUNTIME_IMAGE_PULL_POLICY
|
- name: RUNTIME_IMAGE_PULL_POLICY
|
||||||
@@ -76,6 +72,8 @@ spec:
|
|||||||
value: {{ .Values.executor.serviceAccountCheck.enabled | quote }}
|
value: {{ .Values.executor.serviceAccountCheck.enabled | quote }}
|
||||||
- name: SERVICEACCOUNT_CHECK_INTERVAL
|
- name: SERVICEACCOUNT_CHECK_INTERVAL
|
||||||
value: {{ .Values.executor.serviceAccountCheck.interval | quote }}
|
value: {{ .Values.executor.serviceAccountCheck.interval | quote }}
|
||||||
|
- name: DISABLE_OWNER_REFERENCES
|
||||||
|
value: {{ .Values.disableOwnerReference | quote }}
|
||||||
{{- end}}
|
{{- end}}
|
||||||
{{- include "fission-resource-namespace.envs" . | indent 8 }}
|
{{- include "fission-resource-namespace.envs" . | indent 8 }}
|
||||||
{{- include "kube_client.envs" . | indent 8 }}
|
{{- include "kube_client.envs" . | indent 8 }}
|
||||||
|
|||||||
@@ -28,11 +28,7 @@ spec:
|
|||||||
restartPolicy: Never
|
restartPolicy: Never
|
||||||
containers:
|
containers:
|
||||||
- name: pre-upgrade-job
|
- name: pre-upgrade-job
|
||||||
{{- if .Values.preUpgradeChecks.imageTag }}
|
image: {{ include "preUpgradeChecksImage" . | quote }}
|
||||||
image: {{ .Values.preUpgradeChecks.image }}:{{ .Values.preUpgradeChecks.imageTag }}
|
|
||||||
{{- else }}
|
|
||||||
image: {{ .Values.preUpgradeChecks.image }}
|
|
||||||
{{- end }}
|
|
||||||
imagePullPolicy: {{ .Values.pullPolicy }}
|
imagePullPolicy: {{ .Values.pullPolicy }}
|
||||||
command: [ "/pre-upgrade-checks" ]
|
command: [ "/pre-upgrade-checks" ]
|
||||||
env:
|
env:
|
||||||
|
|||||||
@@ -12,6 +12,12 @@ spec:
|
|||||||
matchLabels:
|
matchLabels:
|
||||||
svc: storagesvc
|
svc: storagesvc
|
||||||
application: fission-storage
|
application: fission-storage
|
||||||
|
strategy:
|
||||||
|
type: {{ .Values.storagesvc.deploymentStrategy.type }}
|
||||||
|
{{- if eq .Values.storagesvc.deploymentStrategy.type "RollingUpdate" }}
|
||||||
|
rollingUpdate:
|
||||||
|
{{- toYaml .Values.storagesvc.deploymentStrategy.rollingUpdate | nindent 6}}
|
||||||
|
{{- end }}
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ spec:
|
|||||||
ports:
|
ports:
|
||||||
- containerPort: 8080
|
- containerPort: 8080
|
||||||
name: metrics
|
name: metrics
|
||||||
|
resources:
|
||||||
|
{{- toYaml .Values.webhook.resources | nindent 10 }}
|
||||||
volumes:
|
volumes:
|
||||||
- name: serving-certs
|
- name: serving-certs
|
||||||
secret:
|
secret:
|
||||||
|
|||||||
@@ -25,13 +25,13 @@ image: fission/fission-bundle
|
|||||||
## It is also used by the chart to identify version of the few more images apart from fission-bundle.
|
## It is also used by the chart to identify version of the few more images apart from fission-bundle.
|
||||||
## Keep it empty for using latest tag.
|
## Keep it empty for using latest tag.
|
||||||
##
|
##
|
||||||
imageTag: v1.20.4
|
imageTag: v1.22.0
|
||||||
|
|
||||||
## pullPolicy represents the pull policy to use for images in the chart.
|
## pullPolicy represents the pull policy to use for images in the chart.
|
||||||
##
|
##
|
||||||
pullPolicy: IfNotPresent
|
pullPolicy: IfNotPresent
|
||||||
|
|
||||||
## imageppullsecrets
|
## imagepullsecrets
|
||||||
imagePullSecrets: []
|
imagePullSecrets: []
|
||||||
|
|
||||||
## priorityClassName represents the priority class name to use for Fission components.
|
## priorityClassName represents the priority class name to use for Fission components.
|
||||||
@@ -67,12 +67,16 @@ defaultNamespace: default
|
|||||||
## if builderNamespace is set to empty then builder resources will be created in the same namespace as the Fission resources.
|
## if builderNamespace is set to empty then builder resources will be created in the same namespace as the Fission resources.
|
||||||
## This is different from the release namespace.
|
## This is different from the release namespace.
|
||||||
##
|
##
|
||||||
|
## Note: This parameter is deprecated and will be removed in future fission releases.
|
||||||
|
##
|
||||||
builderNamespace: ""
|
builderNamespace: ""
|
||||||
|
|
||||||
## functionNamespace represents the namespace in which Fission Function resources will be created.
|
## functionNamespace represents the namespace in which Fission Function resources will be created.
|
||||||
## if functionNamespace is set to empty then function resources will be created in the same namespace as the Fission resources.
|
## if functionNamespace is set to empty then function resources will be created in the same namespace as the Fission resources.
|
||||||
## This is different from the release namespace.
|
## This is different from the release namespace.
|
||||||
##
|
##
|
||||||
|
## Note: This parameter is deprecated and will be removed in future fission releases.
|
||||||
|
##
|
||||||
functionNamespace: ""
|
functionNamespace: ""
|
||||||
|
|
||||||
## Fission will watch the following namespaces along with the `defaultNamespace` for fission custom resources.
|
## Fission will watch the following namespaces along with the `defaultNamespace` for fission custom resources.
|
||||||
@@ -88,6 +92,16 @@ additionalFissionNamespaces: []
|
|||||||
##
|
##
|
||||||
createNamespace: true
|
createNamespace: true
|
||||||
|
|
||||||
|
## disableOwnerReference decides to set OwnerReference to K8s resources like deployment, services, hpa etc. created by Fission.
|
||||||
|
## If set to true, the K8s resources created by Fission will not have OwnerReference set.
|
||||||
|
## Set to false if you want to add OwnerReference to K8s resources created by Fission.
|
||||||
|
##
|
||||||
|
## Set to true if you are using cross namespace meaning `builderNamespace` and `functionNamespace` are set.
|
||||||
|
##
|
||||||
|
## Note: This flag is temporary addition and would be removed in future fission releases.
|
||||||
|
##
|
||||||
|
disableOwnerReference: false
|
||||||
|
|
||||||
## enableIstio indicates whether to enable istio integration.
|
## enableIstio indicates whether to enable istio integration.
|
||||||
##
|
##
|
||||||
enableIstio: false
|
enableIstio: false
|
||||||
@@ -103,10 +117,14 @@ kubernetesClientBurst: 500
|
|||||||
## fetcher helps in fetching function source code/build and uploading it when function is invoked.
|
## fetcher helps in fetching function source code/build and uploading it when function is invoked.
|
||||||
##
|
##
|
||||||
fetcher:
|
fetcher:
|
||||||
|
## repository represents the repository of the fetcher component.
|
||||||
|
##
|
||||||
|
## By default, it is empty, which means global repository will be used.
|
||||||
|
repository: ""
|
||||||
## image represents the image of the fetcher component.
|
## image represents the image of the fetcher component.
|
||||||
image: fission/fetcher
|
image: fission/fetcher
|
||||||
## imageTag represents the tag of the image of the fetcher component.
|
## imageTag represents the tag of the image of the fetcher component.
|
||||||
imageTag: v1.20.4
|
imageTag: v1.22.0
|
||||||
|
|
||||||
## Fetcher is only for to downloading or uploading archive.
|
## Fetcher is only for to downloading or uploading archive.
|
||||||
## Normally, you don't need to change the value here, unless necessary.
|
## Normally, you don't need to change the value here, unless necessary.
|
||||||
@@ -421,6 +439,16 @@ storagesvc:
|
|||||||
##
|
##
|
||||||
resources: {}
|
resources: {}
|
||||||
|
|
||||||
|
## Deployment strategy defaults to RollingUpdate but use Recreate if new pods fail to
|
||||||
|
## attach to the volume until the old pod has released it.
|
||||||
|
## deploymentStrategy:
|
||||||
|
## type: Recreate
|
||||||
|
deploymentStrategy:
|
||||||
|
type: RollingUpdate
|
||||||
|
rollingUpdate:
|
||||||
|
maxSurge: 25%
|
||||||
|
maxUnavailable: 25%
|
||||||
|
|
||||||
## Archive pruner removes archives from storage which are not referenced by any package.
|
## Archive pruner removes archives from storage which are not referenced by any package.
|
||||||
archivePruner:
|
archivePruner:
|
||||||
enabled: true
|
enabled: true
|
||||||
@@ -669,12 +697,16 @@ preUpgradeChecks:
|
|||||||
## Run pre-install/pre-upgrade checks if true
|
## Run pre-install/pre-upgrade checks if true
|
||||||
##
|
##
|
||||||
enabled: true
|
enabled: true
|
||||||
|
## Repository for pre-install/pre-upgrade checks image
|
||||||
|
## By default it uses the global repository
|
||||||
|
##
|
||||||
|
repository: ""
|
||||||
## pre-install/pre-upgrade checks live in this image
|
## pre-install/pre-upgrade checks live in this image
|
||||||
##
|
##
|
||||||
image: fission/pre-upgrade-checks
|
image: fission/pre-upgrade-checks
|
||||||
## pre-install/pre-upgrade checks image version
|
## pre-install/pre-upgrade checks image version
|
||||||
##
|
##
|
||||||
imageTag: v1.20.4
|
imageTag: v1.22.0
|
||||||
|
|
||||||
## Fission post-install/post-upgrade reporting live in this image
|
## Fission post-install/post-upgrade reporting live in this image
|
||||||
##
|
##
|
||||||
@@ -806,28 +838,28 @@ mqt_keda:
|
|||||||
connector_images:
|
connector_images:
|
||||||
kafka:
|
kafka:
|
||||||
image: ghcr.io/fission/keda-kafka-http-connector
|
image: ghcr.io/fission/keda-kafka-http-connector
|
||||||
tag: v0.15
|
tag: v0.17
|
||||||
rabbitmq:
|
rabbitmq:
|
||||||
image: ghcr.io/fission/keda-rabbitmq-http-connector
|
image: ghcr.io/fission/keda-rabbitmq-http-connector
|
||||||
tag: v0.13
|
tag: v0.15
|
||||||
awskinesis:
|
awskinesis:
|
||||||
image: ghcr.io/fission/keda-aws-kinesis-http-connector
|
image: ghcr.io/fission/keda-aws-kinesis-http-connector
|
||||||
tag: v0.13
|
tag: v0.15
|
||||||
aws_sqs:
|
aws_sqs:
|
||||||
image: ghcr.io/fission/keda-aws-sqs-http-connector
|
image: ghcr.io/fission/keda-aws-sqs-http-connector
|
||||||
tag: v0.14
|
tag: v0.16
|
||||||
nats_steaming:
|
nats_steaming:
|
||||||
image: ghcr.io/fission/keda-nats-streaming-http-connector
|
image: ghcr.io/fission/keda-nats-streaming-http-connector
|
||||||
tag: v0.16
|
tag: v0.18
|
||||||
nats_jetstream:
|
nats_jetstream:
|
||||||
image: ghcr.io/fission/keda-nats-jetstream-http-connector
|
image: ghcr.io/fission/keda-nats-jetstream-http-connector
|
||||||
tag: v0.7
|
tag: v0.9
|
||||||
gcp_pubsub:
|
gcp_pubsub:
|
||||||
image: ghcr.io/fission/keda-gcp-pubsub-http-connector
|
image: ghcr.io/fission/keda-gcp-pubsub-http-connector
|
||||||
tag: v0.9
|
tag: v0.11
|
||||||
redis:
|
redis:
|
||||||
image: ghcr.io/fission/keda-redis-http-connector
|
image: ghcr.io/fission/keda-redis-http-connector
|
||||||
tag: v0.6
|
tag: v0.8
|
||||||
|
|
||||||
## Pod resources as:
|
## Pod resources as:
|
||||||
## resources:
|
## resources:
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
FROM cgr.dev/chainguard/static:latest
|
FROM cgr.dev/chainguard/static:latest@sha256:a301031ffd4ed67f35ca7fa6cf3dad9937b5fa47d7493955a18d9b4ca5412d1a
|
||||||
COPY builder /builder
|
ARG TARGETPLATFORM
|
||||||
|
COPY $TARGETPLATFORM/builder /builder
|
||||||
ENTRYPOINT ["/builder"]
|
ENTRYPOINT ["/builder"]
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
FROM cgr.dev/chainguard/static:latest
|
FROM cgr.dev/chainguard/static:latest@sha256:a301031ffd4ed67f35ca7fa6cf3dad9937b5fa47d7493955a18d9b4ca5412d1a
|
||||||
COPY fetcher /
|
ARG TARGETPLATFORM
|
||||||
|
COPY $TARGETPLATFORM/fetcher /
|
||||||
ENTRYPOINT ["/fetcher"]
|
ENTRYPOINT ["/fetcher"]
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
FROM cgr.dev/chainguard/static:latest
|
FROM cgr.dev/chainguard/static:latest@sha256:a301031ffd4ed67f35ca7fa6cf3dad9937b5fa47d7493955a18d9b4ca5412d1a
|
||||||
COPY fission-bundle /
|
ARG TARGETPLATFORM
|
||||||
|
COPY $TARGETPLATFORM/fission-bundle /
|
||||||
ENTRYPOINT ["/fission-bundle"]
|
ENTRYPOINT ["/fission-bundle"]
|
||||||
|
|||||||
+181
-176
@@ -21,9 +21,7 @@ import (
|
|||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
|
||||||
|
|
||||||
docopt "github.com/docopt/docopt-go"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/manager/signals"
|
"sigs.k8s.io/controller-runtime/pkg/manager/signals"
|
||||||
cnwebhook "sigs.k8s.io/controller-runtime/pkg/webhook"
|
cnwebhook "sigs.k8s.io/controller-runtime/pkg/webhook"
|
||||||
@@ -48,120 +46,38 @@ import (
|
|||||||
"github.com/fission/fission/pkg/webhook"
|
"github.com/fission/fission/pkg/webhook"
|
||||||
)
|
)
|
||||||
|
|
||||||
// runWebhook starts admission webhook server
|
// Command line arguments
|
||||||
func runWebhook(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, port int) error {
|
type CommandLineArgs struct {
|
||||||
return webhook.Start(ctx, clientGen, logger, cnwebhook.Options{
|
// Flags
|
||||||
Port: port,
|
canaryConfig bool
|
||||||
})
|
kubewatcher bool
|
||||||
|
timer bool
|
||||||
|
mqt bool
|
||||||
|
mqt_keda bool
|
||||||
|
builderMgr bool
|
||||||
|
showVersion bool
|
||||||
|
logger bool
|
||||||
|
|
||||||
|
// Port values
|
||||||
|
webhookPort int
|
||||||
|
routerPort int
|
||||||
|
executorPort int
|
||||||
|
storageServicePort int
|
||||||
|
|
||||||
|
// URL values
|
||||||
|
executorUrl string
|
||||||
|
routerUrl string
|
||||||
|
storageSvcUrl string
|
||||||
|
|
||||||
|
// Other configurations
|
||||||
|
storageType string
|
||||||
}
|
}
|
||||||
|
|
||||||
func runCanaryConfigServer(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface) error {
|
// Usage information
|
||||||
return canaryconfigmgr.StartCanaryServer(ctx, clientGen, logger, mgr, false)
|
const usageText string = `fission-bundle: Package of all fission microservices: router, executor.
|
||||||
}
|
|
||||||
|
|
||||||
func runRouter(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface, port int, executorUrl string) error {
|
|
||||||
return router.Start(ctx, clientGen, logger, mgr, port, eclient.MakeClient(logger, executorUrl))
|
|
||||||
}
|
|
||||||
|
|
||||||
func runExecutor(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface, port int) error {
|
|
||||||
return executor.StartExecutor(ctx, clientGen, logger, mgr, port)
|
|
||||||
}
|
|
||||||
|
|
||||||
func runKubeWatcher(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface, routerUrl string) error {
|
|
||||||
return kubewatcher.Start(ctx, clientGen, logger, mgr, routerUrl)
|
|
||||||
}
|
|
||||||
|
|
||||||
func runTimer(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface, routerUrl string) error {
|
|
||||||
return timer.Start(ctx, clientGen, logger, mgr, routerUrl)
|
|
||||||
}
|
|
||||||
|
|
||||||
func runMessageQueueMgr(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface, routerUrl string) error {
|
|
||||||
return mqtrigger.Start(ctx, clientGen, logger, mgr, routerUrl)
|
|
||||||
}
|
|
||||||
|
|
||||||
// KEDA based MessageQueue Trigger Manager
|
|
||||||
func runMQManager(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface, routerURL string) error {
|
|
||||||
return mqt.StartScalerManager(ctx, clientGen, logger, mgr, routerURL)
|
|
||||||
}
|
|
||||||
|
|
||||||
func runStorageSvc(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface, port int, storage storagesvc.Storage) error {
|
|
||||||
return storagesvc.Start(ctx, clientGen, logger, storage, mgr, port)
|
|
||||||
}
|
|
||||||
|
|
||||||
func runBuilderMgr(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface, storageSvcUrl string) error {
|
|
||||||
return buildermgr.Start(ctx, clientGen, logger, mgr, storageSvcUrl)
|
|
||||||
}
|
|
||||||
|
|
||||||
func runLogger(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger) error {
|
|
||||||
return functionLogger.Start(ctx, clientGen, logger)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getPort(logger *zap.Logger, portArg interface{}) int {
|
|
||||||
portArgStr := portArg.(string)
|
|
||||||
port, err := strconv.Atoi(portArgStr)
|
|
||||||
if err != nil {
|
|
||||||
logger.Fatal("invalid port number", zap.Error(err), zap.String("port", portArgStr))
|
|
||||||
}
|
|
||||||
return port
|
|
||||||
}
|
|
||||||
|
|
||||||
func getStringArgWithDefault(arg interface{}, defaultValue string) string {
|
|
||||||
if arg != nil {
|
|
||||||
return arg.(string)
|
|
||||||
} else {
|
|
||||||
return defaultValue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func getServiceName(arguments map[string]interface{}) string {
|
|
||||||
serviceName := "Fission-Unknown"
|
|
||||||
|
|
||||||
if arguments["--routerPort"] != nil {
|
|
||||||
serviceName = "Fission-Router"
|
|
||||||
} else if arguments["--executorPort"] != nil {
|
|
||||||
serviceName = "Fission-Executor"
|
|
||||||
} else if arguments["--kubewatcher"] == true {
|
|
||||||
serviceName = "Fission-KubeWatcher"
|
|
||||||
} else if arguments["--timer"] == true {
|
|
||||||
serviceName = "Fission-Timer"
|
|
||||||
} else if arguments["--mqt"] == true {
|
|
||||||
serviceName = "Fission-MessageQueueTrigger"
|
|
||||||
} else if arguments["--builderMgr"] == true {
|
|
||||||
serviceName = "Fission-BuilderMgr"
|
|
||||||
} else if arguments["--storageServicePort"] != nil {
|
|
||||||
serviceName = "Fission-StorageSvc"
|
|
||||||
} else if arguments["--mqt_keda"] == true {
|
|
||||||
serviceName = "Fission-Keda-MQTrigger"
|
|
||||||
}
|
|
||||||
|
|
||||||
return serviceName
|
|
||||||
}
|
|
||||||
|
|
||||||
func exitWithSync(logger *zap.Logger) {
|
|
||||||
// Ignore error, safe to ignore as per https://github.com/uber-go/zap/issues/328
|
|
||||||
_ = logger.Sync()
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
mgr := manager.New()
|
|
||||||
defer mgr.Wait()
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
// From https://github.com/containous/traefik/pull/1817/files
|
|
||||||
// Tell glog to log into STDERR. Otherwise, we risk
|
|
||||||
// certain kinds of API errors getting logged into a directory not
|
|
||||||
// available in a `FROM scratch` Docker container, causing glog to abort
|
|
||||||
// hard with an exit code > 0.
|
|
||||||
// TODO: fix the lint error. Error checking here is causing all components to crash with error "logtostderr not found"
|
|
||||||
flag.Set("logtostderr", "true") //nolint: errcheck
|
|
||||||
|
|
||||||
usage := `fission-bundle: Package of all fission microservices: router, executor.
|
|
||||||
|
|
||||||
Use it to start one or more of the fission servers:
|
Use it to start one or more of the fission servers:
|
||||||
|
|
||||||
|
|
||||||
Pool manager maintains a pool of generalized function containers, and
|
Pool manager maintains a pool of generalized function containers, and
|
||||||
specializes them on-demand. Executor must be run from a pod in a
|
specializes them on-demand. Executor must be run from a pod in a
|
||||||
Kubernetes cluster.
|
Kubernetes cluster.
|
||||||
@@ -198,142 +114,231 @@ Options:
|
|||||||
--storageServicePort=<port> Port that the storage service should listen on.
|
--storageServicePort=<port> Port that the storage service should listen on.
|
||||||
--executorUrl=<url> Executor URL. Not required if --executorPort is specified.
|
--executorUrl=<url> Executor URL. Not required if --executorPort is specified.
|
||||||
--routerUrl=<url> Router URL.
|
--routerUrl=<url> Router URL.
|
||||||
--etcdUrl=<etcdUrl> Etcd URL.
|
|
||||||
--storageSvcUrl=<url> StorageService URL.
|
--storageSvcUrl=<url> StorageService URL.
|
||||||
--filePath=<filePath> Directory to store functions in.
|
|
||||||
--namespace=<namespace> Kubernetes namespace in which to run function containers. Defaults to 'fission-function'.
|
|
||||||
--kubewatcher Start Kubernetes events watcher.
|
--kubewatcher Start Kubernetes events watcher.
|
||||||
--timer Start Timer.
|
--timer Start Timer.
|
||||||
--mqt Start message queue trigger.
|
--mqt Start message queue trigger.
|
||||||
--mqt_keda Start message queue trigger of kind KEDA
|
--mqt_keda Start message queue trigger of kind KEDA
|
||||||
--builderMgr Start builder manager.
|
--builderMgr Start builder manager.
|
||||||
--version Print version information
|
--version Print version information`
|
||||||
`
|
|
||||||
logger := loggerfactory.GetLogger()
|
|
||||||
defer exitWithSync(logger)
|
|
||||||
|
|
||||||
ctx := signals.SetupSignalHandler()
|
func main() {
|
||||||
profile.ProfileIfEnabled(ctx, logger, mgr)
|
mgr := manager.New()
|
||||||
|
defer mgr.Wait()
|
||||||
|
|
||||||
version := fmt.Sprintf("Fission Bundle Version: %s", info.BuildInfo().String())
|
// Set up command line parsing
|
||||||
arguments, err := docopt.ParseArgs(usage, nil, version)
|
args := setupCommandLineArgs()
|
||||||
if err != nil {
|
|
||||||
logger.Error("failed to parse arguments", zap.Error(err))
|
// Handle version request specially - exit after printing
|
||||||
return
|
if args.showVersion {
|
||||||
|
fmt.Printf("Fission Bundle Version: %s\n", info.BuildInfo().String())
|
||||||
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
shutdown, err := otel.InitProvider(ctx, logger, getServiceName(arguments))
|
// Initialize logger
|
||||||
|
logger := loggerfactory.GetLogger()
|
||||||
|
defer func() {
|
||||||
|
// Ignore error, safe to ignore as per https://github.com/uber-go/zap/issues/328
|
||||||
|
_ = logger.Sync()
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Set up signal handling for graceful shutdown
|
||||||
|
ctx := signals.SetupSignalHandler()
|
||||||
|
|
||||||
|
// Enable profiling if configured
|
||||||
|
profile.ProfileIfEnabled(ctx, logger, mgr)
|
||||||
|
|
||||||
|
// Initialize OpenTelemetry
|
||||||
|
serviceName := getServiceNameFromArgs(args)
|
||||||
|
shutdown, err := otel.InitProvider(ctx, logger, serviceName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("error initializing provider for OTLP", zap.Error(err), zap.Any("argument", arguments))
|
logger.Error("error initializing provider for OTLP", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if shutdown != nil {
|
if shutdown != nil {
|
||||||
defer shutdown(ctx)
|
defer shutdown(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
executorUrl := getStringArgWithDefault(arguments["--executorUrl"], "http://executor.fission")
|
// Initialize client generator
|
||||||
routerUrl := getStringArgWithDefault(arguments["--routerUrl"], "http://router.fission")
|
|
||||||
storageSvcUrl := getStringArgWithDefault(arguments["--storageSvcUrl"], "http://storagesvc.fission")
|
|
||||||
clientGen := crd.NewClientGenerator()
|
clientGen := crd.NewClientGenerator()
|
||||||
|
|
||||||
if arguments["--webhookPort"] != nil {
|
// Start the appropriate service based on command line arguments
|
||||||
port := getPort(logger, arguments["--webhookPort"])
|
startRequestedService(ctx, args, clientGen, logger, mgr)
|
||||||
err = runWebhook(ctx, clientGen, logger, port)
|
|
||||||
|
<-ctx.Done()
|
||||||
|
logger.Error("exiting")
|
||||||
|
}
|
||||||
|
|
||||||
|
// setupCommandLineArgs parses command line arguments and returns them
|
||||||
|
func setupCommandLineArgs() *CommandLineArgs {
|
||||||
|
args := &CommandLineArgs{}
|
||||||
|
|
||||||
|
// Override the default usage function
|
||||||
|
flag.Usage = func() {
|
||||||
|
fmt.Println(usageText)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tell glog to log into STDERR
|
||||||
|
flag.Set("logtostderr", "true") //nolint: errcheck
|
||||||
|
|
||||||
|
// Define flags
|
||||||
|
flag.BoolVar(&args.canaryConfig, "canaryConfig", false, "Start canary config server")
|
||||||
|
flag.BoolVar(&args.kubewatcher, "kubewatcher", false, "Start Kubernetes events watcher")
|
||||||
|
flag.BoolVar(&args.timer, "timer", false, "Start Timer")
|
||||||
|
flag.BoolVar(&args.mqt, "mqt", false, "Start message queue trigger")
|
||||||
|
flag.BoolVar(&args.mqt_keda, "mqt_keda", false, "Start message queue trigger of kind KEDA")
|
||||||
|
flag.BoolVar(&args.builderMgr, "builderMgr", false, "Start builder manager")
|
||||||
|
flag.BoolVar(&args.showVersion, "version", false, "Print version information")
|
||||||
|
flag.BoolVar(&args.logger, "logger", false, "Start logger")
|
||||||
|
|
||||||
|
// Port flags
|
||||||
|
flag.IntVar(&args.webhookPort, "webhookPort", 0, "Port that the webhook should listen on")
|
||||||
|
flag.IntVar(&args.routerPort, "routerPort", 0, "Port that the router should listen on")
|
||||||
|
flag.IntVar(&args.executorPort, "executorPort", 0, "Port that the executor should listen on")
|
||||||
|
flag.IntVar(&args.storageServicePort, "storageServicePort", 0, "Port that the storage service should listen on")
|
||||||
|
|
||||||
|
// URL flags
|
||||||
|
flag.StringVar(&args.executorUrl, "executorUrl", "http://executor.fission", "Executor URL")
|
||||||
|
flag.StringVar(&args.routerUrl, "routerUrl", "http://router.fission", "Router URL")
|
||||||
|
flag.StringVar(&args.storageSvcUrl, "storageSvcUrl", "http://storagesvc.fission", "StorageService URL")
|
||||||
|
|
||||||
|
// Other configuration flags
|
||||||
|
flag.StringVar(&args.storageType, "storageType", "", "Type of storage to use")
|
||||||
|
|
||||||
|
// Parse flags
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
return args
|
||||||
|
}
|
||||||
|
|
||||||
|
// getServiceNameFromArgs determines which service is being started based on command line args
|
||||||
|
func getServiceNameFromArgs(args *CommandLineArgs) string {
|
||||||
|
serviceName := "Fission-Unknown"
|
||||||
|
|
||||||
|
if args.routerPort != 0 {
|
||||||
|
serviceName = "Fission-Router"
|
||||||
|
} else if args.executorPort != 0 {
|
||||||
|
serviceName = "Fission-Executor"
|
||||||
|
} else if args.kubewatcher {
|
||||||
|
serviceName = "Fission-KubeWatcher"
|
||||||
|
} else if args.timer {
|
||||||
|
serviceName = "Fission-Timer"
|
||||||
|
} else if args.mqt {
|
||||||
|
serviceName = "Fission-MessageQueueTrigger"
|
||||||
|
} else if args.builderMgr {
|
||||||
|
serviceName = "Fission-BuilderMgr"
|
||||||
|
} else if args.storageServicePort != 0 {
|
||||||
|
serviceName = "Fission-StorageSvc"
|
||||||
|
} else if args.mqt_keda {
|
||||||
|
serviceName = "Fission-Keda-MQTrigger"
|
||||||
|
}
|
||||||
|
|
||||||
|
return serviceName
|
||||||
|
}
|
||||||
|
|
||||||
|
// startRequestedService starts the service specified by command line arguments
|
||||||
|
func startRequestedService(ctx context.Context, args *CommandLineArgs, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface) {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
// Start the requested service based on command line arguments
|
||||||
|
if args.webhookPort != 0 {
|
||||||
|
err = webhook.Start(ctx, clientGen, logger, cnwebhook.Options{
|
||||||
|
Port: args.webhookPort,
|
||||||
|
})
|
||||||
logger.Error("webhook server exited:", zap.Error(err))
|
logger.Error("webhook server exited:", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if arguments["--canaryConfig"] == true {
|
if args.canaryConfig {
|
||||||
err := runCanaryConfigServer(ctx, clientGen, logger, mgr)
|
err = canaryconfigmgr.StartCanaryServer(ctx, clientGen, logger, mgr, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("canary config server exited with error: ", zap.Error(err))
|
logger.Error("canary config server exited with error: ", zap.Error(err))
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if arguments["--routerPort"] != nil {
|
if args.routerPort != 0 {
|
||||||
port := getPort(logger, arguments["--routerPort"])
|
err = router.Start(ctx, clientGen, logger, mgr, args.routerPort, eclient.MakeClient(logger, args.executorUrl))
|
||||||
err = runRouter(ctx, clientGen, logger, mgr, port, executorUrl)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("router exited", zap.Error(err))
|
logger.Error("router exited", zap.Error(err))
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if arguments["--executorPort"] != nil {
|
if args.executorPort != 0 {
|
||||||
port := getPort(logger, arguments["--executorPort"])
|
err = executor.StartExecutor(ctx, clientGen, logger, mgr, args.executorPort)
|
||||||
err = runExecutor(ctx, clientGen, logger, mgr, port)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("executor exited", zap.Error(err))
|
logger.Error("executor exited", zap.Error(err))
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if arguments["--kubewatcher"] == true {
|
if args.kubewatcher {
|
||||||
err = runKubeWatcher(ctx, clientGen, logger, mgr, routerUrl)
|
err = kubewatcher.Start(ctx, clientGen, logger, mgr, args.routerUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("kubewatcher exited", zap.Error(err))
|
logger.Error("kubewatcher exited", zap.Error(err))
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if arguments["--timer"] == true {
|
if args.timer {
|
||||||
err = runTimer(ctx, clientGen, logger, mgr, routerUrl)
|
err = timer.Start(ctx, clientGen, logger, mgr, args.routerUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("timer exited", zap.Error(err))
|
logger.Error("timer exited", zap.Error(err))
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if arguments["--mqt"] == true {
|
if args.mqt {
|
||||||
err = runMessageQueueMgr(ctx, clientGen, logger, mgr, routerUrl)
|
err = mqtrigger.Start(ctx, clientGen, logger, mgr, args.routerUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("message queue manager exited", zap.Error(err))
|
logger.Error("message queue manager exited", zap.Error(err))
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if arguments["--mqt_keda"] == true {
|
if args.mqt_keda {
|
||||||
err = runMQManager(ctx, clientGen, logger, mgr, routerUrl)
|
err = mqt.StartScalerManager(ctx, clientGen, logger, mgr, args.routerUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("mqt scaler manager exited", zap.Error(err))
|
logger.Error("mqt scaler manager exited", zap.Error(err))
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if arguments["--builderMgr"] == true {
|
if args.builderMgr {
|
||||||
err = runBuilderMgr(ctx, clientGen, logger, mgr, storageSvcUrl)
|
err = buildermgr.Start(ctx, clientGen, logger, mgr, args.storageSvcUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("builder manager exited", zap.Error(err))
|
logger.Error("builder manager exited", zap.Error(err))
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if arguments["--logger"] == true {
|
if args.logger {
|
||||||
err = runLogger(ctx, clientGen, logger)
|
err = functionLogger.Start(ctx, clientGen, logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("logger exited", zap.Error(err))
|
logger.Error("logger exited", zap.Error(err))
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if arguments["--storageServicePort"] != nil {
|
if args.storageServicePort != 0 {
|
||||||
port := getPort(logger, arguments["--storageServicePort"])
|
startStorageService(ctx, args, clientGen, logger, mgr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var storage storagesvc.Storage
|
// startStorageService initializes and starts the storage service
|
||||||
|
func startStorageService(ctx context.Context, args *CommandLineArgs, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface) {
|
||||||
|
var storage storagesvc.Storage
|
||||||
|
|
||||||
if arguments["--storageType"] != nil && arguments["--storageType"] == string(storagesvc.StorageTypeS3) {
|
if args.storageType == string(storagesvc.StorageTypeS3) {
|
||||||
storage = storagesvc.NewS3Storage()
|
storage = storagesvc.NewS3Storage()
|
||||||
} else if arguments["--storageType"] == string(storagesvc.StorageTypeLocal) {
|
} else if args.storageType == string(storagesvc.StorageTypeLocal) {
|
||||||
storage = storagesvc.NewLocalStorage("/fission")
|
storage = storagesvc.NewLocalStorage("/fission")
|
||||||
}
|
|
||||||
err := runStorageSvc(ctx, clientGen, logger, mgr, port, storage)
|
|
||||||
if err != nil {
|
|
||||||
logger.Error("storage service exited", zap.Error(err))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
<-ctx.Done()
|
err := storagesvc.Start(ctx, clientGen, logger, storage, mgr, args.storageServicePort)
|
||||||
logger.Error("exiting")
|
if err != nil {
|
||||||
|
logger.Error("storage service exited", zap.Error(err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
||||||
fv1 "github.com/fission/fission/pkg/apis/core/v1"
|
fv1 "github.com/fission/fission/pkg/apis/core/v1"
|
||||||
@@ -41,12 +40,12 @@ import (
|
|||||||
func Start(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface, routerUrl string) error {
|
func Start(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *zap.Logger, mgr manager.Interface, routerUrl string) error {
|
||||||
fissionClient, err := clientGen.GetFissionClient()
|
fissionClient, err := clientGen.GetFissionClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to get fission client")
|
return fmt.Errorf("failed to get fission client: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = crd.WaitForFunctionCRDs(ctx, logger, fissionClient)
|
err = crd.WaitForFunctionCRDs(ctx, logger, fissionClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "error waiting for CRDs")
|
return fmt.Errorf("error waiting for CRDs: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
mqType := (fv1.MessageQueueType)(os.Getenv("MESSAGE_QUEUE_TYPE"))
|
mqType := (fv1.MessageQueueType)(os.Getenv("MESSAGE_QUEUE_TYPE"))
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ limitations under the License.
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/pkg/errors"
|
"fmt"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
"github.com/fission/fission/pkg/fission-cli/cliwrapper/cli"
|
"github.com/fission/fission/pkg/fission-cli/cliwrapper/cli"
|
||||||
@@ -65,7 +66,7 @@ func App(clientOptions cmd.ClientOptions) *cobra.Command {
|
|||||||
// }
|
// }
|
||||||
client, err := cmd.NewClient(clientOptions)
|
client, err := cmd.NewClient(clientOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to get fission client")
|
return fmt.Errorf("failed to get fission client: %w", err)
|
||||||
}
|
}
|
||||||
cmd.SetClientset(*client)
|
cmd.SetClientset(*client)
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
FROM cgr.dev/chainguard/static:latest
|
FROM cgr.dev/chainguard/static:latest@sha256:a301031ffd4ed67f35ca7fa6cf3dad9937b5fa47d7493955a18d9b4ca5412d1a
|
||||||
COPY pre-upgrade-checks /
|
ARG TARGETPLATFORM
|
||||||
|
COPY $TARGETPLATFORM/pre-upgrade-checks /
|
||||||
ENTRYPOINT ["/pre-upgrade-checks"]
|
ENTRYPOINT ["/pre-upgrade-checks"]
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
@@ -12,8 +11,7 @@ import (
|
|||||||
func TestPreUpgradeTaskClient(t *testing.T) {
|
func TestPreUpgradeTaskClient(t *testing.T) {
|
||||||
f := framework.NewFramework()
|
f := framework.NewFramework()
|
||||||
defer f.Logger().Sync()
|
defer f.Logger().Sync()
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx := t.Context()
|
||||||
defer cancel()
|
|
||||||
err := f.Start(ctx)
|
err := f.Start(ctx)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
FROM cgr.dev/chainguard/static:latest
|
FROM cgr.dev/chainguard/static:latest@sha256:a301031ffd4ed67f35ca7fa6cf3dad9937b5fa47d7493955a18d9b4ca5412d1a
|
||||||
COPY reporter /
|
ARG TARGETPLATFORM
|
||||||
|
COPY $TARGETPLATFORM/reporter /
|
||||||
ENTRYPOINT ["/reporter"]
|
ENTRYPOINT ["/reporter"]
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
|
|||||||
kind: CustomResourceDefinition
|
kind: CustomResourceDefinition
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
controller-gen.kubebuilder.io/version: v0.15.0
|
controller-gen.kubebuilder.io/version: v0.17.2
|
||||||
name: canaryconfigs.fission.io
|
name: canaryconfigs.fission.io
|
||||||
spec:
|
spec:
|
||||||
group: fission.io
|
group: fission.io
|
||||||
|
|||||||
+2984
-741
File diff suppressed because it is too large
Load Diff
+1319
-332
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
|
|||||||
kind: CustomResourceDefinition
|
kind: CustomResourceDefinition
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
controller-gen.kubebuilder.io/version: v0.15.0
|
controller-gen.kubebuilder.io/version: v0.17.2
|
||||||
name: httptriggers.fission.io
|
name: httptriggers.fission.io
|
||||||
spec:
|
spec:
|
||||||
group: fission.io
|
group: fission.io
|
||||||
@@ -76,14 +76,11 @@ spec:
|
|||||||
type: object
|
type: object
|
||||||
host:
|
host:
|
||||||
description: |-
|
description: |-
|
||||||
TODO: remove this field since we have IngressConfig already
|
|
||||||
Deprecated: the original idea of this field is not for setting Ingress.
|
Deprecated: the original idea of this field is not for setting Ingress.
|
||||||
Since we have IngressConfig now, remove Host after couple releases.
|
Since we have IngressConfig now, remove Host after couple releases.
|
||||||
type: string
|
type: string
|
||||||
ingressconfig:
|
ingressconfig:
|
||||||
description: |-
|
description: IngressConfig for router to set up Ingress.
|
||||||
TODO: make IngressConfig an independent Fission resource
|
|
||||||
IngressConfig for router to set up Ingress.
|
|
||||||
properties:
|
properties:
|
||||||
annotations:
|
annotations:
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
|
|||||||
kind: CustomResourceDefinition
|
kind: CustomResourceDefinition
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
controller-gen.kubebuilder.io/version: v0.15.0
|
controller-gen.kubebuilder.io/version: v0.17.2
|
||||||
name: kuberneteswatchtriggers.fission.io
|
name: kuberneteswatchtriggers.fission.io
|
||||||
spec:
|
spec:
|
||||||
group: fission.io
|
group: fission.io
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
|
|||||||
kind: CustomResourceDefinition
|
kind: CustomResourceDefinition
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
controller-gen.kubebuilder.io/version: v0.15.0
|
controller-gen.kubebuilder.io/version: v0.17.2
|
||||||
name: packages.fission.io
|
name: packages.fission.io
|
||||||
spec:
|
spec:
|
||||||
group: fission.io
|
group: fission.io
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
|
|||||||
kind: CustomResourceDefinition
|
kind: CustomResourceDefinition
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
controller-gen.kubebuilder.io/version: v0.15.0
|
controller-gen.kubebuilder.io/version: v0.17.2
|
||||||
name: timetriggers.fission.io
|
name: timetriggers.fission.io
|
||||||
spec:
|
spec:
|
||||||
group: fission.io
|
group: fission.io
|
||||||
@@ -73,6 +73,17 @@ spec:
|
|||||||
- name
|
- name
|
||||||
- type
|
- type
|
||||||
type: object
|
type: object
|
||||||
|
method:
|
||||||
|
default: POST
|
||||||
|
description: 'HTTP Method for trigger, ex : GET, POST, PUT, DELETE,
|
||||||
|
HEAD (default: "POST")'
|
||||||
|
type: string
|
||||||
|
subpath:
|
||||||
|
default: /
|
||||||
|
description: |-
|
||||||
|
Subpath to trigger a specific route if function
|
||||||
|
internally supports routing, (default: "/")
|
||||||
|
type: string
|
||||||
required:
|
required:
|
||||||
- cron
|
- cron
|
||||||
- functionref
|
- functionref
|
||||||
|
|||||||
+12
-10
@@ -1,13 +1,15 @@
|
|||||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
kind: Kustomization
|
kind: Kustomization
|
||||||
commonLabels:
|
|
||||||
group: fission.io
|
|
||||||
resources:
|
resources:
|
||||||
- fission.io_canaryconfigs.yaml
|
- fission.io_canaryconfigs.yaml
|
||||||
- fission.io_environments.yaml
|
- fission.io_environments.yaml
|
||||||
- fission.io_functions.yaml
|
- fission.io_functions.yaml
|
||||||
- fission.io_httptriggers.yaml
|
- fission.io_httptriggers.yaml
|
||||||
- fission.io_kuberneteswatchtriggers.yaml
|
- fission.io_kuberneteswatchtriggers.yaml
|
||||||
- fission.io_messagequeuetriggers.yaml
|
- fission.io_messagequeuetriggers.yaml
|
||||||
- fission.io_packages.yaml
|
- fission.io_packages.yaml
|
||||||
- fission.io_timetriggers.yaml
|
- fission.io_timetriggers.yaml
|
||||||
|
labels:
|
||||||
|
- includeSelectors: true
|
||||||
|
pairs:
|
||||||
|
group: fission.io
|
||||||
|
|||||||
@@ -1,118 +1,121 @@
|
|||||||
module github.com/fission/fission
|
module github.com/fission/fission
|
||||||
|
|
||||||
go 1.22.2
|
go 1.25.5
|
||||||
|
|
||||||
require (
|
require (
|
||||||
dario.cat/mergo v1.0.0
|
dario.cat/mergo v1.0.2
|
||||||
github.com/IBM/sarama v1.43.2
|
github.com/IBM/sarama v1.46.3
|
||||||
github.com/bep/debounce v1.2.1
|
github.com/bep/debounce v1.2.1
|
||||||
github.com/dchest/uniuri v1.2.0
|
github.com/dchest/uniuri v1.2.0
|
||||||
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815
|
|
||||||
github.com/dustin/go-humanize v1.0.1
|
github.com/dustin/go-humanize v1.0.1
|
||||||
github.com/elastic/crd-ref-docs v0.0.12
|
github.com/fatih/color v1.18.0
|
||||||
github.com/fatih/color v1.16.0
|
github.com/fsnotify/fsnotify v1.9.0
|
||||||
github.com/fsnotify/fsnotify v1.7.0
|
github.com/go-git/go-git/v5 v5.16.4
|
||||||
github.com/go-git/go-git/v5 v5.12.0
|
|
||||||
github.com/go-logr/zapr v1.3.0
|
github.com/go-logr/zapr v1.3.0
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0
|
github.com/golang-jwt/jwt/v4 v4.5.2
|
||||||
github.com/google/go-cmp v0.6.0
|
github.com/google/go-cmp v0.7.0
|
||||||
github.com/google/uuid v1.6.0
|
github.com/google/uuid v1.6.0
|
||||||
github.com/gorilla/mux v1.8.1
|
github.com/gorilla/mux v1.8.1
|
||||||
github.com/graymeta/stow v0.2.8
|
github.com/graymeta/stow v0.2.8
|
||||||
github.com/hashicorp/go-multierror v1.1.1
|
github.com/hashicorp/go-multierror v1.1.1
|
||||||
github.com/hashicorp/go-retryablehttp v0.7.7
|
github.com/hashicorp/go-retryablehttp v0.7.8
|
||||||
github.com/influxdata/influxdb v1.11.5
|
github.com/influxdata/influxdb v1.12.2
|
||||||
github.com/kedacore/keda/v2 v2.15.0
|
github.com/kedacore/keda/v2 v2.18.2
|
||||||
github.com/mholt/archiver/v3 v3.5.1
|
github.com/mholt/archives v0.1.5
|
||||||
github.com/minio/minio-go v6.0.14+incompatible
|
github.com/minio/minio-go/v7 v7.0.97
|
||||||
github.com/ory/dockertest v3.3.5+incompatible
|
github.com/ory/dockertest/v3 v3.12.0
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/prometheus/client_golang v1.23.2
|
||||||
github.com/prometheus/client_golang v1.19.1
|
github.com/prometheus/common v0.67.4
|
||||||
github.com/prometheus/common v0.55.0
|
|
||||||
github.com/robfig/cron/v3 v3.0.1
|
github.com/robfig/cron/v3 v3.0.1
|
||||||
github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06
|
github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06
|
||||||
github.com/spf13/cobra v1.8.0
|
github.com/spf13/cobra v1.10.2
|
||||||
github.com/spf13/pflag v1.0.5
|
github.com/spf13/pflag v1.0.10
|
||||||
github.com/stretchr/testify v1.9.0
|
github.com/stretchr/testify v1.11.1
|
||||||
github.com/wcharczuk/go-chart v2.0.1+incompatible
|
github.com/wcharczuk/go-chart v2.0.1+incompatible
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0
|
||||||
go.opentelemetry.io/contrib/propagators/autoprop v0.51.0
|
go.opentelemetry.io/contrib/propagators/autoprop v0.64.0
|
||||||
go.opentelemetry.io/otel v1.28.0
|
go.opentelemetry.io/otel v1.39.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0
|
||||||
go.opentelemetry.io/otel/sdk v1.28.0
|
go.opentelemetry.io/otel/sdk v1.39.0
|
||||||
go.opentelemetry.io/otel/trace v1.28.0
|
go.opentelemetry.io/otel/trace v1.39.0
|
||||||
go.uber.org/zap v1.27.0
|
go.uber.org/zap v1.27.1
|
||||||
golang.org/x/net v0.27.0
|
golang.org/x/net v0.48.0
|
||||||
google.golang.org/grpc v1.65.0
|
google.golang.org/grpc v1.77.0
|
||||||
k8s.io/api v0.30.0
|
k8s.io/api v0.34.3
|
||||||
k8s.io/apiextensions-apiserver v0.30.0
|
k8s.io/apiextensions-apiserver v0.34.3
|
||||||
k8s.io/apimachinery v0.30.0
|
k8s.io/apimachinery v0.34.3
|
||||||
k8s.io/client-go v0.30.0
|
k8s.io/client-go v0.34.3
|
||||||
k8s.io/code-generator v0.30.0
|
k8s.io/metrics v0.34.3
|
||||||
k8s.io/metrics v0.30.0
|
sigs.k8s.io/controller-runtime v0.22.4
|
||||||
sigs.k8s.io/controller-runtime v0.18.2
|
sigs.k8s.io/structured-merge-diff/v6 v6.3.1
|
||||||
sigs.k8s.io/controller-tools v0.15.0
|
sigs.k8s.io/yaml v1.6.0
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1
|
|
||||||
sigs.k8s.io/yaml v1.4.0
|
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
|
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
|
||||||
github.com/Masterminds/goutils v1.1.1 // indirect
|
github.com/Masterminds/goutils v1.1.1 // indirect
|
||||||
github.com/Masterminds/semver v1.5.0 // indirect
|
github.com/Masterminds/semver v1.5.0 // indirect
|
||||||
github.com/Masterminds/sprig v2.22.0+incompatible // indirect
|
github.com/Masterminds/sprig v2.22.0+incompatible // indirect
|
||||||
github.com/Microsoft/go-winio v0.6.1 // indirect
|
github.com/Microsoft/go-winio v0.6.2 // indirect
|
||||||
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect
|
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect
|
||||||
github.com/ProtonMail/go-crypto v1.0.0 // indirect
|
github.com/ProtonMail/go-crypto v1.1.6 // indirect
|
||||||
github.com/andybalholm/brotli v1.1.0 // indirect
|
github.com/STARRY-S/zip v0.2.3 // indirect
|
||||||
github.com/aws/aws-sdk-go v1.42.34 // indirect
|
github.com/andybalholm/brotli v1.2.0 // indirect
|
||||||
|
github.com/aws/aws-sdk-go v1.55.7 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/blend/go-sdk v1.20220112.5 // indirect
|
github.com/blend/go-sdk v1.20220112.5 // indirect
|
||||||
github.com/cenkalti/backoff v2.2.1+incompatible // indirect
|
github.com/bodgit/plumbing v1.3.0 // indirect
|
||||||
|
github.com/bodgit/sevenzip v1.6.1 // indirect
|
||||||
|
github.com/bodgit/windows v1.0.1 // indirect
|
||||||
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
|
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
|
||||||
|
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
github.com/cloudflare/circl v1.3.7 // indirect
|
github.com/cloudflare/circl v1.6.1 // indirect
|
||||||
github.com/containerd/continuity v0.2.2 // indirect
|
github.com/containerd/continuity v0.4.5 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
|
||||||
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
|
github.com/cyphar/filepath-securejoin v0.5.1 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/docker/go-connections v0.4.0 // indirect
|
github.com/docker/cli v27.4.1+incompatible // indirect
|
||||||
github.com/docker/go-units v0.4.0 // indirect
|
github.com/docker/docker v28.1.1+incompatible // indirect
|
||||||
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect
|
github.com/docker/go-connections v0.5.0 // indirect
|
||||||
github.com/eapache/go-resiliency v1.6.0 // indirect
|
github.com/docker/go-units v0.5.0 // indirect
|
||||||
|
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect
|
||||||
|
github.com/eapache/go-resiliency v1.7.0 // indirect
|
||||||
github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect
|
github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect
|
||||||
github.com/eapache/queue v1.1.0 // indirect
|
github.com/eapache/queue v1.1.0 // indirect
|
||||||
github.com/emicklei/go-restful/v3 v3.12.0 // indirect
|
github.com/elastic/crd-ref-docs v0.2.0 // indirect
|
||||||
|
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
|
||||||
github.com/emirpasic/gods v1.18.1 // indirect
|
github.com/emirpasic/gods v1.18.1 // indirect
|
||||||
github.com/evanphx/json-patch v5.8.1+incompatible // indirect
|
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
|
||||||
github.com/evanphx/json-patch/v5 v5.9.0 // indirect
|
github.com/expr-lang/expr v1.17.6 // indirect
|
||||||
github.com/expr-lang/expr v1.16.9 // indirect
|
|
||||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||||
|
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
|
||||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
||||||
github.com/go-git/go-billy/v5 v5.5.0 // indirect
|
github.com/go-git/go-billy/v5 v5.6.2 // indirect
|
||||||
github.com/go-ini/ini v1.66.4 // indirect
|
github.com/go-ini/ini v1.67.0 // indirect
|
||||||
github.com/go-logr/logr v1.4.2 // indirect
|
github.com/go-logr/logr v1.4.3 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
||||||
github.com/go-openapi/jsonreference v0.21.0 // indirect
|
github.com/go-openapi/jsonreference v0.21.0 // indirect
|
||||||
github.com/go-openapi/swag v0.23.0 // indirect
|
github.com/go-openapi/swag v0.23.0 // indirect
|
||||||
github.com/gobuffalo/flect v1.0.2 // indirect
|
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
|
||||||
github.com/goccy/go-yaml v1.11.3 // indirect
|
github.com/gobuffalo/flect v1.0.3 // indirect
|
||||||
|
github.com/goccy/go-yaml v1.18.0 // indirect
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
|
||||||
github.com/golang/protobuf v1.5.4 // indirect
|
github.com/golang/snappy v1.0.0 // indirect
|
||||||
github.com/golang/snappy v0.0.4 // indirect
|
github.com/google/btree v1.1.3 // indirect
|
||||||
github.com/google/gnostic-models v0.6.8 // indirect
|
github.com/google/gnostic-models v0.7.0 // indirect
|
||||||
github.com/google/gofuzz v1.2.0 // indirect
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
|
||||||
github.com/gorilla/websocket v1.5.1 // indirect
|
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
|
||||||
github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
|
|
||||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||||
github.com/hashicorp/go-uuid v1.0.3 // indirect
|
github.com/hashicorp/go-uuid v1.0.3 // indirect
|
||||||
github.com/huandu/xstrings v1.3.3 // indirect
|
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
||||||
|
github.com/huandu/xstrings v1.5.0 // indirect
|
||||||
github.com/imdario/mergo v0.3.16 // indirect
|
github.com/imdario/mergo v0.3.16 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
||||||
@@ -125,69 +128,100 @@ require (
|
|||||||
github.com/josharian/intern v1.0.0 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/kevinburke/ssh_config v1.2.0 // indirect
|
github.com/kevinburke/ssh_config v1.2.0 // indirect
|
||||||
github.com/klauspost/compress v1.17.8 // indirect
|
github.com/klauspost/compress v1.18.1 // indirect
|
||||||
github.com/klauspost/pgzip v1.2.5 // indirect
|
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
||||||
github.com/lib/pq v1.10.4 // indirect
|
github.com/klauspost/crc32 v1.3.0 // indirect
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
github.com/klauspost/pgzip v1.2.6 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
github.com/mailru/easyjson v0.9.0 // indirect
|
||||||
|
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
|
github.com/mikelolasagasti/xz v1.0.1 // indirect
|
||||||
|
github.com/minio/crc64nvme v1.1.0 // indirect
|
||||||
|
github.com/minio/md5-simd v1.1.2 // indirect
|
||||||
|
github.com/minio/minlz v1.0.1 // indirect
|
||||||
github.com/mitchellh/copystructure v1.2.0 // indirect
|
github.com/mitchellh/copystructure v1.2.0 // indirect
|
||||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
|
||||||
github.com/mitchellh/reflectwalk v1.0.2 // indirect
|
github.com/mitchellh/reflectwalk v1.0.2 // indirect
|
||||||
github.com/moby/spdystream v0.4.0 // indirect
|
github.com/moby/docker-image-spec v1.3.1 // indirect
|
||||||
|
github.com/moby/spdystream v0.5.0 // indirect
|
||||||
|
github.com/moby/sys/user v0.3.0 // indirect
|
||||||
|
github.com/moby/term v0.5.0 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
|
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
|
||||||
github.com/nwaples/rardecode v1.1.0 // indirect
|
github.com/nwaples/rardecode/v2 v2.2.0 // indirect
|
||||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||||
github.com/opencontainers/image-spec v1.0.2 // indirect
|
github.com/opencontainers/image-spec v1.1.0 // indirect
|
||||||
github.com/opencontainers/runc v1.1.12 // indirect
|
github.com/opencontainers/runc v1.2.8 // indirect
|
||||||
github.com/pierrec/lz4/v4 v4.1.21 // indirect
|
github.com/philhofer/fwd v1.2.0 // indirect
|
||||||
github.com/pjbgf/sha1cd v0.3.0 // indirect
|
github.com/pierrec/lz4/v4 v4.1.22 // indirect
|
||||||
|
github.com/pjbgf/sha1cd v0.3.2 // indirect
|
||||||
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/prometheus/client_model v0.6.1 // indirect
|
github.com/prometheus/client_model v0.6.2 // indirect
|
||||||
github.com/prometheus/procfs v0.15.1 // indirect
|
github.com/prometheus/procfs v0.17.0 // indirect
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
|
github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect
|
||||||
|
github.com/rs/xid v1.6.0 // indirect
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
|
github.com/sergi/go-diff v1.4.0 // indirect
|
||||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||||
github.com/skeema/knownhosts v1.2.2 // indirect
|
github.com/skeema/knownhosts v1.3.1 // indirect
|
||||||
github.com/ulikunitz/xz v0.5.9 // indirect
|
github.com/sorairolake/lzip-go v0.3.8 // indirect
|
||||||
|
github.com/spf13/afero v1.15.0 // indirect
|
||||||
|
github.com/tinylib/msgp v1.3.0 // indirect
|
||||||
|
github.com/ulikunitz/xz v0.5.15 // indirect
|
||||||
|
github.com/x448/float16 v0.8.4 // indirect
|
||||||
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
||||||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
go.opentelemetry.io/contrib/propagators/aws v1.26.0 // indirect
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||||
go.opentelemetry.io/contrib/propagators/b3 v1.26.0 // indirect
|
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||||
go.opentelemetry.io/contrib/propagators/jaeger v1.26.0 // indirect
|
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
||||||
go.opentelemetry.io/contrib/propagators/ot v1.26.0 // indirect
|
go.opentelemetry.io/contrib/propagators/aws v1.39.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.28.0 // indirect
|
go.opentelemetry.io/contrib/propagators/b3 v1.39.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
|
go.opentelemetry.io/contrib/propagators/jaeger v1.39.0 // indirect
|
||||||
|
go.opentelemetry.io/contrib/propagators/ot v1.39.0 // indirect
|
||||||
|
go.opentelemetry.io/otel/metric v1.39.0 // indirect
|
||||||
|
go.opentelemetry.io/proto/otlp v1.9.0 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
golang.org/x/crypto v0.25.0 // indirect
|
go.yaml.in/yaml/v2 v2.4.3 // indirect
|
||||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
|
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
||||||
|
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
|
||||||
|
golang.org/x/crypto v0.46.0 // indirect
|
||||||
golang.org/x/image v0.18.0 // indirect
|
golang.org/x/image v0.18.0 // indirect
|
||||||
golang.org/x/mod v0.19.0 // indirect
|
golang.org/x/mod v0.30.0 // indirect
|
||||||
golang.org/x/oauth2 v0.22.0 // indirect
|
golang.org/x/oauth2 v0.33.0 // indirect
|
||||||
golang.org/x/sync v0.8.0 // indirect
|
golang.org/x/sync v0.19.0 // indirect
|
||||||
golang.org/x/sys v0.22.0 // indirect
|
golang.org/x/sys v0.39.0 // indirect
|
||||||
golang.org/x/term v0.22.0 // indirect
|
golang.org/x/term v0.38.0 // indirect
|
||||||
golang.org/x/text v0.16.0 // indirect
|
golang.org/x/text v0.32.0 // indirect
|
||||||
golang.org/x/time v0.5.0 // indirect
|
golang.org/x/time v0.14.0 // indirect
|
||||||
golang.org/x/tools v0.23.0 // indirect
|
golang.org/x/tools v0.39.0 // indirect
|
||||||
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
|
gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
|
||||||
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240730163845-b1a4ccb954bf // indirect
|
google.golang.org/protobuf v1.36.10 // indirect
|
||||||
google.golang.org/protobuf v1.34.2 // indirect
|
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
|
||||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
gotest.tools v2.2.0+incompatible // indirect
|
k8s.io/code-generator v0.34.3 // indirect
|
||||||
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect
|
k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f // indirect
|
||||||
k8s.io/klog/v2 v2.130.1 // indirect
|
k8s.io/klog/v2 v2.130.1 // indirect
|
||||||
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
|
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect
|
||||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
|
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect
|
||||||
knative.dev/pkg v0.0.0-20240805063731-c88d5dad9653 // indirect
|
knative.dev/pkg v0.0.0-20250326102644-9f3e60a9244c // indirect
|
||||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20250211091558-894df3a7e664 // indirect
|
||||||
|
sigs.k8s.io/controller-tools v0.19.0 // indirect
|
||||||
|
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
|
||||||
|
sigs.k8s.io/randfill v1.0.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
|
tool (
|
||||||
|
github.com/elastic/crd-ref-docs
|
||||||
|
k8s.io/code-generator
|
||||||
|
sigs.k8s.io/controller-runtime/tools/setup-envtest
|
||||||
|
sigs.k8s.io/controller-tools/cmd/controller-gen
|
||||||
|
)
|
||||||
|
|
||||||
|
replace k8s.io/code-generator => github.com/fission/code-generator v0.18.0-alpha.1.0.20250914164041-5cd640227cd4
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
if ! command -v dashboard-linter >/dev/null 2>&1; then
|
if ! command -v dashboard-linter >/dev/null 2>&1; then
|
||||||
echo "dashboard-linter is not installed"
|
echo "dashboard-linter is not installed"
|
||||||
|
echo "Installing dashboard-linter..."
|
||||||
|
go install github.com/grafana/dashboard-linter@latest
|
||||||
exit 1;
|
exit 1;
|
||||||
fi
|
fi
|
||||||
BASE_PATH=$(pwd)
|
BASE_PATH=$(pwd)
|
||||||
|
|||||||
+1
-2
@@ -28,8 +28,7 @@ set +x
|
|||||||
# for codecov
|
# for codecov
|
||||||
echo "" > coverage.txt
|
echo "" > coverage.txt
|
||||||
|
|
||||||
make install-envtest
|
KUBEBUILDER_ASSETS=$(go tool setup-envtest -p path use 1.30.x)
|
||||||
KUBEBUILDER_ASSETS=$(setup-envtest -p path use 1.23.x)
|
|
||||||
export KUBEBUILDER_ASSETS
|
export KUBEBUILDER_ASSETS
|
||||||
|
|
||||||
# The executor unit test only works with NodePort-type services for
|
# The executor unit test only works with NodePort-type services for
|
||||||
|
|||||||
@@ -3,11 +3,18 @@ set -o errexit
|
|||||||
set -o nounset
|
set -o nounset
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
|
CODEGEN_PKG_VERSION=$(go list -m -f '{{.Replace.Version}}' k8s.io/code-generator)
|
||||||
|
if [ -z "$CODEGEN_PKG_VERSION" ]; then
|
||||||
|
echo "Error: could not determine code-generator version from go.mod"
|
||||||
|
echo "Received output: '$CODEGEN_PKG_VERSION'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
GOPATH=$(go env GOPATH)
|
GOPATH=$(go env GOPATH)
|
||||||
|
GOMODCACHEPATH=$(go env GOMODCACHE)
|
||||||
SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
||||||
CODEGEN_PKG=${CODEGEN_PKG:-$(
|
CODEGEN_PKG=${CODEGEN_PKG:-$(
|
||||||
cd "${SCRIPT_ROOT}"
|
cd "${SCRIPT_ROOT}"
|
||||||
ls -d -1 ${SCRIPT_ROOT}/../code-generator 2>/dev/null || echo $GOPATH/pkg/mod/k8s.io/code-generator@v0.30.0
|
echo ${GOMODCACHEPATH}/github.com/fission/code-generator@${CODEGEN_PKG_VERSION}
|
||||||
)}
|
)}
|
||||||
OUTDIR="${SCRIPT_ROOT}/pkg/generated"
|
OUTDIR="${SCRIPT_ROOT}/pkg/generated"
|
||||||
|
|
||||||
|
|||||||
@@ -167,3 +167,7 @@ const (
|
|||||||
ConfigMaps = "configmaps"
|
ConfigMaps = "configmaps"
|
||||||
Secrets = "secrets"
|
Secrets = "secrets"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
BuilderContainerName = "builder"
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2022.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package v1
|
|
||||||
|
|
||||||
import (
|
|
||||||
"go.uber.org/zap"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
ctrl "sigs.k8s.io/controller-runtime"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/webhook"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
|
|
||||||
|
|
||||||
"github.com/fission/fission/pkg/utils/loggerfactory"
|
|
||||||
)
|
|
||||||
|
|
||||||
// log is for logging in this package.
|
|
||||||
var environmentlog = loggerfactory.GetLogger().Named("environment-resource")
|
|
||||||
|
|
||||||
func (r *Environment) SetupWebhookWithManager(mgr ctrl.Manager) error {
|
|
||||||
return ctrl.NewWebhookManagedBy(mgr).
|
|
||||||
For(r).
|
|
||||||
Complete()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Admission webhooks can be added by adding tag: kubebuilder:webhook:path=/mutate-fission-io-v1-environment,mutating=true,failurePolicy=fail,sideEffects=None,groups=fission.io,resources=environments,verbs=create;update,versions=v1,name=menvironment.fission.io,admissionReviewVersions=v1
|
|
||||||
|
|
||||||
var _ webhook.Defaulter = &Environment{}
|
|
||||||
|
|
||||||
// Default implements webhook.Defaulter so a webhook will be registered for the type
|
|
||||||
func (r *Environment) Default() {
|
|
||||||
environmentlog.Debug("default", zap.String("name", r.Name))
|
|
||||||
}
|
|
||||||
|
|
||||||
// user: change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
|
|
||||||
//+kubebuilder:webhook:path=/validate-fission-io-v1-environment,mutating=false,failurePolicy=fail,sideEffects=None,groups=fission.io,resources=environments,verbs=create,versions=v1,name=venvironment.fission.io,admissionReviewVersions=v1
|
|
||||||
|
|
||||||
var _ webhook.Validator = &Environment{}
|
|
||||||
|
|
||||||
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *Environment) ValidateCreate() (admission.Warnings, error) {
|
|
||||||
environmentlog.Debug("validate create", zap.String("name", r.Name))
|
|
||||||
err := r.Validate()
|
|
||||||
if err != nil {
|
|
||||||
err = AggregateValidationErrors("Environment", err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *Environment) ValidateUpdate(old runtime.Object) (admission.Warnings, error) {
|
|
||||||
environmentlog.Debug("validate update", zap.String("name", r.Name))
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *Environment) ValidateDelete() (admission.Warnings, error) {
|
|
||||||
environmentlog.Debug("validate delete", zap.String("name", r.Name))
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2022.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package v1
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"go.uber.org/zap"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
ctrl "sigs.k8s.io/controller-runtime"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/webhook"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
|
|
||||||
|
|
||||||
"github.com/fission/fission/pkg/utils/loggerfactory"
|
|
||||||
)
|
|
||||||
|
|
||||||
// log is for logging in this package.
|
|
||||||
var functionlog = loggerfactory.GetLogger().Named("function-resource")
|
|
||||||
|
|
||||||
func (r *Function) SetupWebhookWithManager(mgr ctrl.Manager) error {
|
|
||||||
return ctrl.NewWebhookManagedBy(mgr).
|
|
||||||
For(r).
|
|
||||||
Complete()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Admission webhooks can be added by adding tag: kubebuilder:webhook:path=/mutate-fission-io-v1-function,mutating=true,failurePolicy=fail,sideEffects=None,groups=fission.io,resources=functions,verbs=create;update,versions=v1,name=mfunction.fission.io,admissionReviewVersions=v1
|
|
||||||
|
|
||||||
var _ webhook.Defaulter = &Function{}
|
|
||||||
|
|
||||||
// Default implements webhook.Defaulter so a webhook will be registered for the type
|
|
||||||
func (r *Function) Default() {
|
|
||||||
}
|
|
||||||
|
|
||||||
// user change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
|
|
||||||
//+kubebuilder:webhook:path=/validate-fission-io-v1-function,mutating=false,failurePolicy=fail,sideEffects=None,groups=fission.io,resources=functions,verbs=create;update,versions=v1,name=vfunction.fission.io,admissionReviewVersions=v1
|
|
||||||
|
|
||||||
var _ webhook.Validator = &Function{}
|
|
||||||
|
|
||||||
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *Function) ValidateCreate() (admission.Warnings, error) {
|
|
||||||
functionlog.Debug("validate create", zap.String("name", r.Name))
|
|
||||||
|
|
||||||
for _, cnfMap := range r.Spec.ConfigMaps {
|
|
||||||
if cnfMap.Namespace != r.ObjectMeta.Namespace {
|
|
||||||
err := fmt.Errorf("ConfigMap's [%s] and function's Namespace [%s] are different. ConfigMap needs to be present in the same namespace as function", cnfMap.Namespace, r.ObjectMeta.Namespace)
|
|
||||||
return nil, AggregateValidationErrors("Function", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, secret := range r.Spec.Secrets {
|
|
||||||
if secret.Namespace != r.ObjectMeta.Namespace {
|
|
||||||
err := fmt.Errorf("secret [%s] and function's Namespace [%s] are different. Secret needs to be present in the same namespace as function", secret.Namespace, r.ObjectMeta.Namespace)
|
|
||||||
return nil, AggregateValidationErrors("Function", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err := r.Validate()
|
|
||||||
if err != nil {
|
|
||||||
return nil, AggregateValidationErrors("Function", err)
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *Function) ValidateUpdate(old runtime.Object) (admission.Warnings, error) {
|
|
||||||
functionlog.Debug("validate update", zap.String("name", r.Name))
|
|
||||||
|
|
||||||
for _, cnfMap := range r.Spec.ConfigMaps {
|
|
||||||
if cnfMap.Namespace != r.ObjectMeta.Namespace {
|
|
||||||
err := fmt.Errorf("ConfigMap's [%s] and function's Namespace [%s] are different. ConfigMap needs to be present in the same namespace as function", cnfMap.Namespace, r.ObjectMeta.Namespace)
|
|
||||||
return nil, AggregateValidationErrors("Function", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, secret := range r.Spec.Secrets {
|
|
||||||
if secret.Namespace != r.ObjectMeta.Namespace {
|
|
||||||
err := fmt.Errorf("secret [%s] and function's Namespace [%s] are different. Secret needs to be present in the same namespace as function", secret.Namespace, r.ObjectMeta.Namespace)
|
|
||||||
return nil, AggregateValidationErrors("Function", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err := r.Validate()
|
|
||||||
if err != nil {
|
|
||||||
return nil, AggregateValidationErrors("Function", err)
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *Function) ValidateDelete() (admission.Warnings, error) {
|
|
||||||
functionlog.Debug("validate delete", zap.String("name", r.Name))
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2022.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package v1
|
|
||||||
|
|
||||||
import (
|
|
||||||
"go.uber.org/zap"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
ctrl "sigs.k8s.io/controller-runtime"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/webhook"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
|
|
||||||
|
|
||||||
"github.com/fission/fission/pkg/utils/loggerfactory"
|
|
||||||
)
|
|
||||||
|
|
||||||
// log is for logging in this package.
|
|
||||||
var httptriggerlog = loggerfactory.GetLogger().Named("httptrigger-resource")
|
|
||||||
|
|
||||||
func (r *HTTPTrigger) SetupWebhookWithManager(mgr ctrl.Manager) error {
|
|
||||||
return ctrl.NewWebhookManagedBy(mgr).
|
|
||||||
For(r).
|
|
||||||
Complete()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Admission webhooks can be added by adding tag: kubebuilder:webhook:path=/mutate-fission-io-v1-httptrigger,mutating=true,failurePolicy=fail,sideEffects=None,groups=fission.io,resources=httptriggers,verbs=create;update,versions=v1,name=mhttptrigger.fission.io,admissionReviewVersions=v1
|
|
||||||
|
|
||||||
var _ webhook.Defaulter = &HTTPTrigger{}
|
|
||||||
|
|
||||||
// Default implements webhook.Defaulter so a webhook will be registered for the type
|
|
||||||
func (r *HTTPTrigger) Default() {
|
|
||||||
httptriggerlog.Debug("default", zap.String("name", r.Name))
|
|
||||||
}
|
|
||||||
|
|
||||||
// user change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
|
|
||||||
//+kubebuilder:webhook:path=/validate-fission-io-v1-httptrigger,mutating=false,failurePolicy=fail,sideEffects=None,groups=fission.io,resources=httptriggers,verbs=create;update,versions=v1,name=vhttptrigger.fission.io,admissionReviewVersions=v1
|
|
||||||
|
|
||||||
var _ webhook.Validator = &HTTPTrigger{}
|
|
||||||
|
|
||||||
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (t *HTTPTrigger) ValidateCreate() (admission.Warnings, error) {
|
|
||||||
httptriggerlog.Debug("validate create", zap.String("name", t.Name))
|
|
||||||
err := t.Validate()
|
|
||||||
if err != nil {
|
|
||||||
err = AggregateValidationErrors("HTTPTrigger", err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *HTTPTrigger) ValidateUpdate(old runtime.Object) (admission.Warnings, error) {
|
|
||||||
httptriggerlog.Debug("validate update", zap.String("name", r.Name))
|
|
||||||
err := r.Validate()
|
|
||||||
if err != nil {
|
|
||||||
err = AggregateValidationErrors("HTTPTrigger", err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *HTTPTrigger) ValidateDelete() (admission.Warnings, error) {
|
|
||||||
httptriggerlog.Debug("validate delete", zap.String("name", r.Name))
|
|
||||||
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2022.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package v1
|
|
||||||
|
|
||||||
import (
|
|
||||||
"go.uber.org/zap"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
ctrl "sigs.k8s.io/controller-runtime"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/webhook"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
|
|
||||||
|
|
||||||
"github.com/fission/fission/pkg/utils/loggerfactory"
|
|
||||||
)
|
|
||||||
|
|
||||||
// log is for logging in this package.
|
|
||||||
var kuberneteswatchtriggerlog = loggerfactory.GetLogger().Named("kuberneteswatchtrigger-resource")
|
|
||||||
|
|
||||||
func (r *KubernetesWatchTrigger) SetupWebhookWithManager(mgr ctrl.Manager) error {
|
|
||||||
return ctrl.NewWebhookManagedBy(mgr).
|
|
||||||
For(r).
|
|
||||||
Complete()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Admission webhooks can be added by adding tag: kubebuilder:webhook:path=/mutate-fission-io-v1-kuberneteswatchtrigger,mutating=true,failurePolicy=fail,sideEffects=None,groups=fission.io,resources=kuberneteswatchtriggers,verbs=create;update,versions=v1,name=mkuberneteswatchtrigger.fission.io,admissionReviewVersions=v1
|
|
||||||
|
|
||||||
var _ webhook.Defaulter = &KubernetesWatchTrigger{}
|
|
||||||
|
|
||||||
// Default implements webhook.Defaulter so a webhook will be registered for the type
|
|
||||||
func (r *KubernetesWatchTrigger) Default() {
|
|
||||||
kuberneteswatchtriggerlog.Debug("default", zap.String("name", r.Name))
|
|
||||||
}
|
|
||||||
|
|
||||||
// user: change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
|
|
||||||
//+kubebuilder:webhook:path=/validate-fission-io-v1-kuberneteswatchtrigger,mutating=false,failurePolicy=fail,sideEffects=None,groups=fission.io,resources=kuberneteswatchtriggers,verbs=create,versions=v1,name=vkuberneteswatchtrigger.fission.io,admissionReviewVersions=v1
|
|
||||||
|
|
||||||
var _ webhook.Validator = &KubernetesWatchTrigger{}
|
|
||||||
|
|
||||||
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *KubernetesWatchTrigger) ValidateCreate() (admission.Warnings, error) {
|
|
||||||
kuberneteswatchtriggerlog.Debug("validate create", zap.String("name", r.Name))
|
|
||||||
err := r.Validate()
|
|
||||||
if err != nil {
|
|
||||||
err = AggregateValidationErrors("Watch", err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *KubernetesWatchTrigger) ValidateUpdate(old runtime.Object) (admission.Warnings, error) {
|
|
||||||
// WATCH UPDATE NOT IMPLEMENTED
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *KubernetesWatchTrigger) ValidateDelete() (admission.Warnings, error) {
|
|
||||||
kuberneteswatchtriggerlog.Debug("validate delete", zap.String("name", r.Name))
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2022.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package v1
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/dustin/go-humanize"
|
|
||||||
"go.uber.org/zap"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
ctrl "sigs.k8s.io/controller-runtime"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/webhook"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
|
|
||||||
|
|
||||||
ferror "github.com/fission/fission/pkg/error"
|
|
||||||
"github.com/fission/fission/pkg/utils/loggerfactory"
|
|
||||||
)
|
|
||||||
|
|
||||||
// log is for logging in this package.
|
|
||||||
var packagelog = loggerfactory.GetLogger().Named("package-resource")
|
|
||||||
|
|
||||||
func (r *Package) SetupWebhookWithManager(mgr ctrl.Manager) error {
|
|
||||||
return ctrl.NewWebhookManagedBy(mgr).
|
|
||||||
For(r).
|
|
||||||
Complete()
|
|
||||||
}
|
|
||||||
|
|
||||||
//+kubebuilder:webhook:path=/mutate-fission-io-v1-package,mutating=true,failurePolicy=fail,sideEffects=None,groups=fission.io,resources=packages,verbs=create;update,versions=v1,name=mpackage.fission.io,admissionReviewVersions=v1
|
|
||||||
|
|
||||||
var _ webhook.Defaulter = &Package{}
|
|
||||||
|
|
||||||
// Default implements webhook.Defaulter so a webhook will be registered for the type
|
|
||||||
func (r *Package) Default() {
|
|
||||||
packagelog.Debug("default", zap.String("name", r.Name))
|
|
||||||
if r.Status.BuildStatus == "" {
|
|
||||||
if !r.Spec.Deployment.IsEmpty() {
|
|
||||||
// deployment package exists
|
|
||||||
r.Status.BuildStatus = BuildStatusNone
|
|
||||||
} else if !r.Spec.Source.IsEmpty() {
|
|
||||||
// source package with no deployment is a pending build
|
|
||||||
r.Status.BuildStatus = BuildStatusPending
|
|
||||||
} else {
|
|
||||||
r.Status.BuildStatus = BuildStatusFailed // empty package
|
|
||||||
r.Status.BuildLog = "Both source and deployment are empty"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// user change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
|
|
||||||
//+kubebuilder:webhook:path=/validate-fission-io-v1-package,mutating=false,failurePolicy=fail,sideEffects=None,groups=fission.io,resources=packages,verbs=create;update,versions=v1,name=vpackage.fission.io,admissionReviewVersions=v1
|
|
||||||
|
|
||||||
var _ webhook.Validator = &Package{}
|
|
||||||
|
|
||||||
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *Package) ValidateCreate() (admission.Warnings, error) {
|
|
||||||
packagelog.Debug("validate create", zap.String("name", r.Name))
|
|
||||||
err := r.Validate()
|
|
||||||
if err != nil {
|
|
||||||
err = AggregateValidationErrors("Package", err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure size limits
|
|
||||||
if len(r.Spec.Source.Literal) > int(ArchiveLiteralSizeLimit) {
|
|
||||||
err := ferror.MakeError(ferror.ErrorInvalidArgument,
|
|
||||||
fmt.Sprintf("Package literal larger than %s", humanize.Bytes(uint64(ArchiveLiteralSizeLimit))))
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if len(r.Spec.Deployment.Literal) > int(ArchiveLiteralSizeLimit) {
|
|
||||||
err := ferror.MakeError(ferror.ErrorInvalidArgument,
|
|
||||||
fmt.Sprintf("Package literal larger than %s", humanize.Bytes(uint64(ArchiveLiteralSizeLimit))))
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *Package) ValidateUpdate(old runtime.Object) (admission.Warnings, error) {
|
|
||||||
packagelog.Debug("validate update", zap.String("name", r.Name))
|
|
||||||
err := r.Validate()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
err = AggregateValidationErrors("Package", err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *Package) ValidateDelete() (admission.Warnings, error) {
|
|
||||||
packagelog.Debug("validate delete", zap.String("name", r.Name))
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2022.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package v1
|
|
||||||
|
|
||||||
import (
|
|
||||||
"go.uber.org/zap"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
ctrl "sigs.k8s.io/controller-runtime"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/webhook"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
|
|
||||||
|
|
||||||
ferror "github.com/fission/fission/pkg/error"
|
|
||||||
"github.com/fission/fission/pkg/utils/loggerfactory"
|
|
||||||
)
|
|
||||||
|
|
||||||
// log is for logging in this package.
|
|
||||||
var timetriggerlog = loggerfactory.GetLogger().Named("timetrigger-resource")
|
|
||||||
|
|
||||||
func (r *TimeTrigger) SetupWebhookWithManager(mgr ctrl.Manager) error {
|
|
||||||
return ctrl.NewWebhookManagedBy(mgr).
|
|
||||||
For(r).
|
|
||||||
Complete()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Admission webhooks can be added by adding tag: kubebuilder:webhook:path=/mutate-fission-io-v1-timetrigger,mutating=true,failurePolicy=fail,sideEffects=None,groups=fission.io,resources=timetriggers,verbs=create;update,versions=v1,name=mtimetrigger.fission.io,admissionReviewVersions=v1
|
|
||||||
|
|
||||||
var _ webhook.Defaulter = &TimeTrigger{}
|
|
||||||
|
|
||||||
// Default implements webhook.Defaulter so a webhook will be registered for the type
|
|
||||||
func (r *TimeTrigger) Default() {
|
|
||||||
timetriggerlog.Debug("default", zap.String("name", r.Name))
|
|
||||||
}
|
|
||||||
|
|
||||||
// user change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
|
|
||||||
//+kubebuilder:webhook:path=/validate-fission-io-v1-timetrigger,mutating=false,failurePolicy=fail,sideEffects=None,groups=fission.io,resources=timetriggers,verbs=create;update,versions=v1,name=vtimetrigger.fission.io,admissionReviewVersions=v1
|
|
||||||
|
|
||||||
var _ webhook.Validator = &TimeTrigger{}
|
|
||||||
|
|
||||||
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *TimeTrigger) ValidateCreate() (admission.Warnings, error) {
|
|
||||||
timetriggerlog.Debug("validate create", zap.String("name", r.Name))
|
|
||||||
err := r.Validate()
|
|
||||||
if err != nil {
|
|
||||||
err = AggregateValidationErrors("TimeTrigger", err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = IsValidCronSpec(r.Spec.Cron)
|
|
||||||
if err != nil {
|
|
||||||
err = ferror.MakeError(ferror.ErrorInvalidArgument, "TimeTrigger cron spec is not valid")
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *TimeTrigger) ValidateUpdate(old runtime.Object) (admission.Warnings, error) {
|
|
||||||
timetriggerlog.Debug("validate update", zap.String("name", r.Name))
|
|
||||||
err := r.Validate()
|
|
||||||
if err != nil {
|
|
||||||
err = AggregateValidationErrors("TimeTrigger", err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = IsValidCronSpec(r.Spec.Cron)
|
|
||||||
if err != nil {
|
|
||||||
err = ferror.MakeError(ferror.ErrorInvalidArgument, "TimeTrigger cron spec is not valid")
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
|
|
||||||
func (r *TimeTrigger) ValidateDelete() (admission.Warnings, error) {
|
|
||||||
timetriggerlog.Debug("validate delete", zap.String("name", r.Name))
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
@@ -821,6 +821,17 @@ type (
|
|||||||
|
|
||||||
// The reference to function
|
// The reference to function
|
||||||
FunctionReference `json:"functionref"`
|
FunctionReference `json:"functionref"`
|
||||||
|
|
||||||
|
// HTTP Method for trigger, ex : GET, POST, PUT, DELETE, HEAD (default: "POST")
|
||||||
|
// +kubebuilder:default:="POST"
|
||||||
|
// +optional
|
||||||
|
Method string `json:"method,omitempty"`
|
||||||
|
|
||||||
|
// Subpath to trigger a specific route if function
|
||||||
|
// internally supports routing, (default: "/")
|
||||||
|
// +kubebuilder:default:="/"
|
||||||
|
// +optional
|
||||||
|
Subpath string `json:"subpath,omitempty"`
|
||||||
}
|
}
|
||||||
// FailureType refers to the type of failure
|
// FailureType refers to the type of failure
|
||||||
FailureType string
|
FailureType string
|
||||||
|
|||||||
@@ -599,7 +599,7 @@ func (e *Environment) Validate() error {
|
|||||||
|
|
||||||
if e.Spec.Runtime.PodSpec != nil {
|
if e.Spec.Runtime.PodSpec != nil {
|
||||||
for _, container := range e.Spec.Runtime.PodSpec.Containers {
|
for _, container := range e.Spec.Runtime.PodSpec.Containers {
|
||||||
if container.Command == nil && container.Image == e.Spec.Runtime.Image && container.Name != e.ObjectMeta.Name {
|
if container.Command == nil && container.Image == e.Spec.Runtime.Image && container.Name != e.Name {
|
||||||
result = multierror.Append(result, errors.New("container with image same as runtime image in podspec, must have name same as environment name"))
|
result = multierror.Append(result, errors.New("container with image same as runtime image in podspec, must have name same as environment name"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ package v1
|
|||||||
import (
|
import (
|
||||||
"k8s.io/api/autoscaling/v2"
|
"k8s.io/api/autoscaling/v2"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
|||||||
@@ -428,6 +428,8 @@ var map_TimeTriggerSpec = map[string]string{
|
|||||||
"": "TimeTriggerSpec invokes the specific function at a time or times specified by a cron string.",
|
"": "TimeTriggerSpec invokes the specific function at a time or times specified by a cron string.",
|
||||||
"cron": "Cron schedule",
|
"cron": "Cron schedule",
|
||||||
"functionref": "The reference to function",
|
"functionref": "The reference to function",
|
||||||
|
"method": "HTTP Method for trigger, ex : GET, POST, PUT, DELETE, HEAD (default: \"POST\")",
|
||||||
|
"subpath": "Subpath to trigger a specific route if function internally supports routing, (default: \"/\")",
|
||||||
}
|
}
|
||||||
|
|
||||||
func (TimeTriggerSpec) SwaggerDoc() map[string]string {
|
func (TimeTriggerSpec) SwaggerDoc() map[string]string {
|
||||||
|
|||||||
+18
-9
@@ -31,7 +31,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/dchest/uniuri"
|
"github.com/dchest/uniuri"
|
||||||
"github.com/pkg/errors"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
||||||
"github.com/fission/fission/pkg/info"
|
"github.com/fission/fission/pkg/info"
|
||||||
@@ -122,9 +121,19 @@ func (builder *Builder) Handler(w http.ResponseWriter, r *http.Request) {
|
|||||||
logger.Info("builder received request", zap.Any("request", req))
|
logger.Info("builder received request", zap.Any("request", req))
|
||||||
|
|
||||||
logger.Debug("starting build")
|
logger.Debug("starting build")
|
||||||
srcPkgPath := filepath.Join(builder.sharedVolumePath, req.SrcPkgFilename)
|
srcPkgPath, err := utils.SanitizeFilePath(filepath.Join(builder.sharedVolumePath, req.SrcPkgFilename), builder.sharedVolumePath)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error(err.Error(), zap.String("filename", req.SrcPkgFilename))
|
||||||
|
builder.reply(r.Context(), w, "", err.Error(), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
deployPkgFilename := fmt.Sprintf("%s-%s", req.SrcPkgFilename, strings.ToLower(uniuri.NewLen(6)))
|
deployPkgFilename := fmt.Sprintf("%s-%s", req.SrcPkgFilename, strings.ToLower(uniuri.NewLen(6)))
|
||||||
deployPkgPath := filepath.Join(builder.sharedVolumePath, deployPkgFilename)
|
deployPkgPath, err := utils.SanitizeFilePath(filepath.Join(builder.sharedVolumePath, deployPkgFilename), builder.sharedVolumePath)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error(err.Error(), zap.String("filename", req.SrcPkgFilename))
|
||||||
|
builder.reply(r.Context(), w, "", err.Error(), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
var buildArgs []string
|
var buildArgs []string
|
||||||
buildCmd := req.BuildCommand
|
buildCmd := req.BuildCommand
|
||||||
@@ -196,7 +205,7 @@ func (builder *Builder) reply(ctx context.Context, w http.ResponseWriter, pkgFil
|
|||||||
|
|
||||||
rBody, err := json.Marshal(resp)
|
rBody, err := json.Marshal(resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e := errors.Wrap(err, "error encoding response body")
|
e := fmt.Errorf("error encoding response body: %w", err)
|
||||||
rBody = []byte(fmt.Sprintf(`{"buildLogs": "%s"}`, e.Error()))
|
rBody = []byte(fmt.Sprintf(`{"buildLogs": "%s"}`, e.Error()))
|
||||||
statusCode = http.StatusInternalServerError
|
statusCode = http.StatusInternalServerError
|
||||||
}
|
}
|
||||||
@@ -237,12 +246,12 @@ func (builder *Builder) build(ctx context.Context, command string, args []string
|
|||||||
|
|
||||||
stdout, err := cmd.StdoutPipe()
|
stdout, err := cmd.StdoutPipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "error creating stdout pipe for cmd")
|
return "", fmt.Errorf("error creating stdout pipe for cmd: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
stderr, err := cmd.StderrPipe()
|
stderr, err := cmd.StderrPipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "error creating stderr pipe for cmd")
|
return "", fmt.Errorf("error creating stderr pipe for cmd: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init logs
|
// Init logs
|
||||||
@@ -253,7 +262,7 @@ func (builder *Builder) build(ctx context.Context, command string, args []string
|
|||||||
|
|
||||||
err = cmd.Start()
|
err = cmd.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "error starting cmd")
|
return "", fmt.Errorf("error starting cmd: %w", err)
|
||||||
}
|
}
|
||||||
fmt.Printf("========= START =========\n")
|
fmt.Printf("========= START =========\n")
|
||||||
defer fmt.Printf("========= END ===========\n")
|
defer fmt.Printf("========= END ===========\n")
|
||||||
@@ -266,14 +275,14 @@ func (builder *Builder) build(ctx context.Context, command string, args []string
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := scanner.Err(); err != nil {
|
if err := scanner.Err(); err != nil {
|
||||||
scanErr := errors.Wrap(err, "error reading cmd output")
|
scanErr := fmt.Errorf("error reading cmd output: %w", err)
|
||||||
fmt.Println(scanErr)
|
fmt.Println(scanErr)
|
||||||
return buildLogs, scanErr
|
return buildLogs, scanErr
|
||||||
}
|
}
|
||||||
|
|
||||||
err = cmd.Wait()
|
err = cmd.Wait()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cmdErr := errors.Wrapf(err, "error waiting for cmd %q", command)
|
cmdErr := fmt.Errorf("error waiting for cmd %q: %w", command, err)
|
||||||
fmt.Println(cmdErr)
|
fmt.Println(cmdErr)
|
||||||
return buildLogs, cmdErr
|
return buildLogs, cmdErr
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,12 +20,12 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hashicorp/go-retryablehttp"
|
"github.com/hashicorp/go-retryablehttp"
|
||||||
"github.com/pkg/errors"
|
|
||||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"golang.org/x/net/context/ctxhttp"
|
"golang.org/x/net/context/ctxhttp"
|
||||||
@@ -68,26 +68,26 @@ func (c *client) Build(ctx context.Context, req *builder.PackageBuildRequest) (*
|
|||||||
|
|
||||||
body, err := json.Marshal(req)
|
body, err := json.Marshal(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "error marshaling json")
|
return nil, fmt.Errorf("error marshaling json: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := ctxhttp.Post(ctx, c.httpClient.StandardClient(), c.url, "application/json", bytes.NewReader(body))
|
resp, err := ctxhttp.Post(ctx, c.httpClient.StandardClient(), c.url, "application/json", bytes.NewReader(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("error sending request: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
rBody, err := io.ReadAll(resp.Body)
|
rBody, err := io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("error reading resp body", zap.Error(err))
|
logger.Error("error reading resp body", zap.Error(err))
|
||||||
return nil, err
|
return nil, fmt.Errorf("error reading response body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
pkgBuildResp := builder.PackageBuildResponse{}
|
pkgBuildResp := builder.PackageBuildResponse{}
|
||||||
err = json.Unmarshal(rBody, &pkgBuildResp)
|
err = json.Unmarshal(rBody, &pkgBuildResp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("error parsing resp body", zap.Error(err))
|
logger.Error("error parsing resp body", zap.Error(err))
|
||||||
return nil, err
|
return nil, fmt.Errorf("error parsing response body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &pkgBuildResp, ferror.MakeErrorFromHTTP(resp)
|
return &pkgBuildResp, ferror.MakeErrorFromHTTP(resp)
|
||||||
@@ -98,7 +98,7 @@ func (c *client) Clean(ctx context.Context, srcPkgFilename string) error {
|
|||||||
|
|
||||||
req, err := http.NewRequest(http.MethodDelete, c.getCleanUrl(srcPkgFilename), http.NoBody)
|
req, err := http.NewRequest(http.MethodDelete, c.getCleanUrl(srcPkgFilename), http.NoBody)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to create http request for clean api")
|
return fmt.Errorf("error creating http request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := ctxhttp.Do(ctx, c.httpClient.StandardClient(), req)
|
resp, err := ctxhttp.Do(ctx, c.httpClient.StandardClient(), req)
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ package buildermgr
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
||||||
fv1 "github.com/fission/fission/pkg/apis/core/v1"
|
fv1 "github.com/fission/fission/pkg/apis/core/v1"
|
||||||
@@ -38,21 +38,21 @@ func Start(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *
|
|||||||
|
|
||||||
fissionClient, err := clientGen.GetFissionClient()
|
fissionClient, err := clientGen.GetFissionClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to get fission client")
|
return fmt.Errorf("failed to get fission client: %w", err)
|
||||||
}
|
}
|
||||||
kubernetesClient, err := clientGen.GetKubernetesClient()
|
kubernetesClient, err := clientGen.GetKubernetesClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to get kubernetes client")
|
return fmt.Errorf("failed to get kubernetes client: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = crd.WaitForFunctionCRDs(ctx, logger, fissionClient)
|
err = crd.WaitForFunctionCRDs(ctx, logger, fissionClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "error waiting for CRDs")
|
return fmt.Errorf("error waiting for CRDs: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fetcherConfig, err := fetcherConfig.MakeFetcherConfig("/packages")
|
fetcherConfig, err := fetcherConfig.MakeFetcherConfig("/packages")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "error making fetcher config")
|
return fmt.Errorf("error making fetcher config: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
podSpecPatch, err := util.GetSpecFromConfigMap(fv1.BuilderPodSpecPath)
|
podSpecPatch, err := util.GetSpecFromConfigMap(fv1.BuilderPodSpecPath)
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/dchest/uniuri"
|
"github.com/dchest/uniuri"
|
||||||
"github.com/pkg/errors"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
|
||||||
@@ -55,10 +54,10 @@ func buildPackage(ctx context.Context, logger *zap.Logger, fissionClient version
|
|||||||
return nil, e, ferror.MakeError(http.StatusInternalServerError, e)
|
return nil, e, ferror.MakeError(http.StatusInternalServerError, e)
|
||||||
}
|
}
|
||||||
|
|
||||||
svcName := fmt.Sprintf("%v-%v.%v", env.ObjectMeta.Name, env.ObjectMeta.ResourceVersion, envBuilderNamespace)
|
svcName := fmt.Sprintf("%s-%s.%s", env.Name, env.ResourceVersion, envBuilderNamespace)
|
||||||
srcPkgFilename := fmt.Sprintf("%v-%v", pkg.ObjectMeta.Name, strings.ToLower(uniuri.NewLen(6)))
|
srcPkgFilename := fmt.Sprintf("%s-%s", pkg.Name, strings.ToLower(uniuri.NewLen(6)))
|
||||||
fetcherC := fetcherClient.MakeClient(logger, fmt.Sprintf("http://%v:8000", svcName))
|
fetcherC := fetcherClient.MakeClient(logger, fmt.Sprintf("http://%s:8000", svcName))
|
||||||
builderC := builderClient.MakeClient(logger, fmt.Sprintf("http://%v:8001", svcName))
|
builderC := builderClient.MakeClient(logger, fmt.Sprintf("http://%s:8001", svcName))
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
logger.Info("cleaning src pkg from builder storage", zap.String("source_package", srcPkgFilename))
|
logger.Info("cleaning src pkg from builder storage", zap.String("source_package", srcPkgFilename))
|
||||||
@@ -162,7 +161,7 @@ func updatePackage(ctx context.Context, logger *zap.Logger, fissionClient versio
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
e := "error updating package"
|
e := "error updating package"
|
||||||
logger.Error(e, zap.Error(err))
|
logger.Error(e, zap.Error(err))
|
||||||
return nil, errors.Wrap(err, e)
|
return nil, fmt.Errorf("%s: %w", e, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// return resource version for function to update function package ref
|
// return resource version for function to update function package ref
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ type (
|
|||||||
useIstio bool
|
useIstio bool
|
||||||
podSpecPatch *apiv1.PodSpec
|
podSpecPatch *apiv1.PodSpec
|
||||||
envWatchInformer map[string]k8sCache.SharedIndexInformer
|
envWatchInformer map[string]k8sCache.SharedIndexInformer
|
||||||
|
enableOwnerReferences bool
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -108,6 +109,7 @@ func makeEnvironmentWatcher(
|
|||||||
fetcherConfig: fetcherConfig,
|
fetcherConfig: fetcherConfig,
|
||||||
podSpecPatch: podSpecPatch,
|
podSpecPatch: podSpecPatch,
|
||||||
envWatchInformer: utils.GetInformersForNamespaces(fissionClient, time.Minute*30, fv1.EnvironmentResource),
|
envWatchInformer: utils.GetInformersForNamespaces(fissionClient, time.Minute*30, fv1.EnvironmentResource),
|
||||||
|
enableOwnerReferences: utils.IsOwnerReferencesEnabled(),
|
||||||
}
|
}
|
||||||
|
|
||||||
err := envWatcher.EnvWatchEventHandlers(ctx)
|
err := envWatcher.EnvWatchEventHandlers(ctx)
|
||||||
@@ -325,18 +327,22 @@ func (envw *environmentWatcher) getBuilderServiceList(ctx context.Context, sel m
|
|||||||
func (envw *environmentWatcher) createBuilderService(ctx context.Context, env *fv1.Environment, ns string) (*apiv1.Service, error) {
|
func (envw *environmentWatcher) createBuilderService(ctx context.Context, env *fv1.Environment, ns string) (*apiv1.Service, error) {
|
||||||
name := fmt.Sprintf("%v-%v", env.ObjectMeta.Name, env.ObjectMeta.ResourceVersion)
|
name := fmt.Sprintf("%v-%v", env.ObjectMeta.Name, env.ObjectMeta.ResourceVersion)
|
||||||
sel := envw.getLabels(env.ObjectMeta.Name, ns, env.ObjectMeta.ResourceVersion)
|
sel := envw.getLabels(env.ObjectMeta.Name, ns, env.ObjectMeta.ResourceVersion)
|
||||||
|
var ownerReferences []metav1.OwnerReference
|
||||||
|
if envw.enableOwnerReferences {
|
||||||
|
ownerReferences = []metav1.OwnerReference{
|
||||||
|
*metav1.NewControllerRef(env, schema.GroupVersionKind{
|
||||||
|
Group: "fission.io",
|
||||||
|
Version: "v1",
|
||||||
|
Kind: "Environment",
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
service := apiv1.Service{
|
service := apiv1.Service{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Namespace: ns,
|
Namespace: ns,
|
||||||
Name: name,
|
Name: name,
|
||||||
Labels: sel,
|
Labels: sel,
|
||||||
OwnerReferences: []metav1.OwnerReference{
|
OwnerReferences: ownerReferences,
|
||||||
*metav1.NewControllerRef(env, schema.GroupVersionKind{
|
|
||||||
Group: "fission.io",
|
|
||||||
Version: "v1",
|
|
||||||
Kind: "Environment",
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Spec: apiv1.ServiceSpec{
|
Spec: apiv1.ServiceSpec{
|
||||||
Selector: sel,
|
Selector: sel,
|
||||||
@@ -397,7 +403,7 @@ func (envw *environmentWatcher) createBuilderDeployment(ctx context.Context, env
|
|||||||
}
|
}
|
||||||
|
|
||||||
container, err := util.MergeContainer(&apiv1.Container{
|
container, err := util.MergeContainer(&apiv1.Container{
|
||||||
Name: "builder",
|
Name: fv1.BuilderContainerName,
|
||||||
Image: env.Spec.Builder.Image,
|
Image: env.Spec.Builder.Image,
|
||||||
ImagePullPolicy: envw.builderImagePullPolicy,
|
ImagePullPolicy: envw.builderImagePullPolicy,
|
||||||
TerminationMessagePath: "/dev/termination-log",
|
TerminationMessagePath: "/dev/termination-log",
|
||||||
@@ -443,18 +449,23 @@ func (envw *environmentWatcher) createBuilderDeployment(ctx context.Context, env
|
|||||||
|
|
||||||
pod.Spec = *(util.ApplyImagePullSecret(env.Spec.ImagePullSecret, pod.Spec))
|
pod.Spec = *(util.ApplyImagePullSecret(env.Spec.ImagePullSecret, pod.Spec))
|
||||||
|
|
||||||
|
var ownerReferences []metav1.OwnerReference
|
||||||
|
if envw.enableOwnerReferences {
|
||||||
|
ownerReferences = []metav1.OwnerReference{
|
||||||
|
*metav1.NewControllerRef(env, schema.GroupVersionKind{
|
||||||
|
Group: "fission.io",
|
||||||
|
Version: "v1",
|
||||||
|
Kind: "Environment",
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
deployment := &appsv1.Deployment{
|
deployment := &appsv1.Deployment{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Namespace: ns,
|
Namespace: ns,
|
||||||
Name: name,
|
Name: name,
|
||||||
Labels: sel,
|
Labels: sel,
|
||||||
OwnerReferences: []metav1.OwnerReference{
|
OwnerReferences: ownerReferences,
|
||||||
*metav1.NewControllerRef(env, schema.GroupVersionKind{
|
|
||||||
Group: "fission.io",
|
|
||||||
Version: "v1",
|
|
||||||
Kind: "Environment",
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Spec: appsv1.DeploymentSpec{
|
Spec: appsv1.DeploymentSpec{
|
||||||
Replicas: &replicas,
|
Replicas: &replicas,
|
||||||
|
|||||||
@@ -461,7 +461,7 @@ func (canaryCfgMgr *canaryConfigMgr) rollback(ctx context.Context, canaryConfig
|
|||||||
functionWeights[canaryConfig.Spec.NewFunction] = 0
|
functionWeights[canaryConfig.Spec.NewFunction] = 0
|
||||||
functionWeights[canaryConfig.Spec.OldFunction] = 100
|
functionWeights[canaryConfig.Spec.OldFunction] = 100
|
||||||
|
|
||||||
err := canaryCfgMgr.updateHttpTriggerWithRetries(ctx, trigger.ObjectMeta.Name, trigger.ObjectMeta.Namespace, functionWeights)
|
err := canaryCfgMgr.updateHttpTriggerWithRetries(ctx, trigger.Name, trigger.ObjectMeta.Namespace, functionWeights)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -494,7 +494,7 @@ func (canaryCfgMgr *canaryConfigMgr) rollForward(ctx context.Context, canaryConf
|
|||||||
zap.String("namespace", canaryConfig.ObjectMeta.Namespace),
|
zap.String("namespace", canaryConfig.ObjectMeta.Namespace),
|
||||||
zap.Any("function_weights", functionWeights))
|
zap.Any("function_weights", functionWeights))
|
||||||
|
|
||||||
err := canaryCfgMgr.updateHttpTriggerWithRetries(ctx, trigger.ObjectMeta.Name, trigger.ObjectMeta.Namespace, functionWeights)
|
err := canaryCfgMgr.updateHttpTriggerWithRetries(ctx, trigger.Name, trigger.ObjectMeta.Namespace, functionWeights)
|
||||||
return doneProcessingCanaryConfig, err
|
return doneProcessingCanaryConfig, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ package canaryconfigmgr
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ func ConfigureFeatures(ctx context.Context, logger *zap.Logger, unitTestMode boo
|
|||||||
// in the future when new optional features are added, we need to add corresponding feature handlers and invoke them here
|
// in the future when new optional features are added, we need to add corresponding feature handlers and invoke them here
|
||||||
canaryCfgMgr, err := MakeCanaryConfigMgr(ctx, logger, fissionClient, kubeClient, featureConfig.CanaryConfig.PrometheusSvc)
|
canaryCfgMgr, err := MakeCanaryConfigMgr(ctx, logger, fissionClient, kubeClient, featureConfig.CanaryConfig.PrometheusSvc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to start canary config manager")
|
return fmt.Errorf("failed to start canary config manager: %w", err)
|
||||||
}
|
}
|
||||||
canaryCfgMgr.Run(ctx, mgr)
|
canaryCfgMgr.Run(ctx, mgr)
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
prometheus "github.com/prometheus/client_golang/api"
|
prometheus "github.com/prometheus/client_golang/api"
|
||||||
prometheusv1 "github.com/prometheus/client_golang/api/prometheus/v1"
|
prometheusv1 "github.com/prometheus/client_golang/api/prometheus/v1"
|
||||||
"github.com/prometheus/common/model"
|
"github.com/prometheus/common/model"
|
||||||
@@ -40,7 +39,7 @@ func MakePrometheusClient(logger *zap.Logger, prometheusSvc string) (*Prometheus
|
|||||||
|
|
||||||
promApiClient, err := prometheus.NewClient(promApiConfig)
|
promApiClient, err := prometheus.NewClient(promApiConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "error creating prometheus api client for svc: %s", prometheusSvc)
|
return nil, fmt.Errorf("error creating prometheus api client for svc: %s: %w", prometheusSvc, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
apiQueryClient := prometheusv1.NewAPI(promApiClient)
|
apiQueryClient := prometheusv1.NewAPI(promApiClient)
|
||||||
@@ -63,7 +62,7 @@ func (promApiClient *PrometheusApiClient) GetFunctionFailurePercentage(ctx conte
|
|||||||
}
|
}
|
||||||
|
|
||||||
if reqs <= 0 {
|
if reqs <= 0 {
|
||||||
return -1, fmt.Errorf("no requests to this url %v and method %v in the window: %v", path, methods, window)
|
return -1, fmt.Errorf("no requests to this url %s and method %v in the window: %s", path, methods, window)
|
||||||
}
|
}
|
||||||
|
|
||||||
// next, get a total count of errored out requests to this function in the same window
|
// next, get a total count of errored out requests to this function in the same window
|
||||||
@@ -91,14 +90,14 @@ func (promApiClient *PrometheusApiClient) GetRequestsToFuncInWindow(ctx context.
|
|||||||
|
|
||||||
reqs, err := promApiClient.executeQuery(ctx, queryString)
|
reqs, err := promApiClient.executeQuery(ctx, queryString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, errors.Wrapf(err, "error executing query: %s", queryString)
|
return 0, fmt.Errorf("error executing query %s: %w", queryString, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
queryString = fmt.Sprintf("fission_function_calls_total{%s} offset %v", queryLabels, window)
|
queryString = fmt.Sprintf("fission_function_calls_total{%s} offset %v", queryLabels, window)
|
||||||
|
|
||||||
reqsInPrevWindow, err := promApiClient.executeQuery(ctx, queryString)
|
reqsInPrevWindow, err := promApiClient.executeQuery(ctx, queryString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, errors.Wrapf(err, "error executing query: %s", queryString)
|
return 0, fmt.Errorf("error executing query %s: %w", queryString, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
reqsInCurrentWindow := reqs - reqsInPrevWindow
|
reqsInCurrentWindow := reqs - reqsInPrevWindow
|
||||||
@@ -117,14 +116,14 @@ func (promApiClient *PrometheusApiClient) GetTotalFailedRequestsToFuncInWindow(c
|
|||||||
|
|
||||||
failedRequests, err := promApiClient.executeQuery(ctx, queryString)
|
failedRequests, err := promApiClient.executeQuery(ctx, queryString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, errors.Wrapf(err, "error executing query: %s", queryString)
|
return 0, fmt.Errorf("error executing query %s: %w", queryString, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
queryString = fmt.Sprintf("fission_function_errors_total{%s} offset %v", queryLabels, window)
|
queryString = fmt.Sprintf("fission_function_errors_total{%s} offset %v", queryLabels, window)
|
||||||
|
|
||||||
failedReqsInPrevWindow, err := promApiClient.executeQuery(ctx, queryString)
|
failedReqsInPrevWindow, err := promApiClient.executeQuery(ctx, queryString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, errors.Wrapf(err, "error executing query: %s", queryString)
|
return 0, fmt.Errorf("error executing query %s: %w", queryString, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
failedReqsInCurrentWindow := failedRequests - failedReqsInPrevWindow
|
failedReqsInCurrentWindow := failedRequests - failedReqsInPrevWindow
|
||||||
@@ -142,7 +141,7 @@ func (promApiClient *PrometheusApiClient) executeQuery(ctx context.Context, quer
|
|||||||
|
|
||||||
val, warn, err := promApiClient.client.Query(ctx, queryString, time.Now())
|
val, warn, err := promApiClient.client.Query(ctx, queryString, time.Now())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, errors.Wrapf(err, "error querying prometheus")
|
return 0, fmt.Errorf("error querying prometheus: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if warn != nil {
|
if warn != nil {
|
||||||
|
|||||||
+1
-1
@@ -21,6 +21,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
kedaClient "github.com/kedacore/keda/v2/pkg/generated/clientset/versioned"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@@ -32,7 +33,6 @@ import (
|
|||||||
|
|
||||||
"github.com/fission/fission/pkg/generated/clientset/versioned"
|
"github.com/fission/fission/pkg/generated/clientset/versioned"
|
||||||
"github.com/fission/fission/pkg/utils"
|
"github.com/fission/fission/pkg/utils"
|
||||||
kedaClient "github.com/kedacore/keda/v2/pkg/generated/clientset/versioned"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
package error
|
package error
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestIsNotFound(t *testing.T) {
|
func TestIsNotFound(t *testing.T) {
|
||||||
errs := map[error]bool{
|
errs := map[error]bool{
|
||||||
nil: false,
|
nil: false,
|
||||||
MakeError(ErrorNotFound, "someone not found"): true,
|
MakeError(ErrorNotFound, "someone not found"): true,
|
||||||
MakeError(ErrorTooManyRequests, "too many requests"): false,
|
MakeError(ErrorTooManyRequests, "too many requests"): false,
|
||||||
errors.Wrap(MakeError(ErrorNotFound, "someone not found"), "other information"): true,
|
fmt.Errorf("other information: %w", MakeError(ErrorNotFound, "someone not found")): true,
|
||||||
errors.Wrap(MakeError(ErrorTooManyRequests, "too many requests"), "other information"): false,
|
fmt.Errorf("other information: %w", MakeError(ErrorTooManyRequests, "too many requests")): false,
|
||||||
}
|
}
|
||||||
|
|
||||||
for err, want := range errs {
|
for err, want := range errs {
|
||||||
@@ -25,9 +25,9 @@ func TestIsNotFound(t *testing.T) {
|
|||||||
func TestGetHTTPError(t *testing.T) {
|
func TestGetHTTPError(t *testing.T) {
|
||||||
errs := map[int]error{
|
errs := map[int]error{
|
||||||
http.StatusBadRequest: MakeError(ErrorInvalidArgument, ""),
|
http.StatusBadRequest: MakeError(ErrorInvalidArgument, ""),
|
||||||
http.StatusConflict: errors.Wrap(MakeError(ErrorNameExists, ""), ""),
|
http.StatusConflict: fmt.Errorf("%w", MakeError(ErrorNameExists, "")),
|
||||||
http.StatusNotFound: errors.Wrap(MakeError(ErrorNotFound, ""), ""),
|
http.StatusNotFound: fmt.Errorf("%w", MakeError(ErrorNotFound, "")),
|
||||||
http.StatusTooManyRequests: errors.Wrap(MakeError(ErrorTooManyRequests, "too many requests"), "other information"),
|
http.StatusTooManyRequests: fmt.Errorf("other information: %w", MakeError(ErrorTooManyRequests, "too many requests")),
|
||||||
}
|
}
|
||||||
for want, err := range errs {
|
for want, err := range errs {
|
||||||
code, _ := GetHTTPError(err)
|
code, _ := GetHTTPError(err)
|
||||||
|
|||||||
@@ -20,13 +20,13 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/hashicorp/go-retryablehttp"
|
"github.com/hashicorp/go-retryablehttp"
|
||||||
"github.com/pkg/errors"
|
|
||||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@@ -80,18 +80,18 @@ func (c *client) GetServiceForFunction(ctx context.Context, fn *fv1.Function) (s
|
|||||||
|
|
||||||
body, err := json.Marshal(fn)
|
body, err := json.Marshal(fn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "could not marshal request body for getting service for function")
|
return "", fmt.Errorf("could not marshal request body for getting service for function: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req, err := retryablehttp.NewRequestWithContext(ctx, "POST", executorURL, bytes.NewReader(body))
|
req, err := retryablehttp.NewRequestWithContext(ctx, "POST", executorURL, bytes.NewReader(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "could not create request for getting service for function")
|
return "", fmt.Errorf("could not create request for getting service for function: %w", err)
|
||||||
}
|
}
|
||||||
req.Header.Set("Content-Type", "application/json")
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
|
||||||
resp, err := c.httpClient.Do(req)
|
resp, err := c.httpClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "error posting to getting service for function")
|
return "", fmt.Errorf("error posting to getting service for function: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
@@ -101,7 +101,7 @@ func (c *client) GetServiceForFunction(ctx context.Context, fn *fv1.Function) (s
|
|||||||
|
|
||||||
svcName, err := io.ReadAll(resp.Body)
|
svcName, err := io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "error reading response body from getting service for function")
|
return "", fmt.Errorf("error reading response body from getting service for function: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return string(svcName), nil
|
return string(svcName), nil
|
||||||
@@ -118,17 +118,17 @@ func (c *client) UnTapService(ctx context.Context, fnMeta metav1.ObjectMeta, exe
|
|||||||
|
|
||||||
body, err := json.Marshal(tapSvc)
|
body, err := json.Marshal(tapSvc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "could not marshal request body for getting service for function")
|
return fmt.Errorf("could not marshal request body for getting service for function: %w", err)
|
||||||
}
|
}
|
||||||
req, err := retryablehttp.NewRequestWithContext(ctx, "POST", url, bytes.NewReader(body))
|
req, err := retryablehttp.NewRequestWithContext(ctx, "POST", url, bytes.NewReader(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "could not create request for untap service for function")
|
return fmt.Errorf("could not create request for untap service for function: %w", err)
|
||||||
}
|
}
|
||||||
req.Header.Set("Content-Type", "application/json")
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
|
||||||
resp, err := c.httpClient.Do(req)
|
resp, err := c.httpClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "error posting to getting service for function")
|
return fmt.Errorf("error posting to getting service for function: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
@@ -194,7 +194,7 @@ func (c *client) _tapService(ctx context.Context, tapSvcReqs []TapServiceRequest
|
|||||||
|
|
||||||
req, err := retryablehttp.NewRequestWithContext(ctx, "POST", executorURL, bytes.NewReader(body))
|
req, err := retryablehttp.NewRequestWithContext(ctx, "POST", executorURL, bytes.NewReader(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "could not create request for tap service request")
|
return fmt.Errorf("could not create request for tap service request: %w", err)
|
||||||
}
|
}
|
||||||
req.Header.Set("Content-Type", "application/json")
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
|
||||||
|
|||||||
@@ -58,13 +58,18 @@ func ConfigMapEventHandlers(ctx context.Context, logger *zap.Logger, fissionClie
|
|||||||
oldCm := oldObj.(*apiv1.ConfigMap)
|
oldCm := oldObj.(*apiv1.ConfigMap)
|
||||||
newCm := newObj.(*apiv1.ConfigMap)
|
newCm := newObj.(*apiv1.ConfigMap)
|
||||||
if oldCm.ObjectMeta.ResourceVersion != newCm.ObjectMeta.ResourceVersion {
|
if oldCm.ObjectMeta.ResourceVersion != newCm.ObjectMeta.ResourceVersion {
|
||||||
logger.Debug("Configmap changed",
|
|
||||||
zap.String("configmap_name", newCm.ObjectMeta.Name),
|
|
||||||
zap.String("configmap_namespace", newCm.ObjectMeta.Namespace))
|
|
||||||
funcs, err := getConfigmapRelatedFuncs(ctx, logger, &newCm.ObjectMeta, fissionClient)
|
funcs, err := getConfigmapRelatedFuncs(ctx, logger, &newCm.ObjectMeta, fissionClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("Failed to get functions related to configmap", zap.String("configmap_name", newCm.ObjectMeta.Name), zap.String("configmap_namespace", newCm.ObjectMeta.Namespace))
|
logger.Error("Failed to get functions related to configmap", zap.String("configmap_name", newCm.ObjectMeta.Name), zap.String("configmap_namespace", newCm.ObjectMeta.Namespace))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(funcs) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Debug("Configmap changed",
|
||||||
|
zap.String("configmap_name", newCm.ObjectMeta.Name),
|
||||||
|
zap.String("configmap_namespace", newCm.ObjectMeta.Namespace))
|
||||||
refreshPods(ctx, logger, funcs, types)
|
refreshPods(ctx, logger, funcs, types)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ package cms
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
@@ -72,7 +72,7 @@ func refreshPods(ctx context.Context, logger *zap.Logger, funcs []fv1.Function,
|
|||||||
if exists {
|
if exists {
|
||||||
err = et.RefreshFuncPods(ctx, logger, f)
|
err = et.RefreshFuncPods(ctx, logger, f)
|
||||||
} else {
|
} else {
|
||||||
err = errors.Errorf("Unknown executor type '%s'", f.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType)
|
err = fmt.Errorf("unknown executor type '%s'", f.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -57,13 +57,18 @@ func SecretEventHandlers(ctx context.Context, logger *zap.Logger, fissionClient
|
|||||||
oldS := oldObj.(*apiv1.Secret)
|
oldS := oldObj.(*apiv1.Secret)
|
||||||
newS := newObj.(*apiv1.Secret)
|
newS := newObj.(*apiv1.Secret)
|
||||||
if oldS.ObjectMeta.ResourceVersion != newS.ObjectMeta.ResourceVersion {
|
if oldS.ObjectMeta.ResourceVersion != newS.ObjectMeta.ResourceVersion {
|
||||||
logger.Debug("Secret changed",
|
|
||||||
zap.String("configmap_name", newS.ObjectMeta.Name),
|
|
||||||
zap.String("configmap_namespace", newS.ObjectMeta.Namespace))
|
|
||||||
funcs, err := getSecretRelatedFuncs(ctx, logger, &newS.ObjectMeta, fissionClient)
|
funcs, err := getSecretRelatedFuncs(ctx, logger, &newS.ObjectMeta, fissionClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("Failed to get functions related to secret", zap.String("secret_name", newS.ObjectMeta.Name), zap.String("secret_namespace", newS.ObjectMeta.Namespace))
|
logger.Error("Failed to get functions related to secret", zap.String("secret_name", newS.ObjectMeta.Name), zap.String("secret_namespace", newS.ObjectMeta.Namespace))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(funcs) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Debug("Secret changed",
|
||||||
|
zap.String("secret_name", newS.ObjectMeta.Name),
|
||||||
|
zap.String("secret_namespace", newS.ObjectMeta.Namespace))
|
||||||
refreshPods(ctx, logger, funcs, types)
|
refreshPods(ctx, logger, funcs, types)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
+21
-24
@@ -26,7 +26,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/dchest/uniuri"
|
"github.com/dchest/uniuri"
|
||||||
"github.com/pkg/errors"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
k8sCache "k8s.io/client-go/tools/cache"
|
k8sCache "k8s.io/client-go/tools/cache"
|
||||||
|
|
||||||
@@ -155,12 +154,11 @@ func (executor *Executor) serveCreateFuncServices(ctx context.Context) {
|
|||||||
// create a waitgroup for other requests for
|
// create a waitgroup for other requests for
|
||||||
// the same function to wait on
|
// the same function to wait on
|
||||||
wg := &sync.WaitGroup{}
|
wg := &sync.WaitGroup{}
|
||||||
wg.Add(1)
|
|
||||||
executor.fsCreateWg.Store(fnkeyUR, wg)
|
executor.fsCreateWg.Store(fnkeyUR, wg)
|
||||||
|
|
||||||
// launch a goroutine for each request, to parallelize
|
// launch a goroutine for each request, to parallelize
|
||||||
// the specialization of different functions
|
// the specialization of different functions
|
||||||
go func() {
|
wg.Go(func() {
|
||||||
// Control overall specialization time by setting function
|
// Control overall specialization time by setting function
|
||||||
// specialization time to context. The reason not to use
|
// specialization time to context. The reason not to use
|
||||||
// context from router requests is because a request maybe
|
// context from router requests is because a request maybe
|
||||||
@@ -189,8 +187,7 @@ func (executor *Executor) serveCreateFuncServices(ctx context.Context) {
|
|||||||
err: err,
|
err: err,
|
||||||
}
|
}
|
||||||
executor.fsCreateWg.Delete(fnkeyUR)
|
executor.fsCreateWg.Delete(fnkeyUR)
|
||||||
wg.Done()
|
})
|
||||||
}()
|
|
||||||
} else {
|
} else {
|
||||||
// There's an existing request for this function, wait for it to finish
|
// There's an existing request for this function, wait for it to finish
|
||||||
go func() {
|
go func() {
|
||||||
@@ -213,7 +210,7 @@ func (executor *Executor) serveCreateFuncServices(ctx context.Context) {
|
|||||||
// It normally happened if there are multiple requests are
|
// It normally happened if there are multiple requests are
|
||||||
// waiting for the same function and executor failed to cre-
|
// waiting for the same function and executor failed to cre-
|
||||||
// ate service for function.
|
// ate service for function.
|
||||||
err = errors.Wrapf(err, "error getting service for function %s", fnName)
|
err = fmt.Errorf("error getting service for function %s: %w", fnName, err)
|
||||||
req.respChan <- &createFuncServiceResponse{
|
req.respChan <- &createFuncServiceResponse{
|
||||||
funcSvc: fsvc,
|
funcSvc: fsvc,
|
||||||
err: err,
|
err: err,
|
||||||
@@ -233,7 +230,7 @@ func (executor *Executor) createServiceForFunction(ctx context.Context, fn *fv1.
|
|||||||
t := fn.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType
|
t := fn.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType
|
||||||
e, ok := executor.executorTypes[t]
|
e, ok := executor.executorTypes[t]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.Errorf("Unknown executor type '%s'", t)
|
return nil, fmt.Errorf("unknown executor type '%s'", t)
|
||||||
}
|
}
|
||||||
|
|
||||||
fsvc, fsvcErr := e.GetFuncSvc(ctx, fn)
|
fsvc, fsvcErr := e.GetFuncSvc(ctx, fn)
|
||||||
@@ -243,7 +240,7 @@ func (executor *Executor) createServiceForFunction(ctx context.Context, fn *fv1.
|
|||||||
zap.Error(fsvcErr),
|
zap.Error(fsvcErr),
|
||||||
zap.String("function_name", fn.ObjectMeta.Name),
|
zap.String("function_name", fn.ObjectMeta.Name),
|
||||||
zap.String("function_namespace", fn.ObjectMeta.Namespace))
|
zap.String("function_namespace", fn.ObjectMeta.Namespace))
|
||||||
fsvcErr = errors.Wrap(fsvcErr, fmt.Sprintf("[%s] %s", fn.ObjectMeta.Name, e))
|
fsvcErr = fmt.Errorf("[%s] %s: %w", fn.ObjectMeta.Name, e, fsvcErr)
|
||||||
}
|
}
|
||||||
|
|
||||||
return fsvc, fsvcErr
|
return fsvc, fsvcErr
|
||||||
@@ -254,7 +251,7 @@ func (executor *Executor) getFunctionServiceFromCache(ctx context.Context, fn *f
|
|||||||
t := fn.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType
|
t := fn.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType
|
||||||
e, ok := executor.executorTypes[t]
|
e, ok := executor.executorTypes[t]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.Errorf("Unknown executor type '%s'", t)
|
return nil, fmt.Errorf("unknown executor type '%s'", t)
|
||||||
}
|
}
|
||||||
return e.GetFuncSvcFromCache(ctx, fn)
|
return e.GetFuncSvcFromCache(ctx, fn)
|
||||||
}
|
}
|
||||||
@@ -265,11 +262,11 @@ func StartExecutor(ctx context.Context, clientGen crd.ClientGeneratorInterface,
|
|||||||
|
|
||||||
fissionClient, err := clientGen.GetFissionClient()
|
fissionClient, err := clientGen.GetFissionClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "error making the fission client")
|
return fmt.Errorf("error making the fission client: %w", err)
|
||||||
}
|
}
|
||||||
kubernetesClient, err := clientGen.GetKubernetesClient()
|
kubernetesClient, err := clientGen.GetKubernetesClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "error making the kube client")
|
return fmt.Errorf("error making the kube client: %w", err)
|
||||||
}
|
}
|
||||||
metricsClient, err := clientGen.GetMetricsClient()
|
metricsClient, err := clientGen.GetMetricsClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -278,12 +275,12 @@ func StartExecutor(ctx context.Context, clientGen crd.ClientGeneratorInterface,
|
|||||||
|
|
||||||
err = crd.WaitForFunctionCRDs(ctx, logger, fissionClient)
|
err = crd.WaitForFunctionCRDs(ctx, logger, fissionClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "error waiting for CRDs")
|
return fmt.Errorf("error waiting for CRDs: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fetcherConfig, err := fetcherConfig.MakeFetcherConfig("/userfunc")
|
fetcherConfig, err := fetcherConfig.MakeFetcherConfig("/userfunc")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Error making fetcher config")
|
return fmt.Errorf("error making fetcher config: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
executorInstanceID := strings.ToLower(uniuri.NewLen(8))
|
executorInstanceID := strings.ToLower(uniuri.NewLen(8))
|
||||||
@@ -312,7 +309,7 @@ func StartExecutor(ctx context.Context, clientGen crd.ClientGeneratorInterface,
|
|||||||
finformerFactory,
|
finformerFactory,
|
||||||
gpmInformerFactory, podSpecPatch)
|
gpmInformerFactory, podSpecPatch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "pool manager creation failed")
|
return fmt.Errorf("pool manager creation failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
executorLabel, err = utils.GetInformerLabelByExecutor(fv1.ExecutorTypeNewdeploy)
|
executorLabel, err = utils.GetInformerLabelByExecutor(fv1.ExecutorTypeNewdeploy)
|
||||||
@@ -327,7 +324,7 @@ func StartExecutor(ctx context.Context, clientGen crd.ClientGeneratorInterface,
|
|||||||
finformerFactory,
|
finformerFactory,
|
||||||
ndmInformerFactory, podSpecPatch)
|
ndmInformerFactory, podSpecPatch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "new deploy manager creation failed")
|
return fmt.Errorf("new deploy manager creation failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
executorLabel, err = utils.GetInformerLabelByExecutor(fv1.ExecutorTypeContainer)
|
executorLabel, err = utils.GetInformerLabelByExecutor(fv1.ExecutorTypeContainer)
|
||||||
@@ -341,7 +338,7 @@ func StartExecutor(ctx context.Context, clientGen crd.ClientGeneratorInterface,
|
|||||||
executorInstanceID, finformerFactory,
|
executorInstanceID, finformerFactory,
|
||||||
cnmInformerFactory)
|
cnmInformerFactory)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "container manager creation failed")
|
return fmt.Errorf("container manager creation failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
executorTypes := make(map[fv1.ExecutorType]executortype.ExecutorType)
|
executorTypes := make(map[fv1.ExecutorType]executortype.ExecutorType)
|
||||||
@@ -353,14 +350,14 @@ func StartExecutor(ctx context.Context, clientGen crd.ClientGeneratorInterface,
|
|||||||
|
|
||||||
wg := &sync.WaitGroup{}
|
wg := &sync.WaitGroup{}
|
||||||
for _, et := range executorTypes {
|
for _, et := range executorTypes {
|
||||||
wg.Add(1)
|
wg.Go(func() {
|
||||||
go func(et executortype.ExecutorType) {
|
func(et executortype.ExecutorType) {
|
||||||
defer wg.Done()
|
if adoptExistingResources {
|
||||||
if adoptExistingResources {
|
et.AdoptExistingResources(ctx)
|
||||||
et.AdoptExistingResources(ctx)
|
}
|
||||||
}
|
et.CleanupOldExecutorObjects(ctx)
|
||||||
et.CleanupOldExecutorObjects(ctx)
|
}(et)
|
||||||
}(et)
|
})
|
||||||
}
|
}
|
||||||
// set hard timeout for resource adoption
|
// set hard timeout for resource adoption
|
||||||
// TODO: use context to control the waiting time once kubernetes client supports it.
|
// TODO: use context to control the waiting time once kubernetes client supports it.
|
||||||
|
|||||||
@@ -88,6 +88,8 @@ type (
|
|||||||
|
|
||||||
hpaops *hpautils.HpaOperations
|
hpaops *hpautils.HpaOperations
|
||||||
objectReaperIntervalSecond time.Duration
|
objectReaperIntervalSecond time.Duration
|
||||||
|
|
||||||
|
enableOwnerReferences bool
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -131,6 +133,8 @@ func MakeContainer(
|
|||||||
deplListerSynced: make(map[string]k8sCache.InformerSynced),
|
deplListerSynced: make(map[string]k8sCache.InformerSynced),
|
||||||
svcLister: make(map[string]corelisters.ServiceLister),
|
svcLister: make(map[string]corelisters.ServiceLister),
|
||||||
svcListerSynced: make(map[string]k8sCache.InformerSynced),
|
svcListerSynced: make(map[string]k8sCache.InformerSynced),
|
||||||
|
|
||||||
|
enableOwnerReferences: utils.IsOwnerReferencesEnabled(),
|
||||||
}
|
}
|
||||||
|
|
||||||
for ns, informerFactory := range cnmInformerFactory {
|
for ns, informerFactory := range cnmInformerFactory {
|
||||||
@@ -298,17 +302,14 @@ func (caaf *Container) AdoptExistingResources(ctx context.Context) {
|
|||||||
for i := range fnList.Items {
|
for i := range fnList.Items {
|
||||||
fn := &fnList.Items[i]
|
fn := &fnList.Items[i]
|
||||||
if fn.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType == fv1.ExecutorTypeContainer {
|
if fn.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType == fv1.ExecutorTypeContainer {
|
||||||
wg.Add(1)
|
wg.Go(func() {
|
||||||
go func() {
|
|
||||||
defer wg.Done()
|
|
||||||
|
|
||||||
_, err = caaf.fnCreate(ctx, fn)
|
_, err = caaf.fnCreate(ctx, fn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
caaf.logger.Warn("failed to adopt resources for function", zap.Error(err))
|
caaf.logger.Warn("failed to adopt resources for function", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
caaf.logger.Info("adopt resources for function", zap.String("function", fn.ObjectMeta.Name))
|
caaf.logger.Info("adopt resources for function", zap.String("function", fn.ObjectMeta.Name))
|
||||||
}()
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -432,27 +433,27 @@ func (caaf *Container) fnCreate(ctx context.Context, fn *fv1.Function) (*fscache
|
|||||||
{
|
{
|
||||||
// obj.TypeMeta.Kind does not work hence this, needs investigation and a fix
|
// obj.TypeMeta.Kind does not work hence this, needs investigation and a fix
|
||||||
Kind: "deployment",
|
Kind: "deployment",
|
||||||
Name: depl.ObjectMeta.Name,
|
Name: depl.Name,
|
||||||
APIVersion: depl.TypeMeta.APIVersion,
|
APIVersion: depl.APIVersion,
|
||||||
Namespace: depl.ObjectMeta.Namespace,
|
Namespace: depl.Namespace,
|
||||||
ResourceVersion: depl.ObjectMeta.ResourceVersion,
|
ResourceVersion: depl.ResourceVersion,
|
||||||
UID: depl.ObjectMeta.UID,
|
UID: depl.UID,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Kind: "service",
|
Kind: "service",
|
||||||
Name: svc.ObjectMeta.Name,
|
Name: svc.Name,
|
||||||
APIVersion: svc.TypeMeta.APIVersion,
|
APIVersion: svc.APIVersion,
|
||||||
Namespace: svc.ObjectMeta.Namespace,
|
Namespace: svc.Namespace,
|
||||||
ResourceVersion: svc.ObjectMeta.ResourceVersion,
|
ResourceVersion: svc.ResourceVersion,
|
||||||
UID: svc.ObjectMeta.UID,
|
UID: svc.UID,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Kind: "horizontalpodautoscaler",
|
Kind: "horizontalpodautoscaler",
|
||||||
Name: hpa.ObjectMeta.Name,
|
Name: hpa.Name,
|
||||||
APIVersion: hpa.TypeMeta.APIVersion,
|
APIVersion: hpa.APIVersion,
|
||||||
Namespace: hpa.ObjectMeta.Namespace,
|
Namespace: hpa.Namespace,
|
||||||
ResourceVersion: hpa.ObjectMeta.ResourceVersion,
|
ResourceVersion: hpa.ResourceVersion,
|
||||||
UID: hpa.ObjectMeta.UID,
|
UID: hpa.UID,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -467,18 +468,18 @@ func (caaf *Container) fnCreate(ctx context.Context, fn *fv1.Function) (*fscache
|
|||||||
_, err = caaf.fsCache.Add(*fsvc)
|
_, err = caaf.fsCache.Add(*fsvc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
caaf.logger.Error("error adding function to cache", zap.Error(err), zap.Any("function", fsvc.Function))
|
caaf.logger.Error("error adding function to cache", zap.Error(err), zap.Any("function", fsvc.Function))
|
||||||
metrics.ColdStartsError.WithLabelValues(fn.ObjectMeta.Name, fn.ObjectMeta.Namespace).Inc()
|
metrics.ColdStartsError.WithLabelValues(fn.Name, fn.Namespace).Inc()
|
||||||
return fsvc, err
|
return fsvc, err
|
||||||
}
|
}
|
||||||
|
|
||||||
metrics.ColdStarts.WithLabelValues(fn.ObjectMeta.Name, fn.ObjectMeta.Namespace).Inc()
|
metrics.ColdStarts.WithLabelValues(fn.Name, fn.Namespace).Inc()
|
||||||
|
|
||||||
return fsvc, nil
|
return fsvc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (caaf *Container) updateFunction(ctx context.Context, oldFn *fv1.Function, newFn *fv1.Function) error {
|
func (caaf *Container) updateFunction(ctx context.Context, oldFn *fv1.Function, newFn *fv1.Function) error {
|
||||||
|
|
||||||
if oldFn.ObjectMeta.ResourceVersion == newFn.ObjectMeta.ResourceVersion {
|
if oldFn.ResourceVersion == newFn.ResourceVersion {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -265,18 +265,22 @@ func (cn *Container) getDeploymentSpec(ctx context.Context, fn *fv1.Function, ta
|
|||||||
|
|
||||||
pod.Spec = *(util.ApplyImagePullSecret("", pod.Spec))
|
pod.Spec = *(util.ApplyImagePullSecret("", pod.Spec))
|
||||||
|
|
||||||
|
var ownerReferences []metav1.OwnerReference
|
||||||
|
if cn.enableOwnerReferences {
|
||||||
|
ownerReferences = []metav1.OwnerReference{
|
||||||
|
*metav1.NewControllerRef(fn, schema.GroupVersionKind{
|
||||||
|
Group: "fission.io",
|
||||||
|
Version: "v1",
|
||||||
|
Kind: "Function",
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
deployment := &appsv1.Deployment{
|
deployment := &appsv1.Deployment{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: deployName,
|
Name: deployName,
|
||||||
Labels: deployLabels,
|
Labels: deployLabels,
|
||||||
Annotations: deployAnnotations,
|
Annotations: deployAnnotations,
|
||||||
OwnerReferences: []metav1.OwnerReference{
|
OwnerReferences: ownerReferences,
|
||||||
*metav1.NewControllerRef(fn, schema.GroupVersionKind{
|
|
||||||
Group: "fission.io",
|
|
||||||
Version: "v1",
|
|
||||||
Kind: "Function",
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Spec: appsv1.DeploymentSpec{
|
Spec: appsv1.DeploymentSpec{
|
||||||
Replicas: &replicas,
|
Replicas: &replicas,
|
||||||
|
|||||||
@@ -50,18 +50,23 @@ func (cn *Container) createOrGetSvc(ctx context.Context, fn *fv1.Function, deplo
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
logger := otelUtils.LoggerWithTraceID(ctx, cn.logger)
|
logger := otelUtils.LoggerWithTraceID(ctx, cn.logger)
|
||||||
|
var ownerReferences []metav1.OwnerReference
|
||||||
|
if cn.enableOwnerReferences {
|
||||||
|
ownerReferences = []metav1.OwnerReference{
|
||||||
|
*metav1.NewControllerRef(fn, schema.GroupVersionKind{
|
||||||
|
Group: "fission.io",
|
||||||
|
Version: "v1",
|
||||||
|
Kind: "Function",
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
service := &apiv1.Service{
|
service := &apiv1.Service{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: svcName,
|
Name: svcName,
|
||||||
Labels: deployLabels,
|
Labels: deployLabels,
|
||||||
Annotations: deployAnnotations,
|
Annotations: deployAnnotations,
|
||||||
OwnerReferences: []metav1.OwnerReference{
|
OwnerReferences: ownerReferences,
|
||||||
*metav1.NewControllerRef(fn, schema.GroupVersionKind{
|
|
||||||
Group: "fission.io",
|
|
||||||
Version: "v1",
|
|
||||||
Kind: "Function",
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Spec: apiv1.ServiceSpec{
|
Spec: apiv1.ServiceSpec{
|
||||||
Ports: []apiv1.ServicePort{
|
Ports: []apiv1.ServicePort{
|
||||||
|
|||||||
@@ -246,18 +246,23 @@ func (deploy *NewDeploy) getDeploymentSpec(ctx context.Context, fn *fv1.Function
|
|||||||
|
|
||||||
pod.Spec = *(util.ApplyImagePullSecret(env.Spec.ImagePullSecret, pod.Spec))
|
pod.Spec = *(util.ApplyImagePullSecret(env.Spec.ImagePullSecret, pod.Spec))
|
||||||
|
|
||||||
|
var ownerReferences []metav1.OwnerReference
|
||||||
|
if deploy.enableOwnerReferences {
|
||||||
|
ownerReferences = []metav1.OwnerReference{
|
||||||
|
*metav1.NewControllerRef(fn, schema.GroupVersionKind{
|
||||||
|
Group: "fission.io",
|
||||||
|
Version: "v1",
|
||||||
|
Kind: "Function",
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
deployment := &appsv1.Deployment{
|
deployment := &appsv1.Deployment{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: deployName,
|
Name: deployName,
|
||||||
Labels: deployLabels,
|
Labels: deployLabels,
|
||||||
Annotations: deployAnnotations,
|
Annotations: deployAnnotations,
|
||||||
OwnerReferences: []metav1.OwnerReference{
|
OwnerReferences: ownerReferences,
|
||||||
*metav1.NewControllerRef(fn, schema.GroupVersionKind{
|
|
||||||
Group: "fission.io",
|
|
||||||
Version: "v1",
|
|
||||||
Kind: "Function",
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Spec: appsv1.DeploymentSpec{
|
Spec: appsv1.DeploymentSpec{
|
||||||
Replicas: &replicas,
|
Replicas: &replicas,
|
||||||
@@ -276,10 +281,20 @@ func (deploy *NewDeploy) getDeploymentSpec(ctx context.Context, fn *fv1.Function
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If custom runtime container name - default env name
|
||||||
|
mainContainerName := env.ObjectMeta.Name
|
||||||
|
if env.Spec.Runtime.Container != nil && env.Spec.Runtime.Container.Name != "" && env.Spec.Runtime.PodSpec != nil {
|
||||||
|
if util.DoesContainerExistInPodSpec(env.Spec.Runtime.Container.Name, env.Spec.Runtime.PodSpec) {
|
||||||
|
mainContainerName = env.Spec.Runtime.Container.Name
|
||||||
|
} else {
|
||||||
|
return nil, fmt.Errorf("runtime container %s not found in pod spec", env.Spec.Runtime.Container.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Order of merging is important here - first fetcher, then containers and lastly pod spec
|
// Order of merging is important here - first fetcher, then containers and lastly pod spec
|
||||||
err = deploy.fetcherConfig.AddSpecializingFetcherToPodSpec(
|
err = deploy.fetcherConfig.AddSpecializingFetcherToPodSpec(
|
||||||
&deployment.Spec.Template.Spec,
|
&deployment.Spec.Template.Spec,
|
||||||
env.ObjectMeta.Name,
|
mainContainerName,
|
||||||
fn,
|
fn,
|
||||||
env,
|
env,
|
||||||
)
|
)
|
||||||
@@ -334,18 +349,23 @@ func (deploy *NewDeploy) getResources(env *fv1.Environment, fn *fv1.Function) ap
|
|||||||
|
|
||||||
func (deploy *NewDeploy) createOrGetSvc(ctx context.Context, fn *fv1.Function, deployLabels map[string]string, deployAnnotations map[string]string, svcName string, svcNamespace string) (*apiv1.Service, error) {
|
func (deploy *NewDeploy) createOrGetSvc(ctx context.Context, fn *fv1.Function, deployLabels map[string]string, deployAnnotations map[string]string, svcName string, svcNamespace string) (*apiv1.Service, error) {
|
||||||
logger := otelUtils.LoggerWithTraceID(ctx, deploy.logger)
|
logger := otelUtils.LoggerWithTraceID(ctx, deploy.logger)
|
||||||
|
var ownerReferences []metav1.OwnerReference
|
||||||
|
if deploy.enableOwnerReferences {
|
||||||
|
ownerReferences = []metav1.OwnerReference{
|
||||||
|
*metav1.NewControllerRef(fn, schema.GroupVersionKind{
|
||||||
|
Group: "fission.io",
|
||||||
|
Version: "v1",
|
||||||
|
Kind: "Function",
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
service := &apiv1.Service{
|
service := &apiv1.Service{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: svcName,
|
Name: svcName,
|
||||||
Labels: deployLabels,
|
Labels: deployLabels,
|
||||||
Annotations: deployAnnotations,
|
Annotations: deployAnnotations,
|
||||||
OwnerReferences: []metav1.OwnerReference{
|
OwnerReferences: ownerReferences,
|
||||||
*metav1.NewControllerRef(fn, schema.GroupVersionKind{
|
|
||||||
Group: "fission.io",
|
|
||||||
Version: "v1",
|
|
||||||
Kind: "Function",
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Spec: apiv1.ServiceSpec{
|
Spec: apiv1.ServiceSpec{
|
||||||
Ports: []apiv1.ServicePort{
|
Ports: []apiv1.ServicePort{
|
||||||
|
|||||||
@@ -92,6 +92,8 @@ type (
|
|||||||
|
|
||||||
podSpecPatch *apiv1.PodSpec
|
podSpecPatch *apiv1.PodSpec
|
||||||
objectReaperIntervalSecond time.Duration
|
objectReaperIntervalSecond time.Duration
|
||||||
|
|
||||||
|
enableOwnerReferences bool
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -139,6 +141,8 @@ func MakeNewDeploy(
|
|||||||
deplListerSynced: make(map[string]k8sCache.InformerSynced),
|
deplListerSynced: make(map[string]k8sCache.InformerSynced),
|
||||||
svcLister: make(map[string]corelisters.ServiceLister),
|
svcLister: make(map[string]corelisters.ServiceLister),
|
||||||
svcListerSynced: make(map[string]k8sCache.InformerSynced),
|
svcListerSynced: make(map[string]k8sCache.InformerSynced),
|
||||||
|
|
||||||
|
enableOwnerReferences: utils.IsOwnerReferencesEnabled(),
|
||||||
}
|
}
|
||||||
|
|
||||||
for ns, informerFactory := range ndmInformerFactory {
|
for ns, informerFactory := range ndmInformerFactory {
|
||||||
@@ -318,17 +322,14 @@ func (deploy *NewDeploy) AdoptExistingResources(ctx context.Context) {
|
|||||||
for i := range fnList.Items {
|
for i := range fnList.Items {
|
||||||
fn := &fnList.Items[i]
|
fn := &fnList.Items[i]
|
||||||
if fn.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType == fv1.ExecutorTypeNewdeploy {
|
if fn.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType == fv1.ExecutorTypeNewdeploy {
|
||||||
wg.Add(1)
|
wg.Go(func() {
|
||||||
go func() {
|
|
||||||
defer wg.Done()
|
|
||||||
|
|
||||||
_, err = deploy.fnCreate(ctx, fn)
|
_, err = deploy.fnCreate(ctx, fn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
deploy.logger.Warn("failed to adopt resources for function", zap.Error(err))
|
deploy.logger.Warn("failed to adopt resources for function", zap.Error(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
deploy.logger.Info("adopt resources for function", zap.String("function", fn.ObjectMeta.Name))
|
deploy.logger.Info("adopt resources for function", zap.String("function", fn.ObjectMeta.Name))
|
||||||
}()
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -478,7 +479,7 @@ func (deploy *NewDeploy) fnCreate(ctx context.Context, fn *fv1.Function) (*fscac
|
|||||||
// obj.TypeMeta.Kind does not work hence this, needs investigation and a fix
|
// obj.TypeMeta.Kind does not work hence this, needs investigation and a fix
|
||||||
Kind: "deployment",
|
Kind: "deployment",
|
||||||
Name: depl.ObjectMeta.Name,
|
Name: depl.ObjectMeta.Name,
|
||||||
APIVersion: depl.TypeMeta.APIVersion,
|
APIVersion: depl.APIVersion,
|
||||||
Namespace: depl.ObjectMeta.Namespace,
|
Namespace: depl.ObjectMeta.Namespace,
|
||||||
ResourceVersion: depl.ObjectMeta.ResourceVersion,
|
ResourceVersion: depl.ObjectMeta.ResourceVersion,
|
||||||
UID: depl.ObjectMeta.UID,
|
UID: depl.ObjectMeta.UID,
|
||||||
@@ -486,7 +487,7 @@ func (deploy *NewDeploy) fnCreate(ctx context.Context, fn *fv1.Function) (*fscac
|
|||||||
{
|
{
|
||||||
Kind: "service",
|
Kind: "service",
|
||||||
Name: svc.ObjectMeta.Name,
|
Name: svc.ObjectMeta.Name,
|
||||||
APIVersion: svc.TypeMeta.APIVersion,
|
APIVersion: svc.APIVersion,
|
||||||
Namespace: svc.ObjectMeta.Namespace,
|
Namespace: svc.ObjectMeta.Namespace,
|
||||||
ResourceVersion: svc.ObjectMeta.ResourceVersion,
|
ResourceVersion: svc.ObjectMeta.ResourceVersion,
|
||||||
UID: svc.ObjectMeta.UID,
|
UID: svc.ObjectMeta.UID,
|
||||||
@@ -494,7 +495,7 @@ func (deploy *NewDeploy) fnCreate(ctx context.Context, fn *fv1.Function) (*fscac
|
|||||||
{
|
{
|
||||||
Kind: "horizontalpodautoscaler",
|
Kind: "horizontalpodautoscaler",
|
||||||
Name: hpa.ObjectMeta.Name,
|
Name: hpa.ObjectMeta.Name,
|
||||||
APIVersion: hpa.TypeMeta.APIVersion,
|
APIVersion: hpa.APIVersion,
|
||||||
Namespace: hpa.ObjectMeta.Namespace,
|
Namespace: hpa.ObjectMeta.Namespace,
|
||||||
ResourceVersion: hpa.ObjectMeta.ResourceVersion,
|
ResourceVersion: hpa.ObjectMeta.ResourceVersion,
|
||||||
UID: hpa.ObjectMeta.UID,
|
UID: hpa.ObjectMeta.UID,
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ const (
|
|||||||
func TestRefreshFuncPods(t *testing.T) {
|
func TestRefreshFuncPods(t *testing.T) {
|
||||||
os.Setenv("DEBUG_ENV", "true")
|
os.Setenv("DEBUG_ENV", "true")
|
||||||
mgr := manager.New()
|
mgr := manager.New()
|
||||||
defer mgr.Wait()
|
t.Cleanup(mgr.Wait)
|
||||||
logger := loggerfactory.GetLogger()
|
logger := loggerfactory.GetLogger()
|
||||||
kubernetesClient := fake.NewSimpleClientset()
|
kubernetesClient := fake.NewSimpleClientset()
|
||||||
fissionClient := fClient.NewSimpleClientset()
|
fissionClient := fClient.NewSimpleClientset()
|
||||||
@@ -50,8 +50,7 @@ func TestRefreshFuncPods(t *testing.T) {
|
|||||||
}
|
}
|
||||||
ndmInformerFactory := utils.GetInformerFactoryByExecutor(kubernetesClient, executorLabel, time.Minute*30)
|
ndmInformerFactory := utils.GetInformerFactoryByExecutor(kubernetesClient, executorLabel, time.Minute*30)
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx := t.Context()
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
fetcherConfig, err := fetcherConfig.MakeFetcherConfig("/userfunc")
|
fetcherConfig, err := fetcherConfig.MakeFetcherConfig("/userfunc")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package poolmgr
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"net"
|
"net"
|
||||||
@@ -28,7 +29,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/dchest/uniuri"
|
"github.com/dchest/uniuri"
|
||||||
"github.com/pkg/errors"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
appsv1 "k8s.io/api/apps/v1"
|
appsv1 "k8s.io/api/apps/v1"
|
||||||
apiv1 "k8s.io/api/core/v1"
|
apiv1 "k8s.io/api/core/v1"
|
||||||
@@ -75,10 +75,11 @@ type (
|
|||||||
stopReadyPodControllerCh chan struct{}
|
stopReadyPodControllerCh chan struct{}
|
||||||
readyPodLister corelisters.PodLister
|
readyPodLister corelisters.PodLister
|
||||||
readyPodListerSynced cache.InformerSynced
|
readyPodListerSynced cache.InformerSynced
|
||||||
readyPodQueue workqueue.DelayingInterface
|
readyPodQueue workqueue.TypedDelayingInterface[string]
|
||||||
poolInstanceID string // small random string to uniquify pod names
|
poolInstanceID string // small random string to uniquify pod names
|
||||||
instanceID string // poolmgr instance id
|
instanceID string // poolmgr instance id
|
||||||
podSpecPatch *apiv1.PodSpec
|
podSpecPatch *apiv1.PodSpec
|
||||||
|
enableOwnerReferences bool
|
||||||
// TODO: move this field into fsCache
|
// TODO: move this field into fsCache
|
||||||
podFSVCMap sync.Map
|
podFSVCMap sync.Map
|
||||||
}
|
}
|
||||||
@@ -131,6 +132,7 @@ func MakeGenericPool(
|
|||||||
instanceID: instanceID,
|
instanceID: instanceID,
|
||||||
podFSVCMap: sync.Map{},
|
podFSVCMap: sync.Map{},
|
||||||
podSpecPatch: podSpecPatch,
|
podSpecPatch: podSpecPatch,
|
||||||
|
enableOwnerReferences: utils.IsOwnerReferencesEnabled(),
|
||||||
lock: sync.Mutex{},
|
lock: sync.Mutex{},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -263,15 +265,13 @@ func (gp *GenericPool) choosePod(ctx context.Context, newLabels map[string]strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
var chosenPod *apiv1.Pod
|
var chosenPod *apiv1.Pod
|
||||||
var key string
|
|
||||||
|
|
||||||
otelUtils.SpanTrackEvent(ctx, "waitForPod", otelUtils.MapToAttributes(newLabels)...)
|
otelUtils.SpanTrackEvent(ctx, "waitForPod", otelUtils.MapToAttributes(newLabels)...)
|
||||||
item, quit := gp.readyPodQueue.Get()
|
key, quit := gp.readyPodQueue.Get()
|
||||||
if quit {
|
if quit {
|
||||||
logger.Error("readypod controller is not running")
|
logger.Error("readypod controller is not running")
|
||||||
return "", nil, errors.New("readypod controller is not running")
|
return "", nil, errors.New("readypod controller is not running")
|
||||||
}
|
}
|
||||||
key = item.(string)
|
|
||||||
logger.Debug("got key from the queue", zap.String("key", key))
|
logger.Debug("got key from the queue", zap.String("key", key))
|
||||||
namespace, name, err := cache.SplitMetaNamespaceKey(key)
|
namespace, name, err := cache.SplitMetaNamespaceKey(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -304,21 +304,23 @@ func (gp *GenericPool) choosePod(ctx context.Context, newLabels map[string]strin
|
|||||||
// Relabel. If the pod already got picked and
|
// Relabel. If the pod already got picked and
|
||||||
// modified, this should fail; in that case just
|
// modified, this should fail; in that case just
|
||||||
// retry.
|
// retry.
|
||||||
labelPatch, _ := json.Marshal(newLabels)
|
|
||||||
|
|
||||||
// Append executor instance id to pod annotations to
|
// Append executor instance id to pod annotations to
|
||||||
// indicate this pod is managed by this executor.
|
// indicate this pod is managed by this executor.
|
||||||
annotations := gp.getDeployAnnotations(gp.env)
|
annotations := gp.getDeployAnnotations(gp.env)
|
||||||
annotationPatch, _ := json.Marshal(annotations)
|
patch := map[string]interface{}{
|
||||||
|
"metadata": map[string]interface{}{
|
||||||
patch := fmt.Sprintf(`{"metadata":{"annotations":%v, "labels":%v}}`, string(annotationPatch), string(labelPatch))
|
"annotations": annotations,
|
||||||
logger.Info("relabel pod", zap.String("pod", patch))
|
"labels": newLabels,
|
||||||
newPod, err := gp.kubernetesClient.CoreV1().Pods(chosenPod.Namespace).Patch(ctx, chosenPod.Name, k8sTypes.StrategicMergePatchType, []byte(patch), metav1.PatchOptions{})
|
},
|
||||||
|
}
|
||||||
|
patchBytes, _ := json.Marshal(patch)
|
||||||
|
logger.Info("relabel pod", zap.String("pod", string((patchBytes))))
|
||||||
|
newPod, err := gp.kubernetesClient.CoreV1().Pods(chosenPod.Namespace).Patch(ctx, chosenPod.Name, k8sTypes.StrategicMergePatchType, patchBytes, metav1.PatchOptions{})
|
||||||
if err != nil && errors.Is(err, context.Canceled) {
|
if err != nil && errors.Is(err, context.Canceled) {
|
||||||
// ending retry loop when the request canceled
|
// ending retry loop when the request canceled
|
||||||
gp.readyPodQueue.Done(key)
|
gp.readyPodQueue.Done(key)
|
||||||
gp.readyPodQueue.AddAfter(key, expoDelay)
|
gp.readyPodQueue.AddAfter(key, expoDelay)
|
||||||
return "", nil, errors.Errorf("failed to relabel pod: %s", err)
|
return "", nil, fmt.Errorf("failed to relabel pod: %s", err)
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
logger.Error("failed to relabel pod", zap.Error(err), zap.String("pod", chosenPod.Name), zap.Duration("delay", expoDelay))
|
logger.Error("failed to relabel pod", zap.Error(err), zap.String("pod", chosenPod.Name), zap.Duration("delay", expoDelay))
|
||||||
gp.readyPodQueue.Done(key)
|
gp.readyPodQueue.Done(key)
|
||||||
@@ -333,13 +335,13 @@ func (gp *GenericPool) choosePod(ctx context.Context, newLabels map[string]strin
|
|||||||
// So we have to check both of them to ensure the patch success.
|
// So we have to check both of them to ensure the patch success.
|
||||||
for k, v := range newLabels {
|
for k, v := range newLabels {
|
||||||
if newPod.Labels[k] != v {
|
if newPod.Labels[k] != v {
|
||||||
return "", nil, errors.Errorf("value of necessary labels '%s' mismatch: want '%s', get '%v'",
|
return "", nil, fmt.Errorf("value of necessary labels '%s' mismatch: want '%s', get '%v'",
|
||||||
k, v, newPod.Labels[k])
|
k, v, newPod.Labels[k])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for k, v := range annotations {
|
for k, v := range annotations {
|
||||||
if newPod.Annotations[k] != v {
|
if newPod.Annotations[k] != v {
|
||||||
return "", nil, errors.Errorf("value of necessary annotations '%s' mismatch: want '%s', get '%v'",
|
return "", nil, fmt.Errorf("value of necessary annotations '%s' mismatch: want '%s', get '%v'",
|
||||||
k, v, newPod.Annotations[k])
|
k, v, newPod.Annotations[k])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -413,7 +415,7 @@ func (gp *GenericPool) specializePod(ctx context.Context, pod *apiv1.Pod, fn *fv
|
|||||||
// for fetcher we don't need to create a service, just talk to the pod directly
|
// for fetcher we don't need to create a service, just talk to the pod directly
|
||||||
podIP := pod.Status.PodIP
|
podIP := pod.Status.PodIP
|
||||||
if len(podIP) == 0 {
|
if len(podIP) == 0 {
|
||||||
return errors.Errorf("Pod %s in namespace %s has no IP", pod.ObjectMeta.Name, pod.ObjectMeta.Namespace)
|
return fmt.Errorf("pod %s in namespace %s has no IP", pod.ObjectMeta.Name, pod.ObjectMeta.Namespace)
|
||||||
}
|
}
|
||||||
for _, cm := range fn.Spec.ConfigMaps {
|
for _, cm := range fn.Spec.ConfigMaps {
|
||||||
_, err := gp.kubernetesClient.CoreV1().ConfigMaps(gp.fnNamespace).Get(ctx, cm.Name, metav1.GetOptions{})
|
_, err := gp.kubernetesClient.CoreV1().ConfigMaps(gp.fnNamespace).Get(ctx, cm.Name, metav1.GetOptions{})
|
||||||
@@ -424,7 +426,7 @@ func (gp *GenericPool) specializePod(ctx context.Context, pod *apiv1.Pod, fn *fv
|
|||||||
zap.String("configmap_namespace", cm.Namespace),
|
zap.String("configmap_namespace", cm.Namespace),
|
||||||
zap.String("function_name", fn.ObjectMeta.Name),
|
zap.String("function_name", fn.ObjectMeta.Name),
|
||||||
zap.String("function_namespace", gp.fnNamespace))
|
zap.String("function_namespace", gp.fnNamespace))
|
||||||
return fmt.Errorf(fmt.Sprintf("configmap %s must be in same namespace as function namespace", cm.Name))
|
return fmt.Errorf("configmap %s must be in same namespace as function namespace", cm.Name)
|
||||||
} else {
|
} else {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -439,7 +441,7 @@ func (gp *GenericPool) specializePod(ctx context.Context, pod *apiv1.Pod, fn *fv
|
|||||||
zap.String("secret_namespace", sec.Namespace),
|
zap.String("secret_namespace", sec.Namespace),
|
||||||
zap.String("function_name", fn.ObjectMeta.Name),
|
zap.String("function_name", fn.ObjectMeta.Name),
|
||||||
zap.String("function_namespace", gp.fnNamespace))
|
zap.String("function_namespace", gp.fnNamespace))
|
||||||
return fmt.Errorf(fmt.Sprintf("secret %s must be in same namespace as function namespace", sec.Name))
|
return fmt.Errorf("secret %s must be in same namespace as function namespace", sec.Name)
|
||||||
} else {
|
} else {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -569,7 +571,7 @@ func (gp *GenericPool) getFuncSvc(ctx context.Context, fn *fv1.Function) (*fscac
|
|||||||
}
|
}
|
||||||
if svc.ObjectMeta.Name != svcName {
|
if svc.ObjectMeta.Name != svcName {
|
||||||
go gp.scheduleDeletePod(context.Background(), pod.ObjectMeta.Name)
|
go gp.scheduleDeletePod(context.Background(), pod.ObjectMeta.Name)
|
||||||
return nil, errors.Errorf("sanity check failed for svc %s", svc.ObjectMeta.Name)
|
return nil, fmt.Errorf("sanity check failed for svc %s", svc.ObjectMeta.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// the fission router isn't in the same namespace, so return a
|
// the fission router isn't in the same namespace, so return a
|
||||||
@@ -599,7 +601,7 @@ func (gp *GenericPool) getFuncSvc(ctx context.Context, fn *fv1.Function) (*fscac
|
|||||||
{
|
{
|
||||||
Kind: "pod",
|
Kind: "pod",
|
||||||
Name: pod.ObjectMeta.Name,
|
Name: pod.ObjectMeta.Name,
|
||||||
APIVersion: pod.TypeMeta.APIVersion,
|
APIVersion: pod.APIVersion,
|
||||||
Namespace: pod.ObjectMeta.Namespace,
|
Namespace: pod.ObjectMeta.Namespace,
|
||||||
ResourceVersion: pod.ObjectMeta.ResourceVersion,
|
ResourceVersion: pod.ObjectMeta.ResourceVersion,
|
||||||
UID: pod.ObjectMeta.UID,
|
UID: pod.ObjectMeta.UID,
|
||||||
|
|||||||
@@ -59,17 +59,22 @@ func getPoolName(env *fv1.Environment) string {
|
|||||||
func (gp *GenericPool) genDeploymentMeta(env *fv1.Environment) metav1.ObjectMeta {
|
func (gp *GenericPool) genDeploymentMeta(env *fv1.Environment) metav1.ObjectMeta {
|
||||||
deployLabels := gp.getEnvironmentPoolLabels(env)
|
deployLabels := gp.getEnvironmentPoolLabels(env)
|
||||||
deployAnnotations := gp.getDeployAnnotations(env)
|
deployAnnotations := gp.getDeployAnnotations(env)
|
||||||
return metav1.ObjectMeta{
|
|
||||||
Name: getPoolName(env),
|
var ownerReferences []metav1.OwnerReference
|
||||||
Labels: deployLabels,
|
if gp.enableOwnerReferences {
|
||||||
Annotations: deployAnnotations,
|
ownerReferences = []metav1.OwnerReference{
|
||||||
OwnerReferences: []metav1.OwnerReference{
|
|
||||||
*metav1.NewControllerRef(env, schema.GroupVersionKind{
|
*metav1.NewControllerRef(env, schema.GroupVersionKind{
|
||||||
Group: "fission.io",
|
Group: "fission.io",
|
||||||
Version: "v1",
|
Version: "v1",
|
||||||
Kind: "Environment",
|
Kind: "Environment",
|
||||||
}),
|
}),
|
||||||
},
|
}
|
||||||
|
}
|
||||||
|
return metav1.ObjectMeta{
|
||||||
|
Name: getPoolName(env),
|
||||||
|
Labels: deployLabels,
|
||||||
|
Annotations: deployAnnotations,
|
||||||
|
OwnerReferences: ownerReferences,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,8 +189,18 @@ func (gp *GenericPool) genDeploymentSpec(env *fv1.Environment) (*appsv1.Deployme
|
|||||||
Template: pod,
|
Template: pod,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If custom runtime container name - default env name
|
||||||
|
mainContainerName := env.ObjectMeta.Name
|
||||||
|
if env.Spec.Runtime.Container != nil && env.Spec.Runtime.Container.Name != "" && env.Spec.Runtime.PodSpec != nil {
|
||||||
|
if util.DoesContainerExistInPodSpec(env.Spec.Runtime.Container.Name, env.Spec.Runtime.PodSpec) {
|
||||||
|
mainContainerName = env.Spec.Runtime.Container.Name
|
||||||
|
} else {
|
||||||
|
return nil, fmt.Errorf("runtime container %s not found in pod spec", env.Spec.Runtime.Container.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Order of merging is important here - first fetcher, then containers and lastly pod spec
|
// Order of merging is important here - first fetcher, then containers and lastly pod spec
|
||||||
err = gp.fetcherConfig.AddFetcherToPodSpec(&deploymentSpec.Template.Spec, env.ObjectMeta.Name)
|
err = gp.fetcherConfig.AddFetcherToPodSpec(&deploymentSpec.Template.Spec, mainContainerName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/fission/fission/pkg/executor/metrics"
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
apiv1 "k8s.io/api/core/v1"
|
apiv1 "k8s.io/api/core/v1"
|
||||||
@@ -47,6 +46,7 @@ import (
|
|||||||
"github.com/fission/fission/pkg/crd"
|
"github.com/fission/fission/pkg/crd"
|
||||||
"github.com/fission/fission/pkg/executor/executortype"
|
"github.com/fission/fission/pkg/executor/executortype"
|
||||||
"github.com/fission/fission/pkg/executor/fscache"
|
"github.com/fission/fission/pkg/executor/fscache"
|
||||||
|
"github.com/fission/fission/pkg/executor/metrics"
|
||||||
"github.com/fission/fission/pkg/executor/reaper"
|
"github.com/fission/fission/pkg/executor/reaper"
|
||||||
executorUtils "github.com/fission/fission/pkg/executor/util"
|
executorUtils "github.com/fission/fission/pkg/executor/util"
|
||||||
fetcherConfig "github.com/fission/fission/pkg/fetcher/config"
|
fetcherConfig "github.com/fission/fission/pkg/fetcher/config"
|
||||||
@@ -368,9 +368,7 @@ func (gpm *GenericPoolManager) AdoptExistingResources(ctx context.Context) {
|
|||||||
env := envs.Items[i]
|
env := envs.Items[i]
|
||||||
|
|
||||||
if getEnvPoolSize(&env) > 0 {
|
if getEnvPoolSize(&env) > 0 {
|
||||||
wg.Add(1)
|
wg.Go(func() {
|
||||||
go func() {
|
|
||||||
defer wg.Done()
|
|
||||||
_, created, err := gpm.getPool(ctx, &env)
|
_, created, err := gpm.getPool(ctx, &env)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
gpm.logger.Error("adopt pool failed", zap.Error(err))
|
gpm.logger.Error("adopt pool failed", zap.Error(err))
|
||||||
@@ -378,11 +376,11 @@ func (gpm *GenericPoolManager) AdoptExistingResources(ctx context.Context) {
|
|||||||
if created {
|
if created {
|
||||||
gpm.logger.Info("created pool for the environment", zap.String("env", env.ObjectMeta.Name), zap.String("namespace", gpm.nsResolver.ResolveNamespace(gpm.nsResolver.FunctionNamespace)))
|
gpm.logger.Info("created pool for the environment", zap.String("env", env.ObjectMeta.Name), zap.String("namespace", gpm.nsResolver.ResolveNamespace(gpm.nsResolver.FunctionNamespace)))
|
||||||
}
|
}
|
||||||
}()
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// create environment map for later use
|
// create environment map for later use
|
||||||
key := fmt.Sprintf("%s/%s", env.ObjectMeta.Namespace, env.ObjectMeta.Name)
|
key := k8sCache.MetaObjectToName(&env.ObjectMeta).String()
|
||||||
envMap[key] = env
|
envMap[key] = env
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -407,10 +405,7 @@ func (gpm *GenericPoolManager) AdoptExistingResources(ctx context.Context) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
wg.Add(1)
|
wg.Go(func() {
|
||||||
go func() {
|
|
||||||
defer wg.Done()
|
|
||||||
|
|
||||||
// avoid too many requests arrive Kubernetes API server at the same time.
|
// avoid too many requests arrive Kubernetes API server at the same time.
|
||||||
time.Sleep(time.Duration(rand.Intn(30)) * time.Millisecond)
|
time.Sleep(time.Duration(rand.Intn(30)) * time.Millisecond)
|
||||||
|
|
||||||
@@ -458,7 +453,7 @@ func (gpm *GenericPoolManager) AdoptExistingResources(ctx context.Context) {
|
|||||||
{
|
{
|
||||||
Kind: "pod",
|
Kind: "pod",
|
||||||
Name: pod.Name,
|
Name: pod.Name,
|
||||||
APIVersion: pod.TypeMeta.APIVersion,
|
APIVersion: pod.APIVersion,
|
||||||
Namespace: pod.ObjectMeta.Namespace,
|
Namespace: pod.ObjectMeta.Namespace,
|
||||||
ResourceVersion: pod.ObjectMeta.ResourceVersion,
|
ResourceVersion: pod.ObjectMeta.ResourceVersion,
|
||||||
UID: pod.ObjectMeta.UID,
|
UID: pod.ObjectMeta.UID,
|
||||||
@@ -482,7 +477,7 @@ func (gpm *GenericPoolManager) AdoptExistingResources(ctx context.Context) {
|
|||||||
|
|
||||||
gpm.logger.Info("adopt function pod",
|
gpm.logger.Info("adopt function pod",
|
||||||
zap.String("pod", pod.Name), zap.Any("labels", pod.Labels), zap.Any("annotations", pod.Annotations))
|
zap.String("pod", pod.Name), zap.Any("labels", pod.Labels), zap.Any("annotations", pod.Annotations))
|
||||||
}()
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -548,7 +543,7 @@ func (gpm *GenericPoolManager) service() {
|
|||||||
pool, ok := gpm.pools[key]
|
pool, ok := gpm.pools[key]
|
||||||
if !ok {
|
if !ok {
|
||||||
gpm.logger.Error("Could not find pool", zap.String("environment", env.ObjectMeta.Name), zap.String("namespace", env.ObjectMeta.Namespace))
|
gpm.logger.Error("Could not find pool", zap.String("environment", env.ObjectMeta.Name), zap.String("namespace", env.ObjectMeta.Namespace))
|
||||||
return
|
continue
|
||||||
}
|
}
|
||||||
delete(gpm.pools, key)
|
delete(gpm.pools, key)
|
||||||
if pool != nil {
|
if pool != nil {
|
||||||
|
|||||||
@@ -60,10 +60,10 @@ type (
|
|||||||
// podListerSynced returns true if the pod store has been synced at least once.
|
// podListerSynced returns true if the pod store has been synced at least once.
|
||||||
podListerSynced map[string]k8sCache.InformerSynced
|
podListerSynced map[string]k8sCache.InformerSynced
|
||||||
|
|
||||||
envCreateUpdateQueue workqueue.RateLimitingInterface
|
envCreateUpdateQueue workqueue.TypedRateLimitingInterface[string]
|
||||||
envDeleteQueue workqueue.RateLimitingInterface
|
envDeleteQueue workqueue.TypedRateLimitingInterface[*fv1.Environment]
|
||||||
|
|
||||||
spCleanupPodQueue workqueue.RateLimitingInterface
|
spCleanupPodQueue workqueue.TypedRateLimitingInterface[string]
|
||||||
|
|
||||||
gpm *GenericPoolManager
|
gpm *GenericPoolManager
|
||||||
}
|
}
|
||||||
@@ -84,9 +84,9 @@ func NewPoolPodController(ctx context.Context, logger *zap.Logger,
|
|||||||
envListerSynced: make(map[string]k8sCache.InformerSynced, 0),
|
envListerSynced: make(map[string]k8sCache.InformerSynced, 0),
|
||||||
podLister: make(map[string]corelisters.PodLister),
|
podLister: make(map[string]corelisters.PodLister),
|
||||||
podListerSynced: make(map[string]k8sCache.InformerSynced),
|
podListerSynced: make(map[string]k8sCache.InformerSynced),
|
||||||
envCreateUpdateQueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "EnvAddUpdateQueue"),
|
envCreateUpdateQueue: workqueue.NewTypedRateLimitingQueueWithConfig(workqueue.DefaultTypedControllerRateLimiter[string](), workqueue.TypedRateLimitingQueueConfig[string]{Name: "EnvAddUpdateQueue"}),
|
||||||
envDeleteQueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "EnvDeleteQueue"),
|
envDeleteQueue: workqueue.NewTypedRateLimitingQueueWithConfig(workqueue.DefaultTypedControllerRateLimiter[*fv1.Environment](), workqueue.TypedRateLimitingQueueConfig[*fv1.Environment]{Name: "EnvDeleteQueue"}),
|
||||||
spCleanupPodQueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "SpecializedPodCleanupQueue"),
|
spCleanupPodQueue: workqueue.NewTypedRateLimitingQueueWithConfig(workqueue.DefaultTypedControllerRateLimiter[string](), workqueue.TypedRateLimitingQueueConfig[string]{Name: "SpecializedPodCleanupQueue"}),
|
||||||
}
|
}
|
||||||
if p.enableIstio {
|
if p.enableIstio {
|
||||||
for _, factory := range finformerFactory {
|
for _, factory := range finformerFactory {
|
||||||
@@ -337,11 +337,10 @@ func (p *PoolPodController) envCreateUpdateQueueProcessFunc(ctx context.Context)
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
obj, quit := p.envCreateUpdateQueue.Get()
|
key, quit := p.envCreateUpdateQueue.Get()
|
||||||
if quit {
|
if quit {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
key := obj.(string)
|
|
||||||
defer p.envCreateUpdateQueue.Done(key)
|
defer p.envCreateUpdateQueue.Done(key)
|
||||||
|
|
||||||
namespace, name, err := k8sCache.SplitMetaNamespaceKey(key)
|
namespace, name, err := k8sCache.SplitMetaNamespaceKey(key)
|
||||||
@@ -390,17 +389,11 @@ func (p *PoolPodController) envCreateUpdateQueueProcessFunc(ctx context.Context)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *PoolPodController) envDeleteQueueProcessFunc(ctx context.Context) bool {
|
func (p *PoolPodController) envDeleteQueueProcessFunc(ctx context.Context) bool {
|
||||||
obj, quit := p.envDeleteQueue.Get()
|
env, quit := p.envDeleteQueue.Get()
|
||||||
if quit {
|
if quit {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
defer p.envDeleteQueue.Done(obj)
|
defer p.envDeleteQueue.Done(env)
|
||||||
env, ok := obj.(*fv1.Environment)
|
|
||||||
if !ok {
|
|
||||||
p.logger.Error("unexpected type when deleting env to pool pod controller", zap.Any("obj", obj))
|
|
||||||
p.envDeleteQueue.Forget(obj)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
p.logger.Debug("env delete request processing")
|
p.logger.Debug("env delete request processing")
|
||||||
p.gpm.cleanupPool(ctx, env)
|
p.gpm.cleanupPool(ctx, env)
|
||||||
specializePodLables := getSpecializedPodLabels(env)
|
specializePodLables := getSpecializedPodLabels(env)
|
||||||
@@ -408,17 +401,17 @@ func (p *PoolPodController) envDeleteQueueProcessFunc(ctx context.Context) bool
|
|||||||
podLister, ok := p.podLister[ns]
|
podLister, ok := p.podLister[ns]
|
||||||
if !ok {
|
if !ok {
|
||||||
p.logger.Error("no pod lister found for namespace", zap.String("namespace", ns))
|
p.logger.Error("no pod lister found for namespace", zap.String("namespace", ns))
|
||||||
p.envDeleteQueue.Forget(obj)
|
p.envDeleteQueue.Forget(env)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
specializedPods, err := podLister.Pods(ns).List(labels.SelectorFromSet(specializePodLables))
|
specializedPods, err := podLister.Pods(ns).List(labels.SelectorFromSet(specializePodLables))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
p.logger.Error("failed to list specialized pods", zap.Error(err))
|
p.logger.Error("failed to list specialized pods", zap.Error(err))
|
||||||
p.envDeleteQueue.Forget(obj)
|
p.envDeleteQueue.Forget(env)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if len(specializedPods) == 0 {
|
if len(specializedPods) == 0 {
|
||||||
p.envDeleteQueue.Forget(obj)
|
p.envDeleteQueue.Forget(env)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
p.logger.Info("specialized pods identified for cleanup after env delete", zap.String("env", env.ObjectMeta.Name), zap.String("namespace", env.ObjectMeta.Namespace), zap.Int("count", len(specializedPods)))
|
p.logger.Info("specialized pods identified for cleanup after env delete", zap.String("env", env.ObjectMeta.Name), zap.String("namespace", env.ObjectMeta.Namespace), zap.Int("count", len(specializedPods)))
|
||||||
@@ -433,17 +426,16 @@ func (p *PoolPodController) envDeleteQueueProcessFunc(ctx context.Context) bool
|
|||||||
}
|
}
|
||||||
p.spCleanupPodQueue.Add(key)
|
p.spCleanupPodQueue.Add(key)
|
||||||
}
|
}
|
||||||
p.envDeleteQueue.Forget(obj)
|
p.envDeleteQueue.Forget(env)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PoolPodController) spCleanupPodQueueProcessFunc(ctx context.Context) bool {
|
func (p *PoolPodController) spCleanupPodQueueProcessFunc(ctx context.Context) bool {
|
||||||
maxRetries := 3
|
maxRetries := 3
|
||||||
obj, quit := p.spCleanupPodQueue.Get()
|
key, quit := p.spCleanupPodQueue.Get()
|
||||||
if quit {
|
if quit {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
key := obj.(string)
|
|
||||||
defer p.spCleanupPodQueue.Done(key)
|
defer p.spCleanupPodQueue.Done(key)
|
||||||
namespace, name, err := k8sCache.SplitMetaNamespaceKey(key)
|
namespace, name, err := k8sCache.SplitMetaNamespaceKey(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ limitations under the License.
|
|||||||
package poolmgr
|
package poolmgr
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@@ -39,9 +38,8 @@ import (
|
|||||||
|
|
||||||
func TestPoolPodControllerPodCleanup(t *testing.T) {
|
func TestPoolPodControllerPodCleanup(t *testing.T) {
|
||||||
mgr := manager.New()
|
mgr := manager.New()
|
||||||
defer mgr.Wait()
|
t.Cleanup(mgr.Wait)
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx := t.Context()
|
||||||
defer cancel()
|
|
||||||
logger := loggerfactory.GetLogger()
|
logger := loggerfactory.GetLogger()
|
||||||
kubernetesClient := fake.NewSimpleClientset()
|
kubernetesClient := fake.NewSimpleClientset()
|
||||||
fissionClient := fClient.NewSimpleClientset()
|
fissionClient := fClient.NewSimpleClientset()
|
||||||
|
|||||||
@@ -33,7 +33,9 @@ func (gp *GenericPool) setupReadyPodController() error {
|
|||||||
// avoid concurrent access to gp.deployment
|
// avoid concurrent access to gp.deployment
|
||||||
gp.lock.Lock()
|
gp.lock.Lock()
|
||||||
defer gp.lock.Unlock()
|
defer gp.lock.Unlock()
|
||||||
gp.readyPodQueue = workqueue.NewDelayingQueue()
|
gp.readyPodQueue = workqueue.NewTypedDelayingQueueWithConfig(workqueue.TypedDelayingQueueConfig[string]{
|
||||||
|
Name: "readyPodQueue",
|
||||||
|
})
|
||||||
informerFactory, err := utils.GetInformerFactoryByReadyPod(gp.kubernetesClient, gp.fnNamespace, gp.deployment.Spec.Selector)
|
informerFactory, err := utils.GetInformerFactoryByReadyPod(gp.kubernetesClient, gp.fnNamespace, gp.deployment.Spec.Selector)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
apiv1 "k8s.io/api/core/v1"
|
apiv1 "k8s.io/api/core/v1"
|
||||||
@@ -292,7 +291,7 @@ func (fsc *FunctionServiceCache) Add(fsvc FuncSvc) (*FuncSvc, error) {
|
|||||||
if IsNameExistError(err) {
|
if IsNameExistError(err) {
|
||||||
err = nil
|
err = nil
|
||||||
} else {
|
} else {
|
||||||
err = errors.Wrap(err, "error caching fsvc")
|
err = fmt.Errorf("error caching fsvc: %w", err)
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -304,7 +303,7 @@ func (fsc *FunctionServiceCache) Add(fsvc FuncSvc) (*FuncSvc, error) {
|
|||||||
if IsNameExistError(err) {
|
if IsNameExistError(err) {
|
||||||
err = nil
|
err = nil
|
||||||
} else {
|
} else {
|
||||||
err = errors.Wrap(err, "error caching fsvc by function uid")
|
err = fmt.Errorf("error caching fsvc by function uid: %w", err)
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -383,10 +382,6 @@ func (fsc *FunctionServiceCache) DeleteFunctionSvc(ctx context.Context, fsvc *Fu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fsc *FunctionServiceCache) SetCPUUtilization(key crd.CacheKeyURG, svcHost string, cpuUsage resource.Quantity) {
|
|
||||||
fsc.connFunctionCache.SetCPUUtilization(key, svcHost, cpuUsage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteOld deletes aged function service entries from cache.
|
// DeleteOld deletes aged function service entries from cache.
|
||||||
func (fsc *FunctionServiceCache) DeleteOld(fsvc *FuncSvc, minAge time.Duration) (bool, error) {
|
func (fsc *FunctionServiceCache) DeleteOld(fsvc *FuncSvc, minAge time.Duration) (bool, error) {
|
||||||
if time.Since(fsvc.Atime) < minAge {
|
if time.Since(fsvc.Atime) < minAge {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package fscache
|
package fscache
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"log"
|
"log"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@@ -157,8 +156,7 @@ func TestFunctionServiceNewCache(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx := t.Context()
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
fsc.AddFunc(ctx, *fsvc, 10, fn.GetRetainPods())
|
fsc.AddFunc(ctx, *fsvc, 10, fn.GetRetainPods())
|
||||||
concurrency := 10
|
concurrency := 10
|
||||||
|
|||||||
@@ -306,7 +306,7 @@ func (c *PoolCache) service() {
|
|||||||
datawriter := bufio.NewWriter(req.dumpWriter)
|
datawriter := bufio.NewWriter(req.dumpWriter)
|
||||||
|
|
||||||
writefnSvcGrp := func(svcGrp *funcSvcGroup) error {
|
writefnSvcGrp := func(svcGrp *funcSvcGroup) error {
|
||||||
_, err := datawriter.WriteString(fmt.Sprintf("svc_waiting:%d\tqueue_len:%d", svcGrp.svcWaiting, svcGrp.queue.Len()))
|
_, err := fmt.Fprintf(datawriter, "svc_waiting:%d\tqueue_len:%d", svcGrp.svcWaiting, svcGrp.queue.Len())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -319,8 +319,8 @@ func (c *PoolCache) service() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for addr, fnSvc := range svcGrp.svcs {
|
for addr, fnSvc := range svcGrp.svcs {
|
||||||
_, err := datawriter.WriteString(fmt.Sprintf("\tfunction_name:%s\tfn_svc_address:%s\tactive_req:%d\tcurrent_cpu_usage:%v\tcpu_limit:%v\n",
|
_, err := fmt.Fprintf(datawriter, "\tfunction_name:%s\tfn_svc_address:%s\tactive_req:%d\tcurrent_cpu_usage:%v\tcpu_limit:%v\n",
|
||||||
fnSvc.val.Function.Name, addr, fnSvc.activeRequests, fnSvc.currentCPUUsage, fnSvc.cpuLimit))
|
fnSvc.val.Function.Name, addr, fnSvc.activeRequests, fnSvc.currentCPUUsage, fnSvc.cpuLimit)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,8 +24,7 @@ func checkErr(err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestPoolCache(t *testing.T) {
|
func TestPoolCache(t *testing.T) {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx := t.Context()
|
||||||
defer cancel()
|
|
||||||
logger := loggerfactory.GetLogger()
|
logger := loggerfactory.GetLogger()
|
||||||
concurrency := 5
|
concurrency := 5
|
||||||
requestsPerPod := 2
|
requestsPerPod := 2
|
||||||
@@ -225,32 +224,33 @@ func TestPoolCacheRequests(t *testing.T) {
|
|||||||
}
|
}
|
||||||
for i := 1; i <= tt.requests; i++ {
|
for i := 1; i <= tt.requests; i++ {
|
||||||
reqno := i
|
reqno := i
|
||||||
wg.Add(1)
|
wg.Go(func() {
|
||||||
go func(reqno int) {
|
func(reqno int) {
|
||||||
defer wg.Done()
|
svc, err := p.GetSvcValue(context.Background(), key, tt.rpp, tt.concurrency)
|
||||||
svc, err := p.GetSvcValue(context.Background(), key, tt.rpp, tt.concurrency)
|
if err != nil {
|
||||||
if err != nil {
|
code, _ := ferror.GetHTTPError(err)
|
||||||
code, _ := ferror.GetHTTPError(err)
|
if code == http.StatusNotFound {
|
||||||
if code == http.StatusNotFound {
|
atomic.AddUint64(&svcCounter, 1)
|
||||||
atomic.AddUint64(&svcCounter, 1)
|
address := fmt.Sprintf("svc-%d", atomic.LoadUint64(&svcCounter))
|
||||||
address := fmt.Sprintf("svc-%d", atomic.LoadUint64(&svcCounter))
|
p.SetSvcValue(context.Background(), key, address, &FuncSvc{
|
||||||
p.SetSvcValue(context.Background(), key, address, &FuncSvc{
|
Name: address,
|
||||||
Name: address,
|
}, resource.MustParse("45m"), tt.rpp, tt.retainPods)
|
||||||
}, resource.MustParse("45m"), tt.rpp, tt.retainPods)
|
} else {
|
||||||
|
t.Log(reqno, "=>", err)
|
||||||
|
atomic.AddUint64(&failedRequests, 1)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
t.Log(reqno, "=>", err)
|
if svc == nil {
|
||||||
atomic.AddUint64(&failedRequests, 1)
|
t.Log(reqno, "=>", "svc is nil")
|
||||||
|
atomic.AddUint64(&failedRequests, 1)
|
||||||
|
}
|
||||||
|
// } else {
|
||||||
|
// t.Log(reqno, "=>", svc.Name)
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
} else {
|
}(reqno)
|
||||||
if svc == nil {
|
})
|
||||||
t.Log(reqno, "=>", "svc is nil")
|
|
||||||
atomic.AddUint64(&failedRequests, 1)
|
|
||||||
}
|
|
||||||
// } else {
|
|
||||||
// t.Log(reqno, "=>", svc.Name)
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}(reqno)
|
|
||||||
if reqno%simultaneous == 0 {
|
if reqno%simultaneous == 0 {
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
@@ -262,12 +262,12 @@ func TestPoolCacheRequests(t *testing.T) {
|
|||||||
|
|
||||||
for i := 0; i < tt.concurrency; i++ {
|
for i := 0; i < tt.concurrency; i++ {
|
||||||
for j := 0; j < tt.rpp; j++ {
|
for j := 0; j < tt.rpp; j++ {
|
||||||
wg.Add(1)
|
|
||||||
svcno := i
|
svcno := i
|
||||||
go func(svcno int) {
|
wg.Go(func() {
|
||||||
defer wg.Done()
|
func(svcno int) {
|
||||||
p.MarkAvailable(key, fmt.Sprintf("svc-%d", svcno+1))
|
p.MarkAvailable(key, fmt.Sprintf("svc-%d", svcno+1))
|
||||||
}(svcno)
|
}(svcno)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
|
|||||||
@@ -48,16 +48,14 @@ func TestQueuePushWithConcurrentRequest(t *testing.T) {
|
|||||||
q := NewQueue()
|
q := NewQueue()
|
||||||
noOfRequests := 20
|
noOfRequests := 20
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
wg.Add(noOfRequests)
|
|
||||||
for i := 0; i < noOfRequests; i++ {
|
for i := 0; i < noOfRequests; i++ {
|
||||||
go func() {
|
wg.Go(func() {
|
||||||
defer wg.Done()
|
|
||||||
item := &svcWait{
|
item := &svcWait{
|
||||||
svcChannel: make(chan *FuncSvc),
|
svcChannel: make(chan *FuncSvc),
|
||||||
ctx: nil,
|
ctx: nil,
|
||||||
}
|
}
|
||||||
q.Push(item)
|
q.Push(item)
|
||||||
}()
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
|
|||||||
@@ -17,8 +17,9 @@ limitations under the License.
|
|||||||
package metrics
|
package metrics
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/fission/fission/pkg/utils/metrics"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
|
||||||
|
"github.com/fission/fission/pkg/utils/metrics"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import (
|
|||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
|
|
||||||
fv1 "github.com/fission/fission/pkg/apis/core/v1"
|
fv1 "github.com/fission/fission/pkg/apis/core/v1"
|
||||||
|
"github.com/fission/fission/pkg/utils"
|
||||||
otelUtils "github.com/fission/fission/pkg/utils/otel"
|
otelUtils "github.com/fission/fission/pkg/utils/otel"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -39,16 +40,18 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type HpaOperations struct {
|
type HpaOperations struct {
|
||||||
logger *zap.Logger
|
logger *zap.Logger
|
||||||
kubernetesClient kubernetes.Interface
|
kubernetesClient kubernetes.Interface
|
||||||
instanceID string
|
instanceID string
|
||||||
|
enableOwnerReferences bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHpaOperations(logger *zap.Logger, kubernetesClient kubernetes.Interface, instanceID string) *HpaOperations {
|
func NewHpaOperations(logger *zap.Logger, kubernetesClient kubernetes.Interface, instanceID string) *HpaOperations {
|
||||||
return &HpaOperations{
|
return &HpaOperations{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
kubernetesClient: kubernetesClient,
|
kubernetesClient: kubernetesClient,
|
||||||
instanceID: instanceID,
|
instanceID: instanceID,
|
||||||
|
enableOwnerReferences: utils.IsOwnerReferencesEnabled(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,18 +102,23 @@ func (hpaops *HpaOperations) CreateOrGetHpa(ctx context.Context, fn *fv1.Functio
|
|||||||
hpaMetrics = append(hpaMetrics, execStrategy.Metrics...)
|
hpaMetrics = append(hpaMetrics, execStrategy.Metrics...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ownerReferences []metav1.OwnerReference
|
||||||
|
if hpaops.enableOwnerReferences {
|
||||||
|
ownerReferences = []metav1.OwnerReference{
|
||||||
|
*metav1.NewControllerRef(fn, schema.GroupVersionKind{
|
||||||
|
Group: "fission.io",
|
||||||
|
Version: "v1",
|
||||||
|
Kind: "Function",
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
hpa := &asv2.HorizontalPodAutoscaler{
|
hpa := &asv2.HorizontalPodAutoscaler{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: hpaName,
|
Name: hpaName,
|
||||||
Labels: deployLabels,
|
Labels: deployLabels,
|
||||||
Annotations: deployAnnotations,
|
Annotations: deployAnnotations,
|
||||||
OwnerReferences: []metav1.OwnerReference{
|
OwnerReferences: ownerReferences,
|
||||||
*metav1.NewControllerRef(fn, schema.GroupVersionKind{
|
|
||||||
Group: "fission.io",
|
|
||||||
Version: "v1",
|
|
||||||
Kind: "Function",
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Spec: asv2.HorizontalPodAutoscalerSpec{
|
Spec: asv2.HorizontalPodAutoscalerSpec{
|
||||||
ScaleTargetRef: getScaleTargetRef(depl),
|
ScaleTargetRef: getScaleTargetRef(depl),
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ limitations under the License.
|
|||||||
package hpa
|
package hpa
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@@ -58,8 +57,7 @@ func TestHpaOps(t *testing.T) {
|
|||||||
t.Errorf("Expected instanceID to be %v, got %v", instanceID, hpaops.instanceID)
|
t.Errorf("Expected instanceID to be %v, got %v", instanceID, hpaops.instanceID)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx := t.Context()
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
deployLabels := map[string]string{
|
deployLabels := map[string]string{
|
||||||
"test-label": "test-label-value",
|
"test-label": "test-label-value",
|
||||||
|
|||||||
@@ -168,3 +168,13 @@ func CreateDumpFile(logger *zap.Logger) (*os.File, error) {
|
|||||||
|
|
||||||
return os.Create(fmt.Sprintf("%s/%s-%d.txt", dumpPath, dumpFileName, time.Now().Unix()))
|
return os.Create(fmt.Sprintf("%s/%s-%d.txt", dumpPath, dumpFileName, time.Now().Unix()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DoesContainerExistInPodSpec checks if the container with the given name exists in the pod spec
|
||||||
|
func DoesContainerExistInPodSpec(containerName string, podSpec *apiv1.PodSpec) bool {
|
||||||
|
for _, container := range podSpec.Containers {
|
||||||
|
if container.Name == containerName {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|||||||
@@ -23,10 +23,10 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp"
|
"github.com/google/go-cmp/cmp"
|
||||||
|
apiv1 "k8s.io/api/core/v1"
|
||||||
|
|
||||||
fv1 "github.com/fission/fission/pkg/apis/core/v1"
|
fv1 "github.com/fission/fission/pkg/apis/core/v1"
|
||||||
"github.com/fission/fission/pkg/utils/loggerfactory"
|
"github.com/fission/fission/pkg/utils/loggerfactory"
|
||||||
apiv1 "k8s.io/api/core/v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetSpecFromConfigMap(t *testing.T) {
|
func TestGetSpecFromConfigMap(t *testing.T) {
|
||||||
@@ -55,7 +55,7 @@ securityContext:
|
|||||||
}
|
}
|
||||||
|
|
||||||
var permissionNum int64 = 10001
|
var permissionNum int64 = 10001
|
||||||
var runAsNonRoot bool = true
|
var runAsNonRoot = true
|
||||||
|
|
||||||
testSpecPatch := apiv1.PodSpec{
|
testSpecPatch := apiv1.PodSpec{
|
||||||
SecurityContext: &apiv1.PodSecurityContext{
|
SecurityContext: &apiv1.PodSecurityContext{
|
||||||
|
|||||||
@@ -4,12 +4,12 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"golang.org/x/net/context/ctxhttp"
|
"golang.org/x/net/context/ctxhttp"
|
||||||
@@ -104,7 +104,7 @@ func sendRequest(logger *zap.Logger, ctx context.Context, httpClient *http.Clien
|
|||||||
// skip retry and return directly due to context deadline exceeded
|
// skip retry and return directly due to context deadline exceeded
|
||||||
if err == context.DeadlineExceeded {
|
if err == context.DeadlineExceeded {
|
||||||
msg := "error specializing function pod, either increase the specialization timeout for function or check function pod log would help."
|
msg := "error specializing function pod, either increase the specialization timeout for function or check function pod log would help."
|
||||||
err = errors.Wrap(err, msg)
|
err = fmt.Errorf("%s: %w", msg, err)
|
||||||
logger.Error(msg, zap.Error(err), zap.String("url", url))
|
logger.Error(msg, zap.Error(err), zap.String("url", url))
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user